1"use strict";(self.webpackChunkSlideSquad=self.webpackChunkSlideSquad||[]).push([[3994],{43994:(Y,m,f)=>{f.r(m),f.d(m,{WorkflowFailedRunsComponent:()=>U});var h=f(60177),g=f(89417),_=f(74710),k=f(21413),u=f(56977),C=f(94573),b=f(48417),e=f(54438),x=f(2883),M=f(38482),F=f(36409);const O=(r,a)=>["/locations",r,"workflows","runs",a];function P(r,a){if(1&r&&(e.j41(0,"span",27)(1,"span",5),e.EFF(2,"\xb7"),e.k0s(),e.EFF(3),e.k0s()),2&r){const t=e.XpG(2);e.R7$(3),e.SpI(" ",t.stuckCount," stuck ")}}function R(r,a){if(1&r&&(e.j41(0,"span"),e.EFF(1),e.DNE(2,P,4,1,"span",26),e.EFF(3),e.k0s()),2&r){const t=e.XpG();e.R7$(),e.SpI(" ",t.filteredRows.length," total "),e.R7$(),e.Y8G("ngIf",t.stuckCount>0),e.R7$(),e.SpI(" in ",t.range," ")}}function v(r,a){1&r&&(e.j41(0,"span",28),e.EFF(1,"Loading\u2026"),e.k0s())}function y(r,a){if(1&r&&(e.j41(0,"option",29),e.EFF(1),e.k0s()),2&r){const t=a.$implicit;e.Y8G("value",t.id),e.R7$(),e.JRh(t.name)}}function I(r,a){if(1&r){const t=e.RV6();e.j41(0,"button",30),e.bIt("click",function(){const n=e.eBV(t).$implicit,s=e.XpG();return e.Njj(s.setRange(n.value))}),e.EFF(1),e.k0s()}if(2&r){const t=a.$implicit,o=e.XpG();e.AVh("active",o.range===t.value),e.BMQ("aria-checked",o.range===t.value),e.R7$(),e.SpI(" ",t.label," ")}}function E(r,a){if(1&r&&(e.j41(0,"div",31),e.nrm(1,"i",32),e.EFF(2),e.k0s()),2&r){const t=e.XpG();e.R7$(2),e.SpI(" ",t.loadError," ")}}function T(r,a){1&r&&(e.j41(0,"section",33),e.nrm(1,"app-skeleton-shimmer",34),e.k0s()),2&r&&(e.R7$(),e.Y8G("lines",6))}function j(r,a){1&r&&(e.j41(0,"p"),e.EFF(1,"No failed runs in the selected range. \u{1f389}"),e.k0s())}function D(r,a){if(1&r){const t=e.RV6();e.j41(0,"p"),e.EFF(1," No failures match these filters. "),e.j41(2,"button",37),e.bIt("click",function(){e.eBV(t);const n=e.XpG(2);return e.Njj(n.clearClientFilters())}),e.EFF(3,"Clear text filters"),e.k0s()()}}function $(r,a){if(1&r&&(e.j41(0,"section",33)(1,"div",35),e.nrm(2,"i",36),e.DNE(3,j,2,0,"p",6)(4,D,4,0,"p",6),e.k0s()()),2&r){const t=e.XpG();e.R7$(3),e.Y8G("ngIf",0===t.rows.length),e.R7$(),e.Y8G("ngIf",t.rows.length>0&&t.hasActiveClientFilters())}}function L(r,a){1&r&&(e.j41(0,"div",48),e.EFF(1,"Location"),e.k0s())}function W(r,a){1&r&&(e.j41(0,"span",61),e.EFF(1,"Test"),e.k0s())}function N(r,a){if(1&r&&(e.j41(0,"div",48)(1,"span",62),e.EFF(2),e.k0s()()),2&r){const t=e.XpG().$implicit,o=e.XpG(2);e.R7$(2),e.JRh(o.locationDisplayName(t))}}function A(r,a){1&r&&(e.j41(0,"span",63),e.nrm(1,"span",64),e.EFF(2," Stuck "),e.k0s())}function G(r,a){if(1&r&&(e.j41(0,"span"),e.nrm(1,"span",64),e.EFF(2),e.k0s()),2&r){const t=e.XpG().$implicit;e.ZvI("status-pill status-pill--","Partial"===t.status?"partial":"failed",""),e.R7$(2),e.SpI(" ",t.status," ")}}function B(r,a){if(1&r){const t=e.RV6();e.j41(0,"div",49),e.bIt("click",function(){const n=e.eBV(t).$implicit,s=e.XpG(2);return e.Njj(s.open(n))}),e.j41(1,"div",40)(2,"span",50),e.EFF(3),e.k0s(),e.DNE(4,W,2,0,"span",51),e.k0s(),e.DNE(5,N,3,1,"div",41),e.j41(6,"div",42)(7,"span",52),e.EFF(8),e.k0s(),e.j41(9,"span",53),e.EFF(10),e.k0s()(),e.j41(11,"div",43)(12,"span",54),e.nrm(13,"i",55),e.EFF(14),e.k0s()(),e.j41(15,"div",44),e.EFF(16),e.k0s(),e.j41(17,"div",45),e.DNE(18,A,3,0,"span",56)(19,G,3,4,"ng-template",null,0,e.C5r),e.j41(21,"span",57),e.EFF(22),e.k0s()(),e.j41(23,"div",58),e.bIt("click",function(n){return e.eBV(t),e.Njj(n.stopPropagation())}),e.j41(24,"a",59),e.nrm(25,"i",60),e.EFF(26," View Trace "),e.k0s()()()}if(2&r){const t=a.$implicit,o=e.sdS(20),n=e.XpG(2);e.AVh("rule-row--no-location",!!n.locationId),e.R7$(3),e.JRh(n.startedRelative(t)),e.R7$(),e.Y8G("ngIf",t.isTestRun),e.R7$(),e.Y8G("ngIf",!n.locationId),e.R7$(3),e.JRh(n.workflowDisplayName(t)),e.R7$(2),e.JRh(n.workflowVersionLabel(t)),e.R7$(4),e.SpI(" ",n.triggerLabel(t.triggerType)," "),e.R7$(2),e.JRh(n.contactLabel(t)),e.R7$(2),e.Y8G("ngIf",t.isStuck)("ngIfElse",o),e.R7$(4),e.JRh(n.stuckExcerpt(t)),e.R7$(2),e.Y8G("routerLink",e.l_i(13,O,t.locationId,t.runId))}}function S(r,a){if(1&r&&(e.j41(0,"section",33)(1,"div",38)(2,"div",39)(3,"div",40),e.EFF(4,"When"),e.k0s(),e.DNE(5,L,2,0,"div",41),e.j41(6,"div",42),e.EFF(7,"Workflow"),e.k0s(),e.j41(8,"div",43),e.EFF(9,"Trigger"),e.k0s(),e.j41(10,"div",44),e.EFF(11,"Contact"),e.k0s(),e.j41(12,"div",45),e.EFF(13,"Error"),e.k0s(),e.nrm(14,"div",46),e.k0s(),e.DNE(15,B,27,16,"div",47),e.k0s()()),2&r){const t=e.XpG();e.R7$(2),e.AVh("rule-row--no-location",!!t.locationId),e.R7$(3),e.Y8G("ngIf",!t.locationId),e.R7$(10),e.Y8G("ngForOf",t.filteredRows)("ngForTrackBy",t.trackByRunId)}}const w=[{value:"1h",label:"1h"},{value:"24h",label:"24h"},{value:"7d",label:"7d"},{value:"30d",label:"30d"}];let U=(()=>
1{class r{constructor(t,o,n,s,i){this.svc=t,this.firewall=o,this.router=n,this.route=s,this.cdr=i,this.locationId="",this.range="24h",this.workflowFilter="",this.errorContains="",this.rangeOptions=w,this.rows=[],this.filteredRows=[],this.isLoading=!1,this.loadError=null,this.locationOptions=[],this.workflowMap=new Map,this.locationNameById=new Map,this.triggerCaptionByType=new Map,this.refreshTimer=null,this.isForegrounded=!0,this.visibilityHandler=()=>this.handleVisibilityChange(),this.destroy$=new k.B,this.trackByRunId=(l,c)=>c.runId}ngOnInit(){this.route.queryParamMap.pipe((0,u.Q)(this.destroy$)).subscribe(t=>{const o=t.get("locationId");null!=o&&(this.locationId=o);const n=t.get("range");n&&w.some(s=>s.value===n)&&(this.range=n),this.refresh(!0)}),this.firewall.getLocations().pipe((0,u.Q)(this.destroy$)).subscribe({next:t=>{this.locationOptions=t.map(o=>({id:o.locationId,name:o.locationName})),this.locationNameById=new Map(t.map(o=>[o.locationId,o.locationName])),this.attachLookups(),this.cdr.markForCheck()},error:()=>{}}),this.svc.getTriggerSchemas().pipe((0,u.Q)(this.destroy$)).subscribe({next:t=>{this.triggerCaptionByType=new Map(t.map(o=>[o.triggerType,o.displayCaption??""])),this.cdr.markForCheck()},error:()=>{}}),this.svc.list(void 0,!1).pipe((0,u.Q)(this.destroy$)).subscribe({next:t=>{this.workflowMap=new Map(t.map(o=>[o.workflowId,{name:o.name,version:o.publishedVersion}])),this.attachLookups(),this.cdr.markForCheck()},error:()=>{}}),typeof document<"u"&&(document.addEventListener("visibilitychange",this.visibilityHandler),this.isForegrounded=!document.hidden)}ngOnDestroy(){this.stopAutoRefresh(),typeof document<"u"&&document.removeEventListener("visibilitychange",this.visibilityHandler),this.destroy$.next(),this.destroy$.complete()}onLocationChange(){this.updateUrl(),this.refresh(!0)}setRange(t){this.range!==t&&(this.range=t,this.updateUrl(),this.refresh(!0))}onClientFilterChange(){this.applyClientFilters(),this.cdr.markForCheck()}manualRefresh(){this.refresh(!0)}refresh(t){if(t&&(this.isLoading=!0,this.cdr.markForCheck()),!this.locationId)return void this.fanOutAllLocations();let o=!1,n=!1,s=[],i=[],l=null;const c=()=>{!o||!n||(this.rows=this.mergeFailedAndStuck(s,i),this.applyClientFilters(),this.isLoading=!1,this.loadError=l,this.cdr.markForCheck(),this.scheduleNextRefresh())};this.svc.getFailedRuns(this.locationId,this.range,200).subscribe({next:d=>{s=d,o=!0,c()},error:d=>{l=d?.error?.message??"Couldn't load failed runs",o=!0,c()}}),this.svc.getStuckRuns(this.locationId,200).subscribe({next:d=>{i=d,n=!0,c()},error:()=>{i=[],n=!0,c()}})}mergeFailedAndStuck(t,o){const n=new Set(t.map(i=>i.runId)),s=[];for(const i of t)s.push(this.decorate(i));for(const i of o){if(n.has(i.runId))continue;const l=this.decorate(i);l.isStuck=!0,s.push(l)}return s.sort((i,l)=>{const c=new Date(i.startedAt??i.createdDate).getTime();return new Date(l.startedAt??l.createdDate).getTime()-c}),s.slice(0,200)}fanOutAllLocations(){if(0===this.locationOptions.length)return this.rows=[],this.filteredRows=[],this.isLoading=!1,this.cdr.markForCheck(),void this.scheduleNextRefresh();const t=this.locationOptions.length;let o=t,n=t;const s=[],i=[];let l=null;const c=()=>{if(o>0||n>0)return;const d=this.mergeFailedAndStuck(s,i);this.rows=d,this.applyClientFilters(),this.isLoading=!1,this.loadError=l&&0===this.rows.length?l:null,this.cdr.markForCheck(),this.scheduleNextRefresh()};for(const d of this.locationOptions)this.svc.getFailedRuns(d.id,this.range,100).subscribe({next:p=>{s.push(...p),o--,c()},error:p=>{l||(l=p?.error?.message??null),o--,c()}}),this.svc.getStuckRuns(d.id,100).subscribe({next:p=>{i.push(...p),n--,c()},error:()=>{n--,c()}})}decorate(t){const o=this.workflowMap.get(t.workflowId);return{...t,workflowName:o?.name,locationName:this.locationNameById.get(t.locationId)}}attachLookups(){0!==this.rows.length&&(this.rows=this.rows.map(t=>{const o=this.workflowMap.get(t.workflowId);return{...t,workflowName:o?.name??t.workflowName,locationName:this.locationNameById.get(t.locationId)??t.locationName}}),this.applyClientFilters())}applyClientFilters(){const t=this.workflowFilter.trim().toLowerCase(),o=this.errorContains.trim().toLowerCase();this.filteredRows=this.rows.filter(n=>!(t&&!(n.workflowName??`Workflow #${n.workflowId}`).toLowerCase().includes(t)||o&&!(n.errorMessage??"").toLowerCase().includes(o)))}updateUrl(){this.router.navigate([],{relativeTo:this.route,queryParams:{locationId:this.locationId||void 0,range:"24h"===this.range?void 0:this.range},replaceUrl:!0,queryParamsHandling:"merge"})}scheduleNextRefresh(){this.stopAutoRefresh(),this.isForegrounded&&(this.refreshTimer=setTimeout(()=>this.refresh(!1),3e4))}stopAutoRefresh(){this.refreshTimer&&(clearTimeout(this.refreshTimer),this.refreshTimer=null)}handleVisibilityChange(){const t=!document.hidden;t&&!this.isForegrounded?(this.isForegrounded=!0,this.refresh(!1)):!t&&this.isForegrounded&&(this.isForegrounded=!1,this.stopAutoRefresh())}workflowDisplayName(t){return t.workflowName??`Workflow #${t.workflowId}`}workflowVersionLabel(t){const n=this.workflowMap.get(t.workflowId)?.version??t.workflowVersion;return null!=n?`v${n}`:""}locationDisplayName(t){return t.locationName??t.locationId}triggerLabel(t){return(0,C.M)(t,this.triggerCaptionByType.get(t))}contactLabel(t){return null==t.contactId?"\u2014":`#${t.contactId}`}errorExcerpt(t){if(!t.errorMessage)return"\u2014";const o=t.errorMessage.trim();return o.length<=80?o:o.slice(0,77)+"\u2026"}stuckExcerpt(t){if(!t.isStuck)return this.errorExcerpt(t);const o=t.startedAt??t.createdDate;return o?`Running for ${Math.max(1,Math.floor((Date.now()-new Date(o).getTime())/6e4))}m without node update`:"Running \u2014 no start timestamp"}get stuckCount(){return this.rows.reduce((t,o)=>t+(o.isStuck?1:0),0)}startedRelative(t){const o=t.startedAt??t.createdDate;if(!o)return"\u2014";const n=new Date(o),s=Date.now()-n.getTime();if(s<0)return"just now";const i=Math.floor(s/1e3);if(i<60)return`${i}s ago`;const l=Math.floor(i/60);if(l<60)return`${l} min ago`;const c=Math.floor(l/60);if(c<24)return`${c}h ago`;const d=Math.floor(c/24);return d<30?`${d}d ago`:n.toLocaleDateString()}hasActiveClientFilters(){return!!this.workflowFilter.trim()||!!this.errorContains.trim()}clearClientFilters(){this.workflowFilter="",this.errorContains="",this.applyClientFilters(),this.cdr.markForCheck()}open(t){this.router.navigate(["/locations",t.locationId,"workflows","runs",t.runId])}static{this.\u0275fac=function(o){return new(o||r)(e.rXU(x.D),e.rXU(M.k),e.rXU(_.Ix),e.rXU(_.nX),e.rXU(e.gRc))}}static{this.\u0275cmp=e.VBU({type:r,selectors:[["app-admin-workflow-failed-runs"]],standalone:!0,features:[e.aNF],decls:39,vars:12,consts:[["statusPill",""],[1,"failed-runs"],[1,"page-header"],[1,"page-header__title"],[1,"page-header__sub"],[1,"dot-sep"],[4,"ngIf"],["class","page-header__loading",4,"ngIf"],[1,"filter-bar"],[1,"filter-group"],["for","failed-runs-location",1,"filter-label"],["id","failed-runs-location",1,"filter-select",3,"ngModelChange","ngModel"],["value",""],[3,"value",4,"ngFor","ngForOf"],[1,"filter-label"],["role","radiogroup","aria-label","Time range",1,"range-chips"],["type","button","class","range-btn","role","radio",3,"active","click",4,"ngFor","ngForOf"],[1,"filter-group","filter-group--text"],["for","failed-runs-wf",1,"filter-label"],["id","failed-runs-wf","type","text","placeholder","e.g. Lead Score",1,"filter-input",3,"ngModelChange","ngModel"],["for","failed-runs-err",1,"filter-label"],["id","failed-runs-err","type","text","placeholder","e.g. timeout",1,"filter-input",3,"ngModelChange","ngModel"],["type","button","aria-label","Refresh",1,"btn","btn--secondary","filter-bar__refresh",3,"click","disabled"],[1,"fa-solid","fa-arrows-rotate"],["class","load-error",4,"ngIf"],["class","rules-card",4,"ngIf"],["class","page-header__stuck",4,"ngIf"],[1,"page-header__stuck"],[1,"page-header__loading"],[3,"value"],["type","button","role","radio",1,"range-btn",3,"click"],[1,"load-error"],[1,"fa-solid","fa-circle-exclamation"],[1,"rules-card"],["variant","table-row",3,"lines"],[1,"empty-state"],[1,"fa-solid","fa-circle-check"],["type","button",1,"empty-clear",3,"click"],[1,"rule-list"],[1,"rule-row","rule-row--header"],[1,"col-when"],["class","col-location",4,"ngIf"],[1,"col-workflow"],[1,"col-trigger"],[1,"col-contact"],[1,"col-error"],[1,"col-actions"],["class","rule-row rule-row--data",3,"rule-row--no-location","click",4,"ngFor","ngForOf","ngForTrackBy"],[1,"col-location"],[1,"rule-row","rule-row--data",3,"click"],[1,"when-text"],["class","badge badge--test",4,"ngIf"],[1,"workflow-name"],[1,"workflow-version"],[1,"trigger-pill"],[1,"fa-solid","fa-bolt"],["class","status-pill status-pill--stuck","title","Running for longer than the stuck threshold",4,"ngIf","ngIfElse"],[1,"error-text"],[1,"col-actions",3,"click"],[1,"btn","btn--small","btn--secondary",3,"routerLink"],[1,"fa-solid","fa-list-tree"],[1,"badge","badge--test"],[1,"location-name"],["title","Running for longer than the stuck threshold",1,"status-pill","status-pill--stuck"],[1,"status-pill__dot"]],template:function(o,n){1&o&&(e.j41(0,"div",1)(1,"header",2)(2,"div",3)(3,"h1"),e.EFF(4,"Failed & Stuck Workflow Runs"),e.k0s(),e.j41(5,"p",4),e.EFF(6," Admin queue "),e.j41(7,"span",5),e.EFF(8,"\xb7"),e.k0s(),e.DNE(9,R,4,3,"span",6)(10,v,2,0,"span",7),e.k0s()()(),e.j41(11,"div",8)(12,"div",9)(13,"label",10),e.EFF(14,"Location"),e.k0s(),e.j41(15,"select",11),e.mxI("ngModelChange",function(i){return e.DH7(n.locationId,i)||(n.locationId=i),i}),e.bIt("ngModelChange",function(){return n.onLocationChange()}),e.j41(16,"option",12),e.EFF(17,"All locations"),e.k0s(),e.DNE(18,y,2,2,"option",13),e.k0s()(),e.j41(19,"div",9)(20,"span",14),e.EFF(21,"Range"),e.k0s(),e.j41(22,"div",15),e.DNE(23,I,2,4,"button",16),e.k0s()(),e.j41(24,"div",17)(25,"label",18),e.EFF(26,"Workflow contains"),e.k0s(),e.j41(27,"input",19),e.mxI("ngModelChange",function(i){return e.DH7(n.workflowFilter,i)||(n.workflowFilter=i),i}),e.bIt("ngModelChange",function(){return n.onClientFilterChange()}
1),e.k0s()(),e.j41(28,"div",17)(29,"label",20),e.EFF(30,"Error contains"),e.k0s(),e.j41(31,"input",21),e.mxI("ngModelChange",function(i){return e.DH7(n.errorContains,i)||(n.errorContains=i),i}),e.bIt("ngModelChange",function(){return n.onClientFilterChange()}),e.k0s()(),e.j41(32,"button",22),e.bIt("click",function(){return n.manualRefresh()}),e.nrm(33,"i",23),e.EFF(34," Refresh "),e.k0s()(),e.DNE(35,E,3,1,"div",24)(36,T,2,1,"section",25)(37,$,5,2,"section",25)(38,S,16,5,"section",25),e.k0s()),2&o&&(e.R7$(9),e.Y8G("ngIf",!n.isLoading),e.R7$(),e.Y8G("ngIf",n.isLoading),e.R7$(5),e.R50("ngModel",n.locationId),e.R7$(3),e.Y8G("ngForOf",n.locationOptions),e.R7$(5),e.Y8G("ngForOf",n.rangeOptions),e.R7$(4),e.R50("ngModel",n.workflowFilter),e.R7$(4),e.R50("ngModel",n.errorContains),e.R7$(),e.Y8G("disabled",n.isLoading),e.R7$(3),e.Y8G("ngIf",n.loadError),e.R7$(),e.Y8G("ngIf",n.isLoading),e.R7$(),e.Y8G("ngIf",!n.isLoading&&0===n.filteredRows.length),e.R7$(),e.Y8G("ngIf",!n.isLoading&&n.filteredRows.length>0))},dependencies:[h.MD,h.Sq,h.bT,g.YN,g.xH,g.y7,g.me,g.wz,g.BC,g.vS,_.Wk,b.u,F.M],styles:['[_nghost-%COMP%]{display:block}.failed-runs[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px;padding:24px;animation:_ngcontent-%COMP%_fadeIn .2s ease-out}@keyframes _ngcontent-%COMP%_fadeIn{0%{opacity:0}to{opacity:1}}.page-header[_ngcontent-%COMP%]{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.page-header__title[_ngcontent-%COMP%] h1[_ngcontent-%COMP%]{margin:0 0 4px;font-size:1.25rem;font-weight:600;color:#0f172a;letter-spacing:-.01em}.page-header__sub[_ngcontent-%COMP%]{margin:0;font-size:.8125rem;color:#64748b;display:inline-flex;align-items:center;gap:6px}.page-header__sub[_ngcontent-%COMP%] .dot-sep[_ngcontent-%COMP%]{color:#cbd5e1}.page-header__loading[_ngcontent-%COMP%]{color:#94a3b8;font-style:italic}.filter-bar[_ngcontent-%COMP%]{display:flex;align-items:flex-end;gap:12px;flex-wrap:wrap}.filter-bar__refresh[_ngcontent-%COMP%]{margin-left:auto;flex:0 0 auto}.filter-group[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:4px;min-width:160px}.filter-group--text[_ngcontent-%COMP%]{flex:1 1 200px;
1min-width:200px;max-width:280px}.filter-label[_ngcontent-%COMP%]{font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:#64748b}.filter-select[_ngcontent-%COMP%], .filter-input[_ngcontent-%COMP%]{width:100%;padding:6px 10px;border:1px solid #e2e8f0;border-radius:6px;background:#fff;color:#0f172a;font-size:.8125rem;transition:border-color .15s ease,box-shadow .15s ease}.filter-select[_ngcontent-%COMP%]:focus, .filter-input[_ngcontent-%COMP%]:focus{outline:none;border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.range-chips[_ngcontent-%COMP%]{display:inline-flex;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden;background:#fff}.range-btn[_ngcontent-%COMP%]{padding:6px 12px;background:transparent;border:none;border-right:1px solid #e2e8f0;cursor:pointer;font-size:.8125rem;color:#64748b;transition:background .15s ease,color .15s ease}.range-btn[_ngcontent-%COMP%]:last-child{border-right:none}.range-btn[_ngcontent-%COMP%]:hover{background:#f8fafc;color:#334155}.range-btn.active[_ngcontent-%COMP%]{background:#2563eb;color:#fff;font-weight:600}.load-error[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:8px 14px;background:#fee2e2;color:#991b1b;border:1px solid #fca5a5;border-radius:8px;font-size:.8125rem;font-weight:500}.rules-card[_ngcontent-%COMP%]{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:0 16px;overflow:hidden}.empty-state[_ngcontent-%COMP%]{padding:48px 24px;display:flex;flex-direction:column;align-items:center;gap:12px;color:#64748b}.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{font-size:1.75rem;color:#22c55e}.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;font-size:.9375rem;text-align:center;line-height:1.5}.empty-state[_ngcontent-%COMP%] .empty-clear[_ngcontent-%COMP%]{margin-left:6px;background:transparent;border:none;color:#2563eb;cursor:pointer;font:inherit;text-decoration:underline;padding:0;transition:color .15s ease}.empty-state[_ngcontent-%COMP%] .empty-clear[_ngcontent-%COMP%]:hover{color:#1d4ed8}.rule-list[_ngcontent-%COMP%]{display:flex;flex-direction:column}.rule-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:110px 160px 1fr 160px 80px 1.4fr 130px;gap:10px;align-items:center;padding:10px 4px;border-bottom:1px solid #f1f5f9;font-size:.8125rem;color:#334155}.rule-row--no-location[_ngcontent-%COMP%]{grid-template-columns:110px 1fr 160px 80px 1.4fr 130px}.rule-row[_ngcontent-%COMP%]:last-child{border-bottom:none}.rule-row--header[_ngcontent-%COMP%]{color:#64748b;font-size:.6875rem;text-transform:uppercase;letter-spacing:.05em;font-weight:600;padding:8px 4px;border-bottom:1px solid #e2e8f0;cursor:default}.rule-row--data[_ngcontent-%COMP%]{cursor:pointer;transition:background .15s ease}.rule-row--data[_ngcontent-%COMP%]:hover{background:#f8fafc}.col-when[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;color:#475569;font-variant-numeric:tabular-nums}.col-location[_ngcontent-%COMP%]{min-width:0}.col-location[_ngcontent-%COMP%] .location-name[_ngcontent-%COMP%]{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#475569}.col-workflow[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;min-width:0}.col-workflow[_ngcontent-%COMP%] .workflow-name[_ngcontent-%COMP%]{font-weight:600;color:#0f172a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.col-workflow[_ngcontent-%COMP%] .workflow-version[_ngcontent-%COMP%]{font-size:.6875rem;color:#94a3b8;font-variant-numeric:tabular-nums;flex-shrink:0}.col-contact[_ngcontent-%COMP%]{color:#475569;font-variant-numeric:tabular-nums}.col-error[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;min-width:0}.col-error[_ngcontent-%COMP%] .error-text[_ngcontent-%COMP%]{color:#475569;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1 1 auto;min-width:0}.status-pill[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:6px;padding:2px 10px;font-size:.6875rem;font-weight:700;letter-spacing:.04em;border-radius:999px;white-space:nowrap;flex-shrink:0;border:1px solid currentColor}.status-pill__dot[_ngcontent-%COMP%]{width:6px;height:6px;border-radius:50%;background:currentColor}.status-pill--failed[_ngcontent-%COMP%]{background:#ef444414;color:#dc2626}.status-pill--partial[_ngcontent-%COMP%]{background:#f59e0b1a;color:#b45309}.status-pill--stuck[_ngcontent-%COMP%]{background:#f59e0b29;color:#b45309;animation:_ngcontent-%COMP%_stuck-pulse 2.4s ease-in-out infinite}@keyframes _ngcontent-%COMP%_stuck-pulse{0%,to{box-shadow:0 0 #f59e0b00}50%{box-shadow:0 0 0 3px #f59e0b2e}}.page-header__stuck[_ngcontent-%COMP%]{color:#b45309;font-weight:600}.trigger-pill[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:4px;font-size:.6875rem;padding:2px 8px;border-radius:999px;background:#f1f5f9;color:#334155;border:1px solid #e2e8f0;white-space:nowrap;max-width:160px;overflow:hidden;text-overflow:ellipsis}.trigger-pill[_ngcontent-%COMP%] i[_ngcontent-%COMP%]{color:#64748b;font-size:.625rem;flex-shrink:0}.badge[_ngcontent-%COMP%]{display:inline-flex;align-items:center;padding:1px 6px;font-size:.625rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;border-radius:4px}.badge--test[_ngcontent-%COMP%]{background:#fef3c7;color:#92400e}.col-actions[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px;justify-content:flex-end}.btn[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:6px;padding:7px 12px;font-size:.8125rem;font-weight:600;border-radius:6px;border:1px solid transparent;cursor:pointer;text-decoration:none;transition:background .15s ease,border-color .15s ease,color .15s ease}.btn[_ngcontent-%COMP%]:disabled{opacity:.5;cursor:not-allowed}.btn--small[_ngcontent-%COMP%]{padding:5px 10px;font-size:.75rem}.btn--secondary[_ngcontent-%COMP%]{background:#fff;color:#334155;border-color:#e2e8f0}
1.btn--secondary[_ngcontent-%COMP%]:hover:not(:disabled){background:#f8fafc;border-color:#cbd5e1;color:#0f172a}@media (max-width: 600px){.failed-runs[_ngcontent-%COMP%]{padding:16px 12px}.page-header[_ngcontent-%COMP%]{flex-direction:column;align-items:flex-start}.filter-bar[_ngcontent-%COMP%]{flex-direction:column;align-items:stretch}.filter-bar__refresh[_ngcontent-%COMP%]{margin-left:0}.filter-group[_ngcontent-%COMP%]{min-width:0;width:100%}.filter-group--text[_ngcontent-%COMP%]{max-width:none}.range-chips[_ngcontent-%COMP%]{width:100%}.range-chips[_ngcontent-%COMP%] .range-btn[_ngcontent-%COMP%]{flex:1 1 0}.rule-row--header[_ngcontent-%COMP%]{display:none}.rule-row[_ngcontent-%COMP%]{grid-template-columns:1fr auto;grid-template-areas:"when actions" "location location" "workflow workflow" "trigger contact" "error error";column-gap:12px;row-gap:6px;padding:12px 4px}.rule-row--no-location[_ngcontent-%COMP%]{grid-template-columns:1fr auto;grid-template-areas:"when actions" "workflow workflow" "trigger contact" "error error"}.rule-row[_ngcontent-%COMP%] .col-when[_ngcontent-%COMP%]{grid-area:when}.rule-row[_ngcontent-%COMP%] .col-location[_ngcontent-%COMP%]{grid-area:location}.rule-row[_ngcontent-%COMP%] .col-workflow[_ngcontent-%COMP%]{grid-area:workflow}.rule-row[_ngcontent-%COMP%] .col-trigger[_ngcontent-%COMP%]{grid-area:trigger}.rule-row[_ngcontent-%COMP%] .col-contact[_ngcontent-%COMP%]{grid-area:contact;justify-self:end}.rule-row[_ngcontent-%COMP%] .col-error[_ngcontent-%COMP%]{grid-area:error;flex-wrap:wrap}.rule-row[_ngcontent-%COMP%] .col-actions[_ngcontent-%COMP%]{grid-area:actions;justify-self:end}.col-error[_ngcontent-%COMP%] .error-text[_ngcontent-%COMP%]{white-space:normal;overflow:visible;text-overflow:clip;word-break:break-word}.trigger-pill[_ngcontent-%COMP%]{max-width:none}}'],changeDetection:0})}}return r})()}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.