@whoz-oss/coday-client 3.15.1 → 3.17.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 (80) hide show
  1. package/browser/{chunk-CUmS2-ak.js → chunk-0njD_aMa.js} +1 -1
  2. package/browser/{chunk-CNIfOUla.js → chunk-6WIaUDav.js} +1 -1
  3. package/browser/{chunk-9CSRlx74.js → chunk-B1OTuTxt.js} +1 -1
  4. package/browser/{chunk-CyUmCedx.js → chunk-B3-4EW3s.js} +1 -1
  5. package/browser/{chunk-K-fhwl_z.js → chunk-B626-rya.js} +1 -1
  6. package/browser/{chunk-Bnic_hdt.js → chunk-B6BZBDSv.js} +5 -5
  7. package/browser/{chunk-Cf3l2UgA.js → chunk-B7kKWG4P.js} +1 -1
  8. package/browser/chunk-B7yga-a4.js +1 -0
  9. package/browser/{chunk-DYE131qf.js → chunk-BAWubWk8.js} +1 -1
  10. package/browser/chunk-BDaTUrH4.js +1 -0
  11. package/browser/{chunk-BKlwFrFB.js → chunk-BHvLB-pV.js} +1 -1
  12. package/browser/{chunk-Dg6QAZUw.js → chunk-BJ5G7Y-a.js} +2 -2
  13. package/browser/{chunk-B5_o_qhk.js → chunk-BPfJALqU.js} +1 -1
  14. package/browser/{chunk-DzicJow4.js → chunk-BTX631I3.js} +3 -3
  15. package/browser/{chunk-Jv7RGmnK.js → chunk-BVAD9f9s.js} +1 -1
  16. package/browser/{chunk-fP29MqaN.js → chunk-BXkvjekT.js} +1 -1
  17. package/browser/chunk-BYyTBqh4.js +37 -0
  18. package/browser/chunk-B_49KV6W.js +1 -0
  19. package/browser/{chunk-l0HLnBLv.js → chunk-BaO2vi_O.js} +6 -6
  20. package/browser/{chunk-Bgy3uCgK.js → chunk-BcT0wYqu.js} +1 -1
  21. package/browser/chunk-BdJzYh5V.js +190 -0
  22. package/browser/{chunk-Dd2dq7xg.js → chunk-Bgd8Jkga.js} +1 -1
  23. package/browser/chunk-BkN5jb4J.js +1 -0
  24. package/browser/{chunk-CysW_ro-.js → chunk-Brx_KbnM.js} +1 -1
  25. package/browser/{chunk-C5wr-vqf.js → chunk-BtEXE3Xz.js} +1 -1
  26. package/browser/{chunk-BhfpLr7-.js → chunk-Bu5Xq3QT.js} +1 -1
  27. package/browser/{chunk-DxxECdrg.js → chunk-BwDJA6_r.js} +2 -2
  28. package/browser/{chunk-mHtuxvLs.js → chunk-C2VdQfMJ.js} +1 -1
  29. package/browser/{chunk-BZMAEe_X.js → chunk-C49BBPGm.js} +1 -1
  30. package/browser/{chunk-BfD1F12k.js → chunk-C5WD0UQE.js} +3 -3
  31. package/browser/{chunk-C4U0w8cP.js → chunk-CI760KmO.js} +1 -1
  32. package/browser/{chunk-BqKdrvcS.js → chunk-CI7wYBKk.js} +1 -1
  33. package/browser/{chunk-BhM0bmJW.js → chunk-CKhGzoqa.js} +1 -1
  34. package/browser/{chunk-Dj9y_5pr.js → chunk-CNAj5Eon.js} +1 -1
  35. package/browser/{chunk-BIMT-HvS.js → chunk-CUz5MHdA.js} +1 -1
  36. package/browser/{chunk-DG2FCeMu.js → chunk-CXTwGKdl.js} +1 -1
  37. package/browser/{chunk-HSc9fwVS.js → chunk-Ci9l-k84.js} +1 -1
  38. package/browser/{chunk-D_vvo2qx.js → chunk-ClEmA_ih.js} +1 -1
  39. package/browser/{chunk-nWqZHM4o.js → chunk-ClSDInQq.js} +1 -1
  40. package/browser/{chunk-BVCQOGLR.js → chunk-CpZK7G-Q.js} +2 -2
  41. package/browser/{chunk-5LRyprMF.js → chunk-CxUcyBb9.js} +1 -1
  42. package/browser/{chunk-C6RPhP4t.js → chunk-D-jBfPIO.js} +1 -1
  43. package/browser/{chunk-n1eKIk8H.js → chunk-D202v_ff.js} +1 -1
  44. package/browser/{chunk-B11WEBEl.js → chunk-DCwEaE_b.js} +1 -1
  45. package/browser/{chunk-Ce03Ba0V.js → chunk-DFQuWS_F.js} +1 -1
  46. package/browser/{chunk-ZvcyZV3G.js → chunk-DHb3-uKf.js} +1 -1
  47. package/browser/{chunk-CcLheUaL.js → chunk-DKllQ3Ve.js} +1 -1
  48. package/browser/chunk-DMRb150M.js +2 -0
  49. package/browser/{chunk-5t7zJzqM.js → chunk-DMtXGu5h.js} +1 -1
  50. package/browser/{chunk-XgEfnfT0.js → chunk-DO3lSvop.js} +1 -1
  51. package/browser/{chunk-DYUMiAN8.js → chunk-DQtoh8wv.js} +1 -1
  52. package/browser/{chunk-DTIhOEG_.js → chunk-DjMtxVWg.js} +6 -6
  53. package/browser/{chunk-C7MXO6BQ.js → chunk-DjoW6kqa.js} +5 -5
  54. package/browser/{chunk-BgHTiTG2.js → chunk-DpHEu7EG.js} +1 -1
  55. package/browser/{chunk-CYMQSJz6.js → chunk-DqC8XT4v.js} +1 -1
  56. package/browser/{chunk-qARg6ese.js → chunk-DqioJb1X.js} +1 -1
  57. package/browser/chunk-DrzvCb86.js +1 -0
  58. package/browser/{chunk-BlWlE-Cq.js → chunk-DwFGK2iu.js} +1 -1
  59. package/browser/{chunk-DvzNS1Bs.js → chunk-DxrynR3o.js} +1 -1
  60. package/browser/chunk-DxvmpOv5.js +1 -0
  61. package/browser/{chunk-CyxhAtE7.js → chunk-EBW8PloQ.js} +1 -1
  62. package/browser/{chunk-CHrmSvQM.js → chunk-LVItL87L.js} +1 -1
  63. package/browser/{chunk-RxHlNJ_t.js → chunk-P8B5rz7L.js} +1 -1
  64. package/browser/chunk-R-GmZrHu.js +9 -0
  65. package/browser/{chunk-Bh1p6jDj.js → chunk-b6g-uBR5.js} +1 -1
  66. package/browser/{chunk-BUEM7g7F.js → chunk-bfpuueWC.js} +3 -3
  67. package/browser/{chunk-DX2ZzvT5.js → chunk-mrKeqPKc.js} +1 -1
  68. package/browser/index.html +1 -1
  69. package/browser/{main-6K2UFGD2.js → main-LBRSRTYI.js} +19 -19
  70. package/package.json +1 -1
  71. package/browser/chunk-BC0acSZF.js +0 -1
  72. package/browser/chunk-BLa2Gx7h.js +0 -190
  73. package/browser/chunk-B_2kLXvG.js +0 -1
  74. package/browser/chunk-C9tuHQmZ.js +0 -37
  75. package/browser/chunk-CebS4RAf.js +0 -1
  76. package/browser/chunk-CnnGSYzi.js +0 -2
  77. package/browser/chunk-DEsz0fzs.js +0 -1
  78. package/browser/chunk-DTZ7N3wC.js +0 -1
  79. package/browser/chunk-DXDohTwX.js +0 -1
  80. package/browser/chunk-uPxETzZs.js +0 -9
