@whoz-oss/coday-client 0.242.0 → 0.244.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.
Files changed (71) hide show
  1. package/browser/{chunk-JCKKIKVU.js → chunk-4CNY7Z64.js} +1 -1
  2. package/browser/{chunk-NEVEN2BG.js → chunk-4FGWE3EW.js} +1 -1
  3. package/browser/{chunk-HN4TBO7J.js → chunk-5N6DUZII.js} +1 -1
  4. package/browser/{chunk-IN5SVY4U.js → chunk-5OGZHNUE.js} +1 -1
  5. package/browser/{chunk-SDHC7TR2.js → chunk-5WX43L4B.js} +1 -1
  6. package/browser/{chunk-36EOCF7B.js → chunk-5Y2Q6WKL.js} +1 -1
  7. package/browser/{chunk-DFXCCLVG.js → chunk-6BMCL5TR.js} +1 -1
  8. package/browser/{chunk-MZBZJFIH.js → chunk-76HYDFUL.js} +1 -1
  9. package/browser/{chunk-62AZ3TER.js → chunk-7H4TBVB7.js} +1 -1
  10. package/browser/{chunk-P3AFMA53.js → chunk-7O6TY5IW.js} +1 -1
  11. package/browser/{chunk-LU3ZSYWJ.js → chunk-ADEIEQGJ.js} +1 -1
  12. package/browser/{chunk-PXY6PLET.js → chunk-AK746XRX.js} +1 -1
  13. package/browser/{chunk-KKYAHLLD.js → chunk-BWBZLC7A.js} +1 -1
  14. package/browser/{chunk-ZCELWKMZ.js → chunk-CRXIMHRG.js} +3 -3
  15. package/browser/{chunk-GBTVBYVO.js → chunk-CSHG3PLJ.js} +1 -1
  16. package/browser/{chunk-AV3U5ZDG.js → chunk-CU7SABOQ.js} +1 -1
  17. package/browser/{chunk-N6D7DELC.js → chunk-DZ2M3NQD.js} +1 -1
  18. package/browser/{chunk-WH2T6TJR.js → chunk-ECISS7V2.js} +1 -1
  19. package/browser/{chunk-QCC2HSMN.js → chunk-ENRRDIUM.js} +1 -1
  20. package/browser/{chunk-ZS3GOED4.js → chunk-F4ZRQ6MH.js} +1 -1
  21. package/browser/chunk-FA2MVU23.js +1 -0
  22. package/browser/{chunk-GWUHK3IY.js → chunk-GLFQ37PU.js} +1 -1
  23. package/browser/{chunk-KH3XUBG3.js → chunk-GSUU7JSY.js} +1 -1
  24. package/browser/{chunk-6UXZYGDR.js → chunk-H6NBS4JE.js} +1 -1
  25. package/browser/{chunk-FV7MYI7I.js → chunk-I4RHXOIC.js} +1 -1
  26. package/browser/{chunk-KZ2MXYPS.js → chunk-KJJPVCIH.js} +1 -1
  27. package/browser/chunk-KWJJEVAI.js +1 -0
  28. package/browser/{chunk-QA4DQZOM.js → chunk-LHKOA7FX.js} +1 -1
  29. package/browser/{chunk-FOUZFGE6.js → chunk-LUB22VNT.js} +1 -1
  30. package/browser/{chunk-6QIZQ7GE.js → chunk-MFSY4HYK.js} +1 -1
  31. package/browser/{chunk-LYXZJWHW.js → chunk-MIAKSSSF.js} +1 -1
  32. package/browser/{chunk-XFS5RNFU.js → chunk-N2NJQ7DJ.js} +1 -1
  33. package/browser/chunk-NGMAQNX3.js +4 -0
  34. package/browser/{chunk-HY5SN7AG.js → chunk-NNUJIQ6R.js} +1 -1
  35. package/browser/{chunk-TMQGM3DO.js → chunk-NYUYHMIH.js} +1 -1
  36. package/browser/{chunk-JMRUD2BW.js → chunk-ONZVOEJQ.js} +1 -1
  37. package/browser/chunk-P6WNH2KJ.js +1 -0
  38. package/browser/{chunk-VNLBXJU6.js → chunk-QTXEWRHZ.js} +1 -1
  39. package/browser/{chunk-OY6A2XLL.js → chunk-QXBTTCPM.js} +1 -1
  40. package/browser/{chunk-OCX3RQ65.js → chunk-R2NWLPS6.js} +1 -1
  41. package/browser/{chunk-NIV7FMON.js → chunk-RQKLSUW5.js} +1 -1
  42. package/browser/{chunk-UU5QELSX.js → chunk-S5QSZK6N.js} +1 -1
  43. package/browser/{chunk-RGGNQESF.js → chunk-SZM3NJVZ.js} +1 -1
  44. package/browser/{chunk-UAHVURDD.js → chunk-TNSH3NBF.js} +1 -1
  45. package/browser/{chunk-IV7SJSBN.js → chunk-U3AHBQTX.js} +1 -1
  46. package/browser/{chunk-IYEDRCU5.js → chunk-U7ZJFIOR.js} +1 -1
  47. package/browser/{chunk-AFRMVXZZ.js → chunk-UEGZX4MW.js} +1 -1
  48. package/browser/{chunk-D5BPAYOR.js → chunk-UO7SKQEC.js} +1 -1
  49. package/browser/{chunk-BLRBIAYK.js → chunk-UQTA3ACH.js} +1 -1
  50. package/browser/{chunk-35S3IW2A.js → chunk-UWYJO2DN.js} +1 -1
  51. package/browser/{chunk-M5ZWYOBX.js → chunk-VLDPXI7G.js} +1 -1
  52. package/browser/{chunk-MQEDNZF7.js → chunk-VZOBZ3DD.js} +1 -1
  53. package/browser/chunk-W7A7CPWM.js +1 -0
  54. package/browser/{chunk-N2F3TQJA.js → chunk-WMHS3NSI.js} +1 -1
  55. package/browser/{chunk-4T6SALXS.js → chunk-X5ZRXGFA.js} +1 -1
  56. package/browser/{chunk-5IIN2VT5.js → chunk-X73LZ3QV.js} +1 -1
  57. package/browser/{chunk-3MTFWGAR.js → chunk-XAEUGARN.js} +1 -1
  58. package/browser/chunk-XJYEZL5J.js +1 -0
  59. package/browser/{chunk-Y37OZMXI.js → chunk-XZRVHU66.js} +1 -1
  60. package/browser/{chunk-WNYGQVYX.js → chunk-YGBFW4ZS.js} +1 -1
  61. package/browser/{chunk-FELLJOVH.js → chunk-ZQZHBROX.js} +1 -1
  62. package/browser/{chunk-3MREZSO7.js → chunk-ZXQEKBPA.js} +1 -1
  63. package/browser/index.html +1 -1
  64. package/browser/{main-44QZIU3R.js → main-VWHGBAF5.js} +1 -1
  65. package/package.json +1 -1
  66. package/browser/chunk-57XIXFX3.js +0 -1
  67. package/browser/chunk-HSEJNG7W.js +0 -3
  68. package/browser/chunk-LQOQ3VK5.js +0 -1
  69. package/browser/chunk-MH3KTYRA.js +0 -1
  70. package/browser/chunk-QBT6LKOQ.js +0 -1
  71. package/browser/chunk-TET2CIOZ.js +0 -1
