@whoz-oss/coday-client 0.225.0 → 0.227.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/browser/{chunk-IFCMGNTL.js → chunk-2EC3VX77.js} +1 -1
- package/browser/{chunk-OWANJEQU.js → chunk-2OC3IQX4.js} +1 -1
- package/browser/chunk-3B27XA6H.js +1 -0
- package/browser/{chunk-6WGVBQKC.js → chunk-3FIVKNVQ.js} +1 -1
- package/browser/{chunk-3MIJJDXL.js → chunk-3QNGI2KL.js} +1 -1
- package/browser/chunk-4224C2BE.js +1 -0
- package/browser/{chunk-QV6OOSC2.js → chunk-44OQZAMB.js} +1 -1
- package/browser/chunk-4NGK3AH3.js +1 -0
- package/browser/{chunk-CCWYFJZD.js → chunk-5KM666YK.js} +1 -1
- package/browser/chunk-5NIQZOIU.js +1 -0
- package/browser/{chunk-WTSDGIW6.js → chunk-5RGU7B74.js} +1 -1
- package/browser/chunk-6LNXGAHM.js +1 -0
- package/browser/{chunk-YHKKJQPZ.js → chunk-7BBT4E5E.js} +1 -1
- package/browser/chunk-7DZ6K6CC.js +6 -0
- package/browser/{chunk-MLVWHS7Q.js → chunk-7N4XUYW4.js} +1 -1
- package/browser/{chunk-6BVQYZZJ.js → chunk-AKTPF6RS.js} +1 -1
- package/browser/{chunk-V7G5TYBH.js → chunk-AVN3J4SW.js} +1 -1
- package/browser/{chunk-WGIDIO7O.js → chunk-BHI42QOO.js} +1 -1
- package/browser/{chunk-M2ZQ6RPO.js → chunk-BPTQDERH.js} +1 -1
- package/browser/{chunk-N347WQAU.js → chunk-C2J4TQ7V.js} +6 -6
- package/browser/chunk-CLXIHGI5.js +1 -0
- package/browser/{chunk-Y3VADJFG.js → chunk-CPIJPSK3.js} +1 -1
- package/browser/{chunk-7WF5A3H7.js → chunk-DEI4EULW.js} +1 -1
- package/browser/{chunk-KT6YZNOC.js → chunk-DXS7ET5V.js} +1 -1
- package/browser/chunk-DXSUJXKW.js +1 -0
- package/browser/{chunk-WEFHBDOC.js → chunk-E2PTKMR3.js} +1 -1
- package/browser/chunk-EBGVWTDP.js +1 -0
- package/browser/chunk-ETVJIECM.js +1 -0
- package/browser/{chunk-O2RHZQBE.js → chunk-FW4JCZNG.js} +1 -1
- package/browser/{chunk-T2HMC47U.js → chunk-GH2VWCFB.js} +1 -1
- package/browser/{chunk-BLH76GUG.js → chunk-HJCJ2A5U.js} +1 -1
- package/browser/{chunk-J4RCBELS.js → chunk-JC3UT7FL.js} +1 -1
- package/browser/{chunk-VDQ7VRBP.js → chunk-JW4JKLFN.js} +1 -1
- package/browser/{chunk-GXBIFFTK.js → chunk-KRRTNACV.js} +1 -1
- package/browser/chunk-L7EWDR3X.js +1 -0
- package/browser/{chunk-CC2JFA5X.js → chunk-LTFSHOKE.js} +1 -1
- package/browser/chunk-MDC6KYTF.js +1 -0
- package/browser/chunk-MGVK4WNW.js +1 -0
- package/browser/{chunk-S4UXUKNG.js → chunk-MQ6C2B4Z.js} +1 -1
- package/browser/{chunk-VFKWKYIG.js → chunk-MTXOV52Z.js} +1 -1
- package/browser/{chunk-IAB4GU4A.js → chunk-MZIRWGY7.js} +1 -1
- package/browser/{chunk-WIVM4HFF.js → chunk-NA5F32JD.js} +1 -1
- package/browser/chunk-NOMEOUXJ.js +1 -0
- package/browser/{chunk-NCQPF2YO.js → chunk-O77FDCNG.js} +1 -1
- package/browser/{chunk-C7Y56WDM.js → chunk-OK4EJOSI.js} +1 -1
- package/browser/{chunk-3SKJ5SNK.js → chunk-PFBYB2QD.js} +1 -1
- package/browser/{chunk-QINOZGE3.js → chunk-PTXZUITK.js} +1 -1
- package/browser/chunk-PW6KVUDR.js +1 -0
- package/browser/{chunk-MEZUHBEH.js → chunk-QDN2FP73.js} +1 -1
- package/browser/{chunk-KGJBI3SN.js → chunk-QUHNQ4OB.js} +1 -1
- package/browser/{chunk-26FFFP6M.js → chunk-RFBE4F6Q.js} +1 -1
- package/browser/chunk-RK2UBI5O.js +1 -0
- package/browser/{chunk-KRZMF2CT.js → chunk-SW3MVXR5.js} +1 -1
- package/browser/{chunk-6JGMDWHO.js → chunk-SWOMF3ZR.js} +1 -1
- package/browser/{chunk-CG7JPH7I.js → chunk-TBYJS5N4.js} +1 -1
- package/browser/{chunk-73TUA3JE.js → chunk-TGJ3LPLG.js} +1 -1
- package/browser/{chunk-245FSNUP.js → chunk-TML7WQTK.js} +1 -1
- package/browser/{chunk-3CMKQDJD.js → chunk-UBMWSFAZ.js} +1 -1
- package/browser/{chunk-O6KL6T76.js → chunk-UHZ4KKE5.js} +1 -1
- package/browser/{chunk-SC2IRNRE.js → chunk-UK3RUU4S.js} +1 -1
- package/browser/chunk-UR4PDGNP.js +6 -0
- package/browser/{chunk-2HCJBDRI.js → chunk-VO5LQION.js} +1 -1
- package/browser/{chunk-Q3ITJ7SM.js → chunk-W3ORO7W5.js} +1 -1
- package/browser/{chunk-KYYUJJ6W.js → chunk-WFLBQLIR.js} +1 -1
- package/browser/{chunk-IFHVRSTC.js → chunk-XPBP7UEM.js} +1 -1
- package/browser/chunk-XPCRFTEI.js +1 -0
- package/browser/{chunk-BCOH5IGB.js → chunk-ZAMAK546.js} +1 -1
- package/browser/{chunk-S2DDRVZC.js → chunk-ZHT32KNQ.js} +1 -1
- package/browser/index.html +13 -3
- package/browser/{main-TMN4EWBV.js → main-6VAJ4HYC.js} +1 -1
- package/browser/styles-2FWMUG56.css +1 -0
- package/package.json +1 -1
- package/browser/chunk-3OWOEY5M.js +0 -1
- package/browser/chunk-3XRWFLI7.js +0 -6
- package/browser/chunk-56ZJETOZ.js +0 -6
- package/browser/chunk-DLM7MUO5.js +0 -1
- package/browser/chunk-JQYJDI3L.js +0 -1
- package/browser/chunk-LPJG7HDA.js +0 -1
- package/browser/chunk-NEIKVLFC.js +0 -1
- package/browser/chunk-PMBWUQPI.js +0 -1
- package/browser/chunk-QCPXHP56.js +0 -1
- package/browser/chunk-QHD6RKEP.js +0 -1
- package/browser/chunk-QS5AU6X7.js +0 -1
- package/browser/chunk-QV2MVWJJ.js +0 -1
- package/browser/chunk-SFK3JOTF.js +0 -1
- package/browser/chunk-VURHEL5U.js +0 -1
- package/browser/chunk-WLBH76W3.js +0 -1
- package/browser/chunk-XEXRIFJE.js +0 -1
- package/browser/chunk-XTHD557L.js +0 -1
- package/browser/chunk-ZD5EXS3I.js +0 -1
- package/browser/styles-UY3RDTVV.css +0 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{a as He,b as Ge,d as ye,f as Pe}from"./chunk-
|
|
1
|
+
import{a as He,b as Ge,d as ye,f as Pe}from"./chunk-7DZ6K6CC.js";import{a as $e,b as pe,c as Be,d as Ue}from"./chunk-PFBYB2QD.js";import{c as le}from"./chunk-MZT6I3S3.js";import{c as nt}from"./chunk-WUU4G5YQ.js";import{h as We,j as Ye}from"./chunk-DVUB4DDV.js";import{a as Xe,b as Qe,d as qe,k as Ze,l as Ke,m as et,n as tt}from"./chunk-MWPKXBXJ.js";import{d as Re}from"./chunk-OX7PDXEA.js";import{a as T,c as P}from"./chunk-3ZLLFAXF.js";import{a as B,b as U}from"./chunk-Q2M4W42M.js";import{D as Je,E as he,c as _e,g as ge,m as ue}from"./chunk-DDWYQORF.js";import{a as de,b as me}from"./chunk-JF3TWRKD.js";import{E as ze,O as R,S as $,n as Le}from"./chunk-B46LXCLF.js";import{$b as ae,Ab as be,Bb as C,Db as u,Fb as c,Gb as Ve,Ha as J,Hb as De,Jb as te,Jc as Ae,Ka as d,Kb as ne,Lb as ie,Pb as xe,Qb as V,Rb as x,T as I,Tb as l,Ub as y,Vb as Y,Wa as E,Xa as je,Zb as re,_ as Ee,_b as oe,a as k,ab as K,b as H,ca as v,dc as Ne,ec as Fe,ga as m,h as Oe,ha as p,jb as ee,jc as Ie,lb as _,ma as Z,mb as g,mc as se,oa as q,pb as L,qb as z,qc as ce,rb as b,sb as o,t as G,ta as A,tb as a,ua as W,ub as j,z as ke}from"./chunk-KJ5SIUGY.js";var it=(()=>{class n{static \u0275fac=function(i){return new(i||n)};static \u0275mod=je({type:n});static \u0275inj=Ee({imports:[ze]})}return n})();var mt=(n,t)=>({subThreads:n,depth:t}),pt=n=>({subThreads:n,depth:1}),st=(n,t)=>t.id,_t=(n,t)=>t.label;function gt(n,t){if(n&1){let e=C();o(0,"mat-icon",10),u("click",function(r){m(e);let s=c().$implicit,f=c(3);return p(f.toggleSubThreads(r,s.id))}),l(1),a()}if(n&2){let e=c().$implicit,i=c(3);d(),y(i.isParentExpanded(e.id)?"expand_more":"chevron_right")}}function ut(n,t){n&1&&be(0)}function ht(n,t){if(n&1&&K(0,ut,1,0,"ng-container",11),n&2){let e=c().$implicit,i=c().depth;c();let r=xe(1);b("ngTemplateOutlet",r)("ngTemplateOutletContext",Fe(2,mt,e.subThreads,i+1))}}function ft(n,t){if(n&1){let e=C();o(0,"div",5)(1,"a",6),u("click",function(r){let s=m(e).$implicit;return c(3).selectThread(s.id),p(r.preventDefault())})("keydown.enter",function(r){let s=m(e).$implicit;return c(3).selectThread(s.id),p(r.preventDefault())})("keydown.space",function(r){let s=m(e).$implicit;return c(3).selectThread(s.id),p(r.preventDefault())}),_(2,gt,2,1,"mat-icon",7),o(3,"span",8),l(4),a(),o(5,"span",9),l(6),a()()(),_(7,ht,1,5,"ng-container")}if(n&2){let e,i=t.$implicit,r=c().depth,s=c(2);V("--sub-depth",r),x("current",i.id===((e=s.currentThread())==null?null:e.id)),d(2),g(i.subThreads!=null&&i.subThreads.length?2:-1),d(2),y(i.delegatedAgentName||"Agent"),d(2),y(i.delegatedTask||i.name),d(),g(s.isParentExpanded(i.id)&&(i.subThreads!=null&&i.subThreads.length)?7:-1)}}function Ct(n,t){if(n&1&&L(0,ft,8,8,null,null,st),n&2){let e=t.subThreads;z(e)}}function vt(n,t){n&1&&(o(0,"div",4),j(1,"span",12),o(2,"span",13),l(3,"Loading threads..."),a()())}function bt(n,t){if(n&1&&(o(0,"div",27),l(1),a()),n&2){let e=c(6);d(),y(e.renameErrorMessage)}}function xt(n,t){if(n&1){let e=C();o(0,"div",18)(1,"input",26),ae("ngModelChange",function(r){m(e);let s=c(5);return oe(s.editingThreadName,r)||(s.editingThreadName=r),p(r)}),u("keydown",function(r){m(e);let s=c(5);return p(s.onEditKeydown(r))})("blur",function(){m(e);let r=c(5);return p(r.onEditBlur())})("click",function(r){return r.stopPropagation()}),a(),_(2,bt,2,1,"div",27),a()}if(n&2){let e=c(5);d(),re("ngModel",e.editingThreadName),b("disabled",e.isRenamingThread),d(),g(e.renameErrorMessage?2:-1)}}function yt(n,t){if(n&1){let e=C();o(0,"mat-icon",10),u("click",function(r){m(e);let s=c(2).$implicit,f=c(4);return p(f.toggleSubThreads(r,s.id))}),l(1),a()}if(n&2){let e=c(2).$implicit,i=c(4);d(),y(i.isParentExpanded(e.id)?"expand_more":"chevron_right")}}function Pt(n,t){if(n&1&&(o(0,"span",29),l(1),a()),n&2){let e=c(2).$implicit;d(),y(e.name)}}function St(n,t){n&1&&(j(0,"mat-spinner",31),o(1,"span",32),l(2,"Generating name..."),a()),n&2&&b("diameter",16)}function Mt(n,t){n&1&&(o(0,"mat-icon",30),l(1,"group"),a())}function wt(n,t){if(n&1){let e=C();o(0,"a",28),u("click",function(r){m(e);let s=c().$implicit;return c(4).selectThread(s.id),p(r.preventDefault())})("keydown.enter",function(r){m(e);let s=c().$implicit;return c(4).selectThread(s.id),p(r.preventDefault())})("keydown.space",function(r){m(e);let s=c().$implicit;return c(4).selectThread(s.id),p(r.preventDefault())}),_(1,yt,2,1,"mat-icon",7),_(2,Pt,2,1,"span",29)(3,St,3,1),_(4,Mt,2,0,"mat-icon",30),a()}if(n&2){let e=c().$implicit,i=c(4);b("matTooltip",e.name?e.name+`
|
|
2
2
|
|
|
3
3
|
`+(e.summary||""):e.summary||"")("matTooltipDisabled",!e.summary),d(),g(e.subThreads!=null&&e.subThreads.length?1:-1),d(),g(e.name?2:3),d(2),g(i.isSharedThread(e)?4:-1)}}function Tt(n,t){if(n&1){let e=C();o(0,"button",33),u("click",function(r){m(e);let s=c().$implicit,f=c(4);return p(f.startEditingThreadName(r,s))}),o(1,"mat-icon"),l(2,"edit"),a()()}}function Ot(n,t){if(n&1){let e=C();o(0,"button",34),u("click",function(r){m(e);let s=c().$implicit,f=c(4);return p(f.markActive(r,s))}),o(1,"mat-icon"),l(2,"replay"),a()()}}function kt(n,t){if(n&1){let e=C();o(0,"button",35),u("click",function(r){m(e);let s=c().$implicit,f=c(4);return p(f.markDone(r,s))}),o(1,"mat-icon"),l(2,"check_circle_outline"),a()()}}function Et(n,t){n&1&&be(0)}function jt(n,t){if(n&1&&K(0,Et,1,0,"ng-container",11),n&2){let e=c().$implicit;c(3);let i=xe(1);b("ngTemplateOutlet",i)("ngTemplateOutletContext",Ne(2,pt,e.subThreads))}}function Vt(n,t){if(n&1){let e=C();o(0,"div",17),_(1,xt,3,3,"div",18)(2,wt,5,5,"a",19),o(3,"div",20),_(4,Tt,3,0,"button",21),_(5,Ot,3,0,"button",22)(6,kt,3,0,"button",23),o(7,"button",24),u("click",function(r){let s=m(e).$implicit,f=c(4);return p(f.toggleStar(r,s))}),o(8,"mat-icon"),l(9),a()(),o(10,"button",25),u("click",function(r){let s=m(e).$implicit,f=c(4);return p(f.deleteThread(r,s))}),o(11,"mat-icon"),l(12,"delete"),a()()()(),_(13,jt,1,4,"ng-container")}if(n&2){let e,i=t.$implicit,r=c(4);x("current",i.id===((e=r.currentThread())==null?null:e.id)),d(),g(r.editingThreadId===i.id?1:2),d(3),g(r.editingThreadId!==i.id&&i.name?4:-1),d(),g(i.closedByUser?5:6),d(2),x("starred",r.isStarred(i)),b("title",r.isStarred(i)?"Unstar thread":"Star thread"),d(2),y(r.isStarred(i)?"star":"star_outline"),d(4),g(r.isParentExpanded(i.id)&&(i.subThreads!=null&&i.subThreads.length)?13:-1)}}function Dt(n,t){if(n&1&&(o(0,"div",14)(1,"div",16),l(2),a(),L(3,Vt,14,10,null,null,st),a()),n&2){let e=t.$implicit;d(2),y(e.label),d(),z(e.threads)}}function Nt(n,t){n&1&&(o(0,"div",15),l(1,"No existing threads"),a())}function Ft(n,t){if(n&1&&(o(0,"div",15),l(1),a()),n&2){let e=c(3);d(),Y('No threads matching "',e.searchQuery(),'"')}}function It(n,t){if(n&1&&(L(0,Dt,5,1,"div",14,_t),_(2,Nt,2,0,"div",15)(3,Ft,2,1,"div",15)),n&2){let e,i=c(2);z(i.getGroupedThreads()),d(2),g(!((e=i.threads())!=null&&e.length)&&!i.searchQuery()?2:i.searchQuery()&&i.getGroupedThreads().length===0?3:-1)}}function At(n,t){if(n&1&&(K(0,Ct,2,0,"ng-template",null,0,Ie),o(2,"div",3),_(3,vt,4,0,"div",4)(4,It,4,1),a()),n&2){let e=c();d(3),g(e.isLoadingThreadList()?3:4)}}function Lt(n,t){n&1&&(o(0,"span",36),l(1,"No project selected"),a())}function zt(n,t){n&1&&(o(0,"span",36),l(1,"Loading..."),a())}function Rt(n,t){if(n&1&&(o(0,"div",2),_(1,Lt,2,0,"span",36)(2,zt,2,0,"span",36),a()),n&2){let e,i=c();d(),g((e=i.currentProject())!=null&&e.name?2:1)}}var fe=class n{projects=null;searchMode=!1;searchQuery=ce("");searchModeChange=new q;threadSelected=new q;projectStateService=v(me);threadStateService=v(pe);threadApiService=v($e);userService=v(Be);router=v(le);destroyRef=v(Z);currentThread=P(this.threadStateService.selectedThread$);currentProject=P(this.projectStateService.selectedProject$);threads=P(this.threadStateService.threadList$);isLoadingThreadList=P(this.threadStateService.isLoadingThreadList$);username=P(this.userService.username$);isTouchDevice="ontouchstart"in window||navigator.maxTouchPoints>0;editingThreadId=null;editingThreadName="";isRenamingThread=!1;renameErrorMessage="";expandedParents=new Set;constructor(){W(()=>{let t=this.currentThread()?.id,e=this.threads();if(!t||!e?.length)return;let i=new Map;for(let s of e)s.parentThreadId&&i.set(s.id,s.parentThreadId);let r=t;for(;r;){let s=i.get(r);s&&this.expandedParents.add(s),r=s}})}ngOnInit(){this.userService.fetchCurrentUser().subscribe({error:t=>{console.error("[THREAD-SELECTOR] Failed to load current user:",t)}})}selectThread(t){this.threadStateService.selectThread(t),this.threadSelected.emit(),this.router.navigate(["project",this.currentProject()?.name,"thread",t])}getGroupedThreads(){let t=this.threads();if(!t?.length)return[];let e=new Set(t.map(h=>h.id)),i=t.filter(h=>!h.parentThreadId),r=t.filter(h=>!!h.parentThreadId),s=r.filter(h=>!e.has(h.parentThreadId)),f=r.filter(h=>e.has(h.parentThreadId)),D=new Map;for(let h of f){let S=h.parentThreadId;D.has(S)||D.set(S,[]),D.get(S).push(h)}let X=h=>(D.get(h)||[]).sort((w,O)=>w.modifiedDate>O.modifiedDate?-1:1).map(w=>H(k({},w),{subThreads:X(w.id)})),N=[...i,...s];if(this.searchQuery()&&this.searchQuery().trim()){let h=this.searchQuery().toLowerCase().trim();N=N.filter(S=>S.name.toLowerCase().includes(h)||S.summary&&S.summary.toLowerCase().includes(h))}if(!N.length)return[];let F=this.username();if(!F)return[];let Me=N.map(h=>H(k({},h),{subThreads:X(h.id)})),we=Me.filter(h=>h.starring&&h.starring.includes(F)),lt=Me.filter(h=>!h.starring||!h.starring.includes(F)),Q=new Map,Te=new Date;Te.setHours(0,0,0,0);for(let h of lt){let S=new Date(h.modifiedDate);S.setHours(0,0,0,0);let w=Te.getTime()-S.getTime(),O=Math.floor(w/(1e3*60*60*24)),M;O===0?M="Today":O===1?M="Yesterday":O<7?M="This Week":O<30?M="This Month":O<90?M="Last 3 Months":M="Older",Q.has(M)||Q.set(M,[]),Q.get(M).push(h)}let ve=[];if(we.length>0){let h=[...we].sort((S,w)=>S.modifiedDate>w.modifiedDate?-1:1);ve.push({label:"Starred",threads:h})}return["Today","Yesterday","This Week","This Month","Last 3 Months","Older"].filter(h=>Q.has(h)).forEach(h=>{ve.push({label:h,threads:Q.get(h)})}),ve}isParentExpanded(t){return this.expandedParents.has(t)}toggleSubThreads(t,e){t.stopPropagation(),this.expandedParents.has(e)?this.expandedParents.delete(e):this.expandedParents.add(e)}isSubThread(t){return!!t.parentThreadId}isSharedThread(t){return t.users&&t.users.length>1}isStarred(t){let e=this.username();return!!e&&t.starring&&t.starring.includes(e)}toggleStar(t,e){t.stopPropagation();let i=this.username();if(!i)return;let r=e.starring&&e.starring.includes(i),s=r?this.threadApiService.unstarThread(e.id):this.threadApiService.starThread(e.id);this.threadStateService.updateStarLocal(e.id,!r,i),s.pipe(T(this.destroyRef)).subscribe({next:()=>{},error:f=>{console.error("Error toggling star:",f),this.threadStateService.refreshThreadList()}})}markDone(t,e){t.stopPropagation(),this.threadStateService.markDone(e.id)}markActive(t,e){t.stopPropagation(),this.threadStateService.markActive(e.id)}deleteThread(t,e){t.stopPropagation();let i=this.currentProject()?.name;!i||!confirm(`Are you sure you want to delete the thread "${e.name}"?`)||this.threadApiService.deleteThread(e.id).subscribe({next:()=>{this.currentThread()?.id===e.id&&(this.threadStateService.clearSelection(),this.router.navigate(["project",i])),this.threadStateService.refreshThreadList()},error:s=>{console.error("Error deleting thread:",s),alert("Failed to delete thread. Please try again.")}})}formatDate(t){try{let e=new Date(t),r=new Date().getTime()-e.getTime(),s=Math.floor(r/(1e3*60*60*24));return s===0?"Today":s===1?"Yesterday":s<7?`${s} days ago`:e.toLocaleDateString("en-EN",{day:"numeric",month:"short"})}catch(e){return"No date"}}startEditingThreadName(t,e){t.stopPropagation(),this.editingThreadId=e.id,this.editingThreadName=e.name||"",this.renameErrorMessage="",setTimeout(()=>{let i=document.querySelector(".thread-name-input");i&&(i.focus(),i.select())},0)}cancelEditingThreadName(){this.editingThreadId=null,this.editingThreadName="",this.renameErrorMessage=""}saveThreadName(t){if(t&&t.stopPropagation(),!this.editingThreadId)return;let e=this.editingThreadName.trim();if(!e){this.renameErrorMessage="Thread name cannot be empty";return}if(e.length>200){this.renameErrorMessage="Thread name is too long (max 200 characters)";return}let i=this.editingThreadId;this.isRenamingThread=!0,this.renameErrorMessage="",this.threadStateService.renameThread(i,e).subscribe({next:()=>{console.log("[THREAD-SELECTOR] Thread renamed successfully"),this.cancelEditingThreadName(),this.isRenamingThread=!1},error:r=>{console.error("[THREAD-SELECTOR] Error renaming thread:",r),this.renameErrorMessage=r.message||"Failed to rename thread",this.isRenamingThread=!1}})}onEditKeydown(t){t.key==="Enter"?(t.preventDefault(),t.stopPropagation(),this.saveThreadName()):t.key==="Escape"&&(t.preventDefault(),t.stopPropagation(),this.cancelEditingThreadName())}onEditBlur(){setTimeout(()=>{this.editingThreadId&&!this.isRenamingThread&&this.saveThreadName()},200)}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=E({type:n,selectors:[["app-thread-selector"]],inputs:{searchMode:"searchMode",searchQuery:[1,"searchQuery"]},outputs:{searchModeChange:"searchModeChange",threadSelected:"threadSelected"},decls:3,vars:1,consts:[["subThreadTemplate",""],["tabindex","0","role","application","aria-label","Thread selector",1,"thread-selector",3,"click","keydown"],[1,"thread-disabled"],["role","menu","aria-label","Thread selection",1,"thread-list"],[1,"thread-loading"],[1,"thread-item-wrapper","sub-thread"],["role","menuitem","tabindex","0",1,"thread-item","sub-thread-item",3,"click","keydown.enter","keydown.space"],[1,"sub-thread-toggle"],[1,"sub-thread-agent"],[1,"sub-thread-task"],[1,"sub-thread-toggle",3,"click"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"loading-spinner"],[1,"loading-text"],[1,"thread-group"],[1,"thread-empty"],[1,"thread-group-header"],[1,"thread-item-wrapper"],[1,"thread-name-edit-wrapper"],["matTooltipShowDelay","1000","role","menuitem","tabindex","0",1,"thread-item",3,"matTooltip","matTooltipDisabled"],[1,"action-buttons"],["mat-icon-button","","title","Rename thread","type","button",1,"action-button","edit-button"],["mat-icon-button","","title","Mark as active","type","button",1,"action-button","mark-active-button"],["mat-icon-button","","title","Mark as done","type","button",1,"action-button","mark-done-button"],["mat-icon-button","","type","button",1,"action-button","star-button",3,"click","title"],["mat-icon-button","","title","Delete thread","type","button",1,"action-button","delete-button",3,"click"],["type","text","maxlength","200",1,"thread-name-input",3,"ngModelChange","keydown","blur","click","ngModel","disabled"],[1,"rename-error"],["matTooltipShowDelay","1000","role","menuitem","tabindex","0",1,"thread-item",3,"click","keydown.enter","keydown.space","matTooltip","matTooltipDisabled"],[1,"thread-name"],["matTooltip","Shared thread",1,"shared-indicator"],[1,"thread-name-spinner",3,"diameter"],[1,"thread-name","thread-name-generating"],["mat-icon-button","","title","Rename thread","type","button",1,"action-button","edit-button",3,"click"],["mat-icon-button","","title","Mark as active","type","button",1,"action-button","mark-active-button",3,"click"],["mat-icon-button","","title","Mark as done","type","button",1,"action-button","mark-done-button",3,"click"],[1,"disabled-text"]],template:function(e,i){if(e&1&&(o(0,"div",1),u("click",function(s){return s.stopPropagation()})("keydown",function(s){return s.stopPropagation()}),_(1,At,5,1)(2,Rt,3,1,"div",2),a()),e&2){let r;d(),g((r=i.currentProject())!=null&&r.name?1:2)}},dependencies:[Ae,he,_e,ge,Je,ue,U,B,$,R,Ye,We,Ge,He,Qe,Xe],styles:[".thread-selector[_ngcontent-%COMP%]{display:flex;flex-direction:column;width:100%;flex:1;min-height:0;overflow-x:hidden;overflow-y:auto}.thread-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:0;max-height:none;overflow:visible}.thread-group[_ngcontent-%COMP%]{display:flex;flex-direction:column;margin-bottom:.5rem}.thread-group[_ngcontent-%COMP%]:last-child{margin-bottom:0}.thread-group-header[_ngcontent-%COMP%]{padding:.5rem 1rem .25rem;font-size:.75rem;font-weight:600;color:var(--color-text-secondary);text-transform:uppercase;letter-spacing:.5px;position:sticky;top:0;background:var(--glass-bg);backdrop-filter:var(--glass-backdrop-blur);-webkit-backdrop-filter:var(--glass-backdrop-blur);z-index:1}.thread-item-wrapper[_ngcontent-%COMP%]{display:flex;align-items:center;position:relative;width:100%;border-radius:0;min-width:0;gap:.25rem}.thread-item-wrapper[_ngcontent-%COMP%]:hover{background:var(--color-bg-hover)}.thread-item-wrapper[_ngcontent-%COMP%]:hover .action-buttons[_ngcontent-%COMP%]{display:flex}.thread-item-wrapper.current[_ngcontent-%COMP%]{background:var(--color-primary-light)}.thread-item-wrapper.current[_ngcontent-%COMP%] .thread-item[_ngcontent-%COMP%]{color:var(--color-primary-text);font-weight:600}.thread-item[_ngcontent-%COMP%]{display:flex;align-items:center;flex:1;min-width:0;padding:.75rem 1rem;text-decoration:none;cursor:pointer;transition:all .2s ease;background:transparent;border:none;border-radius:0;color:var(--color-text);text-align:left;justify-content:flex-start}.thread-item.new-thread-item[_ngcontent-%COMP%]{margin-bottom:.25rem}.thread-item[_ngcontent-%COMP%]:hover{color:var(--color-primary)}.thread-item[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--color-primary);outline-offset:-2px}.action-buttons[_ngcontent-%COMP%]{display:none;align-items:center;gap:.25rem;flex-shrink:0;margin-right:.5rem}.thread-item-wrapper[_ngcontent-%COMP%]:hover .action-buttons[_ngcontent-%COMP%], .thread-item-wrapper.current[_ngcontent-%COMP%] .action-buttons[_ngcontent-%COMP%]{display:flex}.action-button[_ngcontent-%COMP%]{flex-shrink:0;border-radius:4px!important;width:28px!important;height:28px!important;padding:0!important}.action-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple{border-radius:4px!important}.action-button[_ngcontent-%COMP%]:hover{background:var(--color-bg-hover)!important}.action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.action-button.edit-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.action-button.edit-button[_ngcontent-%COMP%]:hover{background-color:var(--color-primary-hover)!important}.action-button.edit-button[_ngcontent-%COMP%]:hover mat-icon[_ngcontent-%COMP%]{color:var(--color-primary)}.action-button.star-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{transition:color .2s ease}.action-button.star-button.starred[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:#fbbf24}.action-button.star-button[_ngcontent-%COMP%]:not(.starred):hover mat-icon[_ngcontent-%COMP%]{color:#fbbf24}.action-button.delete-button[_ngcontent-%COMP%]:hover mat-icon[_ngcontent-%COMP%]{color:#ef4444}.action-button.mark-done-button[_ngcontent-%COMP%]:hover mat-icon[_ngcontent-%COMP%]{color:#22c55e}.action-button.mark-active-button[_ngcontent-%COMP%]:hover mat-icon[_ngcontent-%COMP%]{color:var(--color-primary)}.thread-link[_ngcontent-%COMP%]{display:inline-flex;align-items:center;background:transparent;border:none;text-decoration:none;cursor:pointer;transition:all .2s ease;gap:.5rem;font-size:.875rem;font-weight:400;padding:0 1rem;min-width:0}.thread-link[_ngcontent-%COMP%]:hover:not(.new-thread-link){color:var(--color-primary-hover, var(--color-primary));text-decoration:underline;text-decoration-thickness:1.5px;text-underline-offset:3px}.thread-link[_ngcontent-%COMP%]:focus{outline:2px solid var(--color-primary);outline-offset:2px}.thread-link.new-thread-link[_ngcontent-%COMP%]{margin-bottom:.5rem;font-weight:600;font-size:.95rem}.thread-link.new-thread-link[_ngcontent-%COMP%] .thread-name[_ngcontent-%COMP%]{background:linear-gradient(90deg,var(--color-primary, #3b82f6) 0%,var(--color-accent, #8b5cf6) 50%,var(--color-primary, #3b82f6) 100%);background-size:200% auto;background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent;animation:_ngcontent-%COMP%_gradientShift 3s ease-in-out infinite}.thread-link.new-thread-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:var(--color-primary);animation:_ngcontent-%COMP%_iconPulse 3s ease-in-out infinite}.thread-link.new-thread-link[_ngcontent-%COMP%]:hover{transform:translate(4px)}.thread-link.new-thread-link[_ngcontent-%COMP%]:hover mat-icon[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_iconPulse 1.5s ease-in-out infinite}.thread-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}@keyframes _ngcontent-%COMP%_gradientShift{0%{background-position:0 center}50%{background-position:100% center}to{background-position:0 center}}@keyframes _ngcontent-%COMP%_iconPulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(1.05)}}.thread-name[_ngcontent-%COMP%]{flex:1;font-size:.875rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left}.thread-name.thread-name-generating[_ngcontent-%COMP%]{color:var(--color-text-muted);font-style:italic}.thread-name-edit-wrapper[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;padding:0 .5rem}.thread-name-input[_ngcontent-%COMP%]{width:100%;padding:.5rem;border:1px solid var(--color-border);border-radius:4px;background:var(--color-bg-secondary);color:var(--color-text-primary);font-size:.9rem;font-family:inherit}.thread-name-input[_ngcontent-%COMP%]:focus{outline:none;border-color:var(--color-primary);box-shadow:0 0 0 2px #3b82f61a}.thread-name-input[_ngcontent-%COMP%]:disabled{opacity:.6;cursor:not-allowed}.rename-error[_ngcontent-%COMP%]{color:var(--color-error);font-size:.75rem;margin-top:.25rem;padding-left:.5rem}.thread-name-spinner[_ngcontent-%COMP%]{flex-shrink:0;margin-right:.5rem}.thread-name-spinner[_ngcontent-%COMP%] .mat-mdc-progress-spinner circle{stroke:var(--color-primary)!important}.current-indicator[_ngcontent-%COMP%]{color:var(--color-success);font-weight:700;flex-shrink:0;font-size:1rem}.thread-separator[_ngcontent-%COMP%]{height:1px;background:var(--color-border);margin:.25rem 0}.thread-empty[_ngcontent-%COMP%]{padding:1.5rem 1rem;text-align:center;color:var(--color-text-muted);font-size:.8rem;font-style:italic}.thread-loading[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 1rem;gap:.75rem}.thread-loading[_ngcontent-%COMP%] .loading-spinner[_ngcontent-%COMP%]{width:24px;height:24px;border:3px solid var(--color-border);border-top-color:var(--color-primary);border-radius:50%;animation:_ngcontent-%COMP%_spin .8s linear infinite}.thread-loading[_ngcontent-%COMP%] .loading-text[_ngcontent-%COMP%]{color:var(--color-text-muted);font-size:.8rem}@keyframes _ngcontent-%COMP%_spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.thread-disabled[_ngcontent-%COMP%]{padding:1.5rem 1rem}.thread-disabled[_ngcontent-%COMP%] .disabled-text[_ngcontent-%COMP%]{display:block;color:var(--color-text-muted);font-size:.85rem;font-style:italic;text-align:center}.thread-item-wrapper.sub-thread[_ngcontent-%COMP%]{padding-left:calc(.2rem + var(--sub-depth, 1) * 1.5rem);border-left:2px solid var(--color-primary, #3b82f6);margin-left:.75rem}.thread-item-wrapper.sub-thread[_ngcontent-%COMP%] .sub-thread-item[_ngcontent-%COMP%]{padding:.35rem .5rem .35rem 0;gap:.2rem;font-size:.8rem;color:var(--color-text-secondary)}.thread-item-wrapper.sub-thread[_ngcontent-%COMP%] .sub-thread-item[_ngcontent-%COMP%]:hover{color:var(--color-primary)}.thread-item-wrapper.sub-thread[_ngcontent-%COMP%] .sub-thread-agent[_ngcontent-%COMP%]{font-weight:600;color:var(--color-primary);white-space:nowrap;flex-shrink:0;font-size:.8rem}.thread-item-wrapper.sub-thread[_ngcontent-%COMP%] .sub-thread-task[_ngcontent-%COMP%]{color:var(--color-text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:.75rem}.sub-thread-toggle[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;flex-shrink:0;cursor:pointer;color:var(--color-text-secondary);margin-right:.25rem}.sub-thread-toggle[_ngcontent-%COMP%]:hover{color:var(--color-primary)}.shared-indicator[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px;color:var(--color-text-secondary);flex-shrink:0;margin-left:.25rem}@media(max-width:768px){.thread-item[_ngcontent-%COMP%]{padding:.6rem .8rem}.thread-name[_ngcontent-%COMP%]{font-size:.8rem}}"]})};var $t=["logsContent"],Bt=(n,t)=>t.name;function Ut(n,t){if(n&1){let e=C();o(0,"button",12),u("click",function(){m(e);let r=c().$implicit,s=c();return p(s.start(r.name))}),o(1,"mat-icon"),l(2,"play_arrow"),a()()}if(n&2){let e=c().$implicit;b("disabled",e.isLoading)}}function Xt(n,t){if(n&1){let e=C();o(0,"button",13),u("click",function(){m(e);let r=c().$implicit,s=c();return p(s.stop(r.name))}),o(1,"mat-icon"),l(2,"stop"),a()()}if(n&2){let e=c().$implicit;b("disabled",e.isLoading)}}function Qt(n,t){if(n&1&&(o(0,"a",8)(1,"mat-icon",14),l(2,"open_in_new"),a()()),n&2){let e=c().$implicit;b("href",e.url,J)("title",e.url)}}function Ht(n,t){if(n&1&&(o(0,"div",15),l(1),a()),n&2){let e=c(),i=e.$implicit,r=e.$index;V("order",r*2),d(),y(i.errorMessage)}}function Gt(n,t){if(n&1){let e=C();o(0,"button",21),u("click",function(){m(e);let r=c(3);return p(r.onManualRefresh())}),o(1,"mat-icon"),l(2,"refresh"),a()()}}function qt(n,t){if(n&1&&(o(0,"div",16)(1,"div",17)(2,"span",18),l(3),a(),_(4,Gt,3,0,"button",19),a(),o(5,"pre",20,0),l(7),a()()),n&2){let e=c(),i=e.$implicit,r=e.$index,s=c();V("order",r*2+1),d(3),Y("",i.name," logs"),d(),g(i.status==="running"?4:-1),d(3),y(s.logs()||"(empty)")}}function Wt(n,t){if(n&1){let e=C();o(0,"div",2)(1,"span",3),l(2),a(),o(3,"div",4),_(4,Ut,3,1,"button",5)(5,Xt,3,1,"button",6),o(6,"span",7),l(7),a(),_(8,Qt,3,2,"a",8),o(9,"button",9),u("click",function(){let r=m(e).$implicit,s=c();return p(s.toggleLogs(r.name))}),o(10,"mat-icon"),l(11),a()()()(),_(12,Ht,2,3,"div",10),_(13,qt,8,5,"div",11)}if(n&2){let e=t.$implicit,i=t.$index,r=c();V("order",i*2),d(2),y(e.name),d(2),g(e.status==="stopped"?4:5),d(2),x("running",e.status==="running"),d(),Y(" ",e.status==="running"?"Running":"Stopped"," "),d(),g(e.url?8:-1),d(),b("title",r.logsOpenFor()===e.name?"Hide logs":"Show logs"),d(2),y(r.logsOpenFor()===e.name?"expand_less":"terminal"),d(),g(e.errorMessage?12:-1),d(),g(r.logsOpenFor()===e.name?13:-1)}}var Ce=class n{destroyRef=v(Z);projectApi=v(de);projectName=ce.required();entryStates=A([]);hasPreview=se(()=>this.entryStates().length>0);logsOpenFor=A(null);logs=A("");logsContent;logsPollTimer=null;logsTimeoutTimer=null;static LOGS_POLL_MS=5e3;static LOGS_TIMEOUT_MS=1200*1e3;constructor(){W(()=>{let t=this.projectName();t&&this.onProjectChanged(t)},{allowSignalWrites:!0}),W(()=>{console.log("entry states",this.entryStates())})}ngOnDestroy(){this.stopLogPolling()}onProjectChanged(t){this.stopLogPolling(),this.entryStates.set([]),this.logsOpenFor.set(null),this.logs.set(""),this.projectApi.getPreviewEntries(t).pipe(T(this.destroyRef)).subscribe({next:e=>{let i=e.entries;if(i.length===0)return;let r=i.map(f=>({name:f.name,command:f.command,url:f.url,status:"stopped",isLoading:!1,errorMessage:""}));this.entryStates.set(r);let s=i.map(f=>this.projectApi.getPreviewStatus(t,f.name));ke(s).pipe(T(this.destroyRef)).subscribe({next:f=>{this.entryStates.update(D=>D.map((X,N)=>{let F=f[N];return F?H(k({},X),{status:F.status}):X}))},error:()=>{}})},error:()=>{}})}start(t){this.updateEntry(t,{isLoading:!0,errorMessage:""}),this.projectApi.startPreview(this.projectName(),t).pipe(T(this.destroyRef)).subscribe({next:e=>{this.updateEntry(t,{status:e.status,isLoading:!1})},error:e=>{this.updateEntry(t,{errorMessage:e?.error?.error??"Failed to start preview",isLoading:!1})}})}stop(t){this.updateEntry(t,{isLoading:!0,errorMessage:""}),this.projectApi.stopPreview(this.projectName(),t).pipe(T(this.destroyRef)).subscribe({next:()=>{this.updateEntry(t,{status:"stopped",isLoading:!1}),this.logsOpenFor()===t&&this.stopLogPolling()},error:e=>{this.updateEntry(t,{errorMessage:e?.error?.error??"Failed to stop preview",isLoading:!1})}})}toggleLogs(t){this.logsOpenFor()===t?(this.logsOpenFor.set(null),this.logs.set(""),this.stopLogPolling()):(this.logsOpenFor.set(t),this.refreshLogs(),this.startLogPolling())}onManualRefresh(){this.refreshLogs(),this.logsPollTimer&&this.resetLogsTimeout()}refreshLogs(){let t=this.logsOpenFor();t&&this.projectApi.getPreviewLogs(this.projectName(),t).pipe(T(this.destroyRef)).subscribe({next:e=>{this.logs.set(e.logs),this.scrollLogsToBottom()},error:()=>this.logs.set("(failed to load logs)")})}updateEntry(t,e){this.entryStates.update(i=>i.map(r=>r.name===t?k(k({},r),e):r))}startLogPolling(){this.stopLogPolling(),this.logsPollTimer=setInterval(()=>{this.logsOpenFor()?this.refreshLogs():this.stopLogPolling()},n.LOGS_POLL_MS),this.resetLogsTimeout()}stopLogPolling(){this.logsPollTimer&&(clearInterval(this.logsPollTimer),this.logsPollTimer=null),this.logsTimeoutTimer&&(clearTimeout(this.logsTimeoutTimer),this.logsTimeoutTimer=null)}resetLogsTimeout(){this.logsTimeoutTimer&&clearTimeout(this.logsTimeoutTimer),this.logsTimeoutTimer=setTimeout(()=>{this.stopLogPolling()},n.LOGS_TIMEOUT_MS)}scrollLogsToBottom(){setTimeout(()=>{let t=this.logsContent?.nativeElement;t&&(t.scrollTop=t.scrollHeight)})}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=E({type:n,selectors:[["app-preview-panel"]],viewQuery:function(e,i){if(e&1&&te($t,5),e&2){let r;ne(r=ie())&&(i.logsContent=r.first)}},inputs:{projectName:[1,"projectName"]},decls:3,vars:0,consts:[["logsContent",""],[1,"preview-panel"],[1,"entry-row"],[1,"entry-name"],[1,"entry-actions"],["mat-icon-button","","title","Start","type","button",1,"entry-btn","start",3,"disabled"],["mat-icon-button","","title","Stop","type","button",1,"entry-btn","stop",3,"disabled"],[1,"status-pill"],["target","_blank","rel","noopener noreferrer",1,"preview-url",3,"href","title"],["mat-icon-button","","type","button",1,"entry-btn","logs",3,"click","title"],[1,"preview-error",3,"order"],[1,"logs-container",3,"order"],["mat-icon-button","","title","Start","type","button",1,"entry-btn","start",3,"click","disabled"],["mat-icon-button","","title","Stop","type","button",1,"entry-btn","stop",3,"click","disabled"],[1,"link-icon"],[1,"preview-error"],[1,"logs-container"],[1,"logs-header"],[1,"logs-title"],["mat-icon-button","","title","Refresh logs","type","button",1,"entry-btn"],[1,"logs-content"],["mat-icon-button","","title","Refresh logs","type","button",1,"entry-btn",3,"click"]],template:function(e,i){e&1&&(o(0,"div",1),L(1,Wt,14,12,null,null,Bt),a()),e&2&&(d(),z(i.entryStates()))},dependencies:[$,R,U,B],styles:["[_nghost-%COMP%]{display:block}.preview-panel[_ngcontent-%COMP%]{display:flex;flex-direction:column;padding:.25rem 0}.entry-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.375rem;padding:.125rem .5rem;min-height:36px}.entry-name[_ngcontent-%COMP%]{font-size:.82rem;font-weight:500;color:var(--on-surface, #e0e0e0);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto;min-width:0}.entry-actions[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.25rem;flex-shrink:0}.entry-btn[_ngcontent-%COMP%]{width:28px!important;height:28px!important;padding:0!important;display:inline-flex!important;align-items:center;justify-content:center;flex-shrink:0}.entry-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;line-height:18px}.entry-btn.start[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:var(--color-primary)}.entry-btn.stop[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:#e53935}.entry-btn.logs[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;line-height:16px;color:var(--color-text-secondary)}.entry-btn[disabled][_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:var(--color-text-secondary)}.status-pill[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;padding:1px 6px;border-radius:12px;font-size:.68rem;font-weight:600;letter-spacing:.02em;flex-shrink:0;min-width:52px;text-align:center;background:var(--color-bg-hover);color:var(--color-text-secondary);border:1px solid var(--color-border)}.status-pill.running[_ngcontent-%COMP%]{background:#22c55e26;color:#16a34a;border-color:#22c55e66}.preview-url[_ngcontent-%COMP%]{display:inline-flex;align-items:center;text-decoration:none;color:var(--color-primary);flex-shrink:0}.preview-url[_ngcontent-%COMP%]:hover{text-decoration:underline}.preview-url[_ngcontent-%COMP%] .link-icon[_ngcontent-%COMP%]{font-size:14px;width:14px;height:14px}.preview-error[_ngcontent-%COMP%]{font-size:.75rem;color:#c00;padding:0 .75rem}.logs-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;margin:.125rem .5rem .25rem;background:var(--color-bg-hover);border-radius:8px;overflow:hidden;border:1px solid var(--color-border)}.logs-header[_ngcontent-%COMP%]{display:flex;align-items:center;padding:.25rem .75rem;border-bottom:1px solid var(--color-border)}.logs-header[_ngcontent-%COMP%] .logs-title[_ngcontent-%COMP%]{flex:1;font-size:.72rem;font-weight:600;color:var(--color-text-secondary);text-transform:uppercase;letter-spacing:.05em}.logs-content[_ngcontent-%COMP%]{margin:0;padding:.5rem .75rem;font-family:Courier New,Courier,monospace;font-size:.72rem;line-height:1.5;color:var(--color-text);white-space:pre-wrap;word-break:break-all;max-height:200px;overflow-y:auto}.logs-content[_ngcontent-%COMP%]::-webkit-scrollbar{width:6px}.logs-content[_ngcontent-%COMP%]::-webkit-scrollbar-track{background:transparent}.logs-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background:var(--color-text-secondary);border-radius:3px}"]})};var Jt=["threadSearchInput"],Yt=["*"];function Zt(n,t){if(n&1){let e=C();o(0,"button",27),u("click",function(){m(e);let r=c();return p(r.toggle())}),o(1,"mat-icon"),l(2,"menu"),a()(),o(3,"button",28),u("click",function(){m(e);let r=c();return p(r.createNewThread())}),o(4,"mat-icon",10),l(5,"play_circle"),a()()}if(n&2){let e=c();d(3),b("disabled",!e.selectedProjectName())}}function Kt(n,t){if(n&1){let e=C();o(0,"div",12)(1,"a",29),u("click",function(r){return m(e),c().openMissionControl(),p(r.preventDefault())}),o(2,"mat-icon"),l(3,"rocket_launch"),a(),o(4,"span",30),l(5,"Task Control"),a()()()}}function en(n,t){if(n&1){let e=C();o(0,"div",15)(1,"mat-icon",31),l(2,"search"),a(),o(3,"input",32,0),ae("ngModelChange",function(r){m(e);let s=c();return oe(s.threadSearchQuery,r)||(s.threadSearchQuery=r),p(r)}),u("input",function(){m(e);let r=c();return p(r.onThreadSearchInput())}),a(),o(5,"button",33),u("click",function(){m(e);let r=c();return p(r.closeThreadSearch())}),o(6,"mat-icon"),l(7,"close"),a()()()}if(n&2){let e=c();d(3),re("ngModel",e.threadSearchQuery)}}function tn(n,t){if(n&1){let e=C();o(0,"div",16)(1,"mat-icon",23),l(2,"forum"),a(),o(3,"span",24),l(4,"Threads"),a(),o(5,"button",34),u("click",function(r){m(e);let s=c();return p(s.toggleThreadSearch(r))}),o(6,"mat-icon"),l(7,"search"),a()()()}}function nn(n,t){n&1&&(o(0,"mat-icon",22),l(1,"keyboard_arrow_up"),a())}function rn(n,t){n&1&&(o(0,"mat-icon",23),l(1,"hub"),a())}function on(n,t){n&1&&(o(0,"mat-icon",22),l(1,"keyboard_arrow_up"),a())}function an(n,t){n&1&&(o(0,"mat-icon",23),l(1,"tune"),a())}function sn(n,t){n&1&&(o(0,"div",36)(1,"div",40),j(2,"app-options-panel",41),a()())}function cn(n,t){if(n&1){let e=C();o(0,"div",35)(1,"a",21),u("click",function(r){return m(e),c(3).openProjectConfig(),r.preventDefault(),p(r.stopPropagation())}),o(2,"mat-icon",23),l(3,"settings_applications"),a(),o(4,"span",24),l(5,"Project Configuration"),a()()()}}function ln(n,t){n&1&&(o(0,"div",35)(1,"a",42)(2,"mat-icon",23),l(3,"settings_applications"),a(),o(4,"span",24),l(5,"Project config (No project)"),a()()())}function dn(n,t){if(n&1&&_(0,cn,6,0,"div",35)(1,ln,6,0,"div",35),n&2){let e=c(2);g(e.selectedProjectName()?0:1)}}function mn(n,t){if(n&1){let e=C();o(0,"div",35)(1,"a",21),u("click",function(r){return m(e),c(2).openAgents(),r.preventDefault(),p(r.stopPropagation())}),o(2,"mat-icon",23),l(3,"smart_toy"),a(),o(4,"span",24),l(5,"Agents"),a()()()}}function pn(n,t){n&1&&(o(0,"div",35)(1,"a",42)(2,"mat-icon",23),l(3,"smart_toy"),a(),o(4,"span",24),l(5,"Agents (No project)"),a()()())}function _n(n,t){if(n&1){let e=C();o(0,"div",35)(1,"a",21),u("click",function(r){return m(e),c(2).openPrompts(),r.preventDefault(),p(r.stopPropagation())}),o(2,"mat-icon",23),l(3,"description"),a(),o(4,"span",24),l(5,"Prompts"),a()()()}}function gn(n,t){n&1&&(o(0,"div",35)(1,"a",42)(2,"mat-icon",23),l(3,"description"),a(),o(4,"span",24),l(5,"Prompts (No project)"),a()()())}function un(n,t){if(n&1){let e=C();o(0,"div",35)(1,"a",21),u("click",function(r){return m(e),c(2).openSchedulers(),r.preventDefault(),p(r.stopPropagation())}),o(2,"mat-icon",23),l(3,"schedule"),a(),o(4,"span",24),l(5,"Schedulers"),a()()()}}function hn(n,t){n&1&&(o(0,"div",35)(1,"a",42)(2,"mat-icon",23),l(3,"schedule"),a(),o(4,"span",24),l(5,"Schedulers (No project)"),a()()())}function fn(n,t){n&1&&(o(0,"mat-icon",22),l(1,"keyboard_arrow_up"),a())}function Cn(n,t){n&1&&(o(0,"mat-icon",23),l(1,"rocket_launch"),a())}function vn(n,t){if(n&1&&(o(0,"div",36),j(1,"app-preview-panel",43),a()),n&2){let e=c(3);d(),b("projectName",e.selectedProjectName())}}function bn(n,t){if(n&1){let e=C();o(0,"div",35)(1,"a",21),u("click",function(r){return m(e),c(2).toggleSection("preview"),r.preventDefault(),p(r.stopPropagation())}),_(2,fn,2,0,"mat-icon",22)(3,Cn,2,0,"mat-icon",23),o(4,"span",24),l(5,"Preview Server"),a()(),_(6,vn,2,1,"div",36),a()}if(n&2){let e=c(2);x("expanded",e.expandedSections.preview),d(),x("active",e.expandedSections.preview),d(),g(e.expandedSections.preview?2:3),d(4),g(e.expandedSections.preview?6:-1)}}function xn(n,t){if(n&1){let e=C();o(0,"div",25)(1,"div",35)(2,"a",21),u("click",function(r){return m(e),c().toggleSection("config"),p(r.preventDefault())}),_(3,on,2,0,"mat-icon",22)(4,an,2,0,"mat-icon",23),o(5,"span",24),l(6,"Preferences"),a()(),_(7,sn,3,0,"div",36),a(),o(8,"div",35)(9,"a",21),u("click",function(r){return m(e),c().openTokenUsage(),r.preventDefault(),p(r.stopPropagation())}),o(10,"mat-icon",23),l(11,"data_usage"),a(),o(12,"span",24),l(13,"Token Usage"),a()()(),o(14,"div",35)(15,"a",21),u("click",function(r){return m(e),c().openUserConfig(),r.preventDefault(),p(r.stopPropagation())}),o(16,"mat-icon",23),l(17,"manage_accounts"),a(),o(18,"span",24),l(19,"User Configuration"),a()()(),_(20,dn,2,1),_(21,mn,6,0,"div",35)(22,pn,6,0,"div",35),_(23,_n,6,0,"div",35)(24,gn,6,0,"div",35),_(25,un,6,0,"div",35)(26,hn,6,0,"div",35),_(27,bn,7,6,"div",37),o(28,"div",35)(29,"a",38),j(30,"img",39),o(31,"span",24),l(32,"Contribute on GitHub"),a()()()()}if(n&2){let e=c();d(),x("expanded",e.expandedSections.config),d(),x("active",e.expandedSections.config),d(),g(e.expandedSections.config?3:4),d(4),g(e.expandedSections.config?7:-1),d(13),g(e.isAdmin?20:-1),d(),g(e.selectedProjectName()?21:22),d(2),g(e.selectedProjectName()?23:24),d(2),g(e.selectedProjectName()?25:26),d(2),g(e.hasPreviewConfig()?27:-1),d(3),ee("src","CODAY-Logo.png",J)}}function yn(n,t){if(n&1){let e=C();o(0,"div",26)(1,"mat-icon",44),l(2,"warning"),a(),o(3,"span",45),l(4),a(),o(5,"button",46),u("click",function(){m(e);let r=c();return p(r.configErrorMessage="")}),o(6,"mat-icon"),l(7,"close"),a()()()}if(n&2){let e=c();d(4),y(e.configErrorMessage)}}var ct=class n{destroy$=new Oe;sidenavStateChange=new q;drawerOpen=!1;breakpointObserver=v(Le);isDesktop=P(this.breakpointObserver.observe("(min-width: 1400px)").pipe(G(t=>t.matches)),{initialValue:!1});userOpenPreference=A(!0);isOpen=se(()=>this.userOpenPreference());isAdmin=!1;configErrorMessage="";expandedSections={config:!1,preview:!1,settings:!1};isThreadSearchActive=!1;threadSearchQuery="";threadSearchInput;dialog=v(Re);configApi=v(nt);projectStateService=v(me);projectApi=v(de);router=v(le);preferences=v(Ue);threadStateService=v(pe);projects=P(this.projectStateService.projectList$);selectedProject=P(this.projectStateService.selectedProject$);selectedProjectName=P(this.projectStateService.selectedProject$.pipe(G(t=>t?.name)));isProjectVolatile=P(this.projectStateService.selectedProject$.pipe(G(t=>t?.config?.volatile||!1)));forcedProject=P(this.projectStateService.forcedProject$);hasPreviewConfig=P(this.projectStateService.selectedProject$.pipe(G(t=>{let e=t?.config?.preview;return Array.isArray(e)&&!!e.length})),{initialValue:!1});ngOnInit(){let t=window.innerWidth>=1024,e=this.preferences.getPreference("sidenavOpen",t);this.userOpenPreference.set(e??t),this.configApi.getUserConfig().pipe(I(this.destroy$)).subscribe({next:i=>{this.isAdmin=i.groups?.includes("CODAY_ADMIN")??!1,console.log("[SIDENAV] User admin status:",this.isAdmin)},error:i=>{console.error("[SIDENAV] Error loading user config for roles:",i),this.isAdmin=!1}})}ngOnDestroy(){this.destroy$.next(),this.destroy$.complete()}toggle(){let t=!this.userOpenPreference();this.userOpenPreference.set(t),this.saveSidenavState(t),this.sidenavStateChange.emit(t)}close(){this.userOpenPreference()&&(this.userOpenPreference.set(!1),this.saveSidenavState(!1),this.sidenavStateChange.emit(!1))}saveSidenavState(t){this.preferences.setPreference("sidenavOpen",t)}openTokenUsage(){this.configErrorMessage="",this.router.navigate(["/token-usage"])}openUserConfig(){console.log("[SIDENAV] openUserConfig called"),this.configErrorMessage="",this.configApi.getUserConfig().pipe(I(this.destroy$)).subscribe({next:t=>{console.log("[SIDENAV] User config loaded, opening dialog"),this.dialog.open(Pe,{data:{configType:"user",initialContent:JSON.stringify(t,null,2)}}).afterClosed().subscribe(i=>{i&&this.saveUserConfig(i)})},error:t=>{console.error("[SIDENAV] Error loading user config:",t),this.configErrorMessage=t?.error?.error||"Failed to load user configuration"}})}saveUserConfig(t){this.configApi.updateUserConfig(t).pipe(I(this.destroy$)).subscribe({next:e=>{console.log("[SIDENAV] User config saved successfully")},error:e=>{console.error("[SIDENAV] Error saving user config:",e),this.configErrorMessage=e?.error?.error||"Failed to save user configuration"}})}openProjectConfig(){let t=this.selectedProjectName();if(!t){console.error("[SIDENAV] No project selected"),this.configErrorMessage="No project selected. Please select a project first.";return}this.configErrorMessage="",this.projectApi.getProjectConfig(t).pipe(I(this.destroy$)).subscribe({next:e=>{console.log("[SIDENAV] Project config loaded, opening dialog"),this.dialog.open(Pe,{data:{configType:"project",projectName:t,initialContent:JSON.stringify(e,null,2)}}).afterClosed().subscribe(r=>{r&&this.saveProjectConfig(t,r)})},error:e=>{console.error("[SIDENAV] Error loading project config:",e),this.configErrorMessage=e?.error?.error||"Failed to load project configuration"}})}saveProjectConfig(t,e){this.projectApi.updateProjectConfig(t,e).pipe(I(this.destroy$)).subscribe({next:i=>{console.log("[SIDENAV] Project config saved successfully")},error:i=>{console.error("[SIDENAV] Error saving project config:",i),this.configErrorMessage=i?.error?.error||"Failed to save project configuration"}})}requireProjectSelection(t){return this.selectedProjectName()?!0:(console.error(`[SIDENAV] No project selected, cannot ${t}`),this.configErrorMessage="Please select a project first",!1)}openAgents(){if(!this.requireProjectSelection("open agents"))return;let t=this.selectedProjectName();this.router.navigate(["project",t,"agents"])}openPrompts(){if(!this.requireProjectSelection("open prompts"))return;let t=this.selectedProjectName();this.router.navigate(["project",t,"prompts"])}openSchedulers(){if(!this.requireProjectSelection("open schedulers"))return;let t=this.selectedProjectName();this.router.navigate(["project",t,"schedulers"])}toggleSection(t){let e=this.expandedSections[t];t==="settings"?this.expandedSections[t]=!e:(["config","preview"].forEach(r=>{this.expandedSections[r]=!1}),this.expandedSections[t]=!e)}navigateToHome(){console.log("[SIDENAV] Navigating to home (project selection)"),this.projectStateService.clearSelection(),this.router.navigate(["/"])}openMissionControl(){let t=this.selectedProjectName();t&&(this.router.navigate(["project",t,"tasks"]),this.close())}createNewThread(){let t=this.selectedProjectName();if(!t){console.error("[SIDENAV] No project selected, cannot create new thread"),this.configErrorMessage="Please select a project first";return}console.log("[SIDENAV] Navigating to welcome view for new thread"),this.threadStateService.clearSelection(),this.router.navigate(["project",t])}onThreadSelectedOnMobile(){this.isDesktop()||this.close()}toggleThreadSearch(t){t.stopPropagation(),this.isThreadSearchActive=!0,this.threadSearchQuery="",setTimeout(()=>{this.threadSearchInput?.nativeElement.focus()},0)}closeThreadSearch(){this.isThreadSearchActive=!1,this.threadSearchQuery=""}onThreadSearchInput(){}onThreadSearchModeChange(t){t||this.closeThreadSearch()}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=E({type:n,selectors:[["app-sidenav"]],viewQuery:function(e,i){if(e&1&&te(Jt,5),e&2){let r;ne(r=ie())&&(i.threadSearchInput=r.first)}},inputs:{drawerOpen:"drawerOpen"},outputs:{sidenavStateChange:"sidenavStateChange"},ngContentSelectors:Yt,decls:35,vars:23,consts:[["threadSearchInput",""],[1,"sidenav-container",3,"hasBackdrop"],["mode","push","position","start",1,"app-sidenav",3,"closed","opened","disableClose"],[1,"sidenav-header"],["mat-icon-button","","title","Close menu",3,"click"],["alt","coday","title","Go to project selection","role","button","tabindex","0",1,"sidenav-logo","clickable",3,"click","keydown.enter","keydown.space"],[1,"header-title-section"],[1,"sidenav-title"],[1,"new-thread-section"],["role","button","tabindex","0",1,"new-thread-link",3,"click"],["fontSet","material-icons-outlined"],[1,"new-thread-text"],[1,"mission-control-section"],[1,"sidenav-sections"],[1,"section-container","expanded"],[1,"search-header"],[1,"section-toggle","active","threads-header"],[1,"section-content","threads"],[1,"sidenav-thread-selector",3,"searchModeChange","threadSelected","searchMode","searchQuery"],[1,"sidenav-nav"],[1,"section-container","settings-group"],["role","button","tabindex","0",1,"section-toggle",3,"click"],[1,"arrow-icon","expanded"],[1,"section-icon"],[1,"section-label"],[1,"section-content","settings-content"],["role","alert",1,"error-notification"],["mat-icon-button","","title","Menu","type","button",1,"sidenav-toggle-btn",3,"click"],["mat-icon-button","","title","Start a new thread","type","button",1,"sidenav-new-thread-btn",3,"click","disabled"],["role","button","tabindex","0",1,"mission-control-link",3,"click"],[1,"mission-control-text"],[1,"search-icon"],["type","text","placeholder","Search threads...",1,"search-input",3,"ngModelChange","input","ngModel"],["mat-icon-button","","title","Close search","type","button",1,"close-search-btn",3,"click"],["mat-icon-button","","title","Search threads","type","button",1,"search-button",3,"click"],[1,"section-container"],[1,"section-content"],[1,"section-container",3,"expanded"],["href","https://github.com/whoz-oss/coday","target","_blank","rel","noopener noreferrer","title","Contribute on GitHub",1,"section-toggle","contribute-btn"],["alt","Coday",1,"contribute-logo"],[1,"preference-item"],[1,"inline-panel"],["role","button","tabindex","-1","aria-disabled","true",1,"section-toggle","disabled"],[3,"projectName"],[1,"error-icon"],[1,"error-text"],["mat-icon-button","","aria-label","Close error message",1,"error-close",3,"click"]],template:function(e,i){e&1&&(Ve(),_(0,Zt,6,1),o(1,"mat-sidenav-container",1)(2,"mat-sidenav",2),u("closed",function(){return i.close()}),o(3,"div",3)(4,"button",4),u("click",function(){return i.close()}),o(5,"mat-icon"),l(6,"chevron_left"),a()(),o(7,"img",5),u("click",function(s){return i.navigateToHome(),s.stopPropagation()})("keydown.enter",function(s){return i.navigateToHome(),s.preventDefault(),s.stopPropagation()})("keydown.space",function(s){return i.navigateToHome(),s.preventDefault(),s.stopPropagation()}),a(),o(8,"div",6)(9,"h2",7),l(10),a()()(),o(11,"div",8)(12,"a",9),u("click",function(s){return i.createNewThread(),s.preventDefault()}),o(13,"mat-icon",10),l(14,"play_circle"),a(),o(15,"span",11),l(16,"Start a new thread"),a()()(),_(17,Kt,6,0,"div",12),o(18,"div",13)(19,"div",14),_(20,en,8,1,"div",15)(21,tn,8,0,"div",16),o(22,"div",17)(23,"app-thread-selector",18),u("searchModeChange",function(s){return i.onThreadSearchModeChange(s)})("threadSelected",function(){return i.onThreadSelectedOnMobile()}),a()()()(),o(24,"div",19)(25,"div",20)(26,"a",21),u("click",function(s){return i.toggleSection("settings"),s.preventDefault()}),_(27,nn,2,0,"mat-icon",22)(28,rn,2,0,"mat-icon",23),o(29,"span",24),l(30,"Control Center"),a()(),_(31,xn,33,12,"div",25),a()()(),o(32,"mat-sidenav-content"),De(33),a()(),_(34,yn,8,1,"div",26)),e&2&&(g(!i.isOpen()&&!i.drawerOpen?0:-1),d(),x("sidenav-open",i.isOpen()),b("hasBackdrop",!1),d(),b("opened",i.isOpen())("disableClose",!0),d(5),ee("src","CODAY-Logo.png",J),d(3),y(i.selectedProjectName()),d(7),g(i.selectedProjectName()?17:-1),d(3),g(i.isThreadSearchActive?20:21),d(3),b("searchMode",i.isThreadSearchActive)("searchQuery",i.threadSearchQuery),d(),x("is-admin",i.isAdmin),d(),x("expanded",i.expandedSections.settings),d(),x("active",i.expandedSections.settings),d(),g(i.expandedSections.settings?27:28),d(4),g(i.expandedSections.settings?31:-1),d(),x("sidenav-closed-offset",!i.isOpen()),d(2),g(i.configErrorMessage?34:-1))},dependencies:[he,_e,ge,ue,tt,Ke,et,Ze,U,B,$,R,qe,it,ye,fe,Ce],styles:["[_nghost-%COMP%]{display:block;width:100%;height:100%;position:relative}.sidenav-container[_ngcontent-%COMP%]{position:fixed;top:0;left:0;right:0;height:100dvh;z-index:1400;transition:width;display:flex}.sidenav-container[_ngcontent-%COMP%] mat-sidenav[_ngcontent-%COMP%]{position:relative!important;transition:width;width:25%;min-width:320px;height:100dvh!important;flex-shrink:0}.sidenav-container[_ngcontent-%COMP%] mat-sidenav[_ngcontent-%COMP%]:not(.mat-drawer-opened){width:0!important;min-width:0;overflow:hidden!important;visibility:hidden!important}.sidenav-container[_ngcontent-%COMP%] mat-sidenav-content[_ngcontent-%COMP%]{width:100%;margin:0!important}@media(min-width:1024px){.sidenav-container[_ngcontent-%COMP%] mat-sidenav-content[_ngcontent-%COMP%]{min-width:0}}[_nghost-%COMP%] .mat-drawer-backdrop{pointer-events:auto}[_nghost-%COMP%] .mat-drawer-content{pointer-events:auto!important;background:transparent!important;overflow:visible!important}[_nghost-%COMP%] .mat-drawer-inner-container{overflow:hidden!important;height:100dvh!important;display:flex!important;flex-direction:column!important}.sidenav-new-thread-btn[_ngcontent-%COMP%], .sidenav-toggle-btn[_ngcontent-%COMP%]{position:fixed!important;z-index:1500!important;width:40px!important;height:40px!important;border-radius:50%!important;background:var(--glass-bg)!important;backdrop-filter:var(--glass-backdrop-blur)!important;-webkit-backdrop-filter:var(--glass-backdrop-blur)!important;border:1px solid var(--glass-border)!important;box-shadow:var(--glass-shadow)!important}.sidenav-toggle-btn[_ngcontent-%COMP%]{top:1rem!important;left:1rem!important}.sidenav-new-thread-btn[_ngcontent-%COMP%]{top:calc(1.5rem + 40px)!important;left:1rem!important}.sidenav-new-thread-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:var(--color-primary)!important}.sidenav-new-thread-btn[_ngcontent-%COMP%]:disabled{opacity:.5!important}.sidenav-logo-btn[_ngcontent-%COMP%]{position:fixed!important;bottom:1rem!important;left:1rem!important;z-index:1500!important;width:56px!important;height:56px!important;border-radius:50%!important;border:1px solid var(--glass-border)!important;padding:4px!important;background:var(--glass-bg)!important;backdrop-filter:var(--glass-backdrop-blur)!important;-webkit-backdrop-filter:var(--glass-backdrop-blur)!important;box-shadow:var(--glass-shadow)!important;transition:all .3s cubic-bezier(.4,0,.2,1)!important;cursor:pointer!important;pointer-events:auto!important;display:flex!important;align-items:center!important;justify-content:center!important;overflow:hidden!important;text-decoration:none!important}.sidenav-logo-btn[_ngcontent-%COMP%]:hover{transform:scale(1.08) translateY(-2px)!important;box-shadow:0 16px 48px #0003!important;border-color:var(--color-primary)!important}.sidenav-logo-btn[_ngcontent-%COMP%]:active{transform:scale(.96)!important}.sidenav-logo-btn[_ngcontent-%COMP%] .logo[_ngcontent-%COMP%]{width:48px;height:48px;border-radius:2px}.app-sidenav[_ngcontent-%COMP%]{width:480px;height:100dvh!important;min-height:0!important;position:relative;background:var(--glass-bg);backdrop-filter:var(--glass-backdrop-blur);-webkit-backdrop-filter:var(--glass-backdrop-blur);overflow:hidden!important;display:flex;flex-direction:column}.sidenav-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:1rem;padding:1.5rem 1rem .5rem;flex-shrink:0}.sidenav-header[_ngcontent-%COMP%] .sidenav-logo[_ngcontent-%COMP%]{width:40px;height:40px;border-radius:4px;flex-shrink:0;transition:all .2s ease}.sidenav-header[_ngcontent-%COMP%] .sidenav-logo.clickable[_ngcontent-%COMP%]{cursor:pointer}.sidenav-header[_ngcontent-%COMP%] .sidenav-logo.clickable[_ngcontent-%COMP%]:hover{transform:scale(1.1);filter:drop-shadow(0 4px 12px rgba(0,0,0,.15))}.sidenav-header[_ngcontent-%COMP%] .sidenav-logo.clickable[_ngcontent-%COMP%]:active{transform:scale(.95)}.sidenav-header[_ngcontent-%COMP%] .sidenav-logo.clickable[_ngcontent-%COMP%]:focus{outline:2px solid var(--color-primary);outline-offset:2px}.sidenav-header[_ngcontent-%COMP%] .header-title-section[_ngcontent-%COMP%]{flex:1;display:flex;align-items:center;min-width:0}.sidenav-header[_ngcontent-%COMP%] .header-title-section[_ngcontent-%COMP%] .sidenav-title[_ngcontent-%COMP%]{margin:0;font-size:1.25rem;font-weight:600;color:var(--color-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mission-control-section[_ngcontent-%COMP%]{padding:.25rem 1rem .5rem;flex-shrink:0}.mission-control-link[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.5rem;background:transparent;border:none;text-decoration:none;cursor:pointer;transition:all .2s ease;font-size:.875rem;font-weight:500;color:var(--color-text-secondary);padding:0}.mission-control-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;color:var(--color-text-secondary);transition:color .2s ease}.mission-control-link[_ngcontent-%COMP%]:hover{color:var(--color-primary);transform:translate(3px)}.mission-control-link[_ngcontent-%COMP%]:hover mat-icon[_ngcontent-%COMP%]{color:var(--color-primary)}.mission-control-link[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px;border-radius:4px}.new-thread-section[_ngcontent-%COMP%]{padding:1rem 1rem .5rem;flex-shrink:0}.new-thread-link[_ngcontent-%COMP%]{display:inline-flex;align-items:center;background:transparent;border:none;text-decoration:none;cursor:pointer;transition:all .2s ease;gap:.5rem;font-size:.95rem;font-weight:600;padding:0}.new-thread-link[_ngcontent-%COMP%] .new-thread-text[_ngcontent-%COMP%]{background:linear-gradient(90deg,var(--color-primary, #3b82f6) 0%,var(--color-accent, #8b5cf6) 50%,var(--color-primary, #3b82f6) 100%);background-size:200% auto;background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:transparent;animation:_ngcontent-%COMP%_gradientShift 3s ease-in-out infinite}.new-thread-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px;color:var(--color-primary);animation:_ngcontent-%COMP%_iconPulse 3s ease-in-out infinite}.new-thread-link[_ngcontent-%COMP%]:hover{transform:translate(4px)}.new-thread-link[_ngcontent-%COMP%]:hover mat-icon[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_iconPulse 1.5s ease-in-out infinite}.new-thread-link[_ngcontent-%COMP%]:focus{transform:scale(1.1)}@keyframes _ngcontent-%COMP%_gradientShift{0%{background-position:0% center}50%{background-position:100% center}to{background-position:0% center}}@keyframes _ngcontent-%COMP%_iconPulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(1.05)}}.sidenav-sections[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;min-height:100px;overflow:hidden}.sidenav-sections[_ngcontent-%COMP%] > .section-container[_ngcontent-%COMP%], .sidenav-sections[_ngcontent-%COMP%] > .section-container.expanded[_ngcontent-%COMP%], .sidenav-sections[_ngcontent-%COMP%] > .section-container[_ngcontent-%COMP%] > .section-content.threads[_ngcontent-%COMP%], .sidenav-sections[_ngcontent-%COMP%] > .section-container[_ngcontent-%COMP%] > .section-content.threads[_ngcontent-%COMP%] > app-thread-selector[_ngcontent-%COMP%]{display:flex!important;flex-direction:column!important;flex:1!important;min-height:0!important;overflow:hidden!important}.sidenav-nav[_ngcontent-%COMP%]{flex-shrink:0;display:flex;flex-direction:column;overflow:hidden;max-height:70%;border-top:1px solid var(--color-border)}.sidenav-nav[_ngcontent-%COMP%] > .settings-group[_ngcontent-%COMP%] > .section-toggle.active[_ngcontent-%COMP%]{border-top:none}.sidenav-nav[_ngcontent-%COMP%] .settings-group[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden}.sidenav-nav[_ngcontent-%COMP%] .settings-group[_ngcontent-%COMP%] > .section-toggle[_ngcontent-%COMP%]{flex-shrink:0}.sidenav-nav[_ngcontent-%COMP%] .settings-group[_ngcontent-%COMP%] > .section-content.settings-content[_ngcontent-%COMP%]{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden}.settings-group[_ngcontent-%COMP%] > .section-content.settings-content[_ngcontent-%COMP%]{padding:0;border-bottom:1px solid var(--color-border);overflow:visible}.settings-group[_ngcontent-%COMP%] > .section-content.settings-content[_ngcontent-%COMP%] .section-container.expanded[_ngcontent-%COMP%] .section-content[_ngcontent-%COMP%]{max-height:40vh;overflow-y:auto;overflow-x:hidden}.contribute-btn[_ngcontent-%COMP%] .contribute-logo[_ngcontent-%COMP%]{width:20px;height:20px;border-radius:2px;flex-shrink:0}.section-container[_ngcontent-%COMP%]{flex-shrink:0;display:flex;flex-direction:column}.section-container.expanded[_ngcontent-%COMP%] .section-content[_ngcontent-%COMP%]{border-bottom:none}.section-toggle[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.75rem;width:100%;padding:.5rem 1rem;height:50px;text-decoration:none;cursor:pointer;transition:all .2s ease;background:transparent;border:none;border-radius:0;color:var(--color-text);flex-shrink:0}.section-toggle.active[_ngcontent-%COMP%]{border-top:1px solid var(--color-border)}.section-toggle.disabled[_ngcontent-%COMP%]{opacity:.5;cursor:not-allowed;pointer-events:none}.section-toggle[_ngcontent-%COMP%] .arrow-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px;color:var(--color-text-secondary);transition:transform .2s ease;flex-shrink:0}.section-toggle[_ngcontent-%COMP%] .section-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px;color:var(--color-text-secondary);flex-shrink:0}.section-toggle[_ngcontent-%COMP%] .section-label[_ngcontent-%COMP%]{flex:1;font-size:.9rem;color:var(--color-text);text-align:left}.section-toggle[_ngcontent-%COMP%] .search-button[_ngcontent-%COMP%]{margin-left:auto;flex-shrink:0}.section-toggle[_ngcontent-%COMP%] .search-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.section-toggle[_ngcontent-%COMP%]:hover:not(.disabled){background:var(--color-bg-hover)}.section-toggle[_ngcontent-%COMP%]:active:not(.disabled){transform:scale(.98)}.section-toggle[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--color-primary);outline-offset:-2px}.search-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;padding:.5rem 1rem;height:50px;background:var(--color-bg-hover);border-top:1px solid var(--color-border);transition:all .2s ease}.search-header[_ngcontent-%COMP%] .search-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px;color:var(--color-text-secondary);flex-shrink:0}.search-header[_ngcontent-%COMP%] .search-input[_ngcontent-%COMP%]{flex:1;border:none;outline:none;background:transparent;color:var(--color-text);font-size:.9rem;padding:0;min-width:0}.search-header[_ngcontent-%COMP%] .search-input[_ngcontent-%COMP%]::placeholder{color:var(--color-text-muted)}.search-header[_ngcontent-%COMP%] .close-search-btn[_ngcontent-%COMP%]{flex-shrink:0}.search-header[_ngcontent-%COMP%] .close-search-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.section-content[_ngcontent-%COMP%]{padding:.5rem 0 0;animation:_ngcontent-%COMP%_slideDown .2s ease;border-bottom:1px solid var(--color-border);display:flex;flex-direction:column}.section-content.threads[_ngcontent-%COMP%]{padding:0;border-bottom:none;flex:1!important;min-height:0!important;overflow:hidden!important}.section-content.threads[_ngcontent-%COMP%] app-thread-selector[_ngcontent-%COMP%]{flex:1!important;min-height:0!important;overflow:hidden!important;display:flex!important;flex-direction:column!important}@keyframes _ngcontent-%COMP%_slideDown{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.preference-item[_ngcontent-%COMP%]{padding-bottom:1rem;margin-bottom:1rem;border-bottom:1px solid var(--color-border)}.preference-item[_ngcontent-%COMP%]:last-child{margin-bottom:0;padding-bottom:0;border-bottom:none}.preference-item[_ngcontent-%COMP%] .preference-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.75rem;margin-bottom:.75rem;padding:0 1rem}.preference-item[_ngcontent-%COMP%] .preference-header[_ngcontent-%COMP%] .item-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.preference-item[_ngcontent-%COMP%] .preference-header[_ngcontent-%COMP%] .item-text[_ngcontent-%COMP%]{font-size:.875rem;font-weight:500;color:var(--color-text)}.preference-item[_ngcontent-%COMP%] .preference-content[_ngcontent-%COMP%]{padding:0 1rem}.error-notification[_ngcontent-%COMP%]{position:fixed;top:5rem;left:50%;transform:translate(-50%);z-index:2000;display:flex;align-items:center;gap:.75rem;background:#ff3b3026;backdrop-filter:var(--glass-backdrop-blur);-webkit-backdrop-filter:var(--glass-backdrop-blur);border:1px solid rgba(255,59,48,.3);border-radius:16px;padding:1rem 1.5rem;box-shadow:var(--glass-shadow);animation:_ngcontent-%COMP%_errorSlideDown .3s cubic-bezier(.4,0,.2,1)}.error-notification[_ngcontent-%COMP%] .error-icon[_ngcontent-%COMP%]{font-size:1.2rem;flex-shrink:0;color:#c00}.error-notification[_ngcontent-%COMP%] .error-text[_ngcontent-%COMP%]{flex:1;color:#c00;font-size:.9rem;font-weight:500}@keyframes _ngcontent-%COMP%_errorSlideDown{0%{opacity:0;transform:translate(-50%,-10px)}to{opacity:1;transform:translate(-50%)}}@media(max-width:480px){.app-sidenav[_ngcontent-%COMP%]{width:320px}.sidenav-toggle-btn[_ngcontent-%COMP%]{top:.75rem!important;left:.75rem!important}.sidenav-new-thread-btn[_ngcontent-%COMP%]{top:calc(1.25rem + 40px)!important;left:.75rem!important}.error-notification[_ngcontent-%COMP%]{left:1rem;right:1rem;transform:none;max-width:calc(100vw - 2rem)}}body.dark[_nghost-%COMP%] .app-sidenav[_ngcontent-%COMP%], body.dark [_nghost-%COMP%] .app-sidenav[_ngcontent-%COMP%], [_ngcontent-%COMP%]:root[data-theme=dark] .app-sidenav[_ngcontent-%COMP%]{background:#242830f2;border-right-color:#b4c8ff17}body.dark[_nghost-%COMP%] .sidenav-header[_ngcontent-%COMP%], body.dark [_nghost-%COMP%] .sidenav-header[_ngcontent-%COMP%], [_ngcontent-%COMP%]:root[data-theme=dark] .sidenav-header[_ngcontent-%COMP%]{background:#242830b3}"]})};export{ct as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{m as l}from"./chunk-
|
|
1
|
+
import{m as l}from"./chunk-ZAMAK546.js";import{V as o,Z as s,a as n,ca as a,ta as i}from"./chunk-KJ5SIUGY.js";var u=class t{userController=a(l);currentUser=i(null);loadMe(){return this.userController.getMeUser().pipe(o(r=>this.currentUser.set(r)))}updateMe(r){let e=this.currentUser();if(!e)throw new Error("Cannot update: current user not loaded");if(!e.id)throw new Error("Cannot update: current user has no id");let c=n(n({},e),r);return this.userController.updateUser(e.id,c).pipe(o(d=>this.currentUser.set(d)))}static \u0275fac=function(e){return new(e||t)};static \u0275prov=s({token:t,factory:t.\u0275fac,providedIn:"root"})};export{u as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{b as y}from"./chunk-
|
|
1
|
+
import{b as y}from"./chunk-XPCRFTEI.js";import{c as k}from"./chunk-MZT6I3S3.js";import"./chunk-C2J4TQ7V.js";import"./chunk-MWPKXBXJ.js";import"./chunk-7EDSHFWH.js";import"./chunk-3ZLLFAXF.js";import"./chunk-Q2M4W42M.js";import"./chunk-DDWYQORF.js";import"./chunk-B46LXCLF.js";import{Bb as u,Db as h,Fb as _,Ka as d,Tb as o,Wa as p,ca as m,ga as s,ha as c,pb as l,qb as g,rb as f,sb as a,tb as i}from"./chunk-KJ5SIUGY.js";var b=(t,n)=>n.key;function M(t,n){if(t&1){let e=u();a(0,"agentos-action-card",6),h("nameClicked",function(){let v=s(e).$implicit,x=_();return c(x.navigateTo(v.path))}),i()}if(t&2){let e=n.$implicit;f("name",e.name)("mark",e.mark)("markIsEmoji",!0)("description",e.description)("clickable",!0)}}var C=class t{router=m(k);sections=[{key:"users",mark:"\u{1F464}",name:"Users & Groups",description:"Manage platform users, their admin rights, and namespace user groups.",path:"/agentos/admin/users"},{key:"agents",mark:"\u{1F916}",name:"Platform agents",description:"Manage agent configs shared across all namespaces.",path:"/agentos/admin/agent-configs"},{key:"integrations",mark:"\u{1F517}",name:"Platform integrations",description:"Manage integration configs shared across all namespaces.",path:"/agentos/admin/integration-configs"},{key:"ai-providers",mark:"\u{1F9E0}",name:"Platform AI providers",description:"Manage AI provider configs shared across all namespaces.",path:"/agentos/admin/ai-providers"},{key:"ai-models",mark:"\u2728",name:"Platform AI models",description:"Manage AI model configs shared across all namespaces.",path:"/agentos/admin/ai-models"},{key:"prompts",mark:"\u{1F4C4}",name:"Platform prompts",description:"Manage prompts shared across all namespaces.",path:"/agentos/admin/prompts"}];navigateTo(n){this.router.navigate([n])}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=p({type:t,selectors:[["agentos-admin-home"]],decls:9,vars:0,consts:[[1,"admin-home"],[1,"admin-home__header"],[1,"admin-home__title"],[1,"admin-home__subtitle"],[1,"admin-home__sections"],[3,"name","mark","markIsEmoji","description","clickable"],[3,"nameClicked","name","mark","markIsEmoji","description","clickable"]],template:function(e,r){e&1&&(a(0,"div",0)(1,"header",1)(2,"h1",2),o(3,"Administration"),i(),a(4,"p",3),o(5,"Platform-level settings, visible to super-admins only."),i()(),a(6,"nav",4),l(7,M,1,5,"agentos-action-card",5,b),i()()),e&2&&(d(7),g(r.sections))},dependencies:[y],styles:[".admin-home[_ngcontent-%COMP%]{max-width:860px;margin:0 auto;padding:2rem 1rem;display:flex;flex-direction:column;gap:2rem}.admin-home__header[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.375rem}.admin-home__title[_ngcontent-%COMP%]{margin:0;font-size:28px;font-weight:700;color:var(--color-text);font-family:var(--font-heading)}.admin-home__subtitle[_ngcontent-%COMP%]{margin:0;font-size:13px;color:var(--color-neutral-600)}.admin-home__sections[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}"],changeDetection:0})};export{C as AdminHomeComponent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Z as i,aa as d,ca as h,ta as c}from"./chunk-KJ5SIUGY.js";var p=["industry","terminal"],l=["light","dark","system"],r="agentos.theme.variant",a="agentos.theme.mode",y="agentos.theme",m=class n{_theme=c(this.readStoredTheme());theme=this._theme.asReadonly();media=typeof window<"u"&&window.matchMedia?window.matchMedia("(prefers-color-scheme: dark)"):null;onSystemChange=()=>{this._theme().mode==="system"&&this.applyTheme(this._theme())};constructor(){this.applyTheme(this._theme()),this.media?.addEventListener("change",this.onSystemChange)}ngOnDestroy(){this.media?.removeEventListener("change",this.onSystemChange)}setTheme(e){this._theme.set(e);try{localStorage.setItem(r,e.variant),localStorage.setItem(a,e.mode)}catch(t){}this.applyTheme(e)}applyTheme(e){if(typeof document>"u"||!document.documentElement)return;let t=e.mode==="system"?this.resolveSystem():e.mode,o=e.variant==="industry"&&t==="light"?null:`${e.variant}-${t}`;o?document.documentElement.setAttribute("data-theme",o):document.documentElement.removeAttribute("data-theme")}resolveSystem(){return this.media?.matches?"dark":"light"}readStoredTheme(){try{let e=localStorage.getItem(y);if(e&&!localStorage.getItem(a)){let s=l.includes(e)?e:"system";return localStorage.setItem(a,s),localStorage.setItem(r,"industry"),localStorage.removeItem(y),{variant:"industry",mode:s}}let t=localStorage.getItem(r),o=localStorage.getItem(a),T=p.includes(t??"")?t:"industry",g=l.includes(o??"")?o:"system";return{variant:T,mode:g}}catch(e){return{variant:"industry",mode:"system"}}}static \u0275fac=function(t){return new(t||n)};static \u0275prov=i({token:n,factory:n.\u0275fac,providedIn:"root"})},I=new d("agentos.theme-port",{providedIn:"root",factory:()=>h(m)});export{p as a,l as b,m as c,I as d};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as S}from"./chunk-
|
|
1
|
+
import{a as S}from"./chunk-5NIQZOIU.js";import{c as $,d as k}from"./chunk-ZAMAK546.js";import{c as B}from"./chunk-MZT6I3S3.js";import{s as E,z as D}from"./chunk-C2J4TQ7V.js";import"./chunk-MWPKXBXJ.js";import"./chunk-7EDSHFWH.js";import{a as f}from"./chunk-3ZLLFAXF.js";import"./chunk-Q2M4W42M.js";import"./chunk-DDWYQORF.js";import"./chunk-B46LXCLF.js";import{Bb as P,Db as l,Fb as d,Kc as q,Pb as I,S as y,Wa as C,ab as A,ca as n,cc as w,fc as R,ga as m,gc as x,ha as p,i as u,jc as T,lb as b,ma as g,mb as h,rb as c,sb as a,t as M,tb as _,u as v}from"./chunk-KJ5SIUGY.js";var N=()=>[];function V(r,t){if(r&1){let o=P();a(0,"agentos-ai-model-item",4),l("editRequested",function(e){m(o);let s=d(2);return p(s.onEdit(e))})("deleteRequested",function(e){m(o);let s=d(2);return p(s.deleteModel(e))}),_()}r&2&&c("model",t)}function F(r,t){if(r&1&&b(0,V,1,1,"agentos-ai-model-item",3),r&2){let o,i=t.$implicit,e=d();h((o=e.resolveModel(i.id))?0:-1,o)}}var L=class r{router=n(B);destroyRef=n(g);aiModelController=n($);aiProviderController=n(k);refresh$=new u(void 0);data$=this.refresh$.pipe(y(()=>v([this.aiModelController.listPlatformLevelAiModel(),this.aiProviderController.listAiProvider("none")])));modelItems$=this.data$.pipe(M(([t,o])=>{let i=new Map(o.map(e=>[e.id??"",e.name]));return t.map(e=>({id:e.id??"",name:e.alias??e.apiModelName,description:e.apiModelName,groupKey:e.aiProviderId,groupLabel:i.get(e.aiProviderId)??e.aiProviderId}))}));modelsById=new Map;constructor(){this.data$.pipe(f(this.destroyRef)).subscribe(([t])=>{this.modelsById=new Map(t.map(o=>[o.id??"",o]))})}goBack(){this.router.navigate(["/agentos","admin"])}openCreateForm(){this.router.navigate(["/agentos","admin","ai-models","new"])}deleteModel(t){this.aiModelController.deleteAiModel(t.id??"").pipe(f(this.destroyRef)).subscribe(()=>this.refresh$.next())}onEdit(t){t.id&&this.router.navigate(["/agentos","admin","ai-models",t.id,"edit"])}resolveModel(t){return this.modelsById.get(t)??null}static \u0275fac=function(o){return new(o||r)};static \u0275cmp=C({type:r,selectors:[["agentos-platform-ai-models"]],decls:5,vars:6,consts:[["aiModelItemTpl",""],["title","Platform AI Models","emptyMessage","No platform AI models defined yet. Add one above.","cardMinWidth","400px",3,"createRequested","items","showCreate","itemTemplate"],["toolbar-start","","icon","arrow_back","title","Back",3,"action"],[3,"model"],[3,"editRequested","deleteRequested","model"]],template:function(o,i){if(o&1&&(a(0,"ds-entity-list",1),R(1,"async"),l("createRequested",function(){return i.openCreateForm()}),a(2,"ds-icon-button",2),l("action",function(){return i.goBack()}),_()(),A(3,F,1,1,"ng-template",null,0,T)),o&2){let e=I(4);c("items",x(1,3,i.modelItems$)??w(5,N))("showCreate",!0)("itemTemplate",e)}},dependencies:[D,S,E,q],styles:[".platform-ai-models__back[_ngcontent-%COMP%]{background:none;border:none;cursor:pointer;font-family:inherit;font-size:.875rem;color:var(--color-text-secondary, #6e6e73);padding:.25rem .5rem;border-radius:4px;transition:color .15s ease}.platform-ai-models__back[_ngcontent-%COMP%]:hover{color:var(--color-primary, #007aff)}"],changeDetection:0})};export{L as PlatformAiModelsComponent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a}from"./chunk-JC3UT7FL.js";import"./chunk-TBYJS5N4.js";import"./chunk-ZAMAK546.js";import"./chunk-MZT6I3S3.js";import"./chunk-C2J4TQ7V.js";import"./chunk-MWPKXBXJ.js";import"./chunk-7EDSHFWH.js";import"./chunk-3ZLLFAXF.js";import"./chunk-Q2M4W42M.js";import"./chunk-DDWYQORF.js";import"./chunk-B46LXCLF.js";import"./chunk-KJ5SIUGY.js";export{a as UserGroupFormComponent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as a}from"./chunk-4NGK3AH3.js";import"./chunk-UBMWSFAZ.js";import"./chunk-TBYJS5N4.js";import"./chunk-NA5F32JD.js";import"./chunk-ZAMAK546.js";import"./chunk-MZT6I3S3.js";import"./chunk-C2J4TQ7V.js";import"./chunk-MWPKXBXJ.js";import"./chunk-7EDSHFWH.js";import"./chunk-3ZLLFAXF.js";import"./chunk-Q2M4W42M.js";import"./chunk-DDWYQORF.js";import"./chunk-B46LXCLF.js";import"./chunk-KJ5SIUGY.js";export{a as AdminUsersGroupsComponent};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as y}from"./chunk-F4DLZWDY.js";import{a as f}from"./chunk-
|
|
1
|
+
import{a as y}from"./chunk-F4DLZWDY.js";import{a as f}from"./chunk-DEI4EULW.js";import{d as m}from"./chunk-ZAMAK546.js";import{D as a,P as h,S as A,V as d,Z as b,a as P,ca as c,i as v,m as o,t as u,u as l}from"./chunk-KJ5SIUGY.js";var g="none",N="me",O=class p{nsController=c(m);userState=c(f);refresh$=new v(void 0);namespaceId$=new v(null);vm$=l([this.namespaceId$,this.refresh$]).pipe(A(([e])=>{let r=this.loadPlatformProviders().pipe(a(()=>o([])));return e?l([r,this.loadNamespaceProviders(e).pipe(a(()=>o([]))),this.loadUserProviders(e).pipe(a(()=>o([]))),this.loadUserProviders("global").pipe(a(()=>o([])))]).pipe(u(([i,n,s,t])=>({platform:i,namespace:n,userOnNs:s,userGlobal:t}))):l([r,this.loadNamespaceProviders("").pipe(a(()=>o([]))),this.loadUserProviders("global").pipe(a(()=>o([])))]).pipe(u(([i,n,s])=>({platform:i,namespace:n,userOnNs:[],userGlobal:s})))}),h({bufferSize:1,refCount:!0}));setNamespace(e){this.namespaceId$.value!==e&&this.namespaceId$.next(e)}refresh(){this.refresh$.next()}loadUserProviders(e){let r=e==="global"?g:e;return this.nsController.listAiProvider(r,N)}userGlobal$=y(this.refresh$,()=>this.loadUserProviders("global"),[]);loadPlatformProviders(){return this.nsController.listAiProvider(g)}loadNamespaceProviders(e){return e?this.nsController.listAiProvider(e):o([])}getById(e,r){return this.nsController.getByIdAiProvider(e)}create(e,r,i){let s=this.userState.currentUser()?.id;if((r==="userOnNs"||r==="userGlobal")&&!s)throw new Error(`Cannot create ${r} provider before UserStateService.loadMe() resolves \u2014 call loadMe() at app init`);if(r==="namespace"){if(i===void 0||i==="")throw new Error("Cannot create namespace-scoped provider without a namespaceId");let S={name:e.name,apiType:e.apiType,description:e.description,baseUrl:e.baseUrl,apiKey:e.apiKey,headers:e.headers??void 0,namespaceId:i??void 0};return this.nsController.createAiProvider(S).pipe(d(()=>this.refresh()))}if(r==="userOnNs"&&!i)throw new Error("Cannot create userOnNs provider without a namespaceId");let t={name:e.name,apiType:e.apiType,description:e.description,baseUrl:e.baseUrl,apiKey:e.apiKey,headers:e.headers??void 0,userId:s,namespaceId:r==="userOnNs"?i:void 0};return this.nsController.createAiProvider(t).pipe(d(()=>this.refresh()))}update(e,r,i,n){let s=r.apiKey===null?{}:{apiKey:r.apiKey},t=P({name:r.name,apiType:r.apiType,description:r.description,baseUrl:r.baseUrl,headers:r.headers??void 0,namespaceId:n.namespaceId,userId:n.userId},s);return this.nsController.updateAiProvider(e,t).pipe(d(()=>this.refresh()))}delete(e,r){return this.nsController.deleteAiProvider(e).pipe(d(()=>this.refresh()))}static \u0275fac=function(r){return new(r||p)};static \u0275prov=b({token:p,factory:p.\u0275fac,providedIn:"root"})};export{O as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{b as a}from"./chunk-
|
|
1
|
+
import{b as a}from"./chunk-4224C2BE.js";import"./chunk-XPCRFTEI.js";import"./chunk-ZAMAK546.js";import"./chunk-MZT6I3S3.js";import"./chunk-C2J4TQ7V.js";import"./chunk-MWPKXBXJ.js";import"./chunk-7EDSHFWH.js";import"./chunk-3ZLLFAXF.js";import"./chunk-Q2M4W42M.js";import"./chunk-DDWYQORF.js";import"./chunk-B46LXCLF.js";import"./chunk-KJ5SIUGY.js";export{a as NamespaceListComponent};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as ee}from"./chunk-MLVWHS7Q.js";import{b as R}from"./chunk-BCOH5IGB.js";import{a as G,c as J}from"./chunk-MZT6I3S3.js";import{a as P}from"./chunk-3ZLLFAXF.js";import{F as Z,c as $,e as _,g as L,h as B,i as N,l as u,n as q,r as I,s as j,t as U,u as H,v as K,w as Q,x as W,y as X,z as Y}from"./chunk-DDWYQORF.js";import{Bb as E,D as A,Db as C,Fb as s,Ka as a,Rb as O,Tb as o,Ub as x,Vb as F,Wa as D,a as V,b as T,ca as h,ga as v,ha as b,lb as c,m as k,ma as z,mb as f,nb as w,pb as M,qb as S,rb as m,sb as n,ta as y,tb as r,ub as g}from"./chunk-KJ5SIUGY.js";var re=(i,t)=>t.id;function oe(i,t){i&1&&(n(0,"p",5),o(1,"Loading\u2026"),r())}function ne(i,t){i&1&&(n(0,"span",12),o(1,"Name is required."),r())}function ie(i,t){if(i&1&&(n(0,"p",31),o(1),r(),n(2,"span",26),o(3,"Agent Config cannot be changed after creation."),r()),i&2){let e=s(3);a(),x(e.resolveAgentConfigName(e.agentConfigIdControl.value))}}function ae(i,t){if(i&1&&(n(0,"option",33),o(1),r()),i&2){let e=t.$implicit;m("ngValue",e.id),a(),x(e.name)}}function le(i,t){if(i&1&&(n(0,"select",32)(1,"option",33),o(2,"\u2014 None \u2014"),r(),M(3,ae,2,2,"option",33,re),r(),n(5,"span",26),o(6,"Optional. Links this prompt to an agent as a starter. Immutable after creation."),r()),i&2){let e=s(3);m("formControl",e.agentConfigIdControl),a(),m("ngValue",null),a(2),S(e.availableAgentConfigs())}}function me(i,t){if(i&1&&(n(0,"div",8)(1,"label",30),o(2,"Agent Config"),r(),c(3,ie,4,1)(4,le,7,2),r()),i&2){let e=s(2);a(3),f(e.isEditMode()&&e.agentConfigIdControl.value?3:e.isEditMode()?-1:4)}}function pe(i,t){i&1&&(n(0,"p",19),o(1,"No parameters defined."),r())}function de(i,t){i&1&&(n(0,"span",12),o(1,"Parameter name is required."),r())}function se(i,t){if(i&1){let e=E();n(0,"div",20)(1,"div",34)(2,"div",35)(3,"label",36),o(4,"Name "),n(5,"span",10),o(6,"*"),r()(),g(7,"input",37),c(8,de,2,0,"span",12),r(),n(9,"div",35)(10,"label",36),o(11,"Description"),r(),g(12,"input",38),r(),n(13,"div",35)(14,"label",36),o(15,"Default value"),r(),g(16,"input",39),r()(),n(17,"button",40),C("click",function(){let p=v(e).$index,d=s(2);return b(d.removeParameter(p))}),o(18," \xD7 "),r()()}if(i&2){let e=t.$implicit,l=t.$index;m("formGroupName",l),a(3),m("for","param-name-"+l),a(4),O("prompt-form__input--invalid",e.controls.name.invalid&&e.controls.name.touched),m("id","param-name-"+l),a(),f(e.controls.name.invalid&&e.controls.name.touched?8:-1),a(2),m("for","param-desc-"+l),a(2),m("id","param-desc-"+l),a(2),m("for","param-default-"+l),a(2),m("id","param-default-"+l)}}function ce(i,t){i&1&&(n(0,"span",12),o(1,"Content entry must not be blank."),r())}function fe(i,t){if(i&1){let e=E();n(0,"div",22)(1,"span",41),o(2),r(),n(3,"div",42),g(4,"textarea",43),c(5,ce,2,0,"span",12),r(),n(6,"button",44),C("click",function(){let p=v(e).$index,d=s(2);return b(d.removeContentEntry(p))}),o(7," \xD7 "),r()()}if(i&2){let e=t.$implicit,l=t.$index,p=s(2);a(2),x(l+1),a(2),O("prompt-form__textarea--invalid",e.invalid&&e.touched),m("formControlName",l),a(),f(e.invalid&&e.touched?5:-1),a(),m("disabled",p.contentArray.length===1)}}function _e(i,t){if(i&1&&(n(0,"p",23),o(1),r()),i&2){let e=s(2);a(),x(e.errorMessage())}}function ue(i,t){i&1&&(n(0,"span",12),o(1,"Invalid JSON."),r())}function ge(i,t){if(i&1){let e=E();n(0,"form",7),C("ngSubmit",function(){v(e);let p=s();return b(p.submit())}),n(1,"div",8)(2,"label",9),o(3,"Name "),n(4,"span",10),o(5,"*"),r()(),g(6,"input",11),c(7,ne,2,0,"span",12),r(),n(8,"div",8)(9,"label",13),o(10,"Description"),r(),g(11,"input",14),r(),c(12,me,5,1,"div",8),n(13,"fieldset",15)(14,"legend",16),o(15," Parameters "),n(16,"span",17),o(17,"Named placeholders used in content"),r()(),n(18,"p",18),o(19," Each parameter must have a name and a default value. Use "),n(20,"code"),o(21),r(),o(22," in content entries to reference them. "),r(),c(23,pe,2,0,"p",19),M(24,se,19,10,"div",20,w),n(26,"button",21),C("click",function(){v(e);let p=s();return b(p.addParameter())}),o(27,"+ Add parameter"),r()(),n(28,"fieldset",15)(29,"legend",16),o(30," Content "),n(31,"span",10),o(32,"*"),r(),n(33,"span",17),o(34,"Ordered list of text commands"),r()(),n(35,"p",18),o(36," Each content entry is a command. Use "),n(37,"code"),o(38,"@AgentName"),r(),o(39," to target an agent, "),n(40,"code"),o(41,"/promptName param1 param2"),r(),o(42," to call another prompt, and "),n(43,"code"),o(44),r(),o(45," for parameter placeholders. "),r(),M(46,fe,8,6,"div",22,w),n(48,"button",21),C("click",function(){v(e);let p=s();return b(p.addContentEntry())}),o(49,"+ Add content entry"),r()(),c(50,_e,2,1,"p",23),n(51,"div",8)(52,"label",24),o(53,"External Metadata"),r(),g(54,"textarea",25),c(55,ue,2,0,"span",12),n(56,"span",26),o(57,"Optional. Opaque JSON object stored as-is. Leave empty to clear."),r()(),n(58,"div",27)(59,"button",28),o(60),r(),n(61,"button",29),C("click",function(){v(e);let p=s();return b(p.cancel())}),o(62,"Cancel"),r()()()}if(i&2){let e=s();m("formGroup",e.form),a(6),O("prompt-form__input--invalid",e.nameControl.invalid&&e.nameControl.touched),m("formControl",e.nameControl),a(),f(e.nameControl.invalid&&e.nameControl.touched?7:-1),a(4),m("formControl",e.descriptionControl),a(),f(e.availableAgentConfigs().length>0?12:-1),a(),m("formArrayName","parameters"),a(8),x(e.paramPlaceholderSyntax),a(2),f(e.parametersArray.length===0?23:-1),a(),S(e.parametersArray.controls),a(4),m("formArrayName","content"),a(16),x(e.paramPlaceholderSyntax),a(2),S(e.contentArray.controls),a(4),f(e.errorMessage()?50:-1),a(4),m("formControl",e.externalMetadataJsonControl),a(),f(e.externalMetadataJsonControl.invalid&&e.externalMetadataJsonControl.touched?55:-1),a(4),m("disabled",e.form.invalid||e.isSubmitting()),a(),F(" ",e.isEditMode()?"Save changes":"Create"," ")}}var te=class i{route=h(G);router=h(J);destroyRef=h(z);promptState=h(ee);agentConfigController=h(R);namespaceId=this.route.snapshot.params.namespaceId;isPlatformMode=!this.namespaceId;form=new N({name:new u("",{nonNullable:!0,validators:[_.required,_.minLength(1)]}),description:new u(null),agentConfigId:new u(null),externalMetadataJson:new u("",{nonNullable:!0,validators:[Ce]}),content:new I([this.createContentControl()],{validators:[_.required]}),parameters:new I([])});get nameControl(){return this.form.controls.name}get descriptionControl(){return this.form.controls.description}get agentConfigIdControl(){return this.form.controls.agentConfigId}get externalMetadataJsonControl(){return this.form.controls.externalMetadataJson}get contentArray(){return this.form.controls.content}get parametersArray(){return this.form.controls.parameters}isEditMode=y(!1);isSubmitting=y(!1);isLoading=y(!1);errorMessage=y(null);paramPlaceholderSyntax="{{paramName}}";agentConfigs=y([]);availableAgentConfigs=this.agentConfigs.asReadonly();existingPrompt=null;ngOnInit(){let t=this.route.snapshot.paramMap.get("promptId");t&&(this.isEditMode.set(!0),this.loadPrompt(t)),this.isPlatformMode?this.loadPlatformAgentConfigs():this.namespaceId&&this.loadAgentConfigs(this.namespaceId)}loadPrompt(t){this.isLoading.set(!0),this.promptState.getById(t).pipe(P(this.destroyRef)).subscribe({next:e=>{this.existingPrompt=e,this.hydrateForm(e),this.isLoading.set(!1)},error:()=>{this.isLoading.set(!1),this.navigateBack()}})}loadAgentConfigs(t){this.agentConfigController.listByParentAgentConfig(t).pipe(P(this.destroyRef),A(()=>k([]))).subscribe(e=>this.agentConfigs.set(e))}loadPlatformAgentConfigs(){this.agentConfigController.listPlatformAgentsAgentConfig().pipe(P(this.destroyRef),A(()=>k([]))).subscribe(t=>this.agentConfigs.set(t))}hydrateForm(t){this.nameControl.setValue(t.name),this.descriptionControl.setValue(t.description??null),this.agentConfigIdControl.setValue(t.agentConfigId??null),this.contentArray.clear(),(t.content.length>0?t.content:[""]).forEach(l=>this.contentArray.push(this.createContentControl(l))),this.parametersArray.clear(),(t.parameters??[]).forEach(l=>this.parametersArray.push(this.createParameterGroup(l))),this.externalMetadataJsonControl.setValue(t.externalMetadata?JSON.stringify(t.externalMetadata,null,2):"")}resolveAgentConfigName(t){return this.agentConfigs().find(e=>e.id===t)?.name??t}createContentControl(t=""){return new u(t,{nonNullable:!0,validators:[_.required,_.pattern(/\S/)]})}addContentEntry(){this.contentArray.push(this.createContentControl())}removeContentEntry(t){this.contentArray.length>1&&this.contentArray.removeAt(t)}createParameterGroup(t){return new N({name:new u(t?.name??"",{nonNullable:!0,validators:[_.required,_.minLength(1)]}),description:new u(t?.description??null),defaultValue:new u(t?.defaultValue??"",{nonNullable:!0,validators:[_.required]})})}addParameter(){this.parametersArray.push(this.createParameterGroup())}removeParameter(t){this.parametersArray.removeAt(t)}submit(){if(this.form.invalid||this.isSubmitting())return;this.isSubmitting.set(!0);let t=this.isEditMode()&&!!this.existingPrompt?.id,e=T(V({},this.existingPrompt??{}),{namespaceId:this.namespaceId,name:this.nameControl.value.trim(),description:this.descriptionControl.value?.trim()||void 0,content:this.contentArray.controls.map(d=>d.value.trim()),parameters:this.parametersArray.controls.map(d=>({name:d.controls.name.value.trim(),description:d.controls.description.value?.trim()||void 0,defaultValue:d.controls.defaultValue.value.trim()}))});t||(e.agentConfigId=this.agentConfigIdControl.value||null);let l=this.externalMetadataJsonControl.value.trim();e.externalMetadata=l?JSON.parse(l):null;let p=t?this.promptState.update(this.existingPrompt.id,e):this.promptState.create(e);this.errorMessage.set(null),p.pipe(P(this.destroyRef)).subscribe({next:()=>this.navigateBack(),error:d=>{this.isSubmitting.set(!1),d.status===409?this.errorMessage.set(`A prompt named "${e.name}" already exists in this scope.`):d.status===400?this.errorMessage.set(d.error?.message??"Invalid prompt data."):this.errorMessage.set("An unexpected error occurred. Please try again.")}})}cancel(){this.navigateBack()}navigateBack(){this.isPlatformMode?this.router.navigate(["/agentos","admin","prompts"]):this.router.navigate(["/agentos",this.namespaceId,"prompts"])}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=D({type:i,selectors:[["agentos-prompt-form"]],decls:10,vars:3,consts:[[1,"prompt-form"],[1,"prompt-form__header"],["type","button","title","Back to prompts",1,"prompt-form__back",3,"click"],[1,"prompt-form__back-icon"],[1,"prompt-form__title"],[1,"prompt-form__loading"],[1,"prompt-form__form",3,"formGroup"],[1,"prompt-form__form",3,"ngSubmit","formGroup"],[1,"prompt-form__field"],["for","prompt-name",1,"prompt-form__label"],["aria-hidden","true"],["id","prompt-name","type","text","placeholder","e.g. Summarise meeting notes","autocomplete","off",1,"prompt-form__input",3,"formControl"],[1,"prompt-form__field-error"],["for","prompt-description",1,"prompt-form__label"],["id","prompt-description","type","text","placeholder","Optional \u2014 short description of this prompt","autocomplete","off",1,"prompt-form__input",3,"formControl"],[1,"prompt-form__section",3,"formArrayName"],[1,"prompt-form__label"],[1,"prompt-form__label-hint"],[1,"prompt-form__section-hint"],[1,"prompt-form__empty-hint"],[1,"prompt-form__param-row",3,"formGroupName"],["type","button",1,"prompt-form__add-btn",3,"click"],[1,"prompt-form__content-row"],[1,"prompt-form__error"],["for","prompt-external-metadata",1,"prompt-form__label"],["id","prompt-external-metadata","rows","6","placeholder",'{ "key": "value" }',"spellcheck","false","autocomplete","off",1,"prompt-form__textarea","prompt-form__textarea--code",3,"formControl"],[1,"prompt-form__field-hint"],[1,"prompt-form__actions"],["type","submit",1,"prompt-form__btn","prompt-form__btn--primary",3,"disabled"],["type","button",1,"prompt-form__btn",3,"click"],["for","prompt-agent-config",1,"prompt-form__label"],[1,"prompt-form__readonly-value"],["id","prompt-agent-config",1,"prompt-form__select",3,"formControl"],[3,"ngValue"],[1,"prompt-form__param-fields"],[1,"prompt-form__field","prompt-form__field--inline"],[1,"prompt-form__label",3,"for"],["type","text","placeholder","e.g. language","formControlName","name","autocomplete","off",1,"prompt-form__input",3,"id"],["type","text","placeholder","Optional","formControlName","description","autocomplete","off",1,"prompt-form__input",3,"id"],["type","text","placeholder","e.g. English","formControlName","defaultValue","autocomplete","off",1,"prompt-form__input",3,"id"],["type","button","title","Remove this parameter",1,"prompt-form__remove-btn",3,"click"],[1,"prompt-form__content-index"],[1,"prompt-form__content-field"],["rows","4","placeholder","Enter a command\u2026",1,"prompt-form__textarea",3,"formControlName"],["type","button","title","Remove this entry",1,"prompt-form__remove-btn",3,"click","disabled"]],template:function(e,l){e&1&&(n(0,"div",0)(1,"header",1)(2,"button",2),C("click",function(){return l.cancel()}),n(3,"span",3),o(4,"\u2190"),r(),o(5),r(),n(6,"h1",4),o(7),r()(),c(8,oe,2,0,"p",5)(9,ge,63,17,"form",6),r()),e&2&&(a(5),F(" ",l.isPlatformMode?"Platform prompts":"Prompts"," "),a(2),x(l.isEditMode()?"Edit prompt":"New prompt"),a(),f(l.isLoading()?8:9))},dependencies:[Z,q,X,Y,$,W,L,B,j,Q,K,U,H],styles:[".prompt-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2rem;max-width:560px;margin:0 auto;padding:2rem 1rem}.prompt-form__header[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.5rem}.prompt-form__back[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.375rem;background:none;border:none;padding:0;cursor:pointer;font-size:.875rem;color:var(--color-primary, #007aff);font-family:inherit}.prompt-form__back[_ngcontent-%COMP%]:hover{text-decoration:underline}.prompt-form__back-icon[_ngcontent-%COMP%]{font-size:1rem;line-height:1}.prompt-form__title[_ngcontent-%COMP%]{margin:0;font-size:1.5rem;font-weight:600;color:var(--color-text, #1d1d1f);letter-spacing:-.02em}.prompt-form__loading[_ngcontent-%COMP%]{color:var(--color-text-secondary, #6e6e73);font-size:.9rem;margin:0}.prompt-form__form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:1.25rem}.prompt-form__field[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.375rem}.prompt-form__field--inline[_ngcontent-%COMP%]{flex:1}.prompt-form__label[_ngcontent-%COMP%]{font-size:.875rem;font-weight:500;color:var(--color-text, #1d1d1f)}.prompt-form__label-hint[_ngcontent-%COMP%]{font-weight:400;color:var(--color-text-secondary, #6e6e73);margin-left:.375rem}.prompt-form__select[_ngcontent-%COMP%]{width:100%;padding:.625rem .875rem;border-radius:8px;border:1px solid var(--color-border, rgba(0, 0, 0, .1));background:transparent;color:var(--color-text, #1d1d1f);font-size:.9375rem;font-family:inherit;outline:none;box-sizing:border-box;cursor:pointer;appearance:auto;transition:border-color .15s ease}.prompt-form__select[_ngcontent-%COMP%]:focus{border-color:var(--color-primary, #007aff)}.prompt-form__field-hint[_ngcontent-%COMP%]{font-size:.8rem;color:var(--color-text-secondary, #6e6e73);line-height:1.4}.prompt-form__readonly-value[_ngcontent-%COMP%]{margin:0;padding:.5rem .875rem;border-radius:8px;background:var(--color-surface-hover, rgba(0, 0, 0, .03));border:1px solid var(--color-border, rgba(0, 0, 0, .1));color:var(--color-text, #1d1d1f);font-size:.9375rem;font-family:inherit}.prompt-form__input[_ngcontent-%COMP%], .prompt-form__textarea[_ngcontent-%COMP%]{width:100%;padding:.625rem .875rem;border-radius:8px;border:1px solid var(--color-border, rgba(0, 0, 0, .1));background:transparent;color:var(--color-text, #1d1d1f);font-size:.9375rem;font-family:inherit;outline:none;box-sizing:border-box;transition:border-color .15s ease}.prompt-form__input[_ngcontent-%COMP%]:focus, .prompt-form__textarea[_ngcontent-%COMP%]:focus{border-color:var(--color-primary, #007aff)}.prompt-form__input[_ngcontent-%COMP%]::placeholder, .prompt-form__textarea[_ngcontent-%COMP%]::placeholder{color:var(--color-text-secondary, #6e6e73)}.prompt-form__textarea[_ngcontent-%COMP%]{resize:vertical;min-height:100px;line-height:1.5}.prompt-form__textarea--code[_ngcontent-%COMP%]{font-family:monospace;font-size:.85rem;resize:vertical}.prompt-form__section[_ngcontent-%COMP%]{border:1px solid var(--color-border, rgba(0, 0, 0, .1));border-radius:8px;padding:1rem;margin:0;display:flex;flex-direction:column;gap:.75rem}.prompt-form__section-hint[_ngcontent-%COMP%]{margin:0;font-size:.8rem;color:var(--color-text-secondary, #6e6e73);line-height:1.4}.prompt-form__empty-hint[_ngcontent-%COMP%]{margin:0;font-size:.85rem;color:var(--color-text-secondary, #6e6e73);font-style:italic}.prompt-form__content-row[_ngcontent-%COMP%]{display:flex;gap:.5rem;align-items:flex-start}.prompt-form__content-field[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;gap:.25rem}.prompt-form__content-index[_ngcontent-%COMP%]{flex-shrink:0;width:1.5rem;padding-top:.6rem;font-size:.8rem;font-weight:600;color:var(--color-text-secondary, #6e6e73);text-align:right;-webkit-user-select:none;user-select:none}.prompt-form__param-row[_ngcontent-%COMP%]{display:flex;gap:.5rem;align-items:flex-end;padding:.75rem;border-radius:6px;background:var(--color-surface-hover, rgba(0, 0, 0, .03))}.prompt-form__param-fields[_ngcontent-%COMP%]{flex:1;display:flex;gap:.75rem;flex-wrap:wrap}.prompt-form__add-btn[_ngcontent-%COMP%]{align-self:flex-start;padding:.4rem .875rem;border-radius:6px;border:1px dashed var(--color-border, rgba(0, 0, 0, .15));background:transparent;color:var(--color-primary, #007aff);font-size:.875rem;font-family:inherit;cursor:pointer;transition:background .15s ease,border-color .15s ease}.prompt-form__add-btn[_ngcontent-%COMP%]:hover{background:var(--color-surface-hover, rgba(0, 0, 0, .04));border-color:var(--color-primary, #007aff)}.prompt-form__remove-btn[_ngcontent-%COMP%]{flex-shrink:0;width:1.75rem;height:1.75rem;display:flex;align-items:center;justify-content:center;border-radius:50%;border:1px solid var(--color-border, rgba(0, 0, 0, .1));background:transparent;color:var(--color-text-secondary, #6e6e73);font-size:1rem;line-height:1;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease}.prompt-form__remove-btn[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-error-light, rgba(255, 59, 48, .08));color:var(--color-error, #ff3b30);border-color:var(--color-error, #ff3b30)}.prompt-form__remove-btn[_ngcontent-%COMP%]:disabled{opacity:.3;cursor:not-allowed}.prompt-form__error[_ngcontent-%COMP%]{margin:0;padding:.625rem .875rem;border-radius:8px;background:var(--color-error-light, rgba(255, 59, 48, .08));border:1px solid var(--color-error, #ff3b30);color:var(--color-error, #ff3b30);font-size:.875rem;line-height:1.4}.prompt-form__field-error[_ngcontent-%COMP%]{font-size:.8rem;color:var(--color-error, #ff3b30);line-height:1.3}.prompt-form__input--invalid[_ngcontent-%COMP%], .prompt-form__textarea--invalid[_ngcontent-%COMP%]{border-color:var(--color-error, #ff3b30)}.prompt-form__input--invalid[_ngcontent-%COMP%]:focus, .prompt-form__textarea--invalid[_ngcontent-%COMP%]:focus{border-color:var(--color-error, #ff3b30)}.prompt-form__actions[_ngcontent-%COMP%]{display:flex;gap:.75rem;padding-top:.5rem}.prompt-form__btn[_ngcontent-%COMP%]{padding:.6rem 1.25rem;border-radius:8px;border:1px solid var(--color-border, rgba(0, 0, 0, .1));background:transparent;color:var(--color-text, #1d1d1f);font-size:.9375rem;font-family:inherit;cursor:pointer;transition:background .15s ease,border-color .15s ease}.prompt-form__btn[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-surface-hover, rgba(0, 0, 0, .04))}.prompt-form__btn[_ngcontent-%COMP%]:disabled{opacity:.45;cursor:not-allowed}.prompt-form__btn--primary[_ngcontent-%COMP%]{background:var(--color-primary, #007aff);border-color:var(--color-primary, #007aff);color:#fff}.prompt-form__btn--primary[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-primary-hover, #0051d5);border-color:var(--color-primary-hover, #0051d5)}"],changeDetection:0})};function Ce(i){let t=i.value?.trim();if(!t)return null;try{return JSON.parse(t),null}catch(e){return{invalidJson:!0}}}export{te as PromptFormComponent};
|
|
1
|
+
import{a as ee}from"./chunk-7N4XUYW4.js";import{b as R}from"./chunk-ZAMAK546.js";import{a as G,c as J}from"./chunk-MZT6I3S3.js";import{a as P}from"./chunk-3ZLLFAXF.js";import{F as Z,c as $,e as _,g as L,h as B,i as N,l as u,n as q,r as I,s as j,t as U,u as H,v as K,w as Q,x as W,y as X,z as Y}from"./chunk-DDWYQORF.js";import{Bb as E,D as A,Db as C,Fb as s,Ka as a,Rb as O,Tb as o,Ub as v,Vb as F,Wa as D,a as V,b as T,ca as b,ga as x,ha as h,lb as c,m as k,ma as z,mb as f,nb as w,pb as M,qb as S,rb as m,sb as n,ta as y,tb as r,ub as g}from"./chunk-KJ5SIUGY.js";var re=(i,t)=>t.id;function oe(i,t){i&1&&(n(0,"p",5),o(1,"Loading\u2026"),r())}function ne(i,t){i&1&&(n(0,"span",12),o(1,"Name is required."),r())}function ie(i,t){if(i&1&&(n(0,"p",31),o(1),r(),n(2,"span",26),o(3,"Agent Config cannot be changed after creation."),r()),i&2){let e=s(3);a(),v(e.resolveAgentConfigName(e.agentConfigIdControl.value))}}function ae(i,t){if(i&1&&(n(0,"option",33),o(1),r()),i&2){let e=t.$implicit;m("ngValue",e.id),a(),v(e.name)}}function le(i,t){if(i&1&&(n(0,"select",32)(1,"option",33),o(2,"\u2014 None \u2014"),r(),M(3,ae,2,2,"option",33,re),r(),n(5,"span",26),o(6,"Optional. Links this prompt to an agent as a starter. Immutable after creation."),r()),i&2){let e=s(3);m("formControl",e.agentConfigIdControl),a(),m("ngValue",null),a(2),S(e.availableAgentConfigs())}}function me(i,t){if(i&1&&(n(0,"div",8)(1,"label",30),o(2,"Agent Config"),r(),c(3,ie,4,1)(4,le,7,2),r()),i&2){let e=s(2);a(3),f(e.isEditMode()&&e.agentConfigIdControl.value?3:e.isEditMode()?-1:4)}}function pe(i,t){i&1&&(n(0,"p",19),o(1,"No parameters defined."),r())}function de(i,t){i&1&&(n(0,"span",12),o(1,"Parameter name is required."),r())}function se(i,t){if(i&1){let e=E();n(0,"div",20)(1,"div",34)(2,"div",35)(3,"label",36),o(4,"Name "),n(5,"span",10),o(6,"*"),r()(),g(7,"input",37),c(8,de,2,0,"span",12),r(),n(9,"div",35)(10,"label",36),o(11,"Description"),r(),g(12,"input",38),r(),n(13,"div",35)(14,"label",36),o(15,"Default value"),r(),g(16,"input",39),r()(),n(17,"button",40),C("click",function(){let p=x(e).$index,d=s(2);return h(d.removeParameter(p))}),o(18," \xD7 "),r()()}if(i&2){let e=t.$implicit,l=t.$index;m("formGroupName",l),a(3),m("for","param-name-"+l),a(4),O("prompt-form__input--invalid",e.controls.name.invalid&&e.controls.name.touched),m("id","param-name-"+l),a(),f(e.controls.name.invalid&&e.controls.name.touched?8:-1),a(2),m("for","param-desc-"+l),a(2),m("id","param-desc-"+l),a(2),m("for","param-default-"+l),a(2),m("id","param-default-"+l)}}function ce(i,t){i&1&&(n(0,"span",12),o(1,"Content entry must not be blank."),r())}function fe(i,t){if(i&1){let e=E();n(0,"div",22)(1,"span",41),o(2),r(),n(3,"div",42),g(4,"textarea",43),c(5,ce,2,0,"span",12),r(),n(6,"button",44),C("click",function(){let p=x(e).$index,d=s(2);return h(d.removeContentEntry(p))}),o(7," \xD7 "),r()()}if(i&2){let e=t.$implicit,l=t.$index,p=s(2);a(2),v(l+1),a(2),O("prompt-form__textarea--invalid",e.invalid&&e.touched),m("formControlName",l),a(),f(e.invalid&&e.touched?5:-1),a(),m("disabled",p.contentArray.length===1)}}function _e(i,t){if(i&1&&(n(0,"p",23),o(1),r()),i&2){let e=s(2);a(),v(e.errorMessage())}}function ue(i,t){i&1&&(n(0,"span",12),o(1,"Invalid JSON."),r())}function ge(i,t){if(i&1){let e=E();n(0,"form",7),C("ngSubmit",function(){x(e);let p=s();return h(p.submit())}),n(1,"div",8)(2,"label",9),o(3,"Name "),n(4,"span",10),o(5,"*"),r()(),g(6,"input",11),c(7,ne,2,0,"span",12),r(),n(8,"div",8)(9,"label",13),o(10,"Description"),r(),g(11,"input",14),r(),c(12,me,5,1,"div",8),n(13,"fieldset",15)(14,"legend",16),o(15," Parameters "),n(16,"span",17),o(17,"Named placeholders used in content"),r()(),n(18,"p",18),o(19," Each parameter must have a name and a default value. Use "),n(20,"code"),o(21),r(),o(22," in content entries to reference them. "),r(),c(23,pe,2,0,"p",19),M(24,se,19,10,"div",20,w),n(26,"button",21),C("click",function(){x(e);let p=s();return h(p.addParameter())}),o(27,"+ Add parameter"),r()(),n(28,"fieldset",15)(29,"legend",16),o(30," Content "),n(31,"span",10),o(32,"*"),r(),n(33,"span",17),o(34,"Ordered list of text commands"),r()(),n(35,"p",18),o(36," Each content entry is a command. Use "),n(37,"code"),o(38,"@AgentName"),r(),o(39," to target an agent, "),n(40,"code"),o(41,"/promptName param1 param2"),r(),o(42," to call another prompt, and "),n(43,"code"),o(44),r(),o(45," for parameter placeholders. "),r(),M(46,fe,8,6,"div",22,w),n(48,"button",21),C("click",function(){x(e);let p=s();return h(p.addContentEntry())}),o(49,"+ Add content entry"),r()(),c(50,_e,2,1,"p",23),n(51,"div",8)(52,"label",24),o(53,"External Metadata"),r(),g(54,"textarea",25),c(55,ue,2,0,"span",12),n(56,"span",26),o(57,"Optional. Opaque JSON object stored as-is. Leave empty to clear."),r()(),n(58,"div",27)(59,"button",28),o(60),r(),n(61,"button",29),C("click",function(){x(e);let p=s();return h(p.cancel())}),o(62,"Cancel"),r()()()}if(i&2){let e=s();m("formGroup",e.form),a(6),O("prompt-form__input--invalid",e.nameControl.invalid&&e.nameControl.touched),m("formControl",e.nameControl),a(),f(e.nameControl.invalid&&e.nameControl.touched?7:-1),a(4),m("formControl",e.descriptionControl),a(),f(e.availableAgentConfigs().length>0?12:-1),a(),m("formArrayName","parameters"),a(8),v(e.paramPlaceholderSyntax),a(2),f(e.parametersArray.length===0?23:-1),a(),S(e.parametersArray.controls),a(4),m("formArrayName","content"),a(16),v(e.paramPlaceholderSyntax),a(2),S(e.contentArray.controls),a(4),f(e.errorMessage()?50:-1),a(4),m("formControl",e.externalMetadataJsonControl),a(),f(e.externalMetadataJsonControl.invalid&&e.externalMetadataJsonControl.touched?55:-1),a(4),m("disabled",e.form.invalid||e.isSubmitting()),a(),F(" ",e.isEditMode()?"Save changes":"Create"," ")}}var te=class i{route=b(G);router=b(J);destroyRef=b(z);promptState=b(ee);agentConfigController=b(R);namespaceId=this.route.snapshot.params.namespaceId;isPlatformMode=!this.namespaceId;form=new N({name:new u("",{nonNullable:!0,validators:[_.required,_.minLength(1)]}),description:new u(null),agentConfigId:new u(null),externalMetadataJson:new u("",{nonNullable:!0,validators:[Ce]}),content:new I([this.createContentControl()],{validators:[_.required]}),parameters:new I([])});get nameControl(){return this.form.controls.name}get descriptionControl(){return this.form.controls.description}get agentConfigIdControl(){return this.form.controls.agentConfigId}get externalMetadataJsonControl(){return this.form.controls.externalMetadataJson}get contentArray(){return this.form.controls.content}get parametersArray(){return this.form.controls.parameters}isEditMode=y(!1);isSubmitting=y(!1);isLoading=y(!1);errorMessage=y(null);paramPlaceholderSyntax="{{paramName}}";agentConfigs=y([]);availableAgentConfigs=this.agentConfigs.asReadonly();existingPrompt=null;ngOnInit(){let t=this.route.snapshot.paramMap.get("promptId");t&&(this.isEditMode.set(!0),this.loadPrompt(t)),this.isPlatformMode?this.loadPlatformAgentConfigs():this.namespaceId&&this.loadAgentConfigs(this.namespaceId)}loadPrompt(t){this.isLoading.set(!0),this.promptState.getById(t).pipe(P(this.destroyRef)).subscribe({next:e=>{this.existingPrompt=e,this.hydrateForm(e),this.isLoading.set(!1)},error:()=>{this.isLoading.set(!1),this.navigateBack()}})}loadAgentConfigs(t){this.agentConfigController.listByParentAgentConfig(t).pipe(P(this.destroyRef),A(()=>k([]))).subscribe(e=>this.agentConfigs.set(e))}loadPlatformAgentConfigs(){this.agentConfigController.listPlatformAgentsAgentConfig().pipe(P(this.destroyRef),A(()=>k([]))).subscribe(t=>this.agentConfigs.set(t))}hydrateForm(t){this.nameControl.setValue(t.name),this.descriptionControl.setValue(t.description??null),this.agentConfigIdControl.setValue(t.agentConfigId??null),this.contentArray.clear(),(t.content.length>0?t.content:[""]).forEach(l=>this.contentArray.push(this.createContentControl(l))),this.parametersArray.clear(),(t.parameters??[]).forEach(l=>this.parametersArray.push(this.createParameterGroup(l))),this.externalMetadataJsonControl.setValue(t.externalMetadata?JSON.stringify(t.externalMetadata,null,2):"")}resolveAgentConfigName(t){return this.agentConfigs().find(e=>e.id===t)?.name??t}createContentControl(t=""){return new u(t,{nonNullable:!0,validators:[_.required,_.pattern(/\S/)]})}addContentEntry(){this.contentArray.push(this.createContentControl())}removeContentEntry(t){this.contentArray.length>1&&this.contentArray.removeAt(t)}createParameterGroup(t){return new N({name:new u(t?.name??"",{nonNullable:!0,validators:[_.required,_.minLength(1)]}),description:new u(t?.description??null),defaultValue:new u(t?.defaultValue??"",{nonNullable:!0,validators:[_.required]})})}addParameter(){this.parametersArray.push(this.createParameterGroup())}removeParameter(t){this.parametersArray.removeAt(t)}submit(){if(this.form.invalid||this.isSubmitting())return;this.isSubmitting.set(!0);let t=this.isEditMode()&&!!this.existingPrompt?.id,e=T(V({},this.existingPrompt??{}),{namespaceId:this.namespaceId,name:this.nameControl.value.trim(),description:this.descriptionControl.value?.trim()||void 0,content:this.contentArray.controls.map(d=>d.value.trim()),parameters:this.parametersArray.controls.map(d=>({name:d.controls.name.value.trim(),description:d.controls.description.value?.trim()||void 0,defaultValue:d.controls.defaultValue.value.trim()}))});t||(e.agentConfigId=this.agentConfigIdControl.value||null);let l=this.externalMetadataJsonControl.value.trim();e.externalMetadata=l?JSON.parse(l):null;let p=t?this.promptState.update(this.existingPrompt.id,e):this.promptState.create(e);this.errorMessage.set(null),p.pipe(P(this.destroyRef)).subscribe({next:()=>this.navigateBack(),error:d=>{this.isSubmitting.set(!1),d.status===409?this.errorMessage.set(`A prompt named "${e.name}" already exists in this scope.`):d.status===400?this.errorMessage.set(d.error?.message??"Invalid prompt data."):this.errorMessage.set("An unexpected error occurred. Please try again.")}})}cancel(){this.navigateBack()}navigateBack(){this.isPlatformMode?this.router.navigate(["/agentos","admin","prompts"]):this.router.navigate(["/agentos",this.namespaceId,"prompts"])}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=D({type:i,selectors:[["agentos-prompt-form"]],decls:10,vars:3,consts:[[1,"prompt-form"],[1,"prompt-form__header"],["type","button","title","Back to prompts",1,"prompt-form__back",3,"click"],[1,"prompt-form__back-icon"],[1,"prompt-form__title"],[1,"prompt-form__loading"],[1,"prompt-form__form",3,"formGroup"],[1,"prompt-form__form",3,"ngSubmit","formGroup"],[1,"prompt-form__field"],["for","prompt-name",1,"prompt-form__label"],["aria-hidden","true"],["id","prompt-name","type","text","placeholder","e.g. Summarise meeting notes","autocomplete","off",1,"prompt-form__input",3,"formControl"],[1,"prompt-form__field-error"],["for","prompt-description",1,"prompt-form__label"],["id","prompt-description","type","text","placeholder","Optional \u2014 short description of this prompt","autocomplete","off",1,"prompt-form__input",3,"formControl"],[1,"prompt-form__section",3,"formArrayName"],[1,"prompt-form__label"],[1,"prompt-form__label-hint"],[1,"prompt-form__section-hint"],[1,"prompt-form__empty-hint"],[1,"prompt-form__param-row",3,"formGroupName"],["type","button",1,"prompt-form__add-btn",3,"click"],[1,"prompt-form__content-row"],[1,"prompt-form__error"],["for","prompt-external-metadata",1,"prompt-form__label"],["id","prompt-external-metadata","rows","6","placeholder",'{ "key": "value" }',"spellcheck","false","autocomplete","off",1,"prompt-form__textarea","prompt-form__textarea--code",3,"formControl"],[1,"prompt-form__field-hint"],[1,"prompt-form__actions"],["type","submit",1,"prompt-form__btn","prompt-form__btn--primary",3,"disabled"],["type","button",1,"prompt-form__btn",3,"click"],["for","prompt-agent-config",1,"prompt-form__label"],[1,"prompt-form__readonly-value"],["id","prompt-agent-config",1,"prompt-form__select",3,"formControl"],[3,"ngValue"],[1,"prompt-form__param-fields"],[1,"prompt-form__field","prompt-form__field--inline"],[1,"prompt-form__label",3,"for"],["type","text","placeholder","e.g. language","formControlName","name","autocomplete","off",1,"prompt-form__input",3,"id"],["type","text","placeholder","Optional","formControlName","description","autocomplete","off",1,"prompt-form__input",3,"id"],["type","text","placeholder","e.g. English","formControlName","defaultValue","autocomplete","off",1,"prompt-form__input",3,"id"],["type","button","title","Remove this parameter",1,"prompt-form__remove-btn",3,"click"],[1,"prompt-form__content-index"],[1,"prompt-form__content-field"],["rows","4","placeholder","Enter a command\u2026",1,"prompt-form__textarea",3,"formControlName"],["type","button","title","Remove this entry",1,"prompt-form__remove-btn",3,"click","disabled"]],template:function(e,l){e&1&&(n(0,"div",0)(1,"header",1)(2,"button",2),C("click",function(){return l.cancel()}),n(3,"span",3),o(4,"\u2190"),r(),o(5),r(),n(6,"h1",4),o(7),r()(),c(8,oe,2,0,"p",5)(9,ge,63,17,"form",6),r()),e&2&&(a(5),F(" ",l.isPlatformMode?"Platform prompts":"Prompts"," "),a(2),v(l.isEditMode()?"Edit prompt":"New prompt"),a(),f(l.isLoading()?8:9))},dependencies:[Z,q,X,Y,$,W,L,B,j,Q,K,U,H],styles:[".prompt-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2rem;max-width:560px;margin:0 auto;padding:2rem 1rem}.prompt-form__header[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.5rem}.prompt-form__back[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.375rem;background:none;border:none;padding:0;cursor:pointer;font-size:.875rem;color:var(--color-accent)}.prompt-form__back[_ngcontent-%COMP%]:hover{text-decoration:underline}.prompt-form__back-icon[_ngcontent-%COMP%]{font-size:1rem;line-height:1}.prompt-form__title[_ngcontent-%COMP%]{margin:0;font-size:1.5rem;font-weight:700;color:var(--color-text);letter-spacing:-.02em}.prompt-form__loading[_ngcontent-%COMP%]{color:var(--color-text-secondary);font-size:.9rem;margin:0}.prompt-form__form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:1.25rem}.prompt-form__field[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.375rem}.prompt-form__field--inline[_ngcontent-%COMP%]{flex:1}.prompt-form__label[_ngcontent-%COMP%]{font-size:.875rem;font-weight:500;color:var(--color-text)}.prompt-form__label-hint[_ngcontent-%COMP%]{font-weight:400;color:var(--color-text-secondary);margin-left:.375rem}.prompt-form__select[_ngcontent-%COMP%]{width:100%;padding:.625rem .875rem;border-radius:0;border:1px solid var(--color-divider);background:var(--color-surface);color:var(--color-text);font-size:.9375rem;font-family:inherit;outline:none;box-sizing:border-box;cursor:pointer;appearance:auto;transition:border-color .15s ease}.prompt-form__select[_ngcontent-%COMP%]:focus{border-color:var(--color-accent)}.prompt-form__field-hint[_ngcontent-%COMP%]{font-size:.8rem;color:var(--color-text-secondary);line-height:1.4}.prompt-form__readonly-value[_ngcontent-%COMP%]{margin:0;padding:.5rem .875rem;border-radius:0;background:var(--color-bg-hover);border:1px solid var(--color-divider);color:var(--color-text);font-size:.9375rem}.prompt-form__input[_ngcontent-%COMP%], .prompt-form__textarea[_ngcontent-%COMP%]{width:100%;padding:.625rem .875rem;border-radius:0;border:1px solid var(--color-divider);background:var(--color-surface);color:var(--color-text);font-size:.9375rem;font-family:inherit;outline:none;box-sizing:border-box;transition:border-color .15s ease}.prompt-form__input[_ngcontent-%COMP%]:focus, .prompt-form__textarea[_ngcontent-%COMP%]:focus{border-color:var(--color-accent)}.prompt-form__input[_ngcontent-%COMP%]::placeholder, .prompt-form__textarea[_ngcontent-%COMP%]::placeholder{color:var(--color-neutral-500)}.prompt-form__textarea[_ngcontent-%COMP%]{resize:vertical;min-height:100px;line-height:1.5}.prompt-form__textarea--code[_ngcontent-%COMP%]{font-family:monospace;font-size:.85rem;resize:vertical}.prompt-form__section[_ngcontent-%COMP%]{border:1px solid var(--color-divider);border-radius:0;padding:1rem;margin:0;display:flex;flex-direction:column;gap:.75rem}.prompt-form__section-hint[_ngcontent-%COMP%]{margin:0;font-size:.8rem;color:var(--color-text-secondary);line-height:1.4}.prompt-form__empty-hint[_ngcontent-%COMP%]{margin:0;font-size:.85rem;color:var(--color-text-secondary);font-style:italic}.prompt-form__content-row[_ngcontent-%COMP%]{display:flex;gap:.5rem;align-items:flex-start}.prompt-form__content-field[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;gap:.25rem}.prompt-form__content-index[_ngcontent-%COMP%]{flex-shrink:0;width:1.5rem;padding-top:.6rem;font-size:.8rem;font-weight:600;color:var(--color-text-secondary);text-align:right;-webkit-user-select:none;user-select:none}.prompt-form__param-row[_ngcontent-%COMP%]{display:flex;gap:.5rem;align-items:flex-end;padding:.75rem;border-radius:0;background:var(--color-bg-hover)}.prompt-form__param-fields[_ngcontent-%COMP%]{flex:1;display:flex;gap:.75rem;flex-wrap:wrap}.prompt-form__add-btn[_ngcontent-%COMP%]{align-self:flex-start;padding:.4rem .875rem;border-radius:0;border:1px solid var(--color-divider);background:transparent;color:var(--color-accent);font-size:.875rem;font-family:inherit;cursor:pointer;transition:background .15s ease,border-color .15s ease}.prompt-form__add-btn[_ngcontent-%COMP%]:hover{background:var(--color-bg-hover);border-color:var(--color-accent)}.prompt-form__remove-btn[_ngcontent-%COMP%]{flex-shrink:0;width:1.75rem;height:1.75rem;display:flex;align-items:center;justify-content:center;border-radius:0;border:1px solid transparent;background:transparent;color:var(--color-neutral-500);font-size:1rem;line-height:1;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease}.prompt-form__remove-btn[_ngcontent-%COMP%]:hover:not(:disabled){background:color-mix(in srgb,var(--red) 10%,transparent);color:var(--red);border-color:var(--red)}.prompt-form__remove-btn[_ngcontent-%COMP%]:disabled{opacity:.3;cursor:not-allowed}.prompt-form__error[_ngcontent-%COMP%]{margin:0;padding:.625rem .875rem;border-radius:0;background:color-mix(in srgb,var(--red) 10%,transparent);border:1px solid var(--red);color:var(--red);font-size:.875rem;line-height:1.4}.prompt-form__field-error[_ngcontent-%COMP%]{font-size:.8rem;color:var(--red);line-height:1.3}.prompt-form__input--invalid[_ngcontent-%COMP%], .prompt-form__textarea--invalid[_ngcontent-%COMP%]{border-color:var(--red)}.prompt-form__input--invalid[_ngcontent-%COMP%]:focus, .prompt-form__textarea--invalid[_ngcontent-%COMP%]:focus{border-color:var(--red)}.prompt-form__actions[_ngcontent-%COMP%]{display:flex;gap:.75rem;padding-top:.5rem}.prompt-form__btn[_ngcontent-%COMP%]{padding:.6rem 1.25rem;border-radius:0;border:1px solid var(--color-divider);background:transparent;color:var(--color-text);font-size:13px;font-family:var(--font-heading);font-weight:600;cursor:pointer;transition:background .15s ease,border-color .15s ease}.prompt-form__btn[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-bg-hover);border-color:var(--color-neutral-500)}.prompt-form__btn[_ngcontent-%COMP%]:disabled{opacity:.45;cursor:not-allowed}.prompt-form__btn--primary[_ngcontent-%COMP%]{background:var(--color-accent);border-color:var(--color-accent);color:#fff}.prompt-form__btn--primary[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-accent-700);border-color:var(--color-accent-700)}"],changeDetection:0})};function Ce(i){let t=i.value?.trim();if(!t)return null;try{return JSON.parse(t),null}catch(e){return{invalidJson:!0}}}export{te as PromptFormComponent};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as oe}from"./chunk-CG7JPH7I.js";import{a as B,c as j}from"./chunk-MZT6I3S3.js";import{v as re}from"./chunk-N347WQAU.js";import{a as E}from"./chunk-3ZLLFAXF.js";import{F as te,c as q,e as F,g as H,h as X,i as J,l as K,n as W,v as Y,w as Z,y as Q,z as ee}from"./chunk-DDWYQORF.js";import{Ab as O,Bb as I,Db as f,Fb as d,Jc as $,Ka as l,Pb as A,Rb as w,Tb as s,Ub as h,Vb as k,Wa as R,a as U,ab as M,b as T,ca as C,dc as P,ga as b,ha as x,jb as L,jc as z,lb as u,m as N,ma as D,mb as g,pb as y,qb as S,rb as _,sb as a,ta as p,tb as i,ub as V}from"./chunk-KJ5SIUGY.js";function ne(r,t){let e=new Map;for(let o of r)if(o.userGroupId!==t)for(let n of o.agentIds)e.has(n)||e.set(n,o.name);return e}function ie(r,t){let e=new Set(r),o=new Set(t);return{toAdd:t.filter(n=>!e.has(n)),toRemove:r.filter(n=>!o.has(n))}}function v(r){return[r.firstname,r.lastname].filter(Boolean).join(" ").trim()||r.externalId}var de=20,G=class{constructor(t,e){this.candidates=t;this.excludedExternalIds=e}search(t){let e=t.toLowerCase(),o=this.excludedExternalIds(),n=this.candidates().filter(m=>!o.has(m.externalId)).filter(m=>this.matches(m,e)).slice(0,de).map(m=>({id:m.externalId,name:v(m),description:m.email}));return N(n)}matches(t,e){return t.externalId.toLowerCase().includes(e)||t.email.toLowerCase().includes(e)||v(t).toLowerCase().includes(e)}};var se=r=>({$implicit:r}),le=(r,t)=>t.id,ce=(r,t)=>t.externalId;function pe(r,t){r&1&&(a(0,"p",6),s(1,"Loading\u2026"),i())}function ue(r,t){r&1&&(a(0,"span",13),s(1,"Name is required."),i())}function ge(r,t){r&1&&(a(0,"p",18),s(1,"No agent configs available in this namespace."),i())}function _e(r,t){r&1&&O(0)}function fe(r,t){if(r&1&&M(0,_e,1,0,"ng-container",27),r&2){let e=t.$implicit;d(3);let o=A(11);_("ngTemplateOutlet",o)("ngTemplateOutletContext",P(2,se,e))}}function be(r,t){if(r&1&&(a(0,"div",19)(1,"span",26),s(2,"Platform"),i(),y(3,fe,1,4,"ng-container",null,le),i()),r&2){let e=d(2);l(3),S(e.platformAgents())}}function xe(r,t){r&1&&O(0)}function he(r,t){if(r&1&&M(0,xe,1,0,"ng-container",27),r&2){let e=t.$implicit;d(3);let o=A(11);_("ngTemplateOutlet",o)("ngTemplateOutletContext",P(2,se,e))}}function Ce(r,t){if(r&1&&(a(0,"div",19)(1,"span",26),s(2,"Namespace"),i(),y(3,he,1,4,"ng-container",null,le),i()),r&2){let e=d(2);l(3),S(e.namespaceAgents())}}function ve(r,t){r&1&&(a(0,"p",18),s(1,"No members yet."),i())}function Me(r,t){if(r&1&&(a(0,"span",31),s(1),i()),r&2){let e=d().$implicit;l(),h(e.email)}}function ye(r,t){if(r&1){let e=I();a(0,"li",28)(1,"div",29)(2,"span",30),s(3),i(),u(4,Me,2,1,"span",31),i(),a(5,"select",32),f("change",function(n){let m=b(e).$implicit,c=d(3);return x(c.setMemberRole(m.externalId,n.target.value))}),a(6,"option",33),s(7,"Member"),i(),a(8,"option",34),s(9,"Admin"),i()(),a(10,"button",35),f("click",function(){let n=b(e).$implicit,m=d(3);return x(m.removeMember(n.externalId))}),s(11," \xD7 "),i()()}if(r&2){let e=t.$implicit;l(3),h(e.label),l(),g(e.email&&e.email!==e.label?4:-1),l(),_("value",e.role),L("aria-label","Role of "+e.label),l(5),_("title","Remove "+e.label)}}function Se(r,t){if(r&1&&(a(0,"ul",20),y(1,ye,12,5,"li",28,ce),i()),r&2){let e=d(2);l(),S(e.selectedMembers())}}function Ie(r,t){if(r&1&&(a(0,"p",22),s(1),i()),r&2){let e=d(2);l(),h(e.errorMessage())}}function Ee(r,t){if(r&1){let e=I();a(0,"form",8),f("ngSubmit",function(){b(e);let n=d();return x(n.submit())}),a(1,"div",9)(2,"label",10),s(3,"Name "),a(4,"span",11),s(5,"*"),i()(),V(6,"input",12),u(7,ue,2,0,"span",13),i(),a(8,"fieldset",14)(9,"legend",15),s(10," Deployed agents "),a(11,"span",16),s(12,"Agents this group can use"),i()(),a(13,"p",17),s(14," Pick from platform agents and this namespace's agents. An agent already deployed to another group in this namespace is unavailable here. "),i(),u(15,ge,2,0,"p",18),u(16,be,5,0,"div",19),u(17,Ce,5,0,"div",19),i(),a(18,"fieldset",14)(19,"legend",15),s(20," Members "),a(21,"span",16),s(22,"Users in this group"),i()(),a(23,"p",17),s(24,"ADMIN members can manage this group; MEMBER is read-only."),i(),u(25,ve,2,0,"p",18)(26,Se,3,0,"ul",20),a(27,"ds-autocomplete-input",21),f("itemSelected",function(n){b(e);let m=d();return x(m.onMemberSelected(n))}),i()(),u(28,Ie,2,1,"p",22),a(29,"div",23)(30,"button",24),s(31),i(),a(32,"button",25),f("click",function(){b(e);let n=d();return x(n.cancel())}),s(33,"Cancel"),i()()()}if(r&2){let e=d();_("formGroup",e.form),l(6),w("user-group-form__input--invalid",e.nameControl.invalid&&e.nameControl.touched),l(),g(e.nameControl.invalid&&e.nameControl.touched?7:-1),l(8),g(e.platformAgents().length===0&&e.namespaceAgents().length===0?15:-1),l(),g(e.platformAgents().length>0?16:-1),l(),g(e.namespaceAgents().length>0?17:-1),l(8),g(e.selectedMembers().length===0?25:26),l(2),_("dataSource",e.memberDataSource),l(),g(e.errorMessage()?28:-1),l(2),_("disabled",e.nameControl.invalid||e.isSubmitting()),l(),k(" ",e.isEditMode()?"Save changes":"Create"," ")}}function Ge(r,t){if(r&1&&(a(0,"span",39),s(1),i()),r&2){let e=d().$implicit,o=d();l(),k("in ",o.agentOwnerGroup(e))}}function Oe(r,t){if(r&1){let e=I();a(0,"label",36)(1,"input",37),f("change",function(){let n=b(e).$implicit,m=d();return x(m.toggleAgent(n))}),i(),a(2,"span",38),s(3),i(),u(4,Ge,2,1,"span",39),i()}if(r&2){let e=t.$implicit,o=d();w("user-group-form__agent--disabled",o.isAgentDisabled(e)),l(),_("checked",o.isAgentSelected(e))("disabled",o.isAgentDisabled(e)),l(2),h(e.name),l(),g(o.isAgentDisabled(e)?4:-1)}}var Ae=250,ae=class r{route=C(B);router=C(j);destroyRef=C(D);userGroupState=C(oe);namespaceId=this.route.snapshot.params.namespaceId;userGroupId=this.route.snapshot.paramMap.get("userGroupId");returnTo=this.route.snapshot.queryParamMap.get("returnTo");isEditMode=p(!1);isLoading=p(!1);isSubmitting=p(!1);errorMessage=p(null);form=new J({name:new K("",{nonNullable:!0,validators:[F.required,F.maxLength(Ae)]})});get nameControl(){return this.form.controls.name}platformAgents=p([]);namespaceAgents=p([]);takenElsewhere=p(new Map);selectedAgentIds=p(new Set);candidateUsers=p([]);selectedMembers=p([]);originalMemberExternalIds=[];memberDataSource=new G(()=>this.candidateUsers(),()=>new Set(this.selectedMembers().map(t=>t.externalId)));ngOnInit(){this.isEditMode.set(!!this.userGroupId),this.loadFormData()}loadFormData(){this.isLoading.set(!0),this.userGroupState.loadFormData(this.namespaceId).pipe(E(this.destroyRef)).subscribe({next:({namespaceAgents:t,platformAgents:e,groups:o,users:n})=>{this.namespaceAgents.set(t),this.platformAgents.set(e),this.takenElsewhere.set(ne(o,this.userGroupId)),this.candidateUsers.set(n),this.userGroupId?this.loadExistingGroup(this.userGroupId):this.isLoading.set(!1)},error:t=>{console.error("[UserGroupForm] Failed to load form data",t),this.isLoading.set(!1),this.errorMessage.set("Failed to load form data. Please try again.")}})}loadExistingGroup(t){this.userGroupState.loadExistingGroup(t).pipe(E(this.destroyRef)).subscribe({next:({group:e,members:o})=>{this.nameControl.setValue(e.name),this.selectedAgentIds.set(new Set(e.agentIds)),this.originalMemberExternalIds=o.map(n=>n.externalId),this.selectedMembers.set(o.map(n=>({externalId:n.externalId,label:v(n),email:n.email,role:n.role}))),this.isLoading.set(!1)},error:e=>{console.error("[UserGroupForm] Failed to load user group for editing",e),this.isLoading.set(!1),this.navigateBack()}})}isAgentDisabled(t){return this.takenElsewhere().has(t.id??"")}agentOwnerGroup(t){return this.takenElsewhere().get(t.id??"")}isAgentSelected(t){return this.selectedAgentIds().has(t.id??"")}toggleAgent(t){let e=t.id;if(!e||this.isAgentDisabled(t))return;let o=new Set(this.selectedAgentIds());o.has(e)?o.delete(e):o.add(e),this.selectedAgentIds.set(o)}onMemberSelected(t){this.selectedMembers().some(e=>e.externalId===t.id)||this.selectedMembers.update(e=>[...e,{externalId:t.id,label:t.name,email:t.description,role:"MEMBER"}])}removeMember(t){this.selectedMembers.update(e=>e.filter(o=>o.externalId!==t))}setMemberRole(t,e){let o=e==="ADMIN"?"ADMIN":"MEMBER";this.selectedMembers.update(n=>n.map(m=>m.externalId===t?T(U({},m),{role:o}):m))}submit(){if(this.nameControl.invalid||this.isSubmitting())return;this.isSubmitting.set(!0),this.errorMessage.set(null);let t=this.nameControl.value.trim(),e=[...this.selectedAgentIds()],o=this.selectedMembers().map(c=>c.externalId),n=this.selectedMembers().filter(c=>c.role==="ADMIN").map(c=>c.externalId);(this.isEditMode()&&this.userGroupId?this.updateGroup(this.userGroupId,t,e,o,n):this.createGroup(t,e,o,n)).pipe(E(this.destroyRef)).subscribe({next:()=>this.navigateBack(),error:c=>{this.isSubmitting.set(!1),c.status===409?this.errorMessage.set(`A user group named "${t}" already exists in this namespace.`):c.status===400||c.status===422?this.errorMessage.set(c.error?.message??"Invalid user group data."):this.errorMessage.set("An unexpected error occurred. Please try again.")}})}createGroup(t,e,o,n){return this.userGroupState.create({namespaceId:this.namespaceId,name:t,agentIds:e,memberExternalIdsToAdd:o,adminExternalIds:n})}updateGroup(t,e,o,n,m){let{toAdd:c,toRemove:me}=ie(this.originalMemberExternalIds,n);return this.userGroupState.update(t,{name:e,agentIds:o,memberExternalIdsToAdd:c,memberExternalIdsToRemove:me,adminExternalIds:m})}cancel(){this.navigateBack()}navigateBack(){this.returnTo?this.router.navigateByUrl(this.returnTo):this.router.navigate(["/agentos",this.namespaceId,"user-groups"])}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=R({type:r,selectors:[["agentos-user-group-form"]],decls:12,vars:2,consts:[["agentRow",""],[1,"user-group-form"],[1,"user-group-form__header"],["type","button","title","Back to user groups",1,"user-group-form__back",3,"click"],[1,"user-group-form__back-icon"],[1,"user-group-form__title"],[1,"user-group-form__loading"],[1,"user-group-form__form",3,"formGroup"],[1,"user-group-form__form",3,"ngSubmit","formGroup"],[1,"user-group-form__field"],["for","user-group-name",1,"user-group-form__label"],["aria-hidden","true"],["id","user-group-name","type","text","placeholder","e.g. Support team","formControlName","name","autocomplete","off",1,"user-group-form__input"],[1,"user-group-form__field-error"],[1,"user-group-form__section"],[1,"user-group-form__label"],[1,"user-group-form__label-hint"],[1,"user-group-form__section-hint"],[1,"user-group-form__empty-hint"],[1,"user-group-form__agent-group"],[1,"user-group-form__members"],["placeholder","Add a member\u2026",3,"itemSelected","dataSource"],[1,"user-group-form__error"],[1,"user-group-form__actions"],["type","submit",1,"user-group-form__btn","user-group-form__btn--primary",3,"disabled"],["type","button",1,"user-group-form__btn",3,"click"],[1,"user-group-form__agent-group-title"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"user-group-form__member"],[1,"user-group-form__member-info"],[1,"user-group-form__member-name"],[1,"user-group-form__member-email"],[1,"user-group-form__member-role",3,"change","value"],["value","MEMBER"],["value","ADMIN"],["type","button",1,"user-group-form__member-remove",3,"click","title"],[1,"user-group-form__agent"],["type","checkbox",1,"user-group-form__agent-checkbox",3,"change","checked","disabled"],[1,"user-group-form__agent-name"],[1,"user-group-form__agent-note"]],template:function(e,o){e&1&&(a(0,"div",1)(1,"header",2)(2,"button",3),f("click",function(){return o.cancel()}),a(3,"span",4),s(4,"\u2190"),i(),s(5," User Groups "),i(),a(6,"h1",5),s(7),i()(),u(8,pe,2,0,"p",6)(9,Ee,34,12,"form",7),i(),M(10,Oe,5,6,"ng-template",null,0,z)),e&2&&(l(7),h(o.isEditMode()?"Edit user group":"New user group"),l(),g(o.isLoading()?8:9))},dependencies:[$,te,W,Q,ee,q,H,X,Z,Y,re],styles:[".user-group-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2rem;max-width:560px;margin:0 auto;padding:2rem 1rem}.user-group-form__header[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.5rem}.user-group-form__back[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.375rem;background:none;border:none;padding:0;cursor:pointer;font-size:.875rem;color:var(--color-primary, #007aff);font-family:inherit}.user-group-form__back[_ngcontent-%COMP%]:hover{text-decoration:underline}.user-group-form__back-icon[_ngcontent-%COMP%]{font-size:1rem;line-height:1}.user-group-form__title[_ngcontent-%COMP%]{margin:0;font-size:1.5rem;font-weight:600;color:var(--color-text, #1d1d1f);letter-spacing:-.02em}.user-group-form__loading[_ngcontent-%COMP%]{color:var(--color-text-secondary, #6e6e73);font-size:.9rem;margin:0}.user-group-form__form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:1.25rem}.user-group-form__field[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.375rem}.user-group-form__label[_ngcontent-%COMP%]{font-size:.875rem;font-weight:500;color:var(--color-text, #1d1d1f)}.user-group-form__label-hint[_ngcontent-%COMP%]{font-weight:400;color:var(--color-text-secondary, #6e6e73);margin-left:.375rem}.user-group-form__input[_ngcontent-%COMP%]{width:100%;padding:.625rem .875rem;border-radius:8px;border:1px solid var(--color-border, rgba(0, 0, 0, .1));background:transparent;color:var(--color-text, #1d1d1f);font-size:.9375rem;font-family:inherit;outline:none;box-sizing:border-box;transition:border-color .15s ease}.user-group-form__input[_ngcontent-%COMP%]:focus{border-color:var(--color-primary, #007aff)}.user-group-form__input[_ngcontent-%COMP%]::placeholder{color:var(--color-text-secondary, #6e6e73)}.user-group-form__input--invalid[_ngcontent-%COMP%]{border-color:var(--color-error, #ff3b30)}.user-group-form__input--invalid[_ngcontent-%COMP%]:focus{border-color:var(--color-error, #ff3b30)}.user-group-form__section[_ngcontent-%COMP%]{border:1px solid var(--color-border, rgba(0, 0, 0, .1));border-radius:8px;padding:1rem;margin:0;display:flex;flex-direction:column;gap:.75rem}.user-group-form__section-hint[_ngcontent-%COMP%]{margin:0;font-size:.8rem;color:var(--color-text-secondary, #6e6e73);line-height:1.4}.user-group-form__empty-hint[_ngcontent-%COMP%]{margin:0;font-size:.85rem;color:var(--color-text-secondary, #6e6e73);font-style:italic}.user-group-form__agent-group[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.25rem}.user-group-form__agent-group-title[_ngcontent-%COMP%]{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-secondary, #6e6e73);margin-bottom:.25rem}.user-group-form__agent[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;padding:.375rem .5rem;border-radius:6px;cursor:pointer;transition:background .15s ease}.user-group-form__agent[_ngcontent-%COMP%]:hover{background:var(--color-surface-hover, rgba(0, 0, 0, .03))}.user-group-form__agent--disabled[_ngcontent-%COMP%]{cursor:not-allowed;opacity:.55}.user-group-form__agent--disabled[_ngcontent-%COMP%]:hover{background:transparent}.user-group-form__agent-checkbox[_ngcontent-%COMP%]{flex-shrink:0;accent-color:var(--color-primary, #007aff)}.user-group-form__agent-name[_ngcontent-%COMP%]{font-size:.9rem;color:var(--color-text, #1d1d1f)}.user-group-form__agent-note[_ngcontent-%COMP%]{font-size:.75rem;color:var(--color-text-secondary, #6e6e73);font-style:italic}.user-group-form__members[_ngcontent-%COMP%]{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.375rem}.user-group-form__member[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.75rem;padding:.4rem .5rem;border-radius:8px;background:var(--color-surface-hover, rgba(0, 0, 0, .03));border:1px solid var(--color-border, rgba(0, 0, 0, .08))}.user-group-form__member-info[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;gap:.1rem;min-width:0}.user-group-form__member-name[_ngcontent-%COMP%]{font-size:.9rem;color:var(--color-text, #1d1d1f);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.user-group-form__member-email[_ngcontent-%COMP%]{font-size:.75rem;color:var(--color-text-secondary, #6e6e73);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.user-group-form__member-role[_ngcontent-%COMP%]{flex-shrink:0;padding:.3rem .5rem;border-radius:6px;border:1px solid var(--color-border, rgba(0, 0, 0, .1));background:transparent;color:var(--color-text, #1d1d1f);font-size:.8rem;font-family:inherit;cursor:pointer}.user-group-form__member-role[_ngcontent-%COMP%]:focus{outline:none;border-color:var(--color-primary, #007aff)}.user-group-form__member-remove[_ngcontent-%COMP%]{flex-shrink:0;width:1.5rem;height:1.5rem;display:flex;align-items:center;justify-content:center;border-radius:50%;border:none;background:transparent;color:var(--color-text-secondary, #6e6e73);font-size:1rem;line-height:1;cursor:pointer;transition:background .15s ease,color .15s ease}.user-group-form__member-remove[_ngcontent-%COMP%]:hover{background:var(--color-error-light, rgba(255, 59, 48, .12));color:var(--color-error, #ff3b30)}.user-group-form__error[_ngcontent-%COMP%]{margin:0;padding:.625rem .875rem;border-radius:8px;background:var(--color-error-light, rgba(255, 59, 48, .08));border:1px solid var(--color-error, #ff3b30);color:var(--color-error, #ff3b30);font-size:.875rem;line-height:1.4}.user-group-form__field-error[_ngcontent-%COMP%]{font-size:.8rem;color:var(--color-error, #ff3b30);line-height:1.3}.user-group-form__actions[_ngcontent-%COMP%]{display:flex;gap:.75rem;padding-top:.5rem}.user-group-form__btn[_ngcontent-%COMP%]{padding:.6rem 1.25rem;border-radius:8px;border:1px solid var(--color-border, rgba(0, 0, 0, .1));background:transparent;color:var(--color-text, #1d1d1f);font-size:.9375rem;font-family:inherit;cursor:pointer;transition:background .15s ease,border-color .15s ease}.user-group-form__btn[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-surface-hover, rgba(0, 0, 0, .04))}.user-group-form__btn[_ngcontent-%COMP%]:disabled{opacity:.45;cursor:not-allowed}.user-group-form__btn--primary[_ngcontent-%COMP%]{background:var(--color-primary, #007aff);border-color:var(--color-primary, #007aff);color:#fff}.user-group-form__btn--primary[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-primary-hover, #0051d5);border-color:var(--color-primary-hover, #0051d5)}"],changeDetection:0})};export{ae as a};
|
|
1
|
+
import{a as oe}from"./chunk-TBYJS5N4.js";import{a as B,c as j}from"./chunk-MZT6I3S3.js";import{w as re}from"./chunk-C2J4TQ7V.js";import{a as E}from"./chunk-3ZLLFAXF.js";import{F as te,c as q,e as F,g as H,h as X,i as J,l as K,n as W,v as Y,w as Z,y as Q,z as ee}from"./chunk-DDWYQORF.js";import{Ab as O,Bb as I,Db as f,Fb as d,Jc as $,Ka as l,Pb as A,Rb as w,Tb as s,Ub as h,Vb as k,Wa as R,a as U,ab as M,b as T,ca as C,dc as P,ga as b,ha as x,jb as L,jc as z,lb as u,m as N,ma as D,mb as g,pb as y,qb as S,rb as _,sb as a,ta as p,tb as i,ub as V}from"./chunk-KJ5SIUGY.js";function ne(r,t){let e=new Map;for(let o of r)if(o.userGroupId!==t)for(let n of o.agentIds)e.has(n)||e.set(n,o.name);return e}function ie(r,t){let e=new Set(r),o=new Set(t);return{toAdd:t.filter(n=>!e.has(n)),toRemove:r.filter(n=>!o.has(n))}}function v(r){return[r.firstname,r.lastname].filter(Boolean).join(" ").trim()||r.externalId}var de=20,G=class{constructor(t,e){this.candidates=t;this.excludedExternalIds=e}search(t){let e=t.toLowerCase(),o=this.excludedExternalIds(),n=this.candidates().filter(m=>!o.has(m.externalId)).filter(m=>this.matches(m,e)).slice(0,de).map(m=>({id:m.externalId,name:v(m),description:m.email}));return N(n)}matches(t,e){return t.externalId.toLowerCase().includes(e)||t.email.toLowerCase().includes(e)||v(t).toLowerCase().includes(e)}};var se=r=>({$implicit:r}),le=(r,t)=>t.id,ce=(r,t)=>t.externalId;function pe(r,t){r&1&&(a(0,"p",6),s(1,"Loading\u2026"),i())}function ue(r,t){r&1&&(a(0,"span",13),s(1,"Name is required."),i())}function ge(r,t){r&1&&(a(0,"p",18),s(1,"No agent configs available in this namespace."),i())}function _e(r,t){r&1&&O(0)}function fe(r,t){if(r&1&&M(0,_e,1,0,"ng-container",27),r&2){let e=t.$implicit;d(3);let o=A(11);_("ngTemplateOutlet",o)("ngTemplateOutletContext",P(2,se,e))}}function be(r,t){if(r&1&&(a(0,"div",19)(1,"span",26),s(2,"Platform"),i(),y(3,fe,1,4,"ng-container",null,le),i()),r&2){let e=d(2);l(3),S(e.platformAgents())}}function xe(r,t){r&1&&O(0)}function he(r,t){if(r&1&&M(0,xe,1,0,"ng-container",27),r&2){let e=t.$implicit;d(3);let o=A(11);_("ngTemplateOutlet",o)("ngTemplateOutletContext",P(2,se,e))}}function Ce(r,t){if(r&1&&(a(0,"div",19)(1,"span",26),s(2,"Namespace"),i(),y(3,he,1,4,"ng-container",null,le),i()),r&2){let e=d(2);l(3),S(e.namespaceAgents())}}function ve(r,t){r&1&&(a(0,"p",18),s(1,"No members yet."),i())}function Me(r,t){if(r&1&&(a(0,"span",31),s(1),i()),r&2){let e=d().$implicit;l(),h(e.email)}}function ye(r,t){if(r&1){let e=I();a(0,"li",28)(1,"div",29)(2,"span",30),s(3),i(),u(4,Me,2,1,"span",31),i(),a(5,"select",32),f("change",function(n){let m=b(e).$implicit,c=d(3);return x(c.setMemberRole(m.externalId,n.target.value))}),a(6,"option",33),s(7,"Member"),i(),a(8,"option",34),s(9,"Admin"),i()(),a(10,"button",35),f("click",function(){let n=b(e).$implicit,m=d(3);return x(m.removeMember(n.externalId))}),s(11," \xD7 "),i()()}if(r&2){let e=t.$implicit;l(3),h(e.label),l(),g(e.email&&e.email!==e.label?4:-1),l(),_("value",e.role),L("aria-label","Role of "+e.label),l(5),_("title","Remove "+e.label)}}function Se(r,t){if(r&1&&(a(0,"ul",20),y(1,ye,12,5,"li",28,ce),i()),r&2){let e=d(2);l(),S(e.selectedMembers())}}function Ie(r,t){if(r&1&&(a(0,"p",22),s(1),i()),r&2){let e=d(2);l(),h(e.errorMessage())}}function Ee(r,t){if(r&1){let e=I();a(0,"form",8),f("ngSubmit",function(){b(e);let n=d();return x(n.submit())}),a(1,"div",9)(2,"label",10),s(3,"Name "),a(4,"span",11),s(5,"*"),i()(),V(6,"input",12),u(7,ue,2,0,"span",13),i(),a(8,"fieldset",14)(9,"legend",15),s(10," Deployed agents "),a(11,"span",16),s(12,"Agents this group can use"),i()(),a(13,"p",17),s(14," Pick from platform agents and this namespace's agents. An agent already deployed to another group in this namespace is unavailable here. "),i(),u(15,ge,2,0,"p",18),u(16,be,5,0,"div",19),u(17,Ce,5,0,"div",19),i(),a(18,"fieldset",14)(19,"legend",15),s(20," Members "),a(21,"span",16),s(22,"Users in this group"),i()(),a(23,"p",17),s(24,"ADMIN members can manage this group; MEMBER is read-only."),i(),u(25,ve,2,0,"p",18)(26,Se,3,0,"ul",20),a(27,"ds-autocomplete-input",21),f("itemSelected",function(n){b(e);let m=d();return x(m.onMemberSelected(n))}),i()(),u(28,Ie,2,1,"p",22),a(29,"div",23)(30,"button",24),s(31),i(),a(32,"button",25),f("click",function(){b(e);let n=d();return x(n.cancel())}),s(33,"Cancel"),i()()()}if(r&2){let e=d();_("formGroup",e.form),l(6),w("user-group-form__input--invalid",e.nameControl.invalid&&e.nameControl.touched),l(),g(e.nameControl.invalid&&e.nameControl.touched?7:-1),l(8),g(e.platformAgents().length===0&&e.namespaceAgents().length===0?15:-1),l(),g(e.platformAgents().length>0?16:-1),l(),g(e.namespaceAgents().length>0?17:-1),l(8),g(e.selectedMembers().length===0?25:26),l(2),_("dataSource",e.memberDataSource),l(),g(e.errorMessage()?28:-1),l(2),_("disabled",e.nameControl.invalid||e.isSubmitting()),l(),k(" ",e.isEditMode()?"Save changes":"Create"," ")}}function Ge(r,t){if(r&1&&(a(0,"span",39),s(1),i()),r&2){let e=d().$implicit,o=d();l(),k("in ",o.agentOwnerGroup(e))}}function Oe(r,t){if(r&1){let e=I();a(0,"label",36)(1,"input",37),f("change",function(){let n=b(e).$implicit,m=d();return x(m.toggleAgent(n))}),i(),a(2,"span",38),s(3),i(),u(4,Ge,2,1,"span",39),i()}if(r&2){let e=t.$implicit,o=d();w("user-group-form__agent--disabled",o.isAgentDisabled(e)),l(),_("checked",o.isAgentSelected(e))("disabled",o.isAgentDisabled(e)),l(2),h(e.name),l(),g(o.isAgentDisabled(e)?4:-1)}}var Ae=250,ae=class r{route=C(B);router=C(j);destroyRef=C(D);userGroupState=C(oe);namespaceId=this.route.snapshot.params.namespaceId;userGroupId=this.route.snapshot.paramMap.get("userGroupId");returnTo=this.route.snapshot.queryParamMap.get("returnTo");isEditMode=p(!1);isLoading=p(!1);isSubmitting=p(!1);errorMessage=p(null);form=new J({name:new K("",{nonNullable:!0,validators:[F.required,F.maxLength(Ae)]})});get nameControl(){return this.form.controls.name}platformAgents=p([]);namespaceAgents=p([]);takenElsewhere=p(new Map);selectedAgentIds=p(new Set);candidateUsers=p([]);selectedMembers=p([]);originalMemberExternalIds=[];memberDataSource=new G(()=>this.candidateUsers(),()=>new Set(this.selectedMembers().map(t=>t.externalId)));ngOnInit(){this.isEditMode.set(!!this.userGroupId),this.loadFormData()}loadFormData(){this.isLoading.set(!0),this.userGroupState.loadFormData(this.namespaceId).pipe(E(this.destroyRef)).subscribe({next:({namespaceAgents:t,platformAgents:e,groups:o,users:n})=>{this.namespaceAgents.set(t),this.platformAgents.set(e),this.takenElsewhere.set(ne(o,this.userGroupId)),this.candidateUsers.set(n),this.userGroupId?this.loadExistingGroup(this.userGroupId):this.isLoading.set(!1)},error:t=>{console.error("[UserGroupForm] Failed to load form data",t),this.isLoading.set(!1),this.errorMessage.set("Failed to load form data. Please try again.")}})}loadExistingGroup(t){this.userGroupState.loadExistingGroup(t).pipe(E(this.destroyRef)).subscribe({next:({group:e,members:o})=>{this.nameControl.setValue(e.name),this.selectedAgentIds.set(new Set(e.agentIds)),this.originalMemberExternalIds=o.map(n=>n.externalId),this.selectedMembers.set(o.map(n=>({externalId:n.externalId,label:v(n),email:n.email,role:n.role}))),this.isLoading.set(!1)},error:e=>{console.error("[UserGroupForm] Failed to load user group for editing",e),this.isLoading.set(!1),this.navigateBack()}})}isAgentDisabled(t){return this.takenElsewhere().has(t.id??"")}agentOwnerGroup(t){return this.takenElsewhere().get(t.id??"")}isAgentSelected(t){return this.selectedAgentIds().has(t.id??"")}toggleAgent(t){let e=t.id;if(!e||this.isAgentDisabled(t))return;let o=new Set(this.selectedAgentIds());o.has(e)?o.delete(e):o.add(e),this.selectedAgentIds.set(o)}onMemberSelected(t){this.selectedMembers().some(e=>e.externalId===t.id)||this.selectedMembers.update(e=>[...e,{externalId:t.id,label:t.name,email:t.description,role:"MEMBER"}])}removeMember(t){this.selectedMembers.update(e=>e.filter(o=>o.externalId!==t))}setMemberRole(t,e){let o=e==="ADMIN"?"ADMIN":"MEMBER";this.selectedMembers.update(n=>n.map(m=>m.externalId===t?T(U({},m),{role:o}):m))}submit(){if(this.nameControl.invalid||this.isSubmitting())return;this.isSubmitting.set(!0),this.errorMessage.set(null);let t=this.nameControl.value.trim(),e=[...this.selectedAgentIds()],o=this.selectedMembers().map(c=>c.externalId),n=this.selectedMembers().filter(c=>c.role==="ADMIN").map(c=>c.externalId);(this.isEditMode()&&this.userGroupId?this.updateGroup(this.userGroupId,t,e,o,n):this.createGroup(t,e,o,n)).pipe(E(this.destroyRef)).subscribe({next:()=>this.navigateBack(),error:c=>{this.isSubmitting.set(!1),c.status===409?this.errorMessage.set(`A user group named "${t}" already exists in this namespace.`):c.status===400||c.status===422?this.errorMessage.set(c.error?.message??"Invalid user group data."):this.errorMessage.set("An unexpected error occurred. Please try again.")}})}createGroup(t,e,o,n){return this.userGroupState.create({namespaceId:this.namespaceId,name:t,agentIds:e,memberExternalIdsToAdd:o,adminExternalIds:n})}updateGroup(t,e,o,n,m){let{toAdd:c,toRemove:me}=ie(this.originalMemberExternalIds,n);return this.userGroupState.update(t,{name:e,agentIds:o,memberExternalIdsToAdd:c,memberExternalIdsToRemove:me,adminExternalIds:m})}cancel(){this.navigateBack()}navigateBack(){this.returnTo?this.router.navigateByUrl(this.returnTo):this.router.navigate(["/agentos",this.namespaceId,"user-groups"])}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=R({type:r,selectors:[["agentos-user-group-form"]],decls:12,vars:2,consts:[["agentRow",""],[1,"user-group-form"],[1,"user-group-form__header"],["type","button","title","Back to user groups",1,"user-group-form__back",3,"click"],[1,"user-group-form__back-icon"],[1,"user-group-form__title"],[1,"user-group-form__loading"],[1,"user-group-form__form",3,"formGroup"],[1,"user-group-form__form",3,"ngSubmit","formGroup"],[1,"user-group-form__field"],["for","user-group-name",1,"user-group-form__label"],["aria-hidden","true"],["id","user-group-name","type","text","placeholder","e.g. Support team","formControlName","name","autocomplete","off",1,"user-group-form__input"],[1,"user-group-form__field-error"],[1,"user-group-form__section"],[1,"user-group-form__label"],[1,"user-group-form__label-hint"],[1,"user-group-form__section-hint"],[1,"user-group-form__empty-hint"],[1,"user-group-form__agent-group"],[1,"user-group-form__members"],["placeholder","Add a member\u2026",3,"itemSelected","dataSource"],[1,"user-group-form__error"],[1,"user-group-form__actions"],["type","submit",1,"user-group-form__btn","user-group-form__btn--primary",3,"disabled"],["type","button",1,"user-group-form__btn",3,"click"],[1,"user-group-form__agent-group-title"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"user-group-form__member"],[1,"user-group-form__member-info"],[1,"user-group-form__member-name"],[1,"user-group-form__member-email"],[1,"user-group-form__member-role",3,"change","value"],["value","MEMBER"],["value","ADMIN"],["type","button",1,"user-group-form__member-remove",3,"click","title"],[1,"user-group-form__agent"],["type","checkbox",1,"user-group-form__agent-checkbox",3,"change","checked","disabled"],[1,"user-group-form__agent-name"],[1,"user-group-form__agent-note"]],template:function(e,o){e&1&&(a(0,"div",1)(1,"header",2)(2,"button",3),f("click",function(){return o.cancel()}),a(3,"span",4),s(4,"\u2190"),i(),s(5," User Groups "),i(),a(6,"h1",5),s(7),i()(),u(8,pe,2,0,"p",6)(9,Ee,34,12,"form",7),i(),M(10,Oe,5,6,"ng-template",null,0,z)),e&2&&(l(7),h(o.isEditMode()?"Edit user group":"New user group"),l(),g(o.isLoading()?8:9))},dependencies:[$,te,W,Q,ee,q,H,X,Z,Y,re],styles:[".user-group-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2rem;max-width:560px;margin:0 auto;padding:2rem 1rem}.user-group-form__header[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.5rem}.user-group-form__back[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.375rem;background:none;border:none;padding:0;cursor:pointer;font-size:.875rem;color:var(--color-primary, #007aff);font-family:inherit}.user-group-form__back[_ngcontent-%COMP%]:hover{text-decoration:underline}.user-group-form__back-icon[_ngcontent-%COMP%]{font-size:1rem;line-height:1}.user-group-form__title[_ngcontent-%COMP%]{margin:0;font-size:1.5rem;font-weight:600;color:var(--color-text, #1d1d1f);letter-spacing:-.02em}.user-group-form__loading[_ngcontent-%COMP%]{color:var(--color-text-secondary, #6e6e73);font-size:.9rem;margin:0}.user-group-form__form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:1.25rem}.user-group-form__field[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.375rem}.user-group-form__label[_ngcontent-%COMP%]{font-size:.875rem;font-weight:500;color:var(--color-text, #1d1d1f)}.user-group-form__label-hint[_ngcontent-%COMP%]{font-weight:400;color:var(--color-text-secondary, #6e6e73);margin-left:.375rem}.user-group-form__input[_ngcontent-%COMP%]{width:100%;padding:.625rem .875rem;border-radius:8px;border:1px solid var(--color-border, rgba(0, 0, 0, .1));background:transparent;color:var(--color-text, #1d1d1f);font-size:.9375rem;font-family:inherit;outline:none;box-sizing:border-box;transition:border-color .15s ease}.user-group-form__input[_ngcontent-%COMP%]:focus{border-color:var(--color-primary, #007aff)}.user-group-form__input[_ngcontent-%COMP%]::placeholder{color:var(--color-text-secondary, #6e6e73)}.user-group-form__input--invalid[_ngcontent-%COMP%]{border-color:var(--color-error, #ff3b30)}.user-group-form__input--invalid[_ngcontent-%COMP%]:focus{border-color:var(--color-error, #ff3b30)}.user-group-form__section[_ngcontent-%COMP%]{border:1px solid var(--color-border, rgba(0, 0, 0, .1));border-radius:8px;padding:1rem;margin:0;display:flex;flex-direction:column;gap:.75rem}.user-group-form__section-hint[_ngcontent-%COMP%]{margin:0;font-size:.8rem;color:var(--color-text-secondary, #6e6e73);line-height:1.4}.user-group-form__empty-hint[_ngcontent-%COMP%]{margin:0;font-size:.85rem;color:var(--color-text-secondary, #6e6e73);font-style:italic}.user-group-form__agent-group[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.25rem}.user-group-form__agent-group-title[_ngcontent-%COMP%]{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--color-text-secondary, #6e6e73);margin-bottom:.25rem}.user-group-form__agent[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;padding:.375rem .5rem;border-radius:6px;cursor:pointer;transition:background .15s ease}.user-group-form__agent[_ngcontent-%COMP%]:hover{background:var(--color-surface-hover, rgba(0, 0, 0, .03))}.user-group-form__agent--disabled[_ngcontent-%COMP%]{cursor:not-allowed;opacity:.55}.user-group-form__agent--disabled[_ngcontent-%COMP%]:hover{background:transparent}.user-group-form__agent-checkbox[_ngcontent-%COMP%]{flex-shrink:0;accent-color:var(--color-primary, #007aff)}.user-group-form__agent-name[_ngcontent-%COMP%]{font-size:.9rem;color:var(--color-text, #1d1d1f)}.user-group-form__agent-note[_ngcontent-%COMP%]{font-size:.75rem;color:var(--color-text-secondary, #6e6e73);font-style:italic}.user-group-form__members[_ngcontent-%COMP%]{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.375rem}.user-group-form__member[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.75rem;padding:.4rem .5rem;border-radius:8px;background:var(--color-surface-hover, rgba(0, 0, 0, .03));border:1px solid var(--color-border, rgba(0, 0, 0, .08))}.user-group-form__member-info[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;gap:.1rem;min-width:0}.user-group-form__member-name[_ngcontent-%COMP%]{font-size:.9rem;color:var(--color-text, #1d1d1f);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.user-group-form__member-email[_ngcontent-%COMP%]{font-size:.75rem;color:var(--color-text-secondary, #6e6e73);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.user-group-form__member-role[_ngcontent-%COMP%]{flex-shrink:0;padding:.3rem .5rem;border-radius:6px;border:1px solid var(--color-border, rgba(0, 0, 0, .1));background:transparent;color:var(--color-text, #1d1d1f);font-size:.8rem;font-family:inherit;cursor:pointer}.user-group-form__member-role[_ngcontent-%COMP%]:focus{outline:none;border-color:var(--color-primary, #007aff)}.user-group-form__member-remove[_ngcontent-%COMP%]{flex-shrink:0;width:1.5rem;height:1.5rem;display:flex;align-items:center;justify-content:center;border-radius:50%;border:none;background:transparent;color:var(--color-text-secondary, #6e6e73);font-size:1rem;line-height:1;cursor:pointer;transition:background .15s ease,color .15s ease}.user-group-form__member-remove[_ngcontent-%COMP%]:hover{background:var(--color-error-light, rgba(255, 59, 48, .12));color:var(--color-error, #ff3b30)}.user-group-form__error[_ngcontent-%COMP%]{margin:0;padding:.625rem .875rem;border-radius:8px;background:var(--color-error-light, rgba(255, 59, 48, .08));border:1px solid var(--color-error, #ff3b30);color:var(--color-error, #ff3b30);font-size:.875rem;line-height:1.4}.user-group-form__field-error[_ngcontent-%COMP%]{font-size:.8rem;color:var(--color-error, #ff3b30);line-height:1.3}.user-group-form__actions[_ngcontent-%COMP%]{display:flex;gap:.75rem;padding-top:.5rem}.user-group-form__btn[_ngcontent-%COMP%]{padding:.6rem 1.25rem;border-radius:8px;border:1px solid var(--color-border, rgba(0, 0, 0, .1));background:transparent;color:var(--color-text, #1d1d1f);font-size:.9375rem;font-family:inherit;cursor:pointer;transition:background .15s ease,border-color .15s ease}.user-group-form__btn[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-surface-hover, rgba(0, 0, 0, .04))}.user-group-form__btn[_ngcontent-%COMP%]:disabled{opacity:.45;cursor:not-allowed}.user-group-form__btn--primary[_ngcontent-%COMP%]{background:var(--color-primary, #007aff);border-color:var(--color-primary, #007aff);color:#fff}.user-group-form__btn--primary[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-primary-hover, #0051d5);border-color:var(--color-primary-hover, #0051d5)}"],changeDetection:0})};export{ae as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as P}from"./chunk-MZT6I3S3.js";import{
|
|
1
|
+
import{c as P}from"./chunk-MZT6I3S3.js";import{A as D,s as w}from"./chunk-C2J4TQ7V.js";import{Bb as f,Db as c,Fb as a,Ka as p,Rb as h,Tb as _,Ub as b,Wa as y,ca as C,ga as d,ha as s,lb as g,mb as u,pc as M,qc as l,rb as x,sb as i,ta as v,tb as n}from"./chunk-KJ5SIUGY.js";function k(t,r){if(t&1&&(i(0,"span",3),_(1),n()),t&2){let e=a();p(),b(e.prompt().description)}}function S(t,r){if(t&1){let e=f();i(0,"span",6),_(1,"Delete?"),n(),i(2,"ds-icon-button",7),c("action",function(){d(e);let m=a();return s(m.onDeleteConfirmed())}),n(),i(3,"ds-icon-button",8),c("action",function(){d(e);let m=a();return s(m.onDeleteCancelled())}),n()}}function E(t,r){if(t&1){let e=f();i(0,"ds-kebab-menu",9),c("itemSelected",function(m){d(e);let O=a();return s(O.onMenuAction(m))}),n()}if(t&2){let e=a();x("items",e.menuItems)}}var I=class t{router=C(P);prompt=l.required();namespaceId=l(void 0);platformMode=l(!1);readOnly=l(!1);deleteRequested=M();pendingDelete=v(!1);menuItems=[{key:"edit",label:"Edit prompt",icon:"edit"},{key:"delete",label:"Delete prompt",icon:"delete",variant:"danger"}];onMenuAction(r){switch(r){case"edit":this.platformMode()?this.router.navigate(["/agentos","admin","prompts",this.prompt().id,"edit"]):this.router.navigate(["/agentos",this.namespaceId(),"prompts",this.prompt().id,"edit"]);break;case"delete":this.pendingDelete.set(!0);break}}onDeleteConfirmed(){this.pendingDelete.set(!1),this.deleteRequested.emit(this.prompt())}onDeleteCancelled(){this.pendingDelete.set(!1)}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=y({type:t,selectors:[["agentos-prompt-item"]],inputs:{prompt:[1,"prompt"],namespaceId:[1,"namespaceId"],platformMode:[1,"platformMode"],readOnly:[1,"readOnly"]},outputs:{deleteRequested:"deleteRequested"},decls:8,vars:5,consts:[["role","listitem",1,"prompt-item"],[1,"prompt-item__body"],[1,"prompt-item__name"],[1,"prompt-item__description"],[1,"prompt-item__actions"],[3,"items"],[1,"prompt-item__confirm-label"],["icon","check","variant","danger","title","Confirm deletion",3,"action"],["icon","close","title","Cancel deletion",3,"action"],[3,"itemSelected","items"]],template:function(e,o){e&1&&(i(0,"div",0)(1,"div",1)(2,"span",2),_(3),n(),g(4,k,2,1,"span",3),n(),i(5,"div",4),g(6,S,4,0)(7,E,1,1,"ds-kebab-menu",5),n()()),e&2&&(h("prompt-item--pending-delete",o.pendingDelete()),p(3),b(o.prompt().name),p(),u(o.prompt().description?4:-1),p(2),u(o.pendingDelete()?6:o.readOnly()?-1:7))},dependencies:[D,w],styles:[".prompt-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem;border-radius:10px;border:1px solid var(--color-border, rgba(0, 0, 0, .08));background:var(--glass-bg, rgba(255, 255, 255, .72));-webkit-backdrop-filter:var(--glass-backdrop-blur, blur(20px));backdrop-filter:var(--glass-backdrop-blur, blur(20px));transition:background .15s ease,border-color .15s ease}.prompt-item[_ngcontent-%COMP%]:hover{background:var(--color-bg-hover, rgba(0, 0, 0, .04));border-color:var(--color-primary, #007aff)}.prompt-item__body[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;gap:.2rem;min-width:0}.prompt-item__name[_ngcontent-%COMP%]{font-size:.95rem;font-weight:500;color:var(--color-text, #1d1d1f);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.prompt-item__description[_ngcontent-%COMP%]{font-size:.75rem;color:var(--color-text-secondary, #6e6e73);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.prompt-item__actions[_ngcontent-%COMP%]{flex-shrink:0;display:flex;align-items:center;gap:.125rem;opacity:0;transition:opacity .15s ease}.prompt-item[_ngcontent-%COMP%]:hover .prompt-item__actions[_ngcontent-%COMP%], .prompt-item[_ngcontent-%COMP%]:focus-within .prompt-item__actions[_ngcontent-%COMP%], .prompt-item--pending-delete[_ngcontent-%COMP%] .prompt-item__actions[_ngcontent-%COMP%]{opacity:1}.prompt-item__confirm-label[_ngcontent-%COMP%]{font-size:.8rem;font-weight:500;color:var(--color-error, #ff3b30);margin-right:.25rem;white-space:nowrap}"],changeDetection:0})};export{I as a};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as L}from"./chunk-
|
|
1
|
+
import{a as L}from"./chunk-JW4JKLFN.js";import{a as D}from"./chunk-7N4XUYW4.js";import"./chunk-ZAMAK546.js";import{a as E,c as $}from"./chunk-MZT6I3S3.js";import{z as O}from"./chunk-C2J4TQ7V.js";import"./chunk-MWPKXBXJ.js";import"./chunk-7EDSHFWH.js";import{a as l}from"./chunk-3ZLLFAXF.js";import"./chunk-Q2M4W42M.js";import"./chunk-DDWYQORF.js";import"./chunk-B46LXCLF.js";import{Bb as x,D as y,Db as m,Fb as a,Kc as T,Pb as N,S as P,Tb as w,Wa as b,ab as v,ca as p,cc as M,fc as B,ga as g,gc as S,ha as h,i as d,jc as k,lb as I,m as u,ma as C,mb as R,rb as s,sb as i,t as f,tb as c,z as _}from"./chunk-KJ5SIUGY.js";var F=()=>[];function U(r,t){if(r&1){let o=x();i(0,"agentos-prompt-item",4),m("deleteRequested",function(n){g(o);let A=a(2);return h(A.deletePrompt(n))}),c()}if(r&2){let o=a().$implicit,e=a();s("prompt",t)("namespaceId",e.namespaceId)("readOnly",e.isPlatformPrompt(o.id))}}function V(r,t){if(r&1&&I(0,U,1,3,"agentos-prompt-item",3),r&2){let o,e=t.$implicit,n=a();R((o=n.resolvePrompt(e.id))?0:-1,o)}}var j="platform",G="namespace",q=class r{route=p(E);router=p($);destroyRef=p(C);promptState=p(D);namespaceId=this.route.snapshot.params.namespaceId;refresh$=new d(void 0);allPrompts$=this.refresh$.pipe(P(()=>_({platform:this.promptState.listPlatform().pipe(y(()=>u([]))),namespace:this.promptState.listByNamespace(this.namespaceId)})));promptItems$=this.allPrompts$.pipe(f(({platform:t,namespace:o})=>[...t.map(e=>({id:e.id??"",name:e.name,description:e.description,groupKey:j,groupLabel:"Platform (read-only)"})),...o.map(e=>({id:e.id??"",name:e.name,description:e.description,groupKey:G,groupLabel:"Namespace"}))]));namespacePromptsById=new Map;platformPromptsById=new Map;constructor(){this.allPrompts$.pipe(l(this.destroyRef)).subscribe(({platform:t,namespace:o})=>{this.platformPromptsById=new Map(t.map(e=>[e.id??"",e])),this.namespacePromptsById=new Map(o.map(e=>[e.id??"",e]))})}goBack(){this.router.navigate(["/agentos","namespaces"])}openCreateForm(){this.router.navigate(["/agentos",this.namespaceId,"prompts","new"])}deletePrompt(t){this.promptState.delete(t.id??"").pipe(l(this.destroyRef)).subscribe(()=>this.refresh$.next())}resolvePrompt(t){return this.platformPromptsById.get(t)??this.namespacePromptsById.get(t)??null}isPlatformPrompt(t){return this.platformPromptsById.has(t)}static \u0275fac=function(o){return new(o||r)};static \u0275cmp=b({type:r,selectors:[["agentos-namespace-prompts"]],decls:6,vars:6,consts:[["promptItemTpl",""],["title","Prompts","emptyMessage","No prompts defined yet. Add one above.","cardMinWidth","400px",3,"createRequested","items","showCreate","itemTemplate"],["toolbar-start","","type","button",1,"namespace-prompts__back",3,"click"],[3,"prompt","namespaceId","readOnly"],[3,"deleteRequested","prompt","namespaceId","readOnly"]],template:function(o,e){if(o&1&&(i(0,"ds-entity-list",1),B(1,"async"),m("createRequested",function(){return e.openCreateForm()}),i(2,"button",2),m("click",function(){return e.goBack()}),w(3,"\u2190 Namespaces"),c()(),v(4,V,1,1,"ng-template",null,0,k)),o&2){let n=N(5);s("items",S(1,3,e.promptItems$)??M(5,F))("showCreate",!0)("itemTemplate",n)}},dependencies:[O,L,T],styles:[".namespace-prompts__back[_ngcontent-%COMP%]{background:none;border:none;padding:0;cursor:pointer;font-size:.875rem;color:var(--color-primary, #007aff);font-family:inherit}.namespace-prompts__back[_ngcontent-%COMP%]:hover{text-decoration:underline}"],changeDetection:0})};export{q as NamespacePromptsComponent};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{o as I,s as D}from"./chunk-C2J4TQ7V.js";import{Bb as p,Db as g,Fb as c,Ka as r,Tb as s,Ub as b,Vb as y,Wa as x,ga as l,ha as d,jb as w,lb as u,mb as C,mc as h,pc as f,qc as _,sb as n,ta as v,tb as i}from"./chunk-KJ5SIUGY.js";function M(o,m){if(o&1){let e=p();n(0,"span",7),s(1,"Delete?"),i(),n(2,"ds-icon-button",8),g("action",function(){l(e);let a=c();return d(a.onDeleteConfirmed())}),i(),n(3,"ds-icon-button",9),g("action",function(){l(e);let a=c();return d(a.onDeleteCancelled())}),i()}}function S(o,m){if(o&1){let e=p();n(0,"ds-icon-button",11),g("action",function(){l(e);let a=c(2);return d(a.onEdit())}),i(),n(1,"ds-icon-button",12),g("action",function(){l(e);let a=c(2);return d(a.onDeleteArmed())}),i()}}function P(o,m){if(o&1){let e=p();n(0,"ds-icon-button",10),g("action",function(){l(e);let a=c();return d(a.onDuplicate())}),i(),u(1,S,2,0)}if(o&2){let e=c();r(),C(e.readOnly()?-1:1)}}var E=Object.freeze({platform:{label:"PLATFORM",ariaLabel:"Configuration partag\xE9e plateforme",variant:"neutral"},namespace:{label:"NS",ariaLabel:"Configuration partag\xE9e du namespace",variant:"neutral"},userOnNs:{label:"USER \xD7 NS",ariaLabel:"Configuration utilisateur sur ce namespace",variant:"info"},userGlobal:{label:"USER GLOBAL",ariaLabel:"Configuration utilisateur globale",variant:"warning"}}),O=class o{config=_.required();scope=_.required();readOnly=_(!1);editRequested=f();deleteRequested=f();duplicateRequested=f();pendingDelete=v(!1);badge=h(()=>E[this.scope()]);onEdit(){this.editRequested.emit(this.config())}onDuplicate(){this.duplicateRequested.emit(this.config())}onDeleteArmed(){this.pendingDelete.set(!0)}onDeleteConfirmed(){this.pendingDelete.set(!1),this.deleteRequested.emit(this.config())}onDeleteCancelled(){this.pendingDelete.set(!1)}static \u0275fac=function(e){return new(e||o)};static \u0275cmp=x({type:o,selectors:[["agentos-integration-config-item"]],inputs:{config:[1,"config"],scope:[1,"scope"],readOnly:[1,"readOnly"]},outputs:{editRequested:"editRequested",deleteRequested:"deleteRequested",duplicateRequested:"duplicateRequested"},decls:12,vars:6,consts:[["role","listitem","dsBlueprint","",1,"integration-config-item"],[1,"integration-config-item__body"],[1,"integration-config-item__heading"],[1,"integration-config-item__name"],[1,"integration-config-item__badge"],[1,"integration-config-item__type"],[1,"integration-config-item__actions"],[1,"integration-config-item__confirm-label"],["icon","check","variant","danger","title","Confirm deletion",3,"action"],["icon","close","title","Cancel deletion",3,"action"],["icon","content_copy","title","Duplicate this configuration",3,"action"],["icon","edit","title","Edit integration",3,"action"],["icon","delete","variant","danger","title","Delete integration",3,"action"]],template:function(e,t){e&1&&(n(0,"div",0)(1,"div",1)(2,"div",2)(3,"span",3),s(4),i(),n(5,"span",4),s(6),i()(),n(7,"span",5),s(8),i()(),n(9,"div",6),u(10,M,4,0)(11,P,2,1),i()()),e&2&&(r(4),b(t.config().name),r(),w("data-variant",t.badge().variant)("aria-label",t.badge().ariaLabel),r(),y(" ",t.badge().label," "),r(2),b(t.config().integrationType),r(2),C(t.pendingDelete()?10:11))},dependencies:[I,D],styles:[".integration-config-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;padding:14px 16px;position:relative;border-radius:0;border:1px solid var(--color-divider);background:var(--color-bg);box-shadow:var(--shadow-sm);overflow:visible;transition:border-color .15s ease}.integration-config-item[_ngcontent-%COMP%]:hover{border-color:var(--color-accent)}.integration-config-item__body[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;gap:.2rem;min-width:0}.integration-config-item__heading[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;min-width:0}.integration-config-item__name[_ngcontent-%COMP%]{font-size:15px;font-weight:600;color:var(--color-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;min-width:0}.integration-config-item__badge[_ngcontent-%COMP%]{flex-shrink:0;font-family:var(--font-heading);font-size:11px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;border-radius:0;padding:.15rem .5rem;white-space:nowrap}.integration-config-item__badge[data-variant=neutral][_ngcontent-%COMP%]{border:1px solid var(--color-divider);color:var(--color-neutral-600);background:transparent}.integration-config-item__badge[data-variant=info][_ngcontent-%COMP%]{border:1px solid color-mix(in srgb,var(--color-info) 40%,transparent);color:var(--color-info);background:color-mix(in srgb,var(--color-info) 10%,transparent)}.integration-config-item__badge[data-variant=warning][_ngcontent-%COMP%]{border:1px solid color-mix(in srgb,var(--color-warning) 40%,transparent);color:var(--color-warning);background:color-mix(in srgb,var(--color-warning) 10%,transparent)}.integration-config-item__type[_ngcontent-%COMP%]{font-size:13px;color:var(--color-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.integration-config-item__actions[_ngcontent-%COMP%]{flex-shrink:0;display:flex;align-items:center;gap:.125rem;opacity:0;transition:opacity .15s ease}.integration-config-item[_ngcontent-%COMP%]:hover .integration-config-item__actions[_ngcontent-%COMP%], .integration-config-item[_ngcontent-%COMP%]:focus-within .integration-config-item__actions[_ngcontent-%COMP%]{opacity:1}.integration-config-item__confirm-label[_ngcontent-%COMP%]{font-family:var(--font-heading);font-size:11px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--red-deep);margin-right:.25rem;white-space:nowrap}"],changeDetection:0})};export{O as a};
|