@@ -1 +1 @@
1
- import {g,bm as Sm,z as zi,y as yT,cF as Pb,h as Rw,i as hr,k as Gn,I as Is,A as Ag,q as qC,m as pl,a3 as UI,t as tC,J as JE,T as Tg,a6 as zI,v as nC,w as we$1,a as z$1,b as P,S as By,c as U,Y as x,b1 as Rn,bf as cT,ac as yC,a8 as Zg,bi as dT,cG as fT,o as iC,cH as Jw,n as bg,x as sC,M as dy,cI as Nt,aw as hl,ax as gl,c9 as kf,b6 as Sg,ck as Ff,C as Cg,a5 as vl,a9 as fC,cJ as Rg,aa as If,ab as wf,ad as Vg}from'./main-6K2UFGD2.js';import {t as ti,Q as Qn,e as ei,Y as Ye$1,A as At,Z as Zn,c as cn,y as yt,w as wt}from'./chunk-C9tuHQmZ.js';var Ae=(o,t)=>t.date,He=(o,t)=>t.x,$e=(o,t)=>t.label;function Ve(o,t){o&1&&(hl(0,"div",0),qC(1,"No daily data points for this period."),gl());}function Le(o,t){if(o&1&&(kf(),Sg(0,"rect",18)),o&2){let e=yC().$implicit,n=yC(2);Cg("x",e.w+6)("y",n.yBase-e.tokensStubH)("width",e.w)("height",e.tokensStubH);}}function Ge(o,t){if(o&1&&(kf(),Sg(0,"rect",19)(1,"rect",20)),o&2){let e=yC().$implicit,n=yC(2);Cg("x",e.w+6)("y",n.yBase-(e.promptH??0))("width",e.w)("height",e.promptH??0),JE(),Cg("x",e.w+6)("y",n.yBase-((e.promptH??0)+(e.completionH??0)))("width",e.w)("height",e.completionH??0);}}function Ye(o,t){if(o&1){let e=fC();kf(),hl(0,"g",15),Rg("mouseenter",function(i){let d=If(e).$implicit,u=yC(2);return wf(u.showTooltip(i,d.point))})("mousemove",function(i){let d=If(e).$implicit,u=yC(2);return wf(u.showTooltip(i,d.point))})("mouseleave",function(){If(e);let i=yC(2);return wf(i.hideTooltip())}),Sg(1,"rect",16)(2,"rect",17),tC(3,Le,1,4,":svg:rect",18)(4,Ge,2,8),gl();}if(o&2){let e=t.$implicit,n=yC(2);Cg("transform","translate("+e.xGroup+",0)"),JE(),Cg("y",n.yTop)("width",e.groupW)("height",n.yBase-n.yTop),JE(),Cg("y",n.yBase-e.costH)("width",e.w)("height",e.costH),JE(),nC(e.tokensStubH!==null?3:4);}}function We(o,t){if(o&1&&(kf(),hl(0,"text",5),qC(1),gl()),o&2){let e=t.$implicit,n=yC(2);Cg("x",e.x)("y",n.yAxis),JE(),Zg(e.label);}}function je(o,t){if(o&1&&(hl(0,"div",24),qC(1),gl(),hl(2,"div",25),qC(3),gl()),o&2){let e=t.$implicit;JE(),Zg(e.label),JE(2),Zg(e.value);}}function ze(o,t){if(o&1&&(hl(0,"div",21)(1,"div",22),qC(2),gl(),hl(3,"div",23),iC(4,je,4,2,null,null,$e),gl()()),o&2){let e=yC(2);Vg("left",e.tooltip().x+12,"px")("top",e.tooltip().y+12,"px"),JE(2),Zg(e.tooltip().data.date),JE(2),sC(e.tooltipLines());}}function Xe(o,t){if(o&1&&(hl(0,"div",8)(1,"span",10),qC(2),gl()()),o&2){let e=yC(2);JE(2),Zg(e.tokenCoverageLabel());}}function Je(o,t){if(o&1&&(hl(0,"div",1),kf(),hl(1,"svg",2),Sg(2,"line",3)(3,"line",3),iC(4,Ye,5,8,":svg:g",4,Ae),iC(6,We,2,3,":svg:text",5,He),gl(),tC(8,ze,6,5,"div",6),Ff(),hl(9,"div",7)(10,"div",8),Sg(11,"span",9),hl(12,"span",10),qC(13,"Cost (per day)"),gl(),hl(14,"span",11),qC(15),gl()(),hl(16,"div",8),Sg(17,"span",12),hl(18,"span",10),qC(19,"Prompt tokens"),gl()(),hl(20,"div",8),Sg(21,"span",13),hl(22,"span",10),qC(23,"Completion tokens"),gl()(),hl(24,"div",8),Sg(25,"span",14),hl(26,"span",10),qC(27,"Tokens missing"),gl()(),hl(28,"div",8)(29,"span",10),qC(30,"Tokens scale"),gl(),hl(31,"span",11),qC(32),gl()(),tC(33,Xe,3,1,"div",8),gl()()),o&2){let e=yC();JE(),Cg("viewBox",e.viewBox),JE(),Cg("y1",e.yTop)("x2",720)("y2",e.yTop),JE(),Cg("y1",e.yBase)("x2",720)("y2",e.yBase),JE(),sC(e.bars()),JE(2),sC(e.axisLabels()),JE(2),nC(e.tooltip().visible&&e.tooltip().data?8:-1),JE(7),vl("max ",e.maxCostLabel()),JE(17),vl("max ",e.maxTokensLabel()),JE(),nC(e.tokenCoverageLabel()?33:-1);}}var j=class o{points=[];width=720;height=240;paddingX=12;paddingY=16;bottomAxisH=48;viewBox=`0 0 ${this.width} ${this.height}`;innerW=this.width-this.paddingX*2;innerH=this.height-this.paddingY*2-this.bottomAxisH;barGap=6;groupGap=14;safePoints=yT(()=>(this.points??[]).filter(t=>!!t.date));maxCost=yT(()=>Math.max(0,...this.safePoints().map(t=>t.cost??0)));maxTokens=yT(()=>{let t=this.safePoints().map(e=>{let n=e.promptTokens??null,i=e.completionTokens??null;return n===null&&i===null?null:(n??0)+(i??0)}).filter(e=>e!==null);return Math.max(0,...t)});tokenCoverageLabel=yT(()=>{let t=this.safePoints();return t.length===0?"":`Tokens available for ${t.filter(n=>n.promptTokens!==null||n.completionTokens!==null).length}/${t.length} days`});maxCostLabel=yT(()=>"$"+(new Pb("en-US").transform(this.maxCost(),"1.2-2")??"0.00"));maxTokensLabel=yT(()=>new Pb("en-US").transform(this.maxTokens(),"1.0-2")??"0");tooltip=zi({visible:false,x:0,y:0,data:null});toTooltipData(t){let e=t.promptTokens,n=t.completionTokens,i=e===null&&n===null?null:(e??0)+(n??0);return {date:t.date,cost:t.cost??0,promptTokens:e,completionTokens:n,totalTokens:i,callCount:t.callCount??0}}showTooltip(t,e){let i=t.currentTarget?.closest(".chart")?.getBoundingClientRect(),d=i?t.clientX-i.left:t.clientX,u=i?t.clientY-i.top:t.clientY,f=320,k=170,U=12,C=i?Math.max(0,i.width-f-U):d,B=i?Math.max(0,i.height-k-U):u,F=i?Math.min(Math.max(0,d),C):d,ne=i?Math.min(Math.max(0,u),B):u;this.tooltip.set({visible:true,x:F,y:ne,data:this.toTooltipData(e)});}hideTooltip(){this.tooltip.update(t=>z$1(P({},t),{visible:false}));}formatTokens(t){return t===null?"\u2014":new Pb("en-US").transform(t,"1.0-2")??"0"}formatCost(t){return "$"+(new Pb("en-US").transform(t??0,"1.2-2")??"0.00")}tooltipLines=yT(()=>{let t=this.tooltip(),e=t.data;return !t.visible||!e?[]:[{label:"Cost",value:this.formatCost(e.cost)},{label:"Prompt tokens",value:this.formatTokens(e.promptTokens)},{label:"Completion tokens",value:this.formatTokens(e.completionTokens)},{label:"Total tokens",value:this.formatTokens(e.totalTokens)},{label:"Calls",value:`${e.callCount}`}]});bars=yT(()=>{let t=this.safePoints(),e=t.length;if(e===0)return [];let n=(this.innerW-(e-1)*this.groupGap)/e,i=Math.max(2,n),d=(i-this.barGap)/2,u=Math.max(1,d),f=this.maxCost()||1,k=this.maxTokens()||1,U=45;return t.map((C,B)=>{let F=this.paddingX+B*(i+this.groupGap),Ie=(C.cost??0)/f*this.innerH,oe=C.promptTokens,ae=C.completionTokens,Z=oe!==null||ae!==null,Ne=oe??0,Ue=ae??0,Be=Z?Ne/k*this.innerH:null,Fe=Z?Ue/k*this.innerH:null;return {date:C.date,point:C,xGroup:F,groupW:i,xCost:F,w:u,costH:Ie,xTokens:F+u+this.barGap,promptH:Be,completionH:Fe,tokensStubH:Z?null:U}})});axisLabels=yT(()=>{let t=this.safePoints(),e=t.length;if(e===0)return [];let i=Math.max(1,Math.ceil(e/8)),d=(this.innerW-(e-1)*this.groupGap)/e,u=Math.max(2,d);return t.map((f,k)=>({p:f,i:k})).filter(({i:f})=>f%i===0||f===e-1).map(({p:f,i:k})=>{let C=this.paddingX+k*(u+this.groupGap)+u/2,B=f.date.slice(5);return {x:C,label:B}})});yTop=this.paddingY;yBase=this.paddingY+this.innerH;yAxis=this.yBase+28;static \u0275fac=function(e){return new(e||o)};static \u0275cmp=Rw({type:o,selectors:[["app-daily-series-chart"]],inputs:{points:"points"},decls:2,vars:1,consts:[[1,"muted"],[1,"chart"],["preserveAspectRatio","none","role","img","aria-label","Daily token and cost usage",1,"chart__svg"],["x1","0",1,"chart__grid"],[1,"chart__day"],["text-anchor","middle",1,"chart__axis-label"],[1,"chart__tooltip",3,"left","top"],[1,"chart__legend"],[1,"chart__legend-item"],["aria-hidden","true",1,"chart__legend-swatch","chart__legend-swatch--cost"],[1,"chart__legend-label"],[1,"chart__legend-value"],["aria-hidden","true",1,"chart__legend-swatch","chart__legend-swatch--prompt"],["aria-hidden","true",1,"chart__legend-swatch","chart__legend-swatch--completion"],["aria-hidden","true",1,"chart__legend-swatch","chart__legend-swatch--tokens-missing"],[1,"chart__day",3,"mouseenter","mousemove","mouseleave"],["x","0",1,"chart__hover"],["x","0",1,"chart__bar","chart__bar--cost"],[1,"chart__bar","chart__bar--tokens-missing"],[1,"chart__bar","chart__bar--prompt"],[1,"chart__bar","chart__bar--completion"],[1,"chart__tooltip"],[1,"chart__tooltip-title"],[1,"chart__tooltip-grid"],[1,"chart__tooltip-label"],[1,"chart__tooltip-value"]],template:function(e,n){e&1&&tC(0,Ve,2,0,"div",0)(1,Je,34,11,"div",1),e&2&&nC(n.safePoints().length===0?0:1);},styles:[".chart[_ngcontent-%COMP%]{display:grid;gap:.5rem;position:relative}.chart__svg[_ngcontent-%COMP%]{width:100%;height:260px;display:block;border-radius:12px;background:var(--color-bg-secondary, rgba(255, 255, 255, .72));border:1px solid var(--color-border-light, rgba(0, 0, 0, .08))}.chart__grid[_ngcontent-%COMP%]{stroke:var(--color-border-light, rgba(0, 0, 0, .08));stroke-width:1}.chart__day[_ngcontent-%COMP%]{cursor:default}.chart__hover[_ngcontent-%COMP%]{fill:transparent}.chart__day[_ngcontent-%COMP%]:hover .chart__hover[_ngcontent-%COMP%]{fill:var(--color-bg-hover, rgba(0, 0, 0, .03))}.chart__tooltip[_ngcontent-%COMP%]{position:absolute;z-index:2;min-width:220px;max-width:320px;padding:10px 12px;border-radius:12px;background:rgb(var(--color-bg-secondary-rgb, 255 255 255)/1);border:1px solid var(--color-border-light, rgba(0, 0, 0, .08));box-shadow:var(--glass-shadow, 0 8px 24px rgba(0, 0, 0, .12));pointer-events:none}.chart__tooltip-title[_ngcontent-%COMP%]{font-weight:650;margin-bottom:6px}.chart__tooltip-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr auto;column-gap:10px;row-gap:4px}.chart__tooltip-label[_ngcontent-%COMP%]{color:var(--color-text-secondary, rgba(29, 29, 31, .7));font-size:.85rem}.chart__tooltip-value[_ngcontent-%COMP%]{font-variant-numeric:tabular-nums;text-align:right}.chart__bar[_ngcontent-%COMP%]{shape-rendering:geometricPrecision;rx:2;ry:2}.chart__bar--cost[_ngcontent-%COMP%]{fill:var(--color-primary, #007aff);opacity:.85}.chart__bar--prompt[_ngcontent-%COMP%]{fill:var(--color-success, #34c759);opacity:.85}.chart__bar--completion[_ngcontent-%COMP%]{fill:var(--color-warning, #ff9500);opacity:.85}.chart__bar--tokens-missing[_ngcontent-%COMP%]{fill:transparent;stroke:var(--color-text-secondary, rgba(29, 29, 31, .55));stroke-width:1.5;stroke-dasharray:4 3}.chart__axis-label[_ngcontent-%COMP%]{fill:var(--color-text-secondary, rgba(29, 29, 31, .7));font-size:12px;font-variant-numeric:tabular-nums}.chart__legend[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:.75rem;flex-wrap:wrap}.chart__legend-item[_ngcontent-%COMP%]{display:flex;gap:.5rem;align-items:baseline}.chart__legend-swatch[_ngcontent-%COMP%]{width:10px;height:10px;border-radius:3px;align-self:center}.chart__legend-swatch--cost[_ngcontent-%COMP%]{background:var(--color-primary, #007aff)}.chart__legend-swatch--prompt[_ngcontent-%COMP%]{background:var(--color-success, #34c759)}.chart__legend-swatch--completion[_ngcontent-%COMP%]{background:var(--color-warning, #ff9500)}.chart__legend-swatch--tokens-missing[_ngcontent-%COMP%]{background:transparent;border:1px dashed var(--color-text-secondary, rgba(29, 29, 31, .55))}.chart__legend-label[_ngcontent-%COMP%]{color:var(--color-text-secondary, rgba(29, 29, 31, .7));font-size:.85rem}.chart__legend-value[_ngcontent-%COMP%]{font-variant-numeric:tabular-nums}.muted[_ngcontent-%COMP%]{color:var(--color-text-secondary, rgba(29, 29, 31, .7))}"]})};var X=class o{http=g(dy);getTokenUsage(t){let e=new Nt;return t.from&&(e=e.set("from",t.from)),t.to&&(e=e.set("to",t.to)),this.http.get("/api/token-usage",{params:e})}getTokenUsageSeries(t){let e=new Nt;return t.from&&(e=e.set("from",t.from)),t.to&&(e=e.set("to",t.to)),this.http.get("/api/token-usage/series",{params:e})}static \u0275fac=function(e){return new(e||o)};static \u0275prov=x({token:o,factory:o.\u0275fac,providedIn:"root"})};function Pe(o){return `${o}`.padStart(2,"0")}function we(o){return `${o.getUTCFullYear()}-${Pe(o.getUTCMonth()+1)}-${Pe(o.getUTCDate())}`}function qe(o=new Date){return new Date(Date.UTC(o.getUTCFullYear(),o.getUTCMonth(),1))}function Ke(o=new Date){return new Date(Date.UTC(o.getUTCFullYear(),o.getUTCMonth()+1,1))}var J=class o{api=g(X);destroyRef=g(we$1);defaultFrom=we(qe());defaultTo=we(Ke());draftFilters=zi({from:this.defaultFrom,to:this.defaultTo});appliedFilters=zi({from:this.defaultFrom,to:this.defaultTo});loading=zi(false);error=zi(null);aggregation=zi(null);seriesResponse=zi(null);series=zi(null);tokenDataPartial=zi(false);aggregationByModelId=zi(null);seriesByModelId=zi(null);init(){this.reload();}setDraftFrom(t){this.draftFilters.update(e=>z$1(P({},e),{from:t}));}setDraftTo(t){this.draftFilters.update(e=>z$1(P({},e),{to:t}));}clearDraftFrom(){this.setDraftFrom(null);}clearDraftTo(){this.setDraftTo(null);}apply(){this.appliedFilters.set(this.draftFilters()),this.reload();}addNullableTokens(t,e){return t===null&&e===null?null:(t??0)+(e??0)}aggregateByModelId(t){let e=new Map;for(let n of t){let i=n.modelId,d=e.get(i);d?(d.promptTokens=this.addNullableTokens(d.promptTokens,n.promptTokens),d.completionTokens=this.addNullableTokens(d.completionTokens,n.completionTokens),d.totalTokens=this.addNullableTokens(d.totalTokens,n.totalTokens),d.callCount+=n.callCount??0,d.cost=(d.cost??0)+(n.cost??0)):e.set(i,{agentName:"All agents",providerName:"all",modelId:n.modelId,promptTokens:n.promptTokens,completionTokens:n.completionTokens,totalTokens:n.totalTokens,callCount:n.callCount??0,cost:n.cost??0});}return [...e.values()].sort((n,i)=>(i.totalTokens??0)-(n.totalTokens??0))}aggregateSeriesByModelId(t){let e=new Map;for(let n of t){let i=`${n.date}|${n.modelId}`,d=e.get(i);d?(d.promptTokens=this.addNullableTokens(d.promptTokens,n.promptTokens),d.completionTokens=this.addNullableTokens(d.completionTokens,n.completionTokens),d.totalTokens=this.addNullableTokens(d.totalTokens,n.totalTokens),d.callCount+=n.callCount??0,d.cost=(d.cost??0)+(n.cost??0)):e.set(i,{date:n.date,agentName:"All agents",providerName:"all",modelId:n.modelId,promptTokens:n.promptTokens,completionTokens:n.completionTokens,totalTokens:n.totalTokens,callCount:n.callCount??0,cost:n.cost??0});}return [...e.values()].sort((n,i)=>n.date<i.date?-1:1)}reload(){let{from:t,to:e}=this.appliedFilters();this.loading.set(true),this.error.set(null),By({aggregation:this.api.getTokenUsage({from:t,to:e}),series:this.api.getTokenUsageSeries({from:t,to:e})}).pipe(U(this.destroyRef)).subscribe({next:({aggregation:n,series:i})=>{this.aggregation.set(n),this.seriesResponse.set(i);let d=i.points??[];this.series.set(d),this.tokenDataPartial.set(n.tokenDataPartial||i.tokenDataPartial);let u=this.aggregateByModelId(n.models??[]);this.aggregationByModelId.set(u),this.seriesByModelId.set(this.aggregateSeriesByModelId(d)),this.loading.set(false);},error:n=>{this.loading.set(false),this.aggregation.set(null),this.seriesResponse.set(null),this.series.set(null),this.tokenDataPartial.set(false),this.aggregationByModelId.set(null),this.seriesByModelId.set(null),this.error.set(n instanceof Error?n.message:"Failed to load token usage");}});}static \u0275fac=function(e){return new(e||o)};static \u0275prov=x({token:o,factory:o.\u0275fac,providedIn:"root"})};var q=function(){throw new Error("DON'T USE this INSIDE A FUNCTION CALLED BY | call OR | apply IT MUST BE A PURE FUNCTION!")},De=typeof Proxy!="function"?Object.seal({}):new Proxy({},{get:q,set:q,deleteProperty:q,has:q}),K=class o{transform(t,e){if(typeof e!="function")throw new TypeError("You must pass a PURE function to | call");return e?.call(De,t)}static \u0275fac=function(e){return new(e||o)};static \u0275pipe=Rn({name:"call",type:o,pure:true})},Q=class o{transform(t,...e){if(typeof t!="function")throw new TypeError("You must use | apply on a PURE function");return t.apply(De,e)}static \u0275fac=function(e){return new(e||o)};static \u0275pipe=Rn({name:"apply",type:o,pure:true})};function Qe(o,t){o&1&&(Is(0,"div",23),qC(1," Partial data \u2014 token counts may not cover the full period "),pl());}function Ze(o,t){o&1&&(Is(0,"div",24),qC(1," No token data collected for this period "),pl());}function et(o,t){if(o&1&&(Is(0,"div",19)(1,"div",20)(2,"div",21),qC(3,"Total tokens"),pl(),Is(4,"div",22),qC(5),cT(6,"call"),pl()(),Is(7,"div",20)(8,"div",21),qC(9,"Total calls"),pl(),Is(10,"div",22),qC(11),pl()(),Is(12,"div",20)(13,"div",21),qC(14,"Total cost"),pl(),Is(15,"div",22),qC(16),cT(17,"apply"),pl()()(),tC(18,Qe,2,0,"div",23),tC(19,Ze,2,0,"div",24)),o&2){let e=yC();JE(5),Zg(dT(6,5,e.totalRow().totalTokens,e.formatTokenValue)),JE(6),Zg(e.totalRow().callCount),JE(5),Zg(fT(17,8,e.formatCostValue,e.isMissingPeriod(),e.totalRow().cost)),JE(2),nC(e.isPartialPeriod()?18:-1),JE(),nC(e.isMissingPeriod()?19:-1);}}function tt(o,t){o&1&&(Is(0,"div",16)(1,"div",25),qC(2,"Loading token usage\u2026"),pl()());}function nt(o,t){if(o&1&&(Is(0,"div",17)(1,"div",26),qC(2,"Failed to load"),pl(),Is(3,"div",25),qC(4),pl()()),o&2){let e=yC();JE(4),Zg(e.state.error());}}function ot(o,t){o&1&&(Is(0,"div",16)(1,"div",26),qC(2,"No data"),pl(),Is(3,"div",25),qC(4,"No token usage recorded yet for this period."),pl()());}function at(o,t){if(o&1&&(Is(0,"div",32)(1,"div",29),qC(2),pl(),Is(3,"div",29),qC(4),pl(),Is(5,"div",29),qC(6),pl(),Is(7,"div",30),qC(8),cT(9,"call"),pl(),Is(10,"div",30),qC(11),cT(12,"call"),pl(),Is(13,"div",30),qC(14),cT(15,"call"),pl(),Is(16,"div",30),qC(17),pl(),Is(18,"div",30),qC(19),cT(20,"apply"),pl()()),o&2){let e=t.$implicit,n=yC(2);JE(2),Zg(e.agentName),JE(2),Zg(e.providerName),JE(2),Zg(e.modelId),JE(2),Zg(dT(9,8,e.promptTokens,n.formatTokenValue)),JE(3),Zg(dT(12,11,e.completionTokens,n.formatTokenValue)),JE(3),Zg(dT(15,14,e.totalTokens,n.formatTokenValue)),JE(3),Zg(e.callCount),JE(2),vl(" ",fT(20,17,n.formatCostValue,n.isMissingPeriod(),e.cost)," ");}}function it(o,t){if(o&1&&(Is(0,"div",33)(1,"div",29),qC(2),pl(),Is(3,"div",29),qC(4),pl(),Is(5,"div",29),qC(6),pl(),Is(7,"div",30),qC(8),cT(9,"call"),pl(),Is(10,"div",30),qC(11),cT(12,"call"),pl(),Is(13,"div",30),qC(14),cT(15,"call"),pl(),Is(16,"div",30),qC(17),pl(),Is(18,"div",30),qC(19),cT(20,"apply"),pl()()),o&2){let e=yC(2);JE(2),Zg(e.totalRow().agentName),JE(2),Zg(e.totalRow().providerName),JE(2),Zg(e.totalRow().modelId),JE(2),Zg(dT(9,8,e.totalRow().promptTokens,e.formatTokenValue)),JE(3),vl(" ",dT(12,11,e.totalRow().completionTokens,e.formatTokenValue)," "),JE(3),Zg(dT(15,14,e.totalRow().totalTokens,e.formatTokenValue)),JE(3),Zg(e.totalRow().callCount),JE(2),vl(" ",fT(20,17,e.formatCostValue,e.isMissingPeriod(),e.totalRow().cost)," ");}}function rt(o,t){if(o&1&&(Is(0,"div",18)(1,"section",16)(2,"div",26),qC(3,"Summary"),pl(),Is(4,"div",27)(5,"div",28)(6,"div",29),qC(7,"agentName"),pl(),Is(8,"div",29),qC(9,"providerName"),pl(),Is(10,"div",29),qC(11,"modelId"),pl(),Is(12,"div",30),qC(13,"promptTokens"),pl(),Is(14,"div",30),qC(15,"completionTokens"),pl(),Is(16,"div",30),qC(17,"totalTokens"),pl(),Is(18,"div",30),qC(19,"callCount"),pl(),Is(20,"div",30),qC(21,"cost"),pl()(),Is(22,"div",31),iC(23,at,21,21,"div",32,Jw().trackRow,true),tC(25,it,21,21,"div",33),pl()()(),Is(26,"section",16)(27,"div",26),qC(28,"Daily series"),pl(),bg(29,"app-daily-series-chart",34),pl()()),o&2){let e=yC();JE(23),sC(e.rows()),JE(2),nC(e.totalRow()?25:-1),JE(4),Tg("points",e.chartPoints());}}var Ee="\u2014",Oe=class o{location=g(Sm);state=g(J);view=zi("byModel");rowsByAgent=yT(()=>this.state.aggregation()?.models??[]);totalRow=yT(()=>this.state.aggregation()?.total??null);rowsByModel=yT(()=>this.state.aggregationByModelId()??[]);chartPointsByAgent=yT(()=>{let t=this.state.series()??[];return this.aggregateDailyPoints(t)});chartPointsByModel=yT(()=>{let t=this.state.seriesByModelId()??[];return this.aggregateDailyPoints(t)});chartPoints=yT(()=>this.view()==="byAgent"?this.chartPointsByAgent():this.chartPointsByModel());rows=yT(()=>this.view()==="byAgent"?this.rowsByAgent():this.rowsByModel());isEmpty=yT(()=>{let t=this.state.aggregation();return t?(t.models?.length??0)===0&&(t.total?.callCount??0)===0:false});ngOnInit(){this.state.init();}onFromChange(t){this.state.setDraftFrom(t||null);}onToChange(t){this.state.setDraftTo(t||null);}clearFrom(){this.state.clearDraftFrom();}clearTo(){this.state.clearDraftTo();}apply(){this.state.apply();}aggregateDailyPoints(t){let e=new Map;for(let n of t){let i=e.get(n.date);if(!i)e.set(n.date,{date:n.date,promptTokens:n.promptTokens,completionTokens:n.completionTokens,cost:n.cost??0,callCount:n.callCount??0});else {let d=(u,f)=>u===null&&f===null?null:(u??0)+(f??0);i.promptTokens=d(i.promptTokens,n.promptTokens),i.completionTokens=d(i.completionTokens,n.completionTokens),i.cost=(i.cost??0)+(n.cost??0),i.callCount=(i.callCount??0)+(n.callCount??0);}}return [...e.values()].sort((n,i)=>n.date<i.date?-1:1)}trackRow(t,e){return `${e.agentName}|${e.providerName}|${e.modelId}`}isMissingPeriod=yT(()=>{if(this.state.loading())return false;let t=this.state.aggregation()?.total;return t?t.totalTokens===null&&(t.cost===null||t.cost===void 0):false});isPartialPeriod=yT(()=>!this.isMissingPeriod()&&this.state.tokenDataPartial());navigateBack(){this.location.back();}formatTokenValue(t){return t===null?Ee:new Pb("en-US").transform(t,"1.0-2")??"0"}formatCostValue(t,e){return t?Ee:"$"+(new Pb("en-US").transform(e??0,"1.2-2")??"0.00")}static \u0275fac=function(e){return new(e||o)};static \u0275cmp=Rw({type:o,selectors:[["app-token-usage"]],decls:41,vars:8,consts:[[1,"page"],[1,"page__header"],[1,"page__title-block"],["mat-icon-button","","title","Back",3,"click"],[1,"page__title"],[1,"page__subtitle"],[1,"filters"],[1,"filters__field"],[1,"filters__label"],[1,"filters__control"],["type","date",1,"filters__input",3,"ngModelChange","ngModel"],["type","button",1,"filters__clear",3,"click","disabled"],[1,"filters__select",3,"ngModelChange","ngModel"],["value","byModel"],["value","byAgent"],["type","button",1,"filters__apply",3,"click","disabled"],[1,"card"],[1,"card","card--error"],[1,"grid"],[1,"kpis"],[1,"kpi"],[1,"kpi__label"],[1,"kpi__value"],["title","Some calls in this period were recorded before token tracking was enabled. Token counts reflect only the portion where data was collected.",1,"hint"],["title","No token usage data was collected for this period.",1,"hint"],[1,"muted"],[1,"card__title"],[1,"table"],[1,"table__head"],[1,"table__cell"],[1,"table__cell","table__cell--num"],[1,"table__body"],[1,"table__row"],[1,"table__row","table__row--total"],[3,"points"]],template:function(e,n){e&1&&(Is(0,"section",0)(1,"header",1)(2,"div",2)(3,"button",3),Ag("click",function(){return n.navigateBack()}),Is(4,"mat-icon"),qC(5,"chevron_left"),pl()(),Is(6,"div")(7,"h1",4),qC(8,"Token Usage"),pl(),Is(9,"p",5),qC(10,"Track prompt and completion token usage by agent and model."),pl()()(),Is(11,"div",6)(12,"label",7)(13,"span",8),qC(14,"From"),pl(),Is(15,"div",9)(16,"input",10),Ag("ngModelChange",function(d){return n.onFromChange(d)}),pl(),UI(),Is(17,"button",11),Ag("click",function(){return n.clearFrom()}),qC(18," Clear "),pl()()(),Is(19,"label",7)(20,"span",8),qC(21,"To"),pl(),Is(22,"div",9)(23,"input",10),Ag("ngModelChange",function(d){return n.onToChange(d)}),pl(),UI(),Is(24,"button",11),Ag("click",function(){return n.clearTo()}),qC(25," Clear "),pl()()(),Is(26,"label",7)(27,"span",8),qC(28,"View"),pl(),Is(29,"select",12),Ag("ngModelChange",function(d){return n.view.set(d)}),Is(30,"option",13),qC(31,"By model"),pl(),Is(32,"option",14),qC(33,"By agent"),pl()(),UI(),pl(),Is(34,"button",15),Ag("click",function(){return n.apply()}),qC(35,"Apply"),pl()()(),tC(36,et,20,12),tC(37,tt,3,0,"div",16)(38,nt,5,1,"div",17)(39,ot,5,0,"div",16)(40,rt,30,2,"div",18),pl()),e&2&&(JE(16),Tg("ngModel",n.state.draftFilters().from),zI(),JE(),Tg("disabled",!n.state.draftFilters().from),JE(6),Tg("ngModel",n.state.draftFilters().to),zI(),JE(),Tg("disabled",!n.state.draftFilters().to),JE(5),Tg("ngModel",n.view()),zI(),JE(5),Tg("disabled",n.state.loading()),JE(2),nC(n.totalRow()?36:-1),JE(),nC(n.state.loading()?37:n.state.error()?38:n.isEmpty()?39:40));},dependencies:[ti,Qn,ei,Ye$1,At,Zn,cn,j,hr,Gn,yt,wt,K,Q],styles:[".page[_ngcontent-%COMP%]{padding:1.5rem;color:var(--color-text, #1d1d1f)}.page__header[_ngcontent-%COMP%]{display:flex;align-items:flex-start;justify-content:space-between;gap:1.5rem;margin-bottom:1rem}.page__title-block[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:.75rem}.page__title[_ngcontent-%COMP%]{margin:0;font-size:1.25rem;font-weight:650}.page__subtitle[_ngcontent-%COMP%]{margin:.25rem 0 0;color:var(--color-text-secondary, rgba(29, 29, 31, .7));font-size:.95rem}.filters[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:flex-end;gap:.75rem}.filters__field[_ngcontent-%COMP%]{display:grid;gap:.25rem}.filters__label[_ngcontent-%COMP%]{font-size:.8rem;color:var(--color-text-secondary, rgba(29, 29, 31, .7))}.filters__control[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem}.filters__input[_ngcontent-%COMP%], .filters__select[_ngcontent-%COMP%]{height:34px;padding:0 .5rem;border-radius:8px;border:1px solid var(--color-border, rgba(0, 0, 0, .12));background:var(--color-bg-secondary, rgba(255, 255, 255, .72));color:var(--color-text, #1d1d1f)}.filters__apply[_ngcontent-%COMP%], .filters__clear[_ngcontent-%COMP%]{height:34px;padding:0 .75rem;border-radius:8px;border:1px solid var(--color-border, rgba(0, 0, 0, .12));background:var(--color-bg-secondary, rgba(255, 255, 255, .72));color:var(--color-text, #1d1d1f);cursor:pointer}.kpis[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.75rem;margin:.75rem 0 1rem}@media(max-width:900px){.kpis[_ngcontent-%COMP%]{grid-template-columns:1fr}}.kpi[_ngcontent-%COMP%]{border-radius:14px;padding:.75rem 1rem;background:var(--glass-bg, rgba(255, 255, 255, .72));border:1px solid var(--glass-border, rgba(255, 255, 255, .18));box-shadow:var(--glass-shadow, 0 8px 24px rgba(0, 0, 0, .08))}.kpi__label[_ngcontent-%COMP%]{font-size:.8rem;color:var(--color-text-secondary, rgba(29, 29, 31, .7))}.kpi__value[_ngcontent-%COMP%]{margin-top:.25rem;font-size:1.2rem;font-weight:650;font-variant-numeric:tabular-nums}.filters__apply[_ngcontent-%COMP%]{border-color:var(--color-primary, #007aff);background:var(--color-primary, #007aff);color:var(--color-text-inverse, #ffffff)}.filters__apply[_ngcontent-%COMP%]:disabled, .filters__clear[_ngcontent-%COMP%]:disabled{opacity:.6;cursor:not-allowed}.grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1.5fr 1fr;gap:1rem;align-items:start}@media(max-width:1100px){.grid[_ngcontent-%COMP%]{grid-template-columns:1fr}}.card[_ngcontent-%COMP%]{border-radius:14px;padding:1rem;background:var(--glass-bg, rgba(255, 255, 255, .72));border:1px solid var(--glass-border, rgba(255, 255, 255, .18));box-shadow:var(--glass-shadow, 0 8px 24px rgba(0, 0, 0, .08))}.card--error[_ngcontent-%COMP%]{border-color:var(--color-error, #ff3b30)}.card__title[_ngcontent-%COMP%]{font-weight:650;margin-bottom:.75rem}.muted[_ngcontent-%COMP%]{color:var(--color-text-secondary, rgba(29, 29, 31, .7))}.table[_ngcontent-%COMP%]{overflow-x:auto}.table__head[_ngcontent-%COMP%], .table__row[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr 2fr 1fr 1fr 1fr .7fr 1fr;gap:.5rem;align-items:center}.table__head[_ngcontent-%COMP%]{font-size:.8rem;color:var(--color-text-secondary, rgba(29, 29, 31, .7));padding:.25rem 0;border-bottom:1px solid var(--color-border-light, rgba(0, 0, 0, .08))}.table__row[_ngcontent-%COMP%]{padding:.5rem 0;border-bottom:1px solid var(--color-border-light, rgba(0, 0, 0, .08))}.table__row--total[_ngcontent-%COMP%]{font-weight:650;background:var(--color-bg-hover, rgba(0, 0, 0, .03));border-radius:10px;padding:.6rem .5rem;border-bottom:none;margin-top:.5rem}.table__cell[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.table__cell--num[_ngcontent-%COMP%]{text-align:right;font-variant-numeric:tabular-nums}.hint[_ngcontent-%COMP%]{margin:.25rem 0 1rem;color:var(--color-text-secondary, rgba(29, 29, 31, .7));font-size:.85rem}"],changeDetection:1})};export{Oe as TokenUsageComponent};
1
+ import {g,bm as _m,a as Gi,E as ET,cF as Bb,h as Fw,i as hr,k as Gn,m as ws,o as Rg,Q as QC,n as hl,a3 as GI,q as oC,t as nI,v as bg,a6 as qI,x as iC,w as we$1,z as z$1,b as P,W as Vy,c as U,Y as x,b1 as Rn,bf as dT,ac as EC,a8 as Yg,bi as hT,cG as gT,r as cC,cH as nC,S as Sg,y as uC,I as fy,cI as Nt,aw as gl,ax as ml,c9 as Ff,b6 as _g,ck as Pf,T as Tg,a5 as Dl,a9 as gC,cJ as Og,aa as wf,ab as Cf,ad as Hg}from'./main-LBRSRTYI.js';import {t as ti,Q as Qn,e as ei,Y as Ye$1,A as At,Z as Zn,c as cn,y as yt,w as wt}from'./chunk-BYyTBqh4.js';var Ae=(o,t)=>t.date,He=(o,t)=>t.x,$e=(o,t)=>t.label;function Ve(o,t){o&1&&(gl(0,"div",0),QC(1,"No daily data points for this period."),ml());}function Le(o,t){if(o&1&&(Ff(),_g(0,"rect",18)),o&2){let e=EC().$implicit,n=EC(2);Tg("x",e.w+6)("y",n.yBase-e.tokensStubH)("width",e.w)("height",e.tokensStubH);}}function Ge(o,t){if(o&1&&(Ff(),_g(0,"rect",19)(1,"rect",20)),o&2){let e=EC().$implicit,n=EC(2);Tg("x",e.w+6)("y",n.yBase-(e.promptH??0))("width",e.w)("height",e.promptH??0),nI(),Tg("x",e.w+6)("y",n.yBase-((e.promptH??0)+(e.completionH??0)))("width",e.w)("height",e.completionH??0);}}function Ye(o,t){if(o&1){let e=gC();Ff(),gl(0,"g",15),Og("mouseenter",function(i){let d=wf(e).$implicit,u=EC(2);return Cf(u.showTooltip(i,d.point))})("mousemove",function(i){let d=wf(e).$implicit,u=EC(2);return Cf(u.showTooltip(i,d.point))})("mouseleave",function(){wf(e);let i=EC(2);return Cf(i.hideTooltip())}),_g(1,"rect",16)(2,"rect",17),oC(3,Le,1,4,":svg:rect",18)(4,Ge,2,8),ml();}if(o&2){let e=t.$implicit,n=EC(2);Tg("transform","translate("+e.xGroup+",0)"),nI(),Tg("y",n.yTop)("width",e.groupW)("height",n.yBase-n.yTop),nI(),Tg("y",n.yBase-e.costH)("width",e.w)("height",e.costH),nI(),iC(e.tokensStubH!==null?3:4);}}function We(o,t){if(o&1&&(Ff(),gl(0,"text",5),QC(1),ml()),o&2){let e=t.$implicit,n=EC(2);Tg("x",e.x)("y",n.yAxis),nI(),Yg(e.label);}}function je(o,t){if(o&1&&(gl(0,"div",24),QC(1),ml(),gl(2,"div",25),QC(3),ml()),o&2){let e=t.$implicit;nI(),Yg(e.label),nI(2),Yg(e.value);}}function ze(o,t){if(o&1&&(gl(0,"div",21)(1,"div",22),QC(2),ml(),gl(3,"div",23),cC(4,je,4,2,null,null,$e),ml()()),o&2){let e=EC(2);Hg("left",e.tooltip().x+12,"px")("top",e.tooltip().y+12,"px"),nI(2),Yg(e.tooltip().data.date),nI(2),uC(e.tooltipLines());}}function Xe(o,t){if(o&1&&(gl(0,"div",8)(1,"span",10),QC(2),ml()()),o&2){let e=EC(2);nI(2),Yg(e.tokenCoverageLabel());}}function Je(o,t){if(o&1&&(gl(0,"div",1),Ff(),gl(1,"svg",2),_g(2,"line",3)(3,"line",3),cC(4,Ye,5,8,":svg:g",4,Ae),cC(6,We,2,3,":svg:text",5,He),ml(),oC(8,ze,6,5,"div",6),Pf(),gl(9,"div",7)(10,"div",8),_g(11,"span",9),gl(12,"span",10),QC(13,"Cost (per day)"),ml(),gl(14,"span",11),QC(15),ml()(),gl(16,"div",8),_g(17,"span",12),gl(18,"span",10),QC(19,"Prompt tokens"),ml()(),gl(20,"div",8),_g(21,"span",13),gl(22,"span",10),QC(23,"Completion tokens"),ml()(),gl(24,"div",8),_g(25,"span",14),gl(26,"span",10),QC(27,"Tokens missing"),ml()(),gl(28,"div",8)(29,"span",10),QC(30,"Tokens scale"),ml(),gl(31,"span",11),QC(32),ml()(),oC(33,Xe,3,1,"div",8),ml()()),o&2){let e=EC();nI(),Tg("viewBox",e.viewBox),nI(),Tg("y1",e.yTop)("x2",720)("y2",e.yTop),nI(),Tg("y1",e.yBase)("x2",720)("y2",e.yBase),nI(),uC(e.bars()),nI(2),uC(e.axisLabels()),nI(2),iC(e.tooltip().visible&&e.tooltip().data?8:-1),nI(7),Dl("max ",e.maxCostLabel()),nI(17),Dl("max ",e.maxTokensLabel()),nI(),iC(e.tokenCoverageLabel()?33:-1);}}var j=class o{points=[];width=720;height=240;paddingX=12;paddingY=16;bottomAxisH=48;viewBox=`0 0 ${this.width} ${this.height}`;innerW=this.width-this.paddingX*2;innerH=this.height-this.paddingY*2-this.bottomAxisH;barGap=6;groupGap=14;safePoints=ET(()=>(this.points??[]).filter(t=>!!t.date));maxCost=ET(()=>Math.max(0,...this.safePoints().map(t=>t.cost??0)));maxTokens=ET(()=>{let t=this.safePoints().map(e=>{let n=e.promptTokens??null,i=e.completionTokens??null;return n===null&&i===null?null:(n??0)+(i??0)}).filter(e=>e!==null);return Math.max(0,...t)});tokenCoverageLabel=ET(()=>{let t=this.safePoints();return t.length===0?"":`Tokens available for ${t.filter(n=>n.promptTokens!==null||n.completionTokens!==null).length}/${t.length} days`});maxCostLabel=ET(()=>"$"+(new Bb("en-US").transform(this.maxCost(),"1.2-2")??"0.00"));maxTokensLabel=ET(()=>new Bb("en-US").transform(this.maxTokens(),"1.0-2")??"0");tooltip=Gi({visible:false,x:0,y:0,data:null});toTooltipData(t){let e=t.promptTokens,n=t.completionTokens,i=e===null&&n===null?null:(e??0)+(n??0);return {date:t.date,cost:t.cost??0,promptTokens:e,completionTokens:n,totalTokens:i,callCount:t.callCount??0}}showTooltip(t,e){let i=t.currentTarget?.closest(".chart")?.getBoundingClientRect(),d=i?t.clientX-i.left:t.clientX,u=i?t.clientY-i.top:t.clientY,f=320,k=170,U=12,C=i?Math.max(0,i.width-f-U):d,B=i?Math.max(0,i.height-k-U):u,F=i?Math.min(Math.max(0,d),C):d,ne=i?Math.min(Math.max(0,u),B):u;this.tooltip.set({visible:true,x:F,y:ne,data:this.toTooltipData(e)});}hideTooltip(){this.tooltip.update(t=>z$1(P({},t),{visible:false}));}formatTokens(t){return t===null?"\u2014":new Bb("en-US").transform(t,"1.0-2")??"0"}formatCost(t){return "$"+(new Bb("en-US").transform(t??0,"1.2-2")??"0.00")}tooltipLines=ET(()=>{let t=this.tooltip(),e=t.data;return !t.visible||!e?[]:[{label:"Cost",value:this.formatCost(e.cost)},{label:"Prompt tokens",value:this.formatTokens(e.promptTokens)},{label:"Completion tokens",value:this.formatTokens(e.completionTokens)},{label:"Total tokens",value:this.formatTokens(e.totalTokens)},{label:"Calls",value:`${e.callCount}`}]});bars=ET(()=>{let t=this.safePoints(),e=t.length;if(e===0)return [];let n=(this.innerW-(e-1)*this.groupGap)/e,i=Math.max(2,n),d=(i-this.barGap)/2,u=Math.max(1,d),f=this.maxCost()||1,k=this.maxTokens()||1,U=45;return t.map((C,B)=>{let F=this.paddingX+B*(i+this.groupGap),Ie=(C.cost??0)/f*this.innerH,oe=C.promptTokens,ae=C.completionTokens,Z=oe!==null||ae!==null,Ne=oe??0,Ue=ae??0,Be=Z?Ne/k*this.innerH:null,Fe=Z?Ue/k*this.innerH:null;return {date:C.date,point:C,xGroup:F,groupW:i,xCost:F,w:u,costH:Ie,xTokens:F+u+this.barGap,promptH:Be,completionH:Fe,tokensStubH:Z?null:U}})});axisLabels=ET(()=>{let t=this.safePoints(),e=t.length;if(e===0)return [];let i=Math.max(1,Math.ceil(e/8)),d=(this.innerW-(e-1)*this.groupGap)/e,u=Math.max(2,d);return t.map((f,k)=>({p:f,i:k})).filter(({i:f})=>f%i===0||f===e-1).map(({p:f,i:k})=>{let C=this.paddingX+k*(u+this.groupGap)+u/2,B=f.date.slice(5);return {x:C,label:B}})});yTop=this.paddingY;yBase=this.paddingY+this.innerH;yAxis=this.yBase+28;static \u0275fac=function(e){return new(e||o)};static \u0275cmp=Fw({type:o,selectors:[["app-daily-series-chart"]],inputs:{points:"points"},decls:2,vars:1,consts:[[1,"muted"],[1,"chart"],["preserveAspectRatio","none","role","img","aria-label","Daily token and cost usage",1,"chart__svg"],["x1","0",1,"chart__grid"],[1,"chart__day"],["text-anchor","middle",1,"chart__axis-label"],[1,"chart__tooltip",3,"left","top"],[1,"chart__legend"],[1,"chart__legend-item"],["aria-hidden","true",1,"chart__legend-swatch","chart__legend-swatch--cost"],[1,"chart__legend-label"],[1,"chart__legend-value"],["aria-hidden","true",1,"chart__legend-swatch","chart__legend-swatch--prompt"],["aria-hidden","true",1,"chart__legend-swatch","chart__legend-swatch--completion"],["aria-hidden","true",1,"chart__legend-swatch","chart__legend-swatch--tokens-missing"],[1,"chart__day",3,"mouseenter","mousemove","mouseleave"],["x","0",1,"chart__hover"],["x","0",1,"chart__bar","chart__bar--cost"],[1,"chart__bar","chart__bar--tokens-missing"],[1,"chart__bar","chart__bar--prompt"],[1,"chart__bar","chart__bar--completion"],[1,"chart__tooltip"],[1,"chart__tooltip-title"],[1,"chart__tooltip-grid"],[1,"chart__tooltip-label"],[1,"chart__tooltip-value"]],template:function(e,n){e&1&&oC(0,Ve,2,0,"div",0)(1,Je,34,11,"div",1),e&2&&iC(n.safePoints().length===0?0:1);},styles:[".chart[_ngcontent-%COMP%]{display:grid;gap:.5rem;position:relative}.chart__svg[_ngcontent-%COMP%]{width:100%;height:260px;display:block;border-radius:12px;background:var(--color-bg-secondary, rgba(255, 255, 255, .72));border:1px solid var(--color-border-light, rgba(0, 0, 0, .08))}.chart__grid[_ngcontent-%COMP%]{stroke:var(--color-border-light, rgba(0, 0, 0, .08));stroke-width:1}.chart__day[_ngcontent-%COMP%]{cursor:default}.chart__hover[_ngcontent-%COMP%]{fill:transparent}.chart__day[_ngcontent-%COMP%]:hover .chart__hover[_ngcontent-%COMP%]{fill:var(--color-bg-hover, rgba(0, 0, 0, .03))}.chart__tooltip[_ngcontent-%COMP%]{position:absolute;z-index:2;min-width:220px;max-width:320px;padding:10px 12px;border-radius:12px;background:rgb(var(--color-bg-secondary-rgb, 255 255 255)/1);border:1px solid var(--color-border-light, rgba(0, 0, 0, .08));box-shadow:var(--glass-shadow, 0 8px 24px rgba(0, 0, 0, .12));pointer-events:none}.chart__tooltip-title[_ngcontent-%COMP%]{font-weight:650;margin-bottom:6px}.chart__tooltip-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr auto;column-gap:10px;row-gap:4px}.chart__tooltip-label[_ngcontent-%COMP%]{color:var(--color-text-secondary, rgba(29, 29, 31, .7));font-size:.85rem}.chart__tooltip-value[_ngcontent-%COMP%]{font-variant-numeric:tabular-nums;text-align:right}.chart__bar[_ngcontent-%COMP%]{shape-rendering:geometricPrecision;rx:2;ry:2}.chart__bar--cost[_ngcontent-%COMP%]{fill:var(--color-primary, #007aff);opacity:.85}.chart__bar--prompt[_ngcontent-%COMP%]{fill:var(--color-success, #34c759);opacity:.85}.chart__bar--completion[_ngcontent-%COMP%]{fill:var(--color-warning, #ff9500);opacity:.85}.chart__bar--tokens-missing[_ngcontent-%COMP%]{fill:transparent;stroke:var(--color-text-secondary, rgba(29, 29, 31, .55));stroke-width:1.5;stroke-dasharray:4 3}.chart__axis-label[_ngcontent-%COMP%]{fill:var(--color-text-secondary, rgba(29, 29, 31, .7));font-size:12px;font-variant-numeric:tabular-nums}.chart__legend[_ngcontent-%COMP%]{display:flex;justify-content:space-between;gap:.75rem;flex-wrap:wrap}.chart__legend-item[_ngcontent-%COMP%]{display:flex;gap:.5rem;align-items:baseline}.chart__legend-swatch[_ngcontent-%COMP%]{width:10px;height:10px;border-radius:3px;align-self:center}.chart__legend-swatch--cost[_ngcontent-%COMP%]{background:var(--color-primary, #007aff)}.chart__legend-swatch--prompt[_ngcontent-%COMP%]{background:var(--color-success, #34c759)}.chart__legend-swatch--completion[_ngcontent-%COMP%]{background:var(--color-warning, #ff9500)}.chart__legend-swatch--tokens-missing[_ngcontent-%COMP%]{background:transparent;border:1px dashed var(--color-text-secondary, rgba(29, 29, 31, .55))}.chart__legend-label[_ngcontent-%COMP%]{color:var(--color-text-secondary, rgba(29, 29, 31, .7));font-size:.85rem}.chart__legend-value[_ngcontent-%COMP%]{font-variant-numeric:tabular-nums}.muted[_ngcontent-%COMP%]{color:var(--color-text-secondary, rgba(29, 29, 31, .7))}"]})};var X=class o{http=g(fy);getTokenUsage(t){let e=new Nt;return t.from&&(e=e.set("from",t.from)),t.to&&(e=e.set("to",t.to)),this.http.get("/api/token-usage",{params:e})}getTokenUsageSeries(t){let e=new Nt;return t.from&&(e=e.set("from",t.from)),t.to&&(e=e.set("to",t.to)),this.http.get("/api/token-usage/series",{params:e})}static \u0275fac=function(e){return new(e||o)};static \u0275prov=x({token:o,factory:o.\u0275fac,providedIn:"root"})};function Pe(o){return `${o}`.padStart(2,"0")}function we(o){return `${o.getUTCFullYear()}-${Pe(o.getUTCMonth()+1)}-${Pe(o.getUTCDate())}`}function qe(o=new Date){return new Date(Date.UTC(o.getUTCFullYear(),o.getUTCMonth(),1))}function Ke(o=new Date){return new Date(Date.UTC(o.getUTCFullYear(),o.getUTCMonth()+1,1))}var J=class o{api=g(X);destroyRef=g(we$1);defaultFrom=we(qe());defaultTo=we(Ke());draftFilters=Gi({from:this.defaultFrom,to:this.defaultTo});appliedFilters=Gi({from:this.defaultFrom,to:this.defaultTo});loading=Gi(false);error=Gi(null);aggregation=Gi(null);seriesResponse=Gi(null);series=Gi(null);tokenDataPartial=Gi(false);aggregationByModelId=Gi(null);seriesByModelId=Gi(null);init(){this.reload();}setDraftFrom(t){this.draftFilters.update(e=>z$1(P({},e),{from:t}));}setDraftTo(t){this.draftFilters.update(e=>z$1(P({},e),{to:t}));}clearDraftFrom(){this.setDraftFrom(null);}clearDraftTo(){this.setDraftTo(null);}apply(){this.appliedFilters.set(this.draftFilters()),this.reload();}addNullableTokens(t,e){return t===null&&e===null?null:(t??0)+(e??0)}aggregateByModelId(t){let e=new Map;for(let n of t){let i=n.modelId,d=e.get(i);d?(d.promptTokens=this.addNullableTokens(d.promptTokens,n.promptTokens),d.completionTokens=this.addNullableTokens(d.completionTokens,n.completionTokens),d.totalTokens=this.addNullableTokens(d.totalTokens,n.totalTokens),d.callCount+=n.callCount??0,d.cost=(d.cost??0)+(n.cost??0)):e.set(i,{agentName:"All agents",providerName:"all",modelId:n.modelId,promptTokens:n.promptTokens,completionTokens:n.completionTokens,totalTokens:n.totalTokens,callCount:n.callCount??0,cost:n.cost??0});}return [...e.values()].sort((n,i)=>(i.totalTokens??0)-(n.totalTokens??0))}aggregateSeriesByModelId(t){let e=new Map;for(let n of t){let i=`${n.date}|${n.modelId}`,d=e.get(i);d?(d.promptTokens=this.addNullableTokens(d.promptTokens,n.promptTokens),d.completionTokens=this.addNullableTokens(d.completionTokens,n.completionTokens),d.totalTokens=this.addNullableTokens(d.totalTokens,n.totalTokens),d.callCount+=n.callCount??0,d.cost=(d.cost??0)+(n.cost??0)):e.set(i,{date:n.date,agentName:"All agents",providerName:"all",modelId:n.modelId,promptTokens:n.promptTokens,completionTokens:n.completionTokens,totalTokens:n.totalTokens,callCount:n.callCount??0,cost:n.cost??0});}return [...e.values()].sort((n,i)=>n.date<i.date?-1:1)}reload(){let{from:t,to:e}=this.appliedFilters();this.loading.set(true),this.error.set(null),Vy({aggregation:this.api.getTokenUsage({from:t,to:e}),series:this.api.getTokenUsageSeries({from:t,to:e})}).pipe(U(this.destroyRef)).subscribe({next:({aggregation:n,series:i})=>{this.aggregation.set(n),this.seriesResponse.set(i);let d=i.points??[];this.series.set(d),this.tokenDataPartial.set(n.tokenDataPartial||i.tokenDataPartial);let u=this.aggregateByModelId(n.models??[]);this.aggregationByModelId.set(u),this.seriesByModelId.set(this.aggregateSeriesByModelId(d)),this.loading.set(false);},error:n=>{this.loading.set(false),this.aggregation.set(null),this.seriesResponse.set(null),this.series.set(null),this.tokenDataPartial.set(false),this.aggregationByModelId.set(null),this.seriesByModelId.set(null),this.error.set(n instanceof Error?n.message:"Failed to load token usage");}});}static \u0275fac=function(e){return new(e||o)};static \u0275prov=x({token:o,factory:o.\u0275fac,providedIn:"root"})};var q=function(){throw new Error("DON'T USE this INSIDE A FUNCTION CALLED BY | call OR | apply IT MUST BE A PURE FUNCTION!")},De=typeof Proxy!="function"?Object.seal({}):new Proxy({},{get:q,set:q,deleteProperty:q,has:q}),K=class o{transform(t,e){if(typeof e!="function")throw new TypeError("You must pass a PURE function to | call");return e?.call(De,t)}static \u0275fac=function(e){return new(e||o)};static \u0275pipe=Rn({name:"call",type:o,pure:true})},Q=class o{transform(t,...e){if(typeof t!="function")throw new TypeError("You must use | apply on a PURE function");return t.apply(De,e)}static \u0275fac=function(e){return new(e||o)};static \u0275pipe=Rn({name:"apply",type:o,pure:true})};function Qe(o,t){o&1&&(ws(0,"div",23),QC(1," Partial data \u2014 token counts may not cover the full period "),hl());}function Ze(o,t){o&1&&(ws(0,"div",24),QC(1," No token data collected for this period "),hl());}function et(o,t){if(o&1&&(ws(0,"div",19)(1,"div",20)(2,"div",21),QC(3,"Total tokens"),hl(),ws(4,"div",22),QC(5),dT(6,"call"),hl()(),ws(7,"div",20)(8,"div",21),QC(9,"Total calls"),hl(),ws(10,"div",22),QC(11),hl()(),ws(12,"div",20)(13,"div",21),QC(14,"Total cost"),hl(),ws(15,"div",22),QC(16),dT(17,"apply"),hl()()(),oC(18,Qe,2,0,"div",23),oC(19,Ze,2,0,"div",24)),o&2){let e=EC();nI(5),Yg(hT(6,5,e.totalRow().totalTokens,e.formatTokenValue)),nI(6),Yg(e.totalRow().callCount),nI(5),Yg(gT(17,8,e.formatCostValue,e.isMissingPeriod(),e.totalRow().cost)),nI(2),iC(e.isPartialPeriod()?18:-1),nI(),iC(e.isMissingPeriod()?19:-1);}}function tt(o,t){o&1&&(ws(0,"div",16)(1,"div",25),QC(2,"Loading token usage\u2026"),hl()());}function nt(o,t){if(o&1&&(ws(0,"div",17)(1,"div",26),QC(2,"Failed to load"),hl(),ws(3,"div",25),QC(4),hl()()),o&2){let e=EC();nI(4),Yg(e.state.error());}}function ot(o,t){o&1&&(ws(0,"div",16)(1,"div",26),QC(2,"No data"),hl(),ws(3,"div",25),QC(4,"No token usage recorded yet for this period."),hl()());}function at(o,t){if(o&1&&(ws(0,"div",32)(1,"div",29),QC(2),hl(),ws(3,"div",29),QC(4),hl(),ws(5,"div",29),QC(6),hl(),ws(7,"div",30),QC(8),dT(9,"call"),hl(),ws(10,"div",30),QC(11),dT(12,"call"),hl(),ws(13,"div",30),QC(14),dT(15,"call"),hl(),ws(16,"div",30),QC(17),hl(),ws(18,"div",30),QC(19),dT(20,"apply"),hl()()),o&2){let e=t.$implicit,n=EC(2);nI(2),Yg(e.agentName),nI(2),Yg(e.providerName),nI(2),Yg(e.modelId),nI(2),Yg(hT(9,8,e.promptTokens,n.formatTokenValue)),nI(3),Yg(hT(12,11,e.completionTokens,n.formatTokenValue)),nI(3),Yg(hT(15,14,e.totalTokens,n.formatTokenValue)),nI(3),Yg(e.callCount),nI(2),Dl(" ",gT(20,17,n.formatCostValue,n.isMissingPeriod(),e.cost)," ");}}function it(o,t){if(o&1&&(ws(0,"div",33)(1,"div",29),QC(2),hl(),ws(3,"div",29),QC(4),hl(),ws(5,"div",29),QC(6),hl(),ws(7,"div",30),QC(8),dT(9,"call"),hl(),ws(10,"div",30),QC(11),dT(12,"call"),hl(),ws(13,"div",30),QC(14),dT(15,"call"),hl(),ws(16,"div",30),QC(17),hl(),ws(18,"div",30),QC(19),dT(20,"apply"),hl()()),o&2){let e=EC(2);nI(2),Yg(e.totalRow().agentName),nI(2),Yg(e.totalRow().providerName),nI(2),Yg(e.totalRow().modelId),nI(2),Yg(hT(9,8,e.totalRow().promptTokens,e.formatTokenValue)),nI(3),Dl(" ",hT(12,11,e.totalRow().completionTokens,e.formatTokenValue)," "),nI(3),Yg(hT(15,14,e.totalRow().totalTokens,e.formatTokenValue)),nI(3),Yg(e.totalRow().callCount),nI(2),Dl(" ",gT(20,17,e.formatCostValue,e.isMissingPeriod(),e.totalRow().cost)," ");}}function rt(o,t){if(o&1&&(ws(0,"div",18)(1,"section",16)(2,"div",26),QC(3,"Summary"),hl(),ws(4,"div",27)(5,"div",28)(6,"div",29),QC(7,"agentName"),hl(),ws(8,"div",29),QC(9,"providerName"),hl(),ws(10,"div",29),QC(11,"modelId"),hl(),ws(12,"div",30),QC(13,"promptTokens"),hl(),ws(14,"div",30),QC(15,"completionTokens"),hl(),ws(16,"div",30),QC(17,"totalTokens"),hl(),ws(18,"div",30),QC(19,"callCount"),hl(),ws(20,"div",30),QC(21,"cost"),hl()(),ws(22,"div",31),cC(23,at,21,21,"div",32,nC().trackRow,true),oC(25,it,21,21,"div",33),hl()()(),ws(26,"section",16)(27,"div",26),QC(28,"Daily series"),hl(),Sg(29,"app-daily-series-chart",34),hl()()),o&2){let e=EC();nI(23),uC(e.rows()),nI(2),iC(e.totalRow()?25:-1),nI(4),bg("points",e.chartPoints());}}var Ee="\u2014",Oe=class o{location=g(_m);state=g(J);view=Gi("byModel");rowsByAgent=ET(()=>this.state.aggregation()?.models??[]);totalRow=ET(()=>this.state.aggregation()?.total??null);rowsByModel=ET(()=>this.state.aggregationByModelId()??[]);chartPointsByAgent=ET(()=>{let t=this.state.series()??[];return this.aggregateDailyPoints(t)});chartPointsByModel=ET(()=>{let t=this.state.seriesByModelId()??[];return this.aggregateDailyPoints(t)});chartPoints=ET(()=>this.view()==="byAgent"?this.chartPointsByAgent():this.chartPointsByModel());rows=ET(()=>this.view()==="byAgent"?this.rowsByAgent():this.rowsByModel());isEmpty=ET(()=>{let t=this.state.aggregation();return t?(t.models?.length??0)===0&&(t.total?.callCount??0)===0:false});ngOnInit(){this.state.init();}onFromChange(t){this.state.setDraftFrom(t||null);}onToChange(t){this.state.setDraftTo(t||null);}clearFrom(){this.state.clearDraftFrom();}clearTo(){this.state.clearDraftTo();}apply(){this.state.apply();}aggregateDailyPoints(t){let e=new Map;for(let n of t){let i=e.get(n.date);if(!i)e.set(n.date,{date:n.date,promptTokens:n.promptTokens,completionTokens:n.completionTokens,cost:n.cost??0,callCount:n.callCount??0});else {let d=(u,f)=>u===null&&f===null?null:(u??0)+(f??0);i.promptTokens=d(i.promptTokens,n.promptTokens),i.completionTokens=d(i.completionTokens,n.completionTokens),i.cost=(i.cost??0)+(n.cost??0),i.callCount=(i.callCount??0)+(n.callCount??0);}}return [...e.values()].sort((n,i)=>n.date<i.date?-1:1)}trackRow(t,e){return `${e.agentName}|${e.providerName}|${e.modelId}`}isMissingPeriod=ET(()=>{if(this.state.loading())return false;let t=this.state.aggregation()?.total;return t?t.totalTokens===null&&(t.cost===null||t.cost===void 0):false});isPartialPeriod=ET(()=>!this.isMissingPeriod()&&this.state.tokenDataPartial());navigateBack(){this.location.back();}formatTokenValue(t){return t===null?Ee:new Bb("en-US").transform(t,"1.0-2")??"0"}formatCostValue(t,e){return t?Ee:"$"+(new Bb("en-US").transform(e??0,"1.2-2")??"0.00")}static \u0275fac=function(e){return new(e||o)};static \u0275cmp=Fw({type:o,selectors:[["app-token-usage"]],decls:41,vars:8,consts:[[1,"page"],[1,"page__header"],[1,"page__title-block"],["mat-icon-button","","title","Back",3,"click"],[1,"page__title"],[1,"page__subtitle"],[1,"filters"],[1,"filters__field"],[1,"filters__label"],[1,"filters__control"],["type","date",1,"filters__input",3,"ngModelChange","ngModel"],["type","button",1,"filters__clear",3,"click","disabled"],[1,"filters__select",3,"ngModelChange","ngModel"],["value","byModel"],["value","byAgent"],["type","button",1,"filters__apply",3,"click","disabled"],[1,"card"],[1,"card","card--error"],[1,"grid"],[1,"kpis"],[1,"kpi"],[1,"kpi__label"],[1,"kpi__value"],["title","Some calls in this period were recorded before token tracking was enabled. Token counts reflect only the portion where data was collected.",1,"hint"],["title","No token usage data was collected for this period.",1,"hint"],[1,"muted"],[1,"card__title"],[1,"table"],[1,"table__head"],[1,"table__cell"],[1,"table__cell","table__cell--num"],[1,"table__body"],[1,"table__row"],[1,"table__row","table__row--total"],[3,"points"]],template:function(e,n){e&1&&(ws(0,"section",0)(1,"header",1)(2,"div",2)(3,"button",3),Rg("click",function(){return n.navigateBack()}),ws(4,"mat-icon"),QC(5,"chevron_left"),hl()(),ws(6,"div")(7,"h1",4),QC(8,"Token Usage"),hl(),ws(9,"p",5),QC(10,"Track prompt and completion token usage by agent and model."),hl()()(),ws(11,"div",6)(12,"label",7)(13,"span",8),QC(14,"From"),hl(),ws(15,"div",9)(16,"input",10),Rg("ngModelChange",function(d){return n.onFromChange(d)}),hl(),GI(),ws(17,"button",11),Rg("click",function(){return n.clearFrom()}),QC(18," Clear "),hl()()(),ws(19,"label",7)(20,"span",8),QC(21,"To"),hl(),ws(22,"div",9)(23,"input",10),Rg("ngModelChange",function(d){return n.onToChange(d)}),hl(),GI(),ws(24,"button",11),Rg("click",function(){return n.clearTo()}),QC(25," Clear "),hl()()(),ws(26,"label",7)(27,"span",8),QC(28,"View"),hl(),ws(29,"select",12),Rg("ngModelChange",function(d){return n.view.set(d)}),ws(30,"option",13),QC(31,"By model"),hl(),ws(32,"option",14),QC(33,"By agent"),hl()(),GI(),hl(),ws(34,"button",15),Rg("click",function(){return n.apply()}),QC(35,"Apply"),hl()()(),oC(36,et,20,12),oC(37,tt,3,0,"div",16)(38,nt,5,1,"div",17)(39,ot,5,0,"div",16)(40,rt,30,2,"div",18),hl()),e&2&&(nI(16),bg("ngModel",n.state.draftFilters().from),qI(),nI(),bg("disabled",!n.state.draftFilters().from),nI(6),bg("ngModel",n.state.draftFilters().to),qI(),nI(),bg("disabled",!n.state.draftFilters().to),nI(5),bg("ngModel",n.view()),qI(),nI(5),bg("disabled",n.state.loading()),nI(2),iC(n.totalRow()?36:-1),nI(),iC(n.state.loading()?37:n.state.error()?38:n.isEmpty()?39:40));},dependencies:[ti,Qn,ei,Ye$1,At,Zn,cn,j,hr,Gn,yt,wt,K,Q],styles:[".page[_ngcontent-%COMP%]{padding:1.5rem;color:var(--color-text, #1d1d1f)}.page__header[_ngcontent-%COMP%]{display:flex;align-items:flex-start;justify-content:space-between;gap:1.5rem;margin-bottom:1rem}.page__title-block[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:.75rem}.page__title[_ngcontent-%COMP%]{margin:0;font-size:1.25rem;font-weight:650}.page__subtitle[_ngcontent-%COMP%]{margin:.25rem 0 0;color:var(--color-text-secondary, rgba(29, 29, 31, .7));font-size:.95rem}.filters[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:flex-end;gap:.75rem}.filters__field[_ngcontent-%COMP%]{display:grid;gap:.25rem}.filters__label[_ngcontent-%COMP%]{font-size:.8rem;color:var(--color-text-secondary, rgba(29, 29, 31, .7))}.filters__control[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem}.filters__input[_ngcontent-%COMP%], .filters__select[_ngcontent-%COMP%]{height:34px;padding:0 .5rem;border-radius:8px;border:1px solid var(--color-border, rgba(0, 0, 0, .12));background:var(--color-bg-secondary, rgba(255, 255, 255, .72));color:var(--color-text, #1d1d1f)}.filters__apply[_ngcontent-%COMP%], .filters__clear[_ngcontent-%COMP%]{height:34px;padding:0 .75rem;border-radius:8px;border:1px solid var(--color-border, rgba(0, 0, 0, .12));background:var(--color-bg-secondary, rgba(255, 255, 255, .72));color:var(--color-text, #1d1d1f);cursor:pointer}.kpis[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.75rem;margin:.75rem 0 1rem}@media(max-width:900px){.kpis[_ngcontent-%COMP%]{grid-template-columns:1fr}}.kpi[_ngcontent-%COMP%]{border-radius:14px;padding:.75rem 1rem;background:var(--glass-bg, rgba(255, 255, 255, .72));border:1px solid var(--glass-border, rgba(255, 255, 255, .18));box-shadow:var(--glass-shadow, 0 8px 24px rgba(0, 0, 0, .08))}.kpi__label[_ngcontent-%COMP%]{font-size:.8rem;color:var(--color-text-secondary, rgba(29, 29, 31, .7))}.kpi__value[_ngcontent-%COMP%]{margin-top:.25rem;font-size:1.2rem;font-weight:650;font-variant-numeric:tabular-nums}.filters__apply[_ngcontent-%COMP%]{border-color:var(--color-primary, #007aff);background:var(--color-primary, #007aff);color:var(--color-text-inverse, #ffffff)}.filters__apply[_ngcontent-%COMP%]:disabled, .filters__clear[_ngcontent-%COMP%]:disabled{opacity:.6;cursor:not-allowed}.grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:1.5fr 1fr;gap:1rem;align-items:start}@media(max-width:1100px){.grid[_ngcontent-%COMP%]{grid-template-columns:1fr}}.card[_ngcontent-%COMP%]{border-radius:14px;padding:1rem;background:var(--glass-bg, rgba(255, 255, 255, .72));border:1px solid var(--glass-border, rgba(255, 255, 255, .18));box-shadow:var(--glass-shadow, 0 8px 24px rgba(0, 0, 0, .08))}.card--error[_ngcontent-%COMP%]{border-color:var(--color-error, #ff3b30)}.card__title[_ngcontent-%COMP%]{font-weight:650;margin-bottom:.75rem}.muted[_ngcontent-%COMP%]{color:var(--color-text-secondary, rgba(29, 29, 31, .7))}.table[_ngcontent-%COMP%]{overflow-x:auto}.table__head[_ngcontent-%COMP%], .table__row[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr 2fr 1fr 1fr 1fr .7fr 1fr;gap:.5rem;align-items:center}.table__head[_ngcontent-%COMP%]{font-size:.8rem;color:var(--color-text-secondary, rgba(29, 29, 31, .7));padding:.25rem 0;border-bottom:1px solid var(--color-border-light, rgba(0, 0, 0, .08))}.table__row[_ngcontent-%COMP%]{padding:.5rem 0;border-bottom:1px solid var(--color-border-light, rgba(0, 0, 0, .08))}.table__row--total[_ngcontent-%COMP%]{font-weight:650;background:var(--color-bg-hover, rgba(0, 0, 0, .03));border-radius:10px;padding:.6rem .5rem;border-bottom:none;margin-top:.5rem}.table__cell[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.table__cell--num[_ngcontent-%COMP%]{text-align:right;font-variant-numeric:tabular-nums}.hint[_ngcontent-%COMP%]{margin:.25rem 0 1rem;color:var(--color-text-secondary, rgba(29, 29, 31, .7));font-size:.85rem}"],changeDetection:1})};export{Oe as TokenUsageComponent};
@@ -1 +1 @@
1
- import {f}from'./chunk-BKlwFrFB.js';import {g,bm as Sm,R as Re,z as zi,y as yT,h as Rw,i as hr,k as Gn,I as Is,A as Ag,q as qC,m as pl,t as tC,af as Dg,ag as pT,r as bC,J as JE,T as Tg,v as nC,M as dy,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 Jg,aj as XC,a3 as UI,o as iC,bo as rC,a8 as Zg,ak as Xg,a6 as zI,x as sC,a5 as vl,ac as yC,a9 as fC,aa as If,ab as wf,bp as ml,bq as yl,ah as oT,b4 as iT,H as Hg,b0 as Yg,a4 as oC,C as Cg,n as bg}from'./main-6K2UFGD2.js';import {P as Pt}from'./chunk-BLa2Gx7h.js';import {T as Tn,S as Sn,n as nt$1,a as ae,l as le,c as ce}from'./chunk-BUEM7g7F.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-l0HLnBLv.js';import'./chunk-DTIhOEG_.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-C9tuHQmZ.js';var w=class s{http=g(dy);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&&(Is(0,"p",15),qC(1,"No integrations defined \u2014 agent will have access to all tools."),pl());}function qe(s,t){if(s&1){let e=fC();Is(0,"div",16)(1,"mat-form-field",22)(2,"mat-label"),qC(3,"Integration"),pl(),Is(4,"input",23),Jg("ngModelChange",function(a){let r=If(e).$implicit;return XC(r.integration,a)||(r.integration=a),wf(a)}),pl(),UI(),pl(),Is(5,"mat-form-field",24)(6,"mat-label"),qC(7,"Tools (comma-separated)"),pl(),Is(8,"input",25),Jg("ngModelChange",function(a){let r=If(e).$implicit;return XC(r.tools,a)||(r.tools=a),wf(a)}),pl(),UI(),pl(),Is(9,"button",26),Ag("click",function(){let a=If(e).$index,r=yC();return wf(r.removeIntegrationRow(a))}),Is(10,"mat-icon"),qC(11,"delete"),pl()()();}if(s&2){let e=t.$implicit;JE(4),Xg("ngModel",e.integration),zI(),JE(4),Xg("ngModel",e.tools),zI();}}function He(s,t){if(s&1&&(Is(0,"p",30),qC(1),pl()),s&2){let e=yC(2);JE(),Zg(e.docUploadError);}}function Ge(s,t){s&1&&(Is(0,"p",15),qC(1,"No mandatory documents defined."),pl());}function Ze(s,t){if(s&1&&bg(0,"option",35),s&2){let e=t.$implicit;Tg("value","documents/"+e);}}function Ke(s,t){if(s&1){let e=fC();Is(0,"div",31)(1,"mat-form-field",32)(2,"mat-label"),qC(3,"Document path"),pl(),Is(4,"input",33),Jg("ngModelChange",function(a){let r=If(e).$index,j=yC(2);return XC(j.mandatoryDocs[r],a)||(j.mandatoryDocs[r]=a),wf(a)}),pl(),UI(),Is(5,"datalist",34),iC(6,Ze,1,1,"option",35,oC),pl()(),Is(8,"button",26),Ag("click",function(){let a=If(e).$index,r=yC(2);return wf(r.removeDocRow(a))}),Is(9,"mat-icon"),qC(10,"delete"),pl()()();}if(s&2){let e=t.$index,n=yC(2);JE(4),Xg("ngModel",n.mandatoryDocs[e]),Cg("list","docs-list-"+e),zI(),JE(),Tg("id","docs-list-"+e),JE(),sC(n.availableDocuments);}}function Je(s,t){if(s&1){let e=fC();Is(0,"div",6)(1,"span"),qC(2,"Mandatory Documents"),pl(),Is(3,"button",27),Ag("click",function(){If(e);let a=yC();return wf(a.addDocRow())}),Is(4,"mat-icon"),qC(5,"add"),pl()(),Is(6,"label",28)(7,"mat-icon"),qC(8,"upload_file"),pl(),Is(9,"input",29),Ag("change",function(a){If(e);let r=yC();return wf(r.onDocFileSelected(a))}),pl()()(),tC(10,He,2,1,"p",30),tC(11,Ge,2,0,"p",15),iC(12,Ke,11,3,"div",31,rC);}if(s&2){let e=yC();JE(6),Hg("uploading",e.isUploadingDoc),JE(3),Tg("disabled",e.isUploadingDoc),JE(),nC(e.docUploadError?10:-1),JE(),nC(e.mandatoryDocs.length===0?11:-1),JE(),sC(e.mandatoryDocs);}}function Qe(s,t){s&1&&(Is(0,"p",15),qC(1,"\u{1F4A1} Documents can be added after the agent is created."),pl());}function Xe(s,t){if(s&1){let e=fC();Is(0,"div",6),qC(1,"Save to"),pl(),Is(2,"div",36)(3,"label",37)(4,"input",38),Jg("ngModelChange",function(a){If(e);let r=yC();return XC(r.location,a)||(r.location=a),wf(a)}),pl(),UI(),Is(5,"div",39)(6,"div",40)(7,"span",41),qC(8,"\u{1F464}"),pl(),Is(9,"span",42),qC(10,"Project config"),pl()(),Is(11,"p",43),qC(12),pl()()(),Is(13,"label",37)(14,"input",44),Jg("ngModelChange",function(a){If(e);let r=yC();return XC(r.location,a)||(r.location=a),wf(a)}),pl(),UI(),Is(15,"div",39)(16,"div",40)(17,"span",41),qC(18,"\u{1F4E6}"),pl(),Is(19,"span",42),qC(20,"Colocated"),pl()(),Is(21,"p",43),qC(22,"Next to coday.yaml in ./agents/ (committable)"),pl()()()(),Is(23,"p",15),qC(24,"Storage location is permanent and cannot be changed after creation."),pl();}if(s&2){let e=yC();JE(3),Hg("selected",e.location==="project"),JE(),Xg("ngModel",e.location),zI(),JE(8),Yg("~/.coday/projects/","{","name","}","/agents/ (not committed)"),JE(),Hg("selected",e.location==="colocated"),JE(),Xg("ngModel",e.location),zI();}}function Ye(s,t){if(s&1&&(Is(0,"div",17)(1,"span",6),qC(2,"Storage Location"),pl(),Is(3,"span",45),qC(4),pl(),Is(5,"p",15),qC(6,"Cannot be changed after creation."),pl()()),s&2){let e=yC();JE(3),Hg("badge-project",e.location==="project")("badge-colocated",e.location==="colocated"),JE(),vl(" ",e.location==="project"?"\u{1F464} Project config":"\u{1F4E6} Colocated"," ");}}function $e(s,t){if(s&1&&(Is(0,"div",18)(1,"mat-icon"),qC(2,"error"),pl(),Is(3,"span"),qC(4),pl()()),s&2){let e=yC();JE(4),Zg(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=Rw({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&&(Is(0,"h2",0),qC(1),pl(),Is(2,"mat-dialog-content")(3,"div",1)(4,"mat-form-field",2)(5,"mat-label"),qC(6,"Name"),pl(),Is(7,"input",3),Jg("ngModelChange",function(r){return XC(n.name,r)||(n.name=r),r}),pl(),UI(),Is(8,"mat-hint"),qC(9,"Alphanumeric, hyphens and underscores only. Cannot be changed after creation."),pl()(),Is(10,"mat-form-field",2)(11,"mat-label"),qC(12,"Description"),pl(),Is(13,"textarea",4),Jg("ngModelChange",function(r){return XC(n.description,r)||(n.description=r),r}),pl(),UI(),pl(),Is(14,"mat-form-field",2)(15,"mat-label"),qC(16,"Instructions"),pl(),Is(17,"textarea",5),Jg("ngModelChange",function(r){return XC(n.instructions,r)||(n.instructions=r),r}),pl(),UI(),Is(18,"mat-hint"),qC(19,"System prompt / instructions sent to the AI model"),pl()(),Is(20,"div",6),qC(21,"AI Configuration"),pl(),Is(22,"div",7)(23,"mat-form-field",8)(24,"mat-label"),qC(25,"AI Provider"),pl(),Is(26,"input",9),Jg("ngModelChange",function(r){return XC(n.aiProvider,r)||(n.aiProvider=r),r}),pl(),UI(),pl(),Is(27,"mat-form-field",8)(28,"mat-label"),qC(29,"Model Name"),pl(),Is(30,"input",10),Jg("ngModelChange",function(r){return XC(n.modelName,r)||(n.modelName=r),r}),pl(),UI(),pl()(),Is(31,"div",7)(32,"mat-form-field",8)(33,"mat-label"),qC(34,"Temperature"),pl(),Is(35,"input",11),Jg("ngModelChange",function(r){return XC(n.temperature,r)||(n.temperature=r),r}),pl(),UI(),Is(36,"mat-hint"),qC(37,"Leave empty for model default"),pl()(),Is(38,"mat-form-field",8)(39,"mat-label"),qC(40,"Max Output Tokens"),pl(),Is(41,"input",12),Jg("ngModelChange",function(r){return XC(n.maxOutputTokens,r)||(n.maxOutputTokens=r),r}),pl(),UI(),Is(42,"mat-hint"),qC(43,"Leave empty for model default"),pl()()(),Is(44,"mat-form-field",2)(45,"mat-label"),qC(46,"OpenAI Assistant ID"),pl(),Is(47,"input",13),Jg("ngModelChange",function(r){return XC(n.openaiAssistantId,r)||(n.openaiAssistantId=r),r}),pl(),UI(),Is(48,"mat-hint"),qC(49,"If set, forces aiProvider to openai"),pl()(),Is(50,"div",6)(51,"span"),qC(52,"Integrations"),pl(),Is(53,"button",14),Ag("click",function(){return n.addIntegrationRow()}),Is(54,"mat-icon"),qC(55,"add"),pl()()(),tC(56,ze,2,0,"p",15),iC(57,qe,12,2,"div",16,rC),tC(59,Je,14,5)(60,Qe,2,0,"p",15),tC(61,Xe,25,8),tC(62,Ye,7,5,"div",17),tC(63,$e,5,1,"div",18),pl()(),Is(64,"mat-dialog-actions",19)(65,"button",20),Ag("click",function(){return n.cancel()}),qC(66,"Cancel"),pl(),Is(67,"button",21),Ag("click",function(){return n.save()}),qC(68),pl()()),e&2&&(JE(),Zg(n.isEditMode?"Edit Agent":"Create Agent"),JE(6),Xg("ngModel",n.name),Tg("readonly",n.isEditMode),zI(),JE(6),Xg("ngModel",n.description),zI(),JE(4),Xg("ngModel",n.instructions),zI(),JE(9),Xg("ngModel",n.aiProvider),zI(),JE(4),Xg("ngModel",n.modelName),zI(),JE(5),Xg("ngModel",n.temperature),zI(),JE(6),Xg("ngModel",n.maxOutputTokens),zI(),JE(6),Xg("ngModel",n.openaiAssistantId),zI(),JE(9),nC(n.integrationRows.length===0?56:-1),JE(),sC(n.integrationRows),JE(2),nC(n.isEditMode?59:60),JE(2),nC(n.isEditMode?-1:61),JE(),nC(n.isEditMode?62:-1),JE(),nC(n.errorMessage?63:-1),JE(2),Tg("disabled",n.isSaving),JE(2),Tg("disabled",n.isSaving),JE(),vl(" ",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&&(Is(0,"div",5),qC(1),pl()),s&2){let e=yC();JE(),Zg(e.errorMessage());}}function it(s,t){if(s&1){let e=fC();Is(0,"ds-entity-card",7),Ag("selected",function(a){If(e);let r=yC();return wf(r.onEdit(a))}),ml(1,8),Is(2,"button",9),Ag("click",function(a){return a.stopPropagation()}),Is(3,"mat-icon"),qC(4,"more_vert"),pl()(),yl(),pl();}if(s&2){let e=t.$implicit;yC();let n=bC(9);Tg("id",e.id)("name",e.name)("description",e.description)("badges",e.badges??oT(6,et)),JE(2),Tg("matMenuTriggerFor",n)("matMenuTriggerData",iT(7,tt,e.id));}}function ot(s,t){if(s&1){let e=fC();Is(0,"button",10),Ag("click",function(){let a=If(e).id,r=yC();return wf(r.onEdit(a))}),Is(1,"mat-icon"),qC(2,"edit"),pl(),qC(3," Edit "),pl(),Is(4,"button",11),Ag("click",function(){let a=If(e).id,r=yC();return wf(r.onDelete(a))}),Is(5,"mat-icon"),qC(6,"delete"),pl(),qC(7," Delete "),pl();}}var Ve=class s{agentCrudApi=g(w);location=g(Sm);dialog=g(Re);agents=zi([]);isLoading=zi(false);errorMessage=zi(null);agentItems=yT(()=>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=Rw({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&&(Is(0,"div",2)(1,"ds-entity-list",3),Ag("createRequested",function(){return n.onCreate()}),Is(2,"button",4),Ag("click",function(){return n.onBack()}),Is(3,"mat-icon"),qC(4,"chevron_left"),pl()()(),tC(5,nt,2,1,"div",5),pl(),Dg(6,it,5,9,"ng-template",null,0,pT),Is(8,"mat-menu",null,1),Dg(10,ot,8,0,"ng-template",6),pl()),e&2){let a=bC(7);JE(),Tg("items",n.agentItems())("loading",n.isLoading())("showCreate",true)("itemTemplate",a),JE(4),nC(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-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};
@@ -0,0 +1 @@
1
+ import {O}from'./chunk-DKllQ3Ve.js';import {R}from'./chunk-BAWubWk8.js';import {g,G,w as we,aJ as Tr,a as Gi,bS as Da,u as ue,c as U,h as Fw,aK as Ob,m as ws,bf as dT,o as Rg,Q as QC,n as hl,af as Eg,M as MC,v as bg,bg as pT,ah as aT,q as oC,ac as EC,x as iC,a9 as gC,aa as wf,ab as Cf,ag as mT}from'./main-LBRSRTYI.js';import'./chunk-R-GmZrHu.js';import {W as Wn}from'./chunk-BaO2vi_O.js';import'./chunk-DjMtxVWg.js';import'./chunk-BYyTBqh4.js';import'./chunk-BDaTUrH4.js';import'./chunk-ClSDInQq.js';var k=()=>[];function V(i,t){if(i&1){let e=gC();ws(0,"agentos-auth-setting-item",4),Rg("editRequested",function(n){wf(e);let p=EC(2);return Cf(p.onEdit(n))})("deleteRequested",function(n){wf(e);let p=EC(2);return Cf(p.onDelete(n))}),hl();}i&2&&bg("config",t)("showBadge",false);}function F(i,t){if(i&1&&oC(0,V,1,2,"agentos-auth-setting-item",3),i&2){let e,o=t.$implicit,n=EC();iC((e=n.resolveSetting(o.id))?0:-1,e);}}var M=class i{router=g(G);destroyRef=g(we);state=g(R);refresh$=new Tr(void 0);isLoading=Gi(true);settings$=this.refresh$.pipe(Da(()=>(this.isLoading.set(true),this.state.loadPlatformSettings())));settingItems$=this.settings$.pipe(ue(t=>t.map(e=>({id:e.id??"",name:e.name,description:e.authType}))));settingsById=new Map;constructor(){this.settings$.pipe(U(this.destroyRef)).subscribe({next:t=>{this.settingsById=new Map(t.map(e=>[e.id??"",e])),this.isLoading.set(false);},error:()=>this.isLoading.set(false)});}goBack(){this.router.navigate(["/agentos","admin"]);}openCreateForm(){this.router.navigate(["/agentos","admin","auth-settings","new"]);}onEdit(t){t.id&&this.router.navigate(["/agentos","admin","auth-settings",t.id,"edit"]);}onDelete(t){t.id&&this.state.delete(t.id,"platform").pipe(U(this.destroyRef)).subscribe(()=>this.refresh$.next());}resolveSetting(t){return this.settingsById.get(t)??null}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=Fw({type:i,selectors:[["agentos-platform-auth-settings"]],decls:6,vars:7,consts:[["authSettingItemTpl",""],["title","Platform Auth Settings","emptyMessage","No platform auth settings defined yet. Add one above.","cardMinWidth","400px",3,"createRequested","items","loading","showCreate","itemTemplate"],["toolbar-start","","type","button",1,"platform-auth-settings__back",3,"click"],["scope","namespace",3,"config","showBadge"],["scope","namespace",3,"editRequested","deleteRequested","config","showBadge"]],template:function(e,o){if(e&1&&(ws(0,"ds-entity-list",1),dT(1,"async"),Rg("createRequested",function(){return o.openCreateForm()}),ws(2,"button",2),Rg("click",function(){return o.goBack()}),QC(3,"\u2190 Admin"),hl()(),Eg(4,F,1,1,"ng-template",null,0,mT)),e&2){let n=MC(5);bg("items",pT(1,4,o.settingItems$)??aT(6,k))("loading",o.isLoading())("showCreate",true)("itemTemplate",n);}},dependencies:[Wn,O,Ob],encapsulation:2})};export{M as PlatformAuthSettingsComponent};
@@ -1 +1 @@
1
- import {R}from'./chunk-C5wr-vqf.js';import {c}from'./chunk-D_vvo2qx.js';import {g,G,w as we,z as zi,y as yT,c as U,h as Rw,I as Is,A as Ag,m as pl,af as Dg,r as bC,T as Tg,t as tC,ac as yC,v as nC,a9 as fC,aa as If,ab as wf,ag as pT}from'./main-6K2UFGD2.js';import {W as Wn,S as Se}from'./chunk-l0HLnBLv.js';import'./chunk-DTIhOEG_.js';import'./chunk-C9tuHQmZ.js';function M(i,e){if(i&1){let t=fC();Is(0,"agentos-scheduled-prompt-item",4),Ag("enableRequested",function(n){If(t);let r=yC(2);return wf(r.enablePrompt(n))})("disableRequested",function(n){If(t);let r=yC(2);return wf(r.disablePrompt(n))})("deleteRequested",function(n){If(t);let r=yC(2);return wf(r.deletePrompt(n))}),pl();}i&2&&Tg("definition",e)("platformMode",true);}function L(i,e){if(i&1&&tC(0,M,1,2,"agentos-scheduled-prompt-item",3),i&2){let t,o=e.$implicit,n=yC();nC((t=n.resolvePrompt(o.id))?0:-1,t);}}var D=class i{router=g(G);destroyRef=g(we);state=g(c);prompts=zi([]);isLoading=zi(true);promptItems=yT(()=>this.prompts().map(e=>({id:e.id??"",name:e.name,description:e.description,badges:[{label:e.enabled?"Enabled":"Disabled",variant:e.enabled?"success":"warning"}]})));constructor(){this.state.listPlatform().pipe(U(this.destroyRef)).subscribe({next:e=>{this.prompts.set(e),this.isLoading.set(false);},error:()=>this.isLoading.set(false)});}goBack(){this.router.navigate(["/agentos","admin"]);}openCreateForm(){this.router.navigate(["/agentos","admin","scheduled-prompts","new"]);}enablePrompt(e){this.state.enable(e.id??"").pipe(U(this.destroyRef)).subscribe(t=>this.patchPrompt(t));}disablePrompt(e){this.state.disable(e.id??"").pipe(U(this.destroyRef)).subscribe(t=>this.patchPrompt(t));}deletePrompt(e){let t=e.id??"";this.state.delete(t).pipe(U(this.destroyRef)).subscribe(()=>this.prompts.update(o=>o.filter(n=>n.id!==t)));}resolvePrompt(e){return this.prompts().find(t=>t.id===e)??null}patchPrompt(e){this.prompts.update(t=>t.map(o=>o.id===e.id?e:o));}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=Rw({type:i,selectors:[["agentos-platform-scheduled-prompts"]],decls:4,vars:4,consts:[["scheduledPromptItemTpl",""],["title","Platform Scheduled Prompts","emptyMessage","No platform scheduled prompts defined yet. Add one above.","cardMinWidth","420px",3,"createRequested","items","loading","showCreate","itemTemplate"],["toolbar-start","","icon","arrow_back","title","Back",3,"action"],[3,"definition","platformMode"],[3,"enableRequested","disableRequested","deleteRequested","definition","platformMode"]],template:function(t,o){if(t&1&&(Is(0,"ds-entity-list",1),Ag("createRequested",function(){return o.openCreateForm()}),Is(1,"ds-icon-button",2),Ag("action",function(){return o.goBack()}),pl()(),Dg(2,L,1,1,"ng-template",null,0,pT)),t&2){let n=bC(3);Tg("items",o.promptItems())("loading",o.isLoading())("showCreate",true)("itemTemplate",n);}},dependencies:[Wn,R,Se],encapsulation:2})};export{D as PlatformScheduledPromptsComponent};
1
+ import {R}from'./chunk-BtEXE3Xz.js';import {c}from'./chunk-ClEmA_ih.js';import {g,G,w as we,a as Gi,E as ET,c as U,h as Fw,m as ws,o as Rg,n as hl,af as Eg,M as MC,v as bg,q as oC,ac as EC,x as iC,a9 as gC,aa as wf,ab as Cf,ag as mT}from'./main-LBRSRTYI.js';import {W as Wn,S as Se}from'./chunk-BaO2vi_O.js';import'./chunk-DjMtxVWg.js';import'./chunk-BYyTBqh4.js';function M(i,e){if(i&1){let t=gC();ws(0,"agentos-scheduled-prompt-item",4),Rg("enableRequested",function(n){wf(t);let r=EC(2);return Cf(r.enablePrompt(n))})("disableRequested",function(n){wf(t);let r=EC(2);return Cf(r.disablePrompt(n))})("deleteRequested",function(n){wf(t);let r=EC(2);return Cf(r.deletePrompt(n))}),hl();}i&2&&bg("definition",e)("platformMode",true);}function L(i,e){if(i&1&&oC(0,M,1,2,"agentos-scheduled-prompt-item",3),i&2){let t,o=e.$implicit,n=EC();iC((t=n.resolvePrompt(o.id))?0:-1,t);}}var D=class i{router=g(G);destroyRef=g(we);state=g(c);prompts=Gi([]);isLoading=Gi(true);promptItems=ET(()=>this.prompts().map(e=>({id:e.id??"",name:e.name,description:e.description,badges:[{label:e.enabled?"Enabled":"Disabled",variant:e.enabled?"success":"warning"}]})));constructor(){this.state.listPlatform().pipe(U(this.destroyRef)).subscribe({next:e=>{this.prompts.set(e),this.isLoading.set(false);},error:()=>this.isLoading.set(false)});}goBack(){this.router.navigate(["/agentos","admin"]);}openCreateForm(){this.router.navigate(["/agentos","admin","scheduled-prompts","new"]);}enablePrompt(e){this.state.enable(e.id??"").pipe(U(this.destroyRef)).subscribe(t=>this.patchPrompt(t));}disablePrompt(e){this.state.disable(e.id??"").pipe(U(this.destroyRef)).subscribe(t=>this.patchPrompt(t));}deletePrompt(e){let t=e.id??"";this.state.delete(t).pipe(U(this.destroyRef)).subscribe(()=>this.prompts.update(o=>o.filter(n=>n.id!==t)));}resolvePrompt(e){return this.prompts().find(t=>t.id===e)??null}patchPrompt(e){this.prompts.update(t=>t.map(o=>o.id===e.id?e:o));}static \u0275fac=function(t){return new(t||i)};static \u0275cmp=Fw({type:i,selectors:[["agentos-platform-scheduled-prompts"]],decls:4,vars:4,consts:[["scheduledPromptItemTpl",""],["title","Platform Scheduled Prompts","emptyMessage","No platform scheduled prompts defined yet. Add one above.","cardMinWidth","420px",3,"createRequested","items","loading","showCreate","itemTemplate"],["toolbar-start","","icon","arrow_back","title","Back",3,"action"],[3,"definition","platformMode"],[3,"enableRequested","disableRequested","deleteRequested","definition","platformMode"]],template:function(t,o){if(t&1&&(ws(0,"ds-entity-list",1),Rg("createRequested",function(){return o.openCreateForm()}),ws(1,"ds-icon-button",2),Rg("action",function(){return o.goBack()}),hl()(),Eg(2,L,1,1,"ng-template",null,0,mT)),t&2){let n=MC(3);bg("items",o.promptItems())("loading",o.isLoading())("showCreate",true)("itemTemplate",n);}},dependencies:[Wn,R,Se],encapsulation:2})};export{D as PlatformScheduledPromptsComponent};
@@ -1 +1 @@
1
- import {n}from'./chunk-CfgXrte_.js';import {O}from'./chunk-CcLheUaL.js';import {v}from'./chunk-DEsz0fzs.js';import {R}from'./chunk-DYE131qf.js';import {g,ao as V,G,w as we,z as zi,u as ue,c as U$1,bS as va,X as br,h as Rw,aK as xb,I as Is,bf as cT,A as Ag,m as pl,af as Dg,r as bC,T as Tg,bg as lT,ah as oT,t as tC,ac as yC,v as nC,q as qC,J as JE,a8 as Zg,a9 as fC,aa as If,ab as wf,ag as pT}from'./main-6K2UFGD2.js';import'./chunk-uPxETzZs.js';import {W as Wn,S as Se}from'./chunk-l0HLnBLv.js';import'./chunk-DTIhOEG_.js';import'./chunk-C9tuHQmZ.js';import'./chunk-DXDohTwX.js';import'./chunk-nWqZHM4o.js';var W=()=>[];function z(s,e){if(s&1&&(Is(0,"p",3),qC(1),pl()),s&2){let t=yC().$implicit;JE(),Zg(t.name);}}function U(s,e){if(s&1){let t=fC();Is(0,"agentos-auth-setting-item",5),Ag("editRequested",function(){let i=If(t),r=yC(2);return wf(r.onEdit(i))})("deleteRequested",function(){let i=If(t),r=yC(2);return wf(r.onDelete(i))})("duplicateRequested",function(){let i=If(t),r=yC(2);return wf(r.onDuplicate(i))}),pl();}if(s&2){let t=e,n=yC(2);Tg("config",t.config)("scope",t.scope)("readOnly",t.scope==="platform"||t.scope==="namespace"&&!n.isAdmin());}}function X(s,e){if(s&1&&tC(0,z,2,1,"p",3)(1,U,1,3,"agentos-auth-setting-item",4),s&2){let t,n=e.$implicit,i=yC();nC(i.isEmptyPlaceholder(n.id)?0:(t=i.resolve(n.id))?1:-1,t);}}var k=Object.freeze({platform:"Platform (read-only)",namespace:"Auth Settings du namespace",userOnNs:"Mes overrides sur ce namespace",userGlobal:"Mes overrides globaux"}),F="__empty__",j=class s{route=g(V);router=g(G);destroyRef=g(we);state=g(R);namespaceRole=g(v);namespaceId=this.route.snapshot.params.namespaceId;isAdmin=zi(false);listItems$=this.state.vm$.pipe(ue(e=>this.toListItems(e)));isLoading=zi(true);resolved=new Map;ngOnInit(){this.route.paramMap.pipe(U$1(this.destroyRef)).subscribe(e=>{let t=e.get("namespaceId")??"";t&&t!==this.namespaceId&&(this.namespaceId=t),this.state.setNamespace(t);}),this.route.paramMap.pipe(ue(e=>e.get("namespaceId")??""),va(e=>e?this.namespaceRole.isAdminOfNamespace$(e):br(false)),U$1(this.destroyRef)).subscribe(e=>this.isAdmin.set(e)),this.state.vm$.pipe(U$1(this.destroyRef)).subscribe(e=>{this.isLoading.set(false);let t=new Map;e.platform.forEach(n=>{n.id&&t.set(this.itemKey("platform",n.id),{config:n,scope:"platform"});}),e.namespace.forEach(n=>{n.id&&t.set(this.itemKey("namespace",n.id),{config:n,scope:"namespace"});}),e.userOnNs.forEach(n=>{n.id&&t.set(this.itemKey("userOnNs",n.id),{config:n,scope:"userOnNs"});}),e.userGlobal.forEach(n=>{n.id&&t.set(this.itemKey("userGlobal",n.id),{config:n,scope:"userGlobal"});}),this.resolved=t;});}isEmptyPlaceholder(e){return e.startsWith(F)}resolve(e){return this.resolved.get(e)??null}itemKey(e,t){return `${e}:${t}`}goBack(){this.router.navigate(["/agentos","namespaces"]);}openCreateForm(){this.router.navigate(["/agentos",this.namespaceId,"auth-settings","new"],{queryParams:{scope:n(this.isAdmin())}});}onEdit(e){let t=e.config.id;t&&this.router.navigate(["/agentos",this.namespaceId,"auth-settings",t,"edit"],{queryParams:{scope:e.scope}});}onDelete(e){let t=e.config.id;t&&this.state.delete(t,e.scope).pipe(U$1(this.destroyRef)).subscribe({error:n=>{console.error(`[AuthSettingsAllScopes] Delete failed for ${e.scope}:${t}:`,n);}});}onDuplicate(e){if(!e.config.id)return;let t=e.scope==="platform"||e.scope==="namespace"&&!this.isAdmin()?"userOnNs":e.scope;this.router.navigate(["/agentos",this.namespaceId,"auth-settings","new"],{queryParams:{scope:t,template:e.config.id,templateScope:e.scope}});}toListItems(e){let t=[];return t.push(...this.sectionItems("platform",e.platform)),t.push(...this.sectionItems("namespace",e.namespace)),t.push(...this.sectionItems("userOnNs",e.userOnNs)),t.push(...this.sectionItems("userGlobal",e.userGlobal)),t}sectionItems(e,t){return t.length===0?[{id:`${F}${e}`,name:"Aucun Auth Setting",groupKey:e,groupLabel:k[e]}]:t.filter(n=>!!n.id).map(n=>({id:this.itemKey(e,n.id),name:n.name,description:n.authType,groupKey:e,groupLabel:k[e]}))}static \u0275fac=function(t){return new(t||s)};static \u0275cmp=Rw({type:s,selectors:[["agentos-auth-settings-all-scopes"]],decls:5,vars:7,consts:[["authSettingItemTpl",""],["title","Auth Settings","emptyMessage","No auth settings available.","cardMinWidth","400px",3,"createRequested","items","loading","showCreate","itemTemplate"],["toolbar-start","","icon","arrow_back","title","Back",3,"action"],[1,"auth-settings-all-scopes__empty"],[3,"config","scope","readOnly"],[3,"editRequested","deleteRequested","duplicateRequested","config","scope","readOnly"]],template:function(t,n){if(t&1&&(Is(0,"ds-entity-list",1),cT(1,"async"),Ag("createRequested",function(){return n.openCreateForm()}),Is(2,"ds-icon-button",2),Ag("action",function(){return n.goBack()}),pl()(),Dg(3,X,2,1,"ng-template",null,0,pT)),t&2){let i=bC(4);Tg("items",lT(1,4,n.listItems$)??oT(6,W))("loading",n.isLoading())("showCreate",true)("itemTemplate",i);}},dependencies:[Wn,O,Se,xb],encapsulation:2})};export{j as AuthSettingsAllScopesComponent};
1
+ import {n}from'./chunk-CfgXrte_.js';import {O}from'./chunk-DKllQ3Ve.js';import {v}from'./chunk-B_49KV6W.js';import {R}from'./chunk-BAWubWk8.js';import {g,ao as V,G,w as we,a as Gi,u as ue,c as U$1,bS as Da,X as br,h as Fw,aK as Ob,m as ws,bf as dT,o as Rg,n as hl,af as Eg,M as MC,v as bg,bg as pT,ah as aT,q as oC,ac as EC,x as iC,Q as QC,t as nI,a8 as Yg,a9 as gC,aa as wf,ab as Cf,ag as mT}from'./main-LBRSRTYI.js';import'./chunk-R-GmZrHu.js';import {W as Wn,S as Se}from'./chunk-BaO2vi_O.js';import'./chunk-DjMtxVWg.js';import'./chunk-BYyTBqh4.js';import'./chunk-BDaTUrH4.js';import'./chunk-ClSDInQq.js';var W=()=>[];function z(s,e){if(s&1&&(ws(0,"p",3),QC(1),hl()),s&2){let t=EC().$implicit;nI(),Yg(t.name);}}function U(s,e){if(s&1){let t=gC();ws(0,"agentos-auth-setting-item",5),Rg("editRequested",function(){let i=wf(t),r=EC(2);return Cf(r.onEdit(i))})("deleteRequested",function(){let i=wf(t),r=EC(2);return Cf(r.onDelete(i))})("duplicateRequested",function(){let i=wf(t),r=EC(2);return Cf(r.onDuplicate(i))}),hl();}if(s&2){let t=e,n=EC(2);bg("config",t.config)("scope",t.scope)("readOnly",t.scope==="platform"||t.scope==="namespace"&&!n.isAdmin());}}function X(s,e){if(s&1&&oC(0,z,2,1,"p",3)(1,U,1,3,"agentos-auth-setting-item",4),s&2){let t,n=e.$implicit,i=EC();iC(i.isEmptyPlaceholder(n.id)?0:(t=i.resolve(n.id))?1:-1,t);}}var k=Object.freeze({platform:"Platform (read-only)",namespace:"Auth Settings du namespace",userOnNs:"Mes overrides sur ce namespace",userGlobal:"Mes overrides globaux"}),F="__empty__",j=class s{route=g(V);router=g(G);destroyRef=g(we);state=g(R);namespaceRole=g(v);namespaceId=this.route.snapshot.params.namespaceId;isAdmin=Gi(false);listItems$=this.state.vm$.pipe(ue(e=>this.toListItems(e)));isLoading=Gi(true);resolved=new Map;ngOnInit(){this.route.paramMap.pipe(U$1(this.destroyRef)).subscribe(e=>{let t=e.get("namespaceId")??"";t&&t!==this.namespaceId&&(this.namespaceId=t),this.state.setNamespace(t);}),this.route.paramMap.pipe(ue(e=>e.get("namespaceId")??""),Da(e=>e?this.namespaceRole.isAdminOfNamespace$(e):br(false)),U$1(this.destroyRef)).subscribe(e=>this.isAdmin.set(e)),this.state.vm$.pipe(U$1(this.destroyRef)).subscribe(e=>{this.isLoading.set(false);let t=new Map;e.platform.forEach(n=>{n.id&&t.set(this.itemKey("platform",n.id),{config:n,scope:"platform"});}),e.namespace.forEach(n=>{n.id&&t.set(this.itemKey("namespace",n.id),{config:n,scope:"namespace"});}),e.userOnNs.forEach(n=>{n.id&&t.set(this.itemKey("userOnNs",n.id),{config:n,scope:"userOnNs"});}),e.userGlobal.forEach(n=>{n.id&&t.set(this.itemKey("userGlobal",n.id),{config:n,scope:"userGlobal"});}),this.resolved=t;});}isEmptyPlaceholder(e){return e.startsWith(F)}resolve(e){return this.resolved.get(e)??null}itemKey(e,t){return `${e}:${t}`}goBack(){this.router.navigate(["/agentos","namespaces"]);}openCreateForm(){this.router.navigate(["/agentos",this.namespaceId,"auth-settings","new"],{queryParams:{scope:n(this.isAdmin())}});}onEdit(e){let t=e.config.id;t&&this.router.navigate(["/agentos",this.namespaceId,"auth-settings",t,"edit"],{queryParams:{scope:e.scope}});}onDelete(e){let t=e.config.id;t&&this.state.delete(t,e.scope).pipe(U$1(this.destroyRef)).subscribe({error:n=>{console.error(`[AuthSettingsAllScopes] Delete failed for ${e.scope}:${t}:`,n);}});}onDuplicate(e){if(!e.config.id)return;let t=e.scope==="platform"||e.scope==="namespace"&&!this.isAdmin()?"userOnNs":e.scope;this.router.navigate(["/agentos",this.namespaceId,"auth-settings","new"],{queryParams:{scope:t,template:e.config.id,templateScope:e.scope}});}toListItems(e){let t=[];return t.push(...this.sectionItems("platform",e.platform)),t.push(...this.sectionItems("namespace",e.namespace)),t.push(...this.sectionItems("userOnNs",e.userOnNs)),t.push(...this.sectionItems("userGlobal",e.userGlobal)),t}sectionItems(e,t){return t.length===0?[{id:`${F}${e}`,name:"Aucun Auth Setting",groupKey:e,groupLabel:k[e]}]:t.filter(n=>!!n.id).map(n=>({id:this.itemKey(e,n.id),name:n.name,description:n.authType,groupKey:e,groupLabel:k[e]}))}static \u0275fac=function(t){return new(t||s)};static \u0275cmp=Fw({type:s,selectors:[["agentos-auth-settings-all-scopes"]],decls:5,vars:7,consts:[["authSettingItemTpl",""],["title","Auth Settings","emptyMessage","No auth settings available.","cardMinWidth","400px",3,"createRequested","items","loading","showCreate","itemTemplate"],["toolbar-start","","icon","arrow_back","title","Back",3,"action"],[1,"auth-settings-all-scopes__empty"],[3,"config","scope","readOnly"],[3,"editRequested","deleteRequested","duplicateRequested","config","scope","readOnly"]],template:function(t,n){if(t&1&&(ws(0,"ds-entity-list",1),dT(1,"async"),Rg("createRequested",function(){return n.openCreateForm()}),ws(2,"ds-icon-button",2),Rg("action",function(){return n.goBack()}),hl()(),Eg(3,X,2,1,"ng-template",null,0,mT)),t&2){let i=MC(4);bg("items",pT(1,4,n.listItems$)??aT(6,W))("loading",n.isLoading())("showCreate",true)("itemTemplate",i);}},dependencies:[Wn,O,Se,Ob],encapsulation:2})};export{j as AuthSettingsAllScopesComponent};
@@ -1 +1 @@
1
- import {A,k as kt,b as bt}from'./chunk-C4U0w8cP.js';import {S as St}from'./chunk-DzicJow4.js';import {E as Et,y as yt$1,G as Ge}from'./chunk-C7MXO6BQ.js';import {g,G,P,U,N,p as pe$1,Q as c,w as we,z as zi,F as F$1,y as yT,c as U$1,h as Rw,i as hr,j as pr,I as Is,q as qC,m as pl,A as Ag,t as tC,o as iC,J as JE,T as Tg,v as nC,x as sC,H as Hg,C as Cg,u as ue$1,ca as _e$1,Y as x,an as ce$1,ap as Vy,l as le$1,V,n as bg,a9 as fC,aa as If,ac as yC,ab as wf,a8 as Zg,a5 as vl}from'./main-6K2UFGD2.js';import'./chunk-fP29MqaN.js';import'./chunk-BVCQOGLR.js';import'./chunk-BUEM7g7F.js';import'./chunk-DTIhOEG_.js';import {y as yt,w as wt}from'./chunk-C9tuHQmZ.js';var R=class n{threadState=g(U);codayService=g(Ge);threadList=F$1(this.threadState.threadList$,{initialValue:[]});selectedThread=F$1(this.threadState.selectedThread$,{initialValue:null});isThinking=F$1(this.codayService.isThinking$,{initialValue:false});inviteEvent=F$1(this.codayService.currentInviteEvent$.pipe(ue$1(t=>t?.invite===_e$1?null:t)),{initialValue:null});tasks=yT(()=>{let t=this.threadList(),e=this.selectedThread(),r=this.isThinking(),o=this.inviteEvent();return t.filter(i=>!i.parentThreadId).map(i=>{let m=!!e&&i.id===e.id;return {id:i.id,name:i.name,summary:i.summary,modifiedDate:i.modifiedDate,starring:i.starring??[],users:i.users??[],status:this.deriveStatus(i,m,r,!!o),isActive:m,worktreeProject:i.worktreeProject}}).sort((i,m)=>{let q=kt[i.status]-kt[m.status];return q!==0?q:i.modifiedDate>m.modifiedDate?-1:1})});deriveStatus(t,e,r,o){let i=Date.now()-new Date(t.modifiedDate).getTime();return t.closedByUser?"done":t.pendingInvite?"waiting-you":e?r?"in-progress":"paused":i<bt?"in-progress":"paused"}static \u0275fac=function(e){return new(e||n)};static \u0275prov=x({token:n,factory:n.\u0275fac,providedIn:"root"})};var F=class n{projectState=g(P);threadState=g(U);destroy$=new ce$1;eventSource=null;currentProject=null;constructor(){this.projectState.selectedProject$.pipe(Vy(this.destroy$)).subscribe(t=>{let e=t?.name??null;e!==this.currentProject&&(this.disconnect(),e&&this.connect(e));});}connect(t,e=5e3){this.currentProject=t;let r=`/api/projects/${encodeURIComponent(t)}/event-stream`;console.log(`[PROJECT_SSE] Connecting to ${r}`),this.eventSource=new EventSource(r),this.eventSource.onmessage=o=>{try{let i=JSON.parse(o.data),m=le$1(i);if(!m)return;m instanceof V&&(console.log("[PROJECT_SSE] ThreadUpdateEvent \u2014 refreshing thread list"),this.threadState.refreshThreadList());}catch(i){console.warn("[PROJECT_SSE] Failed to parse event:",i);}},this.eventSource.onerror=()=>{this.eventSource?.readyState===EventSource.CLOSED&&(console.warn(`[PROJECT_SSE] Connection closed for ${t}, reconnecting in ${e}ms`),this.eventSource=null,setTimeout(()=>{this.currentProject===t&&this.connect(t,Math.min(e*2,6e4));},e));};}disconnect(){this.eventSource&&(this.eventSource.close(),this.eventSource=null,console.log(`[PROJECT_SSE] Disconnected from project ${this.currentProject}`)),this.currentProject=null;}ngOnDestroy(){this.disconnect(),this.destroy$.next(),this.destroy$.complete();}static \u0275fac=function(e){return new(e||n)};static \u0275prov=x({token:n,factory:n.\u0275fac,providedIn:"root"})};var ce=(n,t)=>t.key,de=(n,t)=>t.status,le=(n,t)=>t.id;function pe(n,t){n&1&&bg(0,"mat-spinner",6);}function me(n,t){n&1&&(Is(0,"mat-icon"),qC(1,"add"),pl());}function ue(n,t){if(n&1&&(Is(0,"span",16),qC(1),pl()),n&2){let e=yC().$implicit,r=yC();JE(),Zg(r.filterCounts()[e.key]);}}function ge(n,t){if(n&1){let e=fC();Is(0,"button",15),Ag("click",function(){let o=If(e).$implicit,i=yC();return wf(i.setFilter(o.key))}),Is(1,"mat-icon",10),qC(2),pl(),Is(3,"span"),qC(4),pl(),tC(5,ue,2,1,"span",16),pl();}if(n&2){let e=t.$implicit,r=yC();Hg("active",r.activeFilter()===e.key),Cg("aria-selected",r.activeFilter()===e.key),JE(2),Zg(e.icon),JE(2),Zg(e.label),JE(),nC(r.filterCounts()[e.key]>0?5:-1);}}function _e(n,t){n&1&&(Is(0,"div",12),bg(1,"mat-spinner",17),Is(2,"p"),qC(3,"Loading tasks\u2026"),pl()());}function fe(n,t){if(n&1){let e=fC();Is(0,"p"),qC(1,"No tasks yet. Start your first one!"),pl(),Is(2,"button",19),Ag("click",function(){If(e);let o=yC(2);return wf(o.createTask())}),Is(3,"mat-icon"),qC(4,"add"),pl(),qC(5," New Task "),pl();}}function he(n,t){n&1&&(Is(0,"p"),qC(1,"No tasks in this category."),pl());}function ke(n,t){if(n&1&&(Is(0,"div",13)(1,"mat-icon",18),qC(2,"rocket_launch"),pl(),tC(3,fe,6,0)(4,he,2,0,"p"),pl()),n&2){let e=yC();JE(3),nC(e.activeFilter()==="all"?3:4);}}function ve(n,t){if(n&1){let e=fC();Is(0,"app-task-card",25),Ag("stopRequested",function(o){If(e);let i=yC(3);return wf(i.onStopRequested(o))})("deleteRequested",function(o){If(e);let i=yC(3);return wf(i.onDeleteRequested(o))})("starToggled",function(o){If(e);let i=yC(3);return wf(i.onStarToggled(o))})("markDoneRequested",function(o){If(e);let i=yC(3);return wf(i.onMarkDoneRequested(o))})("markActiveRequested",function(o){If(e);let i=yC(3);return wf(i.onMarkActiveRequested(o))}),pl();}if(n&2){let e=t.$implicit;Tg("task",e);}}function Ce(n,t){if(n&1&&(Is(0,"section",20)(1,"h2",21)(2,"mat-icon",22),qC(3),pl(),qC(4),Is(5,"span",23),qC(6),pl()(),Is(7,"div",14),iC(8,ve,1,1,"app-task-card",24,le),pl()()),n&2){let e=t.$implicit;JE(3),Zg(e.icon),JE(),vl(" ",e.label," "),JE(2),Zg(e.tasks.length),JE(2),sC(e.tasks);}}function be(n,t){if(n&1&&iC(0,Ce,10,3,"section",20,de),n&2){let e=yC();sC(e.taskGroups());}}function ye(n,t){if(n&1){let e=fC();Is(0,"app-task-card",25),Ag("stopRequested",function(o){If(e);let i=yC(2);return wf(i.onStopRequested(o))})("deleteRequested",function(o){If(e);let i=yC(2);return wf(i.onDeleteRequested(o))})("starToggled",function(o){If(e);let i=yC(2);return wf(i.onStarToggled(o))})("markDoneRequested",function(o){If(e);let i=yC(2);return wf(i.onMarkDoneRequested(o))})("markActiveRequested",function(o){If(e);let i=yC(2);return wf(i.onMarkActiveRequested(o))}),pl();}if(n&2){let e=t.$implicit;Tg("task",e);}}function xe(n,t){if(n&1&&(Is(0,"div",14),iC(1,ye,1,1,"app-task-card",24,le),pl()),n&2){let e=yC();JE(),sC(e.filteredTasks());}}var Te=[{key:"all",label:"All",icon:"grid_view"},{key:"waiting-you",label:"Waiting for you",icon:"mark_unread_chat_alt"},{key:"in-progress",label:"In progress",icon:"pending"},{key:"paused",label:"Paused",icon:"pause_circle"},{key:"done",label:"Done",icon:"check_circle"}],se=class n{router=g(G);projectState=g(P);threadState=g(U);threadApi=g(N);taskStatus=g(R);userService=g(pe$1);projectApi=g(c);destroyRef=g(we);_projectEventStream=g(F);filters=Te;activeFilter=zi("all");starredOnly=zi(false);isCreating=zi(false);isLoadingList=F$1(this.threadState.isLoadingThreadList$,{initialValue:false});username=F$1(this.userService.username$,{initialValue:null});allTasks=this.taskStatus.tasks;filteredTasks=yT(()=>{let t=this.activeFilter(),e=this.username(),r=this.allTasks();return this.starredOnly()&&e&&(r=r.filter(o=>o.starring.includes(e))),t==="all"?r:r.filter(o=>o.status===t)});filterCounts=yT(()=>{let t=this.username(),e=this.allTasks();return this.starredOnly()&&t&&(e=e.filter(r=>r.starring.includes(t))),{all:e.length,"waiting-you":e.filter(r=>r.status==="waiting-you").length,"in-progress":e.filter(r=>r.status==="in-progress").length,paused:e.filter(r=>r.status==="paused").length,done:e.filter(r=>r.status==="done").length}});taskGroups=yT(()=>{let t=this.username(),e=this.allTasks();this.starredOnly()&&t&&(e=e.filter(o=>o.starring.includes(t)));let r=[{status:"waiting-you",label:"Waiting for you",icon:"mark_unread_chat_alt",tasks:[]},{status:"in-progress",label:"In progress",icon:"pending",tasks:[]},{status:"done",label:"Done",icon:"check_circle",tasks:[]},{status:"paused",label:"Paused",icon:"pause_circle",tasks:[]},{status:"error",label:"Error",icon:"error",tasks:[]}];for(let o of e){let i=r.find(m=>m.status===o.status);i&&i.tasks.push(o);}return r.filter(o=>o.tasks.length>0)});ngOnInit(){this.userService.fetchCurrentUser().pipe(U$1(this.destroyRef)).subscribe({error:t=>console.warn("[TASK-CONTROL] Could not fetch user:",t)});}setFilter(t){this.activeFilter.set(t);}toggleStarredFilter(){this.starredOnly.update(t=>!t);}createTask(){let t=this.projectState.getSelectedProjectId();!t||this.isCreating()||(this.isCreating.set(true),this.threadApi.createThread().pipe(U$1(this.destroyRef)).subscribe({next:e=>{this.isCreating.set(false),this.router.navigate(["project",t,"thread",e.thread.id]);},error:e=>{console.error("[TASK-CONTROL] Failed to create thread:",e),this.isCreating.set(false);}}));}onStopRequested(t){this.threadApi.stopThread(t).pipe(U$1(this.destroyRef)).subscribe({error:e=>console.error("[TASK-CONTROL] Failed to stop thread:",e)});}onDeleteRequested(t){this.threadApi.deleteThread(t).pipe(U$1(this.destroyRef)).subscribe({next:()=>this.threadState.refreshThreadList(),error:e=>console.error("[TASK-CONTROL] Failed to delete thread:",e)});}onStarToggled(t){let e=this.username();if(!e)return;let r=this.allTasks().find(m=>m.id===t);if(!r)return;let o=r.starring.includes(e),i=o?this.threadApi.unstarThread(t):this.threadApi.starThread(t);this.threadState.updateStarLocal(t,!o,e),i.pipe(U$1(this.destroyRef)).subscribe({error:m=>{console.error("[TASK-CONTROL] Failed to toggle star:",m),this.threadState.refreshThreadList();}});}onMarkDoneRequested(t){let e=this.projectState.getSelectedProjectId();e&&this.projectApi.markThreadDone(e,t).pipe(U$1(this.destroyRef)).subscribe({next:()=>this.threadState.refreshThreadList(),error:r=>console.error("[TASK-CONTROL] Failed to mark task as done:",r)});}onMarkActiveRequested(t){let e=this.projectState.getSelectedProjectId();e&&this.projectApi.markThreadActive(e,t).pipe(U$1(this.destroyRef)).subscribe({next:()=>this.threadState.refreshThreadList(),error:r=>console.error("[TASK-CONTROL] Failed to mark task as active:",r)});}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=Rw({type:n,selectors:[["app-task-control"]],decls:25,vars:6,consts:[[1,"task-control"],[1,"tc-header"],[1,"tc-title-row"],[1,"tc-title"],[1,"title-icon"],["mat-flat-button","","aria-label","Start a new task",1,"new-task-btn",3,"click","disabled"],["diameter","16"],["role","tablist","aria-label","Filter tasks",1,"tc-filters"],["role","tab",1,"filter-chip",3,"active"],["role","switch","aria-label","Show starred tasks only",1,"filter-chip","starred-filter",3,"click"],[1,"filter-icon"],[1,"tc-grid-wrapper"],[1,"tc-loading"],[1,"tc-empty"],[1,"tc-grid"],["role","tab",1,"filter-chip",3,"click"],[1,"filter-badge"],["diameter","40"],[1,"empty-icon"],["mat-flat-button","",1,"new-task-btn",3,"click"],[1,"tc-group"],[1,"tc-group-title"],[1,"group-icon"],[1,"group-count"],[3,"task"],[3,"stopRequested","deleteRequested","starToggled","markDoneRequested","markActiveRequested","task"]],template:function(e,r){e&1&&(Is(0,"app-sidenav")(1,"div",0)(2,"header",1)(3,"div",2)(4,"h1",3)(5,"mat-icon",4),qC(6,"rocket_launch"),pl(),qC(7," Task Control "),pl(),Is(8,"button",5),Ag("click",function(){return r.createTask()}),tC(9,pe,1,0,"mat-spinner",6)(10,me,2,0,"mat-icon"),qC(11," New Task "),pl()(),Is(12,"nav",7),iC(13,ge,6,6,"button",8,ce),Is(15,"button",9),Ag("click",function(){return r.toggleStarredFilter()}),Is(16,"mat-icon",10),qC(17,"star"),pl(),Is(18,"span"),qC(19,"Starred"),pl()()()(),Is(20,"main",11),tC(21,_e,4,0,"div",12)(22,ke,5,1,"div",13)(23,be,2,0)(24,xe,3,0,"div",14),pl()()()),e&2&&(JE(8),Tg("disabled",r.isCreating()),JE(),nC(r.isCreating()?9:10),JE(4),sC(r.filters),JE(2),Hg("active",r.starredOnly()),Cg("aria-checked",r.starredOnly()),JE(6),nC(r.isLoadingList()?21:r.filteredTasks().length===0?22:r.activeFilter()==="all"?23:24));},dependencies:[A,St,yt,wt,hr,pr,Et,yt$1],styles:[".glass-panel[_ngcontent-%COMP%]{background:var(--glass-bg);backdrop-filter:var(--glass-backdrop-blur);-webkit-backdrop-filter:var(--glass-backdrop-blur);border:1px solid var(--glass-border);box-shadow:var(--glass-shadow)}.glass-interactive[_ngcontent-%COMP%]{background:var(--glass-bg);backdrop-filter:var(--glass-backdrop-blur);-webkit-backdrop-filter:var(--glass-backdrop-blur);border:1px solid var(--glass-border);box-shadow:var(--glass-shadow);transition:all .3s cubic-bezier(.4,0,.2,1)}.glass-interactive[_ngcontent-%COMP%]:hover{transform:translateY(-2px);box-shadow:0 12px 40px #00000026}.glass-interactive[_ngcontent-%COMP%]:active{transform:translateY(0)}.glass-card[_ngcontent-%COMP%]{background:var(--glass-bg);backdrop-filter:var(--glass-backdrop-blur);-webkit-backdrop-filter:var(--glass-backdrop-blur);border:1px solid var(--glass-border);box-shadow:var(--glass-shadow);border-radius:20px;padding:1.5rem}.glass-button[_ngcontent-%COMP%]{background:var(--glass-bg);backdrop-filter:var(--glass-backdrop-blur);-webkit-backdrop-filter:var(--glass-backdrop-blur);border:1px solid var(--glass-border);box-shadow:var(--glass-shadow);transition:all .3s cubic-bezier(.4,0,.2,1)}.glass-button[_ngcontent-%COMP%]:hover{transform:translateY(-2px);box-shadow:0 12px 40px #00000026}.glass-button[_ngcontent-%COMP%]:active{transform:translateY(0)}.glass-button[_ngcontent-%COMP%]{border-radius:12px;padding:.75rem 1.5rem;font-weight:600;cursor:pointer}.glass-button[_ngcontent-%COMP%]:disabled{opacity:.5;cursor:not-allowed;transform:none}.glass-button[_ngcontent-%COMP%]:disabled:hover{transform:none}.smooth-theme-transition[_ngcontent-%COMP%]{transition:background .3s ease,color .3s ease,border-color .3s ease,box-shadow .3s ease}[_nghost-%COMP%]{display:flex;height:100vh;width:100%;overflow:hidden}.task-control[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%;overflow:hidden;padding:1.5rem;gap:1.25rem;box-sizing:border-box}.tc-header[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:1rem;flex-shrink:0}.tc-title-row[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:1rem}.tc-title[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;margin:0;font-size:1.5rem;font-weight:700;color:var(--color-text)}.tc-title[_ngcontent-%COMP%] .title-icon[_ngcontent-%COMP%]{font-size:1.5rem;width:1.5rem;height:1.5rem;color:var(--color-primary)}.new-task-btn[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.375rem;background:var(--color-primary);color:var(--color-text-inverse);border-radius:12px;font-weight:600;padding:0 1rem;height:36px;flex-shrink:0}.new-task-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:1.1rem;width:1.1rem;height:1.1rem}.new-task-btn[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{display:inline-block}.tc-filters[_ngcontent-%COMP%]{display:flex;gap:.5rem;flex-wrap:wrap}.filter-chip[_ngcontent-%COMP%]{background:var(--glass-bg);backdrop-filter:var(--glass-backdrop-blur);-webkit-backdrop-filter:var(--glass-backdrop-blur);border:1px solid var(--glass-border);box-shadow:var(--glass-shadow);display:flex;align-items:center;gap:.375rem;padding:.375rem .875rem;border-radius:100px;font-size:.8rem;font-weight:500;color:var(--color-text-secondary);cursor:pointer;border:1px solid var(--color-border);transition:background .15s ease,color .15s ease,border-color .15s ease;white-space:nowrap}.filter-chip[_ngcontent-%COMP%] .filter-icon[_ngcontent-%COMP%]{font-size:.9rem;width:.9rem;height:.9rem}.filter-chip[_ngcontent-%COMP%] .filter-badge[_ngcontent-%COMP%]{background:var(--color-primary);color:var(--color-text-inverse);border-radius:100px;padding:0 .375rem;font-size:.7rem;font-weight:700;min-width:18px;text-align:center;line-height:18px}.filter-chip.active[_ngcontent-%COMP%]{background:var(--color-primary);color:var(--color-text-inverse);border-color:var(--color-primary)}.filter-chip.active[_ngcontent-%COMP%] .filter-icon[_ngcontent-%COMP%]{color:var(--color-text-inverse)}.filter-chip.active[_ngcontent-%COMP%] .filter-badge[_ngcontent-%COMP%]{background:#ffffff4d;color:var(--color-text-inverse)}.filter-chip[_ngcontent-%COMP%]:hover:not(.active){background:var(--color-bg-hover);color:var(--color-text)}.starred-filter.active[_ngcontent-%COMP%]{background:#f5a62326;border-color:#f5a623;color:#f5a623}.starred-filter.active[_ngcontent-%COMP%] .filter-icon[_ngcontent-%COMP%]{color:#f5a623}.tc-group[_ngcontent-%COMP%]{margin-bottom:1.5rem}.tc-group[_ngcontent-%COMP%]:last-child{margin-bottom:0}.tc-group-title[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;margin:0 0 .75rem;font-size:.85rem;font-weight:600;color:var(--color-text-secondary);text-transform:uppercase;letter-spacing:.05em}.tc-group-title[_ngcontent-%COMP%] .group-icon[_ngcontent-%COMP%]{font-size:1rem;width:1rem;height:1rem}.tc-group-title[_ngcontent-%COMP%] .group-count[_ngcontent-%COMP%]{background:var(--color-bg-hover);border-radius:100px;padding:0 .375rem;font-size:.75rem;font-weight:700;min-width:18px;text-align:center;line-height:18px}.tc-grid-wrapper[_ngcontent-%COMP%]{flex:1;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--color-border) transparent}.tc-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:1rem;padding-bottom:1rem}@media(max-width:600px){.tc-grid[_ngcontent-%COMP%]{grid-template-columns:1fr}}.tc-loading[_ngcontent-%COMP%], .tc-empty[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1rem;height:100%;min-height:240px;color:var(--color-text-secondary);text-align:center}.tc-loading[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .tc-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;font-size:.95rem}.empty-icon[_ngcontent-%COMP%]{font-size:3rem;width:3rem;height:3rem;opacity:.3}"]})};export{se as TaskControlComponent};
1
+ import {A,k as kt,b as bt}from'./chunk-CI760KmO.js';import {S as St}from'./chunk-BTX631I3.js';import {E as Et,y as yt$1,G as Ge}from'./chunk-DjoW6kqa.js';import {g,G,P,U,N,p as pe$1,J as c,w as we,a as Gi,F as F$1,E as ET,c as U$1,h as Fw,i as hr,j as pr,m as ws,Q as QC,n as hl,o as Rg,q as oC,r as cC,t as nI,v as bg,x as iC,y as uC,A as Ug,T as Tg,u as ue$1,ca as _e$1,Y as x,an as ce$1,ap as Hy,l as le$1,V,S as Sg,a9 as gC,aa as wf,ac as EC,ab as Cf,a8 as Yg,a5 as Dl}from'./main-LBRSRTYI.js';import'./chunk-BXkvjekT.js';import'./chunk-CpZK7G-Q.js';import'./chunk-bfpuueWC.js';import'./chunk-DjMtxVWg.js';import {y as yt,w as wt}from'./chunk-BYyTBqh4.js';var R=class n{threadState=g(U);codayService=g(Ge);threadList=F$1(this.threadState.threadList$,{initialValue:[]});selectedThread=F$1(this.threadState.selectedThread$,{initialValue:null});isThinking=F$1(this.codayService.isThinking$,{initialValue:false});inviteEvent=F$1(this.codayService.currentInviteEvent$.pipe(ue$1(t=>t?.invite===_e$1?null:t)),{initialValue:null});tasks=ET(()=>{let t=this.threadList(),e=this.selectedThread(),r=this.isThinking(),o=this.inviteEvent();return t.filter(i=>!i.parentThreadId).map(i=>{let m=!!e&&i.id===e.id;return {id:i.id,name:i.name,summary:i.summary,modifiedDate:i.modifiedDate,starring:i.starring??[],users:i.users??[],status:this.deriveStatus(i,m,r,!!o),isActive:m,worktreeProject:i.worktreeProject}}).sort((i,m)=>{let q=kt[i.status]-kt[m.status];return q!==0?q:i.modifiedDate>m.modifiedDate?-1:1})});deriveStatus(t,e,r,o){let i=Date.now()-new Date(t.modifiedDate).getTime();return t.closedByUser?"done":t.pendingInvite?"waiting-you":e?r?"in-progress":"paused":i<bt?"in-progress":"paused"}static \u0275fac=function(e){return new(e||n)};static \u0275prov=x({token:n,factory:n.\u0275fac,providedIn:"root"})};var F=class n{projectState=g(P);threadState=g(U);destroy$=new ce$1;eventSource=null;currentProject=null;constructor(){this.projectState.selectedProject$.pipe(Hy(this.destroy$)).subscribe(t=>{let e=t?.name??null;e!==this.currentProject&&(this.disconnect(),e&&this.connect(e));});}connect(t,e=5e3){this.currentProject=t;let r=`/api/projects/${encodeURIComponent(t)}/event-stream`;console.log(`[PROJECT_SSE] Connecting to ${r}`),this.eventSource=new EventSource(r),this.eventSource.onmessage=o=>{try{let i=JSON.parse(o.data),m=le$1(i);if(!m)return;m instanceof V&&(console.log("[PROJECT_SSE] ThreadUpdateEvent \u2014 refreshing thread list"),this.threadState.refreshThreadList());}catch(i){console.warn("[PROJECT_SSE] Failed to parse event:",i);}},this.eventSource.onerror=()=>{this.eventSource?.readyState===EventSource.CLOSED&&(console.warn(`[PROJECT_SSE] Connection closed for ${t}, reconnecting in ${e}ms`),this.eventSource=null,setTimeout(()=>{this.currentProject===t&&this.connect(t,Math.min(e*2,6e4));},e));};}disconnect(){this.eventSource&&(this.eventSource.close(),this.eventSource=null,console.log(`[PROJECT_SSE] Disconnected from project ${this.currentProject}`)),this.currentProject=null;}ngOnDestroy(){this.disconnect(),this.destroy$.next(),this.destroy$.complete();}static \u0275fac=function(e){return new(e||n)};static \u0275prov=x({token:n,factory:n.\u0275fac,providedIn:"root"})};var ce=(n,t)=>t.key,de=(n,t)=>t.status,le=(n,t)=>t.id;function pe(n,t){n&1&&Sg(0,"mat-spinner",6);}function me(n,t){n&1&&(ws(0,"mat-icon"),QC(1,"add"),hl());}function ue(n,t){if(n&1&&(ws(0,"span",16),QC(1),hl()),n&2){let e=EC().$implicit,r=EC();nI(),Yg(r.filterCounts()[e.key]);}}function ge(n,t){if(n&1){let e=gC();ws(0,"button",15),Rg("click",function(){let o=wf(e).$implicit,i=EC();return Cf(i.setFilter(o.key))}),ws(1,"mat-icon",10),QC(2),hl(),ws(3,"span"),QC(4),hl(),oC(5,ue,2,1,"span",16),hl();}if(n&2){let e=t.$implicit,r=EC();Ug("active",r.activeFilter()===e.key),Tg("aria-selected",r.activeFilter()===e.key),nI(2),Yg(e.icon),nI(2),Yg(e.label),nI(),iC(r.filterCounts()[e.key]>0?5:-1);}}function _e(n,t){n&1&&(ws(0,"div",12),Sg(1,"mat-spinner",17),ws(2,"p"),QC(3,"Loading tasks\u2026"),hl()());}function fe(n,t){if(n&1){let e=gC();ws(0,"p"),QC(1,"No tasks yet. Start your first one!"),hl(),ws(2,"button",19),Rg("click",function(){wf(e);let o=EC(2);return Cf(o.createTask())}),ws(3,"mat-icon"),QC(4,"add"),hl(),QC(5," New Task "),hl();}}function he(n,t){n&1&&(ws(0,"p"),QC(1,"No tasks in this category."),hl());}function ke(n,t){if(n&1&&(ws(0,"div",13)(1,"mat-icon",18),QC(2,"rocket_launch"),hl(),oC(3,fe,6,0)(4,he,2,0,"p"),hl()),n&2){let e=EC();nI(3),iC(e.activeFilter()==="all"?3:4);}}function ve(n,t){if(n&1){let e=gC();ws(0,"app-task-card",25),Rg("stopRequested",function(o){wf(e);let i=EC(3);return Cf(i.onStopRequested(o))})("deleteRequested",function(o){wf(e);let i=EC(3);return Cf(i.onDeleteRequested(o))})("starToggled",function(o){wf(e);let i=EC(3);return Cf(i.onStarToggled(o))})("markDoneRequested",function(o){wf(e);let i=EC(3);return Cf(i.onMarkDoneRequested(o))})("markActiveRequested",function(o){wf(e);let i=EC(3);return Cf(i.onMarkActiveRequested(o))}),hl();}if(n&2){let e=t.$implicit;bg("task",e);}}function Ce(n,t){if(n&1&&(ws(0,"section",20)(1,"h2",21)(2,"mat-icon",22),QC(3),hl(),QC(4),ws(5,"span",23),QC(6),hl()(),ws(7,"div",14),cC(8,ve,1,1,"app-task-card",24,le),hl()()),n&2){let e=t.$implicit;nI(3),Yg(e.icon),nI(),Dl(" ",e.label," "),nI(2),Yg(e.tasks.length),nI(2),uC(e.tasks);}}function be(n,t){if(n&1&&cC(0,Ce,10,3,"section",20,de),n&2){let e=EC();uC(e.taskGroups());}}function ye(n,t){if(n&1){let e=gC();ws(0,"app-task-card",25),Rg("stopRequested",function(o){wf(e);let i=EC(2);return Cf(i.onStopRequested(o))})("deleteRequested",function(o){wf(e);let i=EC(2);return Cf(i.onDeleteRequested(o))})("starToggled",function(o){wf(e);let i=EC(2);return Cf(i.onStarToggled(o))})("markDoneRequested",function(o){wf(e);let i=EC(2);return Cf(i.onMarkDoneRequested(o))})("markActiveRequested",function(o){wf(e);let i=EC(2);return Cf(i.onMarkActiveRequested(o))}),hl();}if(n&2){let e=t.$implicit;bg("task",e);}}function xe(n,t){if(n&1&&(ws(0,"div",14),cC(1,ye,1,1,"app-task-card",24,le),hl()),n&2){let e=EC();nI(),uC(e.filteredTasks());}}var Te=[{key:"all",label:"All",icon:"grid_view"},{key:"waiting-you",label:"Waiting for you",icon:"mark_unread_chat_alt"},{key:"in-progress",label:"In progress",icon:"pending"},{key:"paused",label:"Paused",icon:"pause_circle"},{key:"done",label:"Done",icon:"check_circle"}],se=class n{router=g(G);projectState=g(P);threadState=g(U);threadApi=g(N);taskStatus=g(R);userService=g(pe$1);projectApi=g(c);destroyRef=g(we);_projectEventStream=g(F);filters=Te;activeFilter=Gi("all");starredOnly=Gi(false);isCreating=Gi(false);isLoadingList=F$1(this.threadState.isLoadingThreadList$,{initialValue:false});username=F$1(this.userService.username$,{initialValue:null});allTasks=this.taskStatus.tasks;filteredTasks=ET(()=>{let t=this.activeFilter(),e=this.username(),r=this.allTasks();return this.starredOnly()&&e&&(r=r.filter(o=>o.starring.includes(e))),t==="all"?r:r.filter(o=>o.status===t)});filterCounts=ET(()=>{let t=this.username(),e=this.allTasks();return this.starredOnly()&&t&&(e=e.filter(r=>r.starring.includes(t))),{all:e.length,"waiting-you":e.filter(r=>r.status==="waiting-you").length,"in-progress":e.filter(r=>r.status==="in-progress").length,paused:e.filter(r=>r.status==="paused").length,done:e.filter(r=>r.status==="done").length}});taskGroups=ET(()=>{let t=this.username(),e=this.allTasks();this.starredOnly()&&t&&(e=e.filter(o=>o.starring.includes(t)));let r=[{status:"waiting-you",label:"Waiting for you",icon:"mark_unread_chat_alt",tasks:[]},{status:"in-progress",label:"In progress",icon:"pending",tasks:[]},{status:"done",label:"Done",icon:"check_circle",tasks:[]},{status:"paused",label:"Paused",icon:"pause_circle",tasks:[]},{status:"error",label:"Error",icon:"error",tasks:[]}];for(let o of e){let i=r.find(m=>m.status===o.status);i&&i.tasks.push(o);}return r.filter(o=>o.tasks.length>0)});ngOnInit(){this.userService.fetchCurrentUser().pipe(U$1(this.destroyRef)).subscribe({error:t=>console.warn("[TASK-CONTROL] Could not fetch user:",t)});}setFilter(t){this.activeFilter.set(t);}toggleStarredFilter(){this.starredOnly.update(t=>!t);}createTask(){let t=this.projectState.getSelectedProjectId();!t||this.isCreating()||(this.isCreating.set(true),this.threadApi.createThread().pipe(U$1(this.destroyRef)).subscribe({next:e=>{this.isCreating.set(false),this.router.navigate(["project",t,"thread",e.thread.id]);},error:e=>{console.error("[TASK-CONTROL] Failed to create thread:",e),this.isCreating.set(false);}}));}onStopRequested(t){this.threadApi.stopThread(t).pipe(U$1(this.destroyRef)).subscribe({error:e=>console.error("[TASK-CONTROL] Failed to stop thread:",e)});}onDeleteRequested(t){this.threadApi.deleteThread(t).pipe(U$1(this.destroyRef)).subscribe({next:()=>this.threadState.refreshThreadList(),error:e=>console.error("[TASK-CONTROL] Failed to delete thread:",e)});}onStarToggled(t){let e=this.username();if(!e)return;let r=this.allTasks().find(m=>m.id===t);if(!r)return;let o=r.starring.includes(e),i=o?this.threadApi.unstarThread(t):this.threadApi.starThread(t);this.threadState.updateStarLocal(t,!o,e),i.pipe(U$1(this.destroyRef)).subscribe({error:m=>{console.error("[TASK-CONTROL] Failed to toggle star:",m),this.threadState.refreshThreadList();}});}onMarkDoneRequested(t){let e=this.projectState.getSelectedProjectId();e&&this.projectApi.markThreadDone(e,t).pipe(U$1(this.destroyRef)).subscribe({next:()=>this.threadState.refreshThreadList(),error:r=>console.error("[TASK-CONTROL] Failed to mark task as done:",r)});}onMarkActiveRequested(t){let e=this.projectState.getSelectedProjectId();e&&this.projectApi.markThreadActive(e,t).pipe(U$1(this.destroyRef)).subscribe({next:()=>this.threadState.refreshThreadList(),error:r=>console.error("[TASK-CONTROL] Failed to mark task as active:",r)});}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=Fw({type:n,selectors:[["app-task-control"]],decls:25,vars:6,consts:[[1,"task-control"],[1,"tc-header"],[1,"tc-title-row"],[1,"tc-title"],[1,"title-icon"],["mat-flat-button","","aria-label","Start a new task",1,"new-task-btn",3,"click","disabled"],["diameter","16"],["role","tablist","aria-label","Filter tasks",1,"tc-filters"],["role","tab",1,"filter-chip",3,"active"],["role","switch","aria-label","Show starred tasks only",1,"filter-chip","starred-filter",3,"click"],[1,"filter-icon"],[1,"tc-grid-wrapper"],[1,"tc-loading"],[1,"tc-empty"],[1,"tc-grid"],["role","tab",1,"filter-chip",3,"click"],[1,"filter-badge"],["diameter","40"],[1,"empty-icon"],["mat-flat-button","",1,"new-task-btn",3,"click"],[1,"tc-group"],[1,"tc-group-title"],[1,"group-icon"],[1,"group-count"],[3,"task"],[3,"stopRequested","deleteRequested","starToggled","markDoneRequested","markActiveRequested","task"]],template:function(e,r){e&1&&(ws(0,"app-sidenav")(1,"div",0)(2,"header",1)(3,"div",2)(4,"h1",3)(5,"mat-icon",4),QC(6,"rocket_launch"),hl(),QC(7," Task Control "),hl(),ws(8,"button",5),Rg("click",function(){return r.createTask()}),oC(9,pe,1,0,"mat-spinner",6)(10,me,2,0,"mat-icon"),QC(11," New Task "),hl()(),ws(12,"nav",7),cC(13,ge,6,6,"button",8,ce),ws(15,"button",9),Rg("click",function(){return r.toggleStarredFilter()}),ws(16,"mat-icon",10),QC(17,"star"),hl(),ws(18,"span"),QC(19,"Starred"),hl()()()(),ws(20,"main",11),oC(21,_e,4,0,"div",12)(22,ke,5,1,"div",13)(23,be,2,0)(24,xe,3,0,"div",14),hl()()()),e&2&&(nI(8),bg("disabled",r.isCreating()),nI(),iC(r.isCreating()?9:10),nI(4),uC(r.filters),nI(2),Ug("active",r.starredOnly()),Tg("aria-checked",r.starredOnly()),nI(6),iC(r.isLoadingList()?21:r.filteredTasks().length===0?22:r.activeFilter()==="all"?23:24));},dependencies:[A,St,yt,wt,hr,pr,Et,yt$1],styles:[".glass-panel[_ngcontent-%COMP%]{background:var(--glass-bg);backdrop-filter:var(--glass-backdrop-blur);-webkit-backdrop-filter:var(--glass-backdrop-blur);border:1px solid var(--glass-border);box-shadow:var(--glass-shadow)}.glass-interactive[_ngcontent-%COMP%]{background:var(--glass-bg);backdrop-filter:var(--glass-backdrop-blur);-webkit-backdrop-filter:var(--glass-backdrop-blur);border:1px solid var(--glass-border);box-shadow:var(--glass-shadow);transition:all .3s cubic-bezier(.4,0,.2,1)}.glass-interactive[_ngcontent-%COMP%]:hover{transform:translateY(-2px);box-shadow:0 12px 40px #00000026}.glass-interactive[_ngcontent-%COMP%]:active{transform:translateY(0)}.glass-card[_ngcontent-%COMP%]{background:var(--glass-bg);backdrop-filter:var(--glass-backdrop-blur);-webkit-backdrop-filter:var(--glass-backdrop-blur);border:1px solid var(--glass-border);box-shadow:var(--glass-shadow);border-radius:20px;padding:1.5rem}.glass-button[_ngcontent-%COMP%]{background:var(--glass-bg);backdrop-filter:var(--glass-backdrop-blur);-webkit-backdrop-filter:var(--glass-backdrop-blur);border:1px solid var(--glass-border);box-shadow:var(--glass-shadow);transition:all .3s cubic-bezier(.4,0,.2,1)}.glass-button[_ngcontent-%COMP%]:hover{transform:translateY(-2px);box-shadow:0 12px 40px #00000026}.glass-button[_ngcontent-%COMP%]:active{transform:translateY(0)}.glass-button[_ngcontent-%COMP%]{border-radius:12px;padding:.75rem 1.5rem;font-weight:600;cursor:pointer}.glass-button[_ngcontent-%COMP%]:disabled{opacity:.5;cursor:not-allowed;transform:none}.glass-button[_ngcontent-%COMP%]:disabled:hover{transform:none}.smooth-theme-transition[_ngcontent-%COMP%]{transition:background .3s ease,color .3s ease,border-color .3s ease,box-shadow .3s ease}[_nghost-%COMP%]{display:flex;height:100vh;width:100%;overflow:hidden}.task-control[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%;overflow:hidden;padding:1.5rem;gap:1.25rem;box-sizing:border-box}.tc-header[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:1rem;flex-shrink:0}.tc-title-row[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;gap:1rem}.tc-title[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;margin:0;font-size:1.5rem;font-weight:700;color:var(--color-text)}.tc-title[_ngcontent-%COMP%] .title-icon[_ngcontent-%COMP%]{font-size:1.5rem;width:1.5rem;height:1.5rem;color:var(--color-primary)}.new-task-btn[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.375rem;background:var(--color-primary);color:var(--color-text-inverse);border-radius:12px;font-weight:600;padding:0 1rem;height:36px;flex-shrink:0}.new-task-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:1.1rem;width:1.1rem;height:1.1rem}.new-task-btn[_ngcontent-%COMP%] mat-spinner[_ngcontent-%COMP%]{display:inline-block}.tc-filters[_ngcontent-%COMP%]{display:flex;gap:.5rem;flex-wrap:wrap}.filter-chip[_ngcontent-%COMP%]{background:var(--glass-bg);backdrop-filter:var(--glass-backdrop-blur);-webkit-backdrop-filter:var(--glass-backdrop-blur);border:1px solid var(--glass-border);box-shadow:var(--glass-shadow);display:flex;align-items:center;gap:.375rem;padding:.375rem .875rem;border-radius:100px;font-size:.8rem;font-weight:500;color:var(--color-text-secondary);cursor:pointer;border:1px solid var(--color-border);transition:background .15s ease,color .15s ease,border-color .15s ease;white-space:nowrap}.filter-chip[_ngcontent-%COMP%] .filter-icon[_ngcontent-%COMP%]{font-size:.9rem;width:.9rem;height:.9rem}.filter-chip[_ngcontent-%COMP%] .filter-badge[_ngcontent-%COMP%]{background:var(--color-primary);color:var(--color-text-inverse);border-radius:100px;padding:0 .375rem;font-size:.7rem;font-weight:700;min-width:18px;text-align:center;line-height:18px}.filter-chip.active[_ngcontent-%COMP%]{background:var(--color-primary);color:var(--color-text-inverse);border-color:var(--color-primary)}.filter-chip.active[_ngcontent-%COMP%] .filter-icon[_ngcontent-%COMP%]{color:var(--color-text-inverse)}.filter-chip.active[_ngcontent-%COMP%] .filter-badge[_ngcontent-%COMP%]{background:#ffffff4d;color:var(--color-text-inverse)}.filter-chip[_ngcontent-%COMP%]:hover:not(.active){background:var(--color-bg-hover);color:var(--color-text)}.starred-filter.active[_ngcontent-%COMP%]{background:#f5a62326;border-color:#f5a623;color:#f5a623}.starred-filter.active[_ngcontent-%COMP%] .filter-icon[_ngcontent-%COMP%]{color:#f5a623}.tc-group[_ngcontent-%COMP%]{margin-bottom:1.5rem}.tc-group[_ngcontent-%COMP%]:last-child{margin-bottom:0}.tc-group-title[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;margin:0 0 .75rem;font-size:.85rem;font-weight:600;color:var(--color-text-secondary);text-transform:uppercase;letter-spacing:.05em}.tc-group-title[_ngcontent-%COMP%] .group-icon[_ngcontent-%COMP%]{font-size:1rem;width:1rem;height:1rem}.tc-group-title[_ngcontent-%COMP%] .group-count[_ngcontent-%COMP%]{background:var(--color-bg-hover);border-radius:100px;padding:0 .375rem;font-size:.75rem;font-weight:700;min-width:18px;text-align:center;line-height:18px}.tc-grid-wrapper[_ngcontent-%COMP%]{flex:1;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--color-border) transparent}.tc-grid[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:1rem;padding-bottom:1rem}@media(max-width:600px){.tc-grid[_ngcontent-%COMP%]{grid-template-columns:1fr}}.tc-loading[_ngcontent-%COMP%], .tc-empty[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1rem;height:100%;min-height:240px;color:var(--color-text-secondary);text-align:center}.tc-loading[_ngcontent-%COMP%] p[_ngcontent-%COMP%], .tc-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;font-size:.95rem}.empty-icon[_ngcontent-%COMP%]{font-size:3rem;width:3rem;height:3rem;opacity:.3}"]})};export{se as TaskControlComponent};