@preventive/triage 1.0.0-alpha.1 → 1.0.0-alpha.2

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,51 +1,51 @@
1
- var Co=globalThis,To=Co.ShadowRoot&&(Co.ShadyCSS===void 0||Co.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,Lc=Symbol(),Mc=new WeakMap,Eo=class{constructor(t,r,n){if(this._$cssResult$=!0,n!==Lc)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=r}get styleSheet(){let t=this.o,r=this.t;if(To&&t===void 0){let n=r!==void 0&&r.length===1;n&&(t=Mc.get(r)),t===void 0&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),n&&Mc.set(r,t))}return t}toString(){return this.cssText}},T=e=>new Eo(typeof e=="string"?e:e+"",void 0,Lc);var Pc=(e,t)=>{if(To)e.adoptedStyleSheets=t.map(r=>r instanceof CSSStyleSheet?r:r.styleSheet);else for(let r of t){let n=document.createElement("style"),o=Co.litNonce;o!==void 0&&n.setAttribute("nonce",o),n.textContent=r.cssText,e.appendChild(n)}},bi=To?e=>e:e=>e instanceof CSSStyleSheet?(t=>{let r="";for(let n of t.cssRules)r+=n.cssText;return T(r)})(e):e;var{is:zh,defineProperty:Wh,getOwnPropertyDescriptor:Hh,getOwnPropertyNames:Vh,getOwnPropertySymbols:jh,getPrototypeOf:Kh}=Object,Ao=globalThis,Oc=Ao.trustedTypes,qh=Oc?Oc.emptyScript:"",Gh=Ao.reactiveElementPolyfillSupport,un=(e,t)=>e,yi={toAttribute(e,t){switch(t){case Boolean:e=e?qh:null;break;case Object:case Array:e=e==null?e:JSON.stringify(e)}return e},fromAttribute(e,t){let r=e;switch(t){case Boolean:r=e!==null;break;case Number:r=e===null?null:Number(e);break;case Object:case Array:try{r=JSON.parse(e)}catch{r=null}}return r}},Nc=(e,t)=>!zh(e,t),Dc={attribute:!0,type:String,converter:yi,reflect:!1,useDefault:!1,hasChanged:Nc};Symbol.metadata??=Symbol("metadata"),Ao.litPropertyMetadata??=new WeakMap;var xt=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,r=Dc){if(r.state&&(r.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((r=Object.create(r)).wrapped=!0),this.elementProperties.set(t,r),!r.noAccessor){let n=Symbol(),o=this.getPropertyDescriptor(t,n,r);o!==void 0&&Wh(this.prototype,t,o)}}static getPropertyDescriptor(t,r,n){let{get:o,set:s}=Hh(this.prototype,t)??{get(){return this[r]},set(i){this[r]=i}};return{get:o,set(i){let l=o?.call(this);s?.call(this,i),this.requestUpdate(t,l,n)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??Dc}static _$Ei(){if(this.hasOwnProperty(un("elementProperties")))return;let t=Kh(this);t.finalize(),t.l!==void 0&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(un("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(un("properties"))){let r=this.properties,n=[...Vh(r),...jh(r)];for(let o of n)this.createProperty(o,r[o])}let t=this[Symbol.metadata];if(t!==null){let r=litPropertyMetadata.get(t);if(r!==void 0)for(let[n,o]of r)this.elementProperties.set(n,o)}this._$Eh=new Map;for(let[r,n]of this.elementProperties){let o=this._$Eu(r,n);o!==void 0&&this._$Eh.set(o,r)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){let r=[];if(Array.isArray(t)){let n=new Set(t.flat(1/0).reverse());for(let o of n)r.unshift(bi(o))}else t!==void 0&&r.push(bi(t));return r}static _$Eu(t,r){let n=r.attribute;return n===!1?void 0:typeof n=="string"?n:typeof t=="string"?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),this.renderRoot!==void 0&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){let t=new Map,r=this.constructor.elementProperties;for(let n of r.keys())this.hasOwnProperty(n)&&(t.set(n,this[n]),delete this[n]);t.size>0&&(this._$Ep=t)}createRenderRoot(){let t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return Pc(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,r,n){this._$AK(t,n)}_$ET(t,r){let n=this.constructor.elementProperties.get(t),o=this.constructor._$Eu(t,n);if(o!==void 0&&n.reflect===!0){let s=(n.converter?.toAttribute!==void 0?n.converter:yi).toAttribute(r,n.type);this._$Em=t,s==null?this.removeAttribute(o):this.setAttribute(o,s),this._$Em=null}}_$AK(t,r){let n=this.constructor,o=n._$Eh.get(t);if(o!==void 0&&this._$Em!==o){let s=n.getPropertyOptions(o),i=typeof s.converter=="function"?{fromAttribute:s.converter}:s.converter?.fromAttribute!==void 0?s.converter:yi;this._$Em=o;let l=i.fromAttribute(r,s.type);this[o]=l??this._$Ej?.get(o)??l,this._$Em=null}}requestUpdate(t,r,n,o=!1,s){if(t!==void 0){let i=this.constructor;if(o===!1&&(s=this[t]),n??=i.getPropertyOptions(t),!((n.hasChanged??Nc)(s,r)||n.useDefault&&n.reflect&&s===this._$Ej?.get(t)&&!this.hasAttribute(i._$Eu(t,n))))return;this.C(t,r,n)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(t,r,{useDefault:n,reflect:o,wrapped:s},i){n&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,i??r??this[t]),s!==!0||i!==void 0)||(this._$AL.has(t)||(this.hasUpdated||n||(r=void 0),this._$AL.set(t,r)),o===!0&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(r){Promise.reject(r)}let t=this.scheduleUpdate();return t!=null&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(let[o,s]of this._$Ep)this[o]=s;this._$Ep=void 0}let n=this.constructor.elementProperties;if(n.size>0)for(let[o,s]of n){let{wrapped:i}=s,l=this[o];i!==!0||this._$AL.has(o)||l===void 0||this.C(o,void 0,s,l)}}let t=!1,r=this._$AL;try{t=this.shouldUpdate(r),t?(this.willUpdate(r),this._$EO?.forEach(n=>n.hostUpdate?.()),this.update(r)):this._$EM()}catch(n){throw t=!1,this._$EM(),n}t&&this._$AE(r)}willUpdate(t){}_$AE(t){this._$EO?.forEach(r=>r.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(r=>this._$ET(r,this[r])),this._$EM()}updated(t){}firstUpdated(t){}};xt.elementStyles=[],xt.shadowRootOptions={mode:"open"},xt[un("elementProperties")]=new Map,xt[un("finalized")]=new Map,Gh?.({ReactiveElement:xt}),(Ao.reactiveElementVersions??=[]).push("2.1.2");var vi=globalThis,Uc=e=>e,Io=vi.trustedTypes,zc=Io?Io.createPolicy("lit-html",{createHTML:e=>e}):void 0,ki="$lit$",_t=`lit$${Math.random().toFixed(9).slice(2)}$`,$i="?"+_t,Yh=`<${$i}>`,nr=document,fn=()=>nr.createComment(""),hn=e=>e===null||typeof e!="object"&&typeof e!="function",xi=Array.isArray,qc=e=>xi(e)||typeof e?.[Symbol.iterator]=="function",wi=`[
2
- \f\r]`,pn=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,Wc=/-->/g,Hc=/>/g,tr=RegExp(`>|${wi}(?:([^\\s"'>=/]+)(${wi}*=${wi}*(?:[^
3
- \f\r"'\`<>=]|("|')|))|$)`,"g"),Vc=/'/g,jc=/"/g,Gc=/^(?:script|style|textarea|title)$/i,_i=e=>(t,...r)=>({_$litType$:e,strings:t,values:r}),c=_i(1),Nv=_i(2),Uv=_i(3),ie=Symbol.for("lit-noChange"),g=Symbol.for("lit-nothing"),Kc=new WeakMap,rr=nr.createTreeWalker(nr,129);function Yc(e,t){if(!xi(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return zc!==void 0?zc.createHTML(t):t}var Jc=(e,t)=>{let r=e.length-1,n=[],o,s=t===2?"<svg>":t===3?"<math>":"",i=pn;for(let l=0;l<r;l++){let d=e[l],u,f,p=-1,h=0;for(;h<d.length&&(i.lastIndex=h,f=i.exec(d),f!==null);)h=i.lastIndex,i===pn?f[1]==="!--"?i=Wc:f[1]!==void 0?i=Hc:f[2]!==void 0?(Gc.test(f[2])&&(o=RegExp("</"+f[2],"g")),i=tr):f[3]!==void 0&&(i=tr):i===tr?f[0]===">"?(i=o??pn,p=-1):f[1]===void 0?p=-2:(p=i.lastIndex-f[2].length,u=f[1],i=f[3]===void 0?tr:f[3]==='"'?jc:Vc):i===jc||i===Vc?i=tr:i===Wc||i===Hc?i=pn:(i=tr,o=void 0);let b=i===tr&&e[l+1].startsWith("/>")?" ":"";s+=i===pn?d+Yh:p>=0?(n.push(u),d.slice(0,p)+ki+d.slice(p)+_t+b):d+_t+(p===-2?l:b)}return[Yc(e,s+(e[r]||"<?>")+(t===2?"</svg>":t===3?"</math>":"")),n]},gn=class e{constructor({strings:t,_$litType$:r},n){let o;this.parts=[];let s=0,i=0,l=t.length-1,d=this.parts,[u,f]=Jc(t,r);if(this.el=e.createElement(u,n),rr.currentNode=this.el.content,r===2||r===3){let p=this.el.content.firstChild;p.replaceWith(...p.childNodes)}for(;(o=rr.nextNode())!==null&&d.length<l;){if(o.nodeType===1){if(o.hasAttributes())for(let p of o.getAttributeNames())if(p.endsWith(ki)){let h=f[i++],b=o.getAttribute(p).split(_t),m=/([.?@])?(.*)/.exec(h);d.push({type:1,index:s,name:m[2],strings:b,ctor:m[1]==="."?Fo:m[1]==="?"?Ro:m[1]==="@"?Mo:sr}),o.removeAttribute(p)}else p.startsWith(_t)&&(d.push({type:6,index:s}),o.removeAttribute(p));if(Gc.test(o.tagName)){let p=o.textContent.split(_t),h=p.length-1;if(h>0){o.textContent=Io?Io.emptyScript:"";for(let b=0;b<h;b++)o.append(p[b],fn()),rr.nextNode(),d.push({type:2,index:++s});o.append(p[h],fn())}}}else if(o.nodeType===8)if(o.data===$i)d.push({type:2,index:s});else{let p=-1;for(;(p=o.data.indexOf(_t,p+1))!==-1;)d.push({type:7,index:s}),p+=_t.length-1}s++}}static createElement(t,r){let n=nr.createElement("template");return n.innerHTML=t,n}};function or(e,t,r=e,n){if(t===ie)return t;let o=n!==void 0?r._$Co?.[n]:r._$Cl,s=hn(t)?void 0:t._$litDirective$;return o?.constructor!==s&&(o?._$AO?.(!1),s===void 0?o=void 0:(o=new s(e),o._$AT(e,r,n)),n!==void 0?(r._$Co??=[])[n]=o:r._$Cl=o),o!==void 0&&(t=or(e,o._$AS(e,t.values),o,n)),t}var Bo=class{constructor(t,r){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=r}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){let{el:{content:r},parts:n}=this._$AD,o=(t?.creationScope??nr).importNode(r,!0);rr.currentNode=o;let s=rr.nextNode(),i=0,l=0,d=n[0];for(;d!==void 0;){if(i===d.index){let u;d.type===2?u=new Cr(s,s.nextSibling,this,t):d.type===1?u=new d.ctor(s,d.name,d.strings,this,t):d.type===6&&(u=new Lo(s,this,t)),this._$AV.push(u),d=n[++l]}i!==d?.index&&(s=rr.nextNode(),i++)}return rr.currentNode=nr,o}p(t){let r=0;for(let n of this._$AV)n!==void 0&&(n.strings!==void 0?(n._$AI(t,n,r),r+=n.strings.length-2):n._$AI(t[r])),r++}},Cr=class e{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,r,n,o){this.type=2,this._$AH=g,this._$AN=void 0,this._$AA=t,this._$AB=r,this._$AM=n,this.options=o,this._$Cv=o?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode,r=this._$AM;return r!==void 0&&t?.nodeType===11&&(t=r.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,r=this){t=or(this,t,r),hn(t)?t===g||t==null||t===""?(this._$AH!==g&&this._$AR(),this._$AH=g):t!==this._$AH&&t!==ie&&this._(t):t._$litType$!==void 0?this.$(t):t.nodeType!==void 0?this.T(t):qc(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==g&&hn(this._$AH)?this._$AA.nextSibling.data=t:this.T(nr.createTextNode(t)),this._$AH=t}$(t){let{values:r,_$litType$:n}=t,o=typeof n=="number"?this._$AC(t):(n.el===void 0&&(n.el=gn.createElement(Yc(n.h,n.h[0]),this.options)),n);if(this._$AH?._$AD===o)this._$AH.p(r);else{let s=new Bo(o,this),i=s.u(this.options);s.p(r),this.T(i),this._$AH=s}}_$AC(t){let r=Kc.get(t.strings);return r===void 0&&Kc.set(t.strings,r=new gn(t)),r}k(t){xi(this._$AH)||(this._$AH=[],this._$AR());let r=this._$AH,n,o=0;for(let s of t)o===r.length?r.push(n=new e(this.O(fn()),this.O(fn()),this,this.options)):n=r[o],n._$AI(s),o++;o<r.length&&(this._$AR(n&&n._$AB.nextSibling,o),r.length=o)}_$AR(t=this._$AA.nextSibling,r){for(this._$AP?.(!1,!0,r);t!==this._$AB;){let n=Uc(t).nextSibling;Uc(t).remove(),t=n}}setConnected(t){this._$AM===void 0&&(this._$Cv=t,this._$AP?.(t))}},sr=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,r,n,o,s){this.type=1,this._$AH=g,this._$AN=void 0,this.element=t,this.name=r,this._$AM=o,this.options=s,n.length>2||n[0]!==""||n[1]!==""?(this._$AH=Array(n.length-1).fill(new String),this.strings=n):this._$AH=g}_$AI(t,r=this,n,o){let s=this.strings,i=!1;if(s===void 0)t=or(this,t,r,0),i=!hn(t)||t!==this._$AH&&t!==ie,i&&(this._$AH=t);else{let l=t,d,u;for(t=s[0],d=0;d<s.length-1;d++)u=or(this,l[n+d],r,d),u===ie&&(u=this._$AH[d]),i||=!hn(u)||u!==this._$AH[d],u===g?t=g:t!==g&&(t+=(u??"")+s[d+1]),this._$AH[d]=u}i&&!o&&this.j(t)}j(t){t===g?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??"")}},Fo=class extends sr{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===g?void 0:t}},Ro=class extends sr{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==g)}},Mo=class extends sr{constructor(t,r,n,o,s){super(t,r,n,o,s),this.type=5}_$AI(t,r=this){if((t=or(this,t,r,0)??g)===ie)return;let n=this._$AH,o=t===g&&n!==g||t.capture!==n.capture||t.once!==n.once||t.passive!==n.passive,s=t!==g&&(n===g||o);o&&this.element.removeEventListener(this.name,this,n),s&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}},Lo=class{constructor(t,r,n){this.element=t,this.type=6,this._$AN=void 0,this._$AM=r,this.options=n}get _$AU(){return this._$AM._$AU}_$AI(t){or(this,t)}},Xc={M:ki,P:_t,A:$i,C:1,L:Jc,R:Bo,D:qc,V:or,I:Cr,H:sr,N:Ro,U:Mo,B:Fo,F:Lo},Jh=vi.litHtmlPolyfillSupport;Jh?.(gn,Cr),(vi.litHtmlVersions??=[]).push("3.3.2");var H=(e,t,r)=>{let n=r?.renderBefore??t,o=n._$litPart$;if(o===void 0){let s=r?.renderBefore??null;n._$litPart$=o=new Cr(t.insertBefore(fn(),s),s,void 0,r??{})}return o._$AI(e),o};var Si=globalThis,N=class extends xt{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){let t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){let r=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=H(r,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return ie}};N._$litElement$=!0,N.finalized=!0,Si.litElementHydrateSupport?.({LitElement:N});var Xh=Si.litElementPolyfillSupport;Xh?.({LitElement:N});(Si.litElementVersions??=[]).push("4.2.2");var Fe={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},ut=e=>(...t)=>({_$litDirective$:e,values:t}),Qe=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,r,n){this._$Ct=t,this._$AM=r,this._$Ci=n}_$AS(t,r){return this.update(t,r)}update(t,r){return this.render(...r)}};var B=ut(class extends Qe{constructor(e){if(super(e),e.type!==Fe.ATTRIBUTE||e.name!=="class"||e.strings?.length>2)throw Error("`classMap()` can only be used in the `class` attribute and must be the only part in the attribute.")}render(e){return" "+Object.keys(e).filter(t=>e[t]).join(" ")+" "}update(e,[t]){if(this.st===void 0){this.st=new Set,e.strings!==void 0&&(this.nt=new Set(e.strings.join(" ").split(/\s/).filter(n=>n!=="")));for(let n in t)t[n]&&!this.nt?.has(n)&&this.st.add(n);return this.render(t)}let r=e.element.classList;for(let n of this.st)n in t||(r.remove(n),this.st.delete(n));for(let n in t){let o=!!t[n];o===this.st.has(n)||this.nt?.has(n)||(o?(r.add(n),this.st.add(n)):(r.remove(n),this.st.delete(n)))}return ie}});var{I:Qh}=Xc,Qc=e=>e;var ed=e=>e.strings===void 0,Zc=()=>document.createComment(""),Er=(e,t,r)=>{let n=e._$AA.parentNode,o=t===void 0?e._$AB:t._$AA;if(r===void 0){let s=n.insertBefore(Zc(),o),i=n.insertBefore(Zc(),o);r=new Qh(s,i,e,e.options)}else{let s=r._$AB.nextSibling,i=r._$AM,l=i!==e;if(l){let d;r._$AQ?.(e),r._$AM=e,r._$AP!==void 0&&(d=e._$AU)!==i._$AU&&r._$AP(d)}if(s!==o||l){let d=r._$AA;for(;d!==s;){let u=Qc(d).nextSibling;Qc(n).insertBefore(d,o),d=u}}}return r},Ft=(e,t,r=e)=>(e._$AI(t,r),e),Zh={},Po=(e,t=Zh)=>e._$AH=t,td=e=>e._$AH,Oo=e=>{e._$AR(),e._$AA.remove()};var rd=(e,t,r)=>{let n=new Map;for(let o=t;o<=r;o++)n.set(e[o],o);return n},J=ut(class extends Qe{constructor(e){if(super(e),e.type!==Fe.CHILD)throw Error("repeat() can only be used in text expressions")}dt(e,t,r){let n;r===void 0?r=t:t!==void 0&&(n=t);let o=[],s=[],i=0;for(let l of e)o[i]=n?n(l,i):i,s[i]=r(l,i),i++;return{values:s,keys:o}}render(e,t,r){return this.dt(e,t,r).values}update(e,[t,r,n]){let o=td(e),{values:s,keys:i}=this.dt(t,r,n);if(!Array.isArray(o))return this.ut=i,s;let l=this.ut??=[],d=[],u,f,p=0,h=o.length-1,b=0,m=s.length-1;for(;p<=h&&b<=m;)if(o[p]===null)p++;else if(o[h]===null)h--;else if(l[p]===i[b])d[b]=Ft(o[p],s[b]),p++,b++;else if(l[h]===i[m])d[m]=Ft(o[h],s[m]),h--,m--;else if(l[p]===i[m])d[m]=Ft(o[p],s[m]),Er(e,d[m+1],o[p]),p++,m--;else if(l[h]===i[b])d[b]=Ft(o[h],s[b]),Er(e,o[p],o[h]),h--,b++;else if(u===void 0&&(u=rd(i,b,m),f=rd(l,p,h)),u.has(l[p]))if(u.has(l[h])){let y=f.get(i[b]),v=y!==void 0?o[y]:null;if(v===null){let w=Er(e,o[p]);Ft(w,s[b]),d[b]=w}else d[b]=Ft(v,s[b]),Er(e,o[p],v),o[y]=null;b++}else Oo(o[h]),h--;else Oo(o[p]),p++;for(;b<=m;){let y=Er(e,d[m+1]);Ft(y,s[b]),d[b++]=y}for(;p<=h;){let y=o[p++];y!==null&&Oo(y)}return this.ut=i,Po(e,d),ie}});var nd="important",eg=" !"+nd,ye=ut(class extends Qe{constructor(e){if(super(e),e.type!==Fe.ATTRIBUTE||e.name!=="style"||e.strings?.length>2)throw Error("The `styleMap` directive must be used in the `style` attribute and must be the only part in the attribute.")}render(e){return Object.keys(e).reduce((t,r)=>{let n=e[r];return n==null?t:t+`${r=r.includes("-")?r:r.replace(/(?:^(webkit|moz|ms|o)|)(?=[A-Z])/g,"-$&").toLowerCase()}:${n};`},"")}update(e,[t]){let{style:r}=e.element;if(this.ft===void 0)return this.ft=new Set(Object.keys(t)),this.render(t);for(let n of this.ft)t[n]==null&&(this.ft.delete(n),n.includes("-")?r.removeProperty(n):r[n]=null);for(let n in t){let o=t[n];if(o!=null){this.ft.add(n);let s=typeof o=="string"&&o.endsWith(eg);n.includes("-")||s?r.setProperty(n,s?o.slice(0,-11):o,s?nd:""):r[n]=o}}return ie}});var Ai=new WeakMap,ad=Symbol("iteration key");function tg(e){Ai.set(e,new Map)}function rg(e,{target:t,key:r,type:n}){n==="iterate"&&(r=ad);let o=Ai.get(t),s=o.get(r);s||(s=new Set,o.set(r,s)),s.has(e)||(s.add(e),e.cleaners.push(s))}function ng({target:e,key:t,type:r}){let n=Ai.get(e),o=new Set;if(r==="clear"?n.forEach((s,i)=>{Ci(o,n,i)}):Ci(o,n,t),r==="add"||r==="delete"||r==="clear"){let s=Array.isArray(e)?"length":ad;Ci(o,n,s)}return o}function Ci(e,t,r){let n=t.get(r);n&&n.forEach(e.add,e)}function ld(e){e.cleaners&&e.cleaners.forEach(og,e),e.cleaners=[]}function og(e){e.delete(this)}var Tr=[],Ei=!1;function sg(e,t,r,n){if(e.unobserved)return Reflect.apply(t,r,n);if(Tr.indexOf(e)===-1){ld(e);try{return Tr.push(e),Reflect.apply(t,r,n)}finally{Tr.pop()}}}function rt(e){let t=Tr[Tr.length-1];t&&(cd(t,e),rg(t,e))}function Rt(e){ng(e).forEach(ig,e)}function ig(e){cd(e,this),typeof e.scheduler=="function"?e.scheduler(e):typeof e.scheduler=="object"?e.scheduler.add(e):e()}function cd(e,t){if(e.debugger&&!Ei)try{Ei=!0,e.debugger(t)}finally{Ei=!1}}function dd(){return Tr.length>0}var od=Symbol("is reaction");function ud(e,t={}){let r=e[od]?e:function n(){return sg(n,e,this,arguments)};return r.scheduler=t.scheduler,r.debugger=t.debugger,r[od]=!0,t.lazy||r(),r}function Ii(e){e.unobserved||(e.unobserved=!0,ld(e)),typeof e.scheduler=="object"&&e.scheduler.delete(e)}var Ce=new WeakMap,Uo=new WeakMap,ag=Object.prototype.hasOwnProperty;function No(e){let t=Uo.get(e);return dd()&&typeof e=="object"&&e!==null?t||zo(e):t||e}function Ti(e,t){let r=e.next;return e.next=()=>{let{done:n,value:o}=r.call(e);return n||(t?o[1]=No(o[1]):o=No(o)),{done:n,value:o}},e}var sd={has(e){let t=Ce.get(this),r=Reflect.getPrototypeOf(this);return rt({target:t,key:e,type:"has"}),r.has.apply(t,arguments)},get(e){let t=Ce.get(this),r=Reflect.getPrototypeOf(this);return rt({target:t,key:e,type:"get"}),No(r.get.apply(t,arguments))},add(e){let t=Ce.get(this),r=Reflect.getPrototypeOf(this),n=r.has.call(t,e),o=r.add.apply(t,arguments);return n||Rt({target:t,key:e,value:e,type:"add"}),o},set(e,t){let r=Ce.get(this),n=Reflect.getPrototypeOf(this),o=n.has.call(r,e),s=n.get.call(r,e),i=n.set.apply(r,arguments);return o?t!==s&&Rt({target:r,key:e,value:t,oldValue:s,type:"set"}):Rt({target:r,key:e,value:t,type:"add"}),i},delete(e){let t=Ce.get(this),r=Reflect.getPrototypeOf(this),n=r.has.call(t,e),o=r.get?r.get.call(t,e):void 0,s=r.delete.apply(t,arguments);return n&&Rt({target:t,key:e,oldValue:o,type:"delete"}),s},clear(){let e=Ce.get(this),t=Reflect.getPrototypeOf(this),r=e.size!==0,n=e instanceof Map?new Map(e):new Set(e),o=t.clear.apply(e,arguments);return r&&Rt({target:e,oldTarget:n,type:"clear"}),o},forEach(e,...t){let r=Ce.get(this),n=Reflect.getPrototypeOf(this);rt({target:r,type:"iterate"});let o=(s,...i)=>e(No(s),...i);return n.forEach.call(r,o,...t)},keys(){let e=Ce.get(this),t=Reflect.getPrototypeOf(this);return rt({target:e,type:"iterate"}),t.keys.apply(e,arguments)},values(){let e=Ce.get(this),t=Reflect.getPrototypeOf(this);rt({target:e,type:"iterate"});let r=t.values.apply(e,arguments);return Ti(r,!1)},entries(){let e=Ce.get(this),t=Reflect.getPrototypeOf(this);rt({target:e,type:"iterate"});let r=t.entries.apply(e,arguments);return Ti(r,!0)},[Symbol.iterator](){let e=Ce.get(this),t=Reflect.getPrototypeOf(this);rt({target:e,type:"iterate"});let r=t[Symbol.iterator].apply(e,arguments);return Ti(r,e instanceof Map)},get size(){let e=Ce.get(this),t=Reflect.getPrototypeOf(this);return rt({target:e,type:"iterate"}),Reflect.get(t,"size",e)}},Do={get(e,t,r){return e=ag.call(sd,t)?sd:e,Reflect.get(e,t,r)}},id=typeof window=="object"?window:Function("return this")(),pd=new Map([[Map,Do],[Set,Do],[WeakMap,Do],[WeakSet,Do],[Object,!1],[Array,!1],[Int8Array,!1],[Uint8Array,!1],[Uint8ClampedArray,!1],[Int16Array,!1],[Uint16Array,!1],[Int32Array,!1],[Uint32Array,!1],[Float32Array,!1],[Float64Array,!1]]);function lg({constructor:e}){return!(typeof e=="function"&&e.name in id&&id[e.name]===e)||pd.has(e)}function cg(e){return pd.get(e.constructor)}var fd=Object.prototype.hasOwnProperty,dg=new Set(Object.getOwnPropertyNames(Symbol).map(e=>Symbol[e]).filter(e=>typeof e=="symbol"));function ug(e,t,r){let n=Reflect.get(e,t,r);if(typeof t=="symbol"&&dg.has(t))return n;rt({target:e,key:t,receiver:r,type:"get"});let o=Uo.get(n);if(dd()&&typeof n=="object"&&n!==null){if(o)return o;let s=Reflect.getOwnPropertyDescriptor(e,t);if(!s||!(s.writable===!1&&s.configurable===!1))return zo(n)}return o||n}function pg(e,t){let r=Reflect.has(e,t);return rt({target:e,key:t,type:"has"}),r}function fg(e){return rt({target:e,type:"iterate"}),Reflect.ownKeys(e)}function hg(e,t,r,n){typeof r=="object"&&r!==null&&(r=Ce.get(r)||r);let o=fd.call(e,t),s=e[t],i=Reflect.set(e,t,r,n);return e!==Ce.get(n)||(o?r!==s&&Rt({target:e,key:t,value:r,oldValue:s,receiver:n,type:"set"}):Rt({target:e,key:t,value:r,receiver:n,type:"add"})),i}function gg(e,t){let r=fd.call(e,t),n=e[t],o=Reflect.deleteProperty(e,t);return r&&Rt({target:e,key:t,oldValue:n,type:"delete"}),o}var mg={get:ug,has:pg,ownKeys:fg,set:hg,deleteProperty:gg};function zo(e={}){return Ce.has(e)||!lg(e)?e:Uo.get(e)||bg(e)}function bg(e){let t=cg(e)||mg,r=new Proxy(e,t);return Uo.set(e,r),Ce.set(r,e),tg(e),r}var hd=zo;function Bi(e){let t=!0,r=ud(()=>{try{e(t)}finally{t=!1}},{lazy:!0});try{r()}catch(n){throw Ii(r),n}return()=>Ii(r)}var Mt=class extends N{_disposers=[];observes=null;connectedCallback(){super.connectedCallback(),this.bindState()}bindState(){if(this.observes){this._disposers.push(Bi(t=>{this.observes(),t||this.requestUpdate()}));return}this._render||(this._render=this.render,this.render=()=>{let t,r=Bi(n=>{if(!n){r(),this._dispose===r&&(this._dispose=null),this.updateComplete.then(()=>this.requestUpdate());return}t=this._render()});return this._dispose=r,t}),this._disposers.push(()=>this._dispose&&this._dispose())}disconnectedCallback(){for(super.disconnectedCallback();this._disposers.length>0;)this._disposers.pop()()}};globalThis[Symbol.for("@rray/frontend")]={LitElement:N,html:c,nothing:g,render:H,unsafeCSS:T,StateElement:Mt,classMap:B,repeat:J,styleMap:ye};var Ee=document.querySelector("#drop-zone"),A=document.querySelector("#report"),gd=document.querySelector("app-sidebar");function Ar(e,t){let r=URL.createObjectURL(e),n=document.createElement("span");n.style.display="none",H(c`<a href="${r}" download="${t}"></a>`,n),document.body.append(n),n.firstElementChild.click(),n.remove(),URL.revokeObjectURL(r)}function pt(e){return new Error("Another dialog is already open. Close it and try again.",{cause:e})}function bd(e){let t=e?.package?.npm?.version;if(typeof t=="string"&&t)return t;let r=e?.file;if(!r)return null;let n=/(?:^|\/)node_modules\/\.pnpm\/([^/]+)\/node_modules\//u.exec(r);if(!n)return null;let o=n[1],s=o.indexOf("_");s>0&&(o=o.slice(0,s));let i=o.lastIndexOf("@");return i<=0?null:o.slice(i+1)||null}function Wo(){return{keys:new Set,findings:[],files:new Map,reports:new Set,_keyReports:new Map}}function Ho(e,t,r,n){e.reports.add(r);let o=e._keyReports.get(t);o||e._keyReports.set(t,o=new Set);let s=!o.has(r);return o.add(r),e.keys.has(t)||(e.keys.add(t),e.findings.push(n),e.files.has(n.file)||e.files.set(n.file,[]),e.files.get(n.file).push(n)),s}function Vo(e,t,r,n){e._keyReports.delete(t),e.keys.delete(t);let o=e.findings.findIndex(l=>n(l)===t);o>=0&&e.findings.splice(o,1);let s=e.files.get(r);if(!s)return;let i=s.findIndex(l=>n(l)===t);i>=0&&s.splice(i,1),s.length===0&&e.files.delete(r)}function jo(e){let t=new Set;for(let r of e._keyReports.values())for(let n of r)t.add(n);e.reports=t}function yd(e,t,r,n,o){let s=e.byVersion.get(t);s||(s=Wo(),e.byVersion.set(t,s)),Ho(s,n,o,r)}function wd(e,t,r,n,o,s){let i=e.byVersion.get(t);if(!i)return;let l=i._keyReports.get(r);if(l&&(l.delete(o),l.size===0&&Vo(i,r,n,s)),i._keyReports.size===0){e.byVersion.delete(t);return}jo(i)}function Fi(e,t){if(e===t)return 0;if(e===null)return 1;if(t===null)return-1;let[r,n=""]=md(e,"-"),[o,s=""]=md(t,"-"),i=r.split("."),l=o.split("."),d=Math.max(i.length,l.length);for(let u=0;u<d;u++){let f=i[u]??"0",p=l[u]??"0",h=/^\d+$/u.test(f),b=/^\d+$/u.test(p);if(h&&b){let m=Number(p)-Number(f);if(m!==0)return m}else{let m=p.localeCompare(f);if(m!==0)return m}}return n===""&&s!==""?-1:n!==""&&s===""?1:s.localeCompare(n)}function md(e,t){let r=e.indexOf(t);return r<0?[e,""]:[e.slice(0,r),e.slice(r+1)]}var yg=new TextEncoder,wg=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0});function q(e){if(typeof e!="string")throw new TypeError(`encodeUtf8 expects a string, got ${typeof e}`);if(!e.isWellFormed())throw new TypeError("encodeUtf8: input contains lone surrogates");return yg.encode(e)}function ce(e){if(!ArrayBuffer.isView(e)&&!(e instanceof ArrayBuffer))throw new TypeError(`decodeUtf8 expects a BufferSource, got ${e===null?"null":typeof e}`);return wg.decode(e)}async function mn(e){let t=new Blob([e]).stream().pipeThrough(new CompressionStream("gzip"));return new Uint8Array(await new Response(t).arrayBuffer())}async function ft(e){let t=new Blob([e]).stream().pipeThrough(new DecompressionStream("gzip"));return new Uint8Array(await new Response(t).arrayBuffer())}async function Ko(e){return await mn(q(e))}async function bn(e){return ce(await ft(e))}async function vd(e){let t=await crypto.subtle.digest("SHA-512",e);return`sha512-${new Uint8Array(t).toBase64()}`}var nt=new Uint8Array([68,86,69,49]),Ir=12,vg=32,kg="deepview-passkey.v1.content-key";function yn(){return!(typeof window>"u"||typeof PublicKeyCredential>"u"||typeof navigator>"u"||!navigator.credentials)}async function kd(){if(typeof PublicKeyCredential>"u")return!1;let e=PublicKeyCredential.getClientCapabilities;if(typeof e!="function")return null;try{let t=await e.call(PublicKeyCredential);if(!t||typeof t!="object")return null;let r=t["extension:prf"],n=t.prf;return r===!0||n===!0?!0:r===!1||n===!1?!1:null}catch{return null}}function qo(e){let t=new Uint8Array(e);return crypto.getRandomValues(t),t}async function Ri(e){if(e.length<32)throw new Error(`PRF output too short (${e.length} bytes; need \u2265 32)`);let t=await crypto.subtle.importKey("raw",e,"HKDF",!1,["deriveBits"]),r=await crypto.subtle.deriveBits({name:"HKDF",hash:"SHA-256",salt:new Uint8Array,info:q(kg)},t,vg*8);return new Uint8Array(r)}function Mi(e){return crypto.subtle.importKey("raw",e,{name:"AES-GCM"},!1,["encrypt","decrypt"])}async function Lt(e,t,r){let n=qo(Ir),o=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:n,additionalData:r},e,t)),s=new Uint8Array(nt.length+Ir+o.length);return s.set(nt,0),s.set(n,nt.length),s.set(o,nt.length+Ir),s}async function ir(e,t,r){if(!Le(t))throw new Error("passkey: missing envelope magic");if(t.length<nt.length+Ir+16)throw new Error("passkey: envelope too short");let n=t.subarray(nt.length,nt.length+Ir),o=t.subarray(nt.length+Ir);return new Uint8Array(await crypto.subtle.decrypt({name:"AES-GCM",iv:n,additionalData:r},e,o))}function Le(e){if(e.length<nt.length)return!1;for(let t=0;t<nt.length;t++)if(e[t]!==nt[t])return!1;return!0}async function $d(e){if(!yn())throw new Error("passkey: not supported in this environment");let t=qo(32),r=qo(32),n=await navigator.credentials.create({publicKey:{challenge:t,rp:{name:e.rpName,id:e.rpId},user:{id:e.userId,name:e.userName,displayName:e.userName},pubKeyCredParams:[{type:"public-key",alg:-7},{type:"public-key",alg:-257}],authenticatorSelection:{residentKey:"required",userVerification:"required"},extensions:{prf:{eval:{first:r}}},timeout:e.timeoutMs??12e4},...e.signal?{signal:e.signal}:{}});if(!(n instanceof PublicKeyCredential))throw new Error("passkey: registration returned no credential");let o=new Uint8Array(n.rawId).toBase64({alphabet:"base64url",omitPadding:!0}),s=n.getClientExtensionResults().prf,i=s?.results?.first?new Uint8Array(s.results.first):null;return{credentialId:o,prfSalt:r.toBase64({alphabet:"base64url",omitPadding:!0}),prfOutput:i}}async function Li(e){if(!yn())throw new Error("passkey: not supported in this environment");let t=qo(32),r=Uint8Array.fromBase64(e.credentialId,{alphabet:"base64url"}),n=Uint8Array.fromBase64(e.prfSalt,{alphabet:"base64url"}),o=await navigator.credentials.get({publicKey:{challenge:t,rpId:e.rpId,allowCredentials:[{type:"public-key",id:r}],userVerification:"required",extensions:{prf:{eval:{first:n}}},timeout:e.timeoutMs??12e4},...e.signal?{signal:e.signal}:{}});if(!(o instanceof PublicKeyCredential))throw new Error("passkey: assertion returned no credential");let i=o.getClientExtensionResults().prf?.results?.first;if(!i)throw new Error("passkey: authenticator did not return PRF output (extension unsupported)");return new Uint8Array(i)}var wn=Object.freeze(["deepview.workspaces","deepview.sync.sessions","deepview.sync.userEnabled","deepview.sync.password","deepview.repoUrls","deepview.fileCounts","deepview.lastFile"]),Pe=new Map,Pi=!1,ar=new Map,Pt=new Map,Oi=new Set;function Br(e){return Oi.add(e),()=>Oi.delete(e)}function $g(){for(let e of Oi)try{e()}catch(t){console.warn("secure-storage after-hydrate listener:",t)}}function Go(e){let t=Cd()??"";return q(`deepview.secure.v1|${t}|${e}`)}function Di(e){try{let t=Uint8Array.fromBase64(e);if(Le(t))return t}catch{}return null}function fe(e){return Pe.get(e)??null}async function we(e,t){if(typeof t!="string")throw new TypeError("secure-storage: value must be a string");if(X()&&!ve())throw new Error(`secure-storage: vault locked, cannot save "${e}"`);if(Sd())throw new Error(`secure-storage: wipe in progress, cannot save "${e}"`);let r=Pe.has(e),n=Pe.get(e);Pe.set(e,t),Pt.set(e,t);let o=ar.get(e)??Promise.resolve(),s=()=>{Pt.get(e)===t&&Pt.delete(e)},i=o.catch(()=>{}).then(()=>xg(e,t)).then(()=>s(),l=>{throw s(),Pe.get(e)===t&&(r?Pe.set(e,n):Pe.delete(e)),l});ar.set(e,i.catch(()=>{})),await i}function Fr(e){Pe.delete(e);try{localStorage.removeItem(e)}catch{}}async function xg(e,t){let r=ve();if(r){let n=await Lt(r,q(t),Go(e));localStorage.setItem(e,n.toBase64())}else localStorage.setItem(e,t)}async function Rr(){Pi||he(()=>{Rr().catch(r=>console.warn("secure-storage rehydrate:",r))}),Pi=!0;for(let r of[...Pe.keys()])Pt.has(r)||Pe.delete(r);let e=ve(),t=[];for(let r of wn){if(Pt.has(r))continue;let n=localStorage.getItem(r);if(n===null)continue;let o=Di(n);if(o){if(!e)continue;try{let s=await ir(e,o,Go(r));Pe.set(r,ce(s))}catch(s){console.warn(`secure-storage: decrypt failed for "${r}":`,s)}}else Pe.set(r,n),e&&X()&&t.push([r,n])}$g(),t.length>0&&queueMicrotask(()=>{for(let[r,n]of t)Pe.get(r)===n&&we(r,n).catch(o=>{console.warn(`secure-storage: self-heal failed for "${r}":`,o)})})}async function xd(e,t){let r=ar.get(e)??Promise.resolve(),n=async()=>{if(Pt.has(e))return;let s=localStorage.getItem(e);if(s===null)return;let i=await t(s);i!==null&&(Pt.has(e)||(localStorage.setItem(e,i.storageValue),Pe.set(e,i.cacheValue)))},o=r.catch(()=>{}).then(n);ar.set(e,o.catch(()=>{})),await o}async function Ni({seal:e}){for(let t of wn)await xd(t,async r=>{if(Di(r))return null;let n=ve();return n?{storageValue:(await Lt(n,q(r),Go(t))).toBase64(),cacheValue:r}:null})}async function Ui({open:e}){for(let t of wn)await xd(t,async r=>{let n=Di(r);if(!n)return null;let o=await e(n,Go(t)),s=ce(o);return{storageValue:s,cacheValue:s}})}var _g="deepview.secure.v1.mutate:";function zi(e,t){return wn.includes(e)?navigator.locks.request(_g+e,async()=>{let r=ar.get(e);r&&await r.catch(()=>{}),await Rr();let n=fe(e),o=await t(n);if(!(o==null||o===n)){if(typeof o!="string")throw new TypeError(`secure-storage: mutate updater for "${e}" must return a string`);await we(e,o)}}):Promise.reject(new Error(`secure-storage: mutate() called with non-secure key "${e}"`))}async function _d(){await Promise.allSettled([...ar.values()]),Pt.clear(),ar.clear()}typeof window<"u"&&window.addEventListener("storage",e=>{!Pi||!e.key||!wn.includes(e.key)||Rr().catch(()=>{})});var $n="deepview.passkey.v1",Mr="deepview.passkey.userId",Jo="deepview.passkey.cleanDisable",ot="deepview.passkey.v1.write",Cg="deepview.triage.v1|",Eg="deepview.opfs.v1|",Tg="deepview.bundle.v1|",Q=null,ht=null,Ot=null,kn=0;function Vi(){return kn>0}var Wi=0;function Sd(){return Wi>0}function lr(){try{let e=localStorage.getItem($n);if(!e)return null;let t=JSON.parse(e);return t&&typeof t=="object"&&t.enabled===!0&&typeof t.credentialId=="string"&&t.credentialId.length>0&&typeof t.prfSalt=="string"&&t.prfSalt.length>0&&typeof t.userId=="string"&&t.userId.length>0?t:null}catch{return null}}function Ed(e){localStorage.setItem($n,JSON.stringify(e))}function Ag(){localStorage.removeItem($n)}function Ig(){try{let t=localStorage.getItem(Mr);if(t){let r=Uint8Array.fromBase64(t,{alphabet:"base64url"});if(r.length===16)return r}}catch{}let e=new Uint8Array(16);crypto.getRandomValues(e);try{localStorage.setItem(Mr,e.toBase64({alphabet:"base64url",omitPadding:!0}))}catch{}return e}function Xo(){return typeof location>"u"?"":location.hostname}function X(){return lr()!==null}function st(){return Q!==null}function gt(){return!(!yn()||typeof navigator>"u"||!navigator.locks?.request||!Xo())}function Cd(){return ht}function xn(){if(lr()!==null)return!1;try{return localStorage.getItem(Jo)==="1"?!1:localStorage.getItem(Mr)!==null}catch{return!1}}function ve(){return Q}function _n(){return q(Cg+(ht??""))}function Qo(e){if(typeof e!="string")throw new TypeError("passkey vault: OPFS AAD requires a filename string");return q(Eg+(ht??"")+"|"+e)}function Zo(e){if(typeof e!="string")throw new TypeError("passkey vault: bundle AAD requires a slot string");return q(Tg+(ht??"")+"|"+e)}var Hi=new Set;function he(e){return Hi.add(e),()=>Hi.delete(e)}function Lr(){for(let e of Hi)try{e()}catch(t){console.warn("passkey vault listener:",t)}}async function Sn({signal:e}={}){let t=lr();if(!t)return!1;let r;try{r=await Li({credentialId:t.credentialId,prfSalt:t.prfSalt,rpId:t.rpId??Xo(),...e?{signal:e}:{}})}catch(o){if(o&&o.name==="NotAllowedError"||o&&o.name==="AbortError")return!1;throw o&&o.message?.includes("PRF")?vn(o):o}if(!r||r.length<32)throw vn();let n=await Ri(r);return r.fill(0),navigator.locks.request(ot,async()=>{let o=lr();if(!o||o.credentialId!==t.credentialId)throw n.fill(0),new Error("passkey: vault state changed during unlock (another tab wiped or re-enabled it). Reload this page and try again.");return Q=await Mi(n),n.fill(0),ht=o.userId,Ot=o.credentialId,Lr(),!0})}function vn(e){let t=new Error("Your browser or authenticator doesn't support passkey-derived encryption keys (the WebAuthn PRF extension). Try Chrome 116+, Safari 18+, or Firefox 130+ on a device with a platform authenticator (TouchID / Windows Hello).");return e&&(t.cause=e),t}function ji({migrate:e,userName:t,rpName:r,signal:n,acknowledgeOrphan:o}){if(!yn())throw new Error("passkey: WebAuthn unavailable in this environment");if(xn()&&!o)throw new Error("passkey: a previous vault exists on this device with no metadata. Any data encrypted under the old passkey will be unreadable after a new setup. Call enableEncryption({acknowledgeOrphan: true}) to proceed, or wipeAllVaultData() to start clean first.");let s=Xo();return navigator.locks.request(ot,async()=>{if(X())throw new Error("passkey: encryption is already enabled");if(await kd()===!1)throw vn();let l=Ig(),d=await $d({userName:t||"DeepView user",userId:l,rpName:r||"DeepView",rpId:s,...n?{signal:n}:{}}),u=d.prfOutput;if(!u)try{u=await Li({credentialId:d.credentialId,prfSalt:d.prfSalt,rpId:s,...n?{signal:n}:{}})}catch(m){let y=l.toBase64({alphabet:"base64url",omitPadding:!0});await Yo({credentialId:d.credentialId,rpId:s,userId:y}).catch(()=>{});try{localStorage.removeItem(Mr)}catch{}throw m&&m.message?.includes("PRF")?vn(m):m}if(!u||u.length<32){let m=l.toBase64({alphabet:"base64url",omitPadding:!0});await Yo({credentialId:d.credentialId,rpId:s,userId:m}).catch(()=>{});try{localStorage.removeItem(Mr)}catch{}throw vn()}let f=await Ri(u);u.fill(0);let p=await Mi(f);f.fill(0);let h=l.toBase64({alphabet:"base64url",omitPadding:!0}),b={enabled:!0,credentialId:d.credentialId,prfSalt:d.prfSalt,userId:h,rpId:s,createdAt:Date.now()};Q=p,ht=h,Ot=d.credentialId,Ed(b),typeof e=="function"&&await e({seal:(y,v)=>Lt(p,y,v)});try{localStorage.removeItem(Jo)}catch{}return Lr(),!0})}async function Ki({migrate:e}){if(!X())return{disabled:!1,signalAttempted:!1};if(!st())throw new Error("passkey: must unlock before disabling encryption");kn+=1;try{return await navigator.locks.request(ot,async()=>{let t=lr();if(!t)return{disabled:!1,signalAttempted:!1};let r=Q;if(!r)return{disabled:!1,signalAttempted:!1};if(Ag(),Q=null,Ot=null,typeof e=="function"){let o=(s,i)=>ir(r,s,i);try{await e({open:o})}catch(s){throw Ed(t),Q=r,Ot=t.credentialId,Lr(),s}}ht=null;try{localStorage.setItem(Jo,"1")}catch{}let n=await Yo(t).catch(()=>!1);return Lr(),{disabled:!0,signalAttempted:n}})}finally{kn-=1}}async function Yo({credentialId:e,rpId:t,userId:r}){if(typeof PublicKeyCredential>"u"||!t)return!1;let n=PublicKeyCredential,o=!1;if(typeof n.signalUnknownCredential=="function"){o=!0;try{await n.signalUnknownCredential({rpId:t,credentialId:e})}catch{}}if(typeof n.signalAllAcceptedCredentials=="function"&&r){o=!0;try{await n.signalAllAcceptedCredentials({rpId:t,userId:r,allAcceptedCredentialIds:[]})}catch{}}return o}async function Bg(e,t){try{return await e.removeEntry(t,{recursive:!0}),null}catch(r){return r?.name==="NotFoundError"?null:`${t}: ${r?.message??String(r)}`}}async function Fg(e){let t=[];if(typeof navigator>"u"||!navigator.storage?.getDirectory)return t;let r;try{r=await navigator.storage.getDirectory()}catch(n){return t.push(`storage root: ${n?.message??String(n)}`),t}for(let n of e){let o=await Bg(r,n);o&&t.push(o)}return t}async function Cn({refuseIfEnabled:e=!1}={}){kn+=1,Wi+=1;try{return await navigator.locks.request(ot,async()=>{if(e&&X())throw new Error("passkey: encryption was just enabled in another tab. Reload this page to unlock instead of wiping.");await _d();let t=lr();if(t)try{await Yo({credentialId:t.credentialId,rpId:t.rpId??Xo(),userId:t.userId})}catch{}try{localStorage.removeItem($n)}catch{}try{localStorage.removeItem(Mr)}catch{}try{localStorage.removeItem(Jo)}catch{}for(let n of["deepview.workspaces","deepview.sync.sessions","deepview.sync.userEnabled","deepview.repoUrls","deepview.fileCounts","deepview.lastFile","deepview.triage","deepview.triage.pending","deepview.passkey.firstImportPrompted","deepview.viewMode"])try{localStorage.removeItem(n)}catch{}try{let n=[];for(let o=0;o<localStorage.length;o+=1){let s=localStorage.key(o);s&&s.startsWith("deepview.report:")&&n.push(s)}for(let o of n)try{localStorage.removeItem(o)}catch{}}catch{}Q=null,ht=null,Ot=null,Lr();let r=await Fg(["deepview-reports","deepview-bundles"]);if(r.length>0)throw new Error(`passkey: wipe partially succeeded \u2014 localStorage cleared but the following OPFS paths could not be removed: ${r.join("; ")}. Open DevTools \u2192 Application \u2192 Storage \u2192 Origin Private File System to inspect, or use the browser's site-data clear tool to finish.`)})}finally{kn-=1,Wi-=1}}function Td(e){return Q?Lt(Q,e,_n()):Promise.reject(new Error("passkey: vault locked, cannot seal triage"))}function Ad(e){return Q?ir(Q,e,_n()):Promise.reject(new Error("passkey: vault locked, cannot open triage"))}function es(e,t){return Q?Lt(Q,e,Qo(t)):Promise.reject(new Error("passkey: vault locked, cannot seal OPFS file"))}function Id(e,t){return Q?ir(Q,e,Qo(t)):Promise.reject(new Error("passkey: vault locked, cannot open OPFS file"))}function qi(e,t){return Q?Lt(Q,e,Zo(t)):Promise.reject(new Error("passkey: vault locked, cannot seal bundle"))}function Gi(e,t){return Q?ir(Q,e,Zo(t)):Promise.reject(new Error("passkey: vault locked, cannot open bundle"))}typeof window<"u"&&window.addEventListener("storage",e=>{if(e.key!==$n)return;let t=lr();(!t&&Q||t&&Q&&t.credentialId!==Ot)&&(Q=null,ht=null,Ot=null),Lr()});var Qi="__meta__",Rg="deepview-reports",Zi="deepview-bundles",St="deepview.report:",Bd=!1;async function ea(e,{create:t,warnOnce:r=!1}={}){try{return await(await navigator.storage.getDirectory()).getDirectoryHandle(e,{create:t})}catch(n){return r&&!Bd&&(Bd=!0,console.warn("OPFS unavailable, falling back to gzipped localStorage (limited quota).",n)),null}}async function ts(e,t){let r=await e.createWritable();try{await r.write(t),await r.close()}catch(n){try{await r.abort(n)}catch{}throw n}}async function Yi(e,t){if(!Le(e))return e;if(!ve())throw new Error(`storage: vault locked, cannot decrypt "${t}"`);return await Id(e,t)}async function En(e,t,r,n,o=()=>{}){if(X()&&!ve())throw o(),new Error(`storage: vault locked, cannot save ${n}`);let s=ve(),i=s?await t(e,r):e;if(ve()!==s)throw o(),new Error(`storage: vault state changed mid-save for ${n}; retry`);return i}function cr(){return ea(Rg,{create:!0,warnOnce:!0})}var it=new Map,Dt=new Map,Ji=new Map;function re(e){Ji.set(e,(Ji.get(e)??0)+1)}function Fd(e){return Ji.get(e)??0}var Xi=new Set;function Rd(e){return Xi.add(e),()=>Xi.delete(e)}function Pr(e,t){for(let r of Xi)try{r(e,t)}catch(n){console.warn("storage file-change listener:",n)}}async function ae(){let e=await cr();if(e){let r=[];for await(let[n]of e.entries())r.push(n);return r.toSorted()}let t=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);n&&n.startsWith(St)&&t.push(n.slice(St.length))}return t.toSorted()}async function at(e,t){if(typeof e!="string"||e.includes("\0"))throw new Error("Invalid report name: contains NUL byte or is not a string");return re(e),navigator.locks.request(ot,{mode:"shared"},async()=>{let r=await cr();if(r){let s=await mn(q(t));s=await En(s,es,e,`"${e}"`,()=>re(e));let l=await(await r.getFileHandle(e,{create:!0})).createWritable();try{await l.write(s),await l.close()}catch(d){it.delete(e),re(e);try{await l.abort(d)}catch{}throw d}it.set(e,t),re(e),Pr(e,"save");return}let n=q(t);n=await mn(n),n=await En(n,es,e,`"${e}"`,()=>re(e));let o=n.toBase64();try{localStorage.setItem(St+e,o),it.set(e,t),re(e),Pr(e,"save")}catch(s){throw re(e),new Error(`localStorage write failed for ${e}: ${s.message}`,{cause:s})}})}async function Re(e){if(it.has(e))return it.get(e);if(Dt.has(e))return Dt.get(e);let t=Fd(e),r=(async()=>{let n=await cr();if(n){let d=await(await n.getFileHandle(e)).getFile(),u=new Uint8Array(await d.arrayBuffer());if(u=await Yi(u,e),u.length>=2&&u[0]===31&&u[1]===139){let p=await ft(u);return ce(p)}let f=ce(u);return at(e,f).catch(p=>{console.warn(`storage: legacy-uncompressed migration of "${e}" failed:`,p)}),f}let o=localStorage.getItem(St+e);if(o===null)throw new Error(`File not found: ${e}`);let s=Uint8Array.fromBase64(o);s=await Yi(s,e);let i=await ft(s);return ce(i)})();Dt.set(e,r);try{let n=await r;return Fd(e)===t&&it.set(e,n),n}finally{Dt.delete(e)}}async function An(e){let t=await cr(),r;if(t){let o=await(await t.getFileHandle(e)).getFile();r=new Uint8Array(await o.arrayBuffer())}else{let n=localStorage.getItem(St+e);if(n===null)throw new Error(`File not found: ${e}`);r=Uint8Array.fromBase64(n)}return r=await Yi(r,e),r}async function In(e,t){if(typeof e!="string"||e.includes("\0"))throw new Error("Invalid report name: contains NUL byte or is not a string");return re(e),it.delete(e),navigator.locks.request(ot,{mode:"shared"},async()=>{let r=await En(t,es,e,`"${e}"`,()=>re(e)),n=await cr();if(n){let s=await(await n.getFileHandle(e,{create:!0})).createWritable();try{await s.write(r),await s.close()}catch(i){re(e);try{await s.abort(i)}catch{}throw i}re(e),Pr(e,"save");return}try{localStorage.setItem(St+e,r.toBase64()),re(e),Pr(e,"save")}catch(o){throw re(e),new Error(`localStorage write failed for ${e}: ${o.message}`,{cause:o})}})}async function Or(e){re(e),it.delete(e),Dt.delete(e);let t=await cr();if(t){try{await t.removeEntry(e)}catch(r){if(!(r instanceof DOMException)||r.name!=="NotFoundError")throw re(e),r}re(e),Pr(e,"delete");return}localStorage.removeItem(St+e),re(e),Pr(e,"delete")}var Tn="_meta.json";function Bn(){return ea(Zi,{create:!0})}function ta(e){return e.replaceAll("/","_")}async function ra(e){let t;try{let o=await(await e.getFileHandle(Tn)).getFile();t=new Uint8Array(await o.arrayBuffer())}catch(n){return n instanceof DOMException&&n.name==="NotFoundError"?[]:(console.warn("readBundleMeta: failed to read _meta.json:",n),[])}let r=t;if(Le(t)){if(!ve())return console.warn("readBundleMeta: vault locked, returning empty bundle list"),[];try{r=await Gi(t,Qi)}catch(o){return console.warn("readBundleMeta: decrypt failed (tampering, key mismatch, or vault identity drift):",o),[]}}try{let n=JSON.parse(ce(r));return Array.isArray(n)?n:[]}catch(n){return console.warn("readBundleMeta: JSON.parse failed:",n),[]}}async function Md(e,t){let r=q(JSON.stringify(t));r=await En(r,qi,Qi,"bundle metadata");try{await e.removeEntry(Tn)}catch{}let n=await e.getFileHandle(Tn,{create:!0});await ts(n,r)}var Mg=`${Zi}/${Tn}`;function Ld(e){return navigator.locks.request(Mg,e)}async function lt(){let e=await Bn();return e?[...await ra(e)].toSorted((r,n)=>r.name.localeCompare(n.name)):[]}async function na(){if(typeof navigator>"u"||!navigator.storage?.getDirectory)return!1;let e=await ea(Zi,{create:!1});if(!e)return!1;try{for await(let t of e.entries())return!0}catch{}return!1}async function dr(e,t){let r=await Bn();if(!r)throw new Error(`Cannot save bundle ${e}: OPFS unavailable`);let n=t instanceof Uint8Array?t:new TextEncoder().encode(t),o=await vd(n),s=ta(o),i=e.toLowerCase().endsWith(".map")?await mn(n):n;return navigator.locks.request(ot,{mode:"shared"},async()=>{i=await En(i,qi,o,`bundle "${e}"`);try{await r.removeEntry(s)}catch{}let l=await r.getFileHandle(s,{create:!0});await ts(l,i);try{await Ld(async()=>{let d=await ra(r),u=d.findIndex(f=>f.integrity===o);u>=0?d[u]={integrity:o,name:e}:d.push({integrity:o,name:e}),await Md(r,d)})}catch(d){try{await r.removeEntry(s)}catch{}throw d}return{integrity:o,name:e}})}async function oa(e){let t=await Bn();if(t)return navigator.locks.request(ot,{mode:"shared"},async()=>{try{await t.removeEntry(ta(e))}catch{}await Ld(async()=>{let r=await ra(t),n=r.filter(o=>o.integrity!==e);n.length!==r.length&&await Md(t,n)})})}async function ur(e){let t=await Bn();if(!t)throw new Error("OPFS unavailable");let n=await(await t.getFileHandle(ta(e))).getFile(),o=new Uint8Array(await n.arrayBuffer());if(Le(o)){if(!ve())throw new Error(`storage: vault locked, cannot read bundle "${e}"`);o=await Gi(o,e)}return o.length>=2&&o[0]===31&&o[1]===139?await ft(o):o}async function Lg(e,t){let r=await cr();if(r){let l=await(await r.getFileHandle(e)).getFile(),d=new Uint8Array(await l.arrayBuffer()),u=await t(d);if(u===null)return;it.delete(e),Dt.delete(e),re(e);let f=await r.getFileHandle(e,{create:!0});await ts(f,u),re(e);return}let n=localStorage.getItem(St+e);if(n===null)return;let o=Uint8Array.fromBase64(n),s=await t(o);s!==null&&(it.delete(e),Dt.delete(e),re(e),localStorage.setItem(St+e,s.toBase64()),re(e))}function Pd(e,t){return e.seal?r=>Le(r)?null:e.seal(r,t):r=>Le(r)?e.open(r,t):null}async function Od(e){let t=await ae();for(let r of t)try{await Lg(r,Pd(e,Qo(r)))}catch(n){if(n instanceof DOMException&&n.name==="NotFoundError")continue;throw n}}var sa=({seal:e})=>Od({seal:e}),ia=({open:e})=>Od({open:e});async function Pg(){let e=await Bn();if(!e)return{dir:null,keys:[]};let t=[];for await(let[r]of e.entries())t.push(r);return{dir:e,keys:t}}function Og(e){return e===Tn?Qi:e.startsWith("sha512-")?e.replaceAll("_","/"):null}async function Dg(e,t,r){let o=await(await e.getFileHandle(t)).getFile(),s=new Uint8Array(await o.arrayBuffer()),i=await r(s);if(i===null)return;let l=await e.getFileHandle(t,{create:!0});await ts(l,i)}async function Dd(e){let{dir:t,keys:r}=await Pg();if(t)for(let n of r){let o=Og(n);if(o!==null)try{await Dg(t,n,Pd(e,Zo(o)))}catch(s){if(s instanceof DOMException&&s.name==="NotFoundError")continue;throw s}}}var aa=({seal:e})=>Dd({seal:e}),la=({open:e})=>Dd({open:e});he(()=>{it.clear(),Dt.clear()});var ns="deepview.viewMode",rs="deepview.repoUrls",Ng=new Set(["grouped","list","table","kanban","focus"]);function Ug(){try{let e=localStorage.getItem(ns);return e!==null&&Ng.has(e)?e:null}catch{return null}}function ca(e){try{let t=JSON.parse(e||"{}");return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}}function os(){return ca(fe(rs))}function We(e){return e?os()[e]??"":""}function He(e,t){if(!e)return;let r=os();t?r[e]=t:delete r[e],we(rs,JSON.stringify(r)).catch(n=>console.warn("saveRepoUrlFor:",n)),zi(rs,n=>{let o=ca(n);return t?o[e]=t:delete o[e],JSON.stringify(o)}).catch(n=>console.warn("saveRepoUrlFor cross-tab merge:",n))}async function Nd(e,t){await zi(rs,r=>{let n=ca(r),o=t==="replace"?{...e}:t==="prefer-imported"?{...n,...e}:{...e,...n};return JSON.stringify(o)}),Ud()}var a=hd({reports:[],currentFile:null,currentWorkspace:null,currentView:"findings",bundles:[],selectedBundle:null,bundleDetails:null,bundleDetailsTab:"overview",selectedPackage:null,selectedPackageVersion:null,packageDetailsTab:"overview",packageSlideTriage:null,packageSlideTransient:!1,packagesSearchQuery:"",packagesSortBy:"findings-desc",expandedPackages:new Set,selectedRepository:null,repositoryDetailsTab:"overview",repositorySlideTriage:null,repositorySlideTransient:!1,repositoriesSearchQuery:"",repositoriesSortBy:"findings-desc",bundleSourceFile:null,bundleSourceFindingIdx:null,bundleCodeSearchMode:"files",bundleCodeSearchQuery:"",filterSeverities:new Set,filterColors:new Set,filterSources:new Set,filterAnalyzer:"",filterConfMin:0,filterConfMax:10,filterInclude:"",repoUrl:"",repoEditing:!1,sortBy:"severity",viewMode:Ug()??"table",triage:new Map,shownTriage:null,nextFindingId:0,activeTabByGroup:new Map,tableSelectedGid:null,filesViewMode:"table",filesSearch:"",filesSelectedFile:null,kanbanPopoverGid:null,focusGid:null,focusCodeTick:0});function Ud(){a.repoEditing||a.currentFile&&(a.repoUrl=We(a.currentFile))}Br(()=>{Ud()});var zg=/^## ([A-Z][A-Z_]*)\s*\(\d+\)\s*$/mu;function Wg(e){switch(e.toUpperCase()){case"CRITICAL":return"critical";case"HIGH":return"high";case"MEDIUM":return"medium";case"LOW":return"low";case"HIGH_BUG":return"high_bug";case"BUG":return"bug";case"INFO":case"INFORMATIONAL":return"informational";default:return"medium"}}function Hg(e){if(e)switch(e.toLowerCase()){case"high":return 8;case"medium":return 5;case"low":return 2;default:return}}function Vg(e){return typeof e=="string"?e.replace(/^`(.*)`$/u,"$1"):e}function Dr(e){let t=e.replaceAll(/\r\n?/gu,`
4
- `).trim();if(!zg.test(t))return null;let r=t.split(/^## ([A-Z][A-Z_]*)\s*\(\d+\)\s*\n/mu),n=[];for(let o=1;o<r.length;o+=2){let s=Wg(r[o]),l=(r[o+1]||"").split(/^### /mu).slice(1);for(let d of l){let u=jg(d,s);u&&n.push(u)}}return n.length===0?null:{type:"security",source:"deepsec",findings:n}}function jg(e,t){let r=e.indexOf(`
1
+ var To=globalThis,Ro=To.ShadowRoot&&(To.ShadyCSS===void 0||To.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,sd=Symbol(),od=new WeakMap,Io=class{constructor(t,r,n){if(this._$cssResult$=!0,n!==sd)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=r}get styleSheet(){let t=this.o,r=this.t;if(Ro&&t===void 0){let n=r!==void 0&&r.length===1;n&&(t=od.get(r)),t===void 0&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),n&&od.set(r,t))}return t}toString(){return this.cssText}},T=e=>new Io(typeof e=="string"?e:e+"",void 0,sd);var id=(e,t)=>{if(Ro)e.adoptedStyleSheets=t.map(r=>r instanceof CSSStyleSheet?r:r.styleSheet);else for(let r of t){let n=document.createElement("style"),o=To.litNonce;o!==void 0&&n.setAttribute("nonce",o),n.textContent=r.cssText,e.appendChild(n)}},wi=Ro?e=>e:e=>e instanceof CSSStyleSheet?(t=>{let r="";for(let n of t.cssRules)r+=n.cssText;return T(r)})(e):e;var{is:bg,defineProperty:yg,getOwnPropertyDescriptor:wg,getOwnPropertyNames:vg,getOwnPropertySymbols:kg,getPrototypeOf:$g}=Object,Bo=globalThis,ad=Bo.trustedTypes,xg=ad?ad.emptyScript:"",_g=Bo.reactiveElementPolyfillSupport,un=(e,t)=>e,vi={toAttribute(e,t){switch(t){case Boolean:e=e?xg:null;break;case Object:case Array:e=e==null?e:JSON.stringify(e)}return e},fromAttribute(e,t){let r=e;switch(t){case Boolean:r=e!==null;break;case Number:r=e===null?null:Number(e);break;case Object:case Array:try{r=JSON.parse(e)}catch{r=null}}return r}},cd=(e,t)=>!bg(e,t),ld={attribute:!0,type:String,converter:vi,reflect:!1,useDefault:!1,hasChanged:cd};Symbol.metadata??=Symbol("metadata"),Bo.litPropertyMetadata??=new WeakMap;var St=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,r=ld){if(r.state&&(r.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((r=Object.create(r)).wrapped=!0),this.elementProperties.set(t,r),!r.noAccessor){let n=Symbol(),o=this.getPropertyDescriptor(t,n,r);o!==void 0&&yg(this.prototype,t,o)}}static getPropertyDescriptor(t,r,n){let{get:o,set:s}=wg(this.prototype,t)??{get(){return this[r]},set(i){this[r]=i}};return{get:o,set(i){let l=o?.call(this);s?.call(this,i),this.requestUpdate(t,l,n)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??ld}static _$Ei(){if(this.hasOwnProperty(un("elementProperties")))return;let t=$g(this);t.finalize(),t.l!==void 0&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(un("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(un("properties"))){let r=this.properties,n=[...vg(r),...kg(r)];for(let o of n)this.createProperty(o,r[o])}let t=this[Symbol.metadata];if(t!==null){let r=litPropertyMetadata.get(t);if(r!==void 0)for(let[n,o]of r)this.elementProperties.set(n,o)}this._$Eh=new Map;for(let[r,n]of this.elementProperties){let o=this._$Eu(r,n);o!==void 0&&this._$Eh.set(o,r)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){let r=[];if(Array.isArray(t)){let n=new Set(t.flat(1/0).reverse());for(let o of n)r.unshift(wi(o))}else t!==void 0&&r.push(wi(t));return r}static _$Eu(t,r){let n=r.attribute;return n===!1?void 0:typeof n=="string"?n:typeof t=="string"?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),this.renderRoot!==void 0&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){let t=new Map,r=this.constructor.elementProperties;for(let n of r.keys())this.hasOwnProperty(n)&&(t.set(n,this[n]),delete this[n]);t.size>0&&(this._$Ep=t)}createRenderRoot(){let t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return id(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,r,n){this._$AK(t,n)}_$ET(t,r){let n=this.constructor.elementProperties.get(t),o=this.constructor._$Eu(t,n);if(o!==void 0&&n.reflect===!0){let s=(n.converter?.toAttribute!==void 0?n.converter:vi).toAttribute(r,n.type);this._$Em=t,s==null?this.removeAttribute(o):this.setAttribute(o,s),this._$Em=null}}_$AK(t,r){let n=this.constructor,o=n._$Eh.get(t);if(o!==void 0&&this._$Em!==o){let s=n.getPropertyOptions(o),i=typeof s.converter=="function"?{fromAttribute:s.converter}:s.converter?.fromAttribute!==void 0?s.converter:vi;this._$Em=o;let l=i.fromAttribute(r,s.type);this[o]=l??this._$Ej?.get(o)??l,this._$Em=null}}requestUpdate(t,r,n,o=!1,s){if(t!==void 0){let i=this.constructor;if(o===!1&&(s=this[t]),n??=i.getPropertyOptions(t),!((n.hasChanged??cd)(s,r)||n.useDefault&&n.reflect&&s===this._$Ej?.get(t)&&!this.hasAttribute(i._$Eu(t,n))))return;this.C(t,r,n)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(t,r,{useDefault:n,reflect:o,wrapped:s},i){n&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,i??r??this[t]),s!==!0||i!==void 0)||(this._$AL.has(t)||(this.hasUpdated||n||(r=void 0),this._$AL.set(t,r)),o===!0&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(r){Promise.reject(r)}let t=this.scheduleUpdate();return t!=null&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(let[o,s]of this._$Ep)this[o]=s;this._$Ep=void 0}let n=this.constructor.elementProperties;if(n.size>0)for(let[o,s]of n){let{wrapped:i}=s,l=this[o];i!==!0||this._$AL.has(o)||l===void 0||this.C(o,void 0,s,l)}}let t=!1,r=this._$AL;try{t=this.shouldUpdate(r),t?(this.willUpdate(r),this._$EO?.forEach(n=>n.hostUpdate?.()),this.update(r)):this._$EM()}catch(n){throw t=!1,this._$EM(),n}t&&this._$AE(r)}willUpdate(t){}_$AE(t){this._$EO?.forEach(r=>r.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(r=>this._$ET(r,this[r])),this._$EM()}updated(t){}firstUpdated(t){}};St.elementStyles=[],St.shadowRootOptions={mode:"open"},St[un("elementProperties")]=new Map,St[un("finalized")]=new Map,_g?.({ReactiveElement:St}),(Bo.reactiveElementVersions??=[]).push("2.1.2");var $i=globalThis,dd=e=>e,Fo=$i.trustedTypes,ud=Fo?Fo.createPolicy("lit-html",{createHTML:e=>e}):void 0,xi="$lit$",Ct=`lit$${Math.random().toFixed(9).slice(2)}$`,_i="?"+Ct,Sg=`<${_i}>`,or=document,fn=()=>or.createComment(""),hn=e=>e===null||typeof e!="object"&&typeof e!="function",Si=Array.isArray,bd=e=>Si(e)||typeof e?.[Symbol.iterator]=="function",ki=`[
2
+ \f\r]`,pn=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,pd=/-->/g,fd=/>/g,rr=RegExp(`>|${ki}(?:([^\\s"'>=/]+)(${ki}*=${ki}*(?:[^
3
+ \f\r"'\`<>=]|("|')|))|$)`,"g"),hd=/'/g,gd=/"/g,yd=/^(?:script|style|textarea|title)$/i,Ci=e=>(t,...r)=>({_$litType$:e,strings:t,values:r}),c=Ci(1),R0=Ci(2),B0=Ci(3),ae=Symbol.for("lit-noChange"),g=Symbol.for("lit-nothing"),md=new WeakMap,nr=or.createTreeWalker(or,129);function wd(e,t){if(!Si(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return ud!==void 0?ud.createHTML(t):t}var vd=(e,t)=>{let r=e.length-1,n=[],o,s=t===2?"<svg>":t===3?"<math>":"",i=pn;for(let l=0;l<r;l++){let d=e[l],u,p,f=-1,h=0;for(;h<d.length&&(i.lastIndex=h,p=i.exec(d),p!==null);)h=i.lastIndex,i===pn?p[1]==="!--"?i=pd:p[1]!==void 0?i=fd:p[2]!==void 0?(yd.test(p[2])&&(o=RegExp("</"+p[2],"g")),i=rr):p[3]!==void 0&&(i=rr):i===rr?p[0]===">"?(i=o??pn,f=-1):p[1]===void 0?f=-2:(f=i.lastIndex-p[2].length,u=p[1],i=p[3]===void 0?rr:p[3]==='"'?gd:hd):i===gd||i===hd?i=rr:i===pd||i===fd?i=pn:(i=rr,o=void 0);let b=i===rr&&e[l+1].startsWith("/>")?" ":"";s+=i===pn?d+Sg:f>=0?(n.push(u),d.slice(0,f)+xi+d.slice(f)+Ct+b):d+Ct+(f===-2?l:b)}return[wd(e,s+(e[r]||"<?>")+(t===2?"</svg>":t===3?"</math>":"")),n]},gn=class e{constructor({strings:t,_$litType$:r},n){let o;this.parts=[];let s=0,i=0,l=t.length-1,d=this.parts,[u,p]=vd(t,r);if(this.el=e.createElement(u,n),nr.currentNode=this.el.content,r===2||r===3){let f=this.el.content.firstChild;f.replaceWith(...f.childNodes)}for(;(o=nr.nextNode())!==null&&d.length<l;){if(o.nodeType===1){if(o.hasAttributes())for(let f of o.getAttributeNames())if(f.endsWith(xi)){let h=p[i++],b=o.getAttribute(f).split(Ct),m=/([.?@])?(.*)/.exec(h);d.push({type:1,index:s,name:m[2],strings:b,ctor:m[1]==="."?Lo:m[1]==="?"?Po:m[1]==="@"?Oo:ir}),o.removeAttribute(f)}else f.startsWith(Ct)&&(d.push({type:6,index:s}),o.removeAttribute(f));if(yd.test(o.tagName)){let f=o.textContent.split(Ct),h=f.length-1;if(h>0){o.textContent=Fo?Fo.emptyScript:"";for(let b=0;b<h;b++)o.append(f[b],fn()),nr.nextNode(),d.push({type:2,index:++s});o.append(f[h],fn())}}}else if(o.nodeType===8)if(o.data===_i)d.push({type:2,index:s});else{let f=-1;for(;(f=o.data.indexOf(Ct,f+1))!==-1;)d.push({type:7,index:s}),f+=Ct.length-1}s++}}static createElement(t,r){let n=or.createElement("template");return n.innerHTML=t,n}};function sr(e,t,r=e,n){if(t===ae)return t;let o=n!==void 0?r._$Co?.[n]:r._$Cl,s=hn(t)?void 0:t._$litDirective$;return o?.constructor!==s&&(o?._$AO?.(!1),s===void 0?o=void 0:(o=new s(e),o._$AT(e,r,n)),n!==void 0?(r._$Co??=[])[n]=o:r._$Cl=o),o!==void 0&&(t=sr(e,o._$AS(e,t.values),o,n)),t}var Mo=class{constructor(t,r){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=r}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){let{el:{content:r},parts:n}=this._$AD,o=(t?.creationScope??or).importNode(r,!0);nr.currentNode=o;let s=nr.nextNode(),i=0,l=0,d=n[0];for(;d!==void 0;){if(i===d.index){let u;d.type===2?u=new Ar(s,s.nextSibling,this,t):d.type===1?u=new d.ctor(s,d.name,d.strings,this,t):d.type===6&&(u=new No(s,this,t)),this._$AV.push(u),d=n[++l]}i!==d?.index&&(s=nr.nextNode(),i++)}return nr.currentNode=or,o}p(t){let r=0;for(let n of this._$AV)n!==void 0&&(n.strings!==void 0?(n._$AI(t,n,r),r+=n.strings.length-2):n._$AI(t[r])),r++}},Ar=class e{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,r,n,o){this.type=2,this._$AH=g,this._$AN=void 0,this._$AA=t,this._$AB=r,this._$AM=n,this.options=o,this._$Cv=o?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode,r=this._$AM;return r!==void 0&&t?.nodeType===11&&(t=r.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,r=this){t=sr(this,t,r),hn(t)?t===g||t==null||t===""?(this._$AH!==g&&this._$AR(),this._$AH=g):t!==this._$AH&&t!==ae&&this._(t):t._$litType$!==void 0?this.$(t):t.nodeType!==void 0?this.T(t):bd(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==g&&hn(this._$AH)?this._$AA.nextSibling.data=t:this.T(or.createTextNode(t)),this._$AH=t}$(t){let{values:r,_$litType$:n}=t,o=typeof n=="number"?this._$AC(t):(n.el===void 0&&(n.el=gn.createElement(wd(n.h,n.h[0]),this.options)),n);if(this._$AH?._$AD===o)this._$AH.p(r);else{let s=new Mo(o,this),i=s.u(this.options);s.p(r),this.T(i),this._$AH=s}}_$AC(t){let r=md.get(t.strings);return r===void 0&&md.set(t.strings,r=new gn(t)),r}k(t){Si(this._$AH)||(this._$AH=[],this._$AR());let r=this._$AH,n,o=0;for(let s of t)o===r.length?r.push(n=new e(this.O(fn()),this.O(fn()),this,this.options)):n=r[o],n._$AI(s),o++;o<r.length&&(this._$AR(n&&n._$AB.nextSibling,o),r.length=o)}_$AR(t=this._$AA.nextSibling,r){for(this._$AP?.(!1,!0,r);t!==this._$AB;){let n=dd(t).nextSibling;dd(t).remove(),t=n}}setConnected(t){this._$AM===void 0&&(this._$Cv=t,this._$AP?.(t))}},ir=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,r,n,o,s){this.type=1,this._$AH=g,this._$AN=void 0,this.element=t,this.name=r,this._$AM=o,this.options=s,n.length>2||n[0]!==""||n[1]!==""?(this._$AH=Array(n.length-1).fill(new String),this.strings=n):this._$AH=g}_$AI(t,r=this,n,o){let s=this.strings,i=!1;if(s===void 0)t=sr(this,t,r,0),i=!hn(t)||t!==this._$AH&&t!==ae,i&&(this._$AH=t);else{let l=t,d,u;for(t=s[0],d=0;d<s.length-1;d++)u=sr(this,l[n+d],r,d),u===ae&&(u=this._$AH[d]),i||=!hn(u)||u!==this._$AH[d],u===g?t=g:t!==g&&(t+=(u??"")+s[d+1]),this._$AH[d]=u}i&&!o&&this.j(t)}j(t){t===g?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??"")}},Lo=class extends ir{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===g?void 0:t}},Po=class extends ir{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==g)}},Oo=class extends ir{constructor(t,r,n,o,s){super(t,r,n,o,s),this.type=5}_$AI(t,r=this){if((t=sr(this,t,r,0)??g)===ae)return;let n=this._$AH,o=t===g&&n!==g||t.capture!==n.capture||t.once!==n.once||t.passive!==n.passive,s=t!==g&&(n===g||o);o&&this.element.removeEventListener(this.name,this,n),s&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}},No=class{constructor(t,r,n){this.element=t,this.type=6,this._$AN=void 0,this._$AM=r,this.options=n}get _$AU(){return this._$AM._$AU}_$AI(t){sr(this,t)}},kd={M:xi,P:Ct,A:_i,C:1,L:vd,R:Mo,D:bd,V:sr,I:Ar,H:ir,N:Po,U:Oo,B:Lo,F:No},Cg=$i.litHtmlPolyfillSupport;Cg?.(gn,Ar),($i.litHtmlVersions??=[]).push("3.3.2");var W=(e,t,r)=>{let n=r?.renderBefore??t,o=n._$litPart$;if(o===void 0){let s=r?.renderBefore??null;n._$litPart$=o=new Ar(t.insertBefore(fn(),s),s,void 0,r??{})}return o._$AI(e),o};var Ei=globalThis,H=class extends St{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){let t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){let r=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=W(r,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return ae}};H._$litElement$=!0,H.finalized=!0,Ei.litElementHydrateSupport?.({LitElement:H});var Eg=Ei.litElementPolyfillSupport;Eg?.({LitElement:H});(Ei.litElementVersions??=[]).push("4.2.2");var Be={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},pt=e=>(...t)=>({_$litDirective$:e,values:t}),Je=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,r,n){this._$Ct=t,this._$AM=r,this._$Ci=n}_$AS(t,r){return this.update(t,r)}update(t,r){return this.render(...r)}};var F=pt(class extends Je{constructor(e){if(super(e),e.type!==Be.ATTRIBUTE||e.name!=="class"||e.strings?.length>2)throw Error("`classMap()` can only be used in the `class` attribute and must be the only part in the attribute.")}render(e){return" "+Object.keys(e).filter(t=>e[t]).join(" ")+" "}update(e,[t]){if(this.st===void 0){this.st=new Set,e.strings!==void 0&&(this.nt=new Set(e.strings.join(" ").split(/\s/).filter(n=>n!=="")));for(let n in t)t[n]&&!this.nt?.has(n)&&this.st.add(n);return this.render(t)}let r=e.element.classList;for(let n of this.st)n in t||(r.remove(n),this.st.delete(n));for(let n in t){let o=!!t[n];o===this.st.has(n)||this.nt?.has(n)||(o?(r.add(n),this.st.add(n)):(r.remove(n),this.st.delete(n)))}return ae}});var{I:Ag}=kd,$d=e=>e;var _d=e=>e.strings===void 0,xd=()=>document.createComment(""),Tr=(e,t,r)=>{let n=e._$AA.parentNode,o=t===void 0?e._$AB:t._$AA;if(r===void 0){let s=n.insertBefore(xd(),o),i=n.insertBefore(xd(),o);r=new Ag(s,i,e,e.options)}else{let s=r._$AB.nextSibling,i=r._$AM,l=i!==e;if(l){let d;r._$AQ?.(e),r._$AM=e,r._$AP!==void 0&&(d=e._$AU)!==i._$AU&&r._$AP(d)}if(s!==o||l){let d=r._$AA;for(;d!==s;){let u=$d(d).nextSibling;$d(n).insertBefore(d,o),d=u}}}return r},Lt=(e,t,r=e)=>(e._$AI(t,r),e),Tg={},Do=(e,t=Tg)=>e._$AH=t,Sd=e=>e._$AH,Uo=e=>{e._$AR(),e._$AA.remove()};var Cd=(e,t,r)=>{let n=new Map;for(let o=t;o<=r;o++)n.set(e[o],o);return n},J=pt(class extends Je{constructor(e){if(super(e),e.type!==Be.CHILD)throw Error("repeat() can only be used in text expressions")}dt(e,t,r){let n;r===void 0?r=t:t!==void 0&&(n=t);let o=[],s=[],i=0;for(let l of e)o[i]=n?n(l,i):i,s[i]=r(l,i),i++;return{values:s,keys:o}}render(e,t,r){return this.dt(e,t,r).values}update(e,[t,r,n]){let o=Sd(e),{values:s,keys:i}=this.dt(t,r,n);if(!Array.isArray(o))return this.ut=i,s;let l=this.ut??=[],d=[],u,p,f=0,h=o.length-1,b=0,m=s.length-1;for(;f<=h&&b<=m;)if(o[f]===null)f++;else if(o[h]===null)h--;else if(l[f]===i[b])d[b]=Lt(o[f],s[b]),f++,b++;else if(l[h]===i[m])d[m]=Lt(o[h],s[m]),h--,m--;else if(l[f]===i[m])d[m]=Lt(o[f],s[m]),Tr(e,d[m+1],o[f]),f++,m--;else if(l[h]===i[b])d[b]=Lt(o[h],s[b]),Tr(e,o[f],o[h]),h--,b++;else if(u===void 0&&(u=Cd(i,b,m),p=Cd(l,f,h)),u.has(l[f]))if(u.has(l[h])){let y=p.get(i[b]),$=y!==void 0?o[y]:null;if($===null){let w=Tr(e,o[f]);Lt(w,s[b]),d[b]=w}else d[b]=Lt($,s[b]),Tr(e,o[f],$),o[y]=null;b++}else Uo(o[h]),h--;else Uo(o[f]),f++;for(;b<=m;){let y=Tr(e,d[m+1]);Lt(y,s[b]),d[b++]=y}for(;f<=h;){let y=o[f++];y!==null&&Uo(y)}return this.ut=i,Do(e,d),ae}});var Ed="important",Ig=" !"+Ed,we=pt(class extends Je{constructor(e){if(super(e),e.type!==Be.ATTRIBUTE||e.name!=="style"||e.strings?.length>2)throw Error("The `styleMap` directive must be used in the `style` attribute and must be the only part in the attribute.")}render(e){return Object.keys(e).reduce((t,r)=>{let n=e[r];return n==null?t:t+`${r=r.includes("-")?r:r.replace(/(?:^(webkit|moz|ms|o)|)(?=[A-Z])/g,"-$&").toLowerCase()}:${n};`},"")}update(e,[t]){let{style:r}=e.element;if(this.ft===void 0)return this.ft=new Set(Object.keys(t)),this.render(t);for(let n of this.ft)t[n]==null&&(this.ft.delete(n),n.includes("-")?r.removeProperty(n):r[n]=null);for(let n in t){let o=t[n];if(o!=null){this.ft.add(n);let s=typeof o=="string"&&o.endsWith(Ig);n.includes("-")||s?r.setProperty(n,s?o.slice(0,-11):o,s?Ed:""):r[n]=o}}return ae}});var Ri=new WeakMap,Rd=Symbol("iteration key");function Rg(e){Ri.set(e,new Map)}function Bg(e,{target:t,key:r,type:n}){n==="iterate"&&(r=Rd);let o=Ri.get(t),s=o.get(r);s||(s=new Set,o.set(r,s)),s.has(e)||(s.add(e),e.cleaners.push(s))}function Fg({target:e,key:t,type:r}){let n=Ri.get(e),o=new Set;if(r==="clear"?n.forEach((s,i)=>{Ai(o,n,i)}):Ai(o,n,t),r==="add"||r==="delete"||r==="clear"){let s=Array.isArray(e)?"length":Rd;Ai(o,n,s)}return o}function Ai(e,t,r){let n=t.get(r);n&&n.forEach(e.add,e)}function Bd(e){e.cleaners&&e.cleaners.forEach(Mg,e),e.cleaners=[]}function Mg(e){e.delete(this)}var Ir=[],Ti=!1;function Lg(e,t,r,n){if(e.unobserved)return Reflect.apply(t,r,n);if(Ir.indexOf(e)===-1){Bd(e);try{return Ir.push(e),Reflect.apply(t,r,n)}finally{Ir.pop()}}}function nt(e){let t=Ir[Ir.length-1];t&&(Fd(t,e),Bg(t,e))}function Pt(e){Fg(e).forEach(Pg,e)}function Pg(e){Fd(e,this),typeof e.scheduler=="function"?e.scheduler(e):typeof e.scheduler=="object"?e.scheduler.add(e):e()}function Fd(e,t){if(e.debugger&&!Ti)try{Ti=!0,e.debugger(t)}finally{Ti=!1}}function Md(){return Ir.length>0}var Ad=Symbol("is reaction");function Ld(e,t={}){let r=e[Ad]?e:function n(){return Lg(n,e,this,arguments)};return r.scheduler=t.scheduler,r.debugger=t.debugger,r[Ad]=!0,t.lazy||r(),r}function Bi(e){e.unobserved||(e.unobserved=!0,Bd(e)),typeof e.scheduler=="object"&&e.scheduler.delete(e)}var Se=new WeakMap,Ho=new WeakMap,Og=Object.prototype.hasOwnProperty;function Wo(e){let t=Ho.get(e);return Md()&&typeof e=="object"&&e!==null?t||Vo(e):t||e}function Ii(e,t){let r=e.next;return e.next=()=>{let{done:n,value:o}=r.call(e);return n||(t?o[1]=Wo(o[1]):o=Wo(o)),{done:n,value:o}},e}var Td={has(e){let t=Se.get(this),r=Reflect.getPrototypeOf(this);return nt({target:t,key:e,type:"has"}),r.has.apply(t,arguments)},get(e){let t=Se.get(this),r=Reflect.getPrototypeOf(this);return nt({target:t,key:e,type:"get"}),Wo(r.get.apply(t,arguments))},add(e){let t=Se.get(this),r=Reflect.getPrototypeOf(this),n=r.has.call(t,e),o=r.add.apply(t,arguments);return n||Pt({target:t,key:e,value:e,type:"add"}),o},set(e,t){let r=Se.get(this),n=Reflect.getPrototypeOf(this),o=n.has.call(r,e),s=n.get.call(r,e),i=n.set.apply(r,arguments);return o?t!==s&&Pt({target:r,key:e,value:t,oldValue:s,type:"set"}):Pt({target:r,key:e,value:t,type:"add"}),i},delete(e){let t=Se.get(this),r=Reflect.getPrototypeOf(this),n=r.has.call(t,e),o=r.get?r.get.call(t,e):void 0,s=r.delete.apply(t,arguments);return n&&Pt({target:t,key:e,oldValue:o,type:"delete"}),s},clear(){let e=Se.get(this),t=Reflect.getPrototypeOf(this),r=e.size!==0,n=e instanceof Map?new Map(e):new Set(e),o=t.clear.apply(e,arguments);return r&&Pt({target:e,oldTarget:n,type:"clear"}),o},forEach(e,...t){let r=Se.get(this),n=Reflect.getPrototypeOf(this);nt({target:r,type:"iterate"});let o=(s,...i)=>e(Wo(s),...i);return n.forEach.call(r,o,...t)},keys(){let e=Se.get(this),t=Reflect.getPrototypeOf(this);return nt({target:e,type:"iterate"}),t.keys.apply(e,arguments)},values(){let e=Se.get(this),t=Reflect.getPrototypeOf(this);nt({target:e,type:"iterate"});let r=t.values.apply(e,arguments);return Ii(r,!1)},entries(){let e=Se.get(this),t=Reflect.getPrototypeOf(this);nt({target:e,type:"iterate"});let r=t.entries.apply(e,arguments);return Ii(r,!0)},[Symbol.iterator](){let e=Se.get(this),t=Reflect.getPrototypeOf(this);nt({target:e,type:"iterate"});let r=t[Symbol.iterator].apply(e,arguments);return Ii(r,e instanceof Map)},get size(){let e=Se.get(this),t=Reflect.getPrototypeOf(this);return nt({target:e,type:"iterate"}),Reflect.get(t,"size",e)}},zo={get(e,t,r){return e=Og.call(Td,t)?Td:e,Reflect.get(e,t,r)}},Id=typeof window=="object"?window:Function("return this")(),Pd=new Map([[Map,zo],[Set,zo],[WeakMap,zo],[WeakSet,zo],[Object,!1],[Array,!1],[Int8Array,!1],[Uint8Array,!1],[Uint8ClampedArray,!1],[Int16Array,!1],[Uint16Array,!1],[Int32Array,!1],[Uint32Array,!1],[Float32Array,!1],[Float64Array,!1]]);function Ng({constructor:e}){return!(typeof e=="function"&&e.name in Id&&Id[e.name]===e)||Pd.has(e)}function Dg(e){return Pd.get(e.constructor)}var Od=Object.prototype.hasOwnProperty,Ug=new Set(Object.getOwnPropertyNames(Symbol).map(e=>Symbol[e]).filter(e=>typeof e=="symbol"));function zg(e,t,r){let n=Reflect.get(e,t,r);if(typeof t=="symbol"&&Ug.has(t))return n;nt({target:e,key:t,receiver:r,type:"get"});let o=Ho.get(n);if(Md()&&typeof n=="object"&&n!==null){if(o)return o;let s=Reflect.getOwnPropertyDescriptor(e,t);if(!s||!(s.writable===!1&&s.configurable===!1))return Vo(n)}return o||n}function Wg(e,t){let r=Reflect.has(e,t);return nt({target:e,key:t,type:"has"}),r}function Hg(e){return nt({target:e,type:"iterate"}),Reflect.ownKeys(e)}function Vg(e,t,r,n){typeof r=="object"&&r!==null&&(r=Se.get(r)||r);let o=Od.call(e,t),s=e[t],i=Reflect.set(e,t,r,n);return e!==Se.get(n)||(o?r!==s&&Pt({target:e,key:t,value:r,oldValue:s,receiver:n,type:"set"}):Pt({target:e,key:t,value:r,receiver:n,type:"add"})),i}function jg(e,t){let r=Od.call(e,t),n=e[t],o=Reflect.deleteProperty(e,t);return r&&Pt({target:e,key:t,oldValue:n,type:"delete"}),o}var Kg={get:zg,has:Wg,ownKeys:Hg,set:Vg,deleteProperty:jg};function Vo(e={}){return Se.has(e)||!Ng(e)?e:Ho.get(e)||qg(e)}function qg(e){let t=Dg(e)||Kg,r=new Proxy(e,t);return Ho.set(e,r),Se.set(r,e),Rg(e),r}var Nd=Vo;function Fi(e){let t=!0,r=Ld(()=>{try{e(t)}finally{t=!1}},{lazy:!0});try{r()}catch(n){throw Bi(r),n}return()=>Bi(r)}var L=class extends H{_disposers=[];observes=null;connectedCallback(){super.connectedCallback(),this.bindState()}bindState(){if(this.observes){this._disposers.push(Fi(t=>{this.observes(),t||this.requestUpdate()}));return}this._render||(this._render=this.render,this.render=()=>{let t,r=Fi(n=>{if(!n){r(),this._dispose===r&&(this._dispose=null),this.updateComplete.then(()=>this.requestUpdate());return}t=this._render()});return this._dispose=r,t}),this._disposers.push(()=>this._dispose&&this._dispose())}disconnectedCallback(){for(super.disconnectedCallback();this._disposers.length>0;)this._disposers.pop()()}};globalThis[Symbol.for("@rray/frontend")]={LitElement:H,html:c,nothing:g,render:W,unsafeCSS:T,StateElement:L,classMap:F,repeat:J,styleMap:we};var Ce=document.querySelector("#drop-zone"),E=document.querySelector("#report"),Dd=document.querySelector("app-sidebar");function Rr(e,t){let r=URL.createObjectURL(e),n=document.createElement("span");n.style.display="none",W(c`<a href="${r}" download="${t}"></a>`,n),document.body.append(n),n.firstElementChild.click(),n.remove(),URL.revokeObjectURL(r)}function ft(e){return new Error("Another dialog is already open. Close it and try again.",{cause:e})}function zd(e){let t=e?.package?.npm?.version;if(typeof t=="string"&&t)return t;let r=e?.file;if(!r)return null;let n=/(?:^|\/)node_modules\/\.pnpm\/([^/]+)\/node_modules\//u.exec(r);if(!n)return null;let o=n[1],s=o.indexOf("_");s>0&&(o=o.slice(0,s));let i=o.lastIndexOf("@");return i<=0?null:o.slice(i+1)||null}function jo(){return{keys:new Set,findings:[],files:new Map,reports:new Set,_keyReports:new Map}}function Ko(e,t,r,n){e.reports.add(r);let o=e._keyReports.get(t);o||e._keyReports.set(t,o=new Set);let s=!o.has(r);return o.add(r),e.keys.has(t)||(e.keys.add(t),e.findings.push(n),e.files.has(n.file)||e.files.set(n.file,[]),e.files.get(n.file).push(n)),s}function qo(e,t,r,n){e._keyReports.delete(t),e.keys.delete(t);let o=e.findings.findIndex(l=>n(l)===t);o>=0&&e.findings.splice(o,1);let s=e.files.get(r);if(!s)return;let i=s.findIndex(l=>n(l)===t);i>=0&&s.splice(i,1),s.length===0&&e.files.delete(r)}function Go(e){let t=new Set;for(let r of e._keyReports.values())for(let n of r)t.add(n);e.reports=t}function Wd(e,t,r,n,o){let s=e.byVersion.get(t);s||(s=jo(),e.byVersion.set(t,s)),Ko(s,n,o,r)}function Hd(e,t,r,n,o,s){let i=e.byVersion.get(t);if(!i)return;let l=i._keyReports.get(r);if(l&&(l.delete(o),l.size===0&&qo(i,r,n,s)),i._keyReports.size===0){e.byVersion.delete(t);return}Go(i)}function Mi(e,t){if(e===t)return 0;if(e===null)return 1;if(t===null)return-1;let[r,n=""]=Ud(e,"-"),[o,s=""]=Ud(t,"-"),i=r.split("."),l=o.split("."),d=Math.max(i.length,l.length);for(let u=0;u<d;u++){let p=i[u]??"0",f=l[u]??"0",h=/^\d+$/u.test(p),b=/^\d+$/u.test(f);if(h&&b){let m=Number(f)-Number(p);if(m!==0)return m}else{let m=f.localeCompare(p);if(m!==0)return m}}return n===""&&s!==""?-1:n!==""&&s===""?1:s.localeCompare(n)}function Ud(e,t){let r=e.indexOf(t);return r<0?[e,""]:[e.slice(0,r),e.slice(r+1)]}var Gg=new TextEncoder,Yg=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0});function G(e){if(typeof e!="string")throw new TypeError(`encodeUtf8 expects a string, got ${typeof e}`);if(!e.isWellFormed())throw new TypeError("encodeUtf8: input contains lone surrogates");return Gg.encode(e)}function ce(e){if(!ArrayBuffer.isView(e)&&!(e instanceof ArrayBuffer))throw new TypeError(`decodeUtf8 expects a BufferSource, got ${e===null?"null":typeof e}`);return Yg.decode(e)}async function mn(e){let t=new Blob([e]).stream().pipeThrough(new CompressionStream("gzip"));return new Uint8Array(await new Response(t).arrayBuffer())}async function ht(e){let t=new Blob([e]).stream().pipeThrough(new DecompressionStream("gzip"));return new Uint8Array(await new Response(t).arrayBuffer())}async function Yo(e){return await mn(G(e))}async function bn(e){return ce(await ht(e))}async function Vd(e){let t=await crypto.subtle.digest("SHA-512",e);return`sha512-${new Uint8Array(t).toBase64()}`}var ot=new Uint8Array([68,86,69,49]),Br=12,Jg=32,Xg="deepview-passkey.v1.content-key";function yn(){return!(typeof window>"u"||typeof PublicKeyCredential>"u"||typeof navigator>"u"||!navigator.credentials)}async function jd(){if(typeof PublicKeyCredential>"u")return!1;let e=PublicKeyCredential.getClientCapabilities;if(typeof e!="function")return null;try{let t=await e.call(PublicKeyCredential);if(!t||typeof t!="object")return null;let r=t["extension:prf"],n=t.prf;return r===!0||n===!0?!0:r===!1||n===!1?!1:null}catch{return null}}function Jo(e){let t=new Uint8Array(e);return crypto.getRandomValues(t),t}async function Li(e){if(e.length<32)throw new Error(`PRF output too short (${e.length} bytes; need \u2265 32)`);let t=await crypto.subtle.importKey("raw",e,"HKDF",!1,["deriveBits"]),r=await crypto.subtle.deriveBits({name:"HKDF",hash:"SHA-256",salt:new Uint8Array,info:G(Xg)},t,Jg*8);return new Uint8Array(r)}function Pi(e){return crypto.subtle.importKey("raw",e,{name:"AES-GCM"},!1,["encrypt","decrypt"])}async function Ot(e,t,r){let n=Jo(Br),o=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:n,additionalData:r},e,t)),s=new Uint8Array(ot.length+Br+o.length);return s.set(ot,0),s.set(n,ot.length),s.set(o,ot.length+Br),s}async function ar(e,t,r){if(!Le(t))throw new Error("passkey: missing envelope magic");if(t.length<ot.length+Br+16)throw new Error("passkey: envelope too short");let n=t.subarray(ot.length,ot.length+Br),o=t.subarray(ot.length+Br);return new Uint8Array(await crypto.subtle.decrypt({name:"AES-GCM",iv:n,additionalData:r},e,o))}function Le(e){if(e.length<ot.length)return!1;for(let t=0;t<ot.length;t++)if(e[t]!==ot[t])return!1;return!0}async function Kd(e){if(!yn())throw new Error("passkey: not supported in this environment");let t=Jo(32),r=Jo(32),n=await navigator.credentials.create({publicKey:{challenge:t,rp:{name:e.rpName,id:e.rpId},user:{id:e.userId,name:e.userName,displayName:e.userName},pubKeyCredParams:[{type:"public-key",alg:-7},{type:"public-key",alg:-257}],authenticatorSelection:{residentKey:"required",userVerification:"required"},extensions:{prf:{eval:{first:r}}},timeout:e.timeoutMs??12e4},...e.signal?{signal:e.signal}:{}});if(!(n instanceof PublicKeyCredential))throw new Error("passkey: registration returned no credential");let o=new Uint8Array(n.rawId).toBase64({alphabet:"base64url",omitPadding:!0}),s=n.getClientExtensionResults().prf,i=s?.results?.first?new Uint8Array(s.results.first):null;return{credentialId:o,prfSalt:r.toBase64({alphabet:"base64url",omitPadding:!0}),prfOutput:i}}async function Oi(e){if(!yn())throw new Error("passkey: not supported in this environment");let t=Jo(32),r=Uint8Array.fromBase64(e.credentialId,{alphabet:"base64url"}),n=Uint8Array.fromBase64(e.prfSalt,{alphabet:"base64url"}),o=await navigator.credentials.get({publicKey:{challenge:t,rpId:e.rpId,allowCredentials:[{type:"public-key",id:r}],userVerification:"required",extensions:{prf:{eval:{first:n}}},timeout:e.timeoutMs??12e4},...e.signal?{signal:e.signal}:{}});if(!(o instanceof PublicKeyCredential))throw new Error("passkey: assertion returned no credential");let i=o.getClientExtensionResults().prf?.results?.first;if(!i)throw new Error("passkey: authenticator did not return PRF output (extension unsupported)");return new Uint8Array(i)}var wn=Object.freeze(["deepview.workspaces","deepview.sync.sessions","deepview.sync.userEnabled","deepview.sync.password","deepview.repoUrls","deepview.fileCounts","deepview.lastFile"]),Pe=new Map,Ni=!1,lr=new Map,Nt=new Map,Di=new Set;function Fr(e){return Di.add(e),()=>Di.delete(e)}function Qg(){for(let e of Di)try{e()}catch(t){console.warn("secure-storage after-hydrate listener:",t)}}function Xo(e){let t=Jd()??"";return G(`deepview.secure.v1|${t}|${e}`)}function Ui(e){try{let t=Uint8Array.fromBase64(e);if(Le(t))return t}catch{}return null}function he(e){return Pe.get(e)??null}async function ve(e,t){if(typeof t!="string")throw new TypeError("secure-storage: value must be a string");if(X()&&!ke())throw new Error(`secure-storage: vault locked, cannot save "${e}"`);if(Yd())throw new Error(`secure-storage: wipe in progress, cannot save "${e}"`);let r=Pe.has(e),n=Pe.get(e);Pe.set(e,t),Nt.set(e,t);let o=lr.get(e)??Promise.resolve(),s=()=>{Nt.get(e)===t&&Nt.delete(e)},i=o.catch(()=>{}).then(()=>Zg(e,t)).then(()=>s(),l=>{throw s(),Pe.get(e)===t&&(r?Pe.set(e,n):Pe.delete(e)),l});lr.set(e,i.catch(()=>{})),await i}function Mr(e){Pe.delete(e);try{localStorage.removeItem(e)}catch{}}async function Zg(e,t){let r=ke();if(r){let n=await Ot(r,G(t),Xo(e));localStorage.setItem(e,n.toBase64())}else localStorage.setItem(e,t)}async function Lr(){Ni||ge(()=>{Lr().catch(r=>console.warn("secure-storage rehydrate:",r))}),Ni=!0;for(let r of[...Pe.keys()])Nt.has(r)||Pe.delete(r);let e=ke(),t=[];for(let r of wn){if(Nt.has(r))continue;let n=localStorage.getItem(r);if(n===null)continue;let o=Ui(n);if(o){if(!e)continue;try{let s=await ar(e,o,Xo(r));Pe.set(r,ce(s))}catch(s){console.warn(`secure-storage: decrypt failed for "${r}":`,s)}}else Pe.set(r,n),e&&X()&&t.push([r,n])}Qg(),t.length>0&&queueMicrotask(()=>{for(let[r,n]of t)Pe.get(r)===n&&ve(r,n).catch(o=>{console.warn(`secure-storage: self-heal failed for "${r}":`,o)})})}async function qd(e,t){let r=lr.get(e)??Promise.resolve(),n=async()=>{if(Nt.has(e))return;let s=localStorage.getItem(e);if(s===null)return;let i=await t(s);i!==null&&(Nt.has(e)||(localStorage.setItem(e,i.storageValue),Pe.set(e,i.cacheValue)))},o=r.catch(()=>{}).then(n);lr.set(e,o.catch(()=>{})),await o}async function zi({seal:e}){for(let t of wn)await qd(t,async r=>{if(Ui(r))return null;let n=ke();return n?{storageValue:(await Ot(n,G(r),Xo(t))).toBase64(),cacheValue:r}:null})}async function Wi({open:e}){for(let t of wn)await qd(t,async r=>{let n=Ui(r);if(!n)return null;let o=await e(n,Xo(t)),s=ce(o);return{storageValue:s,cacheValue:s}})}var em="deepview.secure.v1.mutate:";function Hi(e,t){return wn.includes(e)?navigator.locks.request(em+e,async()=>{let r=lr.get(e);r&&await r.catch(()=>{}),await Lr();let n=he(e),o=await t(n);if(!(o==null||o===n)){if(typeof o!="string")throw new TypeError(`secure-storage: mutate updater for "${e}" must return a string`);await ve(e,o)}}):Promise.reject(new Error(`secure-storage: mutate() called with non-secure key "${e}"`))}async function Gd(){await Promise.allSettled([...lr.values()]),Nt.clear(),lr.clear()}typeof window<"u"&&window.addEventListener("storage",e=>{!Ni||!e.key||!wn.includes(e.key)||Lr().catch(()=>{})});var $n="deepview.passkey.v1",Pr="deepview.passkey.userId",Zo="deepview.passkey.cleanDisable",Xe="deepview.passkey.v1.write",rm="deepview.triage.v1|",nm="deepview.opfs.v1|",om="deepview.bundle.v1|",ee=null,gt=null,Dt=null,kn=0;function Ki(){return kn>0}var Vi=0;function Yd(){return Vi>0}function cr(){try{let e=localStorage.getItem($n);if(!e)return null;let t=JSON.parse(e);return t&&typeof t=="object"&&t.enabled===!0&&typeof t.credentialId=="string"&&t.credentialId.length>0&&typeof t.prfSalt=="string"&&t.prfSalt.length>0&&typeof t.userId=="string"&&t.userId.length>0?t:null}catch{return null}}function Xd(e){localStorage.setItem($n,JSON.stringify(e))}function sm(){localStorage.removeItem($n)}function im(){try{let t=localStorage.getItem(Pr);if(t){let r=Uint8Array.fromBase64(t,{alphabet:"base64url"});if(r.length===16)return r}}catch{}let e=new Uint8Array(16);crypto.getRandomValues(e);try{localStorage.setItem(Pr,e.toBase64({alphabet:"base64url",omitPadding:!0}))}catch{}return e}function es(){return typeof location>"u"?"":location.hostname}function X(){return cr()!==null}function st(){return ee!==null}function mt(){return!(!yn()||typeof navigator>"u"||!navigator.locks?.request||!es())}function Jd(){return gt}function xn(){if(cr()!==null)return!1;try{return localStorage.getItem(Zo)==="1"?!1:localStorage.getItem(Pr)!==null}catch{return!1}}function ke(){return ee}function _n(){return G(rm+(gt??""))}function ts(e){if(typeof e!="string")throw new TypeError("passkey vault: OPFS AAD requires a filename string");return G(nm+(gt??"")+"|"+e)}function rs(e){if(typeof e!="string")throw new TypeError("passkey vault: bundle AAD requires a slot string");return G(om+(gt??"")+"|"+e)}var ji=new Set;function ge(e){return ji.add(e),()=>ji.delete(e)}function Or(){for(let e of ji)try{e()}catch(t){console.warn("passkey vault listener:",t)}}async function Sn({signal:e}={}){let t=cr();if(!t)return!1;let r;try{r=await Oi({credentialId:t.credentialId,prfSalt:t.prfSalt,rpId:t.rpId??es(),...e?{signal:e}:{}})}catch(o){if(o&&o.name==="NotAllowedError"||o&&o.name==="AbortError")return!1;throw o&&o.message?.includes("PRF")?vn(o):o}if(!r||r.length<32)throw vn();let n=await Li(r);return r.fill(0),navigator.locks.request(Xe,async()=>{let o=cr();if(!o||o.credentialId!==t.credentialId)throw n.fill(0),new Error("passkey: vault state changed during unlock (another tab wiped or re-enabled it). Reload this page and try again.");return ee=await Pi(n),n.fill(0),gt=o.userId,Dt=o.credentialId,Or(),!0})}function vn(e){let t=new Error("Your browser or authenticator doesn't support passkey-derived encryption keys (the WebAuthn PRF extension). Try Chrome 116+, Safari 18+, or Firefox 130+ on a device with a platform authenticator (TouchID / Windows Hello).");return e&&(t.cause=e),t}function qi({migrate:e,userName:t,rpName:r,signal:n,acknowledgeOrphan:o}){if(!yn())throw new Error("passkey: WebAuthn unavailable in this environment");if(xn()&&!o)throw new Error("passkey: a previous vault exists on this device with no metadata. Any data encrypted under the old passkey will be unreadable after a new setup. Call enableEncryption({acknowledgeOrphan: true}) to proceed, or wipeAllVaultData() to start clean first.");let s=es();return navigator.locks.request(Xe,async()=>{if(X())throw new Error("passkey: encryption is already enabled");if(await jd()===!1)throw vn();let l=im(),d=await Kd({userName:t||"DeepView user",userId:l,rpName:r||"DeepView",rpId:s,...n?{signal:n}:{}}),u=d.prfOutput;if(!u)try{u=await Oi({credentialId:d.credentialId,prfSalt:d.prfSalt,rpId:s,...n?{signal:n}:{}})}catch(m){let y=l.toBase64({alphabet:"base64url",omitPadding:!0});await Qo({credentialId:d.credentialId,rpId:s,userId:y}).catch(()=>{});try{localStorage.removeItem(Pr)}catch{}throw m&&m.message?.includes("PRF")?vn(m):m}if(!u||u.length<32){let m=l.toBase64({alphabet:"base64url",omitPadding:!0});await Qo({credentialId:d.credentialId,rpId:s,userId:m}).catch(()=>{});try{localStorage.removeItem(Pr)}catch{}throw vn()}let p=await Li(u);u.fill(0);let f=await Pi(p);p.fill(0);let h=l.toBase64({alphabet:"base64url",omitPadding:!0}),b={enabled:!0,credentialId:d.credentialId,prfSalt:d.prfSalt,userId:h,rpId:s,createdAt:Date.now()};ee=f,gt=h,Dt=d.credentialId,Xd(b),typeof e=="function"&&await e({seal:(y,$)=>Ot(f,y,$)});try{localStorage.removeItem(Zo)}catch{}return Or(),!0})}async function Gi({migrate:e}){if(!X())return{disabled:!1,signalAttempted:!1};if(!st())throw new Error("passkey: must unlock before disabling encryption");kn+=1;try{return await navigator.locks.request(Xe,async()=>{let t=cr();if(!t)return{disabled:!1,signalAttempted:!1};let r=ee;if(!r)return{disabled:!1,signalAttempted:!1};if(sm(),ee=null,Dt=null,typeof e=="function"){let o=(s,i)=>ar(r,s,i);try{await e({open:o})}catch(s){throw Xd(t),ee=r,Dt=t.credentialId,Or(),s}}gt=null;try{localStorage.setItem(Zo,"1")}catch{}let n=await Qo(t).catch(()=>!1);return Or(),{disabled:!0,signalAttempted:n}})}finally{kn-=1}}async function Qo({credentialId:e,rpId:t,userId:r}){if(typeof PublicKeyCredential>"u"||!t)return!1;let n=PublicKeyCredential,o=!1;if(typeof n.signalUnknownCredential=="function"){o=!0;try{await n.signalUnknownCredential({rpId:t,credentialId:e})}catch{}}if(typeof n.signalAllAcceptedCredentials=="function"&&r){o=!0;try{await n.signalAllAcceptedCredentials({rpId:t,userId:r,allAcceptedCredentialIds:[]})}catch{}}return o}async function am(e,t){try{return await e.removeEntry(t,{recursive:!0}),null}catch(r){return r?.name==="NotFoundError"?null:`${t}: ${r?.message??String(r)}`}}async function lm(e){let t=[];if(typeof navigator>"u"||!navigator.storage?.getDirectory)return t;let r;try{r=await navigator.storage.getDirectory()}catch(n){return t.push(`storage root: ${n?.message??String(n)}`),t}for(let n of e){let o=await am(r,n);o&&t.push(o)}return t}async function Cn({refuseIfEnabled:e=!1}={}){kn+=1,Vi+=1;try{return await navigator.locks.request(Xe,async()=>{if(e&&X())throw new Error("passkey: encryption was just enabled in another tab. Reload this page to unlock instead of wiping.");await Gd();let t=cr();if(t)try{await Qo({credentialId:t.credentialId,rpId:t.rpId??es(),userId:t.userId})}catch{}try{localStorage.removeItem($n)}catch{}try{localStorage.removeItem(Pr)}catch{}try{localStorage.removeItem(Zo)}catch{}for(let n of["deepview.workspaces","deepview.sync.sessions","deepview.sync.userEnabled","deepview.repoUrls","deepview.fileCounts","deepview.lastFile","deepview.triage","deepview.triage.pending","deepview.passkey.firstImportPrompted","deepview.viewMode"])try{localStorage.removeItem(n)}catch{}try{let n=[];for(let o=0;o<localStorage.length;o+=1){let s=localStorage.key(o);s&&s.startsWith("deepview.report:")&&n.push(s)}for(let o of n)try{localStorage.removeItem(o)}catch{}}catch{}ee=null,gt=null,Dt=null,Or();let r=await lm(["deepview-reports","deepview-bundles"]);if(r.length>0)throw new Error(`passkey: wipe partially succeeded \u2014 localStorage cleared but the following OPFS paths could not be removed: ${r.join("; ")}. Open DevTools \u2192 Application \u2192 Storage \u2192 Origin Private File System to inspect, or use the browser's site-data clear tool to finish.`)})}finally{kn-=1,Vi-=1}}function Qd(e){return ee?Ot(ee,e,_n()):Promise.reject(new Error("passkey: vault locked, cannot seal triage"))}function Zd(e){return ee?ar(ee,e,_n()):Promise.reject(new Error("passkey: vault locked, cannot open triage"))}function ns(e,t){return ee?Ot(ee,e,ts(t)):Promise.reject(new Error("passkey: vault locked, cannot seal OPFS file"))}function eu(e,t){return ee?ar(ee,e,ts(t)):Promise.reject(new Error("passkey: vault locked, cannot open OPFS file"))}function Yi(e,t){return ee?Ot(ee,e,rs(t)):Promise.reject(new Error("passkey: vault locked, cannot seal bundle"))}function Ji(e,t){return ee?ar(ee,e,rs(t)):Promise.reject(new Error("passkey: vault locked, cannot open bundle"))}typeof window<"u"&&window.addEventListener("storage",e=>{if(e.key!==$n)return;let t=cr();(!t&&ee||t&&ee&&t.credentialId!==Dt)&&(ee=null,gt=null,Dt=null),Or()});var ea="__meta__",cm="deepview-reports",ta="deepview-bundles",Et="deepview.report:",tu=!1;async function ra(e,{create:t,warnOnce:r=!1}={}){try{return await(await navigator.storage.getDirectory()).getDirectoryHandle(e,{create:t})}catch(n){return r&&!tu&&(tu=!0,console.warn("OPFS unavailable, falling back to gzipped localStorage (limited quota).",n)),null}}async function os(e,t){let r=await e.createWritable();try{await r.write(t),await r.close()}catch(n){try{await r.abort(n)}catch{}throw n}}async function Xi(e,t){if(!Le(e))return e;if(!ke())throw new Error(`storage: vault locked, cannot decrypt "${t}"`);return await eu(e,t)}async function En(e,t,r,n,o=()=>{}){if(X()&&!ke())throw o(),new Error(`storage: vault locked, cannot save ${n}`);let s=ke(),i=s?await t(e,r):e;if(ke()!==s)throw o(),new Error(`storage: vault state changed mid-save for ${n}; retry`);return i}function dr(){return ra(cm,{create:!0,warnOnce:!0})}var it=new Map,Ut=new Map,Qi=new Map;function re(e){Qi.set(e,(Qi.get(e)??0)+1)}function ru(e){return Qi.get(e)??0}var Zi=new Set;function nu(e){return Zi.add(e),()=>Zi.delete(e)}function Nr(e,t){for(let r of Zi)try{r(e,t)}catch(n){console.warn("storage file-change listener:",n)}}async function le(){let e=await dr();if(e){let r=[];for await(let[n]of e.entries())r.push(n);return r.toSorted()}let t=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);n&&n.startsWith(Et)&&t.push(n.slice(Et.length))}return t.toSorted()}async function at(e,t){if(typeof e!="string"||e.includes("\0"))throw new Error("Invalid report name: contains NUL byte or is not a string");return re(e),navigator.locks.request(Xe,{mode:"shared"},async()=>{let r=await dr();if(r){let s=await mn(G(t));s=await En(s,ns,e,`"${e}"`,()=>re(e));let l=await(await r.getFileHandle(e,{create:!0})).createWritable();try{await l.write(s),await l.close()}catch(d){it.delete(e),re(e);try{await l.abort(d)}catch{}throw d}it.set(e,t),re(e),Nr(e,"save");return}let n=G(t);n=await mn(n),n=await En(n,ns,e,`"${e}"`,()=>re(e));let o=n.toBase64();try{localStorage.setItem(Et+e,o),it.set(e,t),re(e),Nr(e,"save")}catch(s){throw re(e),new Error(`localStorage write failed for ${e}: ${s.message}`,{cause:s})}})}async function Fe(e){if(it.has(e))return it.get(e);if(Ut.has(e))return Ut.get(e);let t=ru(e),r=(async()=>{let n=await dr();if(n){let d=await(await n.getFileHandle(e)).getFile(),u=new Uint8Array(await d.arrayBuffer());if(u=await Xi(u,e),u.length>=2&&u[0]===31&&u[1]===139){let f=await ht(u);return ce(f)}let p=ce(u);return at(e,p).catch(f=>{console.warn(`storage: legacy-uncompressed migration of "${e}" failed:`,f)}),p}let o=localStorage.getItem(Et+e);if(o===null)throw new Error(`File not found: ${e}`);let s=Uint8Array.fromBase64(o);s=await Xi(s,e);let i=await ht(s);return ce(i)})();Ut.set(e,r);try{let n=await r;return ru(e)===t&&it.set(e,n),n}finally{Ut.delete(e)}}async function Tn(e){let t=await dr(),r;if(t){let o=await(await t.getFileHandle(e)).getFile();r=new Uint8Array(await o.arrayBuffer())}else{let n=localStorage.getItem(Et+e);if(n===null)throw new Error(`File not found: ${e}`);r=Uint8Array.fromBase64(n)}return r=await Xi(r,e),r}async function In(e,t){if(typeof e!="string"||e.includes("\0"))throw new Error("Invalid report name: contains NUL byte or is not a string");return re(e),it.delete(e),navigator.locks.request(Xe,{mode:"shared"},async()=>{let r=await En(t,ns,e,`"${e}"`,()=>re(e)),n=await dr();if(n){let s=await(await n.getFileHandle(e,{create:!0})).createWritable();try{await s.write(r),await s.close()}catch(i){re(e);try{await s.abort(i)}catch{}throw i}re(e),Nr(e,"save");return}try{localStorage.setItem(Et+e,r.toBase64()),re(e),Nr(e,"save")}catch(o){throw re(e),new Error(`localStorage write failed for ${e}: ${o.message}`,{cause:o})}})}async function Dr(e){return re(e),it.delete(e),Ut.delete(e),navigator.locks.request(Xe,{mode:"shared"},async()=>{let t=await dr();if(t){try{await t.removeEntry(e)}catch(r){if(!(r instanceof DOMException)||r.name!=="NotFoundError")throw re(e),r}re(e),Nr(e,"delete");return}localStorage.removeItem(Et+e),re(e),Nr(e,"delete")})}var An="_meta.json";function Rn(){return ra(ta,{create:!0})}function na(e){return e.replaceAll("/","_")}async function oa(e){let t;try{let o=await(await e.getFileHandle(An)).getFile();t=new Uint8Array(await o.arrayBuffer())}catch(n){return n instanceof DOMException&&n.name==="NotFoundError"?[]:(console.warn("readBundleMeta: failed to read _meta.json:",n),[])}let r=t;if(Le(t)){if(!ke())return console.warn("readBundleMeta: vault locked, returning empty bundle list"),[];try{r=await Ji(t,ea)}catch(o){return console.warn("readBundleMeta: decrypt failed (tampering, key mismatch, or vault identity drift):",o),[]}}try{let n=JSON.parse(ce(r));return Array.isArray(n)?n:[]}catch(n){return console.warn("readBundleMeta: JSON.parse failed:",n),[]}}async function ou(e,t){let r=G(JSON.stringify(t));r=await En(r,Yi,ea,"bundle metadata");try{await e.removeEntry(An)}catch{}let n=await e.getFileHandle(An,{create:!0});await os(n,r)}var dm=`${ta}/${An}`;function su(e){return navigator.locks.request(dm,e)}async function lt(){let e=await Rn();return e?[...await oa(e)].toSorted((r,n)=>r.name.localeCompare(n.name)):[]}async function sa(){if(typeof navigator>"u"||!navigator.storage?.getDirectory)return!1;let e=await ra(ta,{create:!1});if(!e)return!1;try{for await(let t of e.entries())return!0}catch{}return!1}async function ur(e,t){let r=await Rn();if(!r)throw new Error(`Cannot save bundle ${e}: OPFS unavailable`);let n=t instanceof Uint8Array?t:new TextEncoder().encode(t),o=await Vd(n),s=na(o),i=e.toLowerCase().endsWith(".map")?await mn(n):n;return navigator.locks.request(Xe,{mode:"shared"},async()=>{i=await En(i,Yi,o,`bundle "${e}"`);try{await r.removeEntry(s)}catch{}let l=await r.getFileHandle(s,{create:!0});await os(l,i);try{await su(async()=>{let d=await oa(r),u=d.findIndex(p=>p.integrity===o);u>=0?d[u]={integrity:o,name:e}:d.push({integrity:o,name:e}),await ou(r,d)})}catch(d){try{await r.removeEntry(s)}catch{}throw d}return{integrity:o,name:e}})}async function ia(e){let t=await Rn();if(t)return navigator.locks.request(Xe,{mode:"shared"},async()=>{try{await t.removeEntry(na(e))}catch{}await su(async()=>{let r=await oa(t),n=r.filter(o=>o.integrity!==e);n.length!==r.length&&await ou(t,n)})})}async function pr(e){let t=await Rn();if(!t)throw new Error("OPFS unavailable");let n=await(await t.getFileHandle(na(e))).getFile(),o=new Uint8Array(await n.arrayBuffer());if(Le(o)){if(!ke())throw new Error(`storage: vault locked, cannot read bundle "${e}"`);o=await Ji(o,e)}return o.length>=2&&o[0]===31&&o[1]===139?await ht(o):o}async function um(e,t){let r=await dr();if(r){let l=await(await r.getFileHandle(e)).getFile(),d=new Uint8Array(await l.arrayBuffer()),u=await t(d);if(u===null)return;it.delete(e),Ut.delete(e),re(e);let p=await r.getFileHandle(e,{create:!0});await os(p,u),re(e);return}let n=localStorage.getItem(Et+e);if(n===null)return;let o=Uint8Array.fromBase64(n),s=await t(o);s!==null&&(it.delete(e),Ut.delete(e),re(e),localStorage.setItem(Et+e,s.toBase64()),re(e))}function iu(e,t){return e.seal?r=>Le(r)?null:e.seal(r,t):r=>Le(r)?e.open(r,t):null}async function au(e){let t=await le();for(let r of t)try{await um(r,iu(e,ts(r)))}catch(n){if(n instanceof DOMException&&n.name==="NotFoundError")continue;throw n}}var aa=({seal:e})=>au({seal:e}),la=({open:e})=>au({open:e});async function pm(){let e=await Rn();if(!e)return{dir:null,keys:[]};let t=[];for await(let[r]of e.entries())t.push(r);return{dir:e,keys:t}}function fm(e){return e===An?ea:e.startsWith("sha512-")?e.replaceAll("_","/"):null}async function hm(e,t,r){let o=await(await e.getFileHandle(t)).getFile(),s=new Uint8Array(await o.arrayBuffer()),i=await r(s);if(i===null)return;let l=await e.getFileHandle(t,{create:!0});await os(l,i)}async function lu(e){let{dir:t,keys:r}=await pm();if(t)for(let n of r){let o=fm(n);if(o!==null)try{await hm(t,n,iu(e,rs(o)))}catch(s){if(s instanceof DOMException&&s.name==="NotFoundError")continue;throw s}}}var ca=({seal:e})=>lu({seal:e}),da=({open:e})=>lu({open:e});ge(()=>{it.clear(),Ut.clear()});var is="deepview.viewMode",ss="deepview.repoUrls",gm=new Set(["grouped","list","table","kanban","focus"]);function mm(){try{let e=localStorage.getItem(is);return e!==null&&gm.has(e)?e:null}catch{return null}}function pa(e){try{let t=JSON.parse(e||"{}");return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}}function as(){return pa(he(ss))}function He(e){return e?as()[e]??"":""}var ua=new Set;function cu(e){return ua.add(e),()=>{ua.delete(e)}}function bm(e){for(let t of ua)try{t(e)}catch(r){console.warn("repo-url listener:",r)}}function Ve(e,t){if(!e)return;let r=as();t?r[e]=t:delete r[e],ve(ss,JSON.stringify(r)).catch(n=>console.warn("saveRepoUrlFor:",n)),Hi(ss,n=>{let o=pa(n);return t?o[e]=t:delete o[e],JSON.stringify(o)}).catch(n=>console.warn("saveRepoUrlFor cross-tab merge:",n)),bm(e)}async function du(e,t){await Hi(ss,r=>{let n=pa(r),o=t==="replace"?{...e}:t==="prefer-imported"?{...n,...e}:{...e,...n};return JSON.stringify(o)}),uu()}var a=Nd({reports:[],workspaceMerges:[],currentFile:null,currentWorkspace:null,currentView:"findings",bundles:[],selectedBundle:null,bundleDetails:null,bundleDetailsTab:"overview",selectedPackage:null,selectedPackageVersion:null,packageDetailsTab:"overview",packageSlideTriage:null,packageSlideTransient:!1,packagesSearchQuery:"",packagesSortBy:"findings-desc",expandedPackages:new Set,selectedRepository:null,repositoryDetailsTab:"overview",repositorySlideTriage:null,repositorySlideTransient:!1,repositoriesSearchQuery:"",repositoriesSortBy:"findings-desc",bundleSourceFile:null,bundleSourceFindingIdx:null,bundleCodeSearchMode:"files",bundleCodeSearchQuery:"",filterSeverities:new Set,filterColors:new Set,filterSources:new Set,filterAnalyzer:"",filterRepo:"",filterConfMin:0,filterConfMax:10,filterInclude:"",repoUrl:"",repoEditing:!1,sortBy:"severity",viewMode:mm()??"table",triage:new Map,shownTriage:null,nextFindingId:0,activeTabByGroup:new Map,tableSelectedGid:null,filesViewMode:"table",filesSearch:"",filesSelectedFile:null,kanbanPopoverGid:null,focusGid:null,focusCodeTick:0});function uu(){a.repoEditing||a.currentFile&&(a.repoUrl=He(a.currentFile))}Fr(()=>{uu()});var ym=/^## ([A-Z][A-Z_]*)\s*\(\d+\)\s*$/mu;function wm(e){switch(e.toUpperCase()){case"CRITICAL":return"critical";case"HIGH":return"high";case"MEDIUM":return"medium";case"LOW":return"low";case"HIGH_BUG":return"high_bug";case"BUG":return"bug";case"INFO":case"INFORMATIONAL":return"informational";default:return"medium"}}function vm(e){if(e)switch(e.toLowerCase()){case"high":return 8;case"medium":return 5;case"low":return 2;default:return}}function km(e){return typeof e=="string"?e.replace(/^`(.*)`$/u,"$1"):e}function Ur(e){let t=e.replaceAll(/\r\n?/gu,`
4
+ `).trim();if(!ym.test(t))return null;let r=t.split(/^## ([A-Z][A-Z_]*)\s*\(\d+\)\s*\n/mu),n=[];for(let o=1;o<r.length;o+=2){let s=wm(r[o]),l=(r[o+1]||"").split(/^### /mu).slice(1);for(let d of l){let u=$m(d,s);u&&n.push(u)}}return n.length===0?null:{type:"security",source:"deepsec",findings:n}}function $m(e,t){let r=e.indexOf(`
5
5
  `),n=(r===-1?e:e.slice(0,r)).trim();if(!n)return null;let o=r===-1?"":e.slice(r+1);o=o.replace(/\n---\s*$/u,"").trim();let s={};for(let y of o.matchAll(/^- \*\*([^:*]+):\*\*\s*(.+)$/gmu))s[y[1].trim().toLowerCase()]=y[2].trim();let i=/^\*\*Recommendation:\*\*\s*/mu.exec(o),l=o,d="";i&&(l=o.slice(0,i.index),d=o.slice(i.index+i[0].length).trim());let u=l.split(`
6
6
  `).filter(y=>!/^\s*- \*\*/u.test(y)).join(`
7
- `).replaceAll("**","").trim(),f=n+(u?`
7
+ `).replaceAll("**","").trim(),p=n+(u?`
8
8
 
9
- `+u:""),p=Vg(s.file||"unknown"),h=(s.lines||"").split(",").map(y=>y.trim()).find(Boolean)||"?",b={file:p,line:h,severity:t,description:f};d&&(b.recommendation=d.replaceAll("**",""));let m=Hg(s.confidence);return m!==void 0&&(b.confidence=m),s.slug&&(b.slug=s.slug),b}var Kg=new Set(["critical","high","medium","low","high_bug","bug","informational"]);function Nr(e){let t=e.replaceAll(/\r\n?/gu,`
10
- `).trim();if(!t.startsWith("# "))return null;let r=t.split(/^# /mu).filter(s=>s.trim().length>0),n=[];for(let s of r){let i=qg(s);i&&n.push(i)}return n.length===0?null:{type:n.find(s=>s.type)?.type||"analysis",source:"claude-security",findings:n}}function qg(e){let t=e.indexOf(`
11
- `),r=(t===-1?e:e.slice(0,t)).trim();if(!r)return null;let n=t===-1?"":e.slice(t+1),{sectionsText:o,metaText:s}=Gg(n),i=Yg(o),l=Jg(s),{file:d,line:u,locationLink:f}=Xg(i.location||""),p=(l.severity||"").toLowerCase(),h=Kg.has(p)?p:"medium",b=Qg(r,i),m=i["recommended fix"]?zd(i["recommended fix"]):void 0,y={file:d||"unknown",line:u,severity:h,description:b};return f&&(y.location=f),m&&(y.recommendation=m),l.repository&&(y.repo={github:l.repository}),l.branch&&(y.branch=l.branch),l["date created"]&&(y.dateCreated=l["date created"]),l.status&&(y.status=l.status),l.category&&(y.type=l.category.toLowerCase()),y}function Gg(e){let t=/^---\s*$/mu,r=t.exec(e);if(!r)return{sectionsText:e,metaText:""};let n=e.slice(0,r.index).trim(),o=e.slice(r.index+r[0].length).replace(/^\n/u,""),s=t.exec(o),i=s?o.slice(0,s.index):o;return{sectionsText:n,metaText:i}}function Yg(e){let t={},r=e.split(/^## /mu);for(let n=1;n<r.length;n++){let o=r[n],s=o.indexOf(`
12
- `),i=(s===-1?o:o.slice(0,s)).trim().toLowerCase(),l=(s===-1?"":o.slice(s+1)).trim();i&&(t[i]=l)}return t}function Jg(e){let t={};for(let r of e.matchAll(/\*\*([^:]+):\*\*\s*(.+)/gu))t[r[1].trim().toLowerCase()]=r[2].trim();return t}function Xg(e){let t="",r="?",n="",o=e.match(/\[([^\]]+)\]\(([^)]+)\)/u);if(o){t=o[1].trim(),n=o[2];let i=o[2].match(/#L(\d+)/u);i&&(r=i[1])}else t=e.trim(),n=e.trim();let s=t.match(/^(.+):(\d+)$/u);return s&&(t=s[1],r==="?"&&(r=s[2])),{file:t,line:r,locationLink:n}}function Qg(e,t){let r=[e];return t.details&&r.push(t.details),t.impact&&r.push(`Impact: ${t.impact}`),t["reproduction steps"]&&r.push(`Reproduction: ${t["reproduction steps"]}`),zd(r.join(`
9
+ `+u:""),f=km(s.file||"unknown"),h=(s.lines||"").split(",").map(y=>y.trim()).find(Boolean)||"?",b={file:f,line:h,severity:t,description:p};d&&(b.recommendation=d.replaceAll("**",""));let m=vm(s.confidence);return m!==void 0&&(b.confidence=m),s.slug&&(b.slug=s.slug),b}var xm=new Set(["critical","high","medium","low","high_bug","bug","informational"]);function zr(e){let t=e.replaceAll(/\r\n?/gu,`
10
+ `).trim();if(!t.startsWith("# "))return null;let r=t.split(/^# /mu).filter(s=>s.trim().length>0),n=[];for(let s of r){let i=_m(s);i&&n.push(i)}return n.length===0?null:{type:n.find(s=>s.type)?.type||"analysis",source:"claude-security",findings:n}}function _m(e){let t=e.indexOf(`
11
+ `),r=(t===-1?e:e.slice(0,t)).trim();if(!r)return null;let n=t===-1?"":e.slice(t+1),{sectionsText:o,metaText:s}=Sm(n),i=Cm(o),l=Em(s),{file:d,line:u,locationLink:p}=Am(i.location||""),f=(l.severity||"").toLowerCase(),h=xm.has(f)?f:"medium",b=Tm(r,i),m=i["recommended fix"]?pu(i["recommended fix"]):void 0,y={file:d||"unknown",line:u,severity:h,description:b};return p&&(y.location=p),m&&(y.recommendation=m),l.repository&&(y.repo={github:l.repository}),l.branch&&(y.branch=l.branch),l["date created"]&&(y.dateCreated=l["date created"]),l.status&&(y.status=l.status),l.category&&(y.type=l.category.toLowerCase()),y}function Sm(e){let t=/^---\s*$/mu,r=t.exec(e);if(!r)return{sectionsText:e,metaText:""};let n=e.slice(0,r.index).trim(),o=e.slice(r.index+r[0].length).replace(/^\n/u,""),s=t.exec(o),i=s?o.slice(0,s.index):o;return{sectionsText:n,metaText:i}}function Cm(e){let t={},r=e.split(/^## /mu);for(let n=1;n<r.length;n++){let o=r[n],s=o.indexOf(`
12
+ `),i=(s===-1?o:o.slice(0,s)).trim().toLowerCase(),l=(s===-1?"":o.slice(s+1)).trim();i&&(t[i]=l)}return t}function Em(e){let t={};for(let r of e.matchAll(/\*\*([^:]+):\*\*\s*(.+)/gu))t[r[1].trim().toLowerCase()]=r[2].trim();return t}function Am(e){let t="",r="?",n="",o=e.match(/\[([^\]]+)\]\(([^)]+)\)/u);if(o){t=o[1].trim(),n=o[2];let i=o[2].match(/#L(\d+)/u);i&&(r=i[1])}else t=e.trim(),n=e.trim();let s=t.match(/^(.+):(\d+)$/u);return s&&(t=s[1],r==="?"&&(r=s[2])),{file:t,line:r,locationLink:n}}function Tm(e,t){let r=[e];return t.details&&r.push(t.details),t.impact&&r.push(`Impact: ${t.impact}`),t["reproduction steps"]&&r.push(`Reproduction: ${t["reproduction steps"]}`),pu(r.join(`
13
13
 
14
- `))}function zd(e){return e.replaceAll("**","")}function Zg(e){return Array.from(e,t=>t.toString(16).padStart(2,"0")).join("")}function em(e){let t="";for(let r=0;r<e.length;r++)t+=String.fromCodePoint(e[r]);return btoa(t)}async function Wd(e){let t=typeof e=="string"?q(e):e,r=await crypto.subtle.digest("SHA-512",t);return`sha512-${em(new Uint8Array(r))}`}async function tm(e){let t=q(JSON.stringify(e)),r=await crypto.subtle.digest("SHA-256",t),n=new Uint8Array(r,0,16);n[6]=n[6]&15|64,n[8]=n[8]&63|128;let o=Zg(n);return`${o.slice(0,8)}-${o.slice(8,12)}-${o.slice(12,16)}-${o.slice(16,20)}-${o.slice(20,32)}`}async function ss(e){if(typeof crypto?.subtle?.digest!="function")return null;let t;e.fileHash?t={severity:e.severity,description:e.description,fileHash:e.fileHash}:e.location?t={severity:e.severity,description:e.description,location:e.location}:t={severity:e.severity,description:e.description,file:e.file,line:e.line};try{return await tm(t)}catch{return null}}function Nt(e){try{return JSON.parse(e)}catch{return Dr(e)??Nr(e)}}function Ut(e){let t=[];for(let r of e){let n=Array.isArray(r)?r:[r];for(let o of n)o&&t.push(o)}return t}async function Ur(e){let t=e.filter(n=>n&&!n.id);if(t.length===0)return;let r=await Promise.all(t.map(ss));t.forEach((n,o)=>{r[o]&&(n.id=r[o])})}var zr=new Map,Wr=new Map,Hr=new Map,is=new Map;function Vd(e){if(typeof e?.package?.npm?.name=="string"&&e.package.npm.name)return e.package.npm.name;if(!e?.file)return null;let t=/(?:^|\/)(?:node_modules|dependencies)\/(@[^/]+\/[^/]+|[^/]+)/gu,r;for(;(r=t.exec(e.file))!==null;)if(r[1]!==".pnpm")return r[1];return null}function rm(e,t){return typeof e.repo?.github=="string"&&e.repo.github?e.repo.github:typeof e._repoFallback=="string"&&e._repoFallback?e._repoFallback:typeof t=="string"&&t?t:null}var Rn=new Set,da=new Set,Fn=null;function ua(e){return da.add(e),()=>da.delete(e)}function jd(){for(let e of da)try{e()}catch{}}function as(e){return zr.get(e)?.list??[]}function mt(){return Wr}function pr(){return Hr}function Mn(e,t){let r=zr.get(e);if(!r)return[];let n=r.reports.get(zt(t));return n?[...n]:[]}function pa(e,t){let r=Wr.get(e);if(!r)return[];let n=r._keyReports.get(zt(t));return n?[...n]:[]}function fa(e,t){let r=Hr.get(e);if(!r)return[];let n=r._keyReports.get(zt(t));return n?[...n]:[]}var Hd=["type","model","think","effort","exportsMode"];function nm(e,t){if(!Hd.some(r=>e[r]!==void 0))for(let r of Hd)t[r]!==void 0&&(e[r]=t[r])}function om(e){let t=Array.isArray(e?.findings)?e.findings:Array.isArray(e?.groups)?e.groups:null;if(!t)return[];let r=!e?.source,n=[];for(let o of Ut(t))r&&nm(o,e),n.push(o);return n}function zt(e){return e.id?`id:${e.id}`:`c:${e.severity??""}|${e.description??""}|${e.file??""}|${e.line??""}`}function ha(e,t,r){let n=is.get(e);n||(n={hash:[],pkg:[],repo:[]},is.set(e,n)),n[t].push(r)}function sm(e,t,r){let n=zr.get(e.fileHash);n||(n={keys:new Set,list:[],reports:new Map},zr.set(e.fileHash,n));let o=n.reports.get(t);o||(o=new Set,n.reports.set(t,o));let s=!o.has(r);return o.add(r),s&&ha(r,"hash",{hash:e.fileHash,key:t}),n.keys.has(t)?s:(n.keys.add(t),n.list.push(e),!0)}function im(e,t,r){let n=Vd(e);if(!n)return!1;let o=bd(e),s=Wr.get(n);s||(s={...Wo(),repos:new Set,byVersion:new Map},Wr.set(n,s)),typeof e.repo?.github=="string"&&e.repo.github&&s.repos.add(e.repo.github),yd(s,o,e,t,r);let i=Ho(s,t,r,e);return i&&ha(r,"pkg",{pkg:n,key:t,file:e.file,version:o}),i}function am(e,t,r,n){if(Vd(e)!==null)return!1;let o=rm(e,n);if(!o)return!1;let s=Hr.get(o);s||(s=Wo(),Hr.set(o,s));let i=Ho(s,t,r,e);return i&&ha(r,"repo",{repo:o,key:t,file:e.file}),i}function Kd(e){let t=is.get(e);if(is.delete(e),Rn.delete(e),!t)return!1;let r=!1;for(let{hash:n,key:o}of t.hash){let s=zr.get(n);if(!s)continue;let i=s.reports.get(o);if(i){if(i.delete(e)&&(r=!0),i.size===0){s.reports.delete(o),s.keys.delete(o);let l=s.list.findIndex(d=>zt(d)===o);l>=0&&s.list.splice(l,1)}s.keys.size===0&&zr.delete(n)}}for(let{pkg:n,key:o,file:s,version:i}of t.pkg){let l=Wr.get(n);if(!l)continue;let d=l._keyReports.get(o);d&&(d.delete(e)&&(r=!0),d.size===0&&Vo(l,o,s,zt),wd(l,i,o,s,e,zt),l._keyReports.size===0?Wr.delete(n):jo(l))}for(let{repo:n,key:o,file:s}of t.repo){let i=Hr.get(n);if(!i)continue;let l=i._keyReports.get(o);l&&(l.delete(e)&&(r=!0),l.size===0&&Vo(i,o,s,zt),i._keyReports.size===0?Hr.delete(n):jo(i))}return r}async function lm(e){if(Rn.has(e))return!1;Rn.add(e);try{let t=await Re(e),r=Nt(t);if(!r)return!1;let n=om(r);if(n.length===0)return!1;let o="";try{o=We(e)}catch{}let s=!1;for(let i of n){let l=zt(i);i.fileHash&&sm(i,l,e)&&(s=!0),i.file&&im(i,l,e)&&(s=!0),i.file&&am(i,l,e,o)&&(s=!0)}return Rn.has(e)?s:(Kd(e),!1)}catch{return Rn.delete(e),!1}}function Ct(){return Fn||(Fn=(async()=>{try{let e=await ae();for(let t of e)await lm(t)&&jd()}finally{Fn=null}})(),Fn)}Rd(e=>{Kd(e)&&jd()});var Ln=new Map,Pn=new Map;function ls(e,t){if(!e||!t)return!1;let r=!Pn.has(e);Pn.set(e,t);for(let[n,o]of t){if(!o)continue;let s=Ln.get(o);s||(s=new Map,Ln.set(o,s)),s.set(e,n)}return r}function ga(e){let t=Pn.get(e);if(Pn.delete(e),!!t)for(let r of t.values()){let n=Ln.get(r);n&&(n.delete(e),n.size===0&&Ln.delete(r))}}function On(e){if(!e)return[];let t=Ln.get(e);if(!t)return[];let r=[];for(let[n,o]of t)r.push({integrity:n,file:o});return r}function ma(e){return Pn.has(e)}var qd="deepview.fileCounts",jr=null;function ds(){if(jr)return jr;try{jr=JSON.parse(fe(qd)||"{}")}catch{jr={}}return jr}function ba(){we(qd,JSON.stringify(jr)).catch(e=>console.warn("counts persist:",e))}function Gd(e){let t=ds()[e];if(t!==void 0)return typeof t=="number"?{count:t}:t}function Nn(e){return Gd(e)?.count}function Un(e){return Gd(e)?.source}function Ve(e,t,r){let n=ds();n[e]=r?{count:t,source:r}:{count:t},ba()}function Kr(e){let t=ds();delete t[e],ba()}function Oe(e){try{let n=JSON.parse(e);if(n&&Array.isArray(n.findings))return{count:n.findings.length,source:n.source,recognized:!0}}catch{}let t=Dr(e);if(t)return{count:t.findings.length,source:t.source,recognized:!0};let r=Nr(e);return r?{count:r.findings.length,source:r.source,recognized:!0}:{count:0,recognized:!1}}var Dn=null,Vr=null,cs=null;function cm(e,t){for(let{names:r,onUpdate:n}of cs)if(r.has(e))try{n(e,t)}catch(o){console.warn("ensureCounts onUpdate:",o)}}function ya(e,t){if(Dn){t&&cs.push({names:new Set(e),onUpdate:t});for(let r of e)Vr.add(r);return Dn}return Vr=new Set(e),cs=t?[{names:new Set(e),onUpdate:t}]:[],Dn=(async()=>{await Promise.resolve();try{let r=ds();for(;Vr.size>0;){let n=Vr.values().next().value;if(Vr.delete(n),r[n]===void 0)try{let o=await Re(n),{count:s,source:i}=Oe(o);r[n]=i?{count:s,source:i}:{count:s},ba(),cm(n,s)}catch{}}}finally{Dn=null,Vr=null,cs=null}})(),Dn}function wa(e){if(!e)return"";for(let t of e.split(`
15
- `))if(t.trim())return t.trim();return""}function va(e){let t=new Set(e.map(n=>n.id)),r=new Map;for(let n of a.reports)for(let o of n.groups)for(let s of o){let i=s.id??String(s._id);!t.has(i)||r.has(i)||r.set(i,{severity:s.severity,file:s.file,line:s.line,description:wa(s.description)})}return r}var dm=`deepview/workspace-id/v1
16
- `;async function zn(e){let t=Uint8Array.fromBase64(e),r=q(dm),n=new Uint8Array(r.length+t.length);n.set(r,0),n.set(t,r.length);let o=new Uint8Array(await crypto.subtle.digest("SHA-256",n)),i=Array.from(o.subarray(0,16),u=>u.toString(16).padStart(2,"0")).join("").split("");i[12]="8";let l=parseInt(i[16],16)&3|8;i[16]=l.toString(16);let d=i.join("");return`${d.slice(0,8)}-${d.slice(8,12)}-${d.slice(12,16)}-${d.slice(16,20)}-${d.slice(20,32)}`}function Wn(e){let t=new Set;function r(o){return t.add(o),()=>t.delete(o)}function n(o){for(let s of t)try{s(o)}catch(i){console.warn(`workspace ${e} listener failed:`,i)}}return{on:r,fire:n}}var Yd=Wn("create"),Jd=Wn("delete"),Xd=Wn("privateKey"),Qd=Wn("report-membership"),Zd=Wn("bundle-membership"),um=Yd.on,ka=Jd.on,$a=Xd.on,xa=Qd.on,_a=Zd.on,us=Yd.fire,Sa=Jd.fire,Ca=Xd.fire,ps=Qd.fire,fs=Zd.fire;var Ta="deepview.workspaces",pm=1;function Hn(){try{let e=fe(Ta);if(!e)return[];let t=JSON.parse(e);return t&&typeof t=="object"&&Array.isArray(t.workspaces)?t.workspaces:Array.isArray(t)?t:[]}catch{return[]}}async function fm(e){await we(Ta,JSON.stringify({version:pm,workspaces:e}))}var hm=Ta;function qr(e){return navigator.locks.request(hm,async()=>{let t=Hn(),r=await e(t);if(r!==!1)return await fm(t),r})}function Vn(e){return{id:e.id,privateKey:e.privateKey,reports:Array.isArray(e.reports)?[...e.reports]:[],bundles:Array.isArray(e.bundles)?[...e.bundles]:[]}}var ct=Hn().map(Vn);function Aa(){ct=Hn().map(Vn)}function Ia(e){ct=ct.filter(t=>t.id!==e.id),ct.push(Vn(e))}function gm(e,t){let r=Array.isArray(e[t])?[...e[t]]:[],n=ct.find(o=>o.id===e.id);if(n){n[t]=r;return}ct.push(Vn(e))}function mm(e){ct=ct.filter(t=>t.id!==e)}function U(){let e=Hn();for(let t of e)Array.isArray(t.reports)||(t.reports=[]),Array.isArray(t.bundles)||(t.bundles=[]);return e}var bm=200;function bt(e){let t=(e??"").trim();return t&&t.replaceAll(/[\u0000-\u001F\u007F]/gu,"").slice(0,bm)||null}async function Ba(e){let t=bt(e);if(!t)return null;let r=new Uint8Array(32);crypto.getRandomValues(r);let n=r.toBase64(),o={id:await zn(n),name:t,privateKey:n,reports:[],bundles:[],createdAt:Date.now()};return await qr(i=>i.some(l=>l.id===o.id)?!1:(i.push(o),o))?(Ia(o),o):null}async function Fa(e){await qr(r=>{let n=r.findIndex(o=>o.id===e);return n<0?!1:(r.splice(n,1),!0)})&&(Sa(e),mm(e))}async function Ra(e,t){let r=bt(t);return!(!r||!await qr(o=>{let s=o.find(i=>i.id===e);return!s||s.name===r?!1:(s.name=r,s)}))}async function eu(e){let t=await qr(o=>{let s=o.findIndex(f=>f.id===e.id),i=s>=0?o[s]:null,l=bt(e.name)??i?.name??"Workspace",d=e.preserveBundles?Array.isArray(i?.bundles)?i.bundles:[]:Array.isArray(e.bundles)?e.bundles:[],u={id:e.id,name:l,privateKey:e.privateKey,reports:Array.isArray(e.reports)?[...new Set(e.reports)]:[],bundles:[...new Set(d)],createdAt:e.createdAt??Date.now()};return s>=0?o[s]=u:o.push(u),{previous:i,next:u}}),{next:r}=t,n=ct.find(o=>o.id===r.id)??null;return n==null?us(r.id):(n.privateKey!==r.privateKey&&Ca(r.id),hs(n.reports,r.reports)||ps(r.id),hs(n.bundles,r.bundles)||fs(r.id)),Ia(r),r}async function Ma({id:e,name:t,privateKey:r,createdAt:n}){let o=null;return await qr(s=>{let i=bt(t);if(!i)return o={status:"name-collision",existing:null},!1;let l=s.find(f=>f.id===e)??null;if(l)return o={status:"already-attached",workspace:l},!1;let d=s.find(f=>bt(f.name)===i)??null;if(d)return o={status:"name-collision",existing:d},!1;let u={id:e,name:i,privateKey:r,reports:[],bundles:[],createdAt:n??Date.now()};s.push(u),o={status:"attached",workspace:u}}),o?.status==="attached"&&(us(o.workspace.id),Ia(o.workspace)),o}function hs(e,t){let r=new Set(e),n=new Set(t);if(r.size!==n.size)return!1;for(let o of r)if(!n.has(o))return!1;return!0}async function Ea({identifier:e,workspaceId:t,field:r,fire:n,additive:o=!1,from:s=void 0}){let i=await qr(u=>{if((u.find(m=>Array.isArray(m[r])&&m[r].includes(e))?.id??null)===(t??null))return!1;let p=null;if(t!=null&&(p=u.find(m=>m.id===t)??null,!p))return!1;let h=new Set;if(!o)for(let m of u)s!==void 0&&m.id!==s||(Array.isArray(m[r])||(m[r]=[]),m[r].includes(e)&&(m[r]=m[r].filter(y=>y!==e),h.add(m.id)));if(p&&(Array.isArray(p[r])||(p[r]=[]),p[r].includes(e)||(p[r].push(e),h.add(p.id))),h.size===0)return!1;let b=new Map;for(let m of h){let y=u.find(v=>v.id===m);y&&b.set(m,y)}return{affected:h,snapshot:b}});if(!i)return;let{affected:l,snapshot:d}=i;for(let u of l){n(u);let f=d.get(u);f&&gm(f,r)}}function tu(e,t){return{move:(r,n)=>Ea({identifier:r,workspaceId:n,field:e,fire:t}),add:(r,n)=>Ea({identifier:r,workspaceId:n,field:e,fire:t,additive:!0}),remove:(r,n)=>Ea({identifier:r,field:e,fire:t,from:n})}}var La=tu("reports",ps),Pa=tu("bundles",fs),Wt=La.move,fr=La.add,Oa=La.remove,Da=Pa.move,hr=Pa.add,Na=Pa.remove;function ym(){let e=Hn().map(Vn),t=ct,r=new Map(t.map(o=>[o.id,o])),n=new Map(e.map(o=>[o.id,o]));for(let o of r.keys())n.has(o)||Sa(o);for(let[o,s]of n){let i=r.get(o);if(!i){us(o);continue}i.privateKey!==s.privateKey&&Ca(o),hs(i.reports,s.reports)||ps(o),hs(i.bundles,s.bundles)||fs(o)}ct=e}Br(()=>{ym()});function ru(e){return e==="fixed"||e==="invalid"||e==="deleted"?e:void 0}function de(e){if(e)return ru(e.triage)??(e.deleted?"deleted":void 0)}function wm(e){return e?!e.color&&!de(e)&&!e.comment&&!e.fix&&!(e.ignoredReports&&e.ignoredReports.length>0):!0}function Et(e,t,r){let n=e.get(t)?.ignoredReports;return Array.isArray(n)&&n.includes(r)}function jn(e){if(!e||typeof e!="object")return;let t=e,r={};typeof t.color=="string"&&t.color&&(r.color=t.color);let n=ru(t.triage)??(t.deleted?"deleted":void 0);if(n&&(r.triage=n),typeof t.comment=="string"&&t.comment&&(r.comment=t.comment),typeof t.fix=="string"&&t.fix&&(r.fix=t.fix),Array.isArray(t.ignoredReports)){let o=t.ignoredReports.filter(s=>typeof s=="string"&&s.length>0);o.length>0&&(r.ignoredReports=o)}return wm(r)?void 0:r}function vm(e,t){let r=e??[],n=t??[];if(r.length!==n.length)return!1;if(r.length===0)return!0;let o=new Set(r);for(let s of n)if(!o.has(s))return!1;return!0}function km(e,t){let r=e??{},n=t??{};return(r.color??"")===(n.color??"")&&(de(r)??"")===(de(n)??"")&&(r.comment??"")===(n.comment??"")&&(r.fix??"")===(n.fix??"")&&vm(r.ignoredReports,n.ignoredReports)}function F(e,t,r){let n=e.get(t),o=jn({...n,...r});return o===void 0?e.delete(t):km(n,o)?!1:(e.set(t,o),!0)}function ne(e,t,r,n){let o=new Set(e.get(t)?.ignoredReports??[]);return n?o.add(r):o.delete(r),F(e,t,{ignoredReports:o.size>0?[...o]:void 0})}var Ua=()=>{};function ou(e){Ua=typeof e=="function"?e:()=>{}}var Ht="deepview.triage",Tt="deepview.triage.pending",yt=/^\d+$/u;async function $m(e){let t=new Blob([e]).stream().pipeThrough(new CompressionStream("deflate"));return new Uint8Array(await new Response(t).arrayBuffer())}async function xm(e){let t=new Blob([e]).stream().pipeThrough(new DecompressionStream("deflate"));return new Uint8Array(await new Response(t).arrayBuffer())}var _m="deepview.triage.save",nu=0;function za(){let e={};for(let[t,r]of a.triage){if(yt.test(t))continue;let n=jn(r);n&&(e[t]=n)}return e}function oe(){let e=++nu,t=za(),r=Object.keys(t).length===0,n=r?null:JSON.stringify(t);if(n!=null)try{localStorage.setItem(Tt,n)}catch{}return navigator.locks.request(ot,{mode:"shared"},async()=>{let o=null,s=null;if(n!=null)try{let i=q(n),l=await $m(i);s=ve(),o=(s?await Td(l):l).toBase64()}catch(i){console.warn("Failed to save triage:",i),Ua();return}await navigator.locks.request(_m,()=>{try{if(e!==nu)return;if(n!=null&&ve()!==s){queueMicrotask(()=>{oe()});return}if(r)localStorage.removeItem(Ht),localStorage.removeItem(Tt);else{localStorage.setItem(Ht,o);try{localStorage.removeItem(Tt)}catch{}}}catch(i){console.warn("Failed to save triage:",i)}}),Ua()})}async function su(){let e=localStorage.getItem(Tt);if(e)try{return JSON.parse(e)}catch{}let t=localStorage.getItem(Ht);if(!t)return null;let r=Uint8Array.fromBase64(t);if(Le(r)){if(!ve())throw new Error("triage: vault locked, cannot decrypt envelope");r=await Ad(r)}let n=await xm(r);return JSON.parse(ce(n))}function iu(e,{replace:t=!1}={}){let r=a.triage;if(t){let n=null,o=localStorage.getItem(Tt);if(o)try{n=JSON.parse(o)}catch{}let s=i=>n!=null&&i in n;for(let i of[...r.keys()]){if(yt.test(i))continue;let l=e?.[i],d=!e||!(i in e);!(s(i)&&n[i]?.color)&&(d||!l?.color)&&F(r,i,{color:void 0}),!(s(i)&&(n[i]?.triage||n[i]?.deleted))&&!de(l)&&F(r,i,{triage:void 0}),!(s(i)&&n[i]?.comment)&&(d||typeof l?.comment!="string"||!l.comment)&&F(r,i,{comment:void 0}),!(s(i)&&n[i]?.fix)&&(d||typeof l?.fix!="string"||!l.fix)&&F(r,i,{fix:void 0})}for(let i of[...r.keys()]){if(yt.test(i))continue;let l=r.get(i)?.ignoredReports;if(!l||l.length===0)continue;let d=e?.[i],u=!!de(d);for(let f of[...l]){if(s(i)&&Array.isArray(n[i]?.ignoredReports)&&n[i].ignoredReports.includes(f))continue;if(u){ne(r,i,f,!1);continue}let p=d?.ignoredReports;(!Array.isArray(p)||!p.includes(f))&&ne(r,i,f,!1)}}}if(e)for(let[n,o]of Object.entries(e)){let s=de(o),i={};if(o&&o.color&&(i.color=o.color),s&&(i.triage=s),o&&typeof o.comment=="string"&&o.comment&&(i.comment=o.comment),o&&typeof o.fix=="string"&&o.fix&&(i.fix=o.fix),Object.keys(i).length>0&&F(r,n,i),!s&&o&&Array.isArray(o.ignoredReports)){let l=new Set(r.get(n)?.ignoredReports??[]),d=!1;for(let u of o.ignoredReports)typeof u=="string"&&!l.has(u)&&(l.add(u),d=!0);d&&F(r,n,{ignoredReports:[...l]})}}}async function Sm(){try{let e=await su();iu(e)}catch(e){console.warn("Failed to load triage:",e)}}async function au(){try{let e=await su();iu(e,{replace:!0})}catch(e){console.warn("Failed to reload triage:",e)}}typeof window<"u"&&window.addEventListener("storage",e=>{e.key!==Ht&&e.key!==Tt||au()});var Kn=Sm();he(()=>{au()});he(()=>{ve()&&localStorage.getItem(Tt)&&oe()});async function Wa({seal:e}){try{localStorage.removeItem(Tt)}catch{}let t=localStorage.getItem(Ht);if(!t)return;let r=Uint8Array.fromBase64(t);if(Le(r))return;let n=await e(r,_n());localStorage.setItem(Ht,n.toBase64())}async function Ha({open:e}){try{localStorage.removeItem(Tt)}catch{}let t=localStorage.getItem(Ht);if(!t)return;let r=Uint8Array.fromBase64(t);if(!Le(r))return;let n=await e(r,_n());localStorage.setItem(Ht,n.toBase64())}var lu="deepview.lastFile",qn=null;function Va(){return qn||(qn=Cm(),qn.catch(()=>{qn=null})),qn}async function Cm(){try{await Kn}catch{}let e=await ae(),t=new Set(e),r=new Set(e),n=new Set;for(let o of e){if(!o.toLowerCase().endsWith(".deepseek"))continue;let s=o.slice(0,-9)+".md";if(t.has(s))continue;let i;try{i=await Re(o),await at(s,i),await Or(o)}catch(f){console.warn(`migrate: failed to rename ${o} -> ${s}`,f);continue}t.delete(o),t.add(s),n.add(o);let l=Nn(o);if(Kr(o),l===void 0){let{count:f,source:p}=Oe(i);Ve(s,f,p)}else{let{source:f}=Oe(i);Ve(s,l,f)}let d=We(o);d&&(He(o,""),He(s,d));let u=!1;for(let[f,p]of[...a.triage])p.ignoredReports?.includes(o)&&(ne(a.triage,f,o,!1),ne(a.triage,f,s,!0),u=!0);if(u&&await oe(),fe(lu)===o)try{await we(lu,s)}catch{}}for(let o of U())for(let s of o.reports){if(!s.toLowerCase().endsWith(".deepseek")||!n.has(s)&&r.has(s))continue;let i=s.slice(0,-9)+".md";await Wt(s,null),await Wt(i,o.id)}}var ja=1;function Em(){let e=za(),t=os();return{version:ja,exportedAt:new Date().toISOString(),triage:e,repoUrls:t}}function Tm(){return`deepview-triage-${new Date().toISOString().replaceAll(/[:.]/gu,"-").slice(0,19)}.json.gz`}async function Ka(){let e=Em();return{blob:new Blob([await Ko(JSON.stringify(e))]),filename:Tm()}}async function qa(e){let t;try{t=await bn(new Uint8Array(await e.arrayBuffer()))}catch(n){throw new Error(`Failed to gunzip: ${n.message}`,{cause:n})}let r;try{r=JSON.parse(t)}catch(n){throw new Error(`Failed to parse JSON: ${n.message}`,{cause:n})}if(!r||typeof r!="object")throw new Error("Invalid backup file (not an object)");if(r.version!==ja)throw new Error(`Unsupported backup version: ${r.version} (expected ${ja})`);if(!r.triage||typeof r.triage!="object")throw new Error("Backup is missing the `triage` map");if(!r.repoUrls||typeof r.repoUrls!="object")throw new Error("Backup is missing the `repoUrls` map");return r}async function Ga(e,t){if(!["replace","prefer-imported","prefer-current"].includes(t))throw new Error(`Unknown merge mode: ${t}`);if(!e||typeof e!="object")throw new Error("Invalid payload: not an object");if(!e.triage||typeof e.triage!="object"||Array.isArray(e.triage))throw new Error("Invalid payload: missing or non-object `triage`");if(!e.repoUrls||typeof e.repoUrls!="object"||Array.isArray(e.repoUrls))throw new Error("Invalid payload: missing or non-object `repoUrls`");let r=e.triage,n=a.triage;if(t==="replace")for(let l of[...n.keys()])yt.test(l)||n.delete(l);let o=t==="prefer-current";for(let[l,d]of Object.entries(r)){if(yt.test(l)||!d||typeof d!="object")continue;typeof d.color=="string"&&d.color&&(!o||!n.get(l)?.color)&&F(n,l,{color:d.color});let u=de(d);if(u&&(!o||!de(n.get(l)))&&F(n,l,{triage:u}),typeof d.comment=="string"&&d.comment&&(!o||!n.get(l)?.comment)&&F(n,l,{comment:d.comment}),typeof d.fix=="string"&&d.fix&&(!o||!n.get(l)?.fix)&&F(n,l,{fix:d.fix}),Array.isArray(d.ignoredReports)&&!de(n.get(l)))for(let f of d.ignoredReports)typeof f=="string"&&(o&&Et(n,l,f)||ne(n,l,f,!0))}await oe();let s=0,i=null;try{await Nd(e.repoUrls,t),s=Object.keys(e.repoUrls).length}catch(l){console.warn("applyTriageImport: repo-URL import failed:",l),i=l}return{triageEntries:Object.keys(r).length,repoUrls:s,repoUrlError:i}}function Am(e){return e?.name==="NotFoundError"||typeof e?.message=="string"&&e.message.startsWith("File not found:")}async function Ya(e){let t=new Set;for(let r of e){let n;try{n=await Re(r)}catch(i){if(Am(i))continue;throw new Error(`Failed to read ${r}: ${i.message}`,{cause:i})}if(n==null)continue;let o=Nt(n);if(!o?.findings)continue;let s=Ut(o.findings);await Ur(s);for(let i of s)i.id&&t.add(i.id)}return t}function Im(){let e=new Set;for(let t of a.triage.keys())yt.test(t)||e.add(t);return e}async function gs(e){let t=Im();if(t.size===0)return{orphanedCount:0,sharedCount:0};let r=await Ya(e),n=new Set;for(let f of t)r.has(f)&&n.add(f);if(n.size===0)return{orphanedCount:0,sharedCount:0};let o=await ae(),s=new Set(e),i=o.filter(f=>!s.has(f)),l=await Ya(i),d=0,u=0;for(let f of n)l.has(f)?u++:d++;return{orphanedCount:d,sharedCount:u}}async function ms(){let e=new Set(a.triage.keys()),t=[];for(let[i,l]of a.triage)if(l.ignoredReports)for(let d of l.ignoredReports)t.push({id:i,report:d});let r=await ae(),n=new Set(r),o=await Ya(r),s=!1;for(let i of e){if(yt.test(i)||o.has(i))continue;let l=a.triage.get(i);!l||!(l.color||de(l)||l.comment||l.fix)||F(a.triage,i,{color:void 0,triage:void 0,comment:void 0,fix:void 0})&&(s=!0)}for(let{id:i,report:l}of t)yt.test(i)||o.has(i)&&n.has(l)||Et(a.triage,i,l)&&ne(a.triage,i,l,!1)&&(s=!0);s&&await oe()}var Ja=1,jt=16,cu=12,du=1+jt+cu+16,Vt=1+jt+cu;async function uu(e,t){let r=await crypto.subtle.importKey("raw",q(e),"PBKDF2",!1,["deriveKey"]);return crypto.subtle.deriveKey({name:"PBKDF2",hash:"SHA-256",salt:t,iterations:3e6},r,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}function pu(e){return!(e instanceof Uint8Array)||e.length<du?!1:e[0]===Ja}async function bs(e,t){if(!(e instanceof Uint8Array))throw new TypeError("encryptWithPassword: plaintext Uint8Array required");if(typeof t!="string"||!t)throw new TypeError("encryptWithPassword: password required");let r=new Uint8Array(Vt+e.length+16);r[0]=Ja,crypto.getRandomValues(r.subarray(1,1+jt)),crypto.getRandomValues(r.subarray(1+jt,Vt));let n=r.subarray(1,1+jt),o=r.subarray(1+jt,Vt),s=await uu(t,n),i=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:o,additionalData:r.subarray(0,Vt)},s,e));return r.set(i,Vt),r}async function Fm(e,t){if(typeof t!="string"||!t)throw new TypeError("tryDecryptWithPassword: password required");if(!(e instanceof Uint8Array)||e.length<du)return{ok:!1,reason:"malformed"};if(e[0]!==Ja)return{ok:!1,reason:"malformed"};let r=e.subarray(1,1+jt),n=e.subarray(1+jt,Vt),o=e.subarray(Vt),s=await uu(t,r),i;try{i=new Uint8Array(await crypto.subtle.decrypt({name:"AES-GCM",iv:n,additionalData:e.subarray(0,Vt)},s,o))}catch{return{ok:!1,reason:"wrong-password"}}return{ok:!0,plaintext:i}}async function ys(e,t,r){if(!r||typeof r.malformedMsg!="string"||typeof r.wrongPasswordMsg!="string")throw new TypeError("decryptWithPasswordOrThrow: { malformedMsg, wrongPasswordMsg } strings required");let n=await Fm(e,t);if(n.ok)return n.plaintext;throw n.reason==="wrong-password"?new Error(r.wrongPasswordMsg):new Error(r.malformedMsg)}var Gn=pu,fu=bs;function hu(e,t){return ys(e,t,{malformedMsg:"malformed encrypted bundle",wrongPasswordMsg:"wrong password or corrupt bundle"})}var Rm=1;async function Mm(e){let t=new Set,r=Nt(e);if(!Array.isArray(r?.findings))return t;let n=Ut(r.findings);await Ur(n);for(let o of n)o.id&&t.add(o.id);return t}function gu(e){return(e??"").replaceAll(/[^a-zA-Z0-9._-]+/gu,"_").replaceAll(/^_+|_+$/gu,"")||"workspace"}async function Lm(e){if(!Array.isArray(e)||e.length===0)return[];let t=await lt(),r=new Map(t.map(o=>[o.integrity,o.name])),n=[];for(let o of e){let s=r.get(o);if(!s)continue;let i;try{i=await ur(o)}catch(l){console.warn(`Workspace export: failed to read bundle ${o}: ${l?.message??l}`);continue}n.push({integrity:o,name:s,data:i.toBase64()})}return n}async function Pm(e,{includeBundleBytes:t=!1}={}){let r=[],n=new Set;for(let u of e.reports??[]){let f;try{f=await Re(u)}catch(p){console.warn(`Workspace export: skipping ${u}: ${p?.message??p}`),typeof p?.message=="string"&&p.message.startsWith("File not found:")&&await Wt(u,null);continue}r.push({name:u,content:f});for(let p of await Mm(f))n.add(p)}let o=new Set(e.reports??[]),s={};for(let[u,f]of a.triage){if(!n.has(u))continue;let p=(f.ignoredReports??[]).filter(b=>o.has(b)),h=jn({...f,ignoredReports:p});h&&(s[u]=h)}let i={};for(let u of r){let f=We(u.name);f&&(i[u.name]=f)}let l=(e.bundles??[]).filter(u=>typeof u=="string"&&u.length>0),d={version:Rm,exportedAt:new Date().toISOString(),workspace:{id:e.id,name:e.name,privateKey:e.privateKey,createdAt:e.createdAt},reports:r,bundles:l,repoUrls:i,triage:s};if(t){let u=await Lm(l);u.length>0&&(d.bundleBlobs=u)}return d}async function mu(e,{includeBundleBytes:t=!1}={}){let r=await Pm(e,{includeBundleBytes:t});return{blob:new Blob([await Ko(JSON.stringify(r))]),filename:`${gu(e.name)}.deepview-workspace.json.gz`}}async function Om(e,t,{includeBundleBytes:r=!1}={}){if(typeof t!="string"||!t)throw new TypeError("buildWorkspaceExportEncrypted: password required");let{blob:n}=await mu(e,{includeBundleBytes:r}),o=new Uint8Array(await n.arrayBuffer()),s=await fu(o,t);return{blob:new Blob([s],{type:"application/octet-stream"}),filename:`${gu(e.name)}.deepview-workspace.enc`}}async function Xa(e,{password:t,includeBundleBytes:r=!1}={}){return typeof t=="string"&&t?await Om(e,t,{includeBundleBytes:r}):await mu(e,{includeBundleBytes:r})}var Dm=1,bu=1024,yu=1024,ws=200,$u=100*1024*1024,Nm=Math.ceil($u*4/3)+16,wu=512,vu=64;function Um(e){if(!e||typeof e!="object")return"payload is not an object";if(e.version!==Dm)return`unsupported export version: ${e.version}`;if(!e.workspace||typeof e.workspace!="object")return"workspace metadata missing";if(typeof e.workspace.id!="string")return"workspace.id must be a string";if(typeof e.workspace.name!="string")return"workspace.name must be a string";if(typeof e.workspace.privateKey!="string")return"workspace.privateKey must be a string";if(e.workspace.createdAt!==void 0&&!Number.isFinite(e.workspace.createdAt))return"workspace.createdAt must be a finite number or omitted";if(!Array.isArray(e.reports))return"reports field must be an array";if(e.reports.length>yu)return`reports count (${e.reports.length}) exceeds cap (${yu})`;if(e.bundles!==void 0){if(!Array.isArray(e.bundles))return"bundles field must be an array when present";if(e.bundles.length>bu)return`bundles count (${e.bundles.length}) exceeds cap (${bu})`;for(let t of e.bundles){if(typeof t!="string")return"bundles entries must be strings";if(t.length>ws)return`bundle integrity exceeds per-entry length cap (${ws})`}}if(e.bundleBlobs!==void 0){if(!Array.isArray(e.bundleBlobs))return"bundleBlobs field must be an array when present";if(e.bundleBlobs.length>vu)return`bundleBlobs count (${e.bundleBlobs.length}) exceeds cap (${vu})`;for(let t of e.bundleBlobs){if(!t||typeof t!="object"||Array.isArray(t))return"bundleBlobs entries must be objects";if(typeof t.integrity!="string"||t.integrity.length===0)return"bundleBlobs.integrity must be a non-empty string";if(t.integrity.length>ws)return`bundleBlobs.integrity exceeds per-entry length cap (${ws})`;if(typeof t.name!="string"||t.name.length===0)return"bundleBlobs.name must be a non-empty string";if(t.name.length>wu)return`bundleBlobs.name exceeds per-entry length cap (${wu})`;if(t.name.includes("\0"))return"bundleBlobs.name cannot contain NUL";if(typeof t.data!="string")return"bundleBlobs.data must be a base64 string";if(t.data.length>Nm)return`bundleBlobs.data exceeds per-blob size cap (${$u} bytes raw)`}}return null}async function Qa(e){return new Uint8Array(await e.arrayBuffer())}async function vs(e,t){if(Gn(e)){if(typeof t!="string"||!t)throw new TypeError("parseWorkspaceBundleBytes: password required for encrypted bundle");let n=await hu(e,t);try{return ku(await bn(n))}catch(o){throw new Error("wrong password or corrupt bundle",{cause:o})}}let r;try{r=await bn(e)}catch(n){throw new Error(`gzip decompression failed: ${n.message}`,{cause:n})}return ku(r)}function ku(e){let t;try{t=JSON.parse(e)}catch(o){throw new Error(`payload is not JSON: ${o.message}`,{cause:o})}let r=Um(t);if(r===null)return t;let n=r.includes("exceeds cap");throw new Error(n?r:`not a deepview workspace export: ${r}`)}function zm(e){return de(e)??null}async function Wm(e){let t=new Map;for(let r of e??[]){if(typeof r?.content!="string")continue;let n=Nt(r.content);if(!n?.findings)continue;let o=Ut(n.findings);await Ur(o);for(let s of o)!s.id||t.has(s.id)||t.set(s.id,{severity:s.severity,file:s.file,line:s.line,description:wa(s.description)})}return t}async function Hm(e,t,r){if(!e||typeof e!="object"||Array.isArray(e))return;let n=a.triage,o=[];for(let[s,i]of Object.entries(e)){if(!i||typeof i!="object")continue;let l=n.get(s)?.color,d=typeof i.color=="string"?i.color:void 0;d&&l&&l!==d?o.push({id:s,property:"color",local:l,imported:d}):d&&d!==l&&F(n,s,{color:d});let u=n.get(s)?.comment??"",f=typeof i.comment=="string"?i.comment:"";f&&u&&u!==f?o.push({id:s,property:"comment",local:u,imported:f}):f&&f!==u&&F(n,s,{comment:f});let p=n.get(s)?.fix??"",h=typeof i.fix=="string"?i.fix:"";h&&p&&p!==h?o.push({id:s,property:"fix",local:p,imported:h}):h&&h!==p&&F(n,s,{fix:h});let b=zm(i),m=de(n.get(s))??null;b&&m&&m!==b?o.push({id:s,property:"triage",local:m,imported:b}):b&&!m&&F(n,s,{triage:b});let y=Array.isArray(i.ignoredReports)?i.ignoredReports:[];if(!de(n.get(s)))for(let v of y)typeof v=="string"&&ne(n,s,v,!0)}if(o.length>0&&t){let s=await t(o,r??new Map);s&&Vm(o,s)}await oe()}function Vm(e,t){for(let r of e){let n=`${r.id}:${r.property}`;t[n]==="imported"&&jm(r.id,r.property)===r.local&&(r.property==="color"?F(a.triage,r.id,{color:r.imported}):r.property==="comment"?F(a.triage,r.id,{comment:r.imported}):r.property==="fix"?F(a.triage,r.id,{fix:r.imported}):r.property==="triage"&&F(a.triage,r.id,{triage:r.imported,ignoredReports:void 0}))}}function jm(e,t){if(t==="color")return a.triage.get(e)?.color;if(t==="triage")return de(a.triage.get(e))??null;if(t==="comment")return a.triage.get(e)?.comment??"";if(t==="fix")return a.triage.get(e)?.fix??""}async function Km(e){if(Array.isArray(e))for(let t of e){let r;try{r=Uint8Array.fromBase64(t.data)}catch(n){console.warn(`Workspace import: failed to decode bundle ${t.integrity}: ${n?.message??n}`);continue}try{let n=await dr(t.name,r);n?.integrity!==t.integrity&&console.warn(`Workspace import: bundle ${t.name} integrity mismatch (claimed ${t.integrity}, computed ${n?.integrity})`)}catch(n){console.warn(`Workspace import: failed to save bundle ${t.name}: ${n?.message??n}`)}}}async function Za(e,{conflictResolver:t}={}){let r=[];for(let u of e.reports)if(!(typeof u?.name!="string"||typeof u?.content!="string"))try{await at(u.name,u.content);let{count:f,source:p}=Oe(u.content);Ve(u.name,f,p??Un(u.name)),r.push(u.name)}catch(f){console.warn(`Workspace import: failed to save ${u.name}: ${f.message}`)}Array.isArray(e.bundleBlobs)&&e.bundleBlobs.length>0&&await Km(e.bundleBlobs);let o=e.triage&&Object.keys(e.triage).length>0?await Wm(e.reports):new Map;await Hm(e.triage,t,o);let s=Array.isArray(e.bundles),i=s?e.bundles.filter(u=>typeof u=="string"&&u.length>0):[],l=await eu({id:e.workspace.id,name:e.workspace.name,privateKey:e.workspace.privateKey,reports:r,bundles:s?i:void 0,preserveBundles:!s,createdAt:e.workspace.createdAt}),d=new Set(r);if(e.repoUrls&&typeof e.repoUrls=="object")for(let[u,f]of Object.entries(e.repoUrls))!d.has(u)||typeof f!="string"||!f||We(u)||(He(u,f),a.currentFile===u&&(a.repoUrl=f));return l}async function el({id:e,name:t,privateKeyBase64:r,password:n}){if(typeof e!="string"||!e)throw new TypeError("encodeShareLink: id required");if(typeof t!="string"||!t)throw new TypeError("encodeShareLink: name required");if(typeof r!="string"||!r)throw new TypeError("encodeShareLink: privateKey required");if(typeof n!="string"||!n)throw new TypeError("encodeShareLink: password required");let s=await zn(r)===e?{v:1,n:t,k:r}:{v:1,i:e,n:t,k:r};return(await bs(q(JSON.stringify(s)),n)).toBase64({alphabet:"base64url",omitPadding:!0})}async function tl({encoded:e,password:t}){if(typeof e!="string"||!e)throw new Error("malformed share link");if(typeof t!="string"||!t)throw new TypeError("decodeShareLink: password required");let r;try{r=Uint8Array.fromBase64(e,{alphabet:"base64url"})}catch{throw new Error("malformed share link")}let n=await ys(r,t,{malformedMsg:"malformed share link",wrongPasswordMsg:"wrong password or corrupt link"});try{return await qm(n)}catch(o){throw new Error("wrong password or corrupt link",{cause:o})}}async function qm(e){let t=JSON.parse(ce(e));if(!t||typeof t!="object"||typeof t.n!="string"||typeof t.k!="string"||!t.n||!t.k)throw new Error("shape");if(t.i!==void 0&&(typeof t.i!="string"||!t.i))throw new Error("shape");if(typeof t.i=="string"&&t.i.length>256)throw new Error("shape");if(Uint8Array.fromBase64(t.k).length!==32)throw new Error("shape");return{id:typeof t.i=="string"?t.i:await zn(t.k),name:t.n,privateKeyBase64:t.k}}function rl(e){return typeof location>"u"?`#share=${e}`:`${location.origin}${location.pathname}#share=${e}`}function nl(e){let t=typeof e=="string"?e:typeof location>"u"?"":location.hash;if(!t)return null;let r=t.replace(/^#/u,"");if(!r)return null;for(let n of r.split("&")){let o=n.indexOf("=");if(o<0||n.slice(0,o)!=="share")continue;return n.slice(o+1)||null}return null}var Gm={get state(){return a},listWorkspaces:U,addReportToWorkspace:fr,addBundleToWorkspace:hr,onReportMembershipChanged:xa,onBundleMembershipChanged:_a,onWorkspaceDeleted:ka,onWorkspacePrivateKeyChanged:$a,analyzeContent:Oe,setCount:Ve,gunzipBytes:ft,listBundles:lt,listFiles:ae,readBundle:ur,saveBundle:dr,saveFileBytes:In,saveTriage:oe,getSecureItem:fe,setSecureItem:we,removeSecureItem:Fr,onSecureStorageHydrated:Br};function xu(e){e.installSyncHost(Gm),ou(()=>e.triageSync.notify())}var P=null,Yn=null;function Eu(){try{return fe("deepview.sync.userEnabled")!=="0"}catch{return!0}}function ol(){return Yn||(Yn=(async()=>{let e="./client-sync.js";try{let t=await import(e);return xu(t),P=t,Ym(),t}catch(t){throw Yn=null,t}})(),Yn)}function Tu(){return ol()}var Au=[];function Xn(e){P?e(P):Au.push(e)}function Ym(){let e=Au.splice(0);for(let t of e)try{t(P)}catch(r){console.warn("client-sync: deferred apply failed:",r)}}function Jn(e,t){let r={cancelled:!1,unsub:null};return Xn(n=>{r.cancelled||(r.unsub=t(n,e))}),()=>{r.cancelled=!0,r.unsub&&r.unsub()}}function sl(e,t){return P?P.isInRemote(e,t):!1}function Iu(e,t){return P?P.isBundleInRemote(e,t):!1}var Jm="deepview.objstore-presence.";function Bu(e){try{let t=localStorage.getItem(Jm+e);if(!t)return null;let r=JSON.parse(t);return r&&typeof r=="object"?r:null}catch{return null}}function Qn(e,t){if(P&&P.isInRemote(e,t))return!0;let r=Bu(e);if(!r||typeof r.names!="object")return!1;for(let n of Object.values(r.names))if(n===t)return!0;return!1}function il(e,t){if(P&&P.isBundleInRemote(e,t))return!0;let r=Bu(e);if(!r||typeof r.bundles!="object")return!1;for(let n of Object.values(r.bundles))if(n===t)return!0;return!1}function Fu(e){return P?P.remoteCount(e):0}function Ru(e,t){return P?P.remoteBundleName(e,t):null}function Mu(e){return Jn(e,(t,r)=>t.onAutoDownloaded(r))}function Lu(e){return Jn(e,(t,r)=>t.onBundleAutoDownloaded(r))}function Pu(e){return Jn(e,(t,r)=>t.onChange(r))}var _u=null,Su=null,Cu=null,ks=[];function Ou(e){if(P){P.setRedraw(e);return}_u=e,Xn(t=>{_u===e&&t.setRedraw(e)})}function Du(e){if(P){P.setAuthenticationResolver(e);return}Su=e,Xn(t=>{Su===e&&t.setAuthenticationResolver(e)})}function Nu(e){if(P){P.setHydrationConflictResolver(e);return}Cu=e,Xn(t=>{Cu===e&&t.setHydrationConflictResolver(e)})}async function wt(e,t){if(!(!Eu()&&!P))return(await ol())[e](...t)}function Uu(...e){return wt("fetchFile",e)}function zu(...e){return wt("fetchBundleFromRemote",e)}function $s(...e){return wt("putFile",e)}function Wu(...e){return wt("putBundleToRemote",e)}function xs(...e){return wt("deleteFromRemote",e)}function _s(...e){return wt("deleteBundleFromRemote",e)}function Ss(...e){return wt("openWorkspace",e)}function Zn(...e){return wt("closeWorkspace",e)}function Hu(...e){return wt("discoverRemoteFileNames",e)}function Vu(...e){return wt("discoverRemoteBundleIntegrities",e)}function Kt(e,t){if(P)return P.triageSync[e](...t);Xn(r=>{r.triageSync[e](...t)})}var O={get status(){return P?P.triageSync.status:"off"},get openSessions(){return P?P.triageSync.openSessions:[]},get persistenceDegraded(){return P?P.triageSync.persistenceDegraded:!1},setEnabled(e){if(e===!0)return ol().then(t=>{t.triageSync.setEnabled(!0);let r=ks;ks=[];for(let n of r)try{t.openWorkspace(n)}catch(o){console.warn(`client-sync: openWorkspace(${n}) failed during re-enable:`,o)}return null}).catch(t=>(console.warn("client-sync: setEnabled load failed:",t),null));if(P){ks=P.openWorkspaceIds();for(let t of ks)try{P.closeWorkspace(t)}catch(r){console.warn(`client-sync: closeWorkspace(${t}) failed during disable:`,r)}P.triageSync.setEnabled(!1);return}Kt("setEnabled",[e])},isEnabled(){return P?P.triageSync.isEnabled():Eu()},openSession(e){Kt("openSession",[e])},closeSession(e){Kt("closeSession",[e])},refreshSession(e){Kt("refreshSession",[e])},dismissError(e){Kt("dismissError",[e])},setForcedOff(e){Kt("setForcedOff",[e])},setServerUrl(e){Kt("setServerUrl",[e])},getServerUrl(){return P?P.triageSync.getServerUrl():null},notify(){Kt("notify",[])},onStatusChange(e){return Jn(e,(t,r)=>t.triageSync.onStatusChange(r))},onPersistenceDegraded(e){return Jn(e,(t,r)=>t.triageSync.onPersistenceDegraded(r))}};var eo=class extends Qe{constructor(t){if(super(t),this.it=g,t.type!==Fe.CHILD)throw Error(this.constructor.directiveName+"() can only be used in child bindings")}render(t){if(t===g||t==null)return this._t=void 0,this.it=t;if(t===ie)return t;if(typeof t!="string")throw Error(this.constructor.directiveName+"() called with a non-string value");if(t===this.it)return this._t;this.it=t;let r=[t];return r.raw=r,this._t={_$litType$:this.constructor.resultType,strings:r,values:[]}}};eo.directiveName="unsafeHTML",eo.resultType=1;var ue=ut(eo);var ju=`*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}:host{width:260px;flex-shrink:0;height:100%;background:var(--surface);backdrop-filter:var(--glass-blur);border-right:1px solid var(--border);display:flex;flex-direction:column;transition:width .15s ease-out;overflow:hidden}:host(.collapsed){width:32px}:host(.empty){display:none}:host(.collapsed) .brand,:host(.collapsed) .sidebar-search,:host(.collapsed) #encryption-toggle,:host(.collapsed) #file-list{display:none}:host(.collapsed) .sidebar-header{padding:.5rem 0;justify-content:center}:host(.collapsed) .sidebar-actions{padding:.35rem 0;justify-content:center}:host(.collapsed) #delete-current,:host(.collapsed) #sync-status .sync-label{display:none}:host(.collapsed) #sync-status{padding:.25rem;border:0}.sidebar-header{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem .4rem;.brand{flex:1;min-width:0;display:flex;align-items:baseline;gap:.4rem;font-size:.95rem;font-weight:700;letter-spacing:-.01em;white-space:nowrap;overflow:hidden;user-select:none}.brand-button{background:transparent;border:0;padding:0;margin:0;font:inherit;color:inherit;border-radius:4px;&:focus-visible{outline:2px solid var(--accent);outline-offset:2px}}.brand-tag{font-size:.65rem;font-weight:500;color:var(--muted);text-transform:lowercase;letter-spacing:.02em}}@media(display-mode:window-controls-overlay){.sidebar-header{min-height:env(titlebar-area-height,0px);padding-left:max(.75rem,env(titlebar-area-x,0px));-webkit-app-region:drag;app-region:drag;.brand-button,#encryption-toggle{-webkit-app-region:no-drag;app-region:no-drag}#sidebar-toggle{display:none}}}#sidebar-toggle{flex-shrink:0;width:22px;height:22px;display:grid;place-items:center;background:transparent;color:var(--muted);border:0;border-radius:4px;padding:0;&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}}#encryption-toggle{flex-shrink:0;width:22px;height:22px;display:grid;place-items:center;background:transparent;color:var(--muted);border:0;border-radius:4px;padding:0;&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.encrypted{color:var(--accent)}&.locked-pending{color:light-dark(#b25b00,#f0a060);outline:1px dashed currentcolor;outline-offset:-2px}}.sidebar-search{display:flex;align-items:center;margin:0 .55rem .25rem;padding:0 .25rem 0 .55rem;background:rgb(from var(--text) r g b / .04);border:1px solid var(--border);border-radius:5px;transition:background .12s,border-color .12s;-webkit-app-region:no-drag;app-region:no-drag;&:has(input:focus){border-color:var(--accent);background:rgb(from var(--text) r g b / .06)}.sidebar-search-icon{flex-shrink:0;color:var(--muted);pointer-events:none;margin-right:.4rem}& input{flex:1;min-width:0;padding:.3rem 0;background:transparent;color:var(--text);border:0;outline:none;font:inherit;font-size:.78rem;&::placeholder{color:var(--muted)}&:focus::placeholder{color:transparent}&::-webkit-search-cancel-button{display:none}}}.sidebar-view-btn{position:relative;flex-shrink:0;width:20px;height:20px;display:grid;place-items:center;background:transparent;color:var(--muted);border:0;border-radius:3px;padding:0;margin-left:2px;transition:background .12s,color .12s;+&{margin-left:.4rem}&:last-child{margin-right:.1rem}& svg{width:14px;height:14px}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .08)}&.active{color:var(--accent);background:rgb(from var(--text) r g b / .1)}.view-btn-count{position:absolute;top:-4px;right:-4px;background:var(--bg);color:var(--muted);font-size:8.5px;font-weight:600;border-radius:999px;padding:0 3px;min-width:11px;text-align:center;line-height:11px;font-variant-numeric:tabular-nums;pointer-events:none}&.active .view-btn-count{color:var(--accent)}}#file-list{list-style:none;flex:1;overflow-y:auto;overscroll-behavior:none;scrollbar-gutter:stable;-webkit-app-region:no-drag;app-region:no-drag;padding:0 .35rem .25rem 0;margin:0;scrollbar-width:thin;scrollbar-color:var(--border) transparent;&::-webkit-scrollbar{width:5px}&::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}}.file-group-header{display:flex;align-items:center;justify-content:space-between;padding:.45rem .35rem .2rem .55rem;font-size:.62rem;font-weight:700;text-transform:uppercase;letter-spacing:.12em;color:var(--muted);user-select:none;&:first-child{padding-top:.25rem}.group-count{font-weight:500;letter-spacing:.04em;color:var(--muted);font-size:.7rem}}.file-group-header.workspace-header .workspace-header-actions{display:flex;align-items:center;gap:.35rem}.workspace-add{width:18px;height:18px;display:grid;place-items:center;background:transparent;color:var(--muted);border:1px solid transparent;border-radius:4px;padding:0;&:hover{color:var(--text);border-color:var(--accent)}}.file-item.workspace-item{display:flex;align-items:stretch;gap:.15rem}.file-item.workspace-item button.file-name{flex:1;min-width:0}.file-item.workspace-item .workspace-count{align-self:center;margin-right:.35rem}.workspace-share,.workspace-export,.workspace-leave{flex-shrink:0;width:22px;align-self:center;height:22px;display:none;place-items:center;background:transparent;color:var(--muted);border:1px solid transparent;border-radius:4px;padding:0;&:hover:not(:disabled){color:var(--text);background:rgb(from var(--text) r g b / .06);border-color:var(--accent)}}.workspace-leave:hover:not(:disabled){color:var(--critical, #f87171);border-color:var(--critical, #f87171)}@media(hover:hover){.file-item.workspace-item:hover .workspace-share,.file-item.workspace-item:hover .workspace-export,.file-item.workspace-item:hover .workspace-leave{display:grid}}.workspace-rename-input{width:100%;box-sizing:border-box;background:var(--surface);color:var(--text);border:1px solid var(--accent);border-radius:3px;padding:0 .25rem;margin:-1px 0;font:inherit;font-size:.76rem;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;outline:none}.file-item{list-style:none;position:relative;&.hidden{display:none}}.file-item.current:after{content:"";position:absolute;left:0;top:50%;transform:translateY(-50%);width:3px;height:18px;background:var(--accent);border-radius:0 2px 2px 0;pointer-events:none}.file-item button.file-name{display:flex;align-items:center;gap:.5rem;width:100%;box-sizing:border-box;padding:.2rem .3rem .2rem .55rem;background:transparent;color:var(--text);border:1px solid transparent;border-radius:0 5px 5px 0;font-family:inherit;font-size:.78rem;text-align:left;&:hover{background:rgb(from var(--text) r g b / .04)}.file-icon{flex-shrink:0;color:var(--muted)}.file-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.76rem;line-height:14.5px}}.file-item .file-count{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;color:var(--muted);opacity:.65;font-size:.68rem;font-weight:500;font-variant-numeric:tabular-nums}.workspace-count-missing{margin-left:2px;opacity:.55;font-style:italic}.file-item.current button.file-name{background:rgb(from var(--text) r g b / .05);border-color:var(--border);.file-icon,.file-count{color:var(--text)}}.file-item.indented button.file-name{padding-left:1.3rem}.file-item.indented:before{content:"";position:absolute;left:.85rem;top:0;bottom:0;width:1px;background:var(--border)}.file-item.bundle-missing>.file-name{display:flex;align-items:center;gap:.5rem;padding:.2rem .3rem .2rem 1.4rem;color:var(--muted);font-size:.78rem;font-style:italic;cursor:help;.file-icon{flex-shrink:0;color:var(--muted);font-style:normal}.file-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.76rem;line-height:14.5px}}:host-context(body.theme-pink) .workspace-rename-input,:host-context(body.theme-pink) .file-item button.file-name .file-label,:host-context(body.theme-pink) .file-item.bundle-missing .file-label{font-family:inherit}.file-item.dragging button.file-name{opacity:.4}.file-item.workspace-item.drag-over button.file-name,.file-item.indented.drag-over button.file-name{background:rgb(from var(--accent) r g b / .12);border-color:var(--accent)}.file-group-header.drag-over{background:rgb(from var(--accent) r g b / .12);border-radius:4px}.sidebar-actions{padding:.35rem .55rem .45rem;border-top:1px solid var(--border);display:flex;gap:.35rem;align-items:center;justify-content:space-between;& button{background:transparent;border:1px solid var(--border);color:var(--muted);border-radius:4px;padding:.2rem .5rem;font-size:.72rem;font-family:inherit;-webkit-app-region:no-drag;app-region:no-drag;&:hover{color:var(--text);border-color:var(--accent)}&.danger:hover{color:var(--critical);border-color:var(--critical)}&[disabled]{opacity:.4;border-color:var(--border)!important;color:var(--muted)!important}}}#delete-current{display:inline-flex;align-items:center;gap:.35rem;.trash-icon{flex-shrink:0}}#sync-status{display:inline-flex;align-items:center;gap:.35rem;border-color:transparent;&:hover{border-color:var(--accent)}.sync-dot{width:8px;height:8px;border-radius:50%;background:var(--muted);flex-shrink:0;box-shadow:0 0 0 1px rgb(from var(--text) r g b / .15)}&[data-status=online] .sync-dot{background:var(--green)}&[data-status=connecting] .sync-dot{background:var(--medium)}&[data-status=offline] .sync-dot{background:var(--critical)}}#sync-status[data-degraded] .sync-dot{box-shadow:0 0 0 2px var(--medium)}#sync-status[hidden]{display:none}
17
- `;var Ku=`.file-icon.brand-deepview{.bg{fill:#2563eb}.fg{fill:#fff}}.file-icon.brand-claude{.bg{fill:#d97757}.fg{fill:#fff}}.file-icon.brand-codex{.bg{fill:#fff;stroke:#000;stroke-width:.5}.fg{fill:#000}}.file-icon.brand-vercel{.bg{fill:#000;stroke:#fff;stroke-width:.5}.fg{fill:#fff}}
18
- `;var qu=`*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}dialog{margin-top:5rem;margin-inline:auto;border:1px solid var(--border);border-radius:10px;background:var(--surface);color:var(--text);padding:1.1rem 1.25rem 1rem;max-width:480px;width:min(94vw,480px);box-shadow:0 20px 60px #00000059;&::backdrop{background:rgb(from var(--theme-bar) r g b / .55);backdrop-filter:blur(2px)}}header h3{margin:0 0 .6rem;font-size:1rem;font-weight:600}.nwd-input{display:block;width:100%;box-sizing:border-box;padding:.5rem .65rem;border:1px solid var(--border);border-radius:6px;background:var(--bg, var(--surface));color:var(--text);font:inherit;font-size:.88rem;&: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)}}.nwd-note{margin:.55rem 0 0;color:var(--muted);font-size:.74rem;line-height:1.45}.nwd-intro{margin:0 0 .8rem;color:var(--muted);font-size:.82rem;line-height:1.5}.nwd-actions{display:flex;align-items:center;gap:.4rem;margin-top:.8rem;padding-top:.7rem;border-top:1px solid var(--border)}.nwd-spacer{flex:1}.nwd-actions button{background:transparent;border:1px solid var(--border);color:var(--text);border-radius:5px;padding:.35rem .9rem;font:inherit;font-size:.8rem;&:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}&.primary{background:var(--accent);color:var(--surface);border-color:var(--accent);&:hover:not(:disabled){color:var(--surface);filter:brightness(1.08)}}&.danger{color:var(--critical, #f87171);border-color:var(--border);&:hover:not(:disabled){border-color:var(--critical, #f87171);color:var(--critical, #f87171)}}&:disabled{opacity:.5}}@media(display-mode:window-controls-overlay){dialog{-webkit-app-region:no-drag;app-region:no-drag}}
19
- `;var I=class extends N{static styles=[T(qu)];firstUpdated(){this.beforeOpen();let t=this.renderRoot.querySelector("dialog");if(t){try{t.showModal()}catch(r){this._settled=!0,this.dispatchEvent(new CustomEvent("modal-conflict",{detail:{cause:r}}));return}this.focusInitial()}}beforeOpen(){}focusInitial(){(this.renderRoot.querySelector("input, textarea")??this.renderRoot.querySelector("button.primary")??this.renderRoot.querySelector("button"))?.focus()}_finish(t){this._settled||(this._settled=!0,this.renderRoot.querySelector("dialog")?.close(),this.dispatchEvent(new CustomEvent("resolve",{detail:t})))}_onClose=()=>this._finish(null)};function K(e,t={}){return new Promise(r=>{let n=document.createElement(e);Object.assign(n,t),n.addEventListener("resolve",o=>{n.remove(),r(o.detail)}),document.body.append(n)})}var Ze=`dialog{max-width:520px;width:min(94vw,520px)}.wsl-field{display:block;margin-top:.6rem;color:var(--text);font-size:.78rem;>span{display:block;margin-bottom:.25rem;color:var(--muted);font-size:.72rem;text-transform:uppercase;letter-spacing:.04em}}.wsl-ack{display:flex;align-items:flex-start;gap:.5rem;margin-top:.6rem;color:var(--text);font-size:.8rem;line-height:1.4;>input[type=checkbox]{flex:0 0 auto;margin-top:.15rem}>span{flex:1 1 auto}}.wsl-link{display:block;width:100%;box-sizing:border-box;padding:.5rem .65rem;border:1px solid var(--border);border-radius:6px;background:var(--bg, var(--surface));color:var(--text);font:inherit;font-size:.78rem;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;resize:vertical;word-break:break-all}.wsl-error{margin:.55rem 0 0;color:var(--critical, #f87171);font-size:.74rem;line-height:1.4}.wsl-warning{padding:.55rem .65rem;border:1px solid var(--critical, #f87171);border-radius:6px;background:rgb(from var(--critical, #f87171) r g b / .08)}.wsl-optout{display:flex;align-items:center;gap:.5rem;margin-top:.7rem;color:var(--text);font-size:.78rem}.nwd-input:disabled{opacity:.5}
20
- `;var al=class extends I{static styles=[...I.styles,T(Ze)];static properties={_userName:{state:!0},_busy:{state:!0},_error:{state:!0},_phase:{state:!0},_success:{state:!0},_orphan:{state:!0},_orphanAck:{state:!0},_canCancel:{state:!0}};constructor(){super(),this._userName="",this._busy=!1,this._error="",this._phase="",this._success=!1,this._orphan=!1,this._orphanAck=!1,this._canCancel=!0,this._abortController=null}updated(t){if(t.has("_success")&&this._success){let r=this.renderRoot.querySelector("footer button.primary");r&&r.focus()}}beforeOpen(){typeof location<"u"&&(this._userName=location.hostname||"DeepView"),this._orphan=xn(),this._vaultStateUnsub=he(()=>{if(this._settled)return;let t=xn();this._orphan&&!t&&X()?(this._error="Encryption was just enabled in another tab. Close this dialog and reload to unlock.",this._busy=!1,this._canCancel=!0):this._orphan!==t&&(this._orphan=t)})}async focusInitial(){await this.updateComplete;let t=this._orphan?'input[data-role="orphan-ack"]':'input[data-role="name"]';this.renderRoot.querySelector(t)?.focus()}disconnectedCallback(){if(super.disconnectedCallback(),this._vaultStateUnsub){try{this._vaultStateUnsub()}catch{}this._vaultStateUnsub=null}}_finish(t){if(!this._settled){if(this._abortController)try{this._abortController.abort()}catch{}super._finish(!!t)}}_onClose=()=>this._finish(this._success);_onCancel=()=>{this._busy&&!this._canCancel||this._finish(!1)};_onDialogCancel=t=>{if(this._busy&&!this._canCancel){t.preventDefault();return}this._finish(!1)};_onNameInput=t=>{this._userName=t.target.value};_onOrphanAckInput=t=>{this._orphanAck=t.target.checked};_onWipeOrphan=async()=>{if(!this._busy&&this._orphanAck){if(X()){this._error="Encryption was just enabled in another tab. Reload this page to unlock.";return}this._busy=!0,this._canCancel=!1,this._error="",this._phase="Clearing previous vault state\u2026";try{await Cn({refuseIfEnabled:!0}),location.reload()}catch(t){this._error=`Could not clear previous vault state: ${t?.message??t}`,this._phase=""}finally{this._busy=!1,this._canCancel=!0}}};_onEnable=async()=>{if(!this._busy){if(!gt()){this._error="Passkeys are not supported in this browser.";return}this._busy=!0,this._canCancel=!0,this._error="",this._phase="Registering passkey\u2026",this._abortController=new AbortController;try{await ji({userName:this._userName.trim()||"DeepView user",rpName:"DeepView",signal:this._abortController.signal,migrate:async({seal:r})=>{this._canCancel=!1,this._phase="Encrypting workspaces and metadata\u2026",await Ni({seal:r}),this._phase="Encrypting triage data\u2026",await Wa({seal:r}),this._phase="Encrypting report files\u2026",await sa({seal:r}),this._phase="Encrypting bundles\u2026",await aa({seal:r})}})&&(this._success=!0,this._phase="")}catch(t){t?.name==="AbortError"?this._error="":this._error=t?.message??String(t),this._phase=""}finally{this._busy=!1,this._canCancel=!0,this._abortController=null}}};_body(){if(this._orphan)return c`<p class="wsl-error">DeepView found an abandoned passkey setup on this device. The original passkey can no longer be accessed, so any local data still encrypted under it is <strong>unreadable</strong> and cannot be recovered.</p><p class="nwd-note">To enable encryption, DeepView will <strong>permanently delete ALL local DeepView data on this device</strong> — including any plaintext workspaces or reports you may have added after the previous passkey was lost — and then register a fresh passkey. This is irreversible. There is no backup.</p><label class="wsl-ack"><input type="checkbox" data-role="orphan-ack" .checked="${this._orphanAck}" ?disabled="${this._busy}" @change="${this._onOrphanAckInput}"> <span>I understand all local DeepView data on this device will be deleted.</span></label> ${this._phase?c`<p class="nwd-note">${this._phase}</p>`:g} ${this._error?c`<p class="wsl-error">${this._error}</p>`:g}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" ?disabled="${this._busy&&!this._canCancel}" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" ?disabled="${this._busy||!this._orphanAck}" @click="${this._onWipeOrphan}">${this._busy?"Working\u2026":"Wipe and continue"}</button></footer>`;if(this._success)return c`<p class="nwd-note"><strong>Encryption is on.</strong> Your triage data and report files are now sealed under your passkey. You'll be asked to unlock with the passkey on every fresh load.</p><footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" class="primary" @click="${()=>this._finish(!0)}">Close</button></footer>`;let t=gt();return c`<p class="nwd-note">Passkey encryption protects your local triage and report data with a hardware-backed key (TouchID, Windows Hello, security key). Without the passkey, the data on disk is unreadable — even to scripts running on this origin.</p><p class="wsl-error"><strong>If you lose access to this passkey, your data CANNOT be recovered.</strong> DeepView has no backup key, no recovery code, and no escrow. Make sure your passkey is backed up (iCloud Keychain / Google Password Manager sync, or a second registered device) before relying on encryption for important data.</p><p class="nwd-note"><strong>Opt-in.</strong> You can disable encryption later from the lock icon in the sidebar header — the data is rewritten as plaintext and DeepView signals your authenticator to remove the passkey (where supported).</p>${t?g:c`<p class="wsl-error">Your browser doesn't expose the WebAuthn passkey API. Try Chrome, Safari, Edge, or Firefox in a recent version on a device with a platform authenticator.</p>`} <label class="wsl-field"><span>Passkey label</span> <input type="text" class="nwd-input" data-role="name" placeholder="DeepView" maxlength="200" .value="${this._userName}" @input="${this._onNameInput}"></label> ${this._phase?c`<p class="nwd-note">${this._phase}</p>`:g} ${this._error?c`<p class="wsl-error">${this._error}</p>`:g}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" ?disabled="${this._busy&&!this._canCancel}" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" ?disabled="${!t||this._busy}" @click="${this._onEnable}">${this._busy?"Working\u2026":"Enable encryption"}</button></footer>`}render(){return c`<dialog @close="${this._onClose}" @cancel="${this._onDialogCancel}"><header><h3>${this._success?"Encryption enabled":this._orphan?"Previous passkey setup detected":"Enable passkey encryption"}</h3></header>${this._body()}</dialog>`}};customElements.define("passkey-setup-dialog",al);function Cs(){return K("passkey-setup-dialog")}var ll=class extends I{static styles=[...I.styles,T(Ze)];static properties={_busy:{state:!0},_error:{state:!0}};constructor(){super(),this._busy=!1,this._error="",this._abortController=null}_finish(t){if(!this._settled){if(this._abortController)try{this._abortController.abort()}catch{}super._finish(!!t)}}_onCancel=()=>this._finish(!1);_onUnlock=async()=>{if(!this._busy){this._busy=!0,this._error="",this._abortController=new AbortController;try{if(await Sn({signal:this._abortController.signal})){this._finish(!0);return}this._error=""}catch(t){this._error=t?.message??String(t)}finally{this._busy=!1,this._abortController=null}}};render(){return c`<dialog @close="${this._onClose}"><header><h3>Unlock your data</h3></header><p class="nwd-note">Your triage data and report files are encrypted with a passkey on this device. Unlock to load them.</p>${this._error?c`<p class="wsl-error">${this._error}</p>`:g}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">${this._busy?"Cancel":"Later"}</button> <button type="button" class="primary" ?disabled="${this._busy}" @click="${this._onUnlock}">${this._busy?"Waiting\u2026":"Unlock with passkey"}</button></footer></dialog>`}};customElements.define("passkey-unlock-dialog",ll);function Es(){return K("passkey-unlock-dialog")}var Gu=c`<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="8" width="10" height="6" rx="1"/><path d="M5 8V5.5a3 3 0 0 1 6 0V8"/></svg>`,tb=c`<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="8" width="10" height="6" rx="1"/><path d="M5 8V5a3 3 0 0 1 6 -0.5"/></svg>`,ke=null;function Yu(){if(!ke)return;if(!gt()){ke.hidden=!0;return}ke.hidden=!1;let e=X(),t=st();ke.classList.toggle("encrypted",e&&t),ke.classList.toggle("locked-pending",e&&!t),e&&t?(ke.title="Encryption on \u2014 click to disable",ke.setAttribute("aria-label","Disable encryption"),H(Gu,ke)):e?(ke.title="Encryption on, locked \u2014 click to unlock",ke.setAttribute("aria-label","Unlock encrypted data"),H(Gu,ke)):(ke.title="Encryption off \u2014 click to enable",ke.setAttribute("aria-label","Enable encryption"),H(tb,ke))}async function rb(){if(confirm(`Disable encryption?
14
+ `))}function pu(e){return e.replaceAll("**","")}function Im(e){return Array.from(e,t=>t.toString(16).padStart(2,"0")).join("")}function Rm(e){let t="";for(let r=0;r<e.length;r++)t+=String.fromCodePoint(e[r]);return btoa(t)}async function fu(e){let t=typeof e=="string"?G(e):e,r=await crypto.subtle.digest("SHA-512",t);return`sha512-${Rm(new Uint8Array(r))}`}async function Bm(e){let t=G(JSON.stringify(e)),r=await crypto.subtle.digest("SHA-256",t),n=new Uint8Array(r,0,16);n[6]=n[6]&15|64,n[8]=n[8]&63|128;let o=Im(n);return`${o.slice(0,8)}-${o.slice(8,12)}-${o.slice(12,16)}-${o.slice(16,20)}-${o.slice(20,32)}`}async function ls(e){if(typeof crypto?.subtle?.digest!="function")return null;let t;e.fileHash?t={severity:e.severity,description:e.description,fileHash:e.fileHash}:e.location?t={severity:e.severity,description:e.description,location:e.location}:t={severity:e.severity,description:e.description,file:e.file,line:e.line};try{return await Bm(t)}catch{return null}}function zt(e){try{return JSON.parse(e)}catch{return Ur(e)??zr(e)}}function Wt(e){let t=[];for(let r of e){let n=Array.isArray(r)?r:[r];for(let o of n)o&&t.push(o)}return t}async function Wr(e){let t=e.filter(n=>n&&!n.id);if(t.length===0)return;let r=await Promise.all(t.map(ls));t.forEach((n,o)=>{r[o]&&(n.id=r[o])})}var Hr=new Map,Vr=new Map,jr=new Map,cs=new Map;function Fm(e){if(typeof e?.package?.npm?.name=="string"&&e.package.npm.name)return e.package.npm.name;if(!e?.file)return null;let t=/(?:^|\/)(?:node_modules|dependencies)\/(@[^/]+\/[^/]+|[^/]+)/gu,r;for(;(r=t.exec(e.file))!==null;)if(r[1]!==".pnpm")return r[1];return null}function Mm(e){return typeof e?.file!="string"?!1:/(?:^|\/)(?:node_modules|dependencies)\//u.test(e.file)}function Lm(e,t){return typeof e.repo?.github=="string"&&e.repo.github?e.repo.github:typeof e._repoFallback=="string"&&e._repoFallback?e._repoFallback:typeof t=="string"&&t?t:null}var Fn=new Set,fa=new Set,Bn=null,ha=!1;function ga(e){return fa.add(e),()=>fa.delete(e)}function ma(){for(let e of fa)try{e()}catch{}}function ds(e){return Hr.get(e)?.list??[]}function bt(){return Vr}function fr(){return jr}function Mn(e,t){let r=Hr.get(e);if(!r)return[];let n=r.reports.get(Ht(t));return n?[...n]:[]}function ba(e,t){let r=Vr.get(e);if(!r)return[];let n=r._keyReports.get(Ht(t));return n?[...n]:[]}function ya(e,t){let r=jr.get(e);if(!r)return[];let n=r._keyReports.get(Ht(t));return n?[...n]:[]}var hu=["type","model","think","effort","exportsMode"];function Pm(e,t){if(!hu.some(r=>e[r]!==void 0))for(let r of hu)t[r]!==void 0&&(e[r]=t[r])}function Om(e){let t=Array.isArray(e?.findings)?e.findings:Array.isArray(e?.groups)?e.groups:null;if(!t)return[];let r=!e?.source,n=[];for(let o of Wt(t))r&&Pm(o,e),n.push(o);return n}function Ht(e){return e.id?`id:${e.id}`:`c:${e.severity??""}|${e.description??""}|${e.file??""}|${e.line??""}`}function wa(e,t,r){let n=cs.get(e);n||(n={hash:[],pkg:[],repo:[]},cs.set(e,n)),n[t].push(r)}function Nm(e,t,r){let n=Hr.get(e.fileHash);n||(n={keys:new Set,list:[],reports:new Map},Hr.set(e.fileHash,n));let o=n.reports.get(t);o||(o=new Set,n.reports.set(t,o));let s=!o.has(r);return o.add(r),s&&wa(r,"hash",{hash:e.fileHash,key:t}),n.keys.has(t)?s:(n.keys.add(t),n.list.push(e),!0)}function Dm(e,t,r){let n=Fm(e);if(!n)return!1;let o=zd(e),s=Vr.get(n);if(s||(s={...jo(),repos:new Set,byVersion:new Map,_repoReports:new Map},Vr.set(n,s)),typeof e.repo?.github=="string"&&e.repo.github){s.repos.add(e.repo.github);let l=s._repoReports.get(e.repo.github);l||s._repoReports.set(e.repo.github,l=new Set),l.add(r)}Wd(s,o,e,t,r);let i=Ko(s,t,r,e);return wa(r,"pkg",{pkg:n,key:t,file:e.file,version:o}),i}function Um(e,t,r,n){if(Mm(e))return!1;let o=Lm(e,n);if(!o)return!1;let s=jr.get(o);s||(s=jo(),jr.set(o,s));let i=Ko(s,t,r,e);return i&&wa(r,"repo",{repo:o,key:t,file:e.file}),i}function va(e){let t=cs.get(e);if(cs.delete(e),Fn.delete(e),!t)return!1;let r=!1;for(let{hash:o,key:s}of t.hash){let i=Hr.get(o);if(!i)continue;let l=i.reports.get(s);if(l){if(l.delete(e)&&(r=!0),l.size===0){i.reports.delete(s),i.keys.delete(s);let d=i.list.findIndex(u=>Ht(u)===s);d>=0&&i.list.splice(d,1)}i.keys.size===0&&Hr.delete(o)}}let n=new Set;for(let{pkg:o,key:s,file:i,version:l}of t.pkg){let d=Vr.get(o);if(!d)continue;let u=d._keyReports.get(s);if(u){if(u.delete(e)&&(r=!0),u.size===0&&qo(d,s,i,Ht),Hd(d,l,s,i,e,Ht),!n.has(o)){n.add(o);for(let p of[...d._repoReports.keys()]){let f=d._repoReports.get(p);f?.delete(e)&&f.size===0&&(d._repoReports.delete(p),d.repos.delete(p),r=!0)}}d._keyReports.size===0?Vr.delete(o):Go(d)}}for(let{repo:o,key:s,file:i}of t.repo){let l=jr.get(o);if(!l)continue;let d=l._keyReports.get(s);d&&(d.delete(e)&&(r=!0),d.size===0&&qo(l,s,i,Ht),l._keyReports.size===0?jr.delete(o):Go(l))}return r}async function zm(e){if(Fn.has(e))return!1;Fn.add(e);try{let t=await Fe(e),r=zt(t);if(!r)return!1;let n=Om(r);if(n.length===0)return!1;let o="";try{o=He(e)}catch{}let s=!1;for(let i of n){let l=Ht(i);i.fileHash&&Nm(i,l,e)&&(s=!0),i.file&&Dm(i,l,e)&&(s=!0),i.file&&Um(i,l,e,o)&&(s=!0)}return Fn.has(e)?s:(va(e),ha=!0,!1)}catch{return Fn.delete(e),!1}}function yt(){return Bn||(Bn=(async()=>{try{do{ha=!1;let e=await le();for(let t of e)await zm(t)&&ma()}while(ha)}finally{Bn=null}})(),Bn)}nu(e=>{va(e)&&ma()});cu(e=>{va(e)&&ma(),yt().catch(()=>{})});var Ln=new Map,Pn=new Map;function us(e,t){if(!e||!t)return!1;let r=!Pn.has(e);Pn.set(e,t);for(let[n,o]of t){if(!o)continue;let s=Ln.get(o);s||(s=new Map,Ln.set(o,s)),s.set(e,n)}return r}function ka(e){let t=Pn.get(e);if(Pn.delete(e),!!t)for(let r of t.values()){let n=Ln.get(r);n&&(n.delete(e),n.size===0&&Ln.delete(r))}}function hr(e){if(!e)return[];let t=Ln.get(e);if(!t)return[];let r=[];for(let[n,o]of t)r.push({integrity:n,file:o});return r}function $a(e){return Pn.has(e)}var gu="deepview.fileCounts",qr=null;function fs(){if(qr)return qr;try{qr=JSON.parse(he(gu)||"{}")}catch{qr={}}return qr}function xa(){ve(gu,JSON.stringify(qr)).catch(e=>console.warn("counts persist:",e))}function mu(e){let t=fs()[e];if(t!==void 0)return typeof t=="number"?{count:t}:t}function Nn(e){return mu(e)?.count}function Dn(e){return mu(e)?.source}function je(e,t,r){let n=fs();n[e]=r?{count:t,source:r}:{count:t},xa()}function Gr(e){let t=fs();delete t[e],xa()}function Oe(e){try{let n=JSON.parse(e);if(n&&Array.isArray(n.findings))return{count:n.findings.length,source:n.source,recognized:!0}}catch{}let t=Ur(e);if(t)return{count:t.findings.length,source:t.source,recognized:!0};let r=zr(e);return r?{count:r.findings.length,source:r.source,recognized:!0}:{count:0,recognized:!1}}var On=null,Kr=null,ps=null;function Wm(e,t){for(let{names:r,onUpdate:n}of ps)if(r.has(e))try{n(e,t)}catch(o){console.warn("ensureCounts onUpdate:",o)}}function _a(e,t){if(On){t&&ps.push({names:new Set(e),onUpdate:t});for(let r of e)Kr.add(r);return On}return Kr=new Set(e),ps=t?[{names:new Set(e),onUpdate:t}]:[],On=(async()=>{await Promise.resolve();try{let r=fs();for(;Kr.size>0;){let n=Kr.values().next().value;if(Kr.delete(n),r[n]===void 0)try{let o=await Fe(n),{count:s,source:i}=Oe(o);r[n]=i?{count:s,source:i}:{count:s},xa(),Wm(n,s)}catch{}}}finally{On=null,Kr=null,ps=null}})(),On}function Sa(e){if(!e)return"";for(let t of e.split(`
15
+ `))if(t.trim())return t.trim();return""}function Ca(e){let t=new Set(e.map(n=>n.id)),r=new Map;for(let n of a.reports)for(let o of n.groups)for(let s of o){let i=s.id??String(s._id);!t.has(i)||r.has(i)||r.set(i,{severity:s.severity,file:s.file,line:s.line,description:Sa(s.description)})}return r}var Hm=`deepview/workspace-id/v1
16
+ `;async function Un(e){let t=Uint8Array.fromBase64(e),r=G(Hm),n=new Uint8Array(r.length+t.length);n.set(r,0),n.set(t,r.length);let o=new Uint8Array(await crypto.subtle.digest("SHA-256",n)),i=Array.from(o.subarray(0,16),u=>u.toString(16).padStart(2,"0")).join("").split("");i[12]="8";let l=parseInt(i[16],16)&3|8;i[16]=l.toString(16);let d=i.join("");return`${d.slice(0,8)}-${d.slice(8,12)}-${d.slice(12,16)}-${d.slice(16,20)}-${d.slice(20,32)}`}function zn(e){let t=new Set;function r(o){return t.add(o),()=>t.delete(o)}function n(o){for(let s of t)try{s(o)}catch(i){console.warn(`workspace ${e} listener failed:`,i)}}return{on:r,fire:n}}var bu=zn("create"),yu=zn("delete"),wu=zn("privateKey"),vu=zn("report-membership"),ku=zn("bundle-membership"),Vm=bu.on,Ea=yu.on,Aa=wu.on,Ta=vu.on,Ia=ku.on,hs=bu.fire,Ra=yu.fire,Ba=wu.fire,gs=vu.fire,ms=ku.fire;var Ma="deepview.workspaces",jm=1;function Wn(){try{let e=he(Ma);if(!e)return[];let t=JSON.parse(e);return t&&typeof t=="object"&&Array.isArray(t.workspaces)?t.workspaces:Array.isArray(t)?t:[]}catch{return[]}}async function Km(e){await ve(Ma,JSON.stringify({version:jm,workspaces:e}))}var qm=Ma;function Yr(e){return navigator.locks.request(qm,async()=>{let t=Wn(),r=await e(t);if(r!==!1)return await Km(t),r})}function Hn(e){return{id:e.id,privateKey:e.privateKey,reports:Array.isArray(e.reports)?[...e.reports]:[],bundles:Array.isArray(e.bundles)?[...e.bundles]:[]}}var ct=Wn().map(Hn);function La(){ct=Wn().map(Hn)}function Pa(e){ct=ct.filter(t=>t.id!==e.id),ct.push(Hn(e))}function Gm(e,t){let r=Array.isArray(e[t])?[...e[t]]:[],n=ct.find(o=>o.id===e.id);if(n){n[t]=r;return}ct.push(Hn(e))}function Ym(e){ct=ct.filter(t=>t.id!==e)}function z(){let e=Wn();for(let t of e)Array.isArray(t.reports)||(t.reports=[]),Array.isArray(t.bundles)||(t.bundles=[]);return e}var Jm=200;function wt(e){let t=(e??"").trim();return t&&t.replaceAll(/[\u0000-\u001F\u007F]/gu,"").slice(0,Jm)||null}async function Oa(e){let t=wt(e);if(!t)return null;let r=new Uint8Array(32);crypto.getRandomValues(r);let n=r.toBase64(),o={id:await Un(n),name:t,privateKey:n,reports:[],bundles:[],createdAt:Date.now()};return await Yr(i=>i.some(l=>l.id===o.id)?!1:(i.push(o),o))?(Pa(o),o):null}async function Na(e){await Yr(r=>{let n=r.findIndex(o=>o.id===e);return n<0?!1:(r.splice(n,1),!0)})&&(Ra(e),Ym(e))}async function Da(e,t){let r=wt(t);return!(!r||!await Yr(o=>{let s=o.find(i=>i.id===e);return!s||s.name===r?!1:(s.name=r,s)}))}async function $u(e){let t=await Yr(o=>{let s=o.findIndex(p=>p.id===e.id),i=s>=0?o[s]:null,l=wt(e.name)??i?.name??"Workspace",d=e.preserveBundles?Array.isArray(i?.bundles)?i.bundles:[]:Array.isArray(e.bundles)?e.bundles:[],u={id:e.id,name:l,privateKey:e.privateKey,reports:Array.isArray(e.reports)?[...new Set(e.reports)]:[],bundles:[...new Set(d)],createdAt:e.createdAt??Date.now()};return s>=0?o[s]=u:o.push(u),{previous:i,next:u}}),{next:r}=t,n=ct.find(o=>o.id===r.id)??null;return n==null?hs(r.id):(n.privateKey!==r.privateKey&&Ba(r.id),bs(n.reports,r.reports)||gs(r.id),bs(n.bundles,r.bundles)||ms(r.id)),Pa(r),r}async function Ua({id:e,name:t,privateKey:r,createdAt:n}){let o=null;return await Yr(s=>{let i=wt(t);if(!i)return o={status:"name-collision",existing:null},!1;let l=s.find(p=>p.id===e)??null;if(l)return o={status:"already-attached",workspace:l},!1;let d=s.find(p=>wt(p.name)===i)??null;if(d)return o={status:"name-collision",existing:d},!1;let u={id:e,name:i,privateKey:r,reports:[],bundles:[],createdAt:n??Date.now()};s.push(u),o={status:"attached",workspace:u}}),o?.status==="attached"&&(hs(o.workspace.id),Pa(o.workspace)),o}function bs(e,t){let r=new Set(e),n=new Set(t);if(r.size!==n.size)return!1;for(let o of r)if(!n.has(o))return!1;return!0}async function Fa({identifier:e,workspaceId:t,field:r,fire:n,additive:o=!1,from:s=void 0}){let i=await Yr(u=>{if((u.find(m=>Array.isArray(m[r])&&m[r].includes(e))?.id??null)===(t??null))return!1;let f=null;if(t!=null&&(f=u.find(m=>m.id===t)??null,!f))return!1;let h=new Set;if(!o)for(let m of u)s!==void 0&&m.id!==s||(Array.isArray(m[r])||(m[r]=[]),m[r].includes(e)&&(m[r]=m[r].filter(y=>y!==e),h.add(m.id)));if(f&&(Array.isArray(f[r])||(f[r]=[]),f[r].includes(e)||(f[r].push(e),h.add(f.id))),h.size===0)return!1;let b=new Map;for(let m of h){let y=u.find($=>$.id===m);y&&b.set(m,y)}return{affected:h,snapshot:b}});if(!i)return;let{affected:l,snapshot:d}=i;for(let u of l){n(u);let p=d.get(u);p&&Gm(p,r)}}function xu(e,t){return{move:(r,n)=>Fa({identifier:r,workspaceId:n,field:e,fire:t}),add:(r,n)=>Fa({identifier:r,workspaceId:n,field:e,fire:t,additive:!0}),remove:(r,n)=>Fa({identifier:r,field:e,fire:t,from:n})}}var za=xu("reports",gs),Wa=xu("bundles",ms),Vn=za.move,At=za.add,jn=za.remove,Ha=Wa.move,gr=Wa.add,Va=Wa.remove;function Xm(){let e=Wn().map(Hn),t=ct,r=new Map(t.map(o=>[o.id,o])),n=new Map(e.map(o=>[o.id,o]));for(let o of r.keys())n.has(o)||Ra(o);for(let[o,s]of n){let i=r.get(o);if(!i){hs(o);continue}i.privateKey!==s.privateKey&&Ba(o),bs(i.reports,s.reports)||gs(o),bs(i.bundles,s.bundles)||ms(o)}ct=e}Fr(()=>{Xm()});function _u(e){return e==="fixed"||e==="invalid"||e==="deleted"?e:void 0}function de(e){if(e)return _u(e.triage)??(e.deleted?"deleted":void 0)}function Qm(e){return e?!e.color&&!de(e)&&!e.comment&&!e.fix&&!(e.ignoredReports&&e.ignoredReports.length>0):!0}function Tt(e,t,r){let n=e.get(t)?.ignoredReports;return Array.isArray(n)&&n.includes(r)}function Kn(e){if(!e||typeof e!="object")return;let t=e,r={};typeof t.color=="string"&&t.color&&(r.color=t.color);let n=_u(t.triage)??(t.deleted?"deleted":void 0);if(n&&(r.triage=n),typeof t.comment=="string"&&t.comment&&(r.comment=t.comment),typeof t.fix=="string"&&t.fix&&(r.fix=t.fix),Array.isArray(t.ignoredReports)){let o=t.ignoredReports.filter(s=>typeof s=="string"&&s.length>0);o.length>0&&(r.ignoredReports=o)}return Qm(r)?void 0:r}function Zm(e,t){let r=e??[],n=t??[];if(r.length!==n.length)return!1;if(r.length===0)return!0;let o=new Set(r);for(let s of n)if(!o.has(s))return!1;return!0}function eb(e,t){let r=e??{},n=t??{};return(r.color??"")===(n.color??"")&&(de(r)??"")===(de(n)??"")&&(r.comment??"")===(n.comment??"")&&(r.fix??"")===(n.fix??"")&&Zm(r.ignoredReports,n.ignoredReports)}function M(e,t,r){let n=e.get(t),o=Kn({...n,...r});return o===void 0?e.delete(t):eb(n,o)?!1:(e.set(t,o),!0)}function ne(e,t,r,n){let o=new Set(e.get(t)?.ignoredReports??[]);return n?o.add(r):o.delete(r),M(e,t,{ignoredReports:o.size>0?[...o]:void 0})}var ja=()=>{};function Cu(e){ja=typeof e=="function"?e:()=>{}}var Vt="deepview.triage",It="deepview.triage.pending",vt=/^\d+$/u;async function tb(e){let t=new Blob([e]).stream().pipeThrough(new CompressionStream("deflate"));return new Uint8Array(await new Response(t).arrayBuffer())}async function rb(e){let t=new Blob([e]).stream().pipeThrough(new DecompressionStream("deflate"));return new Uint8Array(await new Response(t).arrayBuffer())}var nb="deepview.triage.save",Su=0;function Ka(){let e={};for(let[t,r]of a.triage){if(vt.test(t))continue;let n=Kn(r);n&&(e[t]=n)}return e}function oe(){let e=++Su,t=Ka(),r=Object.keys(t).length===0,n=r?null:JSON.stringify(t);if(n!=null)try{localStorage.setItem(It,n)}catch{}return navigator.locks.request(Xe,{mode:"shared"},async()=>{let o=null,s=null;if(n!=null)try{let i=G(n),l=await tb(i);s=ke(),o=(s?await Qd(l):l).toBase64()}catch(i){console.warn("Failed to save triage:",i),ja();return}await navigator.locks.request(nb,()=>{try{if(e!==Su)return;if(n!=null&&ke()!==s){queueMicrotask(()=>{oe()});return}if(r)localStorage.removeItem(Vt),localStorage.removeItem(It);else{localStorage.setItem(Vt,o);try{localStorage.removeItem(It)}catch{}}}catch(i){console.warn("Failed to save triage:",i)}}),ja()})}async function Eu(){let e=localStorage.getItem(It);if(e)try{return JSON.parse(e)}catch{}let t=localStorage.getItem(Vt);if(!t)return null;let r=Uint8Array.fromBase64(t);if(Le(r)){if(!ke())throw new Error("triage: vault locked, cannot decrypt envelope");r=await Zd(r)}let n=await rb(r);return JSON.parse(ce(n))}function Au(e,{replace:t=!1}={}){let r=a.triage;if(t){let n=null,o=localStorage.getItem(It);if(o)try{n=JSON.parse(o)}catch{}let s=i=>n!=null&&i in n;for(let i of[...r.keys()]){if(vt.test(i))continue;let l=e?.[i],d=!e||!(i in e);!(s(i)&&n[i]?.color)&&(d||!l?.color)&&M(r,i,{color:void 0}),!(s(i)&&(n[i]?.triage||n[i]?.deleted))&&!de(l)&&M(r,i,{triage:void 0}),!(s(i)&&n[i]?.comment)&&(d||typeof l?.comment!="string"||!l.comment)&&M(r,i,{comment:void 0}),!(s(i)&&n[i]?.fix)&&(d||typeof l?.fix!="string"||!l.fix)&&M(r,i,{fix:void 0})}for(let i of[...r.keys()]){if(vt.test(i))continue;let l=r.get(i)?.ignoredReports;if(!l||l.length===0)continue;let d=e?.[i],u=!!de(d);for(let p of[...l]){if(s(i)&&Array.isArray(n[i]?.ignoredReports)&&n[i].ignoredReports.includes(p))continue;if(u){ne(r,i,p,!1);continue}let f=d?.ignoredReports;(!Array.isArray(f)||!f.includes(p))&&ne(r,i,p,!1)}}}if(e)for(let[n,o]of Object.entries(e)){let s=de(o),i={};if(o&&o.color&&(i.color=o.color),s&&(i.triage=s),o&&typeof o.comment=="string"&&o.comment&&(i.comment=o.comment),o&&typeof o.fix=="string"&&o.fix&&(i.fix=o.fix),Object.keys(i).length>0&&M(r,n,i),!s&&o&&Array.isArray(o.ignoredReports)){let l=new Set(r.get(n)?.ignoredReports??[]),d=!1;for(let u of o.ignoredReports)typeof u=="string"&&!l.has(u)&&(l.add(u),d=!0);d&&M(r,n,{ignoredReports:[...l]})}}}async function ob(){try{let e=await Eu();Au(e)}catch(e){console.warn("Failed to load triage:",e)}}async function Tu(){try{let e=await Eu();Au(e,{replace:!0})}catch(e){console.warn("Failed to reload triage:",e)}}typeof window<"u"&&window.addEventListener("storage",e=>{e.key!==Vt&&e.key!==It||Tu()});var qn=ob();ge(()=>{Tu()});ge(()=>{ke()&&localStorage.getItem(It)&&oe()});async function qa({seal:e}){try{localStorage.removeItem(It)}catch{}let t=localStorage.getItem(Vt);if(!t)return;let r=Uint8Array.fromBase64(t);if(Le(r))return;let n=await e(r,_n());localStorage.setItem(Vt,n.toBase64())}async function Ga({open:e}){try{localStorage.removeItem(It)}catch{}let t=localStorage.getItem(Vt);if(!t)return;let r=Uint8Array.fromBase64(t);if(!Le(r))return;let n=await e(r,_n());localStorage.setItem(Vt,n.toBase64())}var Iu="deepview.lastFile",Gn=null;function Ya(){return Gn||(Gn=sb(),Gn.catch(()=>{Gn=null})),Gn}async function sb(){try{await qn}catch{}let e=await le(),t=new Set(e),r=new Set(e),n=new Set;for(let o of e){if(!o.toLowerCase().endsWith(".deepseek"))continue;let s=o.slice(0,-9)+".md";if(t.has(s))continue;let i;try{i=await Fe(o),await at(s,i),await Dr(o)}catch(p){console.warn(`migrate: failed to rename ${o} -> ${s}`,p);continue}t.delete(o),t.add(s),n.add(o);let l=Nn(o);if(Gr(o),l===void 0){let{count:p,source:f}=Oe(i);je(s,p,f)}else{let{source:p}=Oe(i);je(s,l,p)}let d=He(o);d&&(Ve(o,""),Ve(s,d));let u=!1;for(let[p,f]of[...a.triage])f.ignoredReports?.includes(o)&&(ne(a.triage,p,o,!1),ne(a.triage,p,s,!0),u=!0);if(u&&await oe(),he(Iu)===o)try{await ve(Iu,s)}catch{}}for(let o of z())for(let s of o.reports){if(!s.toLowerCase().endsWith(".deepseek")||!n.has(s)&&r.has(s))continue;let i=s.slice(0,-9)+".md";await jn(s,o.id),await At(i,o.id)}}var Ja=1;function ib(){let e=Ka(),t=as();return{version:Ja,exportedAt:new Date().toISOString(),triage:e,repoUrls:t}}function ab(){return`deepview-triage-${new Date().toISOString().replaceAll(/[:.]/gu,"-").slice(0,19)}.json.gz`}async function Xa(){let e=ib();return{blob:new Blob([await Yo(JSON.stringify(e))]),filename:ab()}}async function Qa(e){let t;try{t=await bn(new Uint8Array(await e.arrayBuffer()))}catch(n){throw new Error(`Failed to gunzip: ${n.message}`,{cause:n})}let r;try{r=JSON.parse(t)}catch(n){throw new Error(`Failed to parse JSON: ${n.message}`,{cause:n})}if(!r||typeof r!="object")throw new Error("Invalid backup file (not an object)");if(r.version!==Ja)throw new Error(`Unsupported backup version: ${r.version} (expected ${Ja})`);if(!r.triage||typeof r.triage!="object")throw new Error("Backup is missing the `triage` map");if(!r.repoUrls||typeof r.repoUrls!="object")throw new Error("Backup is missing the `repoUrls` map");return r}async function Za(e,t){if(!["replace","prefer-imported","prefer-current"].includes(t))throw new Error(`Unknown merge mode: ${t}`);if(!e||typeof e!="object")throw new Error("Invalid payload: not an object");if(!e.triage||typeof e.triage!="object"||Array.isArray(e.triage))throw new Error("Invalid payload: missing or non-object `triage`");if(!e.repoUrls||typeof e.repoUrls!="object"||Array.isArray(e.repoUrls))throw new Error("Invalid payload: missing or non-object `repoUrls`");let r=e.triage,n=a.triage;if(t==="replace")for(let l of[...n.keys()])vt.test(l)||n.delete(l);let o=t==="prefer-current";for(let[l,d]of Object.entries(r)){if(vt.test(l)||!d||typeof d!="object")continue;typeof d.color=="string"&&d.color&&(!o||!n.get(l)?.color)&&M(n,l,{color:d.color});let u=de(d);if(u&&(!o||!de(n.get(l)))&&M(n,l,{triage:u}),typeof d.comment=="string"&&d.comment&&(!o||!n.get(l)?.comment)&&M(n,l,{comment:d.comment}),typeof d.fix=="string"&&d.fix&&(!o||!n.get(l)?.fix)&&M(n,l,{fix:d.fix}),Array.isArray(d.ignoredReports)&&!de(n.get(l)))for(let p of d.ignoredReports)typeof p=="string"&&(o&&Tt(n,l,p)||ne(n,l,p,!0))}await oe();let s=0,i=null;try{await du(e.repoUrls,t),s=Object.keys(e.repoUrls).length}catch(l){console.warn("applyTriageImport: repo-URL import failed:",l),i=l}return{triageEntries:Object.keys(r).length,repoUrls:s,repoUrlError:i}}function lb(e){return e?.name==="NotFoundError"||typeof e?.message=="string"&&e.message.startsWith("File not found:")}async function el(e){let t=new Set;for(let r of e){let n;try{n=await Fe(r)}catch(i){if(lb(i))continue;throw new Error(`Failed to read ${r}: ${i.message}`,{cause:i})}if(n==null)continue;let o=zt(n);if(!o?.findings)continue;let s=Wt(o.findings);await Wr(s);for(let i of s)i.id&&t.add(i.id)}return t}function cb(){let e=new Set;for(let t of a.triage.keys())vt.test(t)||e.add(t);return e}async function ys(e){let t=cb();if(t.size===0)return{orphanedCount:0,sharedCount:0};let r=await el(e),n=new Set;for(let p of t)r.has(p)&&n.add(p);if(n.size===0)return{orphanedCount:0,sharedCount:0};let o=await le(),s=new Set(e),i=o.filter(p=>!s.has(p)),l=await el(i),d=0,u=0;for(let p of n)l.has(p)?u++:d++;return{orphanedCount:d,sharedCount:u}}async function ws(){let e=new Set(a.triage.keys()),t=[];for(let[i,l]of a.triage)if(l.ignoredReports)for(let d of l.ignoredReports)t.push({id:i,report:d});let r=await le(),n=new Set(r),o=await el(r),s=!1;for(let i of e){if(vt.test(i)||o.has(i))continue;let l=a.triage.get(i);!l||!(l.color||de(l)||l.comment||l.fix)||M(a.triage,i,{color:void 0,triage:void 0,comment:void 0,fix:void 0})&&(s=!0)}for(let{id:i,report:l}of t)vt.test(i)||o.has(i)&&n.has(l)||Tt(a.triage,i,l)&&ne(a.triage,i,l,!1)&&(s=!0);s&&await oe()}var tl=1,Kt=16,Ru=12,Bu=1+Kt+Ru+16,jt=1+Kt+Ru;async function Fu(e,t){let r=await crypto.subtle.importKey("raw",G(e),"PBKDF2",!1,["deriveKey"]);return crypto.subtle.deriveKey({name:"PBKDF2",hash:"SHA-256",salt:t,iterations:3e6},r,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}function Mu(e){return!(e instanceof Uint8Array)||e.length<Bu?!1:e[0]===tl}async function vs(e,t){if(!(e instanceof Uint8Array))throw new TypeError("encryptWithPassword: plaintext Uint8Array required");if(typeof t!="string"||!t)throw new TypeError("encryptWithPassword: password required");let r=new Uint8Array(jt+e.length+16);r[0]=tl,crypto.getRandomValues(r.subarray(1,1+Kt)),crypto.getRandomValues(r.subarray(1+Kt,jt));let n=r.subarray(1,1+Kt),o=r.subarray(1+Kt,jt),s=await Fu(t,n),i=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:o,additionalData:r.subarray(0,jt)},s,e));return r.set(i,jt),r}async function ub(e,t){if(typeof t!="string"||!t)throw new TypeError("tryDecryptWithPassword: password required");if(!(e instanceof Uint8Array)||e.length<Bu)return{ok:!1,reason:"malformed"};if(e[0]!==tl)return{ok:!1,reason:"malformed"};let r=e.subarray(1,1+Kt),n=e.subarray(1+Kt,jt),o=e.subarray(jt),s=await Fu(t,r),i;try{i=new Uint8Array(await crypto.subtle.decrypt({name:"AES-GCM",iv:n,additionalData:e.subarray(0,jt)},s,o))}catch{return{ok:!1,reason:"wrong-password"}}return{ok:!0,plaintext:i}}async function ks(e,t,r){if(!r||typeof r.malformedMsg!="string"||typeof r.wrongPasswordMsg!="string")throw new TypeError("decryptWithPasswordOrThrow: { malformedMsg, wrongPasswordMsg } strings required");let n=await ub(e,t);if(n.ok)return n.plaintext;throw n.reason==="wrong-password"?new Error(r.wrongPasswordMsg):new Error(r.malformedMsg)}var Yn=Mu,Lu=vs;function Pu(e,t){return ks(e,t,{malformedMsg:"malformed encrypted bundle",wrongPasswordMsg:"wrong password or corrupt bundle"})}var pb=1;async function fb(e){let t=new Set,r=zt(e);if(!Array.isArray(r?.findings))return t;let n=Wt(r.findings);await Wr(n);for(let o of n)o.id&&t.add(o.id);return t}function Ou(e){return(e??"").replaceAll(/[^a-zA-Z0-9._-]+/gu,"_").replaceAll(/^_+|_+$/gu,"")||"workspace"}async function hb(e){if(!Array.isArray(e)||e.length===0)return[];let t=await lt(),r=new Map(t.map(o=>[o.integrity,o.name])),n=[];for(let o of e){let s=r.get(o);if(!s)continue;let i;try{i=await pr(o)}catch(l){console.warn(`Workspace export: failed to read bundle ${o}: ${l?.message??l}`);continue}n.push({integrity:o,name:s,data:i.toBase64()})}return n}async function gb(e,{includeBundleBytes:t=!1}={}){let r=[],n=new Set;for(let u of e.reports??[]){let p;try{p=await Fe(u)}catch(f){console.warn(`Workspace export: skipping ${u}: ${f?.message??f}`),(f instanceof DOMException&&f.name==="NotFoundError"||typeof f?.message=="string"&&f.message.startsWith("File not found:"))&&await Vn(u,null);continue}r.push({name:u,content:p});for(let f of await fb(p))n.add(f)}let o=new Set(e.reports??[]),s={};for(let[u,p]of a.triage){if(!n.has(u))continue;let f=(p.ignoredReports??[]).filter(b=>o.has(b)),h=Kn({...p,ignoredReports:f});h&&(s[u]=h)}let i={};for(let u of r){let p=He(u.name);p&&(i[u.name]=p)}let l=(e.bundles??[]).filter(u=>typeof u=="string"&&u.length>0),d={version:pb,exportedAt:new Date().toISOString(),workspace:{id:e.id,name:e.name,privateKey:e.privateKey,createdAt:e.createdAt},reports:r,bundles:l,repoUrls:i,triage:s};if(t){let u=await hb(l);u.length>0&&(d.bundleBlobs=u)}return d}async function Nu(e,{includeBundleBytes:t=!1}={}){let r=await gb(e,{includeBundleBytes:t});return{blob:new Blob([await Yo(JSON.stringify(r))]),filename:`${Ou(e.name)}.deepview-workspace.json.gz`}}async function mb(e,t,{includeBundleBytes:r=!1}={}){if(typeof t!="string"||!t)throw new TypeError("buildWorkspaceExportEncrypted: password required");let{blob:n}=await Nu(e,{includeBundleBytes:r}),o=new Uint8Array(await n.arrayBuffer()),s=await Lu(o,t);return{blob:new Blob([s],{type:"application/octet-stream"}),filename:`${Ou(e.name)}.deepview-workspace.enc`}}async function rl(e,{password:t,includeBundleBytes:r=!1}={}){return typeof t=="string"&&t?await mb(e,t,{includeBundleBytes:r}):await Nu(e,{includeBundleBytes:r})}var bb=1,Du=1024,Uu=1024,$s=200,Vu=100*1024*1024,yb=Math.ceil(Vu*4/3)+16,zu=512,Wu=64;function wb(e){if(!e||typeof e!="object")return"payload is not an object";if(e.version!==bb)return`unsupported export version: ${e.version}`;if(!e.workspace||typeof e.workspace!="object")return"workspace metadata missing";if(typeof e.workspace.id!="string")return"workspace.id must be a string";if(typeof e.workspace.name!="string")return"workspace.name must be a string";if(typeof e.workspace.privateKey!="string")return"workspace.privateKey must be a string";if(e.workspace.createdAt!==void 0&&!Number.isFinite(e.workspace.createdAt))return"workspace.createdAt must be a finite number or omitted";if(!Array.isArray(e.reports))return"reports field must be an array";if(e.reports.length>Uu)return`reports count (${e.reports.length}) exceeds cap (${Uu})`;if(e.bundles!==void 0){if(!Array.isArray(e.bundles))return"bundles field must be an array when present";if(e.bundles.length>Du)return`bundles count (${e.bundles.length}) exceeds cap (${Du})`;for(let t of e.bundles){if(typeof t!="string")return"bundles entries must be strings";if(t.length>$s)return`bundle integrity exceeds per-entry length cap (${$s})`}}if(e.bundleBlobs!==void 0){if(!Array.isArray(e.bundleBlobs))return"bundleBlobs field must be an array when present";if(e.bundleBlobs.length>Wu)return`bundleBlobs count (${e.bundleBlobs.length}) exceeds cap (${Wu})`;for(let t of e.bundleBlobs){if(!t||typeof t!="object"||Array.isArray(t))return"bundleBlobs entries must be objects";if(typeof t.integrity!="string"||t.integrity.length===0)return"bundleBlobs.integrity must be a non-empty string";if(t.integrity.length>$s)return`bundleBlobs.integrity exceeds per-entry length cap (${$s})`;if(typeof t.name!="string"||t.name.length===0)return"bundleBlobs.name must be a non-empty string";if(t.name.length>zu)return`bundleBlobs.name exceeds per-entry length cap (${zu})`;if(t.name.includes("\0"))return"bundleBlobs.name cannot contain NUL";if(typeof t.data!="string")return"bundleBlobs.data must be a base64 string";if(t.data.length>yb)return`bundleBlobs.data exceeds per-blob size cap (${Vu} bytes raw)`}}return null}async function nl(e){return new Uint8Array(await e.arrayBuffer())}async function xs(e,t){if(Yn(e)){if(typeof t!="string"||!t)throw new TypeError("parseWorkspaceBundleBytes: password required for encrypted bundle");let n=await Pu(e,t);try{return Hu(await bn(n))}catch(o){throw new Error("wrong password or corrupt bundle",{cause:o})}}let r;try{r=await bn(e)}catch(n){throw new Error(`gzip decompression failed: ${n.message}`,{cause:n})}return Hu(r)}function Hu(e){let t;try{t=JSON.parse(e)}catch(o){throw new Error(`payload is not JSON: ${o.message}`,{cause:o})}let r=wb(t);if(r===null)return t;let n=r.includes("exceeds cap");throw new Error(n?r:`not a deepview workspace export: ${r}`)}function vb(e){return de(e)??null}async function kb(e){let t=new Map;for(let r of e??[]){if(typeof r?.content!="string")continue;let n=zt(r.content);if(!n?.findings)continue;let o=Wt(n.findings);await Wr(o);for(let s of o)!s.id||t.has(s.id)||t.set(s.id,{severity:s.severity,file:s.file,line:s.line,description:Sa(s.description)})}return t}async function $b(e,t,r){if(!e||typeof e!="object"||Array.isArray(e))return;let n=a.triage,o=[];for(let[s,i]of Object.entries(e)){if(!i||typeof i!="object")continue;let l=n.get(s)?.color,d=typeof i.color=="string"?i.color:void 0;d&&l&&l!==d?o.push({id:s,property:"color",local:l,imported:d}):d&&d!==l&&M(n,s,{color:d});let u=n.get(s)?.comment??"",p=typeof i.comment=="string"?i.comment:"";p&&u&&u!==p?o.push({id:s,property:"comment",local:u,imported:p}):p&&p!==u&&M(n,s,{comment:p});let f=n.get(s)?.fix??"",h=typeof i.fix=="string"?i.fix:"";h&&f&&f!==h?o.push({id:s,property:"fix",local:f,imported:h}):h&&h!==f&&M(n,s,{fix:h});let b=vb(i),m=de(n.get(s))??null;b&&m&&m!==b?o.push({id:s,property:"triage",local:m,imported:b}):b&&!m&&M(n,s,{triage:b});let y=Array.isArray(i.ignoredReports)?i.ignoredReports:[];if(!de(n.get(s)))for(let $ of y)typeof $=="string"&&ne(n,s,$,!0)}if(o.length>0&&t){let s=await t(o,r??new Map);s&&xb(o,s)}await oe()}function xb(e,t){for(let r of e){let n=`${r.id}:${r.property}`;t[n]==="imported"&&_b(r.id,r.property)===r.local&&(r.property==="color"?M(a.triage,r.id,{color:r.imported}):r.property==="comment"?M(a.triage,r.id,{comment:r.imported}):r.property==="fix"?M(a.triage,r.id,{fix:r.imported}):r.property==="triage"&&M(a.triage,r.id,{triage:r.imported,ignoredReports:void 0}))}}function _b(e,t){if(t==="color")return a.triage.get(e)?.color;if(t==="triage")return de(a.triage.get(e))??null;if(t==="comment")return a.triage.get(e)?.comment??"";if(t==="fix")return a.triage.get(e)?.fix??""}async function Sb(e){if(Array.isArray(e))for(let t of e){let r;try{r=Uint8Array.fromBase64(t.data)}catch(n){console.warn(`Workspace import: failed to decode bundle ${t.integrity}: ${n?.message??n}`);continue}try{let n=await ur(t.name,r);n?.integrity!==t.integrity&&console.warn(`Workspace import: bundle ${t.name} integrity mismatch (claimed ${t.integrity}, computed ${n?.integrity})`)}catch(n){console.warn(`Workspace import: failed to save bundle ${t.name}: ${n?.message??n}`)}}}async function ol(e,{conflictResolver:t}={}){let r=[];for(let u of e.reports)if(!(typeof u?.name!="string"||typeof u?.content!="string"))try{await at(u.name,u.content);let{count:p,source:f}=Oe(u.content);je(u.name,p,f??Dn(u.name)),r.push(u.name)}catch(p){console.warn(`Workspace import: failed to save ${u.name}: ${p.message}`)}Array.isArray(e.bundleBlobs)&&e.bundleBlobs.length>0&&await Sb(e.bundleBlobs);let o=e.triage&&Object.keys(e.triage).length>0?await kb(e.reports):new Map;await $b(e.triage,t,o);let s=Array.isArray(e.bundles),i=s?e.bundles.filter(u=>typeof u=="string"&&u.length>0):[],l=await $u({id:e.workspace.id,name:e.workspace.name,privateKey:e.workspace.privateKey,reports:r,bundles:s?i:void 0,preserveBundles:!s,createdAt:e.workspace.createdAt}),d=new Set(r);if(e.repoUrls&&typeof e.repoUrls=="object")for(let[u,p]of Object.entries(e.repoUrls))!d.has(u)||typeof p!="string"||!p||He(u)||(Ve(u,p),a.currentFile===u&&(a.repoUrl=p));return l}async function sl({id:e,name:t,privateKeyBase64:r,password:n}){if(typeof e!="string"||!e)throw new TypeError("encodeShareLink: id required");if(typeof t!="string"||!t)throw new TypeError("encodeShareLink: name required");if(typeof r!="string"||!r)throw new TypeError("encodeShareLink: privateKey required");if(typeof n!="string"||!n)throw new TypeError("encodeShareLink: password required");let s=await Un(r)===e?{v:1,n:t,k:r}:{v:1,i:e,n:t,k:r};return(await vs(G(JSON.stringify(s)),n)).toBase64({alphabet:"base64url",omitPadding:!0})}async function il({encoded:e,password:t}){if(typeof e!="string"||!e)throw new Error("malformed share link");if(typeof t!="string"||!t)throw new TypeError("decodeShareLink: password required");let r;try{r=Uint8Array.fromBase64(e,{alphabet:"base64url"})}catch{throw new Error("malformed share link")}let n=await ks(r,t,{malformedMsg:"malformed share link",wrongPasswordMsg:"wrong password or corrupt link"});try{return await Cb(n)}catch(o){throw new Error("wrong password or corrupt link",{cause:o})}}async function Cb(e){let t=JSON.parse(ce(e));if(!t||typeof t!="object"||typeof t.n!="string"||typeof t.k!="string"||!t.n||!t.k)throw new Error("shape");if(t.i!==void 0&&(typeof t.i!="string"||!t.i))throw new Error("shape");if(typeof t.i=="string"&&t.i.length>256)throw new Error("shape");if(Uint8Array.fromBase64(t.k).length!==32)throw new Error("shape");return{id:typeof t.i=="string"?t.i:await Un(t.k),name:t.n,privateKeyBase64:t.k}}function al(e){return typeof location>"u"?`#share=${e}`:`${location.origin}${location.pathname}#share=${e}`}function ll(e){let t=typeof e=="string"?e:typeof location>"u"?"":location.hash;if(!t)return null;let r=t.replace(/^#/u,"");if(!r)return null;for(let n of r.split("&")){let o=n.indexOf("=");if(o<0||n.slice(0,o)!=="share")continue;return n.slice(o+1)||null}return null}var Eb={get state(){return a},listWorkspaces:z,addReportToWorkspace:At,addBundleToWorkspace:gr,onReportMembershipChanged:Ta,onBundleMembershipChanged:Ia,onWorkspaceDeleted:Ea,onWorkspacePrivateKeyChanged:Aa,analyzeContent:Oe,setCount:je,gunzipBytes:ht,listBundles:lt,listFiles:le,readBundle:pr,saveBundle:ur,saveFileBytes:In,saveTriage:oe,getSecureItem:he,setSecureItem:ve,removeSecureItem:Mr,onSecureStorageHydrated:Fr};function ju(e){e.installSyncHost(Eb),Cu(()=>e.triageSync.notify())}var N=null,Jn=null;function Yu(){try{return he("deepview.sync.userEnabled")!=="0"}catch{return!0}}function cl(){return Jn||(Jn=(async()=>{let e="./client-sync.js";try{let t=await import(e);return ju(t),N=t,Ab(),t}catch(t){throw Jn=null,t}})(),Jn)}function Ju(){return cl()}var Xu=[];function Qn(e){N?e(N):Xu.push(e)}function Ab(){let e=Xu.splice(0);for(let t of e)try{t(N)}catch(r){console.warn("client-sync: deferred apply failed:",r)}}function Xn(e,t){let r={cancelled:!1,unsub:null};return Qn(n=>{r.cancelled||(r.unsub=t(n,e))}),()=>{r.cancelled=!0,r.unsub&&r.unsub()}}function dl(e,t){return N?N.isInRemote(e,t):!1}function Qu(e,t){return N?N.isBundleInRemote(e,t):!1}var Tb="deepview.objstore-presence.";function Zu(e){try{let t=localStorage.getItem(Tb+e);if(!t)return null;let r=JSON.parse(t);return r&&typeof r=="object"?r:null}catch{return null}}function Zn(e,t){if(N&&N.isInRemote(e,t))return!0;let r=Zu(e);if(!r||typeof r.names!="object")return!1;for(let n of Object.values(r.names))if(n===t)return!0;return!1}function ul(e,t){if(N&&N.isBundleInRemote(e,t))return!0;let r=Zu(e);if(!r||typeof r.bundles!="object")return!1;for(let n of Object.values(r.bundles))if(n===t)return!0;return!1}function ep(e){return N?N.remoteCount(e):0}function tp(e,t){return N?N.remoteBundleName(e,t):null}function rp(e){return Xn(e,(t,r)=>t.onAutoDownloaded(r))}function np(e){return Xn(e,(t,r)=>t.onBundleAutoDownloaded(r))}function op(e){return Xn(e,(t,r)=>t.onChange(r))}var Ku=null,qu=null,Gu=null,_s=[];function sp(e){if(N){N.setRedraw(e);return}Ku=e,Qn(t=>{Ku===e&&t.setRedraw(e)})}function ip(e){if(N){N.setAuthenticationResolver(e);return}qu=e,Qn(t=>{qu===e&&t.setAuthenticationResolver(e)})}function ap(e){if(N){N.setHydrationConflictResolver(e);return}Gu=e,Qn(t=>{Gu===e&&t.setHydrationConflictResolver(e)})}async function kt(e,t){if(!(!Yu()&&!N))return(await cl())[e](...t)}function lp(...e){return kt("fetchFile",e)}function cp(...e){return kt("fetchBundleFromRemote",e)}function Ss(...e){return kt("putFile",e)}function dp(...e){return kt("putBundleToRemote",e)}function Cs(...e){return kt("deleteFromRemote",e)}function Es(...e){return kt("deleteBundleFromRemote",e)}function As(...e){return kt("openWorkspace",e)}function eo(...e){return kt("closeWorkspace",e)}function up(...e){return kt("discoverRemoteFileNames",e)}function pp(...e){return kt("discoverRemoteBundleIntegrities",e)}function qt(e,t){if(N)return N.triageSync[e](...t);Qn(r=>{r.triageSync[e](...t)})}var D={get status(){return N?N.triageSync.status:"off"},get openSessions(){return N?N.triageSync.openSessions:[]},get persistenceDegraded(){return N?N.triageSync.persistenceDegraded:!1},setEnabled(e){if(e===!0)return cl().then(t=>{t.triageSync.setEnabled(!0);let r=_s;_s=[];for(let n of r)try{t.openWorkspace(n)}catch(o){console.warn(`client-sync: openWorkspace(${n}) failed during re-enable:`,o)}return null}).catch(t=>(console.warn("client-sync: setEnabled load failed:",t),null));if(N){_s=N.openWorkspaceIds();for(let t of _s)try{N.closeWorkspace(t)}catch(r){console.warn(`client-sync: closeWorkspace(${t}) failed during disable:`,r)}N.triageSync.setEnabled(!1);return}qt("setEnabled",[e])},isEnabled(){return N?N.triageSync.isEnabled():Yu()},openSession(e){qt("openSession",[e])},closeSession(e){qt("closeSession",[e])},refreshSession(e){qt("refreshSession",[e])},dismissError(e){qt("dismissError",[e])},setForcedOff(e){qt("setForcedOff",[e])},setServerUrl(e){qt("setServerUrl",[e])},getServerUrl(){return N?N.triageSync.getServerUrl():null},notify(){qt("notify",[])},onStatusChange(e){return Xn(e,(t,r)=>t.triageSync.onStatusChange(r))},onPersistenceDegraded(e){return Xn(e,(t,r)=>t.triageSync.onPersistenceDegraded(r))}};var to=class extends Je{constructor(t){if(super(t),this.it=g,t.type!==Be.CHILD)throw Error(this.constructor.directiveName+"() can only be used in child bindings")}render(t){if(t===g||t==null)return this._t=void 0,this.it=t;if(t===ae)return t;if(typeof t!="string")throw Error(this.constructor.directiveName+"() called with a non-string value");if(t===this.it)return this._t;this.it=t;let r=[t];return r.raw=r,this._t={_$litType$:this.constructor.resultType,strings:r,values:[]}}};to.directiveName="unsafeHTML",to.resultType=1;var ue=pt(to);var fp=`*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}:host{width:260px;flex-shrink:0;height:100%;background:var(--surface);backdrop-filter:var(--glass-blur);border-right:1px solid var(--border);display:flex;flex-direction:column;transition:width .15s ease-out;overflow:hidden}:host(.collapsed){width:32px}:host(.empty){display:none}:host(.collapsed) .brand,:host(.collapsed) .sidebar-search,:host(.collapsed) #encryption-toggle,:host(.collapsed) #file-list{display:none}:host(.collapsed) .sidebar-header{padding:.5rem 0;justify-content:center}:host(.collapsed) .sidebar-actions{padding:.35rem 0;justify-content:center}:host(.collapsed) sidebar-delete-current,:host(.collapsed) #sync-status .sync-label{display:none}:host(.collapsed) #sync-status{padding:.25rem;border:0}.sidebar-header{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem .4rem;.brand{flex:1;min-width:0;display:flex;align-items:baseline;gap:.4rem;font-size:.95rem;font-weight:700;letter-spacing:-.01em;white-space:nowrap;overflow:hidden;user-select:none}.brand-button{background:transparent;border:0;padding:0;margin:0;font:inherit;color:inherit;border-radius:4px;&:focus-visible{outline:2px solid var(--accent);outline-offset:2px}}.brand-tag{font-size:.65rem;font-weight:500;color:var(--muted);text-transform:lowercase;letter-spacing:.02em}}@media(display-mode:window-controls-overlay){.sidebar-header{min-height:env(titlebar-area-height,0px);padding-left:max(.75rem,env(titlebar-area-x,0px));-webkit-app-region:drag;app-region:drag;.brand-button,#encryption-toggle{-webkit-app-region:no-drag;app-region:no-drag}#sidebar-toggle{display:none}}}#sidebar-toggle{flex-shrink:0;width:22px;height:22px;display:grid;place-items:center;background:transparent;color:var(--muted);border:0;border-radius:4px;padding:0;&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}}#encryption-toggle{flex-shrink:0;width:22px;height:22px;display:grid;place-items:center;background:transparent;color:var(--muted);border:0;border-radius:4px;padding:0;&:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}&.encrypted{color:var(--accent)}&.locked-pending{color:light-dark(#b25b00,#f0a060);outline:1px dashed currentcolor;outline-offset:-2px}}.sidebar-search{display:flex;align-items:center;margin:0 .55rem .25rem;padding:0 .25rem 0 .55rem;background:rgb(from var(--text) r g b / .04);border:1px solid var(--border);border-radius:5px;transition:background .12s,border-color .12s;-webkit-app-region:no-drag;app-region:no-drag;&:has(input:focus){border-color:var(--accent);background:rgb(from var(--text) r g b / .06)}.sidebar-search-icon{flex-shrink:0;color:var(--muted);pointer-events:none;margin-right:.4rem}& input{flex:1;min-width:0;padding:.3rem 0;background:transparent;color:var(--text);border:0;outline:none;font:inherit;font-size:.78rem;&::placeholder{color:var(--muted)}&:focus::placeholder{color:transparent}&::-webkit-search-cancel-button{display:none}}}sidebar-view-button{display:contents}.sidebar-view-btn{position:relative;flex-shrink:0;width:20px;height:20px;display:grid;place-items:center;background:transparent;color:var(--muted);border:0;border-radius:3px;padding:0;margin-left:2px;transition:background .12s,color .12s;sidebar-view-button+sidebar-view-button>&{margin-left:.4rem}sidebar-view-button:last-of-type>&{margin-right:.1rem}& svg{width:14px;height:14px}&:hover{color:var(--text);background:rgb(from var(--text) r g b / .08)}&.active{color:var(--accent);background:rgb(from var(--text) r g b / .1)}.view-btn-count{position:absolute;top:-4px;right:-4px;background:var(--bg);color:var(--muted);font-size:8.5px;font-weight:600;border-radius:999px;padding:0 3px;min-width:11px;text-align:center;line-height:11px;font-variant-numeric:tabular-nums;pointer-events:none}&.active .view-btn-count{color:var(--accent)}}#file-list{list-style:none;flex:1;overflow-y:auto;overscroll-behavior:none;scrollbar-gutter:stable;-webkit-app-region:no-drag;app-region:no-drag;padding:0 .35rem .25rem 0;margin:0;scrollbar-width:thin;scrollbar-color:var(--border) transparent;&::-webkit-scrollbar{width:5px}&::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}}.file-group-header{display:flex;align-items:center;justify-content:space-between;padding:.45rem .35rem .2rem .55rem;font-size:.62rem;font-weight:700;text-transform:uppercase;letter-spacing:.12em;color:var(--muted);user-select:none;&:first-child{padding-top:.25rem}.group-count{font-weight:500;letter-spacing:.04em;color:var(--muted);font-size:.7rem}}.file-group-header.workspace-header .workspace-header-actions{display:flex;align-items:center;gap:.35rem}.workspace-add{width:18px;height:18px;display:grid;place-items:center;background:transparent;color:var(--muted);border:1px solid transparent;border-radius:4px;padding:0;&:hover{color:var(--text);border-color:var(--accent)}}.file-item.workspace-item{display:flex;align-items:stretch;gap:.15rem}.file-item.workspace-item button.file-name{flex:1;min-width:0}.file-item.workspace-item .workspace-count{align-self:center;margin-right:.35rem}.workspace-share,.workspace-export,.workspace-leave{flex-shrink:0;width:22px;align-self:center;height:22px;display:none;place-items:center;background:transparent;color:var(--muted);border:1px solid transparent;border-radius:4px;padding:0;&:hover:not(:disabled){color:var(--text);background:rgb(from var(--text) r g b / .06);border-color:var(--accent)}}.workspace-leave:hover:not(:disabled){color:var(--critical, #f87171);border-color:var(--critical, #f87171)}@media(hover:hover){.file-item.workspace-item:hover .workspace-share,.file-item.workspace-item:hover .workspace-export,.file-item.workspace-item:hover .workspace-leave{display:grid}}.workspace-rename-input{width:100%;box-sizing:border-box;background:var(--surface);color:var(--text);border:1px solid var(--accent);border-radius:3px;padding:0 .25rem;margin:-1px 0;font:inherit;font-size:.76rem;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;outline:none}.file-item{list-style:none;position:relative;&.hidden{display:none}}.file-item.current:after{content:"";position:absolute;left:0;top:50%;transform:translateY(-50%);width:3px;height:18px;background:var(--accent);border-radius:0 2px 2px 0;pointer-events:none}.file-item button.file-name{display:flex;align-items:center;gap:.5rem;width:100%;box-sizing:border-box;padding:.2rem .3rem .2rem .55rem;background:transparent;color:var(--text);border:1px solid transparent;border-radius:0 5px 5px 0;font-family:inherit;font-size:.78rem;text-align:left;&:hover{background:rgb(from var(--text) r g b / .04)}.file-icon{flex-shrink:0;color:var(--muted)}.file-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.76rem;line-height:14.5px}}.file-item .file-count{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;color:var(--muted);opacity:.65;font-size:.68rem;font-weight:500;font-variant-numeric:tabular-nums}.workspace-count-missing{margin-left:2px;opacity:.55;font-style:italic}.file-item.current button.file-name{background:rgb(from var(--text) r g b / .05);border-color:var(--border);.file-icon,.file-count{color:var(--text)}}.file-item.indented button.file-name{padding-left:1.3rem}.file-item.indented:before{content:"";position:absolute;left:.85rem;top:0;bottom:0;width:1px;background:var(--border)}.file-item.bundle-missing>.file-name,.file-item.report-missing>.file-name{display:flex;align-items:center;gap:.5rem;padding:.2rem .3rem .2rem 1.4rem;color:var(--muted);font-size:.78rem;font-style:italic;cursor:help;.file-icon{flex-shrink:0;color:var(--muted);font-style:normal}.file-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.76rem;line-height:14.5px}}:host-context(body.theme-pink) .workspace-rename-input,:host-context(body.theme-pink) .file-item button.file-name .file-label,:host-context(body.theme-pink) .file-item.bundle-missing .file-label,:host-context(body.theme-pink) .file-item.report-missing .file-label{font-family:inherit}.file-item.dragging button.file-name{opacity:.4}.file-item.workspace-item.drag-over button.file-name,.file-item.indented.drag-over button.file-name{background:rgb(from var(--accent) r g b / .12);border-color:var(--accent)}.file-group-header.drag-over{background:rgb(from var(--accent) r g b / .12);border-radius:4px}.sidebar-actions{padding:.35rem .55rem .45rem;border-top:1px solid var(--border);display:flex;gap:.35rem;align-items:center;justify-content:space-between;& button{background:transparent;border:1px solid var(--border);color:var(--muted);border-radius:4px;padding:.2rem .5rem;font-size:.72rem;font-family:inherit;-webkit-app-region:no-drag;app-region:no-drag;&:hover{color:var(--text);border-color:var(--accent)}&.danger:hover{color:var(--critical);border-color:var(--critical)}&[disabled]{opacity:.4;border-color:var(--border)!important;color:var(--muted)!important}}}sidebar-delete-current{display:contents}sidebar-delete-current button{display:inline-flex;align-items:center;gap:.35rem;.trash-icon{flex-shrink:0}}#sync-status{display:inline-flex;align-items:center;gap:.35rem;border-color:transparent;&:hover{border-color:var(--accent)}.sync-dot{width:8px;height:8px;border-radius:50%;background:var(--muted);flex-shrink:0;box-shadow:0 0 0 1px rgb(from var(--text) r g b / .15)}&[data-status=online] .sync-dot{background:var(--green)}&[data-status=connecting] .sync-dot{background:var(--medium)}&[data-status=offline] .sync-dot{background:var(--critical)}}#sync-status[data-degraded] .sync-dot{box-shadow:0 0 0 2px var(--medium)}#sync-status[hidden]{display:none}
17
+ `;var hp=`.file-icon.brand-deepview{.bg{fill:#2563eb}.fg{fill:#fff}}.file-icon.brand-claude{.bg{fill:#d97757}.fg{fill:#fff}}.file-icon.brand-codex{.bg{fill:#fff;stroke:#000;stroke-width:.5}.fg{fill:#000}}.file-icon.brand-vercel{.bg{fill:#000;stroke:#fff;stroke-width:.5}.fg{fill:#fff}}
18
+ `;var gp=`*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}dialog{margin-top:5rem;margin-inline:auto;border:1px solid var(--border);border-radius:10px;background:var(--surface);color:var(--text);padding:1.1rem 1.25rem 1rem;max-width:480px;width:min(94vw,480px);box-shadow:0 20px 60px #00000059;&::backdrop{background:rgb(from var(--theme-bar) r g b / .55);backdrop-filter:blur(2px)}}header h3{margin:0 0 .6rem;font-size:1rem;font-weight:600}.nwd-input{display:block;width:100%;box-sizing:border-box;padding:.5rem .65rem;border:1px solid var(--border);border-radius:6px;background:var(--bg, var(--surface));color:var(--text);font:inherit;font-size:.88rem;&: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)}}.nwd-note{margin:.55rem 0 0;color:var(--muted);font-size:.74rem;line-height:1.45}.nwd-intro{margin:0 0 .8rem;color:var(--muted);font-size:.82rem;line-height:1.5}.nwd-actions{display:flex;align-items:center;gap:.4rem;margin-top:.8rem;padding-top:.7rem;border-top:1px solid var(--border)}.nwd-spacer{flex:1}.nwd-actions button{background:transparent;border:1px solid var(--border);color:var(--text);border-radius:5px;padding:.35rem .9rem;font:inherit;font-size:.8rem;&:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}&.primary{background:var(--accent);color:var(--surface);border-color:var(--accent);&:hover:not(:disabled){color:var(--surface);filter:brightness(1.08)}}&.danger{color:var(--critical, #f87171);border-color:var(--border);&:hover:not(:disabled){border-color:var(--critical, #f87171);color:var(--critical, #f87171)}}&:disabled{opacity:.5}}@media(display-mode:window-controls-overlay){dialog{-webkit-app-region:no-drag;app-region:no-drag}}
19
+ `;var I=class extends H{static styles=[T(gp)];firstUpdated(){this.beforeOpen();let t=this.renderRoot.querySelector("dialog");if(t){try{t.showModal()}catch(r){this._settled=!0,this.dispatchEvent(new CustomEvent("modal-conflict",{detail:{cause:r}}));return}this.focusInitial()}}beforeOpen(){}focusInitial(){(this.renderRoot.querySelector("input, textarea")??this.renderRoot.querySelector("button.primary")??this.renderRoot.querySelector("button"))?.focus()}_finish(t){this._settled||(this._settled=!0,this.renderRoot.querySelector("dialog")?.close(),this.dispatchEvent(new CustomEvent("resolve",{detail:t})))}_onClose=()=>this._finish(null)};function q(e,t={}){return new Promise(r=>{let n=document.createElement(e);Object.assign(n,t),n.addEventListener("resolve",o=>{n.remove(),r(o.detail)}),document.body.append(n)})}var Qe=`dialog{max-width:520px;width:min(94vw,520px)}.wsl-field{display:block;margin-top:.6rem;color:var(--text);font-size:.78rem;>span{display:block;margin-bottom:.25rem;color:var(--muted);font-size:.72rem;text-transform:uppercase;letter-spacing:.04em}}.wsl-ack{display:flex;align-items:flex-start;gap:.5rem;margin-top:.6rem;color:var(--text);font-size:.8rem;line-height:1.4;>input[type=checkbox]{flex:0 0 auto;margin-top:.15rem}>span{flex:1 1 auto}}.wsl-link{display:block;width:100%;box-sizing:border-box;padding:.5rem .65rem;border:1px solid var(--border);border-radius:6px;background:var(--bg, var(--surface));color:var(--text);font:inherit;font-size:.78rem;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;resize:vertical;word-break:break-all}.wsl-error{margin:.55rem 0 0;color:var(--critical, #f87171);font-size:.74rem;line-height:1.4}.wsl-warning{padding:.55rem .65rem;border:1px solid var(--critical, #f87171);border-radius:6px;background:rgb(from var(--critical, #f87171) r g b / .08)}.wsl-optout{display:flex;align-items:center;gap:.5rem;margin-top:.7rem;color:var(--text);font-size:.78rem}.nwd-input:disabled{opacity:.5}
20
+ `;var pl=class extends I{static styles=[...I.styles,T(Qe)];static properties={_userName:{state:!0},_busy:{state:!0},_error:{state:!0},_phase:{state:!0},_success:{state:!0},_orphan:{state:!0},_orphanAck:{state:!0},_canCancel:{state:!0}};constructor(){super(),this._userName="",this._busy=!1,this._error="",this._phase="",this._success=!1,this._orphan=!1,this._orphanAck=!1,this._canCancel=!0,this._abortController=null}updated(t){if(t.has("_success")&&this._success){let r=this.renderRoot.querySelector("footer button.primary");r&&r.focus()}}beforeOpen(){typeof location<"u"&&(this._userName=location.hostname||"DeepView"),this._orphan=xn(),this._vaultStateUnsub=ge(()=>{if(this._settled)return;let t=xn();this._orphan&&!t&&X()?(this._error="Encryption was just enabled in another tab. Close this dialog and reload to unlock.",this._busy=!1,this._canCancel=!0):this._orphan!==t&&(this._orphan=t)})}async focusInitial(){await this.updateComplete;let t=this._orphan?'input[data-role="orphan-ack"]':'input[data-role="name"]';this.renderRoot.querySelector(t)?.focus()}disconnectedCallback(){if(super.disconnectedCallback(),this._vaultStateUnsub){try{this._vaultStateUnsub()}catch{}this._vaultStateUnsub=null}}_finish(t){if(!this._settled){if(this._abortController)try{this._abortController.abort()}catch{}super._finish(!!t)}}_onClose=()=>this._finish(this._success);_onCancel=()=>{this._busy&&!this._canCancel||this._finish(!1)};_onDialogCancel=t=>{if(this._busy&&!this._canCancel){t.preventDefault();return}this._finish(!1)};_onNameInput=t=>{this._userName=t.target.value};_onOrphanAckInput=t=>{this._orphanAck=t.target.checked};_onWipeOrphan=async()=>{if(!this._busy&&this._orphanAck){if(X()){this._error="Encryption was just enabled in another tab. Reload this page to unlock.";return}this._busy=!0,this._canCancel=!1,this._error="",this._phase="Clearing previous vault state\u2026";try{await Cn({refuseIfEnabled:!0}),location.reload()}catch(t){this._error=`Could not clear previous vault state: ${t?.message??t}`,this._phase=""}finally{this._busy=!1,this._canCancel=!0}}};_onEnable=async()=>{if(!this._busy){if(!mt()){this._error="Passkeys are not supported in this browser.";return}this._busy=!0,this._canCancel=!0,this._error="",this._phase="Registering passkey\u2026",this._abortController=new AbortController;try{await qi({userName:this._userName.trim()||"DeepView user",rpName:"DeepView",signal:this._abortController.signal,migrate:async({seal:r})=>{this._canCancel=!1,this._phase="Encrypting workspaces and metadata\u2026",await zi({seal:r}),this._phase="Encrypting triage data\u2026",await qa({seal:r}),this._phase="Encrypting report files\u2026",await aa({seal:r}),this._phase="Encrypting bundles\u2026",await ca({seal:r})}})&&(this._success=!0,this._phase="")}catch(t){t?.name==="AbortError"?this._error="":this._error=t?.message??String(t),this._phase=""}finally{this._busy=!1,this._canCancel=!0,this._abortController=null}}};_body(){if(this._orphan)return c`<p class="wsl-error">DeepView found an abandoned passkey setup on this device. The original passkey can no longer be accessed, so any local data still encrypted under it is <strong>unreadable</strong> and cannot be recovered.</p><p class="nwd-note">To enable encryption, DeepView will <strong>permanently delete ALL local DeepView data on this device</strong> — including any plaintext workspaces or reports you may have added after the previous passkey was lost — and then register a fresh passkey. This is irreversible. There is no backup.</p><label class="wsl-ack"><input type="checkbox" data-role="orphan-ack" .checked="${this._orphanAck}" ?disabled="${this._busy}" @change="${this._onOrphanAckInput}"> <span>I understand all local DeepView data on this device will be deleted.</span></label> ${this._phase?c`<p class="nwd-note">${this._phase}</p>`:g} ${this._error?c`<p class="wsl-error">${this._error}</p>`:g}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" ?disabled="${this._busy&&!this._canCancel}" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" ?disabled="${this._busy||!this._orphanAck}" @click="${this._onWipeOrphan}">${this._busy?"Working\u2026":"Wipe and continue"}</button></footer>`;if(this._success)return c`<p class="nwd-note"><strong>Encryption is on.</strong> Your triage data and report files are now sealed under your passkey. You'll be asked to unlock with the passkey on every fresh load.</p><footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" class="primary" @click="${()=>this._finish(!0)}">Close</button></footer>`;let t=mt();return c`<p class="nwd-note">Passkey encryption protects your local triage and report data with a hardware-backed key (TouchID, Windows Hello, security key). Without the passkey, the data on disk is unreadable — even to scripts running on this origin.</p><p class="wsl-error"><strong>If you lose access to this passkey, your data CANNOT be recovered.</strong> DeepView has no backup key, no recovery code, and no escrow. Make sure your passkey is backed up (iCloud Keychain / Google Password Manager sync, or a second registered device) before relying on encryption for important data.</p><p class="nwd-note"><strong>Opt-in.</strong> You can disable encryption later from the lock icon in the sidebar header — the data is rewritten as plaintext and DeepView signals your authenticator to remove the passkey (where supported).</p>${t?g:c`<p class="wsl-error">Your browser doesn't expose the WebAuthn passkey API. Try Chrome, Safari, Edge, or Firefox in a recent version on a device with a platform authenticator.</p>`} <label class="wsl-field"><span>Passkey label</span> <input type="text" class="nwd-input" data-role="name" placeholder="DeepView" maxlength="200" .value="${this._userName}" @input="${this._onNameInput}"></label> ${this._phase?c`<p class="nwd-note">${this._phase}</p>`:g} ${this._error?c`<p class="wsl-error">${this._error}</p>`:g}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" ?disabled="${this._busy&&!this._canCancel}" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" ?disabled="${!t||this._busy}" @click="${this._onEnable}">${this._busy?"Working\u2026":"Enable encryption"}</button></footer>`}render(){return c`<dialog @close="${this._onClose}" @cancel="${this._onDialogCancel}"><header><h3>${this._success?"Encryption enabled":this._orphan?"Previous passkey setup detected":"Enable passkey encryption"}</h3></header>${this._body()}</dialog>`}};customElements.define("passkey-setup-dialog",pl);function Ts(){return q("passkey-setup-dialog")}var fl=class extends I{static styles=[...I.styles,T(Qe)];static properties={_busy:{state:!0},_error:{state:!0}};constructor(){super(),this._busy=!1,this._error="",this._abortController=null}_finish(t){if(!this._settled){if(this._abortController)try{this._abortController.abort()}catch{}super._finish(!!t)}}_onCancel=()=>this._finish(!1);_onUnlock=async()=>{if(!this._busy){this._busy=!0,this._error="",this._abortController=new AbortController;try{if(await Sn({signal:this._abortController.signal})){this._finish(!0);return}this._error=""}catch(t){this._error=t?.message??String(t)}finally{this._busy=!1,this._abortController=null}}};render(){return c`<dialog @close="${this._onClose}"><header><h3>Unlock your data</h3></header><p class="nwd-note">Your triage data and report files are encrypted with a passkey on this device. Unlock to load them.</p>${this._error?c`<p class="wsl-error">${this._error}</p>`:g}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">${this._busy?"Cancel":"Later"}</button> <button type="button" class="primary" ?disabled="${this._busy}" @click="${this._onUnlock}">${this._busy?"Waiting\u2026":"Unlock with passkey"}</button></footer></dialog>`}};customElements.define("passkey-unlock-dialog",fl);function Is(){return q("passkey-unlock-dialog")}var mp=c`<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="8" width="10" height="6" rx="1"/><path d="M5 8V5.5a3 3 0 0 1 6 0V8"/></svg>`,Mb=c`<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="8" width="10" height="6" rx="1"/><path d="M5 8V5a3 3 0 0 1 6 -0.5"/></svg>`,$e=null;function bp(){if(!$e)return;if(!mt()){$e.hidden=!0;return}$e.hidden=!1;let e=X(),t=st();$e.classList.toggle("encrypted",e&&t),$e.classList.toggle("locked-pending",e&&!t),e&&t?($e.title="Encryption on \u2014 click to disable",$e.setAttribute("aria-label","Disable encryption"),W(mp,$e)):e?($e.title="Encryption on, locked \u2014 click to unlock",$e.setAttribute("aria-label","Unlock encrypted data"),W(mp,$e)):($e.title="Encryption off \u2014 click to enable",$e.setAttribute("aria-label","Enable encryption"),W(Mb,$e))}async function Lb(){if(confirm(`Disable encryption?
21
21
 
22
22
  Your local triage and report data will be rewritten as plaintext.
23
23
 
24
- IMPORTANT: DeepView cannot directly delete your passkey. Most browsers / password managers require you to remove the entry manually after disabling. You can re-enable encryption later.`))try{(await Ki({migrate:async({open:t})=>{await Ui({open:t}),await Ha({open:t}),await ia({open:t}),await la({open:t})}}))?.disabled&&alert(`Encryption disabled. Your data is now plaintext.
24
+ IMPORTANT: DeepView cannot directly delete your passkey. Most browsers / password managers require you to remove the entry manually after disabling. You can re-enable encryption later.`))try{(await Gi({migrate:async({open:t})=>{await Wi({open:t}),await Ga({open:t}),await la({open:t}),await da({open:t})}}))?.disabled&&alert(`Encryption disabled. Your data is now plaintext.
25
25
 
26
26
  To complete cleanup, remove the DeepView passkey from your password manager / OS settings:
27
27
  \u2022 macOS / iOS: Settings \u2192 Passwords
28
28
  \u2022 Windows: Settings \u2192 Accounts \u2192 Sign-in options \u2192 Passkeys
29
29
  \u2022 Chrome: chrome://settings/passkeys
30
- \u2022 Hardware security key: use the vendor's management tool`)}catch(e){alert(`Could not disable encryption: ${e?.message??e}`)}}async function nb(){await Cs()}function Ju(e){if(!e||e===ke)return;ke=e;let t=!1;ke.addEventListener("click",async()=>{if(!t){t=!0;try{if(!X()){await nb();return}if(!st()){await Es();return}await rb()}finally{t=!1}}}),he(Yu),Yu()}var je=ut(class extends Qe{constructor(e){if(super(e),e.type!==Fe.PROPERTY&&e.type!==Fe.ATTRIBUTE&&e.type!==Fe.BOOLEAN_ATTRIBUTE)throw Error("The `live` directive is not allowed on child or event bindings");if(!ed(e))throw Error("`live` bindings can only contain a single expression")}render(e){return e}update(e,[t]){if(t===ie||t===g)return t;let r=e.element,n=e.name;if(e.type===Fe.PROPERTY){if(t===r[n])return ie}else if(e.type===Fe.BOOLEAN_ATTRIBUTE){if(!!t===r.hasAttribute(n))return ie}else if(e.type===Fe.ATTRIBUTE&&r.getAttribute(n)===t+"")return ie;return Po(e),t}});var Ts='<path class="bg" d="M3 2h6l4 4v8H3z"/><path fill="rgba(0,0,0,.18)" d="M9 2v4h4Z"/>',G={default:`<svg class="file-icon brand-deepview" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true">${Ts}<path class="fg" d="M7.843 6.719c-1.605 0-2.926 1.292-3.477 1.947.466.58 1.872 2.024 3.496 2.024s2.907-1.292 3.486-2.005c-.627-.703-1.88-1.966-3.505-1.966m.019 3.857c-1.51 0-2.802-1.263-3.353-1.9.55-.617 1.814-1.852 3.334-1.852 1.51 0 2.698 1.12 3.335 1.852-.533.618-1.787 1.9-3.316 1.9m-.019-3.42c-.826 0-1.577.694-1.577 1.596 0 .789.599 1.577 1.577 1.577.893 0 1.587-.684 1.587-1.577-.01-.779-.627-1.596-1.587-1.596m0 3.069a1.476 1.476 0 0 1-1.482-1.473c0-.722.599-1.491 1.482-1.491.846 0 1.482.693 1.492 1.491 0 .808-.618 1.473-1.492 1.473m.01-2.727c-.637 0-1.264.532-1.264 1.244 0 .627.475 1.235 1.245 1.245.684 0 1.254-.522 1.254-1.244 0-.58-.475-1.236-1.235-1.245m-.02 2.403a1.167 1.167 0 0 1-1.149-1.159c0-.532.456-1.14 1.169-1.149.56 0 1.149.427 1.159 1.15 0 .636-.485 1.158-1.179 1.158m-.769-1.833c-.19.238-.275.494-.237.864l.74.057zm1.026-.294c-.295-.057-.665 0-.912.228l.323.607zm.133.047-.38.56.988.114c-.057-.275-.323-.579-.608-.674m-.124.741.456.912c.21-.209.352-.484.314-.836zm-1.225.504a.97.97 0 0 0 .57.617l.399-.551zm.713.664c.313.076.636.01.845-.161l-.295-.618zm-.637 1.55c0 .028-.028.066-.066.066h-.59c-.028 0-.066-.028-.066-.066s.029-.066.067-.066h.579c.048 0 .076.028.076.066m.712 0c0 .028-.028.066-.066.066h-.437c-.028 0-.066-.028-.066-.066s.028-.066.066-.066h.437c.038 0 .066.028.066.066m.666 0c0 .028-.029.066-.067.066h-.37c-.029 0-.067-.028-.067-.066s.029-.066.067-.066h.37c.038 0 .067.028.067.066m-1.672.351c0 .029-.029.067-.067.067h-.295c-.028 0-.066-.028-.066-.066 0-.029.029-.067.067-.067h.294c.038 0 .066.028.066.066m.694 0c0 .029-.028.067-.066.067h-.409c-.028 0-.066-.028-.066-.066 0-.029.028-.067.066-.067h.399c.038 0 .076.028.076.066m.732 0c0 .029-.029.067-.067.067h-.465c-.029 0-.067-.028-.067-.066 0-.029.029-.067.067-.067h.465c.038 0 .067.028.067.066m-1.093.371a.065.065 0 0 1-.067.066h-.627c-.028 0-.075-.028-.066-.066 0-.028.029-.066.067-.066h.627c.038 0 .066.028.066.066m.684 0a.065.065 0 0 1-.066.066h-.39c-.028 0-.076-.028-.066-.066 0-.028.028-.066.066-.066h.39c.038 0 .066.028.066.066M5.088 6.263c-.019-.105-.114-.19-.237-.19s-.257.104-.257.237.105.238.247.238c.105 0 .218-.076.238-.18h.864v.826l.095-.048V6.31c0-.028-.019-.057-.048-.057h-.902zm-.237.19c-.076 0-.143-.066-.143-.143s.066-.142.143-.142.142.066.142.143c.01.076-.066.142-.143.142m2.89-.323H6.38l.418-.475v-.332a.255.255 0 0 0 .218-.248c0-.123-.114-.256-.256-.256s-.266.114-.266.257c0 .123.095.228.209.247v.284l-.456.523v.893l.095-.047v-.742h1.396c.029 0 .067-.009.067-.057 0-.028-.019-.047-.067-.047m-1.13-1.054c0-.076.066-.152.152-.152s.152.066.152.151c0 .076-.066.152-.152.152s-.152-.066-.152-.152m-.836 5.264h-.874c-.019-.105-.114-.219-.247-.219s-.256.105-.256.257c0 .132.114.275.266.275.104 0 .218-.076.237-.19h.827v.608l-.257.285a.3.3 0 0 0-.095-.019c-.133 0-.256.105-.256.228 0 .133.104.238.237.238.124 0 .247-.105.247-.238a.23.23 0 0 0-.057-.152l.285-.304v-.712c0-.029-.019-.058-.057-.058m-1.121.219a.16.16 0 0 1-.152-.161c0-.077.066-.162.152-.162s.152.066.152.152-.066.171-.152.171m.713 1.14c-.076 0-.143-.066-.143-.143s.066-.133.143-.133.142.067.142.143c0 .066-.066.133-.143.133m5.472-1.377a.24.24 0 0 0-.237.208h-1.13c-.029 0-.038.02-.038.048v.712l-.323.39h-.029a.245.245 0 0 0-.247.247c0 .133.114.256.247.256s.247-.113.247-.256a.26.26 0 0 0-.123-.219l.313-.38v-.674h1.083c.019.105.114.2.238.2.133 0 .266-.105.266-.257 0-.133-.105-.276-.266-.276m-1.758 1.767a.15.15 0 0 1-.143-.152c0-.075.067-.142.143-.142s.152.066.152.143a.15.15 0 0 1-.152.151m1.758-1.33a.15.15 0 0 1-.143-.152.147.147 0 0 1 .294.001.15.15 0 0 1-.152.151M8.917 5.55h-.399a.075.075 0 0 1-.076-.076c0-.028.029-.066.067-.066h.418c.028 0 .066.028.066.066s-.038.076-.076.076m.742 0H9.22c-.038 0-.067-.028-.067-.076 0-.028.029-.066.067-.066h.437c.038 0 .066.028.066.066s-.028.076-.066.076m.883 0h-.598c-.029 0-.067-.028-.067-.076 0-.028.029-.066.067-.066h.598c.028 0 .066.028.066.066s-.028.076-.066.076m-1.282.4h-.741c-.038 0-.076-.029-.076-.067s.028-.076.066-.076h.75c.039 0 .067.038.067.076 0 .029-.028.067-.066.067m.797 0h-.503c-.038 0-.076-.029-.076-.067s.028-.066.066-.066h.513c.038 0 .067.028.067.066 0 .029-.029.067-.067.067m.476 0h-.19c-.039 0-.067-.029-.067-.067s.028-.066.066-.066h.2c.028 0 .066.028.066.066 0 .029-.028.067-.075.067m-1.682.398h-.332c-.039 0-.077-.028-.077-.066s.029-.066.067-.066h.342c.038 0 .076.028.076.066s-.028.066-.076.066m.789 0h-.494c-.038 0-.067-.028-.067-.066s.029-.066.067-.066h.494c.038 0 .066.028.066.066s-.028.066-.066.066m.893 0h-.599c-.038 0-.076-.028-.076-.066s.028-.066.066-.066h.618c.028 0 .066.028.066.066s-.028.066-.076.066m.418.305a.69.69 0 0 0-.674.712c0 .086.019.18.048.257l.085.066c-.028-.085-.057-.171-.057-.304 0-.285.228-.646.598-.646.295 0 .599.228.599.636a.58.58 0 0 1-.599.59.8.8 0 0 1-.237-.048l.123.114a.4.4 0 0 0 .114.01c.39 0 .684-.276.684-.666 0-.313-.266-.712-.684-.722m.353.552-.019-.01-.161.19-.143-.01-.057-.047-.019-.133.19-.2a.28.28 0 0 0-.361.077c-.076.095-.076.209-.038.351l-.247.304.171.152.266-.266c.142.038.285.019.38-.095a.31.31 0 0 0 .038-.313"/></svg>`,"claude-security":`<svg class="file-icon brand-claude" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true">${Ts}<path class="fg" d="m5.875 10.154 1.376-.772.023-.067-.023-.037h-.067l-.23-.015-.787-.02-.681-.03-.661-.035-.166-.035-.156-.205.016-.103.14-.094.2.018.442.03.665.046.481.028.714.075h.113l.016-.047-.039-.028-.03-.028-.687-.466-.744-.492-.39-.284-.21-.143-.106-.135-.046-.294.19-.21.258.017.065.018.26.2.557.43.726.535.106.089.042-.03.006-.022-.048-.08-.395-.713-.422-.726-.187-.301-.05-.18a1 1 0 0 1-.03-.213l.218-.296.12-.039.29.039.123.106.18.413.293.65.453.884.133.262.07.242.027.075h.046v-.043l.038-.497.069-.611.067-.787.023-.221.11-.266.218-.143.17.081.14.2-.02.13-.083.54-.163.846-.106.567h.062l.07-.07.287-.382.482-.602.213-.239.248-.264.159-.125h.301l.221.329-.099.34-.31.393-.256.333-.369.496-.23.397.021.032.055-.006.832-.177.45-.081.537-.092.243.113.026.115-.096.236-.573.141-.673.135-1.003.237-.012.01.014.017.452.042.193.01h.473l.88.066.23.153.138.186-.023.141-.354.181-.478-.113-1.116-.266-.383-.096h-.053v.032l.32.312.584.528.731.68.037.168-.094.133-.099-.014-.643-.484-.248-.218-.561-.472H9.08v.05l.129.189.684 1.027.035.315-.05.103-.177.062-.194-.036-.4-.561-.413-.632-.333-.567-.041.023-.197 2.116-.092.108-.212.082-.177-.135-.094-.218.094-.43.113-.561.092-.447.083-.554.05-.184-.004-.013-.04.006-.418.574-.636.858-.503.539-.12.048-.21-.108.02-.193.117-.172.696-.886.42-.549.27-.317-.001-.046h-.016l-1.85 1.201-.328.042-.142-.132.018-.218.067-.071.556-.383Z"/></svg>`,"codex-security":`<svg class="file-icon brand-codex" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true">${Ts}<path class="fg" d="M11.04 8.364a1.72 1.72 0 0 0-.152-1.432 1.8 1.8 0 0 0-1.925-.846 1.8 1.8 0 0 0-.778-.498 1.8 1.8 0 0 0-.927-.05 1.8 1.8 0 0 0-.827.414 1.77 1.77 0 0 0-.507.767 1.8 1.8 0 0 0-.683.297 1.75 1.75 0 0 0-.499.549 1.75 1.75 0 0 0 .22 2.07 1.72 1.72 0 0 0 .151 1.432 1.8 1.8 0 0 0 1.926.846 1.77 1.77 0 0 0 1.333.587c.78 0 1.47-.496 1.707-1.227a1.8 1.8 0 0 0 .684-.298 1.75 1.75 0 0 0 .499-.548 1.75 1.75 0 0 0-.222-2.063m-2.667 3.678a1.33 1.33 0 0 1-.851-.304l.042-.024 1.413-.804a.23.23 0 0 0 .116-.199V8.747l.597.34q.01.005.011.015v1.629a1.323 1.323 0 0 1-1.328 1.31m-2.857-1.203a1.3 1.3 0 0 1-.158-.879l.042.025 1.414.805a.23.23 0 0 0 .23 0l1.729-.982v.68a.02.02 0 0 1-.01.018l-1.431.814a1.34 1.34 0 0 1-1.816-.48m-.372-3.037a1.32 1.32 0 0 1 .7-.574v1.656a.22.22 0 0 0 .114.197l1.72.979-.598.34a.02.02 0 0 1-.021 0L5.63 9.587a1.304 1.304 0 0 1-.487-1.791zm4.907 1.125L8.327 7.94l.596-.34a.02.02 0 0 1 .02 0l1.43.814a1.3 1.3 0 0 1 .512.528 1.3 1.3 0 0 1-.118 1.4 1.33 1.33 0 0 1-.595.436V9.122a.23.23 0 0 0-.12-.195m.594-.881-.042-.025-1.411-.812a.23.23 0 0 0-.232 0l-1.727.983v-.68a.02.02 0 0 1 .008-.018l1.429-.813a1.34 1.34 0 0 1 1.425.061 1.3 1.3 0 0 1 .55 1.298zM6.908 9.252l-.597-.34a.02.02 0 0 1-.012-.016V7.271c0-.249.073-.493.209-.703s.329-.378.557-.483a1.35 1.35 0 0 1 1.415.18l-.042.023-1.413.804a.23.23 0 0 0-.116.2zm.324-.69.77-.438.77.438v.875l-.768.437-.77-.437z"/></svg>`,deepsec:`<svg class="file-icon brand-vercel" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true">${Ts}<path class="fg" d="m8 5.97 3.5 6.062h-7Z"/></svg>`};function Ke(e){let t=Un(e);if(t==="deepsec")return"deepsec";if(t==="claude-security")return"claude-security";let r=e.toLowerCase();return r.endsWith(".codex")?"codex-security":r.endsWith(".md")?"claude-security":"default"}function qe(e){return e.toLowerCase().endsWith(".codex")?e.slice(0,-6).replaceAll("__","/"):e}var Xu=globalThis[Symbol.for("@rray/frontend")];if(!Xu)throw new Error("@rray/frontend global not installed; view.js must run before lazy bundles import this wrapper");var{LitElement:Gx,html:cl,nothing:Qu,unsafeCSS:Yx,render:Jx,StateElement:Xx,classMap:Qx,repeat:Zx,styleMap:e1}=Xu;var Ge={critical:6,high:5,medium:4,low:3,high_bug:2,bug:1,informational:0},ge=["critical","high","medium","low","high_bug","bug","informational"],As="node_modules";function Zu(e){let t=n=>/(^|\/)node_modules\//u.test(n),r=!1;e:for(let n of e){for(let o of n.groups??[])for(let s of o)if(t(s.file)){r=!0;break e}if(n.tree){for(let o of Object.keys(n.tree))if(t(o)){r=!0;break e}}}As=r?"node_modules":"dependencies"}function ep(){return As}function qt(e){return As==="node_modules"?/(^|\/)node_modules\//u.test(e):/(^|\/)dependencies\//u.test(e)}function De(e){return typeof e!="number"||!Number.isFinite(e)?null:`${e.toLocaleString()} B`}function At(e){if(e.length<=1)return{prefix:"",stripped:[...e]};let t=e.map(i=>i.split("/")),r=Math.min(...t.map(i=>i.length)),n=0;for(let i=0;i<r-1&&t.every(l=>l[i]===t[0][i]);i++)n=i+1;if(n>0&&t[0][n-1].startsWith("@")&&n--,n>0&&t[0][n-1]==="node_modules"&&n--,n===0)return{prefix:"",stripped:[...e]};let o=`${t[0].slice(0,n).join("/")}/`,s=t.map(i=>i.slice(n).join("/"));return{prefix:o,stripped:s}}function ob(e){let t=As==="node_modules"?/^(?:.*\/)?node_modules\/(?:@[^/]+\/[^/]+|[^/]+)\/(.*)$/u:/^(?:.*\/)?dependencies\/(?:@[^/]+\/[^/]+|[^/]+)\/(.*)$/u;return e.match(t)?.[1]??e}function et(e,t){if(!e)return e;let r=e;t?.exportsMode==="isolate"&&(r=r.replace(/^\((?:[^()]|\([^()]*\))*\): \[export:\s*\w+\] /u,""),r=r.replace(/^\[export:\s*\w+\] /u,""));let n=[t?.exportName,t?.methodName].filter(Boolean);for(let o of n){let s=o.replaceAll(/[.*+?^${}()|[\]\\]/gu,"\\$&");r=r.replaceAll(new RegExp(`\\[export:\\s*${s}\\]\\s*`,"gu"),"")}for(let o of n){let s=o.replaceAll(/[.*+?^${}()|[\]\\]/gu,"\\$&");r=r.replace(new RegExp(`^\\(\`?${s}\`?\\): `,"u"),"")}return r}function gr(e){let t=e?.exportName,r=e?.methodName;return t&&r&&t!==r?`${t}.${r}`:t||r||""}function tp(e){return[e.file,e.description,e.recommendation,e.confidenceReason,e.discoveredIn,e.repo?.github].filter(Boolean).join(`
31
- `).toLowerCase()}function dl(e){return e&&e.replace(/^[^/]+\//u,"").replace(/^claude-/u,"").replaceAll("-"," ")}function mr(e){return[e.type,dl(e.model),e.effort,e.exportsMode].filter(Boolean).join(" \xB7 ")}function Is(e){if(e.length===0)return"";let t=e[0];for(let r=1;r<e.length;r++){for(;t&&!e[r].startsWith(t);)t=t.slice(0,-1);if(!t)return""}return t}function sb(e){if(!e)return null;let t=e.trim().replace(/\/$/u,"");return t?/^https?:\/\//iu.test(t)?t:/^github\.com\//iu.test(t)?`https://${t}`:`https://github.com/${t}`:null}function to(e,t,r){if(t)return`https://github.com/${t}/blob/HEAD/${ob(e)}`;if(qt(e))return null;let n=sb(r);return n?`${n}/blob/HEAD/${e}`:null}function ul(e,t,r){let n=to(e,t,r);return n?cl`<a href="${n}" target="_blank" rel="noopener">${e}</a>`:e}function Gr(e){if(typeof e!="string"||e.length===0)return!1;try{let t=new URL(e);return t.protocol==="http:"||t.protocol==="https:"}catch{return!1}}function rp(e,t,r,n){let o=parseInt(t,10);if(!Number.isFinite(o))return Qu;let s=to(e,r,n),i=`line ${o}`;return s?cl`<a href="${`${s}#L${o}`}" target="_blank" rel="noopener">${i}</a>`:i}function np(e,t){return!e||!t?null:`${/^https?:/iu.test(e)?e.replace(/\/$/u,""):`https://github.com/${e}`}/commit/${t}`}function M(e){return e.id??String(e._id)}function Te(e){return M(e[0])}function pl(e){return Array.isArray(e)?e:[e]}function Bs(e){return e?._reportName??""}function Yr(e){return Et(a.triage,M(e),Bs(e))}function ro(e){return[...e].toSorted((t,r)=>{let n=a.triage.get(M(t))?.color?1:0,o=a.triage.get(M(r))?.color?1:0;if(n!==o)return o-n;let s=Ge[t.severity]||0,i=Ge[r.severity]||0;if(s!==i)return i-s;let l=t.confidence??-1;return(r.confidence??-1)-l})}function Ne(e){return ro(e)[0]}function Ae(e){let t=a.activeTabByGroup.get(Te(e));if(t){let r=e.find(n=>M(n)===t);if(r)return r}return Ne(e)}function me(e){let t=e.map(p=>{let h=M(p),b=a.triage.get(h),m=b?.triage??(Yr(p)?"ignored":void 0);return{color:b?.color,bucket:m}}).filter(p=>p.color!==void 0||p.bucket!==void 0),r=new Set(t.map(p=>p.color).filter(p=>p!==void 0)),n=Symbol("none"),o=new Set(t.map(p=>p.bucket??n)),s=r.size>1||o.size>1,i=!s&&r.size===1?[...r][0]:null,l=t.map(p=>p.bucket).filter(Boolean),d=l.some(p=>p!=="ignored"),u=t.length>0&&t.every(p=>!!p.bucket&&p.bucket!=="ignored"),f=!s&&l.length>0?l[0]:null;return{hasConflict:s,commonColor:i,anyTriage:d,allTriaged:u,commonTriage:f,isFixed:f==="fixed",isInvalid:f==="invalid",isDeleted:f==="deleted",isIgnored:f==="ignored"}}function br(e){for(let t of a.reports)for(let r of t.groups)if(Te(r)===e)return r;return null}var Fs="\0";function Rs(){a.filterSeverities=new Set,a.filterColors=new Set,a.filterSources=new Set,a.filterAnalyzer="",a.filterConfMin=0,a.filterConfMax=10,a.filterInclude="";let e=a.reports.some(t=>t.groups.some(r=>r.some(n=>n.priority!==void 0)));a.sortBy=e?"priority-desc":"severity"}function ib(e){let t=a.filterInclude.toLowerCase();if(a.filterSeverities.size>0&&!a.filterSeverities.has(e.severity))return!1;if(a.filterColors.size>0){let r=a.triage.get(M(e))?.color??"none";if(!a.filterColors.has(r))return!1}if(a.filterSources.size===1){let r=a.filterSources.has("own");if(r&&qt(e.file)||!r&&!qt(e.file))return!1}if(a.filterAnalyzer){let r=e._analyzer??null,n=a.filterAnalyzer===Fs?null:a.filterAnalyzer;if(r!==n)return!1}if(e.confidence===void 0){if(e.critical===!0){if(a.filterConfMax<10)return!1}else if(a.filterConfMin>0)return!1}else if(e.confidence<a.filterConfMin||a.filterConfMax<10&&e.confidence>a.filterConfMax)return!1;return t?!!(tp(e).includes(t)||t.startsWith("https://")&&t.length>8&&(a.triage.get(M(e))?.fix??"").toLowerCase().includes(t)):!0}function ip(e){return e.filter(t=>t.some(ib))}function op(e,t,r){return(n,o)=>{let s=n[e]??r,i=o[e]??r;return(t==="desc"?i-s:s-i)||n.file.localeCompare(o.file)}}function ap(e){let t=e==="desc"?-1:11;return(r,n)=>{let o=r.confidence===void 0&&r.critical===!0,s=n.confidence===void 0&&n.critical===!0,i=r.confidence??(o?10:t),l=n.confidence??(s?10:t);return(e==="desc"?l-i:i-l)||(o===s?0:o?-1:1)||r.file.localeCompare(n.file)}}var sp=ap("desc"),ab={severity:(e,t)=>(Ge[t.severity]||0)-(Ge[e.severity]||0)||sp(e,t)||parseInt(e.line,10)-parseInt(t.line,10),"confidence-desc":sp,"confidence-asc":ap("asc"),"priority-desc":op("priority","desc",-1),"priority-asc":op("priority","asc",11)};function lp(e){let t=ab[a.sortBy];return t?[...e].toSorted((r,n)=>t(Ne(r),Ne(n))):[...e]}function Jr(e){return e==="informational"?"info":e.replaceAll("_"," ")}function hl(e){if(!e)return"";for(let t of e.split(`
32
- `))if(t.trim())return t.trim();return""}function lb(e){if(!e)return{title:"",body:""};let t=e.indexOf(`
33
- `);if(t<0)return{title:"",body:e};let r=e.slice(t+1).replace(/^\s+/u,"");return r?{title:e.slice(0,t).trim(),body:r}:{title:"",body:e}}var cp=/"[^"\n]+"|`[^`\n]+`/gu;function fl(e){if(!e)return e;cp.lastIndex=0;let t=[],r=0,n;for(;(n=cp.exec(e))!==null;){n.index>r&&t.push(e.slice(r,n.index));let o=n[0].codePointAt(0)===96?"inline-code":"inline-quote";t.push(c`<span class="${o}">${n[0]}</span>`),r=n.index+n[0].length}return r===0?e:(r<e.length&&t.push(e.slice(r)),t)}function cb(e){let t=to(e.file,e.repo?.github,e._repoFallback??a.repoUrl),r=parseInt(e.line,10),n=Number.isFinite(r)?`${e.file}:${e.line}`:e.file;if(!t)return n;let o=Number.isFinite(r)?`${t}#L${r}`:t;return c`<a href="${o}" target="_blank" rel="noopener">${n}</a>`}function db(e,t){if(!t)return g;let r=t.slice(0,7),n=np(e,t);return n?c`<a href="${n}" target="_blank" rel="noopener" title="${t}">${r}</a>`:c`<span title="${t}">${r}</span>`}var ub=c`<svg viewBox="0 0 16 16" width="11" height="11" aria-hidden="true"><path class="bubble" d="M2.5 3h11a.5.5 0 0 1 .5.5v6.5a.5.5 0 0 1-.5.5H8.4l-3 2.6V10.5H2.5a.5.5 0 0 1-.5-.5V3.5a.5.5 0 0 1 .5-.5z" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linejoin="round"/></svg>`,pb=c`<svg viewBox="0 0 16 16" width="11" height="11" aria-hidden="true"><path class="wrench" d="M10.4 2.6a3 3 0 0 0-3.6 4.5L2 12l2 2 4.9-4.8a3 3 0 0 0 4.5-3.6l-1.8 1.8-1.5-.4-.4-1.5z" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linejoin="round"/></svg>`,fb=c`<svg viewBox="0 0 16 16" width="11" height="11" aria-hidden="true"><rect x="3" y="2.5" width="8" height="10" rx="1" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linejoin="round"/><rect x="5.5" y="5" width="8" height="9" rx="1" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linejoin="round"/></svg>`;function hb(e){if(!a.currentWorkspace)return g;let t=e[0]?._reportName;if(!t)return g;let r=G[Ke(t)]??G.default;return c`<span class="report-chip" title="${t}">${ue(r)}<span class="report-chip-label">${qe(t)}</span></span>`}function dp(e,t,r,n,o=null){let s=hb(e),i=a.triage.get(n),l=i?.color??null,d=i?.comment??"",u=i?.fix??"",f=d?`Edit comment: ${d}`:"Add comment",p=u?`Edit fix link: ${u}`:"Add fix link (PR URL, etc.)",h=o==="focus",b=d?"Edit comment":"Comment",m=u?"Edit fix link":"Fix link",y=c`<button type="button" class="${B({"mark-comment":!0,"has-comment":d})}" title="${f}" aria-label="${f}">${ub}${h?c`<span class="mark-btn-label">${b}</span>`:g}</button>`,v=c`<button type="button" class="${B({"mark-fix":!0,"has-fix":u})}" title="${p}" aria-label="${p}">${pb}${h?c`<span class="mark-btn-label">${m}</span>`:g}</button>`,w=c`<button type="button" class="mark-copy" title="Copy file, line, description, confidence to clipboard" aria-label="Copy finding details to clipboard">${fb}${h?c`<span class="mark-btn-label">Copy</span>`:g}</button>`,x=c`<color-marker .selected="${l}"></color-marker>`,S=r.hasConflict?"change triage state (colors mismatch \u2014 acts per-tab)":t.length>1?"change triage state for the whole group":"change triage state";return c`${s}<span class="mark-action-group">${y}${v}</span>${w}${x}${mb(e,S,o)}`}function gb(e){if(e.newState!=="open")return;let t=e.currentTarget,n=t.getRootNode().querySelector?.(`[popovertarget="${t.id}"]`);if(!n)return;let o=n.getBoundingClientRect(),s=t.offsetWidth||110,i=t.offsetHeight||100,l=4,d=o.right-s;d<4&&(d=4),d+s>window.innerWidth-4&&(d=window.innerWidth-s-4);let u=o.bottom+l;u+i>window.innerHeight-4&&o.top>i+l&&(u=o.top-i-l),t.style.top=`${u}px`,t.style.left=`${d}px`}function mb(e,t,r=null){let n=M(e[0]),o=me(e),s=Ae(e),i=M(s),l=o.hasConflict?a.triage.get(i)?.triage??(Yr(s)?"ignored":null):o.commonTriage,d={fixed:"Fixed",invalid:"Invalid",deleted:"Deleted",ignored:"Ignored"},u={fixed:"Fixed",invalid:"Invalid",deleted:"Delete",ignored:"Ignore"},f=!!a.shownTriage,p=f?d[a.shownTriage]:null,h=["fixed","invalid","deleted","ignored"],b=r==="focus",m;b?m=h.map(w=>({key:w,label:u[w]})):f?m=[{key:"restore",label:"Restore"},...h.filter(w=>w!==a.shownTriage).map(w=>({key:w,label:u[w]}))]:m=h.map(w=>({key:w,label:u[w]}));let y=["mark-triage-menu"];f&&y.push("with-label",`triage-state-${a.shownTriage}`);let v=`triage-menu-${n.replaceAll(/[^A-Za-z0-9_-]/gu,"_")}`;return c`<div class="triage-menu-wrap"><button type="button" class="${y.join(" ")}" popovertarget="${v}" popovertargetaction="toggle" title="${t}" aria-label="${t}">${p?c`<span class="mark-triage-label">${p}</span>`:g} <svg viewBox="0 0 12 12" width="11" height="11" aria-hidden="true"><path d="M2 4l4 4 4-4" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></button><div popover="auto" id="${v}" class="triage-menu" data-gid="${n}" role="menu" @beforetoggle="${gb}">${m.map(w=>c`<button type="button" class="${B({"triage-menu-item":!0,[`triage-menu-${w.key}`]:!0,active:l===w.key})}" data-triage-action="${w.key}" role="menuitem">${w.label}</button>`)}</div></div>`}function up(e,t){let r=M(e),n=a.triage.get(r),o=n?.color,s=n?.triage,i=Yr(e),l=["tab"];return t&&l.push("active"),o&&l.push(`tab-mark-${o}`),s?l.push(`tab-${s}`):i&&l.push("tab-ignored"),c`<button type="button" class="${l.join(" ")}" data-tid="${r}"><span class="tab-label"><span class="${`badge ${e.severity}`}">${Jr(e.severity)}</span> ${e.confidence===void 0?g:c`<span class="tab-conf">${e.confidence}/10</span>`}</span></button>`}function bb(e){if(a.viewMode==="table"||a.viewMode==="focus"){let t=e.confidence*10;return c`<div class="${`conf-ring ${e.severity}`}"><svg viewBox="0 0 36 36" aria-hidden="true"><circle class="conf-ring-track" cx="18" cy="18" r="15.9155"/><circle class="conf-ring-arc" cx="18" cy="18" r="15.9155" style="${`stroke-dasharray: ${t} 100`}"></circle></svg> <span>${e.confidence}<small>/10</small></span></div><div class="value-label">Confidence</div>`}return c`<div class="conf-score"><strong>${e.confidence}</strong>/10</div><div class="value-label">Confidence</div>`}var yb=/^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/iu;function wb(e){let t=e?.name;if(typeof t!="string"||!yb.test(t))return g;let r=e?.version,n=typeof r=="string"&&r.length>0,o=n?`https://www.npmjs.com/package/${t}/v/${encodeURIComponent(r)}`:`https://www.npmjs.com/package/${t}`,s=n?`${t}@${r}`:t;return c`<span class="line-num"><a class="npm-link" href="${o}" target="_blank" rel="noopener noreferrer" title="${`Open ${s} on npmjs.com`}">npm: ${s}</a></span>`}function vb(e,t,r=0,n=1,o=null){let s=M(e),i=a.triage.get(s),l=i?.comment??"",d=i?.fix??"",u=to(e.file,e.repo?.github,e._repoFallback??a.repoUrl),f=parseInt(e.line,10),p=Number.isFinite(f),h=p?`${e.file}:${e.line}`:e.file,b=u?c`<a href="${p?`${u}#L${f}`:u}" target="_blank" rel="noopener">${h}</a>`:h,m=gr(e),y=m?c`<span class="line-num">${b}, ${m}</span>`:c`<span class="line-num">${b}</span>`,v=mr(e),w=o==="focus"?wb(e.package?.npm):g,x=g;if(o!=="focus"&&e.fileHash&&Array.isArray(e._bundleHashes)&&e._bundleHashes.length>0){let L=new Set(e._bundleHashes),V=On(e.fileHash).find(({integrity:ze})=>L.has(ze));V&&(x=c`<button type="button" class="finding-code-btn" data-finding-code-bundle="${V.integrity}" data-finding-code-file="${V.file}" data-finding-code-line="${e.line??""}" title="${`Open ${V.file} in bundle source viewer`}">Code</button>`)}let{title:S,body:C}=lb(et(e.description,e));return c`<div class="${B({"tab-body":!0,active:t})}" data-tid="${s}">${n>1?c`<div class="print-case-label">${r+1} of ${n}</div>`:g}<div class="finding-left"><span class="${`badge ${e.severity}`}">${Jr(e.severity)}</span><div class="value-label">Severity</div>${e.confidence===void 0?g:bb(e)} ${x}</div><div><div class="line-row">${y} ${w} ${e.discoveredIn?c`<span class="line-num discovered-in">(found analyzing ${e.discoveredIn})</span>`:g} ${v?c`<span class="run-meta">${v}</span>`:g}</div>${S?c`<div class="desc-title">${S}</div>`:g} ${C?c`<div class="desc">${fl(C)}</div>`:g} ${e.recommendation?c`<div class="recommendation">Recommendation: ${fl(et(e.recommendation,e))}</div>`:g} ${e.confidenceReason?c`<div class="conf-reason">${fl(et(e.confidenceReason,e))}</div>`:g} ${l?c`<div class="comment-block"><span class="comment-label">Comment:</span> ${l}</div>`:g} ${d?c`<div class="fix-block"><span class="fix-label">Fix:</span> ${Gr(d)?c`<a href="${d}" target="_blank" rel="noopener noreferrer">${d}</a>`:d}</div>`:g}</div></div>`}function Xr(e){return Te(e)}function pp(e){let t=me(e),r=ro(e),n=e.some(s=>s.critical||s.severity==="critical"),o=["finding"];return n&&o.push("is-critical"),t.hasConflict?o.push("has-conflict"):t.commonColor&&o.push(`mark-${t.commonColor}`),a.shownTriage&&o.push(`triage-${a.shownTriage}`),r.length>1&&o.push("multi-case"),o}function fp(e,t={}){let{context:r=null}=t,n=me(e),o=ro(e),s=Ae(e),i=M(s),l=s.commitHash?c`<div class="commit-ref">introduced in ${db(s.repo?.github,s.commitHash)}</div>`:g,d=a.currentWorkspace&&l!==g;return c`${o.map((u,f)=>vb(u,M(u)===i,f,o.length,r))} ${d?c`<div class="marks-commit-row">${l}</div>`:g}<div class="marks"><div class="marks-left">${d?g:l} ${o.length>1?c`<div class="tabs">${o.map(u=>up(u,M(u)===i))}</div>`:g}</div>${dp(e,o,n,i,r)}</div>`}function no(e){return Te(e)}function hp(e){let t=me(e),r=e.some(o=>o.critical||o.severity==="critical"),n=[];return r&&n.push("is-critical"),t.hasConflict?n.push("has-conflict"):t.commonColor&&n.push(`mark-${t.commonColor}`),a.shownTriage&&n.push(`triage-${a.shownTriage}`),n}function gp(e){let t=me(e),r=ro(e),n=Ae(e),o=M(n),s=n,i=hl(et(s.description,s)),l=mr(s),d=gr(s),u=d?`, ${d}`:"";return c`<div class="row-score"><span class="${`badge ${s.severity}`}">${Jr(s.severity)}</span> ${s.confidence===void 0?g:c`<span class="row-conf"><strong>${s.confidence}</strong>/10</span>`}</div><div class="row-body"><div class="title-row"><span class="title">${i}</span> ${l?c`<span class="row-type">${l}</span>`:g}</div><div class="meta-row"><span class="row-loc">${cb(s)}${u}</span><div class="marks">${dp(e,r,t,o)}</div></div>${r.length>1?c`<div class="tabs-row"><div class="tabs">${r.map(f=>up(f,M(f)===o))}</div></div>`:g}</div>`}function oo(e){return"tree-"+e.replaceAll(/[^\w-]+/gu,"_")}var bp=()=>Object.fromEntries(ge.map(e=>[e,0]));function gl(e){let t=new Map;for(let r of e)for(let n of r){t.has(n.file)||t.set(n.file,bp());let o=t.get(n.file);o[n.severity]!==void 0&&o[n.severity]++}return t}function ml(e){let t=null;for(let r of e)if(r?.tree){t||(t={});for(let n of Object.keys(r.tree)){let o=r.tree[n];if(!t[n]){t[n]={...o,imports:[...o.imports??[]]};continue}let s=new Set(t[n].imports);for(let i of o.imports??[])s.has(i)||(s.add(i),t[n].imports.push(i));t[n].size==null&&o.size!=null&&(t[n].size=o.size)}}return t}function Ms(e,t){let r=new Map;for(let n of Object.keys(e)){let o=new Set,s=[...(e[n].imports??[]).filter(l=>e[l])];for(;s.length>0;){let l=s.pop();if(!o.has(l)){o.add(l);for(let d of e[l]?.imports??[])e[d]&&s.push(d)}}let i=bp();for(let l of o){let d=t.get(l);if(d)for(let u of ge)i[u]+=d[u]??0}r.set(n,i)}return r}function bl(e,t,r){let n=t.get(e),o=r.get(e);return mp(n)>0||mp(o)>0}function mp(e){if(!e)return 0;let t=0;for(let r of ge)t+=e[r]??0;return t}function yp(e,t){let r=Object.keys(e).toSorted(),n=new Map;for(let f of r)for(let p of e[f].imports??[]){let h=n.get(p)??[];h.push(f),n.set(p,h)}let o=a.filesSearch.trim().toLowerCase(),s=o?r.filter(f=>f.toLowerCase().includes(o)):r,i=f=>e[f]?c`<a href="${`#${oo(f)}`}"><span class="name">${f}</span></a>`:c`<span class="name">${f}</span>`,l=f=>{let p=t.get(f);if(!p)return null;let h=ge.filter(b=>(p[b]??0)>0);return h.length===0?null:c`<span class="tree-count-chips">${h.map(b=>c`<span class="${`tree-count-chip ${b}`}">${p[b]} ${b.replaceAll("_"," ")}</span>`)}</span>`},d=f=>{let p=t.get(f);return p?ge.reduce((h,b)=>h+(p[b]??0),0):0},u=c`<div class="tree-toolbar"><view-mode-buttons mode="${a.filesViewMode}" modes="table,list" kind="files"></view-mode-buttons><div class="search-row"><div class="toolbar-search"><svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="m20 20-3.5-3.5"/></svg> <input type="text" id="filter-files-search" .value="${a.filesSearch}" placeholder="Search files…"></div><span class="result-count">${s.length} of ${r.length}</span></div></div>`;if(a.filesViewMode==="table"){let f=a.filesSelectedFile&&e[a.filesSelectedFile]&&s.includes(a.filesSelectedFile)?a.filesSelectedFile:null;return c`<div class="${f?"tree-view tree-view-table with-details":"tree-view tree-view-table"}">${u}<div class="${f?"tree-table-layout open":"tree-table-layout"}"><div class="tree-table-list">${s.length===0?c`<div class="tree-table-empty">No files match the search.</div>`:g} ${s.map(b=>{let m=d(b),y=b===f,v=De(e[b]?.size);return c`<div class="${`tree-table-row${y?" selected":""}${m===0?" clean":""}`}" data-tree-select="${b}"><span class="tree-table-name">${b}</span> ${l(b)??c`<span class="tree-table-clean-marker">—</span>`} ${v?c`<span class="tree-table-size">${v}</span>`:g}</div>`})}</div>${f?c`<aside class="tree-table-details" id="tree-table-details"><header class="tree-table-details-bar"><span class="tree-table-details-label">Details</span> <button type="button" class="tree-table-details-close" data-tree-deselect title="Close details" aria-label="Close details">×</button></header><div class="tree-table-details-body">${kb(e[f],f,n.get(f)??[],i)}</div></aside>`:g}</div></div>`}return c`<div class="tree-view">${u} ${s.length===0?c`<div class="tree-table-empty">No files match the search.</div>`:g} ${s.map(f=>{let p=e[f],h=n.get(f)??[],b=De(p?.size);return c`<section class="tree-file" id="${oo(f)}"><div class="tree-file-header"><span class="name">${f}</span> ${l(f)} ${b?c`<span class="tree-file-size">${b}</span>`:g}</div>${p.fileHash||p.treeHash?c`<div class="tree-hashes hashes">${[p.fileHash?`file: ${p.fileHash}`:null,p.treeHash?`tree: ${p.treeHash}`:null].filter(Boolean).join(" | ")}</div>`:g} ${p.imports?.length>0?c`<div class="tree-section"><span class="tree-section-label">imports</span><ul>${p.imports.map(m=>c`<li>${i(m)}</li>`)}</ul></div>`:g} ${h.length>0?c`<div class="tree-section"><span class="tree-section-label">imported by</span><ul>${h.map(m=>c`<li>${i(m)}</li>`)}</ul></div>`:g} ${p.exports?.length>0?c`<div class="tree-section"><span class="tree-section-label">exports</span><ul>${p.exports.map(m=>c`<li><span class="name">${m}</span></li>`)}</ul></div>`:g}</section>`})}</div>`}function kb(e,t,r,n){let o=De(e?.size);return c`<div class="tree-detail-name"><span class="name">${t}</span> ${o?c`<span class="tree-detail-size">${o}</span>`:g}</div>${e.fileHash||e.treeHash?c`<div class="tree-hashes hashes">${[e.fileHash?`file: ${e.fileHash}`:null,e.treeHash?`tree: ${e.treeHash}`:null].filter(Boolean).join(" | ")}</div>`:g} ${e.imports?.length>0?c`<div class="tree-section"><span class="tree-section-label">imports</span><ul>${e.imports.map(s=>c`<li>${n(s)}</li>`)}</ul></div>`:g} ${r.length>0?c`<div class="tree-section"><span class="tree-section-label">imported by</span><ul>${r.map(s=>c`<li>${n(s)}</li>`)}</ul></div>`:g} ${e.exports?.length>0?c`<div class="tree-section"><span class="tree-section-label">exports</span><ul>${e.exports.map(s=>c`<li><span class="name">${s}</span></li>`)}</ul></div>`:g}`}function $b(){return{showAll:!1,selected:null,focusedPkg:null,topPkgsTab:"issues",edgeOpacity:.22,nodeSize:1,showLabels:!1,selectedSeverities:new Set,selectedColors:new Set,pathFilter:"",hidden:new Set,solo:null,graphState:null,layoutCache:null}}var Gt=$b(),E=new Proxy(Gt,{get(e,t){return Gt[t]},set(e,t,r){return Gt[t]=r,!0},has(e,t){return t in Gt},deleteProperty(e,t){return delete Gt[t]},ownKeys(){return Reflect.ownKeys(Gt)},getOwnPropertyDescriptor(e,t){return Object.getOwnPropertyDescriptor(Gt,t)}});function Ue(){E.graphState?._cleanup&&E.graphState._cleanup(),E.graphState=null}function wp(){return Gt}var so=null,vp=null;function Qr(){return vp}function xb(){return so||(so=(async()=>{let e="./graph.js";try{let t=await import(e);return t._swapGraph2Impl(wp()),vp=t,t}catch(t){throw so=null,t}})(),so)}async function yl(e,t,r,n,o){try{let s=await xb(),i=s.buildGraphFromPrep(t);H(c`<graph-layout .graph="${i}" .options="${r}"></graph-layout>`,e);let l=e.querySelector("graph-layout");return await l.updateComplete,n(),o(),s.attachGraph2Interaction(e,i,n),l}catch(s){let i=s instanceof Error?s.message:String(s);return e.textContent=`Graph failed to load: ${i}`,null}}function dt(e){let t=new Map;if(!e)return t;if(e.kind==="stasis"){if(!e.bundle)return t;for(let[r,n]of e.bundle.sources)typeof n=="string"&&t.set(r,n)}else if(e.kind==="sourcemap"){if(!e.json)return t;let r=e.json.sources??[],n=e.json.sourcesContent??[];for(let o=0;o<r.length;o++)typeof n[o]=="string"&&t.set(r[o],n[o])}return t}var io=null,ao=null;function _b(){return io||(io=(async()=>{let e="./terminal.js";try{return await import(e)}catch(t){throw io=null,t}})(),io)}function Sb(e){let t=dt(e);if(t.size===0)return t;let r=[...t.keys()],{stripped:n}=At(r),o=new Map;for(let s=0;s<r.length;s++)o.set(n[s],t.get(r[s]));return o}async function kp(e,t){let r=t?.integrity??"";(!ao||ao.integrity!==r)&&(ao={integrity:r,promise:Cb(t,r)});try{let n=await ao.promise;return!e.isConnected||e.contains(n)||e.replaceChildren(n),n}catch(n){ao=null;let o=n instanceof Error?n.message:String(n);return e.textContent=`Terminal failed to load: ${o}`,null}}async function Cb(e,t){return(await _b()).createTerminalElement(Sb(e),t)}function xp(e){if(!e)return null;let t=ep()==="node_modules"?/^(?:.*\/)?node_modules\/(@[^/]+\/[^/]+|[^/]+)/u:/^(?:.*\/)?dependencies\/(@[^/]+\/[^/]+|[^/]+)/u,r=e.match(t);if(r)return r[1];let n=e.indexOf("/");return n>0?e.slice(0,n):"/"}var Eb=["#4e9af1","#f28e2b","#59a14f","#e15759","#76b7b2","#edc948","#b07aa1","#ff9da7","#9c755f","#5cd1e5","#f1ce63","#d37295","#a0cbe8","#86bcb6","#8cd17d","#b6992d","#499894","#e15759","#e879c7","#d4a6c8"],$p=["#2f8aef","#d2691e","#2ea043","#e63946","#2e9a92","#b88817","#9560e8","#d24a9c","#8a5d40","#0891b2","#a07a14","#c14e8e","#1f7ad0","#549b94","#3fb95f","#a07a14","#2a8278","#cb2c40","#c026d3","#965f93"];function Tb(){if(typeof document>"u")return!1;let e=document.body?.classList;return!!e&&(e.contains("theme-light")||e.contains("theme-pink"))}var wl=new Map;function It(e){let t=Tb()?$p:Eb,n=`${t===$p?"l":"d"}:${e??"__own__"}`;if(wl.has(n))return wl.get(n);let o=e??"__own__",s=0;for(let u of o)s=s*37+u.codePointAt(0)|0;let l=((s%t.length+t.length)%t.length*7+3)%t.length,d=t[l];return wl.set(n,d),d}var vl=(e,t,r)=>{for(let n of t)if(n[0]===e)return(0,n[1])();return r?.()};var Zr='<svg class="file-icon" viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 2 2 5v6l6 3 6-3V5L8 2Z"/><path d="M2 5l6 3 6-3"/><path d="M8 8v6"/></svg>',Ls='<svg class="file-icon" viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="2.5" y="4" width="11" height="9" rx="1.2"/><path d="M6 4V3h4v1"/></svg>';var Ps=null;function Ab(){return Ps||(Ps=(async()=>await import("./prism.js"))(),Ps)}var Ib={js:"javascript",mjs:"javascript",cjs:"javascript",jsx:"jsx",ts:"typescript",mts:"typescript",cts:"typescript",tsx:"tsx",json:"json",css:"css",html:"markup",htm:"markup",xml:"markup",svg:"markup",yml:"yaml",yaml:"yaml",sh:"bash",bash:"bash",md:"markdown",markdown:"markdown",sol:"solidity"};function Os(e){if(typeof e!="string")return null;let t=e.lastIndexOf(".");return t<0?null:Ib[e.slice(t+1).toLowerCase()]??null}async function Ds(e,t){if(!t)return null;try{return(await Ab()).highlight(e,t)}catch{return null}}var Ie=`.lwd-body{margin:.2rem 0 .55rem;color:var(--text);font-size:.86rem;line-height:1.5}.lwd-empty{margin:.2rem 0 .55rem;color:var(--muted);font-size:.78rem}.lwd-note{margin:.2rem 0 .65rem;padding:.55rem .7rem;border:1px solid var(--border);border-radius:6px;background:rgb(from var(--text) r g b / .03);color:var(--muted);font-size:.78rem;line-height:1.45}.lwd-choice{margin:.2rem 0 .65rem;padding:.55rem .7rem .6rem;border:1px solid var(--border);border-radius:6px;background:rgb(from var(--text) r g b / .03);& legend{padding:0 .35rem;color:var(--text);font-size:.78rem;font-weight:500;& strong{font-weight:600}}}.lwd-option{display:flex;align-items:flex-start;gap:.5rem;padding:.3rem .15rem;& input[type=radio]{margin:.15rem 0 0;accent-color:var(--accent)}.lwd-option-text{display:flex;flex-direction:column;gap:.1rem;min-width:0}.lwd-option-title{color:var(--text);font-size:.82rem;line-height:1.35}.lwd-option-hint{color:var(--muted);font-size:.72rem;line-height:1.4}}.lwd-list{margin:0;padding-left:1.1rem;color:var(--muted);font-size:.76rem;line-height:1.5;& li+li{margin-top:.2rem}& strong{color:var(--text);font-weight:600}}.lwd-rename-input{margin-top:.2rem}.lwd-rename-error{margin:.25rem 0 0;color:var(--critical, #f87171);font-size:.72rem;line-height:1.35}
34
- `;var kl=class extends I{static styles=[...I.styles,T(Ie)];static properties={reportName:{type:String},workspaceNames:{type:Array},existingNames:{type:Object},_choice:{state:!0},_newName:{state:!0}};constructor(){super(),this.reportName="",this.workspaceNames=[],this.existingNames=new Set,this._choice="replace",this._newName=""}focusInitial(){this.renderRoot.querySelector('button[data-role="cancel"]')?.focus()}_onClose=()=>this._finish({action:"cancel"});_onCancel=()=>this._finish({action:"cancel"});_onChoiceChange=t=>{this._choice=t.target.value};_onNewNameInput=t=>{this._newName=t.target.value};_onNewNameKeydown=t=>{t.key==="Enter"&&(t.preventDefault(),this._onConfirm())};_onConfirm=()=>{if(this._choice==="rename"){let t=(this._newName??"").trim();if(!this._isRenameValid(t))return;this._finish({action:"rename",newName:t});return}this._finish({action:"replace"})};_replaceHint(){let t=this.workspaceNames.length;if(t===0)return c`<span class="lwd-option-hint">The local file will be overwritten.</span>`;let r=t===1?c`workspace <strong>"${this.workspaceNames[0]}"</strong>`:c`<strong>${t}</strong> workspaces (${this.workspaceNames.join(", ")})`;return c`<span class="lwd-option-hint">The local file will be overwritten. When sync is online, the new bytes are also uploaded to ${r} so the cloud copy matches.</span>`}_renameValidationTpl(t){return t?t===this.reportName?c`<p class="lwd-rename-error">Pick a name different from the original.</p>`:t.includes("\0")?c`<p class="lwd-rename-error">The new name cannot contain a NUL byte.</p>`:t.includes("/")||t.includes("\\")?c`<p class="lwd-rename-error">The new name cannot contain "/" or "\\".</p>`:this.existingNames.has(t)?c`<p class="lwd-rename-error">A file named "${t}" already exists — pick something else.</p>`:g:c`<p class="lwd-rename-error">Enter a new name.</p>`}_isRenameValid(t){return t.length>0&&t!==this.reportName&&!t.includes("\0")&&!t.includes("/")&&!t.includes("\\")&&!this.existingNames.has(t)}render(){let t=this._choice==="rename",r=(this._newName??"").trim(),n=t&&!this._isRenameValid(r),o=t?"Rename":"Replace",s=t?"primary":"danger",i=this.workspaceNames.length>0?c`<span class="lwd-option-hint">Saved as an unfiled report — the renamed copy isn't added to any workspace.</span>`:g;return c`<dialog @close="${this._onClose}"><header><h3>Import conflict</h3></header><p class="lwd-body"><strong>"${this.reportName}"</strong> already exists with different content.</p><fieldset class="lwd-choice"><legend>What should happen?</legend><label class="lwd-option"><input type="radio" name="icd-choice" value="replace" ?checked="${this._choice==="replace"}" @change="${this._onChoiceChange}"> <span class="lwd-option-text"><span class="lwd-option-title">Replace</span> ${this._replaceHint()}</span></label> <label class="lwd-option"><input type="radio" name="icd-choice" value="rename" ?checked="${this._choice==="rename"}" @change="${this._onChoiceChange}"> <span class="lwd-option-text"><span class="lwd-option-title">Rename to</span> <input type="text" class="nwd-input lwd-rename-input" maxlength="200" .value="${this._newName}" ?disabled="${!t}" @input="${this._onNewNameInput}" @keydown="${this._onNewNameKeydown}" @focus="${()=>{this._choice="rename"}}"> ${i} ${t?this._renameValidationTpl(r):g}</span></label></fieldset><footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" data-role="cancel" @click="${this._onCancel}">Cancel</button> <button type="button" class="${s}" ?disabled="${n}" @click="${this._onConfirm}">${o}</button></footer></dialog>`}};customElements.define("import-conflict-dialog",kl);function _p({name:e,workspaceNames:t,existingNames:r}={}){let n=r instanceof Set?r:new Set(r??[]);return new Promise(o=>{let s=document.createElement("import-conflict-dialog");Object.assign(s,{reportName:e??"",workspaceNames:Array.isArray(t)?t:[],existingNames:n,_newName:Fb(e??"",n)}),s.addEventListener("resolve",i=>{s.remove(),o(i.detail)}),s.addEventListener("modal-conflict",()=>{s.remove(),o({action:"cancel"})}),document.body.append(s)})}function Fb(e,t){if(typeof e!="string"||e.length===0)return"";let r=e.lastIndexOf("."),n=r>0?e.slice(0,r):e,o=r>0?e.slice(r):"",s=n.replace(/-\d+$/u,"");for(let i=2;i<1e3;i++){let l=`${s}-${i}${o}`;if(!t.has(l))return l}return""}function D(e,t){if(!e)throw new Error(t)}function en(e,t){let[r,n]=[e.split("/"),t.split("/")];for(;r.length>0&&r[0]===n[0];)r.shift(),n.shift();if(r.length===0&&n.length===0)return 0;if(r.length<2)return n.length<2&&r>n?1:-1;if(n.length<2)return 1;if(r[0]==="*")return-1;if(n[0]==="*"||r[0]==="node_modules")return 1;if(n[0]==="node_modules")return-1;let[o,s]=[r,n].map(i=>i.join(String.fromCodePoint(0)));if(o<s)return-1;if(o>s)return 1;throw new Error("Unreachable")}var Rb=e=>e&&[null,Object.prototype].includes(Object.getPrototypeOf(e)),tn=e=>Object.setPrototypeOf(Object.fromEntries(e),null),Sp=e=>[...e].toSorted((t,r)=>en(t,r)),Ns=e=>tn([...e].toSorted((t,r)=>en(t[0],r[0])).map(([t,r])=>[t,r instanceof Map?Ns(r):r])),$l=e=>new Map(Object.entries(e).map(([t,r])=>[t,Rb(r)?$l(r):r]));function Cp(e){let t="node_modules/",r=e.lastIndexOf(t);if(r===-1)return null;let n=r+t.length,o=e.slice(n).split("/"),s=o[0].startsWith("@")?2:1;if(o.length<=s||o.slice(0,s).some(l=>!l))return null;let i=o.slice(0,s).join("/");return{dir:e.slice(0,n)+i,rel:o.slice(s).join("/"),name:i}}var vt=1,xl=0,Us=({name:e,version:t,files:r})=>({name:e,version:t,files:tn(Object.entries(r))}),Ep=e=>Cp(e)??{dir:".",rel:e,name:null},zs=class e{static VERSION=vt;version=vt;config;entries;modules;formats;imports;constructor({config:t={scope:"full"},entries:r,modules:n,formats:o,imports:s,version:i=vt}={}){D([xl,vt].includes(i)),D(["node_modules","full"].includes(t.scope)),this.version=i,this.config=t,this.entries=r??new Set,this.modules=n??new Map,this.formats=o??new Map,this.imports=s??new Map}get sources(){let t=new Map;for(let[r,{files:n}]of this.modules)for(let[o,s]of Object.entries(n))t.set(r==="."?o:`${r}/${o}`,s);return t}static parseCode(t){let r=JSON.parse(t);D(r.version===vt||r.version===xl),D(["node_modules","full"].includes(r.config?.scope)),D(r.formats),D(r.imports);let n=new Map,o=new Set;if(r.version===vt){let s=r.config.scope==="full";if(r.modules!==void 0){D(typeof r.modules=="object"&&r.modules!==null);for(let[i,l]of Object.entries(r.modules))D(i.includes("node_modules")),D(!i.startsWith("..")),D(l?.name&&l.version&&l.files),n.set(i,Us(l))}if(s){D(Array.isArray(r.entries)),D(r.entries.length>0,"v1 bundle with scope=full must have at least one entry"),D(r.sources&&typeof r.sources=="object"),o=new Set(r.entries);for(let[i,l]of Object.entries(r.sources))D(!i.includes("node_modules")),D(!i.startsWith("..")),D(l?.name&&l.version&&l.files),n.set(i,Us(l))}else D(r.entries===void 0),D(r.sources===void 0);for(let[,{files:i}]of n)for(let l of Object.keys(i))D(!l.startsWith(".."))}else{D(r.sources);for(let[s,i]of Object.entries(r.sources)){D(!s.startsWith(".."));let{dir:l,rel:d,name:u}=Ep(s);D(!l.startsWith("..")&&!d.startsWith("..")),n.has(l)||n.set(l,{name:u,version:null,files:Object.create(null)}),n.get(l).files[d]=i}}return new e({version:r.version,config:r.config,entries:o,modules:n,formats:new Map(Object.entries(r.formats)),imports:$l(r.imports)})}static parseResources(t){let r=JSON.parse(t);D(r.version===vt||r.version===xl);let n=new Map,o={scope:"full"};if(r.version===vt){D(["node_modules","full"].includes(r.config?.scope)),o=r.config;let s=o.scope==="full";if(r.modules!==void 0){D(typeof r.modules=="object"&&r.modules!==null);for(let[i,l]of Object.entries(r.modules))D(i.includes("node_modules")),D(!i.startsWith("..")),D(l?.name&&l.version&&l.files),n.set(i,Us(l))}if(s&&r.sources!==void 0){D(typeof r.sources=="object"&&r.sources!==null);for(let[i,l]of Object.entries(r.sources))D(!i.includes("node_modules")),D(!i.startsWith("..")),D(l?.name&&l.version&&l.files),n.set(i,Us(l))}else s||D(r.sources===void 0);for(let[,{files:i}]of n)for(let l of Object.keys(i))D(!l.startsWith(".."))}else{D(r.resources);for(let[s,i]of Object.entries(r.resources)){D(!s.startsWith(".."));let{dir:l,rel:d,name:u}=Ep(s);D(!l.startsWith("..")&&!d.startsWith("..")),n.has(l)||n.set(l,{name:u,version:null,files:Object.create(null)}),n.get(l).files[d]=i}}return new e({version:r.version,config:o,modules:n})}#e(){let t=[],r=[];for(let[n,{name:o,version:s,files:i}]of this.modules){if(Object.keys(i).length===0)continue;let l=n.includes("node_modules");l&&D(o&&s&&i);let d=tn(Object.entries(i).toSorted((f,p)=>en(f[0],p[0])));(l?t:r).push([n,{name:o,version:s,files:d}])}return t.sort((n,o)=>en(n[0],o[0])),r.sort((n,o)=>en(n[0],o[0])),{modules:tn(t),sources:tn(r)}}serializeCode(){let t=Sp(this.entries),{modules:r,sources:n}=this.#e(),o=Ns(this.formats),s=Ns(this.imports),i={version:vt,config:this.config};return this.config.scope==="full"&&Object.assign(i,{entries:t,sources:n}),Object.assign(i,{modules:r,formats:o,imports:s}),JSON.stringify(i,void 0,2)}serializeResources(){let{modules:t,sources:r}=this.#e(),n={version:vt,config:this.config};return this.config.scope==="full"&&Object.assign(n,{sources:r}),Object.assign(n,{modules:t}),JSON.stringify(n,void 0,2)}};var Ws=null,Hs=null,Vs=null;function Mb(){for(let e of["br","brotli"])try{return new DecompressionStream(e),e}catch{}return null}async function Lb(e,t){let r=new Blob([t]).stream().pipeThrough(new DecompressionStream(e));return new Uint8Array(await new Response(r).arrayBuffer())}async function Pb(){if("serviceWorker"in navigator)try{let e=await navigator.serviceWorker.getRegistrations();for(let t of e){let r=t.active?.scriptURL??t.installing?.scriptURL??t.waiting?.scriptURL;r&&r.endsWith("/brotli-sw.js")&&await t.unregister()}}catch{}}function Ob(){return Vs||(Vs=(async()=>await import("./brotli-fallback.js"))(),Vs)}async function Db(){await Pb();let e=Mb();return e?(Ws={kind:"native",format:e},Ws):(Ws={kind:"fallback"},Ws)}function Tp(){return Hs||(Hs=Db(),Hs)}async function Ap(e){let t=await Tp();return t.kind==="native"?Lb(t.format,e):(await Ob()).brotliDecompress(e)}Tp().catch(()=>{});async function js(e,t){try{let r=await ur(e),n=t.name.toLowerCase().endsWith(".map"),o=n?"sourcemap":"stasis";try{if(n){let l=JSON.parse(ce(r));return{integrity:e,kind:o,size:r.byteLength,json:l}}let s=ce(await Ap(r)),i=zs.parseCode(s);return{integrity:e,kind:o,size:r.byteLength,bundle:i}}catch(s){return{integrity:e,kind:o,size:r.byteLength,error:s.message}}}catch(r){return{integrity:e,error:r.message,size:0}}}function Nb(e){!e?.json&&!e?.bundle||(async()=>{try{let t=await Sl(e);if(ls(e.integrity,t),a.selectedBundle!==e.integrity)return;e.fileHashes=t,k()}catch{}})()}async function _l(e){if(ma(e))return;let t=(a.bundles??[]).find(n=>n.integrity===e);if(!t)return;let r=await js(e,t);if(!(!r?.json&&!r?.bundle))try{let n=await Sl(r);ls(e,n)}catch{}}async function Yt(e){let t=(a.bundles??[]).find(n=>n.integrity===e);if(!t)return;let r=await js(e,t);a.selectedBundle===e&&(a.bundleDetails=r,k(),Nb(r),Ct().catch(()=>{}))}var Ub=["finding_url","repository","title","description","severity","configured_scan_id","relevant_paths"];function zb(e){let t=[],r=[],n="",o=!1,s=e.length;for(let i=0;i<s;i++){let l=e[i];o?l==='"'?e[i+1]==='"'?(n+='"',i++):o=!1:n+=l:l==='"'?o=!0:l===","?(r.push(n),n=""):l===`
30
+ \u2022 Hardware security key: use the vendor's management tool`)}catch(e){alert(`Could not disable encryption: ${e?.message??e}`)}}async function Pb(){await Ts()}function yp(e){if(!e||e===$e)return;$e=e;let t=!1;$e.addEventListener("click",async()=>{if(!t){t=!0;try{if(!X()){await Pb();return}if(!st()){await Is();return}await Lb()}finally{t=!1}}}),ge(bp),bp()}var Rs='<path class="bg" d="M3 2h6l4 4v8H3z"/><path fill="rgba(0,0,0,.18)" d="M9 2v4h4Z"/>',Y={default:`<svg class="file-icon brand-deepview" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true">${Rs}<path class="fg" d="M7.843 6.719c-1.605 0-2.926 1.292-3.477 1.947.466.58 1.872 2.024 3.496 2.024s2.907-1.292 3.486-2.005c-.627-.703-1.88-1.966-3.505-1.966m.019 3.857c-1.51 0-2.802-1.263-3.353-1.9.55-.617 1.814-1.852 3.334-1.852 1.51 0 2.698 1.12 3.335 1.852-.533.618-1.787 1.9-3.316 1.9m-.019-3.42c-.826 0-1.577.694-1.577 1.596 0 .789.599 1.577 1.577 1.577.893 0 1.587-.684 1.587-1.577-.01-.779-.627-1.596-1.587-1.596m0 3.069a1.476 1.476 0 0 1-1.482-1.473c0-.722.599-1.491 1.482-1.491.846 0 1.482.693 1.492 1.491 0 .808-.618 1.473-1.492 1.473m.01-2.727c-.637 0-1.264.532-1.264 1.244 0 .627.475 1.235 1.245 1.245.684 0 1.254-.522 1.254-1.244 0-.58-.475-1.236-1.235-1.245m-.02 2.403a1.167 1.167 0 0 1-1.149-1.159c0-.532.456-1.14 1.169-1.149.56 0 1.149.427 1.159 1.15 0 .636-.485 1.158-1.179 1.158m-.769-1.833c-.19.238-.275.494-.237.864l.74.057zm1.026-.294c-.295-.057-.665 0-.912.228l.323.607zm.133.047-.38.56.988.114c-.057-.275-.323-.579-.608-.674m-.124.741.456.912c.21-.209.352-.484.314-.836zm-1.225.504a.97.97 0 0 0 .57.617l.399-.551zm.713.664c.313.076.636.01.845-.161l-.295-.618zm-.637 1.55c0 .028-.028.066-.066.066h-.59c-.028 0-.066-.028-.066-.066s.029-.066.067-.066h.579c.048 0 .076.028.076.066m.712 0c0 .028-.028.066-.066.066h-.437c-.028 0-.066-.028-.066-.066s.028-.066.066-.066h.437c.038 0 .066.028.066.066m.666 0c0 .028-.029.066-.067.066h-.37c-.029 0-.067-.028-.067-.066s.029-.066.067-.066h.37c.038 0 .067.028.067.066m-1.672.351c0 .029-.029.067-.067.067h-.295c-.028 0-.066-.028-.066-.066 0-.029.029-.067.067-.067h.294c.038 0 .066.028.066.066m.694 0c0 .029-.028.067-.066.067h-.409c-.028 0-.066-.028-.066-.066 0-.029.028-.067.066-.067h.399c.038 0 .076.028.076.066m.732 0c0 .029-.029.067-.067.067h-.465c-.029 0-.067-.028-.067-.066 0-.029.029-.067.067-.067h.465c.038 0 .067.028.067.066m-1.093.371a.065.065 0 0 1-.067.066h-.627c-.028 0-.075-.028-.066-.066 0-.028.029-.066.067-.066h.627c.038 0 .066.028.066.066m.684 0a.065.065 0 0 1-.066.066h-.39c-.028 0-.076-.028-.066-.066 0-.028.028-.066.066-.066h.39c.038 0 .066.028.066.066M5.088 6.263c-.019-.105-.114-.19-.237-.19s-.257.104-.257.237.105.238.247.238c.105 0 .218-.076.238-.18h.864v.826l.095-.048V6.31c0-.028-.019-.057-.048-.057h-.902zm-.237.19c-.076 0-.143-.066-.143-.143s.066-.142.143-.142.142.066.142.143c.01.076-.066.142-.143.142m2.89-.323H6.38l.418-.475v-.332a.255.255 0 0 0 .218-.248c0-.123-.114-.256-.256-.256s-.266.114-.266.257c0 .123.095.228.209.247v.284l-.456.523v.893l.095-.047v-.742h1.396c.029 0 .067-.009.067-.057 0-.028-.019-.047-.067-.047m-1.13-1.054c0-.076.066-.152.152-.152s.152.066.152.151c0 .076-.066.152-.152.152s-.152-.066-.152-.152m-.836 5.264h-.874c-.019-.105-.114-.219-.247-.219s-.256.105-.256.257c0 .132.114.275.266.275.104 0 .218-.076.237-.19h.827v.608l-.257.285a.3.3 0 0 0-.095-.019c-.133 0-.256.105-.256.228 0 .133.104.238.237.238.124 0 .247-.105.247-.238a.23.23 0 0 0-.057-.152l.285-.304v-.712c0-.029-.019-.058-.057-.058m-1.121.219a.16.16 0 0 1-.152-.161c0-.077.066-.162.152-.162s.152.066.152.152-.066.171-.152.171m.713 1.14c-.076 0-.143-.066-.143-.143s.066-.133.143-.133.142.067.142.143c0 .066-.066.133-.143.133m5.472-1.377a.24.24 0 0 0-.237.208h-1.13c-.029 0-.038.02-.038.048v.712l-.323.39h-.029a.245.245 0 0 0-.247.247c0 .133.114.256.247.256s.247-.113.247-.256a.26.26 0 0 0-.123-.219l.313-.38v-.674h1.083c.019.105.114.2.238.2.133 0 .266-.105.266-.257 0-.133-.105-.276-.266-.276m-1.758 1.767a.15.15 0 0 1-.143-.152c0-.075.067-.142.143-.142s.152.066.152.143a.15.15 0 0 1-.152.151m1.758-1.33a.15.15 0 0 1-.143-.152.147.147 0 0 1 .294.001.15.15 0 0 1-.152.151M8.917 5.55h-.399a.075.075 0 0 1-.076-.076c0-.028.029-.066.067-.066h.418c.028 0 .066.028.066.066s-.038.076-.076.076m.742 0H9.22c-.038 0-.067-.028-.067-.076 0-.028.029-.066.067-.066h.437c.038 0 .066.028.066.066s-.028.076-.066.076m.883 0h-.598c-.029 0-.067-.028-.067-.076 0-.028.029-.066.067-.066h.598c.028 0 .066.028.066.066s-.028.076-.066.076m-1.282.4h-.741c-.038 0-.076-.029-.076-.067s.028-.076.066-.076h.75c.039 0 .067.038.067.076 0 .029-.028.067-.066.067m.797 0h-.503c-.038 0-.076-.029-.076-.067s.028-.066.066-.066h.513c.038 0 .067.028.067.066 0 .029-.029.067-.067.067m.476 0h-.19c-.039 0-.067-.029-.067-.067s.028-.066.066-.066h.2c.028 0 .066.028.066.066 0 .029-.028.067-.075.067m-1.682.398h-.332c-.039 0-.077-.028-.077-.066s.029-.066.067-.066h.342c.038 0 .076.028.076.066s-.028.066-.076.066m.789 0h-.494c-.038 0-.067-.028-.067-.066s.029-.066.067-.066h.494c.038 0 .066.028.066.066s-.028.066-.066.066m.893 0h-.599c-.038 0-.076-.028-.076-.066s.028-.066.066-.066h.618c.028 0 .066.028.066.066s-.028.066-.076.066m.418.305a.69.69 0 0 0-.674.712c0 .086.019.18.048.257l.085.066c-.028-.085-.057-.171-.057-.304 0-.285.228-.646.598-.646.295 0 .599.228.599.636a.58.58 0 0 1-.599.59.8.8 0 0 1-.237-.048l.123.114a.4.4 0 0 0 .114.01c.39 0 .684-.276.684-.666 0-.313-.266-.712-.684-.722m.353.552-.019-.01-.161.19-.143-.01-.057-.047-.019-.133.19-.2a.28.28 0 0 0-.361.077c-.076.095-.076.209-.038.351l-.247.304.171.152.266-.266c.142.038.285.019.38-.095a.31.31 0 0 0 .038-.313"/></svg>`,"claude-security":`<svg class="file-icon brand-claude" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true">${Rs}<path class="fg" d="m5.875 10.154 1.376-.772.023-.067-.023-.037h-.067l-.23-.015-.787-.02-.681-.03-.661-.035-.166-.035-.156-.205.016-.103.14-.094.2.018.442.03.665.046.481.028.714.075h.113l.016-.047-.039-.028-.03-.028-.687-.466-.744-.492-.39-.284-.21-.143-.106-.135-.046-.294.19-.21.258.017.065.018.26.2.557.43.726.535.106.089.042-.03.006-.022-.048-.08-.395-.713-.422-.726-.187-.301-.05-.18a1 1 0 0 1-.03-.213l.218-.296.12-.039.29.039.123.106.18.413.293.65.453.884.133.262.07.242.027.075h.046v-.043l.038-.497.069-.611.067-.787.023-.221.11-.266.218-.143.17.081.14.2-.02.13-.083.54-.163.846-.106.567h.062l.07-.07.287-.382.482-.602.213-.239.248-.264.159-.125h.301l.221.329-.099.34-.31.393-.256.333-.369.496-.23.397.021.032.055-.006.832-.177.45-.081.537-.092.243.113.026.115-.096.236-.573.141-.673.135-1.003.237-.012.01.014.017.452.042.193.01h.473l.88.066.23.153.138.186-.023.141-.354.181-.478-.113-1.116-.266-.383-.096h-.053v.032l.32.312.584.528.731.68.037.168-.094.133-.099-.014-.643-.484-.248-.218-.561-.472H9.08v.05l.129.189.684 1.027.035.315-.05.103-.177.062-.194-.036-.4-.561-.413-.632-.333-.567-.041.023-.197 2.116-.092.108-.212.082-.177-.135-.094-.218.094-.43.113-.561.092-.447.083-.554.05-.184-.004-.013-.04.006-.418.574-.636.858-.503.539-.12.048-.21-.108.02-.193.117-.172.696-.886.42-.549.27-.317-.001-.046h-.016l-1.85 1.201-.328.042-.142-.132.018-.218.067-.071.556-.383Z"/></svg>`,"codex-security":`<svg class="file-icon brand-codex" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true">${Rs}<path class="fg" d="M11.04 8.364a1.72 1.72 0 0 0-.152-1.432 1.8 1.8 0 0 0-1.925-.846 1.8 1.8 0 0 0-.778-.498 1.8 1.8 0 0 0-.927-.05 1.8 1.8 0 0 0-.827.414 1.77 1.77 0 0 0-.507.767 1.8 1.8 0 0 0-.683.297 1.75 1.75 0 0 0-.499.549 1.75 1.75 0 0 0 .22 2.07 1.72 1.72 0 0 0 .151 1.432 1.8 1.8 0 0 0 1.926.846 1.77 1.77 0 0 0 1.333.587c.78 0 1.47-.496 1.707-1.227a1.8 1.8 0 0 0 .684-.298 1.75 1.75 0 0 0 .499-.548 1.75 1.75 0 0 0-.222-2.063m-2.667 3.678a1.33 1.33 0 0 1-.851-.304l.042-.024 1.413-.804a.23.23 0 0 0 .116-.199V8.747l.597.34q.01.005.011.015v1.629a1.323 1.323 0 0 1-1.328 1.31m-2.857-1.203a1.3 1.3 0 0 1-.158-.879l.042.025 1.414.805a.23.23 0 0 0 .23 0l1.729-.982v.68a.02.02 0 0 1-.01.018l-1.431.814a1.34 1.34 0 0 1-1.816-.48m-.372-3.037a1.32 1.32 0 0 1 .7-.574v1.656a.22.22 0 0 0 .114.197l1.72.979-.598.34a.02.02 0 0 1-.021 0L5.63 9.587a1.304 1.304 0 0 1-.487-1.791zm4.907 1.125L8.327 7.94l.596-.34a.02.02 0 0 1 .02 0l1.43.814a1.3 1.3 0 0 1 .512.528 1.3 1.3 0 0 1-.118 1.4 1.33 1.33 0 0 1-.595.436V9.122a.23.23 0 0 0-.12-.195m.594-.881-.042-.025-1.411-.812a.23.23 0 0 0-.232 0l-1.727.983v-.68a.02.02 0 0 1 .008-.018l1.429-.813a1.34 1.34 0 0 1 1.425.061 1.3 1.3 0 0 1 .55 1.298zM6.908 9.252l-.597-.34a.02.02 0 0 1-.012-.016V7.271c0-.249.073-.493.209-.703s.329-.378.557-.483a1.35 1.35 0 0 1 1.415.18l-.042.023-1.413.804a.23.23 0 0 0-.116.2zm.324-.69.77-.438.77.438v.875l-.768.437-.77-.437z"/></svg>`,deepsec:`<svg class="file-icon brand-vercel" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true">${Rs}<path class="fg" d="m8 5.97 3.5 6.062h-7Z"/></svg>`};function Ke(e){let t=Dn(e);if(t==="deepsec")return"deepsec";if(t==="claude-security")return"claude-security";let r=e.toLowerCase();return r.endsWith(".codex")?"codex-security":r.endsWith(".md")?"claude-security":"default"}function Ne(e){return e.toLowerCase().endsWith(".codex")?e.slice(0,-6).replaceAll("__","/"):e}var wp=globalThis[Symbol.for("@rray/frontend")];if(!wp)throw new Error("@rray/frontend global not installed; view.js must run before lazy bundles import this wrapper");var{LitElement:F1,html:hl,nothing:vp,unsafeCSS:M1,render:L1,StateElement:P1,classMap:O1,repeat:N1,styleMap:D1}=wp;var qe={critical:6,high:5,medium:4,low:3,high_bug:2,bug:1,informational:0},me=["critical","high","medium","low","high_bug","bug","informational"],Bs="node_modules";function kp(e){let t=n=>/(^|\/)node_modules\//u.test(n),r=!1;e:for(let n of e){for(let o of n.groups??[])for(let s of o)if(t(s.file)){r=!0;break e}if(n.tree){for(let o of Object.keys(n.tree))if(t(o)){r=!0;break e}}}Bs=r?"node_modules":"dependencies"}function $p(){return Bs}function Gt(e){return Bs==="node_modules"?/(^|\/)node_modules\//u.test(e):/(^|\/)dependencies\//u.test(e)}function De(e){return typeof e!="number"||!Number.isFinite(e)?null:`${e.toLocaleString()} B`}function Rt(e){if(e.length<=1)return{prefix:"",stripped:[...e]};let t=e.map(i=>i.split("/")),r=Math.min(...t.map(i=>i.length)),n=0;for(let i=0;i<r-1&&t.every(l=>l[i]===t[0][i]);i++)n=i+1;if(n>0&&t[0][n-1].startsWith("@")&&n--,n>0&&t[0][n-1]==="node_modules"&&n--,n===0)return{prefix:"",stripped:[...e]};let o=`${t[0].slice(0,n).join("/")}/`,s=t.map(i=>i.slice(n).join("/"));return{prefix:o,stripped:s}}function Ob(e){let t=Bs==="node_modules"?/^(?:.*\/)?node_modules\/(?:@[^/]+\/[^/]+|[^/]+)\/(.*)$/u:/^(?:.*\/)?dependencies\/(?:@[^/]+\/[^/]+|[^/]+)\/(.*)$/u;return e.match(t)?.[1]??e}function Ze(e,t){if(!e)return e;let r=e;t?.exportsMode==="isolate"&&(r=r.replace(/^\((?:[^()]|\([^()]*\))*\): \[export:\s*\w+\] /u,""),r=r.replace(/^\[export:\s*\w+\] /u,""));let n=[t?.exportName,t?.methodName].filter(Boolean);for(let o of n){let s=o.replaceAll(/[.*+?^${}()|[\]\\]/gu,"\\$&");r=r.replaceAll(new RegExp(`\\[export:\\s*${s}\\]\\s*`,"gu"),"")}for(let o of n){let s=o.replaceAll(/[.*+?^${}()|[\]\\]/gu,"\\$&");r=r.replace(new RegExp(`^\\(\`?${s}\`?\\): `,"u"),"")}return r}function mr(e){let t=e?.exportName,r=e?.methodName;return t&&r&&t!==r?`${t}.${r}`:t||r||""}function xp(e){return[e.file,e.description,e.recommendation,e.confidenceReason,e.discoveredIn,e.repo?.github].filter(Boolean).join(`
31
+ `).toLowerCase()}function gl(e){return e&&e.replace(/^[^/]+\//u,"").replace(/^claude-/u,"").replaceAll("-"," ")}function br(e){return[e.type,gl(e.model),e.effort,e.exportsMode].filter(Boolean).join(" \xB7 ")}function Fs(e){if(e.length===0)return"";let t=e[0];for(let r=1;r<e.length;r++){for(;t&&!e[r].startsWith(t);)t=t.slice(0,-1);if(!t)return""}return t}function Nb(e){if(!e)return null;let t=e.trim().replace(/\/$/u,"");return t?/^https?:\/\//iu.test(t)?t:/^github\.com\//iu.test(t)?`https://${t}`:`https://github.com/${t}`:null}function ro(e,t,r){if(t)return`https://github.com/${t}/blob/HEAD/${Ob(e)}`;if(Gt(e))return null;let n=Nb(r);return n?`${n}/blob/HEAD/${e}`:null}function ml(e,t,r){let n=ro(e,t,r);return n?hl`<a href="${n}" target="_blank" rel="noopener">${e}</a>`:e}function Jr(e){if(typeof e!="string"||e.length===0)return!1;try{let t=new URL(e);return t.protocol==="http:"||t.protocol==="https:"}catch{return!1}}function _p(e,t,r,n){let o=parseInt(t,10);if(!Number.isFinite(o))return vp;let s=ro(e,r,n),i=`line ${o}`;return s?hl`<a href="${`${s}#L${o}`}" target="_blank" rel="noopener">${i}</a>`:i}function Sp(e,t){return!e||!t?null:`${/^https?:/iu.test(e)?e.replace(/\/$/u,""):`https://github.com/${e}`}/commit/${t}`}function P(e){return e.id??String(e._id)}function Ee(e){return P(e[0])}function bl(e){return Array.isArray(e)?e:[e]}function Ms(e){return e?._reportName??""}function Xr(e){return Tt(a.triage,P(e),Ms(e))}function no(e){return[...e].toSorted((t,r)=>{let n=a.triage.get(P(t))?.color?1:0,o=a.triage.get(P(r))?.color?1:0;if(n!==o)return o-n;let s=qe[t.severity]||0,i=qe[r.severity]||0;if(s!==i)return i-s;let l=t.confidence??-1;return(r.confidence??-1)-l})}function Ue(e){return no(e)[0]}function Ae(e){let t=a.activeTabByGroup.get(Ee(e));if(t){let r=e.find(n=>P(n)===t);if(r)return r}return Ue(e)}function be(e){let t=e.map(f=>{let h=P(f),b=a.triage.get(h),m=b?.triage??(Xr(f)?"ignored":void 0);return{color:b?.color,bucket:m}}).filter(f=>f.color!==void 0||f.bucket!==void 0),r=new Set(t.map(f=>f.color).filter(f=>f!==void 0)),n=Symbol("none"),o=new Set(t.map(f=>f.bucket??n)),s=r.size>1||o.size>1,i=!s&&r.size===1?[...r][0]:null,l=t.map(f=>f.bucket).filter(Boolean),d=l.some(f=>f!=="ignored"),u=t.length>0&&t.every(f=>!!f.bucket&&f.bucket!=="ignored"),p=!s&&l.length>0?l[0]:null;return{hasConflict:s,commonColor:i,anyTriage:d,allTriaged:u,commonTriage:p,isFixed:p==="fixed",isInvalid:p==="invalid",isDeleted:p==="deleted",isIgnored:p==="ignored"}}function Bt(){let e=a.reports.flatMap(d=>d.groups),t=a.workspaceMerges;if(!t||t.length===0)return e;let r=e.map((d,u)=>u),n=d=>{let u=d;for(;r[u]!==u;)u=r[u];for(;r[d]!==u;){let p=r[d];r[d]=u,d=p}return u},o=(d,u)=>{let p=n(d),f=n(u);p!==f&&(r[p]=f)},s=new Map;for(let d=0;d<e.length;d++)for(let u of e[d])u.id&&s.set(u.id,d);for(let d of t){let u=-1;for(let p of d){let f=s.get(p);f!==void 0&&(u===-1?u=f:o(u,f))}}let i=new Set,l=[];for(let d=0;d<e.length;d++){let u=n(d);if(i.has(u))continue;i.add(u);let p=[];for(let w=d;w<e.length;w++)n(w)===u&&p.push(...e[w]);let f=new Set(p.map(w=>w.id).filter(Boolean)),h=[],b=new Set;for(let w of t)for(let v of w)b.has(v)||f.has(v)&&(h.push(v),b.add(v));if(h.length===0){l.push(p);continue}let m=new Map;for(let w of p)w.id&&!m.has(w.id)&&m.set(w.id,w);let y=new Set,$=[];for(let w of h){let v=m.get(w);v&&($.push(v),y.add(v))}for(let w of p)y.has(w)||$.push(w);l.push($)}return l}function yr(e){for(let t of Bt())if(Ee(t)===e)return t;return null}var oo="\0",so="";function yl(e){return typeof e.repo?.github=="string"&&e.repo.github?e.repo.github:typeof e._repoFallback=="string"&&e._repoFallback?e._repoFallback:null}function Ls(){a.filterSeverities=new Set,a.filterColors=new Set,a.filterSources=new Set,a.filterAnalyzer="",a.filterRepo="",a.filterConfMin=0,a.filterConfMax=10,a.filterInclude="";let e=a.reports.some(t=>t.groups.some(r=>r.some(n=>n.priority!==void 0)));a.sortBy=e?"priority-desc":"severity"}function Db(e){let t=a.filterInclude.toLowerCase();if(a.filterSeverities.size>0&&!a.filterSeverities.has(e.severity))return!1;if(a.filterColors.size>0){let r=a.triage.get(P(e))?.color??"none";if(!a.filterColors.has(r))return!1}if(a.filterSources.size===1){let r=a.filterSources.has("own");if(r&&Gt(e.file)||!r&&!Gt(e.file))return!1}if(a.filterAnalyzer){let r=e._analyzer??null,n=a.filterAnalyzer===oo?null:a.filterAnalyzer;if(r!==n)return!1}if(a.filterRepo){let r=yl(e),n=a.filterRepo===so?null:a.filterRepo;if(r!==n)return!1}if(e.confidence===void 0){if(e.critical===!0){if(a.filterConfMax<10)return!1}else if(a.filterConfMin>0)return!1}else if(e.confidence<a.filterConfMin||a.filterConfMax<10&&e.confidence>a.filterConfMax)return!1;return t?!!(xp(e).includes(t)||t.startsWith("https://")&&t.length>8&&(a.triage.get(P(e))?.fix??"").toLowerCase().includes(t)):!0}function Ap(e){return e.filter(t=>t.some(Db))}function Cp(e,t,r){return(n,o)=>{let s=n[e]??r,i=o[e]??r;return(t==="desc"?i-s:s-i)||n.file.localeCompare(o.file)}}function Tp(e){let t=e==="desc"?-1:11;return(r,n)=>{let o=r.confidence===void 0&&r.critical===!0,s=n.confidence===void 0&&n.critical===!0,i=r.confidence??(o?10:t),l=n.confidence??(s?10:t);return(e==="desc"?l-i:i-l)||(o===s?0:o?-1:1)||r.file.localeCompare(n.file)}}var Ep=Tp("desc"),Ub={severity:(e,t)=>(qe[t.severity]||0)-(qe[e.severity]||0)||Ep(e,t)||parseInt(e.line,10)-parseInt(t.line,10),"confidence-desc":Ep,"confidence-asc":Tp("asc"),"priority-desc":Cp("priority","desc",-1),"priority-asc":Cp("priority","asc",11)};function Ip(e){let t=Ub[a.sortBy];return t?[...e].toSorted((r,n)=>t(Ue(r),Ue(n))):[...e]}var Te=pt(class extends Je{constructor(e){if(super(e),e.type!==Be.PROPERTY&&e.type!==Be.ATTRIBUTE&&e.type!==Be.BOOLEAN_ATTRIBUTE)throw Error("The `live` directive is not allowed on child or event bindings");if(!_d(e))throw Error("`live` bindings can only contain a single expression")}render(e){return e}update(e,[t]){if(t===ae||t===g)return t;let r=e.element,n=e.name;if(e.type===Be.PROPERTY){if(t===r[n])return ae}else if(e.type===Be.BOOLEAN_ATTRIBUTE){if(!!t===r.hasAttribute(n))return ae}else if(e.type===Be.ATTRIBUTE&&r.getAttribute(n)===t+"")return ae;return Do(e),t}});var vl={"claude-security":"Claude Security","codex-security":"Codex Security",deepsec:"DeepSec"};function zb(e){return e==null?"(none)":vl[e]??e}var wl=class extends L{static properties={options:{attribute:!1}};createRenderRoot(){return this}constructor(){super(),this.options=[]}render(){return c`<select class="sort-select" aria-label="Filter by analyzer" .value="${Te(a.filterAnalyzer)}" @change="${this._onChange}"><option value="">All analyzers</option>${this.options.map(t=>c`<option value="${t??oo}">${zb(t)}</option>`)}</select>`}_onChange=t=>{this.dispatchEvent(new CustomEvent("analyzer-change",{detail:{value:t.target.value},bubbles:!0,composed:!0}))}};customElements.define("analyzer-select",wl);function Qr(e){return e==="informational"?"info":e.replaceAll("_"," ")}function $l(e){if(!e)return"";for(let t of e.split(`
32
+ `))if(t.trim())return t.trim();return""}function Wb(e){if(!e)return{title:"",body:""};let t=e.indexOf(`
33
+ `);if(t<0)return{title:"",body:e};let r=e.slice(t+1).replace(/^\s+/u,"");return r?{title:e.slice(0,t).trim(),body:r}:{title:"",body:e}}var Rp=/"[^"\n]+"|`[^`\n]+`/gu;function kl(e){if(!e)return e;Rp.lastIndex=0;let t=[],r=0,n;for(;(n=Rp.exec(e))!==null;){n.index>r&&t.push(e.slice(r,n.index));let o=n[0].codePointAt(0)===96?"inline-code":"inline-quote";t.push(c`<span class="${o}">${n[0]}</span>`),r=n.index+n[0].length}return r===0?e:(r<e.length&&t.push(e.slice(r)),t)}function Hb(e){let t=ro(e.file,e.repo?.github,e._repoFallback??a.repoUrl),r=parseInt(e.line,10),n=Number.isFinite(r)?`${e.file}:${e.line}`:e.file;if(!t)return n;let o=Number.isFinite(r)?`${t}#L${r}`:t;return c`<a href="${o}" target="_blank" rel="noopener">${n}</a>`}function Vb(e,t){if(!t)return g;let r=t.slice(0,7),n=Sp(e,t);return n?c`<a href="${n}" target="_blank" rel="noopener" title="${t}">${r}</a>`:c`<span title="${t}">${r}</span>`}var jb=c`<svg viewBox="0 0 16 16" width="11" height="11" aria-hidden="true"><path class="bubble" d="M2.5 3h11a.5.5 0 0 1 .5.5v6.5a.5.5 0 0 1-.5.5H8.4l-3 2.6V10.5H2.5a.5.5 0 0 1-.5-.5V3.5a.5.5 0 0 1 .5-.5z" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linejoin="round"/></svg>`,Kb=c`<svg viewBox="0 0 16 16" width="11" height="11" aria-hidden="true"><path class="wrench" d="M10.4 2.6a3 3 0 0 0-3.6 4.5L2 12l2 2 4.9-4.8a3 3 0 0 0 4.5-3.6l-1.8 1.8-1.5-.4-.4-1.5z" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linejoin="round"/></svg>`,qb=c`<svg viewBox="0 0 16 16" width="11" height="11" aria-hidden="true"><rect x="3" y="2.5" width="8" height="10" rx="1" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linejoin="round"/><rect x="5.5" y="5" width="8" height="9" rx="1" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linejoin="round"/></svg>`,Gb=c`<svg viewBox="0 0 16 16" width="11" height="11" aria-hidden="true"><g stroke="currentColor" stroke-width="1.2" stroke-linecap="round" fill="none"><line x1="8" y1="1.8" x2="8" y2="14.2"/><line x1="1.8" y1="8" x2="14.2" y2="8"/><line x1="3.6" y1="3.6" x2="12.4" y2="12.4"/><line x1="12.4" y1="3.6" x2="3.6" y2="12.4"/></g></svg>`;function Yb(e){if(!a.currentWorkspace)return g;let t=e[0]?._reportName;if(!t)return g;let r=Y[Ke(t)]??Y.default;return c`<span class="report-chip" title="${t}">${ue(r)}<span class="report-chip-label">${Ne(t)}</span></span>`}function Bp(e,t,r,n,o=null){let s=Yb(e),i=a.triage.get(n),l=i?.color??null,d=i?.comment??"",u=i?.fix??"",p=d?`Edit comment: ${d}`:"Add comment",f=u?`Edit fix link: ${u}`:"Add fix link (PR URL, etc.)",h=o==="focus",b=d?"Edit comment":"Comment",m=u?"Edit fix link":"Fix link",y=c`<button type="button" class="${F({"mark-comment":!0,"has-comment":d})}" title="${p}" aria-label="${p}">${jb}${h?c`<span class="mark-btn-label">${b}</span>`:g}</button>`,$=c`<button type="button" class="${F({"mark-fix":!0,"has-fix":u})}" title="${f}" aria-label="${f}">${Kb}${h?c`<span class="mark-btn-label">${m}</span>`:g}</button>`,w=c`<button type="button" class="mark-copy" title="Copy file, line, description, confidence to clipboard" aria-label="Copy finding details to clipboard">${qb}${h?c`<span class="mark-btn-label">Copy</span>`:g}</button>`,v=c`<button type="button" class="mark-claude" title="Open in Claude Code (claude://) with a confirm-and-fix prompt" aria-label="Open finding in Claude Code">${Gb}${h?c`<span class="mark-btn-label">Claude</span>`:g}</button>`,S=c`<color-marker .selected="${l}"></color-marker>`,C=r.hasConflict?"change triage state (colors mismatch \u2014 acts per-tab)":t.length>1?"change triage state for the whole group":"change triage state";return c`${s}<span class="mark-action-group">${y}${$}</span><span class="mark-action-group">${w}${v}</span>${S}${Xb(e,C,o)}`}function Jb(e){if(e.newState!=="open")return;let t=e.currentTarget,n=t.getRootNode().querySelector?.(`[popovertarget="${t.id}"]`);if(!n)return;let o=n.getBoundingClientRect(),s=t.offsetWidth||110,i=t.offsetHeight||100,l=4,d=o.right-s;d<4&&(d=4),d+s>window.innerWidth-4&&(d=window.innerWidth-s-4);let u=o.bottom+l;u+i>window.innerHeight-4&&o.top>i+l&&(u=o.top-i-l),t.style.top=`${u}px`,t.style.left=`${d}px`}function Xb(e,t,r=null){let n=P(e[0]),o=be(e),s=Ae(e),i=P(s),l=o.hasConflict?a.triage.get(i)?.triage??(Xr(s)?"ignored":null):o.commonTriage,d={fixed:"Fixed",invalid:"Invalid",deleted:"Deleted",ignored:"Ignored"},u={fixed:"Fixed",invalid:"Invalid",deleted:"Delete",ignored:"Ignore"},p=!!a.shownTriage,f=p?d[a.shownTriage]:null,h=["fixed","invalid","deleted","ignored"],b=r==="focus",m;b?m=h.map(w=>({key:w,label:u[w]})):p?m=[{key:"restore",label:"Restore"},...h.filter(w=>w!==a.shownTriage).map(w=>({key:w,label:u[w]}))]:m=h.map(w=>({key:w,label:u[w]}));let y=["mark-triage-menu"];p&&y.push("with-label",`triage-state-${a.shownTriage}`);let $=`triage-menu-${n.replaceAll(/[^A-Za-z0-9_-]/gu,"_")}`;return c`<div class="triage-menu-wrap"><button type="button" class="${y.join(" ")}" popovertarget="${$}" popovertargetaction="toggle" title="${t}" aria-label="${t}">${f?c`<span class="mark-triage-label">${f}</span>`:g} <svg viewBox="0 0 12 12" width="11" height="11" aria-hidden="true"><path d="M2 4l4 4 4-4" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg></button><div popover="auto" id="${$}" class="triage-menu" data-gid="${n}" role="menu" @beforetoggle="${Jb}">${m.map(w=>c`<button type="button" class="${F({"triage-menu-item":!0,[`triage-menu-${w.key}`]:!0,active:l===w.key})}" data-triage-action="${w.key}" role="menuitem">${w.label}</button>`)}</div></div>`}function Fp(e,t){let r=P(e),n=a.triage.get(r),o=n?.color,s=n?.triage,i=Xr(e),l=["tab"];return t&&l.push("active"),o&&l.push(`tab-mark-${o}`),s?l.push(`tab-${s}`):i&&l.push("tab-ignored"),c`<button type="button" class="${l.join(" ")}" data-tid="${r}"><span class="tab-label"><span class="${`badge ${e.severity}`}">${Qr(e.severity)}</span> ${e.confidence===void 0?g:c`<span class="tab-conf">${e.confidence}/10</span>`}</span></button>`}function Qb(e){if(a.viewMode==="table"||a.viewMode==="focus"){let t=e.confidence*10;return c`<div class="${`conf-ring ${e.severity}`}"><svg viewBox="0 0 36 36" aria-hidden="true"><circle class="conf-ring-track" cx="18" cy="18" r="15.9155"/><circle class="conf-ring-arc" cx="18" cy="18" r="15.9155" style="${`stroke-dasharray: ${t} 100`}"></circle></svg> <span>${e.confidence}<small>/10</small></span></div><div class="value-label">Confidence</div>`}return c`<div class="conf-score"><strong>${e.confidence}</strong>/10</div><div class="value-label">Confidence</div>`}var Zb=/^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/iu;function ey(e){let t=e?.name;if(typeof t!="string"||!Zb.test(t))return g;let r=e?.version,n=typeof r=="string"&&r.length>0,o=n?`https://www.npmjs.com/package/${t}/v/${encodeURIComponent(r)}`:`https://www.npmjs.com/package/${t}`,s=n?`${t}@${r}`:t;return c`<span class="line-num"><a class="npm-link" href="${o}" target="_blank" rel="noopener noreferrer" title="${`Open ${s} on npmjs.com`}">npm: ${s}</a></span>`}function ty(e,t,r=0,n=1,o=null){let s=P(e),i=a.triage.get(s),l=i?.comment??"",d=i?.fix??"",u=ro(e.file,e.repo?.github,e._repoFallback??a.repoUrl),p=parseInt(e.line,10),f=Number.isFinite(p),h=f?`${e.file}:${e.line}`:e.file,b=u?c`<a href="${f?`${u}#L${p}`:u}" target="_blank" rel="noopener">${h}</a>`:h,m=mr(e),y=m?c`<span class="line-num">${b}, ${m}</span>`:c`<span class="line-num">${b}</span>`,$=br(e),w=o==="focus"?ey(e.package?.npm):g,v=g;if(o!=="focus"&&e.fileHash&&Array.isArray(e._bundleHashes)&&e._bundleHashes.length>0){let R=new Set(e._bundleHashes),O=hr(e.fileHash).find(({integrity:ye})=>R.has(ye));O&&(v=c`<button type="button" class="finding-code-btn" data-finding-code-bundle="${O.integrity}" data-finding-code-file="${O.file}" data-finding-code-line="${e.line??""}" title="${`Open ${O.file} in bundle source viewer`}">Code</button>`)}let{title:S,body:C}=Wb(Ze(e.description,e));return c`<div class="${F({"tab-body":!0,active:t})}" data-tid="${s}">${n>1?c`<div class="print-case-label">${r+1} of ${n}</div>`:g}<div class="finding-left"><span class="${`badge ${e.severity}`}">${Qr(e.severity)}</span><div class="value-label">Severity</div>${e.confidence===void 0?g:Qb(e)} ${v}</div><div><div class="line-row">${y} ${w} ${e.discoveredIn?c`<span class="line-num discovered-in">(found analyzing ${e.discoveredIn})</span>`:g} ${$?c`<span class="run-meta">${$}</span>`:g}</div>${S?c`<div class="desc-title">${S}</div>`:g} ${C?c`<div class="desc">${kl(C)}</div>`:g} ${e.recommendation?c`<div class="recommendation">Recommendation: ${kl(Ze(e.recommendation,e))}</div>`:g} ${e.confidenceReason?c`<div class="conf-reason">${kl(Ze(e.confidenceReason,e))}</div>`:g} ${l?c`<div class="comment-block"><span class="comment-label">Comment:</span> ${l}</div>`:g} ${d?c`<div class="fix-block"><span class="fix-label">Fix:</span> ${Jr(d)?c`<a href="${d}" target="_blank" rel="noopener noreferrer">${d}</a>`:d}</div>`:g}</div></div>`}function Zr(e){return Ee(e)}function Mp(e){let t=be(e),r=no(e),n=e.some(s=>s.critical||s.severity==="critical"),o=["finding"];return n&&o.push("is-critical"),t.hasConflict?o.push("has-conflict"):t.commonColor&&o.push(`mark-${t.commonColor}`),a.shownTriage&&o.push(`triage-${a.shownTriage}`),r.length>1&&o.push("multi-case"),o}function Lp(e,t={}){let{context:r=null}=t,n=be(e),o=no(e),s=Ae(e),i=P(s),l=s.commitHash?c`<div class="commit-ref">introduced in ${Vb(s.repo?.github,s.commitHash)}</div>`:g,d=a.currentWorkspace&&l!==g;return c`${o.map((u,p)=>ty(u,P(u)===i,p,o.length,r))} ${d?c`<div class="marks-commit-row">${l}</div>`:g}<div class="marks"><div class="marks-left">${d?g:l} ${o.length>1?c`<div class="tabs">${o.map(u=>Fp(u,P(u)===i))}</div>`:g}</div>${Bp(e,o,n,i,r)}</div>`}function io(e){return Ee(e)}function Pp(e){let t=be(e),r=e.some(o=>o.critical||o.severity==="critical"),n=[];return r&&n.push("is-critical"),t.hasConflict?n.push("has-conflict"):t.commonColor&&n.push(`mark-${t.commonColor}`),a.shownTriage&&n.push(`triage-${a.shownTriage}`),n}function Op(e){let t=be(e),r=no(e),n=Ae(e),o=P(n),s=n,i=$l(Ze(s.description,s)),l=br(s),d=mr(s),u=d?`, ${d}`:"";return c`<div class="row-score"><span class="${`badge ${s.severity}`}">${Qr(s.severity)}</span> ${s.confidence===void 0?g:c`<span class="row-conf"><strong>${s.confidence}</strong>/10</span>`}</div><div class="row-body"><div class="title-row"><span class="title">${i}</span> ${l?c`<span class="row-type">${l}</span>`:g}</div><div class="meta-row"><span class="row-loc">${Hb(s)}${u}</span><div class="marks">${Bp(e,r,t,o)}</div></div>${r.length>1?c`<div class="tabs-row"><div class="tabs">${r.map(p=>Fp(p,P(p)===o))}</div></div>`:g}</div>`}function ao(e){return"tree-"+e.replaceAll(/[^\w-]+/gu,"_")}var Dp=()=>Object.fromEntries(me.map(e=>[e,0]));function xl(e){let t=new Map;for(let r of e)for(let n of r){t.has(n.file)||t.set(n.file,Dp());let o=t.get(n.file);o[n.severity]!==void 0&&o[n.severity]++}return t}function _l(e){let t=null;for(let r of e)if(r?.tree){t||(t={});for(let n of Object.keys(r.tree)){let o=r.tree[n];if(!t[n]){t[n]={...o,imports:[...o.imports??[]]};continue}let s=new Set(t[n].imports);for(let i of o.imports??[])s.has(i)||(s.add(i),t[n].imports.push(i));t[n].size==null&&o.size!=null&&(t[n].size=o.size)}}return t}function Ps(e,t){let r=new Map;for(let n of Object.keys(e)){let o=new Set,s=[...(e[n].imports??[]).filter(l=>e[l])];for(;s.length>0;){let l=s.pop();if(!o.has(l)){o.add(l);for(let d of e[l]?.imports??[])e[d]&&s.push(d)}}let i=Dp();for(let l of o){let d=t.get(l);if(d)for(let u of me)i[u]+=d[u]??0}r.set(n,i)}return r}function Sl(e,t,r){let n=t.get(e),o=r.get(e);return Np(n)>0||Np(o)>0}function Np(e){if(!e)return 0;let t=0;for(let r of me)t+=e[r]??0;return t}function Up(e){if(!e)return g;let t=hr(e)[0];return t?c`<button type="button" class="tree-code-btn" data-finding-code-bundle="${t.integrity}" data-finding-code-file="${t.file}" title="${`Open ${t.file} in bundle source viewer`}">Code</button>`:g}function zp(e,t){let r=Object.keys(e).toSorted(),n=new Map;for(let p of r)for(let f of e[p].imports??[]){let h=n.get(f)??[];h.push(p),n.set(f,h)}let o=a.filesSearch.trim().toLowerCase(),s=o?r.filter(p=>p.toLowerCase().includes(o)):r,i=p=>e[p]?c`<a href="${`#${ao(p)}`}"><span class="name">${p}</span></a>`:c`<span class="name">${p}</span>`,l=p=>{let f=t.get(p);if(!f)return null;let h=me.filter(b=>(f[b]??0)>0);return h.length===0?null:c`<span class="tree-count-chips">${h.map(b=>c`<span class="${`tree-count-chip ${b}`}">${f[b]} ${b.replaceAll("_"," ")}</span>`)}</span>`},d=p=>{let f=t.get(p);return f?me.reduce((h,b)=>h+(f[b]??0),0):0},u=c`<div class="tree-toolbar"><view-mode-buttons modes="table,list" kind="files"></view-mode-buttons><div class="search-row"><toolbar-search kind="files"></toolbar-search><span class="result-count">${s.length} of ${r.length}</span></div></div>`;if(a.filesViewMode==="table"){let p=a.filesSelectedFile&&e[a.filesSelectedFile]&&s.includes(a.filesSelectedFile)?a.filesSelectedFile:null;return c`<div class="${p?"tree-view tree-view-table with-details":"tree-view tree-view-table"}">${u}<div class="${p?"tree-table-layout open":"tree-table-layout"}"><div class="tree-table-list">${s.length===0?c`<div class="tree-table-empty">No files match the search.</div>`:g} ${s.map(b=>{let m=d(b),y=b===p,$=De(e[b]?.size);return c`<div class="${`tree-table-row${y?" selected":""}${m===0?" clean":""}`}" data-tree-select="${b}"><span class="tree-table-name">${b}</span> ${l(b)??c`<span class="tree-table-clean-marker">—</span>`} ${$?c`<span class="tree-table-size">${$}</span>`:g}</div>`})}</div>${p?c`<aside class="tree-table-details" id="tree-table-details"><header class="tree-table-details-bar"><span class="tree-table-details-label">Details</span> <button type="button" class="tree-table-details-close" data-tree-deselect title="Close details" aria-label="Close details">×</button></header><div class="tree-table-details-body">${ry(e[p],p,n.get(p)??[],i)}</div></aside>`:g}</div></div>`}return c`<div class="tree-view">${u} ${s.length===0?c`<div class="tree-table-empty">No files match the search.</div>`:g} ${s.map(p=>{let f=e[p],h=n.get(p)??[],b=De(f?.size);return c`<section class="tree-file" id="${ao(p)}"><div class="tree-file-header"><span class="name">${p}</span> ${l(p)} ${b?c`<span class="tree-file-size">${b}</span>`:g} ${Up(f.fileHash)}</div>${f.fileHash||f.treeHash?c`<div class="tree-hashes hashes">${f.fileHash?c`<div class="tree-hash">file: ${f.fileHash}</div>`:g} ${f.treeHash?c`<div class="tree-hash">tree: ${f.treeHash}</div>`:g}</div>`:g} ${f.imports?.length>0?c`<div class="tree-section"><span class="tree-section-label">imports</span><ul>${f.imports.map(m=>c`<li>${i(m)}</li>`)}</ul></div>`:g} ${h.length>0?c`<div class="tree-section"><span class="tree-section-label">imported by</span><ul>${h.map(m=>c`<li>${i(m)}</li>`)}</ul></div>`:g} ${f.exports?.length>0?c`<div class="tree-section"><span class="tree-section-label">exports</span><ul>${f.exports.map(m=>c`<li><span class="name">${m}</span></li>`)}</ul></div>`:g}</section>`})}</div>`}function ry(e,t,r,n){let o=De(e?.size);return c`<div class="tree-detail-name"><span class="name">${t}</span> ${o?c`<span class="tree-detail-size">${o}</span>`:g} ${Up(e.fileHash)}</div>${e.fileHash||e.treeHash?c`<div class="tree-hashes hashes">${e.fileHash?c`<div class="tree-hash">file: ${e.fileHash}</div>`:g} ${e.treeHash?c`<div class="tree-hash">tree: ${e.treeHash}</div>`:g}</div>`:g} ${e.imports?.length>0?c`<div class="tree-section"><span class="tree-section-label">imports</span><ul>${e.imports.map(s=>c`<li>${n(s)}</li>`)}</ul></div>`:g} ${r.length>0?c`<div class="tree-section"><span class="tree-section-label">imported by</span><ul>${r.map(s=>c`<li>${n(s)}</li>`)}</ul></div>`:g} ${e.exports?.length>0?c`<div class="tree-section"><span class="tree-section-label">exports</span><ul>${e.exports.map(s=>c`<li><span class="name">${s}</span></li>`)}</ul></div>`:g}`}function ny(){return{showAll:!1,selected:null,focusedPkg:null,topPkgsTab:"issues",edgeOpacity:.22,nodeSize:1,showLabels:!1,selectedSeverities:new Set,selectedColors:new Set,pathFilter:"",hidden:new Set,solo:null,graphState:null,layoutCache:null}}var Yt=ny(),A=new Proxy(Yt,{get(e,t){return Yt[t]},set(e,t,r){return Yt[t]=r,!0},has(e,t){return t in Yt},deleteProperty(e,t){return delete Yt[t]},ownKeys(){return Reflect.ownKeys(Yt)},getOwnPropertyDescriptor(e,t){return Object.getOwnPropertyDescriptor(Yt,t)}});function ze(){A.graphState?._cleanup&&A.graphState._cleanup(),A.graphState=null}function Wp(){return Yt}var lo=null,Hp=null;function en(){return Hp}function oy(){return lo||(lo=(async()=>{let e="./graph.js";try{let t=await import(e);return t._swapGraph2Impl(Wp()),Hp=t,t}catch(t){throw lo=null,t}})(),lo)}async function Cl(e,t,r,n,o){try{let s=await oy(),i=s.buildGraphFromPrep(t);W(c`<graph-layout .graph="${i}" .options="${r}"></graph-layout>`,e);let l=e.querySelector("graph-layout");return await l.updateComplete,n(),o(),s.attachGraph2Interaction(e,i,n),l}catch(s){let i=s instanceof Error?s.message:String(s);return e.textContent=`Graph failed to load: ${i}`,null}}function dt(e){let t=new Map;if(!e)return t;if(e.kind==="stasis"){if(!e.bundle)return t;for(let[r,n]of e.bundle.sources)typeof n=="string"&&t.set(r,n)}else if(e.kind==="sourcemap"){if(!e.json)return t;let r=e.json.sources??[],n=e.json.sourcesContent??[];for(let o=0;o<r.length;o++)typeof n[o]=="string"&&t.set(r[o],n[o])}return t}var co=null,uo=null;function sy(){return co||(co=(async()=>{let e="./terminal.js";try{return await import(e)}catch(t){throw co=null,t}})(),co)}function iy(e){let t=dt(e);if(t.size===0)return t;let r=[...t.keys()],{stripped:n}=Rt(r),o=new Map;for(let s=0;s<r.length;s++)o.set(n[s],t.get(r[s]));return o}async function Vp(e,t){let r=t?.integrity??"";(!uo||uo.integrity!==r)&&(uo={integrity:r,promise:ay(t,r)});try{let n=await uo.promise;return!e.isConnected||e.contains(n)||e.replaceChildren(n),n}catch(n){uo=null;let o=n instanceof Error?n.message:String(n);return e.textContent=`Terminal failed to load: ${o}`,null}}async function ay(e,t){return(await sy()).createTerminalElement(iy(e),t)}function Kp(e){if(!e)return null;let t=$p()==="node_modules"?/^(?:.*\/)?node_modules\/(@[^/]+\/[^/]+|[^/]+)/u:/^(?:.*\/)?dependencies\/(@[^/]+\/[^/]+|[^/]+)/u,r=e.match(t);if(r)return r[1];let n=e.indexOf("/");return n>0?e.slice(0,n):"/"}var ly=["#4e9af1","#f28e2b","#59a14f","#e15759","#76b7b2","#edc948","#b07aa1","#ff9da7","#9c755f","#5cd1e5","#f1ce63","#d37295","#a0cbe8","#86bcb6","#8cd17d","#b6992d","#499894","#e15759","#e879c7","#d4a6c8"],jp=["#2f8aef","#d2691e","#2ea043","#e63946","#2e9a92","#b88817","#9560e8","#d24a9c","#8a5d40","#0891b2","#a07a14","#c14e8e","#1f7ad0","#549b94","#3fb95f","#a07a14","#2a8278","#cb2c40","#c026d3","#965f93"];function cy(){if(typeof document>"u")return!1;let e=document.body?.classList;return!!e&&(e.contains("theme-light")||e.contains("theme-pink"))}var El=new Map;function Ft(e){let t=cy()?jp:ly,n=`${t===jp?"l":"d"}:${e??"__own__"}`;if(El.has(n))return El.get(n);let o=e??"__own__",s=0;for(let u of o)s=s*37+u.codePointAt(0)|0;let l=((s%t.length+t.length)%t.length*7+3)%t.length,d=t[l];return El.set(n,d),d}var Al=(e,t,r)=>{for(let n of t)if(n[0]===e)return(0,n[1])();return r?.()};var tn='<svg class="file-icon" viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 2 2 5v6l6 3 6-3V5L8 2Z"/><path d="M2 5l6 3 6-3"/><path d="M8 8v6"/></svg>',Os='<svg class="file-icon" viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="2.5" y="4" width="11" height="9" rx="1.2"/><path d="M6 4V3h4v1"/></svg>';var Ns=null;function dy(){return Ns||(Ns=(async()=>await import("./prism.js"))(),Ns)}var uy={js:"javascript",mjs:"javascript",cjs:"javascript",jsx:"jsx",ts:"typescript",mts:"typescript",cts:"typescript",tsx:"tsx",json:"json",css:"css",html:"markup",htm:"markup",xml:"markup",svg:"markup",yml:"yaml",yaml:"yaml",sh:"bash",bash:"bash",md:"markdown",markdown:"markdown",sol:"solidity"};function Ds(e){if(typeof e!="string")return null;let t=e.lastIndexOf(".");return t<0?null:uy[e.slice(t+1).toLowerCase()]??null}async function Us(e,t){if(!t)return null;try{return(await dy()).highlight(e,t)}catch{return null}}var Ie=`.lwd-body{margin:.2rem 0 .55rem;color:var(--text);font-size:.86rem;line-height:1.5}.lwd-empty{margin:.2rem 0 .55rem;color:var(--muted);font-size:.78rem}.lwd-note{margin:.2rem 0 .65rem;padding:.55rem .7rem;border:1px solid var(--border);border-radius:6px;background:rgb(from var(--text) r g b / .03);color:var(--muted);font-size:.78rem;line-height:1.45}.lwd-choice{margin:.2rem 0 .65rem;padding:.55rem .7rem .6rem;border:1px solid var(--border);border-radius:6px;background:rgb(from var(--text) r g b / .03);& legend{padding:0 .35rem;color:var(--text);font-size:.78rem;font-weight:500;& strong{font-weight:600}}}.lwd-option{display:flex;align-items:flex-start;gap:.5rem;padding:.3rem .15rem;& input[type=radio]{margin:.15rem 0 0;accent-color:var(--accent)}.lwd-option-text{display:flex;flex-direction:column;gap:.1rem;min-width:0}.lwd-option-title{color:var(--text);font-size:.82rem;line-height:1.35}.lwd-option-hint{color:var(--muted);font-size:.72rem;line-height:1.4}}.lwd-list{margin:0;padding-left:1.1rem;color:var(--muted);font-size:.76rem;line-height:1.5;& li+li{margin-top:.2rem}& strong{color:var(--text);font-weight:600}}.lwd-kind-tag{display:inline-block;vertical-align:middle;margin-left:.3rem;padding:0 .35rem;border:1px solid var(--border);border-radius:3px;background:rgb(from var(--text) r g b / .04);color:var(--muted);font-size:.62rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em}.lwd-rename-input{margin-top:.2rem}.lwd-rename-error{margin:.25rem 0 0;color:var(--critical, #f87171);font-size:.72rem;line-height:1.35}
34
+ `;var Tl=class extends I{static styles=[...I.styles,T(Ie)];static properties={reportName:{type:String},workspaceNames:{type:Array},existingNames:{type:Object},_choice:{state:!0},_newName:{state:!0}};constructor(){super(),this.reportName="",this.workspaceNames=[],this.existingNames=new Set,this._choice="replace",this._newName=""}focusInitial(){this.renderRoot.querySelector('button[data-role="cancel"]')?.focus()}_onClose=()=>this._finish({action:"cancel"});_onCancel=()=>this._finish({action:"cancel"});_onChoiceChange=t=>{this._choice=t.target.value};_onNewNameInput=t=>{this._newName=t.target.value};_onNewNameKeydown=t=>{t.key==="Enter"&&(t.preventDefault(),this._onConfirm())};_onConfirm=()=>{if(this._choice==="rename"){let t=(this._newName??"").trim();if(!this._isRenameValid(t))return;this._finish({action:"rename",newName:t});return}this._finish({action:"replace"})};_replaceHint(){let t=this.workspaceNames.length;if(t===0)return c`<span class="lwd-option-hint">The local file will be overwritten.</span>`;let r=t===1?c`workspace <strong>"${this.workspaceNames[0]}"</strong>`:c`<strong>${t}</strong> workspaces (${this.workspaceNames.join(", ")})`;return c`<span class="lwd-option-hint">The local file will be overwritten. When sync is online, the new bytes are also uploaded to ${r} so the cloud copy matches.</span>`}_renameValidationTpl(t){return t?t===this.reportName?c`<p class="lwd-rename-error">Pick a name different from the original.</p>`:t.includes("\0")?c`<p class="lwd-rename-error">The new name cannot contain a NUL byte.</p>`:t.includes("/")||t.includes("\\")?c`<p class="lwd-rename-error">The new name cannot contain "/" or "\\".</p>`:this.existingNames.has(t)?c`<p class="lwd-rename-error">A file named "${t}" already exists — pick something else.</p>`:g:c`<p class="lwd-rename-error">Enter a new name.</p>`}_isRenameValid(t){return t.length>0&&t!==this.reportName&&!t.includes("\0")&&!t.includes("/")&&!t.includes("\\")&&!this.existingNames.has(t)}render(){let t=this._choice==="rename",r=(this._newName??"").trim(),n=t&&!this._isRenameValid(r),o=t?"Rename":"Replace",s=t?"primary":"danger",i=this.workspaceNames.length>0?c`<span class="lwd-option-hint">Saved as an unfiled report — the renamed copy isn't added to any workspace.</span>`:g;return c`<dialog @close="${this._onClose}"><header><h3>Import conflict</h3></header><p class="lwd-body"><strong>"${this.reportName}"</strong> already exists with different content.</p><fieldset class="lwd-choice"><legend>What should happen?</legend><label class="lwd-option"><input type="radio" name="icd-choice" value="replace" ?checked="${this._choice==="replace"}" @change="${this._onChoiceChange}"> <span class="lwd-option-text"><span class="lwd-option-title">Replace</span> ${this._replaceHint()}</span></label> <label class="lwd-option"><input type="radio" name="icd-choice" value="rename" ?checked="${this._choice==="rename"}" @change="${this._onChoiceChange}"> <span class="lwd-option-text"><span class="lwd-option-title">Rename to</span> <input type="text" class="nwd-input lwd-rename-input" maxlength="200" .value="${this._newName}" ?disabled="${!t}" @input="${this._onNewNameInput}" @keydown="${this._onNewNameKeydown}" @focus="${()=>{this._choice="rename"}}"> ${i} ${t?this._renameValidationTpl(r):g}</span></label></fieldset><footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" data-role="cancel" @click="${this._onCancel}">Cancel</button> <button type="button" class="${s}" ?disabled="${n}" @click="${this._onConfirm}">${o}</button></footer></dialog>`}};customElements.define("import-conflict-dialog",Tl);function qp({name:e,workspaceNames:t,existingNames:r}={}){let n=r instanceof Set?r:new Set(r??[]);return new Promise(o=>{let s=document.createElement("import-conflict-dialog");Object.assign(s,{reportName:e??"",workspaceNames:Array.isArray(t)?t:[],existingNames:n,_newName:fy(e??"",n)}),s.addEventListener("resolve",i=>{s.remove(),o(i.detail)}),s.addEventListener("modal-conflict",()=>{s.remove(),o({action:"cancel"})}),document.body.append(s)})}function fy(e,t){if(typeof e!="string"||e.length===0)return"";let r=e.lastIndexOf("."),n=r>0?e.slice(0,r):e,o=r>0?e.slice(r):"",s=n.replace(/-\d+$/u,"");for(let i=2;i<1e3;i++){let l=`${s}-${i}${o}`;if(!t.has(l))return l}return""}function U(e,t){if(!e)throw new Error(t)}function rn(e,t){let[r,n]=[e.split("/"),t.split("/")];for(;r.length>0&&r[0]===n[0];)r.shift(),n.shift();if(r.length===0&&n.length===0)return 0;if(r.length<2)return n.length<2&&r>n?1:-1;if(n.length<2)return 1;if(r[0]==="*")return-1;if(n[0]==="*"||r[0]==="node_modules")return 1;if(n[0]==="node_modules")return-1;let[o,s]=[r,n].map(i=>i.join(String.fromCodePoint(0)));if(o<s)return-1;if(o>s)return 1;throw new Error("Unreachable")}var hy=e=>e&&[null,Object.prototype].includes(Object.getPrototypeOf(e)),nn=e=>Object.setPrototypeOf(Object.fromEntries(e),null),Gp=e=>[...e].toSorted((t,r)=>rn(t,r)),zs=e=>nn([...e].toSorted((t,r)=>rn(t[0],r[0])).map(([t,r])=>[t,r instanceof Map?zs(r):r])),Il=e=>new Map(Object.entries(e).map(([t,r])=>[t,hy(r)?Il(r):r]));function Yp(e){let t="node_modules/",r=e.lastIndexOf(t);if(r===-1)return null;let n=r+t.length,o=e.slice(n).split("/"),s=o[0].startsWith("@")?2:1;if(o.length<=s||o.slice(0,s).some(l=>!l))return null;let i=o.slice(0,s).join("/");return{dir:e.slice(0,n)+i,rel:o.slice(s).join("/"),name:i}}var $t=1,Rl=0,Ws=({name:e,version:t,files:r})=>({name:e,version:t,files:nn(Object.entries(r))}),Jp=e=>Yp(e)??{dir:".",rel:e,name:null},Hs=class e{static VERSION=$t;version=$t;config;entries;modules;formats;imports;constructor({config:t={scope:"full"},entries:r,modules:n,formats:o,imports:s,version:i=$t}={}){U([Rl,$t].includes(i)),U(["node_modules","full"].includes(t.scope)),this.version=i,this.config=t,this.entries=r??new Set,this.modules=n??new Map,this.formats=o??new Map,this.imports=s??new Map}get sources(){let t=new Map;for(let[r,{files:n}]of this.modules)for(let[o,s]of Object.entries(n))t.set(r==="."?o:`${r}/${o}`,s);return t}static parseCode(t){let r=JSON.parse(t);U(r.version===$t||r.version===Rl),U(["node_modules","full"].includes(r.config?.scope)),U(r.formats),U(r.imports);let n=new Map,o=new Set;if(r.version===$t){let s=r.config.scope==="full";if(r.modules!==void 0){U(typeof r.modules=="object"&&r.modules!==null);for(let[i,l]of Object.entries(r.modules))U(i.includes("node_modules")),U(!i.startsWith("..")),U(l?.name&&l.version&&l.files),n.set(i,Ws(l))}if(s){U(Array.isArray(r.entries)),U(r.entries.length>0,"v1 bundle with scope=full must have at least one entry"),U(r.sources&&typeof r.sources=="object"),o=new Set(r.entries);for(let[i,l]of Object.entries(r.sources))U(!i.includes("node_modules")),U(!i.startsWith("..")),U(l?.name&&l.version&&l.files),n.set(i,Ws(l))}else U(r.entries===void 0),U(r.sources===void 0);for(let[,{files:i}]of n)for(let l of Object.keys(i))U(!l.startsWith(".."))}else{U(r.sources);for(let[s,i]of Object.entries(r.sources)){U(!s.startsWith(".."));let{dir:l,rel:d,name:u}=Jp(s);U(!l.startsWith("..")&&!d.startsWith("..")),n.has(l)||n.set(l,{name:u,version:null,files:Object.create(null)}),n.get(l).files[d]=i}}return new e({version:r.version,config:r.config,entries:o,modules:n,formats:new Map(Object.entries(r.formats)),imports:Il(r.imports)})}static parseResources(t){let r=JSON.parse(t);U(r.version===$t||r.version===Rl);let n=new Map,o={scope:"full"};if(r.version===$t){U(["node_modules","full"].includes(r.config?.scope)),o=r.config;let s=o.scope==="full";if(r.modules!==void 0){U(typeof r.modules=="object"&&r.modules!==null);for(let[i,l]of Object.entries(r.modules))U(i.includes("node_modules")),U(!i.startsWith("..")),U(l?.name&&l.version&&l.files),n.set(i,Ws(l))}if(s&&r.sources!==void 0){U(typeof r.sources=="object"&&r.sources!==null);for(let[i,l]of Object.entries(r.sources))U(!i.includes("node_modules")),U(!i.startsWith("..")),U(l?.name&&l.version&&l.files),n.set(i,Ws(l))}else s||U(r.sources===void 0);for(let[,{files:i}]of n)for(let l of Object.keys(i))U(!l.startsWith(".."))}else{U(r.resources);for(let[s,i]of Object.entries(r.resources)){U(!s.startsWith(".."));let{dir:l,rel:d,name:u}=Jp(s);U(!l.startsWith("..")&&!d.startsWith("..")),n.has(l)||n.set(l,{name:u,version:null,files:Object.create(null)}),n.get(l).files[d]=i}}return new e({version:r.version,config:o,modules:n})}#e(){let t=[],r=[];for(let[n,{name:o,version:s,files:i}]of this.modules){if(Object.keys(i).length===0)continue;let l=n.includes("node_modules");l&&U(o&&s&&i);let d=nn(Object.entries(i).toSorted((p,f)=>rn(p[0],f[0])));(l?t:r).push([n,{name:o,version:s,files:d}])}return t.sort((n,o)=>rn(n[0],o[0])),r.sort((n,o)=>rn(n[0],o[0])),{modules:nn(t),sources:nn(r)}}serializeCode(){let t=Gp(this.entries),{modules:r,sources:n}=this.#e(),o=zs(this.formats),s=zs(this.imports),i={version:$t,config:this.config};return this.config.scope==="full"&&Object.assign(i,{entries:t,sources:n}),Object.assign(i,{modules:r,formats:o,imports:s}),JSON.stringify(i,void 0,2)}serializeResources(){let{modules:t,sources:r}=this.#e(),n={version:$t,config:this.config};return this.config.scope==="full"&&Object.assign(n,{sources:r}),Object.assign(n,{modules:t}),JSON.stringify(n,void 0,2)}};var Vs=null,js=null,Ks=null;function gy(){for(let e of["br","brotli"])try{return new DecompressionStream(e),e}catch{}return null}async function my(e,t){let r=new Blob([t]).stream().pipeThrough(new DecompressionStream(e));return new Uint8Array(await new Response(r).arrayBuffer())}async function by(){if("serviceWorker"in navigator)try{let e=await navigator.serviceWorker.getRegistrations();for(let t of e){let r=t.active?.scriptURL??t.installing?.scriptURL??t.waiting?.scriptURL;r&&r.endsWith("/brotli-sw.js")&&await t.unregister()}}catch{}}function yy(){return Ks||(Ks=(async()=>await import("./brotli-fallback.js"))(),Ks)}async function wy(){await by();let e=gy();return e?(Vs={kind:"native",format:e},Vs):(Vs={kind:"fallback"},Vs)}function Xp(){return js||(js=wy(),js)}async function Qp(e){let t=await Xp();return t.kind==="native"?my(t.format,e):(await yy()).brotliDecompress(e)}Xp().catch(()=>{});async function qs(e,t){try{let r=await pr(e),n=t.name.toLowerCase().endsWith(".map"),o=n?"sourcemap":"stasis";try{if(n){let l=JSON.parse(ce(r));return{integrity:e,kind:o,size:r.byteLength,json:l}}let s=ce(await Qp(r)),i=Hs.parseCode(s);return{integrity:e,kind:o,size:r.byteLength,bundle:i}}catch(s){return{integrity:e,kind:o,size:r.byteLength,error:s.message}}}catch(r){return{integrity:e,error:r.message,size:0}}}function vy(e){!e?.json&&!e?.bundle||(async()=>{try{let t=await Fl(e);if(us(e.integrity,t),a.selectedBundle!==e.integrity)return;e.fileHashes=t,k()}catch{}})()}async function Bl(e){if($a(e))return;let t=(a.bundles??[]).find(n=>n.integrity===e);if(!t)return;let r=await qs(e,t);if(!(!r?.json&&!r?.bundle))try{let n=await Fl(r);us(e,n)}catch{}}async function Jt(e){let t=(a.bundles??[]).find(n=>n.integrity===e);if(!t)return;let r=await qs(e,t);a.selectedBundle===e&&(a.bundleDetails=r,k(),vy(r),yt().catch(()=>{}))}var ky=["finding_url","repository","title","description","severity","configured_scan_id","relevant_paths"];function $y(e){let t=[],r=[],n="",o=!1,s=e.length;for(let i=0;i<s;i++){let l=e[i];o?l==='"'?e[i+1]==='"'?(n+='"',i++):o=!1:n+=l:l==='"'?o=!0:l===","?(r.push(n),n=""):l===`
35
35
  `||l==="\r"?(r.push(n),t.push(r),r=[],n="",l==="\r"&&e[i+1]===`
36
- `&&i++):n+=l}for((n!==""||r.length>0)&&(r.push(n),t.push(r));t.length>0&&t.at(-1).length===1&&t.at(-1)[0]==="";)t.pop();return t}function Ip(e){let t=zb(e);if(t.length<2)throw new Error("Codex CSV: empty or missing header row");let r=t[0],n=l=>r.indexOf(l);for(let l of Ub)if(n(l)===-1)throw new Error(`Codex CSV: missing required column "${l}"`);let o={finding_url:n("finding_url"),repository:n("repository"),title:n("title"),description:n("description"),severity:n("severity"),detected_at:n("detected_at"),committed_at:n("committed_at"),configured_scan_id:n("configured_scan_id"),commit_hash:n("commit_hash"),relevant_paths:n("relevant_paths")},s=new Map;for(let l=1;l<t.length;l++){let d=t[l];if(d.length===1&&d[0]==="")continue;let u=d[o.configured_scan_id];u&&(s.has(u)||s.set(u,[]),s.get(u).push(d))}if(s.size===0)throw new Error("Codex CSV: no rows with a configured_scan_id");let i=[];for(let[l,d]of s){let u=new Set(d.map(m=>m[o.repository]).filter(Boolean));if(u.size>1)throw new Error(`Codex CSV: scan ${l} contains multiple repositories: ${[...u].join(", ")}`);let f=[...u][0]||"unknown-repo",p=l.replace(/^[^:]+:/u,""),h=`${f}:${p}`,b=d.map(m=>Wb(m,o));i.push({displayName:h,data:{type:"security",source:"codex-security",findings:b}})}return i}function Wb(e,t){let r=(e[t.relevant_paths]||"").split(" | ").map(d=>d.trim()).find(Boolean)||"unknown",n="?",o=e[t.title]||"",s=e[t.description]||"",i=o&&s?`${o}
36
+ `&&i++):n+=l}for((n!==""||r.length>0)&&(r.push(n),t.push(r));t.length>0&&t.at(-1).length===1&&t.at(-1)[0]==="";)t.pop();return t}function Zp(e){let t=$y(e);if(t.length<2)throw new Error("Codex CSV: empty or missing header row");let r=t[0],n=l=>r.indexOf(l);for(let l of ky)if(n(l)===-1)throw new Error(`Codex CSV: missing required column "${l}"`);let o={finding_url:n("finding_url"),repository:n("repository"),title:n("title"),description:n("description"),severity:n("severity"),detected_at:n("detected_at"),committed_at:n("committed_at"),configured_scan_id:n("configured_scan_id"),commit_hash:n("commit_hash"),relevant_paths:n("relevant_paths")},s=new Map;for(let l=1;l<t.length;l++){let d=t[l];if(d.length===1&&d[0]==="")continue;let u=d[o.configured_scan_id];u&&(s.has(u)||s.set(u,[]),s.get(u).push(d))}if(s.size===0)throw new Error("Codex CSV: no rows with a configured_scan_id");let i=[];for(let[l,d]of s){let u=new Set(d.map(m=>m[o.repository]).filter(Boolean));if(u.size>1)throw new Error(`Codex CSV: scan ${l} contains multiple repositories: ${[...u].join(", ")}`);let p=[...u][0]||"unknown-repo",f=l.replace(/^[^:]+:/u,""),h=`${p}:${f}`,b=d.map(m=>xy(m,o));i.push({displayName:h,data:{type:"security",source:"codex-security",findings:b}})}return i}function xy(e,t){let r=(e[t.relevant_paths]||"").split(" | ").map(d=>d.trim()).find(Boolean)||"unknown",n="?",o=e[t.title]||"",s=e[t.description]||"",i=o&&s?`${o}
37
37
 
38
- ${s}`:o||s,l={id:e[t.finding_url],file:r,line:n,severity:(e[t.severity]||"medium").toLowerCase(),description:i,repo:{github:e[t.repository]}};return t.commit_hash!==-1&&e[t.commit_hash]&&(l.commitHash=e[t.commit_hash]),t.detected_at!==-1&&e[t.detected_at]&&(l.detectedAt=e[t.detected_at]),t.committed_at!==-1&&e[t.committed_at]&&(l.committedAt=e[t.committed_at]),l}var rn=`.conflict-sev{display:inline-block;padding:1px .4rem;border-radius:3px;font-size:.62rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:#fff;flex-shrink:0;&.sev-critical{background:var(--critical)}&.sev-high{background:var(--high)}&.sev-medium{background:var(--medium)}&.sev-low{background:var(--low)}&.sev-high_bug{background:var(--high-bug)}&.sev-bug{background:var(--bug)}&.sev-informational{background:var(--info)}}
39
- `;var Bp=`dialog{max-width:720px;width:min(94vw,720px)}header h3{margin:0 0 .25rem}header p{margin:0 0 .75rem;color:var(--muted);font-size:.82rem}.bulk{display:flex;gap:.4rem;margin-bottom:.7rem;padding-bottom:.7rem;border-bottom:1px solid var(--border)}.bulk button,.actions button{background:transparent;border:1px solid var(--border);color:var(--text);border-radius:5px;padding:.3rem .8rem;font:inherit;font-size:.78rem;&:hover{border-color:var(--accent);color:var(--accent)}&.primary{background:var(--accent);color:var(--surface);border-color:var(--accent)}&.primary:hover{filter:brightness(1.08)}}.list{list-style:none;margin:0;padding:0;max-height:60vh;overflow-y:auto;overscroll-behavior:none;-webkit-app-region:no-drag;app-region:no-drag;display:flex;flex-direction:column;gap:.5rem}.card{border:1px solid var(--border);border-radius:6px;padding:.55rem .7rem .6rem;background:rgb(from var(--text) r g b / .02)}.card-head{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}.id{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.68rem;color:var(--muted);padding:1px .3rem;background:rgb(from var(--text) r g b / .05);border-radius:3px}.desc{font-size:.78rem;color:var(--muted);margin-bottom:.55rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows{display:flex;flex-direction:column;gap:.35rem}.row{display:grid;grid-template-columns:5rem 1fr 1fr;align-items:stretch;gap:.4rem}.row-label{color:var(--muted);font-size:.72rem;text-transform:uppercase;letter-spacing:.08em;align-self:center}.choice{display:flex;flex-direction:column;gap:.15rem;padding:.35rem .5rem;border:1px solid var(--border);border-radius:5px;min-width:0;&:has(input:checked){border-color:var(--accent);background:rgb(from var(--accent) r g b / .07)}}.choice input[type=radio]{position:absolute;opacity:0;pointer-events:none}.choice-label{font-size:.68rem;color:var(--muted);text-transform:uppercase;letter-spacing:.08em}.choice:has(input:checked) .choice-label{color:var(--accent)}.choice-value{font-size:.82rem;min-width:0}.color{display:inline-flex;align-items:center;gap:.35rem}.color-dot{width:12px;height:12px;border-radius:50%;box-shadow:0 0 0 1px rgb(from var(--text) r g b / .2);flex-shrink:0;&.marker-red{background:var(--marker-red)}&.marker-blue{background:var(--marker-blue)}&.marker-green{background:var(--marker-green)}&.marker-gray{background:var(--marker-gray)}}.color-name{text-transform:capitalize}.comment-text{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;color:var(--text);white-space:pre-wrap;overflow-wrap:anywhere;& em{color:var(--muted);font-style:italic}}.fix-text{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-all;& a{color:var(--accent);text-decoration:none}& a:hover{text-decoration:underline}}.actions{display:flex;justify-content:flex-end;gap:.4rem;margin-top:.8rem;padding-top:.7rem;border-top:1px solid var(--border)}
40
- `;function nn(e){if(!e)return g;let t=e.replaceAll("_"," ");return c`<span class="${`conflict-sev sev-${e}`}">${t}</span>`}function jb(e){return`bundle-${e.slice(7,19)}\u2026`}function Ye(e){return e.kind==="bundle"?e.label??jb(e.identifier):e.identifier}function Kb(e){return e?c`<span class="color"><span class="${`color-dot marker-${e}`}"></span> <span class="color-name">${e}</span></span>`:c`<em>none</em>`}function qb(e){return c`<span class="comment-text">${e||c`<em>empty</em>`}</span>`}function Gb(e){return e?Gr(e)?c`<span class="fix-text"><a href="${e}" target="_blank" rel="noopener noreferrer">${e}</a></span>`:c`<span class="fix-text">${e}</span>`:c`<span class="comment-text"><em>empty</em></span>`}function Yb(e){return e?c`<span class="${`triage triage-${e}`}">${e}</span>`:c`<em>none</em>`}function Fp(e,t){return e==="color"?Kb(t):e==="comment"?qb(t):e==="fix"?Gb(t):e==="triage"?Yb(t):c`${String(t)}`}function Jb(e,t){let r=e?.file?e.line?`${e.file}:${e.line}`:e.file:"";return c`<div class="card-head">${nn(e?.severity)} ${r?c`<span class="loc" title="${r}">${r}</span>`:g} <code class="id" title="${t}">${t.slice(0,8)}…</code></div>${e?.description?c`<div class="desc" title="${e.description}">${e.description}</div>`:g}`}var Mp={title:"Triage conflicts",intro:"disagree with your local triage on",trailingNote:"",applyButton:"Apply",importedSideLabel:"Apply imported"},Rp={color:0,comment:1,fix:2,triage:3},Xb={color:"Color",comment:"Comment",fix:"Fix",triage:"Triage state"},Cl=class extends I{static styles=[...I.styles,T(rn),T(Bp)];static properties={conflicts:{attribute:!1},findingLookup:{attribute:!1},labels:{attribute:!1},_settled:{state:!0}};constructor(){super(),this.conflicts=[],this.findingLookup=new Map,this.labels={...Mp},this._settled=!1}focusInitial(){}_onClick=t=>{let r=t.target.closest("[data-bulk]");if(r){let n=r.dataset.bulk;for(let o of this.renderRoot.querySelectorAll(`input[type="radio"][value="${n}"]`))o.checked=!0;return}if(t.target.closest('[data-action="apply"]')){let n={};for(let o of this.conflicts){let s=`${o.id}:${o.property}`,i=this.renderRoot.querySelector(`input[name="conflict-${CSS.escape(s)}"]:checked`);n[s]=i?.value??"local"}this._finish(n);return}t.target.closest('[data-action="cancel"]')&&this._finish(null)};render(){let t=this.labels,r=new Map;for(let u of this.conflicts)r.has(u.id)||r.set(u.id,[]),r.get(u.id).push(u);for(let u of r.values())u.sort((f,p)=>(Rp[f.property]??99)-(Rp[p.property]??99));let n=this.conflicts.filter(u=>u.property==="color").length,o=this.conflicts.filter(u=>u.property==="comment").length,s=this.conflicts.filter(u=>u.property==="fix").length,i=this.conflicts.filter(u=>u.property==="triage").length,l=[n?`${n} color${n===1?"":"s"}`:"",o?`${o} comment${o===1?"":"s"}`:"",s?`${s} fix${s===1?"":"es"}`:"",i?`${i} triage state${i===1?"":"s"}`:""].filter(Boolean).join(", "),d=`${r.size} finding${r.size===1?"":"s"}`;return c`<dialog @click="${this._onClick}" @close="${this._onClose}"><header><h3>${t.title}</h3><p>${d} ${t.intro} ${l}.${t.trailingNote?` ${t.trailingNote}`:""}</p><div class="bulk"><button type="button" data-bulk="local">Keep all current</button> <button type="button" data-bulk="imported">${t.importedSideLabel} (all)</button></div></header><ul class="list">${[...r.entries()].map(([u,f])=>c`<li class="card" data-id="${u}">${Jb(this.findingLookup.get(u),u)}<div class="rows">${f.map(p=>{let h=`${p.id}:${p.property}`,b=`conflict-${h}`;return c`<div class="row" data-key="${h}"><span class="row-label">${Xb[p.property]??p.property}</span> <label class="choice"><input type="radio" name="${b}" value="local" checked="checked"> <span class="choice-label">Keep current</span> <span class="choice-value">${Fp(p.property,p.local)}</span></label> <label class="choice"><input type="radio" name="${b}" value="imported"> <span class="choice-label">${t.importedSideLabel}</span> <span class="choice-value">${Fp(p.property,p.imported)}</span></label></div>`})}</div></li>`)}</ul><footer class="actions"><button type="button" data-action="cancel">Cancel</button> <button type="button" data-action="apply" class="primary">${t.applyButton}</button></footer></dialog>`}};customElements.define("triage-conflict-dialog",Cl);function Ks(e,t,r={}){return new Promise((n,o)=>{let s=document.createElement("triage-conflict-dialog");s.conflicts=e,s.findingLookup=t,s.labels={...Mp,...r},s.addEventListener("resolve",i=>{s.remove(),n(i.detail)}),s.addEventListener("modal-conflict",i=>{s.remove(),o(pt(i.detail?.cause))}),document.body.append(s)})}var El=class extends I{static styles=[...I.styles,T(Ze)];static properties={_password:{state:!0},_busy:{state:!0},_error:{state:!0},_settled:{state:!0}};constructor(){super(),this._password="",this._busy=!1,this._error="",this._settled=!1,this._tryPassword=null}_finish(t){this._settled||(this._password="",this._tryPassword=null,super._finish(t))}_onClose=()=>this._finish(null);_onCancel=()=>this._finish(null);_onPasswordInput=t=>{this._password=t.target.value,this._error=""};_onUnlock=async()=>{if(!(!this._password||this._busy)){this._busy=!0,this._error="";try{let t=await this._tryPassword(this._password);if(this._settled)return;this._finish(t)}catch(t){if(this._settled)return;this._error=t?.message??String(t)}finally{this._busy=!1}}};_onKeydown=t=>{t.key==="Enter"&&(t.preventDefault(),this._onUnlock())};render(){return c`<dialog @close="${this._onClose}"><header><h3>Unlock encrypted workspace</h3></header><p class="nwd-note">This workspace bundle is password-protected. Enter the password the sender shared with you separately to decrypt and import it.</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-bundle-unlock" maxlength="1024" .value="${this._password}" @input="${this._onPasswordInput}" @keydown="${this._onKeydown}"></label> ${this._error?c`<p class="wsl-error" role="alert">${this._error}</p>`:g}<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></dialog>`}};customElements.define("workspace-unlock-bundle-dialog",El);function Lp({tryPassword:e}={}){if(typeof e!="function")throw new TypeError("openWorkspaceUnlockBundleDialog: tryPassword required");return new Promise((t,r)=>{let n=document.createElement("workspace-unlock-bundle-dialog");n._tryPassword=e,n.addEventListener("resolve",o=>{n.remove(),t(o.detail)}),n.addEventListener("modal-conflict",o=>{n._tryPassword=null,n.remove(),r(pt(o.detail?.cause))}),document.body.append(n)})}async function Pp(e){let t=await Qa(e),r;if(Gn(t)){if(r=await Lp({tryPassword:o=>vs(t,o)}),!r)return null}else r=await vs(t);let n=await Za(r,{conflictResolver:async(o,s)=>{try{return await Ks(o,s,{title:"Triage conflicts on import",intro:"disagree with your local triage on",trailingNote:"Reports and non-conflicting triage were already merged; pick which side to keep for these disagreements.",importedSideLabel:"Apply imported"})}catch{let i=o.length;return alert(`Imported ${e.name}. Kept your local triage on ${i} conflicting entr${i===1?"y":"ies"} because another dialog is open \u2014 re-drop the file to pick again.`),null}}});return(a.currentFile||a.currentWorkspace)&&k(),n}var Dp="deepview.passkey.firstImportPrompted";function Qb(){try{return localStorage.getItem(Dp)==="1"}catch{return!1}}function Op(){try{localStorage.setItem(Dp,"1")}catch{}}async function Tl(){if(X()||!gt()||Qb())return;if(!confirm(`Encrypt your DeepView data with a passkey?
38
+ ${s}`:o||s,l={id:e[t.finding_url],file:r,line:n,severity:(e[t.severity]||"medium").toLowerCase(),description:i,repo:{github:e[t.repository]}};return t.commit_hash!==-1&&e[t.commit_hash]&&(l.commitHash=e[t.commit_hash]),t.detected_at!==-1&&e[t.detected_at]&&(l.detectedAt=e[t.detected_at]),t.committed_at!==-1&&e[t.committed_at]&&(l.committedAt=e[t.committed_at]),l}var on=`.conflict-sev{display:inline-block;padding:1px .4rem;border-radius:3px;font-size:.62rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:#fff;flex-shrink:0;&.sev-critical{background:var(--critical)}&.sev-high{background:var(--high)}&.sev-medium{background:var(--medium)}&.sev-low{background:var(--low)}&.sev-high_bug{background:var(--high-bug)}&.sev-bug{background:var(--bug)}&.sev-informational{background:var(--info)}}
39
+ `;var ef=`dialog{max-width:720px;width:min(94vw,720px)}header h3{margin:0 0 .25rem}header p{margin:0 0 .75rem;color:var(--muted);font-size:.82rem}.bulk{display:flex;gap:.4rem;margin-bottom:.7rem;padding-bottom:.7rem;border-bottom:1px solid var(--border)}.bulk button,.actions button{background:transparent;border:1px solid var(--border);color:var(--text);border-radius:5px;padding:.3rem .8rem;font:inherit;font-size:.78rem;&:hover{border-color:var(--accent);color:var(--accent)}&.primary{background:var(--accent);color:var(--surface);border-color:var(--accent)}&.primary:hover{filter:brightness(1.08)}}.list{list-style:none;margin:0;padding:0;max-height:60vh;overflow-y:auto;overscroll-behavior:none;-webkit-app-region:no-drag;app-region:no-drag;display:flex;flex-direction:column;gap:.5rem}.card{border:1px solid var(--border);border-radius:6px;padding:.55rem .7rem .6rem;background:rgb(from var(--text) r g b / .02)}.card-head{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}.id{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.68rem;color:var(--muted);padding:1px .3rem;background:rgb(from var(--text) r g b / .05);border-radius:3px}.desc{font-size:.78rem;color:var(--muted);margin-bottom:.55rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows{display:flex;flex-direction:column;gap:.35rem}.row{display:grid;grid-template-columns:5rem 1fr 1fr;align-items:stretch;gap:.4rem}.row-label{color:var(--muted);font-size:.72rem;text-transform:uppercase;letter-spacing:.08em;align-self:center}.choice{display:flex;flex-direction:column;gap:.15rem;padding:.35rem .5rem;border:1px solid var(--border);border-radius:5px;min-width:0;&:has(input:checked){border-color:var(--accent);background:rgb(from var(--accent) r g b / .07)}}.choice input[type=radio]{position:absolute;opacity:0;pointer-events:none}.choice-label{font-size:.68rem;color:var(--muted);text-transform:uppercase;letter-spacing:.08em}.choice:has(input:checked) .choice-label{color:var(--accent)}.choice-value{font-size:.82rem;min-width:0}.color{display:inline-flex;align-items:center;gap:.35rem}.color-dot{width:12px;height:12px;border-radius:50%;box-shadow:0 0 0 1px rgb(from var(--text) r g b / .2);flex-shrink:0;&.marker-red{background:var(--marker-red)}&.marker-blue{background:var(--marker-blue)}&.marker-green{background:var(--marker-green)}&.marker-gray{background:var(--marker-gray)}}.color-name{text-transform:capitalize}.comment-text{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;color:var(--text);white-space:pre-wrap;overflow-wrap:anywhere;& em{color:var(--muted);font-style:italic}}.fix-text{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-all;& a{color:var(--accent);text-decoration:none}& a:hover{text-decoration:underline}}.actions{display:flex;justify-content:flex-end;gap:.4rem;margin-top:.8rem;padding-top:.7rem;border-top:1px solid var(--border)}
40
+ `;function sn(e){if(!e)return g;let t=e.replaceAll("_"," ");return c`<span class="${`conflict-sev sev-${e}`}">${t}</span>`}function Cy(e){return`bundle-${e.slice(7,19)}\u2026`}function Ge(e){return e.kind==="bundle"?e.label??Cy(e.identifier):e.identifier}function Ey(e){return e?c`<span class="color"><span class="${`color-dot marker-${e}`}"></span> <span class="color-name">${e}</span></span>`:c`<em>none</em>`}function Ay(e){return c`<span class="comment-text">${e||c`<em>empty</em>`}</span>`}function Ty(e){return e?Jr(e)?c`<span class="fix-text"><a href="${e}" target="_blank" rel="noopener noreferrer">${e}</a></span>`:c`<span class="fix-text">${e}</span>`:c`<span class="comment-text"><em>empty</em></span>`}function Iy(e){return e?c`<span class="${`triage triage-${e}`}">${e}</span>`:c`<em>none</em>`}function tf(e,t){return e==="color"?Ey(t):e==="comment"?Ay(t):e==="fix"?Ty(t):e==="triage"?Iy(t):c`${String(t)}`}function Ry(e,t){let r=e?.file?e.line?`${e.file}:${e.line}`:e.file:"";return c`<div class="card-head">${sn(e?.severity)} ${r?c`<span class="loc" title="${r}">${r}</span>`:g} <code class="id" title="${t}">${t.slice(0,8)}…</code></div>${e?.description?c`<div class="desc" title="${e.description}">${e.description}</div>`:g}`}var nf={title:"Triage conflicts",intro:"disagree with your local triage on",trailingNote:"",applyButton:"Apply",importedSideLabel:"Apply imported"},rf={color:0,comment:1,fix:2,triage:3},By={color:"Color",comment:"Comment",fix:"Fix",triage:"Triage state"},Ml=class extends I{static styles=[...I.styles,T(on),T(ef)];static properties={conflicts:{attribute:!1},findingLookup:{attribute:!1},labels:{attribute:!1},_settled:{state:!0}};constructor(){super(),this.conflicts=[],this.findingLookup=new Map,this.labels={...nf},this._settled=!1}focusInitial(){}_onClick=t=>{let r=t.target.closest("[data-bulk]");if(r){let n=r.dataset.bulk;for(let o of this.renderRoot.querySelectorAll(`input[type="radio"][value="${n}"]`))o.checked=!0;return}if(t.target.closest('[data-action="apply"]')){let n={};for(let o of this.conflicts){let s=`${o.id}:${o.property}`,i=this.renderRoot.querySelector(`input[name="conflict-${CSS.escape(s)}"]:checked`);n[s]=i?.value??"local"}this._finish(n);return}t.target.closest('[data-action="cancel"]')&&this._finish(null)};render(){let t=this.labels,r=new Map;for(let u of this.conflicts)r.has(u.id)||r.set(u.id,[]),r.get(u.id).push(u);for(let u of r.values())u.sort((p,f)=>(rf[p.property]??99)-(rf[f.property]??99));let n=this.conflicts.filter(u=>u.property==="color").length,o=this.conflicts.filter(u=>u.property==="comment").length,s=this.conflicts.filter(u=>u.property==="fix").length,i=this.conflicts.filter(u=>u.property==="triage").length,l=[n?`${n} color${n===1?"":"s"}`:"",o?`${o} comment${o===1?"":"s"}`:"",s?`${s} fix${s===1?"":"es"}`:"",i?`${i} triage state${i===1?"":"s"}`:""].filter(Boolean).join(", "),d=`${r.size} finding${r.size===1?"":"s"}`;return c`<dialog @click="${this._onClick}" @close="${this._onClose}"><header><h3>${t.title}</h3><p>${d} ${t.intro} ${l}.${t.trailingNote?` ${t.trailingNote}`:""}</p><div class="bulk"><button type="button" data-bulk="local">Keep all current</button> <button type="button" data-bulk="imported">${t.importedSideLabel} (all)</button></div></header><ul class="list">${[...r.entries()].map(([u,p])=>c`<li class="card" data-id="${u}">${Ry(this.findingLookup.get(u),u)}<div class="rows">${p.map(f=>{let h=`${f.id}:${f.property}`,b=`conflict-${h}`;return c`<div class="row" data-key="${h}"><span class="row-label">${By[f.property]??f.property}</span> <label class="choice"><input type="radio" name="${b}" value="local" checked="checked"> <span class="choice-label">Keep current</span> <span class="choice-value">${tf(f.property,f.local)}</span></label> <label class="choice"><input type="radio" name="${b}" value="imported"> <span class="choice-label">${t.importedSideLabel}</span> <span class="choice-value">${tf(f.property,f.imported)}</span></label></div>`})}</div></li>`)}</ul><footer class="actions"><button type="button" data-action="cancel">Cancel</button> <button type="button" data-action="apply" class="primary">${t.applyButton}</button></footer></dialog>`}};customElements.define("triage-conflict-dialog",Ml);function Gs(e,t,r={}){return new Promise((n,o)=>{let s=document.createElement("triage-conflict-dialog");s.conflicts=e,s.findingLookup=t,s.labels={...nf,...r},s.addEventListener("resolve",i=>{s.remove(),n(i.detail)}),s.addEventListener("modal-conflict",i=>{s.remove(),o(ft(i.detail?.cause))}),document.body.append(s)})}var Ll=class extends I{static styles=[...I.styles,T(Qe)];static properties={_password:{state:!0},_busy:{state:!0},_error:{state:!0},_settled:{state:!0}};constructor(){super(),this._password="",this._busy=!1,this._error="",this._settled=!1,this._tryPassword=null}_finish(t){this._settled||(this._password="",this._tryPassword=null,super._finish(t))}_onClose=()=>this._finish(null);_onCancel=()=>this._finish(null);_onPasswordInput=t=>{this._password=t.target.value,this._error=""};_onUnlock=async()=>{if(!(!this._password||this._busy)){this._busy=!0,this._error="";try{let t=await this._tryPassword(this._password);if(this._settled)return;this._finish(t)}catch(t){if(this._settled)return;this._error=t?.message??String(t)}finally{this._busy=!1}}};_onKeydown=t=>{t.key==="Enter"&&(t.preventDefault(),this._onUnlock())};render(){return c`<dialog @close="${this._onClose}"><header><h3>Unlock encrypted workspace</h3></header><p class="nwd-note">This workspace bundle is password-protected. Enter the password the sender shared with you separately to decrypt and import it.</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-bundle-unlock" maxlength="1024" .value="${this._password}" @input="${this._onPasswordInput}" @keydown="${this._onKeydown}"></label> ${this._error?c`<p class="wsl-error" role="alert">${this._error}</p>`:g}<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></dialog>`}};customElements.define("workspace-unlock-bundle-dialog",Ll);function of({tryPassword:e}={}){if(typeof e!="function")throw new TypeError("openWorkspaceUnlockBundleDialog: tryPassword required");return new Promise((t,r)=>{let n=document.createElement("workspace-unlock-bundle-dialog");n._tryPassword=e,n.addEventListener("resolve",o=>{n.remove(),t(o.detail)}),n.addEventListener("modal-conflict",o=>{n._tryPassword=null,n.remove(),r(ft(o.detail?.cause))}),document.body.append(n)})}async function sf(e){let t=await nl(e),r;if(Yn(t)){if(r=await of({tryPassword:o=>xs(t,o)}),!r)return null}else r=await xs(t);let n=await ol(r,{conflictResolver:async(o,s)=>{try{return await Gs(o,s,{title:"Triage conflicts on import",intro:"disagree with your local triage on",trailingNote:"Reports and non-conflicting triage were already merged; pick which side to keep for these disagreements.",importedSideLabel:"Apply imported"})}catch{let i=o.length;return alert(`Imported ${e.name}. Kept your local triage on ${i} conflicting entr${i===1?"y":"ies"} because another dialog is open \u2014 re-drop the file to pick again.`),null}}});return(a.currentFile||a.currentWorkspace)&&k(),n}var lf="deepview.passkey.firstImportPrompted";function Fy(){try{return localStorage.getItem(lf)==="1"}catch{return!1}}function af(){try{localStorage.setItem(lf,"1")}catch{}}async function Pl(){if(X()||!mt()||Fy())return;if(!confirm(`Encrypt your DeepView data with a passkey?
41
41
 
42
42
  Your triage notes, workspaces, and report files are stored on this device. Encryption locks them under a passkey (TouchID, Windows Hello, security key) so scripts running here can't read them without the passkey.
43
43
 
44
- You can change this anytime from the lock icon in the sidebar header.`)){Op();return}await Cs(),X()&&Op()}var Np=Tl;var Up=["type","model","think","effort","exportsMode"],Jt="deepview.lastFile",lo=new Set(["overview","graph","treemap","advisories","issues","code","terminal"]);function on(e,t="overview"){let r=t&&t!=="overview"&&lo.has(t)?` ${t}`:"";we(Jt,`b:${e}${r}`).catch(()=>{})}var yr=0,$e=e=>e!==yr;function Al(e){let t=Wp(e.toLowerCase());return t.endsWith(".map")?"sourcemap":t==="stasis.code.br"||t.endsWith(".stasis.code.br")?"stasis":null}function Wp(e){return e.replace(/ \(\d+\)(?=\.[^.]*$)/u,"")}async function zp({name:e,content:t,existingNames:r}){if(!r.has(e))return await at(e,t),r.add(e),{name:e,content:t};let n;try{n=await Re(e)}catch(l){if(!(l instanceof DOMException&&l.name==="NotFoundError"||typeof l?.message=="string"&&l.message.startsWith("File not found:")))throw l;return await at(e,t),r.add(e),{name:e,content:t}}if(n===t)return{name:e,content:t};let s=U().filter(l=>Array.isArray(l.reports)&&l.reports.includes(e)).filter(l=>Qn(l.id,e)),i=await _p({name:e,workspaceNames:s.map(l=>l.name),existingNames:r});if(i.action==="cancel")return null;if(i.action==="rename"){let l=i.newName;return await at(l,t),r.add(l),{name:l,content:t}}return await at(e,t),s.length>0&&await Zb(e,s),{name:e,content:t}}async function Zb(e,t){let r;try{r=await An(e)}catch(n){console.warn(`Import: failed to read freshly-saved "${e}" for cloud sync:`,n);return}for(let n of t)try{await Ss(n.id);let o=await $s(n.id,e,r);o&&o.ok===!1&&console.warn(`Import: failed to upload "${e}" to workspace "${n.name}" (${n.id}): ${o.reason??"unknown"}`)}catch(o){console.warn(`Import: failed to upload "${e}" to workspace "${n.name}" (${n.id}):`,o)}}async function Il(e){await Np();let t=null,r=null,n=new Set,o=new Set(await ae());for(let s of e)try{let i=Wp(s.name.toLowerCase());if(i.endsWith(".gz")||i.endsWith(".deepview-workspace.enc")){await Pp(s);try{let u=await ae();o.clear();for(let f of u)o.add(f)}catch(u){console.warn("Import: failed to refresh existingNames after workspace import:",u)}continue}if(Al(s.name)){let u=new Uint8Array(await s.arrayBuffer()),{integrity:f}=await dr(s.name,u);r=f,n.add(f);continue}let d=await s.text();if(i.endsWith(".csv")){let u=Ip(d);for(let{displayName:f,data:p}of u){let h=f.replaceAll("/","__")+".codex",b=JSON.stringify(p),{count:m,source:y}=Oe(b),v=await zp({name:h,content:b,existingNames:o});v&&(Ve(v.name,m,y),t={name:v.name,content:v.content})}}else{let u=Oe(d);if(!u.recognized)throw new Error("not a recognized DeepView, DeepSec, Claude Security, or Codex report");let f=await zp({name:s.name,content:d,existingNames:o});if(!f)continue;Ve(f.name,u.count,u.source),t={name:f.name,content:f.content}}}catch(i){alert(`Failed to load ${s.name}: ${i.message}`)}await W();for(let s of n)_l(s).catch(()=>{});t?await $t(t.name,t.content):r&&(a.currentView="bundles",a.selectedBundle=r,a.bundleDetails=null,a.bundleDetailsTab="overview",a.bundleSourceFile=null,a.bundleSourceFindingIdx=null,a.bundleCodeSearchQuery="",a.bundleCodeSearchMode="files",a.shownTriage=null,E.showAll=!0,on(r),k(),await W(),Yt(r))}async function $t(e,t){let r=++yr,n=new Set(U().filter(o=>Array.isArray(o.reports)&&o.reports.includes(e)).map(o=>o.id));for(let o of O.openSessions)o&&!n.has(o.workspaceId)&&(O.closeSession(o.workspaceId),Zn(o.workspaceId));if(a.reports=[],a.currentFile=e,a.currentWorkspace=null,(a.currentView==="bundles"||a.currentView==="packages"||a.currentView==="repositories")&&(a.currentView="findings"),a.repoUrl=We(e),a.repoEditing=!1,E.selected=null,E.focusedPkg=null,E.layoutCache=null,E.solo=null,E.hidden.clear(),E.pathFilter="",Ue(),we(Jt,e).catch(()=>{}),t===void 0){try{t=await Re(e)}catch(o){if($e(r))return;if(o&&o.message?.includes("vault locked")){if(await Es()&&!$e(r)){await $t(e);return}$e(r)||(a.currentFile=null,await W());return}alert(`Failed to read ${e}: ${o.message}`),a.currentFile=null,await W();return}if($e(r))return}if(await Fl(e,t,r),!$e(r)){for(let o of n)O.openSession(o),O.refreshSession(o),Ss(o);await W()}}async function Xt(e){let t=U().find(o=>o.id===e);if(!t)return;let r=++yr;for(let o of O.openSessions)o&&o.workspaceId!==e&&(O.closeSession(o.workspaceId),Zn(o.workspaceId));(a.currentView==="bundles"||a.currentView==="packages"||a.currentView==="repositories")&&(a.currentView="findings"),a.reports=[],a.currentFile=null,a.currentWorkspace=e,a.repoUrl="",a.repoEditing=!1,E.selected=null,E.focusedPkg=null,E.layoutCache=null,E.solo=null,E.hidden.clear(),E.pathFilter="",Ue(),we(Jt,`ws:${e}`).catch(()=>{}),t.reports.length===0&&(A.classList.remove("active"),H(g,A),Ee.classList.remove("hidden"),document.body.classList.remove("show-print-btn"));let n=t.reports.map(o=>Re(o).catch(()=>null));for(let o=0;o<t.reports.length;o++){let s=await n[o];if($e(r))return;if(s!==null&&(await Fl(t.reports[o],s,r),$e(r)))return}O.openSession(e),O.refreshSession(e),Ss(e),await W()}async function Hp({triage:e="keep",deleteFromRemoteWorkspaceIds:t=[]}={}){if(!a.currentFile)return;let r=++yr,n=a.currentFile;Kr(n),He(n,"");for(let o of t)try{let s=await xs(o,n);if($e(r))return;s&&s.ok===!1&&s.reason!=="not-found"&&console.warn(`Failed to delete '${n}' from workspace ${o} remote: ${s.reason}`)}catch(s){console.warn(`Failed to delete '${n}' from workspace ${o} remote:`,s)}if(await Or(n),!$e(r)&&(await Wt(n,null),!$e(r))){if(e==="wipe"){try{await ms()}catch(o){console.warn("Skipped orphan-triage GC:",o)}if($e(r))return}$e(r)||(Bl(),await W())}}function Bl(){a.currentFile=null,a.currentWorkspace=null,a.selectedBundle=null,a.bundleDetails=null,a.bundleSourceFile=null,a.bundleSourceFindingIdx=null,a.reports=[],a.repoUrl="",a.repoEditing=!1,a.shownTriage=null,a.currentView="findings",E.selected=null,E.focusedPkg=null,E.layoutCache=null,E.solo=null,E.hidden.clear(),E.pathFilter="",Ue(),Fr(Jt),A.classList.remove("active"),H(g,A),Ee.classList.remove("hidden"),document.title="DeepView",document.body.classList.remove("show-print-btn")}async function Vp(){++yr;for(let e of O.openSessions)e&&(O.closeSession(e.workspaceId),Zn(e.workspaceId));Bl(),await W()}async function jp({deleteFromRemoteWorkspaceIds:e=[]}={}){if(!a.selectedBundle)return;let t=++yr,r=a.selectedBundle;for(let o of e)try{let s=await _s(o,r);if($e(t))return;s&&s.ok===!1&&s.reason!=="not-found"&&console.warn(`Failed to delete bundle from workspace ${o} remote: ${s.reason}`)}catch(s){console.warn(`Failed to delete bundle from workspace ${o} remote:`,s)}if(await oa(r),$e(t)||(await Da(r,null),$e(t)))return;a.selectedBundle=null,a.bundleDetails=null,a.bundleSourceFile=null,a.bundleSourceFindingIdx=null;let n=fe(Jt);typeof n=="string"&&(n===`b:${r}`||n.startsWith(`b:${r} `))&&Fr(Jt),ga(r),a.bundles=await lt(),!$e(t)&&(k(),await W())}async function Kp(e,t="detach",{triage:r="keep"}={}){let n=U().find(l=>l.id===e);if(!n)return;++yr;let o=Array.isArray(n.reports)?[...n.reports]:[];if(O.closeSession(e),Zn(e),t==="delete"){for(let l of o){try{await Or(l)}catch{}Kr(l),He(l,"")}if(r==="wipe")try{await ms()}catch(l){console.warn("Skipped orphan-triage GC:",l)}}let s=a.currentWorkspace===e,i=t==="delete"&&a.currentFile!=null&&o.includes(a.currentFile);(s||i)&&Bl(),await Fa(e),await W()}async function Fl(e,t,r=null){let n=()=>r!==null&&$e(r);try{if(await Kn,n())return;let o;try{o=JSON.parse(t)}catch(h){if(o=Dr(t)??Nr(t),!o)throw new Error(`Not JSON, and not a recognized markdown format. (JSON error: ${h.message})`,{cause:h})}let s=a.reports.length===0,i=new Set;for(let h of a.reports)for(let b of h.groups)for(let m of b)m.id&&i.add(m.id);let l=o.findings||[],d=l.flatMap(pl).filter(h=>!h.id);if(d.length>0){let h=await Promise.all(d.map(ss));if(n())return;d.forEach((b,m)=>{h[m]&&(b.id=h[m])})}let u=We(e),f=[],p=0;for(let h of l){let b=pl(h);if(b.length===0)continue;if(b.some(v=>v.id&&i.has(v.id))){p++;continue}let y=[];for(let v of b){v.id&&i.add(v.id);let w={...v,_id:a.nextFindingId++,_repoFallback:u,_reportName:e,_bundleHashes:o.bundleHashes??[]};if(!o.source&&!Up.some(S=>w[S]!==void 0))for(let S of Up)o[S]!==void 0&&(w[S]=o[S]);w._analyzer=o.source??w.type??null,y.push(w)}f.push(y)}if(p>0&&console.log(`${e}: skipped ${p} duplicate finding${p===1?"":"s"}`),a.reports.push({type:o.type||"analysis",source:o.source??null,fileName:e,groups:f,tree:o.tree??null,bundleHashes:o.bundleHashes??[]}),Array.isArray(o.bundleHashes)&&o.bundleHashes.length>0){let h=new Set((a.bundles??[]).map(b=>b.integrity));for(let b of o.bundleHashes)h.has(b)&&_l(b).catch(()=>{})}if(s)if(Rs(),f.some(b=>b.some(m=>m.confidence!==void 0))){let b=y=>f.reduce((v,w)=>v+(w.some(x=>x.confidence!==void 0&&x.confidence>=y)?1:0),0),m;for(b(6)<=25?m=6:b(7)<=25?m=7:m=8;m>0&&b(m-1)===b(m);)m--;a.filterConfMin=m}else a.filterConfMin=0;k()}catch(o){alert(`Failed to parse ${e}: ${o.message}`)}}window.__loadFile=(e,t)=>Fl(e,t);window.__setFilters=({severities:e,confMin:t}={})=>{e!=null&&(a.filterSeverities=new Set(e)),t!==void 0&&(a.filterConfMin=t),k()};document.addEventListener("keydown",e=>{e.key==="Escape"&&document.body.classList.contains("report-fullscreen")&&document.body.classList.remove("report-fullscreen")});document.addEventListener("dragover",e=>e.preventDefault());document.addEventListener("drop",e=>{e.preventDefault(),!e.target.closest("#drop-zone")&&Il(e.dataTransfer.files)});Ee.addEventListener("dragover",e=>{e.preventDefault(),Ee.classList.add("hover")});Ee.addEventListener("dragleave",()=>Ee.classList.remove("hover"));Ee.addEventListener("drop",e=>{e.preventDefault(),Ee.classList.remove("hover"),Il(e.dataTransfer.files)});var kt=null;function ey(){kt||(kt=document.createElement("input"),kt.type="file",kt.multiple=!0,kt.hidden=!0,kt.addEventListener("change",()=>{let e=kt.files;e&&e.length>0&&Il(e),kt.value=""}),document.body.append(kt)),kt.click()}Ee.addEventListener("click",e=>{e.target.closest(".drop-prompt-action")&&ey()});var wr=new Map,qp="deepview.advisories.proxyConsent";function Gp(){try{return localStorage.getItem(qp)==="1"}catch{return!1}}function Yp(){try{localStorage.setItem(qp,"1")}catch{}}function ty(e){let t=new Map;if(!e||e.kind!=="stasis"||!e.bundle)return t;for(let[r,n]of e.bundle.modules){if(!r.includes("node_modules")||!n?.name||typeof n.version!="string"||!n.version)continue;let o=t.get(n.name);o||(o=new Set,t.set(n.name,o)),o.add(n.version)}return t}function ry(e){if(!e||e.kind!=="stasis"||!e.bundle)return!1;for(let[t,r]of e.bundle.modules)if(t.includes("node_modules")&&r?.name&&typeof r.version=="string"&&r.version)return!0;return!1}function Jp(e,t){return!e||Al(e.name)!=="stasis"?!1:!t||t.integrity!==e.integrity?!0:ry(t)}function ny(e){let t=Object.create(null);for(let[r,n]of e)t[r]=[...n].toSorted();return t}async function Xp(e,t){if(!e?.integrity||wr.has(e.integrity)||!Gp())return;let r=ty(e);if(r.size===0){wr.set(e.integrity,{state:"ok",byPackage:new Map,query:r});return}wr.set(e.integrity,{state:"loading",query:r});let n=e.integrity;try{let o=await fetch("/api/npm-advisories",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(ny(r))});if(!o.ok){let l=`HTTP ${o.status}`;try{let d=await o.json();d&&typeof d.error=="string"&&d.error&&(l=`${d.error} (HTTP ${o.status})`)}catch{}wr.set(n,{state:"error",reason:l,query:r}),t();return}let s=await o.json(),i=new Map;if(s&&typeof s=="object")for(let[l,d]of Object.entries(s)){if(!Array.isArray(d))continue;let u=d.filter(f=>f&&typeof f=="object"&&typeof f.title=="string"&&typeof f.severity=="string");u.length>0&&i.set(l,u)}wr.set(n,{state:"ok",byPackage:i,query:r})}catch(o){wr.set(n,{state:"error",reason:o?.message??"fetch-failed",query:r})}t()}var oy={critical:0,high:1,moderate:2,low:3,info:4};function qs(e){return oy[e]??999}function sy(e){return e.charAt(0).toUpperCase()+e.slice(1)}function iy(){let e=typeof window>"u"?"":window.location.host;return c`<div class="bundle-advisories-consent"><div class="bundle-advisories-consent-card"><p class="bundle-advisories-consent-text">This bundle's dependency names and versions will be sent to the npm registry through a same-origin proxy (<span class="mono">${e}</span> → <span class="mono">registry.npmjs.org</span>) to look up published security advisories.</p><button type="button" class="bundle-advisories-consent-btn" data-advisories-consent>Confirm</button><p class="bundle-advisories-consent-note">This preference will be saved and reused for other bundles.</p></div></div>`}function Qp(e){if(!e)return c`<div class="bundle-advisories-empty">Bundle not loaded yet.</div>`;if(e.kind!=="stasis"||!e.bundle)return c`<div class="bundle-advisories-empty">Advisories are only available for stasis bundles.</div>`;if(!Gp())return iy();let t=wr.get(e.integrity);if(!t||t.state==="loading")return c`<div class="bundle-advisories-empty">Loading advisories from npm registry…</div>`;if(t.state==="error")return c`<div class="bundle-advisories-empty is-error">Failed to fetch advisories: ${t.reason}</div>`;let r=t.query.size,n=t.byPackage.size;if(n===0)return c`<div class="bundle-advisories"><div class="bundle-advisories-summary">No advisories for the ${r} ${r===1?"package":"packages"} in this bundle.</div></div>`;let o=[...t.byPackage.entries()].toSorted(([i,l],[d,u])=>{let f=Math.min(...l.map(h=>qs(h.severity))),p=Math.min(...u.map(h=>qs(h.severity)));return f!==p?f-p:i.localeCompare(d)}),s=[...t.byPackage.values()].reduce((i,l)=>i+l.length,0);return c`<div class="bundle-advisories"><div class="bundle-advisories-summary">${s} ${s===1?"advisory":"advisories"} across ${n} of ${r} ${r===1?"package":"packages"}</div><ul class="bundle-advisories-list">${o.map(([i,l])=>ay(i,l,t.query.get(i)))}</ul></div>`}function ay(e,t,r){let n=[...t].toSorted((s,i)=>{let l=qs(s.severity)-qs(i.severity);return l!==0?l:(s.title??"").localeCompare(i.title??"")}),o=r?[...r].toSorted():[];return c`<li class="bundle-advisories-section"><div class="bundle-advisories-section-header"><span class="bundle-advisories-section-name">${e}</span> ${o.length>0?c`<span class="bundle-advisories-section-versions">${o.map(s=>c`<span class="bundle-advisories-version-chip">${s}</span>`)}</span>`:g} <span class="bundle-advisories-section-count">${n.length} ${n.length===1?"advisory":"advisories"}</span></div><ul class="bundle-advisories-rows">${n.map(s=>uy(s))}</ul></li>`}function ly(e){if(typeof e!="string")return null;let t=/\/(GHSA-[a-z0-9-]+)(?:[/?#]|$)/iu.exec(e);return t?t[1]:null}var cy=c`<svg class="bundle-advisory-ghsa-icon" viewBox="0 0 16 16" width="11" height="11" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 13L13 3"/><path d="M5 3h8v8"/></svg>`;function dy(e){let t=/^CWE-(\d+)$/u.exec(e);if(!t)return c`<span>${e}</span>`;let r=`https://cwe.mitre.org/data/definitions/${t[1]}.html`;return c`<a class="bundle-advisory-cwe" href="${r}" target="_blank" rel="noopener noreferrer">${e}</a>`}function uy(e){let t=e.severity,r=e.title,n=typeof e?.cvss?.score=="number"?e.cvss.score.toFixed(1):"",o=typeof e?.cvss?.vectorString=="string"&&e.cvss.vectorString?e.cvss.vectorString:"",s=typeof e.vulnerable_versions=="string"?e.vulnerable_versions:null,i=typeof e.url=="string"&&/^https?:\/\//iu.test(e.url)?e.url:null,l=ly(i),d=Array.isArray(e.cwe)?e.cwe.filter(f=>typeof f=="string"):[],u=l&&i?c`<a class="bundle-advisory-ghsa" href="${i}" target="_blank" rel="noopener noreferrer">${l}${cy}</a>`:l?c`<span class="bundle-advisory-ghsa">${l}</span>`:g;return c`<li class="bundle-advisory-row"><div class="bundle-advisory-rail"><span class="${`bundle-advisory-severity sev-${t}`}">${sy(t)}</span> ${n?c`<span class="bundle-advisory-cvss-score">CVSS <span class="mono">${n}</span></span>`:g}</div><div class="bundle-advisory-body"><div class="bundle-advisory-header"><span class="bundle-advisory-title">${r}</span> ${u}</div><div class="bundle-advisory-subrow"><div class="bundle-advisory-meta">${s?c`<span>Affected <span class="mono">${s}</span></span>`:g} ${d.length>0?c`<span class="bundle-advisory-cwes">${d.map((f,p)=>c`${p===0?"":", "}${dy(f)}`)}</span>`:g}</div>${o?c`<div class="bundle-advisory-cvss-vector mono">${o}</div>`:g}</div></div></li>`}var co=null,py={files:c`<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 4.5a1 1 0 0 1 1-1h3.2l1.3 1.5H13a1 1 0 0 1 1 1V12a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4.5Z"/></svg>`,code:c`<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5.5 4.5L2 8l3.5 3.5"/><path d="M10.5 4.5L14 8l-3.5 3.5"/></svg>`,issues:c`<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.3" aria-hidden="true"><circle cx="8" cy="8" r="6"/><path d="M8 4.8v3.6" stroke-linecap="round"/><circle cx="8" cy="11" r=".7" fill="currentColor" stroke="none"/></svg>`};function fy(e){let t=new Map;if(!e||e.kind!=="stasis"||!e.bundle)return t;for(let r of e.bundle.imports.values())for(let[n,o]of r){t.has(n)||t.set(n,new Set);for(let s of o.values())typeof s=="string"&&t.get(n).add(s)}return t}function hy(e){let t=dt(e),r=fy(e),n=[...t.keys()],{stripped:o}=At(n),s=new Map(n.map((l,d)=>[l,o[d]])),i={};for(let[l,d]of t){let u=s.get(l),f=r.get(l);i[u]={imports:f?[...f].map(p=>s.get(p)).filter(Boolean):[],size:new TextEncoder().encode(d).byteLength}}return{tree:i,origToStripped:s}}async function Sl(e){let t=dt(e),r=new Map;for(let[n,o]of t)r.set(n,await Wd(o));return r}function tf(e){let t={fixed:0,invalid:0,deleted:0};if(!e?.fileHashes)return t;let r=new Set;for(let n of e.fileHashes.values())if(!r.has(n)){r.add(n);for(let o of as(n)){let s=a.triage.get(M(o))?.triage;s&&t[s]!==void 0&&t[s]++}}return t}function vr(e,t="graph"){if(!e||e.size===0)return new Map;let r=new Map;for(let[n,o]of e){let s=as(o);if(s.length===0)continue;let i=s.filter(d=>{let u=a.triage.get(M(d))?.triage??null;return t==="issues"?u!=="invalid"&&u!=="deleted":u===a.shownTriage});if(i.length===0)continue;r.has(n)||r.set(n,[]);let l=r.get(n);for(let d of i)l.push(d)}return r}function gy(e,t){let r=new Set;for(let[o,s]of t)if(s){for(let i of Object.values(s))if(i>0){r.add(o);break}}let n=[...r];for(;n.length>0;){let o=n.shift(),s=e[o]?.imports??[];for(let i of s)!r.has(i)&&e[i]&&(r.add(i),n.push(i))}return r}function rf(e){let{tree:t,origToStripped:r}=hy(e),n=Object.keys(t);if(n.length===0)return null;let o=null;if(e.fileHashes&&e.fileHashes.size>0){o=new Map;for(let[m,y]of e.fileHashes){let v=r.get(m);v!==void 0&&o.set(v,y)}}let s=vr(o),i=new Map,l=new Map,d=new Map,u=new Map;for(let[m,y]of s){let v={critical:0,high:0,medium:0,low:0,high_bug:0,bug:0,informational:0},w=new Set,x=new Set,S=[];for(let C of y){v[C.severity]=(v[C.severity]||0)+1,w.add(C.severity);let L=a.triage.get(M(C))?.color??"none";x.add(L),S.push({severity:C.severity,color:L})}i.set(m,v),l.set(m,w),d.set(m,x),u.set(m,S)}let f=Ms(t,i),p=E.showAll?n:[...gy(t,i)],h=new Map;for(let[m,y]of r)h.set(y,m);let b=!1;for(let m of Object.values(t))if(m?.imports&&m.imports.length>0){b=!0;break}return{treeData:t,files:p,ownCounts:i,transitiveCounts:f,severitySets:l,colorSets:d,fileFindings:u,options:{pkgOf:uo},strippedToOrig:h,hasEdges:b}}function Js(){if(!co)return;let e=Qr();e&&e.refreshSidebar(co,{isBundleContext:!0})}function Xs(){if(!co)return;let e=Qr();e&&e.refreshTopPkgs(co)}function nf(e){co=e}function uo(e){let t=/(?:^|\/)(?:node_modules|dependencies)\/(@[^/]+\/[^/]+|[^/]+)/gu,r;for(;(r=t.exec(e))!==null;)if(r[1]!==".pnpm")return r[1];let n=e.indexOf("/");return n>0?e.slice(0,n):"__own__"}function my(e){let t=new Map,r=0;for(let{path:o,size:s}of e){if(typeof s!="number"||s<=0)continue;let i=uo(o);t.set(i,(t.get(i)??0)+s),r+=s}if(r===0)return g;let n=[...t.entries()].toSorted((o,s)=>s[1]-o[1]);return c`<div class="bundles-dist"><div class="bundles-dist-bar" aria-hidden="true">${J(n,([o])=>o,([o,s])=>c`<span class="bundles-dist-seg" style="${ye({flexGrow:s,background:It(o)})}" data-tooltip="${o==="__own__"?g:`${o}: ${De(s)}`}"></span>`)}</div><ul class="bundles-dist-list">${J(n,([o])=>o,([o,s])=>{let i=(s/r*100).toFixed(1),l=o==="__own__"?"own source":o,d=It(o);return c`<li><span class="bundles-dist-dot" style="${ye({background:d})}"></span> <span class="bundles-dist-pkg" data-tooltip="${o==="__own__"?g:o}">${l}</span> <span class="bundles-dist-bar-row" aria-hidden="true"><span class="bundles-dist-bar-fill" style="${ye({width:`${i}%`,background:d})}"></span> </span><span class="bundles-dist-size">${De(s)}</span> <span class="bundles-dist-percent">${i}%</span></li>`})}</ul></div>`}function Zp(e,t,r,n){let{prefix:o,stripped:s}=At(r),i=new Set;for(let x of s)i.add(uo(x));let l=s.map((x,S)=>S).toSorted((x,S)=>s[x].localeCompare(s[S])),d=s.map((x,S)=>({path:x,size:n[S]})),u=my(d),f=u===g?c`<p class="bundles-overview-col-empty">No size information for this bundle's sources.</p>`:u,p={critical:0,high:0,medium:0,low:0,high_bug:0,bug:0,informational:0},h=0,b=new Map;if(a.bundleDetails?.fileHashes){let x=vr(a.bundleDetails.fileHashes,"issues");for(let S of x.values())for(let C of S){p[C.severity]!==void 0&&p[C.severity]++,h++;for(let L of Mn(C.fileHash,C))b.set(L,(b.get(L)??0)+1)}}let m=[...b.keys()].toSorted(),y=ge.filter(x=>p[x]>0).map(x=>c`<span class="${`tree-count-chip ${x}`}">${p[x]} ${x.replaceAll("_"," ")}</span>`),v=r.length>0?c`<ul class="bundles-sources-list">${l.map(x=>{let S=r[x],C=s[x],L=n[x];return c`<li><button type="button" class="bundles-source-row" data-bundle-view-source="${S}" data-tooltip="${S}"><span class="bundles-source-path">${C}</span> ${L==null?g:c`<span class="bundles-source-size">${De(L)}</span>`}</button></li>`})}</ul>`:c`<p class="bundles-overview-col-empty">No source files in this bundle.</p>`,w=m.length>0?c`<ul class="bundles-reports-list">${m.map(x=>{let S=G[Ke(x)]??G.default,C=b.get(x)??0;return c`<li><button type="button" class="report-chip bundles-report-chip" data-tooltip="${x}" data-bundle-issue-report="${x}">${ue(S)}<span class="report-chip-label">${qe(x)}</span> <span class="bundles-report-count">${C} ${C===1?"issue":"issues"}</span></button></li>`})}</ul>`:c`<p class="bundles-overview-col-empty">No matching reports indexed yet.</p>`;return c`<div class="bundles-overview"><div class="bundles-overview-summary">${e}<dl class="bundles-detail-meta">${t}<dt>Sources</dt><dd>${r.length}</dd>${o?c`<dt>Prefix</dt><dd class="mono">${o}</dd>`:g}</dl>${h>0?c`<div class="bundles-issue-summary tree-count-chips">${y}</div>`:g}</div><div class="bundles-overview-columns"><section class="bundles-overview-col"><header class="bundles-overview-col-head">Packages <span class="bundles-overview-col-count">${i.size}</span></header><div class="bundles-overview-col-body">${f}</div></section><section class="bundles-overview-col"><header class="bundles-overview-col-head">Files <span class="bundles-overview-col-count">${r.length}</span></header><div class="bundles-overview-col-body bundles-overview-col-body--list">${v}</div></section>${m.length>0?c`<section class="bundles-overview-col"><header class="bundles-overview-col-head">Reports <span class="bundles-overview-col-count">${m.length}</span></header><div class="bundles-overview-col-body bundles-overview-col-body--list">${w}</div></section>`:g}</div></div>`}var Rl=new Map,Ml=new Set;function Ys(e){for(let t of ge)for(let r of e)if(r.severity===t)return t;return e[0]?.severity??null}function of(e,t,r,n){let o=e.split(`
45
- `).length,s=String(o).length,i=Os(t),l=`${r??""}\0${t}`;i&&!Rl.has(l)&&!Ml.has(l)&&(Ml.add(l),(async()=>{let u=await Ds(e,i);Rl.set(l,u??null),Ml.delete(l),a.bundleSourceFile===t&&k()})());let d=Rl.get(l);return c`<div class="bundle-source-lines" style="${ye({"--lineno-width":`${s}ch`})}"><aside class="bundle-source-lineno-col" aria-hidden="true">${Array.from({length:o},(u,f)=>{let p=f+1,h=n.get(p),b=h?Ys(h.map(y=>y.f)):null,m=h&&a.bundleSourceFindingIdx!=null&&h.some(y=>y.idx===a.bundleSourceFindingIdx);return c`<div class="bundle-source-lineno-row" data-line="${p}">${h?c`<button type="button" class="${B({"bundle-source-dot":!0,[`sev-${b}`]:!0,active:m})}" data-bundle-source-finding="${h[0].idx}" title="${`${h.length} ${h.length===1?"issue":"issues"} on line ${p}`}" aria-label="${`${h.length} issues on line ${p}`}"></button>`:c`<span class="bundle-source-dot-placeholder"></span>`} <span class="bundle-source-lineno-num">${p}</span></div>`})}</aside><pre class="bundle-source-code"><code class="${i?`language-${i}`:""}">${typeof d=="string"?ue(d):e}</code></pre></div>`}function sf(e){let t=a.bundleSourceFindingIdx;if(t==null)return g;let r=e[t];if(!r)return g;let n=r.fileHash?Mn(r.fileHash,r):[],o=a.triage.get(M(r))?.triage,s=o==="fixed"?"Fixed":null,i=mr(r),l=cf(r.line);return c`<aside class="bundle-source-panel"><header class="bundle-source-panel-bar"><span class="${`bundle-source-panel-sev sev-${r.severity}`}">${r.severity.replaceAll("_"," ")}</span> ${s?c`<span class="${`bundle-source-panel-triage triage-${o}`}">${s}</span>`:g} <button type="button" class="bundle-source-panel-close" data-action="bundle-source-panel-close" title="Close (Esc)" aria-label="Close finding details">×</button></header><div class="bundle-source-panel-body">${l||i?c`<div class="bundle-source-panel-line-row">${l?c`<span class="bundle-source-panel-line">${l}</span>`:g} ${i?c`<span class="bundle-source-panel-meta" title="${i}">${i}</span>`:g}</div>`:g}<div class="bundle-source-panel-desc">${r.description??""}</div>${n.length>0?c`<div class="bundle-source-panel-reports"><div class="bundle-source-panel-reports-label">Reported by</div>${n.map(d=>{let u=G[Ke(d)]??G.default;return c`<button type="button" class="report-chip bundle-source-panel-report" title="${d}" data-bundle-issue-report="${d}">${ue(u)}<span class="report-chip-label">${qe(d)}</span></button>`})}</div>`:g}</div></aside>`}function af(){let e=a.bundleSourceFile;if(!e)return g;if(a.bundleDetailsTab==="code")return g;let r=dt(a.bundleDetails).get(e),n=[],o=new Map;if(typeof r=="string"&&a.bundleDetails?.fileHashes){let i=vr(a.bundleDetails.fileHashes,"issues").get(e)??[];for(let l=0;l<i.length;l++){let d=i[l];n.push(d);let u=parseInt(d.line,10);Number.isFinite(u)&&u>0&&(o.has(u)||o.set(u,[]),o.get(u).push({f:d,idx:l}))}}return c`<div class="bundle-source-overlay"><div class="${B({"bundle-source-modal":!0,"with-panel":a.bundleSourceFindingIdx!=null})}"><header class="bundle-source-bar"><div class="bundle-source-title" title="${e}">${e}</div><button type="button" class="bundle-source-close" data-action="bundle-source-close" title="Close source viewer (Esc)" aria-label="Close source viewer">×</button></header><div class="bundle-source-body"><div class="bundle-source-code-wrap">${typeof r=="string"?of(r,e,a.bundleDetails?.integrity,o):c`<div class="bundle-source-empty">Source content not bundled.</div>`}</div>${sf(n)}</div></div></div>`}function lf(e){let t={name:"",files:new Map,dirs:new Map};for(let r of e){let n=r.split("/"),o=t;for(let s=0;s<n.length-1;s++){let i=n[s],l=o.dirs.get(i);l||(l={name:i,files:new Map,dirs:new Map},o.dirs.set(i,l)),o=l}o.files.set(n.at(-1),r)}return t}var Gs=new Map,ef=null;function Ll(e,t,r=0,n=null,o="",s=!1){let i=[...e.dirs.entries()].toSorted(([p],[h])=>p.localeCompare(h)),l=[...e.files.entries()].toSorted(([p],[h])=>p.localeCompare(h)),d=p=>{if(!t)return!1;for(let h of p.files.values())if(h===t)return!0;for(let h of p.dirs.values())if(d(h))return!0;return!1},u=(p,h)=>s?!0:Gs.has(p)?Gs.get(p):r===0||d(h),f=p=>h=>{Gs.set(p,!h.currentTarget.parentElement.open)};return c`<ul class="${B({"bundle-code-tree":!0,root:r===0})}">${J(i,([p])=>`${o}/${p}`,([p,h])=>{let b=o?`${o}/${p}`:p;return c`<li class="bundle-code-tree-dir"><details ?open="${u(b,h)}"><summary @click="${f(b)}">${p}</summary>${Ll(h,t,r+1,n,b,s)}</details></li>`})} ${J(l,([,p])=>p,([p,h])=>{let b=n?.get(h),m=b&&b.length>0?Ys(b):null,y=b?.length??0;return c`<li class="bundle-code-tree-file"><button type="button" class="${B({"bundle-code-tree-link":!0,current:h===t})}" data-bundle-view-source="${h}" title="${h}"><span class="bundle-code-tree-name">${p}</span> ${y>0?c`<span class="${`bundle-code-tree-count sev-${m}`}" title="${`${y} ${y===1?"issue":"issues"}`}">${y}</span>`:g}</button></li>`})}</ul>`}function by(e,t,r,n,o=""){if(!r)return Ll(e,t,0,n);let s=r.toLowerCase(),i=[],l=h=>{for(let[,b]of h.dirs)l(b);for(let[,b]of h.files)(o&&b.startsWith(o)?b.slice(o.length):b).toLowerCase().includes(s)&&i.push(b)};if(l(e),i.length===0)return c`<div class="bundle-code-search-empty">No files match.</div>`;let d=o?i.map(h=>h.startsWith(o)?h.slice(o.length):h):i,u=new Map;for(let h=0;h<i.length;h++)u.set(d[h],i[h]);let f=lf(d),p=h=>{let b=new Map;for(let[m,y]of h.files)b.set(m,u.get(y)??y);h.files=b;for(let m of h.dirs.values())p(m)};return p(f),Ll(f,t,0,n,"",!0)}function yy(e,t,r,n=""){if(!t)return c`<div class="bundle-code-search-hint">Type to search across every source in this bundle.</div>`;let o=t.toLowerCase(),s=20,i=100,l=[],d=0;for(let[u,f]of e){if(typeof f!="string")continue;let p=[],h=f.split(`
46
- `);for(let b=0;b<h.length;b++){let m=h[b];if(m.toLowerCase().includes(o)&&(p.push({ln:b+1,text:m}),d++,p.length>=s))break}if(p.length>0&&l.push({path:u,hits:p}),l.length>=i)break}return l.length===0?c`<div class="bundle-code-search-empty">No matches.</div>`:c`<div class="bundle-code-search-results"><div class="bundle-code-search-summary">${d} ${d===1?"hit":"hits"} in ${l.length} ${l.length===1?"file":"files"}</div>${l.map(({path:u,hits:f})=>{let p=n&&u.startsWith(n)?u.slice(n.length):u;return c`<div class="${B({"bundle-code-search-file":!0,current:u===r})}"><button type="button" class="bundle-code-search-file-name" data-bundle-view-source="${u}" title="${u}">${p}</button><ul class="bundle-code-search-hits">${f.map(h=>c`<li class="bundle-code-search-hit"><button type="button" class="bundle-code-search-hit-link" data-bundle-view-source="${u}" data-bundle-view-line="${h.ln}" data-bundle-view-scroll-block="start" title="${`${u}:${h.ln}`}"><span class="bundle-code-search-hit-ln">${h.ln}</span> <span class="bundle-code-search-hit-text mono">${h.text.slice(0,200)}</span></button></li>`)}</ul></div>`})}</div>`}function wy(e,t,r,n=""){if(!e.fileHashes)return c`<div class="bundle-code-search-empty">Computing file hashes…</div>`;let o=vr(e.fileHashes,"issues");if(o.size===0)return c`<div class="bundle-code-search-empty">No issues match this bundle's files.</div>`;let s=t.toLowerCase(),i=[];for(let[l,d]of o)for(let u=0;u<d.length;u++){let f=d[u],p=f.description??"";s&&!l.toLowerCase().includes(s)&&!f.severity.includes(s)&&!p.toLowerCase().includes(s)||i.push({file:l,finding:f,fileIdx:u})}return i.sort((l,d)=>{let u=Ge[l.finding.severity]??0,f=Ge[d.finding.severity]??0;return f!==u?f-u:l.file.localeCompare(d.file)}),i.length===0?c`<div class="bundle-code-search-empty">No matches.</div>`:c`<div class="bundle-code-search-results"><div class="bundle-code-search-summary">${i.length} ${i.length===1?"issue":"issues"}</div><ul class="bundle-code-search-issues">${i.map(({file:l,finding:d,fileIdx:u})=>{let f=d.severity,p=n&&l.startsWith(n)?l.slice(n.length):l,h=l===r&&a.bundleSourceFindingIdx===u;return c`<li class="${B({"bundle-code-search-issue":!0,current:h})}"><button type="button" class="bundle-code-search-issue-link" data-bundle-view-source="${l}" data-bundle-view-finding-idx="${u}" data-bundle-view-line="${d.line??""}" title="${l}"><div class="bundle-code-search-issue-row"><span class="${`bundle-code-search-issue-sev sev-${f}`}">${f.replaceAll("_"," ")}</span> <span class="bundle-code-search-issue-path mono">${p}${d.line?`:${d.line}`:""}</span></div><div class="bundle-code-search-issue-desc">${d.description??""}</div></button></li>`})}</ul></div>`}function vy(e){if(!e||!e.json&&!e.bundle)return g;let t=dt(e);if(t.size===0)return c`<div class="bundle-code-empty">This bundle doesn't carry any source content.</div>`;ef!==a.selectedBundle&&(Gs.clear(),ef=a.selectedBundle);let r=[...t.keys()].toSorted(),{prefix:n,stripped:o}=At(r),s=new Map;for(let w=0;w<r.length;w++)s.set(o[w],r[w]);let i=lf(o),l=w=>{let x=new Map;for(let[S,C]of w.files)x.set(S,s.get(C)??C);w.files=x;for(let S of w.dirs.values())l(S)};l(i);let d=a.bundleSourceFile,u=d?t.get(d):null,f=[],p=new Map;if(typeof u=="string"&&e.fileHashes){let x=vr(e.fileHashes,"issues").get(d)??[];for(let S=0;S<x.length;S++){let C=x[S];f.push(C);let L=parseInt(C.line,10);Number.isFinite(L)&&L>0&&(p.has(L)||p.set(L,[]),p.get(L).push({f:C,idx:S}))}}let h=e.fileHashes?vr(e.fileHashes,"issues"):new Map,m=h.size>0?["files","code","issues"]:["files","code"],y=m.includes(a.bundleCodeSearchMode)?a.bundleCodeSearchMode:"files",v=a.bundleCodeSearchQuery;return c`<div class="bundle-code-view"><aside class="bundle-code-rail"><div class="bundle-code-rail-head"><span class="bundle-code-rail-label">Files</span> <span class="bundle-code-rail-count">${r.length}</span></div>${n?c`<div class="bundle-code-rail-prefix mono" title="${n}">${n}</div>`:g}<div class="bundle-code-search"><svg class="bundle-code-search-icon" viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><circle cx="6.5" cy="6.5" r="4.5"/><path d="M9.7 9.7L13 13" stroke-linecap="round"/></svg> <input type="text" class="bundle-code-search-input" id="bundle-code-search-input" placeholder="${y==="files"?"Filter files\u2026":y==="code"?"Search code\u2026":"Search issues\u2026"}" .value="${je(v)}"> ${v?c`<button type="button" class="bundle-code-search-clear" data-bundle-search-clear title="Clear search" aria-label="Clear search">×</button>`:g} <span class="bundle-code-search-modes" role="tablist">${m.map(w=>c`<button type="button" class="${B({"bundle-code-search-mode":!0,active:y===w})}" data-bundle-search-mode="${w}" role="tab" aria-selected="${String(y===w)}" title="${w==="files"?"Filter files":w==="code"?"Search code":"Search issues"}" aria-label="${w==="files"?"Filter files":w==="code"?"Search code":"Search issues"}">${py[w]}</button>`)}</span></div><div class="bundle-code-rail-body">${vl(y,[["files",()=>by(i,d,v,h,n)],["code",()=>yy(t,v,d,n)],["issues",()=>wy(e,v,d,n)]])}</div></aside><div class="${B({"bundle-code-main":!0,"with-panel":a.bundleSourceFindingIdx!=null})}">${d?c`<header class="bundle-code-main-bar"><span class="bundle-code-main-path mono" title="${d}">${d}</span></header><div class="bundle-code-main-body"><div class="bundle-source-code-wrap">${typeof u=="string"?of(u,d,e.integrity,p):c`<div class="bundle-source-empty">Source content not bundled.</div>`}</div>${sf(f)}</div>`:c`<div class="bundle-code-placeholder">Pick a file from the tree to view its source.</div>`}</div></div>`}function ky(e){let t=Jp(e,a.bundleDetails);a.bundleDetailsTab==="advisories"&&!t&&(a.bundleDetailsTab="overview");let r=a.bundleDetailsTab,n=r==="overview";return r==="advisories"&&t&&Xp(a.bundleDetails,k).catch(()=>{}),c`<div class="bundles-view bundles-slide-view"><header class="bundles-slide-bar"><span class="bundles-slide-icon" aria-hidden="true">${ue(Zr)}</span><div class="bundles-slide-title"><div class="bundles-slide-name">${e.name}</div></div><div class="bundles-slide-tabs" role="tablist">${t?c`<button type="button" class="${B({"bundles-tab":!0,active:r==="advisories"})}" data-bundle-tab="advisories" aria-selected="${String(r==="advisories")}" role="tab">Advisories</button>`:g} <button type="button" class="${B({"bundles-tab":!0,active:r==="issues"})}" data-bundle-tab="issues" aria-selected="${String(r==="issues")}" role="tab">Issues</button> <button type="button" class="${B({"bundles-tab":!0,active:r==="terminal"})}" data-bundle-tab="terminal" aria-selected="${String(r==="terminal")}" role="tab">Terminal</button> <button type="button" class="${B({"bundles-tab":!0,active:r==="treemap"})}" data-bundle-tab="treemap" aria-selected="${String(r==="treemap")}" role="tab">Treemap</button> <button type="button" class="${B({"bundles-tab":!0,active:r==="graph"})}" data-bundle-tab="graph" aria-selected="${String(r==="graph")}" role="tab">Graph</button> <button type="button" class="${B({"bundles-tab":!0,active:r==="code"})}" data-bundle-tab="code" aria-selected="${String(r==="code")}" role="tab">Code</button> <button type="button" class="${B({"bundles-tab":!0,active:n})}" data-bundle-tab="overview" aria-selected="${String(n)}" role="tab">Overview</button></div></header><div class="${B({"bundles-slide-body":!0,"bundles-slide-body-overview":n})}">${n?_y(e,a.bundleDetails):vl(r,[["terminal",()=>c`<div id="bundle-terminal-slot" class="bundle-terminal-slot"></div>`],["graph",()=>c`<div id="bundle-graph-slot" class="bundle-graph-slot"></div>`],["treemap",()=>c`<bundle-treemap .details="${a.bundleDetails}"></bundle-treemap>`],["code",()=>vy(a.bundleDetails)],["issues",()=>xy(a.bundleDetails)],["advisories",()=>Qp(a.bundleDetails)]])}</div></div>`}function $y(e,t={}){if(!e)return g;let r=[];if(e.fileHash&&(r=Mn(e.fileHash,e)),r.length===0&&t.bucketKey&&(t.kind==="package"?r=pa(t.bucketKey,e):t.kind==="repository"&&(r=fa(t.bucketKey,e))),r.length===0)return g;let n=r.slice(0,2),o=r.length-n.length;return c`<div class="bundle-issue-reports">${n.map(s=>{let i=G[Ke(s)]??G.default;return c`<button type="button" class="report-chip" title="${s}" data-bundle-issue-report="${s}">${ue(i)}<span class="report-chip-label">${qe(s)}</span></button>`})} ${o>0?c`<span class="bundle-issue-reports-more">, and ${o} more…</span>`:g}</div>`}function cf(e){if(e==null||e==="")return"";let t=String(e),r=t.indexOf("-");if(r>0){let o=parseInt(t.slice(0,r),10),s=parseInt(t.slice(r+1),10);return Number.isFinite(o)&&Number.isFinite(s)&&s>o?`Lines ${o}-${s}`:Number.isFinite(o)?`Line ${o}`:""}let n=parseInt(t,10);return Number.isFinite(n)?`Line ${n}`:""}function xy(e){if(!e||!e.json&&!e.bundle)return g;if(!e.fileHashes)return c`<div class="bundle-issues-empty">Computing file hashes…</div>`;let t=vr(e.fileHashes,"issues");return t.size===0?c`<div class="bundle-issues-empty">No issues match this bundle's files.</div>`:po(t,{kind:"bundle"})}function po(e,{kind:t,bucketKey:r}={}){let n=[...e.keys()],{prefix:o,stripped:s}=At(n),i=new Map(n.map((u,f)=>[u,s[f]])),l=[...e.entries()].toSorted(([u,f],[p,h])=>{let b=Ge[Ys(f)]??0,m=Ge[Ys(h)]??0;return m!==b?m-b:(i.get(u)??u).localeCompare(i.get(p)??p)}),d=[...e.values()].reduce((u,f)=>u+f.length,0);return c`<div class="bundle-issues"><div class="bundle-issues-summary">${d} ${d===1?"issue":"issues"} across ${e.size} ${e.size===1?"file":"files"} ${o?c`<span class="mono">${o}</span>`:g}</div><ul class="bundle-issues-list">${J(l,([u])=>u,([u,f])=>{let p=i.get(u)??u,h=[...f].toSorted((m,y)=>{let v=Ge[m.severity]??0,w=Ge[y.severity]??0;if(w!==v)return w-v;let x=parseInt(m.line,10)||0,S=parseInt(y.line,10)||0;return x-S}),b=t==="repository"&&r?`${/^https?:/iu.test(r)?r.replace(/\/$/u,""):`https://github.com/${r}`}/blob/HEAD/${u}`:null;return c`<li class="bundle-issues-file-group"><header class="bundle-issues-file-header">${t==="bundle"?c`<button type="button" class="bundle-issues-file-name mono" data-bundle-view-source="${u}" title="${u}">${p}</button>`:b?c`<a class="bundle-issues-file-name bundle-issues-file-name-link mono" href="${b}" target="_blank" rel="noopener" title="${u}">${p}</a>`:c`<span class="bundle-issues-file-name bundle-issues-file-name-static mono" title="${u}">${p}</span>`} <span class="bundle-issues-file-count">${f.length} ${f.length===1?"issue":"issues"}</span></header><ul class="bundle-issues-findings">${J(h,m=>m.id??`${u}\0${m.line??""}\0${m.severity??""}\0${m.description??""}`,m=>{let y=f.indexOf(m),v=m.severity,w=a.triage.get(M(m))?.triage,x=w==="fixed"||w==="invalid"||w==="deleted"?w.toUpperCase():null,S=c`<div class="bundle-issues-finding-head"><span class="${`bundle-issue-sev sev-${v}`}">${v.replaceAll("_"," ")}</span> ${(()=>{let C=cf(m.line);return C?c`<span class="bundle-issues-finding-line">${C}</span>`:g})()} ${x?c`<span class="${`bundle-issues-finding-triage triage-${w}`}">${x}</span>`:g} <span class="bundle-issues-finding-spacer"></span> ${$y(m,{kind:t,bucketKey:r})}</div><div class="bundle-issues-finding-desc">${m.description??""}</div>`;return c`<li class="bundle-issues-finding">${t==="bundle"?c`<button type="button" class="bundle-issues-finding-link" data-bundle-view-source="${u}" data-bundle-view-finding-idx="${y}" data-bundle-view-line="${m.line??""}" title="${u}">${S}</button>`:c`<div class="bundle-issues-finding-link bundle-issues-finding-static" title="${u}">${S}</div>`}</li>`})}</ul></li>`})}</ul></div>`}function df(e){let t=a.selectedBundle,r=t?e.find(n=>n.integrity===t):null;return r?ky(r):c`<div class="bundles-view bundles-view-empty"><p class="bundles-empty-hint">${e.length===0?"No bundles yet. Drop a `.map` sourcemap or a `.stasis.code.br` bundle to start.":"Pick a bundle from the sidebar to open it."}</p></div>`}function _y(e,t){let r=c`<dl class="bundles-detail-meta"><dt>Name</dt><dd>${e.name}</dd><dt>Integrity</dt><dd class="mono">${e.integrity}</dd>${t&&t.integrity===e.integrity?c`<dt>Size</dt><dd>${De(t.size)}</dd>`:g}</dl>`;if(!t||t.integrity!==e.integrity)return c`<div class="bundles-overview"><div class="bundles-overview-summary">${r}</div></div>`;if(t.error)return c`<div class="bundles-overview"><div class="bundles-overview-summary">${r}</div><div class="bundles-overview-placeholder is-error">Failed to parse: ${t.error}</div></div>`;if(t.kind==="sourcemap"&&t.json){let n=t.json,o=n.sources??[],s=n.sourcesContent??[],i=o.map((d,u)=>typeof s[u]=="string"?new TextEncoder().encode(s[u]).byteLength:null),l=c`<dt>Version</dt><dd>${String(n.version??"?")}</dd>${n.file?c`<dt>Output</dt><dd class="mono">${n.file}</dd>`:g} ${n.sourceRoot?c`<dt>Source root</dt><dd class="mono">${n.sourceRoot}</dd>`:g} ${n.names?c`<dt>Names</dt><dd>${n.names.length}</dd>`:g}`;return Zp(r,l,o,i)}if(t.kind==="stasis"&&t.bundle){let n=t.bundle,o=n.sources,s=[...o.keys()],i=new Set;for(let f of n.imports.keys()){let p=f.replace(/\s*\(with: .*\)\s*$/u,"");for(let h of p.split(", "))i.add(h)}let l=[...i].toSorted(),d=s.map(f=>{let p=o.get(f);return typeof p=="string"?new TextEncoder().encode(p).byteLength:null}),u=c`<dt>Version</dt><dd>${String(n.version)}</dd>${l.length>0?c`<dt>Resolution kinds</dt><dd>${l.join(", ")}</dd>`:g}`;return Zp(r,u,s,d)}return c`<div class="bundles-overview"><div class="bundles-overview-summary">${r}</div><div class="bundles-overview-placeholder">Bundle contents not parsed.</div></div>`}function uf(){Ct().catch(()=>{});let e=mt(),t={fixed:0,invalid:0,deleted:0},r=[];for(let[h,b]of e){let m=[],y=[],v=new Map,w=new Set;for(let[x,S]of b.byVersion){let C=[],L=new Map;for(let V of S.findings){let ze=a.triage.get(M(V))?.triage??null;ze==="fixed"?t.fixed++:ze==="invalid"?t.invalid++:ze==="deleted"&&t.deleted++,ze===a.shownTriage&&(C.push(V),L.has(V.file)||L.set(V.file,[]),L.get(V.file).push(V))}if(C.length!==0){m.push([x,{findings:C,files:L,reports:S.reports}]);for(let V of C)y.push(V),v.has(V.file)||v.set(V.file,[]),v.get(V.file).push(V);for(let V of S.reports)w.add(V)}}m.length!==0&&(m.sort(([x],[S])=>Fi(x,S)),r.push([h,{findings:y,files:v,reports:w,versions:m}]))}let n=a.selectedPackage,o=n?r.find(([h])=>h===n)??null:null,s=null;if(o){let h=o[1].versions,b=a.selectedPackageVersion;s=h.find(([m])=>m===b)??null,!s&&h.length===1&&(s=h[0])}let i=s?s[1]:o?o[1]:null;if(o&&a.packageDetailsTab==="issues")return By(o[0],i,s?s[0]:void 0);let l=a.packagesSearchQuery.trim().toLowerCase(),d=l?r.filter(([h])=>h.toLowerCase().includes(l)):r.slice();Ay(d,a.packagesSortBy);let u=r.reduce((h,[,b])=>h+b.findings.length,0),f=new Set;for(let[,h]of r)for(let b of h.reports)f.add(b);let p=o?"packages-layout open":"packages-layout";return c`<div class="${B({"packages-view":!0,"with-details":!!o})}"><header class="page-head"><div class="page-title"><h1>Packages</h1><div class="meta-row"><span>${d.length===r.length?c`${r.length} ${r.length===1?"package":"packages"}`:c`${d.length} of ${r.length} ${r.length===1?"package":"packages"}`}</span> ${u>0?c`<span>${u} ${u===1?"finding":"findings"} across ${f.size} ${f.size===1?"report":"reports"}</span>`:g}</div></div>${Ey(t)}</header>${r.length===0?c`<p style="color:var(--muted)">${e.size===0?"Indexing reports\u2026 this view populates as the OPFS scan finishes.":a.shownTriage?`No ${a.shownTriage} findings in any package.`:"No untriaged findings in any package."}</p>`:d.length===0?c`<p style="color:var(--muted)">No packages match "${a.packagesSearchQuery}".</p>`:c`<div class="${p}"><ul class="packages-list">${J(Sy(d),Cy,h=>Ry(h,n,a.selectedPackageVersion))}</ul>${o?c`<aside class="packages-details" id="packages-details"><header class="packages-details-bar"><span class="packages-details-label">Details</span> <button type="button" class="packages-details-close" data-deselect-package title="Close details" aria-label="Close details">×</button></header><div class="packages-details-body">${Py(o[0],i,s?s[0]:void 0)}</div></aside>`:g}</div>`}</div>`}function Sy(e){let t=[];for(let[r,n]of e){let o=n.versions;if(o.length<=1){let[d,u]=o[0];t.push({kind:"single",pkg:r,version:d,bucket:u,totalVersions:1});continue}let[s,i]=o[0],l=a.expandedPackages.has(r);if(t.push({kind:"latest",pkg:r,version:s,bucket:i,totalVersions:o.length,expanded:l}),l)for(let d=1;d<o.length;d++){let[u,f]=o[d];t.push({kind:"other",pkg:r,version:u,bucket:f,totalVersions:o.length})}}return t}function Cy(e){return e.version===null?`${e.kind}:${e.pkg}`:`${e.kind}:${e.pkg}@${e.version}`}function Ey(e){return c`<div class="packages-toolbar"><input type="search" id="packages-search-input" class="packages-search" placeholder="Filter packages…" aria-label="Filter packages" .value="${je(a.packagesSearchQuery)}"> <span class="packages-sort-wrap"><select id="packages-sort-select" class="packages-sort" aria-label="Sort packages" .value="${je(a.packagesSortBy)}"><option value="findings-desc">Findings ↓</option><option value="files-desc">Files ↓</option><option value="reports-desc">Reports ↓</option><option value="name-asc">Name A→Z</option></select></span>${Ty(e)}</div>`}function Ty(e){let t=["fixed","invalid","deleted"];return t.reduce((n,o)=>n+(e[o]??0),0)===0&&!a.shownTriage?g:c`<div class="triage-selector packages-triage-selector" role="group" aria-label="Triage view">${t.map(n=>{let o=e[n]??0,s=a.shownTriage===n;return o===0&&!s?g:c`<button type="button" class="${B({"triage-state-btn":!0,[`triage-state-${n}`]:!0,active:s})}" data-triage-show="${n}" title="${s?`Exit ${n} view`:`Show ${n} (${o})`}" aria-pressed="${String(s)}">${n.charAt(0).toUpperCase()+n.slice(1)} (${o})</button>`})}</div>`}function Ay(e,t){let r=t==="name-asc"?(n,o)=>n[0].localeCompare(o[0]):t==="files-desc"?(n,o)=>o[1].files.size-n[1].files.size||n[0].localeCompare(o[0]):t==="reports-desc"?(n,o)=>o[1].reports.size-n[1].reports.size||n[0].localeCompare(o[0]):(n,o)=>o[1].findings.length-n[1].findings.length||n[0].localeCompare(o[0]);e.sort(r)}function Iy(e,t){let r={live:0,invalid:0,deleted:0};if(!e)return r;let n=t===void 0?e.files.values():e.byVersion.get(t)?.files.values()??[].values();for(let o of n)for(let s of o){let i=a.triage.get(M(s))?.triage??null;i==="invalid"?r.invalid++:i==="deleted"?r.deleted++:r.live++}return r}function By(e,t,r){let n=mt().get(e),o=Iy(n,r),s=a.packageSlideTriage??"live",i=n?pf(n,e,s,r):new Map,l=[...i.values()].reduce((p,h)=>p+h.length,0),d=s==="live"?l===1?"issue":"issues":l===1?`${s} issue`:`${s} issues`,u=s==="live"?"No live issues for this package.":`No ${s} issues for this package.`,f=typeof r=="string"?` @ ${r}`:"";return c`<div class="packages-view packages-slide-view"><header class="bundles-slide-bar"><button type="button" class="bundles-slide-back" data-action="package-slide-back" title="Back to packages" aria-label="Back to packages">← Back</button><div class="bundles-slide-title"><div class="bundles-slide-name">${e}${f}</div><div class="bundles-slide-integrity">${l} ${d} · ${t.files.size} ${t.files.size===1?"file":"files"} · ${t.reports.size} ${t.reports.size===1?"report":"reports"}</div></div>${Fy(o)}</header><div class="bundles-slide-body">${i.size===0?c`<div class="bundle-issues-empty">${u}</div>`:po(i,{kind:"package",bucketKey:e})}</div></div>`}function Fy(e){let r=["invalid","deleted"].filter(n=>e[n]>0||a.packageSlideTriage===n);return r.length===0?g:c`<div class="triage-selector packages-slide-triage" role="group" aria-label="Triage view">${r.map(n=>{let o=a.packageSlideTriage===n;return c`<button type="button" class="${B({"triage-state-btn":!0,[`triage-state-${n}`]:!0,active:o})}" data-package-slide-triage="${n}" title="${o?`Exit ${n} view`:`Show ${n} (${e[n]})`}" aria-pressed="${String(o)}">${n.charAt(0).toUpperCase()+n.slice(1)} (${e[n]})</button>`})}</div>`}function Ry(e,t,r){let{kind:n,pkg:o,version:s,bucket:i}=e,l={critical:0,high:0,medium:0,low:0,high_bug:0,bug:0,informational:0};for(let m of i.findings)l[m.severity]!==void 0&&l[m.severity]++;let d=ge.filter(m=>l[m]>0),u=It(o),p={selected:o===t&&My(e,r),"packages-row-latest":n==="latest","packages-row-other":n==="other"},h=s===null?"":s,b=s===null?`Open issues for ${o}`:`Open issues for ${o}@${s}`;return c`<li class="${B(p)}" data-select-package="${o}" data-select-package-version="${h}"><span class="packages-dot" style="${ye({background:u})}"></span><div class="packages-row-text"><div class="packages-name-line"><span class="packages-name">${o}${s===null?g:c`<span class="packages-version">@${s}</span>`} </span>${n==="latest"?Ly(o,e.expanded,e.totalVersions-1):g}</div><span class="packages-row-meta">${i.findings.length} ${i.findings.length===1?"finding":"findings"} · ${i.files.size} ${i.files.size===1?"file":"files"} · ${i.reports.size} ${i.reports.size===1?"report":"reports"}</span></div>${d.length>0?c`<div class="packages-row-chips">${d.map(m=>c`<span class="${`tree-count-chip ${m}`}" title="${m.replaceAll("_"," ")}">${l[m]}</span>`)}</div>`:g} <button type="button" class="packages-row-issues" data-package-row-issues="${o}" data-package-row-issues-version="${h}" aria-label="${b}">Issues →</button></li>`}function My(e,t){return e.kind==="single"?!0:e.version===t}function Ly(e,t,r){let n=t?"Hide":`+${r} ${r===1?"version":"versions"}`;return c`<button type="button" class="${B({"packages-row-expand":!0,expanded:t})}" data-package-expand="${e}" aria-expanded="${String(t)}" aria-label="${t?`Hide older versions of ${e}`:`Show older versions of ${e}`}" title="${t?"Hide older versions":`Show older versions (${r})`}"><span class="packages-row-expand-chevron" aria-hidden="true"></span> <span class="packages-row-expand-label">${n}</span></button>`}function Py(e,t,r){let n=mt().get(e),s=[...(n?pf(n,e,"live",r):new Map).values()].reduce((i,l)=>i+l.length,0);return c`<div class="bundles-tabs" role="tablist"><button type="button" class="bundles-tab active" data-package-tab="overview" aria-selected="true" role="tab">Overview</button> <span class="bundles-tabs-spacer"></span> ${s>0?c`<button type="button" class="bundles-tab bundles-tab-action" data-package-tab="issues">Issues (${s}) →</button>`:g}</div>${Oy(e,t,r)}`}function pf(e,t,r="live",n){let o=new Map,s=n===void 0?e.files:e.byVersion.get(n)?.files??new Map;for(let[i,l]of s){let d=l.filter(p=>{let h=a.triage.get(M(p))?.triage??null;return r==="invalid"?h==="invalid":r==="deleted"?h==="deleted":h!=="invalid"&&h!=="deleted"});if(d.length===0)continue;let u=ff(t,i);o.has(u)||o.set(u,[]);let f=o.get(u);for(let p of d)f.push(p)}return o}function Oy(e,t,r){let n={critical:0,high:0,medium:0,low:0,high_bug:0,bug:0,informational:0};for(let p of t.findings)n[p.severity]!==void 0&&n[p.severity]++;let o=ge.filter(p=>n[p]>0),s=[...t.files.entries()].toSorted(([p,h],[b,m])=>m.length!==h.length?m.length-h.length:p.localeCompare(b)),i=[...t.reports].toSorted((p,h)=>p.localeCompare(h)),d=mt().get(e)?.repos,u=d&&d.size===1?[...d][0]:null,f=u?/^https?:/iu.test(u)?u:`https://github.com/${u}`:null;return c`<dl class="packages-detail-meta"><dt>Package</dt><dd class="mono">${e}</dd>${r?c`<dt>Version</dt><dd class="mono">${r}</dd>`:g} ${f?c`<dt>Repository</dt><dd class="mono"><a href="${f}" target="_blank" rel="noopener">${u}</a></dd>`:g}<dt>Findings</dt><dd>${t.findings.length}</dd><dt>Files</dt><dd>${t.files.size}</dd><dt>Reports</dt><dd>${t.reports.size}</dd></dl>${o.length>0?c`<div class="packages-detail-chips">${o.map(p=>c`<span class="${`tree-count-chip ${p}`}">${n[p]} ${p.replaceAll("_"," ")}</span>`)}</div>`:g}<h3 class="packages-detail-section">Reports</h3><ul class="packages-detail-reports">${i.map(p=>{let h=G[Ke(p)]??G.default;return c`<li><button type="button" class="packages-detail-report" title="${p}" data-package-report="${p}">${ue(h)}<span class="packages-detail-report-label">${qe(p)}</span></button></li>`})}</ul><h3 class="packages-detail-section">Files</h3><ul class="packages-detail-files">${s.map(([p,h])=>{let b=ff(e,p);return c`<li class="packages-detail-file"><span class="packages-detail-file-path mono" title="${p}">${b}</span> <span class="packages-detail-file-count">${h.length}</span></li>`})}</ul>`}function ff(e,t){for(let r of["node_modules","dependencies"]){let n=`${r}/${e}/`,o=t.indexOf(n);if(o>=0)return t.slice(o+n.length)}return t.startsWith(`${e}/`)?t.slice(e.length+1):t}function tt(e){if(!e)return"";let t=e.match(/github\.com\/([^/?#]+\/[^/?#]+?)(?:\.git)?(?:[/?#]|$)/iu);return t?t[1]:e}function hf(){Ct().catch(()=>{});let e=pr(),t={fixed:0,invalid:0,deleted:0},r=[];for(let[f,p]of e){let h=[],b=new Map;for(let m of p.findings){let y=a.triage.get(M(m))?.triage??null;y==="fixed"?t.fixed++:y==="invalid"?t.invalid++:y==="deleted"&&t.deleted++,y===a.shownTriage&&(h.push(m),b.has(m.file)||b.set(m.file,[]),b.get(m.file).push(m))}h.length>0&&r.push([f,{findings:h,files:b,reports:p.reports}])}let n=a.selectedRepository,o=n?r.find(([f])=>f===n)??null:null;if(o&&a.repositoryDetailsTab==="issues")return Wy(o[0],o[1]);let s=a.repositoriesSearchQuery.trim().toLowerCase(),i=s?r.filter(([f])=>f.toLowerCase().includes(s)||tt(f).toLowerCase().includes(s)):r.slice();Uy(i,a.repositoriesSortBy);let l=r.reduce((f,[,p])=>f+p.findings.length,0),d=new Set;for(let[,f]of r)for(let p of f.reports)d.add(p);let u=o?"packages-layout open":"packages-layout";return c`<div class="${B({"packages-view":!0,"with-details":!!o})}"><header class="page-head"><div class="page-title"><h1>Repositories</h1><div class="meta-row"><span>${i.length===r.length?c`${r.length} ${r.length===1?"repository":"repositories"}`:c`${i.length} of ${r.length} ${r.length===1?"repository":"repositories"}`}</span> ${l>0?c`<span>${l} ${l===1?"finding":"findings"} across ${d.size} ${d.size===1?"report":"reports"}</span>`:g}</div></div>${Dy(t)}</header>${r.length===0?c`<p style="color:var(--muted)">${e.size===0?"Indexing reports\u2026 this view populates as the OPFS scan finishes.":a.shownTriage?`No ${a.shownTriage} findings in any repository.`:"No untriaged findings in any repository."}</p>`:i.length===0?c`<p style="color:var(--muted)">No repositories match "${a.repositoriesSearchQuery}".</p>`:c`<div class="${u}"><ul class="packages-list">${J(i,([f])=>f,([f,p])=>Vy(f,p,f===n))}</ul>${o?c`<aside class="packages-details" id="repositories-details"><header class="packages-details-bar"><span class="packages-details-label">Details</span> <button type="button" class="packages-details-close" data-deselect-repository title="Close details" aria-label="Close details">×</button></header><div class="packages-details-body">${jy(o[0],o[1])}</div></aside>`:g}</div>`}</div>`}function Dy(e){return c`<div class="packages-toolbar"><input type="search" id="repositories-search-input" class="packages-search" placeholder="Filter repositories…" aria-label="Filter repositories" .value="${je(a.repositoriesSearchQuery)}"> <span class="packages-sort-wrap"><select id="repositories-sort-select" class="packages-sort" aria-label="Sort repositories" .value="${je(a.repositoriesSortBy)}"><option value="findings-desc">Findings ↓</option><option value="files-desc">Files ↓</option><option value="reports-desc">Reports ↓</option><option value="name-asc">Name A→Z</option></select></span>${Ny(e)}</div>`}function Ny(e){let t=["fixed","invalid","deleted"];return t.reduce((n,o)=>n+(e[o]??0),0)===0&&!a.shownTriage?g:c`<div class="triage-selector packages-triage-selector" role="group" aria-label="Triage view">${t.map(n=>{let o=e[n]??0,s=a.shownTriage===n;return o===0&&!s?g:c`<button type="button" class="${B({"triage-state-btn":!0,[`triage-state-${n}`]:!0,active:s})}" data-triage-show="${n}" title="${s?`Exit ${n} view`:`Show ${n} (${o})`}" aria-pressed="${String(s)}">${n.charAt(0).toUpperCase()+n.slice(1)} (${o})</button>`})}</div>`}function Uy(e,t){let r=t==="name-asc"?(n,o)=>tt(n[0]).localeCompare(tt(o[0])):t==="files-desc"?(n,o)=>o[1].files.size-n[1].files.size||tt(n[0]).localeCompare(tt(o[0])):t==="reports-desc"?(n,o)=>o[1].reports.size-n[1].reports.size||tt(n[0]).localeCompare(tt(o[0])):(n,o)=>o[1].findings.length-n[1].findings.length||tt(n[0]).localeCompare(tt(o[0]));e.sort(r)}function zy(e){let t={live:0,invalid:0,deleted:0};if(!e)return t;for(let r of e.files.values())for(let n of r){let o=a.triage.get(M(n))?.triage??null;o==="invalid"?t.invalid++:o==="deleted"?t.deleted++:t.live++}return t}function Wy(e,t){let r=pr().get(e),n=zy(r),o=a.repositorySlideTriage??"live",s=r?gf(r,o):new Map,i=[...s.values()].reduce((u,f)=>u+f.length,0),l=o==="live"?i===1?"issue":"issues":i===1?`${o} issue`:`${o} issues`,d=o==="live"?"No live issues for this repository.":`No ${o} issues for this repository.`;return c`<div class="packages-view packages-slide-view"><header class="bundles-slide-bar"><button type="button" class="bundles-slide-back" data-action="repository-slide-back" title="Back to repositories" aria-label="Back to repositories">← Back</button><div class="bundles-slide-title"><div class="bundles-slide-name">${tt(e)}</div><div class="bundles-slide-integrity">${i} ${l} · ${t.files.size} ${t.files.size===1?"file":"files"} · ${t.reports.size} ${t.reports.size===1?"report":"reports"}</div></div>${Hy(n)}</header><div class="bundles-slide-body">${s.size===0?c`<div class="bundle-issues-empty">${d}</div>`:po(s,{kind:"repository",bucketKey:e})}</div></div>`}function Hy(e){let r=["invalid","deleted"].filter(n=>e[n]>0||a.repositorySlideTriage===n);return r.length===0?g:c`<div class="triage-selector packages-slide-triage" role="group" aria-label="Triage view">${r.map(n=>{let o=a.repositorySlideTriage===n;return c`<button type="button" class="${B({"triage-state-btn":!0,[`triage-state-${n}`]:!0,active:o})}" data-repository-slide-triage="${n}" title="${o?`Exit ${n} view`:`Show ${n} (${e[n]})`}" aria-pressed="${String(o)}">${n.charAt(0).toUpperCase()+n.slice(1)} (${e[n]})</button>`})}</div>`}function Vy(e,t,r){let n={critical:0,high:0,medium:0,low:0,high_bug:0,bug:0,informational:0};for(let l of t.findings)n[l.severity]!==void 0&&n[l.severity]++;let o=ge.filter(l=>n[l]>0),s=It(e),i=tt(e);return c`<li class="${r?"selected":""}" data-select-repository="${e}"><span class="packages-dot" style="${ye({background:s})}"></span><div class="packages-row-text"><span class="packages-name">${i}</span> <span class="packages-row-meta">${t.findings.length} ${t.findings.length===1?"finding":"findings"} · ${t.files.size} ${t.files.size===1?"file":"files"} · ${t.reports.size} ${t.reports.size===1?"report":"reports"}</span></div>${o.length>0?c`<div class="packages-row-chips">${o.map(l=>c`<span class="${`tree-count-chip ${l}`}" title="${l.replaceAll("_"," ")}">${n[l]}</span>`)}</div>`:g} <button type="button" class="packages-row-issues" data-repository-row-issues="${e}" aria-label="${`Open issues for ${i}`}">Issues →</button></li>`}function jy(e,t){let r=pr().get(e),o=[...(r?gf(r):new Map).values()].reduce((s,i)=>s+i.length,0);return c`<div class="bundles-tabs" role="tablist"><button type="button" class="bundles-tab active" data-repository-tab="overview" aria-selected="true" role="tab">Overview</button> <span class="bundles-tabs-spacer"></span> ${o>0?c`<button type="button" class="bundles-tab bundles-tab-action" data-repository-tab="issues">Issues (${o}) →</button>`:g}</div>${Ky(e,t)}`}function gf(e,t="live"){let r=new Map;for(let[n,o]of e.files){let s=o.filter(i=>{let l=a.triage.get(M(i))?.triage??null;return t==="invalid"?l==="invalid":t==="deleted"?l==="deleted":l!=="invalid"&&l!=="deleted"});s.length>0&&r.set(n,s)}return r}function Ky(e,t){let r={critical:0,high:0,medium:0,low:0,high_bug:0,bug:0,informational:0};for(let l of t.findings)r[l.severity]!==void 0&&r[l.severity]++;let n=ge.filter(l=>r[l]>0),o=[...t.files.entries()].toSorted(([l,d],[u,f])=>f.length!==d.length?f.length-d.length:l.localeCompare(u)),s=[...t.reports].toSorted((l,d)=>l.localeCompare(d)),i=/^https?:/iu.test(e)?e:`https://github.com/${e}`;return c`<dl class="packages-detail-meta"><dt>Repository</dt><dd class="mono"><a href="${i}" target="_blank" rel="noopener">${tt(e)}</a></dd><dt>Findings</dt><dd>${t.findings.length}</dd><dt>Files</dt><dd>${t.files.size}</dd><dt>Reports</dt><dd>${t.reports.size}</dd></dl>${n.length>0?c`<div class="packages-detail-chips">${n.map(l=>c`<span class="${`tree-count-chip ${l}`}">${r[l]} ${l.replaceAll("_"," ")}</span>`)}</div>`:g}<h3 class="packages-detail-section">Reports</h3><ul class="packages-detail-reports">${s.map(l=>{let d=G[Ke(l)]??G.default;return c`<li><button type="button" class="packages-detail-report" title="${l}" data-package-report="${l}">${ue(d)}<span class="packages-detail-report-label">${qe(l)}</span></button></li>`})}</ul><h3 class="packages-detail-section">Files</h3><ul class="packages-detail-files">${o.map(([l,d])=>c`<li class="packages-detail-file"><span class="packages-detail-file-path mono" title="${l}">${l}</span> <span class="packages-detail-file-count">${d.length}</span></li>`)}</ul>`}var fo=new Map,ho=new Map,Pl=new Set;function qy(e,t,r){let n=`${e}\0${t}`;if(ho.has(n)||Pl.has(n))return;let o=Os(t);if(!o){ho.set(n,null);return}Pl.add(n),(async()=>{let s=await Ds(r,o);ho.set(n,s??null),Pl.delete(n),a.focusCodeTick++,queueMicrotask(k)})()}async function Gy(e){let t=fo.get(e);if(t&&(t.loading||t.sources))return;let r=(a.bundles??[]).find(n=>n.integrity===e);if(r){fo.set(e,{sources:null,loading:!0,error:null});try{let n=await js(e,r),o=dt(n);fo.set(e,{sources:o,loading:!1,error:n.error??null})}catch(n){fo.set(e,{sources:null,loading:!1,error:n.message})}a.focusCodeTick++,queueMicrotask(k),queueMicrotask(()=>{let n=A.querySelector(".focus-code-line-active");n&&n.scrollIntoView({block:"center",behavior:"instant"})})}}function mf(e){if(!e)return null;let t=Ae(e);if(!t.fileHash||!Array.isArray(t._bundleHashes)||t._bundleHashes.length===0)return null;let r=new Set(t._bundleHashes),n=On(t.fileHash).find(({integrity:u})=>r.has(u));if(!n)return null;let o=fo.get(n.integrity);if(!o)return Gy(n.integrity),{loading:!0};if(o.loading)return{loading:!0};if(!o.sources)return null;let s=o.sources.get(n.file);if(typeof s!="string")return null;qy(n.integrity,n.file,s);let i=`${n.integrity}\0${n.file}`,l=ho.has(i)?ho.get(i):void 0,d=parseInt(t.line,10);return{content:s,file:n.file,integrity:n.integrity,line:Number.isFinite(d)?d:null,highlighted:l,loading:!1}}var Ol=class extends I{static styles=[...I.styles,T(Ie)];static properties={workspaceId:{type:String},items:{type:Array},_uploading:{state:!0},_errors:{state:!0},_done:{state:!0},_settled:{state:!0}};constructor(){super(),this.workspaceId="",this.items=[],this._uploading=!1,this._errors=[],this._done=!1,this._settled=!1}focusInitial(){this.renderRoot.querySelector('button[data-role="upload"]')?.focus()}_onClose=()=>this._finish({uploaded:[],failed:[]});_onCancel=()=>this._finish({uploaded:[],failed:[]});_onUpload=async()=>{if(this._uploading)return;this._uploading=!0,this._errors=[];let t=[],r=[];for(let n of this.items)try{let o;if(n.kind==="bundle")o=await Wu(this.workspaceId,n.identifier);else{let s=await An(n.identifier);o=await $s(this.workspaceId,n.identifier,s)}if(o.ok)t.push({kind:n.kind,identifier:n.identifier});else{let s=o.reason??"unknown";r.push({kind:n.kind,identifier:n.identifier,reason:s}),this._errors=[...this._errors,{label:Ye(n),reason:s}]}}catch(o){let s=o?.message??String(o);r.push({kind:n.kind,identifier:n.identifier,reason:s}),this._errors=[...this._errors,{label:Ye(n),reason:s}]}this._uploading=!1,this._done=!0,r.length===0&&this._finish({uploaded:t,failed:r})};_errorsSection(){return this._errors.length===0?g:c`<ul class="lwd-list" role="alert">${this._errors.map(t=>c`<li><strong>${t.label}</strong> — ${t.reason}</li>`)}</ul>`}render(){let t=this.items.length,r=t===1,n=this.items.filter(u=>u.kind==="report").length,o=t-n,s="items";o===0?s=r?"report":"reports":n===0&&(s=r?"bundle":"bundles");let i=r?c`Upload <strong>"${Ye(this.items[0])}"</strong> to the workspace's remote inventory?`:c`Upload <strong>${t}</strong> local ${s} to the workspace's remote inventory?`,l=r?g:c`<ul class="lwd-list">${this.items.map(u=>c`<li>${Ye(u)}${u.kind==="bundle"?c`<span class="lwd-kind-tag">bundle</span>`:g}</li>`)}</ul>`,d=this._uploading?r?"Uploading\u2026":`Uploading ${t} ${s}\u2026`:r?"Upload":`Upload ${t}`;return c`<dialog @close="${this._onClose}"><header><h3>Upload to remote</h3></header><p class="lwd-body">${i}</p>${l} ${this._errorsSection()}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" data-role="cancel" @click="${this._onCancel}" ?disabled="${this._uploading}">${this._done&&this._errors.length>0?"Close":"Cancel"}</button> ${this._done&&this._errors.length>0?g:c`<button type="button" data-role="upload" @click="${this._onUpload}" ?disabled="${this._uploading||t===0}">${d}</button>`}</footer></dialog>`}};customElements.define("sync-upload-dialog",Ol);function bf({workspaceId:e,items:t}={}){return K("sync-upload-dialog",{workspaceId:e??"",items:Array.isArray(t)?[...t]:[]})}var Dl=class extends I{static styles=[...I.styles,T(Ie)];static properties={workspaceId:{type:String},items:{type:Array},_running:{state:!0},_errors:{state:!0},_done:{state:!0},_settled:{state:!0}};constructor(){super(),this.workspaceId="",this.items=[],this._running=!1,this._errors=[],this._done=!1,this._settled=!1}focusInitial(){this.renderRoot.querySelector('button[data-role="download"]')?.focus()}_onClose=()=>this._finish({downloaded:[],failed:[]});_onCancel=()=>this._finish({downloaded:[],failed:[]});_onDownload=async()=>{if(this._running)return;this._running=!0,this._errors=[];let t=[],r=[];for(let n of this.items)try{if(n.kind==="bundle"){let l=await zu(this.workspaceId,n.identifier);if(!l.ok){let d=l.reason??"unknown";r.push({kind:"bundle",identifier:n.identifier,reason:d}),this._errors=[...this._errors,{label:Ye(n),reason:d}];continue}await hr(n.identifier,this.workspaceId),t.push({kind:"bundle",identifier:n.identifier});continue}let o=await Uu(this.workspaceId,n.identifier);if(!o){r.push({kind:"report",identifier:n.identifier,reason:"not found in remote"}),this._errors=[...this._errors,{label:Ye(n),reason:"not found in remote"}];continue}let s;try{s=ce(await ft(o.content))}catch{let l="remote payload is not gzipped UTF-8";r.push({kind:"report",identifier:n.identifier,reason:l}),this._errors=[...this._errors,{label:Ye(n),reason:l}];continue}let i=Oe(s);if(!i.recognized){let l="remote payload is not a recognized report format";r.push({kind:"report",identifier:n.identifier,reason:l}),this._errors=[...this._errors,{label:Ye(n),reason:l}];continue}await In(n.identifier,o.content),Ve(n.identifier,i.count,i.source),await fr(n.identifier,this.workspaceId),t.push({kind:"report",identifier:n.identifier})}catch(o){let s=o?.message??String(o);r.push({kind:n.kind,identifier:n.identifier,reason:s}),this._errors=[...this._errors,{label:Ye(n),reason:s}]}if(this._running=!1,this._done=!0,t.some(n=>n.kind==="report"))try{a.currentWorkspace===this.workspaceId&&await Xt(this.workspaceId)}catch{}r.length===0&&this._finish({downloaded:t,failed:r})};_errorsSection(){return this._errors.length===0?g:c`<ul class="lwd-list" role="alert">${this._errors.map(t=>c`<li><strong>${t.label}</strong> — ${t.reason}</li>`)}</ul>`}render(){let t=this.items.length,r=t===1,n=this.items.filter(u=>u.kind==="report").length,o=t-n,s="items";o===0?s=r?"report":"reports":n===0&&(s=r?"bundle":"bundles");let i=r?c`Download <strong>"${Ye(this.items[0])}"</strong> from the workspace's remote inventory?`:c`Download <strong>${t}</strong> remote ${s} into this workspace?`,l=r?g:c`<ul class="lwd-list">${this.items.map(u=>c`<li>${Ye(u)}${u.kind==="bundle"?c`<span class="lwd-kind-tag">bundle</span>`:g}</li>`)}</ul>`,d=this._running?r?"Downloading\u2026":`Downloading ${t} ${s}\u2026`:r?"Download":`Download ${t}`;return c`<dialog @close="${this._onClose}"><header><h3>Download from remote</h3></header><p class="lwd-body">${i}</p>${l} ${this._errorsSection()}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" data-role="cancel" @click="${this._onCancel}" ?disabled="${this._running}">${this._done&&this._errors.length>0?"Close":"Cancel"}</button> ${this._done&&this._errors.length>0?g:c`<button type="button" data-role="download" @click="${this._onDownload}" ?disabled="${this._running||t===0}">${d}</button>`}</footer></dialog>`}};customElements.define("sync-download-dialog",Dl);function yf({workspaceId:e,items:t}={}){return K("sync-download-dialog",{workspaceId:e??"",items:Array.isArray(t)?[...t]:[]})}function zl(){let e=ml(a.reports);if(!e)return null;let t=Object.keys(e),n=a.reports.flatMap(f=>f.groups).filter(f=>me(f).commonTriage===a.shownTriage),o=gl(n),s=Ms(e,o),i=new Map,l=new Map,d=new Map;for(let f of n)for(let p of f){i.has(p.file)||i.set(p.file,new Set),i.get(p.file).add(p.severity);let h=a.triage.get(M(p))?.color??"none";l.has(p.file)||l.set(p.file,new Set),l.get(p.file).add(h),d.has(p.file)||d.set(p.file,[]),d.get(p.file).push({severity:p.severity,color:h})}let u;return E.focusedPkg?(u=t.filter(f=>(xp(f)??"__own__")===E.focusedPkg),E.showAll||(u=u.filter(f=>bl(f,o,s)))):u=E.showAll?t:t.filter(f=>bl(f,o,s)),{prep:{treeData:e,files:u,ownCounts:o,transitiveCounts:s,severitySets:i,colorSets:l,fileFindings:d},findingCounts:o}}function Wl(){let e=Qr();if(!e)return;let t=zl();t&&e.refreshSidebar(t.prep,{isBundleContext:a.currentView==="bundles"})}function Hl(){let e=Qr();if(!e)return;let t=zl();t&&e.refreshTopPkgs(t.prep)}var Yy={"claude-security":"Claude Security findings","codex-security":"Codex Security findings",deepsec:"DeepSec findings"},Sf={"claude-security":"Claude Security","codex-security":"Codex Security",deepsec:"DeepSec"};function Jy(e){return e==null?"(none)":Sf[e]??e}function Xy(e,t){return a.currentWorkspace?t?c`<repo-chip url="${t}"></repo-chip>`:g:e?c`<repo-chip url="${a.repoUrl}" editable ?editing="${a.repoEditing}" ?empty="${!a.repoUrl}"></repo-chip>`:t?c`<repo-chip url="${t}"></repo-chip>`:g}var Nl=["type","model","effort","exportsMode"];function wf(e,t){return e==="type"?`analyzer: ${t??"null"}`:t??null}function Qy(e,t=Nl){let r=new Map;for(let d of e){let u={};for(let p of t)u[p]=p==="model"?dl(d.model)??null:d[p]??null;let f=t.map(p=>u[p]??"").join("|");r.has(f)||r.set(f,u)}let n=[...r.values()];if(n.length===0)return[];let o={};for(let d of t)o[d]=new Set(n.map(u=>u[d])).size===1;let s=t.filter(d=>!o[d]),i=[],l=!1;for(let d of t)if(o[d]){let u=wf(d,n[0][d]);u!=null&&i.push(u)}else if(!l){for(let u of n){let f=s.map(p=>wf(p,u[p])).filter(p=>p!=null);f.length>0&&i.push(f.join(" \xB7 "))}l=!0}return i}function Zy(e,t,r,n,o){let s=new Set(a.reports.map(ee=>ee.source)),i=s.size===1?[...s][0]:null,l=a.currentWorkspace?U().find(ee=>ee.id===a.currentWorkspace):null,d=l?`Workspace: ${l.name}`:i?Yy[i]:"Findings",u=i&&G[i]?i:"default",f=ue(G[u]),p=c`<svg class="file-icon" viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M14 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z"/><path d="M14 3v6h6"/></svg>`,h=g;t.length===1?h=c`<span class="file-chip">${f}<span>${t[0]}</span></span>`:t.length>1&&(h=c`<span class="file-chip">${p}<span>${t.length} reports</span></span>`);let b=a.reports.flatMap(ee=>ee.groups.flat()),y=`${e} ${`finding${e===1?"":"s"}`}`,w=i||a.currentWorkspace?Nl.filter(ee=>ee!=="type"):Nl,x=Qy(b,w),S=g;if(e>0){let ee={};for(let be of a.reports)for(let Je of be.groups){let Xe=Ne(Je).severity;Xe&&(ee[Xe]=(ee[Xe]||0)+1)}let er=ge.filter(be=>ee[be]>0);er.length>0&&(S=c`<span class="status-bar" aria-hidden="true">${er.map(be=>{let Je=`${ee[be]} ${be.replaceAll("_"," ")}`;return c`<span class="${`status-seg sev-${be}`}" style="${ye({flexGrow:ee[be]})}" title="${Je}"></span>`})}</span>`)}let C=Xy(r,n),L=c`<span class="sep" aria-hidden="true"></span>`,V=a.currentView==="files",ze=(o??0)>1?c`<button type="button" class="${B({"files-toggle-btn":!0,active:V})}" data-action="toggle-files" title="${V?"exit files view":"show files"}" aria-pressed="${String(V)}">${`Files: ${o}`}</button>`:g;return c`<header class="page-head"><div class="page-title"><h1>${d}${h}${C}${ze}${ew()}</h1><div class="meta-row"><span>${y}</span> ${S} ${x.length>0?c`${L}${x.map(ee=>c`<span class="tag">${ee}</span>`)}`:g}</div></div></header>`}function ew(){if(O.status!=="online")return g;if(a.currentView!=="findings"&&a.currentView!=="files")return g;let e=nw();if(!e)return g;let{workspaceId:t,fileNames:r,mode:n}=e;if(n==="single"){let C=r[0],L=sl(t,C)?"cloud":"local";return tw({status:L,label:L,title:L==="cloud"?"Synced to remote":"Local only \u2014 click to upload",onClick:L==="local"?()=>vf({workspaceId:t,items:[{kind:"report",identifier:C}]}):null})}let o=U().find(C=>C.id===t),s=o&&Array.isArray(o.bundles)?o.bundles:[],i=Fu(t),l=r.filter(C=>!sl(t,C)),d=s.filter(C=>!Iu(t,C)),u=[...l.map(C=>({kind:"report",identifier:C})),...d.map(C=>({kind:"bundle",identifier:C}))],f=r.length-l.length,p=s.length-d.length,h=f+p,b=Math.max(0,i-h);if(i===0&&u.length===0)return g;let m=b>0,y=u.length>0,v=[i>0?`${i} in cloud`:null,u.length>0?`${u.length} local-only`:null,b>0?`click "cloud" to download ${b}`:null,u.length>0?`click "local" to upload ${u.length}`:null].filter(Boolean).join(" \u2014 "),w=i===0?g:m?c`<button type="button" class="sync-badge-chunk cloud" aria-label="${`${b} remote items not yet downloaded \u2014 open download dialog`}" @click="${C=>{C.stopPropagation(),rw({workspaceId:t,localFileNames:r,localBundles:s})}}">${Ul()}<span>${i} cloud</span></button>`:c`<span class="sync-badge-chunk cloud" aria-label="${`${i} items in remote`}">${Ul()}<span>${i} cloud</span></span>`,x=u.length===0?g:c`<button type="button" class="sync-badge-chunk local" aria-label="${`${u.length} items not yet uploaded \u2014 open upload dialog`}" @click="${C=>{C.stopPropagation(),vf({workspaceId:t,items:u})}}">${Cf()}<span>${u.length} local</span></button>`,S=i>0&&u.length>0?c`<span class="sync-badge-divider" aria-hidden="true"></span>`:g;return c`<div class="${`report-sync-badge${m||y?" report-sync-badge-clickable":""}`}" data-status="mixed" title="${v}">${w}${S}${x}</div>`}function tw({status:e,label:t,title:r,onClick:n}){let o=e==="cloud"?Ul():Cf(),s=c`<span class="sync-badge-label">${t}</span>`;return typeof n!="function"?c`<span class="report-sync-badge" data-status="${e}" title="${r}" aria-label="${`report sync status: ${t}`}">${o}${s}</span>`:c`<button type="button" class="report-sync-badge report-sync-badge-clickable" data-status="${e}" title="${r}" aria-label="${`report sync status: ${t}`}" @click="${n}">${o}${s}</button>`}function Cf(){return c`<svg class="sync-badge-icon" viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="2" y="14" width="20" height="8" rx="2" ry="2"/><line x1="6" y1="18" x2="6.01" y2="18"/><line x1="10" y1="18" x2="10.01" y2="18"/><path d="M6 14V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v10"/></svg>`}function Ul(){return c`<svg class="sync-badge-icon" viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M17.5 19a4.5 4.5 0 1 0-1-8.9A6 6 0 0 0 5.07 13.5 4 4 0 0 0 6 21h11.5z"/></svg>`}async function vf({workspaceId:e,items:t}){let r=t.filter(n=>n.kind==="bundle");if(r.length>0){let n=await lt(),o=new Map(n.map(s=>[s.integrity,s.name]));for(let s of r){let i=o.get(s.identifier);i&&(s.label=i)}}await bf({workspaceId:e,items:t})}async function rw({workspaceId:e,localFileNames:t,localBundles:r}){let[n,o]=await Promise.all([Hu(e),Vu(e)]),s=new Set(t),i=new Set(r),l=[...n.filter(d=>!s.has(d)).map(d=>({kind:"report",identifier:d})),...o.filter(d=>!i.has(d)).map(d=>{let u=Ru(e,d);return u?{kind:"bundle",identifier:d,label:u}:{kind:"bundle",identifier:d}})];await yf({workspaceId:e,items:l})}function nw(){if(a.currentWorkspace)return{mode:"workspace",workspaceId:a.currentWorkspace,fileNames:a.reports.map(e=>e.fileName).filter(e=>typeof e=="string")};if(a.currentFile){let e=U().find(t=>Array.isArray(t.reports)&&t.reports.includes(a.currentFile));return e?{mode:"single",workspaceId:e.id,fileNames:[a.currentFile]}:null}return null}function ow(e){return Object.values(e).some(r=>r>0)||a.filterSeverities.size>0?c`<severity-chips counts="${JSON.stringify(e)}" selected="${JSON.stringify([...a.filterSeverities])}"></severity-chips>`:g}function sw(e){return Object.values(e).some(r=>r>0)||a.filterColors.size>0?c`<triage-filter counts="${JSON.stringify(e)}" selected="${JSON.stringify([...a.filterColors])}"></triage-filter>`:g}function iw(e){let t=["fixed","invalid","deleted","ignored"];return t.reduce((n,o)=>n+(e[o]??0),0)===0&&!a.shownTriage?g:c`<div class="triage-selector" role="group" aria-label="Triage view">${t.map(n=>{let o=e[n]??0,s=a.shownTriage===n;return o===0&&!s?g:c`<button type="button" class="${B({"triage-state-btn":!0,[`triage-state-${n}`]:!0,active:s})}" data-triage-show="${n}" title="${s?`Exit ${n} view`:`Show ${n} (${o})`}" aria-pressed="${String(s)}">${n.charAt(0).toUpperCase()+n.slice(1)} (${o})</button>`})}</div>`}function aw(e,t,r,n,o,s,i){let{showSource:l,showConfidence:d,showPriority:u,showGraphMode:f,showFileSort:p,kanbanMode:h}=s,b=f?"table,list,grouped,focus,kanban,graph":"table,list,grouped,focus,kanban",m=(v,w)=>c`<option value="${v}" ?selected="${a.sortBy===v}">${w}</option>`,y=(v,w)=>c`<button type="button" class="${B({"source-chip":!0,active:a.filterSources.has(v)})}" data-source-toggle="${v}" aria-pressed="${String(a.filterSources.has(v))}">${w}</button>`;return c`<div class="toolbar"><div class="toolbar-row"><view-mode-buttons mode="${a.viewMode}" modes="${b}"></view-mode-buttons><span class="sort-wrapper"><select id="sort-select" class="sort-select" aria-label="Sort findings">${m("severity","Severity \u2193")} ${p?m("file","File \u2191"):g} ${d?c`${m("confidence-desc","Confidence \u2193")}${m("confidence-asc","Confidence \u2191")}`:g} ${u?c`${m("priority-desc","Priority \u2193")}${m("priority-asc","Priority \u2191")}`:g}</select> </span>${l?c`<div class="sep"></div><div class="source-toggle" role="group" aria-label="Source filter">${y("own","Sources")} ${y("modules","Dependencies")}</div>`:g} ${d?c`<div class="sep"></div><div class="conf-filter"><span class="conf-range-label">Confidence</span><range-slider id="conf-range" min="0" max="10" step="1" low="${a.filterConfMin}" high="${a.filterConfMax}" aria-label="Confidence range"></range-slider><conf-range-mirror id="conf-range-vals" class="conf-vals" for="conf-range" .low="${a.filterConfMin}" .high="${a.filterConfMax}"></conf-range-mirror></div>`:g} ${h?g:iw(r)}</div><div class="toolbar-row sev-row">${ow(n)} ${i.length>1?c`<span class="sort-wrapper"><select id="analyzer-select" class="sort-select" aria-label="Filter by analyzer" .value="${je(a.filterAnalyzer)}"><option value="">All analyzers</option>${i.map(v=>c`<option value="${v??Fs}">${Jy(v)}</option>`)}</select></span>`:g} ${sw(o)}<div class="search-row"><div class="toolbar-search"><svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="m20 20-3.5-3.5"/></svg> <input type="text" id="filter-search" .value="${je(a.filterInclude)}" placeholder="Search findings…"></div><span class="result-count">${e} of ${t}</span></div></div></div>`}var go=null,kf=0,Qt=null,Qs=new Map;function mo(e,t=!1,r=null){let n=Xr(e);return Qs.set(n,{group:e,inGroup:t}),t?r?c`<finding-card data-gid="${n}" in-group context="${r}"></finding-card>`:c`<finding-card data-gid="${n}" in-group></finding-card>`:r?c`<finding-card data-gid="${n}" context="${r}"></finding-card>`:c`<finding-card data-gid="${n}"></finding-card>`}var lw={critical:"C",high:"H",medium:"M",low:"L",high_bug:"H",bug:"B",informational:"i"};function $f(e,t={}){let{variant:r="kanban",active:n=!1}=t,o=me(e),s=Ae(e),i=hl(et(s.description,s))||"(untitled finding)",l=r==="kanban",d={"kanban-card":!0,"has-conflict":o.hasConflict,"focus-side-card":!l,active:!l&&n};!o.hasConflict&&o.commonColor&&(d[`mark-${o.commonColor}`]=!0);let u=parseInt(s.line,10),f=Number.isFinite(u)?`:${u}`:"",p=lw[s.severity]??"?",h=c`<span class="${`kanban-badge sev-${s.severity}`}" title="${Jr(s.severity)}" aria-label="${Jr(s.severity)}">${p}</span> <span class="kanban-title">${i}</span><div class="kanban-meta"><span class="kanban-loc">${s.file}${f}</span> ${s.confidence===void 0||s.confidence===null?g:c`<span class="kanban-conf" title="${`Confidence ${s.confidence}/10`}">${s.confidence}</span>`}</div>`;return l?c`<div class="${B(d)}" data-gid="${Te(e)}" data-kanban-source draggable="true" role="button" tabindex="0" aria-label="${`Open details for ${i}`}">${h}</div>`:c`<div class="${B(d)}" data-gid="${Te(e)}" data-focus-select role="button" tabindex="0" aria-current="${n?"true":"false"}" aria-label="${`Focus on ${i}`}">${h}</div>`}function cw(e){let{content:t,line:r,highlighted:n}=e,o=t.split(`
47
- `).length,s=String(o).length;return c`<div class="focus-code-lines" style="${ye({"--lineno-width":`${s}ch`})}"><aside class="focus-code-gutter" aria-hidden="true">${Array.from({length:o},(i,l)=>{let d=l+1;return c`<div class="${B({"focus-code-lineno":!0,"focus-code-line-active":d===r})}" data-focus-code-line="${d}">${d}</div>`})}</aside><pre class="focus-code-source"><code>${typeof n=="string"?ue(n):t}</code></pre></div>`}function dw(e){if(!e)return g;let t=me(e),r={"kanban-detail-modal":!0,"has-conflict":t.hasConflict};return!t.hasConflict&&t.commonColor&&(r[`mark-${t.commonColor}`]=!0),c`<div class="kanban-detail-backdrop"><div class="kanban-detail-dim"></div><div class="${B(r)}" role="dialog" aria-modal="true"><button type="button" class="kanban-detail-close" title="Close details" aria-label="Close details">×</button><div class="kanban-detail-body">${mo(e)}</div></div></div>`}function uw(e){if(a.viewMode==="table"){let r=a.sortBy==="file"?[...e].toSorted((s,i)=>{let l=Ne(s),d=Ne(i);return l.file.localeCompare(d.file)||parseInt(l.line,10)-parseInt(d.line,10)}):e;if(r.length===0)return g;let n=a.tableSelectedGid?r.find(s=>Te(s)===a.tableSelectedGid):null;return go=r,c`<div class="${n?"findings-table-layout open":"findings-table-layout"}"><div class="findings-table-list"><div class="finding-table-slot"></div></div>${n?c`<aside class="findings-table-details" id="findings-table-details"><header class="findings-table-details-bar"><span class="findings-table-details-label">Details</span> <button type="button" class="findings-table-details-close" data-table-deselect title="Close details" aria-label="Close details">×</button></header><div class="findings-table-details-body">${mo(n)}</div></aside>`:g}</div>`}if(a.viewMode==="focus"){if(e.length===0)return g;let r=a.focusGid?e.findIndex(d=>Te(d)===a.focusGid):-1;r<0&&(r=Math.min(kf,e.length-1),r<0&&(r=0)),kf=r;let n=e[r];a.focusCodeTick;let o=mf(n),s=o?"focus-main with-code":"focus-main",i=r===0,l=r===e.length-1;return c`<div class="focus-view"><div class="${s}"><div class="focus-pane focus-pane-card"><div class="focus-card-wrapper">${mo(n,!1,"focus")}</div></div>${o?c`<div class="focus-pane focus-pane-code">${o.loading?c`<div class="focus-code-empty">Loading source…</div>`:c`<header class="focus-code-bar" title="${o.file}"><span class="focus-code-file">${o.file}</span> ${o.line?c`<span class="focus-code-line">:${o.line}</span>`:g}</header><div class="focus-code-body">${cw(o)}</div>`}</div>`:g}</div><aside class="focus-sidebar" aria-label="Up next"><div class="focus-sidebar-header"><span class="label">Up next</span><div class="focus-nav"><button type="button" class="focus-nav-btn" data-focus-nav="prev" ?disabled="${i}" title="Previous finding (←)" aria-label="Previous finding"><svg viewBox="0 0 16 16" width="12" height="12" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 3 5 8l5 5"/></svg></button> <span class="count">${r+1} / ${e.length}</span> <button type="button" class="focus-nav-btn" data-focus-nav="next" ?disabled="${l}" title="Next finding (→)" aria-label="Next finding"><svg viewBox="0 0 16 16" width="12" height="12" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 3 11 8l-5 5"/></svg></button></div></div><div class="focus-sidebar-body">${J(e,d=>Te(d),d=>$f(d,{variant:"focus",active:Te(d)===Te(n)}))}</div></aside></div>`}if(a.viewMode==="kanban"){let r=[{key:"untriaged",label:"Untriaged",target:"untriaged"},{key:"fixed",label:"Fixed",target:"fixed"},{key:"invalid",label:"Invalid",target:"invalid"},{key:"deleted",label:"Deleted",target:"deleted"},{key:"ignored",label:"Ignored",target:"ignored"}],n=new Map(r.map(s=>[s.key,[]]));for(let s of e){let l=me(s).commonTriage??"untriaged",d=n.get(l);d&&d.push(s)}let o=a.kanbanPopoverGid?e.find(s=>Te(s)===a.kanbanPopoverGid):null;return c`<div class="kanban-board">${J(r,s=>s.key,s=>{let i=n.get(s.key);return c`<div class="${`kanban-column kanban-column-${s.key}`}" data-kanban-target="${s.target}"><div class="kanban-column-header"><span class="label">${s.label}</span> <span class="count">${i.length}</span></div><div class="kanban-column-body">${i.length===0?c`<div class="kanban-empty">No ${s.label.toLowerCase()} findings.</div>`:J(i,l=>Te(l),l=>$f(l))}</div></div>`})}</div>${dw(o)}`}if(a.viewMode==="grouped"){let r=new Map;for(let o of e){let s=Ne(o).file;r.has(s)||r.set(s,[]),r.get(s).push(o)}let n=a.sortBy==="file"?[...r.keys()].toSorted():[...r.keys()];return c`${J(n,o=>o,o=>{let s=a.sortBy==="file"?r.get(o).toSorted((l,d)=>parseInt(Ne(l).line,10)-parseInt(Ne(d).line,10)):r.get(o),i=Ne(s[0]);return c`<div class="file-group"><div class="file-header"><span>${ul(o,i?.repo?.github,i?._repoFallback??a.repoUrl)}</span> <span class="count">${s.length}</span></div><div class="file-body">${J(s,l=>Xr(l),l=>mo(l))}</div></div>`})}`}let t=a.sortBy==="file"?[...e].toSorted((r,n)=>{let o=Ne(r),s=Ne(n);return o.file.localeCompare(s.file)||parseInt(o.line,10)-parseInt(s.line,10)}):e;return c`${J(t,r=>Xr(r),r=>{let n=Ae(r),o=rp(n.file,n.line,n.repo?.github,n._repoFallback??a.repoUrl),s=mr(n),i=gr(n),l=r.length>1;return c`<div class="${B({"flat-group":!0,"multi-case":l})}"><div class="flat-group-loc"><span class="file">${ul(n.file,n.repo?.github,n._repoFallback??a.repoUrl)}</span> ${o===g?g:c`<span class="line-num">${o}</span>`} ${i?c`<span class="meta">${i}</span>`:g} ${s?c`<span class="run-meta">${s}</span>`:g}</div>${mo(r,!0)}</div>`})}`}function pw(){let e=document.querySelector("#bundle-source-overlay-slot");e&&H(af(),e)}var xf=null;function k(){let e=xf;if(xf=a.currentView,e!==null&&e!==a.currentView&&typeof document.startViewTransition=="function"&&!matchMedia("(prefers-reduced-motion: reduce)").matches){document.startViewTransition(()=>_f());return}_f()}function _f(){if(pw(),Zu(a.reports),document.body.classList.toggle("show-print-btn",a.reports.length>0&&a.currentView==="findings"&&a.viewMode!=="graph"&&a.viewMode!=="kanban"),a.currentView==="bundles")if((a.bundles??[]).length===0)a.currentView="findings";else{let _=document.querySelector("#bundles-slot");if((!_||!A.contains(_)||A.firstElementChild!==_)&&(A.innerHTML='<div id="bundles-slot"></div>',_=document.querySelector("#bundles-slot")),_&&H(df(a.bundles),_),a.selectedBundle&&a.bundleDetailsTab==="graph"&&a.bundleDetails&&(a.bundleDetails.json||a.bundleDetails.bundle)){let R=document.querySelector("#bundle-graph-slot");if(R){let pe=rf(a.bundleDetails);if(pe){nf(pe);let Se=!pe.hasEdges,gi=tf(a.bundleDetails),mi={hideAllFiles:Se,triageCounts:gi,triageStates:["fixed","invalid","deleted"],shownTriage:a.shownTriage};yl(R,pe,mi,Js,Xs)}}}if(a.selectedBundle&&a.bundleDetailsTab==="terminal"&&a.bundleDetails&&(a.bundleDetails.json||a.bundleDetails.bundle)){let R=document.querySelector("#bundle-terminal-slot");R&&kp(R,a.bundleDetails)}A.classList.add("active"),Ee.classList.add("hidden"),document.title="DeepView \u2014 bundles";return}if(a.currentView==="packages"){let _=document.querySelector("#packages-slot");(!_||!A.contains(_)||A.firstElementChild!==_)&&(A.innerHTML='<div id="packages-slot"></div>',_=document.querySelector("#packages-slot")),_&&H(uf(),_),A.classList.add("active"),Ee.classList.add("hidden"),document.title="DeepView \u2014 packages";return}if(a.currentView==="repositories"){let _=document.querySelector("#repositories-slot");(!_||!A.contains(_)||A.firstElementChild!==_)&&(A.innerHTML='<div id="repositories-slot"></div>',_=document.querySelector("#repositories-slot")),_&&H(hf(),_),A.classList.add("active"),Ee.classList.add("hidden"),document.title="DeepView \u2014 repositories";return}if(a.reports.length===0)return;let e=a.reports.flatMap(_=>_.groups),t={fixed:0,invalid:0,deleted:0,ignored:0};for(let _ of e){let R=me(_).commonTriage;R&&t[R]++}let r=a.viewMode==="kanban",n=r?e:e.filter(_=>me(_).commonTriage===a.shownTriage),s=[...new Set(a.reports.map(_=>_.type))].join(", "),i=a.reports.map(_=>_.fileName),l={critical:0,high:0,medium:0,low:0,high_bug:0,bug:0,informational:0},d={red:0,blue:0,green:0,gray:0,none:0};for(let _ of n){let R=new Set(_.map(Se=>Se.severity));for(let Se of R)l[Se]=(l[Se]||0)+1;let pe=new Set(_.map(Se=>a.triage.get(M(Se))?.color??"none"));for(let Se of pe)d[Se]=(d[Se]||0)+1}let u=n.length>0&&n.every(_=>_.every(R=>R.confidence!==void 0||R.critical===!0)),f=e.some(_=>_.some(R=>R.priority!==void 0)),p=e.some(_=>_.some(R=>qt(R.file))),h=new Set;for(let _ of e)for(let R of _)h.add(R.file);let b=h.size>1,m=e.some(_=>_.some(R=>!R.repo?.github&&!qt(R.file))),y=new Set;for(let _ of e)for(let R of _)!qt(R.file)&&R.repo?.github&&y.add(R.repo.github);let v=y.size===1?[...y][0]:null,w=new Set;for(let _ of e)for(let R of _)w.add(R._analyzer??null);let x=Object.keys(Sf),S=[...w].toSorted((_,R)=>{let pe=_==null?1/0:x.indexOf(_)===-1?x.length:x.indexOf(_),Se=R==null?1/0:x.indexOf(R)===-1?x.length:x.indexOf(R);return pe!==Se?pe-Se:String(_??"").localeCompare(String(R??""))});if(a.filterAnalyzer){let _=a.filterAnalyzer===Fs?null:a.filterAnalyzer;w.has(_)||(a.filterAnalyzer="")}!p&&a.filterSources.size>0&&a.filterSources.clear(),u||(a.filterConfMin=0,a.filterConfMax=10,(a.sortBy==="confidence-desc"||a.sortBy==="confidence-asc")&&(a.sortBy="severity")),!f&&(a.sortBy==="priority-desc"||a.sortBy==="priority-asc")&&(a.sortBy="severity"),!b&&a.sortBy==="file"&&(a.sortBy="severity");let C=lp(ip(n)),L=ml(a.reports),V=L?Object.keys(L).length:0,ze=V>1;!ze&&a.currentView==="files"&&(a.currentView="findings"),!ze&&a.viewMode==="graph"&&(a.viewMode="table");let ee=Zy(e.length,i,m,v,V);if(a.currentView==="files"){let _=gl(e),R=document.querySelector("#header-slot"),pe=document.querySelector("#tree-view-slot");(!R||!pe||!A.contains(R)||!A.contains(pe))&&(A.innerHTML='<div id="header-slot"></div><div id="tree-view-slot"></div>',R=document.querySelector("#header-slot"),pe=document.querySelector("#tree-view-slot")),R&&H(ee,R),pe&&H(yp(L,_),pe),A.classList.add("active"),Ee.classList.add("hidden"),document.title=`DeepView \u2014 ${s||"no analyzer"}`;return}let er=a.viewMode==="table"&&a.tableSelectedGid&&C.some(_=>Te(_)===a.tableSelectedGid),be=null;a.viewMode==="graph"&&L&&(be=zl(),be||(a.viewMode="table"));let Je=!!be,Xe="findings-content";er&&(Xe+=" with-details"),Je&&(Xe+=" with-graph"),r&&(Xe+=" with-kanban"),a.viewMode==="focus"&&(Xe+=" with-focus");let _r=g,cn=g,Sr=g;Je||(_r=aw(C.length,n.length,t,l,d,{showSource:p,showConfidence:u,showPriority:f,showGraphMode:ze,showFileSort:b,kanbanMode:r},S),a.shownTriage&&n.length===0?cn=c`<p style="color:var(--muted);margin:1rem 0">No ${a.shownTriage} findings.</p>`:C.length===0&&n.length>0?cn=c`<p style="color:var(--muted);margin:1rem 0">No findings match the current filters.</p>`:n.length===0&&(cn=e.length>0?c`<p style="color:var(--green)">All ${s} issues triaged.</p>`:c`<p style="color:var(--green)">No ${s} issues found.</p>`),go=null,Qs.clear(),Sr=uw(C));let dn=!!(Qt&&Qt.isConnected);dn&&Qt.remove();let Bt=document.querySelector("#header-slot"),$=A.querySelector(":scope > .findings-content"),j=$&&$.querySelector(":scope > #findings-graph-slot"),Y=$&&$.querySelector(":scope > #findings-body-slot"),le=$&&(j?"graph":Y?"body":null)===(Je?"graph":"body");if(!Bt||!$||!A.contains(Bt)||!A.contains($)||!le){let _=Je?'<div id="findings-graph-slot"></div>':'<div id="toolbar-slot"></div><div id="empty-state-slot"></div><div id="findings-body-slot"></div>';A.innerHTML=`<div id="header-slot"></div><div class="${Xe}">${_}</div>`,Bt=document.querySelector("#header-slot"),$=A.querySelector(":scope > .findings-content")}else $.className!==Xe&&($.className=Xe);Bt&&H(ee,Bt);let te=document.querySelector("#toolbar-slot");te&&H(_r,te);let Be=document.querySelector("#empty-state-slot");Be&&H(cn,Be);let _e=document.querySelector("#findings-body-slot");if(_e&&(go||dn)){let _=document.createElement("div");_.id="findings-body-slot",_e.replaceWith(_),_e=_}if(_e&&H(Sr,_e),be){let _=document.querySelector("#findings-graph-slot");if(_){let R=c`<view-mode-buttons mode="${a.viewMode}" modes="table,list,grouped,focus,kanban,graph"></view-mode-buttons>`,pe={fixed:0,invalid:0,deleted:0,ignored:0};for(let gi of a.reports)for(let mi of gi.groups){let Rc=me(mi).commonTriage;Rc&&pe[Rc]++}let Se={extraTopRow:R,triageCounts:pe,triageStates:["fixed","invalid","deleted","ignored"],shownTriage:a.shownTriage};yl(_,be.prep,Se,Wl,Hl)}}if(go){let _=A.querySelector(".finding-table-slot");_&&(Qt||(Qt=document.createElement("finding-table")),Qt.items=go,Qt.selectedGid=a.tableSelectedGid,_.replaceWith(Qt))}if(Qs.size>0)for(let _ of A.querySelectorAll("finding-card")){let R=Qs.get(_.dataset.gid);R&&(_.group=R.group)}A.classList.add("active"),Ee.classList.add("hidden"),document.title=`DeepView \u2014 ${s||"no analyzer"}`}function sn(e){let t=document.querySelector(`#${e}`),r=t?t.selectionStart:0;k();let n=document.querySelector(`#${e}`);n&&(n.focus(),n.setSelectionRange(r,r))}var Vl=class extends I{static styles=[...I.styles,T(Ze)];static properties={workspace:{attribute:!1},_password:{state:!0},_confirm:{state:!0},_noPassword:{state:!0},_includeBundleBytes:{state:!0},_busy:{state:!0},_error:{state:!0},_settled:{state:!0}};constructor(){super(),this.workspace=null,this._password="",this._confirm="",this._noPassword=!1,this._includeBundleBytes=!1,this._busy=!1,this._error="",this._settled=!1}_finish(t){this._settled||(this._password="",this._confirm="",this.workspace=null,super._finish(t))}_onClose=()=>this._finish(null);_onCancel=()=>this._finish(null);_onPasswordInput=t=>{this._password=t.target.value,this._error=""};_onConfirmInput=t=>{this._confirm=t.target.value,this._error=""};_onNoPasswordToggle=t=>{this._noPassword=t.target.checked,this._error="",this._noPassword&&(this._password="",this._confirm="")};_onIncludeBundleBytesToggle=t=>{this._includeBundleBytes=t.target.checked,this._error=""};_canExport(){return this._busy?!1:this._noPassword?!0:(this._password??"").length>0&&this._password===this._confirm}_onExport=async()=>{if(this._canExport()){if(!this.workspace){this._error="No workspace selected.";return}this._busy=!0,this._error="";try{let{blob:t,filename:r}=await Xa(this.workspace,{password:this._noPassword?void 0:this._password,includeBundleBytes:this._includeBundleBytes});if(this._settled)return;Ar(t,r),this._finish({ok:!0})}catch(t){if(this._settled)return;this._error=t?.message??String(t)}finally{this._busy=!1}}};_onKeydown=t=>{t.key==="Enter"&&(t.preventDefault(),this._onExport())};_body(){let t=!this._password||!this._confirm||this._password===this._confirm,r=Array.isArray(this.workspace?.bundles)?this.workspace.bundles.length:0;return c`<p class="nwd-note">The export file carries this workspace's reports, triage state, comments, fixes, references to attached bundles (integrities only by default), and its private key. Encrypting the file with a password ensures only those with the password can attach the workspace after download.</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-export-pw" maxlength="1024" ?disabled="${this._noPassword}" .value="${this._password}" @input="${this._onPasswordInput}" @keydown="${this._onKeydown}"></label> <label class="wsl-field"><span>Confirm 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-export-pw-confirm" maxlength="1024" ?disabled="${this._noPassword}" .value="${this._confirm}" @input="${this._onConfirmInput}" @keydown="${this._onKeydown}"></label> <label class="wsl-optout"><input type="checkbox" .checked="${this._noPassword}" @change="${this._onNoPasswordToggle}"> <span>Export without password (not recommended)</span></label> ${r>0?c`<label class="wsl-optout"><input type="checkbox" .checked="${this._includeBundleBytes}" @change="${this._onIncludeBundleBytesToggle}"> <span>Include bundle bytes (${r} bundle${r===1?"":"s"}; significantly larger file)</span></label>`:g} ${this._noPassword?c`<p class="wsl-error wsl-warning">Anyone who obtains this file can attach the workspace and read every report, triage decision, comment, and fix. Only opt out when you control where the file goes.</p>`:g} ${this._error?c`<p class="wsl-error" role="alert">${this._error}</p>`:g} ${!this._noPassword&&!t?c`<p class="wsl-error" role="alert">Passwords don't match.</p>`:g}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" ?disabled="${!this._canExport()}" @click="${this._onExport}">${this._busy?"Exporting\u2026":this._noPassword?"Export without password":"Export"}</button></footer>`}render(){return c`<dialog @close="${this._onClose}"><header><h3>Export workspace</h3></header>${this._body()}</dialog>`}};customElements.define("workspace-export-dialog",Vl);function Ef({workspace:e}={}){return new Promise((t,r)=>{let n=document.createElement("workspace-export-dialog");n.workspace=e??null,n.addEventListener("resolve",o=>{n.remove(),t(o.detail)}),n.addEventListener("modal-conflict",o=>{n.workspace=null,n.remove(),r(pt(o.detail?.cause))}),document.body.append(n)})}async function Tf(e){await Ef({workspace:e})}var jl=class extends I{static properties={_value:{state:!0}};constructor(){super(),this._value=""}_onInput=t=>{this._value=t.target.value};_onCreate=()=>{let t=(this._value??"").trim();t&&this._finish(t)};_onCancel=()=>this._finish(null);_onKeydown=t=>{t.key==="Enter"&&(t.preventDefault(),this._onCreate())};render(){let t=(this._value??"").trim().length>0;return c`<dialog @close="${this._onClose}"><header><h3>New workspace</h3></header><input type="text" class="nwd-input" placeholder="Workspace name" maxlength="200" .value="${this._value}" @input="${this._onInput}" @keydown="${this._onKeydown}"><p class="nwd-note">Workspace triage is synchronized by default over an end-to-end encrypted channel. Triage on unattached reports stays local to this browser.</p><footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" ?disabled="${!t}" @click="${this._onCreate}">Create</button></footer></dialog>`}};customElements.define("new-workspace-dialog",jl);function Af(){return K("new-workspace-dialog")}var Kl=class extends I{static styles=[...I.styles,T(Ie)];static properties={workspaceName:{type:String},reportCount:{type:Number},bundleCount:{type:Number},orphanedTriage:{type:Number},sharedTriage:{type:Number},_mode:{state:!0},_triage:{state:!0},_settled:{state:!0}};constructor(){super(),this.workspaceName="",this.reportCount=0,this.bundleCount=0,this.orphanedTriage=0,this.sharedTriage=0,this._mode="detach",this._triage="keep",this._settled=!1}focusInitial(){this.renderRoot.querySelector('button[data-role="cancel"]')?.focus()}_finish(t){if(this._settled)return;let r=this.reportCount>0?this._mode:"detach",n=r==="delete"&&this.orphanedTriage>0?this._triage:"keep";super._finish({confirmed:!!t,mode:r,triage:n})}_onClose=()=>this._finish(!1);_onCancel=()=>this._finish(!1);_onConfirm=()=>this._finish(!0);_onModeChange=t=>{this._mode=t.target.value};_onTriageChange=t=>{this._triage=t.target.value};_triageSection(){if(this._mode!=="delete"||this.reportCount===0)return"";let t=this.orphanedTriage,r=this.sharedTriage;return t===0&&r===0?c`<p class="lwd-note">No local triage is attached to ${this.reportCount===1?"this report":"these reports"}.</p>`:t===0?c`<p class="lwd-note">Local triage on ${this.reportCount===1?"this report":"these reports"} is also attached to ${r===1?"a report":"reports"} you're keeping. Nothing will be orphaned.</p>`:c`<fieldset class="lwd-choice"><legend><strong>${t}</strong> ${t===1?"triage entry won't":"triage entries won't"} be reachable from any remaining report. What should happen ${t===1?"to it":"to them"}?</legend><label class="lwd-option"><input type="radio" name="lwd-triage" value="keep" ?checked="${this._triage==="keep"}" @change="${this._onTriageChange}"> <span class="lwd-option-text"><span class="lwd-option-title">Keep</span> <span class="lwd-option-hint">Reapplied automatically if a matching report is imported later.</span></span></label> <label class="lwd-option"><input type="radio" name="lwd-triage" value="wipe" ?checked="${this._triage==="wipe"}" @change="${this._onTriageChange}"> <span class="lwd-option-text"><span class="lwd-option-title">Wipe</span> <span class="lwd-option-hint">Drop the orphaned triage from this browser.</span></span></label></fieldset>`}render(){let t=this.reportCount,r=this.bundleCount,n=t>0,o=t===1?"report":"reports",s=t===1?"it":"them",i=t===1?"stays":"stay",l=t===1?"is removed":"are removed",d=r>0?c`<p class="lwd-note">${r===1?"One bundle is":`${r} bundles are`} also attached. ${r===1?"It":"They"} will become unfiled — the bundle bytes stay on this device either way (delete bundles manually from the Bundles list if you want them gone).</p>`:"",u=n?c`<fieldset class="lwd-choice"><legend>What should happen to the <strong>${t}</strong> attached ${o}?</legend><label class="lwd-option"><input type="radio" name="lwd-mode" value="detach" ?checked="${this._mode==="detach"}" @change="${this._onModeChange}"> <span class="lwd-option-text"><span class="lwd-option-title">Move ${s} out of the workspace</span> <span class="lwd-option-hint">The ${o} ${i} in this browser as unattached ${o}.</span></span></label> <label class="lwd-option"><input type="radio" name="lwd-mode" value="delete" ?checked="${this._mode==="delete"}" @change="${this._onModeChange}"> <span class="lwd-option-text"><span class="lwd-option-title">Delete ${s} along with the workspace</span> <span class="lwd-option-hint">The ${o} ${l} from this browser.</span></span></label></fieldset>`:r>0?c`<p class="lwd-empty">No reports are attached to this workspace (only bundles, see below).</p>`:c`<p class="lwd-empty">No reports are attached to this workspace.</p>`;return c`<dialog @close="${this._onClose}"><header><h3>Leave workspace</h3></header><p class="lwd-body">Leave workspace <strong>"${this.workspaceName}"</strong> on this device?</p>${u} ${d} ${this._triageSection()}<ul class="lwd-list"><li>Workspace synchronization data stays on the sync server — peers (and your other devices) keep their copy.</li></ul><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}">Leave</button></footer></dialog>`}};customElements.define("leave-workspace-dialog",Kl);function If({name:e,reportCount:t,bundleCount:r,triageImpact:n}={}){return K("leave-workspace-dialog",{workspaceName:e??"",reportCount:t??0,bundleCount:r??0,orphanedTriage:n?.orphanedCount??0,sharedTriage:n?.sharedCount??0})}var ql=class extends I{static styles=[...I.styles,T(Ze)];static properties={workspaceId:{type:String},initialName:{type:String},privateKeyBase64:{type:String},_name:{state:!0},_password:{state:!0},_confirm:{state:!0},_url:{state:!0},_busy:{state:!0},_error:{state:!0},_copied:{state:!0},_settled:{state:!0}};constructor(){super(),this.workspaceId="",this.initialName="",this.privateKeyBase64="",this._name="",this._password="",this._confirm="",this._url="",this._busy=!1,this._error="",this._copied=!1,this._settled=!1}beforeOpen(){this._name=this.initialName}focusInitial(){this.renderRoot.querySelector('input[data-role="name"]')?.focus()}_finish(){this._settled||(this._copiedTimer&&(clearTimeout(this._copiedTimer),this._copiedTimer=null),this._password="",this._confirm="",this._url="",this.privateKeyBase64="",super._finish(null))}_onClose=()=>this._finish();_onCancel=()=>this._finish();_onNameInput=t=>{this._name=t.target.value};_onPasswordInput=t=>{this._password=t.target.value,this._error=""};_onConfirmInput=t=>{this._confirm=t.target.value,this._error=""};_canGenerate(){return(this._name??"").trim().length>0&&(this._password??"").length>0&&this._password===this._confirm&&!this._busy}_onGenerate=async()=>{if(this._canGenerate()){this._busy=!0,this._error="";try{let t=await el({id:this.workspaceId,name:this._name.trim(),privateKeyBase64:this.privateKeyBase64,password:this._password});if(this._settled)return;this._url=rl(t),this._password="",this._confirm=""}catch(t){if(this._settled)return;this._error=t?.message??String(t)}finally{this._busy=!1}}};_onCopy=async()=>{if(this._url){this._error="";try{if(await navigator.clipboard.writeText(this._url),this._settled)return;this._copied=!0,this._copiedTimer&&clearTimeout(this._copiedTimer),this._copiedTimer=setTimeout(()=>{this._copied=!1,this._copiedTimer=null},1500)}catch{if(this._settled)return;this._error="Copy failed \u2014 select the link and copy it manually."}}};_onKeydown=t=>{t.key==="Enter"&&!this._url&&(t.preventDefault(),this._onGenerate())};_body(){return this._url?c`<p class="nwd-note">Anyone with the link <strong>and</strong> the password can attach this workspace. Share them through separate channels.</p><label class="wsl-field"><span>Share link</span> <textarea class="wsl-link" readonly="readonly" rows="3" @focus="${t=>t.target.select()}">${this._url}</textarea></label> ${this._error?c`<p class="wsl-error" role="alert">${this._error}</p>`:g}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">Close</button> <button type="button" class="primary" @click="${this._onCopy}">${this._copied?"Copied":"Copy link"}</button></footer>`:c`<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> <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-pw" maxlength="1024" .value="${this._password}" @input="${this._onPasswordInput}" @keydown="${this._onKeydown}"></label> <label class="wsl-field"><span>Confirm 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-pw-confirm" maxlength="1024" .value="${this._confirm}" @input="${this._onConfirmInput}" @keydown="${this._onKeydown}"></label><p class="nwd-note">The link carries the workspace's identity (id, name, and private key) so the recipient joins the same sync chain. Triage, reports, and comments are not included. The link decrypts with the password above; without it the link is useless.</p>${this._error?c`<p class="wsl-error" role="alert">${this._error}</p>`:g} ${this._password&&this._confirm&&this._password!==this._confirm?c`<p class="wsl-error" role="alert">Passwords don't match.</p>`:g}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" ?disabled="${!this._canGenerate()}" @click="${this._onGenerate}">${this._busy?"Generating\u2026":"Generate link"}</button></footer>`}render(){return c`<dialog @close="${this._onClose}"><header><h3>${this._url?"Workspace share link":"Share workspace by link"}</h3></header>${this._body()}</dialog>`}};customElements.define("workspace-share-link-dialog",ql);function Bf({id:e,name:t,privateKeyBase64:r}={}){return new Promise((n,o)=>{let s=document.createElement("workspace-share-link-dialog");s.workspaceId=e??"",s.initialName=t??"",s.privateKeyBase64=r??"",s.addEventListener("resolve",()=>{s.remove(),n()}),s.addEventListener("modal-conflict",i=>{s.privateKeyBase64="",s.remove(),o(pt(i.detail?.cause))}),document.body.append(s)})}var Gl=class extends I{static styles=[...I.styles,T(Ie)];static properties={reportName:{type:String},orphanedTriage:{type:Number},sharedTriage:{type:Number},inRemote:{type:Boolean},_triage:{state:!0}};constructor(){super(),this.reportName="",this.orphanedTriage=0,this.sharedTriage=0,this.inRemote=!1,this._triage="keep"}focusInitial(){this.renderRoot.querySelector('button[data-role="cancel"]')?.focus()}_finish(t){if(this._settled)return;let r=this.orphanedTriage>0?this._triage:"keep";super._finish({confirmed:!!t,triage:r})}_onClose=()=>this._finish(!1);_onCancel=()=>this._finish(!1);_onConfirm=()=>this._finish(!0);_onTriageChange=t=>{this._triage=t.target.value};_remoteNotice(){return this.inRemote?c`<p class="lwd-note">This report is also stored in the workspace's <strong>remote</strong> inventory and will be removed from there too. Newly synced workspace members won't see it; members who already downloaded it keep their local copy (and could re-upload).</p>`:g}_triageSection(){let t=this.orphanedTriage,r=this.sharedTriage;return t===0&&r===0?c`<p class="lwd-note">No local triage is attached to this report.</p>`:t===0?c`<p class="lwd-note">Local triage on this report is also attached to ${r===1?"a report":"reports"} you're keeping. Nothing will be orphaned.</p>`:c`<fieldset class="lwd-choice"><legend><strong>${t}</strong> ${t===1?"triage entry won't":"triage entries won't"} be reachable from any remaining report. What should happen ${t===1?"to it":"to them"}?</legend><label class="lwd-option"><input type="radio" name="drd-triage" value="keep" ?checked="${this._triage==="keep"}" @change="${this._onTriageChange}"> <span class="lwd-option-text"><span class="lwd-option-title">Keep</span> <span class="lwd-option-hint">Reapplied automatically if a matching report is imported later.</span></span></label> <label class="lwd-option"><input type="radio" name="drd-triage" value="wipe" ?checked="${this._triage==="wipe"}" @change="${this._onTriageChange}"> <span class="lwd-option-text"><span class="lwd-option-title">Wipe</span> <span class="lwd-option-hint">Drop the orphaned triage from this browser.</span></span></label></fieldset>`}render(){return c`<dialog @close="${this._onClose}"><header><h3>Delete report</h3></header><p class="lwd-body">Delete <strong>"${this.reportName}"</strong>?</p>${this._remoteNotice()} ${this._triageSection()}<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}">Delete</button></footer></dialog>`}};customElements.define("delete-report-dialog",Gl);function Ff({name:e,triageImpact:t,inRemote:r}={}){return K("delete-report-dialog",{reportName:e??"",orphanedTriage:t?.orphanedCount??0,sharedTriage:t?.sharedCount??0,inRemote:!!r})}var Yl=class extends I{static styles=[...I.styles,T(Ie)];static properties={bundleName:{type:String},inRemote:{type:Boolean}};constructor(){super(),this.bundleName="",this.inRemote=!1}focusInitial(){this.renderRoot.querySelector('button[data-role="cancel"]')?.focus()}_finish(t){this._settled||super._finish({confirmed:!!t})}_onClose=()=>this._finish(!1);_onCancel=()=>this._finish(!1);_onConfirm=()=>this._finish(!0);_remoteNotice(){return this.inRemote?c`<p class="lwd-note">This bundle is also stored in the workspace's <strong>remote</strong> inventory and will be removed from there too. Newly synced workspace members won't see it; members who already downloaded it keep their local copy (and could re-upload).</p>`:g}render(){return c`<dialog @close="${this._onClose}"><header><h3>Delete bundle</h3></header><p class="lwd-body">Delete <strong>"${this.bundleName}"</strong>?</p>${this._remoteNotice()}<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}">Delete</button></footer></dialog>`}};customElements.define("delete-bundle-dialog",Yl);function Rf({name:e,inRemote:t}={}){return K("delete-bundle-dialog",{bundleName:e??"",inRemote:!!t})}var Jl=class extends I{static styles=[...I.styles,T(Ie)];static properties={bundleName:{type:String},workspaceName:{type:String}};constructor(){super(),this.bundleName="",this.workspaceName=""}focusInitial(){this.renderRoot.querySelector('button[data-role="cancel"]')?.focus()}_finish(t){this._settled||super._finish({confirmed:!!t})}_onClose=()=>this._finish(!1);_onCancel=()=>this._finish(!1);_onConfirm=()=>this._finish(!0);render(){return c`<dialog @close="${this._onClose}"><header><h3>Detach bundle</h3></header><p class="lwd-body">Detach <strong>"${this.bundleName}"</strong> from workspace <strong>"${this.workspaceName}"</strong>?</p><p class="lwd-note">This bundle is also stored in the workspace's <strong>remote</strong> inventory and will be removed from there too. Newly synced workspace members won't see it; members who already downloaded it keep their local copy (and could re-upload). The bundle bytes stay on this device — drop it onto another workspace to attach it there.</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}">Detach</button></footer></dialog>`}};customElements.define("detach-bundle-dialog",Jl);function Mf({name:e,workspaceName:t}={}){return K("detach-bundle-dialog",{bundleName:e??"",workspaceName:t??""})}var Xl=class extends I{static styles=[...I.styles,T(Ie)];static properties={reportName:{type:String},workspaceName:{type:String}};constructor(){super(),this.reportName="",this.workspaceName=""}focusInitial(){this.renderRoot.querySelector('button[data-role="cancel"]')?.focus()}_finish(t){this._settled||super._finish({confirmed:!!t})}_onClose=()=>this._finish(!1);_onCancel=()=>this._finish(!1);_onConfirm=()=>this._finish(!0);render(){return c`<dialog @close="${this._onClose}"><header><h3>Detach report</h3></header><p class="lwd-body">Detach <strong>"${this.reportName}"</strong> from workspace <strong>"${this.workspaceName}"</strong>?</p><p class="lwd-note">This report is also stored in the workspace's <strong>remote</strong> inventory and will be removed from there too. Newly synced workspace members won't see it; members who already downloaded it keep their local copy (and could re-upload). The report bytes stay on this device — drop it onto another workspace to attach it there.</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}">Detach</button></footer></dialog>`}};customElements.define("detach-report-dialog",Xl);function Lf({name:e,workspaceName:t}={}){return K("detach-report-dialog",{reportName:e??"",workspaceName:t??""})}var Ql=class extends I{focusInitial(){this.renderRoot.querySelector("button.primary")?.focus()}_onConfirm=()=>this._finish(!0);render(){return c`<dialog @close="${this._onClose}"><header><h3>Changes might not be saved</h3></header><p class="nwd-intro">Triage works in this tab, but this browser <strong>can't save its sync state right now</strong> — so changes that haven't reached the server could be lost if you reload the page.</p><p class="nwd-intro">This usually means the browser's storage is full, or another tab is running a newer version of the app (to avoid overwriting that newer version's data, this tab has paused saving).</p><p class="nwd-note">Free up space if storage is full, and close or reload other tabs of this app to the same version. This notice clears on its own once saving works again.</p><footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" class="primary" @click="${this._onConfirm}">Got it</button></footer></dialog>`}};customElements.define("persistence-degraded-dialog",Ql);function Pf(){return new Promise(e=>{let t=document.createElement("persistence-degraded-dialog"),r=n=>{t.remove(),e({shown:n})};t.addEventListener("resolve",()=>r(!0)),t.addEventListener("modal-conflict",()=>r(!1)),document.body.append(t)})}var Zt;function fw(){return Zt||(Zt=document.createElement("div"),Zt.id="styled-tooltip",document.body.append(Zt),Zt)}var kr=null,bo=null,Uf=0,zf=0,Of=!1;function hw(){Of||(Of=!0,document.addEventListener("mousemove",e=>{Uf=e.clientX,zf=e.clientY},{passive:!0}))}hw();var gw=100,mw=14,bw=8,Df=8;function yw(e,{placement:t="cursor"}={}){let r=fw();if(kr===e)return;let n=e.dataset.tooltip??"";if(n){if(r.textContent=n,t==="right"){let o=e.getBoundingClientRect();r.style.top=`${Math.round(o.top+o.height/2)}px`,r.style.left=`${Math.round(o.right+bw)}px`,r.style.transform="translateY(-50%)"}else{r.style.transform="none",r.style.top=`${zf+mw}px`,r.style.left="0px",r.classList.add("visible");let o=r.offsetWidth,s=window.innerWidth-o-Df,i=Math.max(Df,Math.min(Uf,s));r.style.left=`${Math.round(i)}px`}r.classList.add("visible"),kr=e}}function yo(){clearTimeout(bo),bo=null,Zt&&Zt.classList.remove("visible"),kr=null}function Zl(e,{gate:t,placement:r}={}){t&&!t(e)||(clearTimeout(bo),bo=setTimeout(()=>{yw(e,{placement:r})},gw))}var Nf=!1;function Wf(){Nf||(Nf=!0,document.body.addEventListener("mouseover",e=>{let t=e.target.closest("[data-tooltip]");!t||t===kr||(yo(),Zl(t))}),document.body.addEventListener("mouseout",e=>{!kr&&!bo||kr&&kr.contains(e.relatedTarget)||yo()}))}var ei=null,se=null,Zs=null;Wf();function ww(){return mt().size}function vw(){return pr().size}var wo=typeof location>"u"||location.hostname.endsWith(".github.io")?"":`${location.protocol==="https:"?"wss:":"ws:"}//${location.host}/api/sync`,oc="application/x-deepview-report",tc="application/x-deepview-source-ws",vo="application/x-deepview-bundle",ti=!1,ri=!1,kw={default:"Reports","claude-security":"Claude Security","codex-security":"Codex Security",deepsec:"DeepSec"},Hf=["default","claude-security","codex-security","deepsec"],$r="";function Vf(e,t={}){let n=`file-item${e===a.currentFile&&(a.currentView==="findings"||a.currentView==="files")?" current":""}${t.indented?" indented":""}`,o=qe(e),s=Nn(e),i=G[Ke(e)]??G.default;return c`<li class="${n}" data-file="${e}" data-workspace-id="${t.workspaceId??g}" draggable="true"><button type="button" class="file-name" data-tooltip="${o}">${ue(i)}<span class="file-label">${o}</span>${s===void 0?g:c`<span class="file-count">${s}</span>`}</button></li>`}function $w(e,t={}){let r=`file-group-header${t.dropTarget?" default-reports":""}`;return c`<li class="${r}" data-default-reports="${t.dropTarget?"true":g}"><span class="group-label">${e}</span></li>`}var xw=c`<svg viewBox="0 0 16 16" width="11" height="11" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" aria-hidden="true"><path d="M8 3.5v9M3.5 8h9"/></svg>`;function _w(){return c`<li class="file-group-header workspace-header"><span class="group-label">Workspaces</span><span class="workspace-header-actions"><button type="button" class="workspace-add" data-action="new-workspace" title="Create a new workspace" aria-label="Create a new workspace">${xw}</button></span></li>`}function jf(e,t,r){let n=se?.querySelector(e);if(!n)return;n.hidden=t===0,n.classList.toggle("active",a.currentView===r);let o=n.querySelector(".view-btn-count");o&&(o.textContent=String(t))}function Sw(){return c`<li class="file-group-header bundles-header" data-default-bundles="true"><span class="group-label">Bundles</span></li>`}var Cw=c`${ue(Zr)}`;function Kf(e,t={}){let{integrity:r,name:n}=e,o=a.selectedBundle===r&&a.currentView==="bundles",i=`file-item bundle-item${t.workspaceId!=null?" indented":""}${o?" current":""}`;return c`<li class="${i}" data-bundle-integrity="${r}" data-workspace-id="${t.workspaceId??g}" draggable="true"><button type="button" class="file-name" data-tooltip="${`${n}
48
- ${r}`}">${Cw}<span class="file-label">${n}</span></button></li>`}function Ew(e,t){let r=e.slice(0,15);return c`<li class="file-item indented bundle-item bundle-missing" data-bundle-integrity="${e}" data-workspace-id="${t}" data-tooltip="Bundle bytes not on this device — drop the matching bundle to attach."><span class="file-name"><span class="file-icon" aria-hidden="true">?</span><span class="file-label"><em>missing · ${r}…</em></span></span></li>`}var Tw=c`${ue(Ls)}`,Aw=c`<svg viewBox="0 0 16 16" width="11" height="11" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 2v8M5 7l3 3 3-3M3 13h10"/></svg>`,Iw=c`<svg viewBox="0 0 16 16" width="11" height="11" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 3H4v10h5"/><path d="M7 8h7M11 5l3 3-3 3"/></svg>`,Bw=c`<svg viewBox="0 0 16 16" width="11" height="11" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 9.5L9 7.5"/><path d="M9.5 5.5L10.5 4.5a2.1 2.1 0 1 1 3 3l-1 1"/><path d="M6.5 11.5L5.5 12.5a2.1 2.1 0 1 1-3-3l1-1"/></svg>`;function Fw(e){let r=`file-item workspace-item${a.currentWorkspace===e.id&&(a.currentView==="findings"||a.currentView==="files")?" current":""}`;return c`<li class="${r}" data-workspace-id="${e.id}"><button type="button" class="file-name">${Tw}<span class="file-label" .textContent="${e.name}"></span></button><button type="button" class="workspace-share" data-action="share-workspace" title="Share by link" aria-label="Share workspace by link">${Bw}</button><button type="button" class="workspace-export" data-action="export-workspace" title="Export workspace" aria-label="Export workspace">${Aw}</button><button type="button" class="workspace-leave" data-action="leave-workspace" title="Leave workspace" aria-label="Leave workspace">${Iw}</button></li>`}function an(e){return $r?qe(e).toLowerCase().includes($r):!0}async function W(){await Va(),Ct().catch(()=>{});let e=await ae(),t=U(),r=await lt();if(a.bundles=r,!se)return;ei.classList.remove("empty");let n=new Set(e),o=new Set;for(let p of t)for(let h of p.reports)n.has(h)&&o.add(h);let s=new Map(r.map(p=>[p.integrity,p])),i=new Set;for(let p of t)for(let h of p.bundles)s.has(h)&&i.add(h);let l=new Map;for(let p of Hf)l.set(p,[]);for(let p of e){if(o.has(p)||!an(p))continue;let h=Ke(p);l.has(h)||l.set(h,[]),l.get(h).push(p)}let d=t.filter(p=>!$r||p.name.toLowerCase().includes($r)||p.reports.some(h=>n.has(h)&&an(h))?!0:p.bundles.some(h=>{let b=s.get(h);return b&&an(b.name)})),u=r.filter(p=>!i.has(p.integrity)&&an(p.name));H(c`${_w()} ${J(d,p=>p.id,p=>{let h=p.reports.filter(y=>n.has(y)&&an(y)),b=[],m=[];for(let y of p.bundles){let v=s.get(y);v?(!$r||an(v.name))&&b.push(v):$r||m.push(y)}return c`${Fw(p)} ${h.map(y=>Vf(y,{indented:!0,workspaceId:p.id}))} ${b.map(y=>Kf(y,{workspaceId:p.id}))} ${m.map(y=>Ew(y,p.id))}`})} ${Hf.map(p=>{let h=l.get(p)??[],b=p==="default";return h.length===0&&!(b&&ti)?null:c`${$w(kw[p]??p,{dropTarget:b})} ${h.map(m=>Vf(m))}`})} ${u.length>0||ri?Sw():null} ${J(u,p=>p.integrity,p=>Kf(p))}`,Zs),jf("#show-packages-btn",ww(),"packages"),jf("#show-repositories-btn",vw(),"repositories");let f=se.querySelector("#delete-current");if(f){let p=a.currentView==="bundles"&&a.selectedBundle;f.disabled=!a.currentFile&&!p}ni(),ya(e,()=>{W()})}he(()=>{W()});async function Rw(e){if(e.target.closest('[data-action="go-home"]')){await Vp();return}let t=e.target.closest(".file-item[data-bundle-integrity]");if(t){if(t.classList.contains("bundle-missing"))return;let l=t.dataset.bundleIntegrity;if(a.selectedBundle===l&&a.currentView==="bundles")return;a.currentView="bundles",a.selectedBundle=l,a.bundleDetails=null,a.bundleSourceFile=null,a.bundleSourceFindingIdx=null,a.bundleCodeSearchQuery="",a.bundleCodeSearchMode="files",a.bundleDetailsTab="overview",E.showAll=!0,a.shownTriage=null,on(l),k(),W(),Yt(l);return}if(e.target.closest('[data-action="show-packages"]')){a.currentView="packages",k(),W();return}if(e.target.closest('[data-action="show-repositories"]')){a.currentView="repositories",k(),W();return}if(e.target.closest('[data-action="new-workspace"]')){let l=await Af();l&&(await Tl(),await Ba(l),W());return}let r=e.target.closest('[data-action="share-workspace"]');if(r){let l=r.closest("[data-workspace-id]"),d=l?U().find(u=>u.id===l.dataset.workspaceId):null;d&&Bf({id:d.id,name:d.name,privateKeyBase64:d.privateKey}).catch(u=>alert(`Failed to open share dialog: ${u.message}`));return}let n=e.target.closest('[data-action="export-workspace"]');if(n){let l=n.closest("[data-workspace-id]"),d=l?U().find(u=>u.id===l.dataset.workspaceId):null;d&&Tf(d).catch(u=>alert(`Failed to open export dialog: ${u.message}`));return}let o=e.target.closest('[data-action="leave-workspace"]');if(o){let l=o.closest("[data-workspace-id]"),d=l?U().find(m=>m.id===l.dataset.workspaceId):null;if(!d)return;let u=Array.isArray(d.reports)?d.reports:[],f;try{f=await gs(u)}catch(m){alert(`Couldn't read reports to analyze triage impact: ${m.message}`);return}let{confirmed:p,mode:h,triage:b}=await If({name:d.name,reportCount:u.length,bundleCount:d.bundles.length,triageImpact:f});if(!p)return;if(!U().some(m=>m.id===d.id)){alert(`Workspace "${d.name}" was removed elsewhere; nothing to leave.`);return}try{await Kp(d.id,h,{triage:b})}catch(m){alert(`Failed to leave workspace: ${m.message}`)}return}let s=e.target.closest(".file-item.workspace-item[data-workspace-id]");if(s){let l=s.dataset.workspaceId,d=a.currentView==="findings"||a.currentView==="files";l&&(l!==a.currentWorkspace||!d)&&Xt(l);return}let i=e.target.closest(".file-item[data-file]");if(i){let l=i.dataset.file;l&&(l!==a.currentFile||a.currentView!=="findings")&&$t(l);return}if(e.target.closest("#delete-current")){if(a.currentView==="bundles"&&a.selectedBundle){let b=a.selectedBundle,m=(a.bundles??[]).find(w=>w.integrity===b)?.name??b,y=U().filter(w=>Array.isArray(w.bundles)&&w.bundles.includes(b)).filter(w=>il(w.id,b)).map(w=>w.id),{confirmed:v}=await Rf({name:m,inRemote:y.length>0});if(!v)return;if(a.selectedBundle!==b){alert(`Active bundle changed during confirmation; aborting delete of "${m}".`);return}try{await jp({deleteFromRemoteWorkspaceIds:y})}catch(w){alert(`Failed to delete bundle: ${w.message}`)}return}if(!a.currentFile)return;let l=a.currentFile,d;try{d=await gs([l])}catch(b){alert(`Couldn't read reports to analyze triage impact: ${b.message}`);return}let u=U().filter(b=>Array.isArray(b.reports)&&b.reports.includes(l)).filter(b=>Qn(b.id,l)).map(b=>b.id),f=u.length>0,{confirmed:p,triage:h}=await Ff({name:l,triageImpact:d,inRemote:f});if(!p)return;if(a.currentFile!==l){alert(`Active report changed during confirmation; aborting delete of "${l}".`);return}try{await Hp({triage:h,deleteFromRemoteWorkspaceIds:u})}catch(b){alert(`Failed to delete report: ${b.message}`)}return}if(e.target.closest("#sync-status")){O.status==="error"?O.dismissError():O.status==="off"?(!O.getServerUrl()&&wo&&O.setServerUrl(wo),O.setEnabled(!0)):O.setEnabled(!1);return}if(e.target.closest("#sidebar-toggle")){ei.classList.toggle("collapsed");try{localStorage.setItem("deepview.sidebarCollapsed",ei.classList.contains("collapsed")?"1":"0")}catch{}}}function Mw(e){let t=e.target.closest("[data-tooltip]");if(!t){yo();return}Zl(t,{placement:"right",gate:r=>{let n=r.querySelector(".file-label");return!n||(r.dataset.tooltip??"")!==n.textContent?!0:n.scrollWidth>n.clientWidth}})}function Lw(e){let t=e.target.closest("[data-tooltip]"),r=e.relatedTarget?.closest?.("[data-tooltip]")??null;t&&t===r||yo()}function Pw(e){$r=e.target.value.trim().toLowerCase(),W()}var Ow={off:"Sync off",online:"Online",offline:"Offline",connecting:"Connecting\u2026",error:"Sync error"};function Dw(){return O.getServerUrl()||wo?U().length>0:!1}function ni(e){let t=se?.querySelector("#sync-status");if(!t)return;let r=Dw();if(r&&O.isEnabled()&&Tu().catch(i=>{console.warn("sync: load failed",i)}),r&&!O.getServerUrl()&&wo&&O.isEnabled()&&O.setServerUrl(wo),O.setForcedOff(!r),!r){t.hidden=!0;return}t.hidden=!1;let n=e??O.status;t.dataset.status=n;let o=O.persistenceDegraded;t.toggleAttribute("data-degraded",o),t.title=o?"Not saving to this browser right now (storage may be full, or another tab is on a newer version). Changes that haven\u2019t synced could be lost on reload.":"";let s=t.querySelector(".sync-label");s&&(s.textContent=Ow[n]??"")}O.onStatusChange(ni);var ec=!1,rc=!1;async function qf(){if(!O.persistenceDegraded||rc||ec)return;ec=!0;let{shown:e}=await Pf();if(ec=!1,e){rc=!0;return}O.persistenceDegraded&&setTimeout(qf,1500)}O.onPersistenceDegraded(e=>{ni(),e?qf():rc=!1});function Nw(e){let t=e.target.closest(".file-item.workspace-item");if(!t)return;let r=t.querySelector(".file-label");if(!r||r.querySelector("input"))return;let n=t.dataset.workspaceId,o=U().find(d=>d.id===n);if(!o)return;e.preventDefault();let s=document.createElement("input");s.type="text",s.value=o.name,s.className="workspace-rename-input",r.textContent="",r.append(s),s.focus(),s.select();let i=!1,l=async d=>{i||(i=!0,d&&await Ra(n,s.value),W())};s.addEventListener("keydown",d=>{d.key==="Enter"?(d.preventDefault(),l(!0)):d.key==="Escape"&&(d.preventDefault(),l(!1))}),s.addEventListener("blur",()=>l(!0)),s.addEventListener("click",d=>d.stopPropagation()),s.addEventListener("dblclick",d=>d.stopPropagation())}function oi(){for(let e of se.querySelectorAll(".drag-over"))e.classList.remove("drag-over")}function Gf(e){return e.dataTransfer.types.includes(oc)||e.dataTransfer.types.includes(vo)}function Uw(e){let t=e.target.closest(".file-item[data-bundle-integrity]");if(t){if(t.classList.contains("bundle-missing")){e.preventDefault();return}let n=t.dataset.bundleIntegrity;e.dataTransfer.effectAllowed="move",e.dataTransfer.setData(vo,n),e.dataTransfer.setData(tc,t.dataset.workspaceId??""),e.dataTransfer.setData("text/plain",n),t.classList.add("dragging"),ri=!0,W();return}let r=e.target.closest(".file-item[data-file]");r&&(e.dataTransfer.effectAllowed="move",e.dataTransfer.setData(oc,r.dataset.file),e.dataTransfer.setData(tc,r.dataset.workspaceId??""),e.dataTransfer.setData("text/plain",r.dataset.file),r.classList.add("dragging"),ti=!0,W())}function zw(){for(let e of se.querySelectorAll(".dragging"))e.classList.remove("dragging");oi(),(ti||ri)&&(ti=!1,ri=!1,W())}function Ww(e){if(!Gf(e))return;e.preventDefault();let t=e.target.closest("[data-workspace-id]"),r=se.querySelector(".dragging")?.closest("[data-workspace-id]")?.dataset.workspaceId??null,s=t&&r&&t.dataset.workspaceId===r||!t&&!r;if(e.dataTransfer.dropEffect=s?"none":"move",oi(),!s)if(t){let i=t.dataset.workspaceId;for(let l of se.querySelectorAll(`[data-workspace-id="${CSS.escape(i)}"]`))l.classList.contains("dragging")||l.classList.add("drag-over")}else{let l=e.dataTransfer.types.includes(vo)?"[data-default-bundles]":"[data-default-reports]",d=se.querySelector(l);d&&d.classList.add("drag-over")}}function Hw(e){se.contains(e.relatedTarget)||oi()}async function Vw(e){if(!Gf(e))return;e.preventDefault(),e.stopPropagation(),oi();let t=e.target.closest("[data-workspace-id]"),r=t?t.dataset.workspaceId:null,n=e.dataTransfer.getData(tc)||null;if(e.dataTransfer.types.includes(vo)){let s=e.dataTransfer.getData(vo);if(!s)return;if(n&&n!==r&&il(n,s)){let i=(a.bundles??[]).find(u=>u.integrity===s)?.name??s,l=U().find(u=>u.id===n),{confirmed:d}=await Mf({name:i,workspaceName:l?.name??""});if(!d)return;try{await _s(n,s)}catch(u){console.warn(`Failed to remove '${i}' from source workspace ${n} remote:`,u)}}r&&await hr(s,r),n&&n!==r&&await Na(s,n),W();return}let o=e.dataTransfer.getData(oc);if(o){if(n&&n!==r&&Qn(n,o)){let s=U().find(l=>l.id===n),{confirmed:i}=await Lf({name:o,workspaceName:s?.name??""});if(!i)return;try{await xs(n,o)}catch(l){console.warn(`Failed to remove '${o}' from source workspace ${n} remote:`,l)}}r&&await fr(o,r),n&&n!==r&&await Oa(o,n),W()}}function jw(e){ei=e,se=e.renderRoot,Zs=se.querySelector("#file-list"),Ju(se.querySelector("#encryption-toggle")),se.addEventListener("click",Rw),se.addEventListener("dblclick",Nw),se.addEventListener("dragstart",Uw),se.addEventListener("dragend",zw),se.addEventListener("dragover",Ww),se.addEventListener("dragleave",Hw),se.addEventListener("drop",Vw),Zs.addEventListener("mouseover",Mw),Zs.addEventListener("mouseout",Lw),se.querySelector("#sidebar-search-input")?.addEventListener("input",Pw),ni(O.status),W()}var nc=class extends N{static styles=[T(Ku),T(ju)];render(){return c`<div class="sidebar-header"><h2 class="brand"><button class="brand-button" type="button" data-action="go-home"><span class="brand-name">DeepView</span></button> <span class="brand-tag">dev</span></h2><button id="encryption-toggle" type="button" hidden></button> <button id="sidebar-toggle" type="button" title="toggle sidebar" aria-label="toggle sidebar"><svg viewBox="0 0 16 16" width="14" height="14" fill="currentColor" aria-hidden="true"><path d="M2 4h12v1.5H2zM2 7.25h12v1.5H2zM2 10.5h12V12H2z"/></svg></button></div><div class="sidebar-search"><svg class="sidebar-search-icon" viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><circle cx="6.5" cy="6.5" r="4.5"/><path d="M9.7 9.7L13 13" stroke-linecap="round"/></svg> <input id="sidebar-search-input" type="search" placeholder="Search reports..." autocomplete="off"> <button id="show-packages-btn" type="button" class="sidebar-view-btn" data-action="show-packages" hidden title="Show packages" aria-label="Show packages"><svg viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 6h12v7a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V6Z"/><path d="M2 6l1.6-3.3A1.3 1.3 0 0 1 4.8 2h6.4a1.3 1.3 0 0 1 1.2.7L14 6"/><path d="M8 2v4"/></svg> <span class="view-btn-count"></span></button> <button id="show-repositories-btn" type="button" class="sidebar-view-btn" data-action="show-repositories" hidden title="Show repositories" aria-label="Show repositories"><svg viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="4" x2="4" y1="2.5" y2="10"/><circle cx="12" cy="4" r="2"/><circle cx="4" cy="12" r="2"/><path d="M12 6a6 6 0 0 1-6 6"/></svg> <span class="view-btn-count"></span></button></div><ul id="file-list"></ul><div class="sidebar-actions"><button id="delete-current" type="button" class="danger"><svg class="trash-icon" viewBox="0 0 16 16" width="11" height="11" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 4h10M6.5 4V2.5h3V4M5 4l.7 9h4.6L11 4"/></svg> <span>Delete current</span></button> <button id="sync-status" type="button" data-status="off"><span class="sync-dot" aria-hidden="true"></span> <span class="sync-label">Sync off</span></button></div>`}firstUpdated(){jw(this)}};customElements.define("app-sidebar",nc);var Yf={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 \u2014 cancelling keeps your local value (which will then propagate back to the chain on your next save).",importedSideLabel:"Apply from chain",applyButton:"Apply"}};function Jf(){Nu(async(e,t,r)=>{let n=va(e);try{return await Ks(e,n,Yf[r]??Yf.attach)}catch{let o=e.length;return alert(`${r==="attach"?"A report attach":"A workspace sync"} had ${o} triage disagreement${o===1?"":"s"} with your local view. Kept your local values because another dialog is open. ${r==="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 sc=class extends I{static properties={retry:{type:Boolean},_value:{state:!0}};constructor(){super(),this.retry=!1,this._value=""}_finish(t){this._value="",super._finish(t)}_onCancel=()=>this._finish(null);_onInput=t=>{this._value=t.target.value};_onSubmit=()=>{let t=this._value??"";t&&this._finish(t)};_onKeydown=t=>{t.key==="Enter"&&(t.preventDefault(),this._onSubmit())};render(){let t=(this._value??"").length>0,r=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 c`<dialog @close="${this._onClose}"><header><h3>Sync server password</h3></header><p class="nwd-intro">${r}</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="${!t}" @click="${this._onSubmit}">${this.retry?"Retry":"Authenticate"}</button></footer></dialog>`}};customElements.define("sync-auth-dialog",sc);function Xf({retry:e=!1}={}){return K("sync-auth-dialog",{retry:!!e})}function Qf(){Du(async({retry:e})=>{try{return await Xf({retry:e})}catch(t){return console.warn("Sync auth dialog failed to open:",t),null}})}var si="https://triage.space/",Kw=[{hostname:"deepaudit.dev",pathPrefix:"/",supportsSync:!0},{hostname:"chalker.github.io",pathPrefix:"/deepview/",supportsSync:!1}];function qw(){for(let e of Kw)if(location.hostname===e.hostname&&location.pathname.startsWith(e.pathPrefix))return e;return null}var Gw=["deepview.triage","deepview.triage.pending"],Yw="deepview.repoUrls";function Jw(){try{for(let e of Gw)if(localStorage.getItem(e))return!0}catch{return!0}try{let e=localStorage.getItem(Yw);if(e){let t=JSON.parse(e);if(t&&typeof t=="object"&&Object.keys(t).length>0)return!0}}catch{return!0}return!1}async function Xw(){if(Jw())return!0;let e=[];try{e=await ae()}catch{return!0}if(e.length>0)return!0;try{if(U().length>0)return!0}catch{return!0}try{return await na()}catch{return!0}}var ic=class extends N{static properties={supportsSync:{attribute:!1}};createRenderRoot(){return this}constructor(){super(),this.supportsSync=!1}firstUpdated(){let t=this.querySelector("dialog");t&&t.showModal();let r=this.querySelector("button.om-stay");r&&r.focus()}_finish(t){if(this._settled)return;this._settled=!0;let r=this.querySelector("dialog");r&&r.close(),this.dispatchEvent(new CustomEvent("resolve",{detail:t}))}_onClose=()=>this._finish(!1);_onStay=()=>this._finish(!1);_onMigrate=()=>this._finish(!0);render(){let t=()=>c`<a class="om-link" href="${si}" target="_blank" rel="noopener noreferrer">${si}</a>`;return c`<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 ${t()}.</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 ${t()}.</p>${this.supportsSync?c`<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 ${t()}. 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>`:c`<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 ${t()}.</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",ic);function Qw(e){return new Promise(t=>{let r=document.createElement("origin-migration-dialog");r.supportsSync=e.supportsSync,r.addEventListener("resolve",n=>{r.remove(),t(!!n.detail)}),document.body.append(r)})}async function Zf(){let e=qw();return e?await Xw()?await Qw(e)?(location.assign(si),!0):!1:(location.replace(si),!0):!1}var ac=class extends I{static styles=[...I.styles,T(Ze)];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(t){t.has("_stage")&&this._focusActiveInput()}_focusActiveInput(){if(this._stage==="password")this.renderRoot.querySelector('input[type="password"]')?.focus();else if(this._stage==="name"){let t=this.renderRoot.querySelector('input[data-role="name"]');t&&(t.focus(),t.select())}}_finish(t){this._settled||(this._decoded=null,this._password="",this.encoded="",super._finish(t))}_onClose=()=>this._finish(null);_onCancel=()=>this._finish(null);_onPasswordInput=t=>{this._password=t.target.value,this._error=""};_onNameInput=t=>{this._name=t.target.value};_onUnlock=async()=>{if(!(!this._password||this._busy)){this._busy=!0,this._error="";try{let t=await tl({encoded:this.encoded,password:this._password});if(this._settled)return;let r=U().find(n=>n.id===t.id)??null;this._decoded=t,this._existingById=r,this._name=t.name,this._password="",this._stage="name"}catch(t){if(this._settled)return;this._error=t?.message??String(t)}finally{this._busy=!1}}};_onAttach=()=>{if(!this._decoded)return;let t=bt(this._name);if(!t)return;let r=U().find(n=>n.id===this._decoded.id)??null;if(r){this._existingById=r;return}this._nameCollision(t)||this._finish({id:this._decoded.id,name:t,privateKeyBase64:this._decoded.privateKeyBase64})};_nameCollision(t){if(!t||!this._decoded)return null;for(let r of U())if(r.id!==this._decoded.id&&bt(r.name)===t)return r;return null}_onKeydown=t=>{t.key==="Enter"&&(t.preventDefault(),this._stage==="password"?this._onUnlock():this._stage==="name"&&this._onAttach())};_passwordStage(){return c`<p class="nwd-note">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?c`<p class="wsl-error" role="alert">${this._error}</p>`:g}<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 t=this._existingById;return c`<p class="nwd-note">This workspace is already attached as <strong>"${t?.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 t=bt(this._name),r=this._nameCollision(t),n=!!t&&!r;return c`<p class="nwd-note">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> ${r?c`<p class="wsl-error" role="alert">A workspace named "${t}" already exists on this device. Pick a different name.</p>`:g}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" ?disabled="${!n}" @click="${this._onAttach}">Attach</button></footer>`}render(){let t=this._stage==="password"?"Attach shared workspace":this._existingById?"Workspace already attached":"Name the workspace";return c`<dialog @close="${this._onClose}"><header><h3>${t}</h3></header>${this._stage==="password"?this._passwordStage():this._nameStage()}</dialog>`}};customElements.define("workspace-unlock-link-dialog",ac);function eh({encoded:e}={}){return new Promise((t,r)=>{let n=document.createElement("workspace-unlock-link-dialog");n.encoded=e??"",n.addEventListener("resolve",o=>{n.remove(),t(o.detail)}),n.addEventListener("modal-conflict",o=>{n.encoded="",n.remove(),r(pt(o.detail?.cause))}),document.body.append(n)})}var Me=null,ii=!1,ko=null;function Zw(e){if(!e)return"Could not unlock. Try again.";switch(e.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 r=e.message??String(e);return r.length>200?r.slice(0,197)+"\u2026":r}}}function ev(){if(Me)return Me;Me=document.createElement("div"),Me.id="lock-overlay",Me.setAttribute("role","dialog"),Me.setAttribute("aria-modal","true"),Me.setAttribute("aria-label","Unlock DeepView"),Me.innerHTML=`
44
+ You can change this anytime from the lock icon in the sidebar header.`)){af();return}await Ts(),X()&&af()}var cf=Pl;var df=["type","model","think","effort","exportsMode"],Xt="deepview.lastFile",po=new Set(["overview","graph","treemap","advisories","issues","code","terminal"]);function an(e,t="overview"){let r=t&&t!=="overview"&&po.has(t)?` ${t}`:"";ve(Xt,`b:${e}${r}`).catch(()=>{})}var wr=0,xe=e=>e!==wr;function Ol(e){let t=pf(e.toLowerCase());return t.endsWith(".map")?"sourcemap":t==="stasis.code.br"||t.endsWith(".stasis.code.br")?"stasis":null}function pf(e){return e.replace(/ \(\d+\)(?=\.[^.]*$)/u,"")}async function uf({name:e,content:t,existingNames:r}){if(!r.has(e))return await at(e,t),r.add(e),{name:e,content:t};let n;try{n=await Fe(e)}catch(l){if(!(l instanceof DOMException&&l.name==="NotFoundError"||typeof l?.message=="string"&&l.message.startsWith("File not found:")))throw l;return await at(e,t),r.add(e),{name:e,content:t}}if(n===t)return{name:e,content:t};let s=z().filter(l=>Array.isArray(l.reports)&&l.reports.includes(e)).filter(l=>Zn(l.id,e)),i=await qp({name:e,workspaceNames:s.map(l=>l.name),existingNames:r});if(i.action==="cancel")return null;if(i.action==="rename"){let l=i.newName;return await at(l,t),r.add(l),{name:l,content:t}}return await at(e,t),s.length>0&&await My(e,s),{name:e,content:t}}async function My(e,t){let r;try{r=await Tn(e)}catch(n){console.warn(`Import: failed to read freshly-saved "${e}" for cloud sync:`,n);return}for(let n of t)try{await As(n.id);let o=await Ss(n.id,e,r);o&&o.ok===!1&&console.warn(`Import: failed to upload "${e}" to workspace "${n.name}" (${n.id}): ${o.reason??"unknown"}`)}catch(o){console.warn(`Import: failed to upload "${e}" to workspace "${n.name}" (${n.id}):`,o)}}async function Nl(e){await cf();let t=null,r=null,n=new Set,o=new Set(await le());for(let s of e)try{let i=pf(s.name.toLowerCase());if(i.endsWith(".gz")||i.endsWith(".deepview-workspace.enc")){await sf(s);try{let u=await le();o.clear();for(let p of u)o.add(p)}catch(u){console.warn("Import: failed to refresh existingNames after workspace import:",u)}continue}if(Ol(s.name)){let u=new Uint8Array(await s.arrayBuffer()),{integrity:p}=await ur(s.name,u);r=p,n.add(p);continue}let d=await s.text();if(i.endsWith(".csv")){let u=Zp(d);for(let{displayName:p,data:f}of u){let h=p.replaceAll("/","__")+".codex",b=JSON.stringify(f),{count:m,source:y}=Oe(b),$=await uf({name:h,content:b,existingNames:o});$&&(je($.name,m,y),t={name:$.name,content:$.content})}}else{let u=Oe(d);if(!u.recognized)throw new Error("not a recognized DeepView, DeepSec, Claude Security, or Codex report");let p=await uf({name:s.name,content:d,existingNames:o});if(!p)continue;je(p.name,u.count,u.source),t={name:p.name,content:p.content}}}catch(i){alert(`Failed to load ${s.name}: ${i.message}`)}await V();for(let s of n)Bl(s).catch(()=>{});t?await _t(t.name,t.content):r&&(a.currentView="bundles",a.selectedBundle=r,a.bundleDetails=null,a.bundleDetailsTab="overview",a.bundleSourceFile=null,a.bundleSourceFindingIdx=null,a.bundleCodeSearchQuery="",a.bundleCodeSearchMode="files",a.shownTriage=null,A.showAll=!0,an(r),k(),await V(),Jt(r))}async function _t(e,t){let r=++wr,n=new Set(z().filter(o=>Array.isArray(o.reports)&&o.reports.includes(e)).map(o=>o.id));for(let o of D.openSessions)o&&!n.has(o.workspaceId)&&(D.closeSession(o.workspaceId),eo(o.workspaceId));if(a.reports=[],a.workspaceMerges=[],a.currentFile=e,a.currentWorkspace=null,(a.currentView==="bundles"||a.currentView==="packages"||a.currentView==="repositories")&&(a.currentView="findings"),a.repoUrl=He(e),a.repoEditing=!1,A.selected=null,A.focusedPkg=null,A.layoutCache=null,A.solo=null,A.hidden.clear(),A.pathFilter="",ze(),ve(Xt,e).catch(()=>{}),t===void 0){try{t=await Fe(e)}catch(o){if(xe(r))return;if(o&&o.message?.includes("vault locked")){if(await Is()&&!xe(r)){await _t(e);return}xe(r)||(a.currentFile=null,await V());return}alert(`Failed to read ${e}: ${o.message}`),a.currentFile=null,await V();return}if(xe(r))return}if(await Ul(e,t,r),!xe(r)){for(let o of n)D.openSession(o),D.refreshSession(o),As(o);await V()}}async function Qt(e){let t=z().find(o=>o.id===e);if(!t)return;let r=++wr;for(let o of D.openSessions)o&&o.workspaceId!==e&&(D.closeSession(o.workspaceId),eo(o.workspaceId));(a.currentView==="bundles"||a.currentView==="packages"||a.currentView==="repositories")&&(a.currentView="findings"),a.reports=[],a.workspaceMerges=[],a.currentFile=null,a.currentWorkspace=e,a.repoUrl="",a.repoEditing=!1,A.selected=null,A.focusedPkg=null,A.layoutCache=null,A.solo=null,A.hidden.clear(),A.pathFilter="",ze(),ve(Xt,`ws:${e}`).catch(()=>{}),t.reports.length===0&&(E.classList.remove("active"),W(g,E),Ce.classList.remove("hidden"));let n=t.reports.map(o=>Fe(o).catch(()=>null));for(let o=0;o<t.reports.length;o++){let s=await n[o];if(xe(r))return;if(s!==null&&(await Ul(t.reports[o],s,r),xe(r)))return}D.openSession(e),D.refreshSession(e),As(e),await V()}async function ff({triage:e="keep",deleteFromRemoteWorkspaceIds:t=[]}={}){if(!a.currentFile)return;let r=++wr,n=a.currentFile;Gr(n),Ve(n,"");for(let o of t)try{let s=await Cs(o,n);if(xe(r))return;s&&s.ok===!1&&s.reason!=="not-found"&&console.warn(`Failed to delete '${n}' from workspace ${o} remote: ${s.reason}`)}catch(s){console.warn(`Failed to delete '${n}' from workspace ${o} remote:`,s)}if(await Dr(n),!xe(r)&&(await Vn(n,null),!xe(r))){if(e==="wipe"){try{await ws()}catch(o){console.warn("Skipped orphan-triage GC:",o)}if(xe(r))return}xe(r)||(Dl(),await V())}}function Dl(){a.currentFile=null,a.currentWorkspace=null,a.selectedBundle=null,a.bundleDetails=null,a.bundleSourceFile=null,a.bundleSourceFindingIdx=null,a.reports=[],a.workspaceMerges=[],a.repoUrl="",a.repoEditing=!1,a.shownTriage=null,a.currentView="findings",A.selected=null,A.focusedPkg=null,A.layoutCache=null,A.solo=null,A.hidden.clear(),A.pathFilter="",ze(),Mr(Xt),E.classList.remove("active"),W(g,E),Ce.classList.remove("hidden"),document.title="DeepView"}async function hf(){++wr;for(let e of D.openSessions)e&&(D.closeSession(e.workspaceId),eo(e.workspaceId));Dl(),await V()}async function gf({deleteFromRemoteWorkspaceIds:e=[]}={}){if(!a.selectedBundle)return;let t=++wr,r=a.selectedBundle;for(let o of e)try{let s=await Es(o,r);if(xe(t))return;s&&s.ok===!1&&s.reason!=="not-found"&&console.warn(`Failed to delete bundle from workspace ${o} remote: ${s.reason}`)}catch(s){console.warn(`Failed to delete bundle from workspace ${o} remote:`,s)}if(await ia(r),xe(t)||(await Ha(r,null),xe(t)))return;a.selectedBundle=null,a.bundleDetails=null,a.bundleSourceFile=null,a.bundleSourceFindingIdx=null;let n=he(Xt);typeof n=="string"&&(n===`b:${r}`||n.startsWith(`b:${r} `))&&Mr(Xt),ka(r),a.bundles=await lt(),!xe(t)&&(k(),await V())}async function mf(e,t="detach",{triage:r="keep"}={}){let n=z().find(l=>l.id===e);if(!n)return;++wr;let o=Array.isArray(n.reports)?[...n.reports]:[];if(D.closeSession(e),eo(e),t==="delete"){for(let l of o){try{await Dr(l)}catch{}Gr(l),Ve(l,"")}if(r==="wipe")try{await ws()}catch(l){console.warn("Skipped orphan-triage GC:",l)}}let s=a.currentWorkspace===e,i=t==="delete"&&a.currentFile!=null&&o.includes(a.currentFile);(s||i)&&Dl(),await Na(e),await V()}async function Ul(e,t,r=null){let n=()=>r!==null&&xe(r);try{if(await qn,n())return;let o;try{o=JSON.parse(t)}catch(b){if(o=Ur(t)??zr(t),!o)throw new Error(`Not JSON, and not a recognized markdown format. (JSON error: ${b.message})`,{cause:b})}let s=a.reports.length===0,i=new Set,l=new Map;for(let b=0;b<a.reports.length;b++){let m=a.reports[b];for(let y=0;y<m.groups.length;y++){let $=m.groups[y],w=`${b}:${y}`;for(let v of $)v.id&&(i.add(v.id),l.set(v.id,w))}}let d=o.findings||[],u=d.flatMap(bl).filter(b=>!b.id);if(u.length>0){let b=await Promise.all(u.map(ls));if(n())return;u.forEach((m,y)=>{b[y]&&(m.id=b[y])})}let p=He(e),f=[],h=0;for(let b of d){let m=bl(b);if(m.length===0)continue;let y=m.filter(R=>R.id&&i.has(R.id)),$=m.filter(R=>!R.id||!i.has(R.id)),w=new Set;for(let R of y){let O=l.get(R.id);O!==void 0&&w.add(O)}let v=m.filter(R=>R.id).map(R=>R.id);if($.length===0){w.size>1&&a.workspaceMerges.push(new Set(v)),h+=y.length;continue}let S=[];for(let R of $){R.id&&i.add(R.id);let O={...R,_id:a.nextFindingId++,_repoFallback:p,_reportName:e,_bundleHashes:o.bundleHashes??[]};if(!o.source&&!df.some(K=>O[K]!==void 0))for(let K of df)o[K]!==void 0&&(O[K]=o[K]);O._analyzer=o.source??O.type??null,S.push(O)}y.length>0&&(h+=y.length,a.workspaceMerges.push(new Set(v)));let C=`${a.reports.length}:${f.length}`;for(let R of $)R.id&&l.set(R.id,C);f.push(S)}if(h>0&&console.log(`${e}: skipped ${h} duplicate finding${h===1?"":"s"}`),a.reports.push({type:o.type||"analysis",source:o.source??null,fileName:e,groups:f,tree:o.tree??null,bundleHashes:o.bundleHashes??[]}),Array.isArray(o.bundleHashes)&&o.bundleHashes.length>0){let b=new Set((a.bundles??[]).map(m=>m.integrity));for(let m of o.bundleHashes)b.has(m)&&Bl(m).catch(()=>{})}if(s)if(Ls(),f.some(m=>m.some(y=>y.confidence!==void 0))){let m=$=>f.reduce((w,v)=>w+(v.some(S=>S.confidence!==void 0&&S.confidence>=$)?1:0),0),y;for(m(6)<=25?y=6:m(7)<=25?y=7:y=8;y>0&&m(y-1)===m(y);)y--;a.filterConfMin=y}else a.filterConfMin=0;k()}catch(o){alert(`Failed to parse ${e}: ${o.message}`)}}window.__loadFile=(e,t)=>Ul(e,t);window.__setFilters=({severities:e,confMin:t}={})=>{e!=null&&(a.filterSeverities=new Set(e)),t!==void 0&&(a.filterConfMin=t),k()};document.addEventListener("keydown",e=>{e.key==="Escape"&&document.body.classList.contains("report-fullscreen")&&document.body.classList.remove("report-fullscreen")});document.addEventListener("dragover",e=>e.preventDefault());document.addEventListener("drop",e=>{e.preventDefault(),!e.target.closest("#drop-zone")&&Nl(e.dataTransfer.files)});Ce.addEventListener("dragover",e=>{e.preventDefault(),Ce.classList.add("hover")});Ce.addEventListener("dragleave",()=>Ce.classList.remove("hover"));Ce.addEventListener("drop",e=>{e.preventDefault(),Ce.classList.remove("hover"),Nl(e.dataTransfer.files)});var xt=null;function Ly(){xt||(xt=document.createElement("input"),xt.type="file",xt.multiple=!0,xt.hidden=!0,xt.addEventListener("change",()=>{let e=xt.files;e&&e.length>0&&Nl(e),xt.value=""}),document.body.append(xt)),xt.click()}Ce.addEventListener("click",e=>{e.target.closest(".drop-prompt-action")&&Ly()});var vr=new Map,bf="deepview.advisories.proxyConsent";function yf(){try{return localStorage.getItem(bf)==="1"}catch{return!1}}function wf(){try{localStorage.setItem(bf,"1")}catch{}}function Py(e){let t=new Map;if(!e||e.kind!=="stasis"||!e.bundle)return t;for(let[r,n]of e.bundle.modules){if(!r.includes("node_modules")||!n?.name||typeof n.version!="string"||!n.version)continue;let o=t.get(n.name);o||(o=new Set,t.set(n.name,o)),o.add(n.version)}return t}function Oy(e){if(!e||e.kind!=="stasis"||!e.bundle)return!1;for(let[t,r]of e.bundle.modules)if(t.includes("node_modules")&&r?.name&&typeof r.version=="string"&&r.version)return!0;return!1}function vf(e,t){return!e||Ol(e.name)!=="stasis"?!1:!t||t.integrity!==e.integrity?!0:Oy(t)}function Ny(e){let t=Object.create(null);for(let[r,n]of e)t[r]=[...n].toSorted();return t}async function kf(e,t){if(!e?.integrity||vr.has(e.integrity)||!yf())return;let r=Py(e);if(r.size===0){vr.set(e.integrity,{state:"ok",byPackage:new Map,query:r});return}vr.set(e.integrity,{state:"loading",query:r});let n=e.integrity;try{let o=await fetch("/api/npm-advisories",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(Ny(r))});if(!o.ok){let l=`HTTP ${o.status}`;try{let d=await o.json();d&&typeof d.error=="string"&&d.error&&(l=`${d.error} (HTTP ${o.status})`)}catch{}vr.set(n,{state:"error",reason:l,query:r}),t();return}let s=await o.json(),i=new Map;if(s&&typeof s=="object")for(let[l,d]of Object.entries(s)){if(!Array.isArray(d))continue;let u=d.filter(p=>p&&typeof p=="object"&&typeof p.title=="string"&&typeof p.severity=="string");u.length>0&&i.set(l,u)}vr.set(n,{state:"ok",byPackage:i,query:r})}catch(o){vr.set(n,{state:"error",reason:o?.message??"fetch-failed",query:r})}t()}var Dy={critical:0,high:1,moderate:2,low:3,info:4};function Ys(e){return Dy[e]??999}function Uy(e){return e.charAt(0).toUpperCase()+e.slice(1)}function zy(){let e=typeof window>"u"?"":window.location.host;return c`<div class="bundle-advisories-consent"><div class="bundle-advisories-consent-card"><p class="bundle-advisories-consent-text">This bundle's dependency names and versions will be sent to the npm registry through a same-origin proxy (<span class="mono">${e}</span> → <span class="mono">registry.npmjs.org</span>) to look up published security advisories.</p><button type="button" class="bundle-advisories-consent-btn" data-advisories-consent>Confirm</button><p class="bundle-advisories-consent-note">This preference will be saved and reused for other bundles.</p></div></div>`}function $f(e){if(!e)return c`<div class="bundle-advisories-empty">Bundle not loaded yet.</div>`;if(e.kind!=="stasis"||!e.bundle)return c`<div class="bundle-advisories-empty">Advisories are only available for stasis bundles.</div>`;if(!yf())return zy();let t=vr.get(e.integrity);if(!t||t.state==="loading")return c`<div class="bundle-advisories-empty">Loading advisories from npm registry…</div>`;if(t.state==="error")return c`<div class="bundle-advisories-empty is-error">Failed to fetch advisories: ${t.reason}</div>`;let r=t.query.size,n=t.byPackage.size;if(n===0)return c`<div class="bundle-advisories"><div class="bundle-advisories-summary">No advisories for the ${r} ${r===1?"package":"packages"} in this bundle.</div></div>`;let o=[...t.byPackage.entries()].toSorted(([i,l],[d,u])=>{let p=Math.min(...l.map(h=>Ys(h.severity))),f=Math.min(...u.map(h=>Ys(h.severity)));return p!==f?p-f:i.localeCompare(d)}),s=[...t.byPackage.values()].reduce((i,l)=>i+l.length,0);return c`<div class="bundle-advisories"><div class="bundle-advisories-summary">${s} ${s===1?"advisory":"advisories"} across ${n} of ${r} ${r===1?"package":"packages"}</div><ul class="bundle-advisories-list">${o.map(([i,l])=>Wy(i,l,t.query.get(i)))}</ul></div>`}function Wy(e,t,r){let n=[...t].toSorted((s,i)=>{let l=Ys(s.severity)-Ys(i.severity);return l!==0?l:(s.title??"").localeCompare(i.title??"")}),o=r?[...r].toSorted():[];return c`<li class="bundle-advisories-section"><div class="bundle-advisories-section-header"><span class="bundle-advisories-section-name">${e}</span> ${o.length>0?c`<span class="bundle-advisories-section-versions">${o.map(s=>c`<span class="bundle-advisories-version-chip">${s}</span>`)}</span>`:g} <span class="bundle-advisories-section-count">${n.length} ${n.length===1?"advisory":"advisories"}</span></div><ul class="bundle-advisories-rows">${n.map(s=>Ky(s))}</ul></li>`}function Hy(e){if(typeof e!="string")return null;let t=/\/(GHSA-[a-z0-9-]+)(?:[/?#]|$)/iu.exec(e);return t?t[1]:null}var Vy=c`<svg class="bundle-advisory-ghsa-icon" viewBox="0 0 16 16" width="11" height="11" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 13L13 3"/><path d="M5 3h8v8"/></svg>`;function jy(e){let t=/^CWE-(\d+)$/u.exec(e);if(!t)return c`<span>${e}</span>`;let r=`https://cwe.mitre.org/data/definitions/${t[1]}.html`;return c`<a class="bundle-advisory-cwe" href="${r}" target="_blank" rel="noopener noreferrer">${e}</a>`}function Ky(e){let t=e.severity,r=e.title,n=typeof e?.cvss?.score=="number"?e.cvss.score.toFixed(1):"",o=typeof e?.cvss?.vectorString=="string"&&e.cvss.vectorString?e.cvss.vectorString:"",s=typeof e.vulnerable_versions=="string"?e.vulnerable_versions:null,i=typeof e.url=="string"&&/^https?:\/\//iu.test(e.url)?e.url:null,l=Hy(i),d=Array.isArray(e.cwe)?e.cwe.filter(p=>typeof p=="string"):[],u=l&&i?c`<a class="bundle-advisory-ghsa" href="${i}" target="_blank" rel="noopener noreferrer">${l}${Vy}</a>`:l?c`<span class="bundle-advisory-ghsa">${l}</span>`:g;return c`<li class="bundle-advisory-row"><div class="bundle-advisory-rail"><span class="${`bundle-advisory-severity sev-${t}`}">${Uy(t)}</span> ${n?c`<span class="bundle-advisory-cvss-score">CVSS <span class="mono">${n}</span></span>`:g}</div><div class="bundle-advisory-body"><div class="bundle-advisory-header"><span class="bundle-advisory-title">${r}</span> ${u}</div><div class="bundle-advisory-subrow"><div class="bundle-advisory-meta">${s?c`<span>Affected <span class="mono">${s}</span></span>`:g} ${d.length>0?c`<span class="bundle-advisory-cwes">${d.map((p,f)=>c`${f===0?"":", "}${jy(p)}`)}</span>`:g}</div>${o?c`<div class="bundle-advisory-cvss-vector mono">${o}</div>`:g}</div></div></li>`}var fo=null;function qy(e){let t=new Map;if(!e||e.kind!=="stasis"||!e.bundle)return t;for(let r of e.bundle.imports.values())for(let[n,o]of r){t.has(n)||t.set(n,new Set);for(let s of o.values())typeof s=="string"&&t.get(n).add(s)}return t}function Gy(e){let t=dt(e),r=qy(e),n=[...t.keys()],{stripped:o}=Rt(n),s=new Map(n.map((l,d)=>[l,o[d]])),i={};for(let[l,d]of t){let u=s.get(l),p=r.get(l);i[u]={imports:p?[...p].map(f=>s.get(f)).filter(Boolean):[],size:new TextEncoder().encode(d).byteLength}}return{tree:i,origToStripped:s}}async function Fl(e){let t=dt(e),r=new Map;for(let[n,o]of t)r.set(n,await fu(o));return r}function Sf(e){let t={fixed:0,invalid:0,deleted:0};if(!e?.fileHashes)return t;let r=new Set;for(let n of e.fileHashes.values())if(!r.has(n)){r.add(n);for(let o of ds(n)){let s=a.triage.get(P(o))?.triage;s&&t[s]!==void 0&&t[s]++}}return t}function kr(e,t="graph"){if(!e||e.size===0)return new Map;let r=new Map;for(let[n,o]of e){let s=ds(o);if(s.length===0)continue;let i=s.filter(d=>{let u=a.triage.get(P(d))?.triage??null;return t==="issues"?u!=="invalid"&&u!=="deleted":u===a.shownTriage});if(i.length===0)continue;r.has(n)||r.set(n,[]);let l=r.get(n);for(let d of i)l.push(d)}return r}function Yy(e,t){let r=new Set;for(let[o,s]of t)if(s){for(let i of Object.values(s))if(i>0){r.add(o);break}}let n=[...r];for(;n.length>0;){let o=n.shift(),s=e[o]?.imports??[];for(let i of s)!r.has(i)&&e[i]&&(r.add(i),n.push(i))}return r}function Cf(e){let{tree:t,origToStripped:r}=Gy(e),n=Object.keys(t);if(n.length===0)return null;let o=null;if(e.fileHashes&&e.fileHashes.size>0){o=new Map;for(let[m,y]of e.fileHashes){let $=r.get(m);$!==void 0&&o.set($,y)}}let s=kr(o),i=new Map,l=new Map,d=new Map,u=new Map;for(let[m,y]of s){let $={critical:0,high:0,medium:0,low:0,high_bug:0,bug:0,informational:0},w=new Set,v=new Set,S=[];for(let C of y){$[C.severity]=($[C.severity]||0)+1,w.add(C.severity);let R=a.triage.get(P(C))?.color??"none";v.add(R),S.push({severity:C.severity,color:R})}i.set(m,$),l.set(m,w),d.set(m,v),u.set(m,S)}let p=Ps(t,i),f=A.showAll?n:[...Yy(t,i)],h=new Map;for(let[m,y]of r)h.set(y,m);let b=!1;for(let m of Object.values(t))if(m?.imports&&m.imports.length>0){b=!0;break}return{treeData:t,files:f,ownCounts:i,transitiveCounts:p,severitySets:l,colorSets:d,fileFindings:u,options:{pkgOf:ho},strippedToOrig:h,hasEdges:b}}function Qs(){if(!fo)return;let e=en();e&&e.refreshSidebar(fo,{isBundleContext:!0})}function Zs(){if(!fo)return;let e=en();e&&e.refreshTopPkgs(fo)}function Ef(e){fo=e}function ho(e){let t=/(?:^|\/)(?:node_modules|dependencies)\/(@[^/]+\/[^/]+|[^/]+)/gu,r;for(;(r=t.exec(e))!==null;)if(r[1]!==".pnpm")return r[1];let n=e.indexOf("/");return n>0?e.slice(0,n):"__own__"}function Jy(e){let t=new Map,r=0;for(let{path:o,size:s}of e){if(typeof s!="number"||s<=0)continue;let i=ho(o);t.set(i,(t.get(i)??0)+s),r+=s}if(r===0)return g;let n=[...t.entries()].toSorted((o,s)=>s[1]-o[1]);return c`<div class="bundles-dist"><div class="bundles-dist-bar" aria-hidden="true">${J(n,([o])=>o,([o,s])=>c`<span class="bundles-dist-seg" style="${we({flexGrow:s,background:Ft(o)})}" data-tooltip="${o==="__own__"?g:`${o}: ${De(s)}`}"></span>`)}</div><ul class="bundles-dist-list">${J(n,([o])=>o,([o,s])=>{let i=(s/r*100).toFixed(1),l=o==="__own__"?"own source":o,d=Ft(o);return c`<li><span class="bundles-dist-dot" style="${we({background:d})}"></span> <span class="bundles-dist-pkg" data-tooltip="${o==="__own__"?g:o}">${l}</span> <span class="bundles-dist-bar-row" aria-hidden="true"><span class="bundles-dist-bar-fill" style="${we({width:`${i}%`,background:d})}"></span> </span><span class="bundles-dist-size">${De(s)}</span> <span class="bundles-dist-percent">${i}%</span></li>`})}</ul></div>`}function xf(e,t,r,n){let{prefix:o,stripped:s}=Rt(r),i=new Set;for(let v of s)i.add(ho(v));let l=s.map((v,S)=>S).toSorted((v,S)=>s[v].localeCompare(s[S])),d=s.map((v,S)=>({path:v,size:n[S]})),u=Jy(d),p=u===g?c`<p class="bundles-overview-col-empty">No size information for this bundle's sources.</p>`:u,f={critical:0,high:0,medium:0,low:0,high_bug:0,bug:0,informational:0},h=0,b=new Map;if(a.bundleDetails?.fileHashes){let v=kr(a.bundleDetails.fileHashes,"issues");for(let S of v.values())for(let C of S){f[C.severity]!==void 0&&f[C.severity]++,h++;for(let R of Mn(C.fileHash,C))b.set(R,(b.get(R)??0)+1)}}let m=[...b.keys()].toSorted(),y=me.filter(v=>f[v]>0).map(v=>c`<span class="${`tree-count-chip ${v}`}">${f[v]} ${v.replaceAll("_"," ")}</span>`),$=r.length>0?c`<ul class="bundles-sources-list">${l.map(v=>{let S=r[v],C=s[v],R=n[v];return c`<li><button type="button" class="bundles-source-row" data-bundle-view-source="${S}" data-tooltip="${S}"><span class="bundles-source-path">${C}</span> ${R==null?g:c`<span class="bundles-source-size">${De(R)}</span>`}</button></li>`})}</ul>`:c`<p class="bundles-overview-col-empty">No source files in this bundle.</p>`,w=m.length>0?c`<ul class="bundles-reports-list">${m.map(v=>{let S=Y[Ke(v)]??Y.default,C=b.get(v)??0;return c`<li><button type="button" class="report-chip bundles-report-chip" data-tooltip="${v}" data-bundle-issue-report="${v}">${ue(S)}<span class="report-chip-label">${Ne(v)}</span> <span class="bundles-report-count">${C} ${C===1?"issue":"issues"}</span></button></li>`})}</ul>`:c`<p class="bundles-overview-col-empty">No matching reports indexed yet.</p>`;return c`<div class="bundles-overview"><div class="bundles-overview-summary">${e}<dl class="bundles-detail-meta">${t}<dt>Sources</dt><dd>${r.length}</dd>${o?c`<dt>Prefix</dt><dd class="mono">${o}</dd>`:g}</dl>${h>0?c`<div class="bundles-issue-summary tree-count-chips">${y}</div>`:g}</div><div class="bundles-overview-columns"><section class="bundles-overview-col"><header class="bundles-overview-col-head">Packages <span class="bundles-overview-col-count">${i.size}</span></header><div class="bundles-overview-col-body">${p}</div></section><section class="bundles-overview-col"><header class="bundles-overview-col-head">Files <span class="bundles-overview-col-count">${r.length}</span></header><div class="bundles-overview-col-body bundles-overview-col-body--list">${$}</div></section>${m.length>0?c`<section class="bundles-overview-col"><header class="bundles-overview-col-head">Reports <span class="bundles-overview-col-count">${m.length}</span></header><div class="bundles-overview-col-body bundles-overview-col-body--list">${w}</div></section>`:g}</div></div>`}var zl=new Map,Wl=new Set;function Xs(e){for(let t of me)for(let r of e)if(r.severity===t)return t;return e[0]?.severity??null}function Af(e,t,r,n){let o=e.split(`
45
+ `).length,s=String(o).length,i=Ds(t),l=`${r??""}\0${t}`;i&&!zl.has(l)&&!Wl.has(l)&&(Wl.add(l),(async()=>{let u=await Us(e,i);zl.set(l,u??null),Wl.delete(l),a.bundleSourceFile===t&&k()})());let d=zl.get(l);return c`<div class="bundle-source-lines" style="${we({"--lineno-width":`${s}ch`})}"><aside class="bundle-source-lineno-col" aria-hidden="true">${Array.from({length:o},(u,p)=>{let f=p+1,h=n.get(f),b=h?Xs(h.map(y=>y.f)):null,m=h&&a.bundleSourceFindingIdx!=null&&h.some(y=>y.idx===a.bundleSourceFindingIdx);return c`<div class="bundle-source-lineno-row" data-line="${f}">${h?c`<button type="button" class="${F({"bundle-source-dot":!0,[`sev-${b}`]:!0,active:m})}" data-bundle-source-finding="${h[0].idx}" title="${`${h.length} ${h.length===1?"issue":"issues"} on line ${f}`}" aria-label="${`${h.length} issues on line ${f}`}"></button>`:c`<span class="bundle-source-dot-placeholder"></span>`} <span class="bundle-source-lineno-num">${f}</span></div>`})}</aside><pre class="bundle-source-code"><code class="${i?`language-${i}`:""}">${typeof d=="string"?ue(d):e}</code></pre></div>`}function Tf(e){let t=a.bundleSourceFindingIdx;if(t==null)return g;let r=e[t];if(!r)return g;let n=r.fileHash?Mn(r.fileHash,r):[],o=a.triage.get(P(r))?.triage,s=o==="fixed"?"Fixed":null,i=br(r),l=Bf(r.line);return c`<aside class="bundle-source-panel"><header class="bundle-source-panel-bar"><span class="${`bundle-source-panel-sev sev-${r.severity}`}">${r.severity.replaceAll("_"," ")}</span> ${s?c`<span class="${`bundle-source-panel-triage triage-${o}`}">${s}</span>`:g} <button type="button" class="bundle-source-panel-close" data-action="bundle-source-panel-close" title="Close (Esc)" aria-label="Close finding details">×</button></header><div class="bundle-source-panel-body">${l||i?c`<div class="bundle-source-panel-line-row">${l?c`<span class="bundle-source-panel-line">${l}</span>`:g} ${i?c`<span class="bundle-source-panel-meta" title="${i}">${i}</span>`:g}</div>`:g}<div class="bundle-source-panel-desc">${r.description??""}</div>${n.length>0?c`<div class="bundle-source-panel-reports"><div class="bundle-source-panel-reports-label">Reported by</div>${n.map(d=>{let u=Y[Ke(d)]??Y.default;return c`<button type="button" class="report-chip bundle-source-panel-report" title="${d}" data-bundle-issue-report="${d}">${ue(u)}<span class="report-chip-label">${Ne(d)}</span></button>`})}</div>`:g}</div></aside>`}function If(){let e=a.bundleSourceFile;if(!e)return g;if(a.bundleDetailsTab==="code")return g;let r=dt(a.bundleDetails).get(e),n=[],o=new Map;if(typeof r=="string"&&a.bundleDetails?.fileHashes){let i=kr(a.bundleDetails.fileHashes,"issues").get(e)??[];for(let l=0;l<i.length;l++){let d=i[l];n.push(d);let u=parseInt(d.line,10);Number.isFinite(u)&&u>0&&(o.has(u)||o.set(u,[]),o.get(u).push({f:d,idx:l}))}}return c`<div class="bundle-source-overlay"><div class="${F({"bundle-source-modal":!0,"with-panel":a.bundleSourceFindingIdx!=null})}"><header class="bundle-source-bar"><div class="bundle-source-title" title="${e}">${e}</div><button type="button" class="bundle-source-close" data-action="bundle-source-close" title="Close source viewer (Esc)" aria-label="Close source viewer">×</button></header><div class="bundle-source-body"><div class="bundle-source-code-wrap">${typeof r=="string"?Af(r,e,a.bundleDetails?.integrity,o):c`<div class="bundle-source-empty">Source content not bundled.</div>`}</div>${Tf(n)}</div></div></div>`}function Rf(e){let t={name:"",files:new Map,dirs:new Map};for(let r of e){let n=r.split("/"),o=t;for(let s=0;s<n.length-1;s++){let i=n[s],l=o.dirs.get(i);l||(l={name:i,files:new Map,dirs:new Map},o.dirs.set(i,l)),o=l}o.files.set(n.at(-1),r)}return t}var Js=new Map,_f=null;function Hl(e,t,r=0,n=null,o="",s=!1){let i=[...e.dirs.entries()].toSorted(([f],[h])=>f.localeCompare(h)),l=[...e.files.entries()].toSorted(([f],[h])=>f.localeCompare(h)),d=f=>{if(!t)return!1;for(let h of f.files.values())if(h===t)return!0;for(let h of f.dirs.values())if(d(h))return!0;return!1},u=(f,h)=>s?!0:Js.has(f)?Js.get(f):r===0||d(h),p=f=>h=>{Js.set(f,!h.currentTarget.parentElement.open)};return c`<ul class="${F({"bundle-code-tree":!0,root:r===0})}">${J(i,([f])=>`${o}/${f}`,([f,h])=>{let b=o?`${o}/${f}`:f;return c`<li class="bundle-code-tree-dir"><details ?open="${u(b,h)}"><summary @click="${p(b)}">${f}</summary>${Hl(h,t,r+1,n,b,s)}</details></li>`})} ${J(l,([,f])=>f,([f,h])=>{let b=n?.get(h),m=b&&b.length>0?Xs(b):null,y=b?.length??0;return c`<li class="bundle-code-tree-file"><button type="button" class="${F({"bundle-code-tree-link":!0,current:h===t})}" data-bundle-view-source="${h}" title="${h}"><span class="bundle-code-tree-name">${f}</span> ${y>0?c`<span class="${`bundle-code-tree-count sev-${m}`}" title="${`${y} ${y===1?"issue":"issues"}`}">${y}</span>`:g}</button></li>`})}</ul>`}function Xy(e,t,r,n,o=""){if(!r)return Hl(e,t,0,n);let s=r.toLowerCase(),i=[],l=h=>{for(let[,b]of h.dirs)l(b);for(let[,b]of h.files)(o&&b.startsWith(o)?b.slice(o.length):b).toLowerCase().includes(s)&&i.push(b)};if(l(e),i.length===0)return c`<div class="bundle-code-search-empty">No files match.</div>`;let d=o?i.map(h=>h.startsWith(o)?h.slice(o.length):h):i,u=new Map;for(let h=0;h<i.length;h++)u.set(d[h],i[h]);let p=Rf(d),f=h=>{let b=new Map;for(let[m,y]of h.files)b.set(m,u.get(y)??y);h.files=b;for(let m of h.dirs.values())f(m)};return f(p),Hl(p,t,0,n,"",!0)}function Qy(e,t,r,n=""){if(!t)return c`<div class="bundle-code-search-hint">Type to search across every source in this bundle.</div>`;let o=t.toLowerCase(),s=20,i=100,l=[],d=0;for(let[u,p]of e){if(typeof p!="string")continue;let f=[],h=p.split(`
46
+ `);for(let b=0;b<h.length;b++){let m=h[b];if(m.toLowerCase().includes(o)&&(f.push({ln:b+1,text:m}),d++,f.length>=s))break}if(f.length>0&&l.push({path:u,hits:f}),l.length>=i)break}return l.length===0?c`<div class="bundle-code-search-empty">No matches.</div>`:c`<div class="bundle-code-search-results"><div class="bundle-code-search-summary">${d} ${d===1?"hit":"hits"} in ${l.length} ${l.length===1?"file":"files"}</div>${l.map(({path:u,hits:p})=>{let f=n&&u.startsWith(n)?u.slice(n.length):u;return c`<div class="${F({"bundle-code-search-file":!0,current:u===r})}"><button type="button" class="bundle-code-search-file-name" data-bundle-view-source="${u}" title="${u}">${f}</button><ul class="bundle-code-search-hits">${p.map(h=>c`<li class="bundle-code-search-hit"><button type="button" class="bundle-code-search-hit-link" data-bundle-view-source="${u}" data-bundle-view-line="${h.ln}" data-bundle-view-scroll-block="start" title="${`${u}:${h.ln}`}"><span class="bundle-code-search-hit-ln">${h.ln}</span> <span class="bundle-code-search-hit-text mono">${h.text.slice(0,200)}</span></button></li>`)}</ul></div>`})}</div>`}function Zy(e,t,r,n=""){if(!e.fileHashes)return c`<div class="bundle-code-search-empty">Computing file hashes…</div>`;let o=kr(e.fileHashes,"issues");if(o.size===0)return c`<div class="bundle-code-search-empty">No issues match this bundle's files.</div>`;let s=t.toLowerCase(),i=[];for(let[l,d]of o)for(let u=0;u<d.length;u++){let p=d[u],f=p.description??"";s&&!l.toLowerCase().includes(s)&&!p.severity.includes(s)&&!f.toLowerCase().includes(s)||i.push({file:l,finding:p,fileIdx:u})}return i.sort((l,d)=>{let u=qe[l.finding.severity]??0,p=qe[d.finding.severity]??0;return p!==u?p-u:l.file.localeCompare(d.file)}),i.length===0?c`<div class="bundle-code-search-empty">No matches.</div>`:c`<div class="bundle-code-search-results"><div class="bundle-code-search-summary">${i.length} ${i.length===1?"issue":"issues"}</div><ul class="bundle-code-search-issues">${i.map(({file:l,finding:d,fileIdx:u})=>{let p=d.severity,f=n&&l.startsWith(n)?l.slice(n.length):l,h=l===r&&a.bundleSourceFindingIdx===u;return c`<li class="${F({"bundle-code-search-issue":!0,current:h})}"><button type="button" class="bundle-code-search-issue-link" data-bundle-view-source="${l}" data-bundle-view-finding-idx="${u}" data-bundle-view-line="${d.line??""}" title="${l}"><div class="bundle-code-search-issue-row"><span class="${`bundle-code-search-issue-sev sev-${p}`}">${p.replaceAll("_"," ")}</span> <span class="bundle-code-search-issue-path mono">${f}${d.line?`:${d.line}`:""}</span></div><div class="bundle-code-search-issue-desc">${d.description??""}</div></button></li>`})}</ul></div>`}function ew(e){if(!e||!e.json&&!e.bundle)return g;let t=dt(e);if(t.size===0)return c`<div class="bundle-code-empty">This bundle doesn't carry any source content.</div>`;_f!==a.selectedBundle&&(Js.clear(),_f=a.selectedBundle);let r=[...t.keys()].toSorted(),{prefix:n,stripped:o}=Rt(r),s=new Map;for(let w=0;w<r.length;w++)s.set(o[w],r[w]);let i=Rf(o),l=w=>{let v=new Map;for(let[S,C]of w.files)v.set(S,s.get(C)??C);w.files=v;for(let S of w.dirs.values())l(S)};l(i);let d=a.bundleSourceFile,u=d?t.get(d):null,p=[],f=new Map;if(typeof u=="string"&&e.fileHashes){let v=kr(e.fileHashes,"issues").get(d)??[];for(let S=0;S<v.length;S++){let C=v[S];p.push(C);let R=parseInt(C.line,10);Number.isFinite(R)&&R>0&&(f.has(R)||f.set(R,[]),f.get(R).push({f:C,idx:S}))}}let h=e.fileHashes?kr(e.fileHashes,"issues"):new Map,m=h.size>0?["files","code","issues"]:["files","code"],y=m.includes(a.bundleCodeSearchMode)?a.bundleCodeSearchMode:"files",$=a.bundleCodeSearchQuery;return c`<div class="bundle-code-view"><aside class="bundle-code-rail"><div class="bundle-code-rail-head"><span class="bundle-code-rail-label">Files</span> <span class="bundle-code-rail-count">${r.length}</span></div>${n?c`<div class="bundle-code-rail-prefix mono" title="${n}">${n}</div>`:g}<bundle-code-search .modes="${m}"></bundle-code-search><div class="bundle-code-rail-body">${Al(y,[["files",()=>Xy(i,d,$,h,n)],["code",()=>Qy(t,$,d,n)],["issues",()=>Zy(e,$,d,n)]])}</div></aside><div class="${F({"bundle-code-main":!0,"with-panel":a.bundleSourceFindingIdx!=null})}">${d?c`<header class="bundle-code-main-bar"><span class="bundle-code-main-path mono" title="${d}">${d}</span></header><div class="bundle-code-main-body"><div class="bundle-source-code-wrap">${typeof u=="string"?Af(u,d,e.integrity,f):c`<div class="bundle-source-empty">Source content not bundled.</div>`}</div>${Tf(p)}</div>`:c`<div class="bundle-code-placeholder">Pick a file from the tree to view its source.</div>`}</div></div>`}function tw(e){let t=vf(e,a.bundleDetails);a.bundleDetailsTab==="advisories"&&!t&&(a.bundleDetailsTab="overview");let r=a.bundleDetailsTab,n=r==="overview";return r==="advisories"&&t&&kf(a.bundleDetails,k).catch(()=>{}),c`<div class="bundles-view bundles-slide-view"><header class="bundles-slide-bar"><span class="bundles-slide-icon" aria-hidden="true">${ue(tn)}</span><div class="bundles-slide-title"><div class="bundles-slide-name">${e.name}</div></div><div class="bundles-slide-tabs" role="tablist">${t?c`<button type="button" class="${F({"bundles-tab":!0,active:r==="advisories"})}" data-bundle-tab="advisories" aria-selected="${String(r==="advisories")}" role="tab">Advisories</button>`:g} <button type="button" class="${F({"bundles-tab":!0,active:r==="issues"})}" data-bundle-tab="issues" aria-selected="${String(r==="issues")}" role="tab">Issues</button> <button type="button" class="${F({"bundles-tab":!0,active:r==="terminal"})}" data-bundle-tab="terminal" aria-selected="${String(r==="terminal")}" role="tab">Terminal</button> <button type="button" class="${F({"bundles-tab":!0,active:r==="treemap"})}" data-bundle-tab="treemap" aria-selected="${String(r==="treemap")}" role="tab">Treemap</button> <button type="button" class="${F({"bundles-tab":!0,active:r==="graph"})}" data-bundle-tab="graph" aria-selected="${String(r==="graph")}" role="tab">Graph</button> <button type="button" class="${F({"bundles-tab":!0,active:r==="code"})}" data-bundle-tab="code" aria-selected="${String(r==="code")}" role="tab">Code</button> <button type="button" class="${F({"bundles-tab":!0,active:n})}" data-bundle-tab="overview" aria-selected="${String(n)}" role="tab">Overview</button></div></header><div class="${F({"bundles-slide-body":!0,"bundles-slide-body-overview":n})}">${n?ow(e,a.bundleDetails):Al(r,[["terminal",()=>c`<div id="bundle-terminal-slot" class="bundle-terminal-slot"></div>`],["graph",()=>c`<div id="bundle-graph-slot" class="bundle-graph-slot"></div>`],["treemap",()=>c`<bundle-treemap .details="${a.bundleDetails}"></bundle-treemap>`],["code",()=>ew(a.bundleDetails)],["issues",()=>nw(a.bundleDetails)],["advisories",()=>$f(a.bundleDetails)]])}</div></div>`}function rw(e,t={}){if(!e)return g;let r=[];if(e.fileHash&&(r=Mn(e.fileHash,e)),r.length===0&&t.bucketKey&&(t.kind==="package"?r=ba(t.bucketKey,e):t.kind==="repository"&&(r=ya(t.bucketKey,e))),r.length===0)return g;let n=r.slice(0,2),o=r.length-n.length;return c`<div class="bundle-issue-reports">${n.map(s=>{let i=Y[Ke(s)]??Y.default;return c`<button type="button" class="report-chip" title="${s}" data-bundle-issue-report="${s}">${ue(i)}<span class="report-chip-label">${Ne(s)}</span></button>`})} ${o>0?c`<span class="bundle-issue-reports-more">, and ${o} more…</span>`:g}</div>`}function Bf(e){if(e==null||e==="")return"";let t=String(e),r=t.indexOf("-");if(r>0){let o=parseInt(t.slice(0,r),10),s=parseInt(t.slice(r+1),10);return Number.isFinite(o)&&Number.isFinite(s)&&s>o?`Lines ${o}-${s}`:Number.isFinite(o)?`Line ${o}`:""}let n=parseInt(t,10);return Number.isFinite(n)?`Line ${n}`:""}function nw(e){if(!e||!e.json&&!e.bundle)return g;if(!e.fileHashes)return c`<div class="bundle-issues-empty">Computing file hashes…</div>`;let t=kr(e.fileHashes,"issues");return t.size===0?c`<div class="bundle-issues-empty">No issues match this bundle's files.</div>`:go(t,{kind:"bundle"})}function go(e,{kind:t,bucketKey:r}={}){let n=[...e.keys()],{prefix:o,stripped:s}=Rt(n),i=new Map(n.map((u,p)=>[u,s[p]])),l=[...e.entries()].toSorted(([u,p],[f,h])=>{let b=qe[Xs(p)]??0,m=qe[Xs(h)]??0;return m!==b?m-b:(i.get(u)??u).localeCompare(i.get(f)??f)}),d=[...e.values()].reduce((u,p)=>u+p.length,0);return c`<div class="bundle-issues"><div class="bundle-issues-summary">${d} ${d===1?"issue":"issues"} across ${e.size} ${e.size===1?"file":"files"} ${o?c`<span class="mono">${o}</span>`:g}</div><ul class="bundle-issues-list">${J(l,([u])=>u,([u,p])=>{let f=i.get(u)??u,h=[...p].toSorted((m,y)=>{let $=qe[m.severity]??0,w=qe[y.severity]??0;if(w!==$)return w-$;let v=parseInt(m.line,10)||0,S=parseInt(y.line,10)||0;return v-S}),b=t==="repository"&&r?`${/^https?:/iu.test(r)?r.replace(/\/$/u,""):`https://github.com/${r}`}/blob/HEAD/${u}`:null;return c`<li class="bundle-issues-file-group"><header class="bundle-issues-file-header">${t==="bundle"?c`<button type="button" class="bundle-issues-file-name mono" data-bundle-view-source="${u}" title="${u}">${f}</button>`:b?c`<a class="bundle-issues-file-name bundle-issues-file-name-link mono" href="${b}" target="_blank" rel="noopener" title="${u}">${f}</a>`:c`<span class="bundle-issues-file-name bundle-issues-file-name-static mono" title="${u}">${f}</span>`} <span class="bundle-issues-file-count">${p.length} ${p.length===1?"issue":"issues"}</span></header><ul class="bundle-issues-findings">${J(h,m=>m.id??`${u}\0${m.line??""}\0${m.severity??""}\0${m.description??""}`,m=>{let y=p.indexOf(m),$=m.severity,w=a.triage.get(P(m))?.triage,v=w==="fixed"||w==="invalid"||w==="deleted"?w.toUpperCase():null,S=c`<div class="bundle-issues-finding-head"><span class="${`bundle-issue-sev sev-${$}`}">${$.replaceAll("_"," ")}</span> ${(()=>{let C=Bf(m.line);return C?c`<span class="bundle-issues-finding-line">${C}</span>`:g})()} ${v?c`<span class="${`bundle-issues-finding-triage triage-${w}`}">${v}</span>`:g} <span class="bundle-issues-finding-spacer"></span> ${rw(m,{kind:t,bucketKey:r})}</div><div class="bundle-issues-finding-desc">${m.description??""}</div>`;return c`<li class="bundle-issues-finding">${t==="bundle"?c`<button type="button" class="bundle-issues-finding-link" data-bundle-view-source="${u}" data-bundle-view-finding-idx="${y}" data-bundle-view-line="${m.line??""}" title="${u}">${S}</button>`:c`<div class="bundle-issues-finding-link bundle-issues-finding-static" title="${u}">${S}</div>`}</li>`})}</ul></li>`})}</ul></div>`}function Ff(e){let t=a.selectedBundle,r=t?e.find(n=>n.integrity===t):null;return r?tw(r):c`<div class="bundles-view bundles-view-empty"><p class="bundles-empty-hint">${e.length===0?"No bundles yet. Drop a `.map` sourcemap or a `.stasis.code.br` bundle to start.":"Pick a bundle from the sidebar to open it."}</p></div>`}function ow(e,t){let r=c`<dl class="bundles-detail-meta"><dt>Name</dt><dd>${e.name}</dd><dt>Integrity</dt><dd class="mono">${e.integrity}</dd>${t&&t.integrity===e.integrity?c`<dt>Size</dt><dd>${De(t.size)}</dd>`:g}</dl>`;if(!t||t.integrity!==e.integrity)return c`<div class="bundles-overview"><div class="bundles-overview-summary">${r}</div></div>`;if(t.error)return c`<div class="bundles-overview"><div class="bundles-overview-summary">${r}</div><div class="bundles-overview-placeholder is-error">Failed to parse: ${t.error}</div></div>`;if(t.kind==="sourcemap"&&t.json){let n=t.json,o=n.sources??[],s=n.sourcesContent??[],i=o.map((d,u)=>typeof s[u]=="string"?new TextEncoder().encode(s[u]).byteLength:null),l=c`<dt>Version</dt><dd>${String(n.version??"?")}</dd>${n.file?c`<dt>Output</dt><dd class="mono">${n.file}</dd>`:g} ${n.sourceRoot?c`<dt>Source root</dt><dd class="mono">${n.sourceRoot}</dd>`:g} ${n.names?c`<dt>Names</dt><dd>${n.names.length}</dd>`:g}`;return xf(r,l,o,i)}if(t.kind==="stasis"&&t.bundle){let n=t.bundle,o=n.sources,s=[...o.keys()],i=new Set;for(let p of n.imports.keys()){let f=p.replace(/\s*\(with: .*\)\s*$/u,"");for(let h of f.split(", "))i.add(h)}let l=[...i].toSorted(),d=s.map(p=>{let f=o.get(p);return typeof f=="string"?new TextEncoder().encode(f).byteLength:null}),u=c`<dt>Version</dt><dd>${String(n.version)}</dd>${l.length>0?c`<dt>Resolution kinds</dt><dd>${l.join(", ")}</dd>`:g}`;return xf(r,u,s,d)}return c`<div class="bundles-overview"><div class="bundles-overview-summary">${r}</div><div class="bundles-overview-placeholder">Bundle contents not parsed.</div></div>`}function Mf(){yt().catch(()=>{});let e=bt(),t={fixed:0,invalid:0,deleted:0},r=[];for(let[h,b]of e){let m=[],y=[],$=new Map,w=new Set;for(let[v,S]of b.byVersion){let C=[],R=new Map;for(let O of S.findings){let ye=a.triage.get(P(O))?.triage??null;ye==="fixed"?t.fixed++:ye==="invalid"?t.invalid++:ye==="deleted"&&t.deleted++,ye===a.shownTriage&&(C.push(O),R.has(O.file)||R.set(O.file,[]),R.get(O.file).push(O))}if(C.length!==0){m.push([v,{findings:C,files:R,reports:S.reports}]);for(let O of C)y.push(O),$.has(O.file)||$.set(O.file,[]),$.get(O.file).push(O);for(let O of S.reports)w.add(O)}}m.length!==0&&(m.sort(([v],[S])=>Mi(v,S)),r.push([h,{findings:y,files:$,reports:w,versions:m}]))}let n=a.selectedPackage,o=n?r.find(([h])=>h===n)??null:null,s=null;if(o){let h=o[1].versions,b=a.selectedPackageVersion;s=h.find(([m])=>m===b)??null,!s&&h.length===1&&(s=h[0])}let i=s?s[1]:o?o[1]:null;if(o&&a.packageDetailsTab==="issues")return uw(o[0],i,s?s[0]:void 0);let l=a.packagesSearchQuery.trim().toLowerCase(),d=l?r.filter(([h])=>h.toLowerCase().includes(l)):r.slice();cw(d,a.packagesSortBy);let u=r.reduce((h,[,b])=>h+b.findings.length,0),p=new Set;for(let[,h]of r)for(let b of h.reports)p.add(b);let f=o?"packages-layout open":"packages-layout";return c`<div class="${F({"packages-view":!0,"with-details":!!o})}"><header class="page-head"><div class="page-title"><h1>Packages</h1><div class="meta-row"><span>${d.length===r.length?c`${r.length} ${r.length===1?"package":"packages"}`:c`${d.length} of ${r.length} ${r.length===1?"package":"packages"}`}</span> ${u>0?c`<span>${u} ${u===1?"finding":"findings"} across ${p.size} ${p.size===1?"report":"reports"}</span>`:g}</div></div>${aw(t)}</header>${r.length===0?c`<p style="color:var(--muted)">${e.size===0?"Indexing reports\u2026 this view populates as the OPFS scan finishes.":a.shownTriage?`No ${a.shownTriage} findings in any package.`:"No untriaged findings in any package."}</p>`:d.length===0?c`<p style="color:var(--muted)">No packages match "${a.packagesSearchQuery}".</p>`:c`<div class="${f}"><ul class="packages-list">${J(sw(d),iw,h=>pw(h,n,a.selectedPackageVersion))}</ul>${o?c`<aside class="packages-details" id="packages-details"><header class="packages-details-bar"><span class="packages-details-label">Details</span> <button type="button" class="packages-details-close" data-deselect-package title="Close details" aria-label="Close details">×</button></header><div class="packages-details-body">${gw(o[0],i,s?s[0]:void 0)}</div></aside>`:g}</div>`}</div>`}function sw(e){let t=[];for(let[r,n]of e){let o=n.versions;if(o.length<=1){let[d,u]=o[0];t.push({kind:"single",pkg:r,version:d,bucket:u,totalVersions:1});continue}let[s,i]=o[0],l=a.expandedPackages.has(r);if(t.push({kind:"latest",pkg:r,version:s,bucket:i,totalVersions:o.length,expanded:l}),l)for(let d=1;d<o.length;d++){let[u,p]=o[d];t.push({kind:"other",pkg:r,version:u,bucket:p,totalVersions:o.length})}}return t}function iw(e){return e.version===null?`${e.kind}:${e.pkg}`:`${e.kind}:${e.pkg}@${e.version}`}function aw(e){return c`<div class="packages-toolbar"><entity-search kind="packages"></entity-search><entity-sort kind="packages"></entity-sort><triage-selector variant="packages" .counts="${e}" .states="${lw}"></triage-selector></div>`}var lw=["fixed","invalid","deleted"];function cw(e,t){let r=t==="name-asc"?(n,o)=>n[0].localeCompare(o[0]):t==="files-desc"?(n,o)=>o[1].files.size-n[1].files.size||n[0].localeCompare(o[0]):t==="reports-desc"?(n,o)=>o[1].reports.size-n[1].reports.size||n[0].localeCompare(o[0]):(n,o)=>o[1].findings.length-n[1].findings.length||n[0].localeCompare(o[0]);e.sort(r)}function dw(e,t){let r={live:0,invalid:0,deleted:0};if(!e)return r;let n=t===void 0?e.files.values():e.byVersion.get(t)?.files.values()??[].values();for(let o of n)for(let s of o){let i=a.triage.get(P(s))?.triage??null;i==="invalid"?r.invalid++:i==="deleted"?r.deleted++:r.live++}return r}function uw(e,t,r){let n=bt().get(e),o=dw(n,r),s=a.packageSlideTriage??"live",i=n?Lf(n,e,s,r):new Map,l=[...i.values()].reduce((f,h)=>f+h.length,0),d=s==="live"?l===1?"issue":"issues":l===1?`${s} issue`:`${s} issues`,u=s==="live"?"No live issues for this package.":`No ${s} issues for this package.`,p=typeof r=="string"?` @ ${r}`:"";return c`<div class="packages-view packages-slide-view"><header class="bundles-slide-bar"><button type="button" class="bundles-slide-back" data-action="package-slide-back" title="Back to packages" aria-label="Back to packages">← Back</button><div class="bundles-slide-title"><div class="bundles-slide-name">${e}${p}</div><div class="bundles-slide-integrity">${l} ${d} · ${t.files.size} ${t.files.size===1?"file":"files"} · ${t.reports.size} ${t.reports.size===1?"report":"reports"}</div></div><slide-triage-tabs kind="package" .counts="${o}"></slide-triage-tabs></header><div class="bundles-slide-body">${i.size===0?c`<div class="bundle-issues-empty">${u}</div>`:go(i,{kind:"package",bucketKey:e})}</div></div>`}function pw(e,t,r){let{kind:n,pkg:o,version:s,bucket:i}=e,l={critical:0,high:0,medium:0,low:0,high_bug:0,bug:0,informational:0};for(let m of i.findings)l[m.severity]!==void 0&&l[m.severity]++;let d=me.filter(m=>l[m]>0),u=Ft(o),f={selected:o===t&&fw(e,r),"packages-row-latest":n==="latest","packages-row-other":n==="other"},h=s===null?"":s,b=s===null?`Open issues for ${o}`:`Open issues for ${o}@${s}`;return c`<li class="${F(f)}" data-select-package="${o}" data-select-package-version="${h}"><span class="packages-dot" style="${we({background:u})}"></span><div class="packages-row-text"><div class="packages-name-line"><span class="packages-name">${o}${s===null?g:c`<span class="packages-version">@${s}</span>`} </span>${n==="latest"?hw(o,e.expanded,e.totalVersions-1):g}</div><span class="packages-row-meta">${i.findings.length} ${i.findings.length===1?"finding":"findings"} · ${i.files.size} ${i.files.size===1?"file":"files"} · ${i.reports.size} ${i.reports.size===1?"report":"reports"}</span></div>${d.length>0?c`<div class="packages-row-chips">${d.map(m=>c`<span class="${`tree-count-chip ${m}`}" title="${m.replaceAll("_"," ")}">${l[m]}</span>`)}</div>`:g} <button type="button" class="packages-row-issues" data-package-row-issues="${o}" data-package-row-issues-version="${h}" aria-label="${b}">Issues →</button></li>`}function fw(e,t){return e.kind==="single"?!0:e.version===t}function hw(e,t,r){let n=t?"Hide":`+${r} ${r===1?"version":"versions"}`;return c`<button type="button" class="${F({"packages-row-expand":!0,expanded:t})}" data-package-expand="${e}" aria-expanded="${String(t)}" aria-label="${t?`Hide older versions of ${e}`:`Show older versions of ${e}`}" title="${t?"Hide older versions":`Show older versions (${r})`}"><span class="packages-row-expand-chevron" aria-hidden="true"></span> <span class="packages-row-expand-label">${n}</span></button>`}function gw(e,t,r){let n=bt().get(e),s=[...(n?Lf(n,e,"live",r):new Map).values()].reduce((i,l)=>i+l.length,0);return c`<div class="bundles-tabs" role="tablist"><button type="button" class="bundles-tab active" data-package-tab="overview" aria-selected="true" role="tab">Overview</button> <span class="bundles-tabs-spacer"></span> ${s>0?c`<button type="button" class="bundles-tab bundles-tab-action" data-package-tab="issues">Issues (${s}) →</button>`:g}</div>${mw(e,t,r)}`}function Lf(e,t,r="live",n){let o=new Map,s=n===void 0?e.files:e.byVersion.get(n)?.files??new Map;for(let[i,l]of s){let d=l.filter(f=>{let h=a.triage.get(P(f))?.triage??null;return r==="invalid"?h==="invalid":r==="deleted"?h==="deleted":h!=="invalid"&&h!=="deleted"});if(d.length===0)continue;let u=Pf(t,i);o.has(u)||o.set(u,[]);let p=o.get(u);for(let f of d)p.push(f)}return o}function mw(e,t,r){let n={critical:0,high:0,medium:0,low:0,high_bug:0,bug:0,informational:0};for(let f of t.findings)n[f.severity]!==void 0&&n[f.severity]++;let o=me.filter(f=>n[f]>0),s=[...t.files.entries()].toSorted(([f,h],[b,m])=>m.length!==h.length?m.length-h.length:f.localeCompare(b)),i=[...t.reports].toSorted((f,h)=>f.localeCompare(h)),d=bt().get(e)?.repos,u=d&&d.size===1?[...d][0]:null,p=u?/^https?:/iu.test(u)?u:`https://github.com/${u}`:null;return c`<dl class="packages-detail-meta"><dt>Package</dt><dd class="mono">${e}</dd>${r?c`<dt>Version</dt><dd class="mono">${r}</dd>`:g} ${p?c`<dt>Repository</dt><dd class="mono"><a href="${p}" target="_blank" rel="noopener">${u}</a></dd>`:g}<dt>Findings</dt><dd>${t.findings.length}</dd><dt>Files</dt><dd>${t.files.size}</dd><dt>Reports</dt><dd>${t.reports.size}</dd></dl>${o.length>0?c`<div class="packages-detail-chips">${o.map(f=>c`<span class="${`tree-count-chip ${f}`}">${n[f]} ${f.replaceAll("_"," ")}</span>`)}</div>`:g}<h3 class="packages-detail-section">Reports</h3><ul class="packages-detail-reports">${i.map(f=>{let h=Y[Ke(f)]??Y.default;return c`<li><button type="button" class="packages-detail-report" title="${f}" data-package-report="${f}">${ue(h)}<span class="packages-detail-report-label">${Ne(f)}</span></button></li>`})}</ul><h3 class="packages-detail-section">Files</h3><ul class="packages-detail-files">${s.map(([f,h])=>{let b=Pf(e,f);return c`<li class="packages-detail-file"><span class="packages-detail-file-path mono" title="${f}">${b}</span> <span class="packages-detail-file-count">${h.length}</span></li>`})}</ul>`}function Pf(e,t){for(let r of["node_modules","dependencies"]){let n=`${r}/${e}/`,o=t.indexOf(n);if(o>=0)return t.slice(o+n.length)}return t.startsWith(`${e}/`)?t.slice(e.length+1):t}function et(e){if(!e)return"";let t=e.match(/github\.com\/([^/?#]+\/[^/?#]+?)(?:\.git)?(?:[/?#]|$)/iu);return t?t[1]:e}function Of(){yt().catch(()=>{});let e=fr(),t={fixed:0,invalid:0,deleted:0},r=[];for(let[p,f]of e){let h=[],b=new Map;for(let m of f.findings){let y=a.triage.get(P(m))?.triage??null;y==="fixed"?t.fixed++:y==="invalid"?t.invalid++:y==="deleted"&&t.deleted++,y===a.shownTriage&&(h.push(m),b.has(m.file)||b.set(m.file,[]),b.get(m.file).push(m))}h.length>0&&r.push([p,{findings:h,files:b,reports:f.reports}])}let n=a.selectedRepository,o=n?r.find(([p])=>p===n)??null:null;if(o&&a.repositoryDetailsTab==="issues")return kw(o[0],o[1]);let s=a.repositoriesSearchQuery.trim().toLowerCase(),i=s?r.filter(([p])=>p.toLowerCase().includes(s)||et(p).toLowerCase().includes(s)):r.slice();ww(i,a.repositoriesSortBy);let l=r.reduce((p,[,f])=>p+f.findings.length,0),d=new Set;for(let[,p]of r)for(let f of p.reports)d.add(f);let u=o?"packages-layout open":"packages-layout";return c`<div class="${F({"packages-view":!0,"with-details":!!o})}"><header class="page-head"><div class="page-title"><h1>Repositories</h1><div class="meta-row"><span>${i.length===r.length?c`${r.length} ${r.length===1?"repository":"repositories"}`:c`${i.length} of ${r.length} ${r.length===1?"repository":"repositories"}`}</span> ${l>0?c`<span>${l} ${l===1?"finding":"findings"} across ${d.size} ${d.size===1?"report":"reports"}</span>`:g}</div></div>${bw(t)}</header>${r.length===0?c`<p style="color:var(--muted)">${e.size===0?"Indexing reports\u2026 this view populates as the OPFS scan finishes.":a.shownTriage?`No ${a.shownTriage} findings in any repository.`:"No untriaged findings in any repository."}</p>`:i.length===0?c`<p style="color:var(--muted)">No repositories match "${a.repositoriesSearchQuery}".</p>`:c`<div class="${u}"><ul class="packages-list">${J(i,([p])=>p,([p,f])=>$w(p,f,p===n))}</ul>${o?c`<aside class="packages-details" id="repositories-details"><header class="packages-details-bar"><span class="packages-details-label">Details</span> <button type="button" class="packages-details-close" data-deselect-repository title="Close details" aria-label="Close details">×</button></header><div class="packages-details-body">${xw(o[0],o[1])}</div></aside>`:g}</div>`}</div>`}function bw(e){return c`<div class="packages-toolbar"><entity-search kind="repositories"></entity-search><entity-sort kind="repositories"></entity-sort><triage-selector variant="packages" .counts="${e}" .states="${yw}"></triage-selector></div>`}var yw=["fixed","invalid","deleted"];function ww(e,t){let r=t==="name-asc"?(n,o)=>et(n[0]).localeCompare(et(o[0])):t==="files-desc"?(n,o)=>o[1].files.size-n[1].files.size||et(n[0]).localeCompare(et(o[0])):t==="reports-desc"?(n,o)=>o[1].reports.size-n[1].reports.size||et(n[0]).localeCompare(et(o[0])):(n,o)=>o[1].findings.length-n[1].findings.length||et(n[0]).localeCompare(et(o[0]));e.sort(r)}function vw(e){let t={live:0,invalid:0,deleted:0};if(!e)return t;for(let r of e.files.values())for(let n of r){let o=a.triage.get(P(n))?.triage??null;o==="invalid"?t.invalid++:o==="deleted"?t.deleted++:t.live++}return t}function kw(e,t){let r=fr().get(e),n=vw(r),o=a.repositorySlideTriage??"live",s=r?Nf(r,o):new Map,i=[...s.values()].reduce((u,p)=>u+p.length,0),l=o==="live"?i===1?"issue":"issues":i===1?`${o} issue`:`${o} issues`,d=o==="live"?"No live issues for this repository.":`No ${o} issues for this repository.`;return c`<div class="packages-view packages-slide-view"><header class="bundles-slide-bar"><button type="button" class="bundles-slide-back" data-action="repository-slide-back" title="Back to repositories" aria-label="Back to repositories">← Back</button><div class="bundles-slide-title"><div class="bundles-slide-name">${et(e)}</div><div class="bundles-slide-integrity">${i} ${l} · ${t.files.size} ${t.files.size===1?"file":"files"} · ${t.reports.size} ${t.reports.size===1?"report":"reports"}</div></div><slide-triage-tabs kind="repository" .counts="${n}"></slide-triage-tabs></header><div class="bundles-slide-body">${s.size===0?c`<div class="bundle-issues-empty">${d}</div>`:go(s,{kind:"repository",bucketKey:e})}</div></div>`}function $w(e,t,r){let n={critical:0,high:0,medium:0,low:0,high_bug:0,bug:0,informational:0};for(let l of t.findings)n[l.severity]!==void 0&&n[l.severity]++;let o=me.filter(l=>n[l]>0),s=Ft(e),i=et(e);return c`<li class="${r?"selected":""}" data-select-repository="${e}"><span class="packages-dot" style="${we({background:s})}"></span><div class="packages-row-text"><span class="packages-name">${i}</span> <span class="packages-row-meta">${t.findings.length} ${t.findings.length===1?"finding":"findings"} · ${t.files.size} ${t.files.size===1?"file":"files"} · ${t.reports.size} ${t.reports.size===1?"report":"reports"}</span></div>${o.length>0?c`<div class="packages-row-chips">${o.map(l=>c`<span class="${`tree-count-chip ${l}`}" title="${l.replaceAll("_"," ")}">${n[l]}</span>`)}</div>`:g} <button type="button" class="packages-row-issues" data-repository-row-issues="${e}" aria-label="${`Open issues for ${i}`}">Issues →</button></li>`}function xw(e,t){let r=fr().get(e),o=[...(r?Nf(r):new Map).values()].reduce((s,i)=>s+i.length,0);return c`<div class="bundles-tabs" role="tablist"><button type="button" class="bundles-tab active" data-repository-tab="overview" aria-selected="true" role="tab">Overview</button> <span class="bundles-tabs-spacer"></span> ${o>0?c`<button type="button" class="bundles-tab bundles-tab-action" data-repository-tab="issues">Issues (${o}) →</button>`:g}</div>${_w(e,t)}`}function Nf(e,t="live"){let r=new Map;for(let[n,o]of e.files){let s=o.filter(i=>{let l=a.triage.get(P(i))?.triage??null;return t==="invalid"?l==="invalid":t==="deleted"?l==="deleted":l!=="invalid"&&l!=="deleted"});s.length>0&&r.set(n,s)}return r}function _w(e,t){let r={critical:0,high:0,medium:0,low:0,high_bug:0,bug:0,informational:0};for(let l of t.findings)r[l.severity]!==void 0&&r[l.severity]++;let n=me.filter(l=>r[l]>0),o=[...t.files.entries()].toSorted(([l,d],[u,p])=>p.length!==d.length?p.length-d.length:l.localeCompare(u)),s=[...t.reports].toSorted((l,d)=>l.localeCompare(d)),i=/^https?:/iu.test(e)?e:`https://github.com/${e}`;return c`<dl class="packages-detail-meta"><dt>Repository</dt><dd class="mono"><a href="${i}" target="_blank" rel="noopener">${et(e)}</a></dd><dt>Findings</dt><dd>${t.findings.length}</dd><dt>Files</dt><dd>${t.files.size}</dd><dt>Reports</dt><dd>${t.reports.size}</dd></dl>${n.length>0?c`<div class="packages-detail-chips">${n.map(l=>c`<span class="${`tree-count-chip ${l}`}">${r[l]} ${l.replaceAll("_"," ")}</span>`)}</div>`:g}<h3 class="packages-detail-section">Reports</h3><ul class="packages-detail-reports">${s.map(l=>{let d=Y[Ke(l)]??Y.default;return c`<li><button type="button" class="packages-detail-report" title="${l}" data-package-report="${l}">${ue(d)}<span class="packages-detail-report-label">${Ne(l)}</span></button></li>`})}</ul><h3 class="packages-detail-section">Files</h3><ul class="packages-detail-files">${o.map(([l,d])=>c`<li class="packages-detail-file"><span class="packages-detail-file-path mono" title="${l}">${l}</span> <span class="packages-detail-file-count">${d.length}</span></li>`)}</ul>`}var mo=new Map,bo=new Map,Vl=new Set;function Sw(e,t,r){let n=`${e}\0${t}`;if(bo.has(n)||Vl.has(n))return;let o=Ds(t);if(!o){bo.set(n,null);return}Vl.add(n),(async()=>{let s=await Us(r,o);bo.set(n,s??null),Vl.delete(n),a.focusCodeTick++,queueMicrotask(k)})()}async function Cw(e){let t=mo.get(e);if(t&&(t.loading||t.sources))return;let r=(a.bundles??[]).find(n=>n.integrity===e);if(r){mo.set(e,{sources:null,loading:!0,error:null});try{let n=await qs(e,r),o=dt(n);mo.set(e,{sources:o,loading:!1,error:n.error??null})}catch(n){mo.set(e,{sources:null,loading:!1,error:n.message})}a.focusCodeTick++,queueMicrotask(k),queueMicrotask(()=>{let n=E.querySelector(".focus-code-line-active");n&&n.scrollIntoView({block:"center",behavior:"instant"})})}}function Df(e){if(!e)return null;let t=Ae(e);if(!t.fileHash||!Array.isArray(t._bundleHashes)||t._bundleHashes.length===0)return null;let r=new Set(t._bundleHashes),n=hr(t.fileHash).find(({integrity:u})=>r.has(u));if(!n)return null;let o=mo.get(n.integrity);if(!o)return Cw(n.integrity),{loading:!0};if(o.loading)return{loading:!0};if(!o.sources)return null;let s=o.sources.get(n.file);if(typeof s!="string")return null;Sw(n.integrity,n.file,s);let i=`${n.integrity}\0${n.file}`,l=bo.has(i)?bo.get(i):void 0,d=parseInt(t.line,10);return{content:s,file:n.file,integrity:n.integrity,line:Number.isFinite(d)?d:null,highlighted:l,loading:!1}}var jl=class extends I{static styles=[...I.styles,T(Ie)];static properties={workspaceId:{type:String},items:{type:Array},_uploading:{state:!0},_errors:{state:!0},_done:{state:!0},_settled:{state:!0}};constructor(){super(),this.workspaceId="",this.items=[],this._uploading=!1,this._errors=[],this._done=!1,this._settled=!1}focusInitial(){this.renderRoot.querySelector('button[data-role="upload"]')?.focus()}_onClose=()=>this._finish({uploaded:[],failed:[]});_onCancel=()=>this._finish({uploaded:[],failed:[]});_onUpload=async()=>{if(this._uploading)return;this._uploading=!0,this._errors=[];let t=[],r=[];for(let n of this.items)try{let o;if(n.kind==="bundle")o=await dp(this.workspaceId,n.identifier);else{let s=await Tn(n.identifier);o=await Ss(this.workspaceId,n.identifier,s)}if(o.ok)t.push({kind:n.kind,identifier:n.identifier});else{let s=o.reason??"unknown";r.push({kind:n.kind,identifier:n.identifier,reason:s}),this._errors=[...this._errors,{label:Ge(n),reason:s}]}}catch(o){let s=o?.message??String(o);r.push({kind:n.kind,identifier:n.identifier,reason:s}),this._errors=[...this._errors,{label:Ge(n),reason:s}]}this._uploading=!1,this._done=!0,r.length===0&&this._finish({uploaded:t,failed:r})};_errorsSection(){return this._errors.length===0?g:c`<ul class="lwd-list" role="alert">${this._errors.map(t=>c`<li><strong>${t.label}</strong> — ${t.reason}</li>`)}</ul>`}render(){let t=this.items.length,r=t===1,n=this.items.filter(u=>u.kind==="report").length,o=t-n,s="items";o===0?s=r?"report":"reports":n===0&&(s=r?"bundle":"bundles");let i=r?c`Upload <strong>"${Ge(this.items[0])}"</strong> to the workspace's remote inventory?`:c`Upload <strong>${t}</strong> local ${s} to the workspace's remote inventory?`,l=r?g:c`<ul class="lwd-list">${this.items.map(u=>c`<li>${Ge(u)}${u.kind==="bundle"?c`<span class="lwd-kind-tag">bundle</span>`:g}</li>`)}</ul>`,d=this._uploading?r?"Uploading\u2026":`Uploading ${t} ${s}\u2026`:r?"Upload":`Upload ${t}`;return c`<dialog @close="${this._onClose}"><header><h3>Upload to remote</h3></header><p class="lwd-body">${i}</p>${l}<p class="nwd-note">End-to-end encrypted with the workspace key — only workspace members can decrypt the uploaded content.</p>${this._errorsSection()}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" data-role="cancel" @click="${this._onCancel}" ?disabled="${this._uploading}">${this._done&&this._errors.length>0?"Close":"Cancel"}</button> ${this._done&&this._errors.length>0?g:c`<button type="button" data-role="upload" @click="${this._onUpload}" ?disabled="${this._uploading||t===0}">${d}</button>`}</footer></dialog>`}};customElements.define("sync-upload-dialog",jl);function Uf({workspaceId:e,items:t}={}){return q("sync-upload-dialog",{workspaceId:e??"",items:Array.isArray(t)?[...t]:[]})}var Kl=class extends I{static styles=[...I.styles,T(Ie)];static properties={workspaceId:{type:String},items:{type:Array},_running:{state:!0},_errors:{state:!0},_done:{state:!0},_settled:{state:!0}};constructor(){super(),this.workspaceId="",this.items=[],this._running=!1,this._errors=[],this._done=!1,this._settled=!1}focusInitial(){this.renderRoot.querySelector('button[data-role="download"]')?.focus()}_onClose=()=>this._finish({downloaded:[],failed:[]});_onCancel=()=>this._finish({downloaded:[],failed:[]});_onDownload=async()=>{if(this._running)return;this._running=!0,this._errors=[];let t=[],r=[];for(let n of this.items)try{if(n.kind==="bundle"){let l=await cp(this.workspaceId,n.identifier);if(!l.ok){let d=l.reason??"unknown";r.push({kind:"bundle",identifier:n.identifier,reason:d}),this._errors=[...this._errors,{label:Ge(n),reason:d}];continue}await gr(n.identifier,this.workspaceId),t.push({kind:"bundle",identifier:n.identifier});continue}let o=await lp(this.workspaceId,n.identifier);if(!o){r.push({kind:"report",identifier:n.identifier,reason:"not found in remote"}),this._errors=[...this._errors,{label:Ge(n),reason:"not found in remote"}];continue}let s;try{s=ce(await ht(o.content))}catch{let l="remote payload is not gzipped UTF-8";r.push({kind:"report",identifier:n.identifier,reason:l}),this._errors=[...this._errors,{label:Ge(n),reason:l}];continue}let i=Oe(s);if(!i.recognized){let l="remote payload is not a recognized report format";r.push({kind:"report",identifier:n.identifier,reason:l}),this._errors=[...this._errors,{label:Ge(n),reason:l}];continue}await In(n.identifier,o.content),je(n.identifier,i.count,i.source),await At(n.identifier,this.workspaceId),t.push({kind:"report",identifier:n.identifier})}catch(o){let s=o?.message??String(o);r.push({kind:n.kind,identifier:n.identifier,reason:s}),this._errors=[...this._errors,{label:Ge(n),reason:s}]}if(this._running=!1,this._done=!0,t.some(n=>n.kind==="report"))try{a.currentWorkspace===this.workspaceId&&await Qt(this.workspaceId)}catch{}r.length===0&&this._finish({downloaded:t,failed:r})};_errorsSection(){return this._errors.length===0?g:c`<ul class="lwd-list" role="alert">${this._errors.map(t=>c`<li><strong>${t.label}</strong> — ${t.reason}</li>`)}</ul>`}render(){let t=this.items.length,r=t===1,n=this.items.filter(u=>u.kind==="report").length,o=t-n,s="items";o===0?s=r?"report":"reports":n===0&&(s=r?"bundle":"bundles");let i=r?c`Download <strong>"${Ge(this.items[0])}"</strong> from the workspace's remote inventory?`:c`Download <strong>${t}</strong> remote ${s} into this workspace?`,l=r?g:c`<ul class="lwd-list">${this.items.map(u=>c`<li>${Ge(u)}${u.kind==="bundle"?c`<span class="lwd-kind-tag">bundle</span>`:g}</li>`)}</ul>`,d=this._running?r?"Downloading\u2026":`Downloading ${t} ${s}\u2026`:r?"Download":`Download ${t}`;return c`<dialog @close="${this._onClose}"><header><h3>Download from remote</h3></header><p class="lwd-body">${i}</p>${l} ${this._errorsSection()}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" data-role="cancel" @click="${this._onCancel}" ?disabled="${this._running}">${this._done&&this._errors.length>0?"Close":"Cancel"}</button> ${this._done&&this._errors.length>0?g:c`<button type="button" data-role="download" @click="${this._onDownload}" ?disabled="${this._running||t===0}">${d}</button>`}</footer></dialog>`}};customElements.define("sync-download-dialog",Kl);function zf({workspaceId:e,items:t}={}){return q("sync-download-dialog",{workspaceId:e??"",items:Array.isArray(t)?[...t]:[]})}function Yl(){let e=_l(a.reports);if(!e)return null;let t=Object.keys(e),n=Bt().filter(p=>be(p).commonTriage===a.shownTriage),o=xl(n),s=Ps(e,o),i=new Map,l=new Map,d=new Map;for(let p of n)for(let f of p){i.has(f.file)||i.set(f.file,new Set),i.get(f.file).add(f.severity);let h=a.triage.get(P(f))?.color??"none";l.has(f.file)||l.set(f.file,new Set),l.get(f.file).add(h),d.has(f.file)||d.set(f.file,[]),d.get(f.file).push({severity:f.severity,color:h})}let u;return A.focusedPkg?(u=t.filter(p=>(Kp(p)??"__own__")===A.focusedPkg),A.showAll||(u=u.filter(p=>Sl(p,o,s)))):u=A.showAll?t:t.filter(p=>Sl(p,o,s)),{prep:{treeData:e,files:u,ownCounts:o,transitiveCounts:s,severitySets:i,colorSets:l,fileFindings:d},findingCounts:o}}function Jl(){let e=en();if(!e)return;let t=Yl();t&&e.refreshSidebar(t.prep,{isBundleContext:a.currentView==="bundles"})}function Xl(){let e=en();if(!e)return;let t=Yl();t&&e.refreshTopPkgs(t.prep)}var Ew={"claude-security":"Claude Security findings","codex-security":"Codex Security findings",deepsec:"DeepSec findings"};function Aw(e,t){return a.currentWorkspace?t?c`<repo-chip url="${t}"></repo-chip>`:g:e?c`<repo-chip url="${a.repoUrl}" editable ?editing="${a.repoEditing}" ?empty="${!a.repoUrl}"></repo-chip>`:t?c`<repo-chip url="${t}"></repo-chip>`:g}var ql=["type","model","effort","exportsMode"];function Wf(e,t){return e==="type"?`analyzer: ${t??"null"}`:t??null}function Tw(e,t=ql){let r=new Map;for(let p of e){let f={};for(let b of t)f[b]=b==="model"?gl(p.model)??null:p[b]??null;let h=t.map(b=>f[b]??"").join("|");r.has(h)||r.set(h,f)}let n=[...r.values()];if(n.length===0)return[];let o={};for(let p of t)o[p]=new Set(n.map(f=>f[p])).size===1;let s=t.filter(p=>!o[p]),i=["model","effort"].filter(p=>t.includes(p)&&o[p]),l=[...i,...t.filter(p=>!i.includes(p))],d=[],u=!1;for(let p of l)if(o[p]){let f=Wf(p,n[0][p]);f!=null&&d.push(f)}else if(!u){for(let f of n){let h=s.map(b=>Wf(b,f[b])).filter(b=>b!=null);h.length>0&&d.push(h.join(" \xB7 "))}u=!0}return d}function Iw(e,t,r,n,o){let s=new Set(a.reports.map(K=>K.source)),i=s.size===1?[...s][0]:null,l=a.currentWorkspace?z().find(K=>K.id===a.currentWorkspace):null,d=l?`Workspace: ${l.name}`:i?Ew[i]:"Findings",u=i&&Y[i]?i:"default",p=ue(Y[u]),f=c`<svg class="file-icon" viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M14 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z"/><path d="M14 3v6h6"/></svg>`,h=g;t.length===1?h=c`<span class="file-chip">${p}<span>${t[0]}</span></span>`:t.length>1&&(h=c`<span class="file-chip">${f}<span>${t.length} reports</span></span>`);let b=a.reports.flatMap(K=>K.groups.flat()),y=`${e} ${`finding${e===1?"":"s"}`}`,w=i||a.currentWorkspace?ql.filter(K=>K!=="type"):ql,v=Tw(b,w),S=g;if(e>0){let K={};for(let Re of Bt()){let rt=Ue(Re).severity;rt&&(K[rt]=(K[rt]||0)+1)}let tr=me.filter(Re=>K[Re]>0);tr.length>0&&(S=c`<span class="status-bar" aria-hidden="true">${tr.map(Re=>{let rt=`${K[Re]} ${Re.replaceAll("_"," ")}`;return c`<span class="${`status-seg sev-${Re}`}" style="${we({flexGrow:K[Re]})}" title="${rt}"></span>`})}</span>`)}let C=Aw(r,n),R=c`<span class="sep" aria-hidden="true"></span>`,O=a.currentView==="files",ye=(o??0)>1?c`<button type="button" class="${F({"files-toggle-btn":!0,active:O})}" data-action="toggle-files" title="${O?"exit files view":"show files"}" aria-pressed="${String(O)}">${`Files: ${o}`}</button>`:g;return c`<header class="page-head"><div class="page-title"><h1>${d}${h}${C}${ye}${Rw()}</h1><div class="meta-row"><span>${y}</span> ${S} ${v.length>0?c`${R}${v.map(K=>c`<span class="tag">${K}</span>`)}`:g}</div></div></header>`}function Rw(){if(D.status!=="online")return g;if(a.currentView!=="findings"&&a.currentView!=="files")return g;let e=Mw();if(!e)return g;let{workspaceId:t,fileNames:r,mode:n}=e;if(n==="single"){let C=r[0],R=dl(t,C)?"cloud":"local";return Bw({status:R,label:R,title:R==="cloud"?"Synced to remote":"Local only \u2014 click to upload",onClick:R==="local"?()=>Hf({workspaceId:t,items:[{kind:"report",identifier:C}]}):null})}let o=z().find(C=>C.id===t),s=o&&Array.isArray(o.bundles)?o.bundles:[],i=ep(t),l=r.filter(C=>!dl(t,C)),d=s.filter(C=>!Qu(t,C)),u=[...l.map(C=>({kind:"report",identifier:C})),...d.map(C=>({kind:"bundle",identifier:C}))],p=r.length-l.length,f=s.length-d.length,h=p+f,b=Math.max(0,i-h);if(i===0&&u.length===0)return g;let m=b>0,y=u.length>0,$=[i>0?`${i} in cloud`:null,u.length>0?`${u.length} local-only`:null,b>0?`click "cloud" to download ${b}`:null,u.length>0?`click "local" to upload ${u.length}`:null].filter(Boolean).join(" \u2014 "),w=i===0?g:m?c`<button type="button" class="sync-badge-chunk cloud" aria-label="${`${b} remote items not yet downloaded \u2014 open download dialog`}" @click="${C=>{C.stopPropagation(),Fw({workspaceId:t,localFileNames:r,localBundles:s})}}">${Gl()}<span>${i} cloud</span></button>`:c`<span class="sync-badge-chunk cloud" aria-label="${`${i} items in remote`}">${Gl()}<span>${i} cloud</span></span>`,v=u.length===0?g:c`<button type="button" class="sync-badge-chunk local" aria-label="${`${u.length} items not yet uploaded \u2014 open upload dialog`}" @click="${C=>{C.stopPropagation(),Hf({workspaceId:t,items:u})}}">${Gf()}<span>${u.length} local</span></button>`,S=i>0&&u.length>0?c`<span class="sync-badge-divider" aria-hidden="true"></span>`:g;return c`<div class="${`report-sync-badge${m||y?" report-sync-badge-clickable":""}`}" data-status="mixed" title="${$}">${w}${S}${v}</div>`}function Bw({status:e,label:t,title:r,onClick:n}){let o=e==="cloud"?Gl():Gf(),s=c`<span class="sync-badge-label">${t}</span>`;return typeof n!="function"?c`<span class="report-sync-badge" data-status="${e}" title="${r}" aria-label="${`report sync status: ${t}`}">${o}${s}</span>`:c`<button type="button" class="report-sync-badge report-sync-badge-clickable" data-status="${e}" title="${r}" aria-label="${`report sync status: ${t}`}" @click="${n}">${o}${s}</button>`}function Gf(){return c`<svg class="sync-badge-icon" viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="2" y="14" width="20" height="8" rx="2" ry="2"/><line x1="6" y1="18" x2="6.01" y2="18"/><line x1="10" y1="18" x2="10.01" y2="18"/><path d="M6 14V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v10"/></svg>`}function Gl(){return c`<svg class="sync-badge-icon" viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M17.5 19a4.5 4.5 0 1 0-1-8.9A6 6 0 0 0 5.07 13.5 4 4 0 0 0 6 21h11.5z"/></svg>`}async function Hf({workspaceId:e,items:t}){let r=t.filter(n=>n.kind==="bundle");if(r.length>0){let n=await lt(),o=new Map(n.map(s=>[s.integrity,s.name]));for(let s of r){let i=o.get(s.identifier);i&&(s.label=i)}}await Uf({workspaceId:e,items:t})}async function Fw({workspaceId:e,localFileNames:t,localBundles:r}){let[n,o]=await Promise.all([up(e),pp(e)]),s=new Set(t),i=new Set(r),l=[...n.filter(d=>!s.has(d)).map(d=>({kind:"report",identifier:d})),...o.filter(d=>!i.has(d)).map(d=>{let u=tp(e,d);return u?{kind:"bundle",identifier:d,label:u}:{kind:"bundle",identifier:d}})];await zf({workspaceId:e,items:l})}function Mw(){if(a.currentWorkspace)return{mode:"workspace",workspaceId:a.currentWorkspace,fileNames:a.reports.map(e=>e.fileName).filter(e=>typeof e=="string")};if(a.currentFile){let e=z().find(t=>Array.isArray(t.reports)&&t.reports.includes(a.currentFile));return e?{mode:"single",workspaceId:e.id,fileNames:[a.currentFile]}:null}return null}function Lw(e){return Object.values(e).some(r=>r>0)||a.filterSeverities.size>0?c`<severity-chips .counts="${e}"></severity-chips>`:g}function Pw(e){return Object.values(e).some(r=>r>0)||a.filterColors.size>0?c`<triage-filter .counts="${e}"></triage-filter>`:g}function Ow(e,t,r,n,o,s,i,l){let{showSource:d,showConfidence:u,showPriority:p,showGraphMode:f,showFileSort:h,kanbanMode:b,showRepo:m}=s;return c`<div class="toolbar"><div class="toolbar-row"><view-mode-buttons modes="${f?"table,list,grouped,focus,kanban,graph":"table,list,grouped,focus,kanban"}"></view-mode-buttons><findings-sort ?show-file="${h}" ?show-confidence="${u}" ?show-priority="${p}"></findings-sort>${d?c`<div class="sep"></div><source-filter></source-filter>`:g} ${u?c`<div class="sep"></div><conf-filter></conf-filter>`:g} ${b?g:c`<triage-selector .counts="${r}"></triage-selector>`}</div><div class="toolbar-row sev-row">${Lw(n)} ${i.length>1?c`<analyzer-select .options="${i}"></analyzer-select>`:g} ${m&&l.length>1?c`<repo-filter .options="${l}"></repo-filter>`:g} ${Pw(o)}<div class="search-row"><toolbar-search kind="findings"></toolbar-search><span class="result-count">${e} of ${t}</span></div></div></div>`}var yo=null,Vf=0,Zt=null,ei=new Map;function wo(e,t=!1,r=null){let n=Zr(e);return ei.set(n,{group:e,inGroup:t}),t?r?c`<finding-card data-gid="${n}" in-group context="${r}"></finding-card>`:c`<finding-card data-gid="${n}" in-group></finding-card>`:r?c`<finding-card data-gid="${n}" context="${r}"></finding-card>`:c`<finding-card data-gid="${n}"></finding-card>`}var Nw={critical:"C",high:"H",medium:"M",low:"L",high_bug:"H",bug:"B",informational:"i"};function jf(e,t={}){let{variant:r="kanban",active:n=!1}=t,o=be(e),s=Ae(e),i=$l(Ze(s.description,s))||"(untitled finding)",l=r==="kanban",d={"kanban-card":!0,"has-conflict":o.hasConflict,"focus-side-card":!l,active:!l&&n};!o.hasConflict&&o.commonColor&&(d[`mark-${o.commonColor}`]=!0);let u=parseInt(s.line,10),p=Number.isFinite(u)?`:${u}`:"",f=Nw[s.severity]??"?",h=c`<span class="${`kanban-badge sev-${s.severity}`}" title="${Qr(s.severity)}" aria-label="${Qr(s.severity)}">${f}</span> <span class="kanban-title">${i}</span><div class="kanban-meta"><span class="kanban-loc">${s.file}${p}</span> ${s.confidence===void 0||s.confidence===null?g:c`<span class="kanban-conf" title="${`Confidence ${s.confidence}/10`}">${s.confidence}</span>`}</div>`;return l?c`<div class="${F(d)}" data-gid="${Ee(e)}" data-kanban-source draggable="true" role="button" tabindex="0" aria-label="${`Open details for ${i}`}">${h}</div>`:c`<div class="${F(d)}" data-gid="${Ee(e)}" data-focus-select role="button" tabindex="0" aria-current="${n?"true":"false"}" aria-label="${`Focus on ${i}`}">${h}</div>`}function Dw(e){let{content:t,line:r,highlighted:n}=e,o=t.split(`
47
+ `).length,s=String(o).length;return c`<div class="focus-code-lines" style="${we({"--lineno-width":`${s}ch`})}"><aside class="focus-code-gutter" aria-hidden="true">${Array.from({length:o},(i,l)=>{let d=l+1;return c`<div class="${F({"focus-code-lineno":!0,"focus-code-line-active":d===r})}" data-focus-code-line="${d}">${d}</div>`})}</aside><pre class="focus-code-source"><code>${typeof n=="string"?ue(n):t}</code></pre></div>`}function Uw(e){if(!e)return g;let t=be(e),r={"kanban-detail-modal":!0,"has-conflict":t.hasConflict};return!t.hasConflict&&t.commonColor&&(r[`mark-${t.commonColor}`]=!0),c`<div class="kanban-detail-backdrop"><div class="kanban-detail-dim"></div><div class="${F(r)}" role="dialog" aria-modal="true"><button type="button" class="kanban-detail-close" title="Close details" aria-label="Close details">×</button><div class="kanban-detail-body">${wo(e)}</div></div></div>`}function zw(e){if(a.viewMode==="table"){let r=a.sortBy==="file"?[...e].toSorted((s,i)=>{let l=Ue(s),d=Ue(i);return l.file.localeCompare(d.file)||parseInt(l.line,10)-parseInt(d.line,10)}):e;if(r.length===0)return g;let n=a.tableSelectedGid?r.find(s=>Ee(s)===a.tableSelectedGid):null;return yo=r,c`<div class="${n?"findings-table-layout open":"findings-table-layout"}"><div class="findings-table-list"><div class="finding-table-slot"></div></div>${n?c`<aside class="findings-table-details" id="findings-table-details"><header class="findings-table-details-bar"><span class="findings-table-details-label">Details</span> <button type="button" class="findings-table-details-close" data-table-deselect title="Close details" aria-label="Close details">×</button></header><div class="findings-table-details-body">${wo(n)}</div></aside>`:g}</div>`}if(a.viewMode==="focus"){if(e.length===0)return g;let r=a.focusGid?e.findIndex(d=>Ee(d)===a.focusGid):-1;r<0&&(r=Math.min(Vf,e.length-1),r<0&&(r=0)),Vf=r;let n=e[r];a.focusCodeTick;let o=Df(n),s=o?"focus-main with-code":"focus-main",i=r===0,l=r===e.length-1;return c`<div class="focus-view"><div class="${s}"><div class="focus-pane focus-pane-card"><div class="focus-card-wrapper">${wo(n,!1,"focus")}</div></div>${o?c`<div class="focus-pane focus-pane-code">${o.loading?c`<div class="focus-code-empty">Loading source…</div>`:c`<header class="focus-code-bar" title="${o.file}"><span class="focus-code-file">${o.file}</span> ${o.line?c`<span class="focus-code-line">:${o.line}</span>`:g}</header><div class="focus-code-body">${Dw(o)}</div>`}</div>`:g}</div><aside class="focus-sidebar" aria-label="Up next"><div class="focus-sidebar-header"><span class="label">Up next</span><div class="focus-nav"><button type="button" class="focus-nav-btn" data-focus-nav="prev" ?disabled="${i}" title="Previous finding (←)" aria-label="Previous finding"><svg viewBox="0 0 16 16" width="12" height="12" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 3 5 8l5 5"/></svg></button> <span class="count">${r+1} / ${e.length}</span> <button type="button" class="focus-nav-btn" data-focus-nav="next" ?disabled="${l}" title="Next finding (→)" aria-label="Next finding"><svg viewBox="0 0 16 16" width="12" height="12" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 3 11 8l-5 5"/></svg></button></div></div><div class="focus-sidebar-body">${J(e,d=>Ee(d),d=>jf(d,{variant:"focus",active:Ee(d)===Ee(n)}))}</div></aside></div>`}if(a.viewMode==="kanban"){let r=[{key:"untriaged",label:"Untriaged",target:"untriaged"},{key:"fixed",label:"Fixed",target:"fixed"},{key:"invalid",label:"Invalid",target:"invalid"},{key:"deleted",label:"Deleted",target:"deleted"},{key:"ignored",label:"Ignored",target:"ignored"}],n=new Map(r.map(s=>[s.key,[]]));for(let s of e){let l=be(s).commonTriage??"untriaged",d=n.get(l);d&&d.push(s)}let o=a.kanbanPopoverGid?e.find(s=>Ee(s)===a.kanbanPopoverGid):null;return c`<div class="kanban-board">${J(r,s=>s.key,s=>{let i=n.get(s.key);return c`<div class="${`kanban-column kanban-column-${s.key}`}" data-kanban-target="${s.target}"><div class="kanban-column-header"><span class="label">${s.label}</span> <span class="count">${i.length}</span></div><div class="kanban-column-body">${i.length===0?c`<div class="kanban-empty">No ${s.label.toLowerCase()} findings.</div>`:J(i,l=>Ee(l),l=>jf(l))}</div></div>`})}</div>${Uw(o)}`}if(a.viewMode==="grouped"){let r=new Map;for(let o of e){let s=Ue(o).file;r.has(s)||r.set(s,[]),r.get(s).push(o)}let n=a.sortBy==="file"?[...r.keys()].toSorted():[...r.keys()];return c`${J(n,o=>o,o=>{let s=a.sortBy==="file"?r.get(o).toSorted((l,d)=>parseInt(Ue(l).line,10)-parseInt(Ue(d).line,10)):r.get(o),i=Ue(s[0]);return c`<div class="file-group"><div class="file-header"><span>${ml(o,i?.repo?.github,i?._repoFallback??a.repoUrl)}</span> <span class="count">${s.length}</span></div><div class="file-body">${J(s,l=>Zr(l),l=>wo(l))}</div></div>`})}`}let t=a.sortBy==="file"?[...e].toSorted((r,n)=>{let o=Ue(r),s=Ue(n);return o.file.localeCompare(s.file)||parseInt(o.line,10)-parseInt(s.line,10)}):e;return c`${J(t,r=>Zr(r),r=>{let n=Ae(r),o=_p(n.file,n.line,n.repo?.github,n._repoFallback??a.repoUrl),s=br(n),i=mr(n),l=r.length>1;return c`<div class="${F({"flat-group":!0,"multi-case":l})}"><div class="flat-group-loc"><span class="file">${ml(n.file,n.repo?.github,n._repoFallback??a.repoUrl)}</span> ${o===g?g:c`<span class="line-num">${o}</span>`} ${i?c`<span class="meta">${i}</span>`:g} ${s?c`<span class="run-meta">${s}</span>`:g}</div>${wo(r,!0)}</div>`})}`}function Ww(){let e=document.querySelector("#bundle-source-overlay-slot");e&&W(If(),e)}var Kf=null;function k(){let e=Kf;if(Kf=a.currentView,e!==null&&e!==a.currentView&&typeof document.startViewTransition=="function"&&!matchMedia("(prefers-reduced-motion: reduce)").matches){document.startViewTransition(()=>qf());return}qf()}function qf(){if(Ww(),kp(a.reports),a.currentView==="bundles")if((a.bundles??[]).length===0)a.currentView="findings";else{let x=document.querySelector("#bundles-slot");if((!x||!E.contains(x)||E.firstElementChild!==x)&&(E.innerHTML='<div id="bundles-slot"></div>',x=document.querySelector("#bundles-slot")),x&&W(Ff(a.bundles),x),a.selectedBundle&&a.bundleDetailsTab==="graph"&&a.bundleDetails&&(a.bundleDetails.json||a.bundleDetails.bundle)){let B=document.querySelector("#bundle-graph-slot");if(B){let fe=Cf(a.bundleDetails);if(fe){Ef(fe);let _e=!fe.hasEdges,bi=Sf(a.bundleDetails);Cl(B,fe,{hideAllFiles:_e,triageCounts:bi,triageStates:["fixed","invalid","deleted"]},Qs,Zs)}}}if(a.selectedBundle&&a.bundleDetailsTab==="terminal"&&a.bundleDetails&&(a.bundleDetails.json||a.bundleDetails.bundle)){let B=document.querySelector("#bundle-terminal-slot");B&&Vp(B,a.bundleDetails)}E.classList.add("active"),Ce.classList.add("hidden"),document.title="DeepView \u2014 bundles";return}if(a.currentView==="packages"){let x=document.querySelector("#packages-slot");(!x||!E.contains(x)||E.firstElementChild!==x)&&(E.innerHTML='<div id="packages-slot"></div>',x=document.querySelector("#packages-slot")),x&&W(Mf(),x),E.classList.add("active"),Ce.classList.add("hidden"),document.title="DeepView \u2014 packages";return}if(a.currentView==="repositories"){let x=document.querySelector("#repositories-slot");(!x||!E.contains(x)||E.firstElementChild!==x)&&(E.innerHTML='<div id="repositories-slot"></div>',x=document.querySelector("#repositories-slot")),x&&W(Of(),x),E.classList.add("active"),Ce.classList.add("hidden"),document.title="DeepView \u2014 repositories";return}if(a.reports.length===0)return;let e=Bt(),t={fixed:0,invalid:0,deleted:0,ignored:0};for(let x of e){let B=be(x).commonTriage;B&&t[B]++}let r=a.viewMode==="kanban",n=r?e:e.filter(x=>be(x).commonTriage===a.shownTriage),s=[...new Set(a.reports.map(x=>x.type))].join(", "),i=a.reports.map(x=>x.fileName),l={critical:0,high:0,medium:0,low:0,high_bug:0,bug:0,informational:0},d={red:0,blue:0,green:0,gray:0,none:0};for(let x of n){let B=new Set(x.map(_e=>_e.severity));for(let _e of B)l[_e]=(l[_e]||0)+1;let fe=new Set(x.map(_e=>a.triage.get(P(_e))?.color??"none"));for(let _e of fe)d[_e]=(d[_e]||0)+1}let u=n.length>0&&n.every(x=>x.every(B=>B.confidence!==void 0||B.critical===!0)),p=e.some(x=>x.some(B=>B.priority!==void 0)),f=e.some(x=>x.some(B=>Gt(B.file))),h=new Set;for(let x of e)for(let B of x)h.add(B.file);let b=h.size>1,m=e.some(x=>x.some(B=>!B.repo?.github&&!Gt(B.file))),y=new Set;for(let x of e)for(let B of x)!Gt(B.file)&&B.repo?.github&&y.add(B.repo.github);let $=y.size===1?[...y][0]:null,w=new Set;for(let x of e)for(let B of x)w.add(B._analyzer??null);let v=Object.keys(vl),S=[...w].toSorted((x,B)=>{let fe=x==null?1/0:v.indexOf(x)===-1?v.length:v.indexOf(x),_e=B==null?1/0:v.indexOf(B)===-1?v.length:v.indexOf(B);return fe!==_e?fe-_e:String(x??"").localeCompare(String(B??""))});if(a.filterAnalyzer){let x=a.filterAnalyzer===oo?null:a.filterAnalyzer;w.has(x)||(a.filterAnalyzer="")}let C=new Set;for(let x of e)for(let B of x)C.add(yl(B));let R=[...C].toSorted((x,B)=>x==null&&B==null?0:x==null?1:B==null?-1:x.localeCompare(B));if(a.filterRepo){let x=a.filterRepo===so?null:a.filterRepo;C.has(x)||(a.filterRepo="")}!f&&a.filterSources.size>0&&a.filterSources.clear(),u||(a.filterConfMin=0,a.filterConfMax=10,(a.sortBy==="confidence-desc"||a.sortBy==="confidence-asc")&&(a.sortBy="severity")),!p&&(a.sortBy==="priority-desc"||a.sortBy==="priority-asc")&&(a.sortBy="severity"),!b&&a.sortBy==="file"&&(a.sortBy="severity");let O=Ip(Ap(n)),ye=_l(a.reports),K=ye?Object.keys(ye).length:0,tr=K>1;!tr&&a.currentView==="files"&&(a.currentView="findings"),!tr&&a.viewMode==="graph"&&(a.viewMode="table");let Re=Iw(e.length,i,m,$,K);if(a.currentView==="files"){let x=xl(e),B=document.querySelector("#header-slot"),fe=document.querySelector("#tree-view-slot");(!B||!fe||!E.contains(B)||!E.contains(fe))&&(E.innerHTML='<div id="header-slot"></div><div id="tree-view-slot"></div>',B=document.querySelector("#header-slot"),fe=document.querySelector("#tree-view-slot")),B&&W(Re,B),fe&&W(zp(ye,x),fe),E.classList.add("active"),Ce.classList.add("hidden"),document.title=`DeepView \u2014 ${s||"no analyzer"}`;return}let rt=a.viewMode==="table"&&a.tableSelectedGid&&O.some(x=>Ee(x)===a.tableSelectedGid),Cr=null;a.viewMode==="graph"&&ye&&(Cr=Yl(),Cr||(a.viewMode="table"));let Mt=!!Cr,ut="findings-content";rt&&(ut+=" with-details"),Mt&&(ut+=" with-graph"),r&&(ut+=" with-kanban"),a.viewMode==="focus"&&(ut+=" with-focus");let _=g,j=g,Z=g;Mt||(_=Ow(O.length,n.length,t,l,d,{showSource:f,showConfidence:u,showPriority:p,showGraphMode:tr,showFileSort:b,kanbanMode:r,showRepo:!!a.currentWorkspace},S,R),a.shownTriage&&n.length===0?j=c`<p style="color:var(--muted);margin:1rem 0">No ${a.shownTriage} findings.</p>`:O.length===0&&n.length>0?j=c`<p style="color:var(--muted);margin:1rem 0">No findings match the current filters.</p>`:n.length===0&&(j=e.length>0?c`<p style="color:var(--green)">All ${s} issues triaged.</p>`:c`<p style="color:var(--green)">No ${s} issues found.</p>`),yo=null,ei.clear(),Z=zw(O));let ie=!!(Zt&&Zt.isConnected);ie&&Zt.remove();let pe=document.querySelector("#header-slot"),te=E.querySelector(":scope > .findings-content"),We=te&&te.querySelector(":scope > #findings-graph-slot"),Ye=te&&te.querySelector(":scope > #findings-body-slot"),gg=te&&(We?"graph":Ye?"body":null)===(Mt?"graph":"body");if(!pe||!te||!E.contains(pe)||!E.contains(te)||!gg){let x=Mt?'<div id="findings-graph-slot"></div>':'<div id="toolbar-slot"></div><div id="empty-state-slot"></div><div id="findings-body-slot"></div>';E.innerHTML=`<div id="header-slot"></div><div class="${ut}">${x}</div>`,pe=document.querySelector("#header-slot"),te=E.querySelector(":scope > .findings-content")}else te.className!==ut&&(te.className=ut);pe&&W(Re,pe);let rd=document.querySelector("#toolbar-slot");rd&&W(_,rd);let nd=document.querySelector("#empty-state-slot");nd&&W(j,nd);let dn=document.querySelector("#findings-body-slot");if(dn&&(yo||ie)){let x=document.createElement("div");x.id="findings-body-slot",dn.replaceWith(x),dn=x}if(dn&&W(Z,dn),Cr){let x=document.querySelector("#findings-graph-slot");if(x){let B=c`<view-mode-buttons modes="table,list,grouped,focus,kanban,graph"></view-mode-buttons>`,fe={fixed:0,invalid:0,deleted:0,ignored:0};for(let bi of Bt()){let yi=be(bi).commonTriage;yi&&fe[yi]++}let _e={extraTopRow:B,triageCounts:fe,triageStates:["fixed","invalid","deleted","ignored"]};Cl(x,Cr.prep,_e,Jl,Xl)}}if(yo){let x=E.querySelector(".finding-table-slot");x&&(Zt||(Zt=document.createElement("finding-table")),Zt.items=yo,Zt.selectedGid=a.tableSelectedGid,x.replaceWith(Zt))}if(ei.size>0)for(let x of E.querySelectorAll("finding-card")){let B=ei.get(x.dataset.gid);B&&(x.group=B.group)}E.classList.add("active"),Ce.classList.add("hidden"),document.title=`DeepView \u2014 ${s||"no analyzer"}`}var Ql=class extends I{static styles=[...I.styles,T(Qe)];static properties={workspace:{attribute:!1},_password:{state:!0},_confirm:{state:!0},_noPassword:{state:!0},_includeBundleBytes:{state:!0},_busy:{state:!0},_error:{state:!0},_settled:{state:!0}};constructor(){super(),this.workspace=null,this._password="",this._confirm="",this._noPassword=!1,this._includeBundleBytes=!1,this._busy=!1,this._error="",this._settled=!1}_finish(t){this._settled||(this._password="",this._confirm="",this.workspace=null,super._finish(t))}_onClose=()=>this._finish(null);_onCancel=()=>this._finish(null);_onPasswordInput=t=>{this._password=t.target.value,this._error=""};_onConfirmInput=t=>{this._confirm=t.target.value,this._error=""};_onNoPasswordToggle=t=>{this._noPassword=t.target.checked,this._error="",this._noPassword&&(this._password="",this._confirm="")};_onIncludeBundleBytesToggle=t=>{this._includeBundleBytes=t.target.checked,this._error=""};_canExport(){return this._busy?!1:this._noPassword?!0:(this._password??"").length>0&&this._password===this._confirm}_onExport=async()=>{if(this._canExport()){if(!this.workspace){this._error="No workspace selected.";return}this._busy=!0,this._error="";try{let{blob:t,filename:r}=await rl(this.workspace,{password:this._noPassword?void 0:this._password,includeBundleBytes:this._includeBundleBytes});if(this._settled)return;Rr(t,r),this._finish({ok:!0})}catch(t){if(this._settled)return;this._error=t?.message??String(t)}finally{this._busy=!1}}};_onKeydown=t=>{t.key==="Enter"&&(t.preventDefault(),this._onExport())};_body(){let t=!this._password||!this._confirm||this._password===this._confirm,r=Array.isArray(this.workspace?.bundles)?this.workspace.bundles.length:0;return c`<p class="nwd-note">The export file carries this workspace's reports, triage state, comments, fixes, references to attached bundles (integrities only by default), and its private key. Encrypting the file with a password ensures only those with the password can attach the workspace after download.</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-export-pw" maxlength="1024" ?disabled="${this._noPassword}" .value="${this._password}" @input="${this._onPasswordInput}" @keydown="${this._onKeydown}"></label> <label class="wsl-field"><span>Confirm 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-export-pw-confirm" maxlength="1024" ?disabled="${this._noPassword}" .value="${this._confirm}" @input="${this._onConfirmInput}" @keydown="${this._onKeydown}"></label> <label class="wsl-optout"><input type="checkbox" .checked="${this._noPassword}" @change="${this._onNoPasswordToggle}"> <span>Export without password (not recommended)</span></label> ${r>0?c`<label class="wsl-optout"><input type="checkbox" .checked="${this._includeBundleBytes}" @change="${this._onIncludeBundleBytesToggle}"> <span>Include bundle bytes (${r} bundle${r===1?"":"s"}; significantly larger file)</span></label>`:g} ${this._noPassword?c`<p class="wsl-error wsl-warning">Anyone who obtains this file can attach the workspace and read every report, triage decision, comment, and fix. Only opt out when you control where the file goes.</p>`:g} ${this._error?c`<p class="wsl-error" role="alert">${this._error}</p>`:g} ${!this._noPassword&&!t?c`<p class="wsl-error" role="alert">Passwords don't match.</p>`:g}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" ?disabled="${!this._canExport()}" @click="${this._onExport}">${this._busy?"Exporting\u2026":this._noPassword?"Export without password":"Export"}</button></footer>`}render(){return c`<dialog @close="${this._onClose}"><header><h3>Export workspace</h3></header>${this._body()}</dialog>`}};customElements.define("workspace-export-dialog",Ql);function Yf({workspace:e}={}){return new Promise((t,r)=>{let n=document.createElement("workspace-export-dialog");n.workspace=e??null,n.addEventListener("resolve",o=>{n.remove(),t(o.detail)}),n.addEventListener("modal-conflict",o=>{n.workspace=null,n.remove(),r(ft(o.detail?.cause))}),document.body.append(n)})}async function Jf(e){await Yf({workspace:e})}var Zl=class extends I{static properties={_value:{state:!0}};constructor(){super(),this._value=""}_onInput=t=>{this._value=t.target.value};_onCreate=()=>{let t=(this._value??"").trim();t&&this._finish(t)};_onCancel=()=>this._finish(null);_onKeydown=t=>{t.key==="Enter"&&(t.preventDefault(),this._onCreate())};render(){let t=(this._value??"").trim().length>0;return c`<dialog @close="${this._onClose}"><header><h3>New workspace</h3></header><input type="text" class="nwd-input" placeholder="Workspace name" maxlength="200" .value="${this._value}" @input="${this._onInput}" @keydown="${this._onKeydown}"><p class="nwd-note">Workspace triage is synchronized by default over an end-to-end encrypted channel. Triage on unattached reports stays local to this browser.</p><footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" ?disabled="${!t}" @click="${this._onCreate}">Create</button></footer></dialog>`}};customElements.define("new-workspace-dialog",Zl);function Xf(){return q("new-workspace-dialog")}var ec=class extends I{static styles=[...I.styles,T(Ie)];static properties={workspaceName:{type:String},reportCount:{type:Number},bundleCount:{type:Number},orphanedTriage:{type:Number},sharedTriage:{type:Number},_mode:{state:!0},_triage:{state:!0},_settled:{state:!0}};constructor(){super(),this.workspaceName="",this.reportCount=0,this.bundleCount=0,this.orphanedTriage=0,this.sharedTriage=0,this._mode="detach",this._triage="keep",this._settled=!1}focusInitial(){this.renderRoot.querySelector('button[data-role="cancel"]')?.focus()}_finish(t){if(this._settled)return;let r=this.reportCount>0?this._mode:"detach",n=r==="delete"&&this.orphanedTriage>0?this._triage:"keep";super._finish({confirmed:!!t,mode:r,triage:n})}_onClose=()=>this._finish(!1);_onCancel=()=>this._finish(!1);_onConfirm=()=>this._finish(!0);_onModeChange=t=>{this._mode=t.target.value};_onTriageChange=t=>{this._triage=t.target.value};_triageSection(){if(this._mode!=="delete"||this.reportCount===0)return"";let t=this.orphanedTriage,r=this.sharedTriage;return t===0&&r===0?c`<p class="lwd-note">No local triage is attached to ${this.reportCount===1?"this report":"these reports"}.</p>`:t===0?c`<p class="lwd-note">Local triage on ${this.reportCount===1?"this report":"these reports"} is also attached to ${r===1?"a report":"reports"} you're keeping. Nothing will be orphaned.</p>`:c`<fieldset class="lwd-choice"><legend><strong>${t}</strong> ${t===1?"triage entry won't":"triage entries won't"} be reachable from any remaining report. What should happen ${t===1?"to it":"to them"}?</legend><label class="lwd-option"><input type="radio" name="lwd-triage" value="keep" ?checked="${this._triage==="keep"}" @change="${this._onTriageChange}"> <span class="lwd-option-text"><span class="lwd-option-title">Keep</span> <span class="lwd-option-hint">Reapplied automatically if a matching report is imported later.</span></span></label> <label class="lwd-option"><input type="radio" name="lwd-triage" value="wipe" ?checked="${this._triage==="wipe"}" @change="${this._onTriageChange}"> <span class="lwd-option-text"><span class="lwd-option-title">Wipe</span> <span class="lwd-option-hint">Drop the orphaned triage from this browser.</span></span></label></fieldset>`}render(){let t=this.reportCount,r=this.bundleCount,n=t>0,o=t===1?"report":"reports",s=t===1?"it":"them",i=t===1?"stays":"stay",l=t===1?"is removed":"are removed",d=r>0?c`<p class="lwd-note">${r===1?"One bundle is":`${r} bundles are`} also attached. ${r===1?"It":"They"} will become unfiled — the bundle bytes stay on this device either way (delete bundles manually from the Bundles list if you want them gone).</p>`:"",u=n?c`<fieldset class="lwd-choice"><legend>What should happen to the <strong>${t}</strong> attached ${o}?</legend><label class="lwd-option"><input type="radio" name="lwd-mode" value="detach" ?checked="${this._mode==="detach"}" @change="${this._onModeChange}"> <span class="lwd-option-text"><span class="lwd-option-title">Move ${s} out of the workspace</span> <span class="lwd-option-hint">The ${o} ${i} in this browser as unattached ${o}.</span></span></label> <label class="lwd-option"><input type="radio" name="lwd-mode" value="delete" ?checked="${this._mode==="delete"}" @change="${this._onModeChange}"> <span class="lwd-option-text"><span class="lwd-option-title">Delete ${s} along with the workspace</span> <span class="lwd-option-hint">The ${o} ${l} from this browser.</span></span></label></fieldset>`:r>0?c`<p class="lwd-empty">No reports are attached to this workspace (only bundles, see below).</p>`:c`<p class="lwd-empty">No reports are attached to this workspace.</p>`;return c`<dialog @close="${this._onClose}"><header><h3>Leave workspace</h3></header><p class="lwd-body">Leave workspace <strong>"${this.workspaceName}"</strong> on this device?</p>${u} ${d} ${this._triageSection()}<ul class="lwd-list"><li>Workspace synchronization data stays on the sync server — peers (and your other devices) keep their copy.</li></ul><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}">Leave</button></footer></dialog>`}};customElements.define("leave-workspace-dialog",ec);function Qf({name:e,reportCount:t,bundleCount:r,triageImpact:n}={}){return q("leave-workspace-dialog",{workspaceName:e??"",reportCount:t??0,bundleCount:r??0,orphanedTriage:n?.orphanedCount??0,sharedTriage:n?.sharedCount??0})}var tc=class extends I{static styles=[...I.styles,T(Qe)];static properties={workspaceId:{type:String},initialName:{type:String},privateKeyBase64:{type:String},_name:{state:!0},_password:{state:!0},_confirm:{state:!0},_url:{state:!0},_busy:{state:!0},_error:{state:!0},_copied:{state:!0},_settled:{state:!0}};constructor(){super(),this.workspaceId="",this.initialName="",this.privateKeyBase64="",this._name="",this._password="",this._confirm="",this._url="",this._busy=!1,this._error="",this._copied=!1,this._settled=!1}beforeOpen(){this._name=this.initialName}focusInitial(){this.renderRoot.querySelector('input[data-role="name"]')?.focus()}_finish(){this._settled||(this._copiedTimer&&(clearTimeout(this._copiedTimer),this._copiedTimer=null),this._password="",this._confirm="",this._url="",this.privateKeyBase64="",super._finish(null))}_onClose=()=>this._finish();_onCancel=()=>this._finish();_onNameInput=t=>{this._name=t.target.value};_onPasswordInput=t=>{this._password=t.target.value,this._error=""};_onConfirmInput=t=>{this._confirm=t.target.value,this._error=""};_canGenerate(){return(this._name??"").trim().length>0&&(this._password??"").length>0&&this._password===this._confirm&&!this._busy}_onGenerate=async()=>{if(this._canGenerate()){this._busy=!0,this._error="";try{let t=await sl({id:this.workspaceId,name:this._name.trim(),privateKeyBase64:this.privateKeyBase64,password:this._password});if(this._settled)return;this._url=al(t),this._password="",this._confirm=""}catch(t){if(this._settled)return;this._error=t?.message??String(t)}finally{this._busy=!1}}};_onCopy=async()=>{if(this._url){this._error="";try{if(await navigator.clipboard.writeText(this._url),this._settled)return;this._copied=!0,this._copiedTimer&&clearTimeout(this._copiedTimer),this._copiedTimer=setTimeout(()=>{this._copied=!1,this._copiedTimer=null},1500)}catch{if(this._settled)return;this._error="Copy failed \u2014 select the link and copy it manually."}}};_onKeydown=t=>{t.key==="Enter"&&!this._url&&(t.preventDefault(),this._onGenerate())};_body(){return this._url?c`<p class="nwd-note">Anyone with the link <strong>and</strong> the password can attach this workspace. Share them through separate channels.</p><label class="wsl-field"><span>Share link</span> <textarea class="wsl-link" readonly="readonly" rows="3" @focus="${t=>t.target.select()}">${this._url}</textarea></label> ${this._error?c`<p class="wsl-error" role="alert">${this._error}</p>`:g}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">Close</button> <button type="button" class="primary" @click="${this._onCopy}">${this._copied?"Copied":"Copy link"}</button></footer>`:c`<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> <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-pw" maxlength="1024" .value="${this._password}" @input="${this._onPasswordInput}" @keydown="${this._onKeydown}"></label> <label class="wsl-field"><span>Confirm 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-pw-confirm" maxlength="1024" .value="${this._confirm}" @input="${this._onConfirmInput}" @keydown="${this._onKeydown}"></label><p class="nwd-note">The link carries the workspace's identity (id, name, and private key) so the recipient joins the same sync chain. Triage, reports, and comments are not included. The link decrypts with the password above; without it the link is useless.</p>${this._error?c`<p class="wsl-error" role="alert">${this._error}</p>`:g} ${this._password&&this._confirm&&this._password!==this._confirm?c`<p class="wsl-error" role="alert">Passwords don't match.</p>`:g}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" ?disabled="${!this._canGenerate()}" @click="${this._onGenerate}">${this._busy?"Generating\u2026":"Generate link"}</button></footer>`}render(){return c`<dialog @close="${this._onClose}"><header><h3>${this._url?"Workspace share link":"Share workspace by link"}</h3></header>${this._body()}</dialog>`}};customElements.define("workspace-share-link-dialog",tc);function Zf({id:e,name:t,privateKeyBase64:r}={}){return new Promise((n,o)=>{let s=document.createElement("workspace-share-link-dialog");s.workspaceId=e??"",s.initialName=t??"",s.privateKeyBase64=r??"",s.addEventListener("resolve",()=>{s.remove(),n()}),s.addEventListener("modal-conflict",i=>{s.privateKeyBase64="",s.remove(),o(ft(i.detail?.cause))}),document.body.append(s)})}var rc=class extends I{static styles=[...I.styles,T(Ie)];static properties={reportName:{type:String},orphanedTriage:{type:Number},sharedTriage:{type:Number},inRemote:{type:Boolean},_triage:{state:!0}};constructor(){super(),this.reportName="",this.orphanedTriage=0,this.sharedTriage=0,this.inRemote=!1,this._triage="keep"}focusInitial(){this.renderRoot.querySelector('button[data-role="cancel"]')?.focus()}_finish(t){if(this._settled)return;let r=this.orphanedTriage>0?this._triage:"keep";super._finish({confirmed:!!t,triage:r})}_onClose=()=>this._finish(!1);_onCancel=()=>this._finish(!1);_onConfirm=()=>this._finish(!0);_onTriageChange=t=>{this._triage=t.target.value};_remoteNotice(){return this.inRemote?c`<p class="lwd-note">This report is also stored in the workspace's <strong>remote</strong> inventory and will be removed from there too. Newly synced workspace members won't see it; members who already downloaded it keep their local copy (and could re-upload).</p>`:g}_triageSection(){let t=this.orphanedTriage,r=this.sharedTriage;return t===0&&r===0?c`<p class="lwd-note">No local triage is attached to this report.</p>`:t===0?c`<p class="lwd-note">Local triage on this report is also attached to ${r===1?"a report":"reports"} you're keeping. Nothing will be orphaned.</p>`:c`<fieldset class="lwd-choice"><legend><strong>${t}</strong> ${t===1?"triage entry won't":"triage entries won't"} be reachable from any remaining report. What should happen ${t===1?"to it":"to them"}?</legend><label class="lwd-option"><input type="radio" name="drd-triage" value="keep" ?checked="${this._triage==="keep"}" @change="${this._onTriageChange}"> <span class="lwd-option-text"><span class="lwd-option-title">Keep</span> <span class="lwd-option-hint">Reapplied automatically if a matching report is imported later.</span></span></label> <label class="lwd-option"><input type="radio" name="drd-triage" value="wipe" ?checked="${this._triage==="wipe"}" @change="${this._onTriageChange}"> <span class="lwd-option-text"><span class="lwd-option-title">Wipe</span> <span class="lwd-option-hint">Drop the orphaned triage from this browser.</span></span></label></fieldset>`}render(){return c`<dialog @close="${this._onClose}"><header><h3>Delete report</h3></header><p class="lwd-body">Delete <strong>"${this.reportName}"</strong>?</p>${this._remoteNotice()} ${this._triageSection()}<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}">Delete</button></footer></dialog>`}};customElements.define("delete-report-dialog",rc);function eh({name:e,triageImpact:t,inRemote:r}={}){return q("delete-report-dialog",{reportName:e??"",orphanedTriage:t?.orphanedCount??0,sharedTriage:t?.sharedCount??0,inRemote:!!r})}var nc=class extends I{static styles=[...I.styles,T(Ie)];static properties={bundleName:{type:String},inRemote:{type:Boolean}};constructor(){super(),this.bundleName="",this.inRemote=!1}focusInitial(){this.renderRoot.querySelector('button[data-role="cancel"]')?.focus()}_finish(t){this._settled||super._finish({confirmed:!!t})}_onClose=()=>this._finish(!1);_onCancel=()=>this._finish(!1);_onConfirm=()=>this._finish(!0);_remoteNotice(){return this.inRemote?c`<p class="lwd-note">This bundle is also stored in the workspace's <strong>remote</strong> inventory and will be removed from there too. Newly synced workspace members won't see it; members who already downloaded it keep their local copy (and could re-upload).</p>`:g}render(){return c`<dialog @close="${this._onClose}"><header><h3>Delete bundle</h3></header><p class="lwd-body">Delete <strong>"${this.bundleName}"</strong>?</p>${this._remoteNotice()}<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}">Delete</button></footer></dialog>`}};customElements.define("delete-bundle-dialog",nc);function th({name:e,inRemote:t}={}){return q("delete-bundle-dialog",{bundleName:e??"",inRemote:!!t})}var oc=class extends I{static styles=[...I.styles,T(Ie)];static properties={bundleName:{type:String},workspaceName:{type:String}};constructor(){super(),this.bundleName="",this.workspaceName=""}focusInitial(){this.renderRoot.querySelector('button[data-role="cancel"]')?.focus()}_finish(t){this._settled||super._finish({confirmed:!!t})}_onClose=()=>this._finish(!1);_onCancel=()=>this._finish(!1);_onConfirm=()=>this._finish(!0);render(){return c`<dialog @close="${this._onClose}"><header><h3>Detach bundle</h3></header><p class="lwd-body">Detach <strong>"${this.bundleName}"</strong> from workspace <strong>"${this.workspaceName}"</strong>?</p><p class="lwd-note">This bundle is also stored in the workspace's <strong>remote</strong> inventory and will be removed from there too. Newly synced workspace members won't see it; members who already downloaded it keep their local copy (and could re-upload). The bundle bytes stay on this device — drop it onto another workspace to attach it there.</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}">Detach</button></footer></dialog>`}};customElements.define("detach-bundle-dialog",oc);function rh({name:e,workspaceName:t}={}){return q("detach-bundle-dialog",{bundleName:e??"",workspaceName:t??""})}var sc=class extends I{static styles=[...I.styles,T(Ie)];static properties={reportName:{type:String},workspaceName:{type:String}};constructor(){super(),this.reportName="",this.workspaceName=""}focusInitial(){this.renderRoot.querySelector('button[data-role="cancel"]')?.focus()}_finish(t){this._settled||super._finish({confirmed:!!t})}_onClose=()=>this._finish(!1);_onCancel=()=>this._finish(!1);_onConfirm=()=>this._finish(!0);render(){return c`<dialog @close="${this._onClose}"><header><h3>Detach report</h3></header><p class="lwd-body">Detach <strong>"${this.reportName}"</strong> from workspace <strong>"${this.workspaceName}"</strong>?</p><p class="lwd-note">This report is also stored in the workspace's <strong>remote</strong> inventory and will be removed from there too. Newly synced workspace members won't see it; members who already downloaded it keep their local copy (and could re-upload). The report bytes stay on this device — drop it onto another workspace to attach it there.</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}">Detach</button></footer></dialog>`}};customElements.define("detach-report-dialog",sc);function nh({name:e,workspaceName:t}={}){return q("detach-report-dialog",{reportName:e??"",workspaceName:t??""})}var ic=class extends I{focusInitial(){this.renderRoot.querySelector("button.primary")?.focus()}_onConfirm=()=>this._finish(!0);render(){return c`<dialog @close="${this._onClose}"><header><h3>Changes might not be saved</h3></header><p class="nwd-intro">Triage works in this tab, but this browser <strong>can't save its sync state right now</strong> — so changes that haven't reached the server could be lost if you reload the page.</p><p class="nwd-intro">This usually means the browser's storage is full, or another tab is running a newer version of the app (to avoid overwriting that newer version's data, this tab has paused saving).</p><p class="nwd-note">Free up space if storage is full, and close or reload other tabs of this app to the same version. This notice clears on its own once saving works again.</p><footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" class="primary" @click="${this._onConfirm}">Got it</button></footer></dialog>`}};customElements.define("persistence-degraded-dialog",ic);function oh(){return new Promise(e=>{let t=document.createElement("persistence-degraded-dialog"),r=n=>{t.remove(),e({shown:n})};t.addEventListener("resolve",()=>r(!0)),t.addEventListener("modal-conflict",()=>r(!1)),document.body.append(t)})}var er;function Hw(){return er||(er=document.createElement("div"),er.id="styled-tooltip",document.body.append(er),er)}var $r=null,vo=null,lh=0,ch=0,sh=!1;function Vw(){sh||(sh=!0,document.addEventListener("mousemove",e=>{lh=e.clientX,ch=e.clientY},{passive:!0}))}Vw();var jw=100,Kw=14,qw=8,ih=8;function Gw(e,{placement:t="cursor"}={}){let r=Hw();if($r===e)return;let n=e.dataset.tooltip??"";if(n){if(r.textContent=n,t==="right"){let o=e.getBoundingClientRect();r.style.top=`${Math.round(o.top+o.height/2)}px`,r.style.left=`${Math.round(o.right+qw)}px`,r.style.transform="translateY(-50%)"}else{r.style.transform="none",r.style.top=`${ch+Kw}px`,r.style.left="0px",r.classList.add("visible");let o=r.offsetWidth,s=window.innerWidth-o-ih,i=Math.max(ih,Math.min(lh,s));r.style.left=`${Math.round(i)}px`}r.classList.add("visible"),$r=e}}function ko(){clearTimeout(vo),vo=null,er&&er.classList.remove("visible"),$r=null}function ac(e,{gate:t,placement:r}={}){t&&!t(e)||(clearTimeout(vo),vo=setTimeout(()=>{Gw(e,{placement:r})},jw))}var ah=!1;function dh(){ah||(ah=!0,document.body.addEventListener("mouseover",e=>{let t=e.target.closest("[data-tooltip]");!t||t===$r||(ko(),ac(t))}),document.body.addEventListener("mouseout",e=>{!$r&&!vo||$r&&$r.contains(e.relatedTarget)||ko()}))}var ri=null,se=null,ti=null;dh();function Yw(){return bt().size}function Jw(){return fr().size}var $o=typeof location>"u"||location.hostname.endsWith(".github.io")?"":`${location.protocol==="https:"?"wss:":"ws:"}//${location.host}/api/sync`,pc="application/x-deepview-report",cc="application/x-deepview-source-ws",xo="application/x-deepview-bundle",ni=!1,oi=!1,Xw={default:"Reports","claude-security":"Claude Security","codex-security":"Codex Security",deepsec:"DeepSec"},uh=["default","claude-security","codex-security","deepsec"],xr="";function ph(e,t={}){let n=`file-item${e===a.currentFile&&(a.currentView==="findings"||a.currentView==="files")?" current":""}${t.indented?" indented":""}`,o=Ne(e),s=Nn(e),i=Y[Ke(e)]??Y.default;return c`<li class="${n}" data-file="${e}" data-workspace-id="${t.workspaceId??g}" draggable="true"><button type="button" class="file-name" data-tooltip="${o}">${ue(i)}<span class="file-label">${o}</span>${s===void 0?g:c`<span class="file-count">${s}</span>`}</button></li>`}function Qw(e,t={}){let r=`file-group-header${t.dropTarget?" default-reports":""}`;return c`<li class="${r}" data-default-reports="${t.dropTarget?"true":g}"><span class="group-label">${e}</span></li>`}var Zw=c`<svg viewBox="0 0 16 16" width="11" height="11" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" aria-hidden="true"><path d="M8 3.5v9M3.5 8h9"/></svg>`;function ev(){return c`<li class="file-group-header workspace-header"><span class="group-label">Workspaces</span><span class="workspace-header-actions"><button type="button" class="workspace-add" data-action="new-workspace" title="Create a new workspace" aria-label="Create a new workspace">${Zw}</button></span></li>`}function tv(){return c`<li class="file-group-header bundles-header" data-default-bundles="true"><span class="group-label">Bundles</span></li>`}var rv=c`${ue(tn)}`;function fh(e,t={}){let{integrity:r,name:n}=e,o=a.selectedBundle===r&&a.currentView==="bundles",i=`file-item bundle-item${t.workspaceId!=null?" indented":""}${o?" current":""}`;return c`<li class="${i}" data-bundle-integrity="${r}" data-workspace-id="${t.workspaceId??g}" draggable="true"><button type="button" class="file-name" data-tooltip="${`${n}
48
+ ${r}`}">${rv}<span class="file-label">${n}</span></button></li>`}function nv(e,t){let r=e.slice(0,15);return c`<li class="file-item indented bundle-item bundle-missing" data-bundle-integrity="${e}" data-workspace-id="${t}" data-tooltip="Bundle bytes not on this device — drop the matching bundle to attach."><span class="file-name"><span class="file-icon" aria-hidden="true">?</span><span class="file-label"><em>missing · ${r}…</em></span></span></li>`}function ov(e,t){return c`<li class="file-item indented report-missing" data-workspace-id="${t}" data-tooltip="Report not on this device — it re-downloads automatically if a workspace member has uploaded it."><span class="file-name"><span class="file-icon" aria-hidden="true">?</span><span class="file-label"><em>missing · ${Ne(e)}</em></span></span></li>`}var sv=c`${ue(Os)}`,iv=c`<svg viewBox="0 0 16 16" width="11" height="11" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 2v8M5 7l3 3 3-3M3 13h10"/></svg>`,av=c`<svg viewBox="0 0 16 16" width="11" height="11" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 3H4v10h5"/><path d="M7 8h7M11 5l3 3-3 3"/></svg>`,lv=c`<svg viewBox="0 0 16 16" width="11" height="11" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 9.5L9 7.5"/><path d="M9.5 5.5L10.5 4.5a2.1 2.1 0 1 1 3 3l-1 1"/><path d="M6.5 11.5L5.5 12.5a2.1 2.1 0 1 1-3-3l1-1"/></svg>`;function cv(e){let r=`file-item workspace-item${a.currentWorkspace===e.id&&(a.currentView==="findings"||a.currentView==="files")?" current":""}`;return c`<li class="${r}" data-workspace-id="${e.id}"><button type="button" class="file-name">${sv}<span class="file-label" .textContent="${e.name}"></span></button><button type="button" class="workspace-share" data-action="share-workspace" title="Share by link" aria-label="Share workspace by link">${lv}</button><button type="button" class="workspace-export" data-action="export-workspace" title="Export workspace" aria-label="Export workspace">${iv}</button><button type="button" class="workspace-leave" data-action="leave-workspace" title="Leave workspace" aria-label="Leave workspace">${av}</button></li>`}function ln(e){return xr?Ne(e).toLowerCase().includes(xr):!0}async function V(){await Ya(),yt().catch(()=>{});let e=await le(),t=z(),r=await lt();if(a.bundles=r,!se)return;ri.classList.remove("empty");let n=new Set(e),o=new Set;for(let h of t)for(let b of h.reports)n.has(b)&&o.add(b);let s=new Map(r.map(h=>[h.integrity,h])),i=new Set;for(let h of t)for(let b of h.bundles)s.has(b)&&i.add(b);let l=new Map;for(let h of uh)l.set(h,[]);for(let h of e){if(o.has(h)||!ln(h))continue;let b=Ke(h);l.has(b)||l.set(b,[]),l.get(b).push(h)}let d=t.filter(h=>!xr||h.name.toLowerCase().includes(xr)||h.reports.some(b=>ln(b))?!0:h.bundles.some(b=>{let m=s.get(b);return m&&ln(m.name)})),u=r.filter(h=>!i.has(h.integrity)&&ln(h.name));W(c`${ev()} ${J(d,h=>h.id,h=>{let b=[],m=[];for(let w of h.reports)ln(w)&&(n.has(w)?b.push(w):m.push(w));let y=[],$=[];for(let w of h.bundles){let v=s.get(w);v?(!xr||ln(v.name))&&y.push(v):xr||$.push(w)}return c`${cv(h)} ${b.map(w=>ph(w,{indented:!0,workspaceId:h.id}))} ${m.map(w=>ov(w,h.id))} ${y.map(w=>fh(w,{workspaceId:h.id}))} ${$.map(w=>nv(w,h.id))}`})} ${uh.map(h=>{let b=l.get(h)??[],m=h==="default";return b.length===0&&!(m&&ni)?null:c`${Qw(Xw[h]??h,{dropTarget:m})} ${b.map(y=>ph(y))}`})} ${u.length>0||oi?tv():null} ${J(u,h=>h.integrity,h=>fh(h))}`,ti);let p=se.querySelector('sidebar-view-button[kind="packages"]');p&&(p.count=Yw());let f=se.querySelector('sidebar-view-button[kind="repositories"]');f&&(f.count=Jw()),si(),_a(e,()=>{V()})}ge(()=>{V()});async function dv(e){if(e.target.closest('[data-action="go-home"]')){await hf();return}let t=e.target.closest(".file-item[data-bundle-integrity]");if(t){if(t.classList.contains("bundle-missing"))return;let d=t.dataset.bundleIntegrity;if(a.selectedBundle===d&&a.currentView==="bundles")return;a.currentView="bundles",a.selectedBundle=d,a.bundleDetails=null,a.bundleSourceFile=null,a.bundleSourceFindingIdx=null,a.bundleCodeSearchQuery="",a.bundleCodeSearchMode="files",a.bundleDetailsTab="overview",A.showAll=!0,a.shownTriage=null,an(d),k(),V(),Jt(d);return}let r=e.target.closest("sidebar-view-button");if(r){let d=r.getAttribute("kind");(d==="packages"||d==="repositories")&&(a.currentView=d,k(),V());return}if(e.target.closest('[data-action="new-workspace"]')){let d=await Xf();d&&(await Pl(),await Oa(d),V());return}let n=e.target.closest('[data-action="share-workspace"]');if(n){let d=n.closest("[data-workspace-id]"),u=d?z().find(p=>p.id===d.dataset.workspaceId):null;u&&Zf({id:u.id,name:u.name,privateKeyBase64:u.privateKey}).catch(p=>alert(`Failed to open share dialog: ${p.message}`));return}let o=e.target.closest('[data-action="export-workspace"]');if(o){let d=o.closest("[data-workspace-id]"),u=d?z().find(p=>p.id===d.dataset.workspaceId):null;u&&Jf(u).catch(p=>alert(`Failed to open export dialog: ${p.message}`));return}let s=e.target.closest('[data-action="leave-workspace"]');if(s){let d=s.closest("[data-workspace-id]"),u=d?z().find(y=>y.id===d.dataset.workspaceId):null;if(!u)return;let p=Array.isArray(u.reports)?u.reports:[],f;try{f=await ys(p)}catch(y){alert(`Couldn't read reports to analyze triage impact: ${y.message}`);return}let{confirmed:h,mode:b,triage:m}=await Qf({name:u.name,reportCount:p.length,bundleCount:u.bundles.length,triageImpact:f});if(!h)return;if(!z().some(y=>y.id===u.id)){alert(`Workspace "${u.name}" was removed elsewhere; nothing to leave.`);return}try{await mf(u.id,b,{triage:m})}catch(y){alert(`Failed to leave workspace: ${y.message}`)}return}let i=e.target.closest(".file-item.workspace-item[data-workspace-id]");if(i){let d=i.dataset.workspaceId,u=a.currentView==="findings"||a.currentView==="files";d&&(d!==a.currentWorkspace||!u)&&Qt(d);return}let l=e.target.closest(".file-item[data-file]");if(l){let d=l.dataset.file;d&&(d!==a.currentFile||a.currentView!=="findings")&&_t(d);return}if(e.target.closest("sidebar-delete-current")){if(a.currentView==="bundles"&&a.selectedBundle){let m=a.selectedBundle,y=(a.bundles??[]).find(v=>v.integrity===m)?.name??m,$=z().filter(v=>Array.isArray(v.bundles)&&v.bundles.includes(m)).filter(v=>ul(v.id,m)).map(v=>v.id),{confirmed:w}=await th({name:y,inRemote:$.length>0});if(!w)return;if(a.selectedBundle!==m){alert(`Active bundle changed during confirmation; aborting delete of "${y}".`);return}try{await gf({deleteFromRemoteWorkspaceIds:$})}catch(v){alert(`Failed to delete bundle: ${v.message}`)}return}if(!a.currentFile)return;let d=a.currentFile,u;try{u=await ys([d])}catch(m){alert(`Couldn't read reports to analyze triage impact: ${m.message}`);return}let p=z().filter(m=>Array.isArray(m.reports)&&m.reports.includes(d)).filter(m=>Zn(m.id,d)).map(m=>m.id),f=p.length>0,{confirmed:h,triage:b}=await eh({name:d,triageImpact:u,inRemote:f});if(!h)return;if(a.currentFile!==d){alert(`Active report changed during confirmation; aborting delete of "${d}".`);return}try{await ff({triage:b,deleteFromRemoteWorkspaceIds:p})}catch(m){alert(`Failed to delete report: ${m.message}`)}return}if(e.target.closest("#sync-status")){D.status==="error"?D.dismissError():D.status==="off"?(!D.getServerUrl()&&$o&&D.setServerUrl($o),D.setEnabled(!0)):D.setEnabled(!1);return}if(e.target.closest("#sidebar-toggle")){ri.classList.toggle("collapsed");try{localStorage.setItem("deepview.sidebarCollapsed",ri.classList.contains("collapsed")?"1":"0")}catch{}}}function uv(e){let t=e.target.closest("[data-tooltip]");if(!t){ko();return}ac(t,{placement:"right",gate:r=>{let n=r.querySelector(".file-label");return!n||(r.dataset.tooltip??"")!==n.textContent?!0:n.scrollWidth>n.clientWidth}})}function pv(e){let t=e.target.closest("[data-tooltip]"),r=e.relatedTarget?.closest?.("[data-tooltip]")??null;t&&t===r||ko()}function fv(e){xr=e.target.value.trim().toLowerCase(),V()}var hv={off:"Sync off",online:"Online",offline:"Offline",connecting:"Connecting\u2026",error:"Sync error"};function gv(){return D.getServerUrl()||$o?z().length>0:!1}function si(e){let t=se?.querySelector("#sync-status");if(!t)return;let r=gv();if(r&&D.isEnabled()&&Ju().catch(i=>{console.warn("sync: load failed",i)}),r&&!D.getServerUrl()&&$o&&D.isEnabled()&&D.setServerUrl($o),D.setForcedOff(!r),!r){t.hidden=!0;return}t.hidden=!1;let n=e??D.status;t.dataset.status=n;let o=D.persistenceDegraded;t.toggleAttribute("data-degraded",o),t.title=o?"Not saving to this browser right now (storage may be full, or another tab is on a newer version). Changes that haven\u2019t synced could be lost on reload.":"";let s=t.querySelector(".sync-label");s&&(s.textContent=hv[n]??"")}D.onStatusChange(si);var lc=!1,dc=!1;async function hh(){if(!D.persistenceDegraded||dc||lc)return;lc=!0;let{shown:e}=await oh();if(lc=!1,e){dc=!0;return}D.persistenceDegraded&&setTimeout(hh,1500)}D.onPersistenceDegraded(e=>{si(),e?hh():dc=!1});function mv(e){let t=e.target.closest(".file-item.workspace-item");if(!t)return;let r=t.querySelector(".file-label");if(!r||r.querySelector("input"))return;let n=t.dataset.workspaceId,o=z().find(d=>d.id===n);if(!o)return;e.preventDefault();let s=document.createElement("input");s.type="text",s.value=o.name,s.className="workspace-rename-input",r.textContent="",r.append(s),s.focus(),s.select();let i=!1,l=async d=>{i||(i=!0,d&&await Da(n,s.value),V())};s.addEventListener("keydown",d=>{d.key==="Enter"?(d.preventDefault(),l(!0)):d.key==="Escape"&&(d.preventDefault(),l(!1))}),s.addEventListener("blur",()=>l(!0)),s.addEventListener("click",d=>d.stopPropagation()),s.addEventListener("dblclick",d=>d.stopPropagation())}function ii(){for(let e of se.querySelectorAll(".drag-over"))e.classList.remove("drag-over")}function gh(e){return e.dataTransfer.types.includes(pc)||e.dataTransfer.types.includes(xo)}function bv(e){let t=e.target.closest(".file-item[data-bundle-integrity]");if(t){if(t.classList.contains("bundle-missing")){e.preventDefault();return}let n=t.dataset.bundleIntegrity;e.dataTransfer.effectAllowed="move",e.dataTransfer.setData(xo,n),e.dataTransfer.setData(cc,t.dataset.workspaceId??""),e.dataTransfer.setData("text/plain",n),t.classList.add("dragging"),oi=!0,V();return}let r=e.target.closest(".file-item[data-file]");r&&(e.dataTransfer.effectAllowed="move",e.dataTransfer.setData(pc,r.dataset.file),e.dataTransfer.setData(cc,r.dataset.workspaceId??""),e.dataTransfer.setData("text/plain",r.dataset.file),r.classList.add("dragging"),ni=!0,V())}function yv(){for(let e of se.querySelectorAll(".dragging"))e.classList.remove("dragging");ii(),(ni||oi)&&(ni=!1,oi=!1,V())}function wv(e){if(!gh(e))return;e.preventDefault();let t=e.target.closest("[data-workspace-id]"),r=se.querySelector(".dragging")?.closest("[data-workspace-id]")?.dataset.workspaceId??null,s=t&&r&&t.dataset.workspaceId===r||!t&&!r;if(e.dataTransfer.dropEffect=s?"none":"move",ii(),!s)if(t){let i=t.dataset.workspaceId;for(let l of se.querySelectorAll(`[data-workspace-id="${CSS.escape(i)}"]`))l.classList.contains("dragging")||l.classList.add("drag-over")}else{let l=e.dataTransfer.types.includes(xo)?"[data-default-bundles]":"[data-default-reports]",d=se.querySelector(l);d&&d.classList.add("drag-over")}}function vv(e){se.contains(e.relatedTarget)||ii()}async function kv(e){if(!gh(e))return;e.preventDefault(),e.stopPropagation(),ii();let t=e.target.closest("[data-workspace-id]"),r=t?t.dataset.workspaceId:null,n=e.dataTransfer.getData(cc)||null;if(e.dataTransfer.types.includes(xo)){let s=e.dataTransfer.getData(xo);if(!s)return;if(n&&n!==r&&ul(n,s)){let i=(a.bundles??[]).find(u=>u.integrity===s)?.name??s,l=z().find(u=>u.id===n),{confirmed:d}=await rh({name:i,workspaceName:l?.name??""});if(!d)return;try{await Es(n,s)}catch(u){console.warn(`Failed to remove '${i}' from source workspace ${n} remote:`,u)}}r&&await gr(s,r),n&&n!==r&&await Va(s,n),V();return}let o=e.dataTransfer.getData(pc);if(o){if(n&&n!==r&&Zn(n,o)){let s=z().find(l=>l.id===n),{confirmed:i}=await nh({name:o,workspaceName:s?.name??""});if(!i)return;try{await Cs(n,o)}catch(l){console.warn(`Failed to remove '${o}' from source workspace ${n} remote:`,l)}}r&&await At(o,r),n&&n!==r&&await jn(o,n),V()}}function $v(e){ri=e,se=e.renderRoot,ti=se.querySelector("#file-list"),yp(se.querySelector("#encryption-toggle")),se.addEventListener("click",dv),se.addEventListener("dblclick",mv),se.addEventListener("dragstart",bv),se.addEventListener("dragend",yv),se.addEventListener("dragover",wv),se.addEventListener("dragleave",vv),se.addEventListener("drop",kv),ti.addEventListener("mouseover",uv),ti.addEventListener("mouseout",pv),se.querySelector("#sidebar-search-input")?.addEventListener("input",fv),si(D.status),V()}var uc=class extends H{static styles=[T(hp),T(fp)];render(){return c`<div class="sidebar-header"><h2 class="brand"><button class="brand-button" type="button" data-action="go-home"><span class="brand-name">DeepView</span></button> <span class="brand-tag">dev</span></h2><button id="encryption-toggle" type="button" hidden></button> <button id="sidebar-toggle" type="button" title="toggle sidebar" aria-label="toggle sidebar"><svg viewBox="0 0 16 16" width="14" height="14" fill="currentColor" aria-hidden="true"><path d="M2 4h12v1.5H2zM2 7.25h12v1.5H2zM2 10.5h12V12H2z"/></svg></button></div><div class="sidebar-search"><svg class="sidebar-search-icon" viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><circle cx="6.5" cy="6.5" r="4.5"/><path d="M9.7 9.7L13 13" stroke-linecap="round"/></svg> <input id="sidebar-search-input" type="search" placeholder="Search reports..." autocomplete="off"><sidebar-view-button kind="packages"></sidebar-view-button><sidebar-view-button kind="repositories"></sidebar-view-button></div><ul id="file-list"></ul><div class="sidebar-actions"><sidebar-delete-current></sidebar-delete-current><button id="sync-status" type="button" data-status="off"><span class="sync-dot" aria-hidden="true"></span> <span class="sync-label">Sync off</span></button></div>`}firstUpdated(){$v(this)}};customElements.define("app-sidebar",uc);var mh={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 \u2014 cancelling keeps your local value (which will then propagate back to the chain on your next save).",importedSideLabel:"Apply from chain",applyButton:"Apply"}};function bh(){ap(async(e,t,r)=>{let n=Ca(e);try{return await Gs(e,n,mh[r]??mh.attach)}catch{let o=e.length;return alert(`${r==="attach"?"A report attach":"A workspace sync"} had ${o} triage disagreement${o===1?"":"s"} with your local view. Kept your local values because another dialog is open. ${r==="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 fc=class extends I{static properties={retry:{type:Boolean},_value:{state:!0}};constructor(){super(),this.retry=!1,this._value=""}_finish(t){this._value="",super._finish(t)}_onCancel=()=>this._finish(null);_onInput=t=>{this._value=t.target.value};_onSubmit=()=>{let t=this._value??"";t&&this._finish(t)};_onKeydown=t=>{t.key==="Enter"&&(t.preventDefault(),this._onSubmit())};render(){let t=(this._value??"").length>0,r=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 c`<dialog @close="${this._onClose}"><header><h3>Sync server password</h3></header><p class="nwd-intro">${r}</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="${!t}" @click="${this._onSubmit}">${this.retry?"Retry":"Authenticate"}</button></footer></dialog>`}};customElements.define("sync-auth-dialog",fc);function yh({retry:e=!1}={}){return q("sync-auth-dialog",{retry:!!e})}function wh(){ip(async({retry:e})=>{try{return await yh({retry:e})}catch(t){return console.warn("Sync auth dialog failed to open:",t),null}})}var ai="https://triage.space/",xv=[{hostname:"deepaudit.dev",pathPrefix:"/",supportsSync:!0},{hostname:"chalker.github.io",pathPrefix:"/deepview/",supportsSync:!1}];function _v(){for(let e of xv)if(location.hostname===e.hostname&&location.pathname.startsWith(e.pathPrefix))return e;return null}var Sv=["deepview.triage","deepview.triage.pending"],Cv="deepview.repoUrls";function Ev(){try{for(let e of Sv)if(localStorage.getItem(e))return!0}catch{return!0}try{let e=localStorage.getItem(Cv);if(e){let t=JSON.parse(e);if(t&&typeof t=="object"&&Object.keys(t).length>0)return!0}}catch{return!0}return!1}async function Av(){if(Ev())return!0;let e=[];try{e=await le()}catch{return!0}if(e.length>0)return!0;try{if(z().length>0)return!0}catch{return!0}try{return await sa()}catch{return!0}}var hc=class extends H{static properties={supportsSync:{attribute:!1}};createRenderRoot(){return this}constructor(){super(),this.supportsSync=!1}firstUpdated(){let t=this.querySelector("dialog");t&&t.showModal();let r=this.querySelector("button.om-stay");r&&r.focus()}_finish(t){if(this._settled)return;this._settled=!0;let r=this.querySelector("dialog");r&&r.close(),this.dispatchEvent(new CustomEvent("resolve",{detail:t}))}_onClose=()=>this._finish(!1);_onStay=()=>this._finish(!1);_onMigrate=()=>this._finish(!0);render(){let t=()=>c`<a class="om-link" href="${ai}" target="_blank" rel="noopener noreferrer">${ai}</a>`;return c`<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 ${t()}.</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 ${t()}.</p>${this.supportsSync?c`<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 ${t()}. 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>`:c`<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 ${t()}.</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",hc);function Tv(e){return new Promise(t=>{let r=document.createElement("origin-migration-dialog");r.supportsSync=e.supportsSync,r.addEventListener("resolve",n=>{r.remove(),t(!!n.detail)}),document.body.append(r)})}async function vh(){let e=_v();return e?await Av()?await Tv(e)?(location.assign(ai),!0):!1:(location.replace(ai),!0):!1}var gc=class extends I{static styles=[...I.styles,T(Qe)];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(t){t.has("_stage")&&this._focusActiveInput()}_focusActiveInput(){if(this._stage==="password")this.renderRoot.querySelector('input[type="password"]')?.focus();else if(this._stage==="name"){let t=this.renderRoot.querySelector('input[data-role="name"]');t&&(t.focus(),t.select())}}_finish(t){this._settled||(this._decoded=null,this._password="",this.encoded="",super._finish(t))}_onClose=()=>this._finish(null);_onCancel=()=>this._finish(null);_onPasswordInput=t=>{this._password=t.target.value,this._error=""};_onNameInput=t=>{this._name=t.target.value};_onUnlock=async()=>{if(!(!this._password||this._busy)){this._busy=!0,this._error="";try{let t=await il({encoded:this.encoded,password:this._password});if(this._settled)return;let r=z().find(n=>n.id===t.id)??null;this._decoded=t,this._existingById=r,this._name=t.name,this._password="",this._stage="name"}catch(t){if(this._settled)return;this._error=t?.message??String(t)}finally{this._busy=!1}}};_onAttach=()=>{if(!this._decoded)return;let t=wt(this._name);if(!t)return;let r=z().find(n=>n.id===this._decoded.id)??null;if(r){this._existingById=r;return}this._nameCollision(t)||this._finish({id:this._decoded.id,name:t,privateKeyBase64:this._decoded.privateKeyBase64})};_nameCollision(t){if(!t||!this._decoded)return null;for(let r of z())if(r.id!==this._decoded.id&&wt(r.name)===t)return r;return null}_onKeydown=t=>{t.key==="Enter"&&(t.preventDefault(),this._stage==="password"?this._onUnlock():this._stage==="name"&&this._onAttach())};_passwordStage(){return c`<p class="nwd-note">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?c`<p class="wsl-error" role="alert">${this._error}</p>`:g}<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 t=this._existingById;return c`<p class="nwd-note">This workspace is already attached as <strong>"${t?.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 t=wt(this._name),r=this._nameCollision(t),n=!!t&&!r;return c`<p class="nwd-note">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> ${r?c`<p class="wsl-error" role="alert">A workspace named "${t}" already exists on this device. Pick a different name.</p>`:g}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" ?disabled="${!n}" @click="${this._onAttach}">Attach</button></footer>`}render(){let t=this._stage==="password"?"Attach shared workspace":this._existingById?"Workspace already attached":"Name the workspace";return c`<dialog @close="${this._onClose}"><header><h3>${t}</h3></header>${this._stage==="password"?this._passwordStage():this._nameStage()}</dialog>`}};customElements.define("workspace-unlock-link-dialog",gc);function kh({encoded:e}={}){return new Promise((t,r)=>{let n=document.createElement("workspace-unlock-link-dialog");n.encoded=e??"",n.addEventListener("resolve",o=>{n.remove(),t(o.detail)}),n.addEventListener("modal-conflict",o=>{n.encoded="",n.remove(),r(ft(o.detail?.cause))}),document.body.append(n)})}var Me=null,li=!1,_o=null;function Iv(e){if(!e)return"Could not unlock. Try again.";switch(e.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 r=e.message??String(e);return r.length>200?r.slice(0,197)+"\u2026":r}}}function Rv(){if(Me)return Me;Me=document.createElement("div"),Me.id="lock-overlay",Me.setAttribute("role","dialog"),Me.setAttribute("aria-modal","true"),Me.setAttribute("aria-label","Unlock DeepView"),Me.innerHTML=`
49
49
  <div class="lock-overlay-card">
50
50
  <div class="lock-overlay-icon" aria-hidden="true">
51
51
  <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>
@@ -62,29 +62,31 @@ ${r}`}">${Cw}<span class="file-label">${n}</span></button></li>`}function Ew(e,t
62
62
  <a href="#" class="lock-overlay-wipe">Wipe local data and start over</a>
63
63
  </p>
64
64
  </div>
65
- `;let e=Me.querySelector("button"),t=Me.querySelector(".lock-overlay-error");return e.addEventListener("click",async()=>{if(!ii){ii=!0,t.hidden=!0,t.textContent="",e.disabled=!0,e.textContent="Waiting\u2026",ko=new AbortController;try{let n=await Sn({signal:ko.signal})}catch(n){let o=Zw(n);t.textContent=o,t.hidden=!o}finally{ii=!1,ko=null,e.disabled=!1,e.textContent="Unlock with passkey"}}}),Me.querySelector(".lock-overlay-wipe").addEventListener("click",async n=>{if(n.preventDefault(),!ii&&confirm(`Wipe ALL local DeepView data and start over?
65
+ `;let e=Me.querySelector("button"),t=Me.querySelector(".lock-overlay-error");return e.addEventListener("click",async()=>{if(!li){li=!0,t.hidden=!0,t.textContent="",e.disabled=!0,e.textContent="Waiting\u2026",_o=new AbortController;try{let n=await Sn({signal:_o.signal})}catch(n){let o=Iv(n);t.textContent=o,t.hidden=!o}finally{li=!1,_o=null,e.disabled=!1,e.textContent="Unlock with passkey"}}}),Me.querySelector(".lock-overlay-wipe").addEventListener("click",async n=>{if(n.preventDefault(),!li&&confirm(`Wipe ALL local DeepView data and start over?
66
66
 
67
67
  This deletes your encrypted triage, all reports, and the passkey registration on this device. The data CANNOT be recovered after this \u2014 there is no backup.
68
68
 
69
- Use this only if you have lost access to your passkey and have no other way to unlock.`)&&confirm("Really wipe everything? This cannot be undone.")){try{await Cn()}catch(o){alert(`Wipe failed: ${o?.message??o}. Try again or clear localStorage manually via DevTools.`);return}location.reload()}}),document.body.append(Me),Me}function tv(){return gt()?X()&&!st():!1}function th(){if(tv()){let e=ev();e.hidden=!1;let t=e.querySelector("button");t&&t.focus()}else if(Me&&(Me.hidden=!0,ko))try{ko.abort()}catch{}}he(th);th();var rh=`dialog{max-width:640px;width:min(94vw,640px)}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}textarea{display:block;width:100%;box-sizing:border-box;min-height:9rem;max-height:50vh;resize:vertical;padding:.55rem .65rem;border:1px solid var(--border);border-radius:6px;background:var(--bg, var(--surface));color:var(--text);font:inherit;font-size:.88rem;line-height:1.4;&: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)}}
70
- `;var lc=class extends I{static styles=[...I.styles,T(rn),T(rh)];static properties={initial:{attribute:!1},finding:{attribute:!1},_value:{state:!0}};constructor(){super(),this.initial="",this.finding=null,this._value=""}beforeOpen(){this._value=this.initial??""}focusInitial(){let t=this.renderRoot.querySelector("textarea");if(!t)return;t.focus();let r=t.value.length;try{t.setSelectionRange(r,r)}catch{}}_onInput=t=>{this._value=t.target.value};_onSave=()=>{let t=(this._value??"").trim(),r=(this.initial??"").trim();if(t===r){this._finish(null);return}this._finish(t)};_onClear=()=>this._finish("");_onCancel=()=>this._finish(null);_onKeydown=t=>{t.key==="Enter"&&(t.ctrlKey||t.metaKey)&&(t.preventDefault(),this._onSave())};render(){let t=this.finding??{},r=t.file?t.line?`${t.file}:${t.line}`:t.file:"",n=(this.initial??"").length>0;return c`<dialog @close="${this._onClose}"><header><h3>${n?"Edit comment":"Add comment"}</h3><div class="finding">${nn(t.severity)} ${r?c`<span class="loc" title="${r}">${r}</span>`:g}</div>${t.description?c`<div class="desc" title="${t.description}">${t.description}</div>`:g}</header><textarea rows="6" placeholder="Write your notes here. Markdown is not rendered. Ctrl/⌘+Enter to save, Esc to cancel." .value="${this._value}" @input="${this._onInput}" @keydown="${this._onKeydown}"></textarea><footer class="nwd-actions">${n?c`<button type="button" class="danger" @click="${this._onClear}">Clear</button>`:g} <span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" @click="${this._onSave}">Save</button></footer></dialog>`}};customElements.define("comment-dialog",lc);function nh({initial:e="",finding:t=null}={}){return K("comment-dialog",{initial:e,finding:t})}var oh=`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: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: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}
71
- `;var cc=class extends I{static styles=[...I.styles,T(rn),T(oh)];static properties={initial:{attribute:!1},finding:{attribute:!1},_value:{state:!0}};constructor(){super(),this.initial="",this.finding=null,this._value=""}beforeOpen(){this._value=this.initial??""}focusInitial(){let t=this.renderRoot.querySelector('input[type="url"]');if(t){t.focus();try{t.select()}catch{}}}_onInput=t=>{this._value=t.target.value};_onSave=()=>{let t=(this._value??"").trim(),r=(this.initial??"").trim();if(t===r){this._finish(null);return}this._finish(t)};_onClear=()=>this._finish("");_onCancel=()=>this._finish(null);_onKeydown=t=>{t.key==="Enter"&&(t.preventDefault(),this._onSave())};render(){let t=this.finding??{},r=t.file?t.line?`${t.file}:${t.line}`:t.file:"",n=(this.initial??"").length>0,o=(this._value??"").trim(),s=Gr(o);return c`<dialog @close="${this._onClose}"><header><h3>${n?"Edit fix link":"Add fix link"}</h3><div class="finding">${nn(t.severity)} ${r?c`<span class="loc" title="${r}">${r}</span>`:g}</div>${t.description?c`<div class="desc" title="${t.description}">${t.description}</div>`:g}</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?c`<a class="open" href="${o}" target="_blank" rel="noopener noreferrer" title="Open in a new tab">Open ↗</a>`:g}</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">${n?c`<button type="button" class="danger" @click="${this._onClear}">Clear</button>`:g} <span class="nwd-spacer"></span> <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",cc);function sh({initial:e="",finding:t=null}={}){return K("fix-link-dialog",{initial:e,finding:t})}var ov={critical:"Critical",high:"High",medium:"Medium",low:"Low",high_bug:"High Bug",bug:"Bug",informational:"Informational"},sv=["critical","high","medium","low","high_bug","bug","informational"];function iv(e){return ov[e]??e}function ih(e){let t=sv.indexOf(e);return t===-1?999:t}function ah(e){let t=parseInt(e.line,10);return Number.isFinite(t)?`${e.file}:${t}`:e.file}function av(e){let t=M(e),r=a.triage.get(t),n=r?.triage,o=Yr(e),s=r?.color,i=r?.comment??"",l=et(e.description??"",e),d=gr(e),f=[d?`### ${ah(e)} - ${d}`:`### ${ah(e)}`,""],p=[];return e.confidence!==void 0&&p.push(`**Confidence:** ${e.confidence}/10`),n?p.push(`**Triage:** ${n}`):o&&p.push("**Ignored**"),s&&p.push(`**Mark:** ${s}`),p.length>0&&(f.push(p.join(", ")),f.push("")),l&&(f.push(l.trim()),f.push("")),e.recommendation&&(f.push(`**Recommendation:** ${et(e.recommendation,e).trim()}`),f.push("")),e.confidenceReason&&(f.push(`**Confidence reason:** ${et(e.confidenceReason,e).trim()}`),f.push("")),e.fix&&(f.push(`**Fix:** ${et(e.fix,e).trim()}`),f.push("")),i&&(f.push(`**Comment:** ${i.trim()}`),f.push("")),f.join(`
72
- `)}function lv(e){let t=(e.groups??[]).flat(),r=[`# ${e.fileName}`,""];if(e.source&&(r.push(`**Source:** ${e.source}`),r.push("")),r.push(`**Findings:** ${t.length}`),r.push(""),t.length===0)return r.join(`
73
- `);let n=new Map;for(let s of t){let i=s.severity??"informational";n.has(i)||n.set(i,[]),n.get(i).push(s)}let o=[...n.keys()].toSorted((s,i)=>ih(s)-ih(i));for(let s of o){let i=n.get(s);r.push(`## ${iv(s)} (${i.length})`),r.push("");for(let l of i)r.push(av(l))}return r.join(`
69
+ Use this only if you have lost access to your passkey and have no other way to unlock.`)&&confirm("Really wipe everything? This cannot be undone.")){try{await Cn()}catch(o){alert(`Wipe failed: ${o?.message??o}. Try again or clear localStorage manually via DevTools.`);return}location.reload()}}),document.body.append(Me),Me}function Bv(){return mt()?X()&&!st():!1}function $h(){if(Bv()){let e=Rv();e.hidden=!1;let t=e.querySelector("button");t&&t.focus()}else if(Me&&(Me.hidden=!0,_o))try{_o.abort()}catch{}}ge($h);$h();var xh=`dialog{max-width:640px;width:min(94vw,640px)}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}textarea{display:block;width:100%;box-sizing:border-box;min-height:9rem;max-height:50vh;resize:vertical;padding:.55rem .65rem;border:1px solid var(--border);border-radius:6px;background:var(--bg, var(--surface));color:var(--text);font:inherit;font-size:.88rem;line-height:1.4;&: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)}}
70
+ `;var mc=class extends I{static styles=[...I.styles,T(on),T(xh)];static properties={initial:{attribute:!1},finding:{attribute:!1},_value:{state:!0}};constructor(){super(),this.initial="",this.finding=null,this._value=""}beforeOpen(){this._value=this.initial??""}focusInitial(){let t=this.renderRoot.querySelector("textarea");if(!t)return;t.focus();let r=t.value.length;try{t.setSelectionRange(r,r)}catch{}}_onInput=t=>{this._value=t.target.value};_onSave=()=>{let t=(this._value??"").trim(),r=(this.initial??"").trim();if(t===r){this._finish(null);return}this._finish(t)};_onClear=()=>this._finish("");_onCancel=()=>this._finish(null);_onKeydown=t=>{t.key==="Enter"&&(t.ctrlKey||t.metaKey)&&(t.preventDefault(),this._onSave())};render(){let t=this.finding??{},r=t.file?t.line?`${t.file}:${t.line}`:t.file:"",n=(this.initial??"").length>0;return c`<dialog @close="${this._onClose}"><header><h3>${n?"Edit comment":"Add comment"}</h3><div class="finding">${sn(t.severity)} ${r?c`<span class="loc" title="${r}">${r}</span>`:g}</div>${t.description?c`<div class="desc" title="${t.description}">${t.description}</div>`:g}</header><textarea rows="6" placeholder="Write your notes here. Markdown is not rendered. Ctrl/⌘+Enter to save, Esc to cancel." .value="${this._value}" @input="${this._onInput}" @keydown="${this._onKeydown}"></textarea><footer class="nwd-actions">${n?c`<button type="button" class="danger" @click="${this._onClear}">Clear</button>`:g} <span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" @click="${this._onSave}">Save</button></footer></dialog>`}};customElements.define("comment-dialog",mc);function _h({initial:e="",finding:t=null}={}){return q("comment-dialog",{initial:e,finding:t})}var Sh=`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: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: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}
71
+ `;var bc=class extends I{static styles=[...I.styles,T(on),T(Sh)];static properties={initial:{attribute:!1},finding:{attribute:!1},_value:{state:!0}};constructor(){super(),this.initial="",this.finding=null,this._value=""}beforeOpen(){this._value=this.initial??""}focusInitial(){let t=this.renderRoot.querySelector('input[type="url"]');if(t){t.focus();try{t.select()}catch{}}}_onInput=t=>{this._value=t.target.value};_onSave=()=>{let t=(this._value??"").trim(),r=(this.initial??"").trim();if(t===r){this._finish(null);return}this._finish(t)};_onClear=()=>this._finish("");_onCancel=()=>this._finish(null);_onKeydown=t=>{t.key==="Enter"&&(t.preventDefault(),this._onSave())};render(){let t=this.finding??{},r=t.file?t.line?`${t.file}:${t.line}`:t.file:"",n=(this.initial??"").length>0,o=(this._value??"").trim(),s=Jr(o);return c`<dialog @close="${this._onClose}"><header><h3>${n?"Edit fix link":"Add fix link"}</h3><div class="finding">${sn(t.severity)} ${r?c`<span class="loc" title="${r}">${r}</span>`:g}</div>${t.description?c`<div class="desc" title="${t.description}">${t.description}</div>`:g}</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?c`<a class="open" href="${o}" target="_blank" rel="noopener noreferrer" title="Open in a new tab">Open ↗</a>`:g}</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">${n?c`<button type="button" class="danger" @click="${this._onClear}">Clear</button>`:g} <span class="nwd-spacer"></span> <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",bc);function Ch({initial:e="",finding:t=null}={}){return q("fix-link-dialog",{initial:e,finding:t})}var Lv={critical:"Critical",high:"High",medium:"Medium",low:"Low",high_bug:"High Bug",bug:"Bug",informational:"Informational"},Pv=["critical","high","medium","low","high_bug","bug","informational"];function Ov(e){return Lv[e]??e}function Eh(e){let t=Pv.indexOf(e);return t===-1?999:t}function Ah(e){let t=parseInt(e.line,10);return Number.isFinite(t)?`${e.file}:${t}`:e.file}function Nv(e){let t=P(e),r=a.triage.get(t),n=r?.triage,o=Xr(e),s=r?.color,i=r?.comment??"",l=Ze(e.description??"",e),d=mr(e),p=[d?`### ${Ah(e)} - ${d}`:`### ${Ah(e)}`,""],f=[];return e.confidence!==void 0&&f.push(`**Confidence:** ${e.confidence}/10`),n?f.push(`**Triage:** ${n}`):o&&f.push("**Ignored**"),s&&f.push(`**Mark:** ${s}`),f.length>0&&(p.push(f.join(", ")),p.push("")),l&&(p.push(l.trim()),p.push("")),e.recommendation&&(p.push(`**Recommendation:** ${Ze(e.recommendation,e).trim()}`),p.push("")),e.confidenceReason&&(p.push(`**Confidence reason:** ${Ze(e.confidenceReason,e).trim()}`),p.push("")),e.fix&&(p.push(`**Fix:** ${Ze(e.fix,e).trim()}`),p.push("")),i&&(p.push(`**Comment:** ${i.trim()}`),p.push("")),p.join(`
72
+ `)}function Dv(e){let t=(e.groups??[]).flat(),r=[`# ${e.fileName}`,""];if(e.source&&(r.push(`**Source:** ${e.source}`),r.push("")),r.push(`**Findings:** ${t.length}`),r.push(""),t.length===0)return r.join(`
73
+ `);let n=new Map;for(let s of t){let i=s.severity??"informational";n.has(i)||n.set(i,[]),n.get(i).push(s)}let o=[...n.keys()].toSorted((s,i)=>Eh(s)-Eh(i));for(let s of o){let i=n.get(s);r.push(`## ${Ov(s)} (${i.length})`),r.push("");for(let l of i)r.push(Nv(l))}return r.join(`
74
74
  `).trimEnd()+`
75
- `}function cv(e){return e.map(lv).join(`
75
+ `}function Uv(e){return e.map(Dv).join(`
76
76
  ---
77
77
 
78
- `)}function dv(e){let t=e.map(n=>n.fileName),r="";return t.length===1?r=t[0]:t.length>1&&(r=Is(t)),r=r.replace(/\.json$/u,""),`${r||"deepview-report"}.md`}function lh(e){if(e.length===0)return;let t=cv(e),r=new Blob([t],{type:"text/markdown;charset=utf-8"});Ar(r,dv(e))}ua(()=>{a.currentView==="bundles"&&a.selectedBundle?k():a.currentView==="packages"?k():a.currentView==="repositories"?k():(a.currentView==="findings"||a.currentView==="files")&&W().catch(()=>{})});function ch(){a.currentView==="bundles"&&a.bundleDetailsTab==="graph"?Js():Wl()}function di(){a.currentView==="bundles"&&a.bundleDetailsTab==="graph"?Xs():Hl()}function $o(){let e=document.querySelector(".bundle-source-code-wrap"),t=e?.scrollTop??0,r=e?.scrollLeft??0;k();let n=document.querySelector(".bundle-source-code-wrap");n&&(n.scrollTop=t,n.scrollLeft=r)}function uc(e){let r=document.querySelector(e)?.scrollTop??0;k();let n=document.querySelector(e);n&&(n.scrollTop=r)}function Z(e,t){for(let r of e.composedPath())if(r?.matches?.(t))return r;return null}A.addEventListener("click",e=>{let t=Z(e,"[data-finding-code-bundle]");if(t){let $=t.dataset.findingCodeBundle,j=t.dataset.findingCodeFile,Y=t.dataset.findingCodeLine,z=Y?parseInt(Y,10):null;a.bundleSourceFile=j||null,a.bundleSourceFindingIdx=null,a.bundleDetailsTab==="code"&&(a.bundleDetailsTab="overview");let xe=()=>{Number.isFinite(z)&&queueMicrotask(()=>{let le=document.querySelector(`.bundle-source-lineno-row[data-line="${z}"]`);le&&le.scrollIntoView({block:"start",behavior:"instant"})})};if(a.selectedBundle===$&&a.bundleDetails?.integrity===$){k(),xe();return}a.selectedBundle=$,a.bundleDetails=null,k(),(async()=>(await Yt($),xe()))();return}let r=e.target.closest("[data-package-expand]");if(r){let $=r.dataset.packageExpand;a.expandedPackages.has($)?a.expandedPackages.delete($):a.expandedPackages.add($),k();return}let n=e.target.closest("[data-package-row-issues]");if(n){let $=n.dataset.packageRowIssues,j=n.dataset.packageRowIssuesVersion;a.selectedPackage=$,a.selectedPackageVersion=j||null,a.packageDetailsTab="issues",a.packageSlideTriage=null,a.packageSlideTransient=!0,k();return}let o=e.target.closest("[data-repository-row-issues]");if(o){let $=o.dataset.repositoryRowIssues;a.selectedRepository=$,a.repositoryDetailsTab="issues",a.repositorySlideTriage=null,a.repositorySlideTransient=!0,k();return}let s=e.target.closest("[data-select-package]");if(s){let $=s.dataset.selectPackage,j=s.dataset.selectPackageVersion??"",Y=j===""?null:j;if(a.selectedPackage===$&&a.selectedPackageVersion===Y)return;a.selectedPackage=$,a.selectedPackageVersion=Y,a.packageDetailsTab="overview",a.packageSlideTriage=null,a.packageSlideTransient=!1,k();return}if(e.target.closest("[data-deselect-package]")){a.selectedPackage=null,a.selectedPackageVersion=null,k();return}let i=e.target.closest("[data-package-tab]");if(i){let $=i.dataset.packageTab;($==="overview"||$==="issues")&&a.packageDetailsTab!==$&&(a.packageDetailsTab=$,k());return}if(e.target.closest('[data-action="package-slide-back"]')){a.packageDetailsTab="overview",a.packageSlideTriage=null,a.packageSlideTransient&&(a.selectedPackage=null,a.selectedPackageVersion=null,a.packageSlideTransient=!1),k();return}let l=e.target.closest("[data-package-slide-triage]");if(l){let $=l.dataset.packageSlideTriage;a.packageSlideTriage=a.packageSlideTriage===$?null:$,k();return}let d=e.target.closest("[data-package-report]");if(d){let $=d.dataset.packageReport;$&&$t($);return}let u=e.target.closest("[data-select-repository]");if(u){let $=u.dataset.selectRepository;if(a.selectedRepository===$)return;a.selectedRepository=$,a.repositoryDetailsTab="overview",a.repositorySlideTriage=null,a.repositorySlideTransient=!1,k();return}if(e.target.closest("[data-deselect-repository]")){a.selectedRepository=null,k();return}let f=e.target.closest("[data-repository-tab]");if(f){let $=f.dataset.repositoryTab;($==="overview"||$==="issues")&&a.repositoryDetailsTab!==$&&(a.repositoryDetailsTab=$,k());return}if(e.target.closest('[data-action="repository-slide-back"]')){a.repositoryDetailsTab="overview",a.repositorySlideTriage=null,a.repositorySlideTransient&&(a.selectedRepository=null,a.repositorySlideTransient=!1),k();return}let p=e.target.closest("[data-repository-slide-triage]");if(p){let $=p.dataset.repositorySlideTriage;a.repositorySlideTriage=a.repositorySlideTriage===$?null:$,k();return}let h=e.target.closest("[data-bundle-tab]");if(h){let $=h.dataset.bundleTab;lo.has($)&&(a.bundleDetailsTab==="graph"&&$!=="graph"&&Ue(),a.bundleDetailsTab=$,a.bundleSourceFile=null,a.bundleSourceFindingIdx=null,a.selectedBundle&&on(a.selectedBundle,$),k());return}if(e.target.closest("[data-advisories-consent]")){Yp(),k();return}let b=e.target.closest("[data-bundle-issue-report]");if(b){let $=b.dataset.bundleIssueReport;$&&$t($);return}let m=e.target.closest("[data-bundle-search-mode]");if(m){let $=m.dataset.bundleSearchMode;($==="files"||$==="code"||$==="issues")&&(a.bundleCodeSearchMode=$,k());return}if(e.target.closest("[data-bundle-search-clear]")){a.bundleCodeSearchQuery!==""&&(a.bundleCodeSearchQuery="",k());return}if(e.target.classList?.contains("bundle-source-overlay")||e.target.closest('[data-action="bundle-source-close"]')){a.bundleSourceFile&&(a.bundleSourceFile=null,a.bundleSourceFindingIdx=null,k());return}if(e.target.closest('[data-action="bundle-source-panel-close"]')){a.bundleSourceFindingIdx!=null&&(a.bundleSourceFindingIdx=null,$o());return}let y=e.target.closest("[data-bundle-source-finding]");if(y){let $=parseInt(y.dataset.bundleSourceFinding,10);Number.isFinite($)&&(a.bundleSourceFindingIdx=a.bundleSourceFindingIdx===$?null:$,$o());return}let v=Z(e,"[data-bundle-view-source]");if(v){let $=v.dataset.bundleViewSource;if(!$)return;let j=v.dataset.bundleViewFindingIdx,Y=j===void 0?null:parseInt(j,10),z=v.dataset.bundleViewLine,xe=z?parseInt(z,10):null;if(a.bundleSourceFile=$,Number.isFinite(Y)&&(a.bundleSourceFindingIdx=Y),v.closest(".bundle-code-rail")?uc(".bundle-code-rail-body"):v.closest(".bundles-slide-body")?uc(".bundles-slide-body"):k(),Number.isFinite(xe)){let le=v.dataset.bundleViewScrollBlock||"center";queueMicrotask(()=>{let te=document.querySelector(`.bundle-source-lineno-row[data-line="${xe}"]`);te&&te.scrollIntoView({block:le,behavior:"smooth"})})}return}if(e.target.closest('[data-action="toggle-files"]')){a.currentView==="files"?a.currentView="findings":(a.viewMode==="graph"&&Ue(),a.currentView="files"),document.body.classList.remove("report-fullscreen"),k();return}let x=Z(e,"[data-g2-pkg]");if(x){let $=x.dataset.g2Pkg;E.solo=E.solo===$?null:$,E.solo&&(E.selected=null),ch(),di(),E.graphState?.requestDraw?.();return}let S=Z(e,"[data-g2-select]");if(S){E.selected=S.dataset.g2Select,ch();return}let C=Z(e,"[data-g2-top-pkgs]");if(C){E.topPkgsTab=C.dataset.g2TopPkgs,di();return}let L=Z(e,"[data-g2-jump-findings]");if(L){if(a.currentView==="bundles"){a.bundleDetailsTab==="graph"&&Ue(),a.bundleDetailsTab="issues",a.bundleSourceFile=null,a.bundleSourceFindingIdx=null,a.selectedBundle&&on(a.selectedBundle,"issues"),k();return}Rs(),a.filterConfMin=0,a.filterInclude=L.dataset.g2JumpFindings,a.currentView="findings",a.viewMode==="graph"&&(a.viewMode="table"),Ue(),k();return}let V=Z(e,"[data-g2-jump-file]");if(V){let $=V.dataset.g2JumpFile;a.currentView="files",Ue(),k(),requestAnimationFrame(()=>{let j=document.querySelector(`#${oo($)}`);j&&j.scrollIntoView({behavior:"smooth",block:"start"})});return}if(Z(e,"#g2-path-filter-clear")){E.pathFilter="";let $=document.querySelector("graph-layout")?.shadowRoot?.querySelector("#g2-path-filter");$&&($.value=""),E.graphState?.requestDraw?.();return}if(Z(e,"#g2-fullscreen")){document.body.classList.toggle("report-fullscreen");return}if(Z(e,"[data-g2-show-all]")){E.showAll=!E.showAll,E.layoutCache=null,E.selected=null,Ue(),k();return}let ee=Z(e,".graph2-triage-selector [data-triage-show]");if(ee){let $=ee.dataset.triageShow;a.shownTriage=a.shownTriage===$?null:$,E.layoutCache=null,E.selected=null,Ue(),k();return}let er=Z(e,"[data-g2-focus-pkg]");if(er){E.focusedPkg=er.dataset.g2FocusPkg,E.layoutCache=null,Ue(),k();return}if(Z(e,"#g2-back-to-full")){E.focusedPkg=null,E.layoutCache=null,Ue(),k();return}let be=Z(e,".tab");if(be&&Z(e,".tabs")){let j=Z(e,"[data-gid]").dataset.gid,Y=be.dataset.tid;a.activeTabByGroup.set(j,Y),k();return}let Je=Z(e,"[data-triage-action]");if(Je){let $=Je.closest(".triage-menu"),j=$?.dataset.gid;if(!j)return;let Y=br(j);if(!Y)return;let z=Je.dataset.triageAction;if(!["fixed","invalid","deleted","ignored","restore"].includes(z))return;let le=me(Y).hasConflict?[Ae(Y)]:Y;for(let te of le){let Be=M(te),_e=Bs(te);z==="restore"?(F(a.triage,Be,{triage:void 0}),ne(a.triage,Be,_e,!1)):z==="ignored"?Et(a.triage,Be,_e)?ne(a.triage,Be,_e,!1):(F(a.triage,Be,{triage:void 0}),ne(a.triage,Be,_e,!0)):a.triage.get(Be)?.triage===z?F(a.triage,Be,{triage:void 0}):(F(a.triage,Be,{triage:z}),ne(a.triage,Be,_e,!1))}try{$.hidePopover()}catch{}oe(),k();return}if(Z(e,".mark-comment")){let j=Z(e,"[data-gid]").dataset.gid,Y=br(j);if(!Y)return;let z=Ae(Y),xe=M(z),le=a.triage.get(xe)?.comment??"";nh({initial:le,finding:z}).then(te=>(te===null||(F(a.triage,xe,{comment:te||void 0}),oe(),k()),null)).catch(()=>{});return}let _r=Z(e,".mark-copy");if(_r){let j=Z(e,"[data-gid]")?.dataset?.gid,Y=j?br(j):null;if(!Y)return;let z=Ae(Y),xe=!1,le=null;for(let _e of mt().values())if(_e.files.has(z.file)){xe=!0,_e.repos&&_e.repos.size===1&&(le=[..._e.repos][0]);break}xe||(le=z.repo?.github??z._repoFallback??a.repoUrl??null,le||(le=null));let te=[];le&&te.push(`Repo: ${le}`),z.file&&te.push(`File: ${z.file}`),z.line!==void 0&&z.line!==null&&z.line!==""&&te.push(`Line: ${z.line}`),z.description&&te.push(`Description: ${z.description}`),z.confidence!==void 0&&z.confidence!==null&&te.push(`Confidence: ${z.confidence}/10`);let Be=te.join(`
79
- `);try{navigator.clipboard.writeText(Be).then(()=>(_r.classList.add("copied"),setTimeout(()=>_r.classList.remove("copied"),1e3),null)).catch(()=>{})}catch{}return}if(Z(e,".mark-fix")){let j=Z(e,"[data-gid]").dataset.gid,Y=br(j);if(!Y)return;let z=Ae(Y),xe=M(z),le=a.triage.get(xe)?.fix??"";sh({initial:le,finding:z}).then(te=>(te===null||(F(a.triage,xe,{fix:te||void 0}),oe(),k()),null)).catch(()=>{});return}let Sr=e.target.closest("[data-triage-show]");if(Sr&&!Sr.closest(".graph2-triage-selector")){let $=Sr.dataset.triageShow;a.shownTriage=a.shownTriage===$?null:$,k();return}let dn=e.target.closest("[data-source-toggle]");if(dn){let $=dn.dataset.sourceToggle,j=a.filterSources.has($);a.filterSources.clear(),j||a.filterSources.add($),k();return}if(e.target.closest("[data-table-deselect]")){a.tableSelectedGid=null,k();return}let Bt=e.target.closest("[data-tree-select]");if(Bt){let $=Bt.dataset.treeSelect;a.filesSelectedFile=a.filesSelectedFile===$?null:$,k();return}e.target.closest("[data-tree-deselect]")&&(a.filesSelectedFile=null,k())});var dh=document.querySelector("#bundle-source-overlay-slot");dh&&dh.addEventListener("click",e=>{if(e.target.classList?.contains("bundle-source-overlay")||e.target.closest('[data-action="bundle-source-close"]')){a.bundleSourceFile&&(a.bundleSourceFile=null,a.bundleSourceFindingIdx=null,k());return}if(e.target.closest('[data-action="bundle-source-panel-close"]')){a.bundleSourceFindingIdx!=null&&(a.bundleSourceFindingIdx=null,$o());return}let t=e.target.closest("[data-bundle-source-finding]");if(t){let r=parseInt(t.dataset.bundleSourceFinding,10);Number.isFinite(r)&&(a.bundleSourceFindingIdx=a.bundleSourceFindingIdx===r?null:r,$o())}});A.addEventListener("row-select",e=>{let t=e.detail?.gid;t&&(a.tableSelectedGid=a.tableSelectedGid===t?null:t,uc(".findings-table-list"))});var ui="application/x-deepview-kanban-gid";function uv(e,t){let n=me(e).hasConflict?[Ae(e)]:e;for(let o of n){let s=M(o),i=Bs(o);t==="untriaged"?(F(a.triage,s,{triage:void 0}),ne(a.triage,s,i,!1)):t==="ignored"?(F(a.triage,s,{triage:void 0}),ne(a.triage,s,i,!0)):(F(a.triage,s,{triage:t}),ne(a.triage,s,i,!1))}}function pc(){for(let e of A.querySelectorAll(".kanban-card.dragging"))e.classList.remove("dragging");for(let e of A.querySelectorAll(".kanban-column.drag-over"))e.classList.remove("drag-over")}A.addEventListener("dragstart",e=>{let t=e.target.closest?.(".kanban-card[data-kanban-source]");if(!t||!e.dataTransfer)return;let r=t.dataset.gid;r&&(e.dataTransfer.setData(ui,r),e.dataTransfer.setData("text/plain",r),e.dataTransfer.effectAllowed="move",t.classList.add("dragging"))});A.addEventListener("dragend",()=>{pc()});A.addEventListener("dragover",e=>{if(!e.dataTransfer?.types.includes(ui))return;let t=e.target.closest?.(".kanban-column[data-kanban-target]");if(t&&(e.preventDefault(),e.dataTransfer.dropEffect="move",!t.classList.contains("drag-over"))){for(let r of A.querySelectorAll(".kanban-column.drag-over"))r!==t&&r.classList.remove("drag-over");t.classList.add("drag-over")}});A.addEventListener("dragleave",e=>{let t=e.target.closest?.(".kanban-column[data-kanban-target]");t&&(t.contains(e.relatedTarget)||t.classList.remove("drag-over"))});A.addEventListener("drop",e=>{if(!e.dataTransfer?.types.includes(ui))return;let t=e.target.closest?.(".kanban-column[data-kanban-target]");if(!t){pc();return}e.preventDefault();let r=e.dataTransfer.getData(ui),n=t.dataset.kanbanTarget;if(pc(),!r||!n)return;let o=br(r);!o||(me(o).commonTriage??"untriaged")===n||(uv(o,n),k(),queueMicrotask(oe))});var dc=!1;function ai(e){return e?A.querySelector(`.kanban-card[data-gid="${CSS.escape(e)}"]`):null}function li(e){let t=e??A.querySelector(".kanban-card");if(!t)return;let r=t.getBoundingClientRect();r.width<=0||r.height<=0||(document.documentElement.style.setProperty("--kanban-clip-card-w",`${Math.floor(r.width)}px`),document.documentElement.style.setProperty("--kanban-clip-card-h",`${Math.floor(r.height)}px`))}function ci(e){let t=a.kanbanPopoverGid;if(t===e)return;let r=t===null&&e!==null,n=t!==null&&e===null;if(!document.startViewTransition||!r&&!n){a.kanbanPopoverGid=e,k();return}if(dc)return;dc=!0;let o=r?"kanban-opening":"kanban-closing";document.documentElement.classList.add(o);let s=u=>{u&&(u.style.viewTransitionName=""),document.documentElement.classList.remove(o),dc=!1};if(r){let u=ai(e);u?(li(u),u.style.viewTransitionName="kanban-detail-modal",u.getBoundingClientRect()):li(),a.kanbanPopoverGid=e;let f=document.startViewTransition(()=>{k(),u&&(u.style.viewTransitionName="")}),p=setTimeout(()=>s(u),600);(async()=>{try{await f.finished}catch{}clearTimeout(p),s(u)})();return}li(),a.kanbanPopoverGid=e;let i=null,l=document.startViewTransition(()=>{k(),i=ai(t),i&&(li(i),i.style.viewTransitionName="kanban-detail-modal")}),d=setTimeout(()=>s(i??ai(t)),600);(async()=>{try{await l.finished}catch{}clearTimeout(d),s(i??ai(t))})()}A.addEventListener("click",e=>{if(e.target.closest?.(".kanban-detail-close")){ci(null);return}let t=e.target.closest?.(".kanban-card[data-kanban-source]");if(t){if(window.getSelection?.()?.toString())return;let r=t.dataset.gid;if(!r)return;ci(a.kanbanPopoverGid===r?null:r);return}e.target.closest?.(".kanban-detail-modal")||a.kanbanPopoverGid&&ci(null)});document.addEventListener("keydown",e=>{e.key==="Escape"&&a.kanbanPopoverGid&&ci(null)});function uh(e){if(!e||a.focusGid===e)return;a.focusGid=e,k();let t=A.querySelector(".focus-side-card.active");t&&t.scrollIntoView({block:"nearest",behavior:"instant"});let r=A.querySelector(".focus-code-line-active");r&&r.scrollIntoView({block:"center",behavior:"instant"})}function ph(e){let t=A.querySelectorAll(".focus-side-card[data-focus-select]");if(t.length===0)return;let r=-1;for(let s=0;s<t.length;s++)if(t[s].classList.contains("active")){r=s;break}let n=r<0?e>0?0:t.length-1:Math.min(Math.max(r+e,0),t.length-1);if(n===r)return;let o=t[n].dataset.gid;o&&uh(o)}A.addEventListener("click",e=>{let t=e.target.closest?.("[data-focus-nav]");if(t){ph(t.dataset.focusNav==="next"?1:-1);return}let r=e.target.closest?.(".focus-side-card[data-focus-select]");if(!r||window.getSelection?.()?.toString())return;let n=r.dataset.gid;n&&uh(n)});document.addEventListener("keydown",e=>{if(a.viewMode!=="focus"||a.currentView!=="findings"||e.metaKey||e.ctrlKey||e.altKey)return;let t=e.target.tagName;if(t==="INPUT"||t==="TEXTAREA"||t==="SELECT"||e.target.isContentEditable)return;let r=0;if(e.key==="ArrowRight"||e.key==="j"||e.key==="J"||e.key==="l"||e.key==="L")r=1;else if(e.key==="ArrowLeft"||e.key==="k"||e.key==="K"||e.key==="h"||e.key==="H")r=-1;else return;e.preventDefault(),ph(r)});A.addEventListener("mark-color",e=>{let t=Z(e,"[data-gid]");if(!t)return;let r=t.dataset.gid,n=br(r);if(!n)return;let o=M(Ae(n)),s=e.detail?.color;if(!s)return;a.triage.get(o)?.color===s?F(a.triage,o,{color:void 0}):F(a.triage,o,{color:s}),oe(),k()});var xr=null,fc=null;function fh(){if(xr!==null||a.reports.length===0)return;xr=a.viewMode,fc=document.title,a.viewMode==="table"&&(a.viewMode="list",k());let e=a.reports.map(r=>r.fileName),t="";e.length===1?t=e[0]:e.length>1&&(t=Is(e)),t=t.replace(/\.json$/u,""),t&&(document.title=t)}function hh(){xr!==null&&(a.viewMode!==xr&&(a.viewMode=xr,k()),document.title=fc,xr=null,fc=null)}window.addEventListener("beforeprint",fh);window.addEventListener("afterprint",hh);document.querySelector("#print-btn").addEventListener("click",async()=>{if(a.reports.length!==0&&xr===null){fh();try{await Promise.all([...A.querySelectorAll("finding-card")].map(e=>e.updateComplete)),window.print()}catch(e){throw hh(),e}}});document.querySelector("#download-btn").addEventListener("click",()=>{a.reports.length!==0&&lh(a.reports)});A.addEventListener("change",e=>{let t=e.target.id,r=e.target.value;t==="sort-select"?(a.sortBy=r,k()):t==="analyzer-select"?(a.filterAnalyzer=r,k()):t==="packages-sort-select"?(a.packagesSortBy=r,k()):t==="repositories-sort-select"&&(a.repositoriesSortBy=r,k())});A.addEventListener("range-change",e=>{e.target.id==="conf-range"&&(a.filterConfMin=e.detail.low,a.filterConfMax=e.detail.high,k())});A.addEventListener("input",e=>{let t=e.composedPath()[0],r=t?.id,n=t?.value;r==="filter-search"?(a.filterInclude=n,sn(r)):r==="filter-files-search"?(a.filesSearch=n,sn(r)):r==="g2-path-filter"?(E.pathFilter=n,E.graphState?.requestDraw?.()):r==="bundle-code-search-input"?(a.bundleCodeSearchQuery=n,sn(r)):r==="packages-search-input"?(a.packagesSearchQuery=n,sn(r)):r==="repositories-search-input"&&(a.repositoriesSearchQuery=n,sn(r))});A.addEventListener("severity-toggle",e=>{let t=e.detail.severity;if(e.detail.kind==="graph"){E.selectedSeverities.has(t)?E.selectedSeverities.delete(t):E.selectedSeverities.add(t),e.composedPath()[0].selected=[...E.selectedSeverities],E.graphState?.requestDraw?.(),di();return}a.filterSeverities.has(t)?a.filterSeverities.delete(t):a.filterSeverities.add(t),k()});A.addEventListener("color-toggle",e=>{let t=e.detail.color;if(e.detail.kind==="graph"){E.selectedColors.has(t)?E.selectedColors.delete(t):E.selectedColors.add(t),e.composedPath()[0].selected=[...E.selectedColors],E.graphState?.requestDraw?.(),di();return}a.filterColors.has(t)?a.filterColors.delete(t):a.filterColors.add(t),k()});A.addEventListener("view-mode-change",e=>{if(e.detail.kind==="files"){a.filesViewMode=e.detail.mode,k();return}a.viewMode=e.detail.mode;try{localStorage.setItem(ns,a.viewMode)}catch{}a.viewMode!=="kanban"&&(a.kanbanPopoverGid=null),a.viewMode!=="focus"&&(a.focusGid=null),k()});A.addEventListener("repo-edit-start",()=>{a.repoEditing=!0,k()});A.addEventListener("repo-input",e=>{a.repoUrl=e.detail.url,He(a.currentFile,a.repoUrl)});A.addEventListener("repo-commit",e=>{a.repoUrl=e.detail.url,He(a.currentFile,a.repoUrl),a.repoEditing=!1,k()});A.addEventListener("repo-cancel",e=>{a.repoUrl=e.detail.url,He(a.currentFile,a.repoUrl),a.repoEditing=!1,k()});document.addEventListener("keydown",e=>{if(e.key==="Escape"){if(a.bundleSourceFindingIdx!=null){a.bundleSourceFindingIdx=null,$o();return}a.bundleSourceFile&&(a.bundleSourceFile=null,k())}});var gh=`:host{position:absolute;top:.5rem;right:.5rem;z-index:1000;width:30px;height:30px;background:transparent;color:var(--muted);border:0;border-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: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}}
80
- `;var hc="deepview.theme",ln=Object.freeze(["dark","light","green","pink"]),fv={dark:{base:"#1a1a1b",dim:"#0a0a0a"},light:{base:"#f6f6fa",dim:"#646464"},green:{base:"#0a140a",dim:"#050a05"},pink:{base:"#ffe4ee",dim:"#a3727f"}},hv="\u2600",gv="\u263E",gc="deepview-theme-changed",pi="dark",bc=!1;function mv(){try{let e=localStorage.getItem(hc);return ln.includes(e)?e:"dark"}catch{return"dark"}}function xo(e){ln.includes(e)||(e="dark"),pi=e;for(let r of ln)r!=="dark"&&document.body.classList.remove(`theme-${r}`);e!=="dark"&&document.body.classList.add(`theme-${e}`);try{e==="dark"?localStorage.removeItem(hc):localStorage.setItem(hc,e)}catch{}let t=document.querySelector('meta[name="theme-color"]');if(t){let{base:r,dim:n}=fv[e];t.setAttribute("content",bc?n:r)}window.dispatchEvent(new CustomEvent(gc,{detail:{theme:e}}))}xo(mv());window.addEventListener("beforeprint",()=>{bc=!0,xo(pi)});window.addEventListener("afterprint",()=>{bc=!1,xo(pi)});function mh(e){if(!ln.includes(e))throw new TypeError(`DeepView.setTheme: unknown theme ${JSON.stringify(e)} (expected one of ${ln.map(t=>JSON.stringify(t)).join(", ")})`);xo(e)}function bh(){return pi}var yh=ln,mc=class extends N{static properties={_light:{state:!0}};static styles=T(gh);constructor(){super(),this._light=document.body.classList.contains("theme-light")}connectedCallback(){super.connectedCallback(),this.hasAttribute("role")||this.setAttribute("role","button"),this.hasAttribute("tabindex")||(this.tabIndex=0),this.hasAttribute("aria-label")||this.setAttribute("aria-label","toggle theme"),this.hasAttribute("title")||this.setAttribute("title","toggle light/dark theme"),this.addEventListener("click",this._toggle),this.addEventListener("keydown",this._onKeydown),window.addEventListener(gc,this._onThemeChanged)}disconnectedCallback(){window.removeEventListener(gc,this._onThemeChanged),this.removeEventListener("click",this._toggle),this.removeEventListener("keydown",this._onKeydown),super.disconnectedCallback()}_onThemeChanged=()=>{this._light=document.body.classList.contains("theme-light")};_toggle=()=>{let t=document.body.classList.contains("theme-light");xo(t?"dark":"light")};_onKeydown=t=>{(t.key==="Enter"||t.key===" ")&&(t.preventDefault(),this._toggle())};render(){return c`${this._light?gv:hv}`}};customElements.define("theme-toggle",mc);var wh=`:host{display:block}.row{display:grid;grid-template-columns:5.5rem minmax(0,1fr);gap:.2rem .85rem;padding:.25rem .7rem;font-size:.8rem;border-bottom:1px solid var(--border);transition:background .12s}:host(:last-child) .row{border-bottom:none}:host(:hover) .row{background:rgb(from var(--text) r g b / .04)}:host(.mark-red) .row{background:var(--mark-red-bg)}:host(.mark-blue) .row{background:var(--mark-blue-bg)}:host(.mark-green) .row{background:var(--mark-green-bg)}:host(.mark-gray) .row{background:var(--mark-gray-bg)}:host(.has-conflict) .row{outline:2px dashed var(--accent);outline-offset:-2px}:host(.triage-fixed),:host(.triage-invalid),:host(.triage-deleted),:host(.triage-ignored){opacity:.75}:host(.selected) .row{outline:2px solid var(--accent);outline-offset:-2px}:host(:first-of-type) .row{border-top-left-radius:6px;border-top-right-radius:6px}:host(:last-of-type) .row{border-bottom-left-radius:6px;border-bottom-right-radius:6px}.row-score{grid-column:1;grid-row:1 / 3;align-self:center;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.2rem;font-variant-numeric:tabular-nums;.badge{min-width:4.4rem;text-align:center}.row-conf{color:var(--muted);font-size:.72rem;& strong{color:var(--text);font-size:.8rem}}}.row-body{display:contents}.title-row{grid-column:2;grid-row:1;min-width:0;display:flex;align-items:baseline;gap:.5rem;.title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.row-type{color:var(--muted);font-size:.68rem;flex-shrink:0}}.meta-row{grid-column:2;grid-row:2;min-width:0;display:flex;align-items:center;gap:.55rem;.row-loc{color:var(--muted);font-size:.72rem;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;& a{color:inherit}& a:hover{color:var(--accent)}}.marks{display:flex;gap:.35rem;align-items:center;flex-shrink:0;user-select:none}}.tabs-row{grid-column:2;grid-row:3;min-width:0;.tabs{display:flex;gap:.25rem;flex-wrap:wrap}}.badge,.tabs,.tab,.row-type{cursor:default;user-select:none}.badge{display:inline-block;font-size:.7rem;font-weight:600;text-transform:uppercase;padding:.15rem .45rem;border-radius:3px;letter-spacing:.03em;line-height:1;&.critical{background:var(--critical);color:#fff}&.high{background:var(--high);color:#fff}&.medium{background:var(--medium);color:#000}&.low{background:var(--low);color:var(--badge-low-text)}&.high_bug{background:var(--high-bug);color:#fff}&.bug{background:var(--bug);color:#fff}&.informational{background:var(--info);color:#fff}}.tab{background:transparent;color:var(--text);border:1px solid var(--border);border-radius:4px;padding:.2rem .5rem;font-size:.75rem;line-height:1.3;display:inline-flex;align-items:center;gap:.35rem;font-family:inherit;&:hover{border-color:var(--accent)}&.active{border-color:var(--accent);background:var(--surface-active)}&.tab-mark-red{background:var(--mark-red-bg);border-color:var(--mark-red-tab-border)}&.tab-mark-blue{background:var(--mark-blue-bg);border-color:var(--mark-blue-tab-border)}&.tab-mark-green{background:var(--mark-green-bg);border-color:var(--mark-green-tab-border)}&.tab-mark-gray{background:var(--mark-gray-bg);border-color:var(--mark-gray-tab-border)}&.tab-mark-red.active,&.tab-mark-blue.active,&.tab-mark-green.active,&.tab-mark-gray.active{border-color:var(--text)}&.tab-deleted .tab-label{text-decoration:line-through;opacity:.6}&.tab-fixed .tab-label{opacity:.65}&.tab-fixed .tab-label:after{content:" \\2713";opacity:.6}&.tab-invalid .tab-label{opacity:.65}&.tab-invalid .tab-label:after{content:" \\2298";opacity:.6}&.tab-ignored .tab-label{opacity:.55}&.tab-ignored .tab-label:after{content:" \\1f441";opacity:.6;font-size:.7em}.tab-conf{color:var(--muted);font-size:.7rem}&.tab-mark-red .tab-conf,&.tab-mark-blue .tab-conf,&.tab-mark-green .tab-conf,&.tab-mark-gray .tab-conf{color:var(--text)}}.report-chip{display:inline-flex;align-items:center;gap:.3rem;padding:0 .35rem;height:1.4rem;border:1px solid var(--border);border-radius:3px;color:var(--muted);font-size:.72rem;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin-right:.65rem;max-width:12rem;.report-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.file-icon{flex-shrink:0}.brand-deepview{.bg{fill:#2563eb}.fg{fill:#fff}}.brand-claude{.bg{fill:#d97757}.fg{fill:#fff}}.brand-codex{.bg{fill:#fff;stroke:#000;stroke-width:.5}.fg{fill:#000}}.brand-vercel{.bg{fill:#000;stroke:#fff;stroke-width:.5}.fg{fill:#fff}}}.mark-action-group{display:inline-flex;border:1px solid var(--border);border-radius:3px;overflow:hidden;margin-right:.25rem}.mark-comment,.mark-fix{background:transparent;border:0;color:var(--muted);padding:0 .25rem;height:1.4rem;display:inline-flex;align-items:center;justify-content:center;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--accent);background:var(--surface-active)}}.mark-copy{background:transparent;border:1px solid var(--border);color:var(--muted);border-radius:3px;padding:0 .25rem;height:1.4rem;display:inline-flex;align-items:center;justify-content:center;margin-right:.25rem;&:hover{color:var(--accent);border-color:var(--accent)}}.mark-comment.has-comment,.mark-fix.has-fix{color:var(--accent)}.mark-copy.copied{color:var(--green, #4ade80);border-color:var(--green, #4ade80)}.mark-comment.has-comment .bubble,.mark-fix.has-fix .wrench{fill:var(--accent);fill-opacity:.15}.mark-x{background:transparent;border:1px solid var(--border);color:var(--muted);border-radius:3px;padding:0 .35rem;font-size:.85rem;line-height:1.1;margin-left:.25rem;&:hover{color:var(--critical);border-color:var(--critical)}}.triage-menu-wrap{position:relative;display:inline-flex;margin-left:.25rem}.mark-triage-menu{background:transparent;border:1px solid var(--border);color:var(--muted);border-radius:3px;padding:0 .3rem;height:1.5rem;display:inline-flex;align-items:center;justify-content:center;gap:.25rem;font:inherit}.mark-triage-menu:hover{color:var(--text);border-color:var(--accent)}.mark-triage-menu.open{border-color:var(--accent);color:var(--text)}.mark-triage-menu.with-label{padding:0 .35rem 0 .5rem;font-size:.72rem;height:1.5rem}.mark-triage-menu .mark-triage-label{text-transform:uppercase;letter-spacing:.05em;font-weight:600}.mark-triage-menu.triage-state-deleted{border-color:var(--critical);color:var(--critical)}.mark-triage-menu.triage-state-fixed{border-color:var(--green, #4ade80);color:var(--green, #4ade80)}.mark-triage-menu.triage-state-invalid{border-color:var(--muted);color:var(--text)}.mark-triage-menu.triage-state-ignored{border-color:var(--accent, #2563eb);color:var(--accent, #2563eb)}.triage-menu[popover]{position:fixed;inset:auto;margin:0;min-width:7rem;background:var(--bg);border:1px solid var(--border);border-radius:4px;padding:.25rem;box-shadow:0 4px 12px #00000040;display:flex;flex-direction:column;gap:1px;-webkit-app-region:no-drag;app-region:no-drag}.triage-menu[popover]:not(:popover-open){display:none}.triage-menu[popover]:popover-open{display:flex}.triage-menu-item{background:transparent;border:0;padding:.35rem .5rem;font-size:.78rem;color:var(--text);text-align:left;border-radius:3px;font-family:inherit}.triage-menu-item:hover{background:var(--surface)}.triage-menu-item.active:before{content:"\\2713 ";color:var(--accent)}.triage-menu-fixed:hover{color:var(--green, #4ade80)}.triage-menu-invalid:hover{color:var(--muted)}.triage-menu-deleted:hover{color:var(--critical)}.mark-restore{background:transparent;border:1px solid var(--border);color:var(--muted);border-radius:3px;padding:0 .45rem;font-size:.75rem;line-height:1.3;margin-left:.25rem;&:hover{color:var(--green);border-color:var(--green)}}.line-num{color:var(--muted);font-size:.75rem}.line-num a{color:inherit}.line-num a:hover{color:var(--accent)}@media print{:host(:hover) .row,:host(.mark-red) .row,:host(.mark-blue) .row,:host(.mark-green) .row,:host(.mark-gray) .row{background:transparent!important}:host(.triage-fixed),:host(.triage-invalid),:host(.triage-deleted),:host(.triage-ignored){opacity:1}:host(.selected) .row,:host(.has-conflict) .row{outline:none!important}.row{break-inside:avoid}.marks,.mark-x,.mark-restore{display:none!important}.badge{-webkit-print-color-adjust:exact;print-color-adjust:exact;&.critical{background:#a30b0f!important;color:#fff!important}&.high{background:#b8400a!important;color:#fff!important}&.medium{background:#855107!important;color:#fff!important}&.low{background:#374151!important;color:#fff!important}&.high_bug{background:#7a3e0c!important;color:#fff!important}&.bug{background:#4d4538!important;color:#fff!important}&.informational{background:#0550ae!important;color:#fff!important}}a,.line-num,.line-num a{color:inherit}}
81
- `;var yv=["is-critical","mark-red","mark-blue","mark-green","mark-gray","has-conflict","triage-fixed","triage-invalid","triage-deleted","triage-ignored","selected"],yc=class extends Mt{static properties={group:{attribute:!1},selected:{type:Boolean}};static styles=T(wh);constructor(){super(),this.group=null,this.selected=!1}render(){if(!this.group)return c``;this.dataset.gid=no(this.group);let t=new Set(hp(this.group));this.selected&&t.add("selected");for(let r of yv)this.classList.toggle(r,t.has(r));return c`<div class="row">${gp(this.group)}</div>`}connectedCallback(){super.connectedCallback(),this.addEventListener("click",this._onClick),this.hasUpdated&&this.requestUpdate()}disconnectedCallback(){this.removeEventListener("click",this._onClick),super.disconnectedCallback()}_onClick=t=>{t.composedPath().some(n=>n?.matches?.("a, button, label"))||this.dataset.gid&&this.dispatchEvent(new CustomEvent("row-select",{detail:{gid:this.dataset.gid},bubbles:!0,composed:!0}))}};customElements.define("finding-row",yc);var vh=`:host{display:block;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:6px;overflow:hidden;box-shadow:var(--shadow-glass);margin-bottom:1rem;max-width:1200px}
82
- `;var wc=class extends N{static properties={items:{attribute:!1},selectedGid:{attribute:!1}};static styles=T(vh);constructor(){super(),this.items=[],this.selectedGid=null}render(){return c`${J(this.items??[],t=>no(t),t=>c`<finding-row .group="${t}" ?selected="${no(t)===this.selectedGid}"></finding-row>`)}`}};customElements.define("finding-table",wc);var kh=`:host{display:block}:host(.hidden){display:none}:host(.triage-fixed),:host(.triage-invalid),:host(.triage-deleted),:host(.triage-ignored){opacity:.75}.card{padding:.5rem .75rem;border-bottom:1px solid var(--border);font-size:.875rem}:host(:last-child) .card{border-bottom:none}:host(.mark-red) .card{background:var(--mark-red-bg)}:host(.mark-blue) .card{background:var(--mark-blue-bg)}:host(.mark-green) .card{background:var(--mark-green-bg)}:host(.mark-gray) .card{background:var(--mark-gray-bg)}:host(.has-conflict) .card{outline:2px dashed var(--accent);outline-offset:-2px}:host([in-group]) .line-row{display:none}.tabs{display:flex;gap:.25rem;flex-wrap:wrap}.marks-left{display:flex;align-items:center;gap:.5rem;margin-right:auto;flex-wrap:wrap}.commit-ref{color:var(--muted);font-size:.8rem;& a{color:var(--accent);font-family:ui-monospace,SFMono-Regular,Menlo,monospace}& a:hover{text-decoration:underline}& span{font-family:ui-monospace,SFMono-Regular,Menlo,monospace}}.marks-commit-row{margin-top:.4rem;padding-left:4.75rem}.tab-body{display:none;grid-template-columns:auto 1fr;gap:.25rem .75rem;&.active{display:grid}}.desc-title{grid-column:2;font-size:1.08em;font-weight:600;letter-spacing:-.005em;line-height:1.35;color:var(--text)}.desc{grid-column:2;white-space:pre-line;font-size:.96em;line-height:1.6;color:rgb(from var(--text) r g b / .82);margin-top:.4rem}.recommendation{grid-column:2;white-space:pre-line;font-size:.92em;line-height:1.55;color:var(--green);margin-top:.4rem}.conf-reason{grid-column:2;white-space:pre-line;font-size:.92em;font-style:italic;color:var(--muted);margin-top:.6rem;padding-top:.55rem;border-top:1px dashed var(--border)}.inline-quote{background:rgb(from var(--accent) r g b / .1);padding:1px;border-radius:3px;color:var(--text)}.inline-code{background:var(--surface-active);border-radius:3px;border:1px solid var(--border);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.9em;color:var(--text)}.line-row{display:flex;justify-content:space-between;align-items:baseline;gap:.5rem;flex-wrap:wrap}.run-meta{color:var(--muted);font-size:.65rem}.finding-code-btn{display:inline-block;margin-top:.35rem;padding:.1rem .45rem;background:transparent;border:1px solid var(--border);border-radius:999px;color:var(--muted);font:inherit;font-size:.65rem;font-weight:500;white-space:nowrap}.finding-code-btn:hover{border-color:var(--accent);color:var(--accent)}.marks{display:flex;gap:.35rem;justify-content:flex-end;margin-top:.4rem;align-items:center;padding-left:4.75rem;user-select:none}.finding-left{align-self:start;text-align:center;min-width:4rem;.value-label:last-child{margin-bottom:0}}.conf-score{font-size:.75rem;color:var(--muted);margin-top:.3rem;& strong{color:var(--text);font-size:.85rem}}.conf-ring{--col: var(--muted);position:relative;width:3rem;height:3rem;margin:.7rem auto .15rem;display:flex;align-items:center;justify-content:center;& svg{position:absolute;inset:0;width:100%;height:100%;transform:rotate(-90deg)}& circle{fill:none;stroke-width:4}.conf-ring-track{stroke:var(--border)}.conf-ring-arc{stroke:var(--col);stroke-linecap:round}& span{position:relative;z-index:1;font-size:.8rem;font-weight:700;color:var(--text);font-variant-numeric:tabular-nums}& small{font-size:.55rem;color:var(--muted);font-weight:500}&.critical{--col: var(--critical)}&.high{--col: var(--high)}&.medium{--col: var(--medium)}&.low{--col: var(--low)}&.high_bug{--col: var(--high-bug)}&.bug{--col: var(--bug)}&.informational{--col: var(--info)}}.value-label{display:block;font-size:.45rem;color:var(--muted);text-transform:uppercase;letter-spacing:.04em;margin-top:.1rem;margin-bottom:.3rem;font-weight:500}.print-case-label{display:none}.badge,.tabs,.tab,.value-label,.run-meta,.conf-ring{cursor:default;user-select:none}.badge{display:inline-block;font-size:.7rem;font-weight:600;text-transform:uppercase;padding:.15rem .45rem;border-radius:3px;letter-spacing:.03em;line-height:1;&.critical{background:var(--critical);color:#fff}&.high{background:var(--high);color:#fff}&.medium{background:var(--medium);color:#000}&.low{background:var(--low);color:var(--badge-low-text)}&.high_bug{background:var(--high-bug);color:#fff}&.bug{background:var(--bug);color:#fff}&.informational{background:var(--info);color:#fff}}.tab{background:transparent;color:var(--text);border:1px solid var(--border);border-radius:4px;padding:.2rem .5rem;font-size:.75rem;line-height:1.3;display:inline-flex;align-items:center;gap:.35rem;font-family:inherit;&:hover{border-color:var(--accent)}&.active{border-color:var(--accent);background:var(--surface-active)}&.tab-mark-red{background:var(--mark-red-bg);border-color:var(--mark-red-tab-border)}&.tab-mark-blue{background:var(--mark-blue-bg);border-color:var(--mark-blue-tab-border)}&.tab-mark-green{background:var(--mark-green-bg);border-color:var(--mark-green-tab-border)}&.tab-mark-gray{background:var(--mark-gray-bg);border-color:var(--mark-gray-tab-border)}&.tab-mark-red.active,&.tab-mark-blue.active,&.tab-mark-green.active,&.tab-mark-gray.active{border-color:var(--text)}&.tab-deleted .tab-label{text-decoration:line-through;opacity:.6}&.tab-fixed .tab-label{opacity:.65}&.tab-fixed .tab-label:after{content:" \\2713";opacity:.6}&.tab-invalid .tab-label{opacity:.65}&.tab-invalid .tab-label:after{content:" \\2298";opacity:.6}&.tab-ignored .tab-label{opacity:.55}&.tab-ignored .tab-label:after{content:" \\1f441";opacity:.6;font-size:.7em}.tab-conf{color:var(--muted);font-size:.7rem}&.tab-mark-red .tab-conf,&.tab-mark-blue .tab-conf,&.tab-mark-green .tab-conf,&.tab-mark-gray .tab-conf{color:var(--text)}}.report-chip{display:inline-flex;align-items:center;gap:.3rem;padding:0 .35rem;height:1.4rem;border:1px solid var(--border);border-radius:3px;color:var(--muted);font-size:.72rem;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin-right:.65rem;max-width:16rem;.report-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.file-icon{flex-shrink:0}.brand-deepview{.bg{fill:#2563eb}.fg{fill:#fff}}.brand-claude{.bg{fill:#d97757}.fg{fill:#fff}}.brand-codex{.bg{fill:#fff;stroke:#000;stroke-width:.5}.fg{fill:#000}}.brand-vercel{.bg{fill:#000;stroke:#fff;stroke-width:.5}.fg{fill:#fff}}}.mark-action-group{display:inline-flex;border:1px solid var(--border);border-radius:3px;overflow:hidden;margin-right:.25rem}.mark-comment,.mark-fix{background:transparent;border:0;color:var(--muted);padding:0 .25rem;height:1.4rem;display:inline-flex;align-items:center;justify-content:center;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--accent);background:var(--surface-active)}}.mark-copy{background:transparent;border:1px solid var(--border);color:var(--muted);border-radius:3px;padding:0 .25rem;height:1.4rem;display:inline-flex;align-items:center;justify-content:center;margin-right:.25rem;&:hover{color:var(--accent);border-color:var(--accent)}}.mark-comment.has-comment,.mark-fix.has-fix{color:var(--accent)}.mark-copy.copied{color:var(--green, #4ade80);border-color:var(--green, #4ade80)}.mark-comment.has-comment .bubble,.mark-fix.has-fix .wrench{fill:var(--accent);fill-opacity:.15}.mark-x{background:transparent;border:1px solid var(--border);color:var(--muted);border-radius:3px;padding:0 .35rem;font-size:.85rem;line-height:1.1;margin-left:.25rem;&:hover{color:var(--critical);border-color:var(--critical)}}.triage-menu-wrap{position:relative;display:inline-flex;margin-left:.25rem}.mark-triage-menu{background:transparent;border:1px solid var(--border);color:var(--muted);border-radius:3px;padding:0 .3rem;height:1.5rem;display:inline-flex;align-items:center;justify-content:center;gap:.25rem;font:inherit}.mark-triage-menu:hover{color:var(--text);border-color:var(--accent)}.mark-triage-menu.open{border-color:var(--accent);color:var(--text)}.mark-triage-menu.with-label{padding:0 .35rem 0 .5rem;font-size:.72rem;height:1.5rem}.mark-triage-menu .mark-triage-label{text-transform:uppercase;letter-spacing:.05em;font-weight:600}.mark-triage-menu.triage-state-deleted{border-color:var(--critical);color:var(--critical)}.mark-triage-menu.triage-state-fixed{border-color:var(--green, #4ade80);color:var(--green, #4ade80)}.mark-triage-menu.triage-state-invalid{border-color:var(--muted);color:var(--text)}.mark-triage-menu.triage-state-ignored{border-color:var(--accent, #2563eb);color:var(--accent, #2563eb)}.triage-menu[popover]{position:fixed;inset:auto;margin:0;min-width:7rem;background:var(--bg);border:1px solid var(--border);border-radius:4px;padding:.25rem;box-shadow:0 4px 12px #00000040;display:flex;flex-direction:column;gap:1px;-webkit-app-region:no-drag;app-region:no-drag}.triage-menu[popover]:not(:popover-open){display:none}.triage-menu[popover]:popover-open{display:flex}.triage-menu-item{background:transparent;border:0;padding:.35rem .5rem;font-size:.78rem;color:var(--text);text-align:left;border-radius:3px;font-family:inherit}.triage-menu-item:hover{background:var(--surface)}.triage-menu-item.active:before{content:"\\2713 ";color:var(--accent)}.triage-menu-fixed:hover{color:var(--green, #4ade80)}.triage-menu-invalid:hover{color:var(--muted)}.triage-menu-deleted:hover{color:var(--critical)}:host([context="focus"]) .triage-menu-wrap>.mark-triage-menu{display:none}:host([context="focus"]) .triage-menu-wrap{display:inline-flex}:host([context="focus"]) .triage-menu[popover]{position:static;inset:auto;display:inline-flex!important;flex-flow:row wrap;margin:0;padding:0;background:transparent;border:0;border-radius:0;box-shadow:none;min-width:0;gap:.25rem}:host([context="focus"]) .triage-menu-item{background:transparent;border:1px solid var(--border);padding:.2rem .5rem;border-radius:3px;font-size:.72rem;font-weight:500;text-transform:uppercase;letter-spacing:.04em}:host([context="focus"]) .triage-menu-item.active{background:rgb(from var(--accent) r g b / .12);border-color:var(--accent);color:var(--accent)}:host([context="focus"]) .triage-menu-item:hover{background:var(--surface-active)}:host([context="focus"]) .triage-menu-fixed.active{background:rgb(from var(--green, #4ade80) r g b / .12);border-color:var(--green, #4ade80);color:var(--green, #4ade80)}:host([context="focus"]) .triage-menu-deleted.active{background:rgb(from var(--critical) r g b / .12);border-color:var(--critical);color:var(--critical)}:host([context="focus"]) .triage-menu-item.active:before{content:"";margin:0}:host([context="focus"]) .marks{gap:.5rem;margin-top:.65rem;padding-left:0;padding-top:.55rem;border-top:1px solid var(--border);flex-wrap:wrap}:host([context="focus"]) .marks-commit-row{padding-left:0}:host([context="focus"]) .mark-comment,:host([context="focus"]) .mark-fix,:host([context="focus"]) .mark-copy{height:1.75rem;padding:0 .55rem;gap:.35rem;display:inline-flex;align-items:center;font-size:.72rem}:host([context="focus"]) .mark-btn-label{color:inherit;font-weight:500;letter-spacing:.02em}:host([context="focus"].mark-red) .card{background:color-mix(in srgb,var(--mark-red-bg) 15%,var(--bg))}:host([context="focus"].mark-blue) .card{background:color-mix(in srgb,var(--mark-blue-bg) 15%,var(--bg))}:host([context="focus"].mark-green) .card{background:color-mix(in srgb,var(--mark-green-bg) 15%,var(--bg))}:host([context="focus"].mark-gray) .card{background:color-mix(in srgb,var(--mark-gray-bg) 15%,var(--bg))}.comment-block,.fix-block{margin-top:.5rem;padding:.35rem .55rem;border-left:3px solid var(--accent);background:rgb(from var(--accent) r g b / .08);border-radius:0 4px 4px 0;font-size:.82rem;color:var(--text)}.comment-block{white-space:pre-wrap}.fix-block{word-break:break-all;& a{color:var(--accent);text-decoration:none}& a:hover{text-decoration:underline}}.comment-label,.fix-label{color:var(--muted);font-weight:600;margin-right:.35rem}.mark-restore{background:transparent;border:1px solid var(--border);color:var(--muted);border-radius:3px;padding:0 .45rem;font-size:.75rem;line-height:1.3;margin-left:.25rem;&:hover{color:var(--green);border-color:var(--green)}}.line-num{color:var(--muted);font-size:.8rem}.line-num a{color:inherit}.line-num a:hover{color:var(--accent)}.npm-link{display:inline-block;padding:0 .4rem;border:1px solid var(--border);border-radius:3px;font-size:.72rem;font-weight:500;color:var(--muted);text-decoration:none}.npm-link:hover{border-color:var(--accent);color:var(--accent)}@media print{.card{break-inside:avoid;padding:.45rem .25rem}.finding-code-btn,.mark-copy{display:none!important}.npm-link{border:0;padding:0}:host(.triage-fixed),:host(.triage-invalid),:host(.triage-deleted),:host(.triage-ignored){opacity:1}:host(.multi-case) .card:before{content:"Multiple reports of one finding";display:block;font-size:.7rem;font-weight:700;color:#555;text-transform:uppercase;letter-spacing:.06em;border-bottom:1px solid #bbb;padding-bottom:.2rem;margin-bottom:.35rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}.marks,.tabs{display:none!important}.tab-body{display:grid!important}.tab-body+.tab-body{margin-top:.5rem;padding-top:.5rem;border-top:1px dashed #999}:host([in-group].multi-case) .tab-body .line-row{display:flex}.line-row .discovered-in{flex-basis:100%;order:99}.print-case-label{display:block;grid-column:1 / -1;font-size:.65rem;font-weight:600;color:#555;background:#eee;padding:.1rem .35rem;border-radius:3px;margin-bottom:.25rem;letter-spacing:.04em;-webkit-print-color-adjust:exact;print-color-adjust:exact}.value-label{color:#777}.badge{-webkit-print-color-adjust:exact;print-color-adjust:exact;&.critical{background:#a30b0f!important;color:#fff!important}&.high{background:#b8400a!important;color:#fff!important}&.medium{background:#855107!important;color:#fff!important}&.low{background:#374151!important;color:#fff!important}&.high_bug{background:#7a3e0c!important;color:#fff!important}&.bug{background:#4d4538!important;color:#fff!important}&.informational{background:#0550ae!important;color:#fff!important}}a,.line-num,.line-num a{color:inherit}.inline-code{border:0;background:transparent;padding:0}}
83
- `;var kv=["finding","is-critical","mark-red","mark-blue","mark-green","mark-gray","has-conflict","triage-fixed","triage-invalid","triage-deleted","triage-ignored","multi-case"],vc=class extends Mt{static properties={group:{attribute:!1},inGroup:{type:Boolean,attribute:"in-group",reflect:!0},context:{type:String,reflect:!0}};static styles=T(kh);constructor(){super(),this.group=null,this.inGroup=!1,this.context=null}render(){if(!this.group)return c``;this.dataset.gid=Xr(this.group);let t=new Set(pp(this.group));for(let r of kv)this.classList.toggle(r,t.has(r));return c`<div class="card">${fp(this.group,{context:this.context})}</div>`}connectedCallback(){super.connectedCallback(),this.hasUpdated&&this.requestUpdate()}};customElements.define("finding-card",vc);var $h=`:host{display:inline-flex;gap:4px;align-items:center}button{width:14px;height:14px;user-select:none;padding:0;background:transparent;border:1.5px solid currentcolor;border-radius:50%;opacity:.55;transition:opacity .12s,transform .12s}button:hover{opacity:1;transform:scale(1.12)}button.active{background:currentcolor;opacity:1;box-shadow:0 0 0 2px var(--surface),0 0 0 3px currentcolor}.color-red{color:var(--marker-red)}.color-blue{color:var(--marker-blue)}.color-green{color:var(--marker-green)}.color-gray{color:var(--marker-gray)}
84
- `;var xv=["red","blue","green","gray"],kc=class extends N{static properties={selected:{type:String}};static styles=T($h);constructor(){super(),this.selected=null}render(){return c`${xv.map(t=>c`<button type="button" class="${`color-${t}${this.selected===t?" active":""}`}" data-color="${t}" title="${`mark ${t}`}" @click="${this._onClick}"></button>`)}`}_onClick=t=>{let r=t.currentTarget.dataset.color;this.dispatchEvent(new CustomEvent("mark-color",{detail:{color:r},bubbles:!0,composed:!0}))}};customElements.define("color-marker",kc);var xh=`:host{display:inline-flex;align-items:center;width:8.5rem;height:16px;--rs-thumb-size: 14px;--rs-track-height: 3px;--rs-rail: rgb(from currentcolor r g b / .25);--rs-fill: var(--accent, currentColor)}.track-wrap{position:relative;flex:1;height:var(--rs-thumb-size)}.track{position:absolute;left:0;right:0;top:50%;height:var(--rs-track-height);transform:translateY(-50%);border-radius:99px;background:linear-gradient(to right,var(--rs-rail) 0,var(--rs-rail) var(--low, 0%),var(--rs-fill) var(--low, 0%),var(--rs-fill) var(--high, 100%),var(--rs-rail) var(--high, 100%))}input[type=range]{appearance:none;-webkit-appearance:none;position:absolute;left:0;right:0;top:0;width:100%;height:var(--rs-thumb-size);background:transparent;pointer-events:none;margin:0;padding:0;outline:none}input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;pointer-events:auto;width:var(--rs-thumb-size);height:var(--rs-thumb-size);border-radius:50%;background:var(--rs-fill);border:0;box-shadow:0 1px 3px #00000080}input[type=range]::-moz-range-thumb{pointer-events:auto;width:var(--rs-thumb-size);height:var(--rs-thumb-size);border-radius:50%;background:var(--rs-fill);border:0;box-shadow:0 1px 3px #00000080}input[type=range]::-webkit-slider-runnable-track{background:transparent;height:var(--rs-thumb-size)}
85
- `;var $c=class extends N{static properties={min:{type:Number},max:{type:Number},step:{type:Number},low:{type:Number},high:{type:Number}};static styles=T(xh);constructor(){super(),this.min=0,this.max=100,this.step=1,this.low=0,this.high=100}willUpdate(){this.low<this.min&&(this.low=this.min),this.high>this.max&&(this.high=this.max),this.low>this.high&&(this.low=this.high)}render(){let t=this.max-this.min||1,r=(this.low-this.min)/t*100,n=(this.high-this.min)/t*100;return c`<div class="track-wrap" style="${`--low:${r}%;--high:${n}%`}"><div class="track"></div><input type="range" min="${this.min}" max="${this.max}" step="${this.step}" @input="${this._onInput}" @change="${this._onChange}"> <input type="range" min="${this.min}" max="${this.max}" step="${this.step}" @input="${this._onInput}" @change="${this._onChange}"></div>`}firstUpdated(){this._inputs=[...this.renderRoot.querySelectorAll('input[type="range"]')],this._inputs[0].value=this.low,this._inputs[1].value=this.high}updated(t){if(!this._inputs||!(t.has("low")||t.has("high")))return;let r=this._inputs.map(i=>Number(i.value)),n=r[0]>r[1],o=n?1:0,s=n?0:1;this.low!==r[o]&&(this._inputs[o].value=this.low),this.high!==r[s]&&(this._inputs[s].value=this.high)}_onInput=()=>{let t=Number(this._inputs[0].value),r=Number(this._inputs[1].value);this.low=Math.min(t,r),this.high=Math.max(t,r),this._emit("range-input")};_onChange=()=>{this._emit("range-change")};_emit(t){this.dispatchEvent(new CustomEvent(t,{detail:{low:this.low,high:this.high},bubbles:!0,composed:!0}))}};customElements.define("range-slider",$c);var xc=class extends N{static properties={low:{type:Number},high:{type:Number},for:{type:String}};createRenderRoot(){return this}constructor(){super(),this.low=0,this.high=10,this.for="conf-range",this._dragging=!1,this._liveLow=0,this._liveHigh=10}connectedCallback(){super.connectedCallback(),document.addEventListener("range-input",this._onRangeInput),document.addEventListener("range-change",this._onRangeChange)}disconnectedCallback(){super.disconnectedCallback(),document.removeEventListener("range-input",this._onRangeInput),document.removeEventListener("range-change",this._onRangeChange)}willUpdate(t){this._dragging&&(t.has("low")&&this.low!==this._liveLow&&(this.low=this._liveLow),t.has("high")&&this.high!==this._liveHigh&&(this.high=this._liveHigh))}_onRangeInput=t=>{t.target?.id===this.for&&(this._dragging=!0,this._liveLow=t.detail.low,this._liveHigh=t.detail.high,this.low=t.detail.low,this.high=t.detail.high)};_onRangeChange=t=>{t.target?.id===this.for&&(this._dragging=!1)};render(){return c`<span>${this.low}</span><span class="dash">–</span><span>${this.high}</span>`}};customElements.define("conf-range-mirror",xc);var _h=`dialog{max-width:560px;width:min(94vw,560px)}header h3{margin:0 0 .25rem}header p{margin:0 0 .9rem;color:var(--muted);font-size:.82rem}hr{border:0;border-top:1px solid var(--border);margin:.9rem 0}.section h4{margin:0 0 .25rem;font-size:.82rem;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--muted)}.section p{margin:0 0 .55rem;color:var(--muted);font-size:.78rem}.section button{background:transparent;border:1px solid var(--border);color:var(--text);border-radius:5px;padding:.35rem .9rem;font:inherit;font-size:.8rem;&:hover{border-color:var(--accent);color:var(--accent)}&.primary{background:var(--accent);color:var(--surface);border-color:var(--accent)}&.primary:hover{filter:brightness(1.08)}&:disabled{opacity:.5}}input[type=file]{display:block;color:var(--text);font:inherit;font-size:.78rem;margin-bottom:.5rem}.error{margin:.5rem 0;padding:.4rem .6rem;border:1px solid var(--critical, #f87171);border-radius:5px;background:rgb(from var(--critical, #f87171) r g b / .07);color:var(--text);font-size:.78rem}.summary{margin:.5rem 0;font-size:.82rem;& strong{color:var(--text)}.meta{margin-left:.4rem;color:var(--muted);font-size:.74rem}}.mode{border:1px solid var(--border);border-radius:6px;padding:.55rem .7rem;margin:.55rem 0 .7rem;display:flex;flex-direction:column;gap:.35rem}.mode legend{padding:0 .35rem;font-size:.68rem;color:var(--muted);text-transform:uppercase;letter-spacing:.08em}.mode label{display:flex;align-items:flex-start;gap:.5rem;font-size:.82rem;& em{color:var(--muted);font-style:normal;font-size:.74rem}}.status{margin:.8rem 0 0;padding:.4rem .6rem;border-radius:5px;font-size:.78rem;&.status-ok{border:1px solid var(--accent);background:rgb(from var(--accent) r g b / .08);color:var(--text)}&.status-err{border:1px solid var(--critical, #f87171);background:rgb(from var(--critical, #f87171) r g b / .07);color:var(--text)}}.actions{display:flex;justify-content:flex-end;gap:.4rem;margin-top:.8rem;padding-top:.7rem;border-top:1px solid var(--border)}.actions button{background:transparent;border:1px solid var(--border);color:var(--text);border-radius:5px;padding:.3rem .8rem;font:inherit;font-size:.78rem;&:hover{border-color:var(--accent);color:var(--accent)}}
86
- `;var _c=class extends I{static styles=[...I.styles,T(_h)];static properties={parsed:{state:!0},parseError:{state:!0},mode:{state:!0},busy:{state:!0},status:{state:!0}};constructor(){super(),this.parsed=null,this.parseError=null,this.mode="prefer-current",this.busy=!1,this.status=null}focusInitial(){this.renderRoot.querySelector("button.primary")?.focus()}async _onDownload(){this.busy=!0,this.status=null;try{let{blob:t,filename:r}=await Ka();Ar(t,r),this.status={kind:"ok",text:`Downloaded ${r}`}}catch(t){this.status={kind:"err",text:`Export failed: ${t.message}`}}finally{this.busy=!1}}async _onFile(t){let r=t.target.files?.[0];if(this.parsed=null,this.parseError=null,this.status=null,!!r)try{this.parsed=await qa(r)}catch(n){this.parseError=n.message}}_onMode(t){this.mode=t.target.value}async _onApply(){if(!(!this.parsed||this.busy)){this.busy=!0,this.status=null;try{let t=await Ga(this.parsed,this.mode);k(),this.status=t.repoUrlError?{kind:"err",text:`Applied ${t.triageEntries} triage entries (${this.mode}), but saving repo URLs failed: ${t.repoUrlError.message}`}:{kind:"ok",text:`Applied ${t.triageEntries} triage entries and ${t.repoUrls} repo URLs (${this.mode}).`},this.parsed=null;let r=this.renderRoot.querySelector('input[type="file"]');r&&(r.value="")}catch(t){this.status={kind:"err",text:`Import failed: ${t.message}`}}finally{this.busy=!1}}}render(){let t=this.parsed;return c`<dialog @close="${this._onClose}"><header><h3>Triage backup</h3><p>Bundles every triage entry (markers, triage states, comments, fixes, per-report ignores) and all saved repo URLs into a single gzipped JSON file.</p></header><section class="section"><h4>Export</h4><p>Download the current triage + repo-URL set as a portable backup.</p><button type="button" class="primary" @click="${this._onDownload}" ?disabled="${this.busy}">${this.busy?"Working\u2026":"Download backup"}</button></section><hr><section class="section"><h4>Import</h4><p>Pick a previously-exported backup. Nothing is applied until you click Apply.</p><input type="file" accept=".gz,application/gzip" @change="${this._onFile}" ?disabled="${this.busy}"> ${this.parseError?c`<div class="error">Failed to parse: ${this.parseError}</div>`:g} ${t?c`<div class="summary">Found <strong>${Object.keys(t.triage).length}</strong> triage entries and <strong>${Object.keys(t.repoUrls).length}</strong> repo URLs. ${t.exportedAt?c`<span class="meta">Exported ${t.exportedAt}.</span>`:g}</div><fieldset class="mode"><legend>Merge mode</legend><label><input type="radio" name="te-mode" value="prefer-current" .checked="${this.mode==="prefer-current"}" @change="${this._onMode}"> <span>Merge — keep current on conflict <em>(safest, only fills gaps)</em></span></label> <label><input type="radio" name="te-mode" value="prefer-imported" .checked="${this.mode==="prefer-imported"}" @change="${this._onMode}"> <span>Merge — prefer imported on conflict <em>(overwrites where both have a value)</em></span></label> <label><input type="radio" name="te-mode" value="replace" .checked="${this.mode==="replace"}" @change="${this._onMode}"> <span>Replace all <em>(drops every current persisted entry first — destructive)</em></span></label></fieldset><button type="button" class="primary" @click="${this._onApply}" ?disabled="${this.busy}">${this.busy?"Applying\u2026":"Apply import"}</button>`:g}</section>${this.status?c`<div class="${`status status-${this.status.kind}`}">${this.status.text}</div>`:g}<footer class="actions"><button type="button" @click="${this._onClose}">Close</button></footer></dialog>`}};customElements.define("triage-export-dialog",_c);function Sh(){return K("triage-export-dialog")}var Ch=`:host{display:inline-block;vertical-align:middle;position:relative}.chip{display:inline-flex;align-items:center;gap:.375rem;cursor:default;user-select:none;min-height:24px;box-sizing:border-box;padding:.125rem .375rem .125rem .5rem;background:var(--surface);border:1px solid var(--border);border-radius:999px;color:var(--text);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.72rem;font-weight:500}.chip svg{color:var(--muted);flex-shrink:0}.chip.empty .label{color:var(--muted);font-style:italic}.chip.readonly{padding-right:.5rem}.edit-btn{width:18px;height:18px;display:grid;place-items:center;padding:0;margin-left:.125rem;background:transparent;border:0;border-radius:4px;color:var(--muted)}.edit-btn:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}.chip[inert]{visibility:hidden;min-width:19rem}input{position:absolute;inset:0;box-sizing:border-box;padding:0 .55rem;background:var(--surface);border:1px solid var(--accent);border-radius:999px;color:var(--text);font:inherit;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.72rem;font-weight:400;outline:none}@media print{.chip{color:#000!important;border:0!important}.chip svg{color:#000!important}.edit-btn,input{display:none!important}}
87
- `;function Sc(e){if(!e)return"";let t=e.match(/github\.com\/([^/?#]+\/[^/?#]+?)(?:\.git)?(?:[/?#]|$)/iu);return t?t[1]:e}var Cc=c`<svg viewBox="0 0 16 16" width="12" height="12" fill="currentColor" aria-hidden="true"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"/></svg>`,Eh=c`<svg viewBox="0 0 16 16" width="11" height="11" fill="currentColor" aria-hidden="true"><path d="M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.086a1.75 1.75 0 0 1 0 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 0 1-.927-.928l.929-3.25c.082-.286.235-.547.445-.758l8.61-8.61z"/></svg>`,Ec=class extends N{static properties={url:{type:String},editable:{type:Boolean,reflect:!0},editing:{type:Boolean,reflect:!0}};static styles=T(Ch);constructor(){super(),this.url="",this.editable=!1,this.editing=!1,this._opener=""}render(){if(this.editable&&this.editing){let t=!!this.url,r=t?Sc(this.url):"Set repo";return c`<span class="${t?"chip":"chip empty"}" aria-hidden="true" inert>${Cc} <span class="label">${r}</span> <button type="button" class="edit-btn">${Eh}</button> </span><input type="text" .value="${je(this.url)}" placeholder="user/repo or https://github.com/user/repo" @input="${this._onInput}" @focus="${this._onFocus}" @keydown="${this._onKeydown}" @blur="${this._onBlur}">`}if(this.editable){let t=!!this.url,r=t?Sc(this.url):"Set repo";return c`<span class="${t?"chip":"chip empty"}">${Cc} <span class="label">${r}</span> <button type="button" class="edit-btn" title="Edit repo URL" aria-label="Edit repo URL" @click="${this._onEdit}">${Eh}</button></span>`}return this.url?c`<span class="chip readonly" title="Repo from findings (read-only)">${Cc} <span class="label">${Sc(this.url)}</span></span>`:g}updated(t){if(t.has("editing")&&this.editing){let r=this.renderRoot.querySelector("input");r&&(r.focus(),r.select())}}_onEdit=()=>{this._emit("repo-edit-start")};_onFocus=t=>{this._opener=t.target.value};_onInput=t=>{this.url=t.target.value,this._emit("repo-input",{url:this.url})};_onKeydown=t=>{t.key==="Enter"?(t.preventDefault(),this._emit("repo-commit",{url:this.url})):t.key==="Escape"&&(t.preventDefault(),this.url=this._opener,this._emit("repo-cancel",{url:this._opener}))};_onBlur=()=>{this.editing&&this._emit("repo-commit",{url:this.url})};_emit(t,r){this.dispatchEvent(new CustomEvent(t,{detail:r,bubbles:!0,composed:!0}))}};customElements.define("repo-chip",Ec);var Ev=[["critical","Critical"],["high","High"],["medium","Medium"],["low","Low"],["high_bug","High bug"],["bug","Bug"],["informational","Info"]],Tc=class extends N{static properties={counts:{type:Object},selected:{type:Array},kind:{type:String}};createRenderRoot(){return this}constructor(){super(),this.counts={},this.selected=[],this.kind="findings"}render(){let t=new Set(this.selected),r=Ev.filter(([n])=>(this.counts[n]??0)||t.has(n));return r.length===0?g:c`<div class="sev-chips" role="group" aria-label="Filter by severity">${r.map(([n,o])=>{let s=this.counts[n]??0,i=t.has(n);return c`<button type="button" class="${B({"sev-chip":!0,[n]:!0,active:i})}" aria-pressed="${String(i)}" @click="${()=>this._toggle(n)}"><span class="sd"></span><span class="name">${o}</span><span class="n">${s}</span></button>`})}</div>`}_toggle(t){this.dispatchEvent(new CustomEvent("severity-toggle",{detail:{severity:t,kind:this.kind},bubbles:!0,composed:!0}))}};customElements.define("severity-chips",Tc);var Th=[["none","none","unmarked"],["red","r","red"],["blue","b","blue"],["green","g","green"],["gray","x","gray"]],Ac=class extends N{static properties={counts:{type:Object},selected:{type:Array},kind:{type:String}};createRenderRoot(){return this}constructor(){super(),this.counts={},this.selected=[],this.kind="findings"}render(){let t=new Set(this.selected);return Th.some(([n])=>(this.counts[n]??0)||t.has(n))?c`<div class="triage-filter" role="group" aria-label="Filter by mark color">${Th.map(([n,o,s])=>{let i=this.counts[n]??0,l=t.has(n);return c`<button type="button" class="${l?"active":""}" title="${`${s} (${i})`}" aria-pressed="${String(l)}" @click="${()=>this._toggle(n)}"><span class="${`td ${o}`}"></span><span class="count">${i}</span></button>`})}</div>`:g}_toggle(t){this.dispatchEvent(new CustomEvent("color-toggle",{detail:{color:t,kind:this.kind},bubbles:!0,composed:!0}))}};customElements.define("triage-filter",Ac);var Tv={table:c`<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><rect x="3" y="3" width="18" height="18" rx="2"/><line x1="3" x2="21" y1="9" y2="9"/><line x1="3" x2="21" y1="15" y2="15"/><line x1="9" x2="9" y1="3" y2="21"/></svg>`,list:c`<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><line x1="3" x2="21" y1="6" y2="6"/><line x1="3" x2="21" y1="12" y2="12"/><line x1="3" x2="21" y1="18" y2="18"/></svg>`,grouped:c`<svg viewBox="0 0 16 16" width="16" height="16" fill="currentColor" aria-hidden="true"><rect x="2" y="1.5" width="12" height="2" rx=".4"/><rect x="5" y="4.4" width="9" height="1.3"/><rect x="5" y="6.2" width="9" height="1.3"/><rect x="2" y="8.5" width="12" height="2" rx=".4"/><rect x="5" y="11.4" width="9" height="1.3"/><rect x="5" y="13.2" width="9" height="1.3"/></svg>`,kanban:c`<svg viewBox="0 0 16 16" width="16" height="16" fill="currentColor" aria-hidden="true"><rect x="1.5" y="2" width="3.8" height="12" rx=".6" fill="none" stroke="currentColor" stroke-width="1"/><rect x="6.1" y="2" width="3.8" height="12" rx=".6" fill="none" stroke="currentColor" stroke-width="1"/><rect x="10.7" y="2" width="3.8" height="12" rx=".6" fill="none" stroke="currentColor" stroke-width="1"/><rect x="2.4" y="3.6" width="2" height="1.4" rx=".2"/><rect x="2.4" y="5.6" width="2" height="1.4" rx=".2"/><rect x="7" y="3.6" width="2" height="1.4" rx=".2"/><rect x="11.6" y="3.6" width="2" height="1.4" rx=".2"/><rect x="11.6" y="5.6" width="2" height="1.4" rx=".2"/><rect x="11.6" y="7.6" width="2" height="1.4" rx=".2"/></svg>`,focus:c`<svg viewBox="0 0 16 16" width="16" height="16" fill="currentColor" aria-hidden="true"><rect x="1.5" y="2.5" width="8.5" height="11" rx=".6" fill="none" stroke="currentColor" stroke-width="1"/><rect x="3" y="4.4" width="5.5" height="1"/><rect x="3" y="6.4" width="5.5" height="1"/><rect x="3" y="8.4" width="3.5" height="1"/><rect x="11.2" y="2.5" width="3.3" height="2.5" rx=".4" fill="currentColor" opacity=".55"/><rect x="11.2" y="5.7" width="3.3" height="2.5" rx=".4" fill="currentColor" opacity=".35"/><rect x="11.2" y="8.9" width="3.3" height="2.5" rx=".4" fill="currentColor" opacity=".22"/></svg>`,graph:c`<svg viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" aria-hidden="true"><line x1="4.5" y1="4.5" x2="11.5" y2="6.5"/><line x1="4.5" y1="4.5" x2="6.5" y2="11.5"/><line x1="11.5" y1="6.5" x2="6.5" y2="11.5"/><circle cx="4.5" cy="4.5" r="2" fill="currentColor"/><circle cx="11.5" cy="6.5" r="2" fill="currentColor"/><circle cx="6.5" cy="11.5" r="2" fill="currentColor"/></svg>`},Ah={table:"Table view (compact rows, click a row to expand)",list:"List view (flat, one card per finding)",grouped:"List view, grouped by file",focus:"Focus view (one finding centered + a queue of next findings)",kanban:"Kanban board, columns grouped by triage status",graph:"Graph view (canvas with imports / exports)"},Ic=["table","list","grouped","focus","kanban","graph"],Bc=class extends N{static properties={mode:{type:String},modes:{type:String},kind:{type:String}};createRenderRoot(){return this}constructor(){super(),this.mode="table",this.modes=Ic.join(","),this.kind="findings"}render(){let t=this.modes.split(",").map(n=>n.trim()).filter(n=>Ic.includes(n)),r=t.length>0?t:Ic;return c`<div class="view-mode-group" role="group" aria-label="View mode">${r.map(n=>c`<button type="button" class="${B({"view-mode-btn":!0,active:this.mode===n})}" title="${Ah[n]}" aria-label="${Ah[n]}" aria-pressed="${String(this.mode===n)}" @click="${()=>this._select(n)}">${Tv[n]}</button>`)}</div>`}_select(t){t!==this.mode&&this.dispatchEvent(new CustomEvent("view-mode-change",{detail:{mode:t,kind:this.kind},bubbles:!0,composed:!0}))}};customElements.define("view-mode-buttons",Bc);var Av=6,Ih=14,fi=2,Bh=24,_o=4;function Iv(e){let t=/^#?([0-9a-f]{6})$/iu.exec(e);if(!t)return"#fff";let r=parseInt(t[1],16),n=r>>16&255,o=r>>8&255,s=r&255;return(.2126*n+.7152*o+.0722*s)/255>.6?"#1a1a1a":"#fff"}function Bv(e,t,r,n){let o=r*r,s=n*n;return Math.max(s*e/o,o/(s*t))}function Fh(e,t){let r=[],n=e.filter(p=>p.value>0),{x:o,y:s,w:i,h:l}=t;if(n.length===0||i<=0||l<=0)return r;let d=0;for(let p of n)d+=p.value;let u=i*l/d,f=0;for(;f<n.length&&i>.5&&l>.5;){let p=Math.min(i,l),h=f,b=0,m=0,y=1/0,v=1/0;for(;h<n.length;){let x=n[h].value*u,S=x>m?x:m,C=x<y?x:y,L=Bv(S,C,b+x,p);if(h===f||L<=v)v=L,b+=x,m=S,y=C,h++;else break}let w=b/p;if(i>=l){let x=s;for(let S=f;S<h;S++){let C=S===h-1?s+l-x:n[S].value*u/w;r.push({node:n[S],x:o,y:x,w,h:C}),x+=C}o+=w,i-=w}else{let x=o;for(let S=f;S<h;S++){let C=S===h-1?o+i-x:n[S].value*u/w;r.push({node:n[S],x,y:s,w:C,h:w}),x+=C}s+=w,l-=w}f=h}return r}function Rh(e){for(;e.children&&e.children.size===1;){let t=e.children.values().next().value;if(t.isFile)break;e.name=`${e.name}/${t.name}`,e.children=t.children}if(e.children)for(let t of e.children.values())Rh(t)}function Mh(e,t){if(e.path=e.name?t?`${t}/${e.name}`:e.name:t,e.isFile)return e.count=1,e.value;let r=0,n=0;for(let o of e.children.values())r+=Mh(o,e.path),n+=o.count;return e.value=r,e.count=n,r}function Lh(e,t,r,n,o,s,i){if(n<_o||o<_o)return;if(e.isFile){i.push({kind:"file",node:e,x:t,y:r,w:n,h:o});return}if(!(s<Av&&n>=Bh&&o>=Bh&&e.children.size>0)){i.push({kind:"agg",node:e,x:t,y:r,w:n,h:o});return}i.push({kind:"dir",node:e,x:t,y:r,w:n,h:o});let d=o>=Ih+_o+fi?Ih:0,u=t+fi,f=r+d,p=n-fi*2,h=o-d-fi;if(p<_o||h<_o)return;let b=[...e.children.values()].toSorted((m,y)=>y.value-m.value);for(let m of Fh(b,{x:u,y:f,w:p,h}))Lh(m.node,m.x,m.y,m.w,m.h,s+1,i)}var Fc=class extends N{static properties={details:{attribute:!1},_w:{state:!0},_h:{state:!0}};createRenderRoot(){return this}constructor(){super(),this.details=null,this._w=0,this._h=0,this._root=null,this._status="loading",this._meta={files:0,total:0,prefix:""},this._ro=null,this._plot=null,this._tooltip=null,this._ttCell=null,this._onPointerMove=this._onPointerMove.bind(this),this._onPointerLeave=this._onPointerLeave.bind(this)}willUpdate(t){t.has("details")&&this._rebuild()}firstUpdated(){this._plot=this.querySelector(".bundle-treemap-plot"),this._tooltip=this.querySelector(".bundle-treemap-tooltip"),!(!this._plot||typeof ResizeObserver>"u")&&(this._ro=new ResizeObserver(t=>{let r=t[0]?.contentRect;if(!r)return;let n=Math.floor(r.width),o=Math.floor(r.height);(n!==this._w||o!==this._h)&&(this._w=n,this._h=o)}),this._ro.observe(this._plot))}disconnectedCallback(){super.disconnectedCallback(),this._ro&&(this._ro.disconnect(),this._ro=null)}_onPointerMove(t){let r=t.target.closest(".bundle-treemap-node");if(!r||!this._tooltip){this._hideTooltip();return}if(r!==this._ttCell){this._ttCell=r;let n=r.dataset;H(c`<div class="bundle-treemap-tt-path">${n.ttPath}</div>${n.ttPkg?c`<div class="bundle-treemap-tt-head"><span class="bundle-treemap-tt-dot" style="${`background:${n.ttColor}`}"></span> <span class="bundle-treemap-tt-pkg">${n.ttPkg}</span></div>`:""}<div class="bundle-treemap-tt-meta">${n.ttMeta}</div>`,this._tooltip)}this._positionTooltip(t.clientX,t.clientY)}_onPointerLeave(){this._hideTooltip()}_positionTooltip(t,r){let n=this._tooltip;if(!n||!this._plot)return;n.classList.add("show");let o=this._plot.getBoundingClientRect(),s=t-o.left,i=r-o.top,l=12,d=s+l;d+n.offsetWidth>o.width-4&&(d=s-n.offsetWidth-l),d<4&&(d=4);let u=i+l;u+n.offsetHeight>o.height-4&&(u=i-n.offsetHeight-l),u<4&&(u=4),n.style.left=`${d}px`,n.style.top=`${u}px`}_hideTooltip(){this._ttCell=null,this._tooltip&&this._tooltip.classList.remove("show")}_rebuild(){if(this._root=null,this._meta={files:0,total:0,prefix:""},!this.details){this._status="loading";return}let t=dt(this.details);if(!t||t.size===0){this._status="empty";return}let r=[...t.keys()],{prefix:n,stripped:o}=At(r),s=new TextEncoder,i={name:"",children:new Map,value:0,isFile:!1},l=0,d=0;for(let u=0;u<r.length;u++){let f=t.get(r[u]),p=typeof f=="string"?s.encode(f).byteLength:0;if(p<=0)continue;let h=o[u].split("/"),b=i,m=!1;for(let w=0;w<h.length-1;w++){let x=b.children.get(h[w]);if(x&&x.isFile){m=!0;break}x||(x={name:h[w],children:new Map,value:0,isFile:!1},b.children.set(h[w],x)),b=x}if(m)continue;let y=h.at(-1),v=b.children.get(y);v&&!v.isFile||(v||(v={name:y,isFile:!0,value:0,origPath:r[u]},b.children.set(y,v)),v.value+=p,l+=p,d++)}if(l===0){this._status="empty";return}for(let u of i.children.values())Rh(u);Mh(i,""),this._root=i,this._meta={files:d,total:l,prefix:n},this._status="ok"}_cell(t){let r=this._meta.total||1,n=t.node.value/r*100,o=n>=10?n.toFixed(0):n.toFixed(n>=1?1:2),s={left:`${t.x}px`,top:`${t.y}px`,width:`${t.w}px`,height:`${t.h}px`},i=`${t.node.count} ${t.node.count===1?"file":"files"}`;if(t.kind==="dir")return c`<div class="bundle-treemap-node bundle-treemap-dir" style="${ye(s)}" data-tt-path="${`${t.node.path}/`}" data-tt-meta="${`${De(t.node.value)} \xB7 ${i} \xB7 ${o}%`}"><span class="bundle-treemap-dirname">${t.node.name}</span></div>`;let l=uo(t.node.path),d=It(l),u=ye({...s,background:d,color:Iv(d)}),f=l==="__own__"?"own source":l;return t.kind==="agg"?c`<div class="bundle-treemap-node bundle-treemap-leaf bundle-treemap-agg" style="${u}" data-tt-path="${`${t.node.path}/`}" data-tt-pkg="${f}" data-tt-color="${d}" data-tt-meta="${`${De(t.node.value)} \xB7 ${i} \xB7 ${o}%`}"><span class="bundle-treemap-label">${t.node.name}/</span></div>`:c`<button type="button" class="bundle-treemap-node bundle-treemap-leaf bundle-treemap-file" style="${u}" data-bundle-view-source="${t.node.origPath}" data-tt-path="${t.node.path}" data-tt-pkg="${f}" data-tt-color="${d}" data-tt-meta="${`${De(t.node.value)} \xB7 ${o}% of bundle`}"><span class="bundle-treemap-label">${t.node.name}</span></button>`}render(){let t=[];if(this._status==="ok"&&this._root&&this._w>0&&this._h>0){let s=[...this._root.children.values()].toSorted((i,l)=>l.value-i.value);for(let i of Fh(s,{x:0,y:0,w:this._w,h:this._h}))Lh(i.node,i.x,i.y,i.w,i.h,1,t)}let{files:r,total:n,prefix:o}=this._meta;return c`<header class="bundle-treemap-head"><span class="bundle-treemap-title">Source treemap</span> <span class="bundle-treemap-sub">${r} ${r===1?"file":"files"} · ${De(n)}${o?c`· <span class="mono">${o}</span>`:""}</span></header><div class="bundle-treemap-plot" @pointermove="${this._onPointerMove}" @pointerleave="${this._onPointerLeave}">${this._status==="loading"?c`<div class="bundle-treemap-empty">Loading…</div>`:this._status==="empty"?c`<div class="bundle-treemap-empty">This bundle doesn't carry any source content.</div>`:t.map(s=>this._cell(s))}<div class="bundle-treemap-tooltip"></div></div>`}};customElements.define("bundle-treemap",Fc);function hi(e){let t=new Map;for(let[r,n]of a.triage)n[e]&&t.set(r,n[e]);return t}var Fv={get markers(){return hi("color")},get triageState(){return hi("triage")},get comments(){return hi("comment")},get fixes(){return hi("fix")},get(e){let t=a.triage.get(e),r={};return t?.color&&(r.color=t.color),t?.triage&&(r.triage=t.triage),t?.comment&&(r.comment=t.comment),t?.fix&&(r.fix=t.fix),r},async set(e,{color:t,triage:r,comment:n,fix:o}={}){let s=!1;if(t!==void 0&&(t===null||t===""?F(a.triage,e,{color:void 0})&&(s=!0):a.triage.get(e)?.color!==t&&(F(a.triage,e,{color:t}),s=!0)),r!==void 0)if(r===null||r===""||r===!1)F(a.triage,e,{triage:void 0})&&(s=!0);else if(r==="fixed"||r==="invalid"||r==="deleted")a.triage.get(e)?.triage!==r&&(F(a.triage,e,{triage:r}),s=!0);else throw new TypeError(`DeepView.triage.set: unknown triage value ${JSON.stringify(r)} (expected 'fixed' | 'invalid' | 'deleted' | null)`);if(n!==void 0){let i=n?String(n):"";i?a.triage.get(e)?.comment!==i&&(F(a.triage,e,{comment:i}),s=!0):F(a.triage,e,{comment:void 0})&&(s=!0)}if(o!==void 0){let i=o?String(o):"";i?a.triage.get(e)?.fix!==i&&(F(a.triage,e,{fix:i}),s=!0):F(a.triage,e,{fix:void 0})&&(s=!0)}return s&&(await oe(),k()),s}};window.DeepView={get reports(){return a.reports.slice()},get groups(){return a.reports.flatMap(e=>e.groups)},get findings(){return a.reports.flatMap(e=>e.groups.flat())},get currentFile(){return a.currentFile},get currentWorkspace(){return a.currentWorkspace},triage:Fv,themes:yh,setTheme:mh,get theme(){return bh()},triageSync:O,refresh(){k()},export(){return Sh()}};var Rv={default:G.default,"claude-security":G["claude-security"],"codex-security":G["codex-security"],deepsec:G.deepsec,bundle:Zr,workspace:Ls};for(let e of document.querySelectorAll(".drop-supported-icon[data-icon]")){let t=Rv[e.dataset.icon];t&&(e.innerHTML=t)}Ou(k);Pu(k);O.onStatusChange(k);Mu(async(e,t)=>{a.currentWorkspace===e?await Xt(e):a.currentFile&&a.currentFile===t?await $t(t):await W()});Lu(async()=>{await W(),a.currentView==="bundles"&&k()});Jf();Qf();async function Mv(){let e=nl();if(!e)return!1;try{history.replaceState(null,"",location.pathname)}catch{}let t;try{t=await eh({encoded:e})}catch(n){return alert(`Couldn't open the share-link unlock prompt: ${n.message}`),!1}if(!t)return!1;let r=await Ma({id:t.id,name:t.name,privateKey:t.privateKeyBase64});if(r.status==="already-attached")return alert(`This workspace is already attached as "${r.workspace.name}".`),!1;if(r.status==="name-collision"){let n=r.existing?.name;return alert(n?`A workspace named "${n}" 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 r.workspace?.id?await Xt(r.workspace.id):await W(),!0}var So=!1;async function Nh(){if(So||(So=!0,await Rr(),Aa(),await W(),await Mv()))return;let t=fe(Jt);if(t)if(t.startsWith("ws:")){let r=t.slice(3);U().some(n=>n.id===r)&&await Xt(r)}else if(t.startsWith("b:")){let r=t.slice(2),n=r.indexOf(" "),o=n>=0?r.slice(0,n):r,s=n>=0?r.slice(n+1):"",i=lo.has(s)?s:"overview";(a.bundles??[]).some(l=>l.integrity===o)&&(a.currentView="bundles",a.selectedBundle=o,a.bundleDetails=null,a.bundleSourceFile=null,a.bundleSourceFindingIdx=null,a.bundleCodeSearchQuery="",a.bundleCodeSearchMode="files",a.bundleDetailsTab=i,a.shownTriage=null,E.showAll=!0,k(),Yt(o))}else(await ae()).includes(t)&&await $t(t)}var Ph=X(),Oh=!1;function Dh(e){Oh||(Oh=!0,queueMicrotask(()=>{alert(e+" This tab will reload to refresh its state. Any unsaved edits in this tab will be lost."),location.reload()}))}he(()=>{let e=Ph,t=X();if(Ph=t,k(),!So&&st()){Nh().catch(r=>console.warn("continueBoot:",r));return}if(So&&t&&!st()){Dh("Encryption was just enabled in another tab.");return}So&&e&&!t&&!Vi()&&Dh("Encryption was disabled in another tab.")});(async()=>{if(!await Zf()){try{let e=window.matchMedia?.("(display-mode: window-controls-overlay)").matches;if(!e&&localStorage.getItem("deepview.sidebarCollapsed")==="1"&&gd.classList.add("collapsed"),window.matchMedia?.("(display-mode: standalone)").matches||e){let r=document.querySelector('meta[name="viewport"]');r&&r.setAttribute("content","width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"),window.addEventListener("wheel",n=>{(n.ctrlKey||n.metaKey)&&n.preventDefault()},{passive:!1}),window.addEventListener("keydown",n=>{(n.ctrlKey||n.metaKey)&&(n.key==="="||n.key==="+"||n.key==="-"||n.key==="0")&&n.preventDefault()})}}catch{}X()&&!st()||await Nh()}})();
78
+ `)}function zv(e){let t=e.map(n=>n.fileName),r="";return t.length===1?r=t[0]:t.length>1&&(r=Fs(t)),r=r.replace(/\.json$/u,""),`${r||"deepview-report"}.md`}function Th(e){if(e.length===0)return;let t=Uv(e),r=new Blob([t],{type:"text/markdown;charset=utf-8"});Rr(r,zv(e))}ga(()=>{a.currentView==="bundles"&&a.selectedBundle?k():a.currentView==="packages"?k():a.currentView==="repositories"?k():(a.currentView==="findings"||a.currentView==="files")&&V().catch(()=>{})});function Ih(){a.currentView==="bundles"&&a.bundleDetailsTab==="graph"?Qs():Jl()}function pi(){a.currentView==="bundles"&&a.bundleDetailsTab==="graph"?Zs():Xl()}function So(){let e=document.querySelector(".bundle-source-code-wrap"),t=e?.scrollTop??0,r=e?.scrollLeft??0;k();let n=document.querySelector(".bundle-source-code-wrap");n&&(n.scrollTop=t,n.scrollLeft=r)}function wc(e){let r=document.querySelector(e)?.scrollTop??0;k();let n=document.querySelector(e);n&&(n.scrollTop=r)}function _r(){a.viewMode==="table"?wc(".findings-table-list"):k()}function Q(e,t){for(let r of e.composedPath())if(r?.matches?.(t))return r;return null}function Rh(e){let r=Q(e,"[data-gid]")?.dataset?.gid,n=r?yr(r):null;if(!n)return null;let o=Ae(n),s=!1,i=null;for(let d of bt().values())if(d.files.has(o.file)){s=!0,d.repos&&d.repos.size===1&&(i=[...d.repos][0]);break}s||(i=o.repo?.github??o._repoFallback??a.repoUrl??null,i||(i=null));let l=[];return i&&l.push(`Repo: ${i}`),o.file&&l.push(`File: ${o.file}`),o.line!==void 0&&o.line!==null&&o.line!==""&&l.push(`Line: ${o.line}`),o.description&&l.push(`Description: ${o.description}`),o.confidence!==void 0&&o.confidence!==null&&l.push(`Confidence: ${o.confidence}/10`),l.join(`
79
+ `)}E.addEventListener("click",e=>{let t=Q(e,"[data-finding-code-bundle]");if(t){let _=t.dataset.findingCodeBundle,j=t.dataset.findingCodeFile,Z=t.dataset.findingCodeLine,ie=Z?parseInt(Z,10):null;a.bundleSourceFile=j||null,a.bundleSourceFindingIdx=null,a.bundleDetailsTab==="code"&&(a.bundleDetailsTab="overview");let pe=()=>{Number.isFinite(ie)&&queueMicrotask(()=>{let te=document.querySelector(`.bundle-source-lineno-row[data-line="${ie}"]`);te&&te.scrollIntoView({block:"start",behavior:"instant"})})};if(a.selectedBundle===_&&a.bundleDetails?.integrity===_){k(),pe();return}a.selectedBundle=_,a.bundleDetails=null,k(),(async()=>(await Jt(_),pe()))();return}let r=e.target.closest("[data-package-expand]");if(r){let _=r.dataset.packageExpand;a.expandedPackages.has(_)?a.expandedPackages.delete(_):a.expandedPackages.add(_),k();return}let n=e.target.closest("[data-package-row-issues]");if(n){let _=n.dataset.packageRowIssues,j=n.dataset.packageRowIssuesVersion;a.selectedPackage=_,a.selectedPackageVersion=j||null,a.packageDetailsTab="issues",a.packageSlideTriage=null,a.packageSlideTransient=!0,k();return}let o=e.target.closest("[data-repository-row-issues]");if(o){let _=o.dataset.repositoryRowIssues;a.selectedRepository=_,a.repositoryDetailsTab="issues",a.repositorySlideTriage=null,a.repositorySlideTransient=!0,k();return}let s=e.target.closest("[data-select-package]");if(s){let _=s.dataset.selectPackage,j=s.dataset.selectPackageVersion??"",Z=j===""?null:j;if(a.selectedPackage===_&&a.selectedPackageVersion===Z)return;a.selectedPackage=_,a.selectedPackageVersion=Z,a.packageDetailsTab="overview",a.packageSlideTriage=null,a.packageSlideTransient=!1,k();return}if(e.target.closest("[data-deselect-package]")){a.selectedPackage=null,a.selectedPackageVersion=null,k();return}let i=e.target.closest("[data-package-tab]");if(i){let _=i.dataset.packageTab;(_==="overview"||_==="issues")&&a.packageDetailsTab!==_&&(a.packageDetailsTab=_,k());return}if(e.target.closest('[data-action="package-slide-back"]')){a.packageDetailsTab="overview",a.packageSlideTriage=null,a.packageSlideTransient&&(a.selectedPackage=null,a.selectedPackageVersion=null,a.packageSlideTransient=!1),k();return}let l=e.target.closest("[data-package-report]");if(l){let _=l.dataset.packageReport;_&&_t(_);return}let d=e.target.closest("[data-select-repository]");if(d){let _=d.dataset.selectRepository;if(a.selectedRepository===_)return;a.selectedRepository=_,a.repositoryDetailsTab="overview",a.repositorySlideTriage=null,a.repositorySlideTransient=!1,k();return}if(e.target.closest("[data-deselect-repository]")){a.selectedRepository=null,k();return}let u=e.target.closest("[data-repository-tab]");if(u){let _=u.dataset.repositoryTab;(_==="overview"||_==="issues")&&a.repositoryDetailsTab!==_&&(a.repositoryDetailsTab=_,k());return}if(e.target.closest('[data-action="repository-slide-back"]')){a.repositoryDetailsTab="overview",a.repositorySlideTriage=null,a.repositorySlideTransient&&(a.selectedRepository=null,a.repositorySlideTransient=!1),k();return}let p=e.target.closest("[data-bundle-tab]");if(p){let _=p.dataset.bundleTab;po.has(_)&&(a.bundleDetailsTab==="graph"&&_!=="graph"&&ze(),a.bundleDetailsTab=_,a.bundleSourceFile=null,a.bundleSourceFindingIdx=null,a.selectedBundle&&an(a.selectedBundle,_),k());return}if(e.target.closest("[data-advisories-consent]")){wf(),k();return}let f=e.target.closest("[data-bundle-issue-report]");if(f){let _=f.dataset.bundleIssueReport;_&&_t(_);return}if(e.target.classList?.contains("bundle-source-overlay")||e.target.closest('[data-action="bundle-source-close"]')){a.bundleSourceFile&&(a.bundleSourceFile=null,a.bundleSourceFindingIdx=null,k());return}if(e.target.closest('[data-action="bundle-source-panel-close"]')){a.bundleSourceFindingIdx!=null&&(a.bundleSourceFindingIdx=null,So());return}let h=e.target.closest("[data-bundle-source-finding]");if(h){let _=parseInt(h.dataset.bundleSourceFinding,10);Number.isFinite(_)&&(a.bundleSourceFindingIdx=a.bundleSourceFindingIdx===_?null:_,So());return}let b=Q(e,"[data-bundle-view-source]");if(b){let _=b.dataset.bundleViewSource;if(!_)return;let j=b.dataset.bundleViewFindingIdx,Z=j===void 0?null:parseInt(j,10),ie=b.dataset.bundleViewLine,pe=ie?parseInt(ie,10):null;if(a.bundleSourceFile=_,Number.isFinite(Z)&&(a.bundleSourceFindingIdx=Z),b.closest(".bundle-code-rail")?wc(".bundle-code-rail-body"):b.closest(".bundles-slide-body")?wc(".bundles-slide-body"):k(),Number.isFinite(pe)){let te=b.dataset.bundleViewScrollBlock||"center";queueMicrotask(()=>{let We=document.querySelector(`.bundle-source-lineno-row[data-line="${pe}"]`);We&&We.scrollIntoView({block:te,behavior:"smooth"})})}return}if(e.target.closest('[data-action="toggle-files"]')){a.currentView==="files"?a.currentView="findings":(a.viewMode==="graph"&&ze(),a.currentView="files"),document.body.classList.remove("report-fullscreen"),k();return}let y=Q(e,"[data-g2-pkg]");if(y){let _=y.dataset.g2Pkg;A.solo=A.solo===_?null:_,A.solo&&(A.selected=null),Ih(),pi(),A.graphState?.requestDraw?.();return}let $=Q(e,"[data-g2-select]");if($){A.selected=$.dataset.g2Select,Ih();return}let w=Q(e,"[data-g2-top-pkgs]");if(w){A.topPkgsTab=w.dataset.g2TopPkgs,pi();return}let v=Q(e,"[data-g2-jump-findings]");if(v){if(a.currentView==="bundles"){a.bundleDetailsTab==="graph"&&ze(),a.bundleDetailsTab="issues",a.bundleSourceFile=null,a.bundleSourceFindingIdx=null,a.selectedBundle&&an(a.selectedBundle,"issues"),k();return}Ls(),a.filterConfMin=0,a.filterInclude=v.dataset.g2JumpFindings,a.currentView="findings",a.viewMode==="graph"&&(a.viewMode="table"),ze(),k();return}let S=Q(e,"[data-g2-jump-file]");if(S){let _=S.dataset.g2JumpFile;a.currentView="files",ze(),k(),requestAnimationFrame(()=>{let j=document.querySelector(`#${ao(_)}`);j&&j.scrollIntoView({behavior:"smooth",block:"start"})});return}if(Q(e,"#g2-path-filter-clear")){A.pathFilter="";let _=document.querySelector("graph-layout")?.shadowRoot?.querySelector("#g2-path-filter");_&&(_.value=""),A.graphState?.requestDraw?.();return}if(Q(e,"#g2-fullscreen")){document.body.classList.toggle("report-fullscreen");return}if(Q(e,"[data-g2-show-all]")){A.showAll=!A.showAll,A.layoutCache=null,A.selected=null,ze(),k();return}let R=Q(e,".graph2-triage-selector [data-triage-show]");if(R){let _=R.dataset.triageShow;a.shownTriage=a.shownTriage===_?null:_,A.layoutCache=null,A.selected=null,ze(),k();return}let O=Q(e,"[data-g2-focus-pkg]");if(O){A.focusedPkg=O.dataset.g2FocusPkg,A.layoutCache=null,ze(),k();return}if(Q(e,"#g2-back-to-full")){A.focusedPkg=null,A.layoutCache=null,ze(),k();return}let ye=Q(e,".tab");if(ye&&Q(e,".tabs")){let j=Q(e,"[data-gid]").dataset.gid,Z=ye.dataset.tid;a.activeTabByGroup.set(j,Z),_r();return}let K=Q(e,"[data-triage-action]");if(K){let _=K.closest(".triage-menu"),j=_?.dataset.gid;if(!j)return;let Z=yr(j);if(!Z)return;let ie=K.dataset.triageAction;if(!["fixed","invalid","deleted","ignored","restore"].includes(ie))return;let te=be(Z).hasConflict?[Ae(Z)]:Z;for(let We of te){let Ye=P(We),Er=Ms(We);ie==="restore"?(M(a.triage,Ye,{triage:void 0}),ne(a.triage,Ye,Er,!1)):ie==="ignored"?Tt(a.triage,Ye,Er)?ne(a.triage,Ye,Er,!1):(M(a.triage,Ye,{triage:void 0}),ne(a.triage,Ye,Er,!0)):a.triage.get(Ye)?.triage===ie?M(a.triage,Ye,{triage:void 0}):(M(a.triage,Ye,{triage:ie}),ne(a.triage,Ye,Er,!1))}try{_.hidePopover()}catch{}oe(),_r();return}if(Q(e,".mark-comment")){let j=Q(e,"[data-gid]").dataset.gid,Z=yr(j);if(!Z)return;let ie=Ae(Z),pe=P(ie),te=a.triage.get(pe)?.comment??"";_h({initial:te,finding:ie}).then(We=>(We===null||(M(a.triage,pe,{comment:We||void 0}),oe(),_r()),null)).catch(()=>{});return}let Re=Q(e,".mark-copy");if(Re){let _=Rh(e);if(_===null)return;try{navigator.clipboard.writeText(_).then(()=>(Re.classList.add("copied"),setTimeout(()=>Re.classList.remove("copied"),1e3),null)).catch(()=>{})}catch{}return}let rt=Q(e,".mark-claude");if(rt){let _=Rh(e);if(_===null)return;let j=`claude://code/new?q=${encodeURIComponent(`Confirm and fix:
80
+
81
+ ${_}`)}`;try{window.location.href=j,rt.classList.add("copied"),setTimeout(()=>rt.classList.remove("copied"),1e3)}catch{}return}if(Q(e,".mark-fix")){let j=Q(e,"[data-gid]").dataset.gid,Z=yr(j);if(!Z)return;let ie=Ae(Z),pe=P(ie),te=a.triage.get(pe)?.fix??"";Ch({initial:te,finding:ie}).then(We=>(We===null||(M(a.triage,pe,{fix:We||void 0}),oe(),_r()),null)).catch(()=>{});return}let Mt=e.target.closest("[data-triage-show]");if(Mt&&!Mt.closest(".graph2-triage-selector")){let _=Mt.dataset.triageShow;a.shownTriage=a.shownTriage===_?null:_,k();return}if(e.target.closest("[data-table-deselect]")){a.tableSelectedGid=null,_r();return}let ut=e.target.closest("[data-tree-select]");if(ut){let _=ut.dataset.treeSelect;a.filesSelectedFile=a.filesSelectedFile===_?null:_,k();return}e.target.closest("[data-tree-deselect]")&&(a.filesSelectedFile=null,k())});var Bh=document.querySelector("#bundle-source-overlay-slot");Bh&&Bh.addEventListener("click",e=>{if(e.target.classList?.contains("bundle-source-overlay")||e.target.closest('[data-action="bundle-source-close"]')){a.bundleSourceFile&&(a.bundleSourceFile=null,a.bundleSourceFindingIdx=null,k());return}if(e.target.closest('[data-action="bundle-source-panel-close"]')){a.bundleSourceFindingIdx!=null&&(a.bundleSourceFindingIdx=null,So());return}let t=e.target.closest("[data-bundle-source-finding]");if(t){let r=parseInt(t.dataset.bundleSourceFinding,10);Number.isFinite(r)&&(a.bundleSourceFindingIdx=a.bundleSourceFindingIdx===r?null:r,So())}});E.addEventListener("row-select",e=>{let t=e.detail?.gid;t&&(a.tableSelectedGid=a.tableSelectedGid===t?null:t,_r())});var fi="application/x-deepview-kanban-gid";function Wv(e,t){let n=be(e).hasConflict?[Ae(e)]:e;for(let o of n){let s=P(o),i=Ms(o);t==="untriaged"?(M(a.triage,s,{triage:void 0}),ne(a.triage,s,i,!1)):t==="ignored"?(M(a.triage,s,{triage:void 0}),ne(a.triage,s,i,!0)):(M(a.triage,s,{triage:t}),ne(a.triage,s,i,!1))}}function vc(){for(let e of E.querySelectorAll(".kanban-card.dragging"))e.classList.remove("dragging");for(let e of E.querySelectorAll(".kanban-column.drag-over"))e.classList.remove("drag-over")}E.addEventListener("dragstart",e=>{let t=e.target.closest?.(".kanban-card[data-kanban-source]");if(!t||!e.dataTransfer)return;let r=t.dataset.gid;r&&(e.dataTransfer.setData(fi,r),e.dataTransfer.setData("text/plain",r),e.dataTransfer.effectAllowed="move",t.classList.add("dragging"))});E.addEventListener("dragend",()=>{vc()});E.addEventListener("dragover",e=>{if(!e.dataTransfer?.types.includes(fi))return;let t=e.target.closest?.(".kanban-column[data-kanban-target]");if(t&&(e.preventDefault(),e.dataTransfer.dropEffect="move",!t.classList.contains("drag-over"))){for(let r of E.querySelectorAll(".kanban-column.drag-over"))r!==t&&r.classList.remove("drag-over");t.classList.add("drag-over")}});E.addEventListener("dragleave",e=>{let t=e.target.closest?.(".kanban-column[data-kanban-target]");t&&(t.contains(e.relatedTarget)||t.classList.remove("drag-over"))});E.addEventListener("drop",e=>{if(!e.dataTransfer?.types.includes(fi))return;let t=e.target.closest?.(".kanban-column[data-kanban-target]");if(!t){vc();return}e.preventDefault();let r=e.dataTransfer.getData(fi),n=t.dataset.kanbanTarget;if(vc(),!r||!n)return;let o=yr(r);!o||(be(o).commonTriage??"untriaged")===n||(Wv(o,n),k(),queueMicrotask(oe))});var yc=!1;function ci(e){return e?E.querySelector(`.kanban-card[data-gid="${CSS.escape(e)}"]`):null}function di(e){let t=e??E.querySelector(".kanban-card");if(!t)return;let r=t.getBoundingClientRect();r.width<=0||r.height<=0||(document.documentElement.style.setProperty("--kanban-clip-card-w",`${Math.floor(r.width)}px`),document.documentElement.style.setProperty("--kanban-clip-card-h",`${Math.floor(r.height)}px`))}function ui(e){let t=a.kanbanPopoverGid;if(t===e)return;let r=t===null&&e!==null,n=t!==null&&e===null;if(!document.startViewTransition||!r&&!n){a.kanbanPopoverGid=e,k();return}if(yc)return;yc=!0;let o=r?"kanban-opening":"kanban-closing";document.documentElement.classList.add(o);let s=u=>{u&&(u.style.viewTransitionName=""),document.documentElement.classList.remove(o),yc=!1};if(r){let u=ci(e);u?(di(u),u.style.viewTransitionName="kanban-detail-modal",u.getBoundingClientRect()):di(),a.kanbanPopoverGid=e;let p=document.startViewTransition(()=>{k(),u&&(u.style.viewTransitionName="")}),f=setTimeout(()=>s(u),600);(async()=>{try{await p.finished}catch{}clearTimeout(f),s(u)})();return}di(),a.kanbanPopoverGid=e;let i=null,l=document.startViewTransition(()=>{k(),i=ci(t),i&&(di(i),i.style.viewTransitionName="kanban-detail-modal")}),d=setTimeout(()=>s(i??ci(t)),600);(async()=>{try{await l.finished}catch{}clearTimeout(d),s(i??ci(t))})()}E.addEventListener("click",e=>{if(e.target.closest?.(".kanban-detail-close")){ui(null);return}let t=e.target.closest?.(".kanban-card[data-kanban-source]");if(t){if(window.getSelection?.()?.toString())return;let r=t.dataset.gid;if(!r)return;ui(a.kanbanPopoverGid===r?null:r);return}e.target.closest?.(".kanban-detail-modal")||a.kanbanPopoverGid&&ui(null)});document.addEventListener("keydown",e=>{e.key==="Escape"&&a.kanbanPopoverGid&&ui(null)});function Fh(e){if(!e||a.focusGid===e)return;a.focusGid=e,k();let t=E.querySelector(".focus-side-card.active");t&&t.scrollIntoView({block:"nearest",behavior:"instant"});let r=E.querySelector(".focus-code-line-active");r&&r.scrollIntoView({block:"center",behavior:"instant"})}function Mh(e){let t=E.querySelectorAll(".focus-side-card[data-focus-select]");if(t.length===0)return;let r=-1;for(let s=0;s<t.length;s++)if(t[s].classList.contains("active")){r=s;break}let n=r<0?e>0?0:t.length-1:Math.min(Math.max(r+e,0),t.length-1);if(n===r)return;let o=t[n].dataset.gid;o&&Fh(o)}E.addEventListener("click",e=>{let t=e.target.closest?.("[data-focus-nav]");if(t){Mh(t.dataset.focusNav==="next"?1:-1);return}let r=e.target.closest?.(".focus-side-card[data-focus-select]");if(!r||window.getSelection?.()?.toString())return;let n=r.dataset.gid;n&&Fh(n)});function Hv(e){if(document.querySelector("dialog[open]"))return!0;for(let t of e.composedPath()){if(!t||t.nodeType!==1)continue;let r=t.tagName;if(r==="INPUT"||r==="TEXTAREA"||r==="SELECT"||t.isContentEditable)return!0}return!1}document.addEventListener("keydown",e=>{if(a.viewMode!=="focus"||a.currentView!=="findings"||e.metaKey||e.ctrlKey||e.altKey||e.shiftKey||Hv(e))return;let t=0;if(e.key==="ArrowRight")t=1;else if(e.key==="ArrowLeft")t=-1;else return;e.preventDefault(),Mh(t)});E.addEventListener("mark-color",e=>{let t=Q(e,"[data-gid]");if(!t)return;let r=t.dataset.gid,n=yr(r);if(!n)return;let o=P(Ae(n)),s=e.detail?.color;if(!s)return;a.triage.get(o)?.color===s?M(a.triage,o,{color:void 0}):M(a.triage,o,{color:s}),oe(),_r()});var Sr=null,kc=null;function Lh(){if(Sr!==null||a.reports.length===0)return;Sr=a.viewMode,kc=document.title,a.viewMode==="table"&&(a.viewMode="list",k());let e=a.reports.map(r=>r.fileName),t="";e.length===1?t=e[0]:e.length>1&&(t=Fs(e)),t=t.replace(/\.json$/u,""),t&&(document.title=t)}function Ph(){Sr!==null&&(a.viewMode!==Sr&&(a.viewMode=Sr,k()),document.title=kc,Sr=null,kc=null)}window.addEventListener("beforeprint",Lh);window.addEventListener("afterprint",Ph);document.addEventListener("print-requested",async()=>{if(a.reports.length!==0&&Sr===null){Lh();try{await Promise.all([...E.querySelectorAll("finding-card")].map(e=>e.updateComplete)),window.print()}catch(e){throw Ph(),e}}});document.addEventListener("download-requested",()=>{a.reports.length!==0&&Th(a.reports)});E.addEventListener("analyzer-change",e=>{a.filterAnalyzer=e.detail.value,k()});E.addEventListener("repo-change",e=>{a.filterRepo=e.detail.value,k()});E.addEventListener("bundle-search-mode-change",e=>{let t=e.detail?.mode;t!=="files"&&t!=="code"&&t!=="issues"||(a.bundleCodeSearchMode=t,k())});E.addEventListener("sort-change",e=>{let{kind:t,value:r}=e.detail;if(t==="findings")a.sortBy=r;else if(t==="packages")a.packagesSortBy=r;else if(t==="repositories")a.repositoriesSortBy=r;else return;k()});E.addEventListener("range-change",e=>{e.target.id==="conf-range"&&(a.filterConfMin=e.detail.low,a.filterConfMax=e.detail.high,k())});E.addEventListener("input",e=>{let t=e.composedPath()[0],r=t?.id,n=t?.value;r==="g2-path-filter"&&(A.pathFilter=n,A.graphState?.requestDraw?.())});E.addEventListener("search-input",e=>{if(!e.detail)return;let{kind:t,value:r}=e.detail;if(t==="findings")a.filterInclude=r;else if(t==="files")a.filesSearch=r;else if(t==="packages")a.packagesSearchQuery=r;else if(t==="repositories")a.repositoriesSearchQuery=r;else if(t==="bundle-code")a.bundleCodeSearchQuery=r;else return;k()});E.addEventListener("severity-toggle",e=>{let t=e.detail.severity;if(e.detail.kind==="graph"){A.selectedSeverities.has(t)?A.selectedSeverities.delete(t):A.selectedSeverities.add(t),e.composedPath()[0].selected=[...A.selectedSeverities],A.graphState?.requestDraw?.(),pi();return}a.filterSeverities.has(t)?a.filterSeverities.delete(t):a.filterSeverities.add(t),k()});E.addEventListener("color-toggle",e=>{let t=e.detail.color;if(e.detail.kind==="graph"){A.selectedColors.has(t)?A.selectedColors.delete(t):A.selectedColors.add(t),e.composedPath()[0].selected=[...A.selectedColors],A.graphState?.requestDraw?.(),pi();return}a.filterColors.has(t)?a.filterColors.delete(t):a.filterColors.add(t),k()});E.addEventListener("source-toggle",e=>{let t=e.detail.source,r=a.filterSources.has(t);a.filterSources.clear(),r||a.filterSources.add(t),k()});E.addEventListener("slide-triage-toggle",e=>{let{kind:t,value:r}=e.detail;if(t==="package")a.packageSlideTriage=a.packageSlideTriage===r?null:r;else if(t==="repository")a.repositorySlideTriage=a.repositorySlideTriage===r?null:r;else return;k()});E.addEventListener("view-mode-change",e=>{if(e.detail.kind==="files"){a.filesViewMode=e.detail.mode,k();return}a.viewMode=e.detail.mode;try{localStorage.setItem(is,a.viewMode)}catch{}a.viewMode!=="kanban"&&(a.kanbanPopoverGid=null),a.viewMode!=="focus"&&(a.focusGid=null),k()});E.addEventListener("repo-edit-start",()=>{a.repoEditing=!0,k()});E.addEventListener("repo-input",e=>{a.repoUrl=e.detail.url,Ve(a.currentFile,a.repoUrl)});E.addEventListener("repo-commit",e=>{a.repoUrl=e.detail.url,Ve(a.currentFile,a.repoUrl),a.repoEditing=!1,k()});E.addEventListener("repo-cancel",e=>{a.repoUrl=e.detail.url,Ve(a.currentFile,a.repoUrl),a.repoEditing=!1,k()});document.addEventListener("keydown",e=>{if(e.key==="Escape"){if(a.bundleSourceFindingIdx!=null){a.bundleSourceFindingIdx=null,So();return}a.bundleSourceFile&&(a.bundleSourceFile=null,k())}});var Oh=`:host{position:absolute;top:.5rem;right:.5rem;z-index:1000;width:30px;height:30px;background:transparent;color:var(--muted);border:0;border-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: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}}
82
+ `;var $c="deepview.theme",cn=Object.freeze(["dark","light","green","pink"]),jv={dark:{base:"#1a1a1b",dim:"#0a0a0a"},light:{base:"#f6f6fa",dim:"#646464"},green:{base:"#0a140a",dim:"#050a05"},pink:{base:"#ffe4ee",dim:"#a3727f"}},Kv="\u2600",qv="\u263E",xc="deepview-theme-changed",hi="dark",Sc=!1;function Gv(){try{let e=localStorage.getItem($c);return cn.includes(e)?e:"dark"}catch{return"dark"}}function Co(e){cn.includes(e)||(e="dark"),hi=e;for(let r of cn)r!=="dark"&&document.body.classList.remove(`theme-${r}`);e!=="dark"&&document.body.classList.add(`theme-${e}`);try{e==="dark"?localStorage.removeItem($c):localStorage.setItem($c,e)}catch{}let t=document.querySelector('meta[name="theme-color"]');if(t){let{base:r,dim:n}=jv[e];t.setAttribute("content",Sc?n:r)}window.dispatchEvent(new CustomEvent(xc,{detail:{theme:e}}))}Co(Gv());window.addEventListener("beforeprint",()=>{Sc=!0,Co(hi)});window.addEventListener("afterprint",()=>{Sc=!1,Co(hi)});function Nh(e){if(!cn.includes(e))throw new TypeError(`DeepView.setTheme: unknown theme ${JSON.stringify(e)} (expected one of ${cn.map(t=>JSON.stringify(t)).join(", ")})`);Co(e)}function Dh(){return hi}var Uh=cn,_c=class extends H{static properties={_light:{state:!0}};static styles=T(Oh);constructor(){super(),this._light=document.body.classList.contains("theme-light")}connectedCallback(){super.connectedCallback(),this.hasAttribute("role")||this.setAttribute("role","button"),this.hasAttribute("tabindex")||(this.tabIndex=0),this.hasAttribute("aria-label")||this.setAttribute("aria-label","toggle theme"),this.hasAttribute("title")||this.setAttribute("title","toggle light/dark theme"),this.addEventListener("click",this._toggle),this.addEventListener("keydown",this._onKeydown),window.addEventListener(xc,this._onThemeChanged)}disconnectedCallback(){window.removeEventListener(xc,this._onThemeChanged),this.removeEventListener("click",this._toggle),this.removeEventListener("keydown",this._onKeydown),super.disconnectedCallback()}_onThemeChanged=()=>{this._light=document.body.classList.contains("theme-light")};_toggle=()=>{let t=document.body.classList.contains("theme-light");Co(t?"dark":"light")};_onKeydown=t=>{(t.key==="Enter"||t.key===" ")&&(t.preventDefault(),this._toggle())};render(){return c`${this._light?qv:Kv}`}};customElements.define("theme-toggle",_c);var zh=`:host{display:block}.row{display:grid;grid-template-columns:5.5rem minmax(0,1fr);gap:.2rem .85rem;padding:.25rem .7rem;font-size:.8rem;border-bottom:1px solid var(--border);transition:background .12s}:host(:last-child) .row{border-bottom:none}:host(:hover) .row{background:rgb(from var(--text) r g b / .04)}:host(.mark-red) .row{background:var(--mark-red-bg)}:host(.mark-blue) .row{background:var(--mark-blue-bg)}:host(.mark-green) .row{background:var(--mark-green-bg)}:host(.mark-gray) .row{background:var(--mark-gray-bg)}:host(.has-conflict) .row{outline:2px dashed var(--accent);outline-offset:-2px}:host(.triage-fixed),:host(.triage-invalid),:host(.triage-deleted),:host(.triage-ignored){opacity:.75}:host(.selected) .row{outline:2px solid var(--accent);outline-offset:-2px}:host(:first-of-type) .row{border-top-left-radius:6px;border-top-right-radius:6px}:host(:last-of-type) .row{border-bottom-left-radius:6px;border-bottom-right-radius:6px}.row-score{grid-column:1;grid-row:1 / 3;align-self:center;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.2rem;font-variant-numeric:tabular-nums;.badge{min-width:4.4rem;text-align:center}.row-conf{color:var(--muted);font-size:.72rem;user-select:none;& strong{color:var(--text);font-size:.8rem}}}.row-body{display:contents}.title-row{grid-column:2;grid-row:1;min-width:0;display:flex;align-items:baseline;gap:.5rem;.title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500;user-select:none}.row-type{color:var(--muted);font-size:.68rem;flex-shrink:0}}.meta-row{grid-column:2;grid-row:2;min-width:0;display:flex;align-items:center;gap:.55rem;.row-loc{color:var(--muted);font-size:.72rem;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;& a{color:inherit}& a:hover{color:var(--accent)}}.marks{display:flex;gap:.35rem;align-items:center;flex-shrink:0;user-select:none}}.tabs-row{grid-column:2;grid-row:3;min-width:0;.tabs{display:flex;gap:.25rem;flex-wrap:wrap}}.badge,.tabs,.tab,.row-type{cursor:default;user-select:none}.badge{display:inline-block;font-size:.7rem;font-weight:600;text-transform:uppercase;padding:.15rem .45rem;border-radius:3px;letter-spacing:.03em;line-height:1;&.critical{background:var(--critical);color:#fff}&.high{background:var(--high);color:#fff}&.medium{background:var(--medium);color:#000}&.low{background:var(--low);color:var(--badge-low-text)}&.high_bug{background:var(--high-bug);color:#fff}&.bug{background:var(--bug);color:#fff}&.informational{background:var(--info);color:#fff}}.tab{background:transparent;color:var(--text);border:1px solid var(--border);border-radius:4px;padding:.2rem .5rem;font-size:.75rem;line-height:1.3;display:inline-flex;align-items:center;gap:.35rem;font-family:inherit;&:hover{border-color:var(--accent)}&.active{border-color:var(--accent);background:var(--surface-active)}&.tab-mark-red{background:var(--mark-red-bg);border-color:var(--mark-red-tab-border)}&.tab-mark-blue{background:var(--mark-blue-bg);border-color:var(--mark-blue-tab-border)}&.tab-mark-green{background:var(--mark-green-bg);border-color:var(--mark-green-tab-border)}&.tab-mark-gray{background:var(--mark-gray-bg);border-color:var(--mark-gray-tab-border)}&.tab-mark-red.active,&.tab-mark-blue.active,&.tab-mark-green.active,&.tab-mark-gray.active{border-color:var(--text)}&.tab-deleted .tab-label{text-decoration:line-through;opacity:.6}&.tab-fixed .tab-label{opacity:.65}&.tab-fixed .tab-label:after{content:" \\2713";opacity:.6}&.tab-invalid .tab-label{opacity:.65}&.tab-invalid .tab-label:after{content:" \\2298";opacity:.6}&.tab-ignored .tab-label{opacity:.55}&.tab-ignored .tab-label:after{content:" \\1f441";opacity:.6;font-size:.7em}.tab-conf{color:var(--muted);font-size:.7rem}&.tab-mark-red .tab-conf,&.tab-mark-blue .tab-conf,&.tab-mark-green .tab-conf,&.tab-mark-gray .tab-conf{color:var(--text)}}.report-chip{display:inline-flex;align-items:center;gap:.3rem;padding:0 .35rem;height:1.4rem;border:1px solid var(--border);border-radius:3px;color:var(--muted);font-size:.72rem;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin-right:.65rem;max-width:12rem;.report-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.file-icon{flex-shrink:0}.brand-deepview{.bg{fill:#2563eb}.fg{fill:#fff}}.brand-claude{.bg{fill:#d97757}.fg{fill:#fff}}.brand-codex{.bg{fill:#fff;stroke:#000;stroke-width:.5}.fg{fill:#000}}.brand-vercel{.bg{fill:#000;stroke:#fff;stroke-width:.5}.fg{fill:#fff}}}.mark-action-group{display:inline-flex;border:1px solid var(--border);border-radius:3px;overflow:hidden;margin-right:.25rem}.mark-comment,.mark-fix,.mark-copy,.mark-claude{background:transparent;border:0;color:var(--muted);padding:0 .25rem;height:1.4rem;display:inline-flex;align-items:center;justify-content:center;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--accent);background:var(--surface-active)}}.mark-comment.has-comment,.mark-fix.has-fix{color:var(--accent)}.mark-copy.copied,.mark-claude.copied{color:var(--green, #4ade80);background:color-mix(in srgb,var(--green, #4ade80) 14%,transparent)}.mark-comment.has-comment .bubble,.mark-fix.has-fix .wrench{fill:var(--accent);fill-opacity:.15}.mark-x{background:transparent;border:1px solid var(--border);color:var(--muted);border-radius:3px;padding:0 .35rem;font-size:.85rem;line-height:1.1;margin-left:.25rem;&:hover{color:var(--critical);border-color:var(--critical)}}.triage-menu-wrap{position:relative;display:inline-flex;margin-left:.25rem}.mark-triage-menu{background:transparent;border:1px solid var(--border);color:var(--muted);border-radius:3px;padding:0 .3rem;height:1.5rem;display:inline-flex;align-items:center;justify-content:center;gap:.25rem;font:inherit}.mark-triage-menu:hover{color:var(--text);border-color:var(--accent)}.mark-triage-menu.open{border-color:var(--accent);color:var(--text)}.mark-triage-menu.with-label{padding:0 .35rem 0 .5rem;font-size:.72rem;height:1.5rem}.mark-triage-menu .mark-triage-label{text-transform:uppercase;letter-spacing:.05em;font-weight:600}.mark-triage-menu.triage-state-deleted{border-color:var(--critical);color:var(--critical)}.mark-triage-menu.triage-state-fixed{border-color:var(--green, #4ade80);color:var(--green, #4ade80)}.mark-triage-menu.triage-state-invalid{border-color:var(--muted);color:var(--text)}.mark-triage-menu.triage-state-ignored{border-color:var(--accent, #2563eb);color:var(--accent, #2563eb)}.triage-menu[popover]{position:fixed;inset:auto;margin:0;min-width:7rem;background:var(--bg);border:1px solid var(--border);border-radius:4px;padding:.25rem;box-shadow:0 4px 12px #00000040;display:flex;flex-direction:column;gap:1px;-webkit-app-region:no-drag;app-region:no-drag}.triage-menu[popover]:not(:popover-open){display:none}.triage-menu[popover]:popover-open{display:flex}.triage-menu-item{background:transparent;border:0;padding:.35rem .5rem;font-size:.78rem;color:var(--text);text-align:left;border-radius:3px;font-family:inherit}.triage-menu-item:hover{background:var(--surface)}.triage-menu-item.active:before{content:"\\2713 ";color:var(--accent)}.triage-menu-fixed:hover{color:var(--green, #4ade80)}.triage-menu-invalid:hover{color:var(--muted)}.triage-menu-deleted:hover{color:var(--critical)}.mark-restore{background:transparent;border:1px solid var(--border);color:var(--muted);border-radius:3px;padding:0 .45rem;font-size:.75rem;line-height:1.3;margin-left:.25rem;&:hover{color:var(--green);border-color:var(--green)}}.line-num{color:var(--muted);font-size:.75rem}.line-num a{color:inherit}.line-num a:hover{color:var(--accent)}@media print{:host(:hover) .row,:host(.mark-red) .row,:host(.mark-blue) .row,:host(.mark-green) .row,:host(.mark-gray) .row{background:transparent!important}:host(.triage-fixed),:host(.triage-invalid),:host(.triage-deleted),:host(.triage-ignored){opacity:1}:host(.selected) .row,:host(.has-conflict) .row{outline:none!important}.row{break-inside:avoid}.marks,.mark-x,.mark-restore{display:none!important}.badge{-webkit-print-color-adjust:exact;print-color-adjust:exact;&.critical{background:#a30b0f!important;color:#fff!important}&.high{background:#b8400a!important;color:#fff!important}&.medium{background:#855107!important;color:#fff!important}&.low{background:#374151!important;color:#fff!important}&.high_bug{background:#7a3e0c!important;color:#fff!important}&.bug{background:#4d4538!important;color:#fff!important}&.informational{background:#0550ae!important;color:#fff!important}}a,.line-num,.line-num a{color:inherit}}
83
+ `;var Jv=["is-critical","mark-red","mark-blue","mark-green","mark-gray","has-conflict","triage-fixed","triage-invalid","triage-deleted","triage-ignored","selected"],Cc=class extends L{static properties={group:{attribute:!1},selected:{type:Boolean}};static styles=T(zh);constructor(){super(),this.group=null,this.selected=!1}render(){if(!this.group)return c``;this.dataset.gid=io(this.group);let t=new Set(Pp(this.group));this.selected&&t.add("selected");for(let r of Jv)this.classList.toggle(r,t.has(r));return c`<div class="row">${Op(this.group)}</div>`}connectedCallback(){super.connectedCallback(),this.addEventListener("click",this._onClick),this.hasUpdated&&this.requestUpdate()}disconnectedCallback(){this.removeEventListener("click",this._onClick),super.disconnectedCallback()}_onClick=t=>{t.composedPath().some(n=>n?.matches?.("a, button, label"))||this.dataset.gid&&this.dispatchEvent(new CustomEvent("row-select",{detail:{gid:this.dataset.gid},bubbles:!0,composed:!0}))}};customElements.define("finding-row",Cc);var Wh=`:host{display:block;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:6px;overflow:hidden;box-shadow:var(--shadow-glass);margin-bottom:1rem;max-width:1200px}
84
+ `;var Ec=class extends H{static properties={items:{attribute:!1},selectedGid:{attribute:!1}};static styles=T(Wh);constructor(){super(),this.items=[],this.selectedGid=null}render(){return c`${J(this.items??[],t=>io(t),t=>c`<finding-row .group="${t}" ?selected="${io(t)===this.selectedGid}"></finding-row>`)}`}};customElements.define("finding-table",Ec);var Hh=`:host{display:block}:host(.hidden){display:none}:host(.triage-fixed),:host(.triage-invalid),:host(.triage-deleted),:host(.triage-ignored){opacity:.75}.card{padding:.5rem .75rem;border-bottom:1px solid var(--border);font-size:.875rem}:host(:last-child) .card{border-bottom:none}:host(.mark-red) .card{background:var(--mark-red-bg)}:host(.mark-blue) .card{background:var(--mark-blue-bg)}:host(.mark-green) .card{background:var(--mark-green-bg)}:host(.mark-gray) .card{background:var(--mark-gray-bg)}:host(.has-conflict) .card{outline:2px dashed var(--accent);outline-offset:-2px}:host([in-group]) .line-row{display:none}.tabs{display:flex;gap:.25rem;flex-wrap:wrap}.marks-left{display:flex;align-items:center;gap:.5rem;margin-right:auto;flex-wrap:wrap}.commit-ref{color:var(--muted);font-size:.8rem;& a{color:var(--accent);font-family:ui-monospace,SFMono-Regular,Menlo,monospace}& a:hover{text-decoration:underline}& span{font-family:ui-monospace,SFMono-Regular,Menlo,monospace}}.marks-commit-row{margin-top:.4rem;padding-left:4.75rem}.tab-body{display:none;grid-template-columns:auto 1fr;gap:.25rem .75rem;&.active{display:grid}}.desc-title{grid-column:2;font-size:1.08em;font-weight:600;letter-spacing:-.005em;line-height:1.35;color:var(--text)}.desc{grid-column:2;white-space:pre-line;font-size:.96em;line-height:1.6;color:rgb(from var(--text) r g b / .82);margin-top:.4rem}.recommendation{grid-column:2;white-space:pre-line;font-size:.92em;line-height:1.55;color:var(--green);margin-top:.4rem}.conf-reason{grid-column:2;white-space:pre-line;font-size:.92em;font-style:italic;color:var(--muted);margin-top:.6rem;padding-top:.55rem;border-top:1px dashed var(--border)}.inline-quote{background:rgb(from var(--accent) r g b / .1);padding:1px;border-radius:3px;color:var(--text)}.inline-code{background:var(--surface-active);border-radius:3px;border:1px solid var(--border);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.9em;color:var(--text)}.line-row{display:flex;justify-content:space-between;align-items:baseline;gap:.5rem;flex-wrap:wrap}.run-meta{color:var(--muted);font-size:.65rem}.finding-code-btn{display:inline-block;margin-top:.35rem;padding:.1rem .45rem;background:transparent;border:1px solid var(--border);border-radius:999px;color:var(--muted);font:inherit;font-size:.65rem;font-weight:500;white-space:nowrap}.finding-code-btn:hover{border-color:var(--accent);color:var(--accent)}.marks{display:flex;gap:.35rem;justify-content:flex-end;margin-top:.4rem;align-items:center;padding-left:4.75rem;user-select:none}.finding-left{align-self:start;text-align:center;min-width:4rem;.value-label:last-child{margin-bottom:0}}.conf-score{font-size:.75rem;color:var(--muted);margin-top:.3rem;& strong{color:var(--text);font-size:.85rem}}.conf-ring{--col: var(--muted);position:relative;width:3rem;height:3rem;margin:.7rem auto .15rem;display:flex;align-items:center;justify-content:center;& svg{position:absolute;inset:0;width:100%;height:100%;transform:rotate(-90deg)}& circle{fill:none;stroke-width:4}.conf-ring-track{stroke:var(--border)}.conf-ring-arc{stroke:var(--col);stroke-linecap:round}& span{position:relative;z-index:1;font-size:.8rem;font-weight:700;color:var(--text);font-variant-numeric:tabular-nums}& small{font-size:.55rem;color:var(--muted);font-weight:500}&.critical{--col: var(--critical)}&.high{--col: var(--high)}&.medium{--col: var(--medium)}&.low{--col: var(--low)}&.high_bug{--col: var(--high-bug)}&.bug{--col: var(--bug)}&.informational{--col: var(--info)}}.value-label{display:block;font-size:.45rem;color:var(--muted);text-transform:uppercase;letter-spacing:.04em;margin-top:.1rem;margin-bottom:.3rem;font-weight:500}.print-case-label{display:none}.badge,.tabs,.tab,.value-label,.run-meta,.conf-ring{cursor:default;user-select:none}.badge{display:inline-block;font-size:.7rem;font-weight:600;text-transform:uppercase;padding:.15rem .45rem;border-radius:3px;letter-spacing:.03em;line-height:1;&.critical{background:var(--critical);color:#fff}&.high{background:var(--high);color:#fff}&.medium{background:var(--medium);color:#000}&.low{background:var(--low);color:var(--badge-low-text)}&.high_bug{background:var(--high-bug);color:#fff}&.bug{background:var(--bug);color:#fff}&.informational{background:var(--info);color:#fff}}.tab{background:transparent;color:var(--text);border:1px solid var(--border);border-radius:4px;padding:.2rem .5rem;font-size:.75rem;line-height:1.3;display:inline-flex;align-items:center;gap:.35rem;font-family:inherit;&:hover{border-color:var(--accent)}&.active{border-color:var(--accent);background:var(--surface-active)}&.tab-mark-red{background:var(--mark-red-bg);border-color:var(--mark-red-tab-border)}&.tab-mark-blue{background:var(--mark-blue-bg);border-color:var(--mark-blue-tab-border)}&.tab-mark-green{background:var(--mark-green-bg);border-color:var(--mark-green-tab-border)}&.tab-mark-gray{background:var(--mark-gray-bg);border-color:var(--mark-gray-tab-border)}&.tab-mark-red.active,&.tab-mark-blue.active,&.tab-mark-green.active,&.tab-mark-gray.active{border-color:var(--text)}&.tab-deleted .tab-label{text-decoration:line-through;opacity:.6}&.tab-fixed .tab-label{opacity:.65}&.tab-fixed .tab-label:after{content:" \\2713";opacity:.6}&.tab-invalid .tab-label{opacity:.65}&.tab-invalid .tab-label:after{content:" \\2298";opacity:.6}&.tab-ignored .tab-label{opacity:.55}&.tab-ignored .tab-label:after{content:" \\1f441";opacity:.6;font-size:.7em}.tab-conf{color:var(--muted);font-size:.7rem}&.tab-mark-red .tab-conf,&.tab-mark-blue .tab-conf,&.tab-mark-green .tab-conf,&.tab-mark-gray .tab-conf{color:var(--text)}}.report-chip{display:inline-flex;align-items:center;gap:.3rem;padding:0 .35rem;height:1.4rem;border:1px solid var(--border);border-radius:3px;color:var(--muted);font-size:.72rem;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;margin-right:.65rem;max-width:16rem;.report-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.file-icon{flex-shrink:0}.brand-deepview{.bg{fill:#2563eb}.fg{fill:#fff}}.brand-claude{.bg{fill:#d97757}.fg{fill:#fff}}.brand-codex{.bg{fill:#fff;stroke:#000;stroke-width:.5}.fg{fill:#000}}.brand-vercel{.bg{fill:#000;stroke:#fff;stroke-width:.5}.fg{fill:#fff}}}.mark-action-group{display:inline-flex;border:1px solid var(--border);border-radius:3px;overflow:hidden;margin-right:.25rem}.mark-comment,.mark-fix,.mark-copy,.mark-claude{background:transparent;border:0;color:var(--muted);padding:0 .25rem;height:1.4rem;display:inline-flex;align-items:center;justify-content:center;&:not(:last-child){border-right:1px solid var(--border)}&:hover{color:var(--accent);background:var(--surface-active)}}.mark-comment.has-comment,.mark-fix.has-fix{color:var(--accent)}.mark-copy.copied,.mark-claude.copied{color:var(--green, #4ade80);background:color-mix(in srgb,var(--green, #4ade80) 14%,transparent)}.mark-comment.has-comment .bubble,.mark-fix.has-fix .wrench{fill:var(--accent);fill-opacity:.15}.mark-x{background:transparent;border:1px solid var(--border);color:var(--muted);border-radius:3px;padding:0 .35rem;font-size:.85rem;line-height:1.1;margin-left:.25rem;&:hover{color:var(--critical);border-color:var(--critical)}}.triage-menu-wrap{position:relative;display:inline-flex;margin-left:.25rem}.mark-triage-menu{background:transparent;border:1px solid var(--border);color:var(--muted);border-radius:3px;padding:0 .3rem;height:1.5rem;display:inline-flex;align-items:center;justify-content:center;gap:.25rem;font:inherit}.mark-triage-menu:hover{color:var(--text);border-color:var(--accent)}.mark-triage-menu.open{border-color:var(--accent);color:var(--text)}.mark-triage-menu.with-label{padding:0 .35rem 0 .5rem;font-size:.72rem;height:1.5rem}.mark-triage-menu .mark-triage-label{text-transform:uppercase;letter-spacing:.05em;font-weight:600}.mark-triage-menu.triage-state-deleted{border-color:var(--critical);color:var(--critical)}.mark-triage-menu.triage-state-fixed{border-color:var(--green, #4ade80);color:var(--green, #4ade80)}.mark-triage-menu.triage-state-invalid{border-color:var(--muted);color:var(--text)}.mark-triage-menu.triage-state-ignored{border-color:var(--accent, #2563eb);color:var(--accent, #2563eb)}.triage-menu[popover]{position:fixed;inset:auto;margin:0;min-width:7rem;background:var(--bg);border:1px solid var(--border);border-radius:4px;padding:.25rem;box-shadow:0 4px 12px #00000040;display:flex;flex-direction:column;gap:1px;-webkit-app-region:no-drag;app-region:no-drag}.triage-menu[popover]:not(:popover-open){display:none}.triage-menu[popover]:popover-open{display:flex}.triage-menu-item{background:transparent;border:0;padding:.35rem .5rem;font-size:.78rem;color:var(--text);text-align:left;border-radius:3px;font-family:inherit}.triage-menu-item:hover{background:var(--surface)}.triage-menu-item.active:before{content:"\\2713 ";color:var(--accent)}.triage-menu-fixed:hover{color:var(--green, #4ade80)}.triage-menu-invalid:hover{color:var(--muted)}.triage-menu-deleted:hover{color:var(--critical)}:host([context="focus"]) .triage-menu-wrap>.mark-triage-menu{display:none}:host([context="focus"]) .triage-menu-wrap{display:inline-flex}:host([context="focus"]) .triage-menu[popover]{position:static;inset:auto;display:inline-flex!important;flex-flow:row wrap;margin:0;padding:0;background:transparent;border:0;border-radius:0;box-shadow:none;min-width:0;gap:.25rem}:host([context="focus"]) .triage-menu-item{background:transparent;border:1px solid var(--border);padding:.2rem .5rem;border-radius:3px;font-size:.72rem;font-weight:500;text-transform:uppercase;letter-spacing:.04em}:host([context="focus"]) .triage-menu-item.active{background:rgb(from var(--accent) r g b / .12);border-color:var(--accent);color:var(--accent)}:host([context="focus"]) .triage-menu-item:hover{background:var(--surface-active)}:host([context="focus"]) .triage-menu-fixed.active{background:rgb(from var(--green, #4ade80) r g b / .12);border-color:var(--green, #4ade80);color:var(--green, #4ade80)}:host([context="focus"]) .triage-menu-deleted.active{background:rgb(from var(--critical) r g b / .12);border-color:var(--critical);color:var(--critical)}:host([context="focus"]) .triage-menu-item.active:before{content:"";margin:0}:host([context="focus"]) .marks{gap:.5rem;margin-top:.65rem;padding-left:0;padding-top:.55rem;border-top:1px solid var(--border);flex-wrap:wrap}:host([context="focus"]) .marks-commit-row{padding-left:0}:host([context="focus"]) .mark-comment,:host([context="focus"]) .mark-fix,:host([context="focus"]) .mark-copy,:host([context="focus"]) .mark-claude{height:1.75rem;padding:0 .55rem;gap:.35rem;display:inline-flex;align-items:center;font-size:.72rem}:host([context="focus"]) .mark-btn-label{color:inherit;font-weight:500;letter-spacing:.02em}:host([context="focus"].mark-red) .card{background:color-mix(in srgb,var(--mark-red-bg) 15%,var(--bg))}:host([context="focus"].mark-blue) .card{background:color-mix(in srgb,var(--mark-blue-bg) 15%,var(--bg))}:host([context="focus"].mark-green) .card{background:color-mix(in srgb,var(--mark-green-bg) 15%,var(--bg))}:host([context="focus"].mark-gray) .card{background:color-mix(in srgb,var(--mark-gray-bg) 15%,var(--bg))}.comment-block,.fix-block{margin-top:.5rem;padding:.35rem .55rem;border-left:3px solid var(--accent);background:rgb(from var(--accent) r g b / .08);border-radius:0 4px 4px 0;font-size:.82rem;color:var(--text)}.comment-block{white-space:pre-wrap}.fix-block{word-break:break-all;& a{color:var(--accent);text-decoration:none}& a:hover{text-decoration:underline}}.comment-label,.fix-label{color:var(--muted);font-weight:600;margin-right:.35rem}.mark-restore{background:transparent;border:1px solid var(--border);color:var(--muted);border-radius:3px;padding:0 .45rem;font-size:.75rem;line-height:1.3;margin-left:.25rem;&:hover{color:var(--green);border-color:var(--green)}}.line-num{color:var(--muted);font-size:.8rem}.line-num a{color:inherit}.line-num a:hover{color:var(--accent)}.npm-link{display:inline-block;padding:0 .4rem;border:1px solid var(--border);border-radius:3px;font-size:.72rem;font-weight:500;color:var(--muted);text-decoration:none}.npm-link:hover{border-color:var(--accent);color:var(--accent)}@media print{.card{break-inside:avoid;padding:.45rem .25rem}.finding-code-btn,.mark-copy,.mark-claude{display:none!important}.npm-link{border:0;padding:0}:host(.triage-fixed),:host(.triage-invalid),:host(.triage-deleted),:host(.triage-ignored){opacity:1}:host(.multi-case) .card:before{content:"Multiple reports of one finding";display:block;font-size:.7rem;font-weight:700;color:#555;text-transform:uppercase;letter-spacing:.06em;border-bottom:1px solid #bbb;padding-bottom:.2rem;margin-bottom:.35rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}.marks,.tabs{display:none!important}.tab-body{display:grid!important}.tab-body+.tab-body{margin-top:.5rem;padding-top:.5rem;border-top:1px dashed #999}:host([in-group].multi-case) .tab-body .line-row{display:flex}.line-row .discovered-in{flex-basis:100%;order:99}.print-case-label{display:block;grid-column:1 / -1;font-size:.65rem;font-weight:600;color:#555;background:#eee;padding:.1rem .35rem;border-radius:3px;margin-bottom:.25rem;letter-spacing:.04em;-webkit-print-color-adjust:exact;print-color-adjust:exact}.value-label{color:#777}.badge{-webkit-print-color-adjust:exact;print-color-adjust:exact;&.critical{background:#a30b0f!important;color:#fff!important}&.high{background:#b8400a!important;color:#fff!important}&.medium{background:#855107!important;color:#fff!important}&.low{background:#374151!important;color:#fff!important}&.high_bug{background:#7a3e0c!important;color:#fff!important}&.bug{background:#4d4538!important;color:#fff!important}&.informational{background:#0550ae!important;color:#fff!important}}a,.line-num,.line-num a{color:inherit}.inline-code{border:0;background:transparent;padding:0}}
85
+ `;var Zv=["finding","is-critical","mark-red","mark-blue","mark-green","mark-gray","has-conflict","triage-fixed","triage-invalid","triage-deleted","triage-ignored","multi-case"],Ac=class extends L{static properties={group:{attribute:!1},inGroup:{type:Boolean,attribute:"in-group",reflect:!0},context:{type:String,reflect:!0}};static styles=T(Hh);constructor(){super(),this.group=null,this.inGroup=!1,this.context=null}render(){if(!this.group)return c``;this.dataset.gid=Zr(this.group);let t=new Set(Mp(this.group));for(let r of Zv)this.classList.toggle(r,t.has(r));return c`<div class="card">${Lp(this.group,{context:this.context})}</div>`}connectedCallback(){super.connectedCallback(),this.hasUpdated&&this.requestUpdate()}};customElements.define("finding-card",Ac);var Vh=`:host{display:inline-flex;gap:4px;align-items:center}button{width:14px;height:14px;user-select:none;padding:0;background:transparent;border:1.5px solid currentcolor;border-radius:50%;opacity:.55;transition:opacity .12s,transform .12s}button:hover{opacity:1;transform:scale(1.12)}button.active{background:currentcolor;opacity:1;box-shadow:0 0 0 2px var(--surface),0 0 0 3px currentcolor}.color-red{color:var(--marker-red)}.color-blue{color:var(--marker-blue)}.color-green{color:var(--marker-green)}.color-gray{color:var(--marker-gray)}
86
+ `;var t0=["red","blue","green","gray"],Tc=class extends H{static properties={selected:{type:String}};static styles=T(Vh);constructor(){super(),this.selected=null}render(){return c`${t0.map(t=>c`<button type="button" class="${`color-${t}${this.selected===t?" active":""}`}" data-color="${t}" title="${`mark ${t}`}" @click="${this._onClick}"></button>`)}`}_onClick=t=>{let r=t.currentTarget.dataset.color;this.dispatchEvent(new CustomEvent("mark-color",{detail:{color:r},bubbles:!0,composed:!0}))}};customElements.define("color-marker",Tc);var Ic=class extends L{createRenderRoot(){return this}render(){let t=a.filterConfMin,r=a.filterConfMax;return c`<span class="conf-range-label">Confidence</span><range-slider id="conf-range" min="0" max="10" step="1" low="${t}" high="${r}" aria-label="Confidence range"></range-slider><conf-range-mirror id="conf-range-vals" class="conf-vals" for="conf-range" .low="${t}" .high="${r}"></conf-range-mirror>`}};customElements.define("conf-filter",Ic);var jh={files:"Filter files\u2026",code:"Search code\u2026",issues:"Search issues\u2026"},Kh={files:"Filter files",code:"Search code",issues:"Search issues"},r0=c`<svg class="bundle-code-search-icon" viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><circle cx="6.5" cy="6.5" r="4.5"/><path d="M9.7 9.7L13 13" stroke-linecap="round"/></svg>`,n0={files:c`<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 4.5a1 1 0 0 1 1-1h3.2l1.3 1.5H13a1 1 0 0 1 1 1V12a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4.5Z"/></svg>`,code:c`<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5.5 4.5L2 8l3.5 3.5"/><path d="M10.5 4.5L14 8l-3.5 3.5"/></svg>`,issues:c`<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.3" aria-hidden="true"><circle cx="8" cy="8" r="6"/><path d="M8 4.8v3.6" stroke-linecap="round"/><circle cx="8" cy="11" r=".7" fill="currentColor" stroke="none"/></svg>`},Rc=class extends L{static properties={modes:{attribute:!1}};createRenderRoot(){return this}constructor(){super(),this.modes=[]}render(){let t=a.bundleCodeSearchQuery,r=a.bundleCodeSearchMode,n=this.modes.includes(r)?r:"files",o=jh[n]??jh.files;return c`${r0} <input type="text" class="bundle-code-search-input" placeholder="${o}" aria-label="${o}" .value="${Te(t)}" @input="${this._onInput}"> ${t?c`<button type="button" class="bundle-code-search-clear" title="Clear search" aria-label="Clear search" @click="${this._onClear}">×</button>`:g} ${this.modes.length>0?c`<span class="bundle-code-search-modes" role="tablist">${this.modes.map(s=>c`<button type="button" class="${F({"bundle-code-search-mode":!0,active:n===s})}" role="tab" aria-selected="${String(n===s)}" title="${Kh[s]??s}" aria-label="${Kh[s]??s}" @click="${()=>this._selectMode(s)}">${n0[s]??g}</button>`)}</span>`:g}`}_onInput=t=>{this._dispatchInput(t.target.value)};_onClear=()=>{this._dispatchInput("")};_dispatchInput(t){this.dispatchEvent(new CustomEvent("search-input",{detail:{kind:"bundle-code",value:t},bubbles:!0,composed:!0}))}_selectMode(t){this.dispatchEvent(new CustomEvent("bundle-search-mode-change",{detail:{mode:t},bubbles:!0,composed:!0}))}};customElements.define("bundle-code-search",Rc);var qh={packages:{stateKey:"packagesSearchQuery",label:"Filter packages"},repositories:{stateKey:"repositoriesSearchQuery",label:"Filter repositories"}},Bc=class extends L{static properties={kind:{type:String}};createRenderRoot(){return this}constructor(){super(),this.kind=""}render(){let t=qh[this.kind];return t?c`<input type="search" class="packages-search" placeholder="${`${t.label}\u2026`}" aria-label="${t.label}" .value="${Te(a[t.stateKey])}" @input="${this._onInput}">`:(console.warn(`<entity-search>: unknown kind ${JSON.stringify(this.kind)}; expected one of ${Object.keys(qh).map(r=>JSON.stringify(r)).join(", ")}.`),g)}_onInput=t=>{this.dispatchEvent(new CustomEvent("search-input",{detail:{kind:this.kind,value:t.target.value},bubbles:!0,composed:!0}))}};customElements.define("entity-search",Bc);var o0=[["findings-desc","Findings \u2193"],["files-desc","Files \u2193"],["reports-desc","Reports \u2193"],["name-asc","Name A\u2192Z"]],Gh={packages:{stateKey:"packagesSortBy",aria:"Sort packages"},repositories:{stateKey:"repositoriesSortBy",aria:"Sort repositories"}},Fc=class extends L{static properties={kind:{type:String}};createRenderRoot(){return this}constructor(){super(),this.kind=""}render(){let t=Gh[this.kind];return t?c`<select class="packages-sort" aria-label="${t.aria}" .value="${Te(a[t.stateKey])}" @change="${this._onChange}">${o0.map(([r,n])=>c`<option value="${r}">${n}</option>`)}</select>`:(console.warn(`<entity-sort>: unknown kind ${JSON.stringify(this.kind)}; expected one of ${Object.keys(Gh).map(r=>JSON.stringify(r)).join(", ")}.`),g)}_onChange=t=>{this.dispatchEvent(new CustomEvent("sort-change",{detail:{kind:this.kind,value:t.target.value},bubbles:!0,composed:!0}))}};customElements.define("entity-sort",Fc);var Mc=class extends L{static properties={showFile:{type:Boolean,attribute:"show-file"},showConfidence:{type:Boolean,attribute:"show-confidence"},showPriority:{type:Boolean,attribute:"show-priority"}};createRenderRoot(){return this}constructor(){super(),this.showFile=!1,this.showConfidence=!1,this.showPriority=!1}render(){let t=(r,n)=>c`<option value="${r}">${n}</option>`;return c`<select class="sort-select" aria-label="Sort findings" .value="${Te(a.sortBy)}" @change="${this._onChange}">${t("severity","Severity \u2193")} ${this.showFile?t("file","File \u2191"):g} ${this.showConfidence?c`${t("confidence-desc","Confidence \u2193")}${t("confidence-asc","Confidence \u2191")}`:g} ${this.showPriority?c`${t("priority-desc","Priority \u2193")}${t("priority-asc","Priority \u2191")}`:g}</select>`}_onChange=t=>{this.dispatchEvent(new CustomEvent("sort-change",{detail:{kind:"findings",value:t.target.value},bubbles:!0,composed:!0}))}};customElements.define("findings-sort",Mc);var Yh=`:host{display:inline-flex;align-items:center;width:8.5rem;height:16px;--rs-thumb-size: 14px;--rs-track-height: 3px;--rs-rail: rgb(from currentcolor r g b / .25);--rs-fill: var(--accent, currentColor)}.track-wrap{position:relative;flex:1;height:var(--rs-thumb-size)}.track{position:absolute;left:0;right:0;top:50%;height:var(--rs-track-height);transform:translateY(-50%);border-radius:99px;background:linear-gradient(to right,var(--rs-rail) 0,var(--rs-rail) var(--low, 0%),var(--rs-fill) var(--low, 0%),var(--rs-fill) var(--high, 100%),var(--rs-rail) var(--high, 100%))}input[type=range]{appearance:none;-webkit-appearance:none;position:absolute;left:0;right:0;top:0;width:100%;height:var(--rs-thumb-size);background:transparent;pointer-events:none;margin:0;padding:0;outline:none}input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;pointer-events:auto;width:var(--rs-thumb-size);height:var(--rs-thumb-size);border-radius:50%;background:var(--rs-fill);border:0;box-shadow:0 1px 3px #00000080}input[type=range]::-moz-range-thumb{pointer-events:auto;width:var(--rs-thumb-size);height:var(--rs-thumb-size);border-radius:50%;background:var(--rs-fill);border:0;box-shadow:0 1px 3px #00000080}input[type=range]::-webkit-slider-runnable-track{background:transparent;height:var(--rs-thumb-size)}
87
+ `;var Lc=class extends H{static properties={min:{type:Number},max:{type:Number},step:{type:Number},low:{type:Number},high:{type:Number}};static styles=T(Yh);constructor(){super(),this.min=0,this.max=100,this.step=1,this.low=0,this.high=100}willUpdate(){this.low<this.min&&(this.low=this.min),this.high>this.max&&(this.high=this.max),this.low>this.high&&(this.low=this.high)}render(){let t=this.max-this.min||1,r=(this.low-this.min)/t*100,n=(this.high-this.min)/t*100;return c`<div class="track-wrap" style="${`--low:${r}%;--high:${n}%`}"><div class="track"></div><input type="range" min="${this.min}" max="${this.max}" step="${this.step}" @input="${this._onInput}" @change="${this._onChange}"> <input type="range" min="${this.min}" max="${this.max}" step="${this.step}" @input="${this._onInput}" @change="${this._onChange}"></div>`}firstUpdated(){this._inputs=[...this.renderRoot.querySelectorAll('input[type="range"]')],this._inputs[0].value=this.low,this._inputs[1].value=this.high}updated(t){if(!this._inputs||!(t.has("low")||t.has("high")))return;let r=this._inputs.map(i=>Number(i.value)),n=r[0]>r[1],o=n?1:0,s=n?0:1;this.low!==r[o]&&(this._inputs[o].value=this.low),this.high!==r[s]&&(this._inputs[s].value=this.high)}_onInput=()=>{let t=Number(this._inputs[0].value),r=Number(this._inputs[1].value);this.low=Math.min(t,r),this.high=Math.max(t,r),this._emit("range-input")};_onChange=()=>{this._emit("range-change")};_emit(t){this.dispatchEvent(new CustomEvent(t,{detail:{low:this.low,high:this.high},bubbles:!0,composed:!0}))}};customElements.define("range-slider",Lc);var Pc=class extends H{static properties={low:{type:Number},high:{type:Number},for:{type:String}};createRenderRoot(){return this}constructor(){super(),this.low=0,this.high=10,this.for="conf-range",this._dragging=!1,this._liveLow=0,this._liveHigh=10}connectedCallback(){super.connectedCallback(),document.addEventListener("range-input",this._onRangeInput),document.addEventListener("range-change",this._onRangeChange)}disconnectedCallback(){super.disconnectedCallback(),document.removeEventListener("range-input",this._onRangeInput),document.removeEventListener("range-change",this._onRangeChange)}willUpdate(t){this._dragging&&(t.has("low")&&this.low!==this._liveLow&&(this.low=this._liveLow),t.has("high")&&this.high!==this._liveHigh&&(this.high=this._liveHigh))}_onRangeInput=t=>{t.target?.id===this.for&&(this._dragging=!0,this._liveLow=t.detail.low,this._liveHigh=t.detail.high,this.low=t.detail.low,this.high=t.detail.high)};_onRangeChange=t=>{t.target?.id===this.for&&(this._dragging=!1)};render(){return c`<span>${this.low}</span><span class="dash">–</span><span>${this.high}</span>`}};customElements.define("conf-range-mirror",Pc);var Jh=`dialog{max-width:560px;width:min(94vw,560px)}header h3{margin:0 0 .25rem}header p{margin:0 0 .9rem;color:var(--muted);font-size:.82rem}hr{border:0;border-top:1px solid var(--border);margin:.9rem 0}.section h4{margin:0 0 .25rem;font-size:.82rem;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--muted)}.section p{margin:0 0 .55rem;color:var(--muted);font-size:.78rem}.section button{background:transparent;border:1px solid var(--border);color:var(--text);border-radius:5px;padding:.35rem .9rem;font:inherit;font-size:.8rem;&:hover{border-color:var(--accent);color:var(--accent)}&.primary{background:var(--accent);color:var(--surface);border-color:var(--accent)}&.primary:hover{filter:brightness(1.08)}&:disabled{opacity:.5}}input[type=file]{display:block;color:var(--text);font:inherit;font-size:.78rem;margin-bottom:.5rem}.error{margin:.5rem 0;padding:.4rem .6rem;border:1px solid var(--critical, #f87171);border-radius:5px;background:rgb(from var(--critical, #f87171) r g b / .07);color:var(--text);font-size:.78rem}.summary{margin:.5rem 0;font-size:.82rem;& strong{color:var(--text)}.meta{margin-left:.4rem;color:var(--muted);font-size:.74rem}}.mode{border:1px solid var(--border);border-radius:6px;padding:.55rem .7rem;margin:.55rem 0 .7rem;display:flex;flex-direction:column;gap:.35rem}.mode legend{padding:0 .35rem;font-size:.68rem;color:var(--muted);text-transform:uppercase;letter-spacing:.08em}.mode label{display:flex;align-items:flex-start;gap:.5rem;font-size:.82rem;& em{color:var(--muted);font-style:normal;font-size:.74rem}}.status{margin:.8rem 0 0;padding:.4rem .6rem;border-radius:5px;font-size:.78rem;&.status-ok{border:1px solid var(--accent);background:rgb(from var(--accent) r g b / .08);color:var(--text)}&.status-err{border:1px solid var(--critical, #f87171);background:rgb(from var(--critical, #f87171) r g b / .07);color:var(--text)}}.actions{display:flex;justify-content:flex-end;gap:.4rem;margin-top:.8rem;padding-top:.7rem;border-top:1px solid var(--border)}.actions button{background:transparent;border:1px solid var(--border);color:var(--text);border-radius:5px;padding:.3rem .8rem;font:inherit;font-size:.78rem;&:hover{border-color:var(--accent);color:var(--accent)}}
88
+ `;var Oc=class extends I{static styles=[...I.styles,T(Jh)];static properties={parsed:{state:!0},parseError:{state:!0},mode:{state:!0},busy:{state:!0},status:{state:!0}};constructor(){super(),this.parsed=null,this.parseError=null,this.mode="prefer-current",this.busy=!1,this.status=null}focusInitial(){this.renderRoot.querySelector("button.primary")?.focus()}async _onDownload(){this.busy=!0,this.status=null;try{let{blob:t,filename:r}=await Xa();Rr(t,r),this.status={kind:"ok",text:`Downloaded ${r}`}}catch(t){this.status={kind:"err",text:`Export failed: ${t.message}`}}finally{this.busy=!1}}async _onFile(t){let r=t.target.files?.[0];if(this.parsed=null,this.parseError=null,this.status=null,!!r)try{this.parsed=await Qa(r)}catch(n){this.parseError=n.message}}_onMode(t){this.mode=t.target.value}async _onApply(){if(!(!this.parsed||this.busy)){this.busy=!0,this.status=null;try{let t=await Za(this.parsed,this.mode);k(),this.status=t.repoUrlError?{kind:"err",text:`Applied ${t.triageEntries} triage entries (${this.mode}), but saving repo URLs failed: ${t.repoUrlError.message}`}:{kind:"ok",text:`Applied ${t.triageEntries} triage entries and ${t.repoUrls} repo URLs (${this.mode}).`},this.parsed=null;let r=this.renderRoot.querySelector('input[type="file"]');r&&(r.value="")}catch(t){this.status={kind:"err",text:`Import failed: ${t.message}`}}finally{this.busy=!1}}}render(){let t=this.parsed;return c`<dialog @close="${this._onClose}"><header><h3>Triage backup</h3><p>Bundles every triage entry (markers, triage states, comments, fixes, per-report ignores) and all saved repo URLs into a single gzipped JSON file.</p></header><section class="section"><h4>Export</h4><p>Download the current triage + repo-URL set as a portable backup.</p><button type="button" class="primary" @click="${this._onDownload}" ?disabled="${this.busy}">${this.busy?"Working\u2026":"Download backup"}</button></section><hr><section class="section"><h4>Import</h4><p>Pick a previously-exported backup. Nothing is applied until you click Apply.</p><input type="file" accept=".gz,application/gzip" @change="${this._onFile}" ?disabled="${this.busy}"> ${this.parseError?c`<div class="error">Failed to parse: ${this.parseError}</div>`:g} ${t?c`<div class="summary">Found <strong>${Object.keys(t.triage).length}</strong> triage entries and <strong>${Object.keys(t.repoUrls).length}</strong> repo URLs. ${t.exportedAt?c`<span class="meta">Exported ${t.exportedAt}.</span>`:g}</div><fieldset class="mode"><legend>Merge mode</legend><label><input type="radio" name="te-mode" value="prefer-current" .checked="${this.mode==="prefer-current"}" @change="${this._onMode}"> <span>Merge — keep current on conflict <em>(safest, only fills gaps)</em></span></label> <label><input type="radio" name="te-mode" value="prefer-imported" .checked="${this.mode==="prefer-imported"}" @change="${this._onMode}"> <span>Merge — prefer imported on conflict <em>(overwrites where both have a value)</em></span></label> <label><input type="radio" name="te-mode" value="replace" .checked="${this.mode==="replace"}" @change="${this._onMode}"> <span>Replace all <em>(drops every current persisted entry first — destructive)</em></span></label></fieldset><button type="button" class="primary" @click="${this._onApply}" ?disabled="${this.busy}">${this.busy?"Applying\u2026":"Apply import"}</button>`:g}</section>${this.status?c`<div class="${`status status-${this.status.kind}`}">${this.status.text}</div>`:g}<footer class="actions"><button type="button" @click="${this._onClose}">Close</button></footer></dialog>`}};customElements.define("triage-export-dialog",Oc);function Xh(){return q("triage-export-dialog")}var Qh=`:host{display:inline-block;vertical-align:middle;position:relative}.chip{display:inline-flex;align-items:center;gap:.375rem;cursor:default;user-select:none;min-height:24px;box-sizing:border-box;padding:.125rem .375rem .125rem .5rem;background:var(--surface);border:1px solid var(--border);border-radius:999px;color:var(--text);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.72rem;font-weight:500}.chip svg{color:var(--muted);flex-shrink:0}.chip.empty:hover{border-color:var(--accent)}.chip.empty .label{color:var(--muted);font-style:italic}.chip.readonly{padding-right:.5rem}.edit-btn{width:18px;height:18px;display:grid;place-items:center;padding:0;margin-left:.125rem;background:transparent;border:0;border-radius:4px;color:var(--muted)}.edit-btn:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}.chip[inert]{visibility:hidden;min-width:19rem}input{position:absolute;inset:0;box-sizing:border-box;padding:0 .55rem;background:var(--surface);border:1px solid var(--accent);border-radius:999px;color:var(--text);font:inherit;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.72rem;font-weight:400;outline:none}@media print{.chip{color:#000!important;border:0!important}.chip svg{color:#000!important}.edit-btn,input{display:none!important}}
89
+ `;function Nc(e){if(!e)return"";let t=e.match(/github\.com\/([^/?#]+\/[^/?#]+?)(?:\.git)?(?:[/?#]|$)/iu);return t?t[1]:e}var Dc=c`<svg viewBox="0 0 16 16" width="12" height="12" fill="currentColor" aria-hidden="true"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"/></svg>`,Zh=c`<svg viewBox="0 0 16 16" width="11" height="11" fill="currentColor" aria-hidden="true"><path d="M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.086a1.75 1.75 0 0 1 0 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 0 1-.927-.928l.929-3.25c.082-.286.235-.547.445-.758l8.61-8.61z"/></svg>`,Uc=class extends H{static properties={url:{type:String},editable:{type:Boolean,reflect:!0},editing:{type:Boolean,reflect:!0}};static styles=T(Qh);constructor(){super(),this.url="",this.editable=!1,this.editing=!1,this._opener=""}render(){if(this.editable&&this.editing){let t=!!this.url,r=t?Nc(this.url):"Set repo";return c`<span class="${t?"chip":"chip empty"}" aria-hidden="true" inert>${Dc} <span class="label">${r}</span> <button type="button" class="edit-btn">${Zh}</button> </span><input type="text" .value="${Te(this.url)}" placeholder="user/repo or https://github.com/user/repo" @input="${this._onInput}" @focus="${this._onFocus}" @keydown="${this._onKeydown}" @blur="${this._onBlur}">`}if(this.editable){let t=!!this.url,r=t?Nc(this.url):"Set repo";return c`<span class="${t?"chip":"chip empty"}" @click="${t?null:this._onEdit}">${Dc} <span class="label">${r}</span> <button type="button" class="edit-btn" title="Edit repo URL" aria-label="Edit repo URL" @click="${this._onEdit}">${Zh}</button></span>`}return this.url?c`<span class="chip readonly" title="Repo from findings (read-only)">${Dc} <span class="label">${Nc(this.url)}</span></span>`:g}updated(t){if(t.has("editing")&&this.editing){let r=this.renderRoot.querySelector("input");r&&(r.focus(),r.select())}}_onEdit=t=>{t&&t.stopPropagation(),this._emit("repo-edit-start")};_onFocus=t=>{this._opener=t.target.value};_onInput=t=>{this.url=t.target.value,this._emit("repo-input",{url:this.url})};_onKeydown=t=>{t.key==="Enter"?(t.preventDefault(),this._emit("repo-commit",{url:this.url})):t.key==="Escape"&&(t.preventDefault(),this.url=this._opener,this._emit("repo-cancel",{url:this._opener}))};_onBlur=()=>{this.editing&&this._emit("repo-commit",{url:this.url})};_emit(t,r){this.dispatchEvent(new CustomEvent(t,{detail:r,bubbles:!0,composed:!0}))}};customElements.define("repo-chip",Uc);function tt(e,t){for(let[r,n]of Object.entries(t))e.hasAttribute(r)||e.setAttribute(r,n)}var l0=[["critical","Critical"],["high","High"],["medium","Medium"],["low","Low"],["high_bug","High bug"],["bug","Bug"],["informational","Info"]],zc=class extends L{static properties={counts:{attribute:!1},selected:{attribute:!1},kind:{type:String}};createRenderRoot(){return this}constructor(){super(),this.counts={},this.selected=[],this.kind="findings"}connectedCallback(){super.connectedCallback(),tt(this,{role:"group","aria-label":"Filter by severity"})}render(){let t=this.kind==="graph"?new Set(this.selected):a.filterSeverities,r=l0.filter(([n])=>(this.counts[n]??0)||t.has(n));return r.length===0?g:c`${r.map(([n,o])=>{let s=this.counts[n]??0,i=t.has(n);return c`<button type="button" class="${F({"sev-chip":!0,[n]:!0,active:i})}" aria-pressed="${String(i)}" @click="${()=>this._toggle(n)}"><span class="sd"></span><span class="name">${o}</span><span class="n">${s}</span></button>`})}`}_toggle(t){this.dispatchEvent(new CustomEvent("severity-toggle",{detail:{severity:t,kind:this.kind},bubbles:!0,composed:!0}))}};customElements.define("severity-chips",zc);var c0=c`<svg class="trash-icon" viewBox="0 0 16 16" width="11" height="11" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 4h10M6.5 4V2.5h3V4M5 4l.7 9h4.6L11 4"/></svg>`,Wc=class extends L{createRenderRoot(){return this}render(){let t=a.currentView==="bundles"&&a.selectedBundle,r=!a.currentFile&&!t;return c`<button type="button" class="danger" ?disabled="${r}">${c0}<span>Delete current</span></button>`}};customElements.define("sidebar-delete-current",Wc);var d0=c`<svg viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 6h12v7a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V6Z"/><path d="M2 6l1.6-3.3A1.3 1.3 0 0 1 4.8 2h6.4a1.3 1.3 0 0 1 1.2.7L14 6"/><path d="M8 2v4"/></svg>`,u0=c`<svg viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="4" x2="4" y1="2.5" y2="10"/><circle cx="12" cy="4" r="2"/><circle cx="4" cy="12" r="2"/><path d="M12 6a6 6 0 0 1-6 6"/></svg>`,eg={packages:{title:"Show packages",icon:d0,view:"packages"},repositories:{title:"Show repositories",icon:u0,view:"repositories"}},Hc=class extends L{static properties={kind:{type:String},count:{type:Number}};createRenderRoot(){return this}constructor(){super(),this.kind="",this.count=0}render(){if(this.count===0)return g;let t=eg[this.kind];if(!t)return console.warn(`<sidebar-view-button>: unknown kind ${JSON.stringify(this.kind)}; expected one of ${Object.keys(eg).map(n=>JSON.stringify(n)).join(", ")}.`),g;let r=a.currentView===t.view;return c`<button type="button" class="${F({"sidebar-view-btn":!0,active:r})}" title="${t.title}" aria-label="${t.title}">${t.icon}<span class="view-btn-count">${this.count}</span></button>`}};customElements.define("sidebar-view-button",Hc);var p0=["invalid","deleted"],tg={package:{stateKey:"packageSlideTriage"},repository:{stateKey:"repositorySlideTriage"}},Vc=class extends L{static properties={counts:{attribute:!1},kind:{type:String}};createRenderRoot(){return this}constructor(){super(),this.counts={},this.kind=""}connectedCallback(){super.connectedCallback(),tt(this,{role:"group","aria-label":"Triage view"})}render(){let t=tg[this.kind];if(!t)return console.warn(`<slide-triage-tabs>: unknown kind ${JSON.stringify(this.kind)}; expected one of ${Object.keys(tg).map(o=>JSON.stringify(o)).join(", ")}.`),g;let r=a[t.stateKey],n=p0.filter(o=>(this.counts[o]??0)>0||r===o);return n.length===0?g:c`${n.map(o=>{let s=r===o,i=this.counts[o]??0;return c`<button type="button" class="${F({"triage-state-btn":!0,[`triage-state-${o}`]:!0,active:s})}" title="${s?`Exit ${o} view`:`Show ${o} (${i})`}" aria-pressed="${String(s)}" @click="${()=>this._toggle(o)}">${o.charAt(0).toUpperCase()+o.slice(1)} (${i})</button>`})}`}_toggle(t){this.dispatchEvent(new CustomEvent("slide-triage-toggle",{detail:{kind:this.kind,value:t},bubbles:!0,composed:!0}))}};customElements.define("slide-triage-tabs",Vc);var f0=[["own","Sources"],["modules","Dependencies"]],jc=class extends L{createRenderRoot(){return this}connectedCallback(){super.connectedCallback(),tt(this,{role:"group","aria-label":"Source filter"})}render(){return c`${f0.map(([t,r])=>{let n=a.filterSources.has(t);return c`<button type="button" class="${F({"source-chip":!0,active:n})}" aria-pressed="${String(n)}" @click="${()=>this._toggle(t)}">${r}</button>`})}`}_toggle(t){this.dispatchEvent(new CustomEvent("source-toggle",{detail:{source:t},bubbles:!0,composed:!0}))}};customElements.define("source-filter",jc);var h0=c`<svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="11" cy="11" r="7"/><path d="m20 20-3.5-3.5"/></svg>`,rg={findings:{stateKey:"filterInclude",placeholder:"Search findings\u2026"},files:{stateKey:"filesSearch",placeholder:"Search files\u2026"}},Kc=class extends L{static properties={kind:{type:String}};createRenderRoot(){return this}constructor(){super(),this.kind=""}render(){let t=rg[this.kind];return t?c`${h0} <input type="text" aria-label="${t.placeholder}" placeholder="${t.placeholder}" .value="${Te(a[t.stateKey])}" @input="${this._onInput}">`:(console.warn(`<toolbar-search>: unknown kind ${JSON.stringify(this.kind)}; expected one of ${Object.keys(rg).map(r=>JSON.stringify(r)).join(", ")}.`),g)}_onInput=t=>{this.dispatchEvent(new CustomEvent("search-input",{detail:{kind:this.kind,value:t.target.value},bubbles:!0,composed:!0}))}};customElements.define("toolbar-search",Kc);function g0(e){if(!e)return"";let t=e.match(/github\.com\/([^/?#]+\/[^/?#]+?)(?:\.git)?(?:[/?#]|$)/iu);return t?t[1]:e}var qc=class extends L{static properties={options:{attribute:!1}};createRenderRoot(){return this}constructor(){super(),this.options=[]}render(){return c`<select class="sort-select" aria-label="Filter by repository" .value="${Te(a.filterRepo)}" @change="${this._onChange}"><option value="">All repositories</option>${this.options.map(t=>{let r=t??so,n=t==null?"(no repo)":g0(t);return c`<option value="${r}">${n}</option>`})}</select>`}_onChange=t=>{this.dispatchEvent(new CustomEvent("repo-change",{detail:{value:t.target.value},bubbles:!0,composed:!0}))}};customElements.define("repo-filter",qc);var ng=[["none","none","unmarked"],["red","r","red"],["blue","b","blue"],["green","g","green"],["gray","x","gray"]],Gc=class extends L{static properties={counts:{attribute:!1},selected:{attribute:!1},kind:{type:String}};createRenderRoot(){return this}constructor(){super(),this.counts={},this.selected=[],this.kind="findings"}connectedCallback(){super.connectedCallback(),tt(this,{role:"group","aria-label":"Filter by mark color"})}render(){let t=this.kind==="graph"?new Set(this.selected):a.filterColors;return ng.some(([n])=>(this.counts[n]??0)||t.has(n))?c`${ng.map(([n,o,s])=>{let i=this.counts[n]??0,l=t.has(n);return c`<button type="button" class="${l?"active":""}" title="${`${s} (${i})`}" aria-pressed="${String(l)}" @click="${()=>this._toggle(n)}"><span class="${`td ${o}`}"></span><span class="count">${i}</span></button>`})}`:g}_toggle(t){this.dispatchEvent(new CustomEvent("color-toggle",{detail:{color:t,kind:this.kind},bubbles:!0,composed:!0}))}};customElements.define("triage-filter",Gc);var m0=["fixed","invalid","deleted","ignored"],Yc={graph:"graph2-triage-selector",packages:"packages-triage-selector"},Jc=class extends L{static properties={counts:{attribute:!1},states:{attribute:!1},variant:{type:String}};createRenderRoot(){return this}constructor(){super(),this.counts={},this.states=null,this.variant=""}connectedCallback(){super.connectedCallback(),tt(this,{role:"group","aria-label":"Triage view"})}render(){let t=this.states??m0,r=t.reduce((o,s)=>o+(this.counts[s]??0),0),n=this.variant?Yc[this.variant]:null;this.variant&&n===void 0&&console.warn(`<triage-selector>: unknown variant ${JSON.stringify(this.variant)}; expected one of ${Object.keys(Yc).map(o=>JSON.stringify(o)).join(", ")} or "".`);for(let o of Object.values(Yc))this.classList.toggle(o,o===n);return r===0&&!a.shownTriage?g:c`${t.map(o=>{let s=this.counts[o]??0,i=a.shownTriage===o;return s===0&&!i?g:c`<button type="button" class="${F({"triage-state-btn":!0,[`triage-state-${o}`]:!0,active:i})}" data-triage-show="${o}" title="${i?`Exit ${o} view`:`Show ${o} (${s})`}" aria-pressed="${String(i)}">${o.charAt(0).toUpperCase()+o.slice(1)} (${s})</button>`})}`}};customElements.define("triage-selector",Jc);var b0={table:c`<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><rect x="3" y="3" width="18" height="18" rx="2"/><line x1="3" x2="21" y1="9" y2="9"/><line x1="3" x2="21" y1="15" y2="15"/><line x1="9" x2="9" y1="3" y2="21"/></svg>`,list:c`<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><line x1="3" x2="21" y1="6" y2="6"/><line x1="3" x2="21" y1="12" y2="12"/><line x1="3" x2="21" y1="18" y2="18"/></svg>`,grouped:c`<svg viewBox="0 0 16 16" width="16" height="16" fill="currentColor" aria-hidden="true"><rect x="2" y="1.5" width="12" height="2" rx=".4"/><rect x="5" y="4.4" width="9" height="1.3"/><rect x="5" y="6.2" width="9" height="1.3"/><rect x="2" y="8.5" width="12" height="2" rx=".4"/><rect x="5" y="11.4" width="9" height="1.3"/><rect x="5" y="13.2" width="9" height="1.3"/></svg>`,kanban:c`<svg viewBox="0 0 16 16" width="16" height="16" fill="currentColor" aria-hidden="true"><rect x="1.5" y="2" width="3.8" height="12" rx=".6" fill="none" stroke="currentColor" stroke-width="1"/><rect x="6.1" y="2" width="3.8" height="12" rx=".6" fill="none" stroke="currentColor" stroke-width="1"/><rect x="10.7" y="2" width="3.8" height="12" rx=".6" fill="none" stroke="currentColor" stroke-width="1"/><rect x="2.4" y="3.6" width="2" height="1.4" rx=".2"/><rect x="2.4" y="5.6" width="2" height="1.4" rx=".2"/><rect x="7" y="3.6" width="2" height="1.4" rx=".2"/><rect x="11.6" y="3.6" width="2" height="1.4" rx=".2"/><rect x="11.6" y="5.6" width="2" height="1.4" rx=".2"/><rect x="11.6" y="7.6" width="2" height="1.4" rx=".2"/></svg>`,focus:c`<svg viewBox="0 0 16 16" width="16" height="16" fill="currentColor" aria-hidden="true"><rect x="1.5" y="2.5" width="8.5" height="11" rx=".6" fill="none" stroke="currentColor" stroke-width="1"/><rect x="3" y="4.4" width="5.5" height="1"/><rect x="3" y="6.4" width="5.5" height="1"/><rect x="3" y="8.4" width="3.5" height="1"/><rect x="11.2" y="2.5" width="3.3" height="2.5" rx=".4" fill="currentColor" opacity=".55"/><rect x="11.2" y="5.7" width="3.3" height="2.5" rx=".4" fill="currentColor" opacity=".35"/><rect x="11.2" y="8.9" width="3.3" height="2.5" rx=".4" fill="currentColor" opacity=".22"/></svg>`,graph:c`<svg viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" aria-hidden="true"><line x1="4.5" y1="4.5" x2="11.5" y2="6.5"/><line x1="4.5" y1="4.5" x2="6.5" y2="11.5"/><line x1="11.5" y1="6.5" x2="6.5" y2="11.5"/><circle cx="4.5" cy="4.5" r="2" fill="currentColor"/><circle cx="11.5" cy="6.5" r="2" fill="currentColor"/><circle cx="6.5" cy="11.5" r="2" fill="currentColor"/></svg>`},og={table:"Table view (compact rows, click a row to expand)",list:"List view (flat, one card per finding)",grouped:"List view, grouped by file",focus:"Focus view (one finding centered + a queue of next findings)",kanban:"Kanban board, columns grouped by triage status",graph:"Graph view (canvas with imports / exports)"},Xc=["table","list","grouped","focus","kanban","graph"],Qc=class extends L{static properties={modes:{type:String},kind:{type:String}};createRenderRoot(){return this}constructor(){super(),this.modes=Xc.join(","),this.kind="findings"}connectedCallback(){super.connectedCallback(),tt(this,{role:"group","aria-label":"View mode"})}render(){let t=this.kind==="files"?a.filesViewMode:a.viewMode,r=this.modes.split(",").map(o=>o.trim()).filter(o=>Xc.includes(o)),n=r.length>0?r:Xc;return c`${n.map(o=>c`<button type="button" class="${F({"view-mode-btn":!0,active:t===o})}" title="${og[o]}" aria-label="${og[o]}" aria-pressed="${String(t===o)}" @click="${()=>this._select(o,t)}">${b0[o]}</button>`)}`}_select(t,r){t!==r&&this.dispatchEvent(new CustomEvent("view-mode-change",{detail:{mode:t,kind:this.kind},bubbles:!0,composed:!0}))}};customElements.define("view-mode-buttons",Qc);var y0=6,sg=14,gi=2,ig=24,Eo=4;function w0(e){let t=/^#?([0-9a-f]{6})$/iu.exec(e);if(!t)return"#fff";let r=parseInt(t[1],16),n=r>>16&255,o=r>>8&255,s=r&255;return(.2126*n+.7152*o+.0722*s)/255>.6?"#1a1a1a":"#fff"}function v0(e,t,r,n){let o=r*r,s=n*n;return Math.max(s*e/o,o/(s*t))}function ag(e,t){let r=[],n=e.filter(f=>f.value>0),{x:o,y:s,w:i,h:l}=t;if(n.length===0||i<=0||l<=0)return r;let d=0;for(let f of n)d+=f.value;let u=i*l/d,p=0;for(;p<n.length&&i>.5&&l>.5;){let f=Math.min(i,l),h=p,b=0,m=0,y=1/0,$=1/0;for(;h<n.length;){let v=n[h].value*u,S=v>m?v:m,C=v<y?v:y,R=v0(S,C,b+v,f);if(h===p||R<=$)$=R,b+=v,m=S,y=C,h++;else break}let w=b/f;if(i>=l){let v=s;for(let S=p;S<h;S++){let C=S===h-1?s+l-v:n[S].value*u/w;r.push({node:n[S],x:o,y:v,w,h:C}),v+=C}o+=w,i-=w}else{let v=o;for(let S=p;S<h;S++){let C=S===h-1?o+i-v:n[S].value*u/w;r.push({node:n[S],x:v,y:s,w:C,h:w}),v+=C}s+=w,l-=w}p=h}return r}function lg(e){for(;e.children&&e.children.size===1;){let t=e.children.values().next().value;if(t.isFile)break;e.name=`${e.name}/${t.name}`,e.children=t.children}if(e.children)for(let t of e.children.values())lg(t)}function cg(e,t){if(e.path=e.name?t?`${t}/${e.name}`:e.name:t,e.isFile)return e.count=1,e.value;let r=0,n=0;for(let o of e.children.values())r+=cg(o,e.path),n+=o.count;return e.value=r,e.count=n,r}function dg(e,t,r,n,o,s,i){if(n<Eo||o<Eo)return;if(e.isFile){i.push({kind:"file",node:e,x:t,y:r,w:n,h:o});return}if(!(s<y0&&n>=ig&&o>=ig&&e.children.size>0)){i.push({kind:"agg",node:e,x:t,y:r,w:n,h:o});return}i.push({kind:"dir",node:e,x:t,y:r,w:n,h:o});let d=o>=sg+Eo+gi?sg:0,u=t+gi,p=r+d,f=n-gi*2,h=o-d-gi;if(f<Eo||h<Eo)return;let b=[...e.children.values()].toSorted((m,y)=>y.value-m.value);for(let m of ag(b,{x:u,y:p,w:f,h}))dg(m.node,m.x,m.y,m.w,m.h,s+1,i)}var Zc=class extends H{static properties={details:{attribute:!1},_w:{state:!0},_h:{state:!0}};createRenderRoot(){return this}constructor(){super(),this.details=null,this._w=0,this._h=0,this._root=null,this._status="loading",this._meta={files:0,total:0,prefix:""},this._ro=null,this._plot=null,this._tooltip=null,this._ttCell=null,this._onPointerMove=this._onPointerMove.bind(this),this._onPointerLeave=this._onPointerLeave.bind(this)}willUpdate(t){t.has("details")&&this._rebuild()}firstUpdated(){this._plot=this.querySelector(".bundle-treemap-plot"),this._tooltip=this.querySelector(".bundle-treemap-tooltip"),!(!this._plot||typeof ResizeObserver>"u")&&(this._ro=new ResizeObserver(t=>{let r=t[0]?.contentRect;if(!r)return;let n=Math.floor(r.width),o=Math.floor(r.height);(n!==this._w||o!==this._h)&&(this._w=n,this._h=o)}),this._ro.observe(this._plot))}disconnectedCallback(){super.disconnectedCallback(),this._ro&&(this._ro.disconnect(),this._ro=null)}_onPointerMove(t){let r=t.target.closest(".bundle-treemap-node");if(!r||!this._tooltip){this._hideTooltip();return}if(r!==this._ttCell){this._ttCell=r;let n=r.dataset;W(c`<div class="bundle-treemap-tt-path">${n.ttPath}</div>${n.ttPkg?c`<div class="bundle-treemap-tt-head"><span class="bundle-treemap-tt-dot" style="${`background:${n.ttColor}`}"></span> <span class="bundle-treemap-tt-pkg">${n.ttPkg}</span></div>`:""}<div class="bundle-treemap-tt-meta">${n.ttMeta}</div>`,this._tooltip)}this._positionTooltip(t.clientX,t.clientY)}_onPointerLeave(){this._hideTooltip()}_positionTooltip(t,r){let n=this._tooltip;if(!n||!this._plot)return;n.classList.add("show");let o=this._plot.getBoundingClientRect(),s=t-o.left,i=r-o.top,l=12,d=s+l;d+n.offsetWidth>o.width-4&&(d=s-n.offsetWidth-l),d<4&&(d=4);let u=i+l;u+n.offsetHeight>o.height-4&&(u=i-n.offsetHeight-l),u<4&&(u=4),n.style.left=`${d}px`,n.style.top=`${u}px`}_hideTooltip(){this._ttCell=null,this._tooltip&&this._tooltip.classList.remove("show")}_rebuild(){if(this._root=null,this._meta={files:0,total:0,prefix:""},!this.details){this._status="loading";return}let t=dt(this.details);if(!t||t.size===0){this._status="empty";return}let r=[...t.keys()],{prefix:n,stripped:o}=Rt(r),s=new TextEncoder,i={name:"",children:new Map,value:0,isFile:!1},l=0,d=0;for(let u=0;u<r.length;u++){let p=t.get(r[u]),f=typeof p=="string"?s.encode(p).byteLength:0;if(f<=0)continue;let h=o[u].split("/"),b=i,m=!1;for(let w=0;w<h.length-1;w++){let v=b.children.get(h[w]);if(v&&v.isFile){m=!0;break}v||(v={name:h[w],children:new Map,value:0,isFile:!1},b.children.set(h[w],v)),b=v}if(m)continue;let y=h.at(-1),$=b.children.get(y);$&&!$.isFile||($||($={name:y,isFile:!0,value:0,origPath:r[u]},b.children.set(y,$)),$.value+=f,l+=f,d++)}if(l===0){this._status="empty";return}for(let u of i.children.values())lg(u);cg(i,""),this._root=i,this._meta={files:d,total:l,prefix:n},this._status="ok"}_cell(t){let r=this._meta.total||1,n=t.node.value/r*100,o=n>=10?n.toFixed(0):n.toFixed(n>=1?1:2),s={left:`${t.x}px`,top:`${t.y}px`,width:`${t.w}px`,height:`${t.h}px`},i=`${t.node.count} ${t.node.count===1?"file":"files"}`;if(t.kind==="dir")return c`<div class="bundle-treemap-node bundle-treemap-dir" style="${we(s)}" data-tt-path="${`${t.node.path}/`}" data-tt-meta="${`${De(t.node.value)} \xB7 ${i} \xB7 ${o}%`}"><span class="bundle-treemap-dirname">${t.node.name}</span></div>`;let l=ho(t.node.path),d=Ft(l),u=we({...s,background:d,color:w0(d)}),p=l==="__own__"?"own source":l;return t.kind==="agg"?c`<div class="bundle-treemap-node bundle-treemap-leaf bundle-treemap-agg" style="${u}" data-tt-path="${`${t.node.path}/`}" data-tt-pkg="${p}" data-tt-color="${d}" data-tt-meta="${`${De(t.node.value)} \xB7 ${i} \xB7 ${o}%`}"><span class="bundle-treemap-label">${t.node.name}/</span></div>`:c`<button type="button" class="bundle-treemap-node bundle-treemap-leaf bundle-treemap-file" style="${u}" data-bundle-view-source="${t.node.origPath}" data-tt-path="${t.node.path}" data-tt-pkg="${p}" data-tt-color="${d}" data-tt-meta="${`${De(t.node.value)} \xB7 ${o}% of bundle`}"><span class="bundle-treemap-label">${t.node.name}</span></button>`}render(){let t=[];if(this._status==="ok"&&this._root&&this._w>0&&this._h>0){let s=[...this._root.children.values()].toSorted((i,l)=>l.value-i.value);for(let i of ag(s,{x:0,y:0,w:this._w,h:this._h}))dg(i.node,i.x,i.y,i.w,i.h,1,t)}let{files:r,total:n,prefix:o}=this._meta;return c`<header class="bundle-treemap-head"><span class="bundle-treemap-title">Source treemap</span> <span class="bundle-treemap-sub">${r} ${r===1?"file":"files"} · ${De(n)}${o?c`· <span class="mono">${o}</span>`:""}</span></header><div class="bundle-treemap-plot" @pointermove="${this._onPointerMove}" @pointerleave="${this._onPointerLeave}">${this._status==="loading"?c`<div class="bundle-treemap-empty">Loading…</div>`:this._status==="empty"?c`<div class="bundle-treemap-empty">This bundle doesn't carry any source content.</div>`:t.map(s=>this._cell(s))}<div class="bundle-treemap-tooltip"></div></div>`}};customElements.define("bundle-treemap",Zc);var k0=c`<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M6 9V2h12v7"/><path d="M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2"/><rect x="6" y="14" width="12" height="8"/></svg>`,ed=class extends L{createRenderRoot(){return this}render(){return a.reports.length>0&&a.currentView==="findings"&&a.viewMode!=="graph"&&a.viewMode!=="kanban"?c`<button type="button" title="print this report" aria-label="print" @click="${this._onClick}">${k0}</button>`:g}_onClick=()=>{this.dispatchEvent(new CustomEvent("print-requested",{bubbles:!0,composed:!0}))}};customElements.define("print-button",ed);var $0=c`<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" x2="12" y1="15" y2="3"/></svg>`,td=class extends L{createRenderRoot(){return this}render(){return a.reports.length>0&&a.currentView==="findings"&&a.viewMode!=="graph"&&a.viewMode!=="kanban"?c`<button type="button" title="download this report" aria-label="download" @click="${this._onClick}">${$0}</button>`:g}_onClick=()=>{this.dispatchEvent(new CustomEvent("download-requested",{bubbles:!0,composed:!0}))}};customElements.define("download-button",td);function mi(e){let t=new Map;for(let[r,n]of a.triage)n[e]&&t.set(r,n[e]);return t}var x0={get markers(){return mi("color")},get triageState(){return mi("triage")},get comments(){return mi("comment")},get fixes(){return mi("fix")},get(e){let t=a.triage.get(e),r={};return t?.color&&(r.color=t.color),t?.triage&&(r.triage=t.triage),t?.comment&&(r.comment=t.comment),t?.fix&&(r.fix=t.fix),r},async set(e,{color:t,triage:r,comment:n,fix:o}={}){let s=!1;if(t!==void 0&&(t===null||t===""?M(a.triage,e,{color:void 0})&&(s=!0):a.triage.get(e)?.color!==t&&(M(a.triage,e,{color:t}),s=!0)),r!==void 0)if(r===null||r===""||r===!1)M(a.triage,e,{triage:void 0})&&(s=!0);else if(r==="fixed"||r==="invalid"||r==="deleted")a.triage.get(e)?.triage!==r&&(M(a.triage,e,{triage:r}),s=!0);else throw new TypeError(`DeepView.triage.set: unknown triage value ${JSON.stringify(r)} (expected 'fixed' | 'invalid' | 'deleted' | null)`);if(n!==void 0){let i=n?String(n):"";i?a.triage.get(e)?.comment!==i&&(M(a.triage,e,{comment:i}),s=!0):M(a.triage,e,{comment:void 0})&&(s=!0)}if(o!==void 0){let i=o?String(o):"";i?a.triage.get(e)?.fix!==i&&(M(a.triage,e,{fix:i}),s=!0):M(a.triage,e,{fix:void 0})&&(s=!0)}return s&&(await oe(),k()),s}};window.DeepView={get reports(){return a.reports.slice()},get groups(){return Bt()},get findings(){return Bt().flat()},get currentFile(){return a.currentFile},get currentWorkspace(){return a.currentWorkspace},triage:x0,themes:Uh,setTheme:Nh,get theme(){return Dh()},triageSync:D,refresh(){k()},export(){return Xh()}};var _0={default:Y.default,"claude-security":Y["claude-security"],"codex-security":Y["codex-security"],deepsec:Y.deepsec,bundle:tn,workspace:Os};for(let e of document.querySelectorAll(".drop-supported-icon[data-icon]")){let t=_0[e.dataset.icon];t&&(e.innerHTML=t)}sp(k);op(k);D.onStatusChange(k);rp(async(e,t)=>{a.currentWorkspace===e?await Qt(e):a.currentFile&&a.currentFile===t?await _t(t):await V()});np(async()=>{await V(),a.currentView==="bundles"&&k()});bh();wh();async function S0(){let e=ll();if(!e)return!1;try{history.replaceState(null,"",location.pathname)}catch{}let t;try{t=await kh({encoded:e})}catch(n){return alert(`Couldn't open the share-link unlock prompt: ${n.message}`),!1}if(!t)return!1;let r=await Ua({id:t.id,name:t.name,privateKey:t.privateKeyBase64});if(r.status==="already-attached")return alert(`This workspace is already attached as "${r.workspace.name}".`),!1;if(r.status==="name-collision"){let n=r.existing?.name;return alert(n?`A workspace named "${n}" 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 r.workspace?.id?await Qt(r.workspace.id):await V(),!0}var Ao=!1;async function hg(){if(Ao||(Ao=!0,await Lr(),La(),await V(),await S0()))return;let t=he(Xt);if(t)if(t.startsWith("ws:")){let r=t.slice(3);z().some(n=>n.id===r)&&await Qt(r)}else if(t.startsWith("b:")){let r=t.slice(2),n=r.indexOf(" "),o=n>=0?r.slice(0,n):r,s=n>=0?r.slice(n+1):"",i=po.has(s)?s:"overview";(a.bundles??[]).some(l=>l.integrity===o)&&(a.currentView="bundles",a.selectedBundle=o,a.bundleDetails=null,a.bundleSourceFile=null,a.bundleSourceFindingIdx=null,a.bundleCodeSearchQuery="",a.bundleCodeSearchMode="files",a.bundleDetailsTab=i,a.shownTriage=null,A.showAll=!0,k(),Jt(o))}else(await le()).includes(t)&&await _t(t)}var ug=X(),pg=!1;function fg(e){pg||(pg=!0,queueMicrotask(()=>{alert(e+" This tab will reload to refresh its state. Any unsaved edits in this tab will be lost."),location.reload()}))}ge(()=>{let e=ug,t=X();if(ug=t,k(),!Ao&&st()){hg().catch(r=>console.warn("continueBoot:",r));return}if(Ao&&t&&!st()){fg("Encryption was just enabled in another tab.");return}Ao&&e&&!t&&!Ki()&&fg("Encryption was disabled in another tab.")});(async()=>{if(!await vh()){try{let e=window.matchMedia?.("(display-mode: window-controls-overlay)").matches;if(!e&&localStorage.getItem("deepview.sidebarCollapsed")==="1"&&Dd.classList.add("collapsed"),window.matchMedia?.("(display-mode: standalone)").matches||e){let r=document.querySelector('meta[name="viewport"]');r&&r.setAttribute("content","width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"),window.addEventListener("wheel",n=>{(n.ctrlKey||n.metaKey)&&n.preventDefault()},{passive:!1}),window.addEventListener("keydown",n=>{(n.ctrlKey||n.metaKey)&&(n.key==="="||n.key==="+"||n.key==="-"||n.key==="0")&&n.preventDefault()})}}catch{}X()&&!st()||await hg()}})();
88
90
  /*! Bundled license information:
89
91
 
90
92
  @lit/reactive-element/css-tag.js: