@preventive/triage 1.0.0-alpha.40 → 1.0.0-alpha.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/out/view.js CHANGED
@@ -1,4 +1,4 @@
1
- import{a as xt,b as Le,c as zd,d as Tn}from"./chunk-UN5ZSYLE.js";import{a as Hd}from"./chunk-KEX2ATEW.js";import{$ as Di,$a as et,$b as zc,$c as Xi,A as fl,Aa as Bi,Ab as Gt,Ac as ed,Ad as Fd,B as gl,Ba as Zl,Bb as $c,Bc as td,Bd as Dd,C as bl,Ca as ec,Cb as xc,Cc as id,D as vl,Da as tc,Db as Sc,Dc as kt,Dd as Zt,E as yl,Ea as an,Eb as Cc,Ec as rd,Ed as Od,F as _l,Fa as ic,Fb as Vi,Fc as nd,Fd as Qi,G as wl,Ga as Vt,Gb as Ki,Gc as sd,Gd as Bd,H as kl,Ha as ln,Hb as Ec,Hc as od,Hd as $t,I as $l,Ia as rc,Ib as Tc,Ic as ad,Id as Nd,J as xl,Ja as de,Jb as Rc,Jc as ld,Jd as fe,K as Fi,Ka as D,Kb as Lc,Kc as Xt,Kd as qd,L as me,La as yt,Lb as Mc,Lc as cd,Ld as St,M as Sl,Ma as Ni,Mb as Wt,Mc as dd,N as Cl,Na as cn,Nb as pn,Nc as ud,O as El,Oa as nc,Ob as Pc,Oc as Sn,P as Tl,Pa as sc,Pb as Ac,Pc as pd,Q as Rl,Qa as oc,Qb as Gi,Qc as hd,R as Je,Ra as ac,Rb as Wi,Rc as Oe,S as Ll,Sa as Kt,Sb as Ic,Sc as md,T as Ml,Ta as _t,Tb as Fc,U as bt,Ua as lc,Ub as hn,V as Pl,Va as wt,Vb as Dc,W as vt,Wa as zi,Wb as mn,X as Al,Xa as dn,Xb as fn,Y as Il,Ya as cc,Yb as Oc,Yc as fd,Z as Fl,Za as dc,Zb as Bc,Zc as Be,_ as Dl,_a as qi,_b as Nc,_c as tt,a as Ja,aa as Ol,ab as uc,ac as qc,ad as Cn,b as Xa,ba as Bl,bb as pc,bc as Yt,bd as it,c as Qa,ca as Nl,cb as hc,cc as gn,cd as gd,d as Za,da as qt,dc as Hc,dd as bd,e as el,ea as Ht,ec as Uc,ed as vd,f as on,fa as zl,fc as jc,fd as yd,g as Ai,ga as ql,gb as mc,gc as bn,gd as _d,h as l,ha as Hl,hb as fc,hc as vn,hd as wd,i as H,ia as Ul,ic as Vc,id as kd,j as nl,ja as Oi,jc as Kc,jd as $d,k as sl,ka as jl,kc as yn,kd as xd,l as ol,la as Vl,lc as _n,ld as Qt,m as al,ma as Xe,mc as Gc,md as En,n as he,na as Kl,nc as Wc,nd as Sd,o as Ii,oa as Gl,ob as un,oc as Yc,od as Cd,p as ll,pa as Qe,pb as Hi,pc as Jt,pd as $,qa as Wl,qb as gc,qc as Yi,ra as Yl,rb as xe,rc as Jc,sa as Ut,sb as bc,sc as Xc,sd as Ed,t as cl,ta as De,tb as Ui,tc as Qc,td as Td,u as dl,ua as Ze,ub as ji,uc as Ji,ud as Rd,v as ul,va as Jl,vb as vc,vc as wn,vd as Ld,w as pl,wa as Xl,wb as yc,wc as kn,wd as Md,x as ke,xa as $e,xb as _c,xc as $n,xd as Pd,y as hl,ya as jt,yb as wc,yc as Zc,yd as Ad,z as ml,za as Ql,zb as kc,zc as xn,zd as Id}from"./chunk-MYDDTA7W.js";import{a as Ei}from"./chunk-2KBF5TZ7.js";import{b as Ta}from"./chunk-K3X5EJBQ.js";import{a as $a,b as R,c as xa,d as Ge,g as q,h as Y,i as Ca}from"./chunk-CVVJAXVY.js";import{B as gt,D as tl,K as il,O as rl,c as ja,d as we,e as Ye,f as Va,j as Pi,k as Ka,n as Ga,r as Wa,u as Ya}from"./chunk-VIHGO77Y.js";import{u as Ha,z as Ua}from"./chunk-RFZQQXSG.js";import{d as ca,p as ma,q as fa}from"./chunk-RSHMVYNS.js";import{A as _a,B as wa,D as Nt,E as tn,I as rn,M as ka,b as Xr,ba as Ci,c as Qr,d as j,ea as Ea,k as xi,l as ba,m as Zr,n as Ve,q as va,t as en,v as Si,w as ya,y as K,z as Re}from"./chunk-XYDGU6BM.js";import{f as ga}from"./chunk-UYAXVRVL.js";import"./chunk-NRPC74AM.js";import"./chunk-VQJCXGIY.js";import{f as X}from"./chunk-W4J3MGLB.js";import"./chunk-GJ4IUCNS.js";import"./chunk-PNHBZGDD.js";import{$ as E,A as Ri,C as G,D as ft,G as zt,H as We,J as Li,O as Fe,P as Aa,R as Ia,S as Fa,V as Da,W as Oa,Y as Ba,a as I,aa as oe,b as _e,c as mt,da as Na,e as Ra,ea as za,f as nn,fa as Mi,g as Ti,ga as qa,o as sn,p as La,r as Ma,z as Pa}from"./chunk-UXNUAIIC.js";import"./chunk-R5O6FAW4.js";import{b as Sa,d as ht}from"./chunk-CMQA4DM6.js";import{g as ha}from"./chunk-4F6JSF57.js";import"./chunk-V3ME6FI5.js";import{e as pt,h as Ke}from"./chunk-YVZH5SHP.js";import"./chunk-4XCDFGDP.js";import"./chunk-3BZ7JERB.js";import{a as le}from"./chunk-TZ5KB2Y5.js";import"./chunk-XYFXXB2G.js";import{a as J}from"./chunk-DIJJNTRH.js";import{a as ki,g as $i,h as ua,j as Yr,l as pa,n as Jr}from"./chunk-WZDTZE64.js";import{B as wi,I as oa,J as aa,L as la,a as yi,b as Qo,e as Zo,f as ea,g as ta,j as ia,k as ra,l as na,m as _i,p as sa,v as Bt}from"./chunk-GNXOKIGP.js";import"./chunk-C4Z6ZBXV.js";import{a as M,b as ut,c as a,d as ye,e as Go,g as m,i as Wo,j as U}from"./chunk-2XUEZHIP.js";import{b as da}from"./chunk-TUII34K2.js";import{c as Yo,e as Jo,f as Xo,k as gi,p as bi,t as vi}from"./chunk-V5O7M2YT.js";import"./chunk-OOJM4CTU.js";var Ud={attach:{title:"Synced triage on report attach",intro:"have triage from your workspace that disagrees with your local view on",trailingNote:"Other findings in this report whose chain value didn't conflict were applied automatically; this list only covers disagreements. Pick which side to keep.",importedSideLabel:"Apply from chain",applyButton:"Apply"},chain:{title:"Triage conflict from peer update",intro:"were changed by a peer (or by another tab) in a way that disagrees with your local triage on",trailingNote:`Other findings whose remote value didn't conflict were applied automatically; this list only covers disagreements. Pick which side to keep for each \u2014 a "keep current" pick re-publishes your local value to the chain on your next save.`,importedSideLabel:"Apply from chain",applyButton:"Apply"}};function jd(){xl(async(i,e,t)=>{let r=cl(i);try{return await Al(i,r,Ud[t]??Ud.attach)}catch{let n=i.length;return alert(`${t==="attach"?"A report attach":"A workspace sync"} had ${n} triage disagreement${n===1?"":"s"} with your local view. Kept your local values because another dialog is open. ${t==="attach"?"Detach and re-attach the report to pick again.":"Your local values will re-publish to the chain on the next change."}`),null}})}var Rn=class extends q{static properties={retry:{type:Boolean},_value:{state:!0}};constructor(){super(),this.retry=!1,this._value=""}_finish(e){this._value="",super._finish(e)}_onCancel=()=>this._finish(null);_onInput=e=>{this._value=e.target.value};_onSubmit=()=>{let e=this._value??"";e&&this._finish(e)};_onKeydown=e=>{e.key==="Enter"&&(e.preventDefault(),this._onSubmit())};render(){let e=(this._value??"").length>0,t=this.retry?"That password didn't match. Try again, or cancel to leave the workspace unsynced for now.":"This sync server requires a password before it accepts a new workspace. Enter it to create the workspace on the server.";return a`<dialog @close="${this._onClose}"><header><h3>Sync server password</h3></header><p class="nwd-intro">${t}</p><input type="password" class="nwd-input" placeholder="Password" autocomplete="off" data-1p-ignore="true" data-lpignore="true" data-bwignore="true" data-form-type="other" name="dv-sync-auth" maxlength="4096" .value="${this._value}" @input="${this._onInput}" @keydown="${this._onKeydown}"><footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" ?disabled="${!e}" @click="${this._onSubmit}">${this.retry?"Retry":"Authenticate"}</button></footer></dialog>`}};customElements.define("sync-auth-dialog",Rn);function Vd({retry:i=!1}={}){return Y("sync-auth-dialog",{retry:!!i})}function Kd(){$l(async({retry:i})=>{try{return await Vd({retry:i})}catch(e){return console.warn("Sync auth dialog failed to open:",e),null}})}var Zi="https://triage.space/",Nh=[{hostname:"deepaudit.dev",pathPrefix:"/",supportsSync:!0},{hostname:"chalker.github.io",pathPrefix:"/deepview/",supportsSync:!1}];function zh(){for(let i of Nh)if(location.hostname===i.hostname&&location.pathname.startsWith(i.pathPrefix))return i;return null}var qh=["deepview.triage","deepview.triage.pending"],Hh="deepview.repoUrls";function Uh(){try{for(let i of qh)if(localStorage.getItem(i))return!0}catch{return!0}try{let i=localStorage.getItem(Hh);if(i){let e=JSON.parse(i);if(e&&typeof e=="object"&&Object.keys(e).length>0)return!0}}catch{return!0}return!1}async function jh(){if(Uh())return!0;let i=[];try{i=await gt()}catch{return!0}if(i.length>0)return!0;try{if(he().length>0)return!0}catch{return!0}try{return await il()}catch{return!0}}var Ln=class extends U{static properties={supportsSync:{attribute:!1}};createRenderRoot(){return this}constructor(){super(),this.supportsSync=!1}firstUpdated(){let e=this.querySelector("dialog");e&&e.showModal();let t=this.querySelector("button.om-stay");t&&t.focus()}_finish(e){if(this._settled)return;this._settled=!0;let t=this.querySelector("dialog");t&&t.close(),this.dispatchEvent(new CustomEvent("resolve",{detail:e}))}_onClose=()=>this._finish(!1);_onStay=()=>this._finish(!1);_onMigrate=()=>this._finish(!0);render(){let e=()=>a`<a class="om-link" href="${Zi}" target="_blank" rel="noopener noreferrer">${Zi}</a>`;return a`<dialog class="origin-migration-dialog" @close="${this._onClose}"><header class="om-head"><h3>This deepview build has moved</h3><p><code>${location.host}${location.pathname}</code> has moved to ${e()}.</p></header><section class="om-body"><p>Workspaces and reports don't migrate automatically — they live in this origin's browser storage (OPFS where available, localStorage as a fallback) and have to be re-imported on ${e()}.</p>${this.supportsSync?a`<p>For each workspace, use the <strong>Export workspace</strong> button in the sidebar to download a <code>.gz</code> bundle (workspace + its reports + its triage), then drop that file on ${e()}. Workspaces that had sync configured will pick their triage state back up from the sync server once you re-import them with the same key.</p><p>For triage attached to loose reports (or as a top-up after re-importing workspaces), call <code>DeepView.export()</code> in the browser console — that downloads just the triage entries plus saved repo URLs, no reports or workspaces.</p>`:a`<p>This build has no sync layer. For each workspace, use the <strong>Export workspace</strong> button in the sidebar to download a <code>.gz</code> bundle (workspace + its reports + its triage), then drop that file on ${e()}.</p><p>For triage attached to loose reports, call <code>DeepView.export()</code> in the browser console — that downloads just the triage entries plus saved repo URLs, no reports or workspaces. Reports themselves need to be re-dropped from their original JSON on the new origin.</p>`}</section><footer class="om-actions"><button type="button" class="om-stay" @click="${this._onStay}">Keep editing on ${location.host}</button> <button type="button" class="primary om-go" @click="${this._onMigrate}">Switch to triage.space</button></footer></dialog>`}};customElements.define("origin-migration-dialog",Ln);function Vh(i){return new Promise(e=>{let t=document.createElement("origin-migration-dialog");t.supportsSync=i.supportsSync,t.addEventListener("resolve",r=>{t.remove(),e(!!r.detail)}),document.body.append(t)})}async function Gd(){let i=zh();return i?await jh()?await Vh(i)?(location.assign(Zi),!0):!1:(location.replace(Zi),!0):!1}var Mn=class extends q{static styles=[...q.styles,M(Ml)];static properties={encoded:{type:String},_stage:{state:!0},_password:{state:!0},_name:{state:!0},_decoded:{state:!0},_existingById:{state:!0},_busy:{state:!0},_error:{state:!0},_settled:{state:!0}};constructor(){super(),this.encoded="",this._stage="password",this._password="",this._name="",this._decoded=null,this._existingById=null,this._busy=!1,this._error="",this._settled=!1}focusInitial(){this._focusActiveInput()}updated(e){e.has("_stage")&&this._focusActiveInput()}_focusActiveInput(){if(this._stage==="password")this.renderRoot.querySelector('input[type="password"]')?.focus();else if(this._stage==="name"){let e=this.renderRoot.querySelector('input[data-role="name"]');e&&(e.focus(),e.select())}}_finish(e){this._settled||(this._decoded=null,this._password="",this.encoded="",super._finish(e))}_onClose=()=>this._finish(null);_onCancel=()=>this._finish(null);_onPasswordInput=e=>{this._password=e.target.value,this._error=""};_onNameInput=e=>{this._name=e.target.value};_onUnlock=async()=>{if(!(!this._password||this._busy)){this._busy=!0,this._error="";try{let e=await bl({encoded:this.encoded,password:this._password});if(this._settled)return;let t=he().find(r=>r.id===e.id)??null;this._decoded=e,this._existingById=t,this._name=e.name,this._password="",this._stage="name"}catch(e){if(this._settled)return;this._error=e?.message??String(e)}finally{this._busy=!1}}};_onAttach=()=>{if(!this._decoded)return;let e=Ii(this._name);if(!e)return;let t=he().find(r=>r.id===this._decoded.id)??null;if(t){this._existingById=t;return}this._nameCollision(e)||this._finish({id:this._decoded.id,name:e,privateKeyBase64:this._decoded.privateKeyBase64})};_nameCollision(e){if(!e||!this._decoded)return null;for(let t of he())if(t.id!==this._decoded.id&&Ii(t.name)===e)return t;return null}_onKeydown=e=>{e.key==="Enter"&&(e.preventDefault(),this._stage==="password"?this._onUnlock():this._stage==="name"&&this._onAttach())};_passwordStage(){return a`<p class="nwd-note ui-hint">Someone shared a workspace with you. Enter the password they sent separately to attach it to this browser.</p><label class="wsl-field"><span>Password</span> <input type="password" class="nwd-input" autocomplete="off" data-1p-ignore="true" data-lpignore="true" data-bwignore="true" data-form-type="other" name="dv-share-link-unlock" maxlength="1024" .value="${this._password}" @input="${this._onPasswordInput}" @keydown="${this._onKeydown}"></label> ${this._error?a`<p class="wsl-error" role="alert">${this._error}</p>`:m}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" ?disabled="${!this._password||this._busy}" @click="${this._onUnlock}">${this._busy?"Unlocking\u2026":"Unlock"}</button></footer>`}_alreadyAttachedStage(){let e=this._existingById;return a`<p class="nwd-note">This workspace is already attached as <strong>"${e?.name??""}"</strong>. Open it from the sidebar.</p><footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" class="primary" @click="${this._onCancel}">Close</button></footer>`}_nameStage(){if(this._existingById)return this._alreadyAttachedStage();let e=Ii(this._name),t=this._nameCollision(e),r=!!e&&!t;return a`<p class="nwd-note ui-hint">Pick a name for the workspace on this device. The shared identity is preserved either way — only the visible label changes.</p><label class="wsl-field"><span>Workspace name</span> <input type="text" class="nwd-input" data-role="name" placeholder="Workspace name" maxlength="200" .value="${this._name}" @input="${this._onNameInput}" @keydown="${this._onKeydown}"></label> ${t?a`<p class="wsl-error" role="alert">A workspace named "${e}" already exists on this device. Pick a different name.</p>`:m}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" ?disabled="${!r}" @click="${this._onAttach}">Attach</button></footer>`}render(){let e=this._stage==="password"?"Attach shared workspace":this._existingById?"Workspace already attached":"Name the workspace";return a`<dialog @close="${this._onClose}"><header><h3>${e}</h3></header>${this._stage==="password"?this._passwordStage():this._nameStage()}</dialog>`}};customElements.define("workspace-unlock-link-dialog",Mn);function Wd({encoded:i}={}){return Ca("workspace-unlock-link-dialog",{encoded:i??""},e=>{e.encoded=""})}var ee=null,er=!1,ei=null;function Kh(i){if(!i)return"Could not unlock. Try again.";switch(i.name??""){case"NotAllowedError":case"AbortError":return"";case"SecurityError":return"The site identity does not match the one this passkey was registered for. If you opened DeepView through a different URL (different subdomain, different port), reload via the original URL.";case"InvalidStateError":return"The passkey state on this device is inconsistent. Try reloading the page or removing and re-creating the passkey.";case"NotSupportedError":return"This browser does not support the WebAuthn PRF extension this site needs. Try a recent Chrome, Safari, or Edge with a platform authenticator.";case"NetworkError":return"A network error prevented the passkey from completing. Check your connection and try again.";case"UnknownError":return"The authenticator returned an unknown error. Try again, or use a different passkey.";default:{let t=i.message??String(i);return t.length>200?t.slice(0,197)+"\u2026":t}}}function Gh(){if(ee)return ee;ee=document.createElement("div"),ee.id="lock-overlay",ee.setAttribute("role","dialog"),ee.setAttribute("aria-modal","true"),ee.setAttribute("aria-label","Unlock DeepView"),ee.innerHTML=`
1
+ import{a as xt,b as Le,c as zd,d as Tn}from"./chunk-D7AF2JXL.js";import{a as Hd}from"./chunk-KEX2ATEW.js";import{$ as Di,$a as et,$b as zc,$c as Xi,A as fl,Aa as Bi,Ab as Gt,Ac as ed,Ad as Fd,B as gl,Ba as Zl,Bb as $c,Bc as td,Bd as Dd,C as bl,Ca as ec,Cb as xc,Cc as id,D as vl,Da as tc,Db as Sc,Dc as kt,Dd as Zt,E as yl,Ea as an,Eb as Cc,Ec as rd,Ed as Od,F as _l,Fa as ic,Fb as Vi,Fc as nd,Fd as Qi,G as wl,Ga as Vt,Gb as Ki,Gc as sd,Gd as Bd,H as kl,Ha as ln,Hb as Ec,Hc as od,Hd as $t,I as $l,Ia as rc,Ib as Tc,Ic as ad,Id as Nd,J as xl,Ja as de,Jb as Rc,Jc as ld,Jd as fe,K as Fi,Ka as D,Kb as Lc,Kc as Xt,Kd as qd,L as me,La as yt,Lb as Mc,Lc as cd,Ld as St,M as Sl,Ma as Ni,Mb as Wt,Mc as dd,N as Cl,Na as cn,Nb as pn,Nc as ud,O as El,Oa as nc,Ob as Pc,Oc as Sn,P as Tl,Pa as sc,Pb as Ac,Pc as pd,Q as Rl,Qa as oc,Qb as Gi,Qc as hd,R as Je,Ra as ac,Rb as Wi,Rc as Oe,S as Ll,Sa as Kt,Sb as Ic,Sc as md,T as Ml,Ta as _t,Tb as Fc,U as bt,Ua as lc,Ub as hn,V as Pl,Va as wt,Vb as Dc,W as vt,Wa as zi,Wb as mn,X as Al,Xa as dn,Xb as fn,Y as Il,Ya as cc,Yb as Oc,Yc as fd,Z as Fl,Za as dc,Zb as Bc,Zc as Be,_ as Dl,_a as qi,_b as Nc,_c as tt,a as Ja,aa as Ol,ab as uc,ac as qc,ad as Cn,b as Xa,ba as Bl,bb as pc,bc as Yt,bd as it,c as Qa,ca as Nl,cb as hc,cc as gn,cd as gd,d as Za,da as qt,dc as Hc,dd as bd,e as el,ea as Ht,ec as Uc,ed as vd,f as on,fa as zl,fc as jc,fd as yd,g as Ai,ga as ql,gb as mc,gc as bn,gd as _d,h as l,ha as Hl,hb as fc,hc as vn,hd as wd,i as H,ia as Ul,ic as Vc,id as kd,j as nl,ja as Oi,jc as Kc,jd as $d,k as sl,ka as jl,kc as yn,kd as xd,l as ol,la as Vl,lc as _n,ld as Qt,m as al,ma as Xe,mc as Gc,md as En,n as he,na as Kl,nc as Wc,nd as Sd,o as Ii,oa as Gl,ob as un,oc as Yc,od as Cd,p as ll,pa as Qe,pb as Hi,pc as Jt,pd as $,qa as Wl,qb as gc,qc as Yi,ra as Yl,rb as xe,rc as Jc,sa as Ut,sb as bc,sc as Xc,sd as Ed,t as cl,ta as De,tb as Ui,tc as Qc,td as Td,u as dl,ua as Ze,ub as ji,uc as Ji,ud as Rd,v as ul,va as Jl,vb as vc,vc as wn,vd as Ld,w as pl,wa as Xl,wb as yc,wc as kn,wd as Md,x as ke,xa as $e,xb as _c,xc as $n,xd as Pd,y as hl,ya as jt,yb as wc,yc as Zc,yd as Ad,z as ml,za as Ql,zb as kc,zc as xn,zd as Id}from"./chunk-WOTMRDM3.js";import{a as Ei}from"./chunk-2KBF5TZ7.js";import{b as Ta}from"./chunk-K3X5EJBQ.js";import{a as $a,b as R,c as xa,d as Ge,g as q,h as Y,i as Ca}from"./chunk-CVVJAXVY.js";import{B as gt,D as tl,K as il,O as rl,c as ja,d as we,e as Ye,f as Va,j as Pi,k as Ka,n as Ga,r as Wa,u as Ya}from"./chunk-VIHGO77Y.js";import{u as Ha,z as Ua}from"./chunk-RFZQQXSG.js";import{d as ca,p as ma,q as fa}from"./chunk-RSHMVYNS.js";import{A as _a,B as wa,D as Nt,E as tn,I as rn,M as ka,b as Xr,ba as Ci,c as Qr,d as j,ea as Ea,k as xi,l as ba,m as Zr,n as Ve,q as va,t as en,v as Si,w as ya,y as K,z as Re}from"./chunk-CLPKNNC7.js";import{f as ga}from"./chunk-UYAXVRVL.js";import"./chunk-NRPC74AM.js";import"./chunk-VQJCXGIY.js";import{f as X}from"./chunk-W4J3MGLB.js";import"./chunk-GJ4IUCNS.js";import"./chunk-PNHBZGDD.js";import{$ as E,A as Ri,C as G,D as ft,G as zt,H as We,J as Li,O as Fe,P as Aa,R as Ia,S as Fa,V as Da,W as Oa,Y as Ba,a as I,aa as oe,b as _e,c as mt,da as Na,e as Ra,ea as za,f as nn,fa as Mi,g as Ti,ga as qa,o as sn,p as La,r as Ma,z as Pa}from"./chunk-UXNUAIIC.js";import"./chunk-R5O6FAW4.js";import{b as Sa,d as ht}from"./chunk-CMQA4DM6.js";import{g as ha}from"./chunk-4F6JSF57.js";import"./chunk-V3ME6FI5.js";import{e as pt,h as Ke}from"./chunk-YVZH5SHP.js";import"./chunk-4XCDFGDP.js";import"./chunk-3BZ7JERB.js";import{a as le}from"./chunk-TZ5KB2Y5.js";import"./chunk-XYFXXB2G.js";import{a as J}from"./chunk-DIJJNTRH.js";import{a as ki,g as $i,h as ua,j as Yr,l as pa,n as Jr}from"./chunk-WZDTZE64.js";import{B as wi,I as oa,J as aa,L as la,a as yi,b as Qo,e as Zo,f as ea,g as ta,j as ia,k as ra,l as na,m as _i,p as sa,v as Bt}from"./chunk-GNXOKIGP.js";import"./chunk-C4Z6ZBXV.js";import{a as M,b as ut,c as a,d as ye,e as Go,g as m,i as Wo,j as U}from"./chunk-2XUEZHIP.js";import{b as da}from"./chunk-TUII34K2.js";import{c as Yo,e as Jo,f as Xo,k as gi,p as bi,t as vi}from"./chunk-V5O7M2YT.js";import"./chunk-OOJM4CTU.js";var Ud={attach:{title:"Synced triage on report attach",intro:"have triage from your workspace that disagrees with your local view on",trailingNote:"Other findings in this report whose chain value didn't conflict were applied automatically; this list only covers disagreements. Pick which side to keep.",importedSideLabel:"Apply from chain",applyButton:"Apply"},chain:{title:"Triage conflict from peer update",intro:"were changed by a peer (or by another tab) in a way that disagrees with your local triage on",trailingNote:`Other findings whose remote value didn't conflict were applied automatically; this list only covers disagreements. Pick which side to keep for each \u2014 a "keep current" pick re-publishes your local value to the chain on your next save.`,importedSideLabel:"Apply from chain",applyButton:"Apply"}};function jd(){xl(async(i,e,t)=>{let r=cl(i);try{return await Al(i,r,Ud[t]??Ud.attach)}catch{let n=i.length;return alert(`${t==="attach"?"A report attach":"A workspace sync"} had ${n} triage disagreement${n===1?"":"s"} with your local view. Kept your local values because another dialog is open. ${t==="attach"?"Detach and re-attach the report to pick again.":"Your local values will re-publish to the chain on the next change."}`),null}})}var Rn=class extends q{static properties={retry:{type:Boolean},_value:{state:!0}};constructor(){super(),this.retry=!1,this._value=""}_finish(e){this._value="",super._finish(e)}_onCancel=()=>this._finish(null);_onInput=e=>{this._value=e.target.value};_onSubmit=()=>{let e=this._value??"";e&&this._finish(e)};_onKeydown=e=>{e.key==="Enter"&&(e.preventDefault(),this._onSubmit())};render(){let e=(this._value??"").length>0,t=this.retry?"That password didn't match. Try again, or cancel to leave the workspace unsynced for now.":"This sync server requires a password before it accepts a new workspace. Enter it to create the workspace on the server.";return a`<dialog @close="${this._onClose}"><header><h3>Sync server password</h3></header><p class="nwd-intro">${t}</p><input type="password" class="nwd-input" placeholder="Password" autocomplete="off" data-1p-ignore="true" data-lpignore="true" data-bwignore="true" data-form-type="other" name="dv-sync-auth" maxlength="4096" .value="${this._value}" @input="${this._onInput}" @keydown="${this._onKeydown}"><footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" ?disabled="${!e}" @click="${this._onSubmit}">${this.retry?"Retry":"Authenticate"}</button></footer></dialog>`}};customElements.define("sync-auth-dialog",Rn);function Vd({retry:i=!1}={}){return Y("sync-auth-dialog",{retry:!!i})}function Kd(){$l(async({retry:i})=>{try{return await Vd({retry:i})}catch(e){return console.warn("Sync auth dialog failed to open:",e),null}})}var Zi="https://triage.space/",Nh=[{hostname:"deepaudit.dev",pathPrefix:"/",supportsSync:!0},{hostname:"chalker.github.io",pathPrefix:"/deepview/",supportsSync:!1}];function zh(){for(let i of Nh)if(location.hostname===i.hostname&&location.pathname.startsWith(i.pathPrefix))return i;return null}var qh=["deepview.triage","deepview.triage.pending"],Hh="deepview.repoUrls";function Uh(){try{for(let i of qh)if(localStorage.getItem(i))return!0}catch{return!0}try{let i=localStorage.getItem(Hh);if(i){let e=JSON.parse(i);if(e&&typeof e=="object"&&Object.keys(e).length>0)return!0}}catch{return!0}return!1}async function jh(){if(Uh())return!0;let i=[];try{i=await gt()}catch{return!0}if(i.length>0)return!0;try{if(he().length>0)return!0}catch{return!0}try{return await il()}catch{return!0}}var Ln=class extends U{static properties={supportsSync:{attribute:!1}};createRenderRoot(){return this}constructor(){super(),this.supportsSync=!1}firstUpdated(){let e=this.querySelector("dialog");e&&e.showModal();let t=this.querySelector("button.om-stay");t&&t.focus()}_finish(e){if(this._settled)return;this._settled=!0;let t=this.querySelector("dialog");t&&t.close(),this.dispatchEvent(new CustomEvent("resolve",{detail:e}))}_onClose=()=>this._finish(!1);_onStay=()=>this._finish(!1);_onMigrate=()=>this._finish(!0);render(){let e=()=>a`<a class="om-link" href="${Zi}" target="_blank" rel="noopener noreferrer">${Zi}</a>`;return a`<dialog class="origin-migration-dialog" @close="${this._onClose}"><header class="om-head"><h3>This deepview build has moved</h3><p><code>${location.host}${location.pathname}</code> has moved to ${e()}.</p></header><section class="om-body"><p>Workspaces and reports don't migrate automatically — they live in this origin's browser storage (OPFS where available, localStorage as a fallback) and have to be re-imported on ${e()}.</p>${this.supportsSync?a`<p>For each workspace, use the <strong>Export workspace</strong> button in the sidebar to download a <code>.gz</code> bundle (workspace + its reports + its triage), then drop that file on ${e()}. Workspaces that had sync configured will pick their triage state back up from the sync server once you re-import them with the same key.</p><p>For triage attached to loose reports (or as a top-up after re-importing workspaces), call <code>DeepView.export()</code> in the browser console — that downloads just the triage entries plus saved repo URLs, no reports or workspaces.</p>`:a`<p>This build has no sync layer. For each workspace, use the <strong>Export workspace</strong> button in the sidebar to download a <code>.gz</code> bundle (workspace + its reports + its triage), then drop that file on ${e()}.</p><p>For triage attached to loose reports, call <code>DeepView.export()</code> in the browser console — that downloads just the triage entries plus saved repo URLs, no reports or workspaces. Reports themselves need to be re-dropped from their original JSON on the new origin.</p>`}</section><footer class="om-actions"><button type="button" class="om-stay" @click="${this._onStay}">Keep editing on ${location.host}</button> <button type="button" class="primary om-go" @click="${this._onMigrate}">Switch to triage.space</button></footer></dialog>`}};customElements.define("origin-migration-dialog",Ln);function Vh(i){return new Promise(e=>{let t=document.createElement("origin-migration-dialog");t.supportsSync=i.supportsSync,t.addEventListener("resolve",r=>{t.remove(),e(!!r.detail)}),document.body.append(t)})}async function Gd(){let i=zh();return i?await jh()?await Vh(i)?(location.assign(Zi),!0):!1:(location.replace(Zi),!0):!1}var Mn=class extends q{static styles=[...q.styles,M(Ml)];static properties={encoded:{type:String},_stage:{state:!0},_password:{state:!0},_name:{state:!0},_decoded:{state:!0},_existingById:{state:!0},_busy:{state:!0},_error:{state:!0},_settled:{state:!0}};constructor(){super(),this.encoded="",this._stage="password",this._password="",this._name="",this._decoded=null,this._existingById=null,this._busy=!1,this._error="",this._settled=!1}focusInitial(){this._focusActiveInput()}updated(e){e.has("_stage")&&this._focusActiveInput()}_focusActiveInput(){if(this._stage==="password")this.renderRoot.querySelector('input[type="password"]')?.focus();else if(this._stage==="name"){let e=this.renderRoot.querySelector('input[data-role="name"]');e&&(e.focus(),e.select())}}_finish(e){this._settled||(this._decoded=null,this._password="",this.encoded="",super._finish(e))}_onClose=()=>this._finish(null);_onCancel=()=>this._finish(null);_onPasswordInput=e=>{this._password=e.target.value,this._error=""};_onNameInput=e=>{this._name=e.target.value};_onUnlock=async()=>{if(!(!this._password||this._busy)){this._busy=!0,this._error="";try{let e=await bl({encoded:this.encoded,password:this._password});if(this._settled)return;let t=he().find(r=>r.id===e.id)??null;this._decoded=e,this._existingById=t,this._name=e.name,this._password="",this._stage="name"}catch(e){if(this._settled)return;this._error=e?.message??String(e)}finally{this._busy=!1}}};_onAttach=()=>{if(!this._decoded)return;let e=Ii(this._name);if(!e)return;let t=he().find(r=>r.id===this._decoded.id)??null;if(t){this._existingById=t;return}this._nameCollision(e)||this._finish({id:this._decoded.id,name:e,privateKeyBase64:this._decoded.privateKeyBase64})};_nameCollision(e){if(!e||!this._decoded)return null;for(let t of he())if(t.id!==this._decoded.id&&Ii(t.name)===e)return t;return null}_onKeydown=e=>{e.key==="Enter"&&(e.preventDefault(),this._stage==="password"?this._onUnlock():this._stage==="name"&&this._onAttach())};_passwordStage(){return a`<p class="nwd-note ui-hint">Someone shared a workspace with you. Enter the password they sent separately to attach it to this browser.</p><label class="wsl-field"><span>Password</span> <input type="password" class="nwd-input" autocomplete="off" data-1p-ignore="true" data-lpignore="true" data-bwignore="true" data-form-type="other" name="dv-share-link-unlock" maxlength="1024" .value="${this._password}" @input="${this._onPasswordInput}" @keydown="${this._onKeydown}"></label> ${this._error?a`<p class="wsl-error" role="alert">${this._error}</p>`:m}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" ?disabled="${!this._password||this._busy}" @click="${this._onUnlock}">${this._busy?"Unlocking\u2026":"Unlock"}</button></footer>`}_alreadyAttachedStage(){let e=this._existingById;return a`<p class="nwd-note">This workspace is already attached as <strong>"${e?.name??""}"</strong>. Open it from the sidebar.</p><footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" class="primary" @click="${this._onCancel}">Close</button></footer>`}_nameStage(){if(this._existingById)return this._alreadyAttachedStage();let e=Ii(this._name),t=this._nameCollision(e),r=!!e&&!t;return a`<p class="nwd-note ui-hint">Pick a name for the workspace on this device. The shared identity is preserved either way — only the visible label changes.</p><label class="wsl-field"><span>Workspace name</span> <input type="text" class="nwd-input" data-role="name" placeholder="Workspace name" maxlength="200" .value="${this._name}" @input="${this._onNameInput}" @keydown="${this._onKeydown}"></label> ${t?a`<p class="wsl-error" role="alert">A workspace named "${e}" already exists on this device. Pick a different name.</p>`:m}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" ?disabled="${!r}" @click="${this._onAttach}">Attach</button></footer>`}render(){let e=this._stage==="password"?"Attach shared workspace":this._existingById?"Workspace already attached":"Name the workspace";return a`<dialog @close="${this._onClose}"><header><h3>${e}</h3></header>${this._stage==="password"?this._passwordStage():this._nameStage()}</dialog>`}};customElements.define("workspace-unlock-link-dialog",Mn);function Wd({encoded:i}={}){return Ca("workspace-unlock-link-dialog",{encoded:i??""},e=>{e.encoded=""})}var ee=null,er=!1,ei=null;function Kh(i){if(!i)return"Could not unlock. Try again.";switch(i.name??""){case"NotAllowedError":case"AbortError":return"";case"SecurityError":return"The site identity does not match the one this passkey was registered for. If you opened DeepView through a different URL (different subdomain, different port), reload via the original URL.";case"InvalidStateError":return"The passkey state on this device is inconsistent. Try reloading the page or removing and re-creating the passkey.";case"NotSupportedError":return"This browser does not support the WebAuthn PRF extension this site needs. Try a recent Chrome, Safari, or Edge with a platform authenticator.";case"NetworkError":return"A network error prevented the passkey from completing. Check your connection and try again.";case"UnknownError":return"The authenticator returned an unknown error. Try again, or use a different passkey.";default:{let t=i.message??String(i);return t.length>200?t.slice(0,197)+"\u2026":t}}}function Gh(){if(ee)return ee;ee=document.createElement("div"),ee.id="lock-overlay",ee.setAttribute("role","dialog"),ee.setAttribute("aria-modal","true"),ee.setAttribute("aria-label","Unlock DeepView"),ee.innerHTML=`
2
2
  <div class="lock-overlay-card">
3
3
  <div class="lock-overlay-icon" aria-hidden="true">
4
4
  <svg viewBox="0 0 32 32" width="40" height="40" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="7" y="15" width="18" height="12" rx="1.5"/><path d="M11 15v-4a5 5 0 0 1 10 0v4"/></svg>
@@ -31,7 +31,7 @@ Use this only if you have lost access to your passkey and have no other way to u
31
31
  `,xt(e,n=>{n&&(Le(e),this._paint(e,t))})}}disconnectedCallback(){for(let e of this.renderRoot.querySelectorAll(".evd-chunk[data-watched]"))Le(e);clearTimeout(this._copiedTimer),super.disconnectedCallback()}_onCopy=async()=>{let e="done";try{await navigator.clipboard.writeText(this.markdown)}catch{e="failed"}this.isConnected&&(this._copied=e,clearTimeout(this._copiedTimer),this._copiedTimer=setTimeout(()=>{this._copied="",this._copiedTimer=null},1500))};async _paint(e,t){let r=this._chunks[t];if(!r||r.asked)return;r.asked=!0;let n=ou(this._lines,r.start),s=[...n?this._lines.slice(n[0],n[1]):[],...this._lines.slice(r.start,r.end)].join(`
32
32
  `),o=await yt(s,"markdown");if(!this.isConnected)return;let c=o===null?null:Ni(o).slice(n?n[1]-n[0]:0);e.innerHTML=sm(this._lines,r.start,r.end,c?.length===r.end-r.start?c:null),e.classList.remove("evd-pending")}};customElements.define("export-view-dialog",qn);function cu(i){return new Promise(e=>{let t=document.createElement("export-view-dialog");t.markdown=i;let r=()=>{t.remove(),e()};t.addEventListener("resolve",r),t.addEventListener("modal-conflict",r),document.body.append(t)})}var du=`dialog{max-width:560px;width:min(94vw,560px)}header h3{margin:0 0 .4rem}.finding{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;margin-bottom:.35rem}.loc{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.76rem;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}.desc{font-size:.78rem;color:var(--muted);margin:0 0 .7rem;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.input-row{display:flex;align-items:stretch;gap:.4rem}input{flex:1;min-width:0;padding:.5rem .65rem;border:1px solid var(--border);border-radius:var(--ui-radius, 6px);background:var(--bg, var(--surface));color:var(--text);font:inherit;font-size:.88rem;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;&:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgb(from var(--accent) r g b / .18)}&::placeholder{color:var(--muted);font-family:inherit}}.open{display:inline-flex;align-items:center;padding:0 .7rem;border:1px solid var(--accent);border-radius:var(--ui-radius, 6px);color:var(--accent);text-decoration:none;font-size:.8rem;font-weight:600;white-space:nowrap;&:hover{background:rgb(from var(--accent) r g b / .1)}}.hint{margin:.45rem 0 0;color:var(--muted);font-size:.74rem}
33
33
  `;var Hn=class extends q{static styles=[...q.styles,M(bt),M(du)];static properties={initial:{attribute:!1},finding:{attribute:!1},canApplyToGroup:{attribute:!1},_value:{state:!0}};constructor(){super(),this.initial="",this.finding=null,this.canApplyToGroup=!1,this._value=""}beforeOpen(){this._value=this.initial??""}focusInitial(){let e=this.renderRoot.querySelector('input[type="url"]');if(e){e.focus();try{e.select()}catch{}}}_onInput=e=>{this._value=e.target.value};get _trimmed(){return(this._value??"").trim()}_onSave=()=>{let e=(this.initial??"").trim();if(this._trimmed===e){this._finish(null);return}this._finish({value:this._trimmed,scope:"finding"})};_onApplyToGroup=()=>{this._trimmed&&this._finish({value:this._trimmed,scope:"group"})};_onClear=()=>this._finish({value:"",scope:"finding"});_onCancel=()=>this._finish(null);_onKeydown=e=>{e.key==="Enter"&&(e.preventDefault(),this._onSave())};render(){let e=this.finding??{},t=e.file?e.line?`${e.file}:${e.line}`:e.file:"",r=(this.initial??"").length>0,n=this._trimmed,s=wi(n);return a`<dialog @close="${this._onClose}"><header><h3>${r?"Edit fix link":"Add fix link"}</h3><div class="finding">${vt(_i(e,l.severityMode))} ${t?a`<span class="loc" data-tooltip-truncated data-tooltip="${t}">${t}</span>`:m}</div>${e.description?a`<div class="desc" data-tooltip-truncated data-tooltip="${e.description}">${e.description}</div>`:m}</header><div class="input-row"><input type="url" inputmode="url" autocomplete="off" spellcheck="false" placeholder="https://github.com/owner/repo/pull/123" .value="${this._value}" @input="${this._onInput}" @keydown="${this._onKeydown}"> ${s?a`<a class="open" href="${n}" target="_blank" rel="noopener noreferrer">Open ↗</a>`:m}</div><p class="hint">PR URL, issue link, commit, or any free-form reference. Enter to save, Esc to cancel.</p><footer class="nwd-actions">${r?a`<button type="button" class="danger" @click="${this._onClear}">Clear</button>`:m} <span class="nwd-spacer"></span> ${this.canApplyToGroup?a`<button type="button" class="quiet" ?disabled="${!n}" @click="${this._onApplyToGroup}">Apply to whole group</button> <span class="nwd-spacer"></span>`:m} <button type="button" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" @click="${this._onSave}">Save</button></footer></dialog>`}};customElements.define("fix-link-dialog",Hn);function uu({initial:i="",finding:e=null,canApplyToGroup:t=!1}={}){return Y("fix-link-dialog",{initial:i,finding:e,canApplyToGroup:t})}var pu=`dialog{width:min(94vw,880px);max-width:880px}.conflicts-list{list-style:none;display:flex;flex-direction:column;gap:.6rem;max-height:65vh;overflow-y:auto;overscroll-behavior:contain}.conflict-card{padding:.6rem .7rem;border:1px solid var(--border);border-radius:var(--ui-radius, 6px)}.finding-meta{display:flex;flex-wrap:wrap;align-items:center;gap:.4rem;color:var(--muted);font-size:.72rem}.location,code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;overflow-wrap:anywhere}.location{flex:1}h4{margin:.4rem 0 .55rem;font-size:.88rem;font-weight:600;overflow-wrap:anywhere}dt{margin-top:.5rem;color:var(--muted);font-size:.72rem}.variant{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,15rem);gap:.65rem;padding:.4rem 0;font-size:.8rem;+&{border-top:1px solid var(--border)}}.value{white-space:pre-wrap;overflow-wrap:anywhere}.reports{display:flex;flex-wrap:wrap;place-content:start flex-end;gap:.3rem}.report-button{display:inline-flex;align-items:center;gap:.4rem;max-width:100%;min-height:22px;padding:0 .4rem 0 0;border:1px solid var(--border);border-radius:var(--ui-radius, 4px);overflow:hidden;background:var(--bg);color:var(--text);font:inherit;font-size:.72rem;cursor:default;text-align:left;>span:last-child{min-width:0;overflow-wrap:anywhere}&:hover{border-color:var(--accent)}}
34
- `;var lm={revalidate:"Outcome",revalidateVerdict:"Explanation",revalidateRecommendation:"Recommendation"},Un=class extends q{static styles=[...q.styles,M(bt),M($t),M(pu)];static properties={conflicts:{attribute:!1}};constructor(){super(),this.conflicts=[]}render(){return a`<dialog aria-labelledby="revalidation-conflicts-title" @close="${this._onClose}"><header><h3 id="revalidation-conflicts-title">Revalidation conflicts</h3><p class="nwd-intro">Reports disagree about ${this.conflicts.length} finding${this.conflicts.length===1?"":"s"}. App view is unavailable until the conflicting reports are separated or updated.</p></header><ul class="conflicts-list">${this.conflicts.map(({finding:e,copies:t})=>a`<li class="conflict-card"><div class="finding-meta">${vt(e.severity)} ${e.file?a`<span class="location">${e.file}${Fe(e.line)?`:${Aa(Fe(e.line))}`:""}</span>`:m} <code>${Ba(e.id)??e.id}</code></div><h4>${Bt(e)}</h4><dl>${Vl(t).map(({field:r,variants:n})=>a`<dt>${lm[r]??r}</dt>${n.map(({value:s,reports:o})=>a`<dd class="variant"><div class="value">${s||a`<em>Empty</em>`}</div><div class="reports">${o.map(c=>c?a`<button type="button" class="report-button" aria-label="${`Open ${Qr(c)} at this finding`}" @click="${()=>this._finish({id:e.id,reportName:c})}">${J(Xr[Ll(c)]??Xr.default)}<span>${Qr(c)}</span></button>`:a`<span>Loaded report</span>`)}</div></dd>`)}`)}</dl></li>`)}</ul><footer class="nwd-actions"><span class="nwd-spacer"></span><button type="button" @click="${this._onClose}">Close</button></footer></dialog>`}};customElements.define("revalidation-conflicts-dialog",Un);function hu(i){return Y("revalidation-conflicts-dialog",{conflicts:[...i.values()]})}var mu=2;function fu(i,e){l.focusSplit=e,i.closest(".focus-main")?.style.setProperty("--focus-split",String(e)),i.setAttribute("aria-valuenow",String(Math.round(e)))}function gu(){try{localStorage.setItem(Xa,String(l.focusSplit))}catch{}}function bu(i,e){fu(i,on(e)),gu()}function vu(i,e){bu(i,l.focusSplit+e)}function yu(i){bu(i,el)}function _u(i,e){let t=i.closest(".focus-main");if(!t)return;e.preventDefault(),i.classList.add("dragging");try{i.setPointerCapture(e.pointerId)}catch{}let r=s=>{let o=t.getBoundingClientRect();o.width!==0&&fu(i,on((s.clientX-o.left)/o.width*100))},n=()=>{i.removeEventListener("pointermove",r),i.removeEventListener("pointerup",n),i.removeEventListener("pointercancel",n),i.classList.remove("dragging"),gu()};i.addEventListener("pointermove",r),i.addEventListener("pointerup",n),i.addEventListener("pointercancel",n)}function cm(i,e){return jl(Oi(i)).map(t=>e?[$e(t)]:Xl(t))}var dm={annotation(i){let e=Ze(i),t=Jl(i);return!e&&!t?null:{triage:e?.triage,color:e?.color,comment:e?.comment,fix:e?.fix,flagged:e?.flagged===!0,ignored:t}},location:i=>Li(i,jt(i)),evidence:(i,e,t)=>Ia(i,e,jt(e),t),commit:i=>Da(i.repo?.github,i.commitHash),report:i=>i._reportName??null};function um(i,e){let t=new Set(i.map(s=>s.repo??null)),r=t.size===1?[...t][0]:null;if(r)return r;let n=new Set;for(let s of e)for(let o of s)o.repo?.github&&!Ri(o.file)&&n.add(o.repo.github);return n.size===1?[...n][0]:n.size===0&&!l.currentWorkspace&&l.repoUrl?l.repoUrl:null}function jn(i){return i.replace(/\.(?:json|md|codex)$/iu,"")}function wu(){return l.currentWorkspace?he().find(i=>i.id===l.currentWorkspace)??null:null}function pm(i,e){if(e)return e.name;let t=i.map(n=>n.fileName);return t.length===1?jn(t[0]):zt(t).replace(/[-_. ]+$/u,"")||`${t.length} reports`}function Vn({oneSamplePerGroup:i=!1}={}){let e=l.reports,t=zl(),r=Bn(),n=cm(r,i),s=wu(),o=e.flatMap(d=>d.groups??[]),c=o.some(d=>d.some(na)),u=o.some(d=>d.some(Ma));return oa({title:pm(e,s),workspace:s?.name??null,reports:e.map(d=>({name:d.fileName,source:d.source})),repo:um(e,n),generatedAt:new Date,view:{bucket:Nn(),severityMode:c?l.severityMode:null,revalidation:u?l.showRevalidation:null,revalidationDetail:u&&l.showRevalidation!==!1?Wl():null},filters:On(t),counts:{included:n.length,total:r.length},groups:n},dm)}function hm(){let i=wu(),e=l.reports.map(r=>r.fileName),t="";return i?t=i.name:e.length===1?t=jn(e[0]):e.length>1&&(t=jn(zt(e))),t=t.replaceAll(/[\\/:*?"<>|\p{Cc}]/gu,"-").trim(),`${t||"deepview-report"}.md`}function ku(i){if(l.reports.length===0)return;let e=new Blob([Vn(i)],{type:"text/markdown;charset=utf-8"});Ge(e,hm())}function rr(i){return!H()||!me.active||!l.currentManagedTeam?null:me.navigate(Jr({view:i,teamId:l.currentManagedTeam,reportId:l.currentManagedReport},l.managedTeams))}var Xn=!1;nl(()=>{if(Xn)return;Xn=!0;let i=2;function e(){--i===0&&mm()}requestAnimationFrame(e),setTimeout(e,350)});function mm(){Xn=!1,l.findingIndexTick++,l.currentView==="bundles"&&l.selectedBundle?$():l.currentView==="packages"?$():l.currentView==="repositories"?$():l.currentView==="links"?$():(l.currentView==="findings"||l.currentView==="files")&&(fe().catch(()=>{}),$())}var Kn=!1;sl(()=>{l.currentView!=="findings"&&l.currentView!=="files"&&!Xe()||Kn||(Kn=!0,queueMicrotask(()=>{Kn=!1,!(l.currentView!=="findings"&&l.currentView!=="files"&&!Xe())&&(l.bundleHashTick++,$())}))});dl(()=>{l.linksTick++,$()});function $u(){l.currentView==="bundles"&&l.bundleDetailsTab==="graph"?$d():Sd()}function lr(){l.currentView==="bundles"&&l.bundleDetailsTab==="graph"?xd():Cd()}function ti(){let i=document.querySelector(".bundle-source-code-wrap"),e=i?.scrollTop??0,t=i?.scrollLeft??0;$();let r=document.querySelector(".bundle-source-code-wrap");r&&(r.scrollTop=e,r.scrollLeft=t)}function rt(i){let t=document.querySelector(i)?.scrollTop??0;$();let r=document.querySelector(i);r&&(r.scrollTop=t)}function Me(){l.viewMode==="table"?rt(".findings-table-list"):$()}var Gn=0;function xu(){Gn||(Gn=requestAnimationFrame(()=>{Gn=0,$()}))}function B(i,e){for(let t of i.composedPath())if(t?.matches?.(e))return t;return null}function or(i,e){queueMicrotask(()=>{let t=document.querySelector(`.bundle-source-lineno-row[data-line="${i}"]`);t&&t.scrollIntoView(e)})}function Ru(i){i.classList.add("copied"),setTimeout(()=>i.classList.remove("copied"),1e3)}function nr(i,e){try{navigator.clipboard.writeText(e).then(()=>(Ru(i),null)).catch(()=>{})}catch{}}function Lu(i){let e=gn(l.bundleCodeHistory,l.bundleDetails?.integrity??null,l.bundleSourceFile);l.bundleCodeHistory=Hc(e,i),l.bundleSourceFile=i}function Wn(i=!1){queueMicrotask(()=>{let e=document.querySelector(".bundle-source-code-wrap");e&&(e.scrollTop=0,e.scrollLeft=0),i&&e?.querySelector(".bundle-source-code")?.focus({preventScroll:!0})})}window.addEventListener("hashchange",()=>{if(!H()||ga()||l.currentView!=="bundles"||l.bundleDetailsTab!=="code")return;let i=pa(new URL(location.href));if(i?.bundleTab!=="code"||i.file==null||i.file!==xc(l)?.file)return;let e=l.bundleSourceFile,t=i.endLine??i.line;l.bundleSourceTargetLine=i.line&&t<=ya(Si(l.bundleDetails).get(e)??"")?{bundle:l.bundleDetails?.integrity??null,path:e,line:i.line,...i.endLine?{end:i.endLine}:{}}:null,$(),l.bundleSourceTargetLine&&or(i.line,{block:"center"})});function Mu(i){let e=i.target.closest("[data-bundle-source-line]");if(e){let o=Number(e.dataset.bundleSourceLine),c=l.bundleDetails?.integrity??null,u=l.bundleSourceFile,d=l.bundleSourceTargetLine,p=d?.bundle===c&&d.path===u?d:null;if(i.shiftKey&&p){let h=p.anchor??p.line;l.bundleSourceTargetLine={bundle:c,path:u,line:Math.min(h,o),end:Math.max(h,o),anchor:h}}else p?.line===o&&!(p.end>o)?l.bundleSourceTargetLine=null:l.bundleSourceTargetLine={bundle:c,path:u,line:o};return ti(),!0}let t=i.target.closest("[data-bundle-source-wrap]");if(t){let o=Ac(t);l.bundleSourceWrap=!l.bundleSourceWrap;try{localStorage.setItem(Za,String(l.bundleSourceWrap))}catch{}return $(),queueMicrotask(o),!0}if(i.target.closest("[data-bundle-source-pretty]"))return Yt(),$(),Wn(),!0;let r=i.target.closest("[data-bundle-code-history]");if(r){let o=gn(l.bundleCodeHistory,l.bundleDetails?.integrity??null,l.bundleSourceFile),c=Uc(o,r.dataset.bundleCodeHistory==="back"?-1:1),u=c.files[c.at];return c.at===o.at||!Si(l.bundleDetails).has(u)||(l.bundleCodeHistory=c,l.bundleSourceFile=u,l.bundleSourceFindingIdx=null,l.bundleCodeSearchMode="files",l.bundleCodeSearchQuery="",rt(".bundle-code-rail-body"),Qt(),Wn()),!0}let n=i.target.closest("[data-bundle-source-link]");if(n){let o=n.dataset.bundleSourceLink,c=n.closest(".focus-pane-code");if(c){let u=ii(i),d=pc(u,c.dataset.focusCodeIntegrity,c.dataset.focusCodeFile,o);return d&&(ts(u,d),queueMicrotask(()=>c.querySelector(".focus-code-source")?.focus({preventScroll:!0}))),!0}return Si(l.bundleDetails).has(o)&&(l.currentView==="bundles"&&l.bundleDetailsTab==="search"&&(_t("code",{preserveSource:!0}),l.selectedBundle&&Be(l.selectedBundle,"code",{push:!0})),Lu(o),l.bundleSourceFindingIdx=null,l.bundleDetailsTab==="code"&&(l.bundleCodeSearchMode="files",l.bundleCodeSearchQuery=""),rt(".bundle-code-rail-body"),Qt(),Wn(!0)),!0}if(i.target.classList?.contains("bundle-source-overlay")||i.target.closest('[data-action="bundle-source-close"]'))return l.bundleSourceFile&&(_t(l.bundleDetailsTab),$()),!0;if(i.target.closest('[data-action="bundle-source-panel-close"]'))return l.bundleSourceFindingIdx!=null&&(l.bundleSourceFindingIdx=null,ti()),!0;let s=i.target.closest("[data-bundle-source-finding]");if(s){let o=parseInt(s.dataset.bundleSourceFinding,10);return Number.isFinite(o)&&(l.bundleSourceFindingIdx=l.bundleSourceFindingIdx===o?null:o,ti()),!0}return!1}function Su(i){let e=ii(i);if(!e)return null;let t=$e(e);return Oa(t,Ql(t))}R.addEventListener("click",i=>{if(B(i,"[data-finding-history]")){let w=ii(i),C=w&&$e(w);Sl(C)&&Dd(C);return}let e=B(i,"[data-code-nav-file]");if(e){ts(ii(i),{integrity:e.dataset.codeNavIntegrity,file:e.dataset.codeNavFile,range:Fe(e.dataset.codeNavLine)});return}let t=B(i,"[data-code-history]");if(t){gm(t.dataset.codeHistory==="forward"?1:-1);return}let r=B(i,"[data-code-preview]");if(r){let w=r.dataset.codePreview,C=new Set(l.codePreviews);C.delete(w)||C.add(w),l.codePreviews=C,$();return}let n=B(i,"[data-finding-code-report]");if(n&&H()){Xd({reportId:n.dataset.findingCodeReport,file:n.dataset.findingCodeFile,line:n.dataset.findingCodeLine});return}let s=B(i,"[data-finding-code-bundle]");if(s){let w=s.dataset.findingCodeBundle,C=s.dataset.findingCodeFile,P=s.dataset.findingCodeLine,L=P?parseInt(P,10):null;l.bundleSourceFile=C||null,l.bundleCodeHistory=null,l.bundleSourceFindingIdx=null,(l.bundleDetailsTab==="code"||l.bundleDetailsTab==="search")&&(l.bundleDetailsTab="overview");let V=()=>{Number.isFinite(L)&&or(L,{block:"start",behavior:"instant"})};if(l.selectedBundle===w&&l.bundleDetails?.integrity===w){$(),zi().then(()=>(l.selectedBundle===w&&l.bundleSourceFile===C&&V(),null));return}l.selectedBundle=w,l.selectedBundleWorkspace=null,l.bundleDetails=null,$(),(async()=>(await wt(w),V()))();return}let o=i.target.closest("[data-package-expand]");if(o){let w=o.dataset.packageExpand;l.expandedPackages.has(w)?l.expandedPackages.delete(w):l.expandedPackages.add(w),$();return}let c=i.target.closest("[data-package-row-issues]");if(c){let w=c.dataset.packageRowIssues,C=c.dataset.packageRowIssuesVersion;l.selectedPackage=w,l.selectedPackageVersion=C||null,l.packageDetailsTab="issues",l.packageSlideTriage=null,l.packageSlideTransient=!0,$();return}let u=i.target.closest("[data-repository-row-issues]");if(u){let w=u.dataset.repositoryRowIssues;l.selectedRepository=w,l.repositoryDetailsTab="issues",l.repositorySlideTriage=null,l.repositorySlideTransient=!0,$();return}let d=i.target.closest("[data-select-package]");if(d){let w=d.dataset.selectPackage,C=d.dataset.selectPackageVersion??"",P=C===""?null:C;if(l.selectedPackage===w&&l.selectedPackageVersion===P)return;l.selectedPackage=w,l.selectedPackageVersion=P,l.packageDetailsTab="overview",l.packageSlideTriage=null,l.packageSlideTransient=!1,$();return}if(i.target.closest("[data-deselect-package]")){l.selectedPackage=null,l.selectedPackageVersion=null,$();return}let p=i.target.closest("[data-package-tab]");if(p){let w=p.dataset.packageTab;(w==="overview"||w==="issues")&&l.packageDetailsTab!==w&&(l.packageDetailsTab=w,$());return}if(i.target.closest('[data-action="package-slide-back"]')){l.packageDetailsTab="overview",l.packageSlideTriage=null,l.packageSlideTransient&&(l.selectedPackage=null,l.selectedPackageVersion=null,l.packageSlideTransient=!1),$();return}let h=B(i,"[data-links-report][data-links-finding]");if(h){i.preventDefault();let{linksReport:w,linksFinding:C,managedReport:P}=h.dataset;w&&C&&(async()=>{let L=await Tn(C,w,P);L.ok||alert(L.reason)})().catch(L=>console.warn("links: reveal in report failed:",L));return}let f=i.target.closest("[data-package-report]");if(f){let w=f.dataset.packageReport;w&&tt(w);return}let b=i.target.closest("[data-select-repository]");if(b){let w=b.dataset.selectRepository;if(l.selectedRepository===w)return;l.selectedRepository=w,l.repositoryDetailsTab="overview",l.repositorySlideTriage=null,l.repositorySlideTransient=!1,$();return}if(i.target.closest("[data-deselect-repository]")){l.selectedRepository=null,$();return}let v=i.target.closest("[data-repository-tab]");if(v){let w=v.dataset.repositoryTab;(w==="overview"||w==="issues")&&l.repositoryDetailsTab!==w&&(l.repositoryDetailsTab=w,$());return}if(i.target.closest('[data-action="repository-slide-back"]')){l.repositoryDetailsTab="overview",l.repositorySlideTriage=null,l.repositorySlideTransient&&(l.selectedRepository=null,l.repositorySlideTransient=!1),$();return}let g=i.target.closest("[data-bundle-tab]");if(g){let w=g.dataset.bundleTab;if(ki.has(w)||w==="review"&&l.bundleDetails?.npm){if(w===l.bundleDetailsTab){l.selectedBundle&&Be(l.selectedBundle,w);return}l.bundleDetailsTab==="graph"&&w!=="graph"&&(oe(),document.body.classList.remove("report-fullscreen")),Sc(l,w,C=>Kc(C)?.oldVersion??null),_t(w),l.selectedBundle&&Be(l.selectedBundle,w,{push:!0}),$(),w==="code"&&zi().then(()=>(l.bundleDetailsTab==="code"&&Qt(),null))}return}if(i.target.closest("[data-bundle-retry-sources]")){l.bundleDetails&&delete l.bundleDetails.sourceError,$();return}let y=i.target.closest("[data-bundle-download]");if(y){let w=y.dataset.bundleDownload,C=(l.bundles??[]).find(P=>P.integrity===w);if(!C)return;(async()=>{let{confirmed:P}=await Qd({name:C.name,encrypted:we()});if(P)try{let L=await rl(w);Ge(new Blob([L],{type:"application/octet-stream"}),C.name)}catch(L){alert(`Failed to download bundle: ${L.message}`)}})();return}let k=i.target.closest("[data-bundle-export-sbom]");if(k){let w=k.dataset.bundleExportSbom,C=l.bundleDetails,P=(l.bundles??[]).find(L=>L.integrity===l.selectedBundle);if(!P||!C||C.integrity!==P.integrity)return;try{let L=w==="cyclonedx",V=L?bd(C,P):vd(C,P),ae=`${gd(P.name)}.${L?"cdx":"spdx"}.json`;Ge(new Blob([V],{type:"application/json"}),ae)}catch(L){alert(`Failed to export ${w==="cyclonedx"?"CycloneDX":"SPDX"}: ${L.message}`)}return}if(B(i,"[data-bundle-search-context]")){l.bundleSearchContext=!l.bundleSearchContext,rt(".bundle-search-results");return}if(i.target.closest("[data-advisories-consent]")){wd(),$();return}if(i.target.closest("[data-advisories-retry]")){kd(l.bundleDetails,$).catch(()=>{}),$();return}let x=i.target.closest("[data-bundle-issue-report]");if(x){let w=x.dataset.bundleIssueReport;w&&tt(w);return}if(Mu(i))return;let S=i.target.closest("[data-bundle-code-issue-step]");if(S){let w=S.closest("[data-bundle-code-issue-order]"),C=null;try{C=JSON.parse(w?.dataset.bundleCodeIssueOrder??"null")}catch{}if(Array.isArray(C)&&C.length>0){let P=S.dataset.bundleCodeIssueStep==="-1"?-1:1,L=C.findIndex(ae=>ae.idx===l.bundleSourceFindingIdx),V=L===-1?P>0?C[0]:C.at(-1):C[(L+P+C.length)%C.length];l.bundleSourceFindingIdx=V.idx,ti(),V.line>0&&or(V.line,{block:"center",behavior:"smooth"})}return}let T=B(i,"[data-bundle-view-source]");if(T){let w=T.dataset.bundleViewSource;if(!w)return;let C=T.dataset.bundleViewFindingIdx,P=C===void 0?null:parseInt(C,10),L=T.dataset.bundleViewLine,V=L?parseInt(L,10):null;Number.isFinite(V)&&(l.bundleSourcePretty=!1);let ae=l.bundleSourceFile!==w;if(Lu(w),Number.isFinite(P)?l.bundleSourceFindingIdx=P:ae&&(l.bundleSourceFindingIdx=null),l.bundleSourceTargetLine=Number.isFinite(V)?{bundle:l.bundleDetails?.integrity??null,path:w,line:V}:null,T.closest(".bundle-code-rail")?rt(".bundle-code-rail-body"):T.closest(".bundle-search-results")?rt(".bundle-search-results"):T.closest(".bundles-slide-body")?rt(".bundles-slide-body"):$(),Number.isFinite(V)){let ve=T.dataset.bundleViewScrollBlock||"center";zi().then(()=>(l.bundleSourceFile===w&&or(V,{block:ve,behavior:"smooth"}),null))}return}let F=i.target.closest('[data-action="workspace-reports"], [data-action="workspace-bundles"]');if(F){let w=F.dataset.action.slice(10);l.currentView!==`workspace-${w}`&&Xi(l.currentManagedTeam??l.currentWorkspace,w);return}if(i.target.closest('[data-action="workspace-findings"]')){if(l.currentView==="findings")return;if(l.currentView==="files"){if(rr("findings"))return;l.currentView="findings",l.filesSelectedFile=null,document.body.classList.remove("report-fullscreen"),$()}else H()?Cn(l.managedTeams.find(w=>w.id===l.currentManagedTeam)):it(l.currentWorkspace);return}let O=i.target.closest("[data-workspace-report]");if(O){H()?Cn(l.managedTeams.find(w=>w.id===l.currentManagedTeam),O.dataset.workspaceReport):tt(O.dataset.workspaceReport,void 0,{workspaceId:l.currentWorkspace});return}let A=i.target.closest("[data-workspace-bundle]");if(A){if(H())me.navigate(Jr({view:"bundles",teamId:l.currentManagedTeam,bundleId:A.dataset.workspaceBundle,bundleTab:"overview"},l.managedTeams));else{let w=A.dataset.workspaceBundle;Kt(w,"overview",{workspaceId:l.currentWorkspace}),Be(w,"overview"),$(),fe(),wt(w)}return}if(i.target.closest('[data-action="toggle-files"]')){if(rr(l.currentView==="files"?"findings":"files"))return;if(l.currentView==="workspace-reports"||l.currentView==="workspace-bundles"){l.currentView="files",it(l.currentWorkspace);return}l.currentView==="files"?l.currentView="findings":(l.viewMode==="graph"&&oe(),l.currentView="files"),document.body.classList.remove("report-fullscreen"),$();return}let Z=B(i,"[data-g2-pkg]");if(Z){let w=Z.dataset.g2Pkg;E.solo=E.solo===w?null:w,E.solo&&(E.selected=null),$u(),lr(),E.graphState?.requestDraw?.();return}let re=B(i,"[data-g2-select]");if(re){E.selected=re.dataset.g2Select,$u(),E.graphState?.requestDraw?.();return}let ne=B(i,"[data-g2-top-pkgs]");if(ne){E.topPkgsTab=ne.dataset.g2TopPkgs,lr();return}let jr=B(i,"[data-g2-jump-findings]");if(jr){if(l.currentView==="bundles"){l.bundleDetailsTab==="graph"&&oe(),_t("issues"),l.selectedBundle&&Be(l.selectedBundle,"issues",{push:!0}),$();return}if(Bl(),l.filterConfMin=0,l.filterInclude=jr.dataset.g2JumpFindings,l.currentView="findings",l.viewMode==="graph"&&(l.viewMode="table"),oe(),rr("findings"))return;$();return}let se=B(i,"[data-g2-jump-file]");if(se){let w=se.dataset.g2JumpFile;oe();let C=()=>requestAnimationFrame(()=>{let L=document.querySelector(`#${qa(w)}`);L&&L.scrollIntoView({behavior:"smooth",block:"start"})}),P=rr("files");if(P){P.then(L=>L?C():void 0);return}l.currentView="files",$(),C();return}if(B(i,"#g2-path-filter-clear")){E.pathFilter="";let w=document.querySelector("graph-layout")?.shadowRoot?.querySelector("#g2-path-filter");w&&(w.value=""),E.graphState?.requestDraw?.();return}if(B(i,"#g2-fullscreen")){document.body.classList.toggle("report-fullscreen");return}if(B(i,"[data-g2-show-all]")){E.showAll=!E.showAll,E.layoutCache=null,E.selected=null,oe(),$();return}if(B(i,"[data-g2-packages-view]")){E.bundleLayout==="flow"?E.flowPackagesView=!E.flowPackagesView:E.bundleLayout==="dependencies"?(E.dependencyPackagesView=!E.dependencyPackagesView,E.solo=null):E.packagesView=!E.packagesView,E.layoutCache=null,E.selected=null,E.focusedPkg=null,oe(),$();return}if(B(i,"[data-g2-bundle-issues]")){E.bundleIssues=!E.bundleIssues,oe({keepViewport:!0}),$();return}let Dt=B(i,"[data-g2-layout]");if(Dt){let w=Dt.dataset.g2Layout;if(!["graph","layers","matrix","dependencies","flow"].includes(w)||E.bundleLayout===w&&!E.focusedPkg)return;E.bundleLayout=w,w==="dependencies"&&(E.dependencyPackagesView=!1),E.layoutCache=null,E.selected=null,E.solo=null,E.focusedPkg=null,oe(),$();return}let hi=B(i,".graph2-triage-selector [data-triage-show]");if(hi){let w=hi.dataset.triageShow;l.shownTriage=l.shownTriage===w?null:w,E.layoutCache=null,E.selected=null,oe(),$();return}let mi=B(i,"[data-g2-focus-pkg]");if(mi){E.focusedPkg=mi.dataset.g2FocusPkg,E.layoutCache=null,oe(),$();return}if(B(i,"#g2-back-to-full")){E.focusedPkg=null,E.layoutCache=null,(E.packagesView||E.bundleLayout==="layers")&&(E.selected=null),oe(),$();return}let dt=B(i,".tab");if(dt&&B(i,".tabs")){let C=B(i,"[data-gid]").dataset.gid,P=dt.dataset.tid;l.activeTabByGroup.set(C,P),Me();return}let je=B(i,"[data-triage-action]");if(je){let w=je.closest(".triage-menu"),C=w?.dataset.gid;if(!C)return;let P=de(C);if(!P)return;let L=je.dataset.triageAction;if(!["inprogress","fixed","invalid","deleted","ignored","restore"].includes(L))return;let{targets:V,clearing:ae}=tc(P,L);if(V.length===0)return;Pu(V,ae?"untriaged":L);try{w.hidePopover()}catch{}ke(),Me();return}if(B(i,".mark-comment")){let C=B(i,"[data-gid]").dataset.gid,P=de(C);if(!P)return;let L=$e(P);if(!Yl(L))return;if(H()){import("./chunk-B2RQY6OP.js").then(({openManagedCommentsDialog:ve})=>ve(L,Me)).catch(()=>Oe("Could not open comments. Please retry."));return}let V=mt(L),ae=Ze(L)?.comment??"";Yd({initial:ae,finding:L}).then(ve=>(ve===null||!De(L)||(X(l.triage,V,{comment:ve||void 0}),ke(),Me()),null)).catch(()=>{});return}let fi=B(i,".mark-copy");if(fi){let w=Su(i);if(w===null)return;nr(fi,w);return}let zo=B(i,".mark-link");if(zo){let w=B(i,"[data-gid]"),C=w?de(w.dataset.gid):null;if(!C)return;let P=hc($e(C));if(!P)return;nr(zo,P);return}let Kr=B(i,"[data-copy-report]");if(Kr){nr(Kr,Kr.dataset.copyReport);return}let Gr=B(i,"[data-copy-path]");if(Gr){nr(Gr,Gr.dataset.copyPath);return}let qo=B(i,".mark-issue");if(qo&&H()&&l.managedSession&&!l.managedSession.publicShare&&l.currentManagedTeam){let w=B(i,"[data-gid]"),C=w?de(w.dataset.gid):null,P=C?$e(C):null;if(P?._managedReportId&&P.id){i.preventDefault();let L=new URL(qo.dataset.issueForm);Fd({teamId:l.currentManagedTeam,session:{...l.managedSession},context:{reportId:P._managedReportId,findingId:P.id,repository:L.pathname.split("/").slice(1,3).join("/")},formUrl:L.href,title:L.searchParams.get("title")??"",body:L.searchParams.get("body")??"",finding:P,draftOptions:{sourceUrl:Li(P,jt(P)),evidence:Fa(P),showRevalidation:La()},renderBody:vc}).catch(()=>Oe("Could not open issue creation. Please retry."));return}}let Ho=B(i,".mark-claude");if(Ho){let w=Su(i);if(w===null)return;let C=`claude://code/new?q=${encodeURIComponent(`Confirm and fix:
34
+ `;var lm={revalidate:"Outcome",revalidateVerdict:"Explanation",revalidateRecommendation:"Recommendation"},Un=class extends q{static styles=[...q.styles,M(bt),M($t),M(pu)];static properties={conflicts:{attribute:!1}};constructor(){super(),this.conflicts=[]}render(){return a`<dialog aria-labelledby="revalidation-conflicts-title" @close="${this._onClose}"><header><h3 id="revalidation-conflicts-title">Revalidation conflicts</h3><p class="nwd-intro">Reports disagree about ${this.conflicts.length} finding${this.conflicts.length===1?"":"s"}. App view is unavailable until the conflicting reports are separated or updated.</p></header><ul class="conflicts-list">${this.conflicts.map(({finding:e,copies:t})=>a`<li class="conflict-card"><div class="finding-meta">${vt(e.severity)} ${e.file?a`<span class="location">${e.file}${Fe(e.line)?`:${Aa(Fe(e.line))}`:""}</span>`:m} <code>${Ba(e.id)??e.id}</code></div><h4>${Bt(e)}</h4><dl>${Vl(t).map(({field:r,variants:n})=>a`<dt>${lm[r]??r}</dt>${n.map(({value:s,reports:o})=>a`<dd class="variant"><div class="value">${s||a`<em>Empty</em>`}</div><div class="reports">${o.map(c=>c?a`<button type="button" class="report-button" aria-label="${`Open ${Qr(c)} at this finding`}" @click="${()=>this._finish({id:e.id,reportName:c})}">${J(Xr[Ll(c)]??Xr.default)}<span>${Qr(c)}</span></button>`:a`<span>Loaded report</span>`)}</div></dd>`)}`)}</dl></li>`)}</ul><footer class="nwd-actions"><span class="nwd-spacer"></span><button type="button" @click="${this._onClose}">Close</button></footer></dialog>`}};customElements.define("revalidation-conflicts-dialog",Un);function hu(i){return Y("revalidation-conflicts-dialog",{conflicts:[...i.values()]})}var mu=2;function fu(i,e){l.focusSplit=e,i.closest(".focus-main")?.style.setProperty("--focus-split",String(e)),i.setAttribute("aria-valuenow",String(Math.round(e)))}function gu(){try{localStorage.setItem(Xa,String(l.focusSplit))}catch{}}function bu(i,e){fu(i,on(e)),gu()}function vu(i,e){bu(i,l.focusSplit+e)}function yu(i){bu(i,el)}function _u(i,e){let t=i.closest(".focus-main");if(!t)return;e.preventDefault(),i.classList.add("dragging");try{i.setPointerCapture(e.pointerId)}catch{}let r=s=>{let o=t.getBoundingClientRect();o.width!==0&&fu(i,on((s.clientX-o.left)/o.width*100))},n=()=>{i.removeEventListener("pointermove",r),i.removeEventListener("pointerup",n),i.removeEventListener("pointercancel",n),i.classList.remove("dragging"),gu()};i.addEventListener("pointermove",r),i.addEventListener("pointerup",n),i.addEventListener("pointercancel",n)}function cm(i,e){return jl(Oi(i)).map(t=>e?[$e(t)]:Xl(t))}var dm={annotation(i){let e=Ze(i),t=Jl(i);return!e&&!t?null:{triage:e?.triage,color:e?.color,comment:e?.comment,fix:e?.fix,flagged:e?.flagged===!0,ignored:t}},location:i=>Li(i,jt(i)),evidence:(i,e,t)=>Ia(i,e,jt(e),t),commit:i=>Da(i.repo?.github,i.commitHash),report:i=>i._reportName??null};function um(i,e){let t=new Set(i.map(s=>s.repo??null)),r=t.size===1?[...t][0]:null;if(r)return r;let n=new Set;for(let s of e)for(let o of s)o.repo?.github&&!Ri(o.file)&&n.add(o.repo.github);return n.size===1?[...n][0]:n.size===0&&!l.currentWorkspace&&l.repoUrl?l.repoUrl:null}function jn(i){return i.replace(/\.(?:json|md|codex)$/iu,"")}function wu(){return l.currentWorkspace?he().find(i=>i.id===l.currentWorkspace)??null:null}function pm(i,e){if(e)return e.name;let t=i.map(n=>n.fileName);return t.length===1?jn(t[0]):zt(t).replace(/[-_. ]+$/u,"")||`${t.length} reports`}function Vn({oneSamplePerGroup:i=!1}={}){let e=l.reports,t=zl(),r=Bn(),n=cm(r,i),s=wu(),o=e.flatMap(d=>d.groups??[]),c=o.some(d=>d.some(na)),u=o.some(d=>d.some(Ma));return oa({title:pm(e,s),workspace:s?.name??null,reports:e.map(d=>({name:d.fileName,source:d.source})),repo:um(e,n),generatedAt:new Date,view:{bucket:Nn(),severityMode:c?l.severityMode:null,revalidation:u?l.showRevalidation:null,revalidationDetail:u&&l.showRevalidation!==!1?Wl():null},filters:On(t),counts:{included:n.length,total:r.length},groups:n},dm)}function hm(){let i=wu(),e=l.reports.map(r=>r.fileName),t="";return i?t=i.name:e.length===1?t=jn(e[0]):e.length>1&&(t=jn(zt(e))),t=t.replaceAll(/[\\/:*?"<>|\p{Cc}]/gu,"-").trim(),`${t||"deepview-report"}.md`}function ku(i){if(l.reports.length===0)return;let e=new Blob([Vn(i)],{type:"text/markdown;charset=utf-8"});Ge(e,hm())}function rr(i){return!H()||!me.active||!l.currentManagedTeam?null:me.navigate(Jr({view:i,teamId:l.currentManagedTeam,reportId:l.currentManagedReport},l.managedTeams))}var Xn=!1;nl(()=>{if(Xn)return;Xn=!0;let i=2;function e(){--i===0&&mm()}requestAnimationFrame(e),setTimeout(e,350)});function mm(){Xn=!1,l.findingIndexTick++,l.currentView==="bundles"&&l.selectedBundle?$():l.currentView==="packages"?$():l.currentView==="repositories"?$():l.currentView==="links"?$():(l.currentView==="findings"||l.currentView==="files")&&(fe().catch(()=>{}),$())}var Kn=!1;sl(()=>{l.currentView!=="findings"&&l.currentView!=="files"&&!Xe()||Kn||(Kn=!0,queueMicrotask(()=>{Kn=!1,!(l.currentView!=="findings"&&l.currentView!=="files"&&!Xe())&&(l.bundleHashTick++,$())}))});dl(()=>{l.linksTick++,$()});function $u(){l.currentView==="bundles"&&l.bundleDetailsTab==="graph"?$d():Sd()}function lr(){l.currentView==="bundles"&&l.bundleDetailsTab==="graph"?xd():Cd()}function ti(){let i=document.querySelector(".bundle-source-code-wrap"),e=i?.scrollTop??0,t=i?.scrollLeft??0;$();let r=document.querySelector(".bundle-source-code-wrap");r&&(r.scrollTop=e,r.scrollLeft=t)}function rt(i){let t=document.querySelector(i)?.scrollTop??0;$();let r=document.querySelector(i);r&&(r.scrollTop=t)}function Me(){l.viewMode==="table"?rt(".findings-table-list"):$()}var Gn=0;function xu(){Gn||(Gn=requestAnimationFrame(()=>{Gn=0,$()}))}function B(i,e){for(let t of i.composedPath())if(t?.matches?.(e))return t;return null}function or(i,e){queueMicrotask(()=>{let t=document.querySelector(`.bundle-source-lineno-row[data-line="${i}"]`);t&&t.scrollIntoView(e)})}function Ru(i){i.classList.add("copied"),setTimeout(()=>i.classList.remove("copied"),1e3)}function nr(i,e){try{navigator.clipboard.writeText(e).then(()=>(Ru(i),null)).catch(()=>{})}catch{}}function Lu(i){let e=gn(l.bundleCodeHistory,l.bundleDetails?.integrity??null,l.bundleSourceFile);l.bundleCodeHistory=Hc(e,i),l.bundleSourceFile=i}function Wn(i=!1){queueMicrotask(()=>{let e=document.querySelector(".bundle-source-code-wrap");e&&(e.scrollTop=0,e.scrollLeft=0),i&&e?.querySelector(".bundle-source-code")?.focus({preventScroll:!0})})}window.addEventListener("hashchange",()=>{if(!H()||ga()||l.currentView!=="bundles"||l.bundleDetailsTab!=="code")return;let i=pa(new URL(location.href));if(i?.bundleTab!=="code"||i.file==null||i.file!==xc(l)?.file)return;let e=l.bundleSourceFile,t=i.endLine??i.line;l.bundleSourceTargetLine=i.line&&t<=ya(Si(l.bundleDetails).get(e)??"")?{bundle:l.bundleDetails?.integrity??null,path:e,line:i.line,...i.endLine?{end:i.endLine}:{}}:null,$(),l.bundleSourceTargetLine&&or(i.line,{block:"center"})});function Mu(i){let e=i.target.closest("[data-bundle-source-line]");if(e){let o=Number(e.dataset.bundleSourceLine),c=l.bundleDetails?.integrity??null,u=l.bundleSourceFile,d=l.bundleSourceTargetLine,p=d?.bundle===c&&d.path===u?d:null;if(i.shiftKey&&p){let h=p.anchor??p.line;l.bundleSourceTargetLine={bundle:c,path:u,line:Math.min(h,o),end:Math.max(h,o),anchor:h}}else p?.line===o&&!(p.end>o)?l.bundleSourceTargetLine=null:l.bundleSourceTargetLine={bundle:c,path:u,line:o};return ti(),!0}let t=i.target.closest("[data-bundle-source-wrap]");if(t){let o=Ac(t);l.bundleSourceWrap=!l.bundleSourceWrap;try{localStorage.setItem(Za,String(l.bundleSourceWrap))}catch{}return $(),queueMicrotask(o),!0}if(i.target.closest("[data-bundle-source-pretty]"))return Yt(),$(),Wn(),!0;let r=i.target.closest("[data-bundle-code-history]");if(r){let o=gn(l.bundleCodeHistory,l.bundleDetails?.integrity??null,l.bundleSourceFile),c=Uc(o,r.dataset.bundleCodeHistory==="back"?-1:1),u=c.files[c.at];return c.at===o.at||!Si(l.bundleDetails).has(u)||(l.bundleCodeHistory=c,l.bundleSourceFile=u,l.bundleSourceFindingIdx=null,l.bundleCodeSearchMode="files",l.bundleCodeSearchQuery="",rt(".bundle-code-rail-body"),Qt(),Wn()),!0}let n=i.target.closest("[data-bundle-source-link]");if(n){let o=n.dataset.bundleSourceLink,c=n.closest(".focus-pane-code");if(c){let u=ii(i),d=pc(u,c.dataset.focusCodeIntegrity,c.dataset.focusCodeFile,o);return d&&(ts(u,d),queueMicrotask(()=>c.querySelector(".focus-code-source")?.focus({preventScroll:!0}))),!0}return Si(l.bundleDetails).has(o)&&(l.currentView==="bundles"&&l.bundleDetailsTab==="search"&&(_t("code",{preserveSource:!0}),l.selectedBundle&&Be(l.selectedBundle,"code",{push:!0})),Lu(o),l.bundleSourceFindingIdx=null,l.bundleDetailsTab==="code"&&(l.bundleCodeSearchMode="files",l.bundleCodeSearchQuery=""),rt(".bundle-code-rail-body"),Qt(),Wn(!0)),!0}if(i.target.classList?.contains("bundle-source-overlay")||i.target.closest('[data-action="bundle-source-close"]'))return l.bundleSourceFile&&(_t(l.bundleDetailsTab),$()),!0;if(i.target.closest('[data-action="bundle-source-panel-close"]'))return l.bundleSourceFindingIdx!=null&&(l.bundleSourceFindingIdx=null,ti()),!0;let s=i.target.closest("[data-bundle-source-finding]");if(s){let o=parseInt(s.dataset.bundleSourceFinding,10);return Number.isFinite(o)&&(l.bundleSourceFindingIdx=l.bundleSourceFindingIdx===o?null:o,ti()),!0}return!1}function Su(i){let e=ii(i);if(!e)return null;let t=$e(e);return Oa(t,Ql(t))}R.addEventListener("click",i=>{if(B(i,"[data-finding-history]")){let w=ii(i),C=w&&$e(w);Sl(C)&&Dd(C);return}let e=B(i,"[data-code-nav-file]");if(e){ts(ii(i),{integrity:e.dataset.codeNavIntegrity,file:e.dataset.codeNavFile,range:Fe(e.dataset.codeNavLine)});return}let t=B(i,"[data-code-history]");if(t){gm(t.dataset.codeHistory==="forward"?1:-1);return}let r=B(i,"[data-code-preview]");if(r){let w=r.dataset.codePreview,C=new Set(l.codePreviews);C.delete(w)||C.add(w),l.codePreviews=C,$();return}let n=B(i,"[data-finding-code-report]");if(n&&H()){Xd({reportId:n.dataset.findingCodeReport,file:n.dataset.findingCodeFile,line:n.dataset.findingCodeLine});return}let s=B(i,"[data-finding-code-bundle]");if(s){let w=s.dataset.findingCodeBundle,C=s.dataset.findingCodeFile,P=s.dataset.findingCodeLine,L=P?parseInt(P,10):null;l.bundleSourceFile=C||null,l.bundleCodeHistory=null,l.bundleSourceFindingIdx=null,(l.bundleDetailsTab==="code"||l.bundleDetailsTab==="search")&&(l.bundleDetailsTab="overview");let V=()=>{Number.isFinite(L)&&or(L,{block:"start",behavior:"instant"})};if(l.selectedBundle===w&&l.bundleDetails?.integrity===w){$(),zi().then(()=>(l.selectedBundle===w&&l.bundleSourceFile===C&&V(),null));return}l.selectedBundle=w,l.selectedBundleWorkspace=null,l.bundleDetails=null,$(),(async()=>(await wt(w),V()))();return}let o=i.target.closest("[data-package-expand]");if(o){let w=o.dataset.packageExpand;l.expandedPackages.has(w)?l.expandedPackages.delete(w):l.expandedPackages.add(w),$();return}let c=i.target.closest("[data-package-row-issues]");if(c){let w=c.dataset.packageRowIssues,C=c.dataset.packageRowIssuesVersion;l.selectedPackage=w,l.selectedPackageVersion=C||null,l.packageDetailsTab="issues",l.packageSlideTriage=null,l.packageSlideTransient=!0,$();return}let u=i.target.closest("[data-repository-row-issues]");if(u){let w=u.dataset.repositoryRowIssues;l.selectedRepository=w,l.repositoryDetailsTab="issues",l.repositorySlideTriage=null,l.repositorySlideTransient=!0,$();return}let d=i.target.closest("[data-select-package]");if(d){let w=d.dataset.selectPackage,C=d.dataset.selectPackageVersion??"",P=C===""?null:C;if(l.selectedPackage===w&&l.selectedPackageVersion===P)return;l.selectedPackage=w,l.selectedPackageVersion=P,l.packageDetailsTab="overview",l.packageSlideTriage=null,l.packageSlideTransient=!1,$();return}if(i.target.closest("[data-deselect-package]")){l.selectedPackage=null,l.selectedPackageVersion=null,$();return}let p=i.target.closest("[data-package-tab]");if(p){let w=p.dataset.packageTab;(w==="overview"||w==="issues")&&l.packageDetailsTab!==w&&(l.packageDetailsTab=w,$());return}if(i.target.closest('[data-action="package-slide-back"]')){l.packageDetailsTab="overview",l.packageSlideTriage=null,l.packageSlideTransient&&(l.selectedPackage=null,l.selectedPackageVersion=null,l.packageSlideTransient=!1),$();return}let h=B(i,"[data-links-report][data-links-finding]");if(h){i.preventDefault();let{linksReport:w,linksFinding:C,managedReport:P}=h.dataset;w&&C&&(async()=>{let L=await Tn(C,w,P);L.ok||alert(L.reason)})().catch(L=>console.warn("links: reveal in report failed:",L));return}let f=i.target.closest("[data-package-report]");if(f){let w=f.dataset.packageReport;w&&tt(w);return}let b=i.target.closest("[data-select-repository]");if(b){let w=b.dataset.selectRepository;if(l.selectedRepository===w)return;l.selectedRepository=w,l.repositoryDetailsTab="overview",l.repositorySlideTriage=null,l.repositorySlideTransient=!1,$();return}if(i.target.closest("[data-deselect-repository]")){l.selectedRepository=null,$();return}let v=i.target.closest("[data-repository-tab]");if(v){let w=v.dataset.repositoryTab;(w==="overview"||w==="issues")&&l.repositoryDetailsTab!==w&&(l.repositoryDetailsTab=w,$());return}if(i.target.closest('[data-action="repository-slide-back"]')){l.repositoryDetailsTab="overview",l.repositorySlideTriage=null,l.repositorySlideTransient&&(l.selectedRepository=null,l.repositorySlideTransient=!1),$();return}let g=i.target.closest("[data-bundle-tab]");if(g){let w=g.dataset.bundleTab;if(ki.has(w)||w==="review"&&l.bundleDetails?.npm){if(w===l.bundleDetailsTab){l.selectedBundle&&Be(l.selectedBundle,w);return}l.bundleDetailsTab==="graph"&&w!=="graph"&&(oe(),document.body.classList.remove("report-fullscreen")),Sc(l,w,C=>Kc(C)?.oldVersion??null),_t(w),l.selectedBundle&&Be(l.selectedBundle,w,{push:!0}),$(),w==="code"&&zi().then(()=>(l.bundleDetailsTab==="code"&&Qt(),null))}return}if(i.target.closest("[data-bundle-retry-sources]")){l.bundleDetails&&delete l.bundleDetails.sourceError,$();return}let y=i.target.closest("[data-bundle-download]");if(y){let w=y.dataset.bundleDownload,C=(l.bundles??[]).find(P=>P.integrity===w);if(!C)return;(async()=>{let{confirmed:P}=await Qd({name:C.name,encrypted:we()});if(P)try{let L=await rl(w);Ge(new Blob([L],{type:"application/octet-stream"}),C.name)}catch(L){alert(`Failed to download bundle: ${L.message}`)}})();return}let k=i.target.closest("[data-bundle-export-sbom]");if(k){let w=k.dataset.bundleExportSbom,C=l.bundleDetails,P=(l.bundles??[]).find(L=>L.integrity===l.selectedBundle);if(!P||!C||C.integrity!==P.integrity)return;try{let L=w==="cyclonedx",V=L?bd(C,P):vd(C,P),ae=`${gd(P.name)}.${L?"cdx":"spdx"}.json`;Ge(new Blob([V],{type:"application/json"}),ae)}catch(L){alert(`Failed to export ${w==="cyclonedx"?"CycloneDX":"SPDX"}: ${L.message}`)}return}if(B(i,"[data-bundle-search-context]")){l.bundleSearchContext=!l.bundleSearchContext,rt(".bundle-search-results");return}if(i.target.closest("[data-advisories-consent]")){wd(),$();return}if(i.target.closest("[data-advisories-retry]")){kd(l.bundleDetails,$).catch(()=>{}),$();return}let x=i.target.closest("[data-bundle-issue-report]");if(x){let w=x.dataset.bundleIssueReport;w&&tt(w);return}if(Mu(i))return;let S=i.target.closest("[data-bundle-code-issue-step]");if(S){let w=S.closest("[data-bundle-code-issue-order]"),C=null;try{C=JSON.parse(w?.dataset.bundleCodeIssueOrder??"null")}catch{}if(Array.isArray(C)&&C.length>0){let P=S.dataset.bundleCodeIssueStep==="-1"?-1:1,L=C.findIndex(ae=>ae.idx===l.bundleSourceFindingIdx),V=L===-1?P>0?C[0]:C.at(-1):C[(L+P+C.length)%C.length];l.bundleSourceFindingIdx=V.idx,ti(),V.line>0&&or(V.line,{block:"center",behavior:"smooth"})}return}let T=B(i,"[data-bundle-view-source]");if(T){let w=T.dataset.bundleViewSource;if(!w)return;let C=T.dataset.bundleViewFindingIdx,P=C===void 0?null:parseInt(C,10),L=T.dataset.bundleViewLine,V=L?parseInt(L,10):null;Number.isFinite(V)&&(l.bundleSourcePretty=!1);let ae=l.bundleSourceFile!==w;if(Lu(w),Number.isFinite(P)?l.bundleSourceFindingIdx=P:ae&&(l.bundleSourceFindingIdx=null),l.bundleSourceTargetLine=Number.isFinite(V)?{bundle:l.bundleDetails?.integrity??null,path:w,line:V}:null,T.closest(".bundle-code-rail")?rt(".bundle-code-rail-body"):T.closest(".bundle-search-results")?rt(".bundle-search-results"):T.closest(".bundles-slide-body")?rt(".bundles-slide-body"):$(),Number.isFinite(V)){let ve=T.dataset.bundleViewScrollBlock||"center";zi().then(()=>(l.bundleSourceFile===w&&or(V,{block:ve,behavior:"smooth"}),null))}return}let F=i.target.closest('[data-action="workspace-reports"], [data-action="workspace-bundles"]');if(F){let w=F.dataset.action.slice(10);l.currentView!==`workspace-${w}`&&Xi(l.currentManagedTeam??l.currentWorkspace,w);return}if(i.target.closest('[data-action="workspace-findings"]')){if(l.currentView==="findings")return;if(l.currentView==="files"){if(rr("findings"))return;l.currentView="findings",l.filesSelectedFile=null,document.body.classList.remove("report-fullscreen"),$()}else H()?Cn(l.managedTeams.find(w=>w.id===l.currentManagedTeam)):it(l.currentWorkspace);return}let O=i.target.closest("[data-workspace-report]");if(O){H()?Cn(l.managedTeams.find(w=>w.id===l.currentManagedTeam),O.dataset.workspaceReport):tt(O.dataset.workspaceReport,void 0,{workspaceId:l.currentWorkspace});return}let A=i.target.closest("[data-workspace-bundle]");if(A){if(H())me.navigate(Jr({view:"bundles",teamId:l.currentManagedTeam,bundleId:A.dataset.workspaceBundle,bundleTab:"overview"},l.managedTeams));else{let w=A.dataset.workspaceBundle;Kt(w,"overview",{workspaceId:l.currentWorkspace}),Be(w,"overview"),$(),fe(),wt(w)}return}if(i.target.closest('[data-action="toggle-files"]')){if(rr(l.currentView==="files"?"findings":"files"))return;if(l.currentView==="workspace-reports"||l.currentView==="workspace-bundles"){l.currentView="files",it(l.currentWorkspace);return}l.currentView==="files"?l.currentView="findings":(l.viewMode==="graph"&&oe(),l.currentView="files"),document.body.classList.remove("report-fullscreen"),$();return}let Z=B(i,"[data-g2-pkg]");if(Z){let w=Z.dataset.g2Pkg;E.solo=E.solo===w?null:w,E.solo&&(E.selected=null),$u(),lr(),E.graphState?.requestDraw?.();return}let re=B(i,"[data-g2-select]");if(re){E.selected=re.dataset.g2Select,$u(),E.graphState?.requestDraw?.();return}let ne=B(i,"[data-g2-top-pkgs]");if(ne){E.topPkgsTab=ne.dataset.g2TopPkgs,lr();return}let jr=B(i,"[data-g2-jump-findings]");if(jr){if(l.currentView==="bundles"){l.bundleDetailsTab==="graph"&&oe(),_t("issues"),l.selectedBundle&&Be(l.selectedBundle,"issues",{push:!0}),$();return}if(Bl(),l.filterConfMin=0,l.filterInclude=jr.dataset.g2JumpFindings,l.currentView="findings",l.viewMode==="graph"&&(l.viewMode="table"),oe(),rr("findings"))return;$();return}let se=B(i,"[data-g2-jump-file]");if(se){let w=se.dataset.g2JumpFile;oe();let C=()=>requestAnimationFrame(()=>{let L=document.querySelector(`#${qa(w)}`);L&&L.scrollIntoView({behavior:"smooth",block:"start"})}),P=rr("files");if(P){P.then(L=>L?C():void 0);return}l.currentView="files",$(),C();return}if(B(i,"#g2-path-filter-clear")){E.pathFilter="";let w=document.querySelector("graph-layout")?.shadowRoot?.querySelector("#g2-path-filter");w&&(w.value=""),E.graphState?.requestDraw?.();return}if(B(i,"#g2-fullscreen")){document.body.classList.toggle("report-fullscreen");return}if(B(i,"[data-g2-show-all]")){E.showAll=!E.showAll,E.layoutCache=null,E.selected=null,oe(),$();return}if(B(i,"[data-g2-packages-view]")){E.bundleLayout==="flow"?E.flowPackagesView=!E.flowPackagesView:E.bundleLayout==="dependencies"?(E.dependencyPackagesView=!E.dependencyPackagesView,E.solo=null):E.packagesView=!E.packagesView,E.layoutCache=null,E.selected=null,E.focusedPkg=null,oe(),$();return}if(B(i,"[data-g2-bundle-issues]")){E.bundleIssues=!E.bundleIssues,oe({keepViewport:!0}),$();return}let Dt=B(i,"[data-g2-layout]");if(Dt){let w=Dt.dataset.g2Layout;if(!["graph","layers","matrix","dependencies","flow"].includes(w)||E.bundleLayout===w&&!E.focusedPkg)return;E.bundleLayout=w,w==="dependencies"&&(E.dependencyPackagesView=!1),E.layoutCache=null,E.selected=null,E.solo=null,E.focusedPkg=null,oe(),$();return}let hi=B(i,".graph2-triage-selector [data-triage-show]");if(hi){let w=hi.dataset.triageShow;l.shownTriage=l.shownTriage===w?null:w,E.layoutCache=null,E.selected=null,oe(),$();return}let mi=B(i,"[data-g2-focus-pkg]");if(mi){E.focusedPkg=mi.dataset.g2FocusPkg,E.layoutCache=null,oe(),$();return}if(B(i,"#g2-back-to-full")){E.focusedPkg=null,E.layoutCache=null,(E.packagesView||E.bundleLayout==="layers")&&(E.selected=null),oe(),$();return}let dt=B(i,".tab");if(dt&&B(i,".tabs")){let C=B(i,"[data-gid]").dataset.gid,P=dt.dataset.tid;l.activeTabByGroup.set(C,P),Me();return}let je=B(i,"[data-triage-action]");if(je){let w=je.closest(".triage-menu"),C=w?.dataset.gid;if(!C)return;let P=de(C);if(!P)return;let L=je.dataset.triageAction;if(!["inprogress","fixed","invalid","deleted","ignored","restore"].includes(L))return;let{targets:V,clearing:ae}=tc(P,L);if(V.length===0)return;Pu(V,ae?"untriaged":L);try{w.hidePopover()}catch{}ke(),Me();return}if(B(i,".mark-comment")){let C=B(i,"[data-gid]").dataset.gid,P=de(C);if(!P)return;let L=$e(P);if(!Yl(L))return;if(H()){import("./chunk-DGVQPIYB.js").then(({openManagedCommentsDialog:ve})=>ve(L,Me)).catch(()=>Oe("Could not open comments. Please retry."));return}let V=mt(L),ae=Ze(L)?.comment??"";Yd({initial:ae,finding:L}).then(ve=>(ve===null||!De(L)||(X(l.triage,V,{comment:ve||void 0}),ke(),Me()),null)).catch(()=>{});return}let fi=B(i,".mark-copy");if(fi){let w=Su(i);if(w===null)return;nr(fi,w);return}let zo=B(i,".mark-link");if(zo){let w=B(i,"[data-gid]"),C=w?de(w.dataset.gid):null;if(!C)return;let P=hc($e(C));if(!P)return;nr(zo,P);return}let Kr=B(i,"[data-copy-report]");if(Kr){nr(Kr,Kr.dataset.copyReport);return}let Gr=B(i,"[data-copy-path]");if(Gr){nr(Gr,Gr.dataset.copyPath);return}let qo=B(i,".mark-issue");if(qo&&H()&&l.managedSession&&!l.managedSession.publicShare&&l.currentManagedTeam){let w=B(i,"[data-gid]"),C=w?de(w.dataset.gid):null,P=C?$e(C):null;if(P?._managedReportId&&P.id){i.preventDefault();let L=new URL(qo.dataset.issueForm);Fd({teamId:l.currentManagedTeam,session:{...l.managedSession},context:{reportId:P._managedReportId,findingId:P.id,repository:L.pathname.split("/").slice(1,3).join("/")},formUrl:L.href,title:L.searchParams.get("title")??"",body:L.searchParams.get("body")??"",finding:P,draftOptions:{sourceUrl:Li(P,jt(P)),evidence:Fa(P),showRevalidation:La()},renderBody:vc}).catch(()=>Oe("Could not open issue creation. Please retry."));return}}let Ho=B(i,".mark-claude");if(Ho){let w=Su(i);if(w===null)return;let C=`claude://code/new?q=${encodeURIComponent(`Confirm and fix:
35
35
 
36
36
  ${w}`)}`;try{window.location.href=C,Ru(Ho)}catch{}return}if(B(i,".mark-fix")){let C=B(i,"[data-gid]")?.dataset.gid,P=C?de(C):null;if(!P)return;let L=$e(P);if(!De(L))return;let V=rc(P),ae=Ze(L)?.fix??"";uu({initial:ae,finding:L,canApplyToGroup:Zl(V,ae)}).then(ve=>{if(ve===null||!De(L))return null;let Vo=ve.scope==="group"?V.filter(Ot=>De(Ot)&&(Ot===L||ec(Ot,ae))):[L],Ko=!1;for(let Ot of Vo)X(l.triage,mt(Ot),{fix:ve.value||void 0})&&(Ko=!0);return Ko&&(Vo.length>1&&l.activeTabByGroup.set(C,mt(L)),Me(),queueMicrotask(ke)),null}).catch(()=>{});return}let Uo=B(i,"[data-flag-toggle]");if(Uo){let w=Uo.dataset.flagToggle,C=B(i,"[data-gid]")?.dataset.gid,P=(C?de(C):null)?.find(V=>mt(V)===w);if(!P||!De(P))return;let L=Ze(P)?.flagged;X(l.triage,w,{flagged:L!==!0}),ke(),Me();return}let Wr=i.target.closest("[data-triage-show]");if(Wr&&!Wr.closest(".graph2-triage-selector")){let w=Wr.dataset.triageShow;l.shownTriage=l.shownTriage===w?null:w,$();return}if(i.target.closest("[data-table-deselect]")){l.tableSelectedGid=null,Me();return}let jo=i.target.closest("[data-tree-select]");if(jo){let w=jo.dataset.treeSelect;l.filesSelectedFile=l.filesSelectedFile===w?null:w,$();return}i.target.closest("[data-tree-deselect]")&&(l.filesSelectedFile=null,$())});var Cu=document.querySelector("#bundle-source-overlay-slot");Cu&&Cu.addEventListener("click",Mu);function cr(i){let e=i?de(i):null;e&&ic(e)&&queueMicrotask(ke)}R.addEventListener("row-select",i=>{let e=i.detail?.gid;if(!e)return;let t=l.tableSelectedGid!==e;l.tableSelectedGid=t?e:null,t&&cr(e),Me()});var dr="application/x-deepview-kanban-gid";function Pu(i,e){for(let t of i)De(t)&&ca(l.triage,t,e,Pa())}function Qn(){for(let i of R.querySelectorAll(".kanban-card.dragging"))i.classList.remove("dragging");for(let i of R.querySelectorAll(".kanban-column.drag-over"))i.classList.remove("drag-over")}R.addEventListener("dragstart",i=>{let e=i.target.closest?.(".kanban-card[data-kanban-source]");if(!e||!i.dataTransfer)return;let t=e.dataset.gid;if(!t)return;let r=de(t);if(!r||an(r).length===0){i.preventDefault();return}i.dataTransfer.setData(dr,t),i.dataTransfer.setData("text/plain",t),i.dataTransfer.effectAllowed="move",e.classList.add("dragging")});R.addEventListener("dragend",Qn);R.addEventListener("dragover",i=>{if(!i.dataTransfer?.types.includes(dr))return;let e=i.target.closest?.(".kanban-column[data-kanban-target]");if(e&&(i.preventDefault(),i.dataTransfer.dropEffect="move",!e.classList.contains("drag-over"))){for(let t of R.querySelectorAll(".kanban-column.drag-over"))t!==e&&t.classList.remove("drag-over");e.classList.add("drag-over")}});R.addEventListener("dragleave",i=>{let e=i.target.closest?.(".kanban-column[data-kanban-target]");e&&(e.contains(i.relatedTarget)||e.classList.remove("drag-over"))});R.addEventListener("drop",i=>{if(!i.dataTransfer?.types.includes(dr))return;let e=i.target.closest?.(".kanban-column[data-kanban-target]");if(!e){Qn();return}i.preventDefault();let t=i.dataTransfer.getData(dr),r=e.dataset.kanbanTarget;if(Qn(),!t||!r)return;let n=de(t);if(!n||(Bi(n).commonTriage??"untriaged")===r)return;let o=an(n);o.length!==0&&(Pu(o,r),$(),queueMicrotask(ke))});var Yn=!1;function nt(i){return i?R.querySelector(`.kanban-card[data-gid="${CSS.escape(i)}"]`):null}function sr(i){let e=i??R.querySelector(".kanban-card");if(!e)return;let t=e.getBoundingClientRect();t.width<=0||t.height<=0||(document.documentElement.style.setProperty("--kanban-clip-card-w",`${Math.floor(t.width)}px`),document.documentElement.style.setProperty("--kanban-clip-card-h",`${Math.floor(t.height)}px`),document.documentElement.style.setProperty("--kanban-return-card-bg",getComputedStyle(e).backgroundColor))}function fm(){let i=R.querySelector(".kanban-detail-side [data-kanban-select].active");i&&i.scrollIntoView({block:"nearest",behavior:"instant"})}function Jn(i){l.kanbanPopoverGid=i,l.focusCodeStack=[],l.focusCodeAt=0}function Eu(){fm(),et()}function st(i){let e=l.kanbanPopoverGid;if(e===i)return;let t=e===null&&i!==null,r=e!==null&&i===null;if(!document.startViewTransition||!t&&!r){cr(i),Jn(i),$(),Eu();return}if(Yn)return;cr(i),Yn=!0;let n=t?"kanban-opening":"kanban-closing";document.documentElement.classList.add(n);let s=d=>{d&&(d.style.viewTransitionName=""),document.documentElement.classList.remove(n),Yn=!1};if(t){let d=nt(i);d?(sr(d),d.style.viewTransitionName="kanban-detail-modal",d.getBoundingClientRect()):sr(),Jn(i);let p=En(()=>{$(),Eu(),d&&(d.style.viewTransitionName="")}),h=setTimeout(()=>s(d),600);(async()=>{try{await p.finished}catch{}clearTimeout(h),s(d)})();return}sr(),Jn(i);let o=null,c=En(()=>{$(),o=nt(e),o&&(sr(o),o.style.viewTransitionName="kanban-detail-modal")}),u=setTimeout(()=>s(o??nt(e)),600);(async()=>{try{await c.finished}catch{}clearTimeout(u),s(o??nt(e))})()}function Au(i){let e=nt(l.kanbanPopoverGid),t=e?.closest(".kanban-column");if(!t)return;let r=[...t.querySelectorAll(".kanban-card[data-kanban-source]")],n=r.indexOf(e);if(n<0)return;let s=Math.min(Math.max(n+i,0),r.length-1);if(s===n)return;let o=r[s].dataset.gid;if(!o)return;st(o);let c=nt(o);c&&(c.focus({preventScroll:!0}),c.scrollIntoView({block:"nearest",behavior:"instant"}))}var ar=null;function Zn(){Kl(),l.focusCodeStack=[],l.focusCodeAt=0,$(),ar?.isConnected&&ar.focus({preventScroll:!0}),ar=null}R.addEventListener("click",i=>{let e=B(i,"[data-links-preview]");if(e){i.preventDefault(),ar=e;let o=e.dataset.previewRow,c=Gl(e.dataset.linksPreview,e.dataset.previewReport,o===void 0?void 0:Number(o),e.dataset.previewManagedReport);$(),R.querySelector(".kanban-detail-close")?.focus({preventScroll:!0}),c.then(()=>{$(),et();let u=Xe()?.group?.[0]._bundleHashes;if(Array.isArray(u))for(let d of u)lc(d).catch(()=>{});return null});return}if(i.target.closest?.(".kanban-detail-close")){if(Xe()){Zn();return}st(null);return}if(i.target.closest?.("[data-kanban-detail-fullscreen]")){l.kanbanDetailFullscreen=!l.kanbanDetailFullscreen;try{localStorage.setItem(Qa,String(l.kanbanDetailFullscreen))}catch{}$(),et();return}let t=i.target.closest?.("[data-kanban-expand]");if(t){let o=t.dataset.kanbanExpand,c=l.kanbanExpandedColumn===o?null:o;l.kanbanExpandedColumn=c,c&&l.kanbanPopoverGid&&nt(l.kanbanPopoverGid)?.closest(".kanban-column")?.dataset.kanbanTarget!==c&&(l.kanbanPopoverGid=null),$();return}let r=i.target.closest?.("[data-kanban-nav]");if(r){Au(r.dataset.kanbanNav==="next"?1:-1);return}let n=i.target.closest?.("[data-kanban-select]");if(n){if(window.getSelection?.()?.toString())return;let o=n.dataset.gid;o&&st(o);return}if(i.target.closest?.(".kanban-action:not(.kanban-fix-note)"))return;let s=i.target.closest?.(".kanban-card[data-kanban-source]");if(s){if(window.getSelection?.()?.toString())return;let o=s.dataset.gid;if(!o)return;st(l.kanbanPopoverGid===o?null:o);return}if(!B(i,".kanban-detail-modal, .kanban-detail-side")){if(Xe()){Zn();return}l.kanbanPopoverGid&&st(null)}});R.addEventListener("change",i=>{let e=i.target.closest?.("[data-kanban-column]");if(!e)return;let t=e.selectedOptions[0]?.dataset.gid;t&&st(t)});document.addEventListener("keydown",i=>{if(i.key==="Escape"){if(Xe()){!i.defaultPrevented&&!Ou(i)&&!document.querySelector(":popover-open:not(#styled-tooltip)")&&Zn();return}if(l.kanbanPopoverGid){st(null);return}l.viewMode!=="kanban"||l.kanbanExpandedColumn===null||(l.kanbanExpandedColumn=null,$())}});function ii(i){let t=B(i,"[data-gid]")?.dataset?.gid;return t?de(t):null}function ts(i,e){if(!e.integrity||!e.file)return;let t=uc(i);if(!t)return;let r=cc(t,e);r&&(l.focusCodeStack=r.stack,l.focusCodeAt=r.at,$()),e.range||Iu(),et()}function Iu(){for(let i of R.querySelectorAll(".focus-code-body"))i.scrollTop=0,i.scrollLeft=0}R.addEventListener("keydown",i=>{if(i.key!=="Enter"&&i.key!==" ")return;let e=B(i,"[data-code-nav-file]");e&&(i.preventDefault(),ts(ii(i),{integrity:e.dataset.codeNavIntegrity,file:e.dataset.codeNavFile,range:Fe(e.dataset.codeNavLine)}))});function gm(i){let e=dc(l.focusCodeStack,l.focusCodeAt,i);e!==l.focusCodeAt&&(l.focusCodeAt=e,$(),l.focusCodeStack[e]?.range||Iu(),et())}function Fu(i){if(!i||l.focusGid===i)return;cr(i),l.focusGid=i,l.focusCodeStack=[],l.focusCodeAt=0,$();let e=R.querySelector(".focus-side-card.active");e&&e.scrollIntoView({block:"nearest",behavior:"instant"}),et()}function Du(i){let e=[...R.querySelectorAll(".focus-side-card[data-focus-select]")];if(e.length===0)return;let t=e.findIndex(s=>s.classList.contains("active")),r=t<0?i>0?0:e.length-1:Math.min(Math.max(t+i,0),e.length-1);if(r===t)return;let n=e[r].dataset.gid;n&&Fu(n)}R.addEventListener("click",i=>{let e=i.target.closest?.("[data-focus-nav]");if(e){Du(e.dataset.focusNav==="next"?1:-1);return}let t=i.target.closest?.(".focus-side-card[data-focus-select]");if(!t||window.getSelection?.()?.toString())return;let r=t.dataset.gid;r&&Fu(r)});R.addEventListener("pointerdown",i=>{if(i.button!==0)return;let e=i.target.closest?.("[data-focus-splitter]");e&&_u(e,i)});R.addEventListener("dblclick",i=>{let e=i.target.closest?.("[data-focus-splitter]");e&&yu(e)});function Ou(i){if(document.querySelector("dialog[open]"))return!0;for(let e of i.composedPath()){if(!e||e.nodeType!==1)continue;let t=e.tagName;if(t==="INPUT"||t==="TEXTAREA"||t==="SELECT"||t==="DIALOG"&&e.open||e.isContentEditable)return!0}return!1}document.addEventListener("keydown",i=>{if(l.currentView!=="findings")return;let e=l.viewMode==="focus",t=l.viewMode==="kanban"&&l.kanbanPopoverGid!==null;if(!e&&!t||i.metaKey||i.ctrlKey||i.altKey||i.shiftKey||Ou(i))return;let r=0;if(i.key==="ArrowRight")r=1;else if(i.key==="ArrowLeft")r=-1;else return;i.preventDefault();let n=i.target?.closest?.("[data-focus-splitter]");if(n){vu(n,r*mu);return}e?Du(r):Au(r)});R.addEventListener("mark-color",i=>{let e=B(i,"[data-gid]");if(!e)return;let t=e.dataset.gid,r=de(t);if(!r)return;let n=$e(r);if(!De(n))return;let s=mt(n),o=i.detail?.color;if(!o)return;Ze(n)?.color===o?X(l.triage,s,{color:void 0}):X(l.triage,s,{color:o}),ke(),Me()});var ot=null,es=null,Ct=null,ur=!1;function Bu(){if(ot!==null)return;if(l.reports.length===0){Ct=null,ur=!1;return}ot=l.viewMode,es=document.title;let i=!1;l.viewMode==="table"&&(l.viewMode="list",i=!0),Ct&&(qt(Ct),i=!0),i&&$();for(let r of R.querySelectorAll("finding-card"))r.toggleAttribute("print-one-sample",ur),r.ensureRendered({sync:!0});let e=l.reports.map(r=>r.fileName),t="";e.length===1?t=e[0]:e.length>1&&(t=zt(e)),t=t.replace(/\.json$/u,""),t&&(document.title=t)}function Nu(){if(ot===null)return;for(let e of R.querySelectorAll("finding-card"))e.removeAttribute("print-one-sample");ur=!1;let i=!1;l.viewMode!==ot&&(l.viewMode=ot,i=!0),Ct&&(Ht(),Ct=null,i=!0),i&&$(),document.title=es,ot=null,es=null}window.addEventListener("beforeprint",Bu);window.addEventListener("afterprint",Nu);async function bm(i,{oneSamplePerGroup:e=!1}={}){if(ot===null){Ct=i,ur=e;try{Bu(),await Promise.all([...R.querySelectorAll("finding-card")].map(t=>t.ensureRendered())),window.print()}catch(t){throw Nu(),t}}}function Tu(i,e){if(!i)return e();qt(i);try{return e()}finally{Ht()}}document.addEventListener("download-requested",async()=>{if(l.reports.length===0)return;let{confirmed:i,view:e,fields:t,mode:r,oneSamplePerGroup:n}=await ru("download");if(e){await cu(Tu(t,()=>Vn({oneSamplePerGroup:n})));return}if(i){if(r==="print"){await bm(t,{oneSamplePerGroup:n});return}Tu(t,()=>ku({oneSamplePerGroup:n}))}});R.addEventListener("analyzer-change",i=>{l.filterAnalyzer=i.detail.analyzer,l.filterModel=i.detail.model,$()});R.addEventListener("repo-change",i=>{l.filterRepo=i.detail.value,$()});R.addEventListener("revalidate-change",i=>{l.filterRevalidate=i.detail.value,$()});R.addEventListener("partial-change",i=>{l.filterPartial=i.detail.value,$()});R.addEventListener("revalidation-change",i=>{l.showRevalidation=i.detail.on,!i.detail.on&&l.reports.some(t=>(t.groups??[]).some(r=>r.some(n=>!n.isApp&&(n.isUpstream||Ri(n.file)))))?Oe("App mode off is not recommended; it can conflate triage for issues in dependencies.",{kind:"warning"}):i.detail.on&&md(),sn(l.showRevalidation,l.upstreamOnly),Ul(ln(),{resetSort:!1}),$()});R.addEventListener("revalidation-conflicts-open",()=>{(async()=>{let i=await hu(l.revalidateConflicts);if(!i)return;let e=await Tn(i.id,i.reportName);e.ok||alert(e.reason)})().catch(i=>console.warn("revalidation: open conflicting finding failed:",i))});R.addEventListener("revalidation-detail-change",i=>{l.revalidationDetailed=i.detail.on===!0,$()});R.addEventListener("upstream-only-change",i=>{if(l.upstreamOnly=i.detail.on===!0,sn(l.showRevalidation,l.upstreamOnly),!l.upstreamOnly){let e=ln();ql(e,Hl(e))==="confirmed"&&(l.filterRevalidate="confirmed",l.filterPartial="")}$()});R.addEventListener("bundle-search-mode-change",i=>{let e=i.detail?.mode;if(["files","code","issues","largest"].includes(e)){if(l.bundleCodeSearchMode=e,$(),e==="files")Qt();else if(e==="largest"){let t=document.querySelector(".bundle-code-rail-body");t&&(t.scrollTop=0)}}});R.addEventListener("bundle-graph-reason-change",i=>{let e=i.detail?.reason;e!==null&&typeof e!="string"||(E.bundleReason=e,E.layoutCache=null,E.selected=null,E.solo=null,E.focusedPkg=null,oe(),$())});R.addEventListener("bundle-search-regex-toggle",()=>{l.bundleSearchRegex=!l.bundleSearchRegex,$()});R.addEventListener("bundle-search-case-toggle",()=>{l.bundleSearchCase=!l.bundleSearchCase,$()});R.addEventListener("bundle-swap",i=>{let e=i.detail?.integrity;if(!e||!(l.bundles??[]).some(s=>s.integrity===e))return;let t=l.bundles.find(s=>s.integrity===e),r=nc(i.detail.bundles??[]),n=()=>{setTimeout(()=>sc(r))};if(t.managedId){let s=i.detail.target===void 0?l.selectedBundle:i.detail.target,o=l.bundles.find(u=>u.integrity===s),c=o?.managedId?{compareId:o.managedId,...ua(i.detail.mode)}:null;me.navigate($c(l.managedTeams,t,l.currentManagedTeam,"compare",c,l.bundles)).finally(n);return}Kt(e,"compare"),Be(e,"compare"),$(),fe(),wt(e).finally(n)});R.addEventListener("bundle-compare-change",i=>{let{base:e,target:t,mode:r}=i.detail??{};!H()||!e||e!==l.selectedBundle||l.bundleDetailsTab!=="compare"||(l.bundleCompare=t?{bundle:e,target:t,mode:$i(r)}:null,Be(e,"compare"))});R.addEventListener("sort-change",i=>{let{kind:e,value:t}=i.detail;if(e==="findings")l.sortBy=t;else if(e==="packages")l.packagesSortBy=t;else if(e==="repositories")l.repositoriesSortBy=t;else return;$()});R.addEventListener("range-change",i=>{i.target.id==="conf-range"&&(l.filterConfMin=i.detail.low,l.filterConfMax=i.detail.high,$())});R.addEventListener("input",i=>{let e=i.composedPath()[0],t=e?.id,r=e?.value;t==="g2-path-filter"&&(E.pathFilter=r,E.graphState?.requestDraw?.())});R.addEventListener("search-input",i=>{if(!i.detail)return;let{kind:e,value:t}=i.detail;if(e==="findings"){l.filterInclude=t,t||(l.filterIncludeNegate=!1),xu();return}else if(e==="files")l.filesSearch=t;else if(e==="packages")l.packagesSearchQuery=t;else if(e==="repositories")l.repositoriesSearchQuery=t;else if(e==="bundle-code")l.bundleCodeSearchQuery=t;else if(e==="bundle-search"){l.bundleSearchQuery=t,xu();return}else return;$()});R.addEventListener("search-negate-toggle",()=>{l.filterIncludeNegate=!l.filterIncludeNegate,$()});R.addEventListener("severity-toggle",i=>{let e=i.detail.severity;if(i.detail.kind==="graph"){E.selectedSeverities.has(e)?E.selectedSeverities.delete(e):E.selectedSeverities.add(e),i.composedPath()[0].selected=[...E.selectedSeverities],E.graphState?.requestDraw?.(),lr();return}l.filterSeverities.has(e)?l.filterSeverities.delete(e):l.filterSeverities.add(e),$()});R.addEventListener("color-toggle",i=>{let e=i.detail.color;if(i.detail.kind==="graph"){E.selectedColors.has(e)?E.selectedColors.delete(e):E.selectedColors.add(e),i.composedPath()[0].selected=[...E.selectedColors],E.graphState?.requestDraw?.(),lr();return}l.filterColors.has(e)?l.filterColors.delete(e):l.filterColors.add(e),$()});R.addEventListener("source-toggle",i=>{let e=i.detail.source,t=l.filterSources.has(e);l.filterSources.clear(),t||l.filterSources.add(e),$()});R.addEventListener("annotation-filter-toggle",i=>{let e=i.detail?.key,t=r=>r===""?"with":r==="with"?"without":"";if(e==="comment")l.filterComment=t(l.filterComment);else if(e==="fix")l.filterFix=t(l.filterFix);else if(e==="flag")l.filterFlagged=t(l.filterFlagged);else if(e==="duplicates"&&!l.currentWorkspace)l.filterDuplicates=t(l.filterDuplicates);else if(e==="cross-context")l.filterCrossContext=t(l.filterCrossContext);else if(e==="app-stacked")l.filterAppStacked=t(l.filterAppStacked);else if(e==="security")l.filterSecurity=t(l.filterSecurity);else return;$()});R.addEventListener("slide-triage-toggle",i=>{let{kind:e,value:t}=i.detail;if(e==="package")l.packageSlideTriage=l.packageSlideTriage===t?null:t;else if(e==="repository")l.repositorySlideTriage=l.repositorySlideTriage===t?null:t;else return;$()});R.addEventListener("view-mode-change",i=>{if(i.detail.kind==="files"){l.filesViewMode=i.detail.mode,$();return}l.viewMode=i.detail.mode,l.viewMode!=="kanban"&&(l.kanbanPopoverGid=null),l.viewMode!=="focus"&&(l.focusGid=null),$()});R.addEventListener("severity-mode-change",i=>{let e=i.detail?.mode;if(!(e!=="corrected"&&e!=="original")){l.severityMode=e;try{localStorage.setItem(Ja,e)}catch{}$()}});R.addEventListener("repo-edit-start",()=>{H()||(l.repoEditing=!0,$())});R.addEventListener("repo-input",i=>{H()||(l.repoUrl=i.detail.url,Ai(l.currentFile,l.repoUrl))});R.addEventListener("repo-commit",i=>{H()||(l.repoUrl=i.detail.url,Ai(l.currentFile,l.repoUrl),l.repoEditing=!1,$())});R.addEventListener("repo-cancel",i=>{H()||(l.repoUrl=i.detail.url,Ai(l.currentFile,l.repoUrl),l.repoEditing=!1,$())});document.addEventListener("keydown",i=>{if(i.key==="Escape"){if(l.bundleSourceFindingIdx!=null){l.bundleSourceFindingIdx=null,ti();return}if(l.bundleSourceFile){if(l.currentView==="bundles"&&l.bundleDetailsTab==="code")return;_t(l.bundleDetailsTab),$()}}});function W(i,e){for(let[t,r]of Object.entries(e))i.hasAttribute(t)||i.setAttribute(t,r)}var Pe=Math.PI*2;function vm(i){return()=>{i=i+1831565813|0;let e=i;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}}function zu(i,e,t,r){let n=Math.cos(e),s=Math.sin(e);return Math.min(n>0?(t-i.x)/n:n<0?-i.x/n:1/0,s>0?(r-i.y)/s:s<0?-i.y/s:1/0)}function ym(i){return Math.abs(i.reduce((e,t,r)=>{let n=i[(r+1)%i.length];return e+t.x*n.y-n.x*t.y},0))/2}function is(i){return i.slice(1).reduce((e,t,r)=>e+Math.hypot(t.x-i[r].x,t.y-i[r].y),0)}function _m(i,e,t,r){let n=i.map(d=>d.x),s=i.map(d=>d.y),o={x:(Math.min(...n)+Math.max(...n))/2,y:(Math.min(...s)+Math.max(...s))/2},c=Math.max(...i.map(d=>Math.hypot(d.x-o.x,d.y-o.y))),u=Math.atan2(o.y-e.y,o.x-e.x);return{center:o,distance:Math.hypot(o.x-e.x,o.y-e.y),dx:Math.cos(u)*(80+r()*200)+(r()-.5)*90,dy:t-o.y+c+40,rotation:(r()-.5)*160,delay:r()*120}}function qu(i,e,t=7){let r=vm(t),n={x:i*1820/1920,y:e*90/1080},s=Math.hypot(i,e),o=(_,x)=>_<1e-8?0:_>x-1e-8?x:_,c=_=>({x:o(_.x,i),y:o(_.y,e)}),u=Array.from({length:20},(_,x)=>((x+(r()-.5)*.35)*Pe/20+Pe)%Pe);for(let[_,x]of[[0,0],[i,0],[i,e],[0,e]])u.push((Math.atan2(x-n.y,_-n.x)+Pe)%Pe);u.sort((_,x)=>_-x);let p=[.045,.29,.58].map(_=>_*Math.min(i,e)).map(_=>u.map(x=>{let S=Math.min(_*(.92+r()*.16),zu(n,x,i,e));return c({x:n.x+Math.cos(x)*S,y:n.y+Math.sin(x)*S})}));p.push(u.map(_=>{let x=zu(n,_,i,e);return c({x:n.x+Math.cos(_)*x,y:n.y+Math.sin(_)*x})}));let h=p.map((_,x)=>_.map((S,T)=>{let F=_[(T+1)%_.length],O={x:(S.x+F.x)/2,y:(S.y+F.y)/2},A=Math.hypot(F.x-S.x,F.y-S.y),z=S.x===F.x&&(S.x===0||S.x===i)||S.y===F.y&&(S.y===0||S.y===e),Z=x===p.length-1||z?0:(r()-.5)*A*.08,re=Math.atan2(O.y-n.y,O.x-n.x);return[S,c({x:O.x+Math.cos(re)*Z,y:O.y+Math.sin(re)*Z}),F]})),f=p.slice(1).map((_,x)=>_.map((S,T)=>{let F=p[x][T],O=Math.hypot(S.x-F.x,S.y-F.y),A={x:(F.x+S.x)/2,y:(F.y+S.y)/2},z=(u[T]-u[(T+u.length-1)%u.length]+Pe)%Pe,Z=(u[(T+1)%u.length]-u[T]+Pe)%Pe,re=Math.min(z,Z)*Math.hypot(A.x-n.x,A.y-n.y),ne=(r()-.5)*Math.min(O*.12,re*.14);return[F,c({x:A.x-Math.sin(u[T])*ne,y:A.y+Math.cos(u[T])*ne}),S]})),b=[],v=_=>{ym(_)>.01&&b.push({points:_,..._m(_,n,e,r)})};v(h[0].flatMap(_=>_.slice(0,-1)));for(let _=0;_<p.length-1;_++)for(let x=0;x<u.length;x++){let S=(x+1)%u.length;v([...f[_][x],...h[_+1][x].slice(1),...f[_][S].toReversed().slice(1),...h[_][x].toReversed().slice(1)])}let g=Math.max(...b.map(_=>_.distance));for(let _ of b)_.delay+=_.distance/g*400;let y=[],k=(_,x,S,T)=>{let F=is(_);F>.1&&y.push({points:_,length:F,delay:x,duration:S,width:T})};for(let _=0;_<u.length;_++){let x=[n,p[0][_],...f.flatMap(S=>S[_].slice(1))];k(x,0,200+is(x)/s*1e3,1.1)}for(let _ of h.slice(0,-1))for(let x of _){let S=Math.hypot(x[0].x-n.x,x[0].y-n.y);k(x,S/s*1e3,220+is(x)/s*400,.7)}for(let _ of p[1]){let x=Math.atan2(_.y-n.y,_.x-n.x)+(r()-.5)*1.4,S=Math.min(i,e)*(.07+r()*.12),T=[_];for(let F=1;F<=3;F++)T.push(c({x:_.x+Math.cos(x+(r()-.5)*.3)*S*F/3,y:_.y+Math.sin(x+(r()-.5)*.3)*S*F/3}));k(T,Math.hypot(_.x-n.x,_.y-n.y)/s*1e3+80,220,.5)}return{width:i,height:e,impact:n,pieces:b,cracks:y}}var Hu=`.screen-crack{position:fixed;inset:0;z-index:2147483646;overflow:hidden;pointer-events:none;user-select:none}.screen-crack-svg{position:absolute;inset:0;width:100%;height:100%;overflow:hidden}.screen-crack-glass{position:absolute;inset:0;backdrop-filter:blur(9px) brightness(1.06) saturate(.85);background:linear-gradient(135deg,#dcebff0f,#dcebff00 55%);mask-mode:luminance;opacity:0}.screen-crack-shard{transform-box:fill-box;transform-origin:center}.screen-crack-outline{opacity:0}.screen-crack-flash{position:absolute;width:18vmin;height:18vmin;border-radius:50%;background:radial-gradient(circle,rgb(255 255 255 / .85),rgb(200 230 255 / .15) 55%,transparent 75%);transform:translate(-50%,-50%);opacity:0}@media print{.screen-crack{display:none}}
37
37
  `;var km="http://www.w3.org/2000/svg",rs=1.5,$m=0;function ge(i,e={}){let t=document.createElementNS(km,i);for(let[r,n]of Object.entries(e))t.setAttribute(r,String(n));return t}function xm(i){let e=document.createElement("div");e.className="screen-crack",e.setAttribute("aria-hidden","true");let t=document.createElement("style");t.textContent=Hu;let r=ge("svg",{viewBox:`0 0 ${i.width} ${i.height}`,preserveAspectRatio:"none"});r.classList.add("screen-crack-svg");let n=ge("defs"),s=`screen-crack-mask-${++$m}`,o=ge("mask",{id:s,maskUnits:"userSpaceOnUse",maskContentUnits:"userSpaceOnUse",x:0,y:0,width:i.width,height:i.height});o.append(ge("rect",{width:i.width,height:i.height,fill:"black"})),n.append(o);let c=ge("g"),u=ge("g"),d=i.pieces.map(b=>{let v=b.points.map(_=>`${_.x},${_.y}`).join(" "),g=ge("g"),y=ge("g");g.classList.add("screen-crack-shard"),y.classList.add("screen-crack-shard"),g.append(ge("polygon",{points:v,fill:"white"}));let k=ge("polygon",{points:v,fill:"none",stroke:"rgb(240 248 255 / .8)","stroke-width":1.1,"stroke-linejoin":"round"});return k.classList.add("screen-crack-outline"),y.append(k),o.append(g),u.append(y),{masked:g,outlined:y,outline:k,piece:b}});r.append(n,c,u);let p=document.createElement("div");p.className="screen-crack-glass";let h=`${document.URL.split("#")[0]}#${s}`;p.style.maskImage=`url("${h}")`,p.style.webkitMaskImage=`url("${h}")`;let f=document.createElement("div");return f.className="screen-crack-flash",f.style.left=`${i.impact.x}px`,f.style.top=`${i.impact.y}px`,e.append(t,p,r,f),{overlay:e,glass:p,cracks:c,shards:d,flash:f}}function Sm(i,e,t){for(let r of e.cracks){let n=r.points.map((s,o)=>`${o===0?"M":"L"}${s.x} ${s.y}`).join(" ");for(let s of[!0,!1]){let o=ge("path",{d:n,fill:"none",stroke:s?"rgb(0 0 0 / .55)":"rgb(232 244 255 / .95)","stroke-width":r.width+(s?.8:0),"stroke-linecap":"round","stroke-linejoin":"round"});s&&o.setAttribute("transform","translate(.5 .7)"),o.style.strokeDasharray=`${r.length} ${r.length}`,o.style.strokeDashoffset=String(r.length),i.append(o),t(o,[{strokeDashoffset:String(r.length)},{strokeDashoffset:"0"}],{duration:r.duration*rs,delay:r.delay*rs,easing:"cubic-bezier(.2,.7,.2,1)"})}}}function Uu(i){let e=window.innerHeight,t=window.innerWidth;if(window.matchMedia("(prefers-reduced-motion: reduce)").matches||!t||!e||!Element.prototype.animate)return i(),Promise.resolve();let r=qu(t,e),{overlay:n,glass:s,cracks:o,shards:c,flash:u}=xm(r);document.body.append(n);let d=document.timeline.currentTime,p=[],h=(T,F,O)=>{let A=T.animate(F,{fill:"both",...O});return A.playbackRate=2,A.startTime=d,p.push(A),A},f=!1,b=!1,v=()=>{b||(b=!0,i())},g=()=>{if(!f){f=!0,window.removeEventListener("resize",g),window.removeEventListener("beforeprint",g),document.removeEventListener("visibilitychange",y),n.remove();for(let T of p)T.cancel();v()}},y=()=>{document.hidden&&g()};window.addEventListener("resize",g,{once:!0}),window.addEventListener("beforeprint",g,{once:!0}),document.addEventListener("visibilitychange",y),Sm(o,r,h),h(u,[{opacity:0,transform:"translate(-50%, -50%) scale(0)"},{opacity:.85,transform:"translate(-50%, -50%) scale(.8)",offset:.08},{opacity:0,transform:"translate(-50%, -50%) scale(2.4)"}],{duration:600,easing:"ease-out"}),h(o,[{transform:"translate(0, 0)"},{transform:"translate(-3px, 2px)"},{transform:"translate(3px, -2px)"},{transform:"translate(-2px, -2px)"},{transform:"translate(2px, 2px)"},{transform:"translate(0, 0)"}],{duration:450});let k=Math.max(...r.cracks.map(T=>T.delay+T.duration))*rs,_=500,x=Math.max(_,k*.8);h(s,[{opacity:0},{opacity:1}],{duration:_,easing:"ease-out"}),h(u,[{visibility:"visible"},{visibility:"visible"}],{duration:1,delay:x-1}).finished.then(v,()=>{}),h(o,[{opacity:1},{opacity:0}],{duration:450,delay:x,easing:"ease-out"});for(let{masked:T,outlined:F,outline:O,piece:A}of c){let z=x+A.delay,Z=[{transform:"translate(0, 0) rotate(0deg)"},{transform:`translate(${A.dx}px, ${A.dy}px) rotate(${A.rotation}deg)`}];for(let re of[T,F])h(re,Z,{duration:1700,delay:z,easing:"cubic-bezier(.32,0,.82,.94)"});h(O,[{opacity:0},{opacity:1}],{duration:250,delay:z})}return Promise.all(p.map(T=>T.finished)).then(g,g)}var ju=`:host{position:absolute;top:.5rem;right:.5rem;z-index:1000;width:30px;height:30px;background:var(--theme-toggle-bg, transparent);color:var(--muted);border:var(--theme-toggle-border, 0);border-radius:var(--ui-radius, 6px);font-size:1rem;line-height:1;font-family:inherit;display:flex;align-items:center;justify-content:center;transition:color .12s,background .12s;cursor:default;user-select:none}:host(:hover){color:var(--text);background:var(--theme-toggle-hover-bg, rgb(from var(--text) r g b / .06))}:host(:focus-visible){outline:2px solid var(--accent);outline-offset:2px}@media print{:host{display:none!important}}@media(display-mode:window-controls-overlay){:host{-webkit-app-region:no-drag;app-region:no-drag}}
@@ -97,7 +97,7 @@ As published: +${r.additions.toLocaleString()} \u2212${r.deletions.toLocaleStrin
97
97
  .newHosts=${r?.files?.newHosts?.(i,e)??null} .newHostTag=${r?.files?.newHostTag??null}
98
98
  .dependencies=${r?.dependencies?.(i,e)??null} .openDependency=${r?.openDependency??null} .dependencyTags=${r?.dependencyTags??null}
99
99
  .models=${h?.models??null} .path=${n} .seek=${s} .extensions=${d} baseName=${o} otherName=${c}
100
- @compare-code-select=${b=>{b.stopPropagation(),u(b.detail.path)}}></${f}>`}var yg=400,vh=24,zr=["removed","added","changed"],ue=null;function qe(i){return i.join(", ")}var $o=class extends U{static properties={details:{attribute:!1},integrity:{attribute:!1},request:{attribute:!1},source:{attribute:!1},review:{attribute:!1},_targetIntegrity:{state:!0},_otherDetails:{state:!0},_status:{state:!0},_scope:{state:!0},_fileSort:{state:!0},_pkgSort:{state:!0},_openSections:{state:!0},_mode:{state:!0},_codePath:{state:!0},_codeSeek:{state:!0}};createRenderRoot(){return this}constructor(){super(),this.details=null,this.integrity=null,this.request=null,this.source=null,this._targetIntegrity=null,this._otherDetails=null,this._status="idle",this._scope="",this._fileSort={removed:"name",added:"name",changed:"name"},this._pkgSort={removed:"size",added:"size",changed:"size"},this._openSections=new Set,this._mode="overview",this._codePath=null,this._codeSeek=null,this._diff=null,this._diffKey=null,this._fitBody=null,this._fitObserver=null}connectedCallback(){super.connectedCallback(),this._fitBody&&this._fitObserver?.observe(this._fitBody)}disconnectedCallback(){super.disconnectedCallback(),this._fitObserver?.disconnect()}willUpdate(e){e.has("source")&&this.source&&!e.get("source")&&(this._openSections=new Set([...this._openSections,"files"])),(e.has("_otherDetails")||e.has("details"))&&this._status==="ready"&&!wn(this.details,this._otherDetails).some(t=>t.id===this._scope)&&(this._scope=""),e.has("integrity")&&this._rebase(),(e.has("request")||e.has("integrity"))&&this.integrity&&this.request?.bundle===this.integrity?(this.request.target!==this._targetIntegrity&&this._choose(this.request.target),this._mode=$i(this.request.mode)):e.has("request")&&!e.has("integrity")&&e.get("request")?.bundle===this.integrity&&(this._targetIntegrity&&this._choose(null),this._mode="overview")}updated(){let e=this.querySelector(".bundle-compare-body");e!==this._fitBody&&typeof ResizeObserver=="function"&&(this._fitObserver??=new ResizeObserver(()=>this._fitLists()),this._fitObserver.disconnect(),e&&this._fitObserver.observe(e),this._fitBody=e),this._fitLists()}_fitLists(){let e=this._fitBody;if(!e)return;let t=getComputedStyle(e),r=e.getBoundingClientRect().top+e.clientTop+parseFloat(t.paddingTop)-e.scrollTop,n=f=>{let b=f.getBoundingClientRect();return b.top-r+f.parentElement.getBoundingClientRect().bottom-b.bottom},s=e.querySelector(".bundle-compare-rows--fill");if(s){let f=n(s),b=s.closest(".bundle-compare-section");for(let v=b;v;v=v.nextElementSibling){let g=v.matches("details[open]")&&v.querySelector(":scope > summary"),y=v===b?0:g?g.getBoundingClientRect().bottom+parseFloat(getComputedStyle(g).marginBottom)-v.getBoundingClientRect().top:v.getBoundingClientRect().height;f+=y+parseFloat(getComputedStyle(v).marginBottom)}e.style.setProperty("--compare-fill-around",`${f}px`)}let o=[...e.querySelectorAll(".bundle-compare-rows--scroll:not(.bundle-compare-rows--fill)")];if(o.length===0)return;let c=e.lastElementChild,u=new Map(o.filter(f=>c.contains(f)).map(f=>[f,f.parentElement.getBoundingClientRect().top])),d=Math.max(...u.values()),p=e.clientHeight-parseFloat(t.paddingTop)-parseFloat(t.paddingBottom),h=parseFloat(getComputedStyle(c).marginBottom);for(let f of o)u.get(f)>=d-1?f.style.setProperty("--compare-rest",`${p-n(f)-h}px`):f.style.removeProperty("--compare-rest")}_rebase(){let e=this._baseKey;if(ue&&e&&e!==ue.base&&(ue=null),ue&&e===ue.base){let{target:t}=ue;if(this._scope=ue.scope,this._mode=ue.mode,this._codePath=ue.codePath,ue=null,!t){this._targetIntegrity=null,this._otherDetails=null,this._status="idle";return}this._targetIntegrity=t,this._diff=null,this._diffKey=null;let r=this.source?null:oc(t,n=>!!(n.json||n.bundle));r?(this._otherDetails=r,this._status="ready"):(this._otherDetails=null,this._status="loading",this._loadOther(t));return}this._targetIntegrity=null,this._otherDetails=null,this._status="idle",this._scope="",this._codePath=null,this._diff=null,this._diffKey=null}get _baseKey(){return this.source?this.source.base:this.integrity}_swap(){let e=this._targetIntegrity;e&&e!==this._baseKey&&this._reopen(e,this._baseKey)}_pickBase(e){!e||e===this._baseKey||(e===this._targetIntegrity?this._swap():this._reopen(e,this._targetIntegrity))}_reopen(e,t){if(this.source){ue={base:e,target:t,scope:this._scope,mode:this._mode,codePath:this._codePath},this.source.open(e,t,this._mode);return}if(!Gt(l.bundles??[],this.integrity).some(s=>s.integrity===e))return;ue={base:e,target:t,scope:this._scope,mode:this._mode,codePath:this._codePath};let r=s=>s&&!s.error&&(s.json||s.bundle)&&[e,t].includes(s.integrity),n=[this._otherDetails,this._baseReady?this.details:null].filter(r);this.dispatchEvent(new CustomEvent("bundle-swap",{bubbles:!0,composed:!0,detail:{integrity:e,target:t,bundles:n,mode:this._mode}}))}_nameFor(e){return this.source?this.source.name(e):(l.bundles??[]).find(r=>r.integrity===e)?.name??`${e.slice(0,15)}\u2026`}_pick(e){this._choose(e),this._notify()}_notify(){this.dispatchEvent(new CustomEvent("bundle-compare-change",{bubbles:!0,composed:!0,detail:{base:this.integrity,target:this._targetIntegrity,mode:this._mode}}))}_choose(e){let t=e||null;if(this._targetIntegrity=t,this._otherDetails=null,this._codePath=null,this._diff=null,this._diffKey=null,!t){this._status="idle",this._scope="";return}this._status="loading",this._loadOther(t)}async _loadOther(e){if(this.source){let n;try{n=await this.source.load(e)}catch(s){if(s.name==="AbortError")return;n={error:s.message}}if(this._targetIntegrity!==e)return;this._otherDetails=n,this._status="ready";return}let t=Gt(l.bundles??[],this.integrity).find(n=>n.integrity===e);if(!t){this._status="idle",this._targetIntegrity=null,this._notify();return}let r;try{r=await ac(e,t)}catch(n){if(n.name==="AbortError")return;throw n}this._targetIntegrity===e&&(this._otherDetails=r,this._status="ready")}get _baseReady(){return!!(this.details&&this.details.integrity===this.integrity&&(this.details.json||this.details.bundle))}_openFile(e){this._codePath=e,this._mode="code",this._notify()}_openLine({path:e,line:t,query:r}){this._codeSeek={path:e,line:t-1,query:r},this._openFile(e)}_fileRow(e,t,r,n=e,s=!1,o=void 0,c=e,u=void 0){let d=this.source?.files;return a`<li><button type="button" class="bundle-compare-row bundle-compare-row-link" @click="${()=>this._openFile(e)}">${d?d.icon(e,[[this._otherDetails,c],[this.details,e]]):m}<span class="bundle-compare-row-path mono" data-tooltip-truncated data-tooltip="${n}">${t}</span>${d&&s?d.tag(this.details,e,u):m}${oi(o)}${r}</button></li>`}_group(e,t,r,n,s,o=m,{fill:c=!1,lanes:u=zr,style:d={}}={}){return t.length===0?m:a`<section class="${`bundle-compare-group bundle-compare-${r}`}" style="${_e({"--compare-lane":String(u.indexOf(r)+1),...d})}"><header class="bundle-compare-group-head"><span class="bundle-compare-dot" aria-hidden="true"></span> <span class="bundle-compare-group-title" data-tooltip-truncated data-tooltip="${e}">${e}</span> <span class="bundle-compare-group-count">${t.length}</span> ${o}</header><ul class="${c?"bundle-compare-rows bundle-compare-rows--scroll bundle-compare-rows--fill":"bundle-compare-rows bundle-compare-rows--scroll"}">${le(t,n,s)}</ul></section>`}_sizeCells(e){let t=n=>n==null?"\u2014":G(n),r=n=>`${n.toLocaleString()} LoC`;return e.delta===void 0?a`<span class="bundle-compare-row-size" data-tooltip="${e.lines>0?r(e.lines):m}">${t(e.bytes)}</span>`:a`<span class="${`bundle-compare-row-delta ${e.delta===null?"":Rt(e.delta)}`}" data-tooltip="${`${t(e.baseBytes)} \u2192 ${t(e.otherBytes)}${e.baseLines>0||e.otherLines>0?` \xB7 ${e.baseLines.toLocaleString()} \u2192 ${r(e.otherLines)}`:""}`}">${e.delta===null?"\u2014":Ys(e.delta)}</span>`}_sortActions(e,t,r,n=!1,s=this[e][t]){return a`<span class="bundles-overview-sort" role="group" aria-label="${`${t} ${r} order`}">${[["name","Name"],["size","Size"],...n?[["flags","Flags"]]:[]].map(([o,c])=>a`<button type="button" aria-pressed="${String(s===o)}" @click="${()=>{this[e]={...this[e],[t]:o}}}">${c}</button>`)}</span>`}_fileGroup(e,t,r,n,s){let o=this.source?.files,c=r!=="removed",u=g=>r==="added"?null:{details:this._otherDetails,path:g.basePath??g.path},d=g=>[...c&&o?.flags?o.flags(this.details,g.path,u(g)):[],...Vp(g.meta)],p=t.some(g=>d(g).length>0),h=this._fileSort[r]==="flags"&&!p?"name":this._fileSort[r],f=g=>r==="changed"?Math.abs(g.delta):g.bytes,b=h==="flags"?pd(t,d,g=>g.path):t.toSorted((g,y)=>(h==="size"?f(y)-f(g):0)||g.path.localeCompare(y.path)),v=g=>g.renamedFrom==null?this._fileRow(g.path,n(g.path),this._sizeCells(g),g.path,c,g.meta,g.basePath??g.path,u(g)):this._fileRow(g.path,Cr(n(g.renamedFrom),n(g.path)),this._sizeCells(g),`${g.renamedFrom} \u2192 ${g.path}`,c,g.meta,g.basePath??g.path,u(g));return this._group(e,b,r,g=>g.path,v,this._sortActions("_fileSort",r,"file",p,h),{lanes:s})}_pkgGroup(e,t,r,n){let s=this._pkgSort[r],o=d=>{let p=r==="changed"?d.delta:d.bytes;return p==null?-1:Math.abs(p)},c=t.toSorted((d,p)=>(s==="size"?o(p)-o(d):0)||Ke(d.pkg).localeCompare(Ke(p.pkg))),u=r==="changed"?0:Math.min(vh,Math.max(0,...t.map(d=>qe(d.versions).length)));return this._group(e,c,r,d=>d.pkg,d=>a`<li><div class="bundle-compare-row"><span class="bundle-compare-pkg-dot" style="${_e({background:Mi(d.pkg)})}"></span> <span class="bundle-compare-row-path" data-tooltip-truncated data-tooltip="${Ke(d.pkg)}">${Ke(d.pkg)}</span> ${r==="changed"?this._versionCell(d):u>0?a`<span class="bundle-compare-dep-ver" data-tooltip-truncated data-tooltip="${qe(d.versions)}">${qe(d.versions)}</span>`:m} ${this._sizeCells(r==="changed"?d:{bytes:d.bytes})}</div></li>`,this._sortActions("_pkgSort",r,"package"),{fill:!0,lanes:n,style:u>0?{"--compare-version-width":`${u}ch`}:{}})}_versionCell(e){let t=e.otherVersions,r=e.baseVersions;if(r.join()===t.join())return r.length>0?a`<span class="bundle-compare-dep-ver">${qe(r)}</span>`:m;let n=e.direction??"changed",s=n==="up"?"\u2191":n==="down"?"\u2193":"\xB1";return a`<span class="bundle-compare-ver" aria-label="${`${n==="up"?"Upgraded":n==="down"?"Downgraded":"Changed"}: ${qe(r)||"none"} to ${qe(t)||"none"}`}"><span class="bundle-compare-ver-from">${qe(r)||"\u2014"}</span> <span class="bundle-compare-ver-arrow" aria-hidden="true">→</span> <span class="${`bundle-compare-ver-to ${n}`}">${qe(t)||"\u2014"}</span> <span class="${`bundle-compare-ver-dir ${n}`}" aria-hidden="true">${s}</span></span>`}_depGroup(e,t,r,n){let s=r==="changed"?0:Math.min(vh,Math.max(0,...t.map(u=>u.range.length))),o=u=>a`<span class="bundle-compare-row-path" data-tooltip-truncated data-tooltip="${u.name}">${u.name}</span> ${this.source?.dependencyTags?.(u,r)??m}${u.kind?a`<span class="npm-dependency-kind">${u.kind}</span>`:m} ${r==="changed"?a`<span class="bundle-compare-ver" aria-label="${`Changed: ${u.from} to ${u.to}`}"><span class="bundle-compare-ver-from">${u.from}</span> <span class="bundle-compare-ver-arrow" aria-hidden="true">→</span> <span class="bundle-compare-ver-to changed">${u.to}</span></span>`:a`<span class="bundle-compare-dep-ver" data-tooltip-truncated data-tooltip="${u.range}">${u.range}</span>`}`,c=this.source?.openDependency;return this._group(e,t,r,u=>u.key,u=>a`<li>${c&&u.opens?a`<button type="button" class="bundle-compare-row bundle-compare-row-link" @click="${()=>c(u)}">${o(u)}</button>`:a`<div class="bundle-compare-row">${o(u)}</div>`}</li>`,m,{fill:!0,lanes:n,style:s>0?{"--compare-version-width":`${s}ch`}:{}})}_renderDependencies(e,t,r,n){return n.length===0?m:a`<section class="bundle-compare-section"><h3 class="bundle-compare-section-head">Dependencies</h3>${this._cols(n,a`${this._depGroup(`Removed \xB7 only in ${t}`,e.removed,"removed",n)} ${this._depGroup(`Added \xB7 only in ${r}`,e.added,"added",n)} ${this._depGroup("Changed",e.changed,"changed",n)}`,"dependencies")}</section>`}_renderPackages(e,t,r,n=zr){return e.removed.length===0&&e.added.length===0&&e.changed.length===0?m:a`<section class="bundle-compare-section"><h3 class="bundle-compare-section-head">Packages</h3>${this._cols(n,a`${this._pkgGroup(`Removed \xB7 only in ${t}`,e.removed,"removed",n)} ${this._pkgGroup(`Added \xB7 only in ${r}`,e.added,"added",n)} ${this._pkgGroup("Changed",e.changed,"changed",n)}`,"packages")}</section>`}_cols(e,t,r){let n=e.map(s=>s==="changed"?"minmax(0, 5fr)":"minmax(0, 4fr)").join(" ");return a`<div class="bundle-compare-cols" data-lanes="${e.length}" data-section="${r}" style="${_e({"--compare-lanes":n})}">${t}</div>`}_collapsible(e,t,r,n,s=""){let o=this._openSections.has(e);return a`<details class="bundle-compare-section bundle-compare-collapsible" .open="${j(o)}" @toggle="${c=>this._setSection(e,c.currentTarget.open)}"><summary class="bundle-compare-section-head" @click="${c=>{c.preventDefault(),this._setSection(e,!o)}}">${t} <span class="bundle-compare-section-count">${r.toLocaleString()}</span>${s?a`<span class="bundle-compare-section-note" data-tooltip-truncated data-tooltip="${s}">${s}</span>`:m}</summary>${o?n():m}</details>`}_setSection(e,t){if(t===this._openSections.has(e))return;let r=new Set(this._openSections);t?r.add(e):r.delete(e),this._openSections=r}_renderResolutions(e){if(e.totalChanges===0)return m;let t=e.changed,r=t.slice(0,yg),n=t.length-r.length,s=(u,d="")=>a`<td class="${d}"><code data-tooltip-truncated data-tooltip="${u}">${u}</code></td>`,o=u=>`${u.conditions}${u.platform===null?"":` \xB7 Platform: ${u.platform}`}`,c=r.some(u=>o(u)!=="*");return this._collapsible("resolutions","Import resolutions",t.length,()=>a`<section class="bundle-compare-group bundle-compare-changed bundle-compare-resolutions"><header class="bundle-compare-group-head"><span class="bundle-compare-dot" aria-hidden="true"></span> <span class="bundle-compare-group-title">Repointed</span> <span class="bundle-compare-group-count">${t.length}</span></header><table class="${c?"":"bundle-compare-resolutions--no-context"}"><thead><tr><th>File</th><th>Import</th><th>Before</th><th>After</th>${c?a`<th>Conditions</th>`:m}</tr></thead><tbody>${le(r,u=>u.key,u=>{let d=o(u);return a`<tr><td><button type="button" class="bundle-compare-resolution-parent" data-tooltip-truncated data-tooltip="${u.parent}" @click="${()=>this._openFile(u.parent)}">${u.parent}</button></td>${s(u.specifier)} ${s(u.baseTarget||"(empty target)","bundle-compare-resolution-before")} ${s(u.otherTarget||"(empty target)","bundle-compare-resolution-after")} ${c?a`<td class="bundle-compare-resolution-context"><span data-tooltip-truncated data-tooltip="${d}">${d}</span></td>`:m}</tr>`})}</tbody></table>${n>0?a`<div class="bundle-compare-more">and ${n.toLocaleString()} more…</div>`:m}</section>`)}_diffFor(){let e=`${this.integrity}|${this._targetIntegrity}|${this._scope}`;return(this._diffKey!==e||!this._diff)&&(this._diff=Sr(this._otherDetails,this.details,this._scope),this._diffKey=e),this._diff}_renderSummary(e){return $r(e,a`<div class="bundle-compare-modes" role="tablist" aria-label="Comparison view">${[["overview","Overview"],["code","Code"]].map(([t,r])=>a`<button type="button" role="tab" aria-selected="${String(this._mode===t)}" @click="${()=>{this._mode=t,this._notify()}}">${r}</button>`)}</div>`)}_renderPicker(e,t,r,n){return kr({source:this.source,from:{options:e,value:this._targetIntegrity,pick:s=>this._pick(s)},to:{options:this._baseOptions(),value:this._baseKey,placeholder:this._nameFor(this.integrity),pick:s=>this._pickBase(s)},clear:t?{run:()=>this._pick(null)}:null,swap:t&&this.source?.canSwap?.(this._targetIntegrity)!==!1?()=>this._swap():null,extras:r,comparison:n,openLine:s=>this._openLine(s)})}_baseOptions(){if(this.source)return Ne(this.source.choices??[]);let e=(l.bundles??[]).find(r=>r.integrity===this.integrity),t=Gt(l.bundles??[],this.integrity);return this._bundleOptions(e?[e,...t]:t)}_otherOptions(){return this.source?Ne(this.source.options):this._bundleOptions(Gt(l.bundles??[],this.integrity))}_bundleOptions(e){let t=new Map;for(let r of e)t.set(r.name,(t.get(r.name)??0)+1);return e.map(r=>({id:r.integrity,integrity:r.integrity,kind:r.kind??(r.name.toLowerCase().endsWith(".map")?"sourcemap":"stasis"),summary:r.summary,size:typeof r.size=="number"?G(r.size):"\u2014",filename:t.get(r.name)>1?`${r.name} \xB7 ${r.integrity.slice(7,13)}\u2026`:r.name}))}render(){let e=this._otherOptions(),t=!!this._targetIntegrity&&(!!this.source||e.some(h=>h.integrity===this._targetIntegrity)),r=this._baseReady?wn(this.details,t?this._otherDetails:null):[],n=r.length>0?a`<bundle-scope-selector .reasons="${r}" .value="${this._scope}" label="Compare scope" @scope-change="${h=>{this._scope=h.detail.value}}"></bundle-scope-selector>`:m,s=this.source?.noun??"bundle",o=t&&this._status==="ready"&&this._otherDetails&&(this._otherDetails.json||this._otherDetails.bundle)&&!this._otherDetails.error,c=this._baseReady&&o?{base:this._otherDetails,other:this.details,files:this._diffFor().files}:null,u=e.length>0||this.source?this._renderPicker(e,t,n,c):n,d=this._baseReady&&o?this._mode:"overview",p;return this._baseReady?this.source&&!t&&(this.source.pending||this.source.error||e.length===0)?p=a`<div class="${`bundle-compare-empty${this.source.error?" is-error":""}`}">${this.source.pending?`Loading ${s}s\u2026`:this.source.error??a`No other ${s}s to compare <strong>${this._nameFor(this.integrity)}</strong> with.`}</div>`:e.length===0&&!this.source?p=a`<div class="bundle-compare-empty">No other bundles to compare with. Drop a second <code>.map</code> or <code>.stasis.code.br</code> bundle to diff against this one.</div>`:t?this._status==="loading"||!this._otherDetails?p=a`<div class="bundle-compare-empty">Comparing…</div>`:this._otherDetails.error?p=a`<div class="bundle-compare-empty is-error">Couldn't read the selected ${s}: ${this._otherDetails.error}</div>`:!this._otherDetails.json&&!this._otherDetails.bundle?p=a`<div class="bundle-compare-empty is-error">The selected ${s} couldn't be parsed.</div>`:d!=="code"&&(p=this._renderDiff()):p=a`<div class="bundle-compare-empty">Pick a ${s} above to compare <strong>${this._nameFor(this.integrity)}</strong> against.</div>`:p=a`<div class="bundle-compare-empty">Loading bundle…</div>`,a`<div class="bundle-compare">${xr(u,this._baseReady&&o?this._renderSummary(this._diffFor()):m)} ${d==="code"?Nr({base:this._otherDetails,other:this.details,diff:this._diffFor(),source:this.source,path:this._codePath,seek:this._codeSeek,baseName:this._nameFor(this._targetIntegrity),otherName:this._nameFor(this.integrity),select:h=>{this._codePath=h}}):a`<div class="bundle-compare-body">${p}</div>`}</div>`}_renderDiff(){let e=this._diffFor(),t=this._nameFor(this._targetIntegrity),r=this._nameFor(this.integrity),n=[...e.files.onlyBase.map(y=>y.path),...e.files.onlyOther.map(y=>y.path),...e.files.changed.flatMap(y=>y.renamedFrom==null?[y.path]:[y.path,y.renamedFrom])],s=Ji(e.files.root,ft(n).prefix),{prefix:o}=s,c=y=>o&&y.startsWith(o)?y.slice(o.length):y,u=e.files.onlyBase.length+e.files.onlyOther.length+e.files.changed.length,d={removed:e.files.onlyBase,added:e.files.onlyOther,changed:e.files.changed},p=!e.totals.identical,h=this.source?.dependencies?.(this._otherDetails,this.details)??null,f=zr.filter(y=>(h??e.packageRows)[y].length>0),b=p?zr.filter(y=>d[y].length>0):[],v=b.every(y=>f.includes(y))?f:b,g=p?this.source?.files?.warning(this.details,[...d.added,...d.changed].map(y=>y.path)):m;return a`${h?this._renderDependencies(h,t,r,f):this._renderPackages(e.packageRows,t,r,f)} ${g??m} ${e.totals.identical?e.resolutions.totalChanges>0?a`<div class="bundle-compare-caption">File contents are unchanged; import resolutions differ.</div>`:a`<div class="bundle-compare-identical">These two bundles carry identical files (${e.totals.unchangedFiles.toLocaleString()} ${e.totals.unchangedFiles===1?"file":"files"})${s.from?a`, moved <span class="mono">${Er(s)}</span>`:""}.</div>`:this._collapsible("files","Files",u,()=>this._cols(v,a`${this._fileGroup(`Removed \xB7 only in ${t}`,d.removed,"removed",c,v)} ${this._fileGroup(`Added \xB7 only in ${r}`,d.added,"added",c,v)} ${this._fileGroup("Changed",d.changed,"changed",c,v)}`,"files"),s.from?`${s.from} \u2192 ${s.to}`:o)} ${this._renderResolutions(e.resolutions)}`}};customElements.define("bundle-compare",$o);var xo=class extends Fl{static properties={reviewTitle:{type:String}};render(){return a`<dialog aria-labelledby="discard-review-title" @close="${this._onClose}"><header><h3 id="discard-review-title">Discard unpublished review?</h3></header><p class="lwd-body"><strong>${this.reviewTitle}</strong></p><p class="lwd-note">This permanently deletes this review and all its file verdicts and notes. This cannot be undone.</p><footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" data-role="cancel" @click="${this._onCancel}">Cancel</button> <button type="button" class="danger" @click="${this._onConfirm}">Discard review</button></footer></dialog>`}};customElements.define("discard-review-dialog",xo);function qr(i){return Y("discard-review-dialog",i)}var Pt={...ad,"accept-with-nits":"Accept with nits"},_g=i=>i.revokedAt===null?i.publishedAt===null?"Draft":"Published":"Revoked",wg={accept:"\u2713","accept-with-nits":"\xB7","request-changes":"!",reject:"\xD7"},So=i=>a`<span class="${`npm-review-verdict-icon ${i??"unchecked"}`}" aria-hidden="true">${wg[i]??""}</span>`,At=i=>a`<span class="npm-review-verdict">${So(i)}${Pt[i]??"Not reviewed"}</span>`,ci=i=>a`<span class="${`npm-review-badge ${i.revokedAt===null?i.publishedAt===null?"":"published":"revoked"}`}">${_g(i)}</span>`,Co=i=>a`<time datetime="${new Date(i).toISOString()}">${new Date(i).toLocaleString()}</time>`,Eo=(i,e)=>a`<div class="npm-review-progress" role="progressbar" aria-label="Files checked" aria-valuemin="0" aria-valuemax="${e||1}" aria-valuenow="${i}"><span style="${`width:${e?i/e*100:0}%`}"></span></div>`;function yh(i=[],e=[]){let t=new Set(e);return new Map(i.filter(r=>r.status&&!t.has(r.file)).map(r=>[r.file,{status:r.status,notes:+!!r.comment.trim()}]))}function lt(i){let e=ud(i);if(e.length===0)return m;let t=e.filter(r=>r.bullet);return a`${e.filter(r=>!r.bullet).map(r=>a`<p class="npm-review-note">${r.text}</p>`)} ${t.length>0?a`<ul class="npm-review-note npm-review-note-list">${t.map(r=>a`<li>${r.text}</li>`)}</ul>`:m}`}var li=null,pe=(i,e)=>["ecosystem","package","version","integrity","basePackage","baseVersion","baseIntegrity"].every(t=>i[t]===e[t]);function di(i,e=!1){li={review:i,continueReview:e}}function _h(i){if(!li||!pe(li.review,i))return null;let e=li;return li=null,e}function Ae(i){let e=`${i.package} ${i.version}`;return i.basePackage?i.basePackage===i.package?`${i.package} ${i.baseVersion} -> ${i.version}`:`${i.basePackage} ${i.baseVersion} -> ${e}`:e}var ie=i=>i._blocked||i._loading,wh=i=>i._shownReview?.publishedAt!=null,kg=i=>i.coverage==="full"?"Full":"Partial",Ro=i=>i._error?a`<p class="npm-review-error" role="alert">${i._error}</p>`:m,kh=i=>i._saveBlocked?a`<div class="npm-review-saving" role="status">Saving changes…</div>`:m,To=i=>[i._continuation?.review,...i._reviews].filter(Boolean).toSorted((e,t)=>+(e.publishedAt!==null)-+(t.publishedAt!==null)||(t.publishedAt??t.time)-(e.publishedAt??e.time)),$h=i=>`npm-review-button npm-review-primary npm-review-finalize ${i._allowedVerdicts[0]}`,xh=(i,e,t,r,n=Object.keys(Pt),s=!1)=>a`<div class="npm-review-verdict-options" role="group" aria-label="Verdict">${Object.entries(s?{"":"Not checked",...Pt}:Pt).map(([o,c])=>a`<label class="${`npm-review-verdict-choice ${o||"unchecked"}`}"><input type="radio" name="${i}" aria-label="${c}" value="${o}" .checked="${j(e===o)}" ?disabled="${r||o!==""&&!n.includes(o)}" @change="${()=>t(o)}">${c}</label>`)}</div>`;function $g(i){let e=wh(i),t=i._shownReview,r=i._summary,n=i._canEdit?{label:"Finalize review",run:()=>i._beginPublish(),disabled:!r.checkedFiles}:!e||!i._writable?null:i._activeReview||i._ownPublished.length===0?{label:"Resume your review",run:()=>i._resume()}:t.user===i.session?.id?{label:"Revise review",run:()=>i._change({action:"continue",reviewId:t.id,revision:t.revision})}:null;return a`<div class="npm-review-summary-actions">${e||i._draftStarted?ci(t??{publishedAt:null,revokedAt:null}):m}<div class="npm-review-progress-block"><span>${i._unsaved&&(i._saveBlocked||i._error)?a`<button type="button" class="npm-review-button npm-review-text-button" @click="${()=>i._openPanel("unsaved")}">Unsaved changes</button>`:a`<strong>${r.checkedFiles} of ${r.totalFiles}</strong> files checked`}</span> ${Eo(r.checkedFiles,r.totalFiles)}</div>${n?a`<button type="button" class="${i._canEdit?$h(i):"npm-review-button"}" ?disabled="${ie(i)||n.disabled}" @click="${n.run}">${n.label} ${xe}</button>`:m}</div>`}function xg(i){let e=i.source??hd(i.entry),t=!!(i._target&&i._target!=="(empty)"),r=Ne(e.options,s=>`${i.entry.npm.name}@${s.id}`);t&&!r.some(s=>s.id===i._target)&&r.push(...Ne([{id:i._target,name:i._target,format:"npm"}]));let n=Ne(e.choices);return n.some(s=>s.id===i.entry.npm.version)||n.push(...Ne([{id:i.entry.npm.version,name:i.entry.npm.version,format:"npm"}])),xr(kr({source:e,label:"Review",disabled:ie(i),from:{options:r,value:t?i._target:null,label:"Review base",pick:s=>{i._navigate(s)}},to:{options:n,value:i.entry.npm.version,label:"Version to review",pick:s=>{i._navigateTo({view:"npm",packageName:i.entry.npm.name,packageSpec:s,bundleTab:"review",...i._location(i._target)})}},clear:t?{label:"Clear review base",run:()=>{i._navigate("(empty)")}}:null,openLine:s=>i._openLine(s),comparison:{base:i._base,other:i.details,files:i._diff.files}}),$r(i._diff))}function Sg(i){return a`<div class="npm-review-toolbar"><nav class="npm-review-toolbar-group" aria-label="Review breadcrumbs"><button type="button" class="npm-review-button npm-review-text-button" ?disabled="${ie(i)}" @click="${()=>{i._navigateTo({view:"reviews"})}}">My reviews</button> ${xe}<button type="button" class="npm-review-button npm-review-text-button npm-review-package" aria-haspopup="dialog" ?disabled="${i._blocked}" @click="${()=>i._openPanel("reviews")}"><span>${i.entry.npm.name}@${i.entry.npm.version}</span><span class="npm-review-count">${To(i).length}</span></button></nav>${$g(i)}</div>`}function Cg(i,e=i._file,t=!1){let r=i._editorState(e),n=i._shownReview?.entries.find(c=>c.file===e),s=i._nonTextFiles.includes(e),o=!s&&["accept-with-nits","request-changes","reject"].includes(r.status);return a`<section class="${`npm-review-decision${t?" npm-review-inline-decision":""}`}" aria-label="File decision">${i._canEdit?a`${xh(`file:${e}`,s?"":r.status,c=>{i._setFileStatus(e,c)},ie(i)||s,void 0,!0)} ${s?a`<p class="npm-review-help">Non-text file. Verdicts are not supported yet; this file remains unchecked.</p>`:m} ${o?a`<textarea aria-label="File note" rows="2" maxlength="20000" placeholder="Add a note (optional)…" .value="${j(r.comment)}" ?disabled="${ie(i)}" @input="${c=>i._editFile(e,{comment:c.target.value})}" @blur="${()=>{i._saveFile(e)}}"></textarea>`:m}`:a`${t?m:a`<header><strong>File review</strong><span class="npm-review-muted">${wh(i)?"Frozen":"Read only"}</span></header>`} ${n?.status&&!s?a`${At(n.status)}${lt(n.comment)}`:a`<p class="npm-review-muted">This file was not reviewed.</p>`} ${i._writable?m:a`<p class="npm-review-help">Triage access is required to add a review.</p>`}`}</section>`}function Sh(i,e,t,r,n,s){return a`<fieldset class="npm-review-team-options"><legend>${e}</legend>${t.map(o=>a`<mode-switch label="${o.name}" .checked="${r.has(o.id)}" .disabled="${ie(i)}" @click="${()=>{if(ie(i))return;let c=new Set(r);c.has(o.id)?c.delete(o.id):c.add(o.id),n(c)}}"></mode-switch>`)}${s}</fieldset>`}function Eg(i,e){let t=i._allowedVerdicts,r=Xt(e.entries,i._files,i._nonTextFiles),n=e.entries.filter(s=>s.status&&s.comment.trim()&&!i._nonTextFiles.includes(s.file));return a`<form class="npm-review-publish-form" @submit="${s=>{s.preventDefault(),i._publish()}}"><div class="npm-review-dialog-body"><section class="npm-review-coverage"><div><strong>${kg(r)} review</strong><span>${r.checkedFiles} of ${r.totalFiles} files checked</span></div>${Eo(r.checkedFiles,r.totalFiles)}<p>${r.totalFiles>r.checkedFiles?a`${r.totalFiles-r.checkedFiles} files not checked. <button type="button" class="npm-review-button npm-review-text-button" @click="${()=>{i._unchecked=!0,i._closePanel()}}">View files</button>`:"Every file has a verdict."}</p>${i._needsPackageJson?a`<p class="npm-review-error">Review ${i._files.includes("package.json")?a`<button type="button" class="npm-review-button npm-review-text-button" @click="${()=>{i._closePanel(),i._selectFile("package.json")}}">package.json</button>`:"package.json"} before publishing a partial review.</p>`:m}</section>${n.length>0?a`<section aria-label="File notes"><strong>File notes</strong><ul class="npm-review-publish-notes" tabindex="0" aria-label="Saved file notes">${n.map(s=>a`<li><span class="dependency-review-entry-file">${Ve(s.file)}<span>${s.file}</span></span> ${lt(s.comment)}</li>`)}</ul></section>`:m}<div><strong>Final verdict</strong>${xh("final-verdict",i._finalStatus,s=>{i._finalStatus=s},ie(i),t)}</div>${i._securityLimit==="reject"?a`<p class="npm-review-help">Malware detected. Only Reject is available.</p>`:i._securityLimit==="request-changes"?a`<p class="npm-review-help">Critical vulnerabilities detected.</p>`:m} <label>Final note <span class="npm-review-muted">· optional</span><textarea aria-label="Final comment" rows="3" maxlength="20000" .value="${j(i._finalComment)}" placeholder="Summarize your findings or explain what remains…" ?disabled="${ie(i)}" @input="${s=>{i._finalComment=s.target.value}}"></textarea></label> ${i._unchangedContinuation?a`<p class="npm-review-help">Change a verdict or note to publish a new review.</p>`:m} ${Sh(i,"Publish to teams",i._teams,i._selectedTeams,s=>{i._selectedTeams=s},i._selectedTeams.size>0?m:a`<p class="npm-review-error">${i._teams.length===0?"No teams you belong to have dependency review enabled.":"Select at least one team to publish."}</p>`)} ${Ro(i)}</div><footer class="npm-review-dialog-footer"><p>Publishing freezes your verdicts and notes.<br>You can continue in a new review to make changes.</p><button type="submit" class="${$h(i)}" ?disabled="${ie(i)||!i._canPublish}">Publish to ${i._selectedTeams.size} ${i._selectedTeams.size===1?"team":"teams"} ${xe}</button></footer></form>`}function Tg(i,e){let t=e===i._shownReview,r=e.publishedAt!==null,n=r?e:pe(e,i._context)?Xt(e.entries,i._files,i._nonTextFiles):{checkedFiles:e.entries.filter(p=>p.status).length,totalFiles:null},s=[i._continuation?.review,...i._reviews].some(p=>p?.publishedAt===null&&p.user===i.session?.id&&pe(p,e)),o=e.user===i.session?.id,c=i._teams.filter(p=>!e.teams.some(h=>h.id===p.id)),u=i._additionalTeams.get(e.id)??new Set(c.length===1?c.map(p=>p.id):[]),d=c.filter(p=>u.has(p.id)).map(p=>p.id);return a`<section class="npm-review-entry" aria-current="${String(t)}"><div class="npm-review-history-heading"><strong>${e.userLogin}</strong>${t?a`<span class="npm-review-current">Current</span>`:m}${ci(e)}</div><p class="npm-review-help">${e.basePackage?`${e.basePackage===e.package?e.baseVersion:`${e.basePackage}@${e.baseVersion}`} \u2192 ${e.version}`:"All package files"}</p><div class="npm-review-entry-result">${r?At(e.status):m}<span class="dependency-review-coverage"> ${r?a`${n.coverage==="full"?"Full":a`<span class="dependency-review-partial">Partial</span>`} ·`:m}${n.checkedFiles}${n.totalFiles===null?m:`/${n.totalFiles}`} files checked</span></div><p class="npm-review-help">${e.teams.length>0?`${e.teams.map(p=>p.name).join(", ")} \xB7 `:""}${Co(e.publishedAt??e.time)}</p>${lt(e.comment)}<div class="npm-review-entry-actions"><button type="button" class="npm-review-button" ?disabled="${ie(i)}" @click="${()=>{i._openReview(e)}}">Open ${xe}</button> ${r&&o&&!s&&i._writable?a`<button type="button" class="npm-review-button" aria-label="Revise in a new draft" ?disabled="${ie(i)}" @click="${()=>{i._openReview(e,!0)}}">Revise</button>`:m} ${r&&o&&i._writable&&e.revokedAt===null?a`<button type="button" class="npm-review-button npm-review-danger" ?disabled="${ie(i)}" @click="${()=>i._change({action:"revoke",reviewId:e.id,revision:e.revision})}">Revoke</button>`:m}<review-audit-copy .review="${e}"></review-audit-copy>${!r&&o&&i._writable?a`<button type="button" class="dependency-review-discard" aria-label="Discard review" ?disabled="${ie(i)}" @click="${()=>{i._discard(e)}}">${J(vi)}</button>`:m}</div>${r&&o&&i._writable&&e.revokedAt===null&&c.length>0?a`<details class="npm-review-share"><summary>Publish to more teams</summary>${Sh(i,"Teams",c,u,p=>{i._additionalTeams=new Map(i._additionalTeams).set(e.id,p)},a`<button type="button" class="npm-review-button" ?disabled="${ie(i)||d.length===0}" @click="${()=>i._change({action:"publish",reviewId:e.id,revision:e.revision,teamIds:d})}">Publish to more teams</button>`)}</details>`:m} ${e.revokedAt===null?m:a`<p class="npm-review-help">Revoked ${Co(e.revokedAt)}. Content and team links remain frozen.</p>`}</section>`}function Rg(i){if(!i._panel)return m;let e={publish:"Publish review",reviews:"Reviews",unsaved:"Unsaved changes"};return a`<dialog class="npm-review-dialog" aria-label="${e[i._panel]}" @cancel="${t=>{t.preventDefault(),i._closePanel()}}"><button type="button" class="detail-action npm-review-close" aria-label="Close panel" ?disabled="${i._blocked}" @click="${()=>i._closePanel()}">×</button><header class="npm-review-dialog-head"><h2>${e[i._panel]}</h2><p>${i._panel==="reviews"?`${i.entry.npm.name}@${i.entry.npm.version}`:Ae(i._context)}</p></header>${i._panel==="publish"?Eg(i,i._activeReview):a`<div class="${`npm-review-dialog-body${i._panel==="reviews"?" npm-review-entries":""}`}">${i._panel==="unsaved"?a`${i._dirtyFiles.map(t=>a`<button type="button" class="npm-review-button" @click="${()=>{i._closePanel(),i._selectFile(t)}}">${t} ${xe}</button>`)}`:To(i).map(t=>Tg(i,t))} ${i._panel==="reviews"&&To(i).length===0?a`<p class="npm-review-muted">No reviews yet.</p>`:m}${Ro(i)}</div>`} ${kh(i)}</dialog>`}function Lg(i){let e=i._shownReview?.entries,t=i._files,r=i._nonTextFiles;if(i._treeProgress?.entries!==e||i._treeProgress?.files!==t||i._treeProgress?.nonTextFiles!==r){let c=yh(e,r),u=new Map,d=0;for(let p of i._files){let h=p.split("/"),f=+!!c.get(p)?.status;d+=f;for(let b=1;b<h.length;b++){let v=h.slice(0,b).join("/"),g=u.get(v)??{total:0,checked:0};g.total++,g.checked+=f,u.set(v,g)}}i._treeProgress={entries:e,files:t,nonTextFiles:r,states:c,directories:u,checked:d}}let{states:n,directories:s,checked:o}=i._treeProgress;return{railLabel:"Files",treeLabel:"Review files",collapseLabel:"Collapse folders",searchLabel:"Find a file",searchPlaceholder:"Find a file\u2026",treePageSize:300,openAllMax:0,filterContent:!1,fullPaths:!0,collapseClearsSearch:!0,canSelect:()=>!i._blocked&&!i._panel,fileFilter:i._unchecked?c=>!n.get(c)?.status:null,fileLabel:c=>`${c}, ${Pt[n.get(c)?.status]??"Not reviewed"}`,filePrefix:c=>So(n.get(c)?.status),fileSuffix:c=>n.get(c)?.notes?a`<span class="npm-review-note-dot" aria-label="Has notes">•</span>`:m,directoryLabel:c=>{let u=s.get(c.sourcePath);return`${c.sourcePath}, ${u?.checked??0} of ${u?.total??0} checked`},directorySummary:c=>{let u=s.get(c.sourcePath);return`${u?.checked??0}/${u?.total??0}`},filters:a`<div class="npm-review-filters" aria-label="Filter review files"><button type="button" class="npm-review-button" aria-pressed="${String(!i._unchecked)}" @click="${()=>{i._unchecked=!1}}">All ${i._files.length}</button> <button type="button" class="npm-review-button" aria-pressed="${String(!!i._unchecked)}" @click="${()=>{i._unchecked=!0}}">Unchecked ${i._files.length-o}</button></div>`,fileActions:(c,u)=>Cg(i,c,u)}}function Ch(i){return i._base?a`${xg(i)}${Sg(i)}${i._panel?m:Ro(i)} ${Nr({base:i._base,other:i.details,diff:i._diff,source:i.source,path:i._path,seek:i._seek,baseName:i._base.npm?`${i._base.npm.name}@${i._base.npm.version}`:"Empty package",otherName:`${i.entry.npm.name}@${i.entry.npm.version}`,select:e=>i._selectFile(e),extensions:Lg(i),mode:i._mode})} <span class="npm-review-announcement" role="status">${i._notice??""}</span>${i._panel?m:kh(i)}${Rg(i)}`:a`<div class="npm-review-empty" role="${i._baseError?"alert":"status"}">${i._baseError??"Loading comparison\u2026"} ${i._baseError?a`<button type="button" class="npm-review-button" @click="${()=>{i._baseKey=null,i._loadBase(i._target,i.request?.resume)}}">Retry</button>`:m}</div>`}var Mg={maxLines:5e4,maxBytes:2*1024*1024},Pg={integrity:"(empty)",kind:"sourcemap",json:{version:3,sources:[],sourcesContent:[]},fileSizes:new Map},Eh=(i,e)=>({ecosystem:"npm",package:i.npm.name,version:i.npm.version,integrity:i.integrity,basePackage:e?.npm?.name??null,baseVersion:e?.npm?.version??null,baseIntegrity:e?.npm?e.integrity:null}),ui=(i,e)=>`${i}@${e??"latest"}`,Lo=class extends U{static properties={entry:{attribute:!1},details:{attribute:!1},request:{attribute:!1},session:{attribute:!1},source:{attribute:!1},_teams:{state:!0},_selectedTeams:{state:!0},_additionalTeams:{state:!0},_reviews:{state:!0},_loading:{state:!0},_error:{state:!0},_saving:{state:!0},_saveBlocked:{state:!0},_file:{state:!0},_seek:{state:!0},_finalStatus:{state:!0},_finalComment:{state:!0},_base:{state:!0},_baseError:{state:!0},_panel:{state:!0},_path:{state:!0},_selectedReview:{state:!0},_unchecked:{state:!0},_notice:{state:!0},_continuation:{state:!0}};createRenderRoot(){return this}constructor(){super(),this._teams=[],this._reviews=[],this._files=[],this._nonTextFiles=[],this._selectedTeams=new Set,this._additionalTeams=new Map,this._editors=new Map,this._file=null,this._path=null,this._loading=!1,this._saving=!1,this._error=null,this._context=null,this._key=null,this._controller=new AbortController,this._mode="code",this._panel=null,this._selectedReview=null,this._unchecked=!1,this._pendingSaves=[],this._saveBlocked=!1}disconnectedCallback(){super.disconnectedCallback(),this._controller.abort(),this._cancelSaves(),this._dismissLoading?.(),this._key=null,this._baseKey=null}updated(){let e=this.querySelector("dialog");e&&!e.open&&e.showModal(),this._rememberBase()}_rememberBase(){l.bundleDetailsTab!=="review"||l.selectedBundle!==this.entry?.integrity||!this._context||!this._activeReview&&this._ownPublished.length===0&&!this._unsaved||(l.npmReview={bundle:this.entry.integrity,...this._context.basePackage?{reviewPackage:this._context.basePackage,reviewSpec:this._context.baseVersion}:{},started:!0,user:this.session?.id})}get _writable(){return["triage","manage","admin"].includes(this.session?.role)&&!this.session?.viewer}get _activeReview(){return this._reviews.find(e=>e.user===this.session?.id&&e.publishedAt===null&&pe(e,this._context))??(this._continuation&&this._continuation.review.user===this.session?.id?this._continuation.review:null)}get _ownPublished(){return this._reviews.filter(e=>e.user===this.session?.id&&e.publishedAt!==null&&pe(e,this._context)).toSorted((e,t)=>t.publishedAt-e.publishedAt)}get _shownReview(){return this._selectedReview?this._reviews.find(e=>e.id===this._selectedReview):this._activeReview??this._ownPublished[0]??null}get _canEdit(){return this._writable&&!this._selectedReview&&(this._activeReview!==null||this._ownPublished.length===0)}_isDirty(e,t){return!this._nonTextFiles.includes(e)&&(t.comment!==(t.edit?.comment??"")||t.status!==(t.edit?.status??""))}get _dirtyFiles(){return[...this._editors].filter(([e,t])=>this._isDirty(e,t)).map(([e])=>e)}get _blocked(){return this._saving||this._saveBlocked}get _unsaved(){return this._pendingSaves.length>0||this._dirtyFiles.length>0}get _draftStarted(){return this._canEdit&&(this._unsaved||this._activeReview&&!this._continuation||this._continuation&&this._publishRevision!=null&&!this._unchangedContinuation)}get _summary(){return Xt(this._shownReview?.entries??[],this._files,this._nonTextFiles)}get _securityLimit(){return this.source?.reviewVerdictLimit?.(this.entry,this._base)??"accept"}get _allowedVerdicts(){let e=new Map((this._shownReview?.entries??[]).map(t=>[t.file,t]));if(this._canEdit)for(let[t,r]of this._editors)e.set(t,{file:t,status:r.status||null});return cd([...e.values()].filter(t=>!this._nonTextFiles.includes(t.file)),this._securityLimit)}get _needsPackageJson(){return dd(this._activeReview?.entries??[],this._files,this._nonTextFiles)}get _unchangedContinuation(){let e=this._continuation?.source;return!!(e&&this._finalStatus===e.status&&this._finalComment===e.comment)}get _canPublish(){return this._canEdit&&this._panel==="publish"&&this._activeReview?.revision===this._publishRevision&&this._summary.checkedFiles>0&&!this._needsPackageJson&&!this._unchangedContinuation&&this._selectedTeams.size>0&&!this._unsaved&&this._allowedVerdicts.includes(this._finalStatus)}_location(e){let t=e&&e!=="(empty)"?yn(e):null;return t?{reviewPackage:t.name,reviewSpec:t.spec}:{}}_navigate(e){return this._navigateTo(_n(this.entry,"review",this._location(e)))}async _navigateTo(e){if(this._blocked||this._loading)return;let t=this._key,r=this._navigation={};this._unsaved&&!await this._saveAll()||t===this._key&&r===this._navigation&&!this._unsaved&&await me?.navigate(e)}async _loadBase(e,t=!1){let r=JSON.stringify([this.entry.integrity,e,this.session?.id,this.session?.role]);if(this._baseKey!==r){this._baseKey=r,this._base=null,this._baseError=null,this._controller.abort(),this._cancelSaves(),this._key=null,this._controller=new AbortController;try{let n=t?await Bd(Eh(this.entry,null),this._controller.signal):null;if(this._baseKey!==r)return;n&&(e=n.basePackage?ui(n.basePackage,n.baseVersion):"(empty)");let s=e==="(empty)"?null:yn(e),o=s?(await Gc(s.name,s.spec??"latest")).details:Pg;if(this._baseKey!==r)return;t&&(n&&di(n),this._target=e,this.request={bundle:this.entry.integrity,...this._location(e)},this._baseKey=JSON.stringify([this.entry.integrity,e,this.session?.id,this.session?.role])),this._base=o,this._ensureContext(o)}catch(n){this._baseKey===r&&(this._baseError=n.message)}}}_ensureContext(e){let t=Eh(this.entry,e),r=JSON.stringify([this.session?.id,this.session?.role,t]);if(r===this._key)return;this._controller.abort(),this._cancelSaves(),this._controller=new AbortController,this._context=t,this._diff=Sr(e,this.details);let n=xp(e,this.details,this._diff);this._files=Wt(Ki(n.map(o=>o.path)));let s=new Set(n.filter(o=>!ld(o.before,o.after)).map(o=>o.path));if(this._nonTextFiles=this._files.filter(o=>s.has(o)),this._mode=Sp(n,Mg)?"diff":"code",this._key=r,this._teams=[],this._reviews=[],this._selectedTeams=new Set,this._additionalTeams=new Map,this._selectedReview=null,this._continuation=null,this._editors.clear(),this._path=this._files[0]??null,this._panel=null,this._notice="",this._resetEditor(this._path),this._saving=!1,this._refresh(!0),l.bundleDetailsTab==="review"&&l.selectedBundle===this.entry.integrity){let o=this._location(e.npm?ui(e.npm.name,e.npm.version):"(empty)");l.npmReview={bundle:this.entry.integrity,...o},this._baseKey=JSON.stringify([this.entry.integrity,e.npm?ui(e.npm.name,e.npm.version):"(empty)",this.session?.id,this.session?.role]),me?.replaceRoute(_n(this.entry,"review",o))}}async _refresh(e=!1){let t=this._key;for(;t===this._key&&this._pendingSaves.length>0;)if((await Promise.all(this._pendingSaves.map(n=>n.promise))).some(n=>!n))return;if(t!==this._key)return;this._dismissLoading?.();let r=this._dismissLoading=Oe("Loading reviews\u2026",{duration:0});this._loading=!0,this._error=null;try{let{reviews:n,teams:s}=await Zt({...this._context,allBases:!0},null,null,this._controller.signal);if(t===this._key){let o=this._unsaved;this._reviews=n,this._teams=s,n.some(d=>d.user===this.session?.id&&d.publishedAt===null&&pe(d,this._context))&&(this._continuation=null),this._rememberBase();let c=_h(this._context),u=c&&n.find(d=>d.id===c.review.id);u?.publishedAt!=null&&(c.continueReview?this._continue(u.id,u.revision):this._selectedReview=u.id),this._selectedTeams=new Set(s.filter(d=>e?s.length===1:this._selectedTeams.has(d.id)).map(d=>d.id)),o||(this._editors.clear(),this._resetEditor(this._file))}}catch(n){t===this._key&&n.name!=="AbortError"&&(this._error=n.message)}finally{r(),t===this._key&&(this._loading=!1)}}_resetEditor(e=null){this._publishRevision=null,this._file=e,this._editorState(e)}_editorState(e){let t=this._canEdit?this._editors.get(e):null;if(!t){let r=this._shownReview?.entries.find(n=>n.file===e&&n.status)??null;t={edit:r,revision:this._activeReview?.revision??null,comment:this._nonTextFiles.includes(e)?"":r?.comment??"",status:this._nonTextFiles.includes(e)?"":r?.status??""},this._canEdit&&this._editors.set(e,t)}return{...t,dirty:this._isDirty(e,t)}}_editFile(e,t){!this._canEdit||this._blocked||(this._resetEditor(e),Object.assign(this._editors.get(e),t),this.requestUpdate())}_setFileStatus(e,t){if(!(this._blocked||this._nonTextFiles.includes(e)))return this._editFile(e,{status:t,...t?{}:{comment:""}}),this._saveFile(e)}_selectFile(e){this._blocked||!this._files.includes(e)||(this._path=e,this._resetEditor(e))}_openLine({path:e,line:t,query:r}){this._blocked||!this._files.includes(e)||(this._seek={path:e,line:t-1,query:r},this._selectFile(e))}_openPanel(e){this._panel=e}async _openReview(e,t=!1){if(this._blocked||this._loading)return;if(pe(e,this._context)){t?this._continue(e.id,e.revision):e.publishedAt===null?this._resume():this._showPublished(e);return}let r=this._key;this._unsaved&&!await this._saveAll()||r!==this._key||(di(e,t),await this._navigate(e.basePackage?ui(e.basePackage,e.baseVersion):"(empty)"))}_closePanel(){this._blocked||(this.querySelector("dialog")?.close(),this._panel=null)}_showPublished(e){this._selectedReview=e.id,this._panel=null,this._file=this._path}_resume(){this._selectedReview=null,this._panel=null,this._resetEditor(this._path)}async _discard(e){if(this._blocked||this._loading||!this._writable||e.user!==this.session.id||e.publishedAt!==null)return;let t=e===this._activeReview,r=this._key,n=this._controller.signal;this._saving=!0,this._error=null;try{let{confirmed:s}=await qr({reviewTitle:Ae(e),signal:n});if(!s||n.aborted||r!==this._key||(await Promise.all(this._pendingSaves.map(c=>c.promise)),n.aborted||r!==this._key||!this._writable)||(e=t?this._activeReview:this._reviews.find(c=>c.id===e.id),!e||e.user!==this.session.id||e.publishedAt!==null))return;let o=e===this._continuation?.review;if(o||await Qi(e.id,e.revision,this.session.csrfToken,n),n.aborted||r!==this._key)return;o||(this._reviews=this._reviews.filter(c=>c.id!==e.id)),pe(e,this._context)&&(this._continuation=null,this._selectedReview=null,this._editors.clear(),this._resetEditor(this._path),this._finalStatus=null,this._finalComment="",this._panel=null,this._ownPublished.length===0&&l.npmReview?.bundle===this.entry.integrity&&delete l.npmReview.started),this._notice="Draft discarded."}catch(s){r===this._key&&s.name!=="AbortError"&&(this._error=s.message)}finally{r===this._key&&(this._saving=!1)}}_continue(e,t){let r=this._reviews.find(n=>n.id===e&&n.revision===t&&n.user===this.session?.id&&n.publishedAt!==null&&pe(n,this._context));return!r||this._activeReview?null:(this._continuation={source:r,review:{...r,publishedAt:null,revokedAt:null,status:null,teams:[]}},this._selectedTeams=new Set(this._teams.length===1?this._teams.map(n=>n.id):[]),this._selectedReview=null,this._panel=null,this._editors.clear(),this._resetEditor(this._path),this._notice="A new draft will be saved when you make a change.",this._activeReview)}async _persistContinuation(e){let t=this._continuation,r=this._key,{review:n}=await Zt(this._context,{action:"continue",reviewId:t.source.id,revision:t.source.revision},this.session.csrfToken,this._controller.signal);return r!==this._key||this._continuation!==t||e&&this._pendingSaves[0]!==e?null:(this._acceptSave(n,{revision:t.source.revision}),n)}_cancelSaves(){for(let e of this._pendingSaves)clearTimeout(e.timer),e.resolve(null);this._pendingSaves=[],this._saveBlocked=!1}_queueSave(e){let t=this._pendingSaves.findLast(n=>n.change.file===e.file);if(t&&t.change.comment===e.comment&&t.change.status===e.status)return t.promise;let r={change:e,slow:!1};return r.promise=new Promise(n=>{r.resolve=n}),r.timer=setTimeout(()=>{r.slow=!0,this._saveBlocked=!0},3e3),this._pendingSaves.push(r),this.requestUpdate(),this._pendingSaves.length===1&&this._flushSaves(),r.promise}_acceptSave(e,t){this._reviews=[...this._reviews.filter(r=>r.id!==e.id),e],this._continuation=null;for(let[r,n]of this._editors)n.revision===t.revision&&(n.revision=e.revision,n.edit=e.entries.find(s=>s.file===r&&s.status)??null);for(let{change:r}of this._pendingSaves.slice(1))r.revision===t.revision&&(r.revision=e.revision,r.reviewId=e.id,r.entryId=e.entries.find(n=>n.file===r.file)?.id??null);this._canEdit&&this._resetEditor(this._file),this._notice="Saved privately.",this._rememberBase()}async _flushSaves(){for(;this._pendingSaves.length>0;){let e=this._pendingSaves[0];this._error=null;try{if(this._continuation){let r=await this._persistContinuation(e);if(!r||this._pendingSaves[0]!==e)return;Object.assign(e.change,{reviewId:r.id,revision:r.revision,entryId:r.entries.find(n=>n.file===e.change.file)?.id??null})}let{review:t}=await Zt(this._context,e.change,this.session.csrfToken,this._controller.signal);if(this._pendingSaves[0]!==e)return;this._acceptSave(t,e.change),clearTimeout(e.timer),this._pendingSaves.shift(),e.resolve(t),this._saveBlocked=this._pendingSaves.some(r=>r.slow),this.requestUpdate()}catch(t){if(this._pendingSaves[0]!==e)return;this._cancelSaves(),t.name!=="AbortError"&&(this._error=t.message),this.requestUpdate();return}}}async _change(e){if(this._blocked||this._pendingSaves.length>0||this._loading||!this._writable)return null;if(e.action==="continue")return this._continue(e.reviewId,e.revision);let t=this._key;this._saving=!0,this._error=null;try{if(e.action==="publish"&&e.finalStatus&&this._continuation){let o=await this._persistContinuation();if(!o)return null;e={...e,reviewId:o.id,revision:o.revision}}let r=this._reviews.find(o=>o.id===e.reviewId)??this._context,n=Object.fromEntries(Object.keys(this._context).map(o=>[o,r[o]])),{review:s}=await Zt(n,e,this.session.csrfToken,this._controller.signal);return t!==this._key?null:(this._reviews=[...this._reviews.filter(o=>o.id!==s.id),s],e.action==="publish"&&e.finalStatus&&pe(s,this._context)&&(this._selectedReview=s.id,this._panel=null,this._editors.clear(),this._notice="Published. Verdicts and notes are now frozen."),this._rememberBase(),s)}catch(r){return t===this._key&&r.name!=="AbortError"&&(this._error=r.message),null}finally{t===this._key&&(this._saving=!1)}}_saveFile(e){if(!this._canEdit||this._saving||this._loading)return null;let t=this._editorState(e),r=this._pendingSaves.some(s=>s.change.file===e),n=this._activeReview;return!t.dirty&&!r?n:!t.status&&!t.comment.trim()&&!t.edit?.id&&!r?(this._editors.delete(e),e===this._file&&this._resetEditor(e),n):this._queueSave({action:"save",reviewId:n?.id??null,revision:t.revision,entryId:t.edit?.id??null,file:e,comment:t.comment,status:this._nonTextFiles.includes(e)?null:t.status||null})}async _saveAll(){let e=this._key;for(;e===this._key&&this._canEdit;){if(this._pendingSaves.length>0){if((await Promise.all(this._pendingSaves.map(r=>r.promise))).some(r=>!r))return!1;continue}let t=this._dirtyFiles;if(t.length===0)return!0;if(!await this._saveFile(t[0]))return!1}return!1}async _beginPublish(){if(!this._canEdit||this._saving||this._loading||this._finalizing||!this._summary.checkedFiles)return;let e=this._key;this._finalizing=!0;try{if(this._unsaved&&!await this._saveAll()||e!==this._key||!this._canEdit||this._unsaved||!this._summary.checkedFiles)return;let t=this._activeReview;if(!t)return;let r=this._allowedVerdicts,n=this._continuation?.source.status;this._finalStatus=r.includes(n)?n:r[0],this._finalComment=t.comment??"",this._publishRevision=t.revision,this._panel="publish"}finally{this._finalizing=!1}}_publish(){if(this._canPublish)return this._change({action:"publish",reviewId:this._activeReview.id,revision:this._publishRevision,teamIds:[...this._selectedTeams],finalStatus:this._finalStatus,finalComment:this._finalComment})}render(){if(!this.entry?.npm||!this.details)return m;let e=this.request?.bundle===this.entry.integrity?this.request:{};return this._target=e.reviewPackage?ui(e.reviewPackage,e.reviewSpec):"(empty)",this._loadBase(this._target,e.resume),Ch(this)}};customElements.define("npm-review",Lo);var Ag=i=>({view:"npm",packageName:i.package,packageSpec:i.version,bundleTab:"review",...i.basePackage===null?{}:{reviewPackage:i.basePackage,reviewSpec:i.baseVersion}}),Ig=i=>{let e=new Date(i);return a`<time datetime="${e.toISOString()}" data-tooltip="${e.toLocaleString()}">${e.toLocaleDateString(void 0,{month:"short",day:"numeric",...e.getFullYear()===new Date().getFullYear()?{}:{year:"numeric"}})} <span>${e.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"})}</span></time>`},Mo=class extends U{static properties={session:{attribute:!1},_reviews:{state:!0},_loading:{state:!0},_error:{state:!0},_next:{state:!0},_discarding:{state:!0},_expanded:{state:!0}};constructor(){super(),this._reviews=[],this._next=null,this._expanded=new Set,this._controller=new AbortController}createRenderRoot(){return this}disconnectedCallback(){super.disconnectedCallback(),this._controller.abort(),this._dismissLoading?.(),this._key=null}_canDiscard(e){return e.publishedAt===null&&e.user===this.session?.id&&["triage","manage","admin"].includes(this.session?.role)}async _discard(e){if(!this._canDiscard(e)||this._discarding||this._loading)return;let t=this._key,r=this._controller.signal;this._discarding=e.id,this._error=null;try{let{confirmed:n}=await qr({reviewTitle:Ae(e),signal:r});if(!n||r.aborted||t!==this._key||!this._canDiscard(e)||(await Qi(e.id,e.revision,this.session.csrfToken,r),t!==this._key||r.aborted))return;this._reviews=this._reviews.filter(s=>s.id!==e.id)}catch(n){t===this._key&&n.name!=="AbortError"&&(this._error=n.message)}finally{t===this._key&&(this._discarding=null)}}async _load(e=!1){let t=this._key;this._dismissLoading?.();let r=this._dismissLoading=Oe("Loading reviews\u2026",{duration:0});this._loading=!0,this._error=null;try{let{reviews:n,next:s}=await Od(e?this._next:null,this._controller.signal);if(t!==this._key)return;this._reviews=[...new Map([...e?this._reviews:[],...n].map(o=>[o.id,o])).values()],this._next=s}catch(n){t===this._key&&n.name!=="AbortError"&&(this._error=n.message)}finally{r(),t===this._key&&(this._loading=!1)}}_toggleDetails(e){let t=new Set(this._expanded);t.has(e)?t.delete(e):t.add(e),this._expanded=t}_details(e){let t=e.entries.filter(r=>r.status);return a`<section id="${`review-details-${e.id}`}" class="dependency-review-details" aria-label="${`Details for ${Ae(e)}`}">${e.comment?a`<div class="dependency-review-final-note" role="note" aria-label="Final note">${lt(e.comment)}</div>`:m} ${t.length>0?a`<ul class="dependency-review-entries">${t.map(r=>a`<li><span class="dependency-review-entry-file">${Ve(r.file)}<span>${r.file}</span></span> ${At(r.status)}<div>${lt(r.comment)}</div></li>`)}</ul>`:a`<p class="npm-review-muted">No file reviews yet.</p>`}</section>`}_row(e){let t=Ag(e),r=this._expanded.has(e.id),n=e.publishedAt!==null,s=new Set(e.entries.filter(u=>u.status).map(u=>u.file)).size,o=e.entries.filter(u=>u.status&&u.comment.trim()).length+ +!!e.comment.trim(),c=u=>{u.button===0&&!u.metaKey&&!u.ctrlKey&&!u.shiftKey&&!u.altKey&&me?.active&&(u.preventDefault(),di(e),me.navigate(t))};return a`<li class="${`dependency-review-row${r?" is-expanded":""}${e.revokedAt===null?"":" is-revoked"}`}"><div class="dependency-review-row-main"><button type="button" class="dependency-review-expand" aria-expanded="${r}" aria-controls="${`review-details-${e.id}`}" aria-label="${`${r?"Hide":"Show"} details for ${Ae(e)}`}" @click="${()=>this._toggleDetails(e.id)}">${xe}</button><div class="dependency-review-identity"><a class="dependency-review-title" href="${Yr(t)}" @click="${c}">${e.basePackage!==null&&e.basePackage!==e.package?a`<span>${e.basePackage} ${e.baseVersion} →</span>`:m} <strong>${e.package}</strong> <span>${e.basePackage===e.package?`${e.baseVersion} \u2192 `:""}${e.version}</span></a><div class="dependency-review-meta">${Ig(e.publishedAt??e.time)} ${n&&e.teams.length>0?a`<span class="dependency-review-teams">${e.teams.map(u=>u.name).join(", ")}</span>`:m} ${n&&o>0?a`<span class="dependency-review-note-count">${o} ${o===1?"note":"notes"}</span>`:m} ${e.revokedAt===null?m:ci(e)}</div></div><div class="dependency-review-result">${n?At(e.status):a`<span class="dependency-review-checked">${s} ${s===1?"file":"files"} checked</span>`} <span class="dependency-review-coverage">${n?a`${e.coverage==="full"?"Full":a`<span class="dependency-review-partial">Partial</span>`} · ${e.checkedFiles}/${e.totalFiles} files checked`:o?`${o} ${o===1?"note":"notes"}`:"No notes"}</span></div><div class="dependency-review-row-actions"><review-audit-copy .review="${e}"></review-audit-copy>${this._canDiscard(e)?a`<button type="button" class="dependency-review-discard" aria-label="Discard review" ?disabled="${this._loading||!!this._discarding}" @click="${()=>this._discard(e)}">${J(vi)}</button>`:m} <a class="dependency-review-open" href="${Yr(t)}" @click="${c}" aria-label="${`${n?"Open":"Continue"} review for ${Ae(e)}`}"><span aria-hidden="true">→</span></a></div></div>${r?this._details(e):m}</li>`}render(){let e=JSON.stringify([this.session?.id,this.session?.role]);return e!==this._key&&(this._controller.abort(),this._controller=new AbortController,this._key=e,this._reviews=[],this._next=null,this._discarding=null,this._expanded=new Set,this._load()),a`<section class="dependency-review-list"><header><h1>My reviews</h1></header><p>Your private work and the reviews you’ve shared with teams.</p>${this._error?a`<p role="alert">${this._error}</p>`:m} ${!this._loading&&!this._error&&this._reviews.length===0?a`<p>No reviews yet. Open a package’s Review tab to begin.</p>`:m} ${[["Drafts",!1],["Published reviews",!0]].map(([t,r])=>{let n=this._reviews.filter(s=>s.publishedAt!==null===r);return a`<section class="dependency-review-section"><h2>${t}<span class="npm-review-count">${n.length}</span></h2><ol>${n.map(s=>this._row(s))}</ol>${n.length===0&&!this._loading?a`<p class="npm-review-muted">${r?"No published reviews yet.":"No drafts."}</p>`:m}</section>`})} ${this._next?a`<button type="button" class="npm-review-button" ?disabled="${this._loading||!!this._discarding}" @click="${()=>this._load(!0)}">Load more</button>`:m}</section>`}};customElements.define("dependency-review-list",Mo);var Po=class extends U{static properties={review:{attribute:!1},_copied:{state:!0},_error:{state:!0}};createRenderRoot(){return this}disconnectedCallback(){super.disconnectedCallback(),clearTimeout(this._timer)}async _copy(){let e=Sn(this.review);if(e!==null){this._error=!1;try{await navigator.clipboard.writeText(e),this._copied=!0,clearTimeout(this._timer),this._timer=setTimeout(()=>{this._copied=!1},2e3)}catch{this._error=!0}}}render(){return!this.review||Sn(this.review)===null?m:a`<button type="button" class="${`bundle-code-copy-path${this._copied?" copied":""}`}" aria-label="Copy audit Markdown" @click="${()=>this._copy()}">${Hi}</button> ${this._error?a`<span role="alert">Could not copy to the clipboard.</span>`:m}`}};customElements.define("review-audit-copy",Po);var Ao=class extends D{createRenderRoot(){return this}render(){return l.reports.length>0&&l.currentView==="findings"&&l.viewMode!=="graph"&&l.viewMode!=="kanban"?a`<button type="button" class="toolbar-export-btn" aria-label="Download or print report" @click="${this._onClick}">${Zd}</button>`:m}_onClick=()=>{this.dispatchEvent(new CustomEvent("download-requested",{bubbles:!0,composed:!0}))}};customElements.define("download-button",Ao);var He=class extends D{static styles=ut`.preview{position:fixed;inset:auto;margin:0;padding:14px;box-sizing:border-box;width:min(24rem,calc(100vw - 24px));max-height:calc(100vh - 24px);overflow:auto;border:1px solid var(--border);border-radius:var(--ui-radius, 10px);background:var(--bg);color:var(--text);box-shadow:0 8px 28px #00000040;font:13px/1.45 system-ui,sans-serif;text-align:left;white-space:normal;overflow-wrap:anywhere;letter-spacing:normal;cursor:default}.preview.wide{width:min(36rem,calc(100vw - 24px))}@media print{.preview{display:none}}`;constructor(){super(),this.showTimer=null,this.hideTimer=null}connectedCallback(){super.connectedCallback(),ht(this.renderRoot)}disconnectedCallback(){this._hidePreview(),super.disconnectedCallback()}updated(){let e=this.renderRoot.querySelector(".preview");e?e.matches(":popover-open")&&this._positionPreview():this._hidePreview()}_schedulePreview(){clearTimeout(this.hideTimer),clearTimeout(this.showTimer),this.renderRoot.querySelector(".preview")&&(this.showTimer=setTimeout(()=>{if(!this.isConnected)return;let e=this.renderRoot.querySelector(".preview");e&&(Sa(),e.showPopover(),this._positionPreview(),document.addEventListener("keydown",this._previewKeyDown,!0),window.addEventListener("scroll",this._previewScroll,!0),window.addEventListener("resize",this._hidePreview))},150))}_keepPreview(){clearTimeout(this.hideTimer)}_leavePreview(){clearTimeout(this.showTimer),clearTimeout(this.hideTimer),this.hideTimer=setTimeout(()=>{this.renderRoot.querySelector(".preview")?.contains(this.renderRoot.activeElement)||this._hidePreview()},150)}_hidePreview=()=>{clearTimeout(this.showTimer),clearTimeout(this.hideTimer);let e=this.renderRoot?.querySelector(".preview");e?.matches(":popover-open")&&e.hidePopover(),document.removeEventListener("keydown",this._previewKeyDown,!0),window.removeEventListener("scroll",this._previewScroll,!0),window.removeEventListener("resize",this._hidePreview)};_previewKeyDown=e=>{e.key==="Escape"&&(e.preventDefault(),e.stopPropagation(),this.renderRoot.querySelector(".preview")?.contains(this.renderRoot.activeElement)&&this.renderRoot.querySelector("[aria-details]").focus({preventScroll:!0}),this._hidePreview())};_previewScroll=e=>{e.composedPath().includes(this.renderRoot.querySelector(".preview"))||this._hidePreview()};_positionPreview(){let e=this.renderRoot.querySelector(".preview"),t=this.renderRoot.querySelector("[aria-details]").getBoundingClientRect(),{width:r,height:n}=e.getBoundingClientRect(),s=8,o=12,c=Math.max(o,Math.min(t.left,window.innerWidth-r-o)),u=t.bottom+s+n<=window.innerHeight-o?t.bottom+s:Math.max(o,t.top-s-n);e.style.left=`${c}px`,e.style.top=`${u}px`}};var Io={open:"Open",draft:"Draft",closed:"Closed",merged:"Merged",completed:"Completed",not_planned:"Not planned",duplicate:"Duplicate",unknown:"Closed"},Fg=a`<svg viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="4" cy="3" r="1.75"/><circle cx="4" cy="13" r="1.75"/><circle cx="12" cy="13" r="1.75"/><path d="M4 4.75v6.5M12 11.25V5a2 2 0 0 0-2-2H8m2-2L8 3l2 2"/></svg>`,Dg=a`<svg viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><circle cx="8" cy="8" r="6.25"/><circle cx="8" cy="8" r="1.5" fill="currentColor" stroke="none"/></svg>`,Og=a`<svg viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="8" cy="8" r="6.25"/><path d="m5 8 2 2 4-4"/></svg>`,Bg=a`<svg viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><circle cx="8" cy="8" r="6.25"/><path d="m3.5 12.5 9-9"/></svg>`,Ng={completed:Og,not_planned:Bg},Fo=class extends He{static properties={url:{type:String},compact:{type:Boolean,reflect:!0}};static styles=[He.styles,ut`:host{display:inline;word-break:normal}a{color:var(--accent);text-decoration:none;overflow-wrap:anywhere;cursor:default}.status{display:inline-flex;align-items:center;gap:.3em;vertical-align:text-bottom;margin-right:.35em;font-weight:600;white-space:nowrap}svg{flex:none}.open{color:light-dark(#1a7f37,#3fb950)}.draft,.not_planned,.duplicate,.unknown,.unavailable{color:var(--muted)}.closed{color:light-dark(#d1242f,#f85149)}.merged,.completed{color:light-dark(#8250df,#a371f7)}:host(:not([compact])){display:block}:host(:not([compact])) .fix-link{display:flex;align-items:center;gap:.55rem;min-width:0}.link-icon{flex:none;line-height:1}.link-icon svg{display:block}.link-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text);font-weight:500;line-height:1.5}.link-icon.unavailable+.link-title{color:var(--accent)}.ref{min-width:0;max-width:32%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted);font-size:.74rem}.link-status{flex:none;padding:.15rem .4rem;border-radius:999px;background:color-mix(in srgb,currentColor 10%,transparent);font-size:.7rem;font-weight:500;line-height:1.3}:host([compact]){display:inline-flex}:host([compact]) .fix-link{display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%}:host([compact]) .fix-link svg{width:14px;height:14px}:host([compact]) .status{margin:0;font-size:1rem;line-height:1}.preview-header{display:flex;align-items:center;justify-content:space-between;gap:12px}.preview-ref{display:inline-flex;align-items:center;gap:.4rem;min-width:0;color:var(--muted);font-size:12px;line-height:1.4}.preview-ref span{min-width:0}.preview-description{margin-top:8px;white-space:pre-wrap}.preview-title{margin-top:8px;font-size:15px;font-weight:600;line-height:1.4}.preview .preview-header .status{flex:none;margin:0;font-size:12px;line-height:1.4}@media print{:host(:not([compact])) .fix-link{display:block}.link-title,.ref{white-space:normal;overflow:visible;text-overflow:clip;max-width:none}.link-icon{display:inline-block;vertical-align:middle;margin-right:.55rem}.ref,.link-status{margin-left:.55rem}.preview{display:none}}`];constructor(){super(),this.url="",this.compact=!1,this.unsubscribe=null}connectedCallback(){super.connectedCallback(),this.unsubscribe=Rl(()=>this.requestUpdate()),this.hasUpdated&&this.requestUpdate()}disconnectedCallback(){this.unsubscribe?.(),this.unsubscribe=null,super.disconnectedCallback()}updated(e){e.has("url")||e.has("compact")?this._hidePreview():super.updated(e)}render(){if(!wi(this.url))return a`${this.url}`;let e=Cl(this.url),t=!e&&El(this.url),r=e||t,n=Tl.read(this.url);if(!n&&!r){let p=`Open fix link: ${this.url}`;return a`<a class="${this.compact?"fix-link":""}" href="${this.url}" target="_blank" rel="noopener noreferrer" draggable="false" data-tooltip="${this.compact?p:m}" aria-label="${p}">${this.compact?a`<slot></slot>`:this.url}</a>`}let s=n?t&&n.status==="closed"?n.stateReason??"unknown":n.status:"unavailable",o=e?Fg:t?Ng[s]??Dg:null,c=r?`${r.repo}#${r.number}`:"",u=(n?.title.length??0)>40||(n?.description??"").split(/[\r\n]/u).some(p=>p.length>100),d=n?`${Io[s]} ${e?"pull request":"issue"}: ${n.title} (${c})`:r?`Open ${e?"pull request":"issue"}: ${c}`:`Open fix link: ${this.url}`;return a`<a class="fix-link" href="${this.url}" target="_blank" rel="noopener noreferrer" draggable="false" aria-label="${d}" aria-details="${this.compact&&r?"fix-preview":m}" data-tooltip="${this.compact&&!r?d:m}" @mouseenter="${this._schedulePreview}" @mouseleave="${this._leavePreview}" @focus="${this._schedulePreview}" @blur="${this._leavePreview}" @click="${this._hidePreview}">${this.compact?o?a`<span class="${`status ${s}`}">${o}</span>`:a`<slot></slot>`:a`${o?a`<span class="${`link-icon ${s}`}">${o}</span>`:m} <span class="link-title">${n?.title??(c||this.url)}</span> ${n?a`<span class="ref">${c}</span><span class="${`link-status ${s}`}">${Io[s]}</span>`:m}`} </a>${this.compact&&r?a`<a class="${u?"preview wide":"preview"}" id="fix-preview" popover="manual" href="${this.url}" target="_blank" rel="noopener noreferrer" draggable="false" aria-label="${`Open ${e?"pull request":"issue"} ${c} on GitHub`}" @mouseenter="${this._keepPreview}" @mouseleave="${this._leavePreview}" @focusin="${this._keepPreview}" @focusout="${this._leavePreview}" @click="${p=>{p.stopPropagation(),this._hidePreview()}}"><div class="preview-header"><span class="preview-ref">${J(bi)}<span>${c}</span></span> <span class="${`status ${s}`}">${o}${n?Io[s]:e?"Pull request":"Issue"}</span></div>${n?a`<div class="preview-title">${n.title}</div>`:m} ${n?.description?a`<div class="preview-description">${n.description}</div>`:m}</a>`:m}`}};customElements.define("managed-fix-link",Fo);var Do=class extends He{static properties={finding:{attribute:!1},comment:{type:String}};static styles=[He.styles,M(Ei),ut`:host{display:inline-flex}:host([hidden]){display:none!important}button{border:0;padding:0;background:none;color:inherit;font:inherit;cursor:default}.preview-trigger{display:inline-flex;align-items:center;justify-content:center;line-height:0}.preview-trigger:hover{color:var(--accent)}.managed-comment+.managed-comment{margin-top:12px;padding-top:12px;border-top:1px solid var(--border)}.comment-body{white-space:pre-wrap}.comment-body a{color:var(--accent);text-decoration:none}.comment-body a:hover{text-decoration:underline}.preview-footer{display:flex;justify-content:flex-end;margin-top:8px}.edit-hint{color:var(--muted);font-size:12px}.edit-hint:hover{color:var(--accent)}`];constructor(){super(),this.finding=null,this.comment="",this.unsubscribe=null}connectedCallback(){super.connectedCallback(),this._subscribe(),document.addEventListener("managed-comments-reset",this._resetComments),this.hasUpdated&&this.requestUpdate()}disconnectedCallback(){this.unsubscribe?.(),this.unsubscribe=null,document.removeEventListener("managed-comments-reset",this._resetComments),super.disconnectedCallback()}updated(e){this.hidden=!this.renderRoot.querySelector(".preview"),e.has("finding")&&(this._hidePreview(),this._subscribe()),super.updated(e)}_subscribe(){this.unsubscribe?.(),this.unsubscribe=this.finding?.id?mc(this.finding.id,()=>this.requestUpdate()):null}_resetComments=()=>{this._hidePreview(),this.requestUpdate()};_previewClick(e){if(e.target.closest("a, button")){this._hidePreview();return}window.getSelection?.()?.toString()||(e.stopPropagation(),this.renderRoot.querySelector(".preview-trigger").click())}render(){let e=H(),t=e?fc(this.finding):[];if(!(e?t.length>0:!!this.comment))return m;let s=(e?t.map(o=>o.body):[this.comment]).some(o=>o.split(/[\r\n]/u).some(c=>c.length>100));return a`<button type="button" class="preview-trigger mark-comment" aria-label="${e?"View comments":"Edit comment"}" aria-details="comment-preview" @mouseenter="${this._schedulePreview}" @mouseleave="${this._leavePreview}" @focus="${this._schedulePreview}" @blur="${this._leavePreview}" @click="${this._hidePreview}"><slot></slot></button><div class="${s?"preview wide":"preview"}" id="comment-preview" popover="manual" role="region" aria-label="${e?"Comments":"Comment"}" @mouseenter="${this._keepPreview}" @mouseleave="${this._leavePreview}" @focusin="${this._keepPreview}" @focusout="${this._leavePreview}" @click="${this._previewClick}">${e?t.map(o=>Ta(o,un(o.body))):a`<div class="comment-body">${un(this.comment)}</div><div class="preview-footer"><button type="button" class="mark-comment edit-hint">Edit</button></div>`}</div>`}};customElements.define("comment-preview",Do);function Lh(i){if(fa(i))throw new Error("This is a links file, not a report. Wrap report rows in a groups or findings object to compare them.");let e=i;try{let c=JSON.parse(i);Array.isArray(c)&&(e=JSON.stringify({groups:c}))}catch{}let{data:t,reason:r}=la(e);if(!t)throw new Error(r);let n=[],s=new Map,o=0;for(let c of aa(t)){let u=new Set;for(let d of Array.isArray(c)?c:[c])if(!(!d||typeof d!="object"||Array.isArray(d))){if(typeof d.id!="string"||!d.id){o++;continue}u.add(d.id),s.has(d.id)||s.set(d.id,[]),s.get(d.id).push(d)}n.push([...u].toSorted())}return{rows:n,byId:s,missingIds:o}}function zg(i){let e=new Set;for(let t of i){let r=[...new Set(t)].toSorted();for(let n=0;n<r.length;n++)for(let s=n+1;s<r.length;s++)e.add(JSON.stringify([r[n],r[s]]))}return e}function Th(i){let e=new Map,t=n=>{let s=n;for(;e.get(s)!==s;)e.set(s,e.get(e.get(s))),s=e.get(s);return s};for(let n of i){let[s,o]=JSON.parse(n);for(let c of[s,o])e.has(c)||e.set(c,c);e.set(t(s),t(o))}let r=new Map;for(let n of[...e.keys()].toSorted()){let s=t(n);r.has(s)||r.set(s,[]),r.get(s).push(n)}return[...r.values()].toSorted((n,s)=>n[0].localeCompare(s[0]))}function Ie(i,e,t){let r=(i.byId.get(e)??[]).map(n=>t==="verdict"?sa(n)||null:t==="severity"?ra(n)??null:t==="originalSeverity"?n.severity??null:t==="confidence"&&Number.isFinite(n.confidence)?n.confidence:null);return[...new Set(r)].toSorted((n,s)=>String(n).localeCompare(String(s),void 0,{numeric:!0}))}var Rh=(i,e)=>i.length===e.length&&i.every((t,r)=>t===e[r]),Hr=(i,e)=>[...i].filter(t=>!e.has(t)).toSorted();function Mh(i,e){let t=new Set(i.byId.keys()),r=new Set(e.byId.keys()),n=[...t].filter(v=>r.has(v)).toSorted(),s=new Set(n),o=v=>zg(v.rows.map(g=>g.filter(y=>s.has(y)))),c=o(i),u=o(e),d={confirmed:[],refuted:[],otherVerdicts:[],confidence:[],severity:[]};for(let v of n)for(let g of["verdict","confidence","severity"]){let y=Ie(i,v,g),k=Ie(e,v,g),_={id:v,before:y,after:k};if(g==="severity"&&(_.originalBefore=Ie(i,v,"originalSeverity"),_.originalAfter=Ie(e,v,"originalSeverity")),Rh(y,k)&&(g!=="severity"||Rh(_.originalBefore,_.originalAfter)))continue;if(g!=="verdict"){d[g].push(_);continue}let x=k.length===1&&k[0]==="confirmed"?"confirmed":k.length===1&&k[0]==="refuted"?"refuted":"otherVerdicts";d[x].push(_)}let p=Th(Hr(u,c)),h=Th(Hr(c,u)),f=Hr(r,t),b=Hr(t,r);return{before:i,after:e,added:f,removed:b,shared:n,joined:p,split:h,...d,unchanged:f.length===0&&b.length===0&&p.length===0&&h.length===0&&Object.values(d).every(v=>v.length===0)}}var Ph=`dialog{width:min(94vw,1180px);max-width:1180px;height:min(88dvh,960px);max-height:92dvh;margin-block:auto;padding:0;overflow:hidden;background:var(--theme-bar)}dialog[open]{display:flex;flex-direction:column}header{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:1.1rem 1.3rem}header h3{margin-bottom:.25rem;font-size:1.1rem}header p,.muted,.note,.empty{color:var(--muted);font-size:.78rem;line-height:1.5}button,select,input{font:inherit;font-size:.8rem}button,select,.file-button,.search{color:var(--text);background:var(--surface);border:1px solid var(--border);border-radius:var(--ui-radius, 6px);padding:.45rem .65rem}button:not(:disabled):hover,.file-button:hover{background:var(--surface-active)}button:disabled{opacity:.45}button:focus-visible,select:focus-visible,.search:focus-visible,.file-button:focus-within{outline:2px solid var(--accent);outline-offset:2px}.pickers{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:start;gap:1rem;padding:0 1.3rem 1rem;border-bottom:1px solid var(--border)}.picker{min-width:0}.picker>label{display:block;font-size:.72rem;font-weight:600;margin-bottom:.4rem;color:var(--muted)}.picker select{width:100%;text-overflow:ellipsis}.file-picker{display:flex;align-items:center;flex-wrap:wrap;gap:.6rem;margin-top:.55rem}.file-button{position:relative;display:inline-block;font-size:.74rem;padding:.3rem .5rem;overflow:hidden}.file-button input{position:absolute;inset:0;opacity:0;width:100%}.swap{align-self:start;margin-top:1.5rem;font-size:1rem}.results{overflow:auto;min-height:0;padding:1.1rem 1.3rem 1.4rem}.summary{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:.65rem}.summary>div{display:flex;flex-direction:column;gap:.35rem;padding:.8rem 1rem;background:var(--bg);border:1px solid var(--border);border-radius:var(--ui-radius, 7px)}.summary span{font-size:.72rem;color:var(--muted)}.summary strong{font-size:1.15rem;font-variant-numeric:tabular-nums}.positive h4{color:var(--green)}.negative h4,.verdict-confirmed h4,.summary .verdict-confirmed strong{color:var(--critical)}.verdict-refuted h4,.summary .verdict-refuted strong{color:var(--muted)}.change-counts{display:flex;flex-wrap:wrap;gap:.4rem;margin-top:.7rem}.change-counts span{font-size:.7rem;padding:.3rem .5rem;border-radius:5px;background:var(--bg);color:var(--muted)}.results-head{display:flex;align-items:center;flex-wrap:wrap;gap:.75rem;margin-block:1rem}.results-head p{flex:1;font-size:.78rem;color:var(--muted);overflow-wrap:anywhere}.search{width:min(100%,17rem)}.section-title{margin:1.2rem 0 .5rem;font-size:.87rem}.note{margin:-.15rem 0 .6rem}.columns{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.8rem}.change-section{border:1px solid var(--border);border-radius:var(--ui-radius, 7px);overflow:hidden;margin-bottom:.6rem}.change-section h4{display:flex;justify-content:space-between;align-items:center;gap:.5rem;font-size:.78rem;font-weight:600;padding:.65rem .8rem;background:var(--bg)}.count{font-variant-numeric:tabular-nums;font-size:.7rem}ul{list-style:none}li{border-top:1px solid var(--border);padding:.7rem .8rem}.change-row{display:flex;justify-content:space-between;align-items:start;gap:.8rem}.finding{display:flex;flex-direction:column;gap:.2rem;min-width:0;overflow-wrap:anywhere}.finding strong{font-size:.77rem;font-weight:500;line-height:1.4}.finding code,.finding small{color:var(--muted);font-size:.66rem;line-height:1.4}.change-value{display:flex;align-items:center;justify-content:end;flex-wrap:wrap;gap:.3rem;max-width:48%;flex-shrink:0;font-size:.73rem;text-align:end;overflow-wrap:anywhere}.from{color:var(--muted)}.change-value small{width:100%;color:var(--muted);font-size:.67rem}.group-members{display:flex;flex-direction:column;gap:.55rem}.group-shape{display:flex;flex-wrap:wrap;gap:.45rem;margin-top:.7rem;font:.66rem/1.5 monospace;overflow-wrap:anywhere}.group-shape>span{min-width:0}.empty{padding:.7rem .8rem}.more{margin:.5rem .8rem .7rem;font-size:.72rem}.placeholder{padding:4rem 1rem;text-align:center;color:var(--muted);font-size:.85rem}.identical{color:var(--green);font-size:.82rem;padding-block:.5rem}.error,.warning{font-size:.75rem;line-height:1.5;margin-top:.5rem;overflow-wrap:anywhere}.error{color:var(--critical)}.warning{color:var(--yellow)}dialog>.error{padding:0 1.3rem .6rem}@media(width<=650px){.pickers{gap:.5rem;padding-inline:.8rem}.columns{grid-template-columns:minmax(0,1fr);gap:0}.summary{grid-template-columns:repeat(2,minmax(0,1fr))}.summary>div{padding:.6rem}.results-head p{flex-basis:100%}.search{width:100%}header,.results{padding-inline:.8rem}.change-row{flex-wrap:wrap}.change-value{max-width:100%}}
100
+ @compare-code-select=${b=>{b.stopPropagation(),u(b.detail.path)}}></${f}>`}var yg=400,vh=24,zr=["removed","added","changed"],ue=null;function qe(i){return i.join(", ")}var $o=class extends U{static properties={details:{attribute:!1},integrity:{attribute:!1},request:{attribute:!1},source:{attribute:!1},review:{attribute:!1},_targetIntegrity:{state:!0},_otherDetails:{state:!0},_status:{state:!0},_scope:{state:!0},_fileSort:{state:!0},_pkgSort:{state:!0},_openSections:{state:!0},_mode:{state:!0},_codePath:{state:!0},_codeSeek:{state:!0}};createRenderRoot(){return this}constructor(){super(),this.details=null,this.integrity=null,this.request=null,this.source=null,this._targetIntegrity=null,this._otherDetails=null,this._status="idle",this._scope="",this._fileSort={removed:"name",added:"name",changed:"name"},this._pkgSort={removed:"size",added:"size",changed:"size"},this._openSections=new Set,this._mode="overview",this._codePath=null,this._codeSeek=null,this._diff=null,this._diffKey=null,this._fitBody=null,this._fitObserver=null}connectedCallback(){super.connectedCallback(),this._fitBody&&this._fitObserver?.observe(this._fitBody)}disconnectedCallback(){super.disconnectedCallback(),this._fitObserver?.disconnect()}willUpdate(e){e.has("source")&&this.source&&!e.get("source")&&(this._openSections=new Set([...this._openSections,"files"])),(e.has("_otherDetails")||e.has("details"))&&this._status==="ready"&&!wn(this.details,this._otherDetails).some(t=>t.id===this._scope)&&(this._scope=""),e.has("integrity")&&this._rebase(),(e.has("request")||e.has("integrity"))&&this.integrity&&this.request?.bundle===this.integrity?(this.request.target!==this._targetIntegrity&&this._choose(this.request.target),this._mode=$i(this.request.mode)):e.has("request")&&!e.has("integrity")&&e.get("request")?.bundle===this.integrity&&(this._targetIntegrity&&this._choose(null),this._mode="overview")}updated(){let e=this.querySelector(".bundle-compare-body");e!==this._fitBody&&typeof ResizeObserver=="function"&&(this._fitObserver??=new ResizeObserver(()=>this._fitLists()),this._fitObserver.disconnect(),e&&this._fitObserver.observe(e),this._fitBody=e),this._fitLists()}_fitLists(){let e=this._fitBody;if(!e)return;let t=getComputedStyle(e),r=e.getBoundingClientRect().top+e.clientTop+parseFloat(t.paddingTop)-e.scrollTop,n=f=>{let b=f.getBoundingClientRect();return b.top-r+f.parentElement.getBoundingClientRect().bottom-b.bottom},s=e.querySelector(".bundle-compare-rows--fill");if(s){let f=n(s),b=s.closest(".bundle-compare-section");for(let v=b;v;v=v.nextElementSibling){let g=v.matches("details[open]")&&v.querySelector(":scope > summary"),y=v===b?0:g?g.getBoundingClientRect().bottom+parseFloat(getComputedStyle(g).marginBottom)-v.getBoundingClientRect().top:v.getBoundingClientRect().height;f+=y+parseFloat(getComputedStyle(v).marginBottom)}e.style.setProperty("--compare-fill-around",`${f}px`)}let o=[...e.querySelectorAll(".bundle-compare-rows--scroll:not(.bundle-compare-rows--fill)")];if(o.length===0)return;let c=e.lastElementChild,u=new Map(o.filter(f=>c.contains(f)).map(f=>[f,f.parentElement.getBoundingClientRect().top])),d=Math.max(...u.values()),p=e.clientHeight-parseFloat(t.paddingTop)-parseFloat(t.paddingBottom),h=parseFloat(getComputedStyle(c).marginBottom);for(let f of o)u.get(f)>=d-1?f.style.setProperty("--compare-rest",`${p-n(f)-h}px`):f.style.removeProperty("--compare-rest")}_rebase(){let e=this._baseKey;if(ue&&e&&e!==ue.base&&(ue=null),ue&&e===ue.base){let{target:t}=ue;if(this._scope=ue.scope,this._mode=ue.mode,this._codePath=ue.codePath,ue=null,!t){this._targetIntegrity=null,this._otherDetails=null,this._status="idle";return}this._targetIntegrity=t,this._diff=null,this._diffKey=null;let r=this.source?null:oc(t,n=>!!(n.json||n.bundle));r?(this._otherDetails=r,this._status="ready"):(this._otherDetails=null,this._status="loading",this._loadOther(t));return}this._targetIntegrity=null,this._otherDetails=null,this._status="idle",this._scope="",this._codePath=null,this._diff=null,this._diffKey=null}get _baseKey(){return this.source?this.source.base:this.integrity}_swap(){let e=this._targetIntegrity;e&&e!==this._baseKey&&this._reopen(e,this._baseKey)}_pickBase(e){!e||e===this._baseKey||(e===this._targetIntegrity?this._swap():this._reopen(e,this._targetIntegrity))}_reopen(e,t){if(this.source){ue={base:e,target:t,scope:this._scope,mode:this._mode,codePath:this._codePath},this.source.open(e,t,this._mode);return}if(!Gt(l.bundles??[],this.integrity).some(s=>s.integrity===e))return;ue={base:e,target:t,scope:this._scope,mode:this._mode,codePath:this._codePath};let r=s=>s&&!s.error&&(s.json||s.bundle)&&[e,t].includes(s.integrity),n=[this._otherDetails,this._baseReady?this.details:null].filter(r);this.dispatchEvent(new CustomEvent("bundle-swap",{bubbles:!0,composed:!0,detail:{integrity:e,target:t,bundles:n,mode:this._mode}}))}_nameFor(e){return this.source?this.source.name(e):(l.bundles??[]).find(r=>r.integrity===e)?.name??`${e.slice(0,15)}\u2026`}_pick(e){this._choose(e),this._notify()}_notify(){this.dispatchEvent(new CustomEvent("bundle-compare-change",{bubbles:!0,composed:!0,detail:{base:this.integrity,target:this._targetIntegrity,mode:this._mode}}))}_choose(e){let t=e||null;if(this._targetIntegrity=t,this._otherDetails=null,this._codePath=null,this._diff=null,this._diffKey=null,!t){this._status="idle",this._scope="";return}this._status="loading",this._loadOther(t)}async _loadOther(e){if(this.source){let n;try{n=await this.source.load(e)}catch(s){if(s.name==="AbortError")return;n={error:s.message}}if(this._targetIntegrity!==e)return;this._otherDetails=n,this._status="ready";return}let t=Gt(l.bundles??[],this.integrity).find(n=>n.integrity===e);if(!t){this._status="idle",this._targetIntegrity=null,this._notify();return}let r;try{r=await ac(e,t)}catch(n){if(n.name==="AbortError")return;throw n}this._targetIntegrity===e&&(this._otherDetails=r,this._status="ready")}get _baseReady(){return!!(this.details&&this.details.integrity===this.integrity&&(this.details.json||this.details.bundle))}_openFile(e){this._codePath=e,this._mode="code",this._notify()}_openLine({path:e,line:t,query:r}){this._codeSeek={path:e,line:t-1,query:r},this._openFile(e)}_fileRow(e,t,r,n=e,s=!1,o=void 0,c=e,u=void 0){let d=this.source?.files;return a`<li><button type="button" class="bundle-compare-row bundle-compare-row-link" @click="${()=>this._openFile(e)}">${d?d.icon(e,[[this._otherDetails,c],[this.details,e]]):m}<span class="bundle-compare-row-path mono" data-tooltip-truncated data-tooltip="${n}">${t}</span>${d&&s?d.tag(this.details,e,u):m}${oi(o)}${r}</button></li>`}_group(e,t,r,n,s,o=m,{fill:c=!1,lanes:u=zr,style:d={}}={}){return t.length===0?m:a`<section class="${`bundle-compare-group bundle-compare-${r}`}" style="${_e({"--compare-lane":String(u.indexOf(r)+1),...d})}"><header class="bundle-compare-group-head"><span class="bundle-compare-dot" aria-hidden="true"></span> <span class="bundle-compare-group-title" data-tooltip-truncated data-tooltip="${e}">${e}</span> <span class="bundle-compare-group-count">${t.length}</span> ${o}</header><ul class="${c?"bundle-compare-rows bundle-compare-rows--scroll bundle-compare-rows--fill":"bundle-compare-rows bundle-compare-rows--scroll"}">${le(t,n,s)}</ul></section>`}_sizeCells(e){let t=n=>n==null?"\u2014":G(n),r=n=>`${n.toLocaleString()} LoC`;return e.delta===void 0?a`<span class="bundle-compare-row-size" data-tooltip="${e.lines>0?r(e.lines):m}">${t(e.bytes)}</span>`:a`<span class="${`bundle-compare-row-delta ${e.delta===null?"":Rt(e.delta)}`}" data-tooltip="${`${t(e.baseBytes)} \u2192 ${t(e.otherBytes)}${e.baseLines>0||e.otherLines>0?` \xB7 ${e.baseLines.toLocaleString()} \u2192 ${r(e.otherLines)}`:""}`}">${e.delta===null?"\u2014":Ys(e.delta)}</span>`}_sortActions(e,t,r,n=!1,s=this[e][t]){return a`<span class="bundles-overview-sort" role="group" aria-label="${`${t} ${r} order`}">${[["name","Name"],["size","Size"],...n?[["flags","Flags"]]:[]].map(([o,c])=>a`<button type="button" aria-pressed="${String(s===o)}" @click="${()=>{this[e]={...this[e],[t]:o}}}">${c}</button>`)}</span>`}_fileGroup(e,t,r,n,s){let o=this.source?.files,c=r!=="removed",u=g=>r==="added"?null:{details:this._otherDetails,path:g.basePath??g.path},d=g=>[...c&&o?.flags?o.flags(this.details,g.path,u(g)):[],...Vp(g.meta)],p=t.some(g=>d(g).length>0),h=this._fileSort[r]==="flags"&&!p?"name":this._fileSort[r],f=g=>r==="changed"?Math.abs(g.delta):g.bytes,b=h==="flags"?pd(t,d,g=>g.path):t.toSorted((g,y)=>(h==="size"?f(y)-f(g):0)||g.path.localeCompare(y.path)),v=g=>g.renamedFrom==null?this._fileRow(g.path,n(g.path),this._sizeCells(g),g.path,c,g.meta,g.basePath??g.path,u(g)):this._fileRow(g.path,Cr(n(g.renamedFrom),n(g.path)),this._sizeCells(g),`${g.renamedFrom} \u2192 ${g.path}`,c,g.meta,g.basePath??g.path,u(g));return this._group(e,b,r,g=>g.path,v,this._sortActions("_fileSort",r,"file",p,h),{lanes:s})}_pkgGroup(e,t,r,n){let s=this._pkgSort[r],o=d=>{let p=r==="changed"?d.delta:d.bytes;return p==null?-1:Math.abs(p)},c=t.toSorted((d,p)=>(s==="size"?o(p)-o(d):0)||Ke(d.pkg).localeCompare(Ke(p.pkg))),u=r==="changed"?0:Math.min(vh,Math.max(0,...t.map(d=>qe(d.versions).length)));return this._group(e,c,r,d=>d.pkg,d=>a`<li><div class="bundle-compare-row"><span class="bundle-compare-pkg-dot" style="${_e({background:Mi(d.pkg)})}"></span> <span class="bundle-compare-row-path" data-tooltip-truncated data-tooltip="${Ke(d.pkg)}">${Ke(d.pkg)}</span> ${r==="changed"?this._versionCell(d):u>0?a`<span class="bundle-compare-dep-ver" data-tooltip-truncated data-tooltip="${qe(d.versions)}">${qe(d.versions)}</span>`:m} ${this._sizeCells(r==="changed"?d:{bytes:d.bytes})}</div></li>`,this._sortActions("_pkgSort",r,"package"),{fill:!0,lanes:n,style:u>0?{"--compare-version-width":`${u}ch`}:{}})}_versionCell(e){let t=e.otherVersions,r=e.baseVersions;if(r.join()===t.join())return r.length>0?a`<span class="bundle-compare-dep-ver">${qe(r)}</span>`:m;let n=e.direction??"changed",s=n==="up"?"\u2191":n==="down"?"\u2193":"\xB1";return a`<span class="bundle-compare-ver" aria-label="${`${n==="up"?"Upgraded":n==="down"?"Downgraded":"Changed"}: ${qe(r)||"none"} to ${qe(t)||"none"}`}"><span class="bundle-compare-ver-from">${qe(r)||"\u2014"}</span> <span class="bundle-compare-ver-arrow" aria-hidden="true">→</span> <span class="${`bundle-compare-ver-to ${n}`}">${qe(t)||"\u2014"}</span> <span class="${`bundle-compare-ver-dir ${n}`}" aria-hidden="true">${s}</span></span>`}_depGroup(e,t,r,n){let s=r==="changed"?0:Math.min(vh,Math.max(0,...t.map(u=>u.range.length))),o=u=>a`<span class="bundle-compare-row-path" data-tooltip-truncated data-tooltip="${u.name}">${u.name}</span> ${this.source?.dependencyTags?.(u,r)??m}${u.kind?a`<span class="npm-dependency-kind">${u.kind}</span>`:m} ${r==="changed"?a`<span class="bundle-compare-ver" aria-label="${`Changed: ${u.from} to ${u.to}`}"><span class="bundle-compare-ver-from">${u.from}</span> <span class="bundle-compare-ver-arrow" aria-hidden="true">→</span> <span class="bundle-compare-ver-to changed">${u.to}</span></span>`:a`<span class="bundle-compare-dep-ver" data-tooltip-truncated data-tooltip="${u.range}">${u.range}</span>`}`,c=this.source?.openDependency;return this._group(e,t,r,u=>u.key,u=>a`<li>${c&&u.opens?a`<button type="button" class="bundle-compare-row bundle-compare-row-link" @click="${()=>c(u)}">${o(u)}</button>`:a`<div class="bundle-compare-row">${o(u)}</div>`}</li>`,m,{fill:!0,lanes:n,style:s>0?{"--compare-version-width":`${s}ch`}:{}})}_renderDependencies(e,t,r,n){return n.length===0?m:a`<section class="bundle-compare-section"><h3 class="bundle-compare-section-head">Dependencies</h3>${this._cols(n,a`${this._depGroup(`Removed \xB7 only in ${t}`,e.removed,"removed",n)} ${this._depGroup(`Added \xB7 only in ${r}`,e.added,"added",n)} ${this._depGroup("Changed",e.changed,"changed",n)}`,"dependencies")}</section>`}_renderPackages(e,t,r,n=zr){return e.removed.length===0&&e.added.length===0&&e.changed.length===0?m:a`<section class="bundle-compare-section"><h3 class="bundle-compare-section-head">Packages</h3>${this._cols(n,a`${this._pkgGroup(`Removed \xB7 only in ${t}`,e.removed,"removed",n)} ${this._pkgGroup(`Added \xB7 only in ${r}`,e.added,"added",n)} ${this._pkgGroup("Changed",e.changed,"changed",n)}`,"packages")}</section>`}_cols(e,t,r){let n=e.map(s=>s==="changed"?"minmax(0, 5fr)":"minmax(0, 4fr)").join(" ");return a`<div class="bundle-compare-cols" data-lanes="${e.length}" data-section="${r}" style="${_e({"--compare-lanes":n})}">${t}</div>`}_collapsible(e,t,r,n,s=""){let o=this._openSections.has(e);return a`<details class="bundle-compare-section bundle-compare-collapsible" .open="${j(o)}" @toggle="${c=>this._setSection(e,c.currentTarget.open)}"><summary class="bundle-compare-section-head" @click="${c=>{c.preventDefault(),this._setSection(e,!o)}}">${t} <span class="bundle-compare-section-count">${r.toLocaleString()}</span>${s?a`<span class="bundle-compare-section-note" data-tooltip-truncated data-tooltip="${s}">${s}</span>`:m}</summary>${o?n():m}</details>`}_setSection(e,t){if(t===this._openSections.has(e))return;let r=new Set(this._openSections);t?r.add(e):r.delete(e),this._openSections=r}_renderResolutions(e){if(e.totalChanges===0)return m;let t=e.changed,r=t.slice(0,yg),n=t.length-r.length,s=(u,d="")=>a`<td class="${d}"><code data-tooltip-truncated data-tooltip="${u}">${u}</code></td>`,o=u=>`${u.conditions}${u.platform===null?"":` \xB7 Platform: ${u.platform}`}`,c=r.some(u=>o(u)!=="*");return this._collapsible("resolutions","Import resolutions",t.length,()=>a`<section class="bundle-compare-group bundle-compare-changed bundle-compare-resolutions"><header class="bundle-compare-group-head"><span class="bundle-compare-dot" aria-hidden="true"></span> <span class="bundle-compare-group-title">Repointed</span> <span class="bundle-compare-group-count">${t.length}</span></header><table class="${c?"":"bundle-compare-resolutions--no-context"}"><thead><tr><th>File</th><th>Import</th><th>Before</th><th>After</th>${c?a`<th>Conditions</th>`:m}</tr></thead><tbody>${le(r,u=>u.key,u=>{let d=o(u);return a`<tr><td><button type="button" class="bundle-compare-resolution-parent" data-tooltip-truncated data-tooltip="${u.parent}" @click="${()=>this._openFile(u.parent)}">${u.parent}</button></td>${s(u.specifier)} ${s(u.baseTarget||"(empty target)","bundle-compare-resolution-before")} ${s(u.otherTarget||"(empty target)","bundle-compare-resolution-after")} ${c?a`<td class="bundle-compare-resolution-context"><span data-tooltip-truncated data-tooltip="${d}">${d}</span></td>`:m}</tr>`})}</tbody></table>${n>0?a`<div class="bundle-compare-more">and ${n.toLocaleString()} more…</div>`:m}</section>`)}_diffFor(){let e=`${this.integrity}|${this._targetIntegrity}|${this._scope}`;return(this._diffKey!==e||!this._diff)&&(this._diff=Sr(this._otherDetails,this.details,this._scope),this._diffKey=e),this._diff}_renderSummary(e){return $r(e,a`<div class="bundle-compare-modes" role="tablist" aria-label="Comparison view">${[["overview","Overview"],["code","Code"]].map(([t,r])=>a`<button type="button" role="tab" aria-selected="${String(this._mode===t)}" @click="${()=>{this._mode=t,this._notify()}}">${r}</button>`)}</div>`)}_renderPicker(e,t,r,n){return kr({source:this.source,from:{options:e,value:this._targetIntegrity,pick:s=>this._pick(s)},to:{options:this._baseOptions(),value:this._baseKey,placeholder:this._nameFor(this.integrity),pick:s=>this._pickBase(s)},clear:t?{run:()=>this._pick(null)}:null,swap:t&&this.source?.canSwap?.(this._targetIntegrity)!==!1?()=>this._swap():null,extras:r,comparison:n,openLine:s=>this._openLine(s)})}_baseOptions(){if(this.source)return Ne(this.source.choices??[]);let e=(l.bundles??[]).find(r=>r.integrity===this.integrity),t=Gt(l.bundles??[],this.integrity);return this._bundleOptions(e?[e,...t]:t)}_otherOptions(){return this.source?Ne(this.source.options):this._bundleOptions(Gt(l.bundles??[],this.integrity))}_bundleOptions(e){let t=new Map;for(let r of e)t.set(r.name,(t.get(r.name)??0)+1);return e.map(r=>({id:r.integrity,integrity:r.integrity,kind:r.kind??(r.name.toLowerCase().endsWith(".map")?"sourcemap":"stasis"),summary:r.summary,size:typeof r.size=="number"?G(r.size):"\u2014",filename:t.get(r.name)>1?`${r.name} \xB7 ${r.integrity.slice(7,13)}\u2026`:r.name}))}render(){let e=this._otherOptions(),t=!!this._targetIntegrity&&(!!this.source||e.some(h=>h.integrity===this._targetIntegrity)),r=this._baseReady?wn(this.details,t?this._otherDetails:null):[],n=r.length>0?a`<bundle-scope-selector .reasons="${r}" .value="${this._scope}" label="Compare scope" @scope-change="${h=>{this._scope=h.detail.value}}"></bundle-scope-selector>`:m,s=this.source?.noun??"bundle",o=t&&this._status==="ready"&&this._otherDetails&&(this._otherDetails.json||this._otherDetails.bundle)&&!this._otherDetails.error,c=this._baseReady&&o?{base:this._otherDetails,other:this.details,files:this._diffFor().files}:null,u=e.length>0||this.source?this._renderPicker(e,t,n,c):n,d=this._baseReady&&o?this._mode:"overview",p;return this._baseReady?this.source&&!t&&(this.source.pending||this.source.error||e.length===0)?p=a`<div class="${`bundle-compare-empty${this.source.error?" is-error":""}`}">${this.source.pending?`Loading ${s}s\u2026`:this.source.error??a`No other ${s}s to compare <strong>${this._nameFor(this.integrity)}</strong> with.`}</div>`:e.length===0&&!this.source?p=a`<div class="bundle-compare-empty">No other bundles to compare with. Drop a second <code>.map</code> or <code>.stasis.code.br</code> bundle to diff against this one.</div>`:t?this._status==="loading"||!this._otherDetails?p=a`<div class="bundle-compare-empty">Comparing…</div>`:this._otherDetails.error?p=a`<div class="bundle-compare-empty is-error">Couldn't read the selected ${s}: ${this._otherDetails.error}</div>`:!this._otherDetails.json&&!this._otherDetails.bundle?p=a`<div class="bundle-compare-empty is-error">The selected ${s} couldn't be parsed.</div>`:d!=="code"&&(p=this._renderDiff()):p=a`<div class="bundle-compare-empty">Pick a ${s} above to compare <strong>${this._nameFor(this.integrity)}</strong> against.</div>`:p=a`<div class="bundle-compare-empty">Loading bundle…</div>`,a`<div class="bundle-compare">${xr(u,this._baseReady&&o?this._renderSummary(this._diffFor()):m)} ${d==="code"?Nr({base:this._otherDetails,other:this.details,diff:this._diffFor(),source:this.source,path:this._codePath,seek:this._codeSeek,baseName:this._nameFor(this._targetIntegrity),otherName:this._nameFor(this.integrity),select:h=>{this._codePath=h}}):a`<div class="bundle-compare-body">${p}</div>`}</div>`}_renderDiff(){let e=this._diffFor(),t=this._nameFor(this._targetIntegrity),r=this._nameFor(this.integrity),n=[...e.files.onlyBase.map(y=>y.path),...e.files.onlyOther.map(y=>y.path),...e.files.changed.flatMap(y=>y.renamedFrom==null?[y.path]:[y.path,y.renamedFrom])],s=Ji(e.files.root,ft(n).prefix),{prefix:o}=s,c=y=>o&&y.startsWith(o)?y.slice(o.length):y,u=e.files.onlyBase.length+e.files.onlyOther.length+e.files.changed.length,d={removed:e.files.onlyBase,added:e.files.onlyOther,changed:e.files.changed},p=!e.totals.identical,h=this.source?.dependencies?.(this._otherDetails,this.details)??null,f=zr.filter(y=>(h??e.packageRows)[y].length>0),b=p?zr.filter(y=>d[y].length>0):[],v=b.every(y=>f.includes(y))?f:b,g=p?this.source?.files?.warning(this.details,[...d.added,...d.changed].map(y=>y.path)):m;return a`${h?this._renderDependencies(h,t,r,f):this._renderPackages(e.packageRows,t,r,f)} ${g??m} ${e.totals.identical?e.resolutions.totalChanges>0?a`<div class="bundle-compare-caption">File contents are unchanged; import resolutions differ.</div>`:a`<div class="bundle-compare-identical">These two bundles carry identical files (${e.totals.unchangedFiles.toLocaleString()} ${e.totals.unchangedFiles===1?"file":"files"})${s.from?a`, moved <span class="mono">${Er(s)}</span>`:""}.</div>`:this._collapsible("files","Files",u,()=>this._cols(v,a`${this._fileGroup(`Removed \xB7 only in ${t}`,d.removed,"removed",c,v)} ${this._fileGroup(`Added \xB7 only in ${r}`,d.added,"added",c,v)} ${this._fileGroup("Changed",d.changed,"changed",c,v)}`,"files"),s.from?`${s.from} \u2192 ${s.to}`:o)} ${this._renderResolutions(e.resolutions)}`}};customElements.define("bundle-compare",$o);var xo=class extends Fl{static properties={reviewTitle:{type:String}};render(){return a`<dialog aria-labelledby="discard-review-title" @close="${this._onClose}"><header><h3 id="discard-review-title">Discard unpublished review?</h3></header><p class="lwd-body"><strong>${this.reviewTitle}</strong></p><p class="lwd-note">This permanently deletes this review and all its file verdicts and notes. This cannot be undone.</p><footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" data-role="cancel" @click="${this._onCancel}">Cancel</button> <button type="button" class="danger" @click="${this._onConfirm}">Discard review</button></footer></dialog>`}};customElements.define("discard-review-dialog",xo);function qr(i){return Y("discard-review-dialog",i)}var Pt={...ad,"accept-with-nits":"Accept with nits"},_g=i=>i.revokedAt===null?i.publishedAt===null?"Draft":"Published":"Revoked",wg={accept:"\u2713","accept-with-nits":"\xB7","request-changes":"!",reject:"\xD7"},So=i=>a`<span class="${`npm-review-verdict-icon ${i??"unchecked"}`}" aria-hidden="true">${wg[i]??""}</span>`,At=i=>a`<span class="npm-review-verdict">${So(i)}${Pt[i]??"Not reviewed"}</span>`,ci=i=>a`<span class="${`npm-review-badge ${i.revokedAt===null?i.publishedAt===null?"":"published":"revoked"}`}">${_g(i)}</span>`,Co=i=>a`<time datetime="${new Date(i).toISOString()}">${new Date(i).toLocaleString()}</time>`,Eo=(i,e)=>a`<div class="npm-review-progress" role="progressbar" aria-label="Files checked" aria-valuemin="0" aria-valuemax="${e||1}" aria-valuenow="${i}"><span style="${`width:${e?i/e*100:0}%`}"></span></div>`;function yh(i=[],e=[]){let t=new Set(e);return new Map(i.filter(r=>r.status&&!t.has(r.file)).map(r=>[r.file,{status:r.status,notes:+!!r.comment.trim()}]))}function lt(i){let e=ud(i);if(e.length===0)return m;let t=e.filter(r=>r.bullet);return a`${e.filter(r=>!r.bullet).map(r=>a`<p class="npm-review-note">${r.text}</p>`)} ${t.length>0?a`<ul class="npm-review-note npm-review-note-list">${t.map(r=>a`<li>${r.text}</li>`)}</ul>`:m}`}var li=null,pe=(i,e)=>["ecosystem","package","version","integrity","basePackage","baseVersion","baseIntegrity"].every(t=>i[t]===e[t]);function di(i,e=!1){li={review:i,continueReview:e}}function _h(i){if(!li||!pe(li.review,i))return null;let e=li;return li=null,e}function Ae(i){let e=`${i.package} ${i.version}`;return i.basePackage?i.basePackage===i.package?`${i.package} ${i.baseVersion} -> ${i.version}`:`${i.basePackage} ${i.baseVersion} -> ${e}`:e}var ie=i=>i._blocked||i._loading,wh=i=>i._shownReview?.publishedAt!=null,kg=i=>i.coverage==="full"?"Full":"Partial",Ro=i=>i._error?a`<p class="npm-review-error" role="alert">${i._error}</p>`:m,kh=i=>i._saveBlocked?a`<div class="npm-review-saving" role="status">Saving changes…</div>`:m,To=i=>[i._continuation?.review,...i._reviews].filter(Boolean).toSorted((e,t)=>+(e.publishedAt!==null)-+(t.publishedAt!==null)||(t.publishedAt??t.time)-(e.publishedAt??e.time)),$h=i=>`npm-review-button npm-review-primary npm-review-finalize ${i._allowedVerdicts[0]}`,xh=(i,e,t,r,n=Object.keys(Pt),s=!1)=>a`<div class="npm-review-verdict-options" role="group" aria-label="Verdict">${Object.entries(s?{"":"Not checked",...Pt}:Pt).map(([o,c])=>a`<label class="${`npm-review-verdict-choice ${o||"unchecked"}`}"><input type="radio" name="${i}" aria-label="${c}" value="${o}" .checked="${j(e===o)}" ?disabled="${r||o!==""&&!n.includes(o)}" @change="${()=>t(o)}">${c}</label>`)}</div>`;function $g(i){let e=wh(i),t=i._shownReview,r=i._summary,n=i._canEdit?{label:"Finalize review",run:()=>i._beginPublish(),disabled:!r.checkedFiles}:!e||!i._writable?null:i._activeReview||i._ownPublished.length===0?{label:"Resume your review",run:()=>i._resume()}:t.user===i.session?.id?{label:"Revise review",run:()=>i._change({action:"continue",reviewId:t.id,revision:t.revision})}:null;return a`<div class="npm-review-summary-actions">${e||i._draftStarted?ci(t??{publishedAt:null,revokedAt:null}):m}<div class="npm-review-progress-block"><span>${i._unsaved&&(i._saveBlocked||i._error)?a`<button type="button" class="npm-review-button npm-review-text-button" @click="${()=>i._openPanel("unsaved")}">Unsaved changes</button>`:a`<strong>${r.checkedFiles} of ${r.totalFiles}</strong> files checked`}</span> ${Eo(r.checkedFiles,r.totalFiles)}</div>${n?a`<button type="button" class="${i._canEdit?$h(i):"npm-review-button"}" ?disabled="${ie(i)||n.disabled}" @click="${n.run}">${n.label} ${xe}</button>`:m}</div>`}function xg(i){let e=i.source??hd(i.entry),t=!!(i._target&&i._target!=="(empty)"),r=Ne(e.options,s=>`${i.entry.npm.name}@${s.id}`);t&&!r.some(s=>s.id===i._target)&&r.push(...Ne([{id:i._target,name:i._target,format:"npm"}]));let n=Ne(e.choices);return n.some(s=>s.id===i.entry.npm.version)||n.push(...Ne([{id:i.entry.npm.version,name:i.entry.npm.version,format:"npm"}])),xr(kr({source:e,label:"Review",disabled:ie(i),from:{options:r,value:t?i._target:null,label:"Review base",pick:s=>{i._navigate(s)}},to:{options:n,value:i.entry.npm.version,label:"Version to review",pick:s=>{i._navigateTo({view:"npm",packageName:i.entry.npm.name,packageSpec:s,bundleTab:"review",...i._location(i._target)})}},clear:t?{label:"Clear review base",run:()=>{i._navigate("(empty)")}}:null,openLine:s=>i._openLine(s),comparison:{base:i._base,other:i.details,files:i._diff.files}}),$r(i._diff))}function Sg(i){return a`<div class="npm-review-toolbar"><nav class="npm-review-toolbar-group" aria-label="Review breadcrumbs"><button type="button" class="npm-review-button npm-review-text-button" ?disabled="${ie(i)}" @click="${()=>{i._navigateTo({view:"reviews"})}}">My reviews</button> ${xe}<button type="button" class="npm-review-button npm-review-text-button npm-review-package" aria-haspopup="dialog" ?disabled="${i._blocked}" @click="${()=>i._openPanel("reviews")}"><span>${i.entry.npm.name}@${i.entry.npm.version}</span><span class="npm-review-count">${To(i).length}</span></button></nav>${$g(i)}</div>`}function Cg(i,e=i._file,t=!1){let r=i._editorState(e),n=i._shownReview?.entries.find(c=>c.file===e),s=i._nonTextFiles.includes(e),o=!s&&["accept-with-nits","request-changes","reject"].includes(r.status);return a`<section class="${`npm-review-decision${t?" npm-review-inline-decision":""}`}" aria-label="File decision">${i._canEdit?a`${xh(`file:${e}`,s?"":r.status,c=>{i._setFileStatus(e,c)},ie(i)||s,void 0,!0)} ${s?a`<p class="npm-review-help">Non-text file. Verdicts are not supported yet; this file remains unchecked.</p>`:m} ${o?a`<textarea aria-label="File note" rows="2" maxlength="20000" placeholder="Add a note (optional)…" .value="${j(r.comment)}" ?disabled="${ie(i)}" @input="${c=>i._editFile(e,{comment:c.target.value})}" @blur="${()=>{i._saveFile(e)}}"></textarea>`:m}`:a`${t?m:a`<header><strong>File review</strong><span class="npm-review-muted">${wh(i)?"Frozen":"Read only"}</span></header>`} ${n?.status&&!s?a`${At(n.status)}${lt(n.comment)}`:a`<p class="npm-review-muted">This file was not reviewed.</p>`} ${i._writable?m:a`<p class="npm-review-help">Triage access is required to add a review.</p>`}`}</section>`}function Sh(i,e,t,r,n,s){return a`<fieldset class="npm-review-team-options"><legend>${e}</legend>${t.map(o=>a`<mode-switch label="${o.name}" .checked="${r.has(o.id)}" .disabled="${ie(i)}" @click="${()=>{if(ie(i))return;let c=new Set(r);c.has(o.id)?c.delete(o.id):c.add(o.id),n(c)}}"></mode-switch>`)}${s}</fieldset>`}function Eg(i,e){let t=i._allowedVerdicts,r=Xt(e.entries,i._files,i._nonTextFiles),n=e.entries.filter(s=>s.status&&s.comment.trim()&&!i._nonTextFiles.includes(s.file));return a`<form class="npm-review-publish-form" @submit="${s=>{s.preventDefault(),i._publish()}}"><div class="npm-review-dialog-body"><section class="npm-review-coverage"><div><strong>${kg(r)} review</strong><span>${r.checkedFiles} of ${r.totalFiles} files checked</span></div>${Eo(r.checkedFiles,r.totalFiles)}<p>${r.totalFiles>r.checkedFiles?a`${r.totalFiles-r.checkedFiles} files not checked. <button type="button" class="npm-review-button npm-review-text-button" @click="${()=>{i._unchecked=!0,i._closePanel()}}">View files</button>`:"Every file has a verdict."}</p>${i._needsPackageJson?a`<p class="npm-review-error">Review ${i._files.includes("package.json")?a`<button type="button" class="npm-review-button npm-review-text-button" @click="${()=>{i._closePanel(),i._selectFile("package.json")}}">package.json</button>`:"package.json"} before publishing a partial review.</p>`:m}</section>${n.length>0?a`<section aria-label="File notes"><strong>File notes</strong><ul class="npm-review-publish-notes" tabindex="0" aria-label="Saved file notes">${n.map(s=>a`<li><span class="dependency-review-entry-file">${Ve(s.file)}<span>${s.file}</span></span> ${lt(s.comment)}</li>`)}</ul></section>`:m}<div><strong>Final verdict</strong>${xh("final-verdict",i._finalStatus,s=>{i._finalStatus=s},ie(i),t)}</div>${i._securityLimit==="reject"?a`<p class="npm-review-help">Malware detected. Only Reject is available.</p>`:i._securityLimit==="request-changes"?a`<p class="npm-review-help">Critical vulnerabilities detected.</p>`:m} <label>Final note <span class="npm-review-muted">· optional</span><textarea aria-label="Final comment" rows="3" maxlength="20000" .value="${j(i._finalComment)}" placeholder="Summarize your findings or explain what remains…" ?disabled="${ie(i)}" @input="${s=>{i._finalComment=s.target.value}}"></textarea></label> ${i._unchangedContinuation?a`<p class="npm-review-help">Change a verdict or note to publish a new review.</p>`:m} ${Sh(i,"Publish to teams",i._teams,i._selectedTeams,s=>{i._selectedTeams=s},i._selectedTeams.size>0?m:a`<p class="npm-review-error">${i._teams.length===0?"No teams you belong to have dependency review enabled.":"Select at least one team to publish."}</p>`)} ${Ro(i)}</div><footer class="npm-review-dialog-footer"><p>Publishing freezes your verdicts and notes.<br>You can continue in a new review to make changes.</p><button type="submit" class="${$h(i)}" ?disabled="${ie(i)||!i._canPublish}">Publish to ${i._selectedTeams.size} ${i._selectedTeams.size===1?"team":"teams"} ${xe}</button></footer></form>`}function Tg(i,e){let t=e===i._shownReview,r=e.publishedAt!==null,n=r?e:pe(e,i._context)?Xt(e.entries,i._files,i._nonTextFiles):{checkedFiles:e.entries.filter(p=>p.status).length,totalFiles:null},s=[i._continuation?.review,...i._reviews].some(p=>p?.publishedAt===null&&p.user===i.session?.id&&pe(p,e)),o=e.user===i.session?.id,c=i._teams.filter(p=>!e.teams.some(h=>h.id===p.id)),u=i._additionalTeams.get(e.id)??new Set(c.length===1?c.map(p=>p.id):[]),d=c.filter(p=>u.has(p.id)).map(p=>p.id);return a`<section class="npm-review-entry" aria-current="${String(t)}"><div class="npm-review-history-heading"><strong>${e.userLogin}</strong>${t?a`<span class="npm-review-current">Current</span>`:m}${ci(e)}</div><p class="npm-review-help">${e.basePackage?`${e.basePackage===e.package?e.baseVersion:`${e.basePackage}@${e.baseVersion}`} \u2192 ${e.version}`:"All package files"}</p><div class="npm-review-entry-result">${r?At(e.status):m}<span class="dependency-review-coverage"> ${r?a`${n.coverage==="full"?"Full":a`<span class="dependency-review-partial">Partial</span>`} ·`:m}${n.checkedFiles}${n.totalFiles===null?m:`/${n.totalFiles}`} files checked</span></div><p class="npm-review-help">${e.teams.length>0?`${e.teams.map(p=>p.name).join(", ")} \xB7 `:""}${Co(e.publishedAt??e.time)}</p>${lt(e.comment)}<div class="npm-review-entry-actions"><button type="button" class="npm-review-button" ?disabled="${ie(i)}" @click="${()=>{i._openReview(e)}}">Open ${xe}</button> ${r&&o&&!s&&i._writable?a`<button type="button" class="npm-review-button" aria-label="Revise in a new draft" ?disabled="${ie(i)}" @click="${()=>{i._openReview(e,!0)}}">Revise</button>`:m} ${r&&o&&i._writable&&e.revokedAt===null?a`<button type="button" class="npm-review-button npm-review-danger" ?disabled="${ie(i)}" @click="${()=>i._change({action:"revoke",reviewId:e.id,revision:e.revision})}">Revoke</button>`:m}<review-audit-copy .review="${e}"></review-audit-copy>${!r&&o&&i._writable?a`<button type="button" class="dependency-review-discard" aria-label="Discard review" ?disabled="${ie(i)}" @click="${()=>{i._discard(e)}}">${J(vi)}</button>`:m}</div>${r&&o&&i._writable&&e.revokedAt===null&&c.length>0?a`<details class="npm-review-share"><summary>Publish to more teams</summary>${Sh(i,"Teams",c,u,p=>{i._additionalTeams=new Map(i._additionalTeams).set(e.id,p)},a`<button type="button" class="npm-review-button" ?disabled="${ie(i)||d.length===0}" @click="${()=>i._change({action:"publish",reviewId:e.id,revision:e.revision,teamIds:d})}">Publish to more teams</button>`)}</details>`:m} ${e.revokedAt===null?m:a`<p class="npm-review-help">Revoked ${Co(e.revokedAt)}. Content and team links remain frozen.</p>`}</section>`}function Rg(i){if(!i._panel)return m;let e={publish:"Publish review",reviews:"Reviews",unsaved:"Unsaved changes"};return a`<dialog class="npm-review-dialog" aria-label="${e[i._panel]}" @cancel="${t=>{t.preventDefault(),i._closePanel()}}"><button type="button" class="detail-action npm-review-close" aria-label="Close panel" ?disabled="${i._blocked}" @click="${()=>i._closePanel()}">×</button><header class="npm-review-dialog-head"><h2>${e[i._panel]}</h2><p>${i._panel==="reviews"?`${i.entry.npm.name}@${i.entry.npm.version}`:Ae(i._context)}</p></header>${i._panel==="publish"?Eg(i,i._activeReview):a`<div class="${`npm-review-dialog-body${i._panel==="reviews"?" npm-review-entries":""}`}">${i._panel==="unsaved"?a`${i._dirtyFiles.map(t=>a`<button type="button" class="npm-review-button" @click="${()=>{i._closePanel(),i._selectFile(t)}}">${t} ${xe}</button>`)}`:To(i).map(t=>Tg(i,t))} ${i._panel==="reviews"&&To(i).length===0?a`<p class="npm-review-muted">No reviews yet.</p>`:m}${Ro(i)}</div>`} ${kh(i)}</dialog>`}function Lg(i){let e=i._shownReview?.entries,t=i._files,r=i._nonTextFiles;if(i._treeProgress?.entries!==e||i._treeProgress?.files!==t||i._treeProgress?.nonTextFiles!==r){let c=yh(e,r),u=new Map,d=0;for(let p of i._files){let h=p.split("/"),f=+!!c.get(p)?.status;d+=f;for(let b=1;b<h.length;b++){let v=h.slice(0,b).join("/"),g=u.get(v)??{total:0,checked:0};g.total++,g.checked+=f,u.set(v,g)}}i._treeProgress={entries:e,files:t,nonTextFiles:r,states:c,directories:u,checked:d}}let{states:n,directories:s,checked:o}=i._treeProgress;return{railLabel:"Files",treeLabel:"Review files",collapseLabel:"Collapse folders",searchLabel:"Find a file",searchPlaceholder:"Find a file\u2026",treePageSize:300,filterContent:!1,fullPaths:!0,collapseClearsSearch:!0,canSelect:()=>!i._blocked&&!i._panel,fileFilter:i._unchecked?c=>!n.get(c)?.status:null,fileLabel:c=>`${c}, ${Pt[n.get(c)?.status]??"Not reviewed"}`,filePrefix:c=>So(n.get(c)?.status),fileSuffix:c=>n.get(c)?.notes?a`<span class="npm-review-note-dot" aria-label="Has notes">•</span>`:m,directoryLabel:c=>{let u=s.get(c.sourcePath);return`${c.sourcePath}, ${u?.checked??0} of ${u?.total??0} checked`},directorySummary:c=>{let u=s.get(c.sourcePath);return`${u?.checked??0}/${u?.total??0}`},filters:a`<div class="npm-review-filters" aria-label="Filter review files"><button type="button" class="npm-review-button" aria-pressed="${String(!i._unchecked)}" @click="${()=>{i._unchecked=!1}}">All ${i._files.length}</button> <button type="button" class="npm-review-button" aria-pressed="${String(!!i._unchecked)}" @click="${()=>{i._unchecked=!0}}">Unchecked ${i._files.length-o}</button></div>`,fileActions:(c,u)=>Cg(i,c,u)}}function Ch(i){return i._base?a`${xg(i)}${Sg(i)}${i._panel?m:Ro(i)} ${Nr({base:i._base,other:i.details,diff:i._diff,source:i.source,path:i._path,seek:i._seek,baseName:i._base.npm?`${i._base.npm.name}@${i._base.npm.version}`:"Empty package",otherName:`${i.entry.npm.name}@${i.entry.npm.version}`,select:e=>i._selectFile(e),extensions:Lg(i),mode:i._mode})} <span class="npm-review-announcement" role="status">${i._notice??""}</span>${i._panel?m:kh(i)}${Rg(i)}`:a`<div class="npm-review-empty" role="${i._baseError?"alert":"status"}">${i._baseError??"Loading comparison\u2026"} ${i._baseError?a`<button type="button" class="npm-review-button" @click="${()=>{i._baseKey=null,i._loadBase(i._target,i.request?.resume)}}">Retry</button>`:m}</div>`}var Mg={maxLines:5e4,maxBytes:2*1024*1024},Pg={integrity:"(empty)",kind:"sourcemap",json:{version:3,sources:[],sourcesContent:[]},fileSizes:new Map},Eh=(i,e)=>({ecosystem:"npm",package:i.npm.name,version:i.npm.version,integrity:i.integrity,basePackage:e?.npm?.name??null,baseVersion:e?.npm?.version??null,baseIntegrity:e?.npm?e.integrity:null}),ui=(i,e)=>`${i}@${e??"latest"}`,Lo=class extends U{static properties={entry:{attribute:!1},details:{attribute:!1},request:{attribute:!1},session:{attribute:!1},source:{attribute:!1},_teams:{state:!0},_selectedTeams:{state:!0},_additionalTeams:{state:!0},_reviews:{state:!0},_loading:{state:!0},_error:{state:!0},_saving:{state:!0},_saveBlocked:{state:!0},_file:{state:!0},_seek:{state:!0},_finalStatus:{state:!0},_finalComment:{state:!0},_base:{state:!0},_baseError:{state:!0},_panel:{state:!0},_path:{state:!0},_selectedReview:{state:!0},_unchecked:{state:!0},_notice:{state:!0},_continuation:{state:!0}};createRenderRoot(){return this}constructor(){super(),this._teams=[],this._reviews=[],this._files=[],this._nonTextFiles=[],this._selectedTeams=new Set,this._additionalTeams=new Map,this._editors=new Map,this._file=null,this._path=null,this._loading=!1,this._saving=!1,this._error=null,this._context=null,this._key=null,this._controller=new AbortController,this._mode="code",this._panel=null,this._selectedReview=null,this._unchecked=!1,this._pendingSaves=[],this._saveBlocked=!1}disconnectedCallback(){super.disconnectedCallback(),this._controller.abort(),this._cancelSaves(),this._dismissLoading?.(),this._key=null,this._baseKey=null}updated(){let e=this.querySelector("dialog");e&&!e.open&&e.showModal(),this._rememberBase()}_rememberBase(){l.bundleDetailsTab!=="review"||l.selectedBundle!==this.entry?.integrity||!this._context||!this._activeReview&&this._ownPublished.length===0&&!this._unsaved||(l.npmReview={bundle:this.entry.integrity,...this._context.basePackage?{reviewPackage:this._context.basePackage,reviewSpec:this._context.baseVersion}:{},started:!0,user:this.session?.id})}get _writable(){return["triage","manage","admin"].includes(this.session?.role)&&!this.session?.viewer}get _activeReview(){return this._reviews.find(e=>e.user===this.session?.id&&e.publishedAt===null&&pe(e,this._context))??(this._continuation&&this._continuation.review.user===this.session?.id?this._continuation.review:null)}get _ownPublished(){return this._reviews.filter(e=>e.user===this.session?.id&&e.publishedAt!==null&&pe(e,this._context)).toSorted((e,t)=>t.publishedAt-e.publishedAt)}get _shownReview(){return this._selectedReview?this._reviews.find(e=>e.id===this._selectedReview):this._activeReview??this._ownPublished[0]??null}get _canEdit(){return this._writable&&!this._selectedReview&&(this._activeReview!==null||this._ownPublished.length===0)}_isDirty(e,t){return!this._nonTextFiles.includes(e)&&(t.comment!==(t.edit?.comment??"")||t.status!==(t.edit?.status??""))}get _dirtyFiles(){return[...this._editors].filter(([e,t])=>this._isDirty(e,t)).map(([e])=>e)}get _blocked(){return this._saving||this._saveBlocked}get _unsaved(){return this._pendingSaves.length>0||this._dirtyFiles.length>0}get _draftStarted(){return this._canEdit&&(this._unsaved||this._activeReview&&!this._continuation||this._continuation&&this._publishRevision!=null&&!this._unchangedContinuation)}get _summary(){return Xt(this._shownReview?.entries??[],this._files,this._nonTextFiles)}get _securityLimit(){return this.source?.reviewVerdictLimit?.(this.entry,this._base)??"accept"}get _allowedVerdicts(){let e=new Map((this._shownReview?.entries??[]).map(t=>[t.file,t]));if(this._canEdit)for(let[t,r]of this._editors)e.set(t,{file:t,status:r.status||null});return cd([...e.values()].filter(t=>!this._nonTextFiles.includes(t.file)),this._securityLimit)}get _needsPackageJson(){return dd(this._activeReview?.entries??[],this._files,this._nonTextFiles)}get _unchangedContinuation(){let e=this._continuation?.source;return!!(e&&this._finalStatus===e.status&&this._finalComment===e.comment)}get _canPublish(){return this._canEdit&&this._panel==="publish"&&this._activeReview?.revision===this._publishRevision&&this._summary.checkedFiles>0&&!this._needsPackageJson&&!this._unchangedContinuation&&this._selectedTeams.size>0&&!this._unsaved&&this._allowedVerdicts.includes(this._finalStatus)}_location(e){let t=e&&e!=="(empty)"?yn(e):null;return t?{reviewPackage:t.name,reviewSpec:t.spec}:{}}_navigate(e){return this._navigateTo(_n(this.entry,"review",this._location(e)))}async _navigateTo(e){if(this._blocked||this._loading)return;let t=this._key,r=this._navigation={};this._unsaved&&!await this._saveAll()||t===this._key&&r===this._navigation&&!this._unsaved&&await me?.navigate(e)}async _loadBase(e,t=!1){let r=JSON.stringify([this.entry.integrity,e,this.session?.id,this.session?.role]);if(this._baseKey!==r){this._baseKey=r,this._base=null,this._baseError=null,this._controller.abort(),this._cancelSaves(),this._key=null,this._controller=new AbortController;try{let n=t?await Bd(Eh(this.entry,null),this._controller.signal):null;if(this._baseKey!==r)return;n&&(e=n.basePackage?ui(n.basePackage,n.baseVersion):"(empty)");let s=e==="(empty)"?null:yn(e),o=s?(await Gc(s.name,s.spec??"latest")).details:Pg;if(this._baseKey!==r)return;t&&(n&&di(n),this._target=e,this.request={bundle:this.entry.integrity,...this._location(e)},this._baseKey=JSON.stringify([this.entry.integrity,e,this.session?.id,this.session?.role])),this._base=o,this._ensureContext(o)}catch(n){this._baseKey===r&&(this._baseError=n.message)}}}_ensureContext(e){let t=Eh(this.entry,e),r=JSON.stringify([this.session?.id,this.session?.role,t]);if(r===this._key)return;this._controller.abort(),this._cancelSaves(),this._controller=new AbortController,this._context=t,this._diff=Sr(e,this.details);let n=xp(e,this.details,this._diff);this._files=Wt(Ki(n.map(o=>o.path)));let s=new Set(n.filter(o=>!ld(o.before,o.after)).map(o=>o.path));if(this._nonTextFiles=this._files.filter(o=>s.has(o)),this._mode=Sp(n,Mg)?"diff":"code",this._key=r,this._teams=[],this._reviews=[],this._selectedTeams=new Set,this._additionalTeams=new Map,this._selectedReview=null,this._continuation=null,this._editors.clear(),this._path=this._files[0]??null,this._panel=null,this._notice="",this._resetEditor(this._path),this._saving=!1,this._refresh(!0),l.bundleDetailsTab==="review"&&l.selectedBundle===this.entry.integrity){let o=this._location(e.npm?ui(e.npm.name,e.npm.version):"(empty)");l.npmReview={bundle:this.entry.integrity,...o},this._baseKey=JSON.stringify([this.entry.integrity,e.npm?ui(e.npm.name,e.npm.version):"(empty)",this.session?.id,this.session?.role]),me?.replaceRoute(_n(this.entry,"review",o))}}async _refresh(e=!1){let t=this._key;for(;t===this._key&&this._pendingSaves.length>0;)if((await Promise.all(this._pendingSaves.map(n=>n.promise))).some(n=>!n))return;if(t!==this._key)return;this._dismissLoading?.();let r=this._dismissLoading=Oe("Loading reviews\u2026",{duration:0});this._loading=!0,this._error=null;try{let{reviews:n,teams:s}=await Zt({...this._context,allBases:!0},null,null,this._controller.signal);if(t===this._key){let o=this._unsaved;this._reviews=n,this._teams=s,n.some(d=>d.user===this.session?.id&&d.publishedAt===null&&pe(d,this._context))&&(this._continuation=null),this._rememberBase();let c=_h(this._context),u=c&&n.find(d=>d.id===c.review.id);u?.publishedAt!=null&&(c.continueReview?this._continue(u.id,u.revision):this._selectedReview=u.id),this._selectedTeams=new Set(s.filter(d=>e?s.length===1:this._selectedTeams.has(d.id)).map(d=>d.id)),o||(this._editors.clear(),this._resetEditor(this._file))}}catch(n){t===this._key&&n.name!=="AbortError"&&(this._error=n.message)}finally{r(),t===this._key&&(this._loading=!1)}}_resetEditor(e=null){this._publishRevision=null,this._file=e,this._editorState(e)}_editorState(e){let t=this._canEdit?this._editors.get(e):null;if(!t){let r=this._shownReview?.entries.find(n=>n.file===e&&n.status)??null;t={edit:r,revision:this._activeReview?.revision??null,comment:this._nonTextFiles.includes(e)?"":r?.comment??"",status:this._nonTextFiles.includes(e)?"":r?.status??""},this._canEdit&&this._editors.set(e,t)}return{...t,dirty:this._isDirty(e,t)}}_editFile(e,t){!this._canEdit||this._blocked||(this._resetEditor(e),Object.assign(this._editors.get(e),t),this.requestUpdate())}_setFileStatus(e,t){if(!(this._blocked||this._nonTextFiles.includes(e)))return this._editFile(e,{status:t,...t?{}:{comment:""}}),this._saveFile(e)}_selectFile(e){this._blocked||!this._files.includes(e)||(this._path=e,this._resetEditor(e))}_openLine({path:e,line:t,query:r}){this._blocked||!this._files.includes(e)||(this._seek={path:e,line:t-1,query:r},this._selectFile(e))}_openPanel(e){this._panel=e}async _openReview(e,t=!1){if(this._blocked||this._loading)return;if(pe(e,this._context)){t?this._continue(e.id,e.revision):e.publishedAt===null?this._resume():this._showPublished(e);return}let r=this._key;this._unsaved&&!await this._saveAll()||r!==this._key||(di(e,t),await this._navigate(e.basePackage?ui(e.basePackage,e.baseVersion):"(empty)"))}_closePanel(){this._blocked||(this.querySelector("dialog")?.close(),this._panel=null)}_showPublished(e){this._selectedReview=e.id,this._panel=null,this._file=this._path}_resume(){this._selectedReview=null,this._panel=null,this._resetEditor(this._path)}async _discard(e){if(this._blocked||this._loading||!this._writable||e.user!==this.session.id||e.publishedAt!==null)return;let t=e===this._activeReview,r=this._key,n=this._controller.signal;this._saving=!0,this._error=null;try{let{confirmed:s}=await qr({reviewTitle:Ae(e),signal:n});if(!s||n.aborted||r!==this._key||(await Promise.all(this._pendingSaves.map(c=>c.promise)),n.aborted||r!==this._key||!this._writable)||(e=t?this._activeReview:this._reviews.find(c=>c.id===e.id),!e||e.user!==this.session.id||e.publishedAt!==null))return;let o=e===this._continuation?.review;if(o||await Qi(e.id,e.revision,this.session.csrfToken,n),n.aborted||r!==this._key)return;o||(this._reviews=this._reviews.filter(c=>c.id!==e.id)),pe(e,this._context)&&(this._continuation=null,this._selectedReview=null,this._editors.clear(),this._resetEditor(this._path),this._finalStatus=null,this._finalComment="",this._panel=null,this._ownPublished.length===0&&l.npmReview?.bundle===this.entry.integrity&&delete l.npmReview.started),this._notice="Draft discarded."}catch(s){r===this._key&&s.name!=="AbortError"&&(this._error=s.message)}finally{r===this._key&&(this._saving=!1)}}_continue(e,t){let r=this._reviews.find(n=>n.id===e&&n.revision===t&&n.user===this.session?.id&&n.publishedAt!==null&&pe(n,this._context));return!r||this._activeReview?null:(this._continuation={source:r,review:{...r,publishedAt:null,revokedAt:null,status:null,teams:[]}},this._selectedTeams=new Set(this._teams.length===1?this._teams.map(n=>n.id):[]),this._selectedReview=null,this._panel=null,this._editors.clear(),this._resetEditor(this._path),this._notice="A new draft will be saved when you make a change.",this._activeReview)}async _persistContinuation(e){let t=this._continuation,r=this._key,{review:n}=await Zt(this._context,{action:"continue",reviewId:t.source.id,revision:t.source.revision},this.session.csrfToken,this._controller.signal);return r!==this._key||this._continuation!==t||e&&this._pendingSaves[0]!==e?null:(this._acceptSave(n,{revision:t.source.revision}),n)}_cancelSaves(){for(let e of this._pendingSaves)clearTimeout(e.timer),e.resolve(null);this._pendingSaves=[],this._saveBlocked=!1}_queueSave(e){let t=this._pendingSaves.findLast(n=>n.change.file===e.file);if(t&&t.change.comment===e.comment&&t.change.status===e.status)return t.promise;let r={change:e,slow:!1};return r.promise=new Promise(n=>{r.resolve=n}),r.timer=setTimeout(()=>{r.slow=!0,this._saveBlocked=!0},3e3),this._pendingSaves.push(r),this.requestUpdate(),this._pendingSaves.length===1&&this._flushSaves(),r.promise}_acceptSave(e,t){this._reviews=[...this._reviews.filter(r=>r.id!==e.id),e],this._continuation=null;for(let[r,n]of this._editors)n.revision===t.revision&&(n.revision=e.revision,n.edit=e.entries.find(s=>s.file===r&&s.status)??null);for(let{change:r}of this._pendingSaves.slice(1))r.revision===t.revision&&(r.revision=e.revision,r.reviewId=e.id,r.entryId=e.entries.find(n=>n.file===r.file)?.id??null);this._canEdit&&this._resetEditor(this._file),this._notice="Saved privately.",this._rememberBase()}async _flushSaves(){for(;this._pendingSaves.length>0;){let e=this._pendingSaves[0];this._error=null;try{if(this._continuation){let r=await this._persistContinuation(e);if(!r||this._pendingSaves[0]!==e)return;Object.assign(e.change,{reviewId:r.id,revision:r.revision,entryId:r.entries.find(n=>n.file===e.change.file)?.id??null})}let{review:t}=await Zt(this._context,e.change,this.session.csrfToken,this._controller.signal);if(this._pendingSaves[0]!==e)return;this._acceptSave(t,e.change),clearTimeout(e.timer),this._pendingSaves.shift(),e.resolve(t),this._saveBlocked=this._pendingSaves.some(r=>r.slow),this.requestUpdate()}catch(t){if(this._pendingSaves[0]!==e)return;this._cancelSaves(),t.name!=="AbortError"&&(this._error=t.message),this.requestUpdate();return}}}async _change(e){if(this._blocked||this._pendingSaves.length>0||this._loading||!this._writable)return null;if(e.action==="continue")return this._continue(e.reviewId,e.revision);let t=this._key;this._saving=!0,this._error=null;try{if(e.action==="publish"&&e.finalStatus&&this._continuation){let o=await this._persistContinuation();if(!o)return null;e={...e,reviewId:o.id,revision:o.revision}}let r=this._reviews.find(o=>o.id===e.reviewId)??this._context,n=Object.fromEntries(Object.keys(this._context).map(o=>[o,r[o]])),{review:s}=await Zt(n,e,this.session.csrfToken,this._controller.signal);return t!==this._key?null:(this._reviews=[...this._reviews.filter(o=>o.id!==s.id),s],e.action==="publish"&&e.finalStatus&&pe(s,this._context)&&(this._selectedReview=s.id,this._panel=null,this._editors.clear(),this._notice="Published. Verdicts and notes are now frozen."),this._rememberBase(),s)}catch(r){return t===this._key&&r.name!=="AbortError"&&(this._error=r.message),null}finally{t===this._key&&(this._saving=!1)}}_saveFile(e){if(!this._canEdit||this._saving||this._loading)return null;let t=this._editorState(e),r=this._pendingSaves.some(s=>s.change.file===e),n=this._activeReview;return!t.dirty&&!r?n:!t.status&&!t.comment.trim()&&!t.edit?.id&&!r?(this._editors.delete(e),e===this._file&&this._resetEditor(e),n):this._queueSave({action:"save",reviewId:n?.id??null,revision:t.revision,entryId:t.edit?.id??null,file:e,comment:t.comment,status:this._nonTextFiles.includes(e)?null:t.status||null})}async _saveAll(){let e=this._key;for(;e===this._key&&this._canEdit;){if(this._pendingSaves.length>0){if((await Promise.all(this._pendingSaves.map(r=>r.promise))).some(r=>!r))return!1;continue}let t=this._dirtyFiles;if(t.length===0)return!0;if(!await this._saveFile(t[0]))return!1}return!1}async _beginPublish(){if(!this._canEdit||this._saving||this._loading||this._finalizing||!this._summary.checkedFiles)return;let e=this._key;this._finalizing=!0;try{if(this._unsaved&&!await this._saveAll()||e!==this._key||!this._canEdit||this._unsaved||!this._summary.checkedFiles)return;let t=this._activeReview;if(!t)return;let r=this._allowedVerdicts,n=this._continuation?.source.status;this._finalStatus=r.includes(n)?n:r[0],this._finalComment=t.comment??"",this._publishRevision=t.revision,this._panel="publish"}finally{this._finalizing=!1}}_publish(){if(this._canPublish)return this._change({action:"publish",reviewId:this._activeReview.id,revision:this._publishRevision,teamIds:[...this._selectedTeams],finalStatus:this._finalStatus,finalComment:this._finalComment})}render(){if(!this.entry?.npm||!this.details)return m;let e=this.request?.bundle===this.entry.integrity?this.request:{};return this._target=e.reviewPackage?ui(e.reviewPackage,e.reviewSpec):"(empty)",this._loadBase(this._target,e.resume),Ch(this)}};customElements.define("npm-review",Lo);var Ag=i=>({view:"npm",packageName:i.package,packageSpec:i.version,bundleTab:"review",...i.basePackage===null?{}:{reviewPackage:i.basePackage,reviewSpec:i.baseVersion}}),Ig=i=>{let e=new Date(i);return a`<time datetime="${e.toISOString()}" data-tooltip="${e.toLocaleString()}">${e.toLocaleDateString(void 0,{month:"short",day:"numeric",...e.getFullYear()===new Date().getFullYear()?{}:{year:"numeric"}})} <span>${e.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"})}</span></time>`},Mo=class extends U{static properties={session:{attribute:!1},_reviews:{state:!0},_loading:{state:!0},_error:{state:!0},_next:{state:!0},_discarding:{state:!0},_expanded:{state:!0}};constructor(){super(),this._reviews=[],this._next=null,this._expanded=new Set,this._controller=new AbortController}createRenderRoot(){return this}disconnectedCallback(){super.disconnectedCallback(),this._controller.abort(),this._dismissLoading?.(),this._key=null}_canDiscard(e){return e.publishedAt===null&&e.user===this.session?.id&&["triage","manage","admin"].includes(this.session?.role)}async _discard(e){if(!this._canDiscard(e)||this._discarding||this._loading)return;let t=this._key,r=this._controller.signal;this._discarding=e.id,this._error=null;try{let{confirmed:n}=await qr({reviewTitle:Ae(e),signal:r});if(!n||r.aborted||t!==this._key||!this._canDiscard(e)||(await Qi(e.id,e.revision,this.session.csrfToken,r),t!==this._key||r.aborted))return;this._reviews=this._reviews.filter(s=>s.id!==e.id)}catch(n){t===this._key&&n.name!=="AbortError"&&(this._error=n.message)}finally{t===this._key&&(this._discarding=null)}}async _load(e=!1){let t=this._key;this._dismissLoading?.();let r=this._dismissLoading=Oe("Loading reviews\u2026",{duration:0});this._loading=!0,this._error=null;try{let{reviews:n,next:s}=await Od(e?this._next:null,this._controller.signal);if(t!==this._key)return;this._reviews=[...new Map([...e?this._reviews:[],...n].map(o=>[o.id,o])).values()],this._next=s}catch(n){t===this._key&&n.name!=="AbortError"&&(this._error=n.message)}finally{r(),t===this._key&&(this._loading=!1)}}_toggleDetails(e){let t=new Set(this._expanded);t.has(e)?t.delete(e):t.add(e),this._expanded=t}_details(e){let t=e.entries.filter(r=>r.status);return a`<section id="${`review-details-${e.id}`}" class="dependency-review-details" aria-label="${`Details for ${Ae(e)}`}">${e.comment?a`<div class="dependency-review-final-note" role="note" aria-label="Final note">${lt(e.comment)}</div>`:m} ${t.length>0?a`<ul class="dependency-review-entries">${t.map(r=>a`<li><span class="dependency-review-entry-file">${Ve(r.file)}<span>${r.file}</span></span> ${At(r.status)}<div>${lt(r.comment)}</div></li>`)}</ul>`:a`<p class="npm-review-muted">No file reviews yet.</p>`}</section>`}_row(e){let t=Ag(e),r=this._expanded.has(e.id),n=e.publishedAt!==null,s=new Set(e.entries.filter(u=>u.status).map(u=>u.file)).size,o=e.entries.filter(u=>u.status&&u.comment.trim()).length+ +!!e.comment.trim(),c=u=>{u.button===0&&!u.metaKey&&!u.ctrlKey&&!u.shiftKey&&!u.altKey&&me?.active&&(u.preventDefault(),di(e),me.navigate(t))};return a`<li class="${`dependency-review-row${r?" is-expanded":""}${e.revokedAt===null?"":" is-revoked"}`}"><div class="dependency-review-row-main"><button type="button" class="dependency-review-expand" aria-expanded="${r}" aria-controls="${`review-details-${e.id}`}" aria-label="${`${r?"Hide":"Show"} details for ${Ae(e)}`}" @click="${()=>this._toggleDetails(e.id)}">${xe}</button><div class="dependency-review-identity"><a class="dependency-review-title" href="${Yr(t)}" @click="${c}">${e.basePackage!==null&&e.basePackage!==e.package?a`<span>${e.basePackage} ${e.baseVersion} →</span>`:m} <strong>${e.package}</strong> <span>${e.basePackage===e.package?`${e.baseVersion} \u2192 `:""}${e.version}</span></a><div class="dependency-review-meta">${Ig(e.publishedAt??e.time)} ${n&&e.teams.length>0?a`<span class="dependency-review-teams">${e.teams.map(u=>u.name).join(", ")}</span>`:m} ${n&&o>0?a`<span class="dependency-review-note-count">${o} ${o===1?"note":"notes"}</span>`:m} ${e.revokedAt===null?m:ci(e)}</div></div><div class="dependency-review-result">${n?At(e.status):a`<span class="dependency-review-checked">${s} ${s===1?"file":"files"} checked</span>`} <span class="dependency-review-coverage">${n?a`${e.coverage==="full"?"Full":a`<span class="dependency-review-partial">Partial</span>`} · ${e.checkedFiles}/${e.totalFiles} files checked`:o?`${o} ${o===1?"note":"notes"}`:"No notes"}</span></div><div class="dependency-review-row-actions"><review-audit-copy .review="${e}"></review-audit-copy>${this._canDiscard(e)?a`<button type="button" class="dependency-review-discard" aria-label="Discard review" ?disabled="${this._loading||!!this._discarding}" @click="${()=>this._discard(e)}">${J(vi)}</button>`:m} <a class="dependency-review-open" href="${Yr(t)}" @click="${c}" aria-label="${`${n?"Open":"Continue"} review for ${Ae(e)}`}"><span aria-hidden="true">→</span></a></div></div>${r?this._details(e):m}</li>`}render(){let e=JSON.stringify([this.session?.id,this.session?.role]);return e!==this._key&&(this._controller.abort(),this._controller=new AbortController,this._key=e,this._reviews=[],this._next=null,this._discarding=null,this._expanded=new Set,this._load()),a`<section class="dependency-review-list"><header><h1>My reviews</h1></header><p>Your private work and the reviews you’ve shared with teams.</p>${this._error?a`<p role="alert">${this._error}</p>`:m} ${!this._loading&&!this._error&&this._reviews.length===0?a`<p>No reviews yet. Open a package’s Review tab to begin.</p>`:m} ${[["Drafts",!1],["Published reviews",!0]].map(([t,r])=>{let n=this._reviews.filter(s=>s.publishedAt!==null===r);return a`<section class="dependency-review-section"><h2>${t}<span class="npm-review-count">${n.length}</span></h2><ol>${n.map(s=>this._row(s))}</ol>${n.length===0&&!this._loading?a`<p class="npm-review-muted">${r?"No published reviews yet.":"No drafts."}</p>`:m}</section>`})} ${this._next?a`<button type="button" class="npm-review-button" ?disabled="${this._loading||!!this._discarding}" @click="${()=>this._load(!0)}">Load more</button>`:m}</section>`}};customElements.define("dependency-review-list",Mo);var Po=class extends U{static properties={review:{attribute:!1},_copied:{state:!0},_error:{state:!0}};createRenderRoot(){return this}disconnectedCallback(){super.disconnectedCallback(),clearTimeout(this._timer)}async _copy(){let e=Sn(this.review);if(e!==null){this._error=!1;try{await navigator.clipboard.writeText(e),this._copied=!0,clearTimeout(this._timer),this._timer=setTimeout(()=>{this._copied=!1},2e3)}catch{this._error=!0}}}render(){return!this.review||Sn(this.review)===null?m:a`<button type="button" class="${`bundle-code-copy-path${this._copied?" copied":""}`}" aria-label="Copy audit Markdown" @click="${()=>this._copy()}">${Hi}</button> ${this._error?a`<span role="alert">Could not copy to the clipboard.</span>`:m}`}};customElements.define("review-audit-copy",Po);var Ao=class extends D{createRenderRoot(){return this}render(){return l.reports.length>0&&l.currentView==="findings"&&l.viewMode!=="graph"&&l.viewMode!=="kanban"?a`<button type="button" class="toolbar-export-btn" aria-label="Download or print report" @click="${this._onClick}">${Zd}</button>`:m}_onClick=()=>{this.dispatchEvent(new CustomEvent("download-requested",{bubbles:!0,composed:!0}))}};customElements.define("download-button",Ao);var He=class extends D{static styles=ut`.preview{position:fixed;inset:auto;margin:0;padding:14px;box-sizing:border-box;width:min(24rem,calc(100vw - 24px));max-height:calc(100vh - 24px);overflow:auto;border:1px solid var(--border);border-radius:var(--ui-radius, 10px);background:var(--bg);color:var(--text);box-shadow:0 8px 28px #00000040;font:13px/1.45 system-ui,sans-serif;text-align:left;white-space:normal;overflow-wrap:anywhere;letter-spacing:normal;cursor:default}.preview.wide{width:min(36rem,calc(100vw - 24px))}@media print{.preview{display:none}}`;constructor(){super(),this.showTimer=null,this.hideTimer=null}connectedCallback(){super.connectedCallback(),ht(this.renderRoot)}disconnectedCallback(){this._hidePreview(),super.disconnectedCallback()}updated(){let e=this.renderRoot.querySelector(".preview");e?e.matches(":popover-open")&&this._positionPreview():this._hidePreview()}_schedulePreview(){clearTimeout(this.hideTimer),clearTimeout(this.showTimer),this.renderRoot.querySelector(".preview")&&(this.showTimer=setTimeout(()=>{if(!this.isConnected)return;let e=this.renderRoot.querySelector(".preview");e&&(Sa(),e.showPopover(),this._positionPreview(),document.addEventListener("keydown",this._previewKeyDown,!0),window.addEventListener("scroll",this._previewScroll,!0),window.addEventListener("resize",this._hidePreview))},150))}_keepPreview(){clearTimeout(this.hideTimer)}_leavePreview(){clearTimeout(this.showTimer),clearTimeout(this.hideTimer),this.hideTimer=setTimeout(()=>{this.renderRoot.querySelector(".preview")?.contains(this.renderRoot.activeElement)||this._hidePreview()},150)}_hidePreview=()=>{clearTimeout(this.showTimer),clearTimeout(this.hideTimer);let e=this.renderRoot?.querySelector(".preview");e?.matches(":popover-open")&&e.hidePopover(),document.removeEventListener("keydown",this._previewKeyDown,!0),window.removeEventListener("scroll",this._previewScroll,!0),window.removeEventListener("resize",this._hidePreview)};_previewKeyDown=e=>{e.key==="Escape"&&(e.preventDefault(),e.stopPropagation(),this.renderRoot.querySelector(".preview")?.contains(this.renderRoot.activeElement)&&this.renderRoot.querySelector("[aria-details]").focus({preventScroll:!0}),this._hidePreview())};_previewScroll=e=>{e.composedPath().includes(this.renderRoot.querySelector(".preview"))||this._hidePreview()};_positionPreview(){let e=this.renderRoot.querySelector(".preview"),t=this.renderRoot.querySelector("[aria-details]").getBoundingClientRect(),{width:r,height:n}=e.getBoundingClientRect(),s=8,o=12,c=Math.max(o,Math.min(t.left,window.innerWidth-r-o)),u=t.bottom+s+n<=window.innerHeight-o?t.bottom+s:Math.max(o,t.top-s-n);e.style.left=`${c}px`,e.style.top=`${u}px`}};var Io={open:"Open",draft:"Draft",closed:"Closed",merged:"Merged",completed:"Completed",not_planned:"Not planned",duplicate:"Duplicate",unknown:"Closed"},Fg=a`<svg viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="4" cy="3" r="1.75"/><circle cx="4" cy="13" r="1.75"/><circle cx="12" cy="13" r="1.75"/><path d="M4 4.75v6.5M12 11.25V5a2 2 0 0 0-2-2H8m2-2L8 3l2 2"/></svg>`,Dg=a`<svg viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><circle cx="8" cy="8" r="6.25"/><circle cx="8" cy="8" r="1.5" fill="currentColor" stroke="none"/></svg>`,Og=a`<svg viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="8" cy="8" r="6.25"/><path d="m5 8 2 2 4-4"/></svg>`,Bg=a`<svg viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><circle cx="8" cy="8" r="6.25"/><path d="m3.5 12.5 9-9"/></svg>`,Ng={completed:Og,not_planned:Bg},Fo=class extends He{static properties={url:{type:String},compact:{type:Boolean,reflect:!0}};static styles=[He.styles,ut`:host{display:inline;word-break:normal}a{color:var(--accent);text-decoration:none;overflow-wrap:anywhere;cursor:default}.status{display:inline-flex;align-items:center;gap:.3em;vertical-align:text-bottom;margin-right:.35em;font-weight:600;white-space:nowrap}svg{flex:none}.open{color:light-dark(#1a7f37,#3fb950)}.draft,.not_planned,.duplicate,.unknown,.unavailable{color:var(--muted)}.closed{color:light-dark(#d1242f,#f85149)}.merged,.completed{color:light-dark(#8250df,#a371f7)}:host(:not([compact])){display:block}:host(:not([compact])) .fix-link{display:flex;align-items:center;gap:.55rem;min-width:0}.link-icon{flex:none;line-height:1}.link-icon svg{display:block}.link-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text);font-weight:500;line-height:1.5}.link-icon.unavailable+.link-title{color:var(--accent)}.ref{min-width:0;max-width:32%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted);font-size:.74rem}.link-status{flex:none;padding:.15rem .4rem;border-radius:999px;background:color-mix(in srgb,currentColor 10%,transparent);font-size:.7rem;font-weight:500;line-height:1.3}:host([compact]){display:inline-flex}:host([compact]) .fix-link{display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%}:host([compact]) .fix-link svg{width:14px;height:14px}:host([compact]) .status{margin:0;font-size:1rem;line-height:1}.preview-header{display:flex;align-items:center;justify-content:space-between;gap:12px}.preview-ref{display:inline-flex;align-items:center;gap:.4rem;min-width:0;color:var(--muted);font-size:12px;line-height:1.4}.preview-ref span{min-width:0}.preview-description{margin-top:8px;white-space:pre-wrap}.preview-title{margin-top:8px;font-size:15px;font-weight:600;line-height:1.4}.preview .preview-header .status{flex:none;margin:0;font-size:12px;line-height:1.4}@media print{:host(:not([compact])) .fix-link{display:block}.link-title,.ref{white-space:normal;overflow:visible;text-overflow:clip;max-width:none}.link-icon{display:inline-block;vertical-align:middle;margin-right:.55rem}.ref,.link-status{margin-left:.55rem}.preview{display:none}}`];constructor(){super(),this.url="",this.compact=!1,this.unsubscribe=null}connectedCallback(){super.connectedCallback(),this.unsubscribe=Rl(()=>this.requestUpdate()),this.hasUpdated&&this.requestUpdate()}disconnectedCallback(){this.unsubscribe?.(),this.unsubscribe=null,super.disconnectedCallback()}updated(e){e.has("url")||e.has("compact")?this._hidePreview():super.updated(e)}render(){if(!wi(this.url))return a`${this.url}`;let e=Cl(this.url),t=!e&&El(this.url),r=e||t,n=Tl.read(this.url);if(!n&&!r){let p=`Open fix link: ${this.url}`;return a`<a class="${this.compact?"fix-link":""}" href="${this.url}" target="_blank" rel="noopener noreferrer" draggable="false" data-tooltip="${this.compact?p:m}" aria-label="${p}">${this.compact?a`<slot></slot>`:this.url}</a>`}let s=n?t&&n.status==="closed"?n.stateReason??"unknown":n.status:"unavailable",o=e?Fg:t?Ng[s]??Dg:null,c=r?`${r.repo}#${r.number}`:"",u=(n?.title.length??0)>40||(n?.description??"").split(/[\r\n]/u).some(p=>p.length>100),d=n?`${Io[s]} ${e?"pull request":"issue"}: ${n.title} (${c})`:r?`Open ${e?"pull request":"issue"}: ${c}`:`Open fix link: ${this.url}`;return a`<a class="fix-link" href="${this.url}" target="_blank" rel="noopener noreferrer" draggable="false" aria-label="${d}" aria-details="${this.compact&&r?"fix-preview":m}" data-tooltip="${this.compact&&!r?d:m}" @mouseenter="${this._schedulePreview}" @mouseleave="${this._leavePreview}" @focus="${this._schedulePreview}" @blur="${this._leavePreview}" @click="${this._hidePreview}">${this.compact?o?a`<span class="${`status ${s}`}">${o}</span>`:a`<slot></slot>`:a`${o?a`<span class="${`link-icon ${s}`}">${o}</span>`:m} <span class="link-title">${n?.title??(c||this.url)}</span> ${n?a`<span class="ref">${c}</span><span class="${`link-status ${s}`}">${Io[s]}</span>`:m}`} </a>${this.compact&&r?a`<a class="${u?"preview wide":"preview"}" id="fix-preview" popover="manual" href="${this.url}" target="_blank" rel="noopener noreferrer" draggable="false" aria-label="${`Open ${e?"pull request":"issue"} ${c} on GitHub`}" @mouseenter="${this._keepPreview}" @mouseleave="${this._leavePreview}" @focusin="${this._keepPreview}" @focusout="${this._leavePreview}" @click="${p=>{p.stopPropagation(),this._hidePreview()}}"><div class="preview-header"><span class="preview-ref">${J(bi)}<span>${c}</span></span> <span class="${`status ${s}`}">${o}${n?Io[s]:e?"Pull request":"Issue"}</span></div>${n?a`<div class="preview-title">${n.title}</div>`:m} ${n?.description?a`<div class="preview-description">${n.description}</div>`:m}</a>`:m}`}};customElements.define("managed-fix-link",Fo);var Do=class extends He{static properties={finding:{attribute:!1},comment:{type:String}};static styles=[He.styles,M(Ei),ut`:host{display:inline-flex}:host([hidden]){display:none!important}button{border:0;padding:0;background:none;color:inherit;font:inherit;cursor:default}.preview-trigger{display:inline-flex;align-items:center;justify-content:center;line-height:0}.preview-trigger:hover{color:var(--accent)}.managed-comment+.managed-comment{margin-top:12px;padding-top:12px;border-top:1px solid var(--border)}.comment-body{white-space:pre-wrap}.comment-body a{color:var(--accent);text-decoration:none}.comment-body a:hover{text-decoration:underline}.preview-footer{display:flex;justify-content:flex-end;margin-top:8px}.edit-hint{color:var(--muted);font-size:12px}.edit-hint:hover{color:var(--accent)}`];constructor(){super(),this.finding=null,this.comment="",this.unsubscribe=null}connectedCallback(){super.connectedCallback(),this._subscribe(),document.addEventListener("managed-comments-reset",this._resetComments),this.hasUpdated&&this.requestUpdate()}disconnectedCallback(){this.unsubscribe?.(),this.unsubscribe=null,document.removeEventListener("managed-comments-reset",this._resetComments),super.disconnectedCallback()}updated(e){this.hidden=!this.renderRoot.querySelector(".preview"),e.has("finding")&&(this._hidePreview(),this._subscribe()),super.updated(e)}_subscribe(){this.unsubscribe?.(),this.unsubscribe=this.finding?.id?mc(this.finding.id,()=>this.requestUpdate()):null}_resetComments=()=>{this._hidePreview(),this.requestUpdate()};_previewClick(e){if(e.target.closest("a, button")){this._hidePreview();return}window.getSelection?.()?.toString()||(e.stopPropagation(),this.renderRoot.querySelector(".preview-trigger").click())}render(){let e=H(),t=e?fc(this.finding):[];if(!(e?t.length>0:!!this.comment))return m;let s=(e?t.map(o=>o.body):[this.comment]).some(o=>o.split(/[\r\n]/u).some(c=>c.length>100));return a`<button type="button" class="preview-trigger mark-comment" aria-label="${e?"View comments":"Edit comment"}" aria-details="comment-preview" @mouseenter="${this._schedulePreview}" @mouseleave="${this._leavePreview}" @focus="${this._schedulePreview}" @blur="${this._leavePreview}" @click="${this._hidePreview}"><slot></slot></button><div class="${s?"preview wide":"preview"}" id="comment-preview" popover="manual" role="region" aria-label="${e?"Comments":"Comment"}" @mouseenter="${this._keepPreview}" @mouseleave="${this._leavePreview}" @focusin="${this._keepPreview}" @focusout="${this._leavePreview}" @click="${this._previewClick}">${e?t.map(o=>Ta(o,un(o.body))):a`<div class="comment-body">${un(this.comment)}</div><div class="preview-footer"><button type="button" class="mark-comment edit-hint">Edit</button></div>`}</div>`}};customElements.define("comment-preview",Do);function Lh(i){if(fa(i))throw new Error("This is a links file, not a report. Wrap report rows in a groups or findings object to compare them.");let e=i;try{let c=JSON.parse(i);Array.isArray(c)&&(e=JSON.stringify({groups:c}))}catch{}let{data:t,reason:r}=la(e);if(!t)throw new Error(r);let n=[],s=new Map,o=0;for(let c of aa(t)){let u=new Set;for(let d of Array.isArray(c)?c:[c])if(!(!d||typeof d!="object"||Array.isArray(d))){if(typeof d.id!="string"||!d.id){o++;continue}u.add(d.id),s.has(d.id)||s.set(d.id,[]),s.get(d.id).push(d)}n.push([...u].toSorted())}return{rows:n,byId:s,missingIds:o}}function zg(i){let e=new Set;for(let t of i){let r=[...new Set(t)].toSorted();for(let n=0;n<r.length;n++)for(let s=n+1;s<r.length;s++)e.add(JSON.stringify([r[n],r[s]]))}return e}function Th(i){let e=new Map,t=n=>{let s=n;for(;e.get(s)!==s;)e.set(s,e.get(e.get(s))),s=e.get(s);return s};for(let n of i){let[s,o]=JSON.parse(n);for(let c of[s,o])e.has(c)||e.set(c,c);e.set(t(s),t(o))}let r=new Map;for(let n of[...e.keys()].toSorted()){let s=t(n);r.has(s)||r.set(s,[]),r.get(s).push(n)}return[...r.values()].toSorted((n,s)=>n[0].localeCompare(s[0]))}function Ie(i,e,t){let r=(i.byId.get(e)??[]).map(n=>t==="verdict"?sa(n)||null:t==="severity"?ra(n)??null:t==="originalSeverity"?n.severity??null:t==="confidence"&&Number.isFinite(n.confidence)?n.confidence:null);return[...new Set(r)].toSorted((n,s)=>String(n).localeCompare(String(s),void 0,{numeric:!0}))}var Rh=(i,e)=>i.length===e.length&&i.every((t,r)=>t===e[r]),Hr=(i,e)=>[...i].filter(t=>!e.has(t)).toSorted();function Mh(i,e){let t=new Set(i.byId.keys()),r=new Set(e.byId.keys()),n=[...t].filter(v=>r.has(v)).toSorted(),s=new Set(n),o=v=>zg(v.rows.map(g=>g.filter(y=>s.has(y)))),c=o(i),u=o(e),d={confirmed:[],refuted:[],otherVerdicts:[],confidence:[],severity:[]};for(let v of n)for(let g of["verdict","confidence","severity"]){let y=Ie(i,v,g),k=Ie(e,v,g),_={id:v,before:y,after:k};if(g==="severity"&&(_.originalBefore=Ie(i,v,"originalSeverity"),_.originalAfter=Ie(e,v,"originalSeverity")),Rh(y,k)&&(g!=="severity"||Rh(_.originalBefore,_.originalAfter)))continue;if(g!=="verdict"){d[g].push(_);continue}let x=k.length===1&&k[0]==="confirmed"?"confirmed":k.length===1&&k[0]==="refuted"?"refuted":"otherVerdicts";d[x].push(_)}let p=Th(Hr(u,c)),h=Th(Hr(c,u)),f=Hr(r,t),b=Hr(t,r);return{before:i,after:e,added:f,removed:b,shared:n,joined:p,split:h,...d,unchanged:f.length===0&&b.length===0&&p.length===0&&h.length===0&&Object.values(d).every(v=>v.length===0)}}var Ph=`dialog{width:min(94vw,1180px);max-width:1180px;height:min(88dvh,960px);max-height:92dvh;margin-block:auto;padding:0;overflow:hidden;background:var(--theme-bar)}dialog[open]{display:flex;flex-direction:column}header{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:1.1rem 1.3rem}header h3{margin-bottom:.25rem;font-size:1.1rem}header p,.muted,.note,.empty{color:var(--muted);font-size:.78rem;line-height:1.5}button,select,input{font:inherit;font-size:.8rem}button,select,.file-button,.search{color:var(--text);background:var(--surface);border:1px solid var(--border);border-radius:var(--ui-radius, 6px);padding:.45rem .65rem}button:not(:disabled):hover,.file-button:hover{background:var(--surface-active)}button:disabled{opacity:.45}button:focus-visible,select:focus-visible,.search:focus-visible,.file-button:focus-within{outline:2px solid var(--accent);outline-offset:2px}.pickers{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:start;gap:1rem;padding:0 1.3rem 1rem;border-bottom:1px solid var(--border)}.picker{min-width:0}.picker>label{display:block;font-size:.72rem;font-weight:600;margin-bottom:.4rem;color:var(--muted)}.picker select{width:100%;text-overflow:ellipsis}.file-picker{display:flex;align-items:center;flex-wrap:wrap;gap:.6rem;margin-top:.55rem}.file-button{position:relative;display:inline-block;font-size:.74rem;padding:.3rem .5rem;overflow:hidden}.file-button input{position:absolute;inset:0;opacity:0;width:100%}.swap{align-self:start;margin-top:1.5rem;font-size:1rem}.results{overflow:auto;min-height:0;padding:1.1rem 1.3rem 1.4rem}.summary{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:.65rem}.summary>div{display:flex;flex-direction:column;gap:.35rem;padding:.8rem 1rem;background:var(--bg);border:1px solid var(--border);border-radius:var(--ui-radius, 7px)}.summary span{font-size:.72rem;color:var(--muted)}.summary strong{font-size:1.15rem;font-variant-numeric:tabular-nums}.positive h4{color:var(--green)}.negative h4,.verdict-confirmed h4,.summary .verdict-confirmed strong{color:var(--critical)}.verdict-refuted h4,.summary .verdict-refuted strong{color:var(--muted)}.change-counts{display:flex;flex-wrap:wrap;gap:.4rem;margin-top:.7rem}.change-counts span{font-size:.7rem;padding:.3rem .5rem;border-radius:5px;background:var(--bg);color:var(--muted)}.results-head{display:flex;align-items:center;flex-wrap:wrap;gap:.75rem;margin-block:1rem}.results-head p{flex:1;font-size:.78rem;color:var(--muted);overflow-wrap:anywhere}.search{width:min(100%,17rem)}.section-title{margin:1.2rem 0 .5rem;font-size:.87rem}.note{margin:-.15rem 0 .6rem}.columns{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.8rem}.change-section{border:1px solid var(--border);border-radius:var(--ui-radius, 7px);overflow:hidden;margin-bottom:.6rem}.change-section h4{display:flex;justify-content:space-between;align-items:center;gap:.5rem;font-size:.78rem;font-weight:600;padding:.65rem .8rem;background:var(--bg)}.count{font-variant-numeric:tabular-nums;font-size:.7rem}ul{list-style:none}li{border-top:1px solid var(--border);padding:.7rem .8rem}.change-row{display:flex;justify-content:space-between;align-items:start;gap:.8rem}.finding{display:flex;flex-direction:column;gap:.2rem;min-width:0;overflow-wrap:anywhere}.finding strong{font-size:.77rem;font-weight:500;line-height:1.4}.finding code,.finding small{color:var(--muted);font-size:.66rem;line-height:1.4}.change-value{display:flex;align-items:center;justify-content:end;flex-wrap:wrap;gap:.3rem;max-width:48%;flex-shrink:0;font-size:.73rem;text-align:end;overflow-wrap:anywhere}.from{color:var(--muted)}.change-value small{width:100%;color:var(--muted);font-size:.67rem}.group-members{display:flex;flex-direction:column;gap:.55rem}.group-shape{display:flex;flex-wrap:wrap;gap:.45rem;margin-top:.7rem;font:.66rem/1.5 monospace;overflow-wrap:anywhere}.group-shape>span{min-width:0}.empty{padding:.7rem .8rem}.more{margin:.5rem .8rem .7rem;font-size:.72rem}.placeholder{padding:4rem 1rem;text-align:center;color:var(--muted);font-size:.85rem}.identical{color:var(--green);font-size:.82rem;padding-block:.5rem}.error,.warning{font-size:.75rem;line-height:1.5;margin-top:.5rem;overflow-wrap:anywhere}.error{color:var(--critical)}.warning{color:var(--yellow)}dialog>.error{padding:0 1.3rem .6rem}@media(width<=650px){.pickers{gap:.5rem;padding-inline:.8rem}.columns{grid-template-columns:minmax(0,1fr);gap:0}.summary{grid-template-columns:repeat(2,minmax(0,1fr))}.summary>div{padding:.6rem}.results-head p{flex-basis:100%}.search{width:100%}header,.results{padding-inline:.8rem}.change-row{flex-wrap:wrap}.change-value{max-width:100%}}
101
101
  `;var Oo=()=>({key:"",name:"",report:null,error:"",loading:!1}),ct=(i,e)=>i.map(t=>t===null?"Not supplied":e==="confidence"?`${t}/10`:String(t).replaceAll("_"," ")).join(" / "),Bo=50,No=class extends q{static styles=[...q.styles,M(Ph)];static properties={_names:{state:!0},_sides:{state:!0},_catalogError:{state:!0},_catalogLoading:{state:!0},_diff:{state:!0},_query:{state:!0},_limits:{state:!0}};constructor(){super(),this._names=[],this._sides=[Oo(),Oo()],this._tokens=[0,0],this._catalogError="",this._catalogLoading=!0,this._diff=null,this._query="",this._limits={}}beforeOpen(){this._loadCatalog()}focusInitial(){this.renderRoot.querySelector("select")?.focus()}async _loadCatalog(){try{let e=await gt();if(this._settled)return;this._names=e.filter(n=>ol(n)!==ma);let t=this._names.includes(l.currentFile)?l.currentFile:this._names[0];t&&!this._tokens[0]&&this._select(0,t);let r=this._names.find(n=>n!==t);r&&!this._tokens[1]&&this._select(1,r)}catch(e){this._settled||(this._catalogError=`Couldn't list saved reports: ${e.message}`)}finally{this._settled||(this._catalogLoading=!1)}}_setSide(e,t){this._sides=this._sides.map((s,o)=>o===e?t:s),this._limits={};let[r,n]=this._sides.map(s=>s.report);this._diff=r&&n?Mh(r,n):null}async _select(e,t,r){let n=++this._tokens[e],s={...Oo(),key:r?"":t,name:t,loading:!!t};if(this._setSide(e,s),!!t)try{let o=r?await r.text():await tl(t);if(this._settled||this._tokens[e]!==n)return;this._setSide(e,{...s,loading:!1,report:Lh(o)})}catch(o){!this._settled&&this._tokens[e]===n&&this._setSide(e,{...s,loading:!1,error:`Couldn't read ${t}: ${o.message}`})}}_file(e,t){let r=t.target.files?.[0];t.target.value="",r&&this._select(e,r.name,r)}_swap(){this._sides.some(e=>e.loading)||(this._tokens=this._tokens.map(e=>e+1),this._sides=this._sides.toReversed(),this._setSide(0,this._sides[0]))}_picker(e){let t=this._sides[e],r=e===0?"Before":"After";return a`<section class="picker"><label for="${`report-${e}`}">${r}</label> <select id="${`report-${e}`}" @change="${n=>this._select(e,n.target.value)}"><option value="" .selected="${!t.key}">${t.name&&!t.key?t.name:"Choose a saved report\u2026"}</option>${this._names.map(n=>a`<option value="${n}" .selected="${t.key===n}">${n}</option>`)}</select><div class="file-picker"><label class="file-button">Open file…<input type="file" accept=".json,.md,.markdown" aria-label="${`Open ${r.toLowerCase()} report file`}" @change="${n=>this._file(e,n)}"></label> <span class="muted">${t.loading?"Reading report\u2026":t.report?`${t.report.byId.size.toLocaleString()} unique findings`:"JSON or Markdown"}</span></div>${t.error?a`<p class="error" role="alert">${t.error}</p>`:m} ${t.report?.missingIds?a`<p class="warning">${t.report.missingIds} findings without an id excluded.</p>`:m}</section>`}_finding(e){let t=this._diff.after.byId.get(e)?.[0]??this._diff.before.byId.get(e)?.[0];return a`<span class="finding"><strong>${Bt(t)||e}</strong><code>${e}</code>${t.file?a`<small>${t.file}</small>`:m}</span>`}_matches(e){let t=this._query.trim().toLowerCase();if(!t)return!0;let r=[...this._diff.before.byId.get(e)??[],...this._diff.after.byId.get(e)??[]];return[e,...r.flatMap(n=>[Bt(n),n.file])].filter(Boolean).some(n=>n.toLowerCase().includes(t))}_section(e,t,r,n,s=""){let o=r.filter(u=>(Array.isArray(u)?u:[u.id??u]).some(d=>this._matches(d))),c=this._limits[e]??Bo;return a`<section class="${`change-section ${s}`}" aria-label="${t}"><h4>${t}<span class="count">${this._query.trim()?`${o.length} / `:""}${r.length}</span></h4>${o.length>0?a`<ul>${o.slice(0,c).map(n)}</ul>`:a`<p class="empty">${r.length>0?"No matching findings.":"No changes."}</p>`} ${o.length>c?a`<button class="more" @click="${()=>{this._limits={...this._limits,[e]:c+Bo}}}">Show ${Math.min(Bo,o.length-c)} more (${o.length-c} remaining)</button>`:m}</section>`}_changeRow(e,t){let r=t==="severity"&&JSON.stringify(e.originalBefore)!==JSON.stringify(e.originalAfter);return a`<li class="change-row">${this._finding(e.id)}<span class="change-value"> <span class="from">${ct(e.before,t)}</span><span aria-label="to">→</span><span>${ct(e.after,t)}</span> ${r?a`<small>Original: ${ct(e.originalBefore)} → ${ct(e.originalAfter)}</small>`:m}</span></li>`}_presenceRow(e,t){let r=ct(Ie(t,e,"verdict"));return a`<li class="change-row">${this._finding(e)}<span class="change-value"> <span>${ct(Ie(t,e,"severity"))}</span><span>${ct(Ie(t,e,"confidence"),"confidence")}</span> ${r==="Not supplied"?m:a`<small>${r}</small>`}</span></li>`}_groupRow(e){let t=new Set(e),r=n=>n.rows.map(s=>s.filter(o=>t.has(o))).filter(s=>s.length).map(s=>s.join(", ")).filter((s,o,c)=>c.indexOf(s)===o).join(" | ");return a`<li class="group-row"><div class="group-members">${e.map(n=>this._finding(n))}</div><div class="group-shape"><span class="from">${r(this._diff.before)}</span><span aria-label="to">→</span><span>${r(this._diff.after)}</span></div></li>`}_verdictCount(e,t){return[...e.byId.keys()].filter(r=>Ie(e,r,"verdict").includes(t)).length}_results(){let e=this._diff;return e?a`<div class="summary" aria-label="Comparison summary"><div><span>Unique findings</span><strong>${e.before.byId.size} → ${e.after.byId.size}</strong></div><div><span>In common</span><strong>${e.shared.length}</strong></div><div class="verdict-confirmed"><span>Confirmed</span><strong>${this._verdictCount(e.before,"confirmed")} → ${this._verdictCount(e.after,"confirmed")}</strong></div><div class="verdict-refuted"><span>Refuted</span><strong>${this._verdictCount(e.before,"refuted")} → ${this._verdictCount(e.after,"refuted")}</strong></div></div><div class="change-counts" aria-label="Change counts"><span>${e.added.length} added</span><span>${e.removed.length} removed</span> <span>${e.joined.length} joined</span><span>${e.split.length} split</span> <span>${e.confidence.length} confidence</span><span>${e.severity.length} severity</span></div><div class="results-head"><p>Changes from <strong>${this._sides[0].name}</strong> to <strong>${this._sides[1].name}</strong>.</p><input class="search" type="search" aria-label="Filter comparison findings" placeholder="Filter by id, title or file…" .value="${this._query}" @input="${t=>{this._query=t.target.value,this._limits={}}}"></div>${e.shared.length===0&&(e.before.missingIds||e.after.missingIds)?a`<p class="warning" role="status">No shared ids to compare. Findings without ids cannot be matched.</p>`:e.unchanged?a`<p class="identical" role="status">No differences in finding ids, grouping, verdicts, confidence or severity.</p>`:m}<h3 class="section-title">Findings</h3><div class="columns">${this._section("added","Added",e.added,t=>this._presenceRow(t,e.after),"positive")} ${this._section("removed","Removed",e.removed,t=>this._presenceRow(t,e.before),"negative")}</div><h3 class="section-title">Revalidation</h3><p class="note">Changed verdicts for shared ids, grouped by the after report’s verdict.</p><div class="columns">${this._section("confirmed","Confirmed",e.confirmed,t=>this._changeRow(t,"verdict"),"verdict-confirmed")} ${this._section("refuted","Refuted",e.refuted,t=>this._changeRow(t,"verdict"),"verdict-refuted")}</div>${e.otherVerdicts.length>0?this._section("other","Other verdict changes",e.otherVerdicts,t=>this._changeRow(t,"verdict")):m}<h3 class="section-title">Grouping</h3><p class="note">Only shared ids. Each cluster connects changed pairs; added or removed findings do not count as regrouping.</p><div class="columns">${this._section("joined","Joined",e.joined,t=>this._groupRow(t),"positive")} ${this._section("split","Split",e.split,t=>this._groupRow(t),"negative")}</div><h3 class="section-title">Ratings</h3><p class="note">Shared ids only. Severity includes report corrections; changes to original severity are also shown.</p><div class="columns">${this._section("confidence","Confidence changes",e.confidence,t=>this._changeRow(t,"confidence"))} ${this._section("severity","Severity changes",e.severity,t=>this._changeRow(t,"severity"))}</div>`:a`<p class="placeholder" role="status">${this._sides.some(t=>t.loading)||this._catalogLoading?"Loading reports\u2026":"Choose two saved reports or open two files to compare."}</p>`}render(){return a`<dialog aria-labelledby="compare-title" @close="${this._onClose}"><header><div><h3 id="compare-title">Compare reports</h3><p>Compare findings, grouping and ratings between two reports.</p></div><button aria-label="Close report comparison" @click="${this._onClose}">Close</button></header><div class="pickers">${this._picker(0)}<button class="swap" aria-label="Swap before and after reports" ?disabled="${this._sides.some(e=>e.loading)}" @click="${this._swap}">⇄</button>${this._picker(1)}</div>${this._catalogError?a`<p class="error" role="alert">${this._catalogError} You can still open files directly.</p>`:m}<div class="results">${this._results()}</div></dialog>`}};customElements.define("report-compare-dialog",No);function Ah(){if(H())throw new Error("Report comparison is available in local/E2E mode.");return Y("report-compare-dialog")}function pi(i){let e=new Map;for(let[t,r]of l.triage)r[i]&&e.set(t,r[i]);return e}var Hg={get markers(){return pi("color")},get triageState(){return pi("triage")},get comments(){return pi("comment")},get fixes(){return pi("fix")},get flags(){return pi("flagged")},get(i){let e=l.triage.get(i),t={};return e?.color&&(t.color=e.color),e?.triage&&(t.triage=e.triage),e?.comment&&(t.comment=e.comment),e?.fix&&(t.fix=e.fix),e?.flagged!==void 0&&(t.flagged=e.flagged),t},async set(i,{color:e,triage:t,comment:r,fix:n,flagged:s}={}){if(Ut())throw new Error("DeepView.triage.set: triage is read-only on this page");let o=!1;if(e!==void 0&&(e===null||e===""?X(l.triage,i,{color:void 0})&&(o=!0):l.triage.get(i)?.color!==e&&(X(l.triage,i,{color:e}),o=!0)),t!==void 0)if(t===null||t===""||t===!1)X(l.triage,i,{triage:void 0})&&(o=!0);else if(t==="inprogress"||t==="fixed"||t==="invalid"||t==="deleted"||t==="ignored")l.triage.get(i)?.triage!==t&&(X(l.triage,i,{triage:t}),o=!0);else throw new TypeError(`DeepView.triage.set: unknown triage value ${JSON.stringify(t)} (expected 'inprogress' | 'fixed' | 'invalid' | 'deleted' | 'ignored' | null)`);if(r!==void 0){let c=r?String(r):"";c?l.triage.get(i)?.comment!==c&&(X(l.triage,i,{comment:c}),o=!0):X(l.triage,i,{comment:void 0})&&(o=!0)}if(n!==void 0){let c=n?String(n):"";c?l.triage.get(i)?.fix!==c&&(X(l.triage,i,{fix:c}),o=!0):X(l.triage,i,{fix:void 0})&&(o=!0)}if(s!==void 0){let c=s===null||s===""?void 0:!!s;l.triage.get(i)?.flagged!==c&&(X(l.triage,i,{flagged:c}),o=!0)}return o&&(await ke(),$()),o}};window.DeepView={get reports(){return l.reports.slice()},get groups(){return Vt()},get findings(){return Vt().flat()},get currentFile(){return l.currentFile},get currentWorkspace(){return l.currentWorkspace},triage:Hg,forceManagedMode:qd,setTheme:Gu,get theme(){return Wu()},triageSync:Fi,refresh(){$()},export(){return rp()},compareReports(){return Ah()}};var Ug={default:Je.default,"claude-security":Je["claude-security"],"codex-security":Je["codex-security"],deepsec:Je.deepsec,piolium:Je.piolium,"markdown-generic":Je["markdown-generic"],bundle:Yo,workspace:Jo,links:gi,github:bi};for(let i of document.querySelectorAll(".drop-supported-icon[data-icon]")){let e=Ug[i.dataset.icon];e&&(i.innerHTML=e)}kl($);pl($);wl($);Fi.onStatusChange($);yl(async(i,e)=>{l.currentWorkspace===i?await it(i):l.currentFile&&l.currentFile===e?await tt(e):await fe()});_l(async()=>{await fe(),l.currentView==="bundles"&&$()});jd();Kd();async function Dh(){let i=vl();if(!i)return!1;try{history.replaceState(null,"",location.pathname)}catch{}let e;try{e=await Wd({encoded:i})}catch(r){return alert(`Couldn't open the share-link unlock prompt: ${r.message}`),!1}if(!e)return!1;let t=await ll({id:e.id,name:e.name,privateKey:e.privateKeyBase64});if(t.status==="already-attached")return alert(`This workspace is already attached as "${t.workspace.name}".`),!1;if(t.status==="name-collision"){let r=t.existing?.name;return alert(r?`A workspace named "${r}" already exists. Open the share link again and pick a different name.`:"The shared workspace name is empty or invalid. Ask the sender to re-share with a real name."),!1}return t.workspace?.id?await it(t.workspace.id):await fe(),!0}async function Oh(){let i=ha();if(!i)return!1;try{history.replaceState(null,"",location.pathname)}catch{}let e=await zd(i);return e.ok?!0:(alert(e.reason),!1)}var It=!1;async function Bh(){if(await St(),!It&&!(!H()&&we()&&!Ye())){It=!0;try{await jg()}finally{$a.hidden=!1}}}async function jg(){let i=cn(),e=()=>i===cn()&&!H();if(H()){await fe();return}if(await Ya(),!e()||(al(),await Promise.all([fe(),ul().catch(s=>console.warn("initial linked findings:",s))]),!e())||await Dh()||!e()||await Oh()||!e())return;let n=Wa(fd);if(n)if(n.startsWith("wbs:")||n.startsWith("wrs:"))await Xi(n.slice(4),n.startsWith("wrs:")?"reports":"bundles");else if(n.startsWith("ws:")){let s=n.slice(3);he().some(o=>o.id===s)&&await it(s)}else if(n.startsWith("b:")){let s=n.slice(2),o=s.indexOf(" "),c=o>=0?s.slice(0,o):s,u=o>=0?s.slice(o+1):"",d=ki.has(u)?u:"overview";if((l.bundles??[]).some(p=>p.integrity===c)){let p=he().filter(h=>h.bundles.includes(c));Kt(c,d,{workspaceId:p.length===1?p[0].id:null}),$(),wt(c),await fe()}}else{let s=await gt();if(!e())return;let o=hl(n);o&&s.includes(o.name)&&await tt(o.name,void 0,{workspaceId:o.workspaceId})}}var Ur=!1,Ih=!1;document.addEventListener("managed-client-mode-change",()=>{Ur=!H()&&we()});function Fh(i){Ih||(Ih=!0,queueMicrotask(()=>{alert(i+" This tab will reload to refresh its state. Any unsaved edits in this tab will be lost."),location.reload()}))}Pi(async()=>{if(await St(),H()){$();return}let i=Ur,e=we();if(Ur=e,$(),!It&&Ye()){Bh().catch(t=>console.warn("continueBoot:",t));return}if(It&&e&&!Ye()){Fh("Encryption was just enabled in another tab.");return}It&&i&&!e&&!ja()&&Fh("Encryption was disabled in another tab.")});window.addEventListener("hashchange",()=>{!It||H()||(async()=>{await Dh()||await Oh()})().catch(i=>console.warn("deep-link hashchange:",i))});(async()=>{if(!await Gd()){await St(),Ur=!H()&&we();try{let i=window.matchMedia?.("(display-mode: window-controls-overlay)"),e=()=>{let n=!1;try{n=localStorage.getItem("deepview.sidebarCollapsed")==="1"}catch{}xa.classList.toggle("collapsed",n&&!i?.matches)};e(),i?.addEventListener("change",e);let t=i?.matches;if(window.matchMedia?.("(display-mode: standalone)").matches||t){let n=document.querySelector('meta[name="viewport"]');n&&n.setAttribute("content","width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"),window.addEventListener("wheel",s=>{(s.ctrlKey||s.metaKey)&&s.preventDefault()},{passive:!1}),window.addEventListener("keydown",s=>{(s.ctrlKey||s.metaKey)&&(s.key==="="||s.key==="+"||s.key==="-"||s.key==="0")&&s.preventDefault()})}}catch{}!H()&&we()&&!Ye()||await Bh()}})();
102
102
  /*! Bundled license information:
103
103