@whoz-oss/coday-client 3.17.0 → 3.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/browser/chunk-2H_m7V_L.js +1 -0
  2. package/browser/{chunk-BXkvjekT.js → chunk-3m_nS8Y5.js} +2 -2
  3. package/browser/chunk-4tOVGgPj.js +1 -0
  4. package/browser/{chunk-BPfJALqU.js → chunk-82BMsVX3.js} +1 -1
  5. package/browser/{chunk-CxUcyBb9.js → chunk-B3NyUUXq.js} +1 -1
  6. package/browser/chunk-B55TXBfo.js +1 -0
  7. package/browser/{chunk-CI760KmO.js → chunk-B9NYLAhC.js} +1 -1
  8. package/browser/chunk-BEaYQhbI.js +508 -0
  9. package/browser/chunk-BI4kHPfc.js +1 -0
  10. package/browser/chunk-BID9NaLj.js +1 -0
  11. package/browser/{chunk-Ci9l-k84.js → chunk-BOpm3F5F.js} +1 -1
  12. package/browser/{chunk-CpZK7G-Q.js → chunk-BWLCegs8.js} +2 -2
  13. package/browser/{chunk-DjoW6kqa.js → chunk-BWZcAdUl.js} +5 -5
  14. package/browser/{chunk-DqC8XT4v.js → chunk-BXsNw_60.js} +1 -1
  15. package/browser/chunk-BZ-rNYX5.js +1 -0
  16. package/browser/{chunk-BHvLB-pV.js → chunk-B_5qWQZJ.js} +1 -1
  17. package/browser/{chunk-DMtXGu5h.js → chunk-BcHHkjC4.js} +1 -1
  18. package/browser/{chunk-CI7wYBKk.js → chunk-BhD8uvAV.js} +1 -1
  19. package/browser/{chunk-DpHEu7EG.js → chunk-Bha8h69K.js} +1 -1
  20. package/browser/chunk-BhdMedPO.js +37 -0
  21. package/browser/chunk-BiwhEkuA.js +1 -0
  22. package/browser/{chunk-ClSDInQq.js → chunk-Bkwb10Tz.js} +1 -1
  23. package/browser/chunk-BlO8XEX7.js +1 -0
  24. package/browser/{chunk-b6g-uBR5.js → chunk-BmiWFhjp.js} +1 -1
  25. package/browser/{chunk-BVAD9f9s.js → chunk-BnDz6aYG.js} +1 -1
  26. package/browser/chunk-BqH7Wffn.js +5 -0
  27. package/browser/{chunk-LVItL87L.js → chunk-BrZnGAfk.js} +1 -1
  28. package/browser/{chunk-D202v_ff.js → chunk-Bu2KbiEO.js} +1 -1
  29. package/browser/{chunk-B6BZBDSv.js → chunk-C3kED08r.js} +5 -5
  30. package/browser/{chunk-Bu5Xq3QT.js → chunk-C4bnTLvT.js} +1 -1
  31. package/browser/{chunk-EBW8PloQ.js → chunk-C5I2MlRU.js} +1 -1
  32. package/browser/{chunk-ClEmA_ih.js → chunk-C9j9HPDY.js} +1 -1
  33. package/browser/{chunk-B626-rya.js → chunk-CEeAV-bb.js} +1 -1
  34. package/browser/{chunk-Brx_KbnM.js → chunk-CNQEET68.js} +1 -1
  35. package/browser/chunk-CNfTQeDy.js +1 -0
  36. package/browser/{chunk-DFQuWS_F.js → chunk-CR2xcumM.js} +1 -1
  37. package/browser/{chunk-BkN5jb4J.js → chunk-CUeRU4T-.js} +1 -1
  38. package/browser/chunk-Cno6SC-J.js +2 -0
  39. package/browser/{chunk-bfpuueWC.js → chunk-CorOD5-V.js} +3 -3
  40. package/browser/{chunk-B1OTuTxt.js → chunk-CvEqqOCm.js} +1 -1
  41. package/browser/{chunk-DQtoh8wv.js → chunk-Cwpn9dPE.js} +1 -1
  42. package/browser/{chunk-B7kKWG4P.js → chunk-Cx3RQESQ.js} +1 -1
  43. package/browser/{chunk-DO3lSvop.js → chunk-CxKynLjd.js} +1 -1
  44. package/browser/chunk-D8Bz7q-C.js +675 -0
  45. package/browser/{chunk-DCwEaE_b.js → chunk-DAyHNJOx.js} +1 -1
  46. package/browser/chunk-DBfSV0o-.js +2 -0
  47. package/browser/chunk-DEAo8Gsm.js +190 -0
  48. package/browser/{chunk-DKllQ3Ve.js → chunk-DHF4GvxN.js} +1 -1
  49. package/browser/chunk-DIhIuMRR.js +9 -0
  50. package/browser/chunk-DK7la0Zv.js +1 -0
  51. package/browser/{chunk-Bgd8Jkga.js → chunk-DKUyWR_o.js} +1 -1
  52. package/browser/chunk-DP1Oiy0T.js +1 -0
  53. package/browser/chunk-DSgmn8Nl.js +276 -0
  54. package/browser/{chunk-CUz5MHdA.js → chunk-DVVwrDwV.js} +1 -1
  55. package/browser/chunk-DWlwteaE.js +55 -0
  56. package/browser/{chunk-DxrynR3o.js → chunk-DXAodgYO.js} +1 -1
  57. package/browser/chunk-Ddy7zzYX.js +1 -0
  58. package/browser/{chunk-C5WD0UQE.js → chunk-DrITgtaw.js} +3 -3
  59. package/browser/{chunk-mrKeqPKc.js → chunk-Drt7fOvo.js} +1 -1
  60. package/browser/chunk-Dw8nvU1v.js +2 -0
  61. package/browser/{chunk-C2VdQfMJ.js → chunk-HERnQhug.js} +1 -1
  62. package/browser/{chunk-CKhGzoqa.js → chunk-RlCcRMQy.js} +1 -1
  63. package/browser/chunk-iwYQP1W9.js +1 -0
  64. package/browser/chunk-kXODoW4J.js +1 -0
  65. package/browser/{chunk-CXTwGKdl.js → chunk-nbZfjdVD.js} +1 -1
  66. package/browser/{chunk-DHb3-uKf.js → chunk-t5r49PeM.js} +1 -1
  67. package/browser/{chunk-B3-4EW3s.js → chunk-vG5Um99w.js} +1 -1
  68. package/browser/{chunk-BtEXE3Xz.js → chunk-vse5stCO.js} +1 -1
  69. package/browser/chunk-wricEDWB.js +1 -0
  70. package/browser/index.html +1 -1
  71. package/browser/main-K6RKSHKK.js +1811 -0
  72. package/package.json +1 -1
  73. package/browser/chunk-0njD_aMa.js +0 -2
  74. package/browser/chunk-6WIaUDav.js +0 -1
  75. package/browser/chunk-B7yga-a4.js +0 -1
  76. package/browser/chunk-BAWubWk8.js +0 -1
  77. package/browser/chunk-BDaTUrH4.js +0 -1
  78. package/browser/chunk-BJ5G7Y-a.js +0 -276
  79. package/browser/chunk-BTX631I3.js +0 -5
  80. package/browser/chunk-BYyTBqh4.js +0 -37
  81. package/browser/chunk-B_49KV6W.js +0 -1
  82. package/browser/chunk-BaO2vi_O.js +0 -675
  83. package/browser/chunk-BcT0wYqu.js +0 -2
  84. package/browser/chunk-BdJzYh5V.js +0 -190
  85. package/browser/chunk-BwDJA6_r.js +0 -55
  86. package/browser/chunk-C49BBPGm.js +0 -1
  87. package/browser/chunk-CNAj5Eon.js +0 -1
  88. package/browser/chunk-D-jBfPIO.js +0 -1
  89. package/browser/chunk-DMRb150M.js +0 -2
  90. package/browser/chunk-DjMtxVWg.js +0 -508
  91. package/browser/chunk-DqioJb1X.js +0 -1
  92. package/browser/chunk-DrzvCb86.js +0 -1
  93. package/browser/chunk-DwFGK2iu.js +0 -1
  94. package/browser/chunk-DxvmpOv5.js +0 -1
  95. package/browser/chunk-P8B5rz7L.js +0 -1
  96. package/browser/chunk-R-GmZrHu.js +0 -9
  97. package/browser/main-LBRSRTYI.js +0 -1811