@@ -1 +1 @@
1
- import{a as oe}from"./chunk-LU3ZSYWJ.js";import"./chunk-NWFFZ2FW.js";import"./chunk-MQEDNZF7.js";import{b as G,i as U,w as W}from"./chunk-BLRBIAYK.js";import{a as L,c as $,d as j}from"./chunk-6XX7GME4.js";import{a as S}from"./chunk-VMYKE4ZC.js";import{F as ne,b as Y,c as q,e as P,g as J,h as H,i as K,l as _,n as Q,s as X,w as Z,y as ee,z as te}from"./chunk-7OGOI6WM.js";import{Bb as w,D as N,Db as b,Fb as s,Ka as g,Tb as a,Ub as y,Vb as E,Wa as V,a as R,b as T,ca as v,ga as C,ha as x,jb as B,lb as f,m as I,ma as D,mb as p,nb as z,pb as A,qb as M,rb as d,sb as i,t as F,ta as u,tb as n,ub as h,z as O}from"./chunk-CHEXA6RY.js";var re=(r,t)=>t.config.id,ae=(r,t)=>t.type;function le(r,t){if(r&1&&(i(0,"a",5),a(1,"View resolved definition \u2192"),n()),r&2){let e=s();d("routerLink",e.inspectRoute())}}function ge(r,t){r&1&&(i(0,"span",6),a(1,"Platform level"),n())}function ce(r,t){r&1&&(i(0,"p",7),a(1,"Loading\u2026"),n())}function se(r,t){if(r&1&&(i(0,"span",41),a(1),n()),r&2){let e=s().$implicit;g(),y(e.config.integrationType)}}function de(r,t){if(r&1&&h(0,"input",42),r&2){let e=s().$implicit;d("formControl",e.toolsControl)}}function me(r,t){if(r&1){let e=w();i(0,"div",37)(1,"label",38)(2,"input",39),b("change",function(){let l=C(e).$implicit,c=s(3);return x(c.toggleIntegration(l))}),n(),i(3,"span",40),a(4),n(),f(5,se,2,1,"span",41),n(),f(6,de,1,1,"input",42),n()}if(r&2){let e=t.$implicit;g(2),d("checked",e.enabled()),g(2),y(e.config.name),g(),p(e.config.integrationType?5:-1),g(),p(e.enabled()?6:-1)}}function fe(r,t){if(r&1&&(i(0,"p",48),a(1),n()),r&2){let e=s().$implicit;g(),E(" Restricted to: ",e.restrictedTools.join(", ")," (set outside this form, preserved on save) ")}}function pe(r,t){if(r&1){let e=w();i(0,"div",37)(1,"label",38)(2,"span",40),a(3),n(),i(4,"span",41),a(5,"built-in"),n()(),i(6,"select",44),b("change",function(l){let c=C(e).$implicit,m=s(4);return x(m.setBuiltInState(c,l.target.value))}),i(7,"option",45),a(8),n(),i(9,"option",46),a(10,"Enabled"),n(),i(11,"option",47),a(12,"Disabled"),n()(),f(13,fe,2,1,"p",48),i(14,"p",49),a(15),n()()}if(r&2){let e=t.$implicit,o=s(4);g(),B("for","built-in-"+e.type),g(2),y(e.displayName),g(3),d("id","built-in-"+e.type)("value",e.state()),g(2),y(o.builtInDefaultLabel(e)),g(5),p(e.state()==="on"&&e.restrictedTools?13:-1),g(2),y(e.description)}}function _e(r,t){if(r&1&&(i(0,"p",43),a(1,"Built-in integrations"),n(),A(2,pe,16,7,"div",37,ae)),r&2){let e=s(3);g(2),M(e.builtInRows())}}function ue(r,t){if(r&1&&(i(0,"fieldset",20)(1,"legend",25),a(2,"Integrations"),n(),i(3,"p",36),a(4," Select which integrations this agent can use. Leave tool names empty to allow all tools from an integration. "),n(),A(5,me,7,4,"div",37,re),f(7,_e,4,0),n()),r&2){let e=s(2);g(5),M(e.integrationRows()),g(2),p(e.builtInRows().length>0?7:-1)}}function be(r,t){if(r&1){let e=w();i(0,"li",50),h(1,"input",51),i(2,"button",52),b("click",function(){let l=C(e).$implicit,c=s(3);return x(c.removeSubAgent(l))}),a(3," \u{1F5D1} "),n()()}if(r&2){let e=t.$implicit;g(),d("formControl",e.control)}}function Ce(r,t){if(r&1&&(i(0,"ul",28),A(1,be,4,1,"li",50,z),n()),r&2){let e=s(2);g(),M(e.subAgentRows())}}function xe(r,t){if(r&1){let e=w();i(0,"button",53),b("click",function(){C(e);let l=s(2);return x(l.exportYaml())}),a(1),n()}if(r&2){let e=s(2);d("disabled",e.isExporting()),g(),E(" ",e.isExporting()?"Exporting\u2026":"Export as YAML"," ")}}function he(r,t){if(r&1){let e=w();i(0,"form",9),b("ngSubmit",function(){C(e);let l=s();return x(l.submit())}),i(1,"div",10)(2,"label",11),a(3,"Name "),i(4,"span",12),a(5,"*"),n()(),h(6,"input",13),n(),i(7,"div",10)(8,"label",14),a(9,"Description"),n(),h(10,"input",15),n(),i(11,"div",10)(12,"label",16),a(13,"Model name"),n(),h(14,"input",17),n(),i(15,"div",10)(16,"label",18),a(17,"Instructions"),n(),h(18,"textarea",19),n(),f(19,ue,8,1,"fieldset",20),i(20,"div",10)(21,"label",21),h(22,"input",22),i(23,"span",23),a(24,"Advanced mode"),n()(),i(25,"p",24),a(26," When enabled, this agent uses a multi-step reasoning loop instead of a single LLM call. "),n()(),i(27,"div",10)(28,"label",21),h(29,"input",22),i(30,"span",23),a(31,"Enabled"),n()(),i(32,"p",24),a(33,"Disabled agents are excluded from namespace resolution."),n()(),i(34,"div",10)(35,"span",25),a(36,"Sub-agents"),n(),i(37,"p",26),a(38," Glob patterns for agents this agent may delegate to. "),i(39,"code",27),a(40,"*"),n(),a(41," matches any sequence of characters (e.g.\xA0"),i(42,"code",27),a(43,"*Fixer"),n(),a(44,", "),i(45,"code",27),a(46,"*"),n(),a(47," for all). Leave empty to disable delegation. "),n(),f(48,Ce,3,0,"ul",28),i(49,"div",29)(50,"input",30),b("keydown.enter",function(){C(e);let l=s();return x(l.addSubAgent())}),n(),i(51,"button",31),b("click",function(){C(e);let l=s();return x(l.addSubAgent())}),a(52," + "),n()()(),i(53,"div",32)(54,"button",33),a(55),n(),f(56,xe,2,2,"button",34),i(57,"button",35),b("click",function(){C(e);let l=s();return x(l.cancel())}),a(58,"Cancel"),n()()()}if(r&2){let e=s();d("formGroup",e.form),g(6),d("formControl",e.nameControl),g(4),d("formControl",e.descriptionControl),g(4),d("formControl",e.modelNameControl),g(4),d("formControl",e.instructionsControl),g(),p(e.integrationRows().length>0||e.builtInRows().length>0?19:-1),g(3),d("formControl",e.advancedExecutionControl),g(7),d("formControl",e.enabledControl),g(19),p(e.subAgentRows().length>0?48:-1),g(2),d("formControl",e.newSubAgentControl),g(),d("disabled",!e.newSubAgentControl.value.trim()),g(3),d("disabled",e.form.invalid||e.isSubmitting()),g(),E(" ",e.isEditMode()?"Save changes":"Create"," "),g(),p(e.isEditMode()?56:-1)}}var ie=class r{route=v(L);router=v($);destroyRef=v(D);agentConfigController=v(G);exportService=v(W);integrationConfigState=v(oe);integrationTypeController=v(U);namespaceId=this.route.snapshot.params.namespaceId;isPlatformMode=!this.namespaceId;form=new K({name:new _("",{nonNullable:!0,validators:[P.required,P.minLength(1)]}),description:new _(null),modelName:new _(null),instructions:new _(null),advancedExecution:new _(!1,{nonNullable:!0}),enabled:new _(!1,{nonNullable:!0})});get nameControl(){return this.form.controls.name}get descriptionControl(){return this.form.controls.description}get modelNameControl(){return this.form.controls.modelName}get instructionsControl(){return this.form.controls.instructions}get advancedExecutionControl(){return this.form.controls.advancedExecution}get enabledControl(){return this.form.controls.enabled}subAgentRows=u([]);newSubAgentControl=new _("",{nonNullable:!0});isEditMode=u(!1);isSubmitting=u(!1);isLoading=u(!1);isExporting=u(!1);builtInRows=u([]);inspectRoute(){let t=this.route.snapshot.paramMap.get("agentConfigId")??"";return this.isPlatformMode?["/agentos","admin","agent-configs",t,"inspect"]:["/agentos",this.namespaceId,"agent-configs",t,"inspect"]}integrationRows=u([]);existingConfig=null;ngOnInit(){let t=this.route.snapshot.paramMap.get("agentConfigId");t?(this.isEditMode.set(!0),this.loadConfigAndIntegrations(t)):this.loadIntegrations(void 0)}loadConfigAndIntegrations(t){this.isLoading.set(!0),O({config:this.agentConfigController.getByIdAgentConfig(t),namespaceIntegrations:this.namespaceId?this.integrationConfigState.loadNamespaceConfigs(this.namespaceId):I([]),platformIntegrations:this.integrationConfigState.loadPlatformConfigs(),builtInTypes:this.loadBuiltInTypes()}).pipe(S(this.destroyRef)).subscribe({next:({config:e,namespaceIntegrations:o,platformIntegrations:l,builtInTypes:c})=>{this.existingConfig=e,this.nameControl.setValue(e.name),this.descriptionControl.setValue(e.description??null),this.modelNameControl.setValue(e.modelName??null),this.instructionsControl.setValue(e.instructions??null),this.advancedExecutionControl.setValue(e.advancedExecution??!1),this.enabledControl.setValue(e.enabled??!0);let m=[...l,...o];this.integrationRows.set(this.buildIntegrationRows(m,e.integrations??void 0)),this.builtInRows.set(this.buildBuiltInRows(c,e.integrations??void 0)),this.subAgentRows.set((e.subAgents??[]).map(k=>({control:new _(k,{nonNullable:!0})}))),this.isLoading.set(!1)},error:()=>{this.isLoading.set(!1),this.navigateBack()}})}loadIntegrations(t){O({namespaceIntegrations:this.namespaceId?this.integrationConfigState.loadNamespaceConfigs(this.namespaceId):I([]),platformIntegrations:this.integrationConfigState.loadPlatformConfigs(),builtInTypes:this.loadBuiltInTypes()}).pipe(S(this.destroyRef)).subscribe({next:({namespaceIntegrations:e,platformIntegrations:o,builtInTypes:l})=>{let c=[...o,...e];this.integrationRows.set(this.buildIntegrationRows(c,t??void 0)),this.builtInRows.set(this.buildBuiltInRows(l,t??void 0))}})}loadBuiltInTypes(){return this.integrationTypeController.listTypesIntegrationType().pipe(F(t=>t.filter(e=>!e.configSchema)),N(t=>(console.error("[agent-config-form] failed to load integration types",t),I([]))))}buildIntegrationRows(t,e){return t.map(o=>{let l=o.name??"",c=e?.[l],m=e!=null&&l in e,k=Array.isArray(c)?c.join(", "):"";return{config:o,enabled:u(m),toolsControl:new _(k,{nonNullable:!0})}})}buildBuiltInRows(t,e){return t.map(o=>{let l=e!=null&&o.type in e,c=e?.[o.type],m=l?Array.isArray(c)&&c.length===0?"off":"on":"default";return{type:o.type,displayName:o.displayName,description:o.description,enabledByDefault:o.enabledByDefault===!0,state:u(m),restrictedTools:Array.isArray(c)&&c.length>0?c:null}})}toggleIntegration(t){t.enabled.update(e=>!e)}setBuiltInState(t,e){t.state.set(e)}builtInDefaultLabel(t){return t.enabledByDefault?"Platform default (enabled)":"Platform default (disabled)"}addSubAgent(){let t=this.newSubAgentControl.value.trim();t&&(this.subAgentRows.update(e=>[...e,{control:new _(t,{nonNullable:!0})}]),this.newSubAgentControl.reset(""))}removeSubAgent(t){this.subAgentRows.update(e=>e.filter(o=>o!==t))}buildSubAgentsPayload(){let t=this.subAgentRows().map(e=>e.control.value.trim()).filter(e=>e.length>0);return t.length>0?t:void 0}buildIntegrationsPayload(){let t={};for(let o of this.integrationRows().filter(l=>l.enabled())){let l=o.config.name??"",c=o.toolsControl.value.trim();t[l]=c===""?null:c.split(",").map(m=>m.trim()).filter(m=>m.length>0)}for(let o of this.builtInRows()){let l=o.state();l==="on"?t[o.type]=o.restrictedTools??null:l==="off"&&(t[o.type]=[])}let e=new Set([...this.integrationRows().map(o=>o.config.name??""),...this.builtInRows().map(o=>o.type)]);for(let[o,l]of Object.entries(this.existingConfig?.integrations??{}))e.has(o)||(t[o]=l);return Object.keys(t).length>0?t:void 0}submit(){if(this.form.invalid||this.isSubmitting())return;this.addSubAgent(),this.isSubmitting.set(!0);let t=T(R({},this.existingConfig??{}),{createdOn:this.existingConfig?.createdOn,updatedOn:this.existingConfig?.updatedOn,namespaceId:this.namespaceId,name:this.nameControl.value.trim(),description:this.descriptionControl.value?.trim()||void 0,modelName:this.modelNameControl.value?.trim()||void 0,instructions:this.instructionsControl.value?.trim()||void 0,integrations:this.buildIntegrationsPayload(),advancedExecution:this.advancedExecutionControl.value,enabled:this.enabledControl.value,subAgents:this.buildSubAgentsPayload()});(this.isEditMode()?this.agentConfigController.updateAgentConfig(this.existingConfig.id??"",t):this.agentConfigController.createAgentConfig(t)).pipe(S(this.destroyRef)).subscribe({next:()=>this.navigateBack(),error:()=>this.isSubmitting.set(!1)})}exportYaml(){let t=this.existingConfig?.id;!t||this.isExporting()||(this.isExporting.set(!0),this.exportService.exportAsYaml(t).pipe(S(this.destroyRef)).subscribe({next:e=>{let o=new Blob([e],{type:"application/yaml"}),l=URL.createObjectURL(o),c=document.createElement("a");c.href=l,c.download=`${this.existingConfig?.name??"agent"}.yaml`,c.click(),URL.revokeObjectURL(l),this.isExporting.set(!1)},error:()=>this.isExporting.set(!1)}))}cancel(){this.navigateBack()}navigateBack(){this.isPlatformMode?this.router.navigate(["/agentos","admin","agent-configs"]):this.router.navigate(["/agentos",this.namespaceId,"agent-configs"])}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=V({type:r,selectors:[["agentos-agent-config-form"]],decls:12,vars:4,consts:[[1,"agent-config-form"],[1,"agent-config-form__header"],["type","button","title","Back to agent configs",1,"agent-config-form__back",3,"click"],[1,"agent-config-form__back-icon"],[1,"agent-config-form__title"],[1,"agent-config-form__sibling-link",3,"routerLink"],[1,"agent-config-form__platform-badge"],[1,"agent-config-form__loading"],[1,"agent-config-form__form",3,"formGroup"],[1,"agent-config-form__form",3,"ngSubmit","formGroup"],[1,"agent-config-form__field"],["for","agent-config-name",1,"agent-config-form__label"],["aria-hidden","true"],["id","agent-config-name","type","text","placeholder","e.g. Support agent","autocomplete","off",1,"agent-config-form__input",3,"formControl"],["for","agent-config-description",1,"agent-config-form__label"],["id","agent-config-description","type","text","placeholder","Optional \u2014 short description of this agent","autocomplete","off",1,"agent-config-form__input",3,"formControl"],["for","agent-config-model-name",1,"agent-config-form__label"],["id","agent-config-model-name","type","text","placeholder","Optional \u2014 model alias or name to use","autocomplete","off",1,"agent-config-form__input",3,"formControl"],["for","agent-config-instructions",1,"agent-config-form__label"],["id","agent-config-instructions","rows","6","placeholder","Optional \u2014 system instructions for this agent",1,"agent-config-form__textarea",3,"formControl"],[1,"agent-config-form__integrations"],[1,"agent-config-form__toggle-label"],["type","checkbox",1,"agent-config-form__toggle-checkbox",3,"formControl"],[1,"agent-config-form__toggle-text"],[1,"agent-config-form__toggle-hint"],[1,"agent-config-form__label"],[1,"agent-config-form__field-hint"],[1,"agent-config-form__code"],[1,"agent-config-form__sub-agent-list"],[1,"agent-config-form__sub-agent-add"],["type","text","placeholder","e.g. *Fixer or *","autocomplete","off",1,"agent-config-form__input","agent-config-form__sub-agent-input",3,"keydown.enter","formControl"],["type","button","title","Add pattern",1,"agent-config-form__sub-agent-btn","agent-config-form__sub-agent-btn--add",3,"click","disabled"],[1,"agent-config-form__actions"],["type","submit",1,"agent-config-form__btn","agent-config-form__btn--primary",3,"disabled"],["type","button",1,"agent-config-form__btn","agent-config-form__btn--export",3,"disabled"],["type","button",1,"agent-config-form__btn",3,"click"],[1,"agent-config-form__integrations-hint"],[1,"agent-config-form__integration-row"],[1,"agent-config-form__integration-toggle"],["type","checkbox",1,"agent-config-form__integration-checkbox",3,"change","checked"],[1,"agent-config-form__integration-name"],[1,"agent-config-form__integration-type"],["type","text","placeholder","Tool names, comma-separated (empty = all tools)","autocomplete","off",1,"agent-config-form__input","agent-config-form__integration-tools",3,"formControl"],[1,"agent-config-form__integrations-separator"],[1,"agent-config-form__integration-state",3,"change","id","value"],["value","default"],["value","on"],["value","off"],[1,"agent-config-form__integration-restriction"],[1,"agent-config-form__integration-builtin-desc"],[1,"agent-config-form__sub-agent-row"],["type","text","autocomplete","off",1,"agent-config-form__input","agent-config-form__sub-agent-input",3,"formControl"],["type","button","title","Remove",1,"agent-config-form__sub-agent-btn","agent-config-form__sub-agent-btn--danger",3,"click"],["type","button",1,"agent-config-form__btn","agent-config-form__btn--export",3,"click","disabled"]],template:function(e,o){e&1&&(i(0,"div",0)(1,"header",1)(2,"button",2),b("click",function(){return o.cancel()}),i(3,"span",3),a(4,"\u2190"),n(),a(5," Agent Configs "),n(),i(6,"h1",4),a(7),n(),f(8,le,2,1,"a",5),f(9,ge,2,0,"span",6),n(),f(10,ce,2,0,"p",7)(11,he,59,14,"form",8),n()),e&2&&(g(7),y(o.isEditMode()?"Edit agent config":"New agent config"),g(),p(o.isEditMode()?8:-1),g(),p(o.isPlatformMode?9:-1),g(),p(o.isLoading()?10:11))},dependencies:[ne,Q,ee,te,q,Y,J,H,X,Z,j],styles:[".agent-config-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2rem;max-width:560px;margin:0 auto;padding:2rem 1rem}.agent-config-form__header[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.5rem}.agent-config-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)}.agent-config-form__back[_ngcontent-%COMP%]:hover{text-decoration:underline}.agent-config-form__back-icon[_ngcontent-%COMP%]{font-size:1rem;line-height:1}.agent-config-form__title[_ngcontent-%COMP%]{margin:0;font-size:1.5rem;font-weight:700;color:var(--color-text);letter-spacing:-.02em}.agent-config-form__sibling-link[_ngcontent-%COMP%]{font-size:.8125rem;color:var(--color-accent);text-decoration:none}.agent-config-form__sibling-link[_ngcontent-%COMP%]:hover{text-decoration:underline}.agent-config-form__platform-badge[_ngcontent-%COMP%]{display:inline-block;font-size:.75rem;font-weight:500;color:var(--color-text-secondary);background:var(--color-surface);border:1px solid var(--color-divider);border-radius:0;padding:.125rem .5rem;letter-spacing:.02em;align-self:flex-start}.agent-config-form__loading[_ngcontent-%COMP%]{color:var(--color-text-secondary);font-size:.9rem;margin:0}.agent-config-form__form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:1.25rem}.agent-config-form__field[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.375rem}.agent-config-form__label[_ngcontent-%COMP%]{font-size:.875rem;font-weight:500;color:var(--color-text)}.agent-config-form__input[_ngcontent-%COMP%], .agent-config-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}.agent-config-form__input[_ngcontent-%COMP%]:focus, .agent-config-form__textarea[_ngcontent-%COMP%]:focus{border-color:var(--color-accent)}.agent-config-form__input[_ngcontent-%COMP%]::placeholder, .agent-config-form__textarea[_ngcontent-%COMP%]::placeholder{color:var(--color-neutral-500)}.agent-config-form__textarea[_ngcontent-%COMP%]{resize:vertical;min-height:120px;line-height:1.5}.agent-config-form__integrations[_ngcontent-%COMP%]{border:1px solid var(--color-divider);border-radius:0;padding:1rem;margin:0;display:flex;flex-direction:column;gap:.75rem}.agent-config-form__integrations-hint[_ngcontent-%COMP%]{margin:0;font-size:.8rem;color:var(--color-text-secondary);line-height:1.4}.agent-config-form__integration-row[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.375rem}.agent-config-form__integration-toggle[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;cursor:pointer;-webkit-user-select:none;user-select:none}.agent-config-form__integration-checkbox[_ngcontent-%COMP%]{width:1rem;height:1rem;flex-shrink:0;accent-color:var(--color-accent);cursor:pointer}.agent-config-form__integration-name[_ngcontent-%COMP%]{font-size:.9rem;font-weight:500;color:var(--color-text)}.agent-config-form__integration-type[_ngcontent-%COMP%]{font-size:.75rem;color:var(--color-text-secondary);font-family:monospace}.agent-config-form__integration-tools[_ngcontent-%COMP%]{margin-left:1.5rem;font-size:.875rem}.agent-config-form__integrations-separator[_ngcontent-%COMP%]{margin:.25rem 0 0;padding-top:.5rem;border-top:1px solid var(--color-divider);font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.12em;color:var(--color-neutral-500);font-family:var(--font-heading)}.agent-config-form__integration-state[_ngcontent-%COMP%]{margin-left:1.5rem;padding:.375rem .625rem;border-radius:8px;border:1px solid var(--color-border, rgba(0, 0, 0, .1));background:transparent;color:var(--color-text, #1d1d1f);font-size:.875rem;font-family:inherit;outline:none;transition:border-color .15s ease}.agent-config-form__integration-state[_ngcontent-%COMP%]:focus{border-color:var(--color-primary, #007aff)}.agent-config-form__integration-restriction[_ngcontent-%COMP%]{margin:0 0 0 1.5rem;font-size:.8rem;font-style:italic;color:var(--color-text-secondary, #6e6e73);line-height:1.4}.agent-config-form__integration-builtin-desc[_ngcontent-%COMP%]{margin:0 0 0 1.5rem;font-size:.8rem;color:var(--color-text-secondary);line-height:1.4}.agent-config-form__field-hint[_ngcontent-%COMP%]{margin:.25rem 0 0;font-size:.8rem;color:var(--color-text-secondary);line-height:1.4}.agent-config-form__code[_ngcontent-%COMP%]{font-family:monospace;font-size:.85em;background:var(--color-surface-muted, rgba(0, 0, 0, .06));padding:.1em .3em;border-radius:0}.agent-config-form__sub-agent-list[_ngcontent-%COMP%]{list-style:none;margin:.5rem 0 0;padding:0;display:flex;flex-direction:column;gap:.375rem}.agent-config-form__sub-agent-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.375rem}.agent-config-form__sub-agent-input[_ngcontent-%COMP%]{flex:1;min-width:0}.agent-config-form__sub-agent-add[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.375rem;margin-top:.5rem}.agent-config-form__sub-agent-btn[_ngcontent-%COMP%]{flex-shrink:0;width:2rem;height:2rem;padding:0;border-radius:0;border:1px solid var(--color-divider);background:transparent;color:var(--color-text-secondary);font-size:.9rem;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .15s ease,border-color .15s ease,color .15s ease}.agent-config-form__sub-agent-btn[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-bg-hover);border-color:var(--color-neutral-500);color:var(--color-text)}.agent-config-form__sub-agent-btn[_ngcontent-%COMP%]:disabled{opacity:.35;cursor:not-allowed}.agent-config-form__sub-agent-btn--add[_ngcontent-%COMP%]{width:2rem;height:2rem;font-size:1.25rem;font-weight:300;border-color:var(--color-accent);color:var(--color-accent)}.agent-config-form__sub-agent-btn--add[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-accent);color:#fff}.agent-config-form__sub-agent-btn--danger[_ngcontent-%COMP%]{border:1px solid transparent;color:var(--color-neutral-500)}.agent-config-form__sub-agent-btn--danger[_ngcontent-%COMP%]:hover:not(:disabled){border-color:var(--red);color:var(--red);background:color-mix(in srgb,var(--red) 10%,transparent)}.agent-config-form__toggle-label[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;cursor:pointer;-webkit-user-select:none;user-select:none}.agent-config-form__toggle-checkbox[_ngcontent-%COMP%]{width:1rem;height:1rem;flex-shrink:0;accent-color:var(--color-accent);cursor:pointer}.agent-config-form__toggle-text[_ngcontent-%COMP%]{font-size:.9rem;font-weight:500;color:var(--color-text)}.agent-config-form__toggle-hint[_ngcontent-%COMP%]{margin:.25rem 0 0 1.5rem;font-size:.8rem;color:var(--color-text-secondary);line-height:1.4}.agent-config-form__actions[_ngcontent-%COMP%]{display:flex;gap:.75rem;padding-top:.5rem}.agent-config-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}.agent-config-form__btn[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-bg-hover);border-color:var(--color-neutral-500)}.agent-config-form__btn[_ngcontent-%COMP%]:disabled{opacity:.45;cursor:not-allowed}.agent-config-form__btn--primary[_ngcontent-%COMP%]{background:var(--color-accent);border-color:var(--color-accent);color:#fff}.agent-config-form__btn--primary[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-accent-700);border-color:var(--color-accent-700)}"],changeDetection:0})};export{ie as AgentConfigFormComponent};
1
+ import{a as oe}from"./chunk-ADEIEQGJ.js";import"./chunk-NWFFZ2FW.js";import"./chunk-VZOBZ3DD.js";import{b as G,i as U,w as W}from"./chunk-UQTA3ACH.js";import{a as L,c as $,d as j}from"./chunk-6XX7GME4.js";import{a as S}from"./chunk-VMYKE4ZC.js";import{F as ne,b as Y,c as q,e as P,g as J,h as H,i as K,l as _,n as Q,s as X,w as Z,y as ee,z as te}from"./chunk-7OGOI6WM.js";import{Bb as w,D as N,Db as b,Fb as s,Ka as g,Tb as a,Ub as y,Vb as E,Wa as V,a as R,b as T,ca as v,ga as C,ha as x,jb as B,lb as f,m as I,ma as D,mb as p,nb as z,pb as A,qb as M,rb as d,sb as i,t as F,ta as u,tb as n,ub as h,z as O}from"./chunk-CHEXA6RY.js";var re=(r,t)=>t.config.id,ae=(r,t)=>t.type;function le(r,t){if(r&1&&(i(0,"a",5),a(1,"View resolved definition \u2192"),n()),r&2){let e=s();d("routerLink",e.inspectRoute())}}function ge(r,t){r&1&&(i(0,"span",6),a(1,"Platform level"),n())}function ce(r,t){r&1&&(i(0,"p",7),a(1,"Loading\u2026"),n())}function se(r,t){if(r&1&&(i(0,"span",41),a(1),n()),r&2){let e=s().$implicit;g(),y(e.config.integrationType)}}function de(r,t){if(r&1&&h(0,"input",42),r&2){let e=s().$implicit;d("formControl",e.toolsControl)}}function me(r,t){if(r&1){let e=w();i(0,"div",37)(1,"label",38)(2,"input",39),b("change",function(){let l=C(e).$implicit,c=s(3);return x(c.toggleIntegration(l))}),n(),i(3,"span",40),a(4),n(),f(5,se,2,1,"span",41),n(),f(6,de,1,1,"input",42),n()}if(r&2){let e=t.$implicit;g(2),d("checked",e.enabled()),g(2),y(e.config.name),g(),p(e.config.integrationType?5:-1),g(),p(e.enabled()?6:-1)}}function fe(r,t){if(r&1&&(i(0,"p",48),a(1),n()),r&2){let e=s().$implicit;g(),E(" Restricted to: ",e.restrictedTools.join(", ")," (set outside this form, preserved on save) ")}}function pe(r,t){if(r&1){let e=w();i(0,"div",37)(1,"label",38)(2,"span",40),a(3),n(),i(4,"span",41),a(5,"built-in"),n()(),i(6,"select",44),b("change",function(l){let c=C(e).$implicit,m=s(4);return x(m.setBuiltInState(c,l.target.value))}),i(7,"option",45),a(8),n(),i(9,"option",46),a(10,"Enabled"),n(),i(11,"option",47),a(12,"Disabled"),n()(),f(13,fe,2,1,"p",48),i(14,"p",49),a(15),n()()}if(r&2){let e=t.$implicit,o=s(4);g(),B("for","built-in-"+e.type),g(2),y(e.displayName),g(3),d("id","built-in-"+e.type)("value",e.state()),g(2),y(o.builtInDefaultLabel(e)),g(5),p(e.state()==="on"&&e.restrictedTools?13:-1),g(2),y(e.description)}}function _e(r,t){if(r&1&&(i(0,"p",43),a(1,"Built-in integrations"),n(),A(2,pe,16,7,"div",37,ae)),r&2){let e=s(3);g(2),M(e.builtInRows())}}function ue(r,t){if(r&1&&(i(0,"fieldset",20)(1,"legend",25),a(2,"Integrations"),n(),i(3,"p",36),a(4," Select which integrations this agent can use. Leave tool names empty to allow all tools from an integration. "),n(),A(5,me,7,4,"div",37,re),f(7,_e,4,0),n()),r&2){let e=s(2);g(5),M(e.integrationRows()),g(2),p(e.builtInRows().length>0?7:-1)}}function be(r,t){if(r&1){let e=w();i(0,"li",50),h(1,"input",51),i(2,"button",52),b("click",function(){let l=C(e).$implicit,c=s(3);return x(c.removeSubAgent(l))}),a(3," \u{1F5D1} "),n()()}if(r&2){let e=t.$implicit;g(),d("formControl",e.control)}}function Ce(r,t){if(r&1&&(i(0,"ul",28),A(1,be,4,1,"li",50,z),n()),r&2){let e=s(2);g(),M(e.subAgentRows())}}function xe(r,t){if(r&1){let e=w();i(0,"button",53),b("click",function(){C(e);let l=s(2);return x(l.exportYaml())}),a(1),n()}if(r&2){let e=s(2);d("disabled",e.isExporting()),g(),E(" ",e.isExporting()?"Exporting\u2026":"Export as YAML"," ")}}function he(r,t){if(r&1){let e=w();i(0,"form",9),b("ngSubmit",function(){C(e);let l=s();return x(l.submit())}),i(1,"div",10)(2,"label",11),a(3,"Name "),i(4,"span",12),a(5,"*"),n()(),h(6,"input",13),n(),i(7,"div",10)(8,"label",14),a(9,"Description"),n(),h(10,"input",15),n(),i(11,"div",10)(12,"label",16),a(13,"Model name"),n(),h(14,"input",17),n(),i(15,"div",10)(16,"label",18),a(17,"Instructions"),n(),h(18,"textarea",19),n(),f(19,ue,8,1,"fieldset",20),i(20,"div",10)(21,"label",21),h(22,"input",22),i(23,"span",23),a(24,"Advanced mode"),n()(),i(25,"p",24),a(26," When enabled, this agent uses a multi-step reasoning loop instead of a single LLM call. "),n()(),i(27,"div",10)(28,"label",21),h(29,"input",22),i(30,"span",23),a(31,"Enabled"),n()(),i(32,"p",24),a(33,"Disabled agents are excluded from namespace resolution."),n()(),i(34,"div",10)(35,"span",25),a(36,"Sub-agents"),n(),i(37,"p",26),a(38," Glob patterns for agents this agent may delegate to. "),i(39,"code",27),a(40,"*"),n(),a(41," matches any sequence of characters (e.g.\xA0"),i(42,"code",27),a(43,"*Fixer"),n(),a(44,", "),i(45,"code",27),a(46,"*"),n(),a(47," for all). Leave empty to disable delegation. "),n(),f(48,Ce,3,0,"ul",28),i(49,"div",29)(50,"input",30),b("keydown.enter",function(){C(e);let l=s();return x(l.addSubAgent())}),n(),i(51,"button",31),b("click",function(){C(e);let l=s();return x(l.addSubAgent())}),a(52," + "),n()()(),i(53,"div",32)(54,"button",33),a(55),n(),f(56,xe,2,2,"button",34),i(57,"button",35),b("click",function(){C(e);let l=s();return x(l.cancel())}),a(58,"Cancel"),n()()()}if(r&2){let e=s();d("formGroup",e.form),g(6),d("formControl",e.nameControl),g(4),d("formControl",e.descriptionControl),g(4),d("formControl",e.modelNameControl),g(4),d("formControl",e.instructionsControl),g(),p(e.integrationRows().length>0||e.builtInRows().length>0?19:-1),g(3),d("formControl",e.advancedExecutionControl),g(7),d("formControl",e.enabledControl),g(19),p(e.subAgentRows().length>0?48:-1),g(2),d("formControl",e.newSubAgentControl),g(),d("disabled",!e.newSubAgentControl.value.trim()),g(3),d("disabled",e.form.invalid||e.isSubmitting()),g(),E(" ",e.isEditMode()?"Save changes":"Create"," "),g(),p(e.isEditMode()?56:-1)}}var ie=class r{route=v(L);router=v($);destroyRef=v(D);agentConfigController=v(G);exportService=v(W);integrationConfigState=v(oe);integrationTypeController=v(U);namespaceId=this.route.snapshot.params.namespaceId;isPlatformMode=!this.namespaceId;form=new K({name:new _("",{nonNullable:!0,validators:[P.required,P.minLength(1)]}),description:new _(null),modelName:new _(null),instructions:new _(null),advancedExecution:new _(!1,{nonNullable:!0}),enabled:new _(!1,{nonNullable:!0})});get nameControl(){return this.form.controls.name}get descriptionControl(){return this.form.controls.description}get modelNameControl(){return this.form.controls.modelName}get instructionsControl(){return this.form.controls.instructions}get advancedExecutionControl(){return this.form.controls.advancedExecution}get enabledControl(){return this.form.controls.enabled}subAgentRows=u([]);newSubAgentControl=new _("",{nonNullable:!0});isEditMode=u(!1);isSubmitting=u(!1);isLoading=u(!1);isExporting=u(!1);builtInRows=u([]);inspectRoute(){let t=this.route.snapshot.paramMap.get("agentConfigId")??"";return this.isPlatformMode?["/agentos","admin","agent-configs",t,"inspect"]:["/agentos",this.namespaceId,"agent-configs",t,"inspect"]}integrationRows=u([]);existingConfig=null;ngOnInit(){let t=this.route.snapshot.paramMap.get("agentConfigId");t?(this.isEditMode.set(!0),this.loadConfigAndIntegrations(t)):this.loadIntegrations(void 0)}loadConfigAndIntegrations(t){this.isLoading.set(!0),O({config:this.agentConfigController.getByIdAgentConfig(t),namespaceIntegrations:this.namespaceId?this.integrationConfigState.loadNamespaceConfigs(this.namespaceId):I([]),platformIntegrations:this.integrationConfigState.loadPlatformConfigs(),builtInTypes:this.loadBuiltInTypes()}).pipe(S(this.destroyRef)).subscribe({next:({config:e,namespaceIntegrations:o,platformIntegrations:l,builtInTypes:c})=>{this.existingConfig=e,this.nameControl.setValue(e.name),this.descriptionControl.setValue(e.description??null),this.modelNameControl.setValue(e.modelName??null),this.instructionsControl.setValue(e.instructions??null),this.advancedExecutionControl.setValue(e.advancedExecution??!1),this.enabledControl.setValue(e.enabled??!0);let m=[...l,...o];this.integrationRows.set(this.buildIntegrationRows(m,e.integrations??void 0)),this.builtInRows.set(this.buildBuiltInRows(c,e.integrations??void 0)),this.subAgentRows.set((e.subAgents??[]).map(k=>({control:new _(k,{nonNullable:!0})}))),this.isLoading.set(!1)},error:()=>{this.isLoading.set(!1),this.navigateBack()}})}loadIntegrations(t){O({namespaceIntegrations:this.namespaceId?this.integrationConfigState.loadNamespaceConfigs(this.namespaceId):I([]),platformIntegrations:this.integrationConfigState.loadPlatformConfigs(),builtInTypes:this.loadBuiltInTypes()}).pipe(S(this.destroyRef)).subscribe({next:({namespaceIntegrations:e,platformIntegrations:o,builtInTypes:l})=>{let c=[...o,...e];this.integrationRows.set(this.buildIntegrationRows(c,t??void 0)),this.builtInRows.set(this.buildBuiltInRows(l,t??void 0))}})}loadBuiltInTypes(){return this.integrationTypeController.listTypesIntegrationType().pipe(F(t=>t.filter(e=>!e.configSchema)),N(t=>(console.error("[agent-config-form] failed to load integration types",t),I([]))))}buildIntegrationRows(t,e){return t.map(o=>{let l=o.name??"",c=e?.[l],m=e!=null&&l in e,k=Array.isArray(c)?c.join(", "):"";return{config:o,enabled:u(m),toolsControl:new _(k,{nonNullable:!0})}})}buildBuiltInRows(t,e){return t.map(o=>{let l=e!=null&&o.type in e,c=e?.[o.type],m=l?Array.isArray(c)&&c.length===0?"off":"on":"default";return{type:o.type,displayName:o.displayName,description:o.description,enabledByDefault:o.enabledByDefault===!0,state:u(m),restrictedTools:Array.isArray(c)&&c.length>0?c:null}})}toggleIntegration(t){t.enabled.update(e=>!e)}setBuiltInState(t,e){t.state.set(e)}builtInDefaultLabel(t){return t.enabledByDefault?"Platform default (enabled)":"Platform default (disabled)"}addSubAgent(){let t=this.newSubAgentControl.value.trim();t&&(this.subAgentRows.update(e=>[...e,{control:new _(t,{nonNullable:!0})}]),this.newSubAgentControl.reset(""))}removeSubAgent(t){this.subAgentRows.update(e=>e.filter(o=>o!==t))}buildSubAgentsPayload(){let t=this.subAgentRows().map(e=>e.control.value.trim()).filter(e=>e.length>0);return t.length>0?t:void 0}buildIntegrationsPayload(){let t={};for(let o of this.integrationRows().filter(l=>l.enabled())){let l=o.config.name??"",c=o.toolsControl.value.trim();t[l]=c===""?null:c.split(",").map(m=>m.trim()).filter(m=>m.length>0)}for(let o of this.builtInRows()){let l=o.state();l==="on"?t[o.type]=o.restrictedTools??null:l==="off"&&(t[o.type]=[])}let e=new Set([...this.integrationRows().map(o=>o.config.name??""),...this.builtInRows().map(o=>o.type)]);for(let[o,l]of Object.entries(this.existingConfig?.integrations??{}))e.has(o)||(t[o]=l);return Object.keys(t).length>0?t:void 0}submit(){if(this.form.invalid||this.isSubmitting())return;this.addSubAgent(),this.isSubmitting.set(!0);let t=T(R({},this.existingConfig??{}),{createdOn:this.existingConfig?.createdOn,updatedOn:this.existingConfig?.updatedOn,namespaceId:this.namespaceId,name:this.nameControl.value.trim(),description:this.descriptionControl.value?.trim()||void 0,modelName:this.modelNameControl.value?.trim()||void 0,instructions:this.instructionsControl.value?.trim()||void 0,integrations:this.buildIntegrationsPayload(),advancedExecution:this.advancedExecutionControl.value,enabled:this.enabledControl.value,subAgents:this.buildSubAgentsPayload()});(this.isEditMode()?this.agentConfigController.updateAgentConfig(this.existingConfig.id??"",t):this.agentConfigController.createAgentConfig(t)).pipe(S(this.destroyRef)).subscribe({next:()=>this.navigateBack(),error:()=>this.isSubmitting.set(!1)})}exportYaml(){let t=this.existingConfig?.id;!t||this.isExporting()||(this.isExporting.set(!0),this.exportService.exportAsYaml(t).pipe(S(this.destroyRef)).subscribe({next:e=>{let o=new Blob([e],{type:"application/yaml"}),l=URL.createObjectURL(o),c=document.createElement("a");c.href=l,c.download=`${this.existingConfig?.name??"agent"}.yaml`,c.click(),URL.revokeObjectURL(l),this.isExporting.set(!1)},error:()=>this.isExporting.set(!1)}))}cancel(){this.navigateBack()}navigateBack(){this.isPlatformMode?this.router.navigate(["/agentos","admin","agent-configs"]):this.router.navigate(["/agentos",this.namespaceId,"agent-configs"])}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=V({type:r,selectors:[["agentos-agent-config-form"]],decls:12,vars:4,consts:[[1,"agent-config-form"],[1,"agent-config-form__header"],["type","button","title","Back to agent configs",1,"agent-config-form__back",3,"click"],[1,"agent-config-form__back-icon"],[1,"agent-config-form__title"],[1,"agent-config-form__sibling-link",3,"routerLink"],[1,"agent-config-form__platform-badge"],[1,"agent-config-form__loading"],[1,"agent-config-form__form",3,"formGroup"],[1,"agent-config-form__form",3,"ngSubmit","formGroup"],[1,"agent-config-form__field"],["for","agent-config-name",1,"agent-config-form__label"],["aria-hidden","true"],["id","agent-config-name","type","text","placeholder","e.g. Support agent","autocomplete","off",1,"agent-config-form__input",3,"formControl"],["for","agent-config-description",1,"agent-config-form__label"],["id","agent-config-description","type","text","placeholder","Optional \u2014 short description of this agent","autocomplete","off",1,"agent-config-form__input",3,"formControl"],["for","agent-config-model-name",1,"agent-config-form__label"],["id","agent-config-model-name","type","text","placeholder","Optional \u2014 model alias or name to use","autocomplete","off",1,"agent-config-form__input",3,"formControl"],["for","agent-config-instructions",1,"agent-config-form__label"],["id","agent-config-instructions","rows","6","placeholder","Optional \u2014 system instructions for this agent",1,"agent-config-form__textarea",3,"formControl"],[1,"agent-config-form__integrations"],[1,"agent-config-form__toggle-label"],["type","checkbox",1,"agent-config-form__toggle-checkbox",3,"formControl"],[1,"agent-config-form__toggle-text"],[1,"agent-config-form__toggle-hint"],[1,"agent-config-form__label"],[1,"agent-config-form__field-hint"],[1,"agent-config-form__code"],[1,"agent-config-form__sub-agent-list"],[1,"agent-config-form__sub-agent-add"],["type","text","placeholder","e.g. *Fixer or *","autocomplete","off",1,"agent-config-form__input","agent-config-form__sub-agent-input",3,"keydown.enter","formControl"],["type","button","title","Add pattern",1,"agent-config-form__sub-agent-btn","agent-config-form__sub-agent-btn--add",3,"click","disabled"],[1,"agent-config-form__actions"],["type","submit",1,"agent-config-form__btn","agent-config-form__btn--primary",3,"disabled"],["type","button",1,"agent-config-form__btn","agent-config-form__btn--export",3,"disabled"],["type","button",1,"agent-config-form__btn",3,"click"],[1,"agent-config-form__integrations-hint"],[1,"agent-config-form__integration-row"],[1,"agent-config-form__integration-toggle"],["type","checkbox",1,"agent-config-form__integration-checkbox",3,"change","checked"],[1,"agent-config-form__integration-name"],[1,"agent-config-form__integration-type"],["type","text","placeholder","Tool names, comma-separated (empty = all tools)","autocomplete","off",1,"agent-config-form__input","agent-config-form__integration-tools",3,"formControl"],[1,"agent-config-form__integrations-separator"],[1,"agent-config-form__integration-state",3,"change","id","value"],["value","default"],["value","on"],["value","off"],[1,"agent-config-form__integration-restriction"],[1,"agent-config-form__integration-builtin-desc"],[1,"agent-config-form__sub-agent-row"],["type","text","autocomplete","off",1,"agent-config-form__input","agent-config-form__sub-agent-input",3,"formControl"],["type","button","title","Remove",1,"agent-config-form__sub-agent-btn","agent-config-form__sub-agent-btn--danger",3,"click"],["type","button",1,"agent-config-form__btn","agent-config-form__btn--export",3,"click","disabled"]],template:function(e,o){e&1&&(i(0,"div",0)(1,"header",1)(2,"button",2),b("click",function(){return o.cancel()}),i(3,"span",3),a(4,"\u2190"),n(),a(5," Agent Configs "),n(),i(6,"h1",4),a(7),n(),f(8,le,2,1,"a",5),f(9,ge,2,0,"span",6),n(),f(10,ce,2,0,"p",7)(11,he,59,14,"form",8),n()),e&2&&(g(7),y(o.isEditMode()?"Edit agent config":"New agent config"),g(),p(o.isEditMode()?8:-1),g(),p(o.isPlatformMode?9:-1),g(),p(o.isLoading()?10:11))},dependencies:[ne,Q,ee,te,q,Y,J,H,X,Z,j],styles:[".agent-config-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2rem;max-width:560px;margin:0 auto;padding:2rem 1rem}.agent-config-form__header[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.5rem}.agent-config-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)}.agent-config-form__back[_ngcontent-%COMP%]:hover{text-decoration:underline}.agent-config-form__back-icon[_ngcontent-%COMP%]{font-size:1rem;line-height:1}.agent-config-form__title[_ngcontent-%COMP%]{margin:0;font-size:1.5rem;font-weight:700;color:var(--color-text);letter-spacing:-.02em}.agent-config-form__sibling-link[_ngcontent-%COMP%]{font-size:.8125rem;color:var(--color-accent);text-decoration:none}.agent-config-form__sibling-link[_ngcontent-%COMP%]:hover{text-decoration:underline}.agent-config-form__platform-badge[_ngcontent-%COMP%]{display:inline-block;font-size:.75rem;font-weight:500;color:var(--color-text-secondary);background:var(--color-surface);border:1px solid var(--color-divider);border-radius:0;padding:.125rem .5rem;letter-spacing:.02em;align-self:flex-start}.agent-config-form__loading[_ngcontent-%COMP%]{color:var(--color-text-secondary);font-size:.9rem;margin:0}.agent-config-form__form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:1.25rem}.agent-config-form__field[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.375rem}.agent-config-form__label[_ngcontent-%COMP%]{font-size:.875rem;font-weight:500;color:var(--color-text)}.agent-config-form__input[_ngcontent-%COMP%], .agent-config-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}.agent-config-form__input[_ngcontent-%COMP%]:focus, .agent-config-form__textarea[_ngcontent-%COMP%]:focus{border-color:var(--color-accent)}.agent-config-form__input[_ngcontent-%COMP%]::placeholder, .agent-config-form__textarea[_ngcontent-%COMP%]::placeholder{color:var(--color-neutral-500)}.agent-config-form__textarea[_ngcontent-%COMP%]{resize:vertical;min-height:120px;line-height:1.5}.agent-config-form__integrations[_ngcontent-%COMP%]{border:1px solid var(--color-divider);border-radius:0;padding:1rem;margin:0;display:flex;flex-direction:column;gap:.75rem}.agent-config-form__integrations-hint[_ngcontent-%COMP%]{margin:0;font-size:.8rem;color:var(--color-text-secondary);line-height:1.4}.agent-config-form__integration-row[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.375rem}.agent-config-form__integration-toggle[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;cursor:pointer;-webkit-user-select:none;user-select:none}.agent-config-form__integration-checkbox[_ngcontent-%COMP%]{width:1rem;height:1rem;flex-shrink:0;accent-color:var(--color-accent);cursor:pointer}.agent-config-form__integration-name[_ngcontent-%COMP%]{font-size:.9rem;font-weight:500;color:var(--color-text)}.agent-config-form__integration-type[_ngcontent-%COMP%]{font-size:.75rem;color:var(--color-text-secondary);font-family:monospace}.agent-config-form__integration-tools[_ngcontent-%COMP%]{margin-left:1.5rem;font-size:.875rem}.agent-config-form__integrations-separator[_ngcontent-%COMP%]{margin:.25rem 0 0;padding-top:.5rem;border-top:1px solid var(--color-divider);font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.12em;color:var(--color-neutral-500);font-family:var(--font-heading)}.agent-config-form__integration-state[_ngcontent-%COMP%]{margin-left:1.5rem;padding:.375rem .625rem;border-radius:8px;border:1px solid var(--color-border, rgba(0, 0, 0, .1));background:transparent;color:var(--color-text, #1d1d1f);font-size:.875rem;font-family:inherit;outline:none;transition:border-color .15s ease}.agent-config-form__integration-state[_ngcontent-%COMP%]:focus{border-color:var(--color-primary, #007aff)}.agent-config-form__integration-restriction[_ngcontent-%COMP%]{margin:0 0 0 1.5rem;font-size:.8rem;font-style:italic;color:var(--color-text-secondary, #6e6e73);line-height:1.4}.agent-config-form__integration-builtin-desc[_ngcontent-%COMP%]{margin:0 0 0 1.5rem;font-size:.8rem;color:var(--color-text-secondary);line-height:1.4}.agent-config-form__field-hint[_ngcontent-%COMP%]{margin:.25rem 0 0;font-size:.8rem;color:var(--color-text-secondary);line-height:1.4}.agent-config-form__code[_ngcontent-%COMP%]{font-family:monospace;font-size:.85em;background:var(--color-surface-muted, rgba(0, 0, 0, .06));padding:.1em .3em;border-radius:0}.agent-config-form__sub-agent-list[_ngcontent-%COMP%]{list-style:none;margin:.5rem 0 0;padding:0;display:flex;flex-direction:column;gap:.375rem}.agent-config-form__sub-agent-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.375rem}.agent-config-form__sub-agent-input[_ngcontent-%COMP%]{flex:1;min-width:0}.agent-config-form__sub-agent-add[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.375rem;margin-top:.5rem}.agent-config-form__sub-agent-btn[_ngcontent-%COMP%]{flex-shrink:0;width:2rem;height:2rem;padding:0;border-radius:0;border:1px solid var(--color-divider);background:transparent;color:var(--color-text-secondary);font-size:.9rem;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .15s ease,border-color .15s ease,color .15s ease}.agent-config-form__sub-agent-btn[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-bg-hover);border-color:var(--color-neutral-500);color:var(--color-text)}.agent-config-form__sub-agent-btn[_ngcontent-%COMP%]:disabled{opacity:.35;cursor:not-allowed}.agent-config-form__sub-agent-btn--add[_ngcontent-%COMP%]{width:2rem;height:2rem;font-size:1.25rem;font-weight:300;border-color:var(--color-accent);color:var(--color-accent)}.agent-config-form__sub-agent-btn--add[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-accent);color:#fff}.agent-config-form__sub-agent-btn--danger[_ngcontent-%COMP%]{border:1px solid transparent;color:var(--color-neutral-500)}.agent-config-form__sub-agent-btn--danger[_ngcontent-%COMP%]:hover:not(:disabled){border-color:var(--red);color:var(--red);background:color-mix(in srgb,var(--red) 10%,transparent)}.agent-config-form__toggle-label[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;cursor:pointer;-webkit-user-select:none;user-select:none}.agent-config-form__toggle-checkbox[_ngcontent-%COMP%]{width:1rem;height:1rem;flex-shrink:0;accent-color:var(--color-accent);cursor:pointer}.agent-config-form__toggle-text[_ngcontent-%COMP%]{font-size:.9rem;font-weight:500;color:var(--color-text)}.agent-config-form__toggle-hint[_ngcontent-%COMP%]{margin:.25rem 0 0 1.5rem;font-size:.8rem;color:var(--color-text-secondary);line-height:1.4}.agent-config-form__actions[_ngcontent-%COMP%]{display:flex;gap:.75rem;padding-top:.5rem}.agent-config-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}.agent-config-form__btn[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-bg-hover);border-color:var(--color-neutral-500)}.agent-config-form__btn[_ngcontent-%COMP%]:disabled{opacity:.45;cursor:not-allowed}.agent-config-form__btn--primary[_ngcontent-%COMP%]{background:var(--color-accent);border-color:var(--color-accent);color:#fff}.agent-config-form__btn--primary[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-accent-700);border-color:var(--color-accent-700)}"],changeDetection:0})};export{ie as AgentConfigFormComponent};
@@ -1 +1 @@
1
- import{a as h}from"./chunk-MQEDNZF7.js";import{k as b}from"./chunk-BLRBIAYK.js";import{b as u}from"./chunk-VMYKE4ZC.js";import{D as p,P as f,S as m,Z as l,ca as a,m as r,t as c}from"./chunk-CHEXA6RY.js";var v=class i{userState=a(h);permissions=a(b);currentUser$=u(this.userState.currentUser);cache=new Map;isAdminOfNamespace$(e){if(!e)return r(!1);let t=this.cache.get(e);if(t)return t;let o=this.currentUser$.pipe(m(s=>s?s.isAdmin?r(!0):this.permissions.listNamespaceUsers(e).pipe(c(d=>d.some(n=>n.id===s.id&&n.role==="ADMIN")),p(()=>r(!1))):r(!1)),f({bufferSize:1,refCount:!1}));return this.cache.set(e,o),o}static \u0275fac=function(t){return new(t||i)};static \u0275prov=l({token:i,factory:i.\u0275fac,providedIn:"root"})};export{v as a};
1
+ import{a as h}from"./chunk-VZOBZ3DD.js";import{k as b}from"./chunk-UQTA3ACH.js";import{b as u}from"./chunk-VMYKE4ZC.js";import{D as p,P as f,S as m,Z as l,ca as a,m as r,t as c}from"./chunk-CHEXA6RY.js";var v=class i{userState=a(h);permissions=a(b);currentUser$=u(this.userState.currentUser);cache=new Map;isAdminOfNamespace$(e){if(!e)return r(!1);let t=this.cache.get(e);if(t)return t;let o=this.currentUser$.pipe(m(s=>s?s.isAdmin?r(!0):this.permissions.listNamespaceUsers(e).pipe(c(d=>d.some(n=>n.id===s.id&&n.role==="ADMIN")),p(()=>r(!1))):r(!1)),f({bufferSize:1,refCount:!1}));return this.cache.set(e,o),o}static \u0275fac=function(t){return new(t||i)};static \u0275prov=l({token:i,factory:i.\u0275fac,providedIn:"root"})};export{v as a};
@@ -0,0 +1 @@
1
+ import{m as n,x as s}from"./chunk-UQTA3ACH.js";import{Z as l,a as p,ca as o}from"./chunk-CHEXA6RY.js";var m=class e{promptController=o(n);exportService=o(s);getById(r){return this.promptController.getByIdPrompt(r)}listPlatform(){return this.promptController.searchPrompt({namespaceId:null,userId:null})}listByNamespace(r){return this.promptController.searchPrompt({namespaceId:r,userId:null})}create(r){return this.promptController.createPrompt(r)}update(r,t){return this.promptController.updatePrompt(r,t)}delete(r){return this.promptController.deletePrompt(r)}listEffective(r,t){return this.promptController.resolveEffectivePrompt(p({namespaceId:r},t?{agentConfigId:t}:{}))}exportAsYaml(r){return this.exportService.exportAsYaml(r)}static \u0275fac=function(t){return new(t||e)};static \u0275prov=l({token:e,factory:e.\u0275fac,providedIn:"root"})};export{m as a};
@@ -1 +1 @@
1
- import{a as k}from"./chunk-TIO4RSPY.js";import{c as q,d as O}from"./chunk-BLRBIAYK.js";import{a as E,c as $}from"./chunk-6XX7GME4.js";import{s as D,z as S}from"./chunk-VNO76B3S.js";import"./chunk-E6T6QLQT.js";import"./chunk-SPV5SLNS.js";import{a as M}from"./chunk-VMYKE4ZC.js";import"./chunk-AS2L77JV.js";import"./chunk-7OGOI6WM.js";import"./chunk-G5RWG2GK.js";import{Bb as R,D as g,Db as l,Fb as s,Lc as L,Pb as N,S as A,Wa as h,ab as I,ca as r,cc as w,fc as x,ga as p,gc as B,ha as m,i as u,jc as T,lb as b,m as f,ma as C,mb as P,rb as c,sb as d,t as y,tb as _,z as v}from"./chunk-CHEXA6RY.js";var V=()=>[];function K(n,t){if(n&1){let i=R();d(0,"agentos-ai-model-item",4),l("deleteRequested",function(a){p(i);let e=s(2);return m(e.deleteModel(a))})("editRequested",function(a){p(i);let e=s(2);return m(e.editModel(a))}),_()}if(n&2){let i=s().$implicit,o=s();c("model",t)("namespaceId",o.namespaceId)("readOnly",o.isPlatformModel(i.id))}}function U(n,t){if(n&1&&b(0,K,1,3,"agentos-ai-model-item",3),n&2){let i,o=t.$implicit,a=s();P((i=a.resolveModel(o.id))?0:-1,i)}}var j="__platform__",G="Platform (read-only)",F=class n{route=r(E);router=r($);destroyRef=r(C);aiModelController=r(q);aiProviderController=r(O);namespaceId=this.route.snapshot.params.namespaceId;refresh$=new u(void 0);data$=this.refresh$.pipe(A(()=>v({namespace:this.aiModelController.listByNamespaceIdAiModel(this.namespaceId),platform:this.aiModelController.listPlatformLevelAiModel().pipe(g(()=>f([]))),providers:this.aiProviderController.listAiProvider(this.namespaceId)})));modelItems$=this.data$.pipe(y(({namespace:t,platform:i,providers:o})=>{let a=new Map(o.map(e=>[e.id??"",e.name]));return[...i.map(e=>({id:e.id??"",name:e.alias??e.apiModelName,description:e.apiModelName,groupKey:j,groupLabel:G})),...t.map(e=>({id:e.id??"",name:e.alias??e.apiModelName,description:e.apiModelName,groupKey:e.aiProviderId,groupLabel:a.get(e.aiProviderId)??e.aiProviderId}))]}));namespaceModelsById=new Map;platformModelsById=new Map;constructor(){this.data$.pipe(M(this.destroyRef)).subscribe(({namespace:t,platform:i})=>{this.namespaceModelsById=new Map(t.map(o=>[o.id??"",o])),this.platformModelsById=new Map(i.map(o=>[o.id??"",o]))})}goBack(){this.router.navigate(["/agentos","namespaces"])}openCreateForm(){this.router.navigate(["/agentos",this.namespaceId,"ai-models","new"])}editModel(t){this.router.navigate(["/agentos",this.namespaceId,"ai-models",t.id,"edit"])}deleteModel(t){this.aiModelController.deleteAiModel(t.id??"").pipe(M(this.destroyRef)).subscribe(()=>this.refresh$.next())}resolveModel(t){return this.namespaceModelsById.get(t)??this.platformModelsById.get(t)??null}isPlatformModel(t){return this.platformModelsById.has(t)}static \u0275fac=function(i){return new(i||n)};static \u0275cmp=h({type:n,selectors:[["agentos-namespace-ai-models"]],decls:5,vars:6,consts:[["aiModelItemTpl",""],["title","AI models","emptyMessage","No AI models configured yet. Add one above.","cardMinWidth","400px",3,"createRequested","items","showCreate","itemTemplate"],["toolbar-start","","icon","arrow_back","title","Back",3,"action"],[3,"model","namespaceId","readOnly"],[3,"deleteRequested","editRequested","model","namespaceId","readOnly"]],template:function(i,o){if(i&1&&(d(0,"ds-entity-list",1),x(1,"async"),l("createRequested",function(){return o.openCreateForm()}),d(2,"ds-icon-button",2),l("action",function(){return o.goBack()}),_()(),I(3,U,1,1,"ng-template",null,0,T)),i&2){let a=N(4);c("items",B(1,3,o.modelItems$)??w(5,V))("showCreate",!0)("itemTemplate",a)}},dependencies:[S,k,D,L],encapsulation:2,changeDetection:0})};export{F as NamespaceAiModelsComponent};
1
+ import{a as k}from"./chunk-TIO4RSPY.js";import{c as q,d as O}from"./chunk-UQTA3ACH.js";import{a as E,c as $}from"./chunk-6XX7GME4.js";import{s as D,z as S}from"./chunk-VNO76B3S.js";import"./chunk-E6T6QLQT.js";import"./chunk-SPV5SLNS.js";import{a as M}from"./chunk-VMYKE4ZC.js";import"./chunk-AS2L77JV.js";import"./chunk-7OGOI6WM.js";import"./chunk-G5RWG2GK.js";import{Bb as R,D as g,Db as l,Fb as s,Lc as L,Pb as N,S as A,Wa as h,ab as I,ca as r,cc as w,fc as x,ga as p,gc as B,ha as m,i as u,jc as T,lb as b,m as f,ma as C,mb as P,rb as c,sb as d,t as y,tb as _,z as v}from"./chunk-CHEXA6RY.js";var V=()=>[];function K(n,t){if(n&1){let i=R();d(0,"agentos-ai-model-item",4),l("deleteRequested",function(a){p(i);let e=s(2);return m(e.deleteModel(a))})("editRequested",function(a){p(i);let e=s(2);return m(e.editModel(a))}),_()}if(n&2){let i=s().$implicit,o=s();c("model",t)("namespaceId",o.namespaceId)("readOnly",o.isPlatformModel(i.id))}}function U(n,t){if(n&1&&b(0,K,1,3,"agentos-ai-model-item",3),n&2){let i,o=t.$implicit,a=s();P((i=a.resolveModel(o.id))?0:-1,i)}}var j="__platform__",G="Platform (read-only)",F=class n{route=r(E);router=r($);destroyRef=r(C);aiModelController=r(q);aiProviderController=r(O);namespaceId=this.route.snapshot.params.namespaceId;refresh$=new u(void 0);data$=this.refresh$.pipe(A(()=>v({namespace:this.aiModelController.listByNamespaceIdAiModel(this.namespaceId),platform:this.aiModelController.listPlatformLevelAiModel().pipe(g(()=>f([]))),providers:this.aiProviderController.listAiProvider(this.namespaceId)})));modelItems$=this.data$.pipe(y(({namespace:t,platform:i,providers:o})=>{let a=new Map(o.map(e=>[e.id??"",e.name]));return[...i.map(e=>({id:e.id??"",name:e.alias??e.apiModelName,description:e.apiModelName,groupKey:j,groupLabel:G})),...t.map(e=>({id:e.id??"",name:e.alias??e.apiModelName,description:e.apiModelName,groupKey:e.aiProviderId,groupLabel:a.get(e.aiProviderId)??e.aiProviderId}))]}));namespaceModelsById=new Map;platformModelsById=new Map;constructor(){this.data$.pipe(M(this.destroyRef)).subscribe(({namespace:t,platform:i})=>{this.namespaceModelsById=new Map(t.map(o=>[o.id??"",o])),this.platformModelsById=new Map(i.map(o=>[o.id??"",o]))})}goBack(){this.router.navigate(["/agentos","namespaces"])}openCreateForm(){this.router.navigate(["/agentos",this.namespaceId,"ai-models","new"])}editModel(t){this.router.navigate(["/agentos",this.namespaceId,"ai-models",t.id,"edit"])}deleteModel(t){this.aiModelController.deleteAiModel(t.id??"").pipe(M(this.destroyRef)).subscribe(()=>this.refresh$.next())}resolveModel(t){return this.namespaceModelsById.get(t)??this.platformModelsById.get(t)??null}isPlatformModel(t){return this.platformModelsById.has(t)}static \u0275fac=function(i){return new(i||n)};static \u0275cmp=h({type:n,selectors:[["agentos-namespace-ai-models"]],decls:5,vars:6,consts:[["aiModelItemTpl",""],["title","AI models","emptyMessage","No AI models configured yet. Add one above.","cardMinWidth","400px",3,"createRequested","items","showCreate","itemTemplate"],["toolbar-start","","icon","arrow_back","title","Back",3,"action"],[3,"model","namespaceId","readOnly"],[3,"deleteRequested","editRequested","model","namespaceId","readOnly"]],template:function(i,o){if(i&1&&(d(0,"ds-entity-list",1),x(1,"async"),l("createRequested",function(){return o.openCreateForm()}),d(2,"ds-icon-button",2),l("action",function(){return o.goBack()}),_()(),I(3,U,1,1,"ng-template",null,0,T)),i&2){let a=N(4);c("items",B(1,3,o.modelItems$)??w(5,V))("showCreate",!0)("itemTemplate",a)}},dependencies:[S,k,D,L],encapsulation:2,changeDetection:0})};export{F as NamespaceAiModelsComponent};
@@ -1 +1 @@
1
- import{a as s}from"./chunk-KH3XUBG3.js";import{a as f}from"./chunk-BLRBIAYK.js";import{a as g}from"./chunk-6XX7GME4.js";import{Ka as c,Tb as m,Ub as h,Wa as l,Xc as d,ca as n,vb as p,wb as u}from"./chunk-CHEXA6RY.js";var A=class r{route=n(g);http=n(d);config=n(f);message="Authentication in progress\u2026";ngOnInit(){let e=this.route.snapshot.queryParamMap.get("code"),t=this.route.snapshot.queryParamMap.get("state"),o=this.route.snapshot.queryParamMap.get("error"),i=this.route.snapshot.queryParamMap.get("error_description");if(o){console.warn("[AgentOS OAuth Callback] OAuth error:",o,i),this.notifyParentAndClose({success:!1,error:i||o});return}if(!e){console.error("[AgentOS OAuth Callback] Missing authorization code"),this.message="OAuth callback error: missing authorization code.",this.notifyParentAndClose({success:!1,error:"Missing authorization code"});return}this.http.post(`${this.config.basePath}/api/oauth/callback`,{code:e,state:t}).subscribe({next:()=>{console.log("[AgentOS OAuth Callback] Backend callback resolved"),this.notifyParentAndClose({success:!0})},error:a=>{console.error("[AgentOS OAuth Callback] Backend callback failed:",a),this.notifyParentAndClose({success:!1,error:a?.error?.message||a?.message||"Token exchange failed"})}})}notifyParentAndClose(e){if(this.message=e.success?"Authentication complete. You can close this window.":`Authentication failed: ${e.error??"unknown error"}. You can close this window.`,window.opener)try{window.opener.postMessage(e,window.location.origin)}catch(t){console.error("[AgentOS OAuth Callback] postMessage failed:",t),localStorage.setItem(s,JSON.stringify(e))}else console.warn("[AgentOS OAuth Callback] No window.opener \u2014 localStorage fallback"),localStorage.setItem(s,JSON.stringify(e));setTimeout(()=>window.close(),1e3)}static \u0275fac=function(t){return new(t||r)};static \u0275cmp=l({type:r,selectors:[["agentos-oauth-callback"]],decls:2,vars:1,consts:[[2,"font-family","sans-serif","padding","2rem","text-align","center"]],template:function(t,o){t&1&&(p(0,"p",0),m(1),u()),t&2&&(c(),h(o.message))},encapsulation:2})};export{A as OAuthCallbackComponent};
1
+ import{a as s}from"./chunk-GSUU7JSY.js";import{a as f}from"./chunk-UQTA3ACH.js";import{a as g}from"./chunk-6XX7GME4.js";import{Ka as c,Tb as m,Ub as h,Wa as l,Xc as d,ca as n,vb as p,wb as u}from"./chunk-CHEXA6RY.js";var A=class r{route=n(g);http=n(d);config=n(f);message="Authentication in progress\u2026";ngOnInit(){let e=this.route.snapshot.queryParamMap.get("code"),t=this.route.snapshot.queryParamMap.get("state"),o=this.route.snapshot.queryParamMap.get("error"),i=this.route.snapshot.queryParamMap.get("error_description");if(o){console.warn("[AgentOS OAuth Callback] OAuth error:",o,i),this.notifyParentAndClose({success:!1,error:i||o});return}if(!e){console.error("[AgentOS OAuth Callback] Missing authorization code"),this.message="OAuth callback error: missing authorization code.",this.notifyParentAndClose({success:!1,error:"Missing authorization code"});return}this.http.post(`${this.config.basePath}/api/oauth/callback`,{code:e,state:t}).subscribe({next:()=>{console.log("[AgentOS OAuth Callback] Backend callback resolved"),this.notifyParentAndClose({success:!0})},error:a=>{console.error("[AgentOS OAuth Callback] Backend callback failed:",a),this.notifyParentAndClose({success:!1,error:a?.error?.message||a?.message||"Token exchange failed"})}})}notifyParentAndClose(e){if(this.message=e.success?"Authentication complete. You can close this window.":`Authentication failed: ${e.error??"unknown error"}. You can close this window.`,window.opener)try{window.opener.postMessage(e,window.location.origin)}catch(t){console.error("[AgentOS OAuth Callback] postMessage failed:",t),localStorage.setItem(s,JSON.stringify(e))}else console.warn("[AgentOS OAuth Callback] No window.opener \u2014 localStorage fallback"),localStorage.setItem(s,JSON.stringify(e));setTimeout(()=>window.close(),1e3)}static \u0275fac=function(t){return new(t||r)};static \u0275cmp=l({type:r,selectors:[["agentos-oauth-callback"]],decls:2,vars:1,consts:[[2,"font-family","sans-serif","padding","2rem","text-align","center"]],template:function(t,o){t&1&&(p(0,"p",0),m(1),u()),t&2&&(c(),h(o.message))},encapsulation:2})};export{A as OAuthCallbackComponent};
@@ -1 +1 @@
1
- import{a}from"./chunk-36EOCF7B.js";import"./chunk-5IIN2VT5.js";import"./chunk-HN4TBO7J.js";import"./chunk-BLRBIAYK.js";import"./chunk-6XX7GME4.js";import"./chunk-VNO76B3S.js";import"./chunk-E6T6QLQT.js";import"./chunk-SPV5SLNS.js";import"./chunk-VMYKE4ZC.js";import"./chunk-AS2L77JV.js";import"./chunk-7OGOI6WM.js";import"./chunk-G5RWG2GK.js";import"./chunk-CHEXA6RY.js";export{a as NamespaceUserGroupsComponent};
1
+ import{a}from"./chunk-5Y2Q6WKL.js";import"./chunk-X73LZ3QV.js";import"./chunk-5N6DUZII.js";import"./chunk-UQTA3ACH.js";import"./chunk-6XX7GME4.js";import"./chunk-VNO76B3S.js";import"./chunk-E6T6QLQT.js";import"./chunk-SPV5SLNS.js";import"./chunk-VMYKE4ZC.js";import"./chunk-AS2L77JV.js";import"./chunk-7OGOI6WM.js";import"./chunk-G5RWG2GK.js";import"./chunk-CHEXA6RY.js";export{a as NamespaceUserGroupsComponent};
@@ -1 +1 @@
1
- import{a as oe}from"./chunk-HN4TBO7J.js";import{a as B,c as j}from"./chunk-6XX7GME4.js";import{w as re}from"./chunk-VNO76B3S.js";import{a as E}from"./chunk-VMYKE4ZC.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-7OGOI6WM.js";import{Ab as O,Bb as I,Db as f,Fb as d,Ka as l,Kc as $,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-CHEXA6RY.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-5N6DUZII.js";import{a as B,c as j}from"./chunk-6XX7GME4.js";import{w as re}from"./chunk-VNO76B3S.js";import{a as E}from"./chunk-VMYKE4ZC.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-7OGOI6WM.js";import{Ab as O,Bb as I,Db as f,Fb as d,Ka as l,Kc as $,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-CHEXA6RY.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{a as S}from"./chunk-TIO4RSPY.js";import{c as $,d as k}from"./chunk-BLRBIAYK.js";import{c as B}from"./chunk-6XX7GME4.js";import{s as E,z as D}from"./chunk-VNO76B3S.js";import"./chunk-E6T6QLQT.js";import"./chunk-SPV5SLNS.js";import{a as f}from"./chunk-VMYKE4ZC.js";import"./chunk-AS2L77JV.js";import"./chunk-7OGOI6WM.js";import"./chunk-G5RWG2GK.js";import{Bb as P,Db as l,Fb as d,Lc 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-CHEXA6RY.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};
1
+ import{a as S}from"./chunk-TIO4RSPY.js";import{c as $,d as k}from"./chunk-UQTA3ACH.js";import{c as B}from"./chunk-6XX7GME4.js";import{s as E,z as D}from"./chunk-VNO76B3S.js";import"./chunk-E6T6QLQT.js";import"./chunk-SPV5SLNS.js";import{a as f}from"./chunk-VMYKE4ZC.js";import"./chunk-AS2L77JV.js";import"./chunk-7OGOI6WM.js";import"./chunk-G5RWG2GK.js";import{Bb as P,Db as l,Fb as d,Lc 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-CHEXA6RY.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,4 @@
1
+ import{a as it,b as ot,d as De,g as Ne}from"./chunk-UEGZX4MW.js";import{a as Ze,b as H,c as Ke,d as et,w as lt,z as dt}from"./chunk-CRXIMHRG.js";import{c as fe}from"./chunk-6XX7GME4.js";import{c as ut}from"./chunk-J4UAEXFM.js";import{h as at,j as ct}from"./chunk-GTCP3EYX.js";import{a as tt,b as nt,d as rt,k as mt,l as pt,m as gt,n as _t}from"./chunk-E6T6QLQT.js";import{d as Ye}from"./chunk-BTOJ27OO.js";import{a as F,c as w}from"./chunk-VMYKE4ZC.js";import{a as q,b as W}from"./chunk-AS2L77JV.js";import{D as st,E as Pe,c as Ce,g as xe,m as ye}from"./chunk-7OGOI6WM.js";import{a as be,b as ve}from"./chunk-TASSC2XX.js";import{E as Je,O as Q,S as G,n as We}from"./chunk-G5RWG2GK.js";import{$b as he,Ab as ke,B as ae,Bb as b,Cb as Be,Db as u,Fb as c,Gb as Ue,Ha as ne,Hb as Xe,Jb as me,Ka as l,Kb as pe,Kc as qe,Lb as ge,Pb as Ee,Qb as M,Rb as C,T as $,Tb as d,Ub as y,Vb as oe,Wa as N,Xa as $e,Z as Le,Zb as _e,_ as Re,_b as ue,a as z,ab as ce,b as Z,ca as v,dc as Qe,ec as Ge,ga as m,h as ze,ha as p,jb as le,jc as He,lb as g,ma as se,mb as _,mc as S,nb as de,oa as ee,pb as k,qb as E,qc as X,rb as x,sb as r,t as K,ta as P,tb as a,ua as te,ub as V,vb as B,wb as ie,xb as U,z as Ae}from"./chunk-CHEXA6RY.js";var ht=(()=>{class n{static \u0275fac=function(i){return new(i||n)};static \u0275mod=$e({type:n});static \u0275inj=Re({imports:[Je]})}return n})();var St=(n,t)=>({subThreads:n,depth:t}),wt=n=>({subThreads:n,depth:1}),vt=(n,t)=>t.id,Tt=(n,t)=>t.label;function Ot(n,t){if(n&1){let e=b();r(0,"mat-icon",10),u("click",function(o){m(e);let s=c().$implicit,f=c(3);return p(f.toggleSubThreads(o,s.id))}),d(1),a()}if(n&2){let e=c().$implicit,i=c(3);l(),y(i.isParentExpanded(e.id)?"expand_more":"chevron_right")}}function kt(n,t){n&1&&ke(0)}function Et(n,t){if(n&1&&ce(0,kt,1,0,"ng-container",11),n&2){let e=c().$implicit,i=c().depth;c();let o=Ee(1);x("ngTemplateOutlet",o)("ngTemplateOutletContext",Ge(2,St,e.subThreads,i+1))}}function Dt(n,t){if(n&1){let e=b();r(0,"div",5)(1,"a",6),u("click",function(o){let s=m(e).$implicit;return c(3).selectThread(s.id),p(o.preventDefault())})("keydown.enter",function(o){let s=m(e).$implicit;return c(3).selectThread(s.id),p(o.preventDefault())})("keydown.space",function(o){let s=m(e).$implicit;return c(3).selectThread(s.id),p(o.preventDefault())}),g(2,Ot,2,1,"mat-icon",7),r(3,"span",8),d(4),a(),r(5,"span",9),d(6),a()()(),g(7,Et,1,5,"ng-container")}if(n&2){let e,i=t.$implicit,o=c().depth,s=c(2);M("--sub-depth",o),C("current",i.id===((e=s.currentThread())==null?null:e.id)),l(2),_(i.subThreads!=null&&i.subThreads.length?2:-1),l(2),y(i.delegatedAgentName||"Agent"),l(2),y(i.delegatedTask||i.name),l(),_(s.isParentExpanded(i.id)&&(i.subThreads!=null&&i.subThreads.length)?7:-1)}}function Nt(n,t){if(n&1&&k(0,Dt,8,8,null,null,vt),n&2){let e=t.subThreads;E(e)}}function jt(n,t){n&1&&(r(0,"div",4),V(1,"span",12),r(2,"span",13),d(3,"Loading threads..."),a()())}function Vt(n,t){if(n&1&&(r(0,"div",27),d(1),a()),n&2){let e=c(6);l(),y(e.renameErrorMessage)}}function Ft(n,t){if(n&1){let e=b();r(0,"div",18)(1,"input",26),he("ngModelChange",function(o){m(e);let s=c(5);return ue(s.editingThreadName,o)||(s.editingThreadName=o),p(o)}),u("keydown",function(o){m(e);let s=c(5);return p(s.onEditKeydown(o))})("blur",function(){m(e);let o=c(5);return p(o.onEditBlur())})("click",function(o){return o.stopPropagation()}),a(),g(2,Vt,2,1,"div",27),a()}if(n&2){let e=c(5);l(),_e("ngModel",e.editingThreadName),x("disabled",e.isRenamingThread),l(),_(e.renameErrorMessage?2:-1)}}function It(n,t){if(n&1){let e=b();r(0,"mat-icon",10),u("click",function(o){m(e);let s=c(2).$implicit,f=c(4);return p(f.toggleSubThreads(o,s.id))}),d(1),a()}if(n&2){let e=c(2).$implicit,i=c(4);l(),y(i.isParentExpanded(e.id)?"expand_more":"chevron_right")}}function zt(n,t){if(n&1&&(r(0,"span",29),d(1),a()),n&2){let e=c(2).$implicit;l(),y(e.name)}}function At(n,t){n&1&&(V(0,"mat-spinner",31),r(1,"span",32),d(2,"Generating name..."),a()),n&2&&x("diameter",16)}function Lt(n,t){n&1&&(r(0,"mat-icon",30),d(1,"group"),a())}function Rt(n,t){if(n&1){let e=b();r(0,"a",28),u("click",function(o){m(e);let s=c().$implicit;return c(4).selectThread(s.id),p(o.preventDefault())})("keydown.enter",function(o){m(e);let s=c().$implicit;return c(4).selectThread(s.id),p(o.preventDefault())})("keydown.space",function(o){m(e);let s=c().$implicit;return c(4).selectThread(s.id),p(o.preventDefault())}),g(1,It,2,1,"mat-icon",7),g(2,zt,2,1,"span",29)(3,At,3,1),g(4,Lt,2,0,"mat-icon",30),a()}if(n&2){let e=c().$implicit,i=c(4);x("matTooltip",e.name?e.name+`
2
+
3
+ `+(e.summary||""):e.summary||"")("matTooltipDisabled",!e.summary),l(),_(e.subThreads!=null&&e.subThreads.length?1:-1),l(),_(e.name?2:3),l(2),_(i.isSharedThread(e)?4:-1)}}function $t(n,t){if(n&1){let e=b();r(0,"button",33),u("click",function(o){m(e);let s=c().$implicit,f=c(4);return p(f.startEditingThreadName(o,s))}),r(1,"mat-icon"),d(2,"edit"),a()()}}function Bt(n,t){if(n&1){let e=b();r(0,"button",34),u("click",function(o){m(e);let s=c().$implicit,f=c(4);return p(f.markActive(o,s))}),r(1,"mat-icon"),d(2,"replay"),a()()}}function Ut(n,t){if(n&1){let e=b();r(0,"button",35),u("click",function(o){m(e);let s=c().$implicit,f=c(4);return p(f.markDone(o,s))}),r(1,"mat-icon"),d(2,"check_circle_outline"),a()()}}function Xt(n,t){n&1&&ke(0)}function Qt(n,t){if(n&1&&ce(0,Xt,1,0,"ng-container",11),n&2){let e=c().$implicit;c(3);let i=Ee(1);x("ngTemplateOutlet",i)("ngTemplateOutletContext",Qe(2,wt,e.subThreads))}}function Gt(n,t){if(n&1){let e=b();r(0,"div",17),g(1,Ft,3,3,"div",18)(2,Rt,5,5,"a",19),r(3,"div",20),g(4,$t,3,0,"button",21),g(5,Bt,3,0,"button",22)(6,Ut,3,0,"button",23),r(7,"button",24),u("click",function(o){let s=m(e).$implicit,f=c(4);return p(f.toggleStar(o,s))}),r(8,"mat-icon"),d(9),a()(),r(10,"button",25),u("click",function(o){let s=m(e).$implicit,f=c(4);return p(f.deleteThread(o,s))}),r(11,"mat-icon"),d(12,"delete"),a()()()(),g(13,Qt,1,4,"ng-container")}if(n&2){let e,i=t.$implicit,o=c(4);C("current",i.id===((e=o.currentThread())==null?null:e.id)),l(),_(o.editingThreadId===i.id?1:2),l(3),_(o.editingThreadId!==i.id&&i.name?4:-1),l(),_(i.closedByUser?5:6),l(2),C("starred",o.isStarred(i)),x("title",o.isStarred(i)?"Unstar thread":"Star thread"),l(2),y(o.isStarred(i)?"star":"star_outline"),l(4),_(o.isParentExpanded(i.id)&&(i.subThreads!=null&&i.subThreads.length)?13:-1)}}function Ht(n,t){if(n&1&&(r(0,"div",14)(1,"div",16),d(2),a(),k(3,Gt,14,10,null,null,vt),a()),n&2){let e=t.$implicit;l(2),y(e.label),l(),E(e.threads)}}function qt(n,t){n&1&&(r(0,"div",15),d(1,"No existing threads"),a())}function Wt(n,t){if(n&1&&(r(0,"div",15),d(1),a()),n&2){let e=c(3);l(),oe('No threads matching "',e.searchQuery(),'"')}}function Jt(n,t){if(n&1&&(k(0,Ht,5,1,"div",14,Tt),g(2,qt,2,0,"div",15)(3,Wt,2,1,"div",15)),n&2){let e,i=c(2);E(i.getGroupedThreads()),l(2),_(!((e=i.threads())!=null&&e.length)&&!i.searchQuery()?2:i.searchQuery()&&i.getGroupedThreads().length===0?3:-1)}}function Yt(n,t){if(n&1&&(ce(0,Nt,2,0,"ng-template",null,0,He),r(2,"div",3),g(3,jt,4,0,"div",4)(4,Jt,4,1),a()),n&2){let e=c();l(3),_(e.isLoadingThreadList()?3:4)}}function Zt(n,t){n&1&&(r(0,"span",36),d(1,"No project selected"),a())}function Kt(n,t){n&1&&(r(0,"span",36),d(1,"Loading..."),a())}function en(n,t){if(n&1&&(r(0,"div",2),g(1,Zt,2,0,"span",36)(2,Kt,2,0,"span",36),a()),n&2){let e,i=c();l(),_((e=i.currentProject())!=null&&e.name?2:1)}}var Me=class n{projects=null;searchMode=!1;searchQuery=X("");searchModeChange=new ee;threadSelected=new ee;projectStateService=v(ve);threadStateService=v(H);threadApiService=v(Ze);userService=v(Ke);router=v(fe);destroyRef=v(se);currentThread=w(this.threadStateService.selectedThread$);currentProject=w(this.projectStateService.selectedProject$);threads=w(this.threadStateService.threadList$);isLoadingThreadList=w(this.threadStateService.isLoadingThreadList$);username=w(this.userService.username$);isTouchDevice="ontouchstart"in window||navigator.maxTouchPoints>0;editingThreadId=null;editingThreadName="";isRenamingThread=!1;renameErrorMessage="";expandedParents=new Set;constructor(){te(()=>{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 o=t;for(;o;){let s=i.get(o);s&&this.expandedParents.add(s),o=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),o=t.filter(h=>!!h.parentThreadId),s=o.filter(h=>!e.has(h.parentThreadId)),f=o.filter(h=>e.has(h.parentThreadId)),A=new Map;for(let h of f){let O=h.parentThreadId;A.has(O)||A.set(O,[]),A.get(O).push(h)}let J=h=>(A.get(h)||[]).sort((j,I)=>j.modifiedDate>I.modifiedDate?-1:1).map(j=>Z(z({},j),{subThreads:J(j.id)})),L=[...i,...s];if(this.searchQuery()&&this.searchQuery().trim()){let h=this.searchQuery().toLowerCase().trim();L=L.filter(O=>O.name.toLowerCase().includes(h)||O.summary&&O.summary.toLowerCase().includes(h))}if(!L.length)return[];let R=this.username();if(!R)return[];let Ve=L.map(h=>Z(z({},h),{subThreads:J(h.id)})),Fe=Ve.filter(h=>h.starring&&h.starring.includes(R)),Pt=Ve.filter(h=>!h.starring||!h.starring.includes(R)),Y=new Map,Ie=new Date;Ie.setHours(0,0,0,0);for(let h of Pt){let O=new Date(h.modifiedDate);O.setHours(0,0,0,0);let j=Ie.getTime()-O.getTime(),I=Math.floor(j/(1e3*60*60*24)),D;I===0?D="Today":I===1?D="Yesterday":I<7?D="This Week":I<30?D="This Month":I<90?D="Last 3 Months":D="Older",Y.has(D)||Y.set(D,[]),Y.get(D).push(h)}let Oe=[];if(Fe.length>0){let h=[...Fe].sort((O,j)=>O.modifiedDate>j.modifiedDate?-1:1);Oe.push({label:"Starred",threads:h})}return["Today","Yesterday","This Week","This Month","Last 3 Months","Older"].filter(h=>Y.has(h)).forEach(h=>{Oe.push({label:h,threads:Y.get(h)})}),Oe}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 o=e.starring&&e.starring.includes(i),s=o?this.threadApiService.unstarThread(e.id):this.threadApiService.starThread(e.id);this.threadStateService.updateStarLocal(e.id,!o,i),s.pipe(F(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),o=new Date().getTime()-e.getTime(),s=Math.floor(o/(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:o=>{console.error("[THREAD-SELECTOR] Error renaming thread:",o),this.renameErrorMessage=o.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=N({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&&(r(0,"div",1),u("click",function(s){return s.stopPropagation()})("keydown",function(s){return s.stopPropagation()}),g(1,Yt,5,1)(2,en,3,1,"div",2),a()),e&2){let o;l(),_((o=i.currentProject())!=null&&o.name?1:2)}},dependencies:[qe,Pe,Ce,xe,st,ye,W,q,G,Q,ct,at,ot,it,nt,tt],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 tn=["logsContent"],nn=(n,t)=>t.name;function on(n,t){if(n&1){let e=b();r(0,"button",12),u("click",function(){m(e);let o=c().$implicit,s=c();return p(s.start(o.name))}),r(1,"mat-icon"),d(2,"play_arrow"),a()()}if(n&2){let e=c().$implicit;x("disabled",e.isLoading)}}function rn(n,t){if(n&1){let e=b();r(0,"button",13),u("click",function(){m(e);let o=c().$implicit,s=c();return p(s.stop(o.name))}),r(1,"mat-icon"),d(2,"stop"),a()()}if(n&2){let e=c().$implicit;x("disabled",e.isLoading)}}function an(n,t){if(n&1&&(r(0,"a",8)(1,"mat-icon",14),d(2,"open_in_new"),a()()),n&2){let e=c().$implicit;x("href",e.url,ne)("title",e.url)}}function sn(n,t){if(n&1&&(r(0,"div",15),d(1),a()),n&2){let e=c(),i=e.$implicit,o=e.$index;M("order",o*2),l(),y(i.errorMessage)}}function cn(n,t){if(n&1){let e=b();r(0,"button",21),u("click",function(){m(e);let o=c(3);return p(o.onManualRefresh())}),r(1,"mat-icon"),d(2,"refresh"),a()()}}function ln(n,t){if(n&1&&(r(0,"div",16)(1,"div",17)(2,"span",18),d(3),a(),g(4,cn,3,0,"button",19),a(),r(5,"pre",20,0),d(7),a()()),n&2){let e=c(),i=e.$implicit,o=e.$index,s=c();M("order",o*2+1),l(3),oe("",i.name," logs"),l(),_(i.status==="running"?4:-1),l(3),y(s.logs()||"(empty)")}}function dn(n,t){if(n&1){let e=b();r(0,"div",2)(1,"span",3),d(2),a(),r(3,"div",4),g(4,on,3,1,"button",5)(5,rn,3,1,"button",6),r(6,"span",7),d(7),a(),g(8,an,3,2,"a",8),r(9,"button",9),u("click",function(){let o=m(e).$implicit,s=c();return p(s.toggleLogs(o.name))}),r(10,"mat-icon"),d(11),a()()()(),g(12,sn,2,3,"div",10),g(13,ln,8,5,"div",11)}if(n&2){let e=t.$implicit,i=t.$index,o=c();M("order",i*2),l(2),y(e.name),l(2),_(e.status==="stopped"?4:5),l(2),C("running",e.status==="running"),l(),oe(" ",e.status==="running"?"Running":"Stopped"," "),l(),_(e.url?8:-1),l(),x("title",o.logsOpenFor()===e.name?"Hide logs":"Show logs"),l(2),y(o.logsOpenFor()===e.name?"expand_less":"terminal"),l(),_(e.errorMessage?12:-1),l(),_(o.logsOpenFor()===e.name?13:-1)}}var Se=class n{destroyRef=v(se);projectApi=v(be);projectName=X.required();entryStates=P([]);hasPreview=S(()=>this.entryStates().length>0);logsOpenFor=P(null);logs=P("");logsContent;logsPollTimer=null;logsTimeoutTimer=null;static LOGS_POLL_MS=5e3;static LOGS_TIMEOUT_MS=1200*1e3;constructor(){te(()=>{let t=this.projectName();t&&this.onProjectChanged(t)},{allowSignalWrites:!0}),te(()=>{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(F(this.destroyRef)).subscribe({next:e=>{let i=e.entries;if(i.length===0)return;let o=i.map(f=>({name:f.name,command:f.command,url:f.url,status:"stopped",isLoading:!1,errorMessage:""}));this.entryStates.set(o);let s=i.map(f=>this.projectApi.getPreviewStatus(t,f.name));Ae(s).pipe(F(this.destroyRef)).subscribe({next:f=>{this.entryStates.update(A=>A.map((J,L)=>{let R=f[L];return R?Z(z({},J),{status:R.status}):J}))},error:()=>{}})},error:()=>{}})}start(t){this.updateEntry(t,{isLoading:!0,errorMessage:""}),this.projectApi.startPreview(this.projectName(),t).pipe(F(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(F(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(F(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(o=>o.name===t?z(z({},o),e):o))}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=N({type:n,selectors:[["app-preview-panel"]],viewQuery:function(e,i){if(e&1&&me(tn,5),e&2){let o;pe(o=ge())&&(i.logsContent=o.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&&(r(0,"div",1),k(1,dn,14,12,null,null,nn),a()),e&2&&(l(),E(i.entryStates()))},dependencies:[G,Q,W,q],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 we=class n{eventStream=v(dt);threadState=v(H);ratio=P(0);inputTokens=P(0);contextWindow=P(0);price=P(0);iterations=P(0);cacheReadTokens=P(0);visible=P(!1);level=S(()=>{let t=this.ratio();return t<.6?"ok":t<.85?"warning":"danger"});constructor(){this.eventStream.events$.pipe(ae(t=>t instanceof lt),ae(t=>!t.threadId||t.threadId===this.threadState.getSelectedThreadId())).subscribe(t=>{this.inputTokens.set(t.inputTokens),this.contextWindow.set(t.contextWindow),this.price.set(t.price),this.iterations.set(t.iterations),this.cacheReadTokens.set(t.cacheReadTokens),this.ratio.set(t.contextWindow>0?t.inputTokens/t.contextWindow:0),this.visible.set(!0)}),this.eventStream.connectionStatus$.pipe(ae(t=>!t.connected)).subscribe(()=>{this.visible.set(!1),this.ratio.set(0),this.inputTokens.set(0),this.contextWindow.set(0),this.price.set(0),this.iterations.set(0),this.cacheReadTokens.set(0)})}static \u0275fac=function(e){return new(e||n)};static \u0275prov=Le({token:n,factory:n.\u0275fac,providedIn:"root"})};function mn(n,t){if(n&1&&U(0,"div",12),n&2){let e=t.$implicit,i=t.$index,o=c();M("--delay",e.delay+"s")("--left",e.left+"%")("--dur",e.dur+"s")("--size",e.size+"px")("--rise",e.rise+"px"),C("invisible",i>=o.aboveBubbleCount())}}function pn(n,t){if(n&1&&U(0,"div",13),n&2){let e=t.$implicit;M("--delay",e.delay+"s")("--size",e.size+"px")("--left",e.left+"%")("--dur",e.dur+"s")("--top",e.top+"px")}}function gn(n,t){if(n&1&&U(0,"div",14),n&2){let e=t.$implicit,i=t.$index,o=c();M("--delay",e.delay+"s")("--left",e.left+"%")("--dur",e.dur+"s")("--size",e.size+"px"),C("invisible",i>=o.insideBubbleCount())}}var Ct=30,xt=27,_n=40;function T(n,t,e,i=0){return i+(n*137+t*31)%e}var Te=class n{gaugeState=v(we);sidenavOpen=X(!1);aboveBubbles=Array.from({length:Ct},(t,e)=>({delay:T(e,1,30)/10,left:T(e,2,82,5),dur:2.5+T(e,3,20)/10,size:1.5+T(e,4,40)/10,rise:150+T(e,5,150)}));insideBubbles=Array.from({length:xt},(t,e)=>({delay:T(e,6,20)/10,left:T(e,7,80,5),dur:1.2+T(e,8,15)/10,size:2+T(e,9,35)/10}));foamBubbles=Array.from({length:_n},(t,e)=>({delay:T(e,10,25)/10,left:T(e,11,85,3),dur:1.5+T(e,12,10)/10,size:(3+T(e,13,80)/10)*.75,top:T(e,14,4)+8}));displayRatio=S(()=>Math.min(100,this.gaugeState.ratio()*100));liquidColor=S(()=>{let t=this.gaugeState.ratio();return t<=.5?`rgb(${Math.round(t*2*255)}, 255, 0)`:`rgb(255, ${Math.round((1-(t-.5)*2)*255)}, 0)`});aboveBubbleCount=S(()=>Math.round(this.gaugeState.ratio()*Ct));insideBubbleCount=S(()=>{let t=this.gaugeState.ratio();return t<.5?0:t<.65?5:t<.8?13:t<.9?20:xt});foamActive=S(()=>this.gaugeState.ratio()>=.5);overflowing=S(()=>this.gaugeState.ratio()>=.9);tooltipText=S(()=>{let t=Math.round(this.gaugeState.ratio()*100),e=this.gaugeState.price().toFixed(4);return[`${this.gaugeState.inputTokens().toLocaleString()} / ${this.gaugeState.contextWindow().toLocaleString()} tokens (${t}%)`,`Cost: $${e}`,`Iterations: ${this.gaugeState.iterations()}`,`Cache read: ${this.gaugeState.cacheReadTokens().toLocaleString()}`].join(`
4
+ `)});static \u0275fac=function(e){return new(e||n)};static \u0275cmp=N({type:n,selectors:[["app-context-gauge"]],inputs:{sidenavOpen:[1,"sidenavOpen"]},decls:15,vars:11,consts:[[1,"tube-host",3,"title"],[1,"tube"],[1,"bubbles-above"],[1,"bubble-color",3,"invisible","--delay","--left","--dur","--size","--rise"],[1,"foam"],[1,"foam-bubble",3,"--delay","--size","--left","--dur","--top"],[1,"body"],[1,"shine"],[1,"liquid"],[1,"percentage"],[1,"bubbles-inside"],[1,"bubble-dark",3,"invisible","--delay","--left","--dur","--size"],[1,"bubble-color"],[1,"foam-bubble"],[1,"bubble-dark"]],template:function(e,i){e&1&&(B(0,"div",0)(1,"div",1)(2,"div",2),k(3,mn,1,12,"div",3,de),ie(),B(5,"div",4),k(6,pn,1,10,"div",5,de),ie(),B(8,"div",6),U(9,"div",7),B(10,"div",8)(11,"div",9)(12,"div",10),k(13,gn,1,10,"div",11,de),ie()()()()()()),e&2&&(C("hidden",i.sidenavOpen()),Be("title",i.tooltipText()),l(),M("--tube-color",i.liquidColor()),l(2),E(i.aboveBubbles),l(2),M("bottom",i.displayRatio()+"%"),C("active",i.foamActive()),l(),E(i.foamBubbles),l(5),M("height",i.displayRatio(),"%"),l(2),E(i.insideBubbles))},styles:['[_nghost-%COMP%]{position:fixed;left:calc(1rem + 10px);z-index:1500;display:block;top:calc(3.5rem + 80px)}.tube-host[_ngcontent-%COMP%]{position:relative;display:flex;flex-direction:column;align-items:center}.tube-host.hidden[_ngcontent-%COMP%]{visibility:hidden}.tube[_ngcontent-%COMP%]{position:relative;height:100px;width:24px;border:none;border-radius:0 0 50rem 50rem;background-color:#333;cursor:default;overflow:visible}.tube[_ngcontent-%COMP%]:after{content:"";position:absolute;left:-3px;top:0;width:calc(100% + 6px);height:4px;border-radius:50rem;background:#333}.body[_ngcontent-%COMP%]{position:absolute;border-radius:inherit;height:100%;width:100%;bottom:0;overflow:hidden;z-index:5}.shine[_ngcontent-%COMP%]{position:absolute;left:20%;top:0;width:10%;height:100%;z-index:90;opacity:.2;pointer-events:none}.shine[_ngcontent-%COMP%]:before, .shine[_ngcontent-%COMP%]:after{content:"";position:absolute;background-color:#fff;border-radius:50rem;top:10%;height:40%;width:100%}.shine[_ngcontent-%COMP%]:after{height:15%;top:60%}@keyframes _ngcontent-%COMP%_liquid-spin{0%{transform:translate(-50%) rotate(0)}to{transform:translate(-50%) rotate(360deg)}}.liquid[_ngcontent-%COMP%]{position:absolute;height:100%;width:100%;bottom:0}.percentage[_ngcontent-%COMP%]{position:absolute;height:0%;width:100%;bottom:0;left:0;z-index:80;transition:height .9s cubic-bezier(.4,0,.2,1);overflow:visible}.percentage[_ngcontent-%COMP%]:before, .percentage[_ngcontent-%COMP%]:after{position:absolute;content:"";width:100px;height:100px;border-radius:40px;animation:_ngcontent-%COMP%_liquid-spin 4s infinite linear;transform:translate(-50%);left:50%;top:0;background:var(--tube-color, #34c759);transition:background .5s ease}.percentage[_ngcontent-%COMP%]:after{opacity:.4;animation-direction:reverse;border-radius:30px}@keyframes _ngcontent-%COMP%_bubble-rise-inside{0%{bottom:2%;opacity:0;transform:scale(.5)}15%{opacity:.7}85%{opacity:.4}to{bottom:96%;opacity:0;transform:scale(1.1)}}.bubbles-inside[_ngcontent-%COMP%]{position:absolute;left:0;bottom:0;width:100%;height:100%;z-index:10;pointer-events:none}.bubbles-inside[_ngcontent-%COMP%] .bubble-dark[_ngcontent-%COMP%]{position:absolute;border-radius:50%;background:var(--color-bg, rgba(20, 20, 20, .55));width:var(--size, 3px);height:var(--size, 3px);opacity:0;bottom:2%;left:var(--left, 30%);animation:_ngcontent-%COMP%_bubble-rise-inside var(--dur, 1.5s) infinite ease-in;animation-delay:var(--delay, 0s)}.bubbles-inside[_ngcontent-%COMP%] .bubble-dark.invisible[_ngcontent-%COMP%]{animation:none;opacity:0}@keyframes _ngcontent-%COMP%_bubble-rise-above{0%{bottom:0;opacity:0;transform:scale(.4)}10%{opacity:.9}70%{opacity:.8}90%{opacity:.3}to{bottom:var(--rise, 80px);opacity:0;transform:scale(1.2)}}.bubbles-above[_ngcontent-%COMP%]{position:absolute;left:0;bottom:0;width:100%;height:100%;z-index:20;pointer-events:none;overflow:visible}.bubbles-above[_ngcontent-%COMP%] .bubble-color[_ngcontent-%COMP%]{position:absolute;border-radius:50%;background:var(--tube-color, #34c759);opacity:0;bottom:0;left:var(--left, 30%);width:var(--size, 3px);height:var(--size, 3px);animation:_ngcontent-%COMP%_bubble-rise-above var(--dur, 1.5s) infinite ease-in;animation-delay:var(--delay, 0s)}.bubbles-above[_ngcontent-%COMP%] .bubble-color.invisible[_ngcontent-%COMP%]{animation:none;opacity:0}.foam[_ngcontent-%COMP%]{position:absolute;bottom:0;left:-1px;width:100%;height:14px;z-index:100;pointer-events:none;overflow:visible;transition:bottom .9s cubic-bezier(.4,0,.2,1)}.foam[_ngcontent-%COMP%] .foam-bubble[_ngcontent-%COMP%]{position:absolute;top:var(--top, 0px);left:var(--left, 50%);width:var(--size, 4px);height:var(--size, 4px);border-radius:50%;background:#fff0;animation:none}.foam.active[_ngcontent-%COMP%] .foam-bubble[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_foam-pulse var(--dur, 1.5s) ease-in-out infinite;animation-delay:var(--delay, 0s)}@keyframes _ngcontent-%COMP%_foam-pulse{0%{background:#fff0;transform:scale(.5)}30%{background:#ffffff73;transform:scale(1)}60%{background:#ffffff40;transform:scale(1.1)}to{background:#fff0;transform:scale(.6)}}:root:not([data-theme=dark])[_nghost-%COMP%] .tube[_ngcontent-%COMP%], :root:not([data-theme=dark]) [_nghost-%COMP%] .tube[_ngcontent-%COMP%]{background-color:#ddd}:root:not([data-theme=dark])[_nghost-%COMP%] .tube[_ngcontent-%COMP%]:after, :root:not([data-theme=dark]) [_nghost-%COMP%] .tube[_ngcontent-%COMP%]:after{background:#ddd}@media(max-width:768px){[_nghost-%COMP%]{top:calc(3.25rem + 80px);left:calc(.75rem + 10px)}.tube[_ngcontent-%COMP%]{height:75px;width:20px}}'],changeDetection:0})};var un=["threadSearchInput"],hn=["*"];function fn(n,t){if(n&1){let e=b();r(0,"button",28),u("click",function(){m(e);let o=c();return p(o.toggle())}),r(1,"mat-icon"),d(2,"menu"),a()(),r(3,"button",29),u("click",function(){m(e);let o=c();return p(o.createNewThread())}),r(4,"mat-icon",10),d(5,"play_circle"),a()()}if(n&2){let e=c();l(3),x("disabled",!e.selectedProjectName())}}function bn(n,t){if(n&1){let e=b();r(0,"div",12)(1,"a",30),u("click",function(o){return m(e),c().openMissionControl(),p(o.preventDefault())}),r(2,"mat-icon"),d(3,"rocket_launch"),a(),r(4,"span",31),d(5,"Task Control"),a()()()}}function vn(n,t){if(n&1){let e=b();r(0,"div",15)(1,"mat-icon",32),d(2,"search"),a(),r(3,"input",33,0),he("ngModelChange",function(o){m(e);let s=c();return ue(s.threadSearchQuery,o)||(s.threadSearchQuery=o),p(o)}),u("input",function(){m(e);let o=c();return p(o.onThreadSearchInput())}),a(),r(5,"button",34),u("click",function(){m(e);let o=c();return p(o.closeThreadSearch())}),r(6,"mat-icon"),d(7,"close"),a()()()}if(n&2){let e=c();l(3),_e("ngModel",e.threadSearchQuery)}}function Cn(n,t){if(n&1){let e=b();r(0,"div",16)(1,"mat-icon",23),d(2,"forum"),a(),r(3,"span",24),d(4,"Threads"),a(),r(5,"button",35),u("click",function(o){m(e);let s=c();return p(s.toggleThreadSearch(o))}),r(6,"mat-icon"),d(7,"search"),a()()()}}function xn(n,t){n&1&&(r(0,"mat-icon",22),d(1,"keyboard_arrow_up"),a())}function yn(n,t){n&1&&(r(0,"mat-icon",23),d(1,"hub"),a())}function Pn(n,t){n&1&&(r(0,"mat-icon",22),d(1,"keyboard_arrow_up"),a())}function Mn(n,t){n&1&&(r(0,"mat-icon",23),d(1,"tune"),a())}function Sn(n,t){n&1&&(r(0,"div",37)(1,"div",41),V(2,"app-options-panel",42),a()())}function wn(n,t){if(n&1){let e=b();r(0,"div",36)(1,"a",21),u("click",function(o){return m(e),c(3).openProjectConfig(),o.preventDefault(),p(o.stopPropagation())}),r(2,"mat-icon",23),d(3,"settings_applications"),a(),r(4,"span",24),d(5,"Project Configuration"),a()()()}}function Tn(n,t){n&1&&(r(0,"div",36)(1,"a",43)(2,"mat-icon",23),d(3,"settings_applications"),a(),r(4,"span",24),d(5,"Project config (No project)"),a()()())}function On(n,t){if(n&1&&g(0,wn,6,0,"div",36)(1,Tn,6,0,"div",36),n&2){let e=c(2);_(e.selectedProjectName()?0:1)}}function kn(n,t){if(n&1){let e=b();r(0,"div",36)(1,"a",21),u("click",function(o){return m(e),c(2).openAgents(),o.preventDefault(),p(o.stopPropagation())}),r(2,"mat-icon",23),d(3,"smart_toy"),a(),r(4,"span",24),d(5,"Agents"),a()()()}}function En(n,t){n&1&&(r(0,"div",36)(1,"a",43)(2,"mat-icon",23),d(3,"smart_toy"),a(),r(4,"span",24),d(5,"Agents (No project)"),a()()())}function Dn(n,t){if(n&1){let e=b();r(0,"div",36)(1,"a",21),u("click",function(o){return m(e),c(2).openPrompts(),o.preventDefault(),p(o.stopPropagation())}),r(2,"mat-icon",23),d(3,"description"),a(),r(4,"span",24),d(5,"Prompts"),a()()()}}function Nn(n,t){n&1&&(r(0,"div",36)(1,"a",43)(2,"mat-icon",23),d(3,"description"),a(),r(4,"span",24),d(5,"Prompts (No project)"),a()()())}function jn(n,t){if(n&1){let e=b();r(0,"div",36)(1,"a",21),u("click",function(o){return m(e),c(2).openSchedulers(),o.preventDefault(),p(o.stopPropagation())}),r(2,"mat-icon",23),d(3,"schedule"),a(),r(4,"span",24),d(5,"Schedulers"),a()()()}}function Vn(n,t){n&1&&(r(0,"div",36)(1,"a",43)(2,"mat-icon",23),d(3,"schedule"),a(),r(4,"span",24),d(5,"Schedulers (No project)"),a()()())}function Fn(n,t){n&1&&(r(0,"mat-icon",22),d(1,"keyboard_arrow_up"),a())}function In(n,t){n&1&&(r(0,"mat-icon",23),d(1,"rocket_launch"),a())}function zn(n,t){if(n&1&&(r(0,"div",37),V(1,"app-preview-panel",44),a()),n&2){let e=c(3);l(),x("projectName",e.selectedProjectName())}}function An(n,t){if(n&1){let e=b();r(0,"div",36)(1,"a",21),u("click",function(o){return m(e),c(2).toggleSection("preview"),o.preventDefault(),p(o.stopPropagation())}),g(2,Fn,2,0,"mat-icon",22)(3,In,2,0,"mat-icon",23),r(4,"span",24),d(5,"Preview Server"),a()(),g(6,zn,2,1,"div",37),a()}if(n&2){let e=c(2);C("expanded",e.expandedSections.preview),l(),C("active",e.expandedSections.preview),l(),_(e.expandedSections.preview?2:3),l(4),_(e.expandedSections.preview?6:-1)}}function Ln(n,t){if(n&1){let e=b();r(0,"div",25)(1,"div",36)(2,"a",21),u("click",function(o){return m(e),c().toggleSection("config"),p(o.preventDefault())}),g(3,Pn,2,0,"mat-icon",22)(4,Mn,2,0,"mat-icon",23),r(5,"span",24),d(6,"Preferences"),a()(),g(7,Sn,3,0,"div",37),a(),r(8,"div",36)(9,"a",21),u("click",function(o){return m(e),c().openTokenUsage(),o.preventDefault(),p(o.stopPropagation())}),r(10,"mat-icon",23),d(11,"data_usage"),a(),r(12,"span",24),d(13,"Token Usage"),a()()(),r(14,"div",36)(15,"a",21),u("click",function(o){return m(e),c().openUserConfig(),o.preventDefault(),p(o.stopPropagation())}),r(16,"mat-icon",23),d(17,"manage_accounts"),a(),r(18,"span",24),d(19,"User Configuration"),a()()(),g(20,On,2,1),g(21,kn,6,0,"div",36)(22,En,6,0,"div",36),g(23,Dn,6,0,"div",36)(24,Nn,6,0,"div",36),g(25,jn,6,0,"div",36)(26,Vn,6,0,"div",36),g(27,An,7,6,"div",38),r(28,"div",36)(29,"a",39),V(30,"img",40),r(31,"span",24),d(32,"Contribute on GitHub"),a()()()()}if(n&2){let e=c();l(),C("expanded",e.expandedSections.config),l(),C("active",e.expandedSections.config),l(),_(e.expandedSections.config?3:4),l(4),_(e.expandedSections.config?7:-1),l(13),_(e.isAdmin?20:-1),l(),_(e.selectedProjectName()?21:22),l(2),_(e.selectedProjectName()?23:24),l(2),_(e.selectedProjectName()?25:26),l(2),_(e.hasPreviewConfig()?27:-1),l(3),le("src","CODAY-Logo.png",ne)}}function Rn(n,t){if(n&1){let e=b();r(0,"div",27)(1,"mat-icon",45),d(2,"warning"),a(),r(3,"span",46),d(4),a(),r(5,"button",47),u("click",function(){m(e);let o=c();return p(o.configErrorMessage="")}),r(6,"mat-icon"),d(7,"close"),a()()()}if(n&2){let e=c();l(4),y(e.configErrorMessage)}}var yt=class n{destroy$=new ze;sidenavStateChange=new ee;drawerOpen=!1;breakpointObserver=v(We);isDesktop=w(this.breakpointObserver.observe("(min-width: 1400px)").pipe(K(t=>t.matches)),{initialValue:!1});userOpenPreference=P(!0);isOpen=S(()=>this.userOpenPreference());isAdmin=!1;configErrorMessage="";expandedSections={config:!1,preview:!1,settings:!1};isThreadSearchActive=!1;threadSearchQuery="";threadSearchInput;dialog=v(Ye);configApi=v(ut);projectStateService=v(ve);projectApi=v(be);router=v(fe);preferences=v(et);threadStateService=v(H);projects=w(this.projectStateService.projectList$);selectedProject=w(this.projectStateService.selectedProject$);selectedProjectName=w(this.projectStateService.selectedProject$.pipe(K(t=>t?.name)));isProjectVolatile=w(this.projectStateService.selectedProject$.pipe(K(t=>t?.config?.volatile||!1)));forcedProject=w(this.projectStateService.forcedProject$);hasPreviewConfig=w(this.projectStateService.selectedProject$.pipe(K(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($(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($(this.destroy$)).subscribe({next:t=>{console.log("[SIDENAV] User config loaded, opening dialog"),this.dialog.open(Ne,{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($(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($(this.destroy$)).subscribe({next:e=>{console.log("[SIDENAV] Project config loaded, opening dialog"),this.dialog.open(Ne,{data:{configType:"project",projectName:t,initialContent:JSON.stringify(e,null,2)}}).afterClosed().subscribe(o=>{o&&this.saveProjectConfig(t,o)})},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($(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(o=>{this.expandedSections[o]=!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=N({type:n,selectors:[["app-sidenav"]],viewQuery:function(e,i){if(e&1&&me(un,5),e&2){let o;pe(o=ge())&&(i.threadSearchInput=o.first)}},inputs:{drawerOpen:"drawerOpen"},outputs:{sidenavStateChange:"sidenavStateChange"},ngContentSelectors:hn,decls:36,vars:24,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"],[3,"sidenavOpen"],["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&&(Ue(),g(0,fn,6,1),r(1,"mat-sidenav-container",1)(2,"mat-sidenav",2),u("closed",function(){return i.close()}),r(3,"div",3)(4,"button",4),u("click",function(){return i.close()}),r(5,"mat-icon"),d(6,"chevron_left"),a()(),r(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(),r(8,"div",6)(9,"h2",7),d(10),a()()(),r(11,"div",8)(12,"a",9),u("click",function(s){return i.createNewThread(),s.preventDefault()}),r(13,"mat-icon",10),d(14,"play_circle"),a(),r(15,"span",11),d(16,"Start a new thread"),a()()(),g(17,bn,6,0,"div",12),r(18,"div",13)(19,"div",14),g(20,vn,8,1,"div",15)(21,Cn,8,0,"div",16),r(22,"div",17)(23,"app-thread-selector",18),u("searchModeChange",function(s){return i.onThreadSearchModeChange(s)})("threadSelected",function(){return i.onThreadSelectedOnMobile()}),a()()()(),r(24,"div",19)(25,"div",20)(26,"a",21),u("click",function(s){return i.toggleSection("settings"),s.preventDefault()}),g(27,xn,2,0,"mat-icon",22)(28,yn,2,0,"mat-icon",23),r(29,"span",24),d(30,"Control Center"),a()(),g(31,Ln,33,12,"div",25),a()()(),r(32,"mat-sidenav-content"),Xe(33),a()(),V(34,"app-context-gauge",26),g(35,Rn,8,1,"div",27)),e&2&&(_(!i.isOpen()&&!i.drawerOpen?0:-1),l(),C("sidenav-open",i.isOpen()),x("hasBackdrop",!1),l(),x("opened",i.isOpen())("disableClose",!0),l(5),le("src","CODAY-Logo.png",ne),l(3),y(i.selectedProjectName()),l(7),_(i.selectedProjectName()?17:-1),l(3),_(i.isThreadSearchActive?20:21),l(3),x("searchMode",i.isThreadSearchActive)("searchQuery",i.threadSearchQuery),l(),C("is-admin",i.isAdmin),l(),C("expanded",i.expandedSections.settings),l(),C("active",i.expandedSections.settings),l(),_(i.expandedSections.settings?27:28),l(4),_(i.expandedSections.settings?31:-1),l(),C("sidenav-closed-offset",!i.isOpen()),l(2),x("sidenavOpen",i.isOpen()),l(),_(i.configErrorMessage?35:-1))},dependencies:[Pe,Ce,xe,ye,_t,pt,gt,mt,W,q,G,Q,rt,ht,De,Me,Se,Te],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{yt as a};
@@ -1 +1 @@
1
- import{a}from"./chunk-PXY6PLET.js";import"./chunk-6UXZYGDR.js";import"./chunk-MQEDNZF7.js";import"./chunk-BLRBIAYK.js";import"./chunk-6XX7GME4.js";import"./chunk-VMYKE4ZC.js";import"./chunk-7OGOI6WM.js";import"./chunk-CHEXA6RY.js";export{a as UserFormComponent};
1
+ import{a}from"./chunk-AK746XRX.js";import"./chunk-H6NBS4JE.js";import"./chunk-VZOBZ3DD.js";import"./chunk-UQTA3ACH.js";import"./chunk-6XX7GME4.js";import"./chunk-VMYKE4ZC.js";import"./chunk-7OGOI6WM.js";import"./chunk-CHEXA6RY.js";export{a as UserFormComponent};
@@ -1 +1 @@
1
- import{a as P,b as O}from"./chunk-35S3IW2A.js";import{a as x}from"./chunk-MQEDNZF7.js";import{d as S}from"./chunk-YFCRBVWD.js";import{b as C,c as M}from"./chunk-6XX7GME4.js";import{Db as d,Fb as y,Ka as _,Tb as u,Vb as T,Wa as c,ca as s,lb as b,mb as f,mc as p,rb as v,sb as a,ta as g,tb as l,ub as m}from"./chunk-CHEXA6RY.js";function N(o,e){if(o&1&&u(0),o&2){let t=y();T(" ",t.userInitials()," ")}}function V(o,e){o&1&&u(0," \u2022\u2022\u2022 ")}var h=class o{router=s(M);userState=s(x);themePort=s(S);namespaceState=s(P);menuOpen=g(!1);isAdmin=p(()=>this.userState.currentUser()?.isAdmin===!0);isDark=p(()=>{let{mode:e}=this.themePort.theme();return e==="dark"?!0:e==="light"?!1:typeof document<"u"&&document.documentElement.getAttribute("data-theme")?.includes("dark")===!0});themeVariant=p(()=>this.themePort.theme().variant);userInitials=p(()=>{let e=this.userState.currentUser();if(!e)return"";let t=e.firstname?.[0]??"",n=e.lastname?.[0]??"";return(t+n).toUpperCase()||e.email?.[0]?.toUpperCase()||""});showTechnical=g(!1);navigateHome(){let e=this.namespaceState.activeNamespaceId();this.router.navigate(["/agentos/home"],e?{queryParams:{ns:e}}:{})}toggleMenu(e){e.stopPropagation(),this.menuOpen.update(t=>!t)}closeMenu(e){e.stopPropagation(),this.menuOpen.set(!1)}onNavigate(e){this.menuOpen.set(!1),this.router.navigate([e])}onThemeToggle(){this.menuOpen.set(!1);let e=this.isDark()?"light":"dark";this.themePort.setTheme({variant:this.themePort.theme().variant,mode:e})}onThemeVariantChanged(e){this.menuOpen.set(!1);let t=this.themePort.theme();this.themePort.setTheme({variant:e,mode:t.mode})}onLogsToggle(){this.menuOpen.set(!1)}static \u0275fac=function(t){return new(t||o)};static \u0275cmp=c({type:o,selectors:[["agentos-shell-topbar"]],decls:10,vars:6,consts:[[1,"shell-topbar"],["type","button","title","Home",1,"shell-topbar__brand",3,"click"],["src","CODAY-Logo.png","alt","Coday",1,"shell-topbar__logo-img"],[1,"shell-topbar__logo-text"],[1,"shell-topbar__user-menu"],["type","button","title","Menu",1,"shell-topbar__user-btn",3,"click"],["variant","topbar",3,"navigateTo","themeToggled","themeVariantChanged","logsToggled","closed","open","isAdmin","isDark","themeVariant","showTechnical"]],template:function(t,n){t&1&&(a(0,"div",0)(1,"button",1),d("click",function(){return n.navigateHome()}),m(2,"img",2),a(3,"span",3),u(4,"Coday"),l()(),a(5,"div",4)(6,"button",5),d("click",function(r){return n.toggleMenu(r)}),b(7,N,1,1)(8,V,1,0),l(),a(9,"agentos-shell-user-menu",6),d("navigateTo",function(r){return n.onNavigate(r)})("themeToggled",function(){return n.onThemeToggle()})("themeVariantChanged",function(r){return n.onThemeVariantChanged(r)})("logsToggled",function(){return n.onLogsToggle()})("closed",function(r){return n.closeMenu(r)}),l()()()),t&2&&(_(7),f(n.userInitials()?7:8),_(2),v("open",n.menuOpen())("isAdmin",n.isAdmin())("isDark",n.isDark())("themeVariant",n.themeVariant())("showTechnical",n.showTechnical()))},dependencies:[O],styles:[".shell-topbar[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:14px 12px;border-bottom:1px solid var(--color-divider);background:var(--color-bg);flex-shrink:0}.shell-topbar__brand[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:0;border:none;background:transparent;cursor:pointer;transition:opacity .14s ease}.shell-topbar__brand[_ngcontent-%COMP%]:hover{opacity:.8}.shell-topbar__logo-img[_ngcontent-%COMP%]{height:28px;width:auto;object-fit:contain;display:block;flex:none}.shell-topbar__logo-text[_ngcontent-%COMP%]{font-weight:700;font-size:18px;color:var(--color-text);letter-spacing:-.02em;white-space:nowrap}.shell-topbar__user-menu[_ngcontent-%COMP%]{position:relative;flex-shrink:0}.shell-topbar__user-btn[_ngcontent-%COMP%]{width:32px;height:32px;flex:none;display:grid;place-items:center;border:1px solid var(--color-divider);background:var(--color-surface);font-family:var(--font-heading);font-weight:600;font-size:13px;color:var(--color-accent-700);cursor:pointer;transition:border-color .14s;border-radius:0}.shell-topbar__user-btn[_ngcontent-%COMP%]:hover{border-color:var(--color-accent)}"],changeDetection:0})};var k=class o{static \u0275fac=function(t){return new(t||o)};static \u0275cmp=c({type:o,selectors:[["agentos-layout"]],decls:4,vars:0,consts:[[1,"layout"],[1,"layout__content"]],template:function(t,n){t&1&&(a(0,"div",0),m(1,"agentos-shell-topbar"),a(2,"main",1),m(3,"router-outlet"),l()())},dependencies:[C,h],styles:[".layout[_ngcontent-%COMP%]{display:flex;flex-direction:column;min-height:100vh}.layout__content[_ngcontent-%COMP%]{flex:1;overflow-y:auto}"]})};export{k as a};
1
+ import{a as P,b as O}from"./chunk-UWYJO2DN.js";import{a as x}from"./chunk-VZOBZ3DD.js";import{d as S}from"./chunk-YFCRBVWD.js";import{b as C,c as M}from"./chunk-6XX7GME4.js";import{Db as d,Fb as y,Ka as _,Tb as u,Vb as T,Wa as c,ca as s,lb as b,mb as f,mc as p,rb as v,sb as a,ta as g,tb as l,ub as m}from"./chunk-CHEXA6RY.js";function N(o,e){if(o&1&&u(0),o&2){let t=y();T(" ",t.userInitials()," ")}}function V(o,e){o&1&&u(0," \u2022\u2022\u2022 ")}var h=class o{router=s(M);userState=s(x);themePort=s(S);namespaceState=s(P);menuOpen=g(!1);isAdmin=p(()=>this.userState.currentUser()?.isAdmin===!0);isDark=p(()=>{let{mode:e}=this.themePort.theme();return e==="dark"?!0:e==="light"?!1:typeof document<"u"&&document.documentElement.getAttribute("data-theme")?.includes("dark")===!0});themeVariant=p(()=>this.themePort.theme().variant);userInitials=p(()=>{let e=this.userState.currentUser();if(!e)return"";let t=e.firstname?.[0]??"",n=e.lastname?.[0]??"";return(t+n).toUpperCase()||e.email?.[0]?.toUpperCase()||""});showTechnical=g(!1);navigateHome(){let e=this.namespaceState.activeNamespaceId();this.router.navigate(["/agentos/home"],e?{queryParams:{ns:e}}:{})}toggleMenu(e){e.stopPropagation(),this.menuOpen.update(t=>!t)}closeMenu(e){e.stopPropagation(),this.menuOpen.set(!1)}onNavigate(e){this.menuOpen.set(!1),this.router.navigate([e])}onThemeToggle(){this.menuOpen.set(!1);let e=this.isDark()?"light":"dark";this.themePort.setTheme({variant:this.themePort.theme().variant,mode:e})}onThemeVariantChanged(e){this.menuOpen.set(!1);let t=this.themePort.theme();this.themePort.setTheme({variant:e,mode:t.mode})}onLogsToggle(){this.menuOpen.set(!1)}static \u0275fac=function(t){return new(t||o)};static \u0275cmp=c({type:o,selectors:[["agentos-shell-topbar"]],decls:10,vars:6,consts:[[1,"shell-topbar"],["type","button","title","Home",1,"shell-topbar__brand",3,"click"],["src","CODAY-Logo.png","alt","Coday",1,"shell-topbar__logo-img"],[1,"shell-topbar__logo-text"],[1,"shell-topbar__user-menu"],["type","button","title","Menu",1,"shell-topbar__user-btn",3,"click"],["variant","topbar",3,"navigateTo","themeToggled","themeVariantChanged","logsToggled","closed","open","isAdmin","isDark","themeVariant","showTechnical"]],template:function(t,n){t&1&&(a(0,"div",0)(1,"button",1),d("click",function(){return n.navigateHome()}),m(2,"img",2),a(3,"span",3),u(4,"Coday"),l()(),a(5,"div",4)(6,"button",5),d("click",function(r){return n.toggleMenu(r)}),b(7,N,1,1)(8,V,1,0),l(),a(9,"agentos-shell-user-menu",6),d("navigateTo",function(r){return n.onNavigate(r)})("themeToggled",function(){return n.onThemeToggle()})("themeVariantChanged",function(r){return n.onThemeVariantChanged(r)})("logsToggled",function(){return n.onLogsToggle()})("closed",function(r){return n.closeMenu(r)}),l()()()),t&2&&(_(7),f(n.userInitials()?7:8),_(2),v("open",n.menuOpen())("isAdmin",n.isAdmin())("isDark",n.isDark())("themeVariant",n.themeVariant())("showTechnical",n.showTechnical()))},dependencies:[O],styles:[".shell-topbar[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:14px 12px;border-bottom:1px solid var(--color-divider);background:var(--color-bg);flex-shrink:0}.shell-topbar__brand[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:0;border:none;background:transparent;cursor:pointer;transition:opacity .14s ease}.shell-topbar__brand[_ngcontent-%COMP%]:hover{opacity:.8}.shell-topbar__logo-img[_ngcontent-%COMP%]{height:28px;width:auto;object-fit:contain;display:block;flex:none}.shell-topbar__logo-text[_ngcontent-%COMP%]{font-weight:700;font-size:18px;color:var(--color-text);letter-spacing:-.02em;white-space:nowrap}.shell-topbar__user-menu[_ngcontent-%COMP%]{position:relative;flex-shrink:0}.shell-topbar__user-btn[_ngcontent-%COMP%]{width:32px;height:32px;flex:none;display:grid;place-items:center;border:1px solid var(--color-divider);background:var(--color-surface);font-family:var(--font-heading);font-weight:600;font-size:13px;color:var(--color-accent-700);cursor:pointer;transition:border-color .14s;border-radius:0}.shell-topbar__user-btn[_ngcontent-%COMP%]:hover{border-color:var(--color-accent)}"],changeDetection:0})};var k=class o{static \u0275fac=function(t){return new(t||o)};static \u0275cmp=c({type:o,selectors:[["agentos-layout"]],decls:4,vars:0,consts:[[1,"layout"],[1,"layout__content"]],template:function(t,n){t&1&&(a(0,"div",0),m(1,"agentos-shell-topbar"),a(2,"main",1),m(3,"router-outlet"),l()())},dependencies:[C,h],styles:[".layout[_ngcontent-%COMP%]{display:flex;flex-direction:column;min-height:100vh}.layout__content[_ngcontent-%COMP%]{flex:1;overflow-y:auto}"]})};export{k as a};