@@ -1 +1 @@
1
- import {f}from'./chunk-BHvLB-pV.js';import {g,bm as _m,R as Re,a as Gi,E as ET,h as Fw,i as hr,k as Gn,m as ws,o as Rg,Q as QC,n as hl,q as oC,af as Eg,ag as mT,M as MC,t as nI,v as bg,x as iC,I as fy,P,aF as A,Y as x,Z as z,_ as Ue,$ as zt,a0 as jt,a1 as Vt,a2 as Nt,j as pr,bn as Xt,ai as em,aj as tT,a3 as GI,r as cC,bo as sC,a8 as Yg,ak as Jg,a6 as qI,y as uC,a5 as Dl,ac as EC,a9 as gC,aa as wf,ab as Cf,bp as yl,bq as vl,ah as aT,b4 as cT,A as Ug,b0 as Qg,a4 as aC,T as Tg,S as Sg}from'./main-LBRSRTYI.js';import {P as Pt}from'./chunk-BdJzYh5V.js';import {T as Tn,S as Sn,n as nt$1,a as ae,l as le,c as ce}from'./chunk-bfpuueWC.js';import {W as Wn,o as ot$1,i as it$1,I as In,D as De,B as Be,y as ya,E as En}from'./chunk-BaO2vi_O.js';import'./chunk-DjMtxVWg.js';import {y as yt,w as wt,t as ti,Q as Qn,e as ei,Y as Ye$1,f as fn,m as mn,Z as Zn,g as gt,$ as $t,W as Wt,c as cn}from'./chunk-BYyTBqh4.js';var w=class s{http=g(fy);projectState=g(P);getBaseUrl(){return `/api/projects/${this.projectState.getSelectedProjectIdOrThrow()}/agents`}listEditableAgents(){return this.http.get(`${this.getBaseUrl()}/editable`)}getAgent(t){return this.http.get(`${this.getBaseUrl()}/${encodeURIComponent(t)}`)}createAgent(t,e){return this.http.post(this.getBaseUrl(),{location:e,definition:t})}updateAgent(t,e){return this.http.put(`${this.getBaseUrl()}/${encodeURIComponent(t)}`,{definition:e})}listDocuments(t){return this.http.get(`${this.getBaseUrl()}/documents`,{params:{location:t}})}uploadDocument(t,e){return new A(n=>{let a=new FileReader;a.onload=()=>{let r=a.result.split(",")[1];this.http.post(`${this.getBaseUrl()}/documents`,{filename:e.name,content:r,mimeType:e.type},{params:{location:t}}).subscribe(n);},a.onerror=()=>n.error(a.error),a.readAsDataURL(e);})}deleteAgent(t){return this.http.delete(`${this.getBaseUrl()}/${encodeURIComponent(t)}`)}static \u0275fac=function(e){return new(e||s)};static \u0275prov=x({token:s,factory:s.\u0275fac,providedIn:"root"})};function ze(s,t){s&1&&(ws(0,"p",15),QC(1,"No integrations defined \u2014 agent will have access to all tools."),hl());}function qe(s,t){if(s&1){let e=gC();ws(0,"div",16)(1,"mat-form-field",22)(2,"mat-label"),QC(3,"Integration"),hl(),ws(4,"input",23),em("ngModelChange",function(a){let r=wf(e).$implicit;return tT(r.integration,a)||(r.integration=a),Cf(a)}),hl(),GI(),hl(),ws(5,"mat-form-field",24)(6,"mat-label"),QC(7,"Tools (comma-separated)"),hl(),ws(8,"input",25),em("ngModelChange",function(a){let r=wf(e).$implicit;return tT(r.tools,a)||(r.tools=a),Cf(a)}),hl(),GI(),hl(),ws(9,"button",26),Rg("click",function(){let a=wf(e).$index,r=EC();return Cf(r.removeIntegrationRow(a))}),ws(10,"mat-icon"),QC(11,"delete"),hl()()();}if(s&2){let e=t.$implicit;nI(4),Jg("ngModel",e.integration),qI(),nI(4),Jg("ngModel",e.tools),qI();}}function He(s,t){if(s&1&&(ws(0,"p",30),QC(1),hl()),s&2){let e=EC(2);nI(),Yg(e.docUploadError);}}function Ge(s,t){s&1&&(ws(0,"p",15),QC(1,"No mandatory documents defined."),hl());}function Ze(s,t){if(s&1&&Sg(0,"option",35),s&2){let e=t.$implicit;bg("value","documents/"+e);}}function Ke(s,t){if(s&1){let e=gC();ws(0,"div",31)(1,"mat-form-field",32)(2,"mat-label"),QC(3,"Document path"),hl(),ws(4,"input",33),em("ngModelChange",function(a){let r=wf(e).$index,j=EC(2);return tT(j.mandatoryDocs[r],a)||(j.mandatoryDocs[r]=a),Cf(a)}),hl(),GI(),ws(5,"datalist",34),cC(6,Ze,1,1,"option",35,aC),hl()(),ws(8,"button",26),Rg("click",function(){let a=wf(e).$index,r=EC(2);return Cf(r.removeDocRow(a))}),ws(9,"mat-icon"),QC(10,"delete"),hl()()();}if(s&2){let e=t.$index,n=EC(2);nI(4),Jg("ngModel",n.mandatoryDocs[e]),Tg("list","docs-list-"+e),qI(),nI(),bg("id","docs-list-"+e),nI(),uC(n.availableDocuments);}}function Je(s,t){if(s&1){let e=gC();ws(0,"div",6)(1,"span"),QC(2,"Mandatory Documents"),hl(),ws(3,"button",27),Rg("click",function(){wf(e);let a=EC();return Cf(a.addDocRow())}),ws(4,"mat-icon"),QC(5,"add"),hl()(),ws(6,"label",28)(7,"mat-icon"),QC(8,"upload_file"),hl(),ws(9,"input",29),Rg("change",function(a){wf(e);let r=EC();return Cf(r.onDocFileSelected(a))}),hl()()(),oC(10,He,2,1,"p",30),oC(11,Ge,2,0,"p",15),cC(12,Ke,11,3,"div",31,sC);}if(s&2){let e=EC();nI(6),Ug("uploading",e.isUploadingDoc),nI(3),bg("disabled",e.isUploadingDoc),nI(),iC(e.docUploadError?10:-1),nI(),iC(e.mandatoryDocs.length===0?11:-1),nI(),uC(e.mandatoryDocs);}}function Qe(s,t){s&1&&(ws(0,"p",15),QC(1,"\u{1F4A1} Documents can be added after the agent is created."),hl());}function Xe(s,t){if(s&1){let e=gC();ws(0,"div",6),QC(1,"Save to"),hl(),ws(2,"div",36)(3,"label",37)(4,"input",38),em("ngModelChange",function(a){wf(e);let r=EC();return tT(r.location,a)||(r.location=a),Cf(a)}),hl(),GI(),ws(5,"div",39)(6,"div",40)(7,"span",41),QC(8,"\u{1F464}"),hl(),ws(9,"span",42),QC(10,"Project config"),hl()(),ws(11,"p",43),QC(12),hl()()(),ws(13,"label",37)(14,"input",44),em("ngModelChange",function(a){wf(e);let r=EC();return tT(r.location,a)||(r.location=a),Cf(a)}),hl(),GI(),ws(15,"div",39)(16,"div",40)(17,"span",41),QC(18,"\u{1F4E6}"),hl(),ws(19,"span",42),QC(20,"Colocated"),hl()(),ws(21,"p",43),QC(22,"Next to coday.yaml in ./agents/ (committable)"),hl()()()(),ws(23,"p",15),QC(24,"Storage location is permanent and cannot be changed after creation."),hl();}if(s&2){let e=EC();nI(3),Ug("selected",e.location==="project"),nI(),Jg("ngModel",e.location),qI(),nI(8),Qg("~/.coday/projects/","{","name","}","/agents/ (not committed)"),nI(),Ug("selected",e.location==="colocated"),nI(),Jg("ngModel",e.location),qI();}}function Ye(s,t){if(s&1&&(ws(0,"div",17)(1,"span",6),QC(2,"Storage Location"),hl(),ws(3,"span",45),QC(4),hl(),ws(5,"p",15),QC(6,"Cannot be changed after creation."),hl()()),s&2){let e=EC();nI(3),Ug("badge-project",e.location==="project")("badge-colocated",e.location==="colocated"),nI(),Dl(" ",e.location==="project"?"\u{1F464} Project config":"\u{1F4E6} Colocated"," ");}}function $e(s,t){if(s&1&&(ws(0,"div",18)(1,"mat-icon"),QC(2,"error"),hl(),ws(3,"span"),QC(4),hl()()),s&2){let e=EC();nI(4),Yg(e.errorMessage);}}var E=class s{agentCrudApi=g(w);agentApi=g(f);dialogRef=g(z);data=g(Ue);name="";description="";instructions="";aiProvider="";modelName="";temperature=null;maxOutputTokens=null;openaiAssistantId="";integrationRows=[];mandatoryDocs=[];availableDocuments=[];isUploadingDoc=false;docUploadError="";location="project";isSaving=false;errorMessage="";isEditMode=false;ngOnInit(){if(this.isEditMode=this.data.mode==="edit",this.isEditMode&&this.data.agent){let t=this.data.agent.definition;this.name=t.name,this.description=t.description,this.instructions=t.instructions??"",this.aiProvider=t.aiProvider??"",this.modelName=t.modelName??"",this.temperature=t.temperature??null,this.maxOutputTokens=t.maxOutputTokens??null,this.openaiAssistantId=t.openaiAssistantId??"",this.location=this.data.agent.source,t.integrations&&(this.integrationRows=Object.entries(t.integrations).map(([e,n])=>({integration:e,tools:n?.join(", ")??""}))),this.mandatoryDocs=[...t.mandatoryDocs??[]],this.loadAvailableDocuments();}}loadAvailableDocuments(){this.agentCrudApi.listDocuments(this.location).subscribe({next:t=>this.availableDocuments=t,error:()=>this.availableDocuments=[]});}addDocRow(){this.mandatoryDocs.push("");}removeDocRow(t){this.mandatoryDocs.splice(t,1);}onDocFileSelected(t){let e=t.target,n=e.files?.[0];n&&(this.isUploadingDoc=true,this.docUploadError="",this.agentCrudApi.uploadDocument(this.location,n).subscribe({next:a=>{this.isUploadingDoc=false,this.mandatoryDocs.push(a.relativePath),this.loadAvailableDocuments(),e.value="";},error:a=>{this.isUploadingDoc=false,this.docUploadError=a?.error?.error??a?.message??"Upload failed",e.value="";}}));}addIntegrationRow(){this.integrationRows.push({integration:"",tools:""});}removeIntegrationRow(t){this.integrationRows.splice(t,1);}trackByIndex(t){return t}validateForm(){if(!this.name.trim())return this.errorMessage="Name is required",false;if(!/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(this.name.trim()))return this.errorMessage="Name must start with alphanumeric and contain only letters, digits, hyphens or underscores",false;if(!this.description.trim())return this.errorMessage="Description is required",false;for(let t of this.integrationRows)if(!t.integration.trim())return this.errorMessage="Integration name cannot be empty",false;return true}buildDefinition(){let t=this.mandatoryDocs.map(n=>n.trim()).filter(Boolean),e=this.integrationRows.length>0?Object.fromEntries(this.integrationRows.filter(n=>n.integration.trim()).map(n=>[n.integration.trim(),n.tools.split(",").map(a=>a.trim()).filter(Boolean)])):void 0;return {name:this.name.trim(),description:this.description.trim(),instructions:this.instructions.trim()||void 0,aiProvider:this.aiProvider.trim()||void 0,modelName:this.modelName.trim()||void 0,temperature:this.temperature??void 0,maxOutputTokens:this.maxOutputTokens??void 0,openaiAssistantId:this.openaiAssistantId.trim()||void 0,integrations:e,mandatoryDocs:t.length>0?t:void 0}}save(){if(this.errorMessage="",!this.validateForm())return;let t=this.buildDefinition();this.isSaving=true,(this.isEditMode?this.agentCrudApi.updateAgent(this.name.trim(),t):this.agentCrudApi.createAgent(t,this.location)).subscribe({next:()=>{this.isSaving=false,this.agentApi.clearAllCache(),this.dialogRef.close(true);},error:n=>{this.isSaving=false,this.errorMessage=n?.error?.error||n?.message||"Failed to save agent";}});}cancel(){this.dialogRef.close(false);}static \u0275fac=function(e){return new(e||s)};static \u0275cmp=Fw({type:s,selectors:[["app-agent-form"]],decls:69,vars:18,consts:[["mat-dialog-title",""],[1,"form-container"],["appearance","outline",1,"full-width"],["matInput","","placeholder","my-agent","required","",3,"ngModelChange","ngModel","readonly"],["matInput","","placeholder","What does this agent do?","rows","2","required","",3,"ngModelChange","ngModel"],["matInput","","placeholder","System instructions for the agent...","rows","6",3,"ngModelChange","ngModel"],[1,"section-title"],[1,"row-2col"],["appearance","outline"],["matInput","","placeholder","e.g. anthropic, openai",3,"ngModelChange","ngModel"],["matInput","","placeholder","e.g. claude-sonnet-4-5",3,"ngModelChange","ngModel"],["matInput","","type","number","min","0","max","2","step","0.1","placeholder","0.0 \u2013 2.0",3,"ngModelChange","ngModel"],["matInput","","type","number","min","1","placeholder","e.g. 4096",3,"ngModelChange","ngModel"],["matInput","","placeholder","asst_...",3,"ngModelChange","ngModel"],["mat-icon-button","","type","button","title","Add integration",3,"click"],[1,"hint"],[1,"integration-row"],[1,"source-display"],[1,"error-message"],["align","end"],["mat-button","",3,"click","disabled"],["mat-raised-button","","color","primary",3,"click","disabled"],["appearance","outline",1,"integration-name"],["matInput","","placeholder","e.g. GITHUB",3,"ngModelChange","ngModel"],["appearance","outline",1,"integration-tools"],["matInput","","placeholder","Leave empty for all tools",3,"ngModelChange","ngModel"],["mat-icon-button","","type","button","title","Remove",3,"click"],["mat-icon-button","","type","button","title","Add document path",3,"click"],["title","Upload a document to the pool",1,"upload-btn"],["type","file","hidden","",3,"change","disabled"],[1,"doc-upload-error"],[1,"doc-row"],["appearance","outline",1,"doc-field"],["matInput","","placeholder","documents/guide.md",3,"ngModelChange","ngModel"],[3,"id"],[3,"value"],[1,"source-options"],[1,"source-option"],["type","radio","name","location","value","project",3,"ngModelChange","ngModel"],[1,"source-content"],[1,"source-header"],[1,"source-icon"],[1,"source-label"],[1,"source-description"],["type","radio","name","location","value","colocated",3,"ngModelChange","ngModel"],[1,"source-badge"]],template:function(e,n){e&1&&(ws(0,"h2",0),QC(1),hl(),ws(2,"mat-dialog-content")(3,"div",1)(4,"mat-form-field",2)(5,"mat-label"),QC(6,"Name"),hl(),ws(7,"input",3),em("ngModelChange",function(r){return tT(n.name,r)||(n.name=r),r}),hl(),GI(),ws(8,"mat-hint"),QC(9,"Alphanumeric, hyphens and underscores only. Cannot be changed after creation."),hl()(),ws(10,"mat-form-field",2)(11,"mat-label"),QC(12,"Description"),hl(),ws(13,"textarea",4),em("ngModelChange",function(r){return tT(n.description,r)||(n.description=r),r}),hl(),GI(),hl(),ws(14,"mat-form-field",2)(15,"mat-label"),QC(16,"Instructions"),hl(),ws(17,"textarea",5),em("ngModelChange",function(r){return tT(n.instructions,r)||(n.instructions=r),r}),hl(),GI(),ws(18,"mat-hint"),QC(19,"System prompt / instructions sent to the AI model"),hl()(),ws(20,"div",6),QC(21,"AI Configuration"),hl(),ws(22,"div",7)(23,"mat-form-field",8)(24,"mat-label"),QC(25,"AI Provider"),hl(),ws(26,"input",9),em("ngModelChange",function(r){return tT(n.aiProvider,r)||(n.aiProvider=r),r}),hl(),GI(),hl(),ws(27,"mat-form-field",8)(28,"mat-label"),QC(29,"Model Name"),hl(),ws(30,"input",10),em("ngModelChange",function(r){return tT(n.modelName,r)||(n.modelName=r),r}),hl(),GI(),hl()(),ws(31,"div",7)(32,"mat-form-field",8)(33,"mat-label"),QC(34,"Temperature"),hl(),ws(35,"input",11),em("ngModelChange",function(r){return tT(n.temperature,r)||(n.temperature=r),r}),hl(),GI(),ws(36,"mat-hint"),QC(37,"Leave empty for model default"),hl()(),ws(38,"mat-form-field",8)(39,"mat-label"),QC(40,"Max Output Tokens"),hl(),ws(41,"input",12),em("ngModelChange",function(r){return tT(n.maxOutputTokens,r)||(n.maxOutputTokens=r),r}),hl(),GI(),ws(42,"mat-hint"),QC(43,"Leave empty for model default"),hl()()(),ws(44,"mat-form-field",2)(45,"mat-label"),QC(46,"OpenAI Assistant ID"),hl(),ws(47,"input",13),em("ngModelChange",function(r){return tT(n.openaiAssistantId,r)||(n.openaiAssistantId=r),r}),hl(),GI(),ws(48,"mat-hint"),QC(49,"If set, forces aiProvider to openai"),hl()(),ws(50,"div",6)(51,"span"),QC(52,"Integrations"),hl(),ws(53,"button",14),Rg("click",function(){return n.addIntegrationRow()}),ws(54,"mat-icon"),QC(55,"add"),hl()()(),oC(56,ze,2,0,"p",15),cC(57,qe,12,2,"div",16,sC),oC(59,Je,14,5)(60,Qe,2,0,"p",15),oC(61,Xe,25,8),oC(62,Ye,7,5,"div",17),oC(63,$e,5,1,"div",18),hl()(),ws(64,"mat-dialog-actions",19)(65,"button",20),Rg("click",function(){return n.cancel()}),QC(66,"Cancel"),hl(),ws(67,"button",21),Rg("click",function(){return n.save()}),QC(68),hl()()),e&2&&(nI(),Yg(n.isEditMode?"Edit Agent":"Create Agent"),nI(6),Jg("ngModel",n.name),bg("readonly",n.isEditMode),qI(),nI(6),Jg("ngModel",n.description),qI(),nI(4),Jg("ngModel",n.instructions),qI(),nI(9),Jg("ngModel",n.aiProvider),qI(),nI(4),Jg("ngModel",n.modelName),qI(),nI(5),Jg("ngModel",n.temperature),qI(),nI(6),Jg("ngModel",n.maxOutputTokens),qI(),nI(6),Jg("ngModel",n.openaiAssistantId),qI(),nI(9),iC(n.integrationRows.length===0?56:-1),nI(),uC(n.integrationRows),nI(2),iC(n.isEditMode?59:60),nI(2),iC(n.isEditMode?-1:61),nI(),iC(n.isEditMode?62:-1),nI(),iC(n.errorMessage?63:-1),nI(2),bg("disabled",n.isSaving),nI(2),bg("disabled",n.isSaving),nI(),Dl(" ",n.isSaving?"Saving...":"Save"," "));},dependencies:[ti,Qn,ei,Ye$1,fn,mn,Zn,gt,$t,Wt,cn,zt,jt,Vt,Nt,hr,pr,Gn,Tn,Sn,nt$1,ae,le,ce,yt,wt,Pt,Xt],styles:[".form-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:1rem;padding:0;min-width:560px}@media(max-width:768px){.form-container[_ngcontent-%COMP%]{min-width:auto}}.full-width[_ngcontent-%COMP%]{width:100%}.section-title[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;font-size:1rem;font-weight:600;margin-top:.5rem;margin-bottom:-.25rem}.row-2col[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:1rem}@media(max-width:768px){.row-2col[_ngcontent-%COMP%]{grid-template-columns:1fr}}.integration-row[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:.5rem}.integration-row[_ngcontent-%COMP%] .integration-name[_ngcontent-%COMP%]{flex:0 0 180px}.integration-row[_ngcontent-%COMP%] .integration-tools[_ngcontent-%COMP%]{flex:1}.hint[_ngcontent-%COMP%]{margin:0;font-size:.85rem;color:var(--color-text-secondary);font-style:italic}.source-options[_ngcontent-%COMP%]{display:flex;gap:1rem;margin-bottom:.5rem}@media(max-width:768px){.source-options[_ngcontent-%COMP%]{flex-direction:column}}.source-option[_ngcontent-%COMP%]{flex:1;display:flex;align-items:flex-start;gap:.75rem;padding:1rem;background:var(--color-bg);border:2px solid var(--color-border);border-radius:8px;cursor:pointer;transition:all .2s ease}.source-option[_ngcontent-%COMP%]:hover{border-color:var(--color-primary);background:var(--color-bg-hover)}.source-option.selected[_ngcontent-%COMP%]{border-color:var(--color-primary);background:var(--color-bg-hover);box-shadow:0 0 0 1px var(--color-primary)}.source-option[_ngcontent-%COMP%] input[type=radio][_ngcontent-%COMP%]{margin-top:2px;cursor:pointer}.source-option[_ngcontent-%COMP%] .source-content[_ngcontent-%COMP%]{flex:1}.source-option[_ngcontent-%COMP%] .source-content[_ngcontent-%COMP%] .source-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;margin-bottom:.5rem}.source-option[_ngcontent-%COMP%] .source-content[_ngcontent-%COMP%] .source-header[_ngcontent-%COMP%] .source-icon[_ngcontent-%COMP%]{font-size:1.25rem}.source-option[_ngcontent-%COMP%] .source-content[_ngcontent-%COMP%] .source-header[_ngcontent-%COMP%] .source-label[_ngcontent-%COMP%]{font-weight:600;font-size:.95rem}.source-option[_ngcontent-%COMP%] .source-content[_ngcontent-%COMP%] .source-description[_ngcontent-%COMP%]{margin:0;font-size:.85rem;color:var(--color-text-secondary);font-family:monospace;line-height:1.4}.source-display[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.5rem}.source-badge[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem 1rem;border-radius:6px;font-size:.9rem;font-weight:500}.source-badge.badge-project[_ngcontent-%COMP%]{background:#2196f31a;color:#2196f3;border:1px solid rgba(33,150,243,.3)}.source-badge.badge-colocated[_ngcontent-%COMP%]{background:#4caf501a;color:#4caf50;border:1px solid rgba(76,175,80,.3)}.doc-row[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:.5rem}.doc-row[_ngcontent-%COMP%] .doc-field[_ngcontent-%COMP%]{flex:1}.upload-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:50%;cursor:pointer;color:var(--color-text-secondary);transition:background .2s}.upload-btn[_ngcontent-%COMP%]:hover{background:var(--color-bg-hover);color:var(--color-primary)}.upload-btn.uploading[_ngcontent-%COMP%]{opacity:.5;cursor:wait}.upload-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:1.25rem;width:1.25rem;height:1.25rem}.doc-upload-error[_ngcontent-%COMP%]{margin:0;font-size:.85rem;color:var(--color-error)}.error-message[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;padding:.75rem;background:#f443361a;border:1px solid var(--color-error);border-radius:4px;color:var(--color-error)}.error-message[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:1.25rem;width:1.25rem;height:1.25rem}.error-message[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{flex:1}"],changeDetection:1})};var et=()=>[],tt=s=>({id:s});function nt(s,t){if(s&1&&(ws(0,"div",5),QC(1),hl()),s&2){let e=EC();nI(),Yg(e.errorMessage());}}function it(s,t){if(s&1){let e=gC();ws(0,"ds-entity-card",7),Rg("selected",function(a){wf(e);let r=EC();return Cf(r.onEdit(a))}),yl(1,8),ws(2,"button",9),Rg("click",function(a){return a.stopPropagation()}),ws(3,"mat-icon"),QC(4,"more_vert"),hl()(),vl(),hl();}if(s&2){let e=t.$implicit;EC();let n=MC(9);bg("id",e.id)("name",e.name)("description",e.description)("badges",e.badges??aT(6,et)),nI(2),bg("matMenuTriggerFor",n)("matMenuTriggerData",cT(7,tt,e.id));}}function ot(s,t){if(s&1){let e=gC();ws(0,"button",10),Rg("click",function(){let a=wf(e).id,r=EC();return Cf(r.onEdit(a))}),ws(1,"mat-icon"),QC(2,"edit"),hl(),QC(3," Edit "),hl(),ws(4,"button",11),Rg("click",function(){let a=wf(e).id,r=EC();return Cf(r.onDelete(a))}),ws(5,"mat-icon"),QC(6,"delete"),hl(),QC(7," Delete "),hl();}}var Ve=class s{agentCrudApi=g(w);location=g(_m);dialog=g(Re);agents=Gi([]);isLoading=Gi(false);errorMessage=Gi(null);agentItems=ET(()=>this.agents().map(t=>({id:t.name,name:t.name,description:t.description,badges:this.buildBadges(t),groupKey:t.source,groupLabel:t.source==="project"?"Project (~/.coday/)":"Colocated (next to coday.yaml)"})));ngOnInit(){this.loadAgents();}loadAgents(){this.isLoading.set(true),this.errorMessage.set(null),this.agentCrudApi.listEditableAgents().subscribe({next:t=>{this.agents.set(t),this.isLoading.set(false);},error:t=>{this.errorMessage.set(t?.error?.error??"Failed to load agents"),this.isLoading.set(false);}});}onBack(){this.location.back();}onCreate(){this.dialog.open(E,{width:"700px",maxHeight:"90vh",data:{mode:"create"}}).afterClosed().subscribe(e=>{e&&this.loadAgents();});}onEdit(t){this.agentCrudApi.getAgent(t).subscribe({next:e=>{this.dialog.open(E,{width:"700px",maxHeight:"90vh",data:{mode:"edit",agent:e}}).afterClosed().subscribe(a=>{a&&this.loadAgents();});},error:e=>this.errorMessage.set(e?.error?.error??"Failed to load agent")});}onDelete(t){confirm(`Are you sure you want to delete agent "${t}"?`)&&this.agentCrudApi.deleteAgent(t).subscribe({next:()=>this.loadAgents(),error:e=>this.errorMessage.set(e?.error?.error??"Failed to delete agent")});}buildBadges(t){return [t.source==="project"?{label:"project",variant:"info"}:{label:"colocated",variant:"success"}]}static \u0275fac=function(e){return new(e||s)};static \u0275cmp=Fw({type:s,selectors:[["app-agent-list"]],decls:11,vars:5,consts:[["agentCard",""],["cardMenu","matMenu"],[1,"agent-list-page"],["title","Agents","cardMinWidth","260px","contentMaxWidth","1400px","searchPlaceholder","Filter agents\u2026","emptyMessage","No file-based agents found.",3,"createRequested","items","loading","showCreate","itemTemplate"],["toolbar-start","","mat-icon-button","","title","Back",3,"click"],[1,"agent-list__error"],["matMenuContent",""],[3,"selected","id","name","description","badges"],["dsCardActions",""],["mat-icon-button","",3,"click","matMenuTriggerFor","matMenuTriggerData"],["mat-menu-item","",3,"click"],["mat-menu-item","",1,"agent-list__delete-item",3,"click"]],template:function(e,n){if(e&1&&(ws(0,"div",2)(1,"ds-entity-list",3),Rg("createRequested",function(){return n.onCreate()}),ws(2,"button",4),Rg("click",function(){return n.onBack()}),ws(3,"mat-icon"),QC(4,"chevron_left"),hl()()(),oC(5,nt,2,1,"div",5),hl(),Eg(6,it,5,9,"ng-template",null,0,mT),ws(8,"mat-menu",null,1),Eg(10,ot,8,0,"ng-template",6),hl()),e&2){let a=MC(7);nI(),bg("items",n.agentItems())("loading",n.isLoading())("showCreate",true)("itemTemplate",a),nI(4),iC(n.errorMessage()?5:-1);}},dependencies:[Wn,ot$1,it$1,hr,Gn,yt,wt,In,De,Be,ya,En],styles:["[_nghost-%COMP%]{display:block;width:100%;min-height:100vh;background:var(--color-bg);overflow-y:auto}.agent-list__delete-item[_ngcontent-%COMP%]{color:var(--color-error, #ff3b30)}.agent-list__delete-item[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:inherit}.agent-list__error[_ngcontent-%COMP%]{margin:1rem auto;max-width:900px;padding:.75rem 1rem;background:#dc262614;border:1px solid rgba(220,38,38,.25);border-radius:8px;color:var(--color-error, #ff3b30);font-size:.875rem}"],changeDetection:1})};export{Ve as AgentListComponent};
1
+ import {f}from'./chunk-B_5qWQZJ.js';import {g,bm as xm,R as Re,W as Wi,T as TT,j as jw,h as hr,i as Gn,k as Cs,n as kg,J as JC,m as hl,o as aC,af as wg,ag as ET,A as AC,t as sI,_ as _g,u as cC,B as gy,P,aF as R,K as x,X as z,Y as Ue,Z as zt,a0 as jt,a1 as Vt,a2 as Nt,e as pr,bn as Xt,ai as rm,aj as iT,a3 as ZI,q as dC,bo as uC,a8 as Kg,ak as nm,a6 as QI,v as fC,a5 as Dl,ac as CC,a9 as vC,aa as Cf,ab as Tf,bp as yl,bq as vl,ah as dT,b4 as fT,w as zg,b0 as Xg,a4 as lC,S as Sg,M as Mg}from'./main-K6RKSHKK.js';import {P as Pt}from'./chunk-DEAo8Gsm.js';import {T as Tn,S as Sn,n as nt$1,a as ae,l as le,c as ce}from'./chunk-CorOD5-V.js';import {W as Wn,o as ot$1,i as it$1,I as In,D as De,B as Be,y as ya,E as En}from'./chunk-D8Bz7q-C.js';import'./chunk-BEaYQhbI.js';import {y as yt,w as wt,t as ti,Q as Qn,e as ei,Y as Ye$1,f as fn,m as mn,Z as Zn,g as gt,$ as $t,W as Wt,c as cn}from'./chunk-BhdMedPO.js';var w=class s{http=g(gy);projectState=g(P);getBaseUrl(){return `/api/projects/${this.projectState.getSelectedProjectIdOrThrow()}/agents`}listEditableAgents(){return this.http.get(`${this.getBaseUrl()}/editable`)}getAgent(t){return this.http.get(`${this.getBaseUrl()}/${encodeURIComponent(t)}`)}createAgent(t,e){return this.http.post(this.getBaseUrl(),{location:e,definition:t})}updateAgent(t,e){return this.http.put(`${this.getBaseUrl()}/${encodeURIComponent(t)}`,{definition:e})}listDocuments(t){return this.http.get(`${this.getBaseUrl()}/documents`,{params:{location:t}})}uploadDocument(t,e){return new R(n=>{let a=new FileReader;a.onload=()=>{let r=a.result.split(",")[1];this.http.post(`${this.getBaseUrl()}/documents`,{filename:e.name,content:r,mimeType:e.type},{params:{location:t}}).subscribe(n);},a.onerror=()=>n.error(a.error),a.readAsDataURL(e);})}deleteAgent(t){return this.http.delete(`${this.getBaseUrl()}/${encodeURIComponent(t)}`)}static \u0275fac=function(e){return new(e||s)};static \u0275prov=x({token:s,factory:s.\u0275fac,providedIn:"root"})};function ze(s,t){s&1&&(Cs(0,"p",15),JC(1,"No integrations defined \u2014 agent will have access to all tools."),hl());}function qe(s,t){if(s&1){let e=vC();Cs(0,"div",16)(1,"mat-form-field",22)(2,"mat-label"),JC(3,"Integration"),hl(),Cs(4,"input",23),rm("ngModelChange",function(a){let r=Cf(e).$implicit;return iT(r.integration,a)||(r.integration=a),Tf(a)}),hl(),ZI(),hl(),Cs(5,"mat-form-field",24)(6,"mat-label"),JC(7,"Tools (comma-separated)"),hl(),Cs(8,"input",25),rm("ngModelChange",function(a){let r=Cf(e).$implicit;return iT(r.tools,a)||(r.tools=a),Tf(a)}),hl(),ZI(),hl(),Cs(9,"button",26),kg("click",function(){let a=Cf(e).$index,r=CC();return Tf(r.removeIntegrationRow(a))}),Cs(10,"mat-icon"),JC(11,"delete"),hl()()();}if(s&2){let e=t.$implicit;sI(4),nm("ngModel",e.integration),QI(),sI(4),nm("ngModel",e.tools),QI();}}function He(s,t){if(s&1&&(Cs(0,"p",30),JC(1),hl()),s&2){let e=CC(2);sI(),Kg(e.docUploadError);}}function Ge(s,t){s&1&&(Cs(0,"p",15),JC(1,"No mandatory documents defined."),hl());}function Ze(s,t){if(s&1&&Mg(0,"option",35),s&2){let e=t.$implicit;_g("value","documents/"+e);}}function Ke(s,t){if(s&1){let e=vC();Cs(0,"div",31)(1,"mat-form-field",32)(2,"mat-label"),JC(3,"Document path"),hl(),Cs(4,"input",33),rm("ngModelChange",function(a){let r=Cf(e).$index,j=CC(2);return iT(j.mandatoryDocs[r],a)||(j.mandatoryDocs[r]=a),Tf(a)}),hl(),ZI(),Cs(5,"datalist",34),dC(6,Ze,1,1,"option",35,lC),hl()(),Cs(8,"button",26),kg("click",function(){let a=Cf(e).$index,r=CC(2);return Tf(r.removeDocRow(a))}),Cs(9,"mat-icon"),JC(10,"delete"),hl()()();}if(s&2){let e=t.$index,n=CC(2);sI(4),nm("ngModel",n.mandatoryDocs[e]),Sg("list","docs-list-"+e),QI(),sI(),_g("id","docs-list-"+e),sI(),fC(n.availableDocuments);}}function Je(s,t){if(s&1){let e=vC();Cs(0,"div",6)(1,"span"),JC(2,"Mandatory Documents"),hl(),Cs(3,"button",27),kg("click",function(){Cf(e);let a=CC();return Tf(a.addDocRow())}),Cs(4,"mat-icon"),JC(5,"add"),hl()(),Cs(6,"label",28)(7,"mat-icon"),JC(8,"upload_file"),hl(),Cs(9,"input",29),kg("change",function(a){Cf(e);let r=CC();return Tf(r.onDocFileSelected(a))}),hl()()(),aC(10,He,2,1,"p",30),aC(11,Ge,2,0,"p",15),dC(12,Ke,11,3,"div",31,uC);}if(s&2){let e=CC();sI(6),zg("uploading",e.isUploadingDoc),sI(3),_g("disabled",e.isUploadingDoc),sI(),cC(e.docUploadError?10:-1),sI(),cC(e.mandatoryDocs.length===0?11:-1),sI(),fC(e.mandatoryDocs);}}function Qe(s,t){s&1&&(Cs(0,"p",15),JC(1,"\u{1F4A1} Documents can be added after the agent is created."),hl());}function Xe(s,t){if(s&1){let e=vC();Cs(0,"div",6),JC(1,"Save to"),hl(),Cs(2,"div",36)(3,"label",37)(4,"input",38),rm("ngModelChange",function(a){Cf(e);let r=CC();return iT(r.location,a)||(r.location=a),Tf(a)}),hl(),ZI(),Cs(5,"div",39)(6,"div",40)(7,"span",41),JC(8,"\u{1F464}"),hl(),Cs(9,"span",42),JC(10,"Project config"),hl()(),Cs(11,"p",43),JC(12),hl()()(),Cs(13,"label",37)(14,"input",44),rm("ngModelChange",function(a){Cf(e);let r=CC();return iT(r.location,a)||(r.location=a),Tf(a)}),hl(),ZI(),Cs(15,"div",39)(16,"div",40)(17,"span",41),JC(18,"\u{1F4E6}"),hl(),Cs(19,"span",42),JC(20,"Colocated"),hl()(),Cs(21,"p",43),JC(22,"Next to coday.yaml in ./agents/ (committable)"),hl()()()(),Cs(23,"p",15),JC(24,"Storage location is permanent and cannot be changed after creation."),hl();}if(s&2){let e=CC();sI(3),zg("selected",e.location==="project"),sI(),nm("ngModel",e.location),QI(),sI(8),Xg("~/.coday/projects/","{","name","}","/agents/ (not committed)"),sI(),zg("selected",e.location==="colocated"),sI(),nm("ngModel",e.location),QI();}}function Ye(s,t){if(s&1&&(Cs(0,"div",17)(1,"span",6),JC(2,"Storage Location"),hl(),Cs(3,"span",45),JC(4),hl(),Cs(5,"p",15),JC(6,"Cannot be changed after creation."),hl()()),s&2){let e=CC();sI(3),zg("badge-project",e.location==="project")("badge-colocated",e.location==="colocated"),sI(),Dl(" ",e.location==="project"?"\u{1F464} Project config":"\u{1F4E6} Colocated"," ");}}function $e(s,t){if(s&1&&(Cs(0,"div",18)(1,"mat-icon"),JC(2,"error"),hl(),Cs(3,"span"),JC(4),hl()()),s&2){let e=CC();sI(4),Kg(e.errorMessage);}}var E=class s{agentCrudApi=g(w);agentApi=g(f);dialogRef=g(z);data=g(Ue);name="";description="";instructions="";aiProvider="";modelName="";temperature=null;maxOutputTokens=null;openaiAssistantId="";integrationRows=[];mandatoryDocs=[];availableDocuments=[];isUploadingDoc=false;docUploadError="";location="project";isSaving=false;errorMessage="";isEditMode=false;ngOnInit(){if(this.isEditMode=this.data.mode==="edit",this.isEditMode&&this.data.agent){let t=this.data.agent.definition;this.name=t.name,this.description=t.description,this.instructions=t.instructions??"",this.aiProvider=t.aiProvider??"",this.modelName=t.modelName??"",this.temperature=t.temperature??null,this.maxOutputTokens=t.maxOutputTokens??null,this.openaiAssistantId=t.openaiAssistantId??"",this.location=this.data.agent.source,t.integrations&&(this.integrationRows=Object.entries(t.integrations).map(([e,n])=>({integration:e,tools:n?.join(", ")??""}))),this.mandatoryDocs=[...t.mandatoryDocs??[]],this.loadAvailableDocuments();}}loadAvailableDocuments(){this.agentCrudApi.listDocuments(this.location).subscribe({next:t=>this.availableDocuments=t,error:()=>this.availableDocuments=[]});}addDocRow(){this.mandatoryDocs.push("");}removeDocRow(t){this.mandatoryDocs.splice(t,1);}onDocFileSelected(t){let e=t.target,n=e.files?.[0];n&&(this.isUploadingDoc=true,this.docUploadError="",this.agentCrudApi.uploadDocument(this.location,n).subscribe({next:a=>{this.isUploadingDoc=false,this.mandatoryDocs.push(a.relativePath),this.loadAvailableDocuments(),e.value="";},error:a=>{this.isUploadingDoc=false,this.docUploadError=a?.error?.error??a?.message??"Upload failed",e.value="";}}));}addIntegrationRow(){this.integrationRows.push({integration:"",tools:""});}removeIntegrationRow(t){this.integrationRows.splice(t,1);}trackByIndex(t){return t}validateForm(){if(!this.name.trim())return this.errorMessage="Name is required",false;if(!/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(this.name.trim()))return this.errorMessage="Name must start with alphanumeric and contain only letters, digits, hyphens or underscores",false;if(!this.description.trim())return this.errorMessage="Description is required",false;for(let t of this.integrationRows)if(!t.integration.trim())return this.errorMessage="Integration name cannot be empty",false;return true}buildDefinition(){let t=this.mandatoryDocs.map(n=>n.trim()).filter(Boolean),e=this.integrationRows.length>0?Object.fromEntries(this.integrationRows.filter(n=>n.integration.trim()).map(n=>[n.integration.trim(),n.tools.split(",").map(a=>a.trim()).filter(Boolean)])):void 0;return {name:this.name.trim(),description:this.description.trim(),instructions:this.instructions.trim()||void 0,aiProvider:this.aiProvider.trim()||void 0,modelName:this.modelName.trim()||void 0,temperature:this.temperature??void 0,maxOutputTokens:this.maxOutputTokens??void 0,openaiAssistantId:this.openaiAssistantId.trim()||void 0,integrations:e,mandatoryDocs:t.length>0?t:void 0}}save(){if(this.errorMessage="",!this.validateForm())return;let t=this.buildDefinition();this.isSaving=true,(this.isEditMode?this.agentCrudApi.updateAgent(this.name.trim(),t):this.agentCrudApi.createAgent(t,this.location)).subscribe({next:()=>{this.isSaving=false,this.agentApi.clearAllCache(),this.dialogRef.close(true);},error:n=>{this.isSaving=false,this.errorMessage=n?.error?.error||n?.message||"Failed to save agent";}});}cancel(){this.dialogRef.close(false);}static \u0275fac=function(e){return new(e||s)};static \u0275cmp=jw({type:s,selectors:[["app-agent-form"]],decls:69,vars:18,consts:[["mat-dialog-title",""],[1,"form-container"],["appearance","outline",1,"full-width"],["matInput","","placeholder","my-agent","required","",3,"ngModelChange","ngModel","readonly"],["matInput","","placeholder","What does this agent do?","rows","2","required","",3,"ngModelChange","ngModel"],["matInput","","placeholder","System instructions for the agent...","rows","6",3,"ngModelChange","ngModel"],[1,"section-title"],[1,"row-2col"],["appearance","outline"],["matInput","","placeholder","e.g. anthropic, openai",3,"ngModelChange","ngModel"],["matInput","","placeholder","e.g. claude-sonnet-4-5",3,"ngModelChange","ngModel"],["matInput","","type","number","min","0","max","2","step","0.1","placeholder","0.0 \u2013 2.0",3,"ngModelChange","ngModel"],["matInput","","type","number","min","1","placeholder","e.g. 4096",3,"ngModelChange","ngModel"],["matInput","","placeholder","asst_...",3,"ngModelChange","ngModel"],["mat-icon-button","","type","button","title","Add integration",3,"click"],[1,"hint"],[1,"integration-row"],[1,"source-display"],[1,"error-message"],["align","end"],["mat-button","",3,"click","disabled"],["mat-raised-button","","color","primary",3,"click","disabled"],["appearance","outline",1,"integration-name"],["matInput","","placeholder","e.g. GITHUB",3,"ngModelChange","ngModel"],["appearance","outline",1,"integration-tools"],["matInput","","placeholder","Leave empty for all tools",3,"ngModelChange","ngModel"],["mat-icon-button","","type","button","title","Remove",3,"click"],["mat-icon-button","","type","button","title","Add document path",3,"click"],["title","Upload a document to the pool",1,"upload-btn"],["type","file","hidden","",3,"change","disabled"],[1,"doc-upload-error"],[1,"doc-row"],["appearance","outline",1,"doc-field"],["matInput","","placeholder","documents/guide.md",3,"ngModelChange","ngModel"],[3,"id"],[3,"value"],[1,"source-options"],[1,"source-option"],["type","radio","name","location","value","project",3,"ngModelChange","ngModel"],[1,"source-content"],[1,"source-header"],[1,"source-icon"],[1,"source-label"],[1,"source-description"],["type","radio","name","location","value","colocated",3,"ngModelChange","ngModel"],[1,"source-badge"]],template:function(e,n){e&1&&(Cs(0,"h2",0),JC(1),hl(),Cs(2,"mat-dialog-content")(3,"div",1)(4,"mat-form-field",2)(5,"mat-label"),JC(6,"Name"),hl(),Cs(7,"input",3),rm("ngModelChange",function(r){return iT(n.name,r)||(n.name=r),r}),hl(),ZI(),Cs(8,"mat-hint"),JC(9,"Alphanumeric, hyphens and underscores only. Cannot be changed after creation."),hl()(),Cs(10,"mat-form-field",2)(11,"mat-label"),JC(12,"Description"),hl(),Cs(13,"textarea",4),rm("ngModelChange",function(r){return iT(n.description,r)||(n.description=r),r}),hl(),ZI(),hl(),Cs(14,"mat-form-field",2)(15,"mat-label"),JC(16,"Instructions"),hl(),Cs(17,"textarea",5),rm("ngModelChange",function(r){return iT(n.instructions,r)||(n.instructions=r),r}),hl(),ZI(),Cs(18,"mat-hint"),JC(19,"System prompt / instructions sent to the AI model"),hl()(),Cs(20,"div",6),JC(21,"AI Configuration"),hl(),Cs(22,"div",7)(23,"mat-form-field",8)(24,"mat-label"),JC(25,"AI Provider"),hl(),Cs(26,"input",9),rm("ngModelChange",function(r){return iT(n.aiProvider,r)||(n.aiProvider=r),r}),hl(),ZI(),hl(),Cs(27,"mat-form-field",8)(28,"mat-label"),JC(29,"Model Name"),hl(),Cs(30,"input",10),rm("ngModelChange",function(r){return iT(n.modelName,r)||(n.modelName=r),r}),hl(),ZI(),hl()(),Cs(31,"div",7)(32,"mat-form-field",8)(33,"mat-label"),JC(34,"Temperature"),hl(),Cs(35,"input",11),rm("ngModelChange",function(r){return iT(n.temperature,r)||(n.temperature=r),r}),hl(),ZI(),Cs(36,"mat-hint"),JC(37,"Leave empty for model default"),hl()(),Cs(38,"mat-form-field",8)(39,"mat-label"),JC(40,"Max Output Tokens"),hl(),Cs(41,"input",12),rm("ngModelChange",function(r){return iT(n.maxOutputTokens,r)||(n.maxOutputTokens=r),r}),hl(),ZI(),Cs(42,"mat-hint"),JC(43,"Leave empty for model default"),hl()()(),Cs(44,"mat-form-field",2)(45,"mat-label"),JC(46,"OpenAI Assistant ID"),hl(),Cs(47,"input",13),rm("ngModelChange",function(r){return iT(n.openaiAssistantId,r)||(n.openaiAssistantId=r),r}),hl(),ZI(),Cs(48,"mat-hint"),JC(49,"If set, forces aiProvider to openai"),hl()(),Cs(50,"div",6)(51,"span"),JC(52,"Integrations"),hl(),Cs(53,"button",14),kg("click",function(){return n.addIntegrationRow()}),Cs(54,"mat-icon"),JC(55,"add"),hl()()(),aC(56,ze,2,0,"p",15),dC(57,qe,12,2,"div",16,uC),aC(59,Je,14,5)(60,Qe,2,0,"p",15),aC(61,Xe,25,8),aC(62,Ye,7,5,"div",17),aC(63,$e,5,1,"div",18),hl()(),Cs(64,"mat-dialog-actions",19)(65,"button",20),kg("click",function(){return n.cancel()}),JC(66,"Cancel"),hl(),Cs(67,"button",21),kg("click",function(){return n.save()}),JC(68),hl()()),e&2&&(sI(),Kg(n.isEditMode?"Edit Agent":"Create Agent"),sI(6),nm("ngModel",n.name),_g("readonly",n.isEditMode),QI(),sI(6),nm("ngModel",n.description),QI(),sI(4),nm("ngModel",n.instructions),QI(),sI(9),nm("ngModel",n.aiProvider),QI(),sI(4),nm("ngModel",n.modelName),QI(),sI(5),nm("ngModel",n.temperature),QI(),sI(6),nm("ngModel",n.maxOutputTokens),QI(),sI(6),nm("ngModel",n.openaiAssistantId),QI(),sI(9),cC(n.integrationRows.length===0?56:-1),sI(),fC(n.integrationRows),sI(2),cC(n.isEditMode?59:60),sI(2),cC(n.isEditMode?-1:61),sI(),cC(n.isEditMode?62:-1),sI(),cC(n.errorMessage?63:-1),sI(2),_g("disabled",n.isSaving),sI(2),_g("disabled",n.isSaving),sI(),Dl(" ",n.isSaving?"Saving...":"Save"," "));},dependencies:[ti,Qn,ei,Ye$1,fn,mn,Zn,gt,$t,Wt,cn,zt,jt,Vt,Nt,hr,pr,Gn,Tn,Sn,nt$1,ae,le,ce,yt,wt,Pt,Xt],styles:[".form-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:1rem;padding:0;min-width:560px}@media(max-width:768px){.form-container[_ngcontent-%COMP%]{min-width:auto}}.full-width[_ngcontent-%COMP%]{width:100%}.section-title[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;font-size:1rem;font-weight:600;margin-top:.5rem;margin-bottom:-.25rem}.row-2col[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:1rem}@media(max-width:768px){.row-2col[_ngcontent-%COMP%]{grid-template-columns:1fr}}.integration-row[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:.5rem}.integration-row[_ngcontent-%COMP%] .integration-name[_ngcontent-%COMP%]{flex:0 0 180px}.integration-row[_ngcontent-%COMP%] .integration-tools[_ngcontent-%COMP%]{flex:1}.hint[_ngcontent-%COMP%]{margin:0;font-size:.85rem;color:var(--color-text-secondary);font-style:italic}.source-options[_ngcontent-%COMP%]{display:flex;gap:1rem;margin-bottom:.5rem}@media(max-width:768px){.source-options[_ngcontent-%COMP%]{flex-direction:column}}.source-option[_ngcontent-%COMP%]{flex:1;display:flex;align-items:flex-start;gap:.75rem;padding:1rem;background:var(--color-bg);border:2px solid var(--color-border);border-radius:8px;cursor:pointer;transition:all .2s ease}.source-option[_ngcontent-%COMP%]:hover{border-color:var(--color-primary);background:var(--color-bg-hover)}.source-option.selected[_ngcontent-%COMP%]{border-color:var(--color-primary);background:var(--color-bg-hover);box-shadow:0 0 0 1px var(--color-primary)}.source-option[_ngcontent-%COMP%] input[type=radio][_ngcontent-%COMP%]{margin-top:2px;cursor:pointer}.source-option[_ngcontent-%COMP%] .source-content[_ngcontent-%COMP%]{flex:1}.source-option[_ngcontent-%COMP%] .source-content[_ngcontent-%COMP%] .source-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;margin-bottom:.5rem}.source-option[_ngcontent-%COMP%] .source-content[_ngcontent-%COMP%] .source-header[_ngcontent-%COMP%] .source-icon[_ngcontent-%COMP%]{font-size:1.25rem}.source-option[_ngcontent-%COMP%] .source-content[_ngcontent-%COMP%] .source-header[_ngcontent-%COMP%] .source-label[_ngcontent-%COMP%]{font-weight:600;font-size:.95rem}.source-option[_ngcontent-%COMP%] .source-content[_ngcontent-%COMP%] .source-description[_ngcontent-%COMP%]{margin:0;font-size:.85rem;color:var(--color-text-secondary);font-family:monospace;line-height:1.4}.source-display[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.5rem}.source-badge[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem 1rem;border-radius:6px;font-size:.9rem;font-weight:500}.source-badge.badge-project[_ngcontent-%COMP%]{background:#2196f31a;color:#2196f3;border:1px solid rgba(33,150,243,.3)}.source-badge.badge-colocated[_ngcontent-%COMP%]{background:#4caf501a;color:#4caf50;border:1px solid rgba(76,175,80,.3)}.doc-row[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:.5rem}.doc-row[_ngcontent-%COMP%] .doc-field[_ngcontent-%COMP%]{flex:1}.upload-btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:50%;cursor:pointer;color:var(--color-text-secondary);transition:background .2s}.upload-btn[_ngcontent-%COMP%]:hover{background:var(--color-bg-hover);color:var(--color-primary)}.upload-btn.uploading[_ngcontent-%COMP%]{opacity:.5;cursor:wait}.upload-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:1.25rem;width:1.25rem;height:1.25rem}.doc-upload-error[_ngcontent-%COMP%]{margin:0;font-size:.85rem;color:var(--color-error)}.error-message[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;padding:.75rem;background:#f443361a;border:1px solid var(--color-error);border-radius:4px;color:var(--color-error)}.error-message[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:1.25rem;width:1.25rem;height:1.25rem}.error-message[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{flex:1}"],changeDetection:1})};var et=()=>[],tt=s=>({id:s});function nt(s,t){if(s&1&&(Cs(0,"div",5),JC(1),hl()),s&2){let e=CC();sI(),Kg(e.errorMessage());}}function it(s,t){if(s&1){let e=vC();Cs(0,"ds-entity-card",7),kg("selected",function(a){Cf(e);let r=CC();return Tf(r.onEdit(a))}),yl(1,8),Cs(2,"button",9),kg("click",function(a){return a.stopPropagation()}),Cs(3,"mat-icon"),JC(4,"more_vert"),hl()(),vl(),hl();}if(s&2){let e=t.$implicit;CC();let n=AC(9);_g("id",e.id)("name",e.name)("description",e.description)("badges",e.badges??dT(6,et)),sI(2),_g("matMenuTriggerFor",n)("matMenuTriggerData",fT(7,tt,e.id));}}function ot(s,t){if(s&1){let e=vC();Cs(0,"button",10),kg("click",function(){let a=Cf(e).id,r=CC();return Tf(r.onEdit(a))}),Cs(1,"mat-icon"),JC(2,"edit"),hl(),JC(3," Edit "),hl(),Cs(4,"button",11),kg("click",function(){let a=Cf(e).id,r=CC();return Tf(r.onDelete(a))}),Cs(5,"mat-icon"),JC(6,"delete"),hl(),JC(7," Delete "),hl();}}var Ve=class s{agentCrudApi=g(w);location=g(xm);dialog=g(Re);agents=Wi([]);isLoading=Wi(false);errorMessage=Wi(null);agentItems=TT(()=>this.agents().map(t=>({id:t.name,name:t.name,description:t.description,badges:this.buildBadges(t),groupKey:t.source,groupLabel:t.source==="project"?"Project (~/.coday/)":"Colocated (next to coday.yaml)"})));ngOnInit(){this.loadAgents();}loadAgents(){this.isLoading.set(true),this.errorMessage.set(null),this.agentCrudApi.listEditableAgents().subscribe({next:t=>{this.agents.set(t),this.isLoading.set(false);},error:t=>{this.errorMessage.set(t?.error?.error??"Failed to load agents"),this.isLoading.set(false);}});}onBack(){this.location.back();}onCreate(){this.dialog.open(E,{width:"700px",maxHeight:"90vh",data:{mode:"create"}}).afterClosed().subscribe(e=>{e&&this.loadAgents();});}onEdit(t){this.agentCrudApi.getAgent(t).subscribe({next:e=>{this.dialog.open(E,{width:"700px",maxHeight:"90vh",data:{mode:"edit",agent:e}}).afterClosed().subscribe(a=>{a&&this.loadAgents();});},error:e=>this.errorMessage.set(e?.error?.error??"Failed to load agent")});}onDelete(t){confirm(`Are you sure you want to delete agent "${t}"?`)&&this.agentCrudApi.deleteAgent(t).subscribe({next:()=>this.loadAgents(),error:e=>this.errorMessage.set(e?.error?.error??"Failed to delete agent")});}buildBadges(t){return [t.source==="project"?{label:"project",variant:"info"}:{label:"colocated",variant:"success"}]}static \u0275fac=function(e){return new(e||s)};static \u0275cmp=jw({type:s,selectors:[["app-agent-list"]],decls:11,vars:5,consts:[["agentCard",""],["cardMenu","matMenu"],[1,"agent-list-page"],["title","Agents","cardMinWidth","260px","contentMaxWidth","1400px","searchPlaceholder","Filter agents\u2026","emptyMessage","No file-based agents found.",3,"createRequested","items","loading","showCreate","itemTemplate"],["toolbar-start","","mat-icon-button","","title","Back",3,"click"],[1,"agent-list__error"],["matMenuContent",""],[3,"selected","id","name","description","badges"],["dsCardActions",""],["mat-icon-button","",3,"click","matMenuTriggerFor","matMenuTriggerData"],["mat-menu-item","",3,"click"],["mat-menu-item","",1,"agent-list__delete-item",3,"click"]],template:function(e,n){if(e&1&&(Cs(0,"div",2)(1,"ds-entity-list",3),kg("createRequested",function(){return n.onCreate()}),Cs(2,"button",4),kg("click",function(){return n.onBack()}),Cs(3,"mat-icon"),JC(4,"chevron_left"),hl()()(),aC(5,nt,2,1,"div",5),hl(),wg(6,it,5,9,"ng-template",null,0,ET),Cs(8,"mat-menu",null,1),wg(10,ot,8,0,"ng-template",6),hl()),e&2){let a=AC(7);sI(),_g("items",n.agentItems())("loading",n.isLoading())("showCreate",true)("itemTemplate",a),sI(4),cC(n.errorMessage()?5:-1);}},dependencies:[Wn,ot$1,it$1,hr,Gn,yt,wt,In,De,Be,ya,En],styles:["[_nghost-%COMP%]{display:block;width:100%;min-height:100vh;background:var(--color-bg);overflow-y:auto}.agent-list__delete-item[_ngcontent-%COMP%]{color:var(--color-error, #ff3b30)}.agent-list__delete-item[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:inherit}.agent-list__error[_ngcontent-%COMP%]{margin:1rem auto;max-width:900px;padding:.75rem 1rem;background:#dc262614;border:1px solid rgba(220,38,38,.25);border-radius:8px;color:var(--color-error, #ff3b30);font-size:.875rem}"],changeDetection:1})};export{Ve as AgentListComponent};
@@ -0,0 +1 @@
1
+ import {O}from'./chunk-DVVwrDwV.js';import {v}from'./chunk-kXODoW4J.js';import {g,ao as V,G,C as Ce,W as Wi,F as F$1,de as xe,cd as $f,b as U,j as jw,k as Cs,n as kg,J as JC,m as hl,o as aC,t as sI,a8 as Kg,u as cC,a9 as vC,q as dC,a4 as lC,a3 as ZI,M as Mg,bo as uC,ac as CC,_ as _g,a6 as QI,v as fC,a5 as Dl,cH as iC,aa as Cf,ab as Tf}from'./main-K6RKSHKK.js';import'./chunk-DIhIuMRR.js';import {o as z,z as ze,k as _t,b as _e$1,n as ni,J as Jn,Q as Qn,e as ei,Y as Ye,A as At,m as mn,Z as Zn,l as Xn,C as Cn,E as En,p as An,q as Ct,V as Vt}from'./chunk-BhdMedPO.js';import'./chunk-B55TXBfo.js';import'./chunk-Bkwb10Tz.js';import'./chunk-D8Bz7q-C.js';import'./chunk-BEaYQhbI.js';function ce(a,r){a&1&&(Cs(0,"p",5),JC(1,"Loading\u2026"),hl());}function me(a,r){if(a&1&&(Cs(0,"label",30),Mg(1,"input",31),ZI(),Cs(2,"span"),JC(3),hl()()),a&2){let e=r.$implicit,l=CC(3);sI(),_g("formControl",l.scopeControl)("value",e.value)("disabled",e.value==="namespace"&&!l.isAdmin()),QI(),sI(2),Kg(e.label);}}function ue(a,r){if(a&1&&(Cs(0,"fieldset",8)(1,"legend",24),JC(2,"Port\xE9e de la configuration"),hl(),dC(3,me,4,4,"label",30,iC().trackByScope,true),hl()),a&2){let e=CC(2);_g("disabled",e.isEditMode()),sI(3),fC(e.scopeOptions);}}function ve(a,r){if(a&1&&(Cs(0,"option",13),JC(1),hl()),a&2){let e=r.$implicit;_g("value",e),sI(),Kg(e);}}function fe(a,r){if(a&1){let e=vC();Cs(0,"div",26),Mg(1,"input",32),ZI(),Mg(2,"input",33),ZI(),Cs(3,"button",34),kg("click",function(){let s=Cf(e).$index,f=CC(2);return Tf(f.removeHeader(s))}),JC(4," \xD7 "),hl()();}if(a&2){let e=r.$index;_g("formGroupName",e),sI(),QI(),sI(),QI();}}function _e(a,r){if(a&1){let e=vC();Cs(0,"form",7),kg("ngSubmit",function(){Cf(e);let s=CC();return Tf(s.submit())}),aC(1,ue,5,1,"fieldset",8),Cs(2,"div",9)(3,"label",10),JC(4,"API type "),Cs(5,"span",11),JC(6,"*"),hl()(),Cs(7,"select",12),dC(8,ve,2,2,"option",13,lC),hl(),ZI(),hl(),Cs(10,"div",9)(11,"label",14),JC(12,"Name "),Cs(13,"span",11),JC(14,"*"),hl()(),Mg(15,"input",15),ZI(),hl(),Cs(16,"div",9)(17,"label",16),JC(18,"Description"),hl(),Mg(19,"input",17),ZI(),hl(),Cs(20,"div",9)(21,"label",18),JC(22,"Base URL"),hl(),Mg(23,"input",19),ZI(),hl(),Cs(24,"div",9)(25,"label",20),JC(26,"API key"),hl(),Mg(27,"input",21),ZI(),hl(),Cs(28,"div",22)(29,"div",23)(30,"span",24),JC(31,"Custom headers"),hl(),Cs(32,"button",25),kg("click",function(){Cf(e);let s=CC();return Tf(s.addHeader())}),JC(33,"+ Add header"),hl()(),dC(34,fe,5,1,"div",26,uC),hl(),Cs(36,"div",27)(37,"button",28),JC(38),hl(),Cs(39,"button",29),kg("click",function(){Cf(e);let s=CC();return Tf(s.cancel())}),JC(40,"Cancel"),hl()()();}if(a&2){let e=CC();_g("formGroup",e.form),sI(),cC(e.isPlatformMode?-1:1),sI(6),_g("formControl",e.apiTypeControl),QI(),sI(),fC(e.apiTypeOptions),sI(7),_g("formControl",e.nameControl),QI(),sI(4),_g("formControl",e.descriptionControl),QI(),sI(4),_g("formControl",e.baseUrlControl),QI(),sI(4),_g("formControl",e.apiKeyControl),QI(),sI(),_g("formArrayName","headers"),sI(6),fC(e.headersArray.controls),sI(3),_g("disabled",e.form.invalid||e.isSubmitting()),sI(),Dl(" ",e.isEditMode()?"Save changes":"Create"," ");}}var ge=new Set(["namespace","userOnNs","userGlobal"]),F=Object.freeze({platform:"Configuration de niveau plateforme",namespace:"Configuration du namespace",userOnNs:"Pour moi sur ce namespace",userGlobal:"Pour moi globalement"}),se=class a{route=g(V);router=g(G);destroyRef=g(Ce);state=g(O);namespaceRole=g(v);namespaceId=this.route.snapshot.params.namespaceId;isPlatformMode=this.namespaceId===void 0;isAdmin=this.isPlatformMode?Wi(true):F$1(this.namespaceRole.isAdminOfNamespace$(this.namespaceId),{initialValue:false});apiTypeOptions=Object.values(xe);scopeOptions=[{value:"namespace",label:F.namespace},{value:"userOnNs",label:F.userOnNs},{value:"userGlobal",label:F.userGlobal}];form=new z({name:new _t("",{nonNullable:true,validators:[_e$1.required,_e$1.minLength(1)]}),description:new _t(null),apiType:new _t("OpenAI",{nonNullable:true,validators:[_e$1.required]}),baseUrl:new _t("",{nonNullable:true}),apiKey:new _t("",{nonNullable:true}),scope:new _t("namespace",{nonNullable:true}),headers:new ze([],{validators:[]})});get nameControl(){return this.form.controls.name}get descriptionControl(){return this.form.controls.description}get apiTypeControl(){return this.form.controls.apiType}get baseUrlControl(){return this.form.controls.baseUrl}get apiKeyControl(){return this.form.controls.apiKey}get scopeControl(){return this.form.controls.scope}get headersArray(){return this.form.controls.headers}addHeader(){this.headersArray.push(new z({key:new _t("",{nonNullable:true,validators:[_e$1.required]}),value:new _t("",{nonNullable:true})}));}removeHeader(r){this.headersArray.removeAt(r);}isEditMode=Wi(false);isSubmitting=Wi(false);isLoading=Wi(false);existingConfig=null;initialApiKey="";constructor(){this.isPlatformMode||$f(()=>{this.isAdmin()||this.isEditMode()||this.scopeControl.value==="namespace"&&this.scopeControl.setValue("userOnNs");});}ngOnInit(){this.namespaceId&&this.state.setNamespace(this.namespaceId);let r=this.route.snapshot.paramMap,e=this.route.snapshot.queryParamMap,l=r.get("aiProviderId"),s=this.isPlatformMode?"namespace":this.parseScope(e.get("scope"));if(l){this.isEditMode.set(true),this.scopeControl.disable(),this.apiTypeControl.disable(),this.loadConfig(l);return}this.scopeControl.setValue(s);let f=e.get("template");f&&this.hydrateFromTemplate(f);}parseScope(r){return r&&ge.has(r)?r:"namespace"}deriveScopeFromConfig(r){return !r.userId?"namespace":r.namespaceId?"userOnNs":"userGlobal"}loadConfig(r){this.isLoading.set(true),this.state.getById(r).pipe(U(this.destroyRef)).subscribe({next:e=>{this.existingConfig=e,this.scopeControl.setValue(this.deriveScopeFromConfig(e)),this.applyConfigToForm(e),this.isLoading.set(false);},error:()=>{this.isLoading.set(false),console.warn(`[AiProviderForm] Could not load provider '${r}' \u2014 navigating back`),this.navigateBack();}});}hydrateFromTemplate(r){this.isLoading.set(true),this.state.getById(r).pipe(U(this.destroyRef)).subscribe({next:e=>{this.nameControl.setValue(e.name),this.descriptionControl.setValue(e.description??null),this.apiTypeControl.setValue(e.apiType),this.baseUrlControl.setValue(e.baseUrl??""),this.apiKeyControl.setValue(""),this.initialApiKey="",this.apiKeyControl.markAsTouched(),this.isLoading.set(false),this.router.navigate([],{relativeTo:this.route,queryParams:{template:null,templateScope:null},queryParamsHandling:"merge",replaceUrl:true});},error:e=>{console.warn(`[AiProviderForm] Could not hydrate from template ${r}:`,e),this.isLoading.set(false),this.router.navigate([],{relativeTo:this.route,queryParams:{template:null,templateScope:null},queryParamsHandling:"merge",replaceUrl:true});}});}applyConfigToForm(r){this.nameControl.setValue(r.name),this.descriptionControl.setValue(r.description??null),this.apiTypeControl.setValue(r.apiType),this.baseUrlControl.setValue(r.baseUrl??"");let e=r.apiKey??"";this.apiKeyControl.setValue(e),this.initialApiKey=e,this.headersArray.clear();for(let[l,s]of Object.entries(r.headers??{}))this.headersArray.push(new z({key:new _t(l,{nonNullable:true,validators:[_e$1.required]}),value:new _t(s,{nonNullable:true})}));}submit(){if(this.form.invalid||this.isSubmitting())return;if(this.isEditMode()&&!this.existingConfig?.id){this.navigateBack();return}this.isSubmitting.set(true);let r=this.descriptionControl.value?.trim(),e=this.baseUrlControl.value.trim(),l=this.apiKeyControl.value,s=this.isEditMode()&&l===this.initialApiKey?null:l,f=this.headersArray.controls.filter(x=>x.controls.key.value.trim()).map(x=>[x.controls.key.value.trim(),x.controls.value.value]),de=f.length>0?Object.fromEntries(f):null,N={name:this.nameControl.value.trim(),apiType:this.apiTypeControl.value,description:r||null,baseUrl:e||null,apiKey:s,headers:de},T=this.form.getRawValue().scope,pe=this.isPlatformMode?null:this.namespaceId??null;(this.isEditMode()&&this.existingConfig?.id?this.state.update(this.existingConfig.id,N,T,this.existingConfig):this.state.create(N,T,pe)).pipe(U(this.destroyRef)).subscribe({next:()=>this.navigateBack(),error:()=>this.isSubmitting.set(false)});}cancel(){this.navigateBack();}navigateBack(){this.isPlatformMode?this.router.navigate(["/agentos","admin","ai-providers"]):this.router.navigate(["/agentos",this.namespaceId,"ai-providers"]);}trackByScope(r,e){return e.value}static \u0275fac=function(e){return new(e||a)};static \u0275cmp=jw({type:a,selectors:[["agentos-ai-provider-form"]],decls:10,vars:2,consts:[[1,"ai-provider-form"],[1,"ai-provider-form__header"],["type","button","title","Back to AI providers",1,"ai-provider-form__back",3,"click"],[1,"ai-provider-form__back-icon"],[1,"ai-provider-form__title"],[1,"ai-provider-form__loading"],[1,"ai-provider-form__form",3,"formGroup"],[1,"ai-provider-form__form",3,"ngSubmit","formGroup"],[1,"ai-provider-form__scope",3,"disabled"],[1,"ai-provider-form__field"],["for","llm-api-type",1,"ai-provider-form__label"],["aria-hidden","true"],["id","llm-api-type",1,"ai-provider-form__select",3,"formControl"],[3,"value"],["for","llm-name",1,"ai-provider-form__label"],["id","llm-name","type","text","placeholder","e.g. OpenAI prod","autocomplete","off",1,"ai-provider-form__input",3,"formControl"],["for","llm-description",1,"ai-provider-form__label"],["id","llm-description","type","text","placeholder","Optional \u2014 short description of this provider","autocomplete","off",1,"ai-provider-form__input",3,"formControl"],["for","llm-base-url",1,"ai-provider-form__label"],["id","llm-base-url","type","url","placeholder","Optional \u2014 leave empty for default endpoint","autocomplete","off",1,"ai-provider-form__input",3,"formControl"],["for","llm-api-key",1,"ai-provider-form__label"],["id","llm-api-key","type","password","placeholder","sk-\u2026","autocomplete","new-password",1,"ai-provider-form__input","ai-provider-form__input--secret",3,"formControl"],[1,"ai-provider-form__headers",3,"formArrayName"],[1,"ai-provider-form__headers-title"],[1,"ai-provider-form__label"],["type","button",1,"ai-provider-form__headers-add",3,"click"],[1,"ai-provider-form__header-row",3,"formGroupName"],[1,"ai-provider-form__actions"],["type","submit",1,"ai-provider-form__btn","ai-provider-form__btn--primary",3,"disabled"],["type","button",1,"ai-provider-form__btn",3,"click"],[1,"ai-provider-form__scope-option"],["type","radio",3,"formControl","value","disabled"],["type","text","placeholder","Header name","formControlName","key","autocomplete","off",1,"ai-provider-form__input"],["type","text","placeholder","Value","formControlName","value","autocomplete","off",1,"ai-provider-form__input"],["type","button","title","Remove header","aria-label","Remove header",1,"ai-provider-form__header-remove",3,"click"]],template:function(e,l){e&1&&(Cs(0,"div",0)(1,"header",1)(2,"button",2),kg("click",function(){return l.cancel()}),Cs(3,"span",3),JC(4,"\u2190"),hl(),JC(5," AI Providers "),hl(),Cs(6,"h1",4),JC(7),hl()(),aC(8,ce,2,0,"p",5)(9,_e,41,10,"form",6),hl()),e&2&&(sI(7),Kg(l.isEditMode()?"Edit AI provider":"New AI provider"),sI(),cC(l.isLoading()?8:9));},dependencies:[ni,Jn,Qn,ei,Ye,At,mn,Zn,Xn,Cn,En,An,Ct,Vt],styles:[".ai-provider-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2rem;max-width:480px;margin:0 auto;padding:2rem 1rem}.ai-provider-form__scope[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.4rem;border:1px solid var(--color-divider);border-radius:0;padding:.75rem 1rem;margin:0}.ai-provider-form__scope[disabled][_ngcontent-%COMP%]{opacity:.6}.ai-provider-form__scope-option[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;font-size:.85rem;color:var(--color-text);cursor:pointer}.ai-provider-form__header[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.5rem}.ai-provider-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)}.ai-provider-form__back[_ngcontent-%COMP%]:hover{text-decoration:underline}.ai-provider-form__back-icon[_ngcontent-%COMP%]{font-size:1rem;line-height:1}.ai-provider-form__title[_ngcontent-%COMP%]{margin:0;font-size:1.5rem;font-weight:700;color:var(--color-text);letter-spacing:-.02em}.ai-provider-form__loading[_ngcontent-%COMP%]{color:var(--color-text-secondary);font-size:.9rem;margin:0}.ai-provider-form__form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:1.25rem}.ai-provider-form__field[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.375rem}.ai-provider-form__label[_ngcontent-%COMP%]{font-size:.875rem;font-weight:500;color:var(--color-text)}.ai-provider-form__input[_ngcontent-%COMP%], .ai-provider-form__select[_ngcontent-%COMP%]{width:100%;padding:.625rem .875rem;border-radius:0;border:1px solid var(--color-divider);background:var(--color-surface);color:var(--color-text);font-size:.9375rem;font-family:inherit;outline:none;box-sizing:border-box;transition:border-color .15s ease}.ai-provider-form__input[_ngcontent-%COMP%]:focus, .ai-provider-form__select[_ngcontent-%COMP%]:focus{border-color:var(--color-accent)}.ai-provider-form__input[_ngcontent-%COMP%]::placeholder, .ai-provider-form__select[_ngcontent-%COMP%]::placeholder{color:var(--color-neutral-500)}.ai-provider-form__input--secret[_ngcontent-%COMP%]{font-family:monospace;letter-spacing:.05em}.ai-provider-form__headers[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.5rem}.ai-provider-form__headers-title[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between}.ai-provider-form__headers-add[_ngcontent-%COMP%]{background:none;border:none;padding:0;cursor:pointer;font-size:.8125rem;color:var(--color-accent)}.ai-provider-form__headers-add[_ngcontent-%COMP%]:hover{text-decoration:underline}.ai-provider-form__header-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr auto;gap:.5rem;align-items:center}.ai-provider-form__header-remove[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;background:none;border:1px solid transparent;border-radius:0;cursor:pointer;font-size:1rem;color:var(--color-neutral-500);transition:background .15s ease,color .15s ease,border-color .15s ease;flex-shrink:0}.ai-provider-form__header-remove[_ngcontent-%COMP%]:hover{color:var(--red);background:color-mix(in srgb,var(--red) 10%,transparent);border-color:var(--red)}.ai-provider-form__actions[_ngcontent-%COMP%]{display:flex;gap:.75rem;padding-top:.5rem}.ai-provider-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}.ai-provider-form__btn[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-bg-hover);border-color:var(--color-neutral-500)}.ai-provider-form__btn[_ngcontent-%COMP%]:disabled{opacity:.45;cursor:not-allowed}.ai-provider-form__btn--primary[_ngcontent-%COMP%]{background:var(--color-accent);border-color:var(--color-accent);color:#fff}.ai-provider-form__btn--primary[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--color-accent-700);border-color:var(--color-accent-700)}"]})};export{se as AiProviderFormComponent};