@preventive/triage 1.0.0-alpha.4 → 1.0.0-alpha.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. package/LICENSE-APACHE +202 -0
  2. package/README.md +16 -0
  3. package/api/reap.ts +17 -0
  4. package/cli.js +6 -0
  5. package/client/dependency-paths.d.ts +2 -0
  6. package/client/dependency-paths.js +24 -0
  7. package/client/finding-link.js +305 -0
  8. package/client/linked-findings.d.ts +1 -0
  9. package/client/linked-findings.js +112 -0
  10. package/common/bundle-commit.d.ts +1 -0
  11. package/common/bundle-commit.js +4 -0
  12. package/common/bundle-compare-diff.d.ts +3 -0
  13. package/common/bundle-compare-diff.js +522 -0
  14. package/common/bundle-compare-inputs.d.ts +2 -0
  15. package/common/bundle-compare-inputs.js +65 -0
  16. package/common/bundle-metadata.d.ts +14 -0
  17. package/common/bundle-metadata.js +226 -0
  18. package/common/bundle-pkg-of.d.ts +1 -0
  19. package/common/bundle-pkg-of.js +90 -0
  20. package/common/bundle-reasons.d.ts +2 -0
  21. package/common/bundle-reasons.js +21 -0
  22. package/common/bundle-source-links.d.ts +6 -0
  23. package/common/bundle-source-links.js +216 -0
  24. package/common/bundle-sourcemap.d.ts +10 -0
  25. package/common/bundle-sourcemap.js +100 -0
  26. package/common/bundle-sources.d.ts +7 -0
  27. package/common/bundle-sources.js +310 -0
  28. package/common/bundle-stats.js +41 -0
  29. package/common/bundle-tabs.js +1 -0
  30. package/common/code-language.js +65 -0
  31. package/common/default-scan-models.ts +31 -0
  32. package/common/dependency-reviews.d.ts +23 -0
  33. package/common/dependency-reviews.js +81 -0
  34. package/common/finding-duplicates.js +58 -0
  35. package/common/finding-filters.js +274 -0
  36. package/common/finding-id.js +47 -0
  37. package/common/github-issue-labels.d.ts +1 -0
  38. package/common/github-issue-labels.js +11 -0
  39. package/common/github-pr.ts +56 -0
  40. package/common/gzip.js +59 -0
  41. package/common/line-diff.d.ts +8 -0
  42. package/common/line-diff.js +56 -0
  43. package/common/linked-workspace-groups.js +63 -0
  44. package/common/managed/comments.ts +34 -0
  45. package/common/managed/npm-packages.d.ts +5 -0
  46. package/common/managed/npm-packages.js +34 -0
  47. package/common/managed/permissions.ts +31 -0
  48. package/common/managed/report-content.ts +72 -0
  49. package/common/managed/report-filter.ts +108 -0
  50. package/common/managed/repository-alias.ts +65 -0
  51. package/common/managed/roles.ts +28 -0
  52. package/common/managed/routes.d.ts +2 -0
  53. package/common/managed/routes.js +254 -0
  54. package/common/managed/scan-models.ts +6 -0
  55. package/common/managed/team-app.d.ts +2 -0
  56. package/common/managed/team-app.js +31 -0
  57. package/common/managed/triage.ts +83 -0
  58. package/common/managed/upload-seal.ts +126 -0
  59. package/common/pretty-print.d.ts +5 -0
  60. package/common/pretty-print.js +24 -0
  61. package/common/revalidation-conflicts.js +48 -0
  62. package/common/revalidation-input-groups.js +56 -0
  63. package/common/save-error-reason.ts +20 -7
  64. package/common/scan-server.ts +13 -0
  65. package/common/server-info.ts +35 -0
  66. package/common/utf8.d.ts +3 -0
  67. package/common/utf8.js +45 -0
  68. package/common/workspace-app.js +23 -0
  69. package/common/workspace-groups.js +176 -0
  70. package/out/brotli-fallback.js +3 -3
  71. package/out/chunk-2AFQKRAM.js +51 -0
  72. package/out/chunk-2KBF5TZ7.js +2 -0
  73. package/out/chunk-2XUEZHIP.js +28 -0
  74. package/out/chunk-35VE6CDH.js +2 -0
  75. package/out/chunk-3BZ7JERB.js +1 -0
  76. package/out/chunk-4F6JSF57.js +3 -0
  77. package/out/chunk-4XCDFGDP.js +10 -0
  78. package/out/chunk-C4Z6ZBXV.js +10 -0
  79. package/out/chunk-CMQA4DM6.js +1 -0
  80. package/out/chunk-CVVJAXVY.js +2 -0
  81. package/out/chunk-DIJJNTRH.js +10 -0
  82. package/out/chunk-GJ4IUCNS.js +1 -0
  83. package/out/chunk-GNXOKIGP.js +80 -0
  84. package/out/chunk-GZ4MS3TE.js +13 -0
  85. package/out/chunk-IU3CCINR.js +3 -0
  86. package/out/chunk-K3X5EJBQ.js +2 -0
  87. package/out/chunk-KEX2ATEW.js +2 -0
  88. package/out/chunk-KVEUXIEU.js +1 -0
  89. package/out/chunk-KYCNJVB7.js +1 -0
  90. package/out/chunk-NRPC74AM.js +1 -0
  91. package/out/chunk-OOJM4CTU.js +1 -0
  92. package/out/chunk-PNHBZGDD.js +1 -0
  93. package/out/chunk-QZ3A376W.js +1 -0
  94. package/out/chunk-R5O6FAW4.js +2 -0
  95. package/out/chunk-RFZQQXSG.js +17 -0
  96. package/out/chunk-RSHMVYNS.js +1 -0
  97. package/out/chunk-TUII34K2.js +1 -0
  98. package/out/chunk-TY4RZD3Z.js +226 -0
  99. package/out/chunk-TZ5KB2Y5.js +10 -0
  100. package/out/chunk-U6OPEXIA.js +1 -0
  101. package/out/chunk-UNTRGE26.js +2 -0
  102. package/out/chunk-UXNUAIIC.js +33 -0
  103. package/out/chunk-UYAXVRVL.js +1 -0
  104. package/out/chunk-UZAZM2SX.js +2 -0
  105. package/out/chunk-V3ME6FI5.js +2 -0
  106. package/out/chunk-V5O7M2YT.js +1 -0
  107. package/out/chunk-VIHGO77Y.js +1 -0
  108. package/out/chunk-VQJCXGIY.js +7 -0
  109. package/out/chunk-W4J3MGLB.js +1 -0
  110. package/out/chunk-WGG7KQUH.js +1 -0
  111. package/out/chunk-WZDTZE64.js +1 -0
  112. package/out/chunk-XL35ZV6R.js +1 -0
  113. package/out/chunk-XYFXXB2G.js +10 -0
  114. package/out/chunk-YVZH5SHP.js +1 -0
  115. package/out/chunk-ZBBOBQ43.js +1 -0
  116. package/out/chunk-ZMQQCGF6.js +2 -0
  117. package/out/client-managed-import.js +4 -0
  118. package/out/client-managed.js +37 -0
  119. package/out/client-sync.js +10 -13
  120. package/out/github-issue-authorized.html +3 -0
  121. package/out/github-issue-authorized.js +1 -0
  122. package/out/graph.js +17 -4
  123. package/out/index.html +90 -8
  124. package/out/prism.js +6 -2
  125. package/out/stasis.svg +20 -0
  126. package/out/terminal.js +365 -39
  127. package/out/view.css +1 -1
  128. package/out/view.js +83 -117
  129. package/package.json +298 -59
  130. package/risk/files/characters.js +196 -0
  131. package/risk/files/hosts.js +205 -0
  132. package/risk/files/readability.js +171 -0
  133. package/risk/files/runs-code.js +595 -0
  134. package/risk/files/script.js +114 -0
  135. package/risk/files/stamps.js +46 -0
  136. package/risk/index.d.ts +156 -0
  137. package/risk/index.js +7 -0
  138. package/risk/npm/assess.js +223 -0
  139. package/risk/npm/combined.js +65 -0
  140. package/risk/npm/compare.js +228 -0
  141. package/risk/npm/dependencies.js +153 -0
  142. package/risk/npm/diff.js +43 -0
  143. package/risk/npm/downloads.js +84 -0
  144. package/risk/npm/files.js +34 -0
  145. package/risk/npm/held.js +60 -0
  146. package/risk/npm/install-scripts.js +34 -0
  147. package/risk/npm/malware.js +36 -0
  148. package/risk/npm/manifest.js +65 -0
  149. package/risk/npm/new-dependency.js +30 -0
  150. package/risk/npm/old-version.js +108 -0
  151. package/risk/npm/registry.js +282 -0
  152. package/risk/npm/release.js +85 -0
  153. package/risk/npm/score.js +59 -0
  154. package/risk/npm/specs.js +124 -0
  155. package/risk/npm/tarball.js +113 -0
  156. package/server-common/database-config.ts +16 -0
  157. package/server-common/initialize.ts +18 -0
  158. package/server-common/npm-advisories.ts +101 -0
  159. package/{server → server-common}/origin.ts +5 -5
  160. package/server-common/reap.ts +48 -0
  161. package/server-common/scan-config.ts +19 -0
  162. package/server-common/standalone.ts +29 -0
  163. package/server-common/storage-crypto.ts +182 -0
  164. package/server-common/storage-log.ts +38 -0
  165. package/server-common/vercel-blob.ts +103 -0
  166. package/server-e2e/app.ts +486 -0
  167. package/{server → server-e2e}/auth.ts +5 -1
  168. package/{server → server-e2e}/bus-receiver.ts +2 -1
  169. package/{server → server-e2e}/cli.js +9 -4
  170. package/{server → server-e2e}/config.ts +56 -35
  171. package/{server → server-e2e}/db-neon.ts +2 -2
  172. package/{server → server-e2e}/db-revision-sql.ts +1 -1
  173. package/{server → server-e2e}/db-stmt.ts +2 -2
  174. package/{server → server-e2e}/db.ts +7 -7
  175. package/{server → server-e2e}/http.ts +116 -18
  176. package/{server → server-e2e}/hub.ts +40 -9
  177. package/server-e2e/index.ts +17 -0
  178. package/server-e2e/lifecycle.ts +95 -0
  179. package/{server → server-e2e}/neon-driver.ts +2 -2
  180. package/{server → server-e2e}/npm-proxy.ts +12 -145
  181. package/{server → server-e2e}/objstore/blob-vercel.ts +10 -114
  182. package/{server → server-e2e}/objstore/blob.ts +1 -1
  183. package/server-e2e/objstore/fetch-mint-guard.ts +74 -0
  184. package/{server → server-e2e}/objstore/handlers.ts +9 -8
  185. package/{server → server-e2e}/objstore/init.ts +35 -18
  186. package/{server → server-e2e}/objstore/reaper.ts +1 -1
  187. package/server-e2e/objstore/rest-deny.ts +28 -0
  188. package/server-e2e/objstore/rest-mint.ts +224 -0
  189. package/{server → server-e2e}/objstore/rest.ts +27 -26
  190. package/{server → server-e2e}/objstore/sign.ts +105 -0
  191. package/{server → server-e2e}/objstore/store-neon.ts +6 -10
  192. package/{server → server-e2e}/objstore/store.ts +7 -7
  193. package/{server → server-e2e}/objstore/tokens.ts +2 -2
  194. package/{server → server-e2e}/pubsub.ts +12 -9
  195. package/{server → server-e2e}/sign.ts +4 -4
  196. package/{server → server-e2e}/sse-server.ts +102 -68
  197. package/{server → server-e2e}/sse-session.ts +28 -8
  198. package/{server → server-e2e}/static.ts +31 -21
  199. package/server-e2e/sync-handlers.ts +408 -0
  200. package/{server → server-e2e}/ws-server.ts +20 -9
  201. package/server-managed/activity.ts +245 -0
  202. package/server-managed/avatar-store.ts +12 -0
  203. package/server-managed/blob-store.ts +17 -0
  204. package/server-managed/brotli.ts +10 -0
  205. package/server-managed/bundle-advisories.ts +120 -0
  206. package/server-managed/bundle-advisory-inventory.ts +77 -0
  207. package/server-managed/bundle-build-diagnostics.d.ts +10 -0
  208. package/server-managed/bundle-build-diagnostics.js +23 -0
  209. package/server-managed/bundle-build-leases.ts +41 -0
  210. package/server-managed/bundle-build-worker.js +111 -0
  211. package/server-managed/bundle-build.ts +198 -0
  212. package/server-managed/bundle-cache.ts +199 -0
  213. package/server-managed/bundle-catalog.ts +29 -0
  214. package/server-managed/bundle-commits.ts +140 -0
  215. package/server-managed/bundle-store.ts +24 -0
  216. package/server-managed/bundle-summary-cache.ts +130 -0
  217. package/server-managed/bundle.ts +120 -0
  218. package/server-managed/cache-storage.ts +19 -0
  219. package/server-managed/cli.js +21 -0
  220. package/server-managed/combined.ts +46 -0
  221. package/server-managed/comments.ts +151 -0
  222. package/server-managed/config.ts +158 -0
  223. package/server-managed/content-access.ts +15 -0
  224. package/server-managed/crypto.ts +25 -0
  225. package/server-managed/db-methods.ts +1725 -0
  226. package/server-managed/db-neon.ts +367 -0
  227. package/server-managed/db-schema.ts +227 -0
  228. package/server-managed/db-table-names.ts +22 -0
  229. package/server-managed/db.ts +132 -0
  230. package/server-managed/dependency-reviews.ts +248 -0
  231. package/server-managed/github-app.ts +391 -0
  232. package/server-managed/github-errors.ts +68 -0
  233. package/server-managed/github-issue-links.ts +127 -0
  234. package/server-managed/github-issue-oauth.ts +47 -0
  235. package/server-managed/github-issues.ts +152 -0
  236. package/server-managed/github-metadata.ts +213 -0
  237. package/server-managed/github-oauth.ts +235 -0
  238. package/server-managed/github-pulls.ts +227 -0
  239. package/server-managed/http-response.ts +50 -0
  240. package/server-managed/http.ts +3472 -0
  241. package/server-managed/import-triage.ts +51 -0
  242. package/server-managed/index.ts +187 -0
  243. package/server-managed/kept.ts +28 -0
  244. package/server-managed/link-reports.ts +158 -0
  245. package/server-managed/locked-packages.ts +85 -0
  246. package/server-managed/lru.ts +30 -0
  247. package/server-managed/managed-issues.ts +75 -0
  248. package/server-managed/management-catalog.ts +45 -0
  249. package/server-managed/management.ts +99 -0
  250. package/server-managed/npm-insights.ts +440 -0
  251. package/server-managed/npm-kept.ts +65 -0
  252. package/server-managed/npm-loads.ts +167 -0
  253. package/server-managed/npm-manifest.ts +115 -0
  254. package/server-managed/npm-packages.ts +378 -0
  255. package/server-managed/npm-provenance.ts +123 -0
  256. package/server-managed/npm-risk.ts +177 -0
  257. package/server-managed/object-storage-disk.ts +148 -0
  258. package/server-managed/object-storage-vercel.ts +67 -0
  259. package/server-managed/object-storage.ts +74 -0
  260. package/server-managed/package-entry-points.ts +51 -0
  261. package/server-managed/pretty-print.ts +352 -0
  262. package/server-managed/public-workspace.ts +220 -0
  263. package/server-managed/rename-diff-worker.js +26 -0
  264. package/server-managed/rename-diff.ts +270 -0
  265. package/server-managed/repo-path.ts +21 -0
  266. package/server-managed/report-migration.ts +35 -0
  267. package/server-managed/report-query.ts +10 -0
  268. package/server-managed/report-response.ts +16 -0
  269. package/server-managed/report-sources.ts +178 -0
  270. package/server-managed/report-store.ts +47 -0
  271. package/server-managed/repository-aliases.ts +91 -0
  272. package/server-managed/repository-browser.ts +153 -0
  273. package/server-managed/repository-discovery.ts +82 -0
  274. package/server-managed/repository-policy.ts +27 -0
  275. package/server-managed/repository-risk.ts +420 -0
  276. package/server-managed/revisions.ts +35 -0
  277. package/server-managed/session.ts +92 -0
  278. package/server-managed/slugs.ts +38 -0
  279. package/server-managed/solidity-entry-points.ts +69 -0
  280. package/server-managed/sql-postgres.ts +31 -0
  281. package/server-managed/sql.ts +76 -0
  282. package/server-managed/static.ts +28 -0
  283. package/server-managed/storage-command.ts +16 -0
  284. package/server-managed/storage-db.ts +175 -0
  285. package/server-managed/storage-encryption.ts +279 -0
  286. package/server-managed/storage-maintenance.ts +256 -0
  287. package/server-managed/storage-payload.ts +103 -0
  288. package/server-managed/storage-stores.ts +85 -0
  289. package/server-managed/storage.ts +78 -0
  290. package/server-managed/team-app.ts +94 -0
  291. package/server-managed/team-catalog.ts +7 -0
  292. package/server-managed/team-feed.ts +173 -0
  293. package/server-managed/team-npm-scopes.ts +77 -0
  294. package/server-managed/team-reports.ts +228 -0
  295. package/server-managed/triage-response.ts +16 -0
  296. package/server-managed/type-only-worker.js +19 -0
  297. package/server-managed/type-only.ts +103 -0
  298. package/server-managed/uploads.ts +86 -0
  299. package/server-managed/upstream-cache.ts +215 -0
  300. package/server-managed/view-as.ts +58 -0
  301. package/server-managed/workspace-shares.ts +166 -0
  302. package/server.ts +50 -0
  303. package/server/index.ts +0 -477
  304. package/server/lifecycle.ts +0 -204
  305. package/server/sync-handlers.ts +0 -320
  306. /package/{LICENSE → LICENSE-MIT} +0 -0
  307. /package/{server → server-e2e}/config.example.json +0 -0
  308. /package/{server → server-e2e}/objstore/blob-fs.ts +0 -0
  309. /package/{server → server-e2e}/objstore/fs.ts +0 -0
  310. /package/{server → server-e2e}/peer.ts +0 -0
  311. /package/{server → server-e2e}/util.ts +0 -0
  312. /package/{server → server-e2e}/validation.ts +0 -0
package/out/view.js CHANGED
@@ -1,55 +1,4 @@
1
- var To=globalThis,Ro=To.ShadowRoot&&(To.ShadyCSS===void 0||To.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,id=Symbol(),sd=new WeakMap,Io=class{constructor(t,r,n){if(this._$cssResult$=!0,n!==id)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=sd.get(r)),t===void 0&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),n&&sd.set(r,t))}return t}toString(){return this.cssText}},A=e=>new Io(typeof e=="string"?e:e+"",void 0,id);var ad=(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)}},ki=Ro?e=>e:e=>e instanceof CSSStyleSheet?(t=>{let r="";for(let n of t.cssRules)r+=n.cssText;return A(r)})(e):e;var{is:$g,defineProperty:xg,getOwnPropertyDescriptor:_g,getOwnPropertyNames:Sg,getOwnPropertySymbols:Cg,getPrototypeOf:Eg}=Object,Bo=globalThis,ld=Bo.trustedTypes,Ag=ld?ld.emptyScript:"",Tg=Bo.reactiveElementPolyfillSupport,fn=(e,t)=>e,$i={toAttribute(e,t){switch(t){case Boolean:e=e?Ag: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}},dd=(e,t)=>!$g(e,t),cd={attribute:!0,type:String,converter:$i,reflect:!1,useDefault:!1,hasChanged:dd};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=cd){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&&xg(this.prototype,t,o)}}static getPropertyDescriptor(t,r,n){let{get:o,set:s}=_g(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)??cd}static _$Ei(){if(this.hasOwnProperty(fn("elementProperties")))return;let t=Eg(this);t.finalize(),t.l!==void 0&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(fn("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(fn("properties"))){let r=this.properties,n=[...Sg(r),...Cg(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(ki(o))}else t!==void 0&&r.push(ki(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 ad(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:$i).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:$i;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??dd)(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[fn("elementProperties")]=new Map,St[fn("finalized")]=new Map,Tg?.({ReactiveElement:St}),(Bo.reactiveElementVersions??=[]).push("2.1.2");var _i=globalThis,ud=e=>e,Fo=_i.trustedTypes,pd=Fo?Fo.createPolicy("lit-html",{createHTML:e=>e}):void 0,Si="$lit$",Ct=`lit$${Math.random().toFixed(9).slice(2)}$`,Ci="?"+Ct,Ig=`<${Ci}>`,ir=document,gn=()=>ir.createComment(""),mn=e=>e===null||typeof e!="object"&&typeof e!="function",Ei=Array.isArray,yd=e=>Ei(e)||typeof e?.[Symbol.iterator]=="function",xi=`[
2
- \f\r]`,hn=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,fd=/-->/g,hd=/>/g,or=RegExp(`>|${xi}(?:([^\\s"'>=/]+)(${xi}*=${xi}*(?:[^
3
- \f\r"'\`<>=]|("|')|))|$)`,"g"),gd=/'/g,md=/"/g,wd=/^(?:script|style|textarea|title)$/i,Ai=e=>(t,...r)=>({_$litType$:e,strings:t,values:r}),c=Ai(1),D0=Ai(2),U0=Ai(3),ae=Symbol.for("lit-noChange"),g=Symbol.for("lit-nothing"),bd=new WeakMap,sr=ir.createTreeWalker(ir,129);function vd(e,t){if(!Ei(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return pd!==void 0?pd.createHTML(t):t}var kd=(e,t)=>{let r=e.length-1,n=[],o,s=t===2?"<svg>":t===3?"<math>":"",i=hn;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===hn?p[1]==="!--"?i=fd:p[1]!==void 0?i=hd:p[2]!==void 0?(wd.test(p[2])&&(o=RegExp("</"+p[2],"g")),i=or):p[3]!==void 0&&(i=or):i===or?p[0]===">"?(i=o??hn,f=-1):p[1]===void 0?f=-2:(f=i.lastIndex-p[2].length,u=p[1],i=p[3]===void 0?or:p[3]==='"'?md:gd):i===md||i===gd?i=or:i===fd||i===hd?i=hn:(i=or,o=void 0);let b=i===or&&e[l+1].startsWith("/>")?" ":"";s+=i===hn?d+Ig:f>=0?(n.push(u),d.slice(0,f)+Si+d.slice(f)+Ct+b):d+Ct+(f===-2?l:b)}return[vd(e,s+(e[r]||"<?>")+(t===2?"</svg>":t===3?"</math>":"")),n]},bn=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]=kd(t,r);if(this.el=e.createElement(u,n),sr.currentNode=this.el.content,r===2||r===3){let f=this.el.content.firstChild;f.replaceWith(...f.childNodes)}for(;(o=sr.nextNode())!==null&&d.length<l;){if(o.nodeType===1){if(o.hasAttributes())for(let f of o.getAttributeNames())if(f.endsWith(Si)){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:lr}),o.removeAttribute(f)}else f.startsWith(Ct)&&(d.push({type:6,index:s}),o.removeAttribute(f));if(wd.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],gn()),sr.nextNode(),d.push({type:2,index:++s});o.append(f[h],gn())}}}else if(o.nodeType===8)if(o.data===Ci)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=ir.createElement("template");return n.innerHTML=t,n}};function ar(e,t,r=e,n){if(t===ae)return t;let o=n!==void 0?r._$Co?.[n]:r._$Cl,s=mn(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=ar(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??ir).importNode(r,!0);sr.currentNode=o;let s=sr.nextNode(),i=0,l=0,d=n[0];for(;d!==void 0;){if(i===d.index){let u;d.type===2?u=new Ir(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=sr.nextNode(),i++)}return sr.currentNode=ir,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++}},Ir=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=ar(this,t,r),mn(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):yd(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&&mn(this._$AH)?this._$AA.nextSibling.data=t:this.T(ir.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=bn.createElement(vd(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=bd.get(t.strings);return r===void 0&&bd.set(t.strings,r=new bn(t)),r}k(t){Ei(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(gn()),this.O(gn()),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=ud(t).nextSibling;ud(t).remove(),t=n}}setConnected(t){this._$AM===void 0&&(this._$Cv=t,this._$AP?.(t))}},lr=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=ar(this,t,r,0),i=!mn(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=ar(this,l[n+d],r,d),u===ae&&(u=this._$AH[d]),i||=!mn(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 lr{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===g?void 0:t}},Po=class extends lr{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==g)}},Oo=class extends lr{constructor(t,r,n,o,s){super(t,r,n,o,s),this.type=5}_$AI(t,r=this){if((t=ar(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){ar(this,t)}},$d={M:Si,P:Ct,A:Ci,C:1,L:kd,R:Mo,D:yd,V:ar,I:Ir,H:lr,N:Po,U:Oo,B:Lo,F:No},Rg=_i.litHtmlPolyfillSupport;Rg?.(bn,Ir),(_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 Ir(t.insertBefore(gn(),s),s,void 0,r??{})}return o._$AI(e),o};var Ti=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,Ti.litElementHydrateSupport?.({LitElement:H});var Bg=Ti.litElementPolyfillSupport;Bg?.({LitElement:H});(Ti.litElementVersions??=[]).push("4.2.2");var Be={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},ft=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=ft(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:Fg}=$d,xd=e=>e;var Sd=e=>e.strings===void 0,_d=()=>document.createComment(""),Rr=(e,t,r)=>{let n=e._$AA.parentNode,o=t===void 0?e._$AB:t._$AA;if(r===void 0){let s=n.insertBefore(_d(),o),i=n.insertBefore(_d(),o);r=new Fg(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=xd(d).nextSibling;xd(n).insertBefore(d,o),d=u}}}return r},Ot=(e,t,r=e)=>(e._$AI(t,r),e),Mg={},Do=(e,t=Mg)=>e._$AH=t,Cd=e=>e._$AH,Uo=e=>{e._$AR(),e._$AA.remove()};var Ed=(e,t,r)=>{let n=new Map;for(let o=t;o<=r;o++)n.set(e[o],o);return n},J=ft(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=Cd(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]=Ot(o[f],s[b]),f++,b++;else if(l[h]===i[m])d[m]=Ot(o[h],s[m]),h--,m--;else if(l[f]===i[m])d[m]=Ot(o[f],s[m]),Rr(e,d[m+1],o[f]),f++,m--;else if(l[h]===i[b])d[b]=Ot(o[h],s[b]),Rr(e,o[f],o[h]),h--,b++;else if(u===void 0&&(u=Ed(i,b,m),p=Ed(l,f,h)),u.has(l[f]))if(u.has(l[h])){let y=p.get(i[b]),k=y!==void 0?o[y]:null;if(k===null){let w=Rr(e,o[f]);Ot(w,s[b]),d[b]=w}else d[b]=Ot(k,s[b]),Rr(e,o[f],k),o[y]=null;b++}else Uo(o[h]),h--;else Uo(o[f]),f++;for(;b<=m;){let y=Rr(e,d[m+1]);Ot(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 Ad="important",Lg=" !"+Ad,ve=ft(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(Lg);n.includes("-")||s?r.setProperty(n,s?o.slice(0,-11):o,s?Ad:""):r[n]=o}}return ae}});var Fi=new WeakMap,Bd=Symbol("iteration key");function Pg(e){Fi.set(e,new Map)}function Og(e,{target:t,key:r,type:n}){n==="iterate"&&(r=Bd);let o=Fi.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=Fi.get(e),o=new Set;if(r==="clear"?n.forEach((s,i)=>{Ii(o,n,i)}):Ii(o,n,t),r==="add"||r==="delete"||r==="clear"){let s=Array.isArray(e)?"length":Bd;Ii(o,n,s)}return o}function Ii(e,t,r){let n=t.get(r);n&&n.forEach(e.add,e)}function Fd(e){e.cleaners&&e.cleaners.forEach(Dg,e),e.cleaners=[]}function Dg(e){e.delete(this)}var Br=[],Ri=!1;function Ug(e,t,r,n){if(e.unobserved)return Reflect.apply(t,r,n);if(Br.indexOf(e)===-1){Fd(e);try{return Br.push(e),Reflect.apply(t,r,n)}finally{Br.pop()}}}function ot(e){let t=Br[Br.length-1];t&&(Md(t,e),Og(t,e))}function Nt(e){Ng(e).forEach(zg,e)}function zg(e){Md(e,this),typeof e.scheduler=="function"?e.scheduler(e):typeof e.scheduler=="object"?e.scheduler.add(e):e()}function Md(e,t){if(e.debugger&&!Ri)try{Ri=!0,e.debugger(t)}finally{Ri=!1}}function Ld(){return Br.length>0}var Td=Symbol("is reaction");function Pd(e,t={}){let r=e[Td]?e:function n(){return Ug(n,e,this,arguments)};return r.scheduler=t.scheduler,r.debugger=t.debugger,r[Td]=!0,t.lazy||r(),r}function Mi(e){e.unobserved||(e.unobserved=!0,Fd(e)),typeof e.scheduler=="object"&&e.scheduler.delete(e)}var Ee=new WeakMap,Ho=new WeakMap,Wg=Object.prototype.hasOwnProperty;function Wo(e){let t=Ho.get(e);return Ld()&&typeof e=="object"&&e!==null?t||jo(e):t||e}function Bi(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 Id={has(e){let t=Ee.get(this),r=Reflect.getPrototypeOf(this);return ot({target:t,key:e,type:"has"}),r.has.apply(t,arguments)},get(e){let t=Ee.get(this),r=Reflect.getPrototypeOf(this);return ot({target:t,key:e,type:"get"}),Wo(r.get.apply(t,arguments))},add(e){let t=Ee.get(this),r=Reflect.getPrototypeOf(this),n=r.has.call(t,e),o=r.add.apply(t,arguments);return n||Nt({target:t,key:e,value:e,type:"add"}),o},set(e,t){let r=Ee.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&&Nt({target:r,key:e,value:t,oldValue:s,type:"set"}):Nt({target:r,key:e,value:t,type:"add"}),i},delete(e){let t=Ee.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&&Nt({target:t,key:e,oldValue:o,type:"delete"}),s},clear(){let e=Ee.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&&Nt({target:e,oldTarget:n,type:"clear"}),o},forEach(e,...t){let r=Ee.get(this),n=Reflect.getPrototypeOf(this);ot({target:r,type:"iterate"});let o=(s,...i)=>e(Wo(s),...i);return n.forEach.call(r,o,...t)},keys(){let e=Ee.get(this),t=Reflect.getPrototypeOf(this);return ot({target:e,type:"iterate"}),t.keys.apply(e,arguments)},values(){let e=Ee.get(this),t=Reflect.getPrototypeOf(this);ot({target:e,type:"iterate"});let r=t.values.apply(e,arguments);return Bi(r,!1)},entries(){let e=Ee.get(this),t=Reflect.getPrototypeOf(this);ot({target:e,type:"iterate"});let r=t.entries.apply(e,arguments);return Bi(r,!0)},[Symbol.iterator](){let e=Ee.get(this),t=Reflect.getPrototypeOf(this);ot({target:e,type:"iterate"});let r=t[Symbol.iterator].apply(e,arguments);return Bi(r,e instanceof Map)},get size(){let e=Ee.get(this),t=Reflect.getPrototypeOf(this);return ot({target:e,type:"iterate"}),Reflect.get(t,"size",e)}},zo={get(e,t,r){return e=Wg.call(Id,t)?Id:e,Reflect.get(e,t,r)}},Rd=typeof window=="object"?window:Function("return this")(),Od=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 Hg({constructor:e}){return!(typeof e=="function"&&e.name in Rd&&Rd[e.name]===e)||Od.has(e)}function jg(e){return Od.get(e.constructor)}var Nd=Object.prototype.hasOwnProperty,Vg=new Set(Object.getOwnPropertyNames(Symbol).map(e=>Symbol[e]).filter(e=>typeof e=="symbol"));function Kg(e,t,r){let n=Reflect.get(e,t,r);if(typeof t=="symbol"&&Vg.has(t))return n;ot({target:e,key:t,receiver:r,type:"get"});let o=Ho.get(n);if(Ld()&&typeof n=="object"&&n!==null){if(o)return o;let s=Reflect.getOwnPropertyDescriptor(e,t);if(!s||!(s.writable===!1&&s.configurable===!1))return jo(n)}return o||n}function qg(e,t){let r=Reflect.has(e,t);return ot({target:e,key:t,type:"has"}),r}function Gg(e){return ot({target:e,type:"iterate"}),Reflect.ownKeys(e)}function Yg(e,t,r,n){typeof r=="object"&&r!==null&&(r=Ee.get(r)||r);let o=Nd.call(e,t),s=e[t],i=Reflect.set(e,t,r,n);return e!==Ee.get(n)||(o?r!==s&&Nt({target:e,key:t,value:r,oldValue:s,receiver:n,type:"set"}):Nt({target:e,key:t,value:r,receiver:n,type:"add"})),i}function Jg(e,t){let r=Nd.call(e,t),n=e[t],o=Reflect.deleteProperty(e,t);return r&&Nt({target:e,key:t,oldValue:n,type:"delete"}),o}var Xg={get:Kg,has:qg,ownKeys:Gg,set:Yg,deleteProperty:Jg};function jo(e={}){return Ee.has(e)||!Hg(e)?e:Ho.get(e)||Qg(e)}function Qg(e){let t=jg(e)||Xg,r=new Proxy(e,t);return Ho.set(e,r),Ee.set(r,e),Pg(e),r}var Dd=jo;function Li(e){let t=!0,r=Pd(()=>{try{e(t)}finally{t=!1}},{lazy:!0});try{r()}catch(n){throw Mi(r),n}return()=>Mi(r)}var L=class extends H{_disposers=[];observes=null;connectedCallback(){super.connectedCallback(),this.bindState()}bindState(){if(this.observes){this._disposers.push(Li(t=>{this.observes(),t||this.requestUpdate()}));return}this._render||(this._render=this.render,this.render=()=>{let t,r=Li(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:A,StateElement:L,classMap:F,repeat:J,styleMap:ve};var Ae=document.querySelector("#drop-zone"),C=document.querySelector("#report"),Ud=document.querySelector("app-sidebar");function Fr(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 ht(e){return new Error("Another dialog is already open. Close it and try again.",{cause:e})}function Wd(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 Vo(){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 Hd(e,t,r,n,o){let s=e.byVersion.get(t);s||(s=Vo(),e.byVersion.set(t,s)),Ko(s,n,o,r)}function jd(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 Pi(e,t){if(e===t)return 0;if(e===null)return 1;if(t===null)return-1;let[r,n=""]=zd(e,"-"),[o,s=""]=zd(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 zd(e,t){let r=e.indexOf(t);return r<0?[e,""]:[e.slice(0,r),e.slice(r+1)]}var Zg=new TextEncoder,em=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 Zg.encode(e)}function de(e){if(!ArrayBuffer.isView(e)&&!(e instanceof ArrayBuffer))throw new TypeError(`decodeUtf8 expects a BufferSource, got ${e===null?"null":typeof e}`);return em.decode(e)}async function yn(e){let t=new Blob([e]).stream().pipeThrough(new CompressionStream("gzip"));return new Uint8Array(await new Response(t).arrayBuffer())}async function gt(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 yn(G(e))}async function wn(e){return de(await gt(e))}async function Vd(e){let t=await crypto.subtle.digest("SHA-512",e);return`sha512-${new Uint8Array(t).toBase64()}`}var st=new Uint8Array([68,86,69,49]),Mr=12,tm=32,rm="deepview-passkey.v1.content-key";function vn(){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 Jo(e){let t=new Uint8Array(e);return crypto.getRandomValues(t),t}async function Oi(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(rm)},t,tm*8);return new Uint8Array(r)}function Ni(e){return crypto.subtle.importKey("raw",e,{name:"AES-GCM"},!1,["encrypt","decrypt"])}async function Dt(e,t,r){let n=Jo(Mr),o=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:n,additionalData:r},e,t)),s=new Uint8Array(st.length+Mr+o.length);return s.set(st,0),s.set(n,st.length),s.set(o,st.length+Mr),s}async function cr(e,t,r){if(!Pe(t))throw new Error("passkey: missing envelope magic");if(t.length<st.length+Mr+16)throw new Error("passkey: envelope too short");let n=t.subarray(st.length,st.length+Mr),o=t.subarray(st.length+Mr);return new Uint8Array(await crypto.subtle.decrypt({name:"AES-GCM",iv:n,additionalData:r},e,o))}function Pe(e){if(e.length<st.length)return!1;for(let t=0;t<st.length;t++)if(e[t]!==st[t])return!1;return!0}async function qd(e){if(!vn())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 Di(e){if(!vn())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 kn=Object.freeze(["deepview.workspaces","deepview.sync.sessions","deepview.sync.userEnabled","deepview.sync.password","deepview.repoUrls","deepview.fileCounts","deepview.lastFile"]),Fe=new Map,Ui=!1,Et=new Map,Xe=new Map,zi=new Set;function Lr(e){return zi.add(e),()=>zi.delete(e)}function nm(){for(let e of zi)try{e()}catch(t){console.warn("secure-storage after-hydrate listener:",t)}}function Xo(e){let t=Xd()??"";return G(`deepview.secure.v1|${t}|${e}`)}function Wi(e){try{let t=Uint8Array.fromBase64(e);if(Pe(t))return t}catch{}return null}function ge(e){return Fe.get(e)??null}async function ke(e,t){if(typeof t!="string")throw new TypeError("secure-storage: value must be a string");if(X()&&!$e())throw new Error(`secure-storage: vault locked, cannot save "${e}"`);if(Jd())throw new Error(`secure-storage: wipe in progress, cannot save "${e}"`);let r=Fe.has(e),n=Fe.get(e);Fe.set(e,t),Xe.set(e,t);let o=Et.get(e)??Promise.resolve(),s=()=>{Xe.get(e)===t&&Xe.delete(e)},i=o.catch(()=>{}).then(()=>om(e,t)).then(()=>s(),l=>{throw s(),Fe.get(e)===t&&(r?Fe.set(e,n):Fe.delete(e)),l});Et.set(e,i.catch(()=>{})),await i}async function Pr(e){let t=Symbol("secure-storage:removed");Fe.delete(e),Xe.set(e,t);let r=Et.get(e)??Promise.resolve(),n=()=>{try{localStorage.removeItem(e)}catch{}Xe.get(e)===t&&(Xe.delete(e),Fe.delete(e))},o=r.catch(()=>{}).then(()=>n());Et.set(e,o.catch(()=>{})),await o}async function om(e,t){let r=$e();if(r){let n=await Dt(r,G(t),Xo(e));localStorage.setItem(e,n.toBase64())}else localStorage.setItem(e,t)}async function Ut(){Ui||me(()=>{Ut().catch(r=>console.warn("secure-storage rehydrate:",r))}),Ui=!0;for(let r of[...Fe.keys()])Xe.has(r)||Fe.delete(r);let e=$e(),t=[];for(let r of kn){if(Xe.has(r))continue;let n=localStorage.getItem(r);if(n===null)continue;let o=Wi(n);if(o){if(!e)continue;try{let s=await cr(e,o,Xo(r));if(Xe.has(r))continue;Fe.set(r,de(s))}catch(s){console.warn(`secure-storage: decrypt failed for "${r}":`,s)}}else Fe.set(r,n),e&&X()&&t.push([r,n])}nm(),t.length>0&&queueMicrotask(()=>{for(let[r,n]of t)Fe.get(r)===n&&ke(r,n).catch(o=>{console.warn(`secure-storage: self-heal failed for "${r}":`,o)})})}async function Gd(e,t){let r=Et.get(e)??Promise.resolve(),n=async()=>{if(Xe.has(e))return;let s=localStorage.getItem(e);if(s===null)return;let i=await t(s);i!==null&&(Xe.has(e)||(localStorage.setItem(e,i.storageValue),Fe.set(e,i.cacheValue)))},o=r.catch(()=>{}).then(n);Et.set(e,o.catch(()=>{})),await o}async function Hi({seal:e}){for(let t of kn)await Gd(t,async r=>{if(Wi(r))return null;let n=$e();return n?{storageValue:(await Dt(n,G(r),Xo(t))).toBase64(),cacheValue:r}:null})}async function ji({open:e}){for(let t of kn)await Gd(t,async r=>{let n=Wi(r);if(!n)return null;let o=await e(n,Xo(t)),s=de(o);return{storageValue:s,cacheValue:s}})}var sm="deepview.secure.v1.mutate:";function Vi(e,t){return kn.includes(e)?navigator.locks.request(sm+e,async()=>{let r=Et.get(e);r&&await r.catch(()=>{}),await Ut();let n=ge(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 ke(e,o)}}):Promise.reject(new Error(`secure-storage: mutate() called with non-secure key "${e}"`))}async function Yd(){await Promise.allSettled([...Et.values()]),Xe.clear(),Et.clear()}typeof window<"u"&&window.addEventListener("storage",e=>{!Ui||!e.key||!kn.includes(e.key)||Ut().catch(()=>{})});var _n="deepview.passkey.v1",Or="deepview.passkey.userId",Zo="deepview.passkey.cleanDisable",Qe="deepview.passkey.v1.write",am="deepview.triage.v1|",lm="deepview.opfs.v1|",cm="deepview.bundle.v1|",ee=null,mt=null,zt=null,xn=0;function Gi(){return xn>0}var Ki=0;function Jd(){return Ki>0}function dr(){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 Qd(e){localStorage.setItem(_n,JSON.stringify(e))}function dm(){localStorage.removeItem(_n)}function um(){try{let t=localStorage.getItem(Or);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(Or,e.toBase64({alphabet:"base64url",omitPadding:!0}))}catch{}return e}function es(){return typeof location>"u"?"":location.hostname}function X(){return dr()!==null}function it(){return ee!==null}function bt(){return!(!vn()||typeof navigator>"u"||!navigator.locks?.request||!es())}function Xd(){return mt}function Sn(){if(dr()!==null)return!1;try{return localStorage.getItem(Zo)==="1"?!1:localStorage.getItem(Or)!==null}catch{return!1}}function $e(){return ee}function Cn(){return G(am+(mt??""))}function ts(e){if(typeof e!="string")throw new TypeError("passkey vault: OPFS AAD requires a filename string");return G(lm+(mt??"")+"|"+e)}function rs(e){if(typeof e!="string")throw new TypeError("passkey vault: bundle AAD requires a slot string");return G(cm+(mt??"")+"|"+e)}var qi=new Set;function me(e){return qi.add(e),()=>qi.delete(e)}function Nr(){for(let e of qi)try{e()}catch(t){console.warn("passkey vault listener:",t)}}async function En({signal:e}={}){let t=dr();if(!t)return!1;let r;try{r=await Di({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")?$n(o):o}if(!r||r.length<32)throw $n();let n=await Oi(r);return r.fill(0),navigator.locks.request(Qe,async()=>{let o=dr();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 Ni(n),n.fill(0),mt=o.userId,zt=o.credentialId,Nr(),!0})}function $n(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 Yi({migrate:e,userName:t,rpName:r,signal:n,acknowledgeOrphan:o}){if(!vn())throw new Error("passkey: WebAuthn unavailable in this environment");if(Sn()&&!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(Qe,async()=>{if(X())throw new Error("passkey: encryption is already enabled");if(await Kd()===!1)throw $n();let l=um(),d=await qd({userName:t||"DeepView user",userId:l,rpName:r||"DeepView",rpId:s,...n?{signal:n}:{}}),u=d.prfOutput;if(!u)try{u=await Di({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(Or)}catch{}throw m&&m.message?.includes("PRF")?$n(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(Or)}catch{}throw $n()}let p=await Oi(u);u.fill(0);let f=await Ni(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,mt=h,zt=d.credentialId,Qd(b),typeof e=="function"&&await e({seal:(y,k)=>Dt(f,y,k)});try{localStorage.removeItem(Zo)}catch{}return Nr(),!0})}async function Ji({migrate:e}){if(!X())return{disabled:!1,signalAttempted:!1};if(!it())throw new Error("passkey: must unlock before disabling encryption");xn+=1;try{return await navigator.locks.request(Qe,async()=>{let t=dr();if(!t)return{disabled:!1,signalAttempted:!1};let r=ee;if(!r)return{disabled:!1,signalAttempted:!1};if(dm(),ee=null,zt=null,typeof e=="function"){let o=(s,i)=>cr(r,s,i);try{await e({open:o})}catch(s){throw Qd(t),ee=r,zt=t.credentialId,Nr(),s}}mt=null;try{localStorage.setItem(Zo,"1")}catch{}let n=await Qo(t).catch(()=>!1);return Nr(),{disabled:!0,signalAttempted:n}})}finally{xn-=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 pm(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 fm(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 pm(r,n);o&&t.push(o)}return t}async function An({refuseIfEnabled:e=!1}={}){xn+=1,Ki+=1;try{return await navigator.locks.request(Qe,async()=>{if(e&&X())throw new Error("passkey: encryption was just enabled in another tab. Reload this page to unlock instead of wiping.");await Yd();let t=dr();if(t)try{await Qo({credentialId:t.credentialId,rpId:t.rpId??es(),userId:t.userId})}catch{}try{localStorage.removeItem(_n)}catch{}try{localStorage.removeItem(Or)}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,mt=null,zt=null,Nr();let r=await fm(["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{xn-=1,Ki-=1}}function Zd(e){return ee?Dt(ee,e,Cn()):Promise.reject(new Error("passkey: vault locked, cannot seal triage"))}function eu(e){return ee?cr(ee,e,Cn()):Promise.reject(new Error("passkey: vault locked, cannot open triage"))}function ns(e,t){return ee?Dt(ee,e,ts(t)):Promise.reject(new Error("passkey: vault locked, cannot seal OPFS file"))}function tu(e,t){return ee?cr(ee,e,ts(t)):Promise.reject(new Error("passkey: vault locked, cannot open OPFS file"))}function Xi(e,t){return ee?Dt(ee,e,rs(t)):Promise.reject(new Error("passkey: vault locked, cannot seal bundle"))}function Qi(e,t){return ee?cr(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=dr();(!t&&ee||t&&ee&&t.credentialId!==zt)&&(ee=null,mt=null,zt=null),Nr()});var ra="__meta__",hm="deepview-reports",na="deepview-bundles",At="deepview.report:",ru=!1;async function oa(e,{create:t,warnOnce:r=!1}={}){try{return await(await navigator.storage.getDirectory()).getDirectoryHandle(e,{create:t})}catch(n){return r&&!ru&&(ru=!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 Zi(e,t){if(!Pe(e))return e;if(!$e())throw new Error(`storage: vault locked, cannot decrypt "${t}"`);return await tu(e,t)}async function Tn(e,t,r,n,o=()=>{}){if(X()&&!$e())throw o(),new Error(`storage: vault locked, cannot save ${n}`);let s=$e(),i=s?await t(e,r):e;if($e()!==s)throw o(),new Error(`storage: vault state changed mid-save for ${n}; retry`);return i}function ur(){return oa(hm,{create:!0,warnOnce:!0})}var at=new Map,Wt=new Map,ea=new Map;function re(e){ea.set(e,(ea.get(e)??0)+1)}function nu(e){return ea.get(e)??0}var ta=new Set;function ou(e){return ta.add(e),()=>ta.delete(e)}function Dr(e,t){for(let r of ta)try{r(e,t)}catch(n){console.warn("storage file-change listener:",n)}}async function le(){let e=await ur();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(At)&&t.push(n.slice(At.length))}return t.toSorted()}async function lt(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(Qe,{mode:"shared"},async()=>{let r=await ur();if(r){let s=await yn(G(t));s=await Tn(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){at.delete(e),re(e);try{await l.abort(d)}catch{}throw d}at.set(e,t),re(e),Dr(e,"save");return}let n=G(t);n=await yn(n),n=await Tn(n,ns,e,`"${e}"`,()=>re(e));let o=n.toBase64();try{localStorage.setItem(At+e,o),at.set(e,t),re(e),Dr(e,"save")}catch(s){throw re(e),new Error(`localStorage write failed for ${e}: ${s.message}`,{cause:s})}})}async function Me(e){if(at.has(e))return at.get(e);if(Wt.has(e))return Wt.get(e);let t=nu(e),r=(async()=>{let n=await ur();if(n){let d=await(await n.getFileHandle(e)).getFile(),u=new Uint8Array(await d.arrayBuffer());if(u=await Zi(u,e),u.length>=2&&u[0]===31&&u[1]===139){let f=await gt(u);return de(f)}let p=de(u);return lt(e,p).catch(f=>{console.warn(`storage: legacy-uncompressed migration of "${e}" failed:`,f)}),p}let o=localStorage.getItem(At+e);if(o===null)throw new Error(`File not found: ${e}`);let s=Uint8Array.fromBase64(o);s=await Zi(s,e);let i=await gt(s);return de(i)})();Wt.set(e,r);try{let n=await r;return nu(e)===t&&at.set(e,n),n}finally{Wt.delete(e)}}async function pr(e){let t=await ur(),r;if(t){let o=await(await t.getFileHandle(e)).getFile();r=new Uint8Array(await o.arrayBuffer())}else{let n=localStorage.getItem(At+e);if(n===null)throw new Error(`File not found: ${e}`);r=Uint8Array.fromBase64(n)}return r=await Zi(r,e),r}async function Rn(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),at.delete(e),navigator.locks.request(Qe,{mode:"shared"},async()=>{let r=await Tn(t,ns,e,`"${e}"`,()=>re(e)),n=await ur();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),Dr(e,"save");return}try{localStorage.setItem(At+e,r.toBase64()),re(e),Dr(e,"save")}catch(o){throw re(e),new Error(`localStorage write failed for ${e}: ${o.message}`,{cause:o})}})}async function Ur(e){return re(e),at.delete(e),Wt.delete(e),navigator.locks.request(Qe,{mode:"shared"},async()=>{let t=await ur();if(t){try{await t.removeEntry(e)}catch(r){if(!(r instanceof DOMException)||r.name!=="NotFoundError")throw re(e),r}re(e),Dr(e,"delete");return}localStorage.removeItem(At+e),re(e),Dr(e,"delete")})}var In="_meta.json";function Bn(){return oa(na,{create:!0})}function sa(e){return e.replaceAll("/","_")}async function ia(e){let t;try{let o=await(await e.getFileHandle(In)).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(Pe(t)){if(!$e())return console.warn("readBundleMeta: vault locked, returning empty bundle list"),[];try{r=await Qi(t,ra)}catch(o){return console.warn("readBundleMeta: decrypt failed (tampering, key mismatch, or vault identity drift):",o),[]}}try{let n=JSON.parse(de(r));return Array.isArray(n)?n:[]}catch(n){return console.warn("readBundleMeta: JSON.parse failed:",n),[]}}async function su(e,t){let r=G(JSON.stringify(t));r=await Tn(r,Xi,ra,"bundle metadata");try{await e.removeEntry(In)}catch{}let n=await e.getFileHandle(In,{create:!0});await os(n,r)}var gm=`${na}/${In}`;function iu(e){return navigator.locks.request(gm,e)}async function ct(){let e=await Bn();return e?[...await ia(e)].toSorted((r,n)=>r.name.localeCompare(n.name)):[]}async function aa(){if(typeof navigator>"u"||!navigator.storage?.getDirectory)return!1;let e=await oa(na,{create:!1});if(!e)return!1;try{for await(let t of e.entries())return!0}catch{}return!1}async function fr(e,t){let r=await Bn();if(!r)throw new Error(`Cannot save bundle ${e}: OPFS unavailable`);let n=t instanceof Uint8Array?t:G(t),o=await Vd(n),s=sa(o),i=e.toLowerCase().endsWith(".map")?await yn(n):n;return navigator.locks.request(Qe,{mode:"shared"},async()=>{i=await Tn(i,Xi,o,`bundle "${e}"`);try{await r.removeEntry(s)}catch{}let l=await r.getFileHandle(s,{create:!0});await os(l,i);try{await iu(async()=>{let d=await ia(r),u=d.findIndex(p=>p.integrity===o);u>=0?d[u]={integrity:o,name:e}:d.push({integrity:o,name:e}),await su(r,d)})}catch(d){try{await r.removeEntry(s)}catch{}throw d}return{integrity:o,name:e}})}async function la(e){let t=await Bn();if(t)return navigator.locks.request(Qe,{mode:"shared"},async()=>{try{await t.removeEntry(sa(e))}catch(r){if(!(r instanceof DOMException)||r.name!=="NotFoundError")throw r}await iu(async()=>{let r=await ia(t),n=r.filter(o=>o.integrity!==e);n.length!==r.length&&await su(t,n)})})}async function hr(e){let t=await Bn();if(!t)throw new Error("OPFS unavailable");let n=await(await t.getFileHandle(sa(e))).getFile(),o=new Uint8Array(await n.arrayBuffer());if(Pe(o)){if(!$e())throw new Error(`storage: vault locked, cannot read bundle "${e}"`);o=await Qi(o,e)}return o.length>=2&&o[0]===31&&o[1]===139?await gt(o):o}async function mm(e,t){let r=await ur();if(r){let l=await(await r.getFileHandle(e)).getFile(),d=new Uint8Array(await l.arrayBuffer()),u=await t(d);if(u===null)return;at.delete(e),Wt.delete(e),re(e);let p=await r.getFileHandle(e,{create:!0});await os(p,u),re(e);return}let n=localStorage.getItem(At+e);if(n===null)return;let o=Uint8Array.fromBase64(n),s=await t(o);s!==null&&(at.delete(e),Wt.delete(e),re(e),localStorage.setItem(At+e,s.toBase64()),re(e))}function au(e,t){return e.seal?r=>Pe(r)?null:e.seal(r,t):r=>Pe(r)?e.open(r,t):null}async function lu(e){let t=await le();for(let r of t)try{await mm(r,au(e,ts(r)))}catch(n){if(n instanceof DOMException&&n.name==="NotFoundError")continue;throw n}}var ca=({seal:e})=>lu({seal:e}),da=({open:e})=>lu({open:e});async function bm(){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 ym(e){return e===In?ra:e.startsWith("sha512-")?e.replaceAll("_","/"):null}async function wm(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 cu(e){let{dir:t,keys:r}=await bm();if(t)for(let n of r){let o=ym(n);if(o!==null)try{await wm(t,n,au(e,rs(o)))}catch(s){if(s instanceof DOMException&&s.name==="NotFoundError")continue;throw s}}}var ua=({seal:e})=>cu({seal:e}),pa=({open:e})=>cu({open:e});me(()=>{at.clear(),Wt.clear()});var is="deepview.viewMode",ss="deepview.repoUrls",vm=new Set(["grouped","list","table","kanban","focus"]);function km(){try{let e=localStorage.getItem(is);return e!==null&&vm.has(e)?e:null}catch{return null}}function ha(e){try{let t=JSON.parse(e||"{}");return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}}function as(){return ha(ge(ss))}function He(e){return e?as()[e]??"":""}var fa=new Set;function du(e){return fa.add(e),()=>{fa.delete(e)}}function $m(e){for(let t of fa)try{t(e)}catch(r){console.warn("repo-url listener:",r)}}function je(e,t){if(!e)return;let r=as();t?r[e]=t:delete r[e],ke(ss,JSON.stringify(r)).catch(n=>console.warn("saveRepoUrlFor:",n)),Vi(ss,n=>{let o=ha(n);return t?o[e]=t:delete o[e],JSON.stringify(o)}).catch(n=>console.warn("saveRepoUrlFor cross-tab merge:",n)),$m(e)}async function uu(e,t){await Vi(ss,r=>{let n=ha(r),o=t==="replace"?{...e}:t==="prefer-imported"?{...n,...e}:{...e,...n};return JSON.stringify(o)}),pu()}var a=Dd({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:km()??"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 pu(){a.repoEditing||a.currentFile&&(a.repoUrl=He(a.currentFile))}Lr(()=>{pu()});var xm=/^## ([A-Z][A-Z_]*)\s*\(\d+\)\s*$/mu;function _m(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 Sm(e){if(e)switch(e.toLowerCase()){case"high":return 8;case"medium":return 5;case"low":return 2;default:return}}function Cm(e){return typeof e=="string"?e.replace(/^`(.*)`$/u,"$1"):e}function zr(e){let t=e.replaceAll(/\r\n?/gu,`
4
- `).trim();if(!xm.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=_m(r[o]),l=(r[o+1]||"").split(/^### /mu).slice(1);for(let d of l){let u=Em(d,s);u&&n.push(u)}}return n.length===0?null:{type:"security",source:"deepsec",findings:n}}function Em(e,t){let r=e.indexOf(`
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
- `).filter(y=>!/^\s*- \*\*/u.test(y)).join(`
7
- `).replaceAll("**","").trim(),p=n+(u?`
8
-
9
- `+u:""),f=Cm(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=Sm(s.confidence);return m!==void 0&&(b.confidence=m),s.slug&&(b.slug=s.slug),b}var Am=new Set(["critical","high","medium","low","high_bug","bug","informational"]);function Wr(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=Tm(s);i&&n.push(i)}return n.length===0?null:{type:n.find(s=>s.type)?.type||"analysis",source:"claude-security",findings:n}}function Tm(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}=Im(n),i=Rm(o),l=Bm(s),{file:d,line:u,locationLink:p}=Fm(i.location||""),f=(l.severity||"").toLowerCase(),h=Am.has(f)?f:"medium",b=Mm(r,i),m=i["recommended fix"]?fu(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 Im(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 Rm(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 Bm(e){let t={};for(let r of e.matchAll(/\*\*([^:]+):\*\*\s*(.+)/gu))t[r[1].trim().toLowerCase()]=r[2].trim();return t}function Fm(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 Mm(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"]}`),fu(r.join(`
13
-
14
- `))}function fu(e){return e.replaceAll("**","")}function Lm(e){return Array.from(e,t=>t.toString(16).padStart(2,"0")).join("")}function Pm(e){let t="";for(let r=0;r<e.length;r++)t+=String.fromCodePoint(e[r]);return btoa(t)}async function hu(e){let t=typeof e=="string"?G(e):e,r=await crypto.subtle.digest("SHA-512",t);return`sha512-${Pm(new Uint8Array(r))}`}async function Om(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=Lm(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 Om(t)}catch{return null}}function Ht(e){try{return JSON.parse(e)}catch{return zr(e)??Wr(e)}}function jt(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 Hr(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 jr=new Map,Vr=new Map,Kr=new Map,cs=new Map;function Nm(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 Dm(e){return typeof e?.file!="string"?!1:/(?:^|\/)(?:node_modules|dependencies)\//u.test(e.file)}function Um(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 Mn=new Set,ga=new Set,Fn=null,ma=!1;function ba(e){return ga.add(e),()=>ga.delete(e)}function ya(){for(let e of ga)try{e()}catch{}}function ds(e){return jr.get(e)?.list??[]}function yt(){return Vr}function gr(){return Kr}function Ln(e,t){let r=jr.get(e);if(!r)return[];let n=r.reports.get(Vt(t));return n?[...n]:[]}function wa(e,t){let r=Vr.get(e);if(!r)return[];let n=r._keyReports.get(Vt(t));return n?[...n]:[]}function va(e,t){let r=Kr.get(e);if(!r)return[];let n=r._keyReports.get(Vt(t));return n?[...n]:[]}var gu=["type","model","think","effort","exportsMode"];function zm(e,t){if(!gu.some(r=>e[r]!==void 0))for(let r of gu)t[r]!==void 0&&(e[r]=t[r])}function Wm(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 jt(t))r&&zm(o,e),n.push(o);return n}function Vt(e){return e.id?`id:${e.id}`:`c:${e.severity??""}|${e.description??""}|${e.file??""}|${e.line??""}`}function ka(e,t,r){let n=cs.get(e);n||(n={hash:[],pkg:[],repo:[]},cs.set(e,n)),n[t].push(r)}function Hm(e,t,r){let n=jr.get(e.fileHash);n||(n={keys:new Set,list:[],reports:new Map},jr.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&&ka(r,"hash",{hash:e.fileHash,key:t}),n.keys.has(t)?s:(n.keys.add(t),n.list.push(e),!0)}function jm(e,t,r){let n=Nm(e);if(!n)return!1;let o=Wd(e),s=Vr.get(n);if(s||(s={...Vo(),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)}Hd(s,o,e,t,r);let i=Ko(s,t,r,e);return ka(r,"pkg",{pkg:n,key:t,file:e.file,version:o}),i}function Vm(e,t,r,n){if(Dm(e))return!1;let o=Um(e,n);if(!o)return!1;let s=Kr.get(o);s||(s=Vo(),Kr.set(o,s));let i=Ko(s,t,r,e);return i&&ka(r,"repo",{repo:o,key:t,file:e.file}),i}function $a(e){let t=cs.get(e);if(cs.delete(e),Mn.delete(e),!t)return!1;let r=!1;for(let{hash:o,key:s}of t.hash){let i=jr.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=>Vt(u)===s);d>=0&&i.list.splice(d,1)}i.keys.size===0&&jr.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,Vt),jd(d,l,s,i,e,Vt),!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=Kr.get(o);if(!l)continue;let d=l._keyReports.get(s);d&&(d.delete(e)&&(r=!0),d.size===0&&qo(l,s,i,Vt),l._keyReports.size===0?Kr.delete(o):Go(l))}return r}async function Km(e){if(Mn.has(e))return!1;Mn.add(e);try{let t=await Me(e),r=Ht(t);if(!r)return!1;let n=Wm(r);if(n.length===0)return!1;let o="";try{o=He(e)}catch{}let s=!1;for(let i of n){let l=Vt(i);i.fileHash&&Hm(i,l,e)&&(s=!0),i.file&&jm(i,l,e)&&(s=!0),i.file&&Vm(i,l,e,o)&&(s=!0)}return Mn.has(e)?s:($a(e),ma=!0,!1)}catch{return Mn.delete(e),!1}}function wt(){return Fn||(Fn=(async()=>{try{do{ma=!1;let e=await le();for(let t of e)await Km(t)&&ya()}while(ma)}finally{Fn=null}})(),Fn)}ou(e=>{$a(e)&&ya()});du(e=>{$a(e)&&ya(),wt().catch(()=>{})});var Pn=new Map,On=new Map;function us(e,t){if(!e||!t)return!1;let r=!On.has(e);On.set(e,t);for(let[n,o]of t){if(!o)continue;let s=Pn.get(o);s||(s=new Map,Pn.set(o,s)),s.set(e,n)}return r}function xa(e){let t=On.get(e);if(On.delete(e),!!t)for(let r of t.values()){let n=Pn.get(r);n&&(n.delete(e),n.size===0&&Pn.delete(r))}}function mr(e){if(!e)return[];let t=Pn.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 On.has(e)}var mu="deepview.fileCounts",Gr=null;function fs(){if(Gr)return Gr;try{Gr=JSON.parse(ge(mu)||"{}")}catch{Gr={}}return Gr}function Sa(){ke(mu,JSON.stringify(Gr)).catch(e=>console.warn("counts persist:",e))}function bu(e){let t=fs()[e];if(t!==void 0)return typeof t=="number"?{count:t}:t}function Dn(e){return bu(e)?.count}function Un(e){return bu(e)?.source}function Ve(e,t,r){let n=fs();n[e]=r?{count:t,source:r}:{count:t},Sa()}function Yr(e){let t=fs();delete t[e],Sa()}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=zr(e);if(t)return{count:t.findings.length,source:t.source,recognized:!0};let r=Wr(e);return r?{count:r.findings.length,source:r.source,recognized:!0}:{count:0,recognized:!1}}var Nn=null,qr=null,ps=null;function qm(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 Ca(e,t){if(Nn){t&&ps.push({names:new Set(e),onUpdate:t});for(let r of e)qr.add(r);return Nn}return qr=new Set(e),ps=t?[{names:new Set(e),onUpdate:t}]:[],Nn=(async()=>{await Promise.resolve();try{let r=fs();for(;qr.size>0;){let n=qr.values().next().value;if(qr.delete(n),r[n]===void 0)try{let o=await Me(n);if(r[n]!==void 0)continue;let{count:s,source:i}=Oe(o);r[n]=i?{count:s,source:i}:{count:s},Sa(),qm(n,s)}catch{}}}finally{Nn=null,qr=null,ps=null}})(),Nn}function Ea(e){if(!e)return"";for(let t of e.split(`
15
- `))if(t.trim())return t.trim();return""}function Aa(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);if(!(!t.has(i)||r.has(i))&&(r.set(i,{severity:s.severity,file:s.file,line:s.line,description:Ea(s.description)}),r.size===t.size))return r}return r}var Gm=`deepview/workspace-id/v1
16
- `;async function zn(e){let t=Uint8Array.fromBase64(e),r=G(Gm),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 yu=Wn("create"),wu=Wn("delete"),vu=Wn("privateKey"),ku=Wn("report-membership"),$u=Wn("bundle-membership"),Ym=yu.on,Ta=wu.on,Ia=vu.on,Ra=ku.on,Ba=$u.on,hs=yu.fire,Fa=wu.fire,Ma=vu.fire,gs=ku.fire,ms=$u.fire;var Pa="deepview.workspaces",Jm=1;function Hn(){try{let e=ge(Pa);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 Xm(e){await ke(Pa,JSON.stringify({version:Jm,workspaces:e}))}var Qm=Pa;function Jr(e){return navigator.locks.request(Qm,async()=>{await Ut();let t=Hn(),r=await e(t);if(r!==!1)return await Xm(t),r})}function jn(e){return{id:e.id,privateKey:e.privateKey,reports:Array.isArray(e.reports)?[...e.reports]:[],bundles:Array.isArray(e.bundles)?[...e.bundles]:[]}}var dt=Hn().map(jn);function Oa(){dt=Hn().map(jn)}function Na(e){dt=dt.filter(t=>t.id!==e.id),dt.push(jn(e))}function Zm(e,t){let r=Array.isArray(e[t])?[...e[t]]:[],n=dt.find(o=>o.id===e.id);if(n){n[t]=r;return}dt.push(jn(e))}function eb(e){dt=dt.filter(t=>t.id!==e)}function z(){let e=Hn();for(let t of e)Array.isArray(t.reports)||(t.reports=[]),Array.isArray(t.bundles)||(t.bundles=[]);return e}var tb=200;function vt(e){let t=(e??"").trim();return t&&t.replaceAll(/[\u0000-\u001F\u007F]/gu,"").slice(0,tb)||null}async function Da(e){let t=vt(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 Jr(i=>i.some(l=>l.id===o.id)?!1:(i.push(o),o))?(Na(o),o):null}async function Ua(e){await Jr(r=>{let n=r.findIndex(o=>o.id===e);return n<0?!1:(r.splice(n,1),!0)})&&(Fa(e),eb(e))}async function za(e,t){let r=vt(t);return!(!r||!await Jr(o=>{let s=o.find(i=>i.id===e);return!s||s.name===r?!1:(s.name=r,s)}))}async function xu(e){let t=await Jr(o=>{let s=o.findIndex(p=>p.id===e.id),i=s>=0?o[s]:null,l=vt(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=dt.find(o=>o.id===r.id)??null;return n==null?hs(r.id):(n.privateKey!==r.privateKey&&Ma(r.id),bs(n.reports,r.reports)||gs(r.id),bs(n.bundles,r.bundles)||ms(r.id)),Na(r),r}async function Wa({id:e,name:t,privateKey:r,createdAt:n}){let o=null;return await Jr(s=>{let i=vt(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=>vt(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),Na(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 La({identifier:e,workspaceId:t,field:r,fire:n,additive:o=!1,from:s=void 0}){let i=await Jr(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(k=>k.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&&Zm(p,r)}}function _u(e,t){return{move:(r,n)=>La({identifier:r,workspaceId:n,field:e,fire:t}),add:(r,n)=>La({identifier:r,workspaceId:n,field:e,fire:t,additive:!0}),remove:(r,n)=>La({identifier:r,field:e,fire:t,from:n})}}var Ha=_u("reports",gs),ja=_u("bundles",ms),Vn=Ha.move,Tt=Ha.add,Kn=Ha.remove,Va=ja.move,br=ja.add,Ka=ja.remove;function rb(){let e=Hn().map(jn),t=dt,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)||Fa(o);for(let[o,s]of n){let i=r.get(o);if(!i){hs(o);continue}i.privateKey!==s.privateKey&&Ma(o),bs(i.reports,s.reports)||gs(o),bs(i.bundles,s.bundles)||ms(o)}dt=e}Lr(()=>{rb()});function Su(e){return e==="fixed"||e==="invalid"||e==="deleted"?e:void 0}function ue(e){if(e)return Su(e.triage)??(e.deleted?"deleted":void 0)}function nb(e){return e?!e.color&&!ue(e)&&!e.comment&&!e.fix&&!(e.ignoredReports&&e.ignoredReports.length>0):!0}function It(e,t,r){let n=e.get(t)?.ignoredReports;return Array.isArray(n)&&n.includes(r)}function qn(e){if(!e||typeof e!="object")return;let t=e,r={};typeof t.color=="string"&&t.color&&(r.color=t.color);let n=Su(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 nb(r)?void 0:r}function ob(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 sb(e,t){let r=e??{},n=t??{};return(r.color??"")===(n.color??"")&&(ue(r)??"")===(ue(n)??"")&&(r.comment??"")===(n.comment??"")&&(r.fix??"")===(n.fix??"")&&ob(r.ignoredReports,n.ignoredReports)}function M(e,t,r){let n=e.get(t),o=qn({...n,...r});return o===void 0?e.delete(t):sb(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 qa=()=>{};function Eu(e){qa=typeof e=="function"?e:()=>{}}var Kt="deepview.triage",Rt="deepview.triage.pending",kt=/^\d+$/u;async function ib(e){let t=new Blob([e]).stream().pipeThrough(new CompressionStream("deflate"));return new Uint8Array(await new Response(t).arrayBuffer())}async function ab(e){let t=new Blob([e]).stream().pipeThrough(new DecompressionStream("deflate"));return new Uint8Array(await new Response(t).arrayBuffer())}var lb="deepview.triage.save",Cu=0;function Ga(){let e={};for(let[t,r]of a.triage){if(kt.test(t))continue;let n=qn(r);n&&(e[t]=n)}return e}function oe(){let e=++Cu,t=Ga(),r=Object.keys(t).length===0,n=r?null:JSON.stringify(t);if(n!=null)try{localStorage.setItem(Rt,n)}catch{}return navigator.locks.request(Qe,{mode:"shared"},async()=>{let o=null,s=null;if(n!=null)try{let i=G(n),l=await ib(i);s=$e(),o=(s?await Zd(l):l).toBase64()}catch(i){console.warn("Failed to save triage:",i),qa();return}await navigator.locks.request(lb,()=>{try{if(e!==Cu)return;if(n!=null&&$e()!==s){queueMicrotask(()=>{oe()});return}if(r)localStorage.removeItem(Kt),localStorage.removeItem(Rt);else{localStorage.setItem(Kt,o);try{localStorage.removeItem(Rt)}catch{}}}catch(i){console.warn("Failed to save triage:",i)}}),qa()})}async function Au(){let e=localStorage.getItem(Rt);if(e)try{return JSON.parse(e)}catch{}let t=localStorage.getItem(Kt);if(!t)return null;let r=Uint8Array.fromBase64(t);if(Pe(r)){if(!$e())throw new Error("triage: vault locked, cannot decrypt envelope");r=await eu(r)}let n=await ab(r);return JSON.parse(de(n))}function Tu(e,{replace:t=!1}={}){let r=a.triage;if(t){let n=null,o=localStorage.getItem(Rt);if(o)try{n=JSON.parse(o)}catch{}let s=i=>n!=null&&i in n;for(let i of[...r.keys()]){if(kt.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))&&!ue(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(kt.test(i))continue;let l=r.get(i)?.ignoredReports;if(!l||l.length===0)continue;let d=e?.[i],u=!!ue(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=ue(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 cb(){try{let e=await Au();Tu(e)}catch(e){console.warn("Failed to load triage:",e)}}async function Iu(){try{let e=await Au();Tu(e,{replace:!0})}catch(e){console.warn("Failed to reload triage:",e)}}typeof window<"u"&&window.addEventListener("storage",e=>{e.key!==Kt&&e.key!==Rt||Iu()});var Gn=cb();me(()=>{Iu()});me(()=>{$e()&&localStorage.getItem(Rt)&&oe()});async function Ya({seal:e}){try{localStorage.removeItem(Rt)}catch{}let t=localStorage.getItem(Kt);if(!t)return;let r=Uint8Array.fromBase64(t);if(Pe(r))return;let n=await e(r,Cn());localStorage.setItem(Kt,n.toBase64())}async function Ja({open:e}){try{localStorage.removeItem(Rt)}catch{}let t=localStorage.getItem(Kt);if(!t)return;let r=Uint8Array.fromBase64(t);if(!Pe(r))return;let n=await e(r,Cn());localStorage.setItem(Kt,n.toBase64())}var Ru="deepview.lastFile",Yn=null;function Xa(){return Yn||(Yn=db(),Yn.catch(()=>{Yn=null})),Yn}async function db(){try{await Gn}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 Me(o),await lt(s,i),await Ur(o)}catch(p){console.warn(`migrate: failed to rename ${o} -> ${s}`,p);continue}t.delete(o),t.add(s),n.add(o);let l=Dn(o);if(Yr(o),l===void 0){let{count:p,source:f}=Oe(i);Ve(s,p,f)}else{let{source:p}=Oe(i);Ve(s,l,p)}let d=He(o);d&&(je(o,""),je(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(),ge(Ru)===o)try{await ke(Ru,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 Kn(s,o.id),await Tt(i,o.id)}}var Qa=1;function ub(){let e=Ga(),t=as();return{version:Qa,exportedAt:new Date().toISOString(),triage:e,repoUrls:t}}function pb(){return`deepview-triage-${new Date().toISOString().replaceAll(/[:.]/gu,"-").slice(0,19)}.json.gz`}async function Za(){let e=ub();return{blob:new Blob([await Yo(JSON.stringify(e))]),filename:pb()}}async function el(e){let t;try{t=await wn(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!==Qa)throw new Error(`Unsupported backup version: ${r.version} (expected ${Qa})`);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 tl(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()])kt.test(l)||n.delete(l);let o=t==="prefer-current";for(let[l,d]of Object.entries(r)){if(kt.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=ue(d);if(u&&(!o||!ue(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)&&!ue(n.get(l)))for(let p of d.ignoredReports)typeof p=="string"&&(o&&It(n,l,p)||ne(n,l,p,!0))}await oe();let s=0,i=null;try{await uu(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 fb(e){return e?.name==="NotFoundError"||typeof e?.message=="string"&&e.message.startsWith("File not found:")}async function rl(e){let t=new Set;for(let r of e){let n;try{n=await Me(r)}catch(i){if(fb(i))continue;throw new Error(`Failed to read ${r}: ${i.message}`,{cause:i})}if(n==null)continue;let o=Ht(n);if(!Array.isArray(o?.findings))continue;let s=jt(o.findings);await Hr(s);for(let i of s)i.id&&t.add(i.id)}return t}function hb(){let e=new Set;for(let t of a.triage.keys())kt.test(t)||e.add(t);return e}async function ys(e){let t=hb();if(t.size===0)return{orphanedCount:0,sharedCount:0};let r=await rl(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 rl(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 rl(r),s=!1;for(let i of e){if(kt.test(i)||o.has(i))continue;let l=a.triage.get(i);!l||!(l.color||ue(l)||l.comment||l.fix)||M(a.triage,i,{color:void 0,triage:void 0,comment:void 0,fix:void 0,deleted:void 0})&&(s=!0)}for(let{id:i,report:l}of t)kt.test(i)||o.has(i)&&n.has(l)||It(a.triage,i,l)&&ne(a.triage,i,l,!1)&&(s=!0);s&&await oe()}var nl=1,Gt=16,Bu=12,Fu=1+Gt+Bu+16,qt=1+Gt+Bu;async function Mu(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 Lu(e){return!(e instanceof Uint8Array)||e.length<Fu?!1:e[0]===nl}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(qt+e.length+16);r[0]=nl,crypto.getRandomValues(r.subarray(1,1+Gt)),crypto.getRandomValues(r.subarray(1+Gt,qt));let n=r.subarray(1,1+Gt),o=r.subarray(1+Gt,qt),s=await Mu(t,n),i=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:o,additionalData:r.subarray(0,qt)},s,e));return r.set(i,qt),r}async function mb(e,t){if(typeof t!="string"||!t)throw new TypeError("tryDecryptWithPassword: password required");if(!(e instanceof Uint8Array)||e.length<Fu)return{ok:!1,reason:"malformed"};if(e[0]!==nl)return{ok:!1,reason:"malformed"};let r=e.subarray(1,1+Gt),n=e.subarray(1+Gt,qt),o=e.subarray(qt),s=await Mu(t,r),i;try{i=new Uint8Array(await crypto.subtle.decrypt({name:"AES-GCM",iv:n,additionalData:e.subarray(0,qt)},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 mb(e,t);if(n.ok)return n.plaintext;throw n.reason==="wrong-password"?new Error(r.wrongPasswordMsg):new Error(r.malformedMsg)}var Jn=Lu,Pu=vs;function Ou(e,t){return ks(e,t,{malformedMsg:"malformed encrypted bundle",wrongPasswordMsg:"wrong password or corrupt bundle"})}var bb=1;async function yb(e){let t=new Set,r=Ht(e);if(!Array.isArray(r?.findings))return t;let n=jt(r.findings);await Hr(n);for(let o of n)o.id&&t.add(o.id);return t}function Nu(e){return(e??"").replaceAll(/[^a-zA-Z0-9._-]+/gu,"_").replaceAll(/^_+|_+$/gu,"")||"workspace"}async function wb(e){if(!Array.isArray(e)||e.length===0)return[];let t=await ct(),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 hr(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 vb(e,{includeBundleBytes:t=!1}={}){let r=[],n=new Set;for(let u of e.reports??[]){let p;try{p=await Me(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 yb(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=qn({...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:bb,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 wb(l);u.length>0&&(d.bundleBlobs=u)}return d}async function Du(e,{includeBundleBytes:t=!1}={}){let r=await vb(e,{includeBundleBytes:t});return{blob:new Blob([await Yo(JSON.stringify(r))]),filename:`${Nu(e.name)}.deepview-workspace.json.gz`}}async function kb(e,t,{includeBundleBytes:r=!1}={}){if(typeof t!="string"||!t)throw new TypeError("buildWorkspaceExportEncrypted: password required");let{blob:n}=await Du(e,{includeBundleBytes:r}),o=new Uint8Array(await n.arrayBuffer()),s=await Pu(o,t);return{blob:new Blob([s],{type:"application/octet-stream"}),filename:`${Nu(e.name)}.deepview-workspace.enc`}}async function ol(e,{password:t,includeBundleBytes:r=!1}={}){return typeof t=="string"&&t?await kb(e,t,{includeBundleBytes:r}):await Du(e,{includeBundleBytes:r})}var $b=1,Uu=1024,zu=1024,$s=200,Vu=100*1024*1024,xb=Math.ceil(Vu*4/3)+16,Wu=512,Hu=64;function _b(e){if(!e||typeof e!="object")return"payload is not an object";if(e.version!==$b)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>zu)return`reports count (${e.reports.length}) exceeds cap (${zu})`;if(e.bundles!==void 0){if(!Array.isArray(e.bundles))return"bundles field must be an array when present";if(e.bundles.length>Uu)return`bundles count (${e.bundles.length}) exceeds cap (${Uu})`;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>Hu)return`bundleBlobs count (${e.bundleBlobs.length}) exceeds cap (${Hu})`;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>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>xb)return`bundleBlobs.data exceeds per-blob size cap (${Vu} bytes raw)`}}return null}async function sl(e){return new Uint8Array(await e.arrayBuffer())}async function xs(e,t){if(Jn(e)){if(typeof t!="string"||!t)throw new TypeError("parseWorkspaceBundleBytes: password required for encrypted bundle");let n=await Ou(e,t);try{return ju(await wn(n))}catch(o){throw new Error("wrong password or corrupt bundle",{cause:o})}}let r;try{r=await wn(e)}catch(n){throw new Error(`gzip decompression failed: ${n.message}`,{cause:n})}return ju(r)}function ju(e){let t;try{t=JSON.parse(e)}catch(o){throw new Error(`payload is not JSON: ${o.message}`,{cause:o})}let r=_b(t);if(r===null)return t;let n=r.includes("exceeds cap");throw new Error(n?r:`not a deepview workspace export: ${r}`)}function Sb(e){return ue(e)??null}async function Cb(e){let t=new Map;for(let r of e??[]){if(typeof r?.content!="string")continue;let n=Ht(r.content);if(!n?.findings)continue;let o=jt(n.findings);await Hr(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:Ea(s.description)})}return t}async function Eb(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=Sb(i),m=ue(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,ignoredReports:void 0});let y=Array.isArray(i.ignoredReports)?i.ignoredReports:[];if(!ue(n.get(s)))for(let k of y)typeof k=="string"&&ne(n,s,k,!0)}if(o.length>0&&t){let s=await t(o,r??new Map);s&&Ab(o,s)}await oe()}function Ab(e,t){for(let r of e){let n=`${r.id}:${r.property}`;t[n]==="imported"&&Tb(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 Tb(e,t){if(t==="color")return a.triage.get(e)?.color;if(t==="triage")return ue(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 Ib(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 fr(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 il(e,{conflictResolver:t}={}){let r=[];for(let u of e.reports)if(!(typeof u?.name!="string"||typeof u?.content!="string"))try{await lt(u.name,u.content);let{count:p,source:f}=Oe(u.content);Ve(u.name,p,f??Un(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 Ib(e.bundleBlobs);let o=e.triage&&Object.keys(e.triage).length>0?await Cb(e.reports):new Map;await Eb(e.triage,t,o);let s=Array.isArray(e.bundles),i=s?e.bundles.filter(u=>typeof u=="string"&&u.length>0):[],l=await xu({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)||(je(u,p),a.currentFile===u&&(a.repoUrl=p));return l}async function al({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 vs(G(JSON.stringify(s)),n)).toBase64({alphabet:"base64url",omitPadding:!0})}async function ll({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 Rb(n)}catch(o){throw new Error("wrong password or corrupt link",{cause:o})}}async function Rb(e){let t=JSON.parse(de(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(t.n.length>1024)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 cl(e){return typeof location>"u"?`#share=${e}`:`${location.origin}${location.pathname}#share=${e}`}function dl(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 Bb={get state(){return a},listWorkspaces:z,addReportToWorkspace:Tt,addBundleToWorkspace:br,onReportMembershipChanged:Ra,onBundleMembershipChanged:Ba,onWorkspaceDeleted:Ta,onWorkspacePrivateKeyChanged:Ia,analyzeContent:Oe,setCount:Ve,gunzipBytes:gt,listBundles:ct,listFiles:le,readBundle:hr,readFileBytes:pr,saveBundle:fr,saveFileBytes:Rn,saveTriage:oe,getSecureItem:ge,setSecureItem:ke,removeSecureItem:Pr,onSecureStorageHydrated:Lr};function Ku(e){e.installSyncHost(Bb),Eu(()=>e.triageSync.notify())}var U=null,Xn=null;function Ju(){try{return ge("deepview.sync.userEnabled")!=="0"}catch{return!0}}function ul(){return Xn||(Xn=(async()=>{let e="./client-sync.js";try{let t=await import(e);return Ku(t),U=t,Fb(),t}catch(t){throw Xn=null,t}})(),Xn)}function Xu(){return ul()}var Qu=[];function Zn(e){U?e(U):Qu.push(e)}function Fb(){let e=Qu.splice(0);for(let t of e)try{t(U)}catch(r){console.warn("client-sync: deferred apply failed:",r)}}function Qn(e,t){let r={cancelled:!1,unsub:null};return Zn(n=>{r.cancelled||(r.unsub=t(n,e))}),()=>{r.cancelled=!0,r.unsub&&r.unsub()}}function pl(e,t){return U?U.isInRemote(e,t):!1}function Zu(e,t){return U?U.isBundleInRemote(e,t):!1}var Mb="deepview.objstore-presence.";function ep(e){try{let t=localStorage.getItem(Mb+e);if(!t)return null;let r=JSON.parse(t);return r&&typeof r=="object"?r:null}catch{return null}}function eo(e,t){if(U&&U.isInRemote(e,t))return!0;let r=ep(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 fl(e,t){if(U&&U.isBundleInRemote(e,t))return!0;let r=ep(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 tp(e){return U?U.remoteCount(e):0}function rp(e){return Qn(e,(t,r)=>t.onAutoDownloaded(r))}function np(e){return Qn(e,(t,r)=>t.onBundleAutoDownloaded(r))}function op(e){return Qn(e,(t,r)=>t.onChange(r))}var qu=null,Gu=null,Yu=null,_s=[];function sp(e){if(U){U.setRedraw(e);return}qu=e,Zn(t=>{qu===e&&t.setRedraw(e)})}function ip(e){if(U){U.setAuthenticationResolver(e);return}Gu=e,Zn(t=>{Gu===e&&t.setAuthenticationResolver(e)})}function ap(e){if(U){U.setHydrationConflictResolver(e);return}Yu=e,Zn(t=>{Yu===e&&t.setHydrationConflictResolver(e)})}async function Bt(e,t){if(!(!Ju()&&!U))return(await ul())[e](...t)}function lp(...e){return Bt("fetchFile",e)}function cp(...e){return Bt("fetchBundleFromRemote",e)}function Ss(...e){return Bt("putFile",e)}function dp(...e){return Bt("putBundleToRemote",e)}function Cs(...e){return Bt("deleteFromRemote",e)}function Es(...e){return Bt("deleteBundleFromRemote",e)}function As(...e){return Bt("openWorkspace",e)}function to(...e){return Bt("closeWorkspace",e)}function up(...e){return Bt("recheckRemoteStorage",e)}function Yt(e,t){if(U)return U.triageSync[e](...t);Zn(r=>{r.triageSync[e](...t)})}var N={get status(){return U?U.triageSync.status:"off"},get openSessions(){return U?U.triageSync.openSessions:[]},get persistenceDegraded(){return U?U.triageSync.persistenceDegraded:!1},setEnabled(e){if(e===!0)return ul().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(U){_s=U.openWorkspaceIds();for(let t of _s)try{U.closeWorkspace(t)}catch(r){console.warn(`client-sync: closeWorkspace(${t}) failed during disable:`,r)}U.triageSync.setEnabled(!1);return}Yt("setEnabled",[e])},isEnabled(){return U?U.triageSync.isEnabled():Ju()},openSession(e){Yt("openSession",[e])},closeSession(e){Yt("closeSession",[e])},refreshSession(e){Yt("refreshSession",[e])},dismissError(e){Yt("dismissError",[e])},setForcedOff(e){Yt("setForcedOff",[e])},setServerUrl(e){Yt("setServerUrl",[e])},getServerUrl(){return U?U.triageSync.getServerUrl():null},notify(){Yt("notify",[])},onStatusChange(e){return Qn(e,(t,r)=>t.triageSync.onStatusChange(r))},onPersistenceDegraded(e){return Qn(e,(t,r)=>t.triageSync.onPersistenceDegraded(r))}};var ro=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:[]}}};ro.directiveName="unsafeHTML",ro.resultType=1;var pe=ft(ro);var pp=`*,*: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 fp=`.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 hp=`*,*: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 T=class extends H{static styles=[A(hp)];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 hl=class extends T{static styles=[...T.styles,A(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=Sn(),this._vaultStateUnsub=me(()=>{if(this._settled)return;let t=Sn();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 An({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(!bt()){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 Yi({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 Hi({seal:r}),this._phase="Encrypting triage data\u2026",await Ya({seal:r}),this._phase="Encrypting report files\u2026",await ca({seal:r}),this._phase="Encrypting bundles\u2026",await ua({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=bt();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",hl);function Ts(){return K("passkey-setup-dialog")}var gl=class extends T{static styles=[...T.styles,A(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 En({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",gl);function Is(){return K("passkey-unlock-dialog")}var gp=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>`,Db=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>`,xe=null;function mp(){if(!xe)return;if(!bt()){xe.hidden=!0;return}xe.hidden=!1;let e=X(),t=it();xe.classList.toggle("encrypted",e&&t),xe.classList.toggle("locked-pending",e&&!t),e&&t?(xe.title="Encryption on \u2014 click to disable",xe.setAttribute("aria-label","Disable encryption"),W(gp,xe)):e?(xe.title="Encryption on, locked \u2014 click to unlock",xe.setAttribute("aria-label","Unlock encrypted data"),W(gp,xe)):(xe.title="Encryption off \u2014 click to enable",xe.setAttribute("aria-label","Enable encryption"),W(Db,xe))}async function Ub(){if(confirm(`Disable encryption?
21
-
22
- Your local triage and report data will be rewritten as plaintext.
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 Ji({migrate:async({open:t})=>{await ji({open:t}),await Ja({open:t}),await da({open:t}),await pa({open:t})}}))?.disabled&&alert(`Encryption disabled. Your data is now plaintext.
25
-
26
- To complete cleanup, remove the DeepView passkey from your password manager / OS settings:
27
- \u2022 macOS / iOS: Settings \u2192 Passwords
28
- \u2022 Windows: Settings \u2192 Accounts \u2192 Sign-in options \u2192 Passkeys
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 zb(){await Ts()}function bp(e){if(!e||e===xe)return;xe=e;let t=!1;xe.addEventListener("click",async()=>{if(!t){t=!0;try{if(!X()){await zb();return}if(!it()){await Is();return}await Ub()}finally{t=!1}}}),me(mp),mp()}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=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 Ne(e){return e.toLowerCase().endsWith(".codex")?e.slice(0,-6).replaceAll("__","/"):e}var yp=globalThis[Symbol.for("@rray/frontend")];if(!yp)throw new Error("@rray/frontend global not installed; view.js must run before lazy bundles import this wrapper");var{LitElement:z1,html:ml,nothing:wp,unsafeCSS:W1,render:H1,StateElement:j1,classMap:V1,repeat:K1,styleMap:q1}=yp;var qe={critical:6,high:5,medium:4,low:3,high_bug:2,bug:1,informational:0},be=["critical","high","medium","low","high_bug","bug","informational"],Bs="node_modules";function vp(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 kp(){return Bs}function Jt(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 Ft(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 Wb(e){let t=Bs==="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 yr(e){let t=e?.exportName,r=e?.methodName;return t&&r&&t!==r?`${t}.${r}`:t||r||""}function $p(e){return[e.file,e.description,e.recommendation,e.confidenceReason,e.discoveredIn,e.repo?.github].filter(Boolean).join(`
31
- `).toLowerCase()}function bl(e){return e&&e.replace(/^[^/]+\//u,"").replace(/^claude-/u,"").replaceAll("-"," ")}function wr(e){return[e.type,bl(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 xp(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 Xr(e,t,r){if(t)return`https://github.com/${t}/blob/HEAD/${Wb(e)}`;if(Jt(e))return null;let n=xp(r);return n?`${n}/blob/HEAD/${e}`:null}function yl(e,t,r){let n=Xr(e,t,r);return n?ml`<a href="${n}" target="_blank" rel="noopener">${e}</a>`:e}function Qr(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 wp;let s=Xr(e,r,n),i=`line ${o}`;return s?ml`<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 Cp(e,t){let r=[];return t&&r.push(`Repo: ${t}`),e.file&&r.push(`File: ${e.file}`),e.line!==void 0&&e.line!==null&&e.line!==""&&r.push(`Line: ${e.line}`),e.description&&r.push(`Description: ${e.description}`),e.confidence!==void 0&&e.confidence!==null&&r.push(`Confidence: ${e.confidence}/10`),r.join(`
32
- `)}function Ep(e,{title:t,body:r}={}){let n=xp(e);if(!n)return null;let o;try{o=new URL(n).host.toLowerCase()}catch{return null}if(o!=="github.com")return null;let s=new URLSearchParams;t&&s.set("title",t),r&&s.set("body",r);let i=s.toString();return i?`${n}/issues/new?${i}`:`${n}/issues/new`}function P(e){return e.id??String(e._id)}function Te(e){return P(e[0])}function wl(e){return Array.isArray(e)?e:[e]}function Ms(e){return e?._reportName??""}function Zr(e){return It(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 _e(e){let t=a.activeTabByGroup.get(Te(e));if(t){let r=e.find(n=>P(n)===t);if(r)return r}return Ue(e)}function Ls(e){for(let t of yt().values())if(t.files.has(e.file))return t.repos&&t.repos.size===1?[...t.repos][0]:null;return e.repo?.github??e._repoFallback??a.repoUrl??null}function ye(e){let t=e.map(f=>{let h=P(f),b=a.triage.get(h),m=b?.triage??(Zr(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 Mt(){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,k=[];for(let w of h){let v=m.get(w);v&&(k.push(v),y.add(v))}for(let w of p)y.has(w)||k.push(w);l.push(k)}return l}function vr(e){for(let t of Mt())if(Te(t)===e)return t;return null}var oo="\0",so="";function vl(e){return typeof e.repo?.github=="string"&&e.repo.github?e.repo.github:typeof e._repoFallback=="string"&&e._repoFallback?e._repoFallback:null}function Ps(){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 Hb(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&&Jt(e.file)||!r&&!Jt(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=vl(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;if(t){if($p(e).includes(t))return!0;let r=a.triage.get(P(e));return!!(r&&((r.comment??"").toLowerCase().includes(t)||(r.fix??"").toLowerCase().includes(t)))}return!0}function Ip(e){return e.filter(t=>t.some(Hb))}function Ap(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 Rp(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 Tp=Rp("desc"),jb={severity:(e,t)=>(qe[t.severity]||0)-(qe[e.severity]||0)||Tp(e,t)||parseInt(e.line,10)-parseInt(t.line,10),"confidence-desc":Tp,"confidence-asc":Rp("asc"),"priority-desc":Ap("priority","desc",-1),"priority-asc":Ap("priority","asc",11)};function Bp(e){let t=jb[a.sortBy];return t?[...e].toSorted((r,n)=>t(Ue(r),Ue(n))):[...e]}var Ie=ft(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(!Sd(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 $l={"claude-security":"Claude Security","codex-security":"Codex Security",deepsec:"DeepSec"};function Vb(e){return e==null?"(none)":$l[e]??e}var kl=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="${Ie(a.filterAnalyzer)}" @change="${this._onChange}"><option value="">All analyzers</option>${this.options.map(t=>c`<option value="${t??oo}">${Vb(t)}</option>`)}</select>`}_onChange=t=>{this.dispatchEvent(new CustomEvent("analyzer-change",{detail:{value:t.target.value},bubbles:!0,composed:!0}))}};customElements.define("analyzer-select",kl);function en(e){return e==="informational"?"info":e.replaceAll("_"," ")}function Os(e){if(!e)return"";for(let t of e.split(`
33
- `))if(t.trim())return t.trim();return""}function Kb(e){if(!e)return{title:"",body:""};let t=e.indexOf(`
34
- `);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 Fp=/"[^"\n]+"|`[^`\n]+`/gu;function xl(e){if(!e)return e;Fp.lastIndex=0;let t=[],r=0,n;for(;(n=Fp.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 qb(e){let t=Xr(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 Gb(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 Yb=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>`,Jb=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>`,Xb=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>`,Qb=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>`,Zb=c`<svg viewBox="0 0 16 16" width="11" height="11" aria-hidden="true"><circle cx="8" cy="8" r="6" fill="none" stroke="currentColor" stroke-width="1.2"/><circle cx="8" cy="8" r="1.7" fill="currentColor"/></svg>`;function ey(e){let t=Os(e.description)||e.file||"Security finding";return t.length>120?`${t.slice(0,119)}\u2026`:t}function ty(e){let t=Xr(e.file,e.repo?.github,e._repoFallback??a.repoUrl),r=parseInt(e.line,10),n=Number.isFinite(r),o=n?`${e.file}:${r}`:e.file,s=t&&n?`${t}#L${r}`:t,i=[];return e.file&&i.push(`File: ${s?`[${o}](${s})`:o}`),e.description&&i.push(e.description),e.confidence!==void 0&&e.confidence!==null&&i.push(`Confidence: ${e.confidence}/10`),i.join(`
35
-
36
- `)}function ry(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}">${pe(r)}<span class="report-chip-label">${Ne(t)}</span></span>`}function Mp(e,t,r,n,o=null){let s=ry(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}">${Yb}${h?c`<span class="mark-btn-label">${b}</span>`:g}</button>`,k=c`<button type="button" class="${F({"mark-fix":!0,"has-fix":u})}" title="${f}" aria-label="${f}">${Jb}${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">${Xb}${h?c`<span class="mark-btn-label">Copy</span>`:g}</button>`,v=_e(e),S=Ls(v),I=Ep(S,{title:ey(v),body:ty(v)}),R=I?c`<a class="mark-issue" href="${I}" target="_blank" rel="noopener" title="Create a pre-filled GitHub issue for this finding" aria-label="Create a GitHub issue for this finding">${Zb}${h?c`<span class="mark-btn-label">Issue</span>`:g}</a>`:g,O=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">${Qb}${h?c`<span class="mark-btn-label">Claude</span>`:g}</button>`,ce=c`<color-marker .selected="${l}"></color-marker>`,V=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}${k}</span><span class="mark-action-group">${w}${R}${O}</span>${ce}${oy(e,V,o)}`}function ny(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 oy(e,t,r=null){let n=P(e[0]),o=ye(e),s=_e(e),i=P(s),l=o.hasConflict?a.triage.get(i)?.triage??(Zr(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 k=`triage-menu-${n.replaceAll(/[^A-Za-z0-9_-]/gu,"_")}`;return c`<div class="triage-menu-wrap"><button type="button" class="${y.join(" ")}" popovertarget="${k}" 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="${k}" class="triage-menu" data-gid="${n}" role="menu" @beforetoggle="${ny}">${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 Lp(e,t){let r=P(e),n=a.triage.get(r),o=n?.color,s=n?.triage,i=Zr(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}`}">${en(e.severity)}</span> ${e.confidence===void 0?g:c`<span class="tab-conf">${e.confidence}/10</span>`}</span></button>`}function sy(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 iy=/^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/iu;function ay(e){let t=e?.name;if(typeof t!="string"||!iy.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 ly(e,t,r=0,n=1,o=null){let s=P(e),i=a.triage.get(s),l=i?.comment??"",d=i?.fix??"",u=Xr(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=yr(e),y=m?c`<span class="line-num">${b}, ${m}</span>`:c`<span class="line-num">${b}</span>`,k=wr(e),w=o==="focus"?ay(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=mr(e.fileHash).find(({integrity:ce})=>R.has(ce));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:I}=Kb(et(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}`}">${en(e.severity)}</span><div class="value-label">Severity</div>${e.confidence===void 0?g:sy(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} ${k?c`<span class="run-meta">${k}</span>`:g}</div>${S?c`<div class="desc-title">${S}</div>`:g} ${I?c`<div class="desc">${xl(I)}</div>`:g} ${e.recommendation?c`<div class="recommendation">Recommendation: ${xl(et(e.recommendation,e))}</div>`:g} ${e.confidenceReason?c`<div class="conf-reason">${xl(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> ${Qr(d)?c`<a href="${d}" target="_blank" rel="noopener noreferrer">${d}</a>`:d}</div>`:g}</div></div>`}function tn(e){return Te(e)}function Pp(e){let t=ye(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 Op(e,t={}){let{context:r=null}=t,n=ye(e),o=no(e),s=_e(e),i=P(s),l=s.commitHash?c`<div class="commit-ref">introduced in ${Gb(s.repo?.github,s.commitHash)}</div>`:g,d=a.currentWorkspace&&l!==g;return c`${o.map((u,p)=>ly(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=>Lp(u,P(u)===i))}</div>`:g}</div>${Mp(e,o,n,i,r)}</div>`}function io(e){return Te(e)}function Np(e){let t=ye(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 Dp(e){let t=ye(e),r=no(e),n=_e(e),o=P(n),s=n,i=Os(et(s.description,s)),l=wr(s),d=yr(s),u=d?`, ${d}`:"";return c`<div class="row-score"><span class="${`badge ${s.severity}`}">${en(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">${qb(s)}${u}</span><div class="marks">${Mp(e,r,t,o)}</div></div>${r.length>1?c`<div class="tabs-row"><div class="tabs">${r.map(p=>Lp(p,P(p)===o))}</div></div>`:g}</div>`}function ao(e){return"tree-"+e.replaceAll(/[^\w-]+/gu,"_")}var zp=()=>Object.fromEntries(be.map(e=>[e,0]));function _l(e){let t=new Map;for(let r of e)for(let n of r){t.has(n.file)||t.set(n.file,zp());let o=t.get(n.file);o[n.severity]!==void 0&&o[n.severity]++}return t}function Sl(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 Ns(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=zp();for(let l of o){let d=t.get(l);if(d)for(let u of be)i[u]+=d[u]??0}r.set(n,i)}return r}function Cl(e,t,r){let n=t.get(e),o=r.get(e);return Up(n)>0||Up(o)>0}function Up(e){if(!e)return 0;let t=0;for(let r of be)t+=e[r]??0;return t}function Wp(e){if(!e)return g;let t=mr(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 Hp(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=be.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?be.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,k=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>`} ${k?c`<span class="tree-table-size">${k}</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">${cy(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} ${Wp(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 cy(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} ${Wp(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 dy(){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 Xt=dy(),E=new Proxy(Xt,{get(e,t){return Xt[t]},set(e,t,r){return Xt[t]=r,!0},has(e,t){return t in Xt},deleteProperty(e,t){return delete Xt[t]},ownKeys(){return Reflect.ownKeys(Xt)},getOwnPropertyDescriptor(e,t){return Object.getOwnPropertyDescriptor(Xt,t)}});function ze(){E.graphState?._cleanup&&E.graphState._cleanup(),E.graphState=null}function jp(){return Xt}var lo=null,Vp=null;function rn(){return Vp}function uy(){return lo||(lo=(async()=>{let e="./graph.js";try{let t=await import(e);return t._swapGraph2Impl(jp()),Vp=t,t}catch(t){throw lo=null,t}})(),lo)}async function El(e,t,r,n,o){try{let s=await uy(),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 ut(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 py(){return co||(co=(async()=>{let e="./terminal.js";try{return await import(e)}catch(t){throw co=null,t}})(),co)}function fy(e){let t=ut(e);if(t.size===0)return t;let r=[...t.keys()],{stripped:n}=Ft(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??"";(!uo||uo.integrity!==r)&&(uo={integrity:r,promise:hy(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 hy(e,t){return(await py()).createTerminalElement(fy(e),t)}function Gp(e){if(!e)return null;let t=kp()==="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 gy=["#4e9af1","#f28e2b","#59a14f","#e15759","#76b7b2","#edc948","#b07aa1","#ff9da7","#9c755f","#5cd1e5","#f1ce63","#d37295","#a0cbe8","#86bcb6","#8cd17d","#b6992d","#499894","#e15759","#e879c7","#d4a6c8"],qp=["#2f8aef","#d2691e","#2ea043","#e63946","#2e9a92","#b88817","#9560e8","#d24a9c","#8a5d40","#0891b2","#a07a14","#c14e8e","#1f7ad0","#549b94","#3fb95f","#a07a14","#2a8278","#cb2c40","#c026d3","#965f93"];function my(){if(typeof document>"u")return!1;let e=document.body?.classList;return!!e&&(e.contains("theme-light")||e.contains("theme-pink"))}var Al=new Map;function Lt(e){let t=my()?qp:gy,n=`${t===qp?"l":"d"}:${e??"__own__"}`;if(Al.has(n))return Al.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 Al.set(n,d),d}var Tl=(e,t,r)=>{for(let n of t)if(n[0]===e)return(0,n[1])();return r?.()};var nn='<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>',Ds='<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 Us=null;function by(){return Us||(Us=(async()=>await import("./prism.js"))(),Us)}var yy={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 zs(e){if(typeof e!="string")return null;let t=e.lastIndexOf(".");return t<0?null:yy[e.slice(t+1).toLowerCase()]??null}async function Ws(e,t){if(!t)return null;try{return(await by()).highlight(e,t)}catch{return null}}var we=`.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}
37
- `;var Il=class extends T{static styles=[...T.styles,A(we)];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",Il);function Yp({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:vy(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 vy(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 on(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 ky=e=>e&&[null,Object.prototype].includes(Object.getPrototypeOf(e)),sn=e=>Object.setPrototypeOf(Object.fromEntries(e),null),Jp=e=>[...e].toSorted((t,r)=>on(t,r)),Hs=e=>sn([...e].toSorted((t,r)=>on(t[0],r[0])).map(([t,r])=>[t,r instanceof Map?Hs(r):r])),Rl=e=>new Map(Object.entries(e).map(([t,r])=>[t,ky(r)?Rl(r):r]));function Xp(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,Bl=0,js=({name:e,version:t,files:r})=>({name:e,version:t,files:sn(Object.entries(r))}),Qp=e=>Xp(e)??{dir:".",rel:e,name:null},Vs=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}={}){D([Bl,$t].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===$t||r.version===Bl),D(["node_modules","full"].includes(r.config?.scope)),D(r.formats),D(r.imports);let n=new Map,o=new Set;if(r.version===$t){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,js(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,js(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}=Qp(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:Rl(r.imports)})}static parseResources(t){let r=JSON.parse(t);D(r.version===$t||r.version===Bl);let n=new Map,o={scope:"full"};if(r.version===$t){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,js(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,js(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}=Qp(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=sn(Object.entries(i).toSorted((p,f)=>on(p[0],f[0])));(l?t:r).push([n,{name:o,version:s,files:d}])}return t.sort((n,o)=>on(n[0],o[0])),r.sort((n,o)=>on(n[0],o[0])),{modules:sn(t),sources:sn(r)}}serializeCode(){let t=Jp(this.entries),{modules:r,sources:n}=this.#e(),o=Hs(this.formats),s=Hs(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 Ks=null,qs=null,Gs=null;function $y(){for(let e of["br","brotli"])try{return new DecompressionStream(e),e}catch{}return null}async function xy(e,t){let r=new Blob([t]).stream().pipeThrough(new DecompressionStream(e));return new Uint8Array(await new Response(r).arrayBuffer())}async function _y(){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 Sy(){return Gs||(Gs=(async()=>await import("./brotli-fallback.js"))(),Gs)}async function Cy(){await _y();let e=$y();return e?(Ks={kind:"native",format:e},Ks):(Ks={kind:"fallback"},Ks)}function Zp(){return qs||(qs=Cy(),qs)}async function ef(e){let t=await Zp();return t.kind==="native"?xy(t.format,e):(await Sy()).brotliDecompress(e)}Zp().catch(()=>{});async function Ys(e,t){try{let r=await hr(e),n=t.name.toLowerCase().endsWith(".map"),o=n?"sourcemap":"stasis";try{if(n){let l=JSON.parse(de(r));return{integrity:e,kind:o,size:r.byteLength,json:l}}let s=de(await ef(r)),i=Vs.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 Ey(e){!e?.json&&!e?.bundle||(async()=>{try{let t=await Ml(e);if(us(e.integrity,t),a.selectedBundle!==e.integrity)return;e.fileHashes=t,$()}catch{}})()}async function Fl(e){if(_a(e))return;let t=(a.bundles??[]).find(n=>n.integrity===e);if(!t)return;let r=await Ys(e,t);if(!(!r?.json&&!r?.bundle))try{let n=await Ml(r);us(e,n)}catch{}}async function Qt(e){let t=(a.bundles??[]).find(n=>n.integrity===e);if(!t)return;let r=await Ys(e,t);a.selectedBundle===e&&(a.bundleDetails=r,$(),Ey(r),wt().catch(()=>{}))}var Ay=["finding_url","repository","title","description","severity","configured_scan_id","relevant_paths"];function Ty(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===`
38
- `||l==="\r"?(r.push(n),t.push(r),r=[],n="",l==="\r"&&e[i+1]===`
39
- `&&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 tf(e){let t=Ty(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 Ay)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=>Iy(m,o));i.push({displayName:h,data:{type:"security",source:"codex-security",findings:b}})}return i}function Iy(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}
40
-
41
- ${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 an=`.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)}}
42
- `;var rf=`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)}
43
- `;function ln(e){if(!e)return g;let t=e.replaceAll("_"," ");return c`<span class="${`conflict-sev sev-${e}`}">${t}</span>`}function Fy(e){return`bundle-${e.slice(7,19)}\u2026`}function Ge(e){return e.kind==="bundle"?e.label??Fy(e.identifier):e.identifier}function My(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 Ly(e){return c`<span class="comment-text">${e||c`<em>empty</em>`}</span>`}function Py(e){return e?Qr(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 Oy(e){return e?c`<span class="${`triage triage-${e}`}">${e}</span>`:c`<em>none</em>`}function nf(e,t){return e==="color"?My(t):e==="comment"?Ly(t):e==="fix"?Py(t):e==="triage"?Oy(t):c`${String(t)}`}function Ny(e,t){let r=e?.file?e.line?`${e.file}:${e.line}`:e.file:"";return c`<div class="card-head">${ln(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 sf={title:"Triage conflicts",intro:"disagree with your local triage on",trailingNote:"",applyButton:"Apply",importedSideLabel:"Apply imported"},of={color:0,comment:1,fix:2,triage:3},Dy={color:"Color",comment:"Comment",fix:"Fix",triage:"Triage state"},Ll=class extends T{static styles=[...T.styles,A(an),A(rf)];static properties={conflicts:{attribute:!1},findingLookup:{attribute:!1},labels:{attribute:!1},_settled:{state:!0}};constructor(){super(),this.conflicts=[],this.findingLookup=new Map,this.labels={...sf},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)=>(of[p.property]??99)-(of[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}">${Ny(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">${Dy[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">${nf(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">${nf(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",Ll);function Js(e,t,r={}){return new Promise((n,o)=>{let s=document.createElement("triage-conflict-dialog");s.conflicts=e,s.findingLookup=t,s.labels={...sf,...r},s.addEventListener("resolve",i=>{s.remove(),n(i.detail)}),s.addEventListener("modal-conflict",i=>{s.remove(),o(ht(i.detail?.cause))}),document.body.append(s)})}var Pl=class extends T{static styles=[...T.styles,A(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",Pl);function af({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(ht(o.detail?.cause))}),document.body.append(n)})}async function lf(e){let t=await sl(e),r;if(Jn(t)){if(r=await af({tryPassword:o=>xs(t,o)}),!r)return null}else r=await xs(t);let n=await il(r,{conflictResolver:async(o,s)=>{try{return await Js(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)&&$(),n}var df="deepview.passkey.firstImportPrompted";function Uy(){try{return localStorage.getItem(df)==="1"}catch{return!1}}function cf(){try{localStorage.setItem(df,"1")}catch{}}async function Ol(){if(X()||!bt()||Uy())return;if(!confirm(`Encrypt your DeepView data with a passkey?
44
-
45
- 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.
46
-
47
- You can change this anytime from the lock icon in the sidebar header.`)){cf();return}await Ts(),X()&&cf()}var uf=Ol;var pf=["type","model","think","effort","exportsMode"],Zt="deepview.lastFile",po=new Set(["overview","graph","treemap","advisories","issues","code","terminal"]);function cn(e,t="overview"){let r=t&&t!=="overview"&&po.has(t)?` ${t}`:"";ke(Zt,`b:${e}${r}`).catch(()=>{})}var kr=0,Se=e=>e!==kr;function Nl(e){let t=hf(e.toLowerCase());return t.endsWith(".map")?"sourcemap":t==="stasis.code.br"||t.endsWith(".stasis.code.br")?"stasis":null}function hf(e){return e.replace(/ \(\d+\)(?=\.[^.]*$)/u,"")}async function ff({name:e,content:t,existingNames:r}){if(!r.has(e))return await lt(e,t),r.add(e),{name:e,content:t};let n;try{n=await Me(e)}catch(l){if(!(l instanceof DOMException&&l.name==="NotFoundError"||typeof l?.message=="string"&&l.message.startsWith("File not found:")))throw l;return await lt(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=>eo(l.id,e)),i=await Yp({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 lt(l,t),r.add(l),{name:l,content:t}}return await lt(e,t),s.length>0&&await zy(e,s),{name:e,content:t}}async function zy(e,t){let r;try{r=await pr(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 Dl(e){await uf();let t=null,r=null,n=new Set,o=new Set(await le());for(let s of e)try{let i=hf(s.name.toLowerCase());if(i.endsWith(".gz")||i.endsWith(".deepview-workspace.enc")){await lf(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(Nl(s.name)){let u=new Uint8Array(await s.arrayBuffer()),{integrity:p}=await fr(s.name,u);r=p,n.add(p);continue}let d=await s.text();if(i.endsWith(".csv")){let u=tf(d);for(let{displayName:p,data:f}of u){let h=p.replaceAll("/","__")+".codex",b=JSON.stringify(f),{count:m,source:y}=Oe(b),k=await ff({name:h,content:b,existingNames:o});k&&(Ve(k.name,m,y),t={name:k.name,content:k.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 ff({name:s.name,content:d,existingNames:o});if(!p)continue;Ve(p.name,u.count,u.source),t={name:p.name,content:p.content}}}catch(i){alert(`Failed to load ${s.name}: ${i.message}`)}await j();for(let s of n)Fl(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,cn(r),$(),await j(),Qt(r))}async function _t(e,t){let r=++kr,n=new Set(z().filter(o=>Array.isArray(o.reports)&&o.reports.includes(e)).map(o=>o.id));for(let o of N.openSessions)o&&!n.has(o.workspaceId)&&(N.closeSession(o.workspaceId),to(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,E.selected=null,E.focusedPkg=null,E.layoutCache=null,E.solo=null,E.hidden.clear(),E.pathFilter="",ze(),ke(Zt,e).catch(()=>{}),t===void 0){try{t=await Me(e)}catch(o){if(Se(r))return;if(o&&o.message?.includes("vault locked")){if(await Is()&&!Se(r)){await _t(e);return}Se(r)||(a.currentFile=null,await j());return}alert(`Failed to read ${e}: ${o.message}`),a.currentFile=null,await j();return}if(Se(r))return}if(await zl(e,t,r),!Se(r)){for(let o of n)N.openSession(o),N.refreshSession(o),As(o);await j()}}async function er(e){let t=z().find(o=>o.id===e);if(!t)return;let r=++kr;for(let o of N.openSessions)o&&o.workspaceId!==e&&(N.closeSession(o.workspaceId),to(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,E.selected=null,E.focusedPkg=null,E.layoutCache=null,E.solo=null,E.hidden.clear(),E.pathFilter="",ze(),ke(Zt,`ws:${e}`).catch(()=>{}),t.reports.length===0&&(C.classList.remove("active"),W(g,C),Ae.classList.remove("hidden"));let n=t.reports.map(o=>Me(o).catch(()=>null));for(let o=0;o<t.reports.length;o++){let s=await n[o];if(Se(r))return;if(s!==null&&(await zl(t.reports[o],s,r),Se(r)))return}N.openSession(e),N.refreshSession(e),As(e),await j()}async function gf({triage:e="keep",deleteFromRemoteWorkspaceIds:t=[]}={}){if(!a.currentFile)return;let r=++kr,n=a.currentFile;Yr(n),je(n,"");for(let o of t)try{let s=await Cs(o,n);if(Se(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 Ur(n),!Se(r)&&(await Vn(n,null),!Se(r))){if(e==="wipe"){try{await ws()}catch(o){console.warn("Skipped orphan-triage GC:",o)}if(Se(r))return}Se(r)||(Ul(),await j())}}function Ul(){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",E.selected=null,E.focusedPkg=null,E.layoutCache=null,E.solo=null,E.hidden.clear(),E.pathFilter="",ze(),Pr(Zt),C.classList.remove("active"),W(g,C),Ae.classList.remove("hidden"),document.title="DeepView"}async function mf(){++kr;for(let e of N.openSessions)e&&(N.closeSession(e.workspaceId),to(e.workspaceId));Ul(),await j()}async function bf({deleteFromRemoteWorkspaceIds:e=[]}={}){if(!a.selectedBundle)return;let t=++kr,r=a.selectedBundle;for(let o of e)try{let s=await Es(o,r);if(Se(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 la(r),Se(t)||(await Va(r,null),Se(t)))return;a.selectedBundle=null,a.bundleDetails=null,a.bundleSourceFile=null,a.bundleSourceFindingIdx=null;let n=ge(Zt);typeof n=="string"&&(n===`b:${r}`||n.startsWith(`b:${r} `))&&Pr(Zt),xa(r),a.bundles=await ct(),!Se(t)&&($(),await j())}async function yf(e,t="detach",{triage:r="keep"}={}){let n=z().find(l=>l.id===e);if(!n)return;++kr;let o=Array.isArray(n.reports)?[...n.reports]:[];if(N.closeSession(e),to(e),t==="delete"){for(let l of o){try{await Ur(l)}catch{}Yr(l),je(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)&&Ul(),await Ua(e),await j()}async function zl(e,t,r=null){let n=()=>r!==null&&Se(r);try{if(await Gn,n())return;let o;try{o=JSON.parse(t)}catch(b){if(o=zr(t)??Wr(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 k=m.groups[y],w=`${b}:${y}`;for(let v of k)v.id&&(i.add(v.id),l.set(v.id,w))}}let d=o.findings||[],u=d.flatMap(wl).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=wl(b);if(m.length===0)continue;let y=m.filter(R=>R.id&&i.has(R.id)),k=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(k.length===0){w.size>1&&a.workspaceMerges.push(new Set(v)),h+=y.length;continue}let S=[];for(let R of k){R.id&&i.add(R.id);let O={...R,_id:a.nextFindingId++,_repoFallback:p,_reportName:e,_bundleHashes:o.bundleHashes??[]};if(!o.source&&!pf.some(V=>O[V]!==void 0))for(let V of pf)o[V]!==void 0&&(O[V]=o[V]);O._analyzer=o.source??O.type??null,S.push(O)}y.length>0&&(h+=y.length,a.workspaceMerges.push(new Set(v)));let I=`${a.reports.length}:${f.length}`;for(let R of k)R.id&&l.set(R.id,I);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)&&Fl(m).catch(()=>{})}if(s)if(Ps(),f.some(m=>m.some(y=>y.confidence!==void 0))){let m=k=>f.reduce((w,v)=>w+(v.some(S=>S.confidence!==void 0&&S.confidence>=k)?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;$()}catch(o){alert(`Failed to parse ${e}: ${o.message}`)}}window.__loadFile=(e,t)=>zl(e,t);window.__setFilters=({severities:e,confMin:t}={})=>{e!=null&&(a.filterSeverities=new Set(e)),t!==void 0&&(a.filterConfMin=t),$()};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")&&Dl(e.dataTransfer.files)});Ae.addEventListener("dragover",e=>{e.preventDefault(),Ae.classList.add("hover")});Ae.addEventListener("dragleave",()=>Ae.classList.remove("hover"));Ae.addEventListener("drop",e=>{e.preventDefault(),Ae.classList.remove("hover"),Dl(e.dataTransfer.files)});var xt=null;function Wy(){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&&Dl(e),xt.value=""}),document.body.append(xt)),xt.click()}Ae.addEventListener("click",e=>{e.target.closest(".drop-prompt-action")&&Wy()});var $r=new Map,wf="deepview.advisories.proxyConsent";function vf(){try{return localStorage.getItem(wf)==="1"}catch{return!1}}function kf(){try{localStorage.setItem(wf,"1")}catch{}}function Hy(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 jy(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 $f(e,t){return!e||Nl(e.name)!=="stasis"?!1:!t||t.integrity!==e.integrity?!0:jy(t)}function Vy(e){let t=Object.create(null);for(let[r,n]of e)t[r]=[...n].toSorted();return t}async function xf(e,t){if(!e?.integrity||$r.has(e.integrity)||!vf())return;let r=Hy(e);if(r.size===0){$r.set(e.integrity,{state:"ok",byPackage:new Map,query:r});return}$r.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(Vy(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{}$r.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)}$r.set(n,{state:"ok",byPackage:i,query:r})}catch(o){$r.set(n,{state:"error",reason:o?.message??"fetch-failed",query:r})}t()}var Ky={critical:0,high:1,moderate:2,low:3,info:4};function Xs(e){return Ky[e]??999}function qy(e){return e.charAt(0).toUpperCase()+e.slice(1)}function Gy(){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(!vf())return Gy();let t=$r.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=>Xs(h.severity))),f=Math.min(...u.map(h=>Xs(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])=>Yy(i,l,t.query.get(i)))}</ul></div>`}function Yy(e,t,r){let n=[...t].toSorted((s,i)=>{let l=Xs(s.severity)-Xs(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=>Zy(s))}</ul></li>`}function Jy(e){if(typeof e!="string")return null;let t=/\/(GHSA-[a-z0-9-]+)(?:[/?#]|$)/iu.exec(e);return t?t[1]:null}var Xy=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 Qy(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 Zy(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=Jy(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}${Xy}</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}`}">${qy(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?"":", "}${Qy(p)}`)}</span>`:g}</div>${o?c`<div class="bundle-advisory-cvss-vector mono">${o}</div>`:g}</div></div></li>`}var fo=null;function ew(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 tw(e){let t=ut(e),r=ew(e),n=[...t.keys()],{stripped:o}=Ft(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 Ml(e){let t=ut(e),r=new Map;for(let[n,o]of t)r.set(n,await hu(o));return r}function Ef(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 xr(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 rw(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 Af(e){let{tree:t,origToStripped:r}=tw(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 k=r.get(m);k!==void 0&&o.set(k,y)}}let s=xr(o),i=new Map,l=new Map,d=new Map,u=new Map;for(let[m,y]of s){let k={critical:0,high:0,medium:0,low:0,high_bug:0,bug:0,informational:0},w=new Set,v=new Set,S=[];for(let I of y){k[I.severity]=(k[I.severity]||0)+1,w.add(I.severity);let R=a.triage.get(P(I))?.color??"none";v.add(R),S.push({severity:I.severity,color:R})}i.set(m,k),l.set(m,w),d.set(m,v),u.set(m,S)}let p=Ns(t,i),f=E.showAll?n:[...rw(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 ei(){if(!fo)return;let e=rn();e&&e.refreshSidebar(fo,{isBundleContext:!0})}function ti(){if(!fo)return;let e=rn();e&&e.refreshTopPkgs(fo)}function Tf(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 nw(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="${ve({flexGrow:s,background:Lt(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=Lt(o);return c`<li><span class="bundles-dist-dot" style="${ve({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="${ve({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 Sf(e,t,r,n){let{prefix:o,stripped:s}=Ft(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=nw(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=xr(a.bundleDetails.fileHashes,"issues");for(let S of v.values())for(let I of S){f[I.severity]!==void 0&&f[I.severity]++,h++;for(let R of Ln(I.fileHash,I))b.set(R,(b.get(R)??0)+1)}}let m=[...b.keys()].toSorted(),y=be.filter(v=>f[v]>0).map(v=>c`<span class="${`tree-count-chip ${v}`}">${f[v]} ${v.replaceAll("_"," ")}</span>`),k=r.length>0?c`<ul class="bundles-sources-list">${l.map(v=>{let S=r[v],I=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">${I}</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,I=b.get(v)??0;return c`<li><button type="button" class="report-chip bundles-report-chip" data-tooltip="${v}" data-bundle-issue-report="${v}">${pe(S)}<span class="report-chip-label">${Ne(v)}</span> <span class="bundles-report-count">${I} ${I===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">${k}</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 Wl=new Map,Hl=new Set;function Zs(e){for(let t of be)for(let r of e)if(r.severity===t)return t;return e[0]?.severity??null}function If(e,t,r,n){let o=e.split(`
48
- `).length,s=String(o).length,i=zs(t),l=`${r??""}\0${t}`;i&&!Wl.has(l)&&!Hl.has(l)&&(Hl.add(l),(async()=>{let u=await Ws(e,i);Wl.set(l,u??null),Hl.delete(l),a.bundleSourceFile===t&&$()})());let d=Wl.get(l);return c`<div class="bundle-source-lines" style="${ve({"--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?Zs(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"?pe(d):e}</code></pre></div>`}function Rf(e){let t=a.bundleSourceFindingIdx;if(t==null)return g;let r=e[t];if(!r)return g;let n=r.fileHash?Ln(r.fileHash,r):[],o=a.triage.get(P(r))?.triage,s=o==="fixed"?"Fixed":null,i=wr(r),l=Mf(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}">${pe(u)}<span class="report-chip-label">${Ne(d)}</span></button>`})}</div>`:g}</div></aside>`}function Bf(){let e=a.bundleSourceFile;if(!e)return g;if(a.bundleDetailsTab==="code")return g;let r=ut(a.bundleDetails).get(e),n=[],o=new Map;if(typeof r=="string"&&a.bundleDetails?.fileHashes){let i=xr(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"?If(r,e,a.bundleDetails?.integrity,o):c`<div class="bundle-source-empty">Source content not bundled.</div>`}</div>${Rf(n)}</div></div></div>`}function Ff(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 Qs=new Map,Cf=null;function jl(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:Qs.has(f)?Qs.get(f):r===0||d(h),p=f=>h=>{Qs.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>${jl(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?Zs(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 ow(e,t,r,n,o=""){if(!r)return jl(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=Ff(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),jl(p,t,0,n,"",!0)}function sw(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(`
49
- `);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 iw(e,t,r,n=""){if(!e.fileHashes)return c`<div class="bundle-code-search-empty">Computing file hashes…</div>`;let o=xr(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 aw(e){if(!e||!e.json&&!e.bundle)return g;let t=ut(e);if(t.size===0)return c`<div class="bundle-code-empty">This bundle doesn't carry any source content.</div>`;Cf!==a.selectedBundle&&(Qs.clear(),Cf=a.selectedBundle);let r=[...t.keys()].toSorted(),{prefix:n,stripped:o}=Ft(r),s=new Map;for(let w=0;w<r.length;w++)s.set(o[w],r[w]);let i=Ff(o),l=w=>{let v=new Map;for(let[S,I]of w.files)v.set(S,s.get(I)??I);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=xr(e.fileHashes,"issues").get(d)??[];for(let S=0;S<v.length;S++){let I=v[S];p.push(I);let R=parseInt(I.line,10);Number.isFinite(R)&&R>0&&(f.has(R)||f.set(R,[]),f.get(R).push({f:I,idx:S}))}}let h=e.fileHashes?xr(e.fileHashes,"issues"):new Map,m=h.size>0?["files","code","issues"]:["files","code"],y=m.includes(a.bundleCodeSearchMode)?a.bundleCodeSearchMode:"files",k=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">${Tl(y,[["files",()=>ow(i,d,k,h,n)],["code",()=>sw(t,k,d,n)],["issues",()=>iw(e,k,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"?If(u,d,e.integrity,f):c`<div class="bundle-source-empty">Source content not bundled.</div>`}</div>${Rf(p)}</div>`:c`<div class="bundle-code-placeholder">Pick a file from the tree to view its source.</div>`}</div></div>`}function lw(e){let t=$f(e,a.bundleDetails);a.bundleDetailsTab==="advisories"&&!t&&(a.bundleDetailsTab="overview");let r=a.bundleDetailsTab,n=r==="overview";return r==="advisories"&&t&&xf(a.bundleDetails,$).catch(()=>{}),c`<div class="bundles-view bundles-slide-view"><header class="bundles-slide-bar"><span class="bundles-slide-icon" aria-hidden="true">${pe(nn)}</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?uw(e,a.bundleDetails):Tl(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",()=>aw(a.bundleDetails)],["issues",()=>dw(a.bundleDetails)],["advisories",()=>_f(a.bundleDetails)]])}</div></div>`}function cw(e,t={}){if(!e)return g;let r=[];if(e.fileHash&&(r=Ln(e.fileHash,e)),r.length===0&&t.bucketKey&&(t.kind==="package"?r=wa(t.bucketKey,e):t.kind==="repository"&&(r=va(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}">${pe(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 Mf(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 dw(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=xr(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}=Ft(n),i=new Map(n.map((u,p)=>[u,s[p]])),l=[...e.entries()].toSorted(([u,p],[f,h])=>{let b=qe[Zs(p)]??0,m=qe[Zs(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 k=qe[m.severity]??0,w=qe[y.severity]??0;if(w!==k)return w-k;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),k=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-${k}`}">${k.replaceAll("_"," ")}</span> ${(()=>{let I=Mf(m.line);return I?c`<span class="bundle-issues-finding-line">${I}</span>`:g})()} ${v?c`<span class="${`bundle-issues-finding-triage triage-${w}`}">${v}</span>`:g} <span class="bundle-issues-finding-spacer"></span> ${cw(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 Lf(e){let t=a.selectedBundle,r=t?e.find(n=>n.integrity===t):null;return r?lw(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 uw(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 Sf(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 Sf(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 Pf(){wt().catch(()=>{});let e=yt(),t={fixed:0,invalid:0,deleted:0},r=[];for(let[h,b]of e){let m=[],y=[],k=new Map,w=new Set;for(let[v,S]of b.byVersion){let I=[],R=new Map;for(let O of S.findings){let ce=a.triage.get(P(O))?.triage??null;ce==="fixed"?t.fixed++:ce==="invalid"?t.invalid++:ce==="deleted"&&t.deleted++,ce===a.shownTriage&&(I.push(O),R.has(O.file)||R.set(O.file,[]),R.get(O.file).push(O))}if(I.length!==0){m.push([v,{findings:I,files:R,reports:S.reports}]);for(let O of I)y.push(O),k.has(O.file)||k.set(O.file,[]),k.get(O.file).push(O);for(let O of S.reports)w.add(O)}}m.length!==0&&(m.sort(([v],[S])=>Pi(v,S)),r.push([h,{findings:y,files:k,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 yw(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();mw(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>${hw(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(pw(d),fw,h=>ww(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">${$w(o[0],i,s?s[0]:void 0)}</div></aside>`:g}</div>`}</div>`}function pw(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 fw(e){return e.version===null?`${e.kind}:${e.pkg}`:`${e.kind}:${e.pkg}@${e.version}`}function hw(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="${gw}"></triage-selector></div>`}var gw=["fixed","invalid","deleted"];function mw(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 bw(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 yw(e,t,r){let n=yt().get(e),o=bw(n,r),s=a.packageSlideTriage??"live",i=n?Of(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 ww(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=be.filter(m=>l[m]>0),u=Lt(o),f={selected:o===t&&vw(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="${ve({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"?kw(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 vw(e,t){return e.kind==="single"?!0:e.version===t}function kw(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 $w(e,t,r){let n=yt().get(e),s=[...(n?Of(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>${xw(e,t,r)}`}function Of(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=Nf(t,i);o.has(u)||o.set(u,[]);let p=o.get(u);for(let f of d)p.push(f)}return o}function xw(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=be.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=yt().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}">${pe(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=Nf(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 Nf(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 Df(){wt().catch(()=>{});let e=gr(),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 Aw(o[0],o[1]);let s=a.repositoriesSearchQuery.trim().toLowerCase(),i=s?r.filter(([p])=>p.toLowerCase().includes(s)||tt(p).toLowerCase().includes(s)):r.slice();Cw(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>${_w(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])=>Tw(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">${Iw(o[0],o[1])}</div></aside>`:g}</div>`}</div>`}function _w(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="${Sw}"></triage-selector></div>`}var Sw=["fixed","invalid","deleted"];function Cw(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 Ew(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 Aw(e,t){let r=gr().get(e),n=Ew(r),o=a.repositorySlideTriage??"live",s=r?Uf(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">${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><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 Tw(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=be.filter(l=>n[l]>0),s=Lt(e),i=tt(e);return c`<li class="${r?"selected":""}" data-select-repository="${e}"><span class="packages-dot" style="${ve({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 Iw(e,t){let r=gr().get(e),o=[...(r?Uf(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>${Rw(e,t)}`}function Uf(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 Rw(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=be.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">${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=Y[Ke(l)]??Y.default;return c`<li><button type="button" class="packages-detail-report" title="${l}" data-package-report="${l}">${pe(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 Bw(e,t,r){let n=`${e}\0${t}`;if(bo.has(n)||Vl.has(n))return;let o=zs(t);if(!o){bo.set(n,null);return}Vl.add(n),(async()=>{let s=await Ws(r,o);bo.set(n,s??null),Vl.delete(n),a.focusCodeTick++,queueMicrotask($)})()}async function Fw(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 Ys(e,r),o=ut(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($),queueMicrotask(()=>{let n=C.querySelector(".focus-code-line-active");n&&n.scrollIntoView({block:"center",behavior:"instant"})})}}function zf(e){if(!e)return null;let t=_e(e);if(!t.fileHash||!Array.isArray(t._bundleHashes)||t._bundleHashes.length===0)return null;let r=new Set(t._bundleHashes),n=mr(t.fileHash).find(({integrity:u})=>r.has(u));if(!n)return null;let o=mo.get(n.integrity);if(!o)return Fw(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;Bw(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 Kl=class extends T{static styles=[...T.styles,A(we)];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 pr(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",Kl);function Wf({workspaceId:e,items:t}={}){return K("sync-upload-dialog",{workspaceId:e??"",items:Array.isArray(t)?[...t]:[]})}var ql=class extends T{static styles=[...T.styles,A(we)];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 br(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=de(await gt(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 Rn(n.identifier,o.content),Ve(n.identifier,i.count,i.source),await Tt(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 er(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",ql);function Hf({workspaceId:e,items:t}={}){return K("sync-download-dialog",{workspaceId:e??"",items:Array.isArray(t)?[...t]:[]})}var jf=`.rec-list{margin:.2rem 0 .55rem;padding:0;list-style:none;max-height:320px;overflow-y:auto}.rec-row{display:flex;align-items:center;gap:.5rem;padding:.28rem .15rem;font-size:.8rem;line-height:1.4;border-bottom:1px solid rgb(from var(--text) r g b / .06)}.rec-row:last-child{border-bottom:none}.rec-label{flex:1 1 auto;min-width:0;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rec-status{flex:0 0 auto;padding:0 .4rem;border-radius:4px;font-size:.68rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em}.rec-status-checking{color:var(--muted)}.rec-status-good{color:var(--ok, #16a34a)}.rec-status-reuploaded{color:var(--accent, #2563eb)}.rec-status-failed{color:var(--warning, #d97706)}.rec-status-missing{color:var(--critical, #dc2626)}.rec-summary{margin:.1rem 0 .2rem;color:var(--muted);font-size:.76rem;line-height:1.45}.rec-error{margin:.3rem 0 .2rem;color:var(--critical, #f87171);font-size:.76rem;line-height:1.4}
50
- `;var Lw={checking:"checking\u2026",good:"available",reuploaded:"re-uploaded",failed:"re-upload failed",missing:"missing"},Gl=class extends T{static styles=[...T.styles,A(we),A(jf)];static properties={workspaceId:{type:String},cloudCount:{type:Number},localFileNames:{type:Array},localBundles:{type:Array},_rows:{state:!0},_running:{state:!0},_ran:{state:!0},_error:{state:!0},_settled:{state:!0}};constructor(){super(),this.workspaceId="",this.cloudCount=0,this.localFileNames=[],this.localBundles=[],this._rows=[],this._running=!1,this._ran=!1,this._error=null,this._settled=!1}focusInitial(){this.renderRoot.querySelector('button[data-role="recheck"]')?.focus()}_result(){return{items:this._rows,counts:this._counts()}}_onClose=()=>this._finish(this._ran?this._result():null);_onCancel=()=>this._finish(this._ran?this._result():null);_counts(){let t={good:0,reuploaded:0,failed:0,missing:0};for(let r of this._rows)r.status in t&&(t[r.status]+=1);return t}_onRecheck=async()=>{if(!this._running){this._running=!0,this._error=null,this._rows=[];try{let{items:t}=await up(this.workspaceId,{onList:r=>{this._rows=r},onItem:r=>{this._rows=this._rows.map(n=>n.resourceTag===r.resourceTag?r:n)}});this._rows=t}catch(t){this._error=t?.message??String(t)}finally{this._running=!1,this._ran=!0}}};_downloadableItems(){let t=new Set(this.localFileNames),r=new Set(this.localBundles),n=[];for(let o of this._rows)o.status!=="good"||!o.identifier||(o.kind==="report"&&!t.has(o.identifier)?n.push({kind:"report",identifier:o.identifier}):o.kind==="bundle"&&!r.has(o.identifier)&&n.push({kind:"bundle",identifier:o.identifier,label:o.label}));return n}_onDownload=async()=>{let t=this._downloadableItems();t.length!==0&&await Hf({workspaceId:this.workspaceId,items:t})};_rowsSection(){return this._rows.length===0?this._running?c`<p class="lwd-body">Fetching remote listing…</p>`:g:c`<ul class="rec-list">${this._rows.map(t=>c`<li class="rec-row"><span class="rec-label">${t.label}${t.kind==="bundle"?c`<span class="lwd-kind-tag">bundle</span>`:g}</span> <span class="${`rec-status rec-status-${t.status}`}" title="${t.detail??g}">${Lw[t.status]??t.status}</span></li>`)}</ul>`}_summarySection(){if(!this._ran||this._rows.length===0)return g;let t=this._counts(),r=[];return t.good&&r.push(`${t.good} available`),t.reuploaded&&r.push(`${t.reuploaded} re-uploaded`),t.failed&&r.push(`${t.failed} failed`),t.missing&&r.push(`${t.missing} missing`),r.length>0?c`<p class="rec-summary" role="status" aria-live="polite">${r.join(" \xB7 ")}</p>`:g}render(){let t=this.cloudCount===1?"":"s",r=this._ran?g:c`<p class="lwd-body">Re-check ${this.cloudCount>0?c`the <strong>${this.cloudCount}</strong>`:g}remote object${t} for this workspace. Each is re-fetched from the relay; any whose bytes are missing are re-uploaded from a matching local copy.</p>`,n=this._ran&&this._rows.length===0&&!this._error?c`<p class="lwd-empty">No remote objects to check.</p>`:g,o=this._ran?this._downloadableItems().length:0;return c`<dialog @close="${this._onClose}"><header><h3>Re-check cloud storage</h3></header>${r} ${this._rowsSection()} ${n} ${this._summarySection()} ${this._error?c`<p class="rec-error" role="alert">${this._error}</p>`:g}<footer class="nwd-actions"><span class="nwd-spacer"></span> ${o>0?c`<button type="button" data-role="download" @click="${this._onDownload}" ?disabled="${this._running}">Download ${o} not stored locally</button>`:g} <button type="button" data-role="cancel" @click="${this._onCancel}" ?disabled="${this._running}">${this._ran?"Close":"Cancel"}</button> <button type="button" data-role="recheck" @click="${this._onRecheck}" ?disabled="${this._running}">${this._running?"Re-checking\u2026":this._ran?"Re-check again":"Re-check"}</button></footer></dialog>`}};customElements.define("objstore-recovery-dialog",Gl);function Vf({workspaceId:e,cloudCount:t,localFileNames:r,localBundles:n}={}){return K("objstore-recovery-dialog",{workspaceId:e??"",cloudCount:typeof t=="number"?t:0,localFileNames:Array.isArray(r)?[...r]:[],localBundles:Array.isArray(n)?[...n]:[]})}function Jl(){let e=Sl(a.reports);if(!e)return null;let t=Object.keys(e),n=Mt().filter(p=>ye(p).commonTriage===a.shownTriage),o=_l(n),s=Ns(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 E.focusedPkg?(u=t.filter(p=>(Gp(p)??"__own__")===E.focusedPkg),E.showAll||(u=u.filter(p=>Cl(p,o,s)))):u=E.showAll?t:t.filter(p=>Cl(p,o,s)),{prep:{treeData:e,files:u,ownCounts:o,transitiveCounts:s,severitySets:i,colorSets:l,fileFindings:d},findingCounts:o}}function Xl(){let e=rn();if(!e)return;let t=Jl();t&&e.refreshSidebar(t.prep,{isBundleContext:a.currentView==="bundles"})}function Ql(){let e=rn();if(!e)return;let t=Jl();t&&e.refreshTopPkgs(t.prep)}var Pw={"claude-security":"Claude Security findings","codex-security":"Codex Security findings",deepsec:"DeepSec findings"};function Ow(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 Yl=["type","model","effort","exportsMode"];function Kf(e,t){return e==="type"?`analyzer: ${t??"null"}`:t??null}function Nw(e,t=Yl){let r=new Map;for(let p of e){let f={};for(let b of t)f[b]=b==="model"?bl(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=Kf(p,n[0][p]);f!=null&&d.push(f)}else if(!u){for(let f of n){let h=s.map(b=>Kf(b,f[b])).filter(b=>b!=null);h.length>0&&d.push(h.join(" \xB7 "))}u=!0}return d}function Dw(e,t,r,n,o){let s=new Set(a.reports.map(V=>V.source)),i=s.size===1?[...s][0]:null,l=a.currentWorkspace?z().find(V=>V.id===a.currentWorkspace):null,d=l?`Workspace: ${l.name}`:i?Pw[i]:"Findings",u=i&&Y[i]?i:"default",p=pe(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(V=>V.groups.flat()),y=`${e} ${`finding${e===1?"":"s"}`}`,w=i||a.currentWorkspace?Yl.filter(V=>V!=="type"):Yl,v=Nw(b,w),S=g;if(e>0){let V={};for(let Re of Mt()){let nt=Ue(Re).severity;nt&&(V[nt]=(V[nt]||0)+1)}let nr=be.filter(Re=>V[Re]>0);nr.length>0&&(S=c`<span class="status-bar" aria-hidden="true">${nr.map(Re=>{let nt=`${V[Re]} ${Re.replaceAll("_"," ")}`;return c`<span class="${`status-seg sev-${Re}`}" style="${ve({flexGrow:V[Re]})}" title="${nt}"></span>`})}</span>`)}let I=Ow(r,n),R=c`<span class="sep" aria-hidden="true"></span>`,O=a.currentView==="files",ce=(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}${I}${ce}${Uw()}</h1><div class="meta-row"><span>${y}</span> ${S} ${v.length>0?c`${R}${v.map(V=>c`<span class="tag">${V}</span>`)}`:g}</div></div></header>`}function Uw(){if(N.status!=="online")return g;if(a.currentView!=="findings"&&a.currentView!=="files")return g;let e=Ww();if(!e)return g;let{workspaceId:t,fileNames:r,mode:n}=e;if(n==="single"){let k=r[0],w=pl(t,k)?"cloud":"local";return zw({status:w,label:w,title:w==="cloud"?"Synced to remote":"Local only \u2014 click to upload",onClick:w==="local"?()=>qf({workspaceId:t,items:[{kind:"report",identifier:k}]}):null})}let o=z().find(k=>k.id===t),s=o&&Array.isArray(o.bundles)?o.bundles:[],i=tp(t),l=r.filter(k=>!pl(t,k)),d=s.filter(k=>!Zu(t,k)),u=[...l.map(k=>({kind:"report",identifier:k})),...d.map(k=>({kind:"bundle",identifier:k}))];if(i===0&&u.length===0)return g;let p=i>0,f=u.length>0,h=[i>0?`${i} in cloud`:null,u.length>0?`${u.length} local-only`:null,i>0?'click "cloud" to re-check storage':null,u.length>0?`click "local" to upload ${u.length}`:null].filter(Boolean).join(" \u2014 "),b=i===0?g:c`<button type="button" class="sync-badge-chunk cloud" aria-label="${`re-check ${i} cloud object${i===1?"":"s"}`}" @click="${k=>{k.stopPropagation(),Vf({workspaceId:t,cloudCount:i,localFileNames:r,localBundles:s})}}">${Zf()}<span>${i} cloud</span></button>`,m=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="${k=>{k.stopPropagation(),qf({workspaceId:t,items:u})}}">${Qf()}<span>${u.length} local</span></button>`,y=i>0&&u.length>0?c`<span class="sync-badge-divider" aria-hidden="true"></span>`:g;return c`<div class="${`report-sync-badge${p||f?" report-sync-badge-clickable":""}`}" data-status="mixed" title="${h}">${b}${y}${m}</div>`}function zw({status:e,label:t,title:r,onClick:n}){let o=e==="cloud"?Zf():Qf(),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 Qf(){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 Zf(){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 qf({workspaceId:e,items:t}){let r=t.filter(n=>n.kind==="bundle");if(r.length>0){let n=await ct(),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 Wf({workspaceId:e,items:t})}function Ww(){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 Hw(e){return Object.values(e).some(r=>r>0)||a.filterSeverities.size>0?c`<severity-chips .counts="${e}"></severity-chips>`:g}function jw(e){return Object.values(e).some(r=>r>0)||a.filterColors.size>0?c`<triage-filter .counts="${e}"></triage-filter>`:g}function Vw(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">${Hw(n)} ${i.length>1?c`<analyzer-select .options="${i}"></analyzer-select>`:g} ${m&&l.length>1?c`<repo-filter .options="${l}"></repo-filter>`:g} ${jw(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,Gf=0,tr=null,ri=new Map;function wo(e,t=!1,r=null){let n=tn(e);return ri.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 Kw={critical:"C",high:"H",medium:"M",low:"L",high_bug:"H",bug:"B",informational:"i"};function Yf(e,t={}){let{variant:r="kanban",active:n=!1}=t,o=ye(e),s=_e(e),i=Os(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),p=Number.isFinite(u)?`:${u}`:"",f=Kw[s.severity]??"?",h=c`<span class="${`kanban-badge sev-${s.severity}`}" title="${en(s.severity)}" aria-label="${en(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="${Te(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="${Te(e)}" data-focus-select role="button" tabindex="0" aria-current="${n?"true":"false"}" aria-label="${`Focus on ${i}`}">${h}</div>`}function qw(e){let{content:t,line:r,highlighted:n}=e,o=t.split(`
51
- `).length,s=String(o).length;return c`<div class="focus-code-lines" style="${ve({"--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"?pe(n):t}</code></pre></div>`}function Gw(e){if(!e)return g;let t=ye(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 Yw(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=>Te(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=>Te(d)===a.focusGid):-1;r<0&&(r=Math.min(Gf,e.length-1),r<0&&(r=0)),Gf=r;let n=e[r];a.focusCodeTick;let o=zf(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">${qw(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=>Yf(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=ye(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=>Yf(l))}</div></div>`})}</div>${Gw(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>${yl(o,i?.repo?.github,i?._repoFallback??a.repoUrl)}</span> <span class="count">${s.length}</span></div><div class="file-body">${J(s,l=>tn(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=>tn(r),r=>{let n=_e(r),o=_p(n.file,n.line,n.repo?.github,n._repoFallback??a.repoUrl),s=wr(n),i=yr(n),l=r.length>1;return c`<div class="${F({"flat-group":!0,"multi-case":l})}"><div class="flat-group-loc"><span class="file">${yl(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 Jw(){let e=document.querySelector("#bundle-source-overlay-slot");e&&W(Bf(),e)}var Jf=null;function $(){let e=Jf;if(Jf=a.currentView,e!==null&&e!==a.currentView&&typeof document.startViewTransition=="function"&&!matchMedia("(prefers-reduced-motion: reduce)").matches){document.startViewTransition(()=>Xf());return}Xf()}function Xf(){if(Jw(),vp(a.reports),a.currentView==="bundles")if((a.bundles??[]).length===0)a.currentView="findings";else{let x=document.querySelector("#bundles-slot");if((!x||!C.contains(x)||C.firstElementChild!==x)&&(C.innerHTML='<div id="bundles-slot"></div>',x=document.querySelector("#bundles-slot")),x&&W(Lf(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 he=Af(a.bundleDetails);if(he){Tf(he);let Ce=!he.hasEdges,wi=Ef(a.bundleDetails);El(B,he,{hideAllFiles:Ce,triageCounts:wi,triageStates:["fixed","invalid","deleted"]},ei,ti)}}}if(a.selectedBundle&&a.bundleDetailsTab==="terminal"&&a.bundleDetails&&(a.bundleDetails.json||a.bundleDetails.bundle)){let B=document.querySelector("#bundle-terminal-slot");B&&Kp(B,a.bundleDetails)}C.classList.add("active"),Ae.classList.add("hidden"),document.title="DeepView \u2014 bundles";return}if(a.currentView==="packages"){let x=document.querySelector("#packages-slot");(!x||!C.contains(x)||C.firstElementChild!==x)&&(C.innerHTML='<div id="packages-slot"></div>',x=document.querySelector("#packages-slot")),x&&W(Pf(),x),C.classList.add("active"),Ae.classList.add("hidden"),document.title="DeepView \u2014 packages";return}if(a.currentView==="repositories"){let x=document.querySelector("#repositories-slot");(!x||!C.contains(x)||C.firstElementChild!==x)&&(C.innerHTML='<div id="repositories-slot"></div>',x=document.querySelector("#repositories-slot")),x&&W(Df(),x),C.classList.add("active"),Ae.classList.add("hidden"),document.title="DeepView \u2014 repositories";return}if(a.reports.length===0)return;let e=Mt(),t={fixed:0,invalid:0,deleted:0,ignored:0};for(let x of e){let B=ye(x).commonTriage;B&&t[B]++}let r=a.viewMode==="kanban",n=r?e:e.filter(x=>ye(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(Ce=>Ce.severity));for(let Ce of B)l[Ce]=(l[Ce]||0)+1;let he=new Set(x.map(Ce=>a.triage.get(P(Ce))?.color??"none"));for(let Ce of he)d[Ce]=(d[Ce]||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=>Jt(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&&!Jt(B.file))),y=new Set;for(let x of e)for(let B of x)!Jt(B.file)&&B.repo?.github&&y.add(B.repo.github);let k=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($l),S=[...w].toSorted((x,B)=>{let he=x==null?1/0:v.indexOf(x)===-1?v.length:v.indexOf(x),Ce=B==null?1/0:v.indexOf(B)===-1?v.length:v.indexOf(B);return he!==Ce?he-Ce:String(x??"").localeCompare(String(B??""))});if(a.filterAnalyzer){let x=a.filterAnalyzer===oo?null:a.filterAnalyzer;w.has(x)||(a.filterAnalyzer="")}let I=new Set;for(let x of e)for(let B of x)I.add(vl(B));let R=[...I].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;I.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=Bp(Ip(n)),ce=Sl(a.reports),V=ce?Object.keys(ce).length:0,nr=V>1;!nr&&a.currentView==="files"&&(a.currentView="findings"),!nr&&a.viewMode==="graph"&&(a.viewMode="table");let Re=Dw(e.length,i,m,k,V);if(a.currentView==="files"){let x=_l(e),B=document.querySelector("#header-slot"),he=document.querySelector("#tree-view-slot");(!B||!he||!C.contains(B)||!C.contains(he))&&(C.innerHTML='<div id="header-slot"></div><div id="tree-view-slot"></div>',B=document.querySelector("#header-slot"),he=document.querySelector("#tree-view-slot")),B&&W(Re,B),he&&W(Hp(ce,x),he),C.classList.add("active"),Ae.classList.add("hidden"),document.title=`DeepView \u2014 ${s||"no analyzer"}`;return}let nt=a.viewMode==="table"&&a.tableSelectedGid&&O.some(x=>Te(x)===a.tableSelectedGid),Ar=null;a.viewMode==="graph"&&ce&&(Ar=Jl(),Ar||(a.viewMode="table"));let Pt=!!Ar,pt="findings-content";nt&&(pt+=" with-details"),Pt&&(pt+=" with-graph"),r&&(pt+=" with-kanban"),a.viewMode==="focus"&&(pt+=" with-focus");let _=g,q=g,Z=g;Pt||(_=Vw(O.length,n.length,t,l,d,{showSource:f,showConfidence:u,showPriority:p,showGraphMode:nr,showFileSort:b,kanbanMode:r,showRepo:!!a.currentWorkspace},S,R),a.shownTriage&&n.length===0?q=c`<p style="color:var(--muted);margin:1rem 0">No ${a.shownTriage} findings.</p>`:O.length===0&&n.length>0?q=c`<p style="color:var(--muted);margin:1rem 0">No findings match the current filters.</p>`:n.length===0&&(q=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,ri.clear(),Z=Yw(O));let ie=!!(tr&&tr.isConnected);ie&&tr.remove();let fe=document.querySelector("#header-slot"),te=C.querySelector(":scope > .findings-content"),We=te&&te.querySelector(":scope > #findings-graph-slot"),Ye=te&&te.querySelector(":scope > #findings-body-slot"),vg=te&&(We?"graph":Ye?"body":null)===(Pt?"graph":"body");if(!fe||!te||!C.contains(fe)||!C.contains(te)||!vg){let x=Pt?'<div id="findings-graph-slot"></div>':'<div id="toolbar-slot"></div><div id="empty-state-slot"></div><div id="findings-body-slot"></div>';C.innerHTML=`<div id="header-slot"></div><div class="${pt}">${x}</div>`,fe=document.querySelector("#header-slot"),te=C.querySelector(":scope > .findings-content")}else te.className!==pt&&(te.className=pt);fe&&W(Re,fe);let nd=document.querySelector("#toolbar-slot");nd&&W(_,nd);let od=document.querySelector("#empty-state-slot");od&&W(q,od);let pn=document.querySelector("#findings-body-slot");if(pn&&(yo||ie)){let x=document.createElement("div");x.id="findings-body-slot",pn.replaceWith(x),pn=x}if(pn&&W(Z,pn),Ar){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>`,he={fixed:0,invalid:0,deleted:0,ignored:0};for(let wi of Mt()){let vi=ye(wi).commonTriage;vi&&he[vi]++}let Ce={extraTopRow:B,triageCounts:he,triageStates:["fixed","invalid","deleted","ignored"]};El(x,Ar.prep,Ce,Xl,Ql)}}if(yo){let x=C.querySelector(".finding-table-slot");x&&(tr||(tr=document.createElement("finding-table")),tr.items=yo,tr.selectedGid=a.tableSelectedGid,x.replaceWith(tr))}if(ri.size>0)for(let x of C.querySelectorAll("finding-card")){let B=ri.get(x.dataset.gid);B&&(x.group=B.group)}C.classList.add("active"),Ae.classList.add("hidden"),document.title=`DeepView \u2014 ${s||"no analyzer"}`}var Zl=class extends T{static styles=[...T.styles,A(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 ol(this.workspace,{password:this._noPassword?void 0:this._password,includeBundleBytes:this._includeBundleBytes});if(this._settled)return;Fr(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",Zl);function eh({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(ht(o.detail?.cause))}),document.body.append(n)})}async function th(e){await eh({workspace:e})}var ec=class extends T{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",ec);function rh(){return K("new-workspace-dialog")}var tc=class extends T{static styles=[...T.styles,A(we)];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",tc);function nh({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 rc=class extends T{static styles=[...T.styles,A(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 al({id:this.workspaceId,name:this._name.trim(),privateKeyBase64:this.privateKeyBase64,password:this._password});if(this._settled)return;this._url=cl(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",rc);function oh({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(ht(i.detail?.cause))}),document.body.append(s)})}var nc=class extends T{static styles=[...T.styles,A(we)];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",nc);function sh({name:e,triageImpact:t,inRemote:r}={}){return K("delete-report-dialog",{reportName:e??"",orphanedTriage:t?.orphanedCount??0,sharedTriage:t?.sharedCount??0,inRemote:!!r})}var oc=class extends T{static styles=[...T.styles,A(we)];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",oc);function ih({name:e,inRemote:t}={}){return K("delete-bundle-dialog",{bundleName:e??"",inRemote:!!t})}var sc=class extends T{static styles=[...T.styles,A(we)];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",sc);function ah({name:e,workspaceName:t}={}){return K("detach-bundle-dialog",{bundleName:e??"",workspaceName:t??""})}var ic=class extends T{static styles=[...T.styles,A(we)];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",ic);function lh({name:e,workspaceName:t}={}){return K("detach-report-dialog",{reportName:e??"",workspaceName:t??""})}var ac=class extends T{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",ac);function ch(){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 rr;function Xw(){return rr||(rr=document.createElement("div"),rr.id="styled-tooltip",document.body.append(rr),rr)}var _r=null,vo=null,fh=0,hh=0,dh=!1;function Qw(){dh||(dh=!0,document.addEventListener("mousemove",e=>{fh=e.clientX,hh=e.clientY},{passive:!0}))}Qw();var Zw=100,ev=14,tv=8,uh=8;function rv(e,{placement:t="cursor"}={}){let r=Xw();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+tv)}px`,r.style.transform="translateY(-50%)"}else{r.style.transform="none",r.style.top=`${hh+ev}px`,r.style.left="0px",r.classList.add("visible");let o=r.offsetWidth,s=window.innerWidth-o-uh,i=Math.max(uh,Math.min(fh,s));r.style.left=`${Math.round(i)}px`}r.classList.add("visible"),_r=e}}function ko(){clearTimeout(vo),vo=null,rr&&rr.classList.remove("visible"),_r=null}function lc(e,{gate:t,placement:r}={}){t&&!t(e)||(clearTimeout(vo),vo=setTimeout(()=>{rv(e,{placement:r})},Zw))}var ph=!1;function gh(){ph||(ph=!0,document.body.addEventListener("mouseover",e=>{let t=e.target.closest("[data-tooltip]");!t||t===_r||(ko(),lc(t))}),document.body.addEventListener("mouseout",e=>{!_r&&!vo||_r&&_r.contains(e.relatedTarget)||ko()}))}var oi=null,se=null,ni=null;gh();function nv(){return yt().size}function ov(){return gr().size}var $o=typeof location>"u"||location.hostname.endsWith(".github.io")?"":`${location.protocol==="https:"?"wss:":"ws:"}//${location.host}/api/sync`,fc="application/x-deepview-report",dc="application/x-deepview-source-ws",xo="application/x-deepview-bundle",si=!1,ii=!1,sv={default:"Reports","claude-security":"Claude Security","codex-security":"Codex Security",deepsec:"DeepSec"},mh=["default","claude-security","codex-security","deepsec"],Sr="";function bh(e,t={}){let n=`file-item${e===a.currentFile&&(a.currentView==="findings"||a.currentView==="files")?" current":""}${t.indented?" indented":""}`,o=Ne(e),s=Dn(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}">${pe(i)}<span class="file-label">${o}</span>${s===void 0?g:c`<span class="file-count">${s}</span>`}</button></li>`}function iv(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 av=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 lv(){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">${av}</button></span></li>`}function cv(){return c`<li class="file-group-header bundles-header" data-default-bundles="true"><span class="group-label">Bundles</span></li>`}var dv=c`${pe(nn)}`;function yh(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}
52
- ${r}`}">${dv}<span class="file-label">${n}</span></button></li>`}function uv(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 pv(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 fv=c`${pe(Ds)}`,hv=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>`,gv=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>`,mv=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 bv(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">${fv}<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">${mv}</button><button type="button" class="workspace-export" data-action="export-workspace" title="Export workspace" aria-label="Export workspace">${hv}</button><button type="button" class="workspace-leave" data-action="leave-workspace" title="Leave workspace" aria-label="Leave workspace">${gv}</button></li>`}function dn(e){return Sr?Ne(e).toLowerCase().includes(Sr):!0}async function j(){await Xa(),wt().catch(()=>{});let e=await le(),t=z(),r=await ct();if(a.bundles=r,!se)return;oi.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 mh)l.set(h,[]);for(let h of e){if(o.has(h)||!dn(h))continue;let b=Ke(h);l.has(b)||l.set(b,[]),l.get(b).push(h)}let d=t.filter(h=>!Sr||h.name.toLowerCase().includes(Sr)||h.reports.some(b=>dn(b))?!0:h.bundles.some(b=>{let m=s.get(b);return m&&dn(m.name)})),u=r.filter(h=>!i.has(h.integrity)&&dn(h.name));W(c`${lv()} ${J(d,h=>h.id,h=>{let b=[],m=[];for(let w of h.reports)dn(w)&&(n.has(w)?b.push(w):m.push(w));let y=[],k=[];for(let w of h.bundles){let v=s.get(w);v?(!Sr||dn(v.name))&&y.push(v):Sr||k.push(w)}return c`${bv(h)} ${b.map(w=>bh(w,{indented:!0,workspaceId:h.id}))} ${m.map(w=>pv(w,h.id))} ${y.map(w=>yh(w,{workspaceId:h.id}))} ${k.map(w=>uv(w,h.id))}`})} ${mh.map(h=>{let b=l.get(h)??[],m=h==="default";return b.length===0&&!(m&&si)?null:c`${iv(sv[h]??h,{dropTarget:m})} ${b.map(y=>bh(y))}`})} ${u.length>0||ii?cv():null} ${J(u,h=>h.integrity,h=>yh(h))}`,ni);let p=se.querySelector('sidebar-view-button[kind="packages"]');p&&(p.count=nv());let f=se.querySelector('sidebar-view-button[kind="repositories"]');f&&(f.count=ov()),ai(),Ca(e,()=>{j()})}me(()=>{j()});async function yv(e){if(e.target.closest('[data-action="go-home"]')){await mf();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",E.showAll=!0,a.shownTriage=null,cn(d),$(),j(),Qt(d);return}let r=e.target.closest("sidebar-view-button");if(r){let d=r.getAttribute("kind");(d==="packages"||d==="repositories")&&(a.currentView=d,$(),j());return}if(e.target.closest('[data-action="new-workspace"]')){let d=await rh();d&&(await Ol(),await Da(d),j());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&&oh({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&&th(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 nh({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 yf(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)&&er(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,k=z().filter(v=>Array.isArray(v.bundles)&&v.bundles.includes(m)).filter(v=>fl(v.id,m)).map(v=>v.id),{confirmed:w}=await ih({name:y,inRemote:k.length>0});if(!w)return;if(a.selectedBundle!==m){alert(`Active bundle changed during confirmation; aborting delete of "${y}".`);return}try{await bf({deleteFromRemoteWorkspaceIds:k})}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=>eo(m.id,d)).map(m=>m.id),f=p.length>0,{confirmed:h,triage:b}=await sh({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 gf({triage:b,deleteFromRemoteWorkspaceIds:p})}catch(m){alert(`Failed to delete report: ${m.message}`)}return}if(e.target.closest("#sync-status")){N.status==="error"?N.dismissError():N.status==="off"?(!N.getServerUrl()&&$o&&N.setServerUrl($o),N.setEnabled(!0)):N.setEnabled(!1);return}if(e.target.closest("#sidebar-toggle")){oi.classList.toggle("collapsed");try{localStorage.setItem("deepview.sidebarCollapsed",oi.classList.contains("collapsed")?"1":"0")}catch{}}}function wv(e){let t=e.target.closest("[data-tooltip]");if(!t){ko();return}lc(t,{placement:"right",gate:r=>{let n=r.querySelector(".file-label");return!n||(r.dataset.tooltip??"")!==n.textContent?!0:n.scrollWidth>n.clientWidth}})}function vv(e){let t=e.target.closest("[data-tooltip]"),r=e.relatedTarget?.closest?.("[data-tooltip]")??null;t&&t===r||ko()}function kv(e){Sr=e.target.value.trim().toLowerCase(),j()}var $v={off:"Sync off",online:"Online",offline:"Offline",connecting:"Connecting\u2026",error:"Sync error"};function xv(){return N.getServerUrl()||$o?z().length>0:!1}function ai(e){let t=se?.querySelector("#sync-status");if(!t)return;let r=xv();if(r&&N.isEnabled()&&Xu().catch(i=>{console.warn("sync: load failed",i)}),r&&!N.getServerUrl()&&$o&&N.isEnabled()&&N.setServerUrl($o),N.setForcedOff(!r),!r){t.hidden=!0;return}t.hidden=!1;let n=e??N.status;t.dataset.status=n;let o=N.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=$v[n]??"")}N.onStatusChange(ai);var cc=!1,uc=!1;async function wh(){if(!N.persistenceDegraded||uc||cc)return;cc=!0;let{shown:e}=await ch();if(cc=!1,e){uc=!0;return}N.persistenceDegraded&&setTimeout(wh,1500)}N.onPersistenceDegraded(e=>{ai(),e?wh():uc=!1});function _v(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 za(n,s.value),j())};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 li(){for(let e of se.querySelectorAll(".drag-over"))e.classList.remove("drag-over")}function vh(e){return e.dataTransfer.types.includes(fc)||e.dataTransfer.types.includes(xo)}function Sv(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(dc,t.dataset.workspaceId??""),e.dataTransfer.setData("text/plain",n),t.classList.add("dragging"),ii=!0,j();return}let r=e.target.closest(".file-item[data-file]");r&&(e.dataTransfer.effectAllowed="move",e.dataTransfer.setData(fc,r.dataset.file),e.dataTransfer.setData(dc,r.dataset.workspaceId??""),e.dataTransfer.setData("text/plain",r.dataset.file),r.classList.add("dragging"),si=!0,j())}function Cv(){for(let e of se.querySelectorAll(".dragging"))e.classList.remove("dragging");li(),(si||ii)&&(si=!1,ii=!1,j())}function Ev(e){if(!vh(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",li(),!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 Av(e){se.contains(e.relatedTarget)||li()}async function Tv(e){if(!vh(e))return;e.preventDefault(),e.stopPropagation(),li();let t=e.target.closest("[data-workspace-id]"),r=t?t.dataset.workspaceId:null,n=e.dataTransfer.getData(dc)||null;if(e.dataTransfer.types.includes(xo)){let s=e.dataTransfer.getData(xo);if(!s)return;if(n&&n!==r&&fl(n,s)){let i=(a.bundles??[]).find(u=>u.integrity===s)?.name??s,l=z().find(u=>u.id===n),{confirmed:d}=await ah({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 br(s,r),n&&n!==r&&await Ka(s,n),j();return}let o=e.dataTransfer.getData(fc);if(o){if(n&&n!==r&&eo(n,o)){let s=z().find(l=>l.id===n),{confirmed:i}=await lh({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 Tt(o,r),n&&n!==r&&await Kn(o,n),j()}}function Iv(e){oi=e,se=e.renderRoot,ni=se.querySelector("#file-list"),bp(se.querySelector("#encryption-toggle")),se.addEventListener("click",yv),se.addEventListener("dblclick",_v),se.addEventListener("dragstart",Sv),se.addEventListener("dragend",Cv),se.addEventListener("dragover",Ev),se.addEventListener("dragleave",Av),se.addEventListener("drop",Tv),ni.addEventListener("mouseover",wv),ni.addEventListener("mouseout",vv),se.querySelector("#sidebar-search-input")?.addEventListener("input",kv),ai(N.status),j()}var pc=class extends H{static styles=[A(fp),A(pp)];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(){Iv(this)}};customElements.define("app-sidebar",pc);var kh={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 $h(){ap(async(e,t,r)=>{let n=Aa(e);try{return await Js(e,n,kh[r]??kh.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 hc=class extends T{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",hc);function xh({retry:e=!1}={}){return K("sync-auth-dialog",{retry:!!e})}function _h(){ip(async({retry:e})=>{try{return await xh({retry:e})}catch(t){return console.warn("Sync auth dialog failed to open:",t),null}})}var ci="https://triage.space/",Rv=[{hostname:"deepaudit.dev",pathPrefix:"/",supportsSync:!0},{hostname:"chalker.github.io",pathPrefix:"/deepview/",supportsSync:!1}];function Bv(){for(let e of Rv)if(location.hostname===e.hostname&&location.pathname.startsWith(e.pathPrefix))return e;return null}var Fv=["deepview.triage","deepview.triage.pending"],Mv="deepview.repoUrls";function Lv(){try{for(let e of Fv)if(localStorage.getItem(e))return!0}catch{return!0}try{let e=localStorage.getItem(Mv);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 Pv(){if(Lv())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 aa()}catch{return!0}}var gc=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="${ci}" target="_blank" rel="noopener noreferrer">${ci}</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",gc);function Ov(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 Sh(){let e=Bv();return e?await Pv()?await Ov(e)?(location.assign(ci),!0):!1:(location.replace(ci),!0):!1}var mc=class extends T{static styles=[...T.styles,A(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 ll({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=vt(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&&vt(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=vt(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",mc);function Ch({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(ht(o.detail?.cause))}),document.body.append(n)})}var Le=null,di=!1,_o=null;function Nv(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 Dv(){if(Le)return Le;Le=document.createElement("div"),Le.id="lock-overlay",Le.setAttribute("role","dialog"),Le.setAttribute("aria-modal","true"),Le.setAttribute("aria-label","Unlock DeepView"),Le.innerHTML=`
1
+ import{a as xt,b as Le,c as zd,d as Tn}from"./chunk-XL35ZV6R.js";import{a as Hd}from"./chunk-KEX2ATEW.js";import{$ as Di,$a as et,$b as zc,$c as Xi,A as fl,Aa as Bi,Ab as Gt,Ac as ed,Ad as Fd,B as gl,Ba as Zl,Bb as $c,Bc as td,Bd as Dd,C as bl,Ca as ec,Cb as xc,Cc as id,D as vl,Da as tc,Db as Sc,Dc as kt,Dd as Zt,E as yl,Ea as an,Eb as Cc,Ec as rd,Ed as Od,F as _l,Fa as ic,Fb as Vi,Fc as nd,Fd as Qi,G as wl,Ga as Vt,Gb as Ki,Gc as sd,Gd as Bd,H as kl,Ha as ln,Hb as Ec,Hc as od,Hd as $t,I as $l,Ia as rc,Ib as Tc,Ic as ad,Id as Nd,J as xl,Ja as de,Jb as Rc,Jc as ld,Jd as fe,K as Fi,Ka as D,Kb as Lc,Kc as Xt,Kd as qd,L as me,La as yt,Lb as Mc,Lc as cd,Ld as St,M as Sl,Ma as Ni,Mb as Wt,Mc as dd,N as Cl,Na as cn,Nb as pn,Nc as ud,O as El,Oa as nc,Ob as Pc,Oc as Sn,P as Tl,Pa as sc,Pb as Ac,Pc as pd,Q as Rl,Qa as oc,Qb as Gi,Qc as hd,R as Je,Ra as ac,Rb as Wi,Rc as Oe,S as Ll,Sa as Kt,Sb as Ic,Sc as md,T as Ml,Ta as _t,Tb as Fc,U as bt,Ua as lc,Ub as hn,V as Pl,Va as wt,Vb as Dc,W as vt,Wa as zi,Wb as mn,X as Al,Xa as dn,Xb as fn,Y as Il,Ya as cc,Yb as Oc,Yc as fd,Z as Fl,Za as dc,Zb as Bc,Zc as Be,_ as Dl,_a as qi,_b as Nc,_c as tt,a as Ja,aa as Ol,ab as uc,ac as qc,ad as Cn,b as Xa,ba as Bl,bb as pc,bc as Yt,bd as it,c as Qa,ca as Nl,cb as hc,cc as gn,cd as gd,d as Za,da as qt,dc as Hc,dd as bd,e as el,ea as Ht,ec as Uc,ed as vd,f as on,fa as zl,fc as jc,fd as yd,g as Ai,ga as ql,gb as mc,gc as bn,gd as _d,h as l,ha as Hl,hb as fc,hc as vn,hd as wd,i as H,ia as Ul,ic as Vc,id as kd,j as nl,ja as Oi,jc as Kc,jd as $d,k as sl,ka as jl,kc as yn,kd as xd,l as ol,la as Vl,lc as _n,ld as Qt,m as al,ma as Xe,mc as Gc,md as En,n as he,na as Kl,nc as Wc,nd as Sd,o as Ii,oa as Gl,ob as un,oc as Yc,od as Cd,p as ll,pa as Qe,pb as Hi,pc as Jt,pd as $,qa as Wl,qb as gc,qc as Yi,ra as Yl,rb as xe,rc as Jc,sa as Ut,sb as bc,sc as Xc,sd as Ed,t as cl,ta as De,tb as Ui,tc as Qc,td as Td,u as dl,ua as Ze,ub as ji,uc as Ji,ud as Rd,v as ul,va as Jl,vb as vc,vc as wn,vd as Ld,w as pl,wa as Xl,wb as yc,wc as kn,wd as Md,x as ke,xa as $e,xb as _c,xc as $n,xd as Pd,y as hl,ya as jt,yb as wc,yc as Zc,yd as Ad,z as ml,za as Ql,zb as kc,zc as xn,zd as Id}from"./chunk-TY4RZD3Z.js";import{a as Ei}from"./chunk-2KBF5TZ7.js";import{b as Ta}from"./chunk-K3X5EJBQ.js";import{a as $a,b as R,c as xa,d as Ge,g as q,h as Y,i as Ca}from"./chunk-CVVJAXVY.js";import{B as gt,D as tl,K as il,O as rl,c as ja,d as we,e as Ye,f as Va,j as Pi,k as Ka,n as Ga,r as Wa,u as Ya}from"./chunk-VIHGO77Y.js";import{u as Ha,z as Ua}from"./chunk-RFZQQXSG.js";import{d as ca,p as ma,q as fa}from"./chunk-RSHMVYNS.js";import{A as _a,B as wa,D as Nt,E as tn,I as rn,M as ka,b as Xr,ba as Ci,c as Qr,d as j,ea as Ea,k as xi,l as ba,m as Zr,n as Ve,q as va,t as en,v as Si,w as ya,y as K,z as Re}from"./chunk-2AFQKRAM.js";import{f as ga}from"./chunk-UYAXVRVL.js";import"./chunk-NRPC74AM.js";import"./chunk-VQJCXGIY.js";import{f as X}from"./chunk-W4J3MGLB.js";import"./chunk-GJ4IUCNS.js";import"./chunk-PNHBZGDD.js";import{$ as E,A as Ri,C as G,D as ft,G as zt,H as We,J as Li,O as Fe,P as Aa,R as Ia,S as Fa,V as Da,W as Oa,Y as Ba,a as I,aa as oe,b as _e,c as mt,da as Na,e as Ra,ea as za,f as nn,fa as Mi,g as Ti,ga as qa,o as sn,p as La,r as Ma,z as Pa}from"./chunk-UXNUAIIC.js";import"./chunk-R5O6FAW4.js";import{b as Sa,d as ht}from"./chunk-CMQA4DM6.js";import{g as ha}from"./chunk-4F6JSF57.js";import"./chunk-V3ME6FI5.js";import{e as pt,h as Ke}from"./chunk-YVZH5SHP.js";import"./chunk-4XCDFGDP.js";import"./chunk-3BZ7JERB.js";import{a as le}from"./chunk-TZ5KB2Y5.js";import"./chunk-XYFXXB2G.js";import{a as J}from"./chunk-DIJJNTRH.js";import{a as ki,g as $i,h as ua,j as Yr,l as pa,n as Jr}from"./chunk-WZDTZE64.js";import{B as wi,I as oa,J as aa,L as la,a as yi,b as Qo,e as Zo,f as ea,g as ta,j as ia,k as ra,l as na,m as _i,p as sa,v as Bt}from"./chunk-GNXOKIGP.js";import"./chunk-C4Z6ZBXV.js";import{a as M,b as ut,c as a,d as ye,e as Go,g as m,i as Wo,j as U}from"./chunk-2XUEZHIP.js";import{b as da}from"./chunk-TUII34K2.js";import{c as Yo,e as Jo,f as Xo,k as gi,p as bi,t as vi}from"./chunk-V5O7M2YT.js";import"./chunk-OOJM4CTU.js";var Ud={attach:{title:"Synced triage on report attach",intro:"have triage from your workspace that disagrees with your local view on",trailingNote:"Other findings in this report whose chain value didn't conflict were applied automatically; this list only covers disagreements. Pick which side to keep.",importedSideLabel:"Apply from chain",applyButton:"Apply"},chain:{title:"Triage conflict from peer update",intro:"were changed by a peer (or by another tab) in a way that disagrees with your local triage on",trailingNote:`Other findings whose remote value didn't conflict were applied automatically; this list only covers disagreements. Pick which side to keep for each \u2014 a "keep current" pick re-publishes your local value to the chain on your next save.`,importedSideLabel:"Apply from chain",applyButton:"Apply"}};function jd(){xl(async(i,e,t)=>{let r=cl(i);try{return await Al(i,r,Ud[t]??Ud.attach)}catch{let n=i.length;return alert(`${t==="attach"?"A report attach":"A workspace sync"} had ${n} triage disagreement${n===1?"":"s"} with your local view. Kept your local values because another dialog is open. ${t==="attach"?"Detach and re-attach the report to pick again.":"Your local values will re-publish to the chain on the next change."}`),null}})}var Rn=class extends q{static properties={retry:{type:Boolean},_value:{state:!0}};constructor(){super(),this.retry=!1,this._value=""}_finish(e){this._value="",super._finish(e)}_onCancel=()=>this._finish(null);_onInput=e=>{this._value=e.target.value};_onSubmit=()=>{let e=this._value??"";e&&this._finish(e)};_onKeydown=e=>{e.key==="Enter"&&(e.preventDefault(),this._onSubmit())};render(){let e=(this._value??"").length>0,t=this.retry?"That password didn't match. Try again, or cancel to leave the workspace unsynced for now.":"This sync server requires a password before it accepts a new workspace. Enter it to create the workspace on the server.";return a`<dialog @close="${this._onClose}"><header><h3>Sync server password</h3></header><p class="nwd-intro">${t}</p><input type="password" class="nwd-input" placeholder="Password" autocomplete="off" data-1p-ignore="true" data-lpignore="true" data-bwignore="true" data-form-type="other" name="dv-sync-auth" maxlength="4096" .value="${this._value}" @input="${this._onInput}" @keydown="${this._onKeydown}"><footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" ?disabled="${!e}" @click="${this._onSubmit}">${this.retry?"Retry":"Authenticate"}</button></footer></dialog>`}};customElements.define("sync-auth-dialog",Rn);function Vd({retry:i=!1}={}){return Y("sync-auth-dialog",{retry:!!i})}function Kd(){$l(async({retry:i})=>{try{return await Vd({retry:i})}catch(e){return console.warn("Sync auth dialog failed to open:",e),null}})}var Zi="https://triage.space/",Nh=[{hostname:"deepaudit.dev",pathPrefix:"/",supportsSync:!0},{hostname:"chalker.github.io",pathPrefix:"/deepview/",supportsSync:!1}];function zh(){for(let i of Nh)if(location.hostname===i.hostname&&location.pathname.startsWith(i.pathPrefix))return i;return null}var qh=["deepview.triage","deepview.triage.pending"],Hh="deepview.repoUrls";function Uh(){try{for(let i of qh)if(localStorage.getItem(i))return!0}catch{return!0}try{let i=localStorage.getItem(Hh);if(i){let e=JSON.parse(i);if(e&&typeof e=="object"&&Object.keys(e).length>0)return!0}}catch{return!0}return!1}async function jh(){if(Uh())return!0;let i=[];try{i=await gt()}catch{return!0}if(i.length>0)return!0;try{if(he().length>0)return!0}catch{return!0}try{return await il()}catch{return!0}}var Ln=class extends U{static properties={supportsSync:{attribute:!1}};createRenderRoot(){return this}constructor(){super(),this.supportsSync=!1}firstUpdated(){let e=this.querySelector("dialog");e&&e.showModal();let t=this.querySelector("button.om-stay");t&&t.focus()}_finish(e){if(this._settled)return;this._settled=!0;let t=this.querySelector("dialog");t&&t.close(),this.dispatchEvent(new CustomEvent("resolve",{detail:e}))}_onClose=()=>this._finish(!1);_onStay=()=>this._finish(!1);_onMigrate=()=>this._finish(!0);render(){let e=()=>a`<a class="om-link" href="${Zi}" target="_blank" rel="noopener noreferrer">${Zi}</a>`;return a`<dialog class="origin-migration-dialog" @close="${this._onClose}"><header class="om-head"><h3>This deepview build has moved</h3><p><code>${location.host}${location.pathname}</code> has moved to ${e()}.</p></header><section class="om-body"><p>Workspaces and reports don't migrate automatically — they live in this origin's browser storage (OPFS where available, localStorage as a fallback) and have to be re-imported on ${e()}.</p>${this.supportsSync?a`<p>For each workspace, use the <strong>Export workspace</strong> button in the sidebar to download a <code>.gz</code> bundle (workspace + its reports + its triage), then drop that file on ${e()}. Workspaces that had sync configured will pick their triage state back up from the sync server once you re-import them with the same key.</p><p>For triage attached to loose reports (or as a top-up after re-importing workspaces), call <code>DeepView.export()</code> in the browser console — that downloads just the triage entries plus saved repo URLs, no reports or workspaces.</p>`:a`<p>This build has no sync layer. For each workspace, use the <strong>Export workspace</strong> button in the sidebar to download a <code>.gz</code> bundle (workspace + its reports + its triage), then drop that file on ${e()}.</p><p>For triage attached to loose reports, call <code>DeepView.export()</code> in the browser console — that downloads just the triage entries plus saved repo URLs, no reports or workspaces. Reports themselves need to be re-dropped from their original JSON on the new origin.</p>`}</section><footer class="om-actions"><button type="button" class="om-stay" @click="${this._onStay}">Keep editing on ${location.host}</button> <button type="button" class="primary om-go" @click="${this._onMigrate}">Switch to triage.space</button></footer></dialog>`}};customElements.define("origin-migration-dialog",Ln);function Vh(i){return new Promise(e=>{let t=document.createElement("origin-migration-dialog");t.supportsSync=i.supportsSync,t.addEventListener("resolve",r=>{t.remove(),e(!!r.detail)}),document.body.append(t)})}async function Gd(){let i=zh();return i?await jh()?await Vh(i)?(location.assign(Zi),!0):!1:(location.replace(Zi),!0):!1}var Mn=class extends q{static styles=[...q.styles,M(Ml)];static properties={encoded:{type:String},_stage:{state:!0},_password:{state:!0},_name:{state:!0},_decoded:{state:!0},_existingById:{state:!0},_busy:{state:!0},_error:{state:!0},_settled:{state:!0}};constructor(){super(),this.encoded="",this._stage="password",this._password="",this._name="",this._decoded=null,this._existingById=null,this._busy=!1,this._error="",this._settled=!1}focusInitial(){this._focusActiveInput()}updated(e){e.has("_stage")&&this._focusActiveInput()}_focusActiveInput(){if(this._stage==="password")this.renderRoot.querySelector('input[type="password"]')?.focus();else if(this._stage==="name"){let e=this.renderRoot.querySelector('input[data-role="name"]');e&&(e.focus(),e.select())}}_finish(e){this._settled||(this._decoded=null,this._password="",this.encoded="",super._finish(e))}_onClose=()=>this._finish(null);_onCancel=()=>this._finish(null);_onPasswordInput=e=>{this._password=e.target.value,this._error=""};_onNameInput=e=>{this._name=e.target.value};_onUnlock=async()=>{if(!(!this._password||this._busy)){this._busy=!0,this._error="";try{let e=await bl({encoded:this.encoded,password:this._password});if(this._settled)return;let t=he().find(r=>r.id===e.id)??null;this._decoded=e,this._existingById=t,this._name=e.name,this._password="",this._stage="name"}catch(e){if(this._settled)return;this._error=e?.message??String(e)}finally{this._busy=!1}}};_onAttach=()=>{if(!this._decoded)return;let e=Ii(this._name);if(!e)return;let t=he().find(r=>r.id===this._decoded.id)??null;if(t){this._existingById=t;return}this._nameCollision(e)||this._finish({id:this._decoded.id,name:e,privateKeyBase64:this._decoded.privateKeyBase64})};_nameCollision(e){if(!e||!this._decoded)return null;for(let t of he())if(t.id!==this._decoded.id&&Ii(t.name)===e)return t;return null}_onKeydown=e=>{e.key==="Enter"&&(e.preventDefault(),this._stage==="password"?this._onUnlock():this._stage==="name"&&this._onAttach())};_passwordStage(){return a`<p class="nwd-note ui-hint">Someone shared a workspace with you. Enter the password they sent separately to attach it to this browser.</p><label class="wsl-field"><span>Password</span> <input type="password" class="nwd-input" autocomplete="off" data-1p-ignore="true" data-lpignore="true" data-bwignore="true" data-form-type="other" name="dv-share-link-unlock" maxlength="1024" .value="${this._password}" @input="${this._onPasswordInput}" @keydown="${this._onKeydown}"></label> ${this._error?a`<p class="wsl-error" role="alert">${this._error}</p>`:m}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" ?disabled="${!this._password||this._busy}" @click="${this._onUnlock}">${this._busy?"Unlocking\u2026":"Unlock"}</button></footer>`}_alreadyAttachedStage(){let e=this._existingById;return a`<p class="nwd-note">This workspace is already attached as <strong>"${e?.name??""}"</strong>. Open it from the sidebar.</p><footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" class="primary" @click="${this._onCancel}">Close</button></footer>`}_nameStage(){if(this._existingById)return this._alreadyAttachedStage();let e=Ii(this._name),t=this._nameCollision(e),r=!!e&&!t;return a`<p class="nwd-note ui-hint">Pick a name for the workspace on this device. The shared identity is preserved either way — only the visible label changes.</p><label class="wsl-field"><span>Workspace name</span> <input type="text" class="nwd-input" data-role="name" placeholder="Workspace name" maxlength="200" .value="${this._name}" @input="${this._onNameInput}" @keydown="${this._onKeydown}"></label> ${t?a`<p class="wsl-error" role="alert">A workspace named "${e}" already exists on this device. Pick a different name.</p>`:m}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" ?disabled="${!r}" @click="${this._onAttach}">Attach</button></footer>`}render(){let e=this._stage==="password"?"Attach shared workspace":this._existingById?"Workspace already attached":"Name the workspace";return a`<dialog @close="${this._onClose}"><header><h3>${e}</h3></header>${this._stage==="password"?this._passwordStage():this._nameStage()}</dialog>`}};customElements.define("workspace-unlock-link-dialog",Mn);function Wd({encoded:i}={}){return Ca("workspace-unlock-link-dialog",{encoded:i??""},e=>{e.encoded=""})}var ee=null,er=!1,ei=null;function Kh(i){if(!i)return"Could not unlock. Try again.";switch(i.name??""){case"NotAllowedError":case"AbortError":return"";case"SecurityError":return"The site identity does not match the one this passkey was registered for. If you opened DeepView through a different URL (different subdomain, different port), reload via the original URL.";case"InvalidStateError":return"The passkey state on this device is inconsistent. Try reloading the page or removing and re-creating the passkey.";case"NotSupportedError":return"This browser does not support the WebAuthn PRF extension this site needs. Try a recent Chrome, Safari, or Edge with a platform authenticator.";case"NetworkError":return"A network error prevented the passkey from completing. Check your connection and try again.";case"UnknownError":return"The authenticator returned an unknown error. Try again, or use a different passkey.";default:{let t=i.message??String(i);return t.length>200?t.slice(0,197)+"\u2026":t}}}function Gh(){if(ee)return ee;ee=document.createElement("div"),ee.id="lock-overlay",ee.setAttribute("role","dialog"),ee.setAttribute("aria-modal","true"),ee.setAttribute("aria-label","Unlock DeepView"),ee.innerHTML=`
53
2
  <div class="lock-overlay-card">
54
3
  <div class="lock-overlay-icon" aria-hidden="true">
55
4
  <svg viewBox="0 0 32 32" width="40" height="40" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="7" y="15" width="18" height="12" rx="1.5"/><path d="M11 15v-4a5 5 0 0 1 10 0v4"/></svg>
@@ -66,79 +15,96 @@ ${r}`}">${dv}<span class="file-label">${n}</span></button></li>`}function uv(e,t
66
15
  <a href="#" class="lock-overlay-wipe">Wipe local data and start over</a>
67
16
  </p>
68
17
  </div>
69
- `;let e=Le.querySelector("button"),t=Le.querySelector(".lock-overlay-error");return e.addEventListener("click",async()=>{if(!di){di=!0,t.hidden=!0,t.textContent="",e.disabled=!0,e.textContent="Waiting\u2026",_o=new AbortController;try{let n=await En({signal:_o.signal})}catch(n){let o=Nv(n);t.textContent=o,t.hidden=!o}finally{di=!1,_o=null,e.disabled=!1,e.textContent="Unlock with passkey"}}}),Le.querySelector(".lock-overlay-wipe").addEventListener("click",async n=>{if(n.preventDefault(),!di&&confirm(`Wipe ALL local DeepView data and start over?
18
+ `;let i=ee.querySelector("button"),e=ee.querySelector(".lock-overlay-error");return i.addEventListener("click",async()=>{if(!(er||!Pn())){er=!0,e.hidden=!0,e.textContent="",i.disabled=!0,i.textContent="Waiting\u2026",ei=new AbortController;try{await Ka({signal:ei.signal})}catch(r){let n=Kh(r);e.textContent=n,e.hidden=!n}finally{er=!1,ei=null,i.disabled=!1,i.textContent="Unlock with passkey"}}}),ee.querySelector(".lock-overlay-wipe").addEventListener("click",async r=>{if(r.preventDefault(),!(er||!Pn())&&confirm(`Wipe ALL local DeepView data and start over?
70
19
 
71
20
  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.
72
21
 
73
- 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 An()}catch(o){alert(`Wipe failed: ${o?.message??o}. Try again or clear localStorage manually via DevTools.`);return}location.reload()}}),document.body.append(Le),Le}function Uv(){return bt()?X()&&!it():!1}function Eh(){if(Uv()){let e=Dv();e.hidden=!1;let t=e.querySelector("button");t&&t.focus()}else if(Le&&(Le.hidden=!0,_o))try{_o.abort()}catch{}}me(Eh);Eh();var Ah=`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)}}
74
- `;var bc=class extends T{static styles=[...T.styles,A(an),A(Ah)];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">${ln(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",bc);function Th({initial:e="",finding:t=null}={}){return K("comment-dialog",{initial:e,finding:t})}var Ih=`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}
75
- `;var yc=class extends T{static styles=[...T.styles,A(an),A(Ih)];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=Qr(o);return c`<dialog @close="${this._onClose}"><header><h3>${n?"Edit fix link":"Add fix link"}</h3><div class="finding">${ln(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",yc);function Rh({initial:e="",finding:t=null}={}){return K("fix-link-dialog",{initial:e,finding:t})}var Hv={critical:"Critical",high:"High",medium:"Medium",low:"Low",high_bug:"High Bug",bug:"Bug",informational:"Informational"},jv=["critical","high","medium","low","high_bug","bug","informational"];function Vv(e){return Hv[e]??e}function Bh(e){let t=jv.indexOf(e);return t===-1?999:t}function Fh(e){let t=parseInt(e.line,10);return Number.isFinite(t)?`${e.file}:${t}`:e.file}function Kv(e){let t=P(e),r=a.triage.get(t),n=r?.triage,o=Zr(e),s=r?.color,i=r?.comment??"",l=et(e.description??"",e),d=yr(e),p=[d?`### ${Fh(e)} - ${d}`:`### ${Fh(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:** ${et(e.recommendation,e).trim()}`),p.push("")),e.confidenceReason&&(p.push(`**Confidence reason:** ${et(e.confidenceReason,e).trim()}`),p.push("")),e.fix&&(p.push(`**Fix:** ${et(e.fix,e).trim()}`),p.push("")),i&&(p.push(`**Comment:** ${i.trim()}`),p.push("")),p.join(`
76
- `)}function qv(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(`
77
- `);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)=>Bh(s)-Bh(i));for(let s of o){let i=n.get(s);r.push(`## ${Vv(s)} (${i.length})`),r.push("");for(let l of i)r.push(Kv(l))}return r.join(`
78
- `).trimEnd()+`
79
- `}function Gv(e){return e.map(qv).join(`
80
- ---
81
-
82
- `)}function Yv(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 Mh(e){if(e.length===0)return;let t=Gv(e),r=new Blob([t],{type:"text/markdown;charset=utf-8"});Fr(r,Yv(e))}ba(()=>{a.currentView==="bundles"&&a.selectedBundle?$():a.currentView==="packages"?$():a.currentView==="repositories"?$():(a.currentView==="findings"||a.currentView==="files")&&j().catch(()=>{})});function Lh(){a.currentView==="bundles"&&a.bundleDetailsTab==="graph"?ei():Xl()}function hi(){a.currentView==="bundles"&&a.bundleDetailsTab==="graph"?ti():Ql()}function So(){let e=document.querySelector(".bundle-source-code-wrap"),t=e?.scrollTop??0,r=e?.scrollLeft??0;$();let n=document.querySelector(".bundle-source-code-wrap");n&&(n.scrollTop=t,n.scrollLeft=r)}function vc(e){let r=document.querySelector(e)?.scrollTop??0;$();let n=document.querySelector(e);n&&(n.scrollTop=r)}function Cr(){a.viewMode==="table"?vc(".findings-table-list"):$()}function Q(e,t){for(let r of e.composedPath())if(r?.matches?.(t))return r;return null}function Ph(e){let r=Q(e,"[data-gid]")?.dataset?.gid,n=r?vr(r):null;if(!n)return null;let o=_e(n);return Cp(o,Ls(o))}C.addEventListener("click",e=>{let t=Q(e,"[data-finding-code-bundle]");if(t){let _=t.dataset.findingCodeBundle,q=t.dataset.findingCodeFile,Z=t.dataset.findingCodeLine,ie=Z?parseInt(Z,10):null;a.bundleSourceFile=q||null,a.bundleSourceFindingIdx=null,a.bundleDetailsTab==="code"&&(a.bundleDetailsTab="overview");let fe=()=>{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===_){$(),fe();return}a.selectedBundle=_,a.bundleDetails=null,$(),(async()=>(await Qt(_),fe()))();return}let r=e.target.closest("[data-package-expand]");if(r){let _=r.dataset.packageExpand;a.expandedPackages.has(_)?a.expandedPackages.delete(_):a.expandedPackages.add(_),$();return}let n=e.target.closest("[data-package-row-issues]");if(n){let _=n.dataset.packageRowIssues,q=n.dataset.packageRowIssuesVersion;a.selectedPackage=_,a.selectedPackageVersion=q||null,a.packageDetailsTab="issues",a.packageSlideTriage=null,a.packageSlideTransient=!0,$();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,$();return}let s=e.target.closest("[data-select-package]");if(s){let _=s.dataset.selectPackage,q=s.dataset.selectPackageVersion??"",Z=q===""?null:q;if(a.selectedPackage===_&&a.selectedPackageVersion===Z)return;a.selectedPackage=_,a.selectedPackageVersion=Z,a.packageDetailsTab="overview",a.packageSlideTriage=null,a.packageSlideTransient=!1,$();return}if(e.target.closest("[data-deselect-package]")){a.selectedPackage=null,a.selectedPackageVersion=null,$();return}let i=e.target.closest("[data-package-tab]");if(i){let _=i.dataset.packageTab;(_==="overview"||_==="issues")&&a.packageDetailsTab!==_&&(a.packageDetailsTab=_,$());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),$();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,$();return}if(e.target.closest("[data-deselect-repository]")){a.selectedRepository=null,$();return}let u=e.target.closest("[data-repository-tab]");if(u){let _=u.dataset.repositoryTab;(_==="overview"||_==="issues")&&a.repositoryDetailsTab!==_&&(a.repositoryDetailsTab=_,$());return}if(e.target.closest('[data-action="repository-slide-back"]')){a.repositoryDetailsTab="overview",a.repositorySlideTriage=null,a.repositorySlideTransient&&(a.selectedRepository=null,a.repositorySlideTransient=!1),$();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&&cn(a.selectedBundle,_),$());return}if(e.target.closest("[data-advisories-consent]")){kf(),$();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,$());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 q=b.dataset.bundleViewFindingIdx,Z=q===void 0?null:parseInt(q,10),ie=b.dataset.bundleViewLine,fe=ie?parseInt(ie,10):null;if(a.bundleSourceFile=_,Number.isFinite(Z)&&(a.bundleSourceFindingIdx=Z),b.closest(".bundle-code-rail")?vc(".bundle-code-rail-body"):b.closest(".bundles-slide-body")?vc(".bundles-slide-body"):$(),Number.isFinite(fe)){let te=b.dataset.bundleViewScrollBlock||"center";queueMicrotask(()=>{let We=document.querySelector(`.bundle-source-lineno-row[data-line="${fe}"]`);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"),$();return}let y=Q(e,"[data-g2-pkg]");if(y){let _=y.dataset.g2Pkg;E.solo=E.solo===_?null:_,E.solo&&(E.selected=null),Lh(),hi(),E.graphState?.requestDraw?.();return}let k=Q(e,"[data-g2-select]");if(k){E.selected=k.dataset.g2Select,Lh();return}let w=Q(e,"[data-g2-top-pkgs]");if(w){E.topPkgsTab=w.dataset.g2TopPkgs,hi();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&&cn(a.selectedBundle,"issues"),$();return}Ps(),a.filterConfMin=0,a.filterInclude=v.dataset.g2JumpFindings,a.currentView="findings",a.viewMode==="graph"&&(a.viewMode="table"),ze(),$();return}let S=Q(e,"[data-g2-jump-file]");if(S){let _=S.dataset.g2JumpFile;a.currentView="files",ze(),$(),requestAnimationFrame(()=>{let q=document.querySelector(`#${ao(_)}`);q&&q.scrollIntoView({behavior:"smooth",block:"start"})});return}if(Q(e,"#g2-path-filter-clear")){E.pathFilter="";let _=document.querySelector("graph-layout")?.shadowRoot?.querySelector("#g2-path-filter");_&&(_.value=""),E.graphState?.requestDraw?.();return}if(Q(e,"#g2-fullscreen")){document.body.classList.toggle("report-fullscreen");return}if(Q(e,"[data-g2-show-all]")){E.showAll=!E.showAll,E.layoutCache=null,E.selected=null,ze(),$();return}let R=Q(e,".graph2-triage-selector [data-triage-show]");if(R){let _=R.dataset.triageShow;a.shownTriage=a.shownTriage===_?null:_,E.layoutCache=null,E.selected=null,ze(),$();return}let O=Q(e,"[data-g2-focus-pkg]");if(O){E.focusedPkg=O.dataset.g2FocusPkg,E.layoutCache=null,ze(),$();return}if(Q(e,"#g2-back-to-full")){E.focusedPkg=null,E.layoutCache=null,ze(),$();return}let ce=Q(e,".tab");if(ce&&Q(e,".tabs")){let q=Q(e,"[data-gid]").dataset.gid,Z=ce.dataset.tid;a.activeTabByGroup.set(q,Z),Cr();return}let V=Q(e,"[data-triage-action]");if(V){let _=V.closest(".triage-menu"),q=_?.dataset.gid;if(!q)return;let Z=vr(q);if(!Z)return;let ie=V.dataset.triageAction;if(!["fixed","invalid","deleted","ignored","restore"].includes(ie))return;let te=ye(Z).hasConflict?[_e(Z)]:Z;for(let We of te){let Ye=P(We),Tr=Ms(We);ie==="restore"?(M(a.triage,Ye,{triage:void 0}),ne(a.triage,Ye,Tr,!1)):ie==="ignored"?It(a.triage,Ye,Tr)?ne(a.triage,Ye,Tr,!1):(M(a.triage,Ye,{triage:void 0}),ne(a.triage,Ye,Tr,!0)):a.triage.get(Ye)?.triage===ie?M(a.triage,Ye,{triage:void 0}):(M(a.triage,Ye,{triage:ie}),ne(a.triage,Ye,Tr,!1))}try{_.hidePopover()}catch{}oe(),Cr();return}if(Q(e,".mark-comment")){let q=Q(e,"[data-gid]").dataset.gid,Z=vr(q);if(!Z)return;let ie=_e(Z),fe=P(ie),te=a.triage.get(fe)?.comment??"";Th({initial:te,finding:ie}).then(We=>(We===null||(M(a.triage,fe,{comment:We||void 0}),oe(),Cr()),null)).catch(()=>{});return}let Re=Q(e,".mark-copy");if(Re){let _=Ph(e);if(_===null)return;try{navigator.clipboard.writeText(_).then(()=>(Re.classList.add("copied"),setTimeout(()=>Re.classList.remove("copied"),1e3),null)).catch(()=>{})}catch{}return}let nt=Q(e,".mark-claude");if(nt){let _=Ph(e);if(_===null)return;let q=`claude://code/new?q=${encodeURIComponent(`Confirm and fix:
83
-
84
- ${_}`)}`;try{window.location.href=q,nt.classList.add("copied"),setTimeout(()=>nt.classList.remove("copied"),1e3)}catch{}return}if(Q(e,".mark-fix")){let q=Q(e,"[data-gid]").dataset.gid,Z=vr(q);if(!Z)return;let ie=_e(Z),fe=P(ie),te=a.triage.get(fe)?.fix??"";Rh({initial:te,finding:ie}).then(We=>(We===null||(M(a.triage,fe,{fix:We||void 0}),oe(),Cr()),null)).catch(()=>{});return}let Pt=e.target.closest("[data-triage-show]");if(Pt&&!Pt.closest(".graph2-triage-selector")){let _=Pt.dataset.triageShow;a.shownTriage=a.shownTriage===_?null:_,$();return}if(e.target.closest("[data-table-deselect]")){a.tableSelectedGid=null,Cr();return}let pt=e.target.closest("[data-tree-select]");if(pt){let _=pt.dataset.treeSelect;a.filesSelectedFile=a.filesSelectedFile===_?null:_,$();return}e.target.closest("[data-tree-deselect]")&&(a.filesSelectedFile=null,$())});var Oh=document.querySelector("#bundle-source-overlay-slot");Oh&&Oh.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,$());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())}});C.addEventListener("row-select",e=>{let t=e.detail?.gid;t&&(a.tableSelectedGid=a.tableSelectedGid===t?null:t,Cr())});var gi="application/x-deepview-kanban-gid";function Jv(e,t){let n=ye(e).hasConflict?[_e(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 kc(){for(let e of C.querySelectorAll(".kanban-card.dragging"))e.classList.remove("dragging");for(let e of C.querySelectorAll(".kanban-column.drag-over"))e.classList.remove("drag-over")}C.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(gi,r),e.dataTransfer.setData("text/plain",r),e.dataTransfer.effectAllowed="move",t.classList.add("dragging"))});C.addEventListener("dragend",()=>{kc()});C.addEventListener("dragover",e=>{if(!e.dataTransfer?.types.includes(gi))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 C.querySelectorAll(".kanban-column.drag-over"))r!==t&&r.classList.remove("drag-over");t.classList.add("drag-over")}});C.addEventListener("dragleave",e=>{let t=e.target.closest?.(".kanban-column[data-kanban-target]");t&&(t.contains(e.relatedTarget)||t.classList.remove("drag-over"))});C.addEventListener("drop",e=>{if(!e.dataTransfer?.types.includes(gi))return;let t=e.target.closest?.(".kanban-column[data-kanban-target]");if(!t){kc();return}e.preventDefault();let r=e.dataTransfer.getData(gi),n=t.dataset.kanbanTarget;if(kc(),!r||!n)return;let o=vr(r);!o||(ye(o).commonTriage??"untriaged")===n||(Jv(o,n),$(),queueMicrotask(oe))});var wc=!1;function ui(e){return e?C.querySelector(`.kanban-card[data-gid="${CSS.escape(e)}"]`):null}function pi(e){let t=e??C.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 fi(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,$();return}if(wc)return;wc=!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),wc=!1};if(r){let u=ui(e);u?(pi(u),u.style.viewTransitionName="kanban-detail-modal",u.getBoundingClientRect()):pi(),a.kanbanPopoverGid=e;let p=document.startViewTransition(()=>{$(),u&&(u.style.viewTransitionName="")}),f=setTimeout(()=>s(u),600);(async()=>{try{await p.finished}catch{}clearTimeout(f),s(u)})();return}pi(),a.kanbanPopoverGid=e;let i=null,l=document.startViewTransition(()=>{$(),i=ui(t),i&&(pi(i),i.style.viewTransitionName="kanban-detail-modal")}),d=setTimeout(()=>s(i??ui(t)),600);(async()=>{try{await l.finished}catch{}clearTimeout(d),s(i??ui(t))})()}C.addEventListener("click",e=>{if(e.target.closest?.(".kanban-detail-close")){fi(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;fi(a.kanbanPopoverGid===r?null:r);return}e.target.closest?.(".kanban-detail-modal")||a.kanbanPopoverGid&&fi(null)});document.addEventListener("keydown",e=>{e.key==="Escape"&&a.kanbanPopoverGid&&fi(null)});function Nh(e){if(!e||a.focusGid===e)return;a.focusGid=e,$();let t=C.querySelector(".focus-side-card.active");t&&t.scrollIntoView({block:"nearest",behavior:"instant"});let r=C.querySelector(".focus-code-line-active");r&&r.scrollIntoView({block:"center",behavior:"instant"})}function Dh(e){let t=C.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&&Nh(o)}C.addEventListener("click",e=>{let t=e.target.closest?.("[data-focus-nav]");if(t){Dh(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&&Nh(n)});function Xv(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||Xv(e))return;let t=0;if(e.key==="ArrowRight")t=1;else if(e.key==="ArrowLeft")t=-1;else return;e.preventDefault(),Dh(t)});C.addEventListener("mark-color",e=>{let t=Q(e,"[data-gid]");if(!t)return;let r=t.dataset.gid,n=vr(r);if(!n)return;let o=P(_e(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(),Cr()});var Er=null,$c=null;function Uh(){if(Er!==null||a.reports.length===0)return;Er=a.viewMode,$c=document.title,a.viewMode==="table"&&(a.viewMode="list",$());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 zh(){Er!==null&&(a.viewMode!==Er&&(a.viewMode=Er,$()),document.title=$c,Er=null,$c=null)}window.addEventListener("beforeprint",Uh);window.addEventListener("afterprint",zh);document.addEventListener("print-requested",async()=>{if(a.reports.length!==0&&Er===null){Uh();try{await Promise.all([...C.querySelectorAll("finding-card")].map(e=>e.updateComplete)),window.print()}catch(e){throw zh(),e}}});document.addEventListener("download-requested",()=>{a.reports.length!==0&&Mh(a.reports)});C.addEventListener("analyzer-change",e=>{a.filterAnalyzer=e.detail.value,$()});C.addEventListener("repo-change",e=>{a.filterRepo=e.detail.value,$()});C.addEventListener("bundle-search-mode-change",e=>{let t=e.detail?.mode;t!=="files"&&t!=="code"&&t!=="issues"||(a.bundleCodeSearchMode=t,$())});C.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;$()});C.addEventListener("range-change",e=>{e.target.id==="conf-range"&&(a.filterConfMin=e.detail.low,a.filterConfMax=e.detail.high,$())});C.addEventListener("input",e=>{let t=e.composedPath()[0],r=t?.id,n=t?.value;r==="g2-path-filter"&&(E.pathFilter=n,E.graphState?.requestDraw?.())});C.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;$()});C.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?.(),hi();return}a.filterSeverities.has(t)?a.filterSeverities.delete(t):a.filterSeverities.add(t),$()});C.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?.(),hi();return}a.filterColors.has(t)?a.filterColors.delete(t):a.filterColors.add(t),$()});C.addEventListener("source-toggle",e=>{let t=e.detail.source,r=a.filterSources.has(t);a.filterSources.clear(),r||a.filterSources.add(t),$()});C.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;$()});C.addEventListener("view-mode-change",e=>{if(e.detail.kind==="files"){a.filesViewMode=e.detail.mode,$();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),$()});C.addEventListener("repo-edit-start",()=>{a.repoEditing=!0,$()});C.addEventListener("repo-input",e=>{a.repoUrl=e.detail.url,je(a.currentFile,a.repoUrl)});C.addEventListener("repo-commit",e=>{a.repoUrl=e.detail.url,je(a.currentFile,a.repoUrl),a.repoEditing=!1,$()});C.addEventListener("repo-cancel",e=>{a.repoUrl=e.detail.url,je(a.currentFile,a.repoUrl),a.repoEditing=!1,$()});document.addEventListener("keydown",e=>{if(e.key==="Escape"){if(a.bundleSourceFindingIdx!=null){a.bundleSourceFindingIdx=null,So();return}a.bundleSourceFile&&(a.bundleSourceFile=null,$())}});var Wh=`: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}}
85
- `;var xc="deepview.theme",un=Object.freeze(["dark","light","green","pink"]),Zv={dark:{base:"#1a1a1b",dim:"#0a0a0a"},light:{base:"#f6f6fa",dim:"#646464"},green:{base:"#0a140a",dim:"#050a05"},pink:{base:"#ffe4ee",dim:"#a3727f"}},e0="\u2600",t0="\u263E",_c="deepview-theme-changed",mi="dark",Cc=!1;function r0(){try{let e=localStorage.getItem(xc);return un.includes(e)?e:"dark"}catch{return"dark"}}function Co(e){un.includes(e)||(e="dark"),mi=e;for(let r of un)r!=="dark"&&document.body.classList.remove(`theme-${r}`);e!=="dark"&&document.body.classList.add(`theme-${e}`);try{e==="dark"?localStorage.removeItem(xc):localStorage.setItem(xc,e)}catch{}let t=document.querySelector('meta[name="theme-color"]');if(t){let{base:r,dim:n}=Zv[e];t.setAttribute("content",Cc?n:r)}window.dispatchEvent(new CustomEvent(_c,{detail:{theme:e}}))}Co(r0());window.addEventListener("beforeprint",()=>{Cc=!0,Co(mi)});window.addEventListener("afterprint",()=>{Cc=!1,Co(mi)});function Hh(e){if(!un.includes(e))throw new TypeError(`DeepView.setTheme: unknown theme ${JSON.stringify(e)} (expected one of ${un.map(t=>JSON.stringify(t)).join(", ")})`);Co(e)}function jh(){return mi}var Vh=un,Sc=class extends H{static properties={_light:{state:!0}};static styles=A(Wh);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(_c,this._onThemeChanged)}disconnectedCallback(){window.removeEventListener(_c,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?t0:e0}`}};customElements.define("theme-toggle",Sc);var Kh=`: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-issue,.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-issue{text-decoration:none}.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}}
86
- `;var o0=["is-critical","mark-red","mark-blue","mark-green","mark-gray","has-conflict","triage-fixed","triage-invalid","triage-deleted","triage-ignored","selected"],Ec=class extends L{static properties={group:{attribute:!1},selected:{type:Boolean}};static styles=A(Kh);constructor(){super(),this.group=null,this.selected=!1}render(){if(!this.group)return c``;this.dataset.gid=io(this.group);let t=new Set(Np(this.group));this.selected&&t.add("selected");for(let r of o0)this.classList.toggle(r,t.has(r));return c`<div class="row">${Dp(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",Ec);var qh=`: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}
87
- `;var Ac=class extends H{static properties={items:{attribute:!1},selectedGid:{attribute:!1}};static styles=A(qh);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",Ac);var Gh=`: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-issue,.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-issue{text-decoration:none}.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-issue,: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-issue,.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}}
88
- `;var a0=["finding","is-critical","mark-red","mark-blue","mark-green","mark-gray","has-conflict","triage-fixed","triage-invalid","triage-deleted","triage-ignored","multi-case"],Tc=class extends L{static properties={group:{attribute:!1},inGroup:{type:Boolean,attribute:"in-group",reflect:!0},context:{type:String,reflect:!0}};static styles=A(Gh);constructor(){super(),this.group=null,this.inGroup=!1,this.context=null}render(){if(!this.group)return c``;this.dataset.gid=tn(this.group);let t=new Set(Pp(this.group));for(let r of a0)this.classList.toggle(r,t.has(r));return c`<div class="card">${Op(this.group,{context:this.context})}</div>`}connectedCallback(){super.connectedCallback(),this.hasUpdated&&this.requestUpdate()}};customElements.define("finding-card",Tc);var Yh=`: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)}
89
- `;var c0=["red","blue","green","gray"],Ic=class extends H{static properties={selected:{type:String}};static styles=A(Yh);constructor(){super(),this.selected=null}render(){return c`${c0.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",Ic);var Rc=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",Rc);var Jh={files:"Filter files\u2026",code:"Search code\u2026",issues:"Search issues\u2026"},Xh={files:"Filter files",code:"Search code",issues:"Search issues"},d0=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>`,u0={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>`},Bc=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`${d0} <input type="text" class="bundle-code-search-input" placeholder="${o}" aria-label="${o}" .value="${Ie(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="${Xh[s]??s}" aria-label="${Xh[s]??s}" @click="${()=>this._selectMode(s)}">${u0[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",Bc);var Qh={packages:{stateKey:"packagesSearchQuery",label:"Filter packages"},repositories:{stateKey:"repositoriesSearchQuery",label:"Filter repositories"}},Fc=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="${Ie(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",Fc);var p0=[["findings-desc","Findings \u2193"],["files-desc","Files \u2193"],["reports-desc","Reports \u2193"],["name-asc","Name A\u2192Z"]],Zh={packages:{stateKey:"packagesSortBy",aria:"Sort packages"},repositories:{stateKey:"repositoriesSortBy",aria:"Sort repositories"}},Mc=class extends L{static properties={kind:{type:String}};createRenderRoot(){return this}constructor(){super(),this.kind=""}render(){let t=Zh[this.kind];return t?c`<select class="packages-sort" aria-label="${t.aria}" .value="${Ie(a[t.stateKey])}" @change="${this._onChange}">${p0.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(Zh).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",Mc);var Lc=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="${Ie(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",Lc);var eg=`: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)}
90
- `;var Pc=class extends H{static properties={min:{type:Number},max:{type:Number},step:{type:Number},low:{type:Number},high:{type:Number}};static styles=A(eg);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",Pc);var Oc=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",Oc);var tg=`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)}}
91
- `;var Nc=class extends T{static styles=[...T.styles,A(tg)];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 Za();Fr(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 el(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 tl(this.parsed,this.mode);$(),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",Nc);function rg(){return K("triage-export-dialog")}var ng=`: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}}
92
- `;function Dc(e){if(!e)return"";let t=e.match(/github\.com\/([^/?#]+\/[^/?#]+?)(?:\.git)?(?:[/?#]|$)/iu);return t?t[1]:e}var Uc=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>`,og=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>`,zc=class extends H{static properties={url:{type:String},editable:{type:Boolean,reflect:!0},editing:{type:Boolean,reflect:!0}};static styles=A(ng);constructor(){super(),this.url="",this.editable=!1,this.editing=!1,this._opener=""}render(){if(this.editable&&this.editing){let t=!!this.url,r=t?Dc(this.url):"Set repo";return c`<span class="${t?"chip":"chip empty"}" aria-hidden="true" inert>${Uc} <span class="label">${r}</span> <button type="button" class="edit-btn">${og}</button> </span><input type="text" .value="${Ie(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?Dc(this.url):"Set repo";return c`<span class="${t?"chip":"chip empty"}" @click="${t?null:this._onEdit}">${Uc} <span class="label">${r}</span> <button type="button" class="edit-btn" title="Edit repo URL" aria-label="Edit repo URL" @click="${this._onEdit}">${og}</button></span>`}return this.url?c`<span class="chip readonly" title="Repo from findings (read-only)">${Uc} <span class="label">${Dc(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",zc);function rt(e,t){for(let[r,n]of Object.entries(t))e.hasAttribute(r)||e.setAttribute(r,n)}var m0=[["critical","Critical"],["high","High"],["medium","Medium"],["low","Low"],["high_bug","High bug"],["bug","Bug"],["informational","Info"]],Wc=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(),rt(this,{role:"group","aria-label":"Filter by severity"})}render(){let t=this.kind==="graph"?new Set(this.selected):a.filterSeverities,r=m0.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",Wc);var b0=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>`,Hc=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}">${b0}<span>Delete current</span></button>`}};customElements.define("sidebar-delete-current",Hc);var y0=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>`,w0=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>`,sg={packages:{title:"Show packages",icon:y0,view:"packages"},repositories:{title:"Show repositories",icon:w0,view:"repositories"}},jc=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=sg[this.kind];if(!t)return console.warn(`<sidebar-view-button>: unknown kind ${JSON.stringify(this.kind)}; expected one of ${Object.keys(sg).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",jc);var v0=["invalid","deleted"],ig={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(),rt(this,{role:"group","aria-label":"Triage view"})}render(){let t=ig[this.kind];if(!t)return console.warn(`<slide-triage-tabs>: unknown kind ${JSON.stringify(this.kind)}; expected one of ${Object.keys(ig).map(o=>JSON.stringify(o)).join(", ")}.`),g;let r=a[t.stateKey],n=v0.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 k0=[["own","Sources"],["modules","Dependencies"]],Kc=class extends L{createRenderRoot(){return this}connectedCallback(){super.connectedCallback(),rt(this,{role:"group","aria-label":"Source filter"})}render(){return c`${k0.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",Kc);var $0=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>`,ag={findings:{stateKey:"filterInclude",placeholder:"Search findings\u2026"},files:{stateKey:"filesSearch",placeholder:"Search files\u2026"}},qc=class extends L{static properties={kind:{type:String}};createRenderRoot(){return this}constructor(){super(),this.kind=""}render(){let t=ag[this.kind];return t?c`${$0} <input type="text" aria-label="${t.placeholder}" placeholder="${t.placeholder}" .value="${Ie(a[t.stateKey])}" @input="${this._onInput}">`:(console.warn(`<toolbar-search>: unknown kind ${JSON.stringify(this.kind)}; expected one of ${Object.keys(ag).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",qc);function x0(e){if(!e)return"";let t=e.match(/github\.com\/([^/?#]+\/[^/?#]+?)(?:\.git)?(?:[/?#]|$)/iu);return t?t[1]:e}var Gc=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="${Ie(a.filterRepo)}" @change="${this._onChange}"><option value="">All repositories</option>${this.options.map(t=>{let r=t??so,n=t==null?"(no repo)":x0(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",Gc);var lg=[["none","none","unmarked"],["red","r","red"],["blue","b","blue"],["green","g","green"],["gray","x","gray"]],Yc=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(),rt(this,{role:"group","aria-label":"Filter by mark color"})}render(){let t=this.kind==="graph"?new Set(this.selected):a.filterColors;return lg.some(([n])=>(this.counts[n]??0)||t.has(n))?c`${lg.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",Yc);var _0=["fixed","invalid","deleted","ignored"],Jc={graph:"graph2-triage-selector",packages:"packages-triage-selector"},Xc=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(),rt(this,{role:"group","aria-label":"Triage view"})}render(){let t=this.states??_0,r=t.reduce((o,s)=>o+(this.counts[s]??0),0),n=this.variant?Jc[this.variant]:null;this.variant&&n===void 0&&console.warn(`<triage-selector>: unknown variant ${JSON.stringify(this.variant)}; expected one of ${Object.keys(Jc).map(o=>JSON.stringify(o)).join(", ")} or "".`);for(let o of Object.values(Jc))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",Xc);var S0={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>`},cg={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)"},Qc=["table","list","grouped","focus","kanban","graph"],Zc=class extends L{static properties={modes:{type:String},kind:{type:String}};createRenderRoot(){return this}constructor(){super(),this.modes=Qc.join(","),this.kind="findings"}connectedCallback(){super.connectedCallback(),rt(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=>Qc.includes(o)),n=r.length>0?r:Qc;return c`${n.map(o=>c`<button type="button" class="${F({"view-mode-btn":!0,active:t===o})}" title="${cg[o]}" aria-label="${cg[o]}" aria-pressed="${String(t===o)}" @click="${()=>this._select(o,t)}">${S0[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",Zc);var C0=6,dg=14,bi=2,ug=24,Eo=4;function E0(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 A0(e,t,r,n){let o=r*r,s=n*n;return Math.max(s*e/o,o/(s*t))}function pg(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,k=1/0;for(;h<n.length;){let v=n[h].value*u,S=v>m?v:m,I=v<y?v:y,R=A0(S,I,b+v,f);if(h===p||R<=k)k=R,b+=v,m=S,y=I,h++;else break}let w=b/f;if(i>=l){let v=s;for(let S=p;S<h;S++){let I=S===h-1?s+l-v:n[S].value*u/w;r.push({node:n[S],x:o,y:v,w,h:I}),v+=I}o+=w,i-=w}else{let v=o;for(let S=p;S<h;S++){let I=S===h-1?o+i-v:n[S].value*u/w;r.push({node:n[S],x:v,y:s,w:I,h:w}),v+=I}s+=w,l-=w}p=h}return r}function fg(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())fg(t)}function hg(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+=hg(o,e.path),n+=o.count;return e.value=r,e.count=n,r}function gg(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<C0&&n>=ug&&o>=ug&&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>=dg+Eo+bi?dg:0,u=t+bi,p=r+d,f=n-bi*2,h=o-d-bi;if(f<Eo||h<Eo)return;let b=[...e.children.values()].toSorted((m,y)=>y.value-m.value);for(let m of pg(b,{x:u,y:p,w:f,h}))gg(m.node,m.x,m.y,m.w,m.h,s+1,i)}var ed=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=ut(this.details);if(!t||t.size===0){this._status="empty";return}let r=[...t.keys()],{prefix:n,stripped:o}=Ft(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),k=b.children.get(y);k&&!k.isFile||(k||(k={name:y,isFile:!0,value:0,origPath:r[u]},b.children.set(y,k)),k.value+=f,l+=f,d++)}if(l===0){this._status="empty";return}for(let u of i.children.values())fg(u);hg(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="${ve(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=Lt(l),u=ve({...s,background:d,color:E0(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 pg(s,{x:0,y:0,w:this._w,h:this._h}))gg(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",ed);var T0=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>`,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="print this report" aria-label="print" @click="${this._onClick}">${T0}</button>`:g}_onClick=()=>{this.dispatchEvent(new CustomEvent("print-requested",{bubbles:!0,composed:!0}))}};customElements.define("print-button",td);var I0=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>`,rd=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}">${I0}</button>`:g}_onClick=()=>{this.dispatchEvent(new CustomEvent("download-requested",{bubbles:!0,composed:!0}))}};customElements.define("download-button",rd);function yi(e){let t=new Map;for(let[r,n]of a.triage)n[e]&&t.set(r,n[e]);return t}var R0={get markers(){return yi("color")},get triageState(){return yi("triage")},get comments(){return yi("comment")},get fixes(){return yi("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(),$()),s}};window.DeepView={get reports(){return a.reports.slice()},get groups(){return Mt()},get findings(){return Mt().flat()},get currentFile(){return a.currentFile},get currentWorkspace(){return a.currentWorkspace},triage:R0,themes:Vh,setTheme:Hh,get theme(){return jh()},triageSync:N,refresh(){$()},export(){return rg()}};var B0={default:Y.default,"claude-security":Y["claude-security"],"codex-security":Y["codex-security"],deepsec:Y.deepsec,bundle:nn,workspace:Ds};for(let e of document.querySelectorAll(".drop-supported-icon[data-icon]")){let t=B0[e.dataset.icon];t&&(e.innerHTML=t)}sp($);op($);N.onStatusChange($);rp(async(e,t)=>{a.currentWorkspace===e?await er(e):a.currentFile&&a.currentFile===t?await _t(t):await j()});np(async()=>{await j(),a.currentView==="bundles"&&$()});$h();_h();async function F0(){let e=dl();if(!e)return!1;try{history.replaceState(null,"",location.pathname)}catch{}let t;try{t=await Ch({encoded:e})}catch(n){return alert(`Couldn't open the share-link unlock prompt: ${n.message}`),!1}if(!t)return!1;let r=await Wa({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 er(r.workspace.id):await j(),!0}var Ao=!1;async function wg(){if(Ao||(Ao=!0,await Ut(),Oa(),await j(),await F0()))return;let t=ge(Zt);if(t)if(t.startsWith("ws:")){let r=t.slice(3);z().some(n=>n.id===r)&&await er(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,E.showAll=!0,$(),Qt(o))}else(await le()).includes(t)&&await _t(t)}var mg=X(),bg=!1;function yg(e){bg||(bg=!0,queueMicrotask(()=>{alert(e+" This tab will reload to refresh its state. Any unsaved edits in this tab will be lost."),location.reload()}))}me(()=>{let e=mg,t=X();if(mg=t,$(),!Ao&&it()){wg().catch(r=>console.warn("continueBoot:",r));return}if(Ao&&t&&!it()){yg("Encryption was just enabled in another tab.");return}Ao&&e&&!t&&!Gi()&&yg("Encryption was disabled in another tab.")});(async()=>{if(!await Sh()){try{let e=window.matchMedia?.("(display-mode: window-controls-overlay)").matches;if(!e&&localStorage.getItem("deepview.sidebarCollapsed")==="1"&&Ud.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()&&!it()||await wg()}})();
22
+ 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 Ga()}catch(n){alert(`Wipe failed: ${n?.message??n}. Try again or clear localStorage manually via DevTools.`);return}location.reload()}}),document.body.append(ee),ee}function Pn(){return H()||!Va()?!1:we()&&!Ye()}async function An(){if(await St(),Pn()){let i=Gh();i.hidden=!1;let e=i.querySelector("button");e&&e.focus()}else if(ee&&(ee.hidden=!0,ei))try{ei.abort()}catch{}}Pi(An);document.addEventListener("managed-client-mode-change",An);An();var In=class extends q{static styles=[...q.styles,M(bt),M(Hd)];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 e=this.renderRoot.querySelector("textarea");if(!e)return;e.focus();let t=e.value.length;try{e.setSelectionRange(t,t)}catch{}}_onInput=e=>{this._value=e.target.value};_onSave=()=>{let e=(this._value??"").trim(),t=(this.initial??"").trim();if(e===t){this._finish(null);return}this._finish(e)};_onClear=()=>this._finish("");_onCancel=()=>this._finish(null);_onKeydown=e=>{e.key==="Enter"&&(e.ctrlKey||e.metaKey)&&(e.preventDefault(),this._onSave())};render(){let e=this.finding??{},t=e.file?e.line?`${e.file}:${e.line}`:e.file:"",r=(this.initial??"").length>0;return a`<dialog @close="${this._onClose}"><header><h3>${r?"Edit comment":"Add comment"}</h3><div class="finding">${vt(_i(e,l.severityMode))} ${t?a`<span class="loc" data-tooltip-truncated data-tooltip="${t}">${t}</span>`:m}</div>${e.description?a`<div class="desc" data-tooltip-truncated data-tooltip="${e.description}">${e.description}</div>`:m}</header><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">${r?a`<button type="button" class="danger" @click="${this._onClear}">Clear</button>`:m} <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",In);function Yd({initial:i="",finding:e=null}={}){return Y("comment-dialog",{initial:i,finding:e})}var Jd=`dialog{width:min(96vw,1400px);max-width:1400px;height:min(88dvh,1000px);max-height:92dvh;margin:auto;padding:0;overflow:hidden}dialog[open]{display:flex;flex-direction:column}header{display:flex;align-items:center;gap:1rem;padding:.7rem 1rem;border-bottom:1px solid var(--border);flex:0 0 auto;& h3{margin:0;min-width:0;flex:1;overflow-wrap:anywhere;font:.85rem ui-monospace,monospace}& button{border:0;background:transparent;color:var(--muted);font-size:1.4rem;padding:0 .3rem;&:hover{color:var(--text)}}}.source-scroll{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain}.source-status{padding:1rem;color:var(--muted)}.source-lines{display:flex;min-width:100%;width:max-content;font:.8rem/1.6 ui-monospace,monospace;& aside{position:sticky;left:0;align-self:stretch;flex:0 0 auto;padding:.75rem 0;background:var(--surface);color:var(--muted);border-right:1px solid var(--border);text-align:right;user-select:none;& div{padding:0 .75rem}.cited{background:rgb(from var(--accent) r g b / .18);color:var(--accent);font-weight:700}}& pre{padding:.75rem 1rem;margin:0;tab-size:4}& pre,code{font:inherit;white-space:pre}}
23
+ `;var Fn=class extends q{static styles=[...q.styles,M(Jd),M(kt)];static properties={reportId:{attribute:!1},file:{attribute:!1},line:{attribute:!1},_path:{state:!0},_content:{state:!0},_highlighted:{state:!0},_loading:{state:!0}};constructor(){super(),this.reportId="",this.file="",this.line="",this._path="",this._content=null,this._highlighted=null,this._loading=!0}beforeOpen(){this._load()}async _load(){try{let{data:e,error:t}=await Td(this.reportId).then(o=>({data:o}),o=>({error:o}));if(this._settled||!this.isConnected)return;let r=Ed(this.reportId),n=t?r?.error===t:r?.data===e||e===null&&!!r?.error;if(!r||!n||t?.name==="AbortError"||r.controller?.signal.aborted){this._finish(null);return}if(this._sourceSignal=r.controller?.signal,this._sourceSignal?.addEventListener("abort",this._onClose,{once:!0}),this._path=e?.paths.get(this.file)??this.file,this._content=e?.sources.get(this._path)??null,this._loading=!1,await this.updateComplete,this._settled||!this.isConnected)return;qi(this.renderRoot.querySelector(".source-scroll"),this.renderRoot.querySelectorAll(".cited"));let s=xi(this._path,e?.formats?.get(this._path),this._content);if(s&&this._content!==null){let o=await yt(this._content,s);!this._settled&&this.isConnected&&(this._highlighted=o)}}catch(e){e.name==="AbortError"?this._finish(null):this._loading=!1}}disconnectedCallback(){this._sourceSignal?.removeEventListener("abort",this._onClose),this._content=null,this._highlighted=null,super.disconnectedCallback()}_onKeydown=e=>{e.key==="Escape"&&e.stopPropagation()};render(){let e=Fe(this.line);return a`<dialog aria-labelledby="source-title" @close="${this._onClose}" @keydown="${this._onKeydown}" @click="${this._onBackdrop}"><header><h3 id="source-title" class="mono">${this._path||this.file}</h3><button type="button" aria-label="Close source viewer" @click="${this._onClose}">×</button></header><div class="source-scroll" tabindex="0" aria-label="Full source code" aria-busy="${String(this._loading)}">${this._content===null?a`<p class="source-status" role="status">${this._loading?"Loading source\u2026":"Source unavailable"}</p>`:a`<div class="source-lines"><aside aria-hidden="true">${this._content.split(`
24
+ `).map((t,r)=>a`<div class="${e&&r+1>=e.start&&r+1<=e.end?"cited":""}">${r+1}</div>`)}</aside><pre><code>${typeof this._highlighted=="string"?J(this._highlighted):this._content}</code></pre></div>`}</div></dialog>`}};customElements.define("finding-source-dialog",Fn);function Xd({reportId:i,file:e,line:t}){return Y("finding-source-dialog",{reportId:i,file:e,line:t})}var Dn=class extends q{static styles=[...q.styles,M(Il)];static properties={bundleName:{type:String},encrypted:{type:Boolean}};constructor(){super(),this.bundleName="",this.encrypted=!1}focusInitial(){this.renderRoot.querySelector('button[data-role="cancel"]')?.focus()}_finish(e){this._settled||super._finish({confirmed:!!e})}_onClose=()=>this._finish(!1);_onCancel=()=>this._finish(!1);_onConfirm=()=>this._finish(!0);_securityNote(){return this.encrypted?a`<p class="lwd-note">The bundle is saved <strong>unencrypted</strong> — even though your vault keeps its stored copy encrypted — and the file contains <strong>all of the bundle's related sources</strong>. Anyone with access to the downloaded file can read every bundled source, so store or share it with care.</p>`:a`<p class="lwd-note">The downloaded file is <strong>unencrypted</strong> and contains <strong>all of the bundle's related sources</strong>. Anyone with access to it can read every bundled source, so store or share it with care.</p>`}render(){return a`<dialog @close="${this._onClose}"><header><h3>Download bundle</h3></header><p class="lwd-body">Download <strong>"${this.bundleName}"</strong> to disk?</p>${this._securityNote()}<footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" data-role="cancel" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" @click="${this._onConfirm}">Download</button></footer></dialog>`}};customElements.define("download-bundle-dialog",Dn);function Qd({name:i,encrypted:e}={}){return Y("download-bundle-dialog",{bundleName:i??"",encrypted:!!e})}var Zd=a`<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>`,eu=a`<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="1.8" y="5" width="20.4" height="14" rx="2"/><path d="M5.6 15.6V8.4l3.1 3.6 3.1-3.6v7.2"/><path d="M16.9 8.4v7.2m-2.6-2.9 2.6 2.9 2.6-2.9"/></svg>`,tu=a`<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>`;function Yh(i,e){let t=Ra.find(r=>r.value===i)?.label??i;return nn(i)?.includes("partial")?e==="exclude"?`${t} (full only)`:e==="only"?`${t} (partial only)`:t:t}function Jh(i){return ia.filter(e=>i.has(e)).map(e=>Zo[e]??e).join(", ")}function On(i=l){let e=[];if(i.filterSeverities.size>0&&e.push({key:"severity",label:"Severity",value:Jh(i.filterSeverities),clear:{filterSeverities:new Set}}),i.filterColors.size>0&&e.push({key:"marks",label:"Marks",value:[...i.filterColors].map(t=>ta[t]??t).join(", "),clear:{filterColors:new Set}}),i.filterSources.size===1&&e.push({key:"source",label:"Source",value:i.filterSources.has("own")?"Sources only":"Dependencies only",clear:{filterSources:new Set}}),i.filterAnalyzer&&e.push({key:"analyzer",label:"Analyzer",value:i.filterAnalyzer===Dl?"(none)":i.filterAnalyzer,clear:{filterAnalyzer:""}}),i.filterModel&&e.push({key:"model",label:"Model",value:i.filterModel===Ol?"(none)":i.filterModel,clear:{filterModel:""}}),i.filterRepo&&e.push({key:"repo",label:"Repository",value:i.filterRepo===Di?"(no repo)":i.filterRepo,clear:{filterRepo:""}}),nn(i.filterRevalidate)&&e.push({key:"revalidate",label:"Revalidation",value:Yh(i.filterRevalidate,i.filterPartial),clear:{filterRevalidate:"",filterPartial:""}}),!i.filterRevalidate&&(i.filterConfMin>0||i.filterConfMax<10)){let t;i.filterConfMin>0&&i.filterConfMax<10?t=`${i.filterConfMin}\u2013${i.filterConfMax}`:i.filterConfMin>0?t=`\u2265 ${i.filterConfMin}`:t=`\u2264 ${i.filterConfMax}`,e.push({key:"confidence",label:"Confidence",value:t,clear:{filterConfMin:0,filterConfMax:10}})}i.filterInclude&&e.push({key:"search",label:i.filterIncludeNegate?"Excluding":"Search",value:`"${i.filterInclude}"`,clear:{filterInclude:"",filterIncludeNegate:!1}});for(let[t,r]of[["filterComment","comment"],["filterFix","fix"],["filterFlagged","flag"]]){let n=i[t];n&&e.push({key:`annotation:${r}`,label:"Annotation",value:`${n==="with"?"With":"Without"} ${r}`,clear:{[t]:""}})}return!l.currentWorkspace&&i.filterDuplicates&&e.push({key:"duplicates",label:"Duplicates",value:i.filterDuplicates==="with"?"Only rows linked to other reports":"Exclude rows linked to other reports",clear:{filterDuplicates:""}}),i.filterCrossContext&&e.push({key:"cross-context",label:"Context",value:i.filterCrossContext==="with"?"Only rows across multiple repos or packages":"Exclude rows across multiple repos or packages",clear:{filterCrossContext:""}}),i.filterAppStacked&&e.push({key:"app-stacked",label:"App stack",value:i.filterAppStacked==="with"?"Only rows with multiple App findings":"Exclude rows with multiple App findings",clear:{filterAppStacked:""}}),i.filterSecurity&&e.push({key:"security",label:"Security",value:i.filterSecurity==="with"?"Only security-related rows":"Exclude security-related rows",clear:{filterSecurity:""}}),e}function Bn(){return Vt().filter(i=>Bi(i).commonTriage===l.shownTriage)}function Nn(){return l.shownTriage?ea[l.shownTriage]??l.shownTriage:null}function tr(i,e=Nl()){let t=Bn(),r=t.length;qt(e);let n;try{n=Oi(t).length}finally{Ht()}return{included:n,total:r,excluded:r-n,fields:e,filters:On(e),bucketLabel:Nn(),focusedOnly:i==="print"&&l.viewMode==="focus"}}var iu=`dialog{max-width:515px;width:min(94vw,515px)}.ecd-count{margin:0;font-size:1.02rem;color:var(--text);& strong{color:var(--accent);font-weight:700}}.ecd-excluded{margin:.25rem 0 0;color:var(--muted);font-size:.82rem}.ecd-filters{margin:.9rem 0 0;display:grid;grid-template-columns:auto minmax(0,1fr);gap:.3rem .7rem;font-size:.82rem}.ecd-filters dt{color:var(--muted);font-weight:600;white-space:nowrap}.ecd-filters dd{display:flex;align-items:baseline;gap:.5rem;color:var(--text);overflow-wrap:anywhere}.ecd-filter-value{min-width:0}.ecd-filter-drop{margin-left:auto;flex:none;padding:0 .2rem;border:0;border-radius:var(--ui-radius, 4px);background:none;color:var(--muted);font:inherit;font-size:1rem;line-height:1;&:hover{color:var(--critical, #f87171)}&:focus-visible{outline:2px solid var(--accent);outline-offset:1px}}.ecd-filters-label{margin:.9rem 0 0;font-size:.76rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}.ecd-filters-label+.ecd-filters{margin-top:.35rem}.ecd-samples{display:flex;align-items:flex-start;gap:.5rem;margin-top:1rem;font-size:.82rem;color:var(--text)}.ecd-samples input{margin-top:.15rem;accent-color:var(--accent)}.ecd-samples-hint{display:block;margin-top:.2rem;color:var(--muted);font-size:.76rem}
25
+ `;var Qh=[{id:"download",label:"Markdown",icon:eu},{id:"print",label:"Print",icon:tu}],zn=class extends q{static styles=[...q.styles,M(iu),M(Nd)];static properties={mode:{type:String},included:{type:Number},excluded:{type:Number},total:{type:Number},filters:{attribute:!1},fields:{attribute:!1},bucketLabel:{type:String},focusedOnly:{type:Boolean},oneSamplePerGroup:{type:Boolean}};constructor(){super(),this.mode="download",this.included=0,this.excluded=0,this.total=0,this.filters=[],this.fields=null,this._relaxed=!1,this.bucketLabel=null,this.focusedOnly=!1,this.oneSamplePerGroup=!1}get _focusedOnly(){return this.mode==="print"&&this.focusedOnly}_selectTab(e){this.mode!==e&&(this.mode=e)}focusInitial(){let e=this.included===0?'button[data-role="cancel"]':"button.primary";this.renderRoot.querySelector(e)?.focus()}_finish(e){this._settled||super._finish({confirmed:e==="confirm",view:e==="view",fields:this._relaxed?this.fields:null,mode:this.mode,oneSamplePerGroup:this.oneSamplePerGroup})}_onClose=()=>this._finish("cancel");_onCancel=()=>this._finish("cancel");_onView=()=>this._finish("view");_onConfirm=()=>this._finish("confirm");async _onDropFilter(e){let t=this.filters.findIndex(o=>o.key===e);if(t===-1)return;let r=tr(this.mode,{...this.fields,...this.filters[t].clear});this._relaxed=!0,this.fields=r.fields,this.filters=r.filters,this.included=r.included,this.excluded=r.excluded,this.total=r.total,await this.updateComplete;let n=[...this.renderRoot.querySelectorAll("button[data-drop]")];(n[Math.min(t,n.length-1)]??this.renderRoot.querySelector("button.primary")??this.renderRoot.querySelector('button[data-role="cancel"]'))?.focus()}_countSection(){if(this.total===0)return a`<p class="ecd-count">No findings to ${this.mode==="print"?"print":"download"}.</p>`;if(this._focusedOnly&&this.included>0)return a`<p class="ecd-count">Only the <strong>focused</strong> finding will be printed.</p><p class="ecd-excluded">Focus mode prints just the finding you're viewing. Switch to the list or grouped view to print all ${this.included} matching ${this.included===1?"finding":"findings"}.</p>`;let t=this.excluded===0&&this.filters.length===0?a`All <strong>${this.included}</strong> ${this.included===1?"finding":"findings"} included.`:a`<strong>${this.included}</strong> of ${this.total} ${this.total===1?"finding":"findings"} included.`;return a`<p class="ecd-count">${t}</p>${this.excluded>0?a`<p class="ecd-excluded">${this.excluded} filtered out and ${this.mode==="print"?"won't be printed":"won't be downloaded"}.</p>`:m}`}_filtersSection(){return this.filters.length===0?a`<p class="ecd-filters-label">No filters active — the full ${this.bucketLabel?`${this.bucketLabel.toLowerCase()} `:""}set is included.</p>`:a`<p class="ecd-filters-label">Active filters</p><dl class="ecd-filters">${this.filters.map(e=>a`<dt>${e.label}</dt><dd><span class="ecd-filter-value">${e.value}</span> <button type="button" class="ecd-filter-drop" data-drop="${e.key}" aria-label="${`Drop the ${e.label.toLowerCase()} filter (${e.value}) from this export`}" @click="${()=>this._onDropFilter(e.key)}">×</button></dd>`)}</dl>`}render(){let e=this.mode==="print",t=this._focusedOnly?"You're in focus mode \u2014 printing outputs just the finding you're focused on.":e?"Prints only the findings matching your current filters \u2014 the same set shown on screen. Use the toolbar to change the selection first.":"Downloads a Markdown file of the findings matching your current filters \u2014 the same set shown on screen. Use the toolbar to change the selection first.";return a`<dialog @close="${this._onClose}"><header>${Pl({tabs:Qh,current:this.mode,prefix:"ecd",select:r=>this._selectTab(r)})}</header><div role="tabpanel" id="${`ecd-panel-${this.mode}`}" aria-labelledby="${`ecd-tab-${this.mode}`}"><p class="nwd-intro">${t}</p>${this._countSection()} ${this.bucketLabel?a`<p class="nwd-note">Scoped to the <strong>${this.bucketLabel}</strong> list — live findings are not included.</p>`:m} ${this._filtersSection()} <label class="ecd-samples"><input type="checkbox" .checked="${this.oneSamplePerGroup}" @change="${r=>{this.oneSamplePerGroup=r.target.checked}}"> <span>One sample per group<span class="ecd-samples-hint">Include only the currently selected sample from each group.</span></span></label></div><footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" data-role="cancel" @click="${this._onCancel}">Cancel</button> ${e?m:a`<button type="button" data-role="view" ?disabled="${this.included===0}" @click="${this._onView}">View</button>`} <button type="button" class="primary" ?disabled="${this.included===0}" @click="${this._onConfirm}">${e?"Print":"Download"}</button></footer></dialog>`}};customElements.define("export-confirm-dialog",zn);function ru(i="download"){let e=tr(i),t=i==="print"?e.focusedOnly:tr("print").focusedOnly;return new Promise(r=>{let n=document.createElement("export-confirm-dialog");Object.assign(n,{mode:i,included:e.included,excluded:e.excluded,total:e.total,filters:e.filters,fields:e.fields,bucketLabel:e.bucketLabel,focusedOnly:t});let s=o=>{n.remove(),r(o)};n.addEventListener("resolve",o=>s({confirmed:!!o.detail?.confirmed,view:!!o.detail?.view,fields:o.detail?.fields??null,mode:o.detail?.mode??i,oneSamplePerGroup:!!o.detail?.oneSamplePerGroup})),n.addEventListener("modal-conflict",()=>s({confirmed:!1,view:!1,fields:null,mode:i})),document.body.append(n)})}var Zh=160,em=320,tm=/^ {0,3}#{1,6}(?: |$)/u,im=/^ {0,3}(?:=+|-+) *$/u,ir=/^\|?[^|\n]+(?:\|[^|\n]+)+\|?$/u,nu=/^\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?$/u;function su(i,e=i.join(`
26
+ `),{target:t=Zh,max:r=em}={}){let n=i.length;if(n===0)return[];let s=Qo(e),o=0,c=0,u=()=>{for(;o<s.length&&s[o][1]<=c-1;)o++;return o<s.length&&c-1>=s[o][0]},d=g=>i[g].trim()==="",p=g=>ir.test(i[g]),h=g=>!u()&&!(nu.test(i[g])&&p(g-1))&&!(im.test(i[g])&&!d(g-1)),f=g=>d(g-1)||tm.test(i[g]),b=[],v=0;for(let g=1;g<n;g++){c+=i[g-1].length+1;let y=g-v;y<t||!h(g)||(y>=r||f(g))&&(b.push([v,g]),v=g)}return b.push([v,n]),b}function ou(i,e){if(e<2||!ir.test(i[e])||!ir.test(i[e-1]))return null;let t=e-1;for(;t>0&&ir.test(i[t-1]);)t--;for(let r=t+1;r<e;r++)if(nu.test(i[r]))return[r-1,r+1];return null}function au(i){return i.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")}var lu=`dialog{max-width:none;max-height:none;width:calc(100vw - 4rem);height:calc(100vh - 4rem);margin:2rem auto;position:relative;padding:12px}dialog[open]{display:flex;flex-direction:column}dialog::backdrop{backdrop-filter:none}header{display:flex;align-items:center;gap:.45rem;margin-bottom:.6rem;padding-right:3rem;user-select:none}header h3{margin:0}.evd-close{position:absolute;top:6px;right:6px;z-index:1;width:22px;height:22px;display:grid;place-items:center;background:transparent;border:0;border-radius:var(--ui-radius, 4px);color:var(--muted);font:500 16px/1 ui-monospace,monospace;cursor:default;&:hover{color:var(--accent);background:var(--surface-active)}&:focus-visible{outline:2px solid var(--accent);outline-offset:1px}}.evd-code{flex:1 1 auto;min-height:0;margin:0;overflow:auto;border:1px solid var(--border);border-radius:var(--ui-radius, 6px);background:var(--bg, var(--surface));color:var(--text);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.78rem;line-height:1.55;scrollbar-width:thin;scrollbar-color:var(--border) transparent;&::-webkit-scrollbar{width:6px;height:6px}&::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}}.evd-lines{--evd-gutter: calc(var(--evd-lineno-width, 3ch) + 1.4rem);padding:.5rem 0;background-image:linear-gradient(to right,rgb(from var(--text) r g b / .03) 0 calc(var(--evd-gutter) - 1px),var(--border) calc(var(--evd-gutter) - 1px) var(--evd-gutter),transparent var(--evd-gutter))}.evd-chunk{display:grid;grid-template-columns:var(--evd-gutter) minmax(0,1fr);align-items:start;content-visibility:auto;contain-intrinsic-size:auto calc(var(--evd-chunk-lines, 1) * 1.55em)}.evd-chunk.evd-pending{display:block;padding:0 .75rem 0 calc(var(--evd-gutter) + .6rem);white-space:pre-wrap;overflow-wrap:anywhere}.evd-lineno{padding:0 .55rem 0 .4rem;color:var(--muted);text-align:right;font-variant-numeric:tabular-nums;user-select:none}.evd-line{padding:0 .75rem 0 .6rem;font:inherit;background:none;white-space:pre-wrap;overflow-wrap:anywhere}.evd-meta{color:var(--muted);font-size:.74rem;font-variant-numeric:tabular-nums}.evd-copy{margin-left:auto;flex-shrink:0;height:1.75rem;padding:0 .55rem;gap:.35rem;display:inline-flex;align-items:center;background:transparent;color:var(--muted);border:1px solid var(--border);border-radius:var(--ui-radius, 3px);font:inherit;font-size:.72rem;font-weight:500;letter-spacing:.02em;cursor:default;&:hover{color:var(--accent);background:var(--surface-active)}&:focus-visible{outline:2px solid var(--accent);outline-offset:1px}&.evd-done{color:var(--green, #4ade80);background:color-mix(in srgb,var(--green, #4ade80) 14%,transparent)}&.evd-failed{color:var(--critical, #f87171);background:color-mix(in srgb,var(--critical, #f87171) 14%,transparent)}}
27
+ `;var nm=a`<svg viewBox="0 0 16 16" width="12" height="12" 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 sm(i,e,t,r=null){let n="";for(let s=e;s<t;s++){let o=r===null?au(i[s]):r[s-e];n+=`<span class="evd-lineno" aria-hidden="true">${s+1}</span><code class="evd-line">${o}
28
+ </code>`}return n}var qn=class extends q{static styles=[...q.styles,M(kt),M(lu)];static properties={markdown:{attribute:!1},_copied:{state:!0}};_lines=[];_kb="0.0";_chunks=[];_copiedTimer=null;constructor(){super(),this.markdown="",this._copied=""}focusInitial(){this.renderRoot.querySelector('button[data-role="cancel"]')?.focus()}willUpdate(e){if(!e.has("markdown"))return;let t=this.markdown.split(`
29
+ `),r=t.length>1&&t.at(-1)===""?t.length-1:t.length;this._lines=t.slice(0,r),this._kb=(new TextEncoder().encode(this.markdown).length/1024).toFixed(1),this._chunks=su(this._lines,this.markdown).map(([n,s])=>({start:n,end:s,asked:!1}))}render(){let e=this._lines.length,t=this._copied==="done"?"Copied":this._copied==="failed"?"Copy failed":"Copy",r=this._copied==="failed"?"Select the text and copy it by hand":m;return a`<dialog @close="${this._onClose}"><button type="button" class="evd-close" data-role="cancel" aria-label="Close" @click="${this._onClose}">×</button><header><h3>Report markdown</h3><span class="evd-meta">· ${e} ${e===1?"line":"lines"} · ${this._kb} KB</span> <button type="button" class="evd-copy ${this._copied==="done"?"evd-done":this._copied==="failed"?"evd-failed":""}" data-role="copy" data-tooltip="${r}" @click="${this._onCopy}">${nm}${t}</button></header><div class="evd-code" tabindex="0"><div class="evd-lines" style="--evd-lineno-width: ${String(e).length}ch">${this._chunks.map((n,s)=>a`<div class="evd-chunk evd-pending" data-chunk="${s}" style="--evd-chunk-lines: ${n.end-n.start}"></div>`)}</div></div></dialog>`}updated(){if(this.isConnected)for(let e of this.renderRoot.querySelectorAll(".evd-chunk:not([data-watched])")){e.dataset.watched="";let t=Number(e.dataset.chunk),r=this._chunks[t];e.textContent=`${this._lines.slice(r.start,r.end).join(`
30
+ `)}
31
+ `,xt(e,n=>{n&&(Le(e),this._paint(e,t))})}}disconnectedCallback(){for(let e of this.renderRoot.querySelectorAll(".evd-chunk[data-watched]"))Le(e);clearTimeout(this._copiedTimer),super.disconnectedCallback()}_onCopy=async()=>{let e="done";try{await navigator.clipboard.writeText(this.markdown)}catch{e="failed"}this.isConnected&&(this._copied=e,clearTimeout(this._copiedTimer),this._copiedTimer=setTimeout(()=>{this._copied="",this._copiedTimer=null},1500))};async _paint(e,t){let r=this._chunks[t];if(!r||r.asked)return;r.asked=!0;let n=ou(this._lines,r.start),s=[...n?this._lines.slice(n[0],n[1]):[],...this._lines.slice(r.start,r.end)].join(`
32
+ `),o=await yt(s,"markdown");if(!this.isConnected)return;let c=o===null?null:Ni(o).slice(n?n[1]-n[0]:0);e.innerHTML=sm(this._lines,r.start,r.end,c?.length===r.end-r.start?c:null),e.classList.remove("evd-pending")}};customElements.define("export-view-dialog",qn);function cu(i){return new Promise(e=>{let t=document.createElement("export-view-dialog");t.markdown=i;let r=()=>{t.remove(),e()};t.addEventListener("resolve",r),t.addEventListener("modal-conflict",r),document.body.append(t)})}var du=`dialog{max-width:560px;width:min(94vw,560px)}header h3{margin:0 0 .4rem}.finding{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;margin-bottom:.35rem}.loc{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.76rem;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}.desc{font-size:.78rem;color:var(--muted);margin:0 0 .7rem;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.input-row{display:flex;align-items:stretch;gap:.4rem}input{flex:1;min-width:0;padding:.5rem .65rem;border:1px solid var(--border);border-radius:var(--ui-radius, 6px);background:var(--bg, var(--surface));color:var(--text);font:inherit;font-size:.88rem;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;&:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgb(from var(--accent) r g b / .18)}&::placeholder{color:var(--muted);font-family:inherit}}.open{display:inline-flex;align-items:center;padding:0 .7rem;border:1px solid var(--accent);border-radius:var(--ui-radius, 6px);color:var(--accent);text-decoration:none;font-size:.8rem;font-weight:600;white-space:nowrap;&:hover{background:rgb(from var(--accent) r g b / .1)}}.hint{margin:.45rem 0 0;color:var(--muted);font-size:.74rem}
33
+ `;var Hn=class extends q{static styles=[...q.styles,M(bt),M(du)];static properties={initial:{attribute:!1},finding:{attribute:!1},canApplyToGroup:{attribute:!1},_value:{state:!0}};constructor(){super(),this.initial="",this.finding=null,this.canApplyToGroup=!1,this._value=""}beforeOpen(){this._value=this.initial??""}focusInitial(){let e=this.renderRoot.querySelector('input[type="url"]');if(e){e.focus();try{e.select()}catch{}}}_onInput=e=>{this._value=e.target.value};get _trimmed(){return(this._value??"").trim()}_onSave=()=>{let e=(this.initial??"").trim();if(this._trimmed===e){this._finish(null);return}this._finish({value:this._trimmed,scope:"finding"})};_onApplyToGroup=()=>{this._trimmed&&this._finish({value:this._trimmed,scope:"group"})};_onClear=()=>this._finish({value:"",scope:"finding"});_onCancel=()=>this._finish(null);_onKeydown=e=>{e.key==="Enter"&&(e.preventDefault(),this._onSave())};render(){let e=this.finding??{},t=e.file?e.line?`${e.file}:${e.line}`:e.file:"",r=(this.initial??"").length>0,n=this._trimmed,s=wi(n);return a`<dialog @close="${this._onClose}"><header><h3>${r?"Edit fix link":"Add fix link"}</h3><div class="finding">${vt(_i(e,l.severityMode))} ${t?a`<span class="loc" data-tooltip-truncated data-tooltip="${t}">${t}</span>`:m}</div>${e.description?a`<div class="desc" data-tooltip-truncated data-tooltip="${e.description}">${e.description}</div>`:m}</header><div class="input-row"><input type="url" inputmode="url" autocomplete="off" spellcheck="false" placeholder="https://github.com/owner/repo/pull/123" .value="${this._value}" @input="${this._onInput}" @keydown="${this._onKeydown}"> ${s?a`<a class="open" href="${n}" target="_blank" rel="noopener noreferrer">Open ↗</a>`:m}</div><p class="hint">PR URL, issue link, commit, or any free-form reference. Enter to save, Esc to cancel.</p><footer class="nwd-actions">${r?a`<button type="button" class="danger" @click="${this._onClear}">Clear</button>`:m} <span class="nwd-spacer"></span> ${this.canApplyToGroup?a`<button type="button" class="quiet" ?disabled="${!n}" @click="${this._onApplyToGroup}">Apply to whole group</button> <span class="nwd-spacer"></span>`:m} <button type="button" @click="${this._onCancel}">Cancel</button> <button type="button" class="primary" @click="${this._onSave}">Save</button></footer></dialog>`}};customElements.define("fix-link-dialog",Hn);function uu({initial:i="",finding:e=null,canApplyToGroup:t=!1}={}){return Y("fix-link-dialog",{initial:i,finding:e,canApplyToGroup:t})}var pu=`dialog{width:min(94vw,880px);max-width:880px}.conflicts-list{list-style:none;display:flex;flex-direction:column;gap:.6rem;max-height:65vh;overflow-y:auto;overscroll-behavior:contain}.conflict-card{padding:.6rem .7rem;border:1px solid var(--border);border-radius:var(--ui-radius, 6px)}.finding-meta{display:flex;flex-wrap:wrap;align-items:center;gap:.4rem;color:var(--muted);font-size:.72rem}.location,code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;overflow-wrap:anywhere}.location{flex:1}h4{margin:.4rem 0 .55rem;font-size:.88rem;font-weight:600;overflow-wrap:anywhere}dt{margin-top:.5rem;color:var(--muted);font-size:.72rem}.variant{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,15rem);gap:.65rem;padding:.4rem 0;font-size:.8rem;+&{border-top:1px solid var(--border)}}.value{white-space:pre-wrap;overflow-wrap:anywhere}.reports{display:flex;flex-wrap:wrap;place-content:start flex-end;gap:.3rem}.report-button{display:inline-flex;align-items:center;gap:.4rem;max-width:100%;min-height:22px;padding:0 .4rem 0 0;border:1px solid var(--border);border-radius:var(--ui-radius, 4px);overflow:hidden;background:var(--bg);color:var(--text);font:inherit;font-size:.72rem;cursor:default;text-align:left;>span:last-child{min-width:0;overflow-wrap:anywhere}&:hover{border-color:var(--accent)}}
34
+ `;var lm={revalidate:"Outcome",revalidateVerdict:"Explanation",revalidateRecommendation:"Recommendation"},Un=class extends q{static styles=[...q.styles,M(bt),M($t),M(pu)];static properties={conflicts:{attribute:!1}};constructor(){super(),this.conflicts=[]}render(){return a`<dialog aria-labelledby="revalidation-conflicts-title" @close="${this._onClose}"><header><h3 id="revalidation-conflicts-title">Revalidation conflicts</h3><p class="nwd-intro">Reports disagree about ${this.conflicts.length} finding${this.conflicts.length===1?"":"s"}. App view is unavailable until the conflicting reports are separated or updated.</p></header><ul class="conflicts-list">${this.conflicts.map(({finding:e,copies:t})=>a`<li class="conflict-card"><div class="finding-meta">${vt(e.severity)} ${e.file?a`<span class="location">${e.file}${Fe(e.line)?`:${Aa(Fe(e.line))}`:""}</span>`:m} <code>${Ba(e.id)??e.id}</code></div><h4>${Bt(e)}</h4><dl>${Vl(t).map(({field:r,variants:n})=>a`<dt>${lm[r]??r}</dt>${n.map(({value:s,reports:o})=>a`<dd class="variant"><div class="value">${s||a`<em>Empty</em>`}</div><div class="reports">${o.map(c=>c?a`<button type="button" class="report-button" aria-label="${`Open ${Qr(c)} at this finding`}" @click="${()=>this._finish({id:e.id,reportName:c})}">${J(Xr[Ll(c)]??Xr.default)}<span>${Qr(c)}</span></button>`:a`<span>Loaded report</span>`)}</div></dd>`)}`)}</dl></li>`)}</ul><footer class="nwd-actions"><span class="nwd-spacer"></span><button type="button" @click="${this._onClose}">Close</button></footer></dialog>`}};customElements.define("revalidation-conflicts-dialog",Un);function hu(i){return Y("revalidation-conflicts-dialog",{conflicts:[...i.values()]})}var mu=2;function fu(i,e){l.focusSplit=e,i.closest(".focus-main")?.style.setProperty("--focus-split",String(e)),i.setAttribute("aria-valuenow",String(Math.round(e)))}function gu(){try{localStorage.setItem(Xa,String(l.focusSplit))}catch{}}function bu(i,e){fu(i,on(e)),gu()}function vu(i,e){bu(i,l.focusSplit+e)}function yu(i){bu(i,el)}function _u(i,e){let t=i.closest(".focus-main");if(!t)return;e.preventDefault(),i.classList.add("dragging");try{i.setPointerCapture(e.pointerId)}catch{}let r=s=>{let o=t.getBoundingClientRect();o.width!==0&&fu(i,on((s.clientX-o.left)/o.width*100))},n=()=>{i.removeEventListener("pointermove",r),i.removeEventListener("pointerup",n),i.removeEventListener("pointercancel",n),i.classList.remove("dragging"),gu()};i.addEventListener("pointermove",r),i.addEventListener("pointerup",n),i.addEventListener("pointercancel",n)}function cm(i,e){return jl(Oi(i)).map(t=>e?[$e(t)]:Xl(t))}var dm={annotation(i){let e=Ze(i),t=Jl(i);return!e&&!t?null:{triage:e?.triage,color:e?.color,comment:e?.comment,fix:e?.fix,flagged:e?.flagged===!0,ignored:t}},location:i=>Li(i,jt(i)),evidence:(i,e,t)=>Ia(i,e,jt(e),t),commit:i=>Da(i.repo?.github,i.commitHash),report:i=>i._reportName??null};function um(i,e){let t=new Set(i.map(s=>s.repo??null)),r=t.size===1?[...t][0]:null;if(r)return r;let n=new Set;for(let s of e)for(let o of s)o.repo?.github&&!Ri(o.file)&&n.add(o.repo.github);return n.size===1?[...n][0]:n.size===0&&!l.currentWorkspace&&l.repoUrl?l.repoUrl:null}function jn(i){return i.replace(/\.(?:json|md|codex)$/iu,"")}function wu(){return l.currentWorkspace?he().find(i=>i.id===l.currentWorkspace)??null:null}function pm(i,e){if(e)return e.name;let t=i.map(n=>n.fileName);return t.length===1?jn(t[0]):zt(t).replace(/[-_. ]+$/u,"")||`${t.length} reports`}function Vn({oneSamplePerGroup:i=!1}={}){let e=l.reports,t=zl(),r=Bn(),n=cm(r,i),s=wu(),o=e.flatMap(d=>d.groups??[]),c=o.some(d=>d.some(na)),u=o.some(d=>d.some(Ma));return oa({title:pm(e,s),workspace:s?.name??null,reports:e.map(d=>({name:d.fileName,source:d.source})),repo:um(e,n),generatedAt:new Date,view:{bucket:Nn(),severityMode:c?l.severityMode:null,revalidation:u?l.showRevalidation:null,revalidationDetail:u&&l.showRevalidation!==!1?Wl():null},filters:On(t),counts:{included:n.length,total:r.length},groups:n},dm)}function hm(){let i=wu(),e=l.reports.map(r=>r.fileName),t="";return i?t=i.name:e.length===1?t=jn(e[0]):e.length>1&&(t=jn(zt(e))),t=t.replaceAll(/[\\/:*?"<>|\p{Cc}]/gu,"-").trim(),`${t||"deepview-report"}.md`}function ku(i){if(l.reports.length===0)return;let e=new Blob([Vn(i)],{type:"text/markdown;charset=utf-8"});Ge(e,hm())}function rr(i){return!H()||!me.active||!l.currentManagedTeam?null:me.navigate(Jr({view:i,teamId:l.currentManagedTeam,reportId:l.currentManagedReport},l.managedTeams))}var Xn=!1;nl(()=>{if(Xn)return;Xn=!0;let i=2;function e(){--i===0&&mm()}requestAnimationFrame(e),setTimeout(e,350)});function mm(){Xn=!1,l.findingIndexTick++,l.currentView==="bundles"&&l.selectedBundle?$():l.currentView==="packages"?$():l.currentView==="repositories"?$():l.currentView==="links"?$():(l.currentView==="findings"||l.currentView==="files")&&(fe().catch(()=>{}),$())}var Kn=!1;sl(()=>{l.currentView!=="findings"&&l.currentView!=="files"&&!Xe()||Kn||(Kn=!0,queueMicrotask(()=>{Kn=!1,!(l.currentView!=="findings"&&l.currentView!=="files"&&!Xe())&&(l.bundleHashTick++,$())}))});dl(()=>{l.linksTick++,$()});function $u(){l.currentView==="bundles"&&l.bundleDetailsTab==="graph"?$d():Sd()}function lr(){l.currentView==="bundles"&&l.bundleDetailsTab==="graph"?xd():Cd()}function ti(){let i=document.querySelector(".bundle-source-code-wrap"),e=i?.scrollTop??0,t=i?.scrollLeft??0;$();let r=document.querySelector(".bundle-source-code-wrap");r&&(r.scrollTop=e,r.scrollLeft=t)}function rt(i){let t=document.querySelector(i)?.scrollTop??0;$();let r=document.querySelector(i);r&&(r.scrollTop=t)}function Me(){l.viewMode==="table"?rt(".findings-table-list"):$()}var Gn=0;function xu(){Gn||(Gn=requestAnimationFrame(()=>{Gn=0,$()}))}function B(i,e){for(let t of i.composedPath())if(t?.matches?.(e))return t;return null}function or(i,e){queueMicrotask(()=>{let t=document.querySelector(`.bundle-source-lineno-row[data-line="${i}"]`);t&&t.scrollIntoView(e)})}function Ru(i){i.classList.add("copied"),setTimeout(()=>i.classList.remove("copied"),1e3)}function nr(i,e){try{navigator.clipboard.writeText(e).then(()=>(Ru(i),null)).catch(()=>{})}catch{}}function Lu(i){let e=gn(l.bundleCodeHistory,l.bundleDetails?.integrity??null,l.bundleSourceFile);l.bundleCodeHistory=Hc(e,i),l.bundleSourceFile=i}function Wn(i=!1){queueMicrotask(()=>{let e=document.querySelector(".bundle-source-code-wrap");e&&(e.scrollTop=0,e.scrollLeft=0),i&&e?.querySelector(".bundle-source-code")?.focus({preventScroll:!0})})}window.addEventListener("hashchange",()=>{if(!H()||ga()||l.currentView!=="bundles"||l.bundleDetailsTab!=="code")return;let i=pa(new URL(location.href));if(i?.bundleTab!=="code"||i.file==null||i.file!==xc(l)?.file)return;let e=l.bundleSourceFile,t=i.endLine??i.line;l.bundleSourceTargetLine=i.line&&t<=ya(Si(l.bundleDetails).get(e)??"")?{bundle:l.bundleDetails?.integrity??null,path:e,line:i.line,...i.endLine?{end:i.endLine}:{}}:null,$(),l.bundleSourceTargetLine&&or(i.line,{block:"center"})});function Mu(i){let e=i.target.closest("[data-bundle-source-line]");if(e){let o=Number(e.dataset.bundleSourceLine),c=l.bundleDetails?.integrity??null,u=l.bundleSourceFile,d=l.bundleSourceTargetLine,p=d?.bundle===c&&d.path===u?d:null;if(i.shiftKey&&p){let h=p.anchor??p.line;l.bundleSourceTargetLine={bundle:c,path:u,line:Math.min(h,o),end:Math.max(h,o),anchor:h}}else p?.line===o&&!(p.end>o)?l.bundleSourceTargetLine=null:l.bundleSourceTargetLine={bundle:c,path:u,line:o};return ti(),!0}let t=i.target.closest("[data-bundle-source-wrap]");if(t){let o=Ac(t);l.bundleSourceWrap=!l.bundleSourceWrap;try{localStorage.setItem(Za,String(l.bundleSourceWrap))}catch{}return $(),queueMicrotask(o),!0}if(i.target.closest("[data-bundle-source-pretty]"))return Yt(),$(),Wn(),!0;let r=i.target.closest("[data-bundle-code-history]");if(r){let o=gn(l.bundleCodeHistory,l.bundleDetails?.integrity??null,l.bundleSourceFile),c=Uc(o,r.dataset.bundleCodeHistory==="back"?-1:1),u=c.files[c.at];return c.at===o.at||!Si(l.bundleDetails).has(u)||(l.bundleCodeHistory=c,l.bundleSourceFile=u,l.bundleSourceFindingIdx=null,l.bundleCodeSearchMode="files",l.bundleCodeSearchQuery="",rt(".bundle-code-rail-body"),Qt(),Wn()),!0}let n=i.target.closest("[data-bundle-source-link]");if(n){let o=n.dataset.bundleSourceLink,c=n.closest(".focus-pane-code");if(c){let u=ii(i),d=pc(u,c.dataset.focusCodeIntegrity,c.dataset.focusCodeFile,o);return d&&(ts(u,d),queueMicrotask(()=>c.querySelector(".focus-code-source")?.focus({preventScroll:!0}))),!0}return Si(l.bundleDetails).has(o)&&(l.currentView==="bundles"&&l.bundleDetailsTab==="search"&&(_t("code",{preserveSource:!0}),l.selectedBundle&&Be(l.selectedBundle,"code",{push:!0})),Lu(o),l.bundleSourceFindingIdx=null,l.bundleDetailsTab==="code"&&(l.bundleCodeSearchMode="files",l.bundleCodeSearchQuery=""),rt(".bundle-code-rail-body"),Qt(),Wn(!0)),!0}if(i.target.classList?.contains("bundle-source-overlay")||i.target.closest('[data-action="bundle-source-close"]'))return l.bundleSourceFile&&(_t(l.bundleDetailsTab),$()),!0;if(i.target.closest('[data-action="bundle-source-panel-close"]'))return l.bundleSourceFindingIdx!=null&&(l.bundleSourceFindingIdx=null,ti()),!0;let s=i.target.closest("[data-bundle-source-finding]");if(s){let o=parseInt(s.dataset.bundleSourceFinding,10);return Number.isFinite(o)&&(l.bundleSourceFindingIdx=l.bundleSourceFindingIdx===o?null:o,ti()),!0}return!1}function Su(i){let e=ii(i);if(!e)return null;let t=$e(e);return Oa(t,Ql(t))}R.addEventListener("click",i=>{if(B(i,"[data-finding-history]")){let w=ii(i),C=w&&$e(w);Sl(C)&&Dd(C);return}let e=B(i,"[data-code-nav-file]");if(e){ts(ii(i),{integrity:e.dataset.codeNavIntegrity,file:e.dataset.codeNavFile,range:Fe(e.dataset.codeNavLine)});return}let t=B(i,"[data-code-history]");if(t){gm(t.dataset.codeHistory==="forward"?1:-1);return}let r=B(i,"[data-code-preview]");if(r){let w=r.dataset.codePreview,C=new Set(l.codePreviews);C.delete(w)||C.add(w),l.codePreviews=C,$();return}let n=B(i,"[data-finding-code-report]");if(n&&H()){Xd({reportId:n.dataset.findingCodeReport,file:n.dataset.findingCodeFile,line:n.dataset.findingCodeLine});return}let s=B(i,"[data-finding-code-bundle]");if(s){let w=s.dataset.findingCodeBundle,C=s.dataset.findingCodeFile,P=s.dataset.findingCodeLine,L=P?parseInt(P,10):null;l.bundleSourceFile=C||null,l.bundleCodeHistory=null,l.bundleSourceFindingIdx=null,(l.bundleDetailsTab==="code"||l.bundleDetailsTab==="search")&&(l.bundleDetailsTab="overview");let V=()=>{Number.isFinite(L)&&or(L,{block:"start",behavior:"instant"})};if(l.selectedBundle===w&&l.bundleDetails?.integrity===w){$(),zi().then(()=>(l.selectedBundle===w&&l.bundleSourceFile===C&&V(),null));return}l.selectedBundle=w,l.selectedBundleWorkspace=null,l.bundleDetails=null,$(),(async()=>(await wt(w),V()))();return}let o=i.target.closest("[data-package-expand]");if(o){let w=o.dataset.packageExpand;l.expandedPackages.has(w)?l.expandedPackages.delete(w):l.expandedPackages.add(w),$();return}let c=i.target.closest("[data-package-row-issues]");if(c){let w=c.dataset.packageRowIssues,C=c.dataset.packageRowIssuesVersion;l.selectedPackage=w,l.selectedPackageVersion=C||null,l.packageDetailsTab="issues",l.packageSlideTriage=null,l.packageSlideTransient=!0,$();return}let u=i.target.closest("[data-repository-row-issues]");if(u){let w=u.dataset.repositoryRowIssues;l.selectedRepository=w,l.repositoryDetailsTab="issues",l.repositorySlideTriage=null,l.repositorySlideTransient=!0,$();return}let d=i.target.closest("[data-select-package]");if(d){let w=d.dataset.selectPackage,C=d.dataset.selectPackageVersion??"",P=C===""?null:C;if(l.selectedPackage===w&&l.selectedPackageVersion===P)return;l.selectedPackage=w,l.selectedPackageVersion=P,l.packageDetailsTab="overview",l.packageSlideTriage=null,l.packageSlideTransient=!1,$();return}if(i.target.closest("[data-deselect-package]")){l.selectedPackage=null,l.selectedPackageVersion=null,$();return}let p=i.target.closest("[data-package-tab]");if(p){let w=p.dataset.packageTab;(w==="overview"||w==="issues")&&l.packageDetailsTab!==w&&(l.packageDetailsTab=w,$());return}if(i.target.closest('[data-action="package-slide-back"]')){l.packageDetailsTab="overview",l.packageSlideTriage=null,l.packageSlideTransient&&(l.selectedPackage=null,l.selectedPackageVersion=null,l.packageSlideTransient=!1),$();return}let h=B(i,"[data-links-report][data-links-finding]");if(h){i.preventDefault();let{linksReport:w,linksFinding:C,managedReport:P}=h.dataset;w&&C&&(async()=>{let L=await Tn(C,w,P);L.ok||alert(L.reason)})().catch(L=>console.warn("links: reveal in report failed:",L));return}let f=i.target.closest("[data-package-report]");if(f){let w=f.dataset.packageReport;w&&tt(w);return}let b=i.target.closest("[data-select-repository]");if(b){let w=b.dataset.selectRepository;if(l.selectedRepository===w)return;l.selectedRepository=w,l.repositoryDetailsTab="overview",l.repositorySlideTriage=null,l.repositorySlideTransient=!1,$();return}if(i.target.closest("[data-deselect-repository]")){l.selectedRepository=null,$();return}let v=i.target.closest("[data-repository-tab]");if(v){let w=v.dataset.repositoryTab;(w==="overview"||w==="issues")&&l.repositoryDetailsTab!==w&&(l.repositoryDetailsTab=w,$());return}if(i.target.closest('[data-action="repository-slide-back"]')){l.repositoryDetailsTab="overview",l.repositorySlideTriage=null,l.repositorySlideTransient&&(l.selectedRepository=null,l.repositorySlideTransient=!1),$();return}let g=i.target.closest("[data-bundle-tab]");if(g){let w=g.dataset.bundleTab;if(ki.has(w)||w==="review"&&l.bundleDetails?.npm){if(w===l.bundleDetailsTab){l.selectedBundle&&Be(l.selectedBundle,w);return}l.bundleDetailsTab==="graph"&&w!=="graph"&&(oe(),document.body.classList.remove("report-fullscreen")),Sc(l,w,C=>Kc(C)?.oldVersion??null),_t(w),l.selectedBundle&&Be(l.selectedBundle,w,{push:!0}),$(),w==="code"&&zi().then(()=>(l.bundleDetailsTab==="code"&&Qt(),null))}return}if(i.target.closest("[data-bundle-retry-sources]")){l.bundleDetails&&delete l.bundleDetails.sourceError,$();return}let y=i.target.closest("[data-bundle-download]");if(y){let w=y.dataset.bundleDownload,C=(l.bundles??[]).find(P=>P.integrity===w);if(!C)return;(async()=>{let{confirmed:P}=await Qd({name:C.name,encrypted:we()});if(P)try{let L=await rl(w);Ge(new Blob([L],{type:"application/octet-stream"}),C.name)}catch(L){alert(`Failed to download bundle: ${L.message}`)}})();return}let k=i.target.closest("[data-bundle-export-sbom]");if(k){let w=k.dataset.bundleExportSbom,C=l.bundleDetails,P=(l.bundles??[]).find(L=>L.integrity===l.selectedBundle);if(!P||!C||C.integrity!==P.integrity)return;try{let L=w==="cyclonedx",V=L?bd(C,P):vd(C,P),ae=`${gd(P.name)}.${L?"cdx":"spdx"}.json`;Ge(new Blob([V],{type:"application/json"}),ae)}catch(L){alert(`Failed to export ${w==="cyclonedx"?"CycloneDX":"SPDX"}: ${L.message}`)}return}if(B(i,"[data-bundle-search-context]")){l.bundleSearchContext=!l.bundleSearchContext,rt(".bundle-search-results");return}if(i.target.closest("[data-advisories-consent]")){wd(),$();return}if(i.target.closest("[data-advisories-retry]")){kd(l.bundleDetails,$).catch(()=>{}),$();return}let x=i.target.closest("[data-bundle-issue-report]");if(x){let w=x.dataset.bundleIssueReport;w&&tt(w);return}if(Mu(i))return;let S=i.target.closest("[data-bundle-code-issue-step]");if(S){let w=S.closest("[data-bundle-code-issue-order]"),C=null;try{C=JSON.parse(w?.dataset.bundleCodeIssueOrder??"null")}catch{}if(Array.isArray(C)&&C.length>0){let P=S.dataset.bundleCodeIssueStep==="-1"?-1:1,L=C.findIndex(ae=>ae.idx===l.bundleSourceFindingIdx),V=L===-1?P>0?C[0]:C.at(-1):C[(L+P+C.length)%C.length];l.bundleSourceFindingIdx=V.idx,ti(),V.line>0&&or(V.line,{block:"center",behavior:"smooth"})}return}let T=B(i,"[data-bundle-view-source]");if(T){let w=T.dataset.bundleViewSource;if(!w)return;let C=T.dataset.bundleViewFindingIdx,P=C===void 0?null:parseInt(C,10),L=T.dataset.bundleViewLine,V=L?parseInt(L,10):null;Number.isFinite(V)&&(l.bundleSourcePretty=!1);let ae=l.bundleSourceFile!==w;if(Lu(w),Number.isFinite(P)?l.bundleSourceFindingIdx=P:ae&&(l.bundleSourceFindingIdx=null),l.bundleSourceTargetLine=Number.isFinite(V)?{bundle:l.bundleDetails?.integrity??null,path:w,line:V}:null,T.closest(".bundle-code-rail")?rt(".bundle-code-rail-body"):T.closest(".bundle-search-results")?rt(".bundle-search-results"):T.closest(".bundles-slide-body")?rt(".bundles-slide-body"):$(),Number.isFinite(V)){let ve=T.dataset.bundleViewScrollBlock||"center";zi().then(()=>(l.bundleSourceFile===w&&or(V,{block:ve,behavior:"smooth"}),null))}return}let F=i.target.closest('[data-action="workspace-reports"], [data-action="workspace-bundles"]');if(F){let w=F.dataset.action.slice(10);l.currentView!==`workspace-${w}`&&Xi(l.currentManagedTeam??l.currentWorkspace,w);return}if(i.target.closest('[data-action="workspace-findings"]')){if(l.currentView==="findings")return;if(l.currentView==="files"){if(rr("findings"))return;l.currentView="findings",l.filesSelectedFile=null,document.body.classList.remove("report-fullscreen"),$()}else H()?Cn(l.managedTeams.find(w=>w.id===l.currentManagedTeam)):it(l.currentWorkspace);return}let O=i.target.closest("[data-workspace-report]");if(O){H()?Cn(l.managedTeams.find(w=>w.id===l.currentManagedTeam),O.dataset.workspaceReport):tt(O.dataset.workspaceReport,void 0,{workspaceId:l.currentWorkspace});return}let A=i.target.closest("[data-workspace-bundle]");if(A){if(H())me.navigate(Jr({view:"bundles",teamId:l.currentManagedTeam,bundleId:A.dataset.workspaceBundle,bundleTab:"overview"},l.managedTeams));else{let w=A.dataset.workspaceBundle;Kt(w,"overview",{workspaceId:l.currentWorkspace}),Be(w,"overview"),$(),fe(),wt(w)}return}if(i.target.closest('[data-action="toggle-files"]')){if(rr(l.currentView==="files"?"findings":"files"))return;if(l.currentView==="workspace-reports"||l.currentView==="workspace-bundles"){l.currentView="files",it(l.currentWorkspace);return}l.currentView==="files"?l.currentView="findings":(l.viewMode==="graph"&&oe(),l.currentView="files"),document.body.classList.remove("report-fullscreen"),$();return}let Z=B(i,"[data-g2-pkg]");if(Z){let w=Z.dataset.g2Pkg;E.solo=E.solo===w?null:w,E.solo&&(E.selected=null),$u(),lr(),E.graphState?.requestDraw?.();return}let re=B(i,"[data-g2-select]");if(re){E.selected=re.dataset.g2Select,$u(),E.graphState?.requestDraw?.();return}let ne=B(i,"[data-g2-top-pkgs]");if(ne){E.topPkgsTab=ne.dataset.g2TopPkgs,lr();return}let jr=B(i,"[data-g2-jump-findings]");if(jr){if(l.currentView==="bundles"){l.bundleDetailsTab==="graph"&&oe(),_t("issues"),l.selectedBundle&&Be(l.selectedBundle,"issues",{push:!0}),$();return}if(Bl(),l.filterConfMin=0,l.filterInclude=jr.dataset.g2JumpFindings,l.currentView="findings",l.viewMode==="graph"&&(l.viewMode="table"),oe(),rr("findings"))return;$();return}let se=B(i,"[data-g2-jump-file]");if(se){let w=se.dataset.g2JumpFile;oe();let C=()=>requestAnimationFrame(()=>{let L=document.querySelector(`#${qa(w)}`);L&&L.scrollIntoView({behavior:"smooth",block:"start"})}),P=rr("files");if(P){P.then(L=>L?C():void 0);return}l.currentView="files",$(),C();return}if(B(i,"#g2-path-filter-clear")){E.pathFilter="";let w=document.querySelector("graph-layout")?.shadowRoot?.querySelector("#g2-path-filter");w&&(w.value=""),E.graphState?.requestDraw?.();return}if(B(i,"#g2-fullscreen")){document.body.classList.toggle("report-fullscreen");return}if(B(i,"[data-g2-show-all]")){E.showAll=!E.showAll,E.layoutCache=null,E.selected=null,oe(),$();return}if(B(i,"[data-g2-packages-view]")){E.bundleLayout==="flow"?E.flowPackagesView=!E.flowPackagesView:E.bundleLayout==="dependencies"?(E.dependencyPackagesView=!E.dependencyPackagesView,E.solo=null):E.packagesView=!E.packagesView,E.layoutCache=null,E.selected=null,E.focusedPkg=null,oe(),$();return}if(B(i,"[data-g2-bundle-issues]")){E.bundleIssues=!E.bundleIssues,oe({keepViewport:!0}),$();return}let Dt=B(i,"[data-g2-layout]");if(Dt){let w=Dt.dataset.g2Layout;if(!["graph","layers","matrix","dependencies","flow"].includes(w)||E.bundleLayout===w&&!E.focusedPkg)return;E.bundleLayout=w,w==="dependencies"&&(E.dependencyPackagesView=!1),E.layoutCache=null,E.selected=null,E.solo=null,E.focusedPkg=null,oe(),$();return}let hi=B(i,".graph2-triage-selector [data-triage-show]");if(hi){let w=hi.dataset.triageShow;l.shownTriage=l.shownTriage===w?null:w,E.layoutCache=null,E.selected=null,oe(),$();return}let mi=B(i,"[data-g2-focus-pkg]");if(mi){E.focusedPkg=mi.dataset.g2FocusPkg,E.layoutCache=null,oe(),$();return}if(B(i,"#g2-back-to-full")){E.focusedPkg=null,E.layoutCache=null,(E.packagesView||E.bundleLayout==="layers")&&(E.selected=null),oe(),$();return}let dt=B(i,".tab");if(dt&&B(i,".tabs")){let C=B(i,"[data-gid]").dataset.gid,P=dt.dataset.tid;l.activeTabByGroup.set(C,P),Me();return}let je=B(i,"[data-triage-action]");if(je){let w=je.closest(".triage-menu"),C=w?.dataset.gid;if(!C)return;let P=de(C);if(!P)return;let L=je.dataset.triageAction;if(!["inprogress","fixed","invalid","deleted","ignored","restore"].includes(L))return;let{targets:V,clearing:ae}=tc(P,L);if(V.length===0)return;Pu(V,ae?"untriaged":L);try{w.hidePopover()}catch{}ke(),Me();return}if(B(i,".mark-comment")){let C=B(i,"[data-gid]").dataset.gid,P=de(C);if(!P)return;let L=$e(P);if(!Yl(L))return;if(H()){import("./chunk-UZAZM2SX.js").then(({openManagedCommentsDialog:ve})=>ve(L,Me)).catch(()=>Oe("Could not open comments. Please retry."));return}let V=mt(L),ae=Ze(L)?.comment??"";Yd({initial:ae,finding:L}).then(ve=>(ve===null||!De(L)||(X(l.triage,V,{comment:ve||void 0}),ke(),Me()),null)).catch(()=>{});return}let fi=B(i,".mark-copy");if(fi){let w=Su(i);if(w===null)return;nr(fi,w);return}let zo=B(i,".mark-link");if(zo){let w=B(i,"[data-gid]"),C=w?de(w.dataset.gid):null;if(!C)return;let P=hc($e(C));if(!P)return;nr(zo,P);return}let Kr=B(i,"[data-copy-report]");if(Kr){nr(Kr,Kr.dataset.copyReport);return}let Gr=B(i,"[data-copy-path]");if(Gr){nr(Gr,Gr.dataset.copyPath);return}let qo=B(i,".mark-issue");if(qo&&H()&&l.managedSession&&!l.managedSession.publicShare&&l.currentManagedTeam){let w=B(i,"[data-gid]"),C=w?de(w.dataset.gid):null,P=C?$e(C):null;if(P?._managedReportId&&P.id){i.preventDefault();let L=new URL(qo.dataset.issueForm);Fd({teamId:l.currentManagedTeam,session:{...l.managedSession},context:{reportId:P._managedReportId,findingId:P.id,repository:L.pathname.split("/").slice(1,3).join("/")},formUrl:L.href,title:L.searchParams.get("title")??"",body:L.searchParams.get("body")??"",finding:P,draftOptions:{sourceUrl:Li(P,jt(P)),evidence:Fa(P),showRevalidation:La()},renderBody:vc}).catch(()=>Oe("Could not open issue creation. Please retry."));return}}let Ho=B(i,".mark-claude");if(Ho){let w=Su(i);if(w===null)return;let C=`claude://code/new?q=${encodeURIComponent(`Confirm and fix:
35
+
36
+ ${w}`)}`;try{window.location.href=C,Ru(Ho)}catch{}return}if(B(i,".mark-fix")){let C=B(i,"[data-gid]")?.dataset.gid,P=C?de(C):null;if(!P)return;let L=$e(P);if(!De(L))return;let V=rc(P),ae=Ze(L)?.fix??"";uu({initial:ae,finding:L,canApplyToGroup:Zl(V,ae)}).then(ve=>{if(ve===null||!De(L))return null;let Vo=ve.scope==="group"?V.filter(Ot=>De(Ot)&&(Ot===L||ec(Ot,ae))):[L],Ko=!1;for(let Ot of Vo)X(l.triage,mt(Ot),{fix:ve.value||void 0})&&(Ko=!0);return Ko&&(Vo.length>1&&l.activeTabByGroup.set(C,mt(L)),Me(),queueMicrotask(ke)),null}).catch(()=>{});return}let Uo=B(i,"[data-flag-toggle]");if(Uo){let w=Uo.dataset.flagToggle,C=B(i,"[data-gid]")?.dataset.gid,P=(C?de(C):null)?.find(V=>mt(V)===w);if(!P||!De(P))return;let L=Ze(P)?.flagged;X(l.triage,w,{flagged:L!==!0}),ke(),Me();return}let Wr=i.target.closest("[data-triage-show]");if(Wr&&!Wr.closest(".graph2-triage-selector")){let w=Wr.dataset.triageShow;l.shownTriage=l.shownTriage===w?null:w,$();return}if(i.target.closest("[data-table-deselect]")){l.tableSelectedGid=null,Me();return}let jo=i.target.closest("[data-tree-select]");if(jo){let w=jo.dataset.treeSelect;l.filesSelectedFile=l.filesSelectedFile===w?null:w,$();return}i.target.closest("[data-tree-deselect]")&&(l.filesSelectedFile=null,$())});var Cu=document.querySelector("#bundle-source-overlay-slot");Cu&&Cu.addEventListener("click",Mu);function cr(i){let e=i?de(i):null;e&&ic(e)&&queueMicrotask(ke)}R.addEventListener("row-select",i=>{let e=i.detail?.gid;if(!e)return;let t=l.tableSelectedGid!==e;l.tableSelectedGid=t?e:null,t&&cr(e),Me()});var dr="application/x-deepview-kanban-gid";function Pu(i,e){for(let t of i)De(t)&&ca(l.triage,t,e,Pa())}function Qn(){for(let i of R.querySelectorAll(".kanban-card.dragging"))i.classList.remove("dragging");for(let i of R.querySelectorAll(".kanban-column.drag-over"))i.classList.remove("drag-over")}R.addEventListener("dragstart",i=>{let e=i.target.closest?.(".kanban-card[data-kanban-source]");if(!e||!i.dataTransfer)return;let t=e.dataset.gid;if(!t)return;let r=de(t);if(!r||an(r).length===0){i.preventDefault();return}i.dataTransfer.setData(dr,t),i.dataTransfer.setData("text/plain",t),i.dataTransfer.effectAllowed="move",e.classList.add("dragging")});R.addEventListener("dragend",Qn);R.addEventListener("dragover",i=>{if(!i.dataTransfer?.types.includes(dr))return;let e=i.target.closest?.(".kanban-column[data-kanban-target]");if(e&&(i.preventDefault(),i.dataTransfer.dropEffect="move",!e.classList.contains("drag-over"))){for(let t of R.querySelectorAll(".kanban-column.drag-over"))t!==e&&t.classList.remove("drag-over");e.classList.add("drag-over")}});R.addEventListener("dragleave",i=>{let e=i.target.closest?.(".kanban-column[data-kanban-target]");e&&(e.contains(i.relatedTarget)||e.classList.remove("drag-over"))});R.addEventListener("drop",i=>{if(!i.dataTransfer?.types.includes(dr))return;let e=i.target.closest?.(".kanban-column[data-kanban-target]");if(!e){Qn();return}i.preventDefault();let t=i.dataTransfer.getData(dr),r=e.dataset.kanbanTarget;if(Qn(),!t||!r)return;let n=de(t);if(!n||(Bi(n).commonTriage??"untriaged")===r)return;let o=an(n);o.length!==0&&(Pu(o,r),$(),queueMicrotask(ke))});var Yn=!1;function nt(i){return i?R.querySelector(`.kanban-card[data-gid="${CSS.escape(i)}"]`):null}function sr(i){let e=i??R.querySelector(".kanban-card");if(!e)return;let t=e.getBoundingClientRect();t.width<=0||t.height<=0||(document.documentElement.style.setProperty("--kanban-clip-card-w",`${Math.floor(t.width)}px`),document.documentElement.style.setProperty("--kanban-clip-card-h",`${Math.floor(t.height)}px`),document.documentElement.style.setProperty("--kanban-return-card-bg",getComputedStyle(e).backgroundColor))}function fm(){let i=R.querySelector(".kanban-detail-side [data-kanban-select].active");i&&i.scrollIntoView({block:"nearest",behavior:"instant"})}function Jn(i){l.kanbanPopoverGid=i,l.focusCodeStack=[],l.focusCodeAt=0}function Eu(){fm(),et()}function st(i){let e=l.kanbanPopoverGid;if(e===i)return;let t=e===null&&i!==null,r=e!==null&&i===null;if(!document.startViewTransition||!t&&!r){cr(i),Jn(i),$(),Eu();return}if(Yn)return;cr(i),Yn=!0;let n=t?"kanban-opening":"kanban-closing";document.documentElement.classList.add(n);let s=d=>{d&&(d.style.viewTransitionName=""),document.documentElement.classList.remove(n),Yn=!1};if(t){let d=nt(i);d?(sr(d),d.style.viewTransitionName="kanban-detail-modal",d.getBoundingClientRect()):sr(),Jn(i);let p=En(()=>{$(),Eu(),d&&(d.style.viewTransitionName="")}),h=setTimeout(()=>s(d),600);(async()=>{try{await p.finished}catch{}clearTimeout(h),s(d)})();return}sr(),Jn(i);let o=null,c=En(()=>{$(),o=nt(e),o&&(sr(o),o.style.viewTransitionName="kanban-detail-modal")}),u=setTimeout(()=>s(o??nt(e)),600);(async()=>{try{await c.finished}catch{}clearTimeout(u),s(o??nt(e))})()}function Au(i){let e=nt(l.kanbanPopoverGid),t=e?.closest(".kanban-column");if(!t)return;let r=[...t.querySelectorAll(".kanban-card[data-kanban-source]")],n=r.indexOf(e);if(n<0)return;let s=Math.min(Math.max(n+i,0),r.length-1);if(s===n)return;let o=r[s].dataset.gid;if(!o)return;st(o);let c=nt(o);c&&(c.focus({preventScroll:!0}),c.scrollIntoView({block:"nearest",behavior:"instant"}))}var ar=null;function Zn(){Kl(),l.focusCodeStack=[],l.focusCodeAt=0,$(),ar?.isConnected&&ar.focus({preventScroll:!0}),ar=null}R.addEventListener("click",i=>{let e=B(i,"[data-links-preview]");if(e){i.preventDefault(),ar=e;let o=e.dataset.previewRow,c=Gl(e.dataset.linksPreview,e.dataset.previewReport,o===void 0?void 0:Number(o),e.dataset.previewManagedReport);$(),R.querySelector(".kanban-detail-close")?.focus({preventScroll:!0}),c.then(()=>{$(),et();let u=Xe()?.group?.[0]._bundleHashes;if(Array.isArray(u))for(let d of u)lc(d).catch(()=>{});return null});return}if(i.target.closest?.(".kanban-detail-close")){if(Xe()){Zn();return}st(null);return}if(i.target.closest?.("[data-kanban-detail-fullscreen]")){l.kanbanDetailFullscreen=!l.kanbanDetailFullscreen;try{localStorage.setItem(Qa,String(l.kanbanDetailFullscreen))}catch{}$(),et();return}let t=i.target.closest?.("[data-kanban-expand]");if(t){let o=t.dataset.kanbanExpand,c=l.kanbanExpandedColumn===o?null:o;l.kanbanExpandedColumn=c,c&&l.kanbanPopoverGid&&nt(l.kanbanPopoverGid)?.closest(".kanban-column")?.dataset.kanbanTarget!==c&&(l.kanbanPopoverGid=null),$();return}let r=i.target.closest?.("[data-kanban-nav]");if(r){Au(r.dataset.kanbanNav==="next"?1:-1);return}let n=i.target.closest?.("[data-kanban-select]");if(n){if(window.getSelection?.()?.toString())return;let o=n.dataset.gid;o&&st(o);return}if(i.target.closest?.(".kanban-action:not(.kanban-fix-note)"))return;let s=i.target.closest?.(".kanban-card[data-kanban-source]");if(s){if(window.getSelection?.()?.toString())return;let o=s.dataset.gid;if(!o)return;st(l.kanbanPopoverGid===o?null:o);return}if(!B(i,".kanban-detail-modal, .kanban-detail-side")){if(Xe()){Zn();return}l.kanbanPopoverGid&&st(null)}});R.addEventListener("change",i=>{let e=i.target.closest?.("[data-kanban-column]");if(!e)return;let t=e.selectedOptions[0]?.dataset.gid;t&&st(t)});document.addEventListener("keydown",i=>{if(i.key==="Escape"){if(Xe()){!i.defaultPrevented&&!Ou(i)&&!document.querySelector(":popover-open:not(#styled-tooltip)")&&Zn();return}if(l.kanbanPopoverGid){st(null);return}l.viewMode!=="kanban"||l.kanbanExpandedColumn===null||(l.kanbanExpandedColumn=null,$())}});function ii(i){let t=B(i,"[data-gid]")?.dataset?.gid;return t?de(t):null}function ts(i,e){if(!e.integrity||!e.file)return;let t=uc(i);if(!t)return;let r=cc(t,e);r&&(l.focusCodeStack=r.stack,l.focusCodeAt=r.at,$()),e.range||Iu(),et()}function Iu(){for(let i of R.querySelectorAll(".focus-code-body"))i.scrollTop=0,i.scrollLeft=0}R.addEventListener("keydown",i=>{if(i.key!=="Enter"&&i.key!==" ")return;let e=B(i,"[data-code-nav-file]");e&&(i.preventDefault(),ts(ii(i),{integrity:e.dataset.codeNavIntegrity,file:e.dataset.codeNavFile,range:Fe(e.dataset.codeNavLine)}))});function gm(i){let e=dc(l.focusCodeStack,l.focusCodeAt,i);e!==l.focusCodeAt&&(l.focusCodeAt=e,$(),l.focusCodeStack[e]?.range||Iu(),et())}function Fu(i){if(!i||l.focusGid===i)return;cr(i),l.focusGid=i,l.focusCodeStack=[],l.focusCodeAt=0,$();let e=R.querySelector(".focus-side-card.active");e&&e.scrollIntoView({block:"nearest",behavior:"instant"}),et()}function Du(i){let e=[...R.querySelectorAll(".focus-side-card[data-focus-select]")];if(e.length===0)return;let t=e.findIndex(s=>s.classList.contains("active")),r=t<0?i>0?0:e.length-1:Math.min(Math.max(t+i,0),e.length-1);if(r===t)return;let n=e[r].dataset.gid;n&&Fu(n)}R.addEventListener("click",i=>{let e=i.target.closest?.("[data-focus-nav]");if(e){Du(e.dataset.focusNav==="next"?1:-1);return}let t=i.target.closest?.(".focus-side-card[data-focus-select]");if(!t||window.getSelection?.()?.toString())return;let r=t.dataset.gid;r&&Fu(r)});R.addEventListener("pointerdown",i=>{if(i.button!==0)return;let e=i.target.closest?.("[data-focus-splitter]");e&&_u(e,i)});R.addEventListener("dblclick",i=>{let e=i.target.closest?.("[data-focus-splitter]");e&&yu(e)});function Ou(i){if(document.querySelector("dialog[open]"))return!0;for(let e of i.composedPath()){if(!e||e.nodeType!==1)continue;let t=e.tagName;if(t==="INPUT"||t==="TEXTAREA"||t==="SELECT"||t==="DIALOG"&&e.open||e.isContentEditable)return!0}return!1}document.addEventListener("keydown",i=>{if(l.currentView!=="findings")return;let e=l.viewMode==="focus",t=l.viewMode==="kanban"&&l.kanbanPopoverGid!==null;if(!e&&!t||i.metaKey||i.ctrlKey||i.altKey||i.shiftKey||Ou(i))return;let r=0;if(i.key==="ArrowRight")r=1;else if(i.key==="ArrowLeft")r=-1;else return;i.preventDefault();let n=i.target?.closest?.("[data-focus-splitter]");if(n){vu(n,r*mu);return}e?Du(r):Au(r)});R.addEventListener("mark-color",i=>{let e=B(i,"[data-gid]");if(!e)return;let t=e.dataset.gid,r=de(t);if(!r)return;let n=$e(r);if(!De(n))return;let s=mt(n),o=i.detail?.color;if(!o)return;Ze(n)?.color===o?X(l.triage,s,{color:void 0}):X(l.triage,s,{color:o}),ke(),Me()});var ot=null,es=null,Ct=null,ur=!1;function Bu(){if(ot!==null)return;if(l.reports.length===0){Ct=null,ur=!1;return}ot=l.viewMode,es=document.title;let i=!1;l.viewMode==="table"&&(l.viewMode="list",i=!0),Ct&&(qt(Ct),i=!0),i&&$();for(let r of R.querySelectorAll("finding-card"))r.toggleAttribute("print-one-sample",ur),r.ensureRendered({sync:!0});let e=l.reports.map(r=>r.fileName),t="";e.length===1?t=e[0]:e.length>1&&(t=zt(e)),t=t.replace(/\.json$/u,""),t&&(document.title=t)}function Nu(){if(ot===null)return;for(let e of R.querySelectorAll("finding-card"))e.removeAttribute("print-one-sample");ur=!1;let i=!1;l.viewMode!==ot&&(l.viewMode=ot,i=!0),Ct&&(Ht(),Ct=null,i=!0),i&&$(),document.title=es,ot=null,es=null}window.addEventListener("beforeprint",Bu);window.addEventListener("afterprint",Nu);async function bm(i,{oneSamplePerGroup:e=!1}={}){if(ot===null){Ct=i,ur=e;try{Bu(),await Promise.all([...R.querySelectorAll("finding-card")].map(t=>t.ensureRendered())),window.print()}catch(t){throw Nu(),t}}}function Tu(i,e){if(!i)return e();qt(i);try{return e()}finally{Ht()}}document.addEventListener("download-requested",async()=>{if(l.reports.length===0)return;let{confirmed:i,view:e,fields:t,mode:r,oneSamplePerGroup:n}=await ru("download");if(e){await cu(Tu(t,()=>Vn({oneSamplePerGroup:n})));return}if(i){if(r==="print"){await bm(t,{oneSamplePerGroup:n});return}Tu(t,()=>ku({oneSamplePerGroup:n}))}});R.addEventListener("analyzer-change",i=>{l.filterAnalyzer=i.detail.analyzer,l.filterModel=i.detail.model,$()});R.addEventListener("repo-change",i=>{l.filterRepo=i.detail.value,$()});R.addEventListener("revalidate-change",i=>{l.filterRevalidate=i.detail.value,$()});R.addEventListener("partial-change",i=>{l.filterPartial=i.detail.value,$()});R.addEventListener("revalidation-change",i=>{l.showRevalidation=i.detail.on,!i.detail.on&&l.reports.some(t=>(t.groups??[]).some(r=>r.some(n=>!n.isApp&&(n.isUpstream||Ri(n.file)))))?Oe("App mode off is not recommended; it can conflate triage for issues in dependencies.",{kind:"warning"}):i.detail.on&&md(),sn(l.showRevalidation,l.upstreamOnly),Ul(ln(),{resetSort:!1}),$()});R.addEventListener("revalidation-conflicts-open",()=>{(async()=>{let i=await hu(l.revalidateConflicts);if(!i)return;let e=await Tn(i.id,i.reportName);e.ok||alert(e.reason)})().catch(i=>console.warn("revalidation: open conflicting finding failed:",i))});R.addEventListener("revalidation-detail-change",i=>{l.revalidationDetailed=i.detail.on===!0,$()});R.addEventListener("upstream-only-change",i=>{if(l.upstreamOnly=i.detail.on===!0,sn(l.showRevalidation,l.upstreamOnly),!l.upstreamOnly){let e=ln();ql(e,Hl(e))==="confirmed"&&(l.filterRevalidate="confirmed",l.filterPartial="")}$()});R.addEventListener("bundle-search-mode-change",i=>{let e=i.detail?.mode;if(["files","code","issues","largest"].includes(e)){if(l.bundleCodeSearchMode=e,$(),e==="files")Qt();else if(e==="largest"){let t=document.querySelector(".bundle-code-rail-body");t&&(t.scrollTop=0)}}});R.addEventListener("bundle-graph-reason-change",i=>{let e=i.detail?.reason;e!==null&&typeof e!="string"||(E.bundleReason=e,E.layoutCache=null,E.selected=null,E.solo=null,E.focusedPkg=null,oe(),$())});R.addEventListener("bundle-search-regex-toggle",()=>{l.bundleSearchRegex=!l.bundleSearchRegex,$()});R.addEventListener("bundle-search-case-toggle",()=>{l.bundleSearchCase=!l.bundleSearchCase,$()});R.addEventListener("bundle-swap",i=>{let e=i.detail?.integrity;if(!e||!(l.bundles??[]).some(s=>s.integrity===e))return;let t=l.bundles.find(s=>s.integrity===e),r=nc(i.detail.bundles??[]),n=()=>{setTimeout(()=>sc(r))};if(t.managedId){let s=i.detail.target===void 0?l.selectedBundle:i.detail.target,o=l.bundles.find(u=>u.integrity===s),c=o?.managedId?{compareId:o.managedId,...ua(i.detail.mode)}:null;me.navigate($c(l.managedTeams,t,l.currentManagedTeam,"compare",c,l.bundles)).finally(n);return}Kt(e,"compare"),Be(e,"compare"),$(),fe(),wt(e).finally(n)});R.addEventListener("bundle-compare-change",i=>{let{base:e,target:t,mode:r}=i.detail??{};!H()||!e||e!==l.selectedBundle||l.bundleDetailsTab!=="compare"||(l.bundleCompare=t?{bundle:e,target:t,mode:$i(r)}:null,Be(e,"compare"))});R.addEventListener("sort-change",i=>{let{kind:e,value:t}=i.detail;if(e==="findings")l.sortBy=t;else if(e==="packages")l.packagesSortBy=t;else if(e==="repositories")l.repositoriesSortBy=t;else return;$()});R.addEventListener("range-change",i=>{i.target.id==="conf-range"&&(l.filterConfMin=i.detail.low,l.filterConfMax=i.detail.high,$())});R.addEventListener("input",i=>{let e=i.composedPath()[0],t=e?.id,r=e?.value;t==="g2-path-filter"&&(E.pathFilter=r,E.graphState?.requestDraw?.())});R.addEventListener("search-input",i=>{if(!i.detail)return;let{kind:e,value:t}=i.detail;if(e==="findings"){l.filterInclude=t,t||(l.filterIncludeNegate=!1),xu();return}else if(e==="files")l.filesSearch=t;else if(e==="packages")l.packagesSearchQuery=t;else if(e==="repositories")l.repositoriesSearchQuery=t;else if(e==="bundle-code")l.bundleCodeSearchQuery=t;else if(e==="bundle-search"){l.bundleSearchQuery=t,xu();return}else return;$()});R.addEventListener("search-negate-toggle",()=>{l.filterIncludeNegate=!l.filterIncludeNegate,$()});R.addEventListener("severity-toggle",i=>{let e=i.detail.severity;if(i.detail.kind==="graph"){E.selectedSeverities.has(e)?E.selectedSeverities.delete(e):E.selectedSeverities.add(e),i.composedPath()[0].selected=[...E.selectedSeverities],E.graphState?.requestDraw?.(),lr();return}l.filterSeverities.has(e)?l.filterSeverities.delete(e):l.filterSeverities.add(e),$()});R.addEventListener("color-toggle",i=>{let e=i.detail.color;if(i.detail.kind==="graph"){E.selectedColors.has(e)?E.selectedColors.delete(e):E.selectedColors.add(e),i.composedPath()[0].selected=[...E.selectedColors],E.graphState?.requestDraw?.(),lr();return}l.filterColors.has(e)?l.filterColors.delete(e):l.filterColors.add(e),$()});R.addEventListener("source-toggle",i=>{let e=i.detail.source,t=l.filterSources.has(e);l.filterSources.clear(),t||l.filterSources.add(e),$()});R.addEventListener("annotation-filter-toggle",i=>{let e=i.detail?.key,t=r=>r===""?"with":r==="with"?"without":"";if(e==="comment")l.filterComment=t(l.filterComment);else if(e==="fix")l.filterFix=t(l.filterFix);else if(e==="flag")l.filterFlagged=t(l.filterFlagged);else if(e==="duplicates"&&!l.currentWorkspace)l.filterDuplicates=t(l.filterDuplicates);else if(e==="cross-context")l.filterCrossContext=t(l.filterCrossContext);else if(e==="app-stacked")l.filterAppStacked=t(l.filterAppStacked);else if(e==="security")l.filterSecurity=t(l.filterSecurity);else return;$()});R.addEventListener("slide-triage-toggle",i=>{let{kind:e,value:t}=i.detail;if(e==="package")l.packageSlideTriage=l.packageSlideTriage===t?null:t;else if(e==="repository")l.repositorySlideTriage=l.repositorySlideTriage===t?null:t;else return;$()});R.addEventListener("view-mode-change",i=>{if(i.detail.kind==="files"){l.filesViewMode=i.detail.mode,$();return}l.viewMode=i.detail.mode,l.viewMode!=="kanban"&&(l.kanbanPopoverGid=null),l.viewMode!=="focus"&&(l.focusGid=null),$()});R.addEventListener("severity-mode-change",i=>{let e=i.detail?.mode;if(!(e!=="corrected"&&e!=="original")){l.severityMode=e;try{localStorage.setItem(Ja,e)}catch{}$()}});R.addEventListener("repo-edit-start",()=>{H()||(l.repoEditing=!0,$())});R.addEventListener("repo-input",i=>{H()||(l.repoUrl=i.detail.url,Ai(l.currentFile,l.repoUrl))});R.addEventListener("repo-commit",i=>{H()||(l.repoUrl=i.detail.url,Ai(l.currentFile,l.repoUrl),l.repoEditing=!1,$())});R.addEventListener("repo-cancel",i=>{H()||(l.repoUrl=i.detail.url,Ai(l.currentFile,l.repoUrl),l.repoEditing=!1,$())});document.addEventListener("keydown",i=>{if(i.key==="Escape"){if(l.bundleSourceFindingIdx!=null){l.bundleSourceFindingIdx=null,ti();return}if(l.bundleSourceFile){if(l.currentView==="bundles"&&l.bundleDetailsTab==="code")return;_t(l.bundleDetailsTab),$()}}});function W(i,e){for(let[t,r]of Object.entries(e))i.hasAttribute(t)||i.setAttribute(t,r)}var Pe=Math.PI*2;function vm(i){return()=>{i=i+1831565813|0;let e=i;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}}function zu(i,e,t,r){let n=Math.cos(e),s=Math.sin(e);return Math.min(n>0?(t-i.x)/n:n<0?-i.x/n:1/0,s>0?(r-i.y)/s:s<0?-i.y/s:1/0)}function ym(i){return Math.abs(i.reduce((e,t,r)=>{let n=i[(r+1)%i.length];return e+t.x*n.y-n.x*t.y},0))/2}function is(i){return i.slice(1).reduce((e,t,r)=>e+Math.hypot(t.x-i[r].x,t.y-i[r].y),0)}function _m(i,e,t,r){let n=i.map(d=>d.x),s=i.map(d=>d.y),o={x:(Math.min(...n)+Math.max(...n))/2,y:(Math.min(...s)+Math.max(...s))/2},c=Math.max(...i.map(d=>Math.hypot(d.x-o.x,d.y-o.y))),u=Math.atan2(o.y-e.y,o.x-e.x);return{center:o,distance:Math.hypot(o.x-e.x,o.y-e.y),dx:Math.cos(u)*(80+r()*200)+(r()-.5)*90,dy:t-o.y+c+40,rotation:(r()-.5)*160,delay:r()*120}}function qu(i,e,t=7){let r=vm(t),n={x:i*1820/1920,y:e*90/1080},s=Math.hypot(i,e),o=(_,x)=>_<1e-8?0:_>x-1e-8?x:_,c=_=>({x:o(_.x,i),y:o(_.y,e)}),u=Array.from({length:20},(_,x)=>((x+(r()-.5)*.35)*Pe/20+Pe)%Pe);for(let[_,x]of[[0,0],[i,0],[i,e],[0,e]])u.push((Math.atan2(x-n.y,_-n.x)+Pe)%Pe);u.sort((_,x)=>_-x);let p=[.045,.29,.58].map(_=>_*Math.min(i,e)).map(_=>u.map(x=>{let S=Math.min(_*(.92+r()*.16),zu(n,x,i,e));return c({x:n.x+Math.cos(x)*S,y:n.y+Math.sin(x)*S})}));p.push(u.map(_=>{let x=zu(n,_,i,e);return c({x:n.x+Math.cos(_)*x,y:n.y+Math.sin(_)*x})}));let h=p.map((_,x)=>_.map((S,T)=>{let F=_[(T+1)%_.length],O={x:(S.x+F.x)/2,y:(S.y+F.y)/2},A=Math.hypot(F.x-S.x,F.y-S.y),z=S.x===F.x&&(S.x===0||S.x===i)||S.y===F.y&&(S.y===0||S.y===e),Z=x===p.length-1||z?0:(r()-.5)*A*.08,re=Math.atan2(O.y-n.y,O.x-n.x);return[S,c({x:O.x+Math.cos(re)*Z,y:O.y+Math.sin(re)*Z}),F]})),f=p.slice(1).map((_,x)=>_.map((S,T)=>{let F=p[x][T],O=Math.hypot(S.x-F.x,S.y-F.y),A={x:(F.x+S.x)/2,y:(F.y+S.y)/2},z=(u[T]-u[(T+u.length-1)%u.length]+Pe)%Pe,Z=(u[(T+1)%u.length]-u[T]+Pe)%Pe,re=Math.min(z,Z)*Math.hypot(A.x-n.x,A.y-n.y),ne=(r()-.5)*Math.min(O*.12,re*.14);return[F,c({x:A.x-Math.sin(u[T])*ne,y:A.y+Math.cos(u[T])*ne}),S]})),b=[],v=_=>{ym(_)>.01&&b.push({points:_,..._m(_,n,e,r)})};v(h[0].flatMap(_=>_.slice(0,-1)));for(let _=0;_<p.length-1;_++)for(let x=0;x<u.length;x++){let S=(x+1)%u.length;v([...f[_][x],...h[_+1][x].slice(1),...f[_][S].toReversed().slice(1),...h[_][x].toReversed().slice(1)])}let g=Math.max(...b.map(_=>_.distance));for(let _ of b)_.delay+=_.distance/g*400;let y=[],k=(_,x,S,T)=>{let F=is(_);F>.1&&y.push({points:_,length:F,delay:x,duration:S,width:T})};for(let _=0;_<u.length;_++){let x=[n,p[0][_],...f.flatMap(S=>S[_].slice(1))];k(x,0,200+is(x)/s*1e3,1.1)}for(let _ of h.slice(0,-1))for(let x of _){let S=Math.hypot(x[0].x-n.x,x[0].y-n.y);k(x,S/s*1e3,220+is(x)/s*400,.7)}for(let _ of p[1]){let x=Math.atan2(_.y-n.y,_.x-n.x)+(r()-.5)*1.4,S=Math.min(i,e)*(.07+r()*.12),T=[_];for(let F=1;F<=3;F++)T.push(c({x:_.x+Math.cos(x+(r()-.5)*.3)*S*F/3,y:_.y+Math.sin(x+(r()-.5)*.3)*S*F/3}));k(T,Math.hypot(_.x-n.x,_.y-n.y)/s*1e3+80,220,.5)}return{width:i,height:e,impact:n,pieces:b,cracks:y}}var Hu=`.screen-crack{position:fixed;inset:0;z-index:2147483646;overflow:hidden;pointer-events:none;user-select:none}.screen-crack-svg{position:absolute;inset:0;width:100%;height:100%;overflow:hidden}.screen-crack-glass{position:absolute;inset:0;backdrop-filter:blur(9px) brightness(1.06) saturate(.85);background:linear-gradient(135deg,#dcebff0f,#dcebff00 55%);mask-mode:luminance;opacity:0}.screen-crack-shard{transform-box:fill-box;transform-origin:center}.screen-crack-outline{opacity:0}.screen-crack-flash{position:absolute;width:18vmin;height:18vmin;border-radius:50%;background:radial-gradient(circle,rgb(255 255 255 / .85),rgb(200 230 255 / .15) 55%,transparent 75%);transform:translate(-50%,-50%);opacity:0}@media print{.screen-crack{display:none}}
37
+ `;var km="http://www.w3.org/2000/svg",rs=1.5,$m=0;function ge(i,e={}){let t=document.createElementNS(km,i);for(let[r,n]of Object.entries(e))t.setAttribute(r,String(n));return t}function xm(i){let e=document.createElement("div");e.className="screen-crack",e.setAttribute("aria-hidden","true");let t=document.createElement("style");t.textContent=Hu;let r=ge("svg",{viewBox:`0 0 ${i.width} ${i.height}`,preserveAspectRatio:"none"});r.classList.add("screen-crack-svg");let n=ge("defs"),s=`screen-crack-mask-${++$m}`,o=ge("mask",{id:s,maskUnits:"userSpaceOnUse",maskContentUnits:"userSpaceOnUse",x:0,y:0,width:i.width,height:i.height});o.append(ge("rect",{width:i.width,height:i.height,fill:"black"})),n.append(o);let c=ge("g"),u=ge("g"),d=i.pieces.map(b=>{let v=b.points.map(_=>`${_.x},${_.y}`).join(" "),g=ge("g"),y=ge("g");g.classList.add("screen-crack-shard"),y.classList.add("screen-crack-shard"),g.append(ge("polygon",{points:v,fill:"white"}));let k=ge("polygon",{points:v,fill:"none",stroke:"rgb(240 248 255 / .8)","stroke-width":1.1,"stroke-linejoin":"round"});return k.classList.add("screen-crack-outline"),y.append(k),o.append(g),u.append(y),{masked:g,outlined:y,outline:k,piece:b}});r.append(n,c,u);let p=document.createElement("div");p.className="screen-crack-glass";let h=`${document.URL.split("#")[0]}#${s}`;p.style.maskImage=`url("${h}")`,p.style.webkitMaskImage=`url("${h}")`;let f=document.createElement("div");return f.className="screen-crack-flash",f.style.left=`${i.impact.x}px`,f.style.top=`${i.impact.y}px`,e.append(t,p,r,f),{overlay:e,glass:p,cracks:c,shards:d,flash:f}}function Sm(i,e,t){for(let r of e.cracks){let n=r.points.map((s,o)=>`${o===0?"M":"L"}${s.x} ${s.y}`).join(" ");for(let s of[!0,!1]){let o=ge("path",{d:n,fill:"none",stroke:s?"rgb(0 0 0 / .55)":"rgb(232 244 255 / .95)","stroke-width":r.width+(s?.8:0),"stroke-linecap":"round","stroke-linejoin":"round"});s&&o.setAttribute("transform","translate(.5 .7)"),o.style.strokeDasharray=`${r.length} ${r.length}`,o.style.strokeDashoffset=String(r.length),i.append(o),t(o,[{strokeDashoffset:String(r.length)},{strokeDashoffset:"0"}],{duration:r.duration*rs,delay:r.delay*rs,easing:"cubic-bezier(.2,.7,.2,1)"})}}}function Uu(i){let e=window.innerHeight,t=window.innerWidth;if(window.matchMedia("(prefers-reduced-motion: reduce)").matches||!t||!e||!Element.prototype.animate)return i(),Promise.resolve();let r=qu(t,e),{overlay:n,glass:s,cracks:o,shards:c,flash:u}=xm(r);document.body.append(n);let d=document.timeline.currentTime,p=[],h=(T,F,O)=>{let A=T.animate(F,{fill:"both",...O});return A.playbackRate=2,A.startTime=d,p.push(A),A},f=!1,b=!1,v=()=>{b||(b=!0,i())},g=()=>{if(!f){f=!0,window.removeEventListener("resize",g),window.removeEventListener("beforeprint",g),document.removeEventListener("visibilitychange",y),n.remove();for(let T of p)T.cancel();v()}},y=()=>{document.hidden&&g()};window.addEventListener("resize",g,{once:!0}),window.addEventListener("beforeprint",g,{once:!0}),document.addEventListener("visibilitychange",y),Sm(o,r,h),h(u,[{opacity:0,transform:"translate(-50%, -50%) scale(0)"},{opacity:.85,transform:"translate(-50%, -50%) scale(.8)",offset:.08},{opacity:0,transform:"translate(-50%, -50%) scale(2.4)"}],{duration:600,easing:"ease-out"}),h(o,[{transform:"translate(0, 0)"},{transform:"translate(-3px, 2px)"},{transform:"translate(3px, -2px)"},{transform:"translate(-2px, -2px)"},{transform:"translate(2px, 2px)"},{transform:"translate(0, 0)"}],{duration:450});let k=Math.max(...r.cracks.map(T=>T.delay+T.duration))*rs,_=500,x=Math.max(_,k*.8);h(s,[{opacity:0},{opacity:1}],{duration:_,easing:"ease-out"}),h(u,[{visibility:"visible"},{visibility:"visible"}],{duration:1,delay:x-1}).finished.then(v,()=>{}),h(o,[{opacity:1},{opacity:0}],{duration:450,delay:x,easing:"ease-out"});for(let{masked:T,outlined:F,outline:O,piece:A}of c){let z=x+A.delay,Z=[{transform:"translate(0, 0) rotate(0deg)"},{transform:`translate(${A.dx}px, ${A.dy}px) rotate(${A.rotation}deg)`}];for(let re of[T,F])h(re,Z,{duration:1700,delay:z,easing:"cubic-bezier(.32,0,.82,.94)"});h(O,[{opacity:0},{opacity:1}],{duration:250,delay:z})}return Promise.all(p.map(T=>T.finished)).then(g,g)}var ju=`:host{position:absolute;top:.5rem;right:.5rem;z-index:1000;width:30px;height:30px;background:var(--theme-toggle-bg, transparent);color:var(--muted);border:var(--theme-toggle-border, 0);border-radius:var(--ui-radius, 6px);font-size:1rem;line-height:1;font-family:inherit;display:flex;align-items:center;justify-content:center;transition:color .12s,background .12s;cursor:default;user-select:none}:host(:hover){color:var(--text);background:var(--theme-toggle-hover-bg, rgb(from var(--text) r g b / .06))}:host(:focus-visible){outline:2px solid var(--accent);outline-offset:2px}@media print{:host{display:none!important}}@media(display-mode:window-controls-overlay){:host{-webkit-app-region:no-drag;app-region:no-drag}}
38
+ `;var ss="deepview.theme",hr=Object.freeze(["dark","light","green","pink","paper"]),ns=Object.freeze(["dark","green","pink","paper","light"]),Em={dark:{base:"#1a1a1b",dim:"#0a0a0a"},light:{base:"#f6f6fa",dim:"#646464"},green:{base:"#0a140a",dim:"#050a05",sidebar:"#0f1e0f"},pink:{base:"#ffe4ee",dim:"#a3727f",sidebar:"#ffe0f0"},paper:{base:"#ffffff",dim:"#666666"}},os=window.matchMedia?.("(display-mode: window-controls-overlay)"),Vu=window.matchMedia?.("(display-mode: standalone)"),Ku=window.navigator?.windowControlsOverlay,Tm={light:"\u2600",dark:"\u263E",green:"\u{1F576}\uFE0F",pink:"\u273F",paper:"\u{1F4C4}"},as="deepview-theme-changed",be="dark",ps=!1,Rm=0,ls=!1,pr=!1,cs=0;function Lm(){return ls?ns[(ns.indexOf(be)+1)%ns.length]:be==="light"?"dark":"light"}function ds(){window.dispatchEvent(new CustomEvent(as,{detail:{theme:be}}))}function Mm(){try{let i=localStorage.getItem(ss);return hr.includes(i)?i:"dark"}catch{return"dark"}}function mr(){let i=document.querySelector('meta[name="theme-color"]');if(!i)return;let{base:e,dim:t,sidebar:r}=Em[be],n=Ku?.visible??os?.matches??!1,s=(Vu?.matches||os?.matches)&&!n;i.setAttribute("content",ps?t:s&&r?r:e)}function Et(i){hr.includes(i)||(i="dark"),be=i;for(let e of hr)e!=="dark"&&document.body.classList.remove(`theme-${e}`);i!=="dark"&&document.body.classList.add(`theme-${i}`);try{i==="dark"?localStorage.removeItem(ss):localStorage.setItem(ss,i)}catch{}mr(),ds()}Et(Mm());os?.addEventListener("change",mr);Vu?.addEventListener("change",mr);Ku?.addEventListener("geometrychange",mr);window.addEventListener("beforeprint",()=>{ps=!0,Et(be)});window.addEventListener("afterprint",()=>{ps=!1,Et(be)});function Gu(i){if(!hr.includes(i))throw new TypeError("unknown theme");cs++,Et(i)}function Wu(){return be}var us=class extends U{static properties={_theme:{state:!0}};static styles=M(ju);constructor(){super(),this._theme=be}connectedCallback(){super.connectedCallback(),W(this,{role:"button",tabindex:"0","aria-label":"toggle theme"}),this.addEventListener("click",this._toggle),this.addEventListener("keydown",this._onKeydown),window.addEventListener(as,this._onThemeChanged),this._onThemeChanged()}disconnectedCallback(){window.removeEventListener(as,this._onThemeChanged),this.removeEventListener("click",this._toggle),this.removeEventListener("keydown",this._onKeydown),super.disconnectedCallback()}_onThemeChanged=()=>{this._theme=be,this.setAttribute("aria-disabled",String(pr))};_toggle=()=>{if(!pr){if(!ls&&++Rm>=8&&be==="dark"){ls=!0,pr=!0,ds();let e=cs,t=()=>{cs===e&&Et("green")},r=()=>{pr=!1,ds()};try{Uu(t).catch(t).finally(r)}catch{t(),r()}return}Et(Lm())}};_onKeydown=e=>{(e.key==="Enter"||e.key===" ")&&(e.preventDefault(),e.repeat||this._toggle())};render(){return a`${Tm[this._theme]}`}};customElements.define("theme-toggle",us);var Yu=`: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}.row.row-pending{min-height:3rem}: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(.selected) .row{outline:2px solid var(--accent);outline-offset:-2px}:host(.link-target) .row{animation:link-target-flash 1.6s ease-out}@keyframes link-target-flash{0%,30%{box-shadow:inset 0 0 0 2px var(--accent)}to{box-shadow:inset 0 0 0 2px rgb(from var(--accent) r g b / 0)}}@media(prefers-reduced-motion:reduce){:host(.link-target) .row{animation:none;box-shadow:inset 0 0 0 2px var(--accent)}}:host(:first-of-type) .row{border-top-left-radius:var(--ui-radius, 6px);border-top-right-radius:var(--ui-radius, 6px)}:host(:last-of-type) .row{border-bottom-left-radius:var(--ui-radius, 6px);border-bottom-right-radius:var(--ui-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:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;& a{color:inherit;text-decoration:none;cursor:default}& a:hover{color:var(--accent)}}.marks{display:flex;gap:.35rem;align-items:center;min-width:0;margin-left:auto;user-select:none}}.gh-ref-btn{display:inline-flex;align-items:center;position:relative;flex-shrink:0;padding:0 .15rem;color:var(--muted);cursor:default;&:before{content:"";position:absolute;inset:-.25rem -2px}&:hover{color:var(--accent)}&:focus-visible{outline:1px solid var(--accent);outline-offset:1px;border-radius:var(--ui-radius, 2px)}}.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}.line-num{color:var(--muted);font-size:.75rem}.line-num a{color:inherit}@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}:host(.link-target) .row{animation:none;box-shadow:none!important}.row{break-inside:avoid}.marks{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}}.badge-orig{background:transparent!important;color:#555!important;border-color:#999!important}.badge-varies{color:#555!important;border-color:#999!important}.badge-arrow,.badge-corr-mark,.badge-pre{color:#555!important}a,.line-num,.line-num a{color:inherit}}
39
+ `;var fr=`:host(.triage-fixed),:host(.triage-invalid),:host(.triage-deleted),:host(.triage-ignored){opacity:.75}.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}}.badge-pair{display:inline-flex;align-items:center;gap:.25rem}.badge-pair-full,.badge-pair-compact{flex-direction:column;gap:.15rem}.badge-orig-wrap{display:inline-flex;align-items:center;gap:.15rem;line-height:1}.badge-arrow,.badge-corr-mark{font-size:.6rem;line-height:1;color:var(--muted)}.badge-arrow.up,.badge-corr-mark.up{color:var(--high)}.badge-pre{font-size:.55rem;text-transform:uppercase;letter-spacing:.03em;color:var(--muted)}.badge-orig{display:inline-block;font-size:.58rem;font-weight:600;text-transform:uppercase;padding:.08rem .3rem;border-radius:3px;letter-spacing:.03em;line-height:1;background:transparent;color:var(--muted);border:1px solid var(--border);&.struck{text-decoration:line-through;text-decoration-thickness:1px}&.critical{border-color:rgb(from var(--critical) r g b / .55)}&.high{border-color:rgb(from var(--high) r g b / .55)}&.medium{border-color:rgb(from var(--medium) r g b / .55)}&.low{border-color:rgb(from var(--low) r g b / .55)}&.high_bug{border-color:rgb(from var(--high-bug) r g b / .55)}&.bug{border-color:rgb(from var(--bug) r g b / .55)}&.informational{border-color:rgb(from var(--info) r g b / .55)}}.badge-varies{font-size:.55rem;font-weight:600;text-transform:uppercase;letter-spacing:.03em;padding:.08rem .3rem;border-radius:3px;line-height:1;background:transparent;color:var(--muted);border:1px dashed var(--border)}.mark-action-group{display:inline-flex;border:1px solid var(--border);border-radius:var(--ui-radius, 3px);background:linear-gradient(var(--surface),var(--surface)),var(--bg);overflow:hidden;margin-right:.25rem;flex-shrink:0}.mark-comment,.mark-fix,.mark-flag,.mark-copy,.mark-link,.mark-issue,.mark-claude{background:transparent;border:0;color:var(--muted);padding:0 .25rem;height:1.4rem;cursor:default;display:inline-flex;align-items:center;justify-content:center;&:not(:last-child){border-right:1px solid var(--border)}&:not(:disabled):hover{color:var(--accent);background:var(--surface-active)}}.mark-issue{text-decoration:none}.mark-comment.has-comment,.mark-fix.has-fix,.mark-flag.flagged{color:var(--accent)}.mark-flag svg{display:block}.mark-copy.copied,.mark-link.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,.mark-flag.flagged .flag-cloth{fill:var(--accent);fill-opacity:.15}.triage-menu-wrap{position:relative;display:inline-flex;margin-left:.25rem;flex-shrink:0}.mark-triage-menu{cursor:default;background:linear-gradient(var(--surface),var(--surface)),var(--bg);border:1px solid var(--border);color:var(--muted);border-radius:var(--ui-radius, 3px);padding:0 .3rem;height:1.5rem;display:inline-flex;align-items:center;justify-content:center;gap:.25rem;font:inherit}.mark-triage-menu:not(:disabled):hover{color:var(--text);border-color:var(--accent)}.mark-comment:disabled,.mark-fix:disabled,.mark-flag:disabled,.mark-triage-menu:disabled,.triage-menu-item:disabled{opacity:.4}.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-inprogress{border-color:var(--warning, #d97706);color:var(--warning, #d97706)}.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:var(--ui-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{cursor:default;background:transparent;border:0;padding:.35rem .5rem;font-size:.78rem;color:var(--text);text-align:left;border-radius:var(--ui-radius, 3px);font-family:inherit}.triage-menu-item:not(:disabled):hover{background:var(--surface)}.triage-menu-item.active:before{content:"\\2713 ";color:var(--accent)}.triage-menu-inprogress:not(:disabled):hover{color:var(--warning, #d97706)}.triage-menu-fixed:not(:disabled):hover{color:var(--green, #4ade80)}.triage-menu-invalid:not(:disabled):hover{color:var(--muted)}.triage-menu-deleted:not(:disabled):hover{color:var(--critical)}.line-num a:hover{color:var(--accent)}
40
+ `;var gr=`.tab-level-separator{align-self:center;padding-inline:.125rem;color:var(--muted);font-size:.75rem;line-height:1}.tab{--tab-severity: var(--bg);position:relative;display:inline-flex;align-items:center;gap:.35rem;border:1px solid transparent;border-radius:var(--ui-radius, 4px);padding-block:calc(.35rem - .1em);padding-inline:.5rem;min-width:0;font-family:inherit;font-size:.75rem;line-height:1.3;color:var(--text);background:var(--tab-severity);background-image:linear-gradient(135deg,var(--tab-marker, transparent) 50%,var(--tab-marker-shadow, transparent) 50%,transparent 60%);background-size:12px 12px;background-repeat:no-repeat;background-origin:border-box;&.tab-with-confidence{padding-right:1rem;min-width:3.25rem}&.tab-with-analyzer{padding-right:calc(.5rem + 20px)}&.tab-severity-critical{--tab-severity: var(--critical);color:#fff}&.tab-severity-high{--tab-severity: var(--high);color:#fff}&.tab-severity-medium{--tab-severity: var(--medium);color:#000}&.tab-severity-low{--tab-severity: var(--low);color:var(--badge-low-text)}&.tab-severity-high_bug{--tab-severity: var(--high-bug);color:#fff}&.tab-severity-bug{--tab-severity: var(--bug);color:#fff}&.tab-severity-informational{--tab-severity: var(--info);color:#fff}&.tab-mark-red{--tab-marker: var(--marker-red)}&.tab-mark-blue{--tab-marker: var(--marker-blue)}&.tab-mark-green{--tab-marker: var(--marker-green)}&.tab-mark-gray{--tab-marker: var(--marker-gray)}&:is(.tab-mark-red,.tab-mark-blue,.tab-mark-green,.tab-mark-gray){--tab-marker-shadow: rgb(0 0 0 / .3)}&:hover{border-color:var(--muted)}&.active{border-color:var(--text);box-shadow:inset 0 0 0 1px var(--text)}&.active:before{content:"";position:absolute;z-index:1;top:-1px;left:-1px;width:12px;height:12px;border-top-left-radius:inherit;background:var(--tab-marker, transparent);clip-path:polygon(0 0,100% 0,0 100%);pointer-events:none}&.tab-with-analyzer:is(:hover,.active):after{content:"";position:absolute;inset:-1px;border:1px solid var(--muted);border-radius:inherit;pointer-events:none}&.tab-with-analyzer.active:after{border-color:var(--text);box-shadow:inset 0 0 0 1px var(--text)}&.tab-deleted .tab-label{text-decoration:line-through;opacity:.6}&.tab-inprogress .tab-label:after{content:" \\25d0";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-label{display:flex;align-items:center;gap:.35rem;text-align:left}.tab-conf{position:absolute;right:.25rem;bottom:.15rem;font-size:.6rem;line-height:1;color:inherit}.tab-analyzer{position:absolute;inset:-1px -1px -1px auto;width:20px;display:flex;overflow:hidden;border-radius:var(--ui-radius, 0 4px 4px 0);box-shadow:0 0 2px #0003}.tab-analyzer .report-logo{flex:1;border:0}.tab-analyzer svg{display:block}.tab-conf-max{display:none}.tab-severity{display:inline-flex}.badge{padding:0;background:none;color:inherit}.tab-indicators{display:inline-flex;align-items:center;gap:.25rem}.tab-indicators:empty{display:none}.tab-marks{display:inline-flex;align-items:center;gap:.15rem;color:inherit}.tab-marks svg{display:block}.tab-marks :is(.bubble,.wrench,.flag-cloth){fill:currentcolor;fill-opacity:.15}.badge-corr-mark{color:inherit}}
41
+ `;var br=`.report-button{display:inline-flex;align-items:center;max-width:16rem;padding:0;overflow:hidden;background:transparent;border:1px solid var(--border);border-radius:var(--ui-radius, 3px);color:var(--muted);font:inherit;font-size:.7rem;text-decoration:none;cursor:default;transition:border-color .12s,color .12s;&:hover{border-color:var(--accent);color:var(--accent)}&:focus-visible{outline:2px solid var(--accent);outline-offset:1px}}.report-button-label{min-width:0;padding:.1rem .4rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
42
+ `;var vr=`a{cursor:default}.finding-actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:.25rem 1rem;min-width:0;max-width:100%}.finding-action-controls{display:flex;flex:0 0 auto;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:.35rem;max-width:100%}.finding-actions .report-chip{flex:0 1 auto;width:max-content;min-width:0;max-width:100%;min-height:1.4rem}.finding-actions .report-chip-label{white-space:normal;overflow-wrap:anywhere;text-align:left}
43
+ `;var Om=["is-critical","mark-red","mark-blue","mark-green","mark-gray","has-conflict","triage-inprogress","triage-fixed","triage-invalid","triage-deleted","triage-ignored","selected"],hs=class extends D{static properties={group:{attribute:!1},selected:{type:Boolean}};static styles=[M($t),M(br),M(fr),M(Yu),M(vr),M(gr)];_near=!1;_watching=!1;constructor(){super(),this.group=null,this.selected=!1}render(){if(!this.group)return a``;if(this.dataset.gid=Qe(this.group),!this._near)return this.classList.toggle("selected",this.selected),a`<div class="row row-pending" aria-busy="true"></div>`;let e=new Set(wc(this.group));this.selected&&e.add("selected");for(let t of Om)this.classList.toggle(t,e.has(t));return a`<div class="row">${kc(this.group)}</div>`}connectedCallback(){super.connectedCallback(),ht(this.renderRoot),this.addEventListener("click",this._onClick),this._watching=!0,xt(this,e=>this._onNear(e))}disconnectedCallback(){this.removeEventListener("click",this._onClick),this._watching&&(Le(this),this._watching=!1),super.disconnectedCallback()}_onNear(e){e?(this._watching&&(Le(this),this._watching=!1),this._near=!0,this.requestUpdate()):this._near&&(this._near=!1,this.requestUpdate())}ensureRendered({sync:e=!1}={}){return this._near||this._onNear(!0),e&&this.isConnected&&this.isUpdatePending&&this.performUpdate(),this.updateComplete}_onClick=e=>{e.composedPath().some(r=>r?.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",hs);var Ju=`:host{display:block;background:var(--surface);backdrop-filter:var(--glass-blur);border:1px solid var(--border);border-radius:var(--ui-radius, 6px);overflow:hidden;box-shadow:var(--shadow-glass);margin-bottom:1rem;max-width:1200px}@media not print{finding-row{content-visibility:auto;contain-intrinsic-size:auto 3.2rem}}
44
+ `;var ms=class extends U{static properties={items:{attribute:!1},selectedGid:{attribute:!1}};static styles=M(Ju);constructor(){super(),this.items=[],this.selectedGid=null}render(){return a`${le(this.items??[],e=>Qe(e),e=>a`<finding-row .group="${e}" ?selected="${Qe(e)===this.selectedGid}"></finding-row>`)}`}};customElements.define("finding-table",ms);var Xu=`:host{display:block}:host(.hidden){display:none}:host([lazy]:not(.content-ready)){visibility:hidden}.card{padding:.5rem .75rem;padding-bottom:var(--finding-card-pad-bottom, .5rem);border-bottom:1px solid var(--border);font-size:.875rem;display:var(--finding-card-display, block);flex-direction:column;flex:1}:host(:last-child) .card{border-bottom:none}.card.card-pending{min-height:8rem}:host(.has-conflict) .card{outline:2px dashed var(--accent);outline-offset:-2px}:host(.has-conflict[popup][context="kanban-detail"]) .card{outline:none}:host(.link-target) .card{animation:link-target-flash 1.6s ease-out}@keyframes link-target-flash{0%,30%{box-shadow:inset 0 0 0 2px var(--accent)}to{box-shadow:inset 0 0 0 2px rgb(from var(--accent) r g b / 0)}}@media(prefers-reduced-motion:reduce){:host(.link-target) .card{animation:none;box-shadow:inset 0 0 0 2px var(--accent)}}:host([in-group]) .line-row{display:none}@media not print{:host([in-group]) .line-row+*{margin-top:0}:host([in-group]) .line-row+:is(.conf-reason,.revalidate-verdict,.severity-reason){padding-top:0;border-top:0}}.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}}.tab-body>:not(.finding-left){min-width:0;overflow-wrap:break-word}.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-wrap;font-size:.96em;line-height:1.6;color:rgb(from var(--text) r g b / .82);margin-top:.4rem}.section,.evidence,.recommendation{grid-column:2;margin-top:.55rem;font-size:.92em}.section-label{display:flex;align-items:center;gap:.3rem;color:var(--muted);font-weight:600;font-size:.62rem;text-transform:uppercase;letter-spacing:.06em;&:before{content:"";flex:none;width:2px;height:.58rem;margin-left:calc((2px + .3rem)*-1);border-radius:1px;background:currentcolor;opacity:.75;-webkit-print-color-adjust:exact;print-color-adjust:exact}}.code-preview-btn{display:inline-flex;align-items:center;margin-left:.35rem;padding:0 .15rem;border:0;background:transparent;color:var(--muted);vertical-align:-2px;&.open{color:var(--accent)}}.gh-ref-btn{display:inline-flex;align-items:center;margin-left:.25rem;padding:0 .15rem;color:var(--muted);vertical-align:-2px}:is(.code-preview-btn,.gh-ref-btn){position:relative;&:before{content:"";position:absolute;inset:-.25rem -2px}&:hover{color:var(--accent)}&:focus-visible{outline:1px solid var(--accent);outline-offset:1px;border-radius:var(--ui-radius, 2px)}}.code-preview-tip{position:absolute;z-index:20;top:100%;left:0;margin-top:.3rem;width:max-content;max-width:min(100%,46rem);visibility:hidden;filter:drop-shadow(0 2px 6px rgb(0 0 0 / .35));background:var(--bg);border-radius:var(--ui-radius, 4px);.code-preview{margin:0}}:is(.line-row,.evidence-list li):has(.code-preview-btn:is(:hover,:focus-visible))>.code-preview-tip{visibility:visible}.code-preview{margin:.3rem 0 .1rem;border:1px solid var(--border);border-radius:var(--ui-radius, 4px);background:var(--surface);backdrop-filter:var(--glass-blur);max-height:calc(10lh + .7rem);overflow:auto;display:flex;align-items:flex-start;white-space:normal;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.75rem;line-height:1.5}.code-preview-pending{display:block;padding:.35rem .5rem;color:var(--muted);font-style:italic}.code-preview-gutter{flex:none;padding:.35rem .45rem .35rem .5rem;border-right:1px solid var(--border);color:var(--muted);text-align:right;user-select:none;position:sticky;left:0;z-index:1;background-color:var(--bg);background-image:linear-gradient(rgb(from var(--text) r g b / .03),rgb(from var(--text) r g b / .03)),linear-gradient(var(--surface),var(--surface));.code-preview-lineno{width:var(--lineno-width, 3ch);opacity:.7}.cited{opacity:1;color:var(--accent);font-weight:600}}.code-preview-source{margin:0;padding:.35rem .6rem;white-space:pre;color:var(--text);font:inherit;& code{font:inherit}}summary.section-label{cursor:default;list-style:none;&::-webkit-details-marker{display:none}&:after{content:"";flex:none;width:.3rem;height:.3rem;margin-left:.05rem;border-right:1.5px solid currentcolor;border-bottom:1.5px solid currentcolor;transform:translateY(-1px) rotate(-45deg);transition:transform .12s;opacity:.8}}details[open]>summary.section-label:after{transform:translateY(-2px) rotate(45deg)}.evidence-count{font-weight:500;opacity:.8}.section-body{white-space:pre-wrap;line-height:1.55;color:rgb(from var(--text) r g b / .82);margin-top:.1rem}.para+.para{margin-top:.5lh}.md-list{margin:0;padding-inline-start:1.2em}.md-list li+li{margin-top:.25lh}.para+.md-list,.md-list+.para,.md-list+.md-list{margin-top:.5lh}.md-list li::marker{color:rgb(from currentcolor r g b / .45)}.recommendation .section-label,.recommendation .section-body{color:var(--green)}.conf-reason,.revalidate-verdict{grid-column:2;white-space:pre-wrap;font-size:.92em;font-style:italic;color:var(--muted);margin-top:.6rem;padding-top:.55rem;border-top:1px dashed var(--border)}.revalidate-stamp{display:inline-block;margin-top:.1rem;font-size:.55rem;font-weight:600;line-height:1;text-transform:uppercase;letter-spacing:.03em;padding:.14rem .3rem;border-radius:3px;background:transparent;color:var(--muted);border:1px solid var(--border);white-space:nowrap;&.confirmed{color:var(--critical);border-color:rgb(from var(--critical) r g b / .55)}&.partial{color:var(--yellow);border-color:rgb(from var(--yellow) r g b / .55)}&.unknown{color:var(--warning);border-color:rgb(from var(--warning) r g b / .55)}}.evidence-list{margin:.25rem 0 0;padding-left:1.6rem;display:flex;flex-direction:column;gap:.15rem;>li{position:relative}& li::marker{color:var(--muted);font-size:.9em}>li.current:before{content:"";position:absolute;left:-1.5rem;top:.58em;width:.35rem;height:.35rem;border-radius:50%;background:var(--accent)}>li.current::marker{color:var(--accent)}& li:has(.evidence-note):not(:last-child){margin-bottom:.3rem}}.evidence-ref{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.92em;overflow-wrap:anywhere;color:var(--accent);text-decoration:none;&:is(a,[role=link]):hover{text-decoration:underline}&:focus-visible{outline:1px solid var(--accent);outline-offset:1px;border-radius:var(--ui-radius, 2px)}}:is(.line-num a,.evidence-ref,.gh-ref-btn){cursor:default}span.evidence-ref:not([role]){color:var(--muted)}.evidence-note{white-space:pre-wrap;line-height:1.5;color:rgb(from var(--text) r g b / .78);margin-top:.1rem}.desc-title a,.desc a,.section-body a,.conf-reason a,.revalidate-verdict a{color:var(--accent);text-decoration:none;&:hover{text-decoration:underline}}.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);padding:0 .25em;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.9em;color:var(--text)}.code-block:not(.token){white-space:normal;margin:.5rem 0;border:1px solid var(--border);border-radius:var(--ui-radius, 4px);background:rgb(from var(--text) r g b / .05);overflow:hidden;width:fit-content;max-width:100%;.code-block-lang{padding:.15rem .5rem;border-bottom:1px solid var(--border);color:var(--muted);font-size:.62rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em}& pre{margin:0;padding:.45rem .6rem;overflow-x:auto;white-space:pre;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.85em;line-height:1.5;color:var(--text)}& code{font:inherit}}.line-row{display:flex;justify-content:space-between;align-items:baseline;gap:.5rem;flex-wrap:wrap;padding-right:var(--finding-line-end-inset, 0);position:relative}.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:var(--ui-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;position:var(--finding-marks-position, static);bottom:0;background:var(--finding-marks-bg, transparent);padding-bottom:var(--finding-marks-pad-bottom, 0);padding-left:4.75rem;user-select:none}.finding-left{align-self:start;text-align:center;min-width:4rem;padding-top:var(--finding-left-inset, 0);position:var(--finding-left-position, relative);top:var(--finding-mark-sticky-top, 0);.value-label:last-child{margin-bottom:0}}:host(:not([popup])) .finding-left{padding-top:calc(var(--finding-left-inset, 0px) + 2px)}.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}.severity-reason{margin-top:.4rem;padding-top:.35rem;border-top:1px dashed var(--border);font-size:.82em;font-style:italic;color:var(--muted)}.severity-reason-label{font-style:normal;font-weight:600;text-transform:uppercase;font-size:.85em;letter-spacing:.04em;margin-right:.35rem}.duplicates-block .file-icon{flex-shrink:0}: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:var(--ui-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:not(:disabled):hover{background:var(--surface-active)}:host([context="focus"]) .triage-menu-inprogress.active{background:rgb(from var(--warning, #d97706) r g b / .12);border-color:var(--warning, #d97706);color:var(--warning, #d97706)}: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:var(--finding-marks-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-flag,:host([context="focus"]) .mark-copy,:host([context="focus"]) .mark-link,:host([context="focus"]) .mark-issue,: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}.finding-top-marks{position:absolute;top:calc(var(--finding-left-inset, 0px) - var(--finding-mark-inset, .5rem));left:calc(.75rem - var(--finding-mark-inset, .5rem));display:grid;grid-template-columns:24px 12px;column-gap:31px;&.color-red{color:var(--marker-red)}&.color-blue{color:var(--marker-blue)}&.color-green{color:var(--marker-green)}&.color-gray{color:var(--marker-gray)}}.finding-color-mark{grid-column:1;display:block;width:24px;height:12px;border-radius:var(--ui-radius, 0 0 6px 6px);background:currentcolor;box-shadow:inset 0 0 0 1px rgb(from var(--text) r g b / .15)}.finding-bookmark-mark{grid-column:2;display:block;width:12px;height:12px;background:var(--bookmark-color);clip-path:polygon(0 0,100% 0,100% 100%,50% 75%,0 100%)}:host(:not([popup])) :is(.finding-color-mark,.finding-bookmark-mark){height:10px}.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:var(--ui-radius, 0 4px 4px 0);font-size:.82rem;color:var(--text)}.comment-block{white-space:pre-wrap;& a{color:var(--accent);text-decoration:none}& a:hover{text-decoration:underline}& a.comment-self-ref{text-decoration:underline dotted;text-underline-offset:2px}& a.comment-self-ref:hover{text-decoration:underline solid}}.comment-block:has(.managed-comment){white-space:normal}.fix-block{word-break:break-all;& a{color:var(--accent);text-decoration:none}& a:hover{text-decoration:underline}}.fix-block:has(managed-fix-link){display:flex;align-items:center;gap:.6rem;padding:.45rem .65rem;border:1px solid var(--border);border-radius:var(--ui-radius, 6px);background:rgb(from var(--muted) r g b / .04);word-break:normal;.fix-label{flex:none;font-size:.75rem;font-weight:500}& managed-fix-link{flex:1;min-width:0}}.duplicates-block{display:flex;align-items:baseline;flex-wrap:wrap;gap:.1rem .4rem;margin-top:.5rem;padding:.35rem .55rem;border-left:3px solid var(--muted);background:rgb(from var(--muted) r g b / .1);border-radius:var(--ui-radius, 0 4px 4px 0);font-size:.82rem;color:var(--text);.duplicates-label{color:var(--muted);font-weight:600}& a.duplicate-ref{display:inline-flex;align-items:center;gap:.25rem;color:var(--accent);text-decoration:none}& a.duplicate-ref .duplicate-ref-id{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.78rem;text-decoration:underline dotted;text-underline-offset:2px}& a.duplicate-ref:hover .duplicate-ref-id{text-decoration:underline solid}}.comment-label,.fix-label{color:var(--muted);font-weight:600;margin-right:.35rem}.line-num{color:var(--muted);font-size:.8rem}.line-num a{color:inherit;text-decoration:none}.npm-link{display:inline-block;padding:0 .4rem;border:1px solid var(--border);border-radius:var(--ui-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:var(--finding-print-break, avoid);box-decoration-break:clone;padding:.45rem .25rem}.finding-code-btn,.mark-copy,.mark-link,.mark-issue,.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(.link-target) .card{animation:none;box-shadow:none!important}: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;break-inside:var(--finding-print-break, avoid)}:host(.multi-case) .tab-body{break-inside:auto}:host(.multi-case) .tab-body+.tab-body{break-inside:avoid}.tab-body+.tab-body{margin-top:.5rem;padding-top:.5rem;border-top:1px dashed #999}:host([print-one-sample]) .tab-body:not(.active),:host([print-one-sample]) .print-case-label,:host([print-one-sample]) .card:before{display:none!important}:host([print-one-sample]) .tab-body.active{margin-top:0;padding-top:0;border-top:0;break-inside:var(--finding-print-break, avoid)}.finding-body{display:flex;flex-direction:column;>*{flex-shrink:0}}.line-row,.desc-title,.conf-reason,.severity-reason{break-inside:avoid}.section-label{break-after:avoid}.desc,.section-body{orphans:2;widows:2}.section,.recommendation,.evidence{break-inside:avoid}.evidence{order:99}.evidence>summary{break-after:avoid}.evidence-list>li{break-inside:avoid}:host([in-group].multi-case:not([print-one-sample])) .tab-body .line-row{display:flex}:host([in-group]:is(:not(.multi-case),[print-one-sample])) .line-row+*{margin-top:0}:host([in-group]:is(:not(.multi-case),[print-one-sample])) .line-row+.conf-reason{padding-top:0;border-top:0}.line-row .discovered-in{flex-basis:100%;order:99}.print-case-label{display:block;grid-column:1 / -1;break-after:avoid;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}}.badge-orig{background:transparent!important;color:#555!important;border-color:#999!important}.badge-varies,.revalidate-stamp{color:#555!important;border-color:#999!important}.badge-arrow,.badge-corr-mark,.badge-pre,.severity-reason{color:#555!important}a,.line-num,.line-num a,.desc-title a,.desc a,.section-body a,.conf-reason a,.revalidate-verdict a,.evidence-ref{color:inherit}details:not([open])>:not(summary){display:block}details::details-content{content-visibility:visible}summary.section-label{cursor:default;&:after{display:none}}.code-preview-btn,.gh-ref-btn{display:none}.inline-code{border:0;background:transparent}.code-block:not(.token){background:transparent;border-color:#bbb;.code-block-lang{color:#555;border-bottom-color:#bbb}& pre{white-space:pre-wrap;overflow:visible}.token{color:#333!important}.token.comment,.token.prolog,.token.cdata{color:#666!important}}}
45
+ `;var zm=["finding","is-critical","mark-red","mark-blue","mark-green","mark-gray","has-conflict","triage-inprogress","triage-fixed","triage-invalid","triage-deleted","triage-ignored","multi-case"],fs=class extends D{static properties={group:{attribute:!1},inGroup:{type:Boolean,attribute:"in-group",reflect:!0},context:{type:String,reflect:!0},lazy:{type:Boolean}};static styles=[M($t),M(br),M(fr),M(Xu),M(vr),M(gr),M(kt),M(Ei)];_near=!1;_watched=null;constructor(){super(),this.group=null,this.inGroup=!1,this.context=null,this.lazy=!1}render(){if(!this.group)return a``;if(this.dataset.gid=Qe(this.group),this.lazy&&!this._near)return this.classList.add("finding"),a`<div class="card card-pending" aria-busy="true"></div>`;let e=new Set(yc(this.group));for(let t of zm)this.classList.toggle(t,e.has(t));return a`<div class="card">${_c(this.group,{context:this.context})}</div>`}updated(){this.classList.toggle("content-ready",!!this.group&&(!this.lazy||this._near));for(let e of this.renderRoot.querySelectorAll(".code-preview")){let t=e.dataset.revealedTo;if(t!==void 0&&Math.round(e.scrollTop)!==Number(t))continue;let r=e.querySelectorAll(".code-preview-lineno.cited");r.length!==0&&(qi(e,r),e.dataset.revealedTo=String(Math.round(e.scrollTop)))}}connectedCallback(){if(super.connectedCallback(),ht(this.renderRoot),this.lazy){this._watched=this.closest(".flat-group")??this,xt(this._watched,e=>this._onNear(e));return}this.hasUpdated&&this.requestUpdate()}disconnectedCallback(){this._watched&&(Le(this._watched),this._watched=null),super.disconnectedCallback()}_onNear(e){e?(this._watched&&(Le(this._watched),this._watched=null),this._near=!0,this.requestUpdate()):this._near&&(this._near=!1,this.requestUpdate())}ensureRendered({sync:e=!1}={}){return this.lazy&&!this._near&&this._onNear(!0),e&&this.isConnected&&this.isUpdatePending&&this.performUpdate(),this.updateComplete}};customElements.define("finding-card",fs);var Qu=`:host{display:inline-flex;gap:4px;align-items:center;flex-shrink:0}button{width:14px;height:14px;user-select:none;padding:0;background:transparent;border:1.5px solid currentcolor;border-radius:var(--ui-radius, 50%);opacity:.55;transition:opacity .12s,transform .12s}button:not(:disabled):hover{opacity:1;transform:scale(1.12)}button:disabled{opacity:.25}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)}
46
+ `;var Hm=["red","blue","green","gray"],gs=class extends U{static properties={selected:{type:String},disabled:{type:Boolean}};static styles=M(Qu);constructor(){super(),this.selected=null,this.disabled=!1}render(){return a`${Hm.map(e=>a`<button type="button" class="${`color-${e}${this.selected===e?" active":""}`}" data-color="${e}" aria-label="${`mark ${e}`}" ?disabled="${this.disabled}" @click="${this._onClick}"></button>`)}`}_onClick=e=>{if(this.disabled)return;let t=e.currentTarget.dataset.color;this.dispatchEvent(new CustomEvent("mark-color",{detail:{color:t},bubbles:!0,composed:!0}))}};customElements.define("color-marker",gs);var bs=class extends D{static properties={rangeDisabled:{type:Boolean,attribute:"range-disabled"},revalidateOptions:{attribute:!1},hasPartial:{type:Boolean,attribute:"has-partial"}};createRenderRoot(){return this}constructor(){super(),this.rangeDisabled=!1,this.revalidateOptions=[],this.hasPartial=!1}render(){let e=l.filterConfMin,t=l.filterConfMax,r=this.revalidateOptions??[],n=this.rangeDisabled,s=r.length>0&&!!l.filterRevalidate,o=n?"No confidence range: some findings on screen carry no confidence score":m;return a`<span class="${I({"conf-range-label":!0,replaced:s,disabled:n})}" data-tooltip="${o}">Confidence</span> <span class="${I({"conf-range":!0,replaced:s,disabled:n})}" ?inert="${n||s}"><range-slider id="conf-range" min="0" max="10" step="1" low="${e}" high="${t}" aria-label="Confidence range"></range-slider><conf-range-mirror id="conf-range-vals" class="conf-vals" for="conf-range" .low="${e}" .high="${t}"></conf-range-mirror></span>${r.length>0?a`<revalidate-filter class="${I({replaces:s})}" .options="${r}" ?has-partial="${this.hasPartial}"></revalidate-filter>`:m}`}};customElements.define("conf-filter",bs);var Zu={files:"Filter files\u2026",code:"Search code\u2026",issues:"Search issues\u2026",largest:"Filter largest files\u2026"},ep={files:"Filter files",code:"Search code",issues:"Search issues",largest:"Largest files"},Um=a`<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>`,jm={files:Ui,code:ji,issues:a`<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>`,largest:a`<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" aria-hidden="true"><path d="M2.5 4h11M2.5 8h7.5M2.5 12h4"/></svg>`},vs=class extends D{static properties={modes:{attribute:!1}};createRenderRoot(){return this}constructor(){super(),this.modes=[]}render(){let e=l.bundleCodeSearchQuery,t=l.bundleCodeSearchMode,r=this.modes.includes(t)?t:"files",n=Zu[r]??Zu.files;return a`${Um} <input type="text" class="bundle-code-search-input" placeholder="${n}" aria-label="${n}" .value="${j(e)}" @input="${this._onInput}"> ${e?a`<button type="button" class="bundle-code-search-clear" aria-label="Clear search" @click="${this._onClear}">×</button>`:m} ${this.modes.length>0?a`<span class="bundle-code-search-modes" role="tablist">${this.modes.map(s=>a`<button type="button" class="${I({"bundle-code-search-mode":!0,active:r===s})}" role="tab" aria-selected="${String(r===s)}" data-tooltip="${ep[s]??s}" aria-label="${ep[s]??s}" @click="${()=>this._selectMode(s)}">${jm[s]??m}</button>`)}</span>`:m}`}_onInput=e=>{this._dispatchInput(e.target.value)};_onClear=()=>{this._dispatchInput("")};_dispatchInput(e){this.dispatchEvent(new CustomEvent("search-input",{detail:{kind:"bundle-code",value:e},bubbles:!0,composed:!0}))}_selectMode(e){this.dispatchEvent(new CustomEvent("bundle-search-mode-change",{detail:{mode:e},bubbles:!0,composed:!0}))}};customElements.define("bundle-code-search",vs);var Tt=320,ys=class extends HTMLElement{constructor(){super(),this._drag=null,this.addEventListener("pointerdown",e=>this._startDrag(e)),this.addEventListener("pointermove",e=>{this._drag?.id===e.pointerId&&(Tt=this._apply(this._drag.width+e.clientX-this._drag.x))});for(let e of["pointerup","pointercancel","lostpointercapture"])this.addEventListener(e,t=>{this._drag?.id===t.pointerId&&this._endDrag()});this.addEventListener("keydown",e=>this._onKeyDown(e)),this.addEventListener("dblclick",()=>{Tt=320,this._apply(Tt)})}connectedCallback(){this._view=this.closest(".bundle-code-view"),this._view&&(this._observer=new ResizeObserver(()=>this._apply(Tt)),this._observer.observe(this._view),this._apply(Tt))}disconnectedCallback(){this._observer?.disconnect(),this._endDrag(),this._view=null}_bounds(){let e=this._view.getBoundingClientRect().width;return{min:Math.min(180,e*.4),max:e*.6}}_apply(e){if(!this._view)return e;let{min:t,max:r}=this._bounds();if(r===0)return e;let n=Math.max(t,Math.min(r,e));return this._view.style.setProperty("--bundle-code-rail-width",`${n}px`),this.setAttribute("aria-valuemin",String(Math.round(t))),this.setAttribute("aria-valuemax",String(Math.round(r))),this.setAttribute("aria-valuenow",String(Math.round(n))),this.setAttribute("aria-valuetext",`${Math.round(n)} pixels`),n}_startDrag(e){if(e.button!==0||!e.isPrimary||this._drag||!this._view)return;e.preventDefault();let t=this._view.querySelector(".bundle-code-rail").getBoundingClientRect().width;this._drag={id:e.pointerId,x:e.clientX,width:t},this.setPointerCapture(e.pointerId),this.classList.add("dragging")}_endDrag(){if(!this._drag)return;let{id:e}=this._drag;this._drag=null,this.classList.remove("dragging"),this.hasPointerCapture(e)&&this.releasePointerCapture(e)}_onKeyDown(e){if(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey||!this._view)return;let t=this._view.querySelector(".bundle-code-rail").getBoundingClientRect().width,{min:r,max:n}=this._bounds(),s={ArrowLeft:t-16,ArrowRight:t+16,Home:r,End:n}[e.key];s!==void 0&&(e.preventDefault(),e.stopPropagation(),Tt=this._apply(s))}};customElements.define("bundle-code-splitter",ys);var _s=class extends HTMLElement{connectedCallback(){this._schedule=()=>{this._frame||(this._frame=requestAnimationFrame(()=>this._update()))},this._resize=new ResizeObserver(this._schedule),this._resize.observe(this),this._mutation=new MutationObserver(this._schedule),this._mutation.observe(this,{childList:!0,subtree:!0,characterData:!0,attributes:!0,attributeFilter:["hidden"]}),this._mode=matchMedia("(display-mode: window-controls-overlay)"),this._mode.addEventListener("change",this._schedule),navigator.windowControlsOverlay?.addEventListener("geometrychange",this._schedule),this._schedule()}disconnectedCallback(){cancelAnimationFrame(this._frame),this._frame=0,this._resize.disconnect(),this._mutation.disconnect(),this._mode.removeEventListener("change",this._schedule),navigator.windowControlsOverlay?.removeEventListener("geometrychange",this._schedule)}_update(){this._frame=0,this.classList.remove("boxed");let e=this.querySelector(".bundles-slide-bar");if(!e)return;this._resize.observe(e);let t=this.querySelector(".bundles-slide-tabs");t&&this._resize.observe(t);let r=parseFloat(getComputedStyle(this,"::before").height)||0;if(!r)return;let n=this.getBoundingClientRect(),s=e.getBoundingClientRect();this.classList.toggle("boxed",s.top>n.top+1||s.height>r+1)}};customElements.define("bundle-slide-header",_s);var Vm=a`<svg class="bundle-search-icon" viewBox="0 0 16 16" width="15" height="15" 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>`,ws=class extends D{createRenderRoot(){return this}render(){let e=l.bundleSearchQuery,t=l.bundleSearchRegex,r=l.bundleSearchCase,n=t?"Search by regular expression\u2026":"Search all source\u2026";return a`${Vm} <input type="text" class="bundle-search-input" placeholder="${n}" aria-label="${n}" spellcheck="false" autocapitalize="off" autocomplete="off" .value="${j(e)}" @input="${this._onInput}"> ${e?a`<button type="button" class="bundle-search-clear" aria-label="Clear search" @click="${this._onClear}">×</button>`:m} <span class="bundle-search-mods"><button type="button" class="${I({"bundle-search-mod":!0,active:r})}" data-tooltip="${r?"Case-sensitive on \u2014 click to ignore case":"Match case"}" aria-label="Match case" aria-pressed="${String(r)}" @click="${this._onToggleCase}">Aa</button> <button type="button" class="${I({"bundle-search-mod":!0,active:t})}" data-tooltip="${t?"Regular expression on \u2014 click for plain text":"Match by regular expression"}" aria-label="Match by regular expression" aria-pressed="${String(t)}" @click="${this._onToggleRegex}">.*</button></span>`}_onInput=e=>{this._dispatchInput(e.target.value)};_onClear=()=>{this._dispatchInput("")};_dispatchInput(e){this.dispatchEvent(new CustomEvent("search-input",{detail:{kind:"bundle-search",value:e},bubbles:!0,composed:!0}))}_onToggleRegex=()=>{this.dispatchEvent(new CustomEvent("bundle-search-regex-toggle",{bubbles:!0,composed:!0}))};_onToggleCase=()=>{this.dispatchEvent(new CustomEvent("bundle-search-case-toggle",{bubbles:!0,composed:!0}))}};customElements.define("bundle-search",ws);function Se(i,e,t){let r=e[t];return r||console.warn(`<${i}>: unknown kind ${JSON.stringify(t)}; expected one of ${Object.keys(e).map(n=>JSON.stringify(n)).join(", ")}.`),r}var Km={packages:{stateKey:"packagesSearchQuery",label:"Filter packages"},repositories:{stateKey:"repositoriesSearchQuery",label:"Filter repositories"}},ks=class extends D{static properties={kind:{type:String}};createRenderRoot(){return this}constructor(){super(),this.kind=""}render(){let e=Se("entity-search",Km,this.kind);return e?a`<input type="search" class="packages-search" placeholder="${`${e.label}\u2026`}" aria-label="${e.label}" .value="${j(l[e.stateKey])}" @input="${this._onInput}">`:m}_onInput=e=>{this.dispatchEvent(new CustomEvent("search-input",{detail:{kind:this.kind,value:e.target.value},bubbles:!0,composed:!0}))}};customElements.define("entity-search",ks);var Gm=[["findings-desc","Findings \u2193"],["files-desc","Files \u2193"],["reports-desc","Reports \u2193"],["name-asc","Name A\u2192Z"]],Wm={packages:{stateKey:"packagesSortBy",aria:"Sort packages"},repositories:{stateKey:"repositoriesSortBy",aria:"Sort repositories"}},$s=class extends D{static properties={kind:{type:String}};createRenderRoot(){return this}constructor(){super(),this.kind=""}render(){let e=Se("entity-sort",Wm,this.kind);return e?a`<select class="packages-sort" aria-label="${e.aria}" .value="${j(l[e.stateKey])}" @change="${this._onChange}">${Gm.map(([t,r])=>a`<option value="${t}" ?selected="${l[e.stateKey]===t}">${r}</option>`)}</select>`:m}_onChange=e=>{this.dispatchEvent(new CustomEvent("sort-change",{detail:{kind:this.kind,value:e.target.value},bubbles:!0,composed:!0}))}};customElements.define("entity-sort",$s);var xs=class extends D{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 e=(t,r)=>a`<option value="${t}" ?selected="${l.sortBy===t}">${r}</option>`;return a`<select class="sort-select" aria-label="Sort findings" .value="${j(l.sortBy)}" @change="${this._onChange}">${e("severity","Severity \u2193")} ${this.showFile?e("file","File \u2191"):m} ${this.showConfidence?a`${e("confidence-desc","Confidence \u2193")}${e("confidence-asc","Confidence \u2191")}`:m} ${this.showPriority?a`${e("priority-desc","Priority \u2193")}${e("priority-asc","Priority \u2191")}`:m}</select>`}_onChange=e=>{this.dispatchEvent(new CustomEvent("sort-change",{detail:{kind:"findings",value:e.target.value},bubbles:!0,composed:!0}))}};customElements.define("findings-sort",xs);var tp=`: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:var(--ui-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)}
47
+ `;var Ss=class extends U{static properties={min:{type:Number},max:{type:Number},step:{type:Number},low:{type:Number},high:{type:Number}};static styles=M(tp);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 e=this.max-this.min||1,t=(this.low-this.min)/e*100,r=(this.high-this.min)/e*100;return a`<div class="track-wrap" style="${`--low:${t}%;--high:${r}%`}"><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(e){if(!this._inputs||!(e.has("low")||e.has("high")))return;let t=this._inputs.map(o=>Number(o.value)),r=t[0]>t[1],n=r?1:0,s=r?0:1;this.low!==t[n]&&(this._inputs[n].value=this.low),this.high!==t[s]&&(this._inputs[s].value=this.high)}_onInput=()=>{let e=Number(this._inputs[0].value),t=Number(this._inputs[1].value);this.low=Math.min(e,t),this.high=Math.max(e,t),this._emit("range-input")};_onChange=()=>{this._emit("range-change")};_emit(e){this.dispatchEvent(new CustomEvent(e,{detail:{low:this.low,high:this.high},bubbles:!0,composed:!0}))}};customElements.define("range-slider",Ss);var Cs=class extends U{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(e){this._dragging&&(e.has("low")&&this.low!==this._liveLow&&(this.low=this._liveLow),e.has("high")&&this.high!==this._liveHigh&&(this.high=this._liveHigh))}_onRangeInput=e=>{e.target?.id===this.for&&(this._dragging=!0,this._liveLow=e.detail.low,this._liveHigh=e.detail.high,this.low=e.detail.low,this.high=e.detail.high)};_onRangeChange=e=>{e.target?.id===this.for&&(this._dragging=!1)};render(){return a`<span>${this.low}</span><span class="dash">–</span><span>${this.high}</span>`}};customElements.define("conf-range-mirror",Cs);var ip=`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:var(--ui-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:var(--ui-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:var(--ui-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:var(--ui-radius, 5px);padding:.3rem .8rem;font:inherit;font-size:.78rem;&:hover{border-color:var(--accent);color:var(--accent)}}
48
+ `;var Es=class extends q{static styles=[...q.styles,M(ip)];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:e,filename:t}=await ml();Ge(e,t),this.status={kind:"ok",text:`Downloaded ${t}`}}catch(e){this.status={kind:"err",text:`Export failed: ${e.message}`}}finally{this.busy=!1}}async _onFile(e){let t=e.target.files?.[0];if(this.parsed=null,this.parseError=null,this.status=null,!!t)try{this.parsed=await fl(t)}catch(r){this.parseError=r.message}}_onMode(e){this.mode=e.target.value}async _onApply(){if(!(!this.parsed||this.busy||Ut())){this.busy=!0,this.status=null;try{let e=await gl(this.parsed,this.mode);$(),this.status=e.repoUrlError?{kind:"err",text:`Applied ${e.triageEntries} triage entries (${this.mode}), but saving repo URLs failed: ${e.repoUrlError.message}`}:{kind:"ok",text:`Applied ${e.triageEntries} triage entries and ${e.repoUrls} repo URLs (${this.mode}).`},this.parsed=null;let t=this.renderRoot.querySelector('input[type="file"]');t&&(t.value="")}catch(e){this.status={kind:"err",text:`Import failed: ${e.message}`}}finally{this.busy=!1}}}render(){return a`<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>${Ut()?m:this._importTemplate()} ${this.status?a`<div class="${`status status-${this.status.kind}`}">${this.status.text}</div>`:m}<footer class="actions"><button type="button" @click="${this._onClose}">Close</button></footer></dialog>`}_importTemplate(){let e=this.parsed;return a`<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?a`<div class="error">Failed to parse: ${this.parseError}</div>`:m} ${e?a`<div class="summary">Found <strong>${Object.keys(e.triage).length}</strong> triage entries and <strong>${Object.keys(e.repoUrls).length}</strong> repo URLs. ${e.exportedAt?a`<span class="meta">Exported ${e.exportedAt}.</span>`:m}</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>`:m}</section>`}};customElements.define("triage-export-dialog",Es);function rp(){return Y("triage-export-dialog")}var np=`:host{display:inline-flex;vertical-align:middle;position:relative}.chip{display:inline-flex;align-items:center;gap:.375rem;cursor:default;user-select:none;position:relative;min-height:24px;box-sizing:border-box;padding:.125rem .375rem .125rem .5rem;background:var(--surface);border:var(--header-tag-border, 1px solid var(--border));border-radius:var(--ui-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}.chip.copied:after{content:"Copied";position:absolute;inset:0;display:grid;place-items:center;background:var(--surface);backdrop-filter:var(--glass-blur);border-radius:var(--ui-radius, 999px);color:var(--text);font-weight:400;white-space:nowrap;pointer-events:none}.edit-btn{width:18px;height:18px;display:grid;place-items:center;padding:0;margin-left:.125rem;background:transparent;border:0;border-radius:var(--ui-radius, 4px);color:var(--muted)}.edit-btn:hover{color:var(--text);background:rgb(from var(--text) r g b / .06)}@media(display-mode:window-controls-overlay){.edit-btn,input{-webkit-app-region:no-drag;app-region:no-drag}}.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:var(--ui-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}}
49
+ `;var Ts=a`<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>`,sp=a`<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>`,Rs=class extends U{static properties={url:{type:String},editable:{type:Boolean,reflect:!0},editing:{type:Boolean,reflect:!0},_copied:{state:!0}};static styles=M(np);constructor(){super(),this.url="",this.editable=!1,this.editing=!1,this._copied=!1,this._opener=""}render(){if(this.editable&&this.editing){let e=!!this.url,t=e?We(this.url):"Set repo";return a`<span class="${e?"chip":"chip empty"}" aria-hidden="true" inert>${Ts} <span class="label">${t}</span> <button type="button" class="edit-btn">${sp}</button> </span><input type="text" .value="${j(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 e=!!this.url,t=e?We(this.url):"Set repo",r=e?this._copied?"chip copied":"chip":"chip empty";return a`<span class="${r}" @click="${e?null:this._onEdit}">${Ts} ${e?this._slugLabel(t):a`<span class="label">${t}</span>`} <button type="button" class="edit-btn" aria-label="Edit repo URL" @click="${this._onEdit}">${sp}</button></span>`}if(this.url){let e=this._copied?"chip readonly copied":"chip readonly";return a`<span class="${e}">${Ts} ${this._slugLabel(We(this.url))}</span>`}return m}_slugLabel(e){return a`<span class="label" @click="${this._onCopyLabel}">${e}</span>`}updated(e){if(e.has("editing")&&this.editing){let t=this.renderRoot.querySelector("input");t&&(t.focus(),t.select())}}_onEdit=e=>{e&&e.stopPropagation(),this._emit("repo-edit-start")};_onCopyLabel=e=>{e&&e.stopPropagation();let t=We(this.url);if(t)try{navigator.clipboard.writeText(t).then(()=>(this._copied=!0,setTimeout(()=>{this._copied=!1},1e3),null)).catch(()=>{})}catch{}};_onFocus=e=>{this._opener=e.target.value};_onInput=e=>{this.url=e.target.value,this._emit("repo-input",{url:this.url})};_onKeydown=e=>{e.key==="Enter"?(e.preventDefault(),this._emit("repo-commit",{url:this.url})):e.key==="Escape"&&(e.preventDefault(),this.url=this._opener,this._emit("repo-cancel",{url:this._opener}))};_onBlur=()=>{this.editing&&this._emit("repo-commit",{url:this.url})};_emit(e,t){this.dispatchEvent(new CustomEvent(e,{detail:t,bubbles:!0,composed:!0}))}};customElements.define("repo-chip",Rs);var Qm=a`<svg viewBox="0 0 16 16" width="12" height="12" 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>`,Zm=a`<svg viewBox="0 0 16 16" width="12" height="12" 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>`,ef=a`<svg viewBox="0 0 16 16" width="12" height="12" aria-hidden="true"><path class="flag-cloth" d="M5 1.5h6v13l-3-2.7-3 2.7z" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linejoin="round"/></svg>`,tf=J(gi.replace('width="14" height="14"','width="12" height="12"')),rf=a`<svg viewBox="0 0 16 16" width="12" height="12" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-width="1.15" stroke-linecap="round" stroke-linejoin="round"><path d="M5 1.2 1.3 3.1v5.7L5 10.7l3.7-1.9V3.1Z M1.3 3.1 5 5l3.7-1.9 M5 5v5.7"/><path d="M11 5.2 7.3 7.1v5.7l3.7 1.9 3.7-1.9V7.1Z M7.3 7.1 11 9l3.7-1.9 M11 9v5.7"/></g></svg>`,nf=a`<svg viewBox="0 0 16 16" width="12" height="12" aria-hidden="true"><g fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"><rect x="3.4" y="1.5" width="10" height="3.6" rx=".8"/><rect x="2.2" y="5.3" width="10" height="3.6" rx=".8"/><rect x="1" y="9.1" width="10" height="3.6" rx=".8"/></g></svg>`,sf=a`<svg viewBox="0 0 16 16" width="12" height="12" aria-hidden="true"><path d="M8 1.5 13 3.5v4c0 3-2.1 5.5-5 7-2.9-1.5-5-4-5-7v-4Z" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linejoin="round"/></svg>`,of=[{key:"comment",glyph:Qm,label:"commented",stateKey:"filterComment",hasKey:"hasComment"},{key:"fix",glyph:Zm,label:"fixed",stateKey:"filterFix",hasKey:"hasFix"},{key:"flag",glyph:ef,label:"flagged",stateKey:"filterFlagged",hasKey:"hasFlagged"},{key:"duplicates",glyph:tf,label:"rows with duplicates in other reports",stateKey:"filterDuplicates",hasKey:"hasDuplicates"},{key:"cross-context",glyph:rf,label:"rows across multiple repos or packages",stateKey:"filterCrossContext",hasKey:"hasCrossContext"},{key:"app-stacked",glyph:nf,label:"stacked App rows",stateKey:"filterAppStacked",hasKey:"hasAppStacked"},{key:"security",glyph:sf,label:"security-related rows",stateKey:"filterSecurity",hasKey:"hasSecurityContrast"}],op=new Set(["duplicates","cross-context","app-stacked","security"]),Ls=class extends D{static properties={group:{type:String},hasComment:{attribute:!1},hasFix:{attribute:!1},hasFlagged:{attribute:!1},hasDuplicates:{attribute:!1},hasCrossContext:{attribute:!1},hasAppStacked:{attribute:!1},hasSecurityContrast:{attribute:!1}};createRenderRoot(){return this}constructor(){super(),this.group="marks",this.hasComment=!1,this.hasFix=!1,this.hasFlagged=!1,this.hasDuplicates=!1,this.hasCrossContext=!1,this.hasAppStacked=!1,this.hasSecurityContrast=!1}connectedCallback(){super.connectedCallback(),W(this,{role:"group","aria-label":this.group==="context"?"Finding row filters":"Annotation filter"})}render(){let e=of.filter(r=>this.group==="context"===op.has(r.key)).filter(r=>r.key==="security"?this.hasSecurityContrast:r.key==="duplicates"?!l.currentWorkspace&&(this.hasDuplicates||l[r.stateKey]):this[r.hasKey]||l[r.stateKey]);if(e.length===0)return m;let t=r=>{let n=l[r.stateKey],s=op.has(r.key)?r.label:`${r.label} findings`,o=n==="with"?`Showing only ${s} \u2014 click to exclude them`:n==="without"?`Excluding ${s} \u2014 click to clear`:`Show only ${s}`;return a`<button type="button" class="${I({"annotation-chip":!0,"sel-with":n==="with","sel-without":n==="without"})}" aria-label="${o}" aria-pressed="${String(n!=="")}" @click="${()=>this._toggle(r.key)}">${r.glyph}</button>`};return a`${e.map(t)}`}_toggle(e){this.dispatchEvent(new CustomEvent("annotation-filter-toggle",{detail:{key:e},bubbles:!0,composed:!0}))}};customElements.define("annotation-filter",Ls);var af=[["critical","Critical"],["high","High"],["medium","Medium"],["low","Low"],["high_bug","High bug"],["bug","Bug"],["informational","Info"]],Ms=class extends D{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(),W(this,{role:"group","aria-label":"Filter by severity"})}render(){let e=this.kind==="graph"?new Set(this.selected):l.filterSeverities,t=af.filter(([r])=>(this.counts[r]??0)||e.has(r));return t.length===0?m:a`${t.map(([r,n])=>{let s=this.counts[r]??0,o=e.has(r);return a`<button type="button" class="${I({"sev-chip":!0,[r]:!0,active:o})}" aria-pressed="${String(o)}" @click="${()=>this._toggle(r)}"><span class="sd"></span><span class="name">${n}</span><span class="n">${s}</span></button>`})}`}_toggle(e){this.dispatchEvent(new CustomEvent("severity-toggle",{detail:{severity:e,kind:this.kind},bubbles:!0,composed:!0}))}};customElements.define("severity-chips",Ms);var lf=[["corrected","Corrected","Show corrected severities (application-specific re-ratings)"],["original","Original",m]],Ps=class extends D{createRenderRoot(){return this}connectedCallback(){super.connectedCallback(),W(this,{role:"group","aria-label":"Severity display mode"})}render(){let e=l.severityMode;return a`<span class="severity-mode-label">Severity</span><span class="severity-mode-chips">${lf.map(([t,r,n])=>{let s=e===t;return a`<button type="button" class="${I({"severity-mode-chip":!0,active:s})}" aria-pressed="${String(s)}" data-tooltip="${n}" @click="${()=>this._select(t)}">${r}</button>`})}</span>`}_select(e){e!==l.severityMode&&this.dispatchEvent(new CustomEvent("severity-mode-change",{detail:{mode:e},bubbles:!0,composed:!0}))}};customElements.define("severity-mode-switch",Ps);var cf=a`<svg viewBox="0 0 16 16" width="13" height="13" aria-hidden="true"><path d="M8 1.8 14.4 5 8 8.2 1.6 5z" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linejoin="round"/><path d="M2.6 8 8 10.7 13.4 8" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/><path d="M2.6 11 8 13.7 13.4 11" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/></svg>`,ap="Show underlying code findings",df=a`<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 5.5v2h10v-2M8 7.5v3"/><rect x="1" y="1.5" width="4" height="4" rx=".6"/><rect x="11" y="1.5" width="4" height="4" rx=".6"/><rect x="6" y="10.5" width="4" height="4" rx=".6"/></svg>`,lp="Show only upstream dependency findings",As=class extends D{static properties={canDrop:{type:Boolean,attribute:"can-drop"},canDetail:{type:Boolean,attribute:"can-detail"},canUpstream:{type:Boolean,attribute:"can-upstream"},upstreamDisabled:{type:Boolean,attribute:"upstream-disabled"}};createRenderRoot(){return this}constructor(){super(),this.canDrop=!1,this.canDetail=!1,this.canUpstream=!1,this.upstreamDisabled=!1}connectedCallback(){super.connectedCallback(),W(this,{role:"group","aria-label":"Revalidation layer"})}render(){let e=l.revalidateConflicts.size,t=e>0?a`<button type="button" class="revalidation-toggle revalidation-conflicts" aria-haspopup="dialog" aria-label="${`View ${e} revalidation conflict${e===1?"":"s"}`}" @click="${this._openConflicts}">${e} ${e===1?"conflict":"conflicts"}</button>`:m,r=l.showRevalidation!==!1,n=r&&l.revalidationDetailed===!0,s=l.upstreamOnly===!0,o=s&&!this.upstreamDisabled;return a`${t}${e===0&&this.canDrop?a`<mode-switch class="revalidation-toggle" label="App" borderless .checked="${r}" accessible-label="App view — hide the issues the revalidation pass ruled out" .disabled="${s}" @click="${this._toggle}"></mode-switch>`:m}${e===0&&this.canDrop&&this.canDetail?a`<button type="button" class="${I({"revalidation-detail":!0,on:n})}" aria-pressed="${String(n)}" aria-label="${ap}" data-tooltip="${ap}" ?disabled="${!r||s}" @click="${this._toggleDetail}">${cf}</button>`:m}${this.canUpstream?a`<button type="button" class="${I({"revalidation-upstream":!0,on:o})}" aria-pressed="${String(o)}" aria-label="${lp}" data-tooltip="${lp}" ?disabled="${this.upstreamDisabled}" @click="${this._toggleUpstream}">${df}</button>`:m}`}_toggle=()=>{this.dispatchEvent(new CustomEvent("revalidation-change",{detail:{on:l.showRevalidation===!1},bubbles:!0,composed:!0}))};_openConflicts=()=>{this.dispatchEvent(new CustomEvent("revalidation-conflicts-open",{bubbles:!0,composed:!0}))};_toggleDetail=()=>{this.dispatchEvent(new CustomEvent("revalidation-detail-change",{detail:{on:l.revalidationDetailed!==!0},bubbles:!0,composed:!0}))};_toggleUpstream=()=>{this.upstreamDisabled||this.dispatchEvent(new CustomEvent("upstream-only-change",{detail:{on:l.upstreamOnly!==!0},bubbles:!0,composed:!0}))}};customElements.define("revalidation-switch",As);var uf=a`<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>`,Is=class extends D{createRenderRoot(){return this}render(){let e=l.currentView==="bundles"&&l.selectedBundle,t=!l.currentFile&&!e;return a`<button type="button" class="danger" ?disabled="${t}">${uf}<span>Delete current</span></button>`}};customElements.define("sidebar-delete-current",Is);var pf=a`<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>`,hf=a`<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>`,mf={packages:{title:"Show packages",icon:pf,view:"packages"},repositories:{title:"Show repositories",icon:hf,view:"repositories"}},Fs=class extends D{static properties={kind:{type:String},count:{type:Number}};createRenderRoot(){return this}constructor(){super(),this.kind="",this.count=0}render(){if(this.count===0)return m;let e=Se("sidebar-view-button",mf,this.kind);if(!e)return m;let t=l.currentView===e.view;return a`<button type="button" class="${I({"sidebar-view-btn":!0,active:t})}" aria-label="${e.title}">${e.icon}<span class="view-btn-count">${this.count}</span></button>`}};customElements.define("sidebar-view-button",Fs);var ff=["invalid","deleted"],gf={package:{stateKey:"packageSlideTriage"},repository:{stateKey:"repositorySlideTriage"}},Ds=class extends D{static properties={counts:{attribute:!1},kind:{type:String}};createRenderRoot(){return this}constructor(){super(),this.counts={},this.kind=""}connectedCallback(){super.connectedCallback(),W(this,{role:"group","aria-label":"Triage view"})}render(){let e=Se("slide-triage-tabs",gf,this.kind);if(!e)return m;let t=l[e.stateKey],r=ff.filter(n=>(this.counts[n]??0)>0||t===n);return r.length===0?m:a`${r.map(n=>{let s=t===n,o=this.counts[n]??0;return a`<button type="button" class="${I({"triage-state-btn":!0,[`triage-state-${n}`]:!0,active:s})}" aria-pressed="${String(s)}" @click="${()=>this._toggle(n)}">${n.charAt(0).toUpperCase()+n.slice(1)} (${o})</button>`})}`}_toggle(e){this.dispatchEvent(new CustomEvent("slide-triage-toggle",{detail:{kind:this.kind,value:e},bubbles:!0,composed:!0}))}};customElements.define("slide-triage-tabs",Ds);var bf=[["own","Sources"],["modules","Deps"]],Os=class extends D{createRenderRoot(){return this}connectedCallback(){super.connectedCallback(),W(this,{role:"group","aria-label":"Source filter"})}render(){return a`${bf.map(([e,t])=>{let r=l.filterSources.has(e);return a`<button type="button" class="${I({"source-chip":!0,active:r})}" aria-pressed="${String(r)}" @click="${()=>this._toggle(e)}">${t}</button>`})}`}_toggle(e){this.dispatchEvent(new CustomEvent("source-toggle",{detail:{source:e},bubbles:!0,composed:!0}))}};customElements.define("source-filter",Os);var vf=a`<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>`,yf=a`<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 6h10v4"/></svg>`,_f={findings:{stateKey:"filterInclude",placeholder:"Search findings\u2026"},files:{stateKey:"filesSearch",placeholder:"Search files\u2026"}},Bs=class extends D{static properties={kind:{type:String}};createRenderRoot(){return this}constructor(){super(),this.kind=""}render(){let e=Se("toolbar-search",_f,this.kind);if(!e)return m;let t=l[e.stateKey];return a`${vf} <input type="text" aria-label="${e.placeholder}" placeholder="${e.placeholder}" .value="${j(t)}" @input="${this._onInput}"> ${this.kind==="findings"&&t?this._negateToggle():m}`}_negateToggle(){let e=l.filterIncludeNegate;return a`<button type="button" class="${I({"search-negate-btn":!0,active:e})}" data-tooltip="${e?"Negation on \u2014 click to undo":"Negate: show non-matching findings"}" aria-label="Negate search" aria-pressed="${String(e)}" @click="${this._onToggleNegate}">${yf}</button>`}_onInput=e=>{this.dispatchEvent(new CustomEvent("search-input",{detail:{kind:this.kind,value:e.target.value},bubbles:!0,composed:!0}))};_onToggleNegate=()=>{this.dispatchEvent(new CustomEvent("search-negate-toggle",{bubbles:!0,composed:!0}))}};customElements.define("toolbar-search",Bs);var Ns=class extends D{static properties={options:{attribute:!1}};createRenderRoot(){return this}constructor(){super(),this.options=[]}render(){let e=[{value:"",label:"All repositories",special:!0,reset:!0},...this.options.map(t=>({value:t??Di,label:t==null?"(no repo)":We(t),special:t==null}))];return a`<repository-selector variant="filter" label="Filter by repository" .options="${e}" .value="${l.filterRepo}" @repository-change="${t=>this.dispatchEvent(new CustomEvent("repo-change",{detail:{value:t.detail.value},bubbles:!0,composed:!0}))}"></repository-selector>`}};customElements.define("repo-filter",Ns);var cp={"":{cls:"included",label:"+ Partial",title:"Confirmed, partial and revalidation rows \u2014 click for full confirmations only"},exclude:{cls:"excluded",label:"\u2212 Partial",title:"Full confirmations only \u2014 click to show the partial ones only"},only:{cls:"only",label:"only Partial",title:"Partial confirmations only \u2014 click to show all of them again"}},zs=class extends D{static properties={options:{attribute:!1},hasPartial:{type:Boolean,attribute:"has-partial"}};createRenderRoot(){return this}constructor(){super(),this.options=[],this.hasPartial=!1}render(){return a`<select class="sort-select" aria-label="Filter by revalidation outcome" .value="${j(l.filterRevalidate)}" @change="${this._onChange}"><option value="" hidden ?selected="${l.filterRevalidate===""}"></option><option value="">Confidence</option>${this.options.map(e=>a`<option value="${e.value}" ?selected="${l.filterRevalidate===e.value}">${e.label}</option>`)}</select> ${this.hasPartial&&l.filterRevalidate==="confirmed"?this._partialChip():m}`}_partialChip(){let e=cp[l.filterPartial]??cp[""];return a`<button type="button" class="${I({"partial-cycle":!0,[e.cls]:!0})}" data-tooltip="${e.title}" @click="${this._onPartial}">${e.label}</button>`}_onPartial=()=>{let e=Ti.indexOf(l.filterPartial),t=Ti[(e+1)%Ti.length];this.dispatchEvent(new CustomEvent("partial-change",{detail:{value:t},bubbles:!0,composed:!0}))};_onChange=e=>{let{value:t}=e.target;t||(e.target.selectedIndex=0),this.dispatchEvent(new CustomEvent("revalidate-change",{detail:{value:t},bubbles:!0,composed:!0}))}};customElements.define("revalidate-filter",zs);var dp=[["none","none","unmarked"],["red","r","red"],["blue","b","blue"],["green","g","green"],["gray","x","gray"]],qs=class extends D{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(),W(this,{role:"group","aria-label":"Filter by mark color"})}render(){let e=this.kind==="graph"?new Set(this.selected):l.filterColors;return dp.some(([r])=>(this.counts[r]??0)||e.has(r))?a`${dp.map(([r,n,s])=>{let o=this.counts[r]??0,c=e.has(r);return a`<button type="button" class="${c?"active":""}" aria-label="${`${s} (${o})`}" aria-pressed="${String(c)}" @click="${()=>this._toggle(r)}"><span class="${`td ${n}`}"></span><span class="count">${o}</span></button>`})}`:m}_toggle(e){this.dispatchEvent(new CustomEvent("color-toggle",{detail:{color:e,kind:this.kind},bubbles:!0,composed:!0}))}};customElements.define("triage-filter",qs);var wf=["inprogress","fixed","invalid","deleted","ignored"],Hs={graph:"graph2-triage-selector",packages:"packages-triage-selector"},kf={inprogress:"In progress"},$f=i=>kf[i]??i.charAt(0).toUpperCase()+i.slice(1),Us=class extends D{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(),W(this,{role:"group","aria-label":"Triage view"})}render(){let e=this.states??wf,t=e.reduce((s,o)=>s+(this.counts[o]??0),0),r=this.variant?Hs[this.variant]:null;this.variant&&r===void 0&&console.warn(`<triage-selector>: unknown variant ${JSON.stringify(this.variant)}; expected one of ${Object.keys(Hs).map(s=>JSON.stringify(s)).join(", ")} or "".`);for(let s of Object.values(Hs))this.classList.toggle(s,s===r);let n=t===0&&!l.shownTriage;return this.classList.toggle("is-empty",n),n?m:a`${e.map(s=>{let o=this.counts[s]??0,c=l.shownTriage===s;if(o===0&&!c)return m;let u=$f(s);return a`<button type="button" class="${I({"triage-state-btn":!0,[`triage-state-${s}`]:!0,active:c})}" data-triage-show="${s}" aria-pressed="${String(c)}"><span>${u}</span><span class="n">${o}</span></button>`})}`}};customElements.define("triage-selector",Us);var xf={table:a`<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:a`<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:a`<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:a`<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:a`<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:a`${J(Xo)}`},Sf={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)"},js=["kanban","focus","table","list","grouped","graph"],Vs=class extends D{static properties={modes:{type:String},kind:{type:String}};createRenderRoot(){return this}constructor(){super(),this.modes=js.join(","),this.kind="findings"}connectedCallback(){super.connectedCallback(),W(this,{role:"group","aria-label":"View mode"})}render(){let e=this.kind==="files"?l.filesViewMode:l.viewMode,t=this.modes.split(",").map(n=>n.trim()).filter(n=>js.includes(n)),r=t.length>0?t:js;return a`${r.map(n=>a`<button type="button" class="${I({"view-mode-btn":!0,active:e===n})}" aria-label="${Sf[n]}" aria-pressed="${String(e===n)}" @click="${()=>this._select(n,e)}">${xf[n]}</button>`)}`}_select(e,t){e!==t&&this.dispatchEvent(new CustomEvent("view-mode-change",{detail:{mode:e,kind:this.kind},bubbles:!0,composed:!0}))}};customElements.define("view-mode-buttons",Vs);var up=i=>{let e=i.lastIndexOf(".");return e>0?i.slice(e).toLowerCase():""};function pp(i,e=""){let t=i.map(s=>s.split("/")),r=[];for(;;){let s=r.length,o=new Set;for(let c of t)c.length>s+1&&r.every((u,d)=>c[d]===u)&&o.add(c[s]);if(o.size!==1)break;r.push(o.values().next().value)}let n=t.map(s=>{let o=0;for(;o<r.length&&s.length>o+1;)o++;let c=e+s.slice(0,o).map(u=>`${u}/`).join("");return s.length>o+1?`${c}${s[o]}/`:`${c}*`});if(new Set(n).size>1){let s=new Map;n.forEach((c,u)=>{if(!c.endsWith("*"))return;let d=s.get(c)??new Set;d.add(up(t[u].at(-1))),s.set(c,d)});let o=c=>{let u=s.get(c);return u?.size===1&&!u.has("")?`${c}${[...u][0]}`:c};return new Map(i.map((c,u)=>[c,o(n[u])]))}return new Map(i.map((s,o)=>{let c=up(t[o].at(-1));return[s,c?`*${c}`:"No extension"]}))}var bp=6,hp=14,yr=2,mp=24,ri=4,Cf=1.5,_r=new Map,wr=new Map,fp="treemap",gp=!1;function Ef(i){let e=/^#?([0-9a-f]{6})$/iu.exec(i);if(!e)return"#fff";let t=parseInt(e[1],16),r=t>>16&255,n=t>>8&255,s=t&255;return(.2126*r+.7152*n+.0722*s)/255>.6?"#1a1a1a":"#fff"}function Tf(i,e,t,r){let n=t*t,s=r*r;return Math.max(s*i/n,n/(s*e))}function vp(i,e){let t=[],r=i.filter(h=>h.value>0),{x:n,y:s,w:o,h:c}=e;if(r.length===0||o<=0||c<=0)return t;let u=0;for(let h of r)u+=h.value;let d=o*c/u,p=0;for(;p<r.length&&o>.5&&c>.5;){let h=Math.min(o,c),f=p,b=0,v=0,g=1/0,y=1/0;for(;f<r.length;){let _=r[f].value*d,x=_>v?_:v,S=_<g?_:g,T=Tf(x,S,b+_,h);if(f===p||T<=y)y=T,b+=_,v=x,g=S,f++;else break}let k=b/h;if(o>=c){let _=s;for(let x=p;x<f;x++){let S=x===f-1?s+c-_:r[x].value*d/k;t.push({node:r[x],x:n,y:_,w:k,h:S}),_+=S}n+=k,o-=k}else{let _=n;for(let x=p;x<f;x++){let S=x===f-1?n+o-_:r[x].value*d/k;t.push({node:r[x],x:_,y:s,w:S,h:k}),_+=S}s+=k,c-=k}p=f}return t}function yp(i){for(;i.children&&i.children.size===1;){let e=i.children.values().next().value;if(e.isFile)break;i.name=`${i.name}/${e.name}`,i.children=e.children}if(i.children)for(let e of i.children.values())yp(e)}function _p(i,e,t,r){if(i.path=i.name?e?`${e}/${i.name}`:i.name:e,i.parent=t,i.isFile)return i.count=1,i.value;r.set(i.path,i);let n=0,s=0,o,c;for(let u of i.children.values())n+=_p(u,i.path,i,r),s+=u.count,c===void 0?c=u.pkg:c!==u.pkg&&(c=null),o===void 0?o=u.group:o!==u.group&&(o=null);return i.value=n,i.count=s,i.pkg=c??null,i.group=o??null,n}function Rf(i,e,t,r){let n=new Set(i).size===1?pp(e,t):new Map,s=new Map;return e.forEach((o,c)=>{n.has(o)&&s.set(n.get(o),(s.get(n.get(o))??0)+Math.max(r[c]??0,0))}),{groups:n,ranks:new Map([...s].toSorted((o,c)=>c[1]-o[1]||o[0].localeCompare(c[0])).map(([o],c)=>[o,c]))}}function wp(i,e,t,r,n,s,o){if(r<ri||n<ri)return;if(i.isFile){o.push({kind:"file",node:i,x:e,y:t,w:r,h:n});return}if(!(s<bp&&r>=mp&&n>=mp&&i.children.size>0)){o.push({kind:"agg",node:i,x:e,y:t,w:r,h:n});return}o.push({kind:"dir",node:i,x:e,y:t,w:r,h:n});let u=n>=hp+ri+yr?hp:0,d=e+yr,p=t+u,h=r-yr*2,f=n-u-yr;if(h<ri||f<ri)return;let b=[...i.children.values()].toSorted((v,g)=>g.value-v.value);for(let v of vp(b,{x:d,y:p,w:h,h:f}))wp(v.node,v.x,v.y,v.w,v.h,s+1,o)}function Ks(i,e){let t=i/(e||1)*100;return t>=10?t.toFixed(0):t.toFixed(t>=1?1:2)}function kp(i,e){if(e<=0||i.isFile||!i.children||i.children.size===0)return 0;let t=1;for(let r of i.children.values()){if(t>=e)break;let n=1+kp(r,e-1);n>t&&(t=n)}return t}function Lf(i,e,t,r,n,s){let o=Math.min(s-n,Math.PI*2-1e-4),c=n+o,u=o>Math.PI?1:0,d=Math.cos(n),p=Math.sin(n),h=Math.cos(c),f=Math.sin(c),b=v=>v.toFixed(2);return`M${b(i+r*d)} ${b(e+r*p)}A${b(r)} ${b(r)} 0 ${u} 1 ${b(i+r*h)} ${b(e+r*f)}L${b(i+t*h)} ${b(e+t*f)}A${b(t)} ${b(t)} 0 ${u} 0 ${b(i+t*d)} ${b(e+t*p)}Z`}function Mf(i,e){let t=Math.max(4,Math.floor(e/6.4));return i.length>t?`${i.slice(0,t-1)}\u2026`:i}var Gs=class extends U{static properties={details:{attribute:!1},_w:{state:!0},_h:{state:!0},_focus:{state:!0},_mode:{state:!0},_reason:{state:!0},_codeOnly:{state:!0}};createRenderRoot(){return this}constructor(){super(),this.details=null,this._w=0,this._h=0,this._root=null,this._focus=[],this._mode=fp,this._reason="",this._codeOnly=gp,this._hasResources=!1,this._reasons=new Map,this._dirByPath=new Map,this._status="loading",this._meta={total:0,prefix:""},this._ro=null,this._plot=null,this._tooltip=null,this._ttCell=null}willUpdate(e){e.has("details")&&(this._reason=wr.get(this.details?.integrity)??""),(e.has("details")||e.has("_reason")||e.has("_codeOnly"))&&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(e=>{let t=e[0]?.contentRect;if(!t)return;let r=Math.floor(t.width),n=Math.floor(t.height);(r!==this._w||n!==this._h)&&(this._w=r,this._h=n)}),this._ro.observe(this._plot))}disconnectedCallback(){super.disconnectedCallback(),this._ro&&(this._ro.disconnect(),this._ro=null)}_onPointerMove(e){let t=e.target.closest(".bundle-treemap-node");if(!t||!this._tooltip){this._hideTooltip();return}if(t!==this._ttCell){this._ttCell=t;let r=t.dataset;Wo(a`<div class="bundle-treemap-tt-path">${r.ttPath}</div>${r.ttPkg?a`<div class="bundle-treemap-tt-head"><span class="bundle-treemap-tt-dot" style="${`background:${r.ttColor}`}"></span> <span class="bundle-treemap-tt-pkg">${r.ttPkg}</span></div>`:""}<div class="bundle-treemap-tt-meta">${r.ttMeta}</div>`,this._tooltip)}this._positionTooltip(e.clientX,e.clientY)}_onPointerLeave(){this._hideTooltip()}_positionTooltip(e,t){let r=this._tooltip;if(!r||!this._plot)return;r.classList.add("show");let n=this._plot.getBoundingClientRect(),s=e-n.left,o=t-n.top,c=12,u=s+c;u+r.offsetWidth>n.width-4&&(u=s-r.offsetWidth-c),u<4&&(u=4);let d=o+c;d+r.offsetHeight>n.height-4&&(d=o-r.offsetHeight-c),d<4&&(d=4),r.style.left=`${u}px`,r.style.top=`${d}px`}_hideTooltip(){this._ttCell=null,this._tooltip&&this._tooltip.classList.remove("show")}_rebuild(){if(this._root=null,this._focus=[],this._dirByPath=new Map,this._reasons=new Map,this._hasResources=!1,this._meta={total:0,prefix:""},this._hideTooltip(),!this.details){this._status="loading";return}let e=_a(this.details),t=[...e.keys()].filter(y=>e.get(y)!==null);if(t.length===0){this._status="empty";return}this._reasons=ka(this.details,t),this._reasons.has(this._reason)||(this._reason="",wr.delete(this.details.integrity));let r=this._reasons.get(this._reason),n=Nt(this.details),s=wa(this.details);this._hasResources=t.some(y=>s.get(y)==="resource"&&e.get(y)>0);let o=this._codeOnly&&this._hasResources,{prefix:c,stripped:u}=ft(t),d=t.map(y=>pt(y,{packageDir:n?.get(y)})),{groups:p,ranks:h}=Rf(d,u,c,t.map(y=>e.get(y))),f={name:"",children:new Map,value:0,isFile:!1},b=0;for(let y=0;y<t.length;y++){if(r&&!r.has(t[y])||o&&s.get(t[y])==="resource")continue;let k=e.get(t[y]);if(k<=0)continue;let _=u[y].split("/"),x=f,S=!1;for(let O=0;O<_.length-1;O++){let A=x.children.get(_[O]);if(A&&A.isFile){S=!0;break}A||(A={name:_[O],children:new Map,value:0,isFile:!1},x.children.set(_[O],A)),x=A}if(S)continue;let T=_.at(-1),F=x.children.get(T);F&&!F.isFile||(F||(F={name:T,isFile:!0,value:0,origPath:t[y],pkg:d[y],group:p.get(u[y])??null,resource:s.get(t[y])==="resource"},x.children.set(T,F)),F.value+=k,b+=k)}if(b===0){this._status="empty";return}for(let y of f.children.values())yp(y);let v=new Map;_p(f,"",null,v),this._groupRanks=h,this._root=f,this._dirByPath=v,this._meta={total:b,prefix:c},this._status="ok";let g=this.details?.integrity?_r.get(this.details.integrity):null;if(g){let y=v.get(g);y?this._focus=this._chainTo(y):_r.delete(this.details.integrity)}}get _focusNode(){return this._focus.length>0?this._focus.at(-1):this._root}_chainTo(e){let t=[];for(let r=e;r&&r!==this._root;r=r.parent)t.push(r);return t.reverse(),t}_rememberFocus(){let e=this.details?.integrity;if(!e)return;let t=this._focus.at(-1)?.path;t?_r.set(e,t):_r.delete(e)}_drillInto(e){!e||e.isFile||!e.children||e.children.size===0||(this._focus=this._chainTo(e),this._rememberFocus(),this._hideTooltip())}_focusTo(e){let t=e<0?[]:this._focus.slice(0,e+1);t.length!==this._focus.length&&(this._focus=t,this._rememberFocus(),this._hideTooltip())}_toggleMode(){this._mode=this._mode==="sunburst"?"treemap":"sunburst",fp=this._mode,this._hideTooltip()}_toggleCode(){this._codeOnly=!this._codeOnly,gp=this._codeOnly}_changeReason(e){this._reason=e.detail.value.replace(/^reason:/u,"");let t=this.details?.integrity;t&&(this._reason?wr.set(t,this._reason):wr.delete(t))}_onPlotClick(e){let t=e.target.closest("[data-treemap-into]");if(!t)return;let r=this._dirByPath.get(t.dataset.treemapInto);r&&this._drillInto(r)}_renderCrumbs(){let e=this._focus,t=e.length===0,r=e.slice(0,-1),n=t?null:e.at(-1);return a`<nav class="bundle-treemap-crumbs" aria-label="Treemap location"><span class="bundle-treemap-crumbs-lead"><button type="button" class="${I({"bundle-treemap-crumb-home":!0,"at-root":t})}" @click="${()=>this._focusTo(-1)}">Source ${this._mode==="sunburst"?"sunburst":"treemap"}</button> ${r.map((s,o)=>a`<span class="bundle-treemap-crumb-sep" aria-hidden="true">›</span><button type="button" class="bundle-treemap-crumb" @click="${()=>this._focusTo(o)}" data-tooltip-truncated data-tooltip="${s.path}">${s.name}</button>`)} </span>${n?a`<span class="bundle-treemap-crumb-sep" aria-hidden="true">›</span><span class="bundle-treemap-crumb-current" aria-current="location" data-tooltip-truncated data-tooltip="${n.path}">${n.name}</span>`:""}</nav>`}_paint(e){if(this._groupRanks?.size>0)return e.group==null?{color:za(),label:null,named:!1}:{color:Na(this._groupRanks.get(e.group)??0),label:e.group,named:!0};let t=e.pkg??pt(e.path);return{color:Mi(t),label:Ke(t),named:e.pkg!=null}}_cell(e){let t=Ks(e.node.value,this._meta.total),r={left:`${e.x}px`,top:`${e.y}px`,width:`${e.w}px`,height:`${e.h}px`},n=`${e.node.count} ${e.node.count===1?"file":"files"}`;if(e.kind==="dir")return a`<div class="bundle-treemap-node bundle-treemap-dir" style="${_e(r)}" data-treemap-into="${e.node.path}" data-tt-path="${`${e.node.path}/`}" data-tt-meta="${`${G(e.node.value)} \xB7 ${n} \xB7 ${t}%`}"><span class="bundle-treemap-dirname">${e.node.name}</span></div>`;let{color:s,label:o}=this._paint(e.node),c=_e({...r,background:s,color:Ef(s)}),u=o??m;return e.kind==="agg"?a`<div class="bundle-treemap-node bundle-treemap-leaf bundle-treemap-agg" style="${c}" data-treemap-into="${e.node.path}" data-tt-path="${`${e.node.path}/`}" data-tt-pkg="${u}" data-tt-color="${s}" data-tt-meta="${`${G(e.node.value)} \xB7 ${n} \xB7 ${t}%`}"><span class="bundle-treemap-label">${e.node.name}/</span></div>`:a`<div class="bundle-treemap-node bundle-treemap-leaf bundle-treemap-file" style="${c}" data-bundle-view-source="${e.node.resource?m:e.node.origPath}" data-tt-path="${e.node.path}" data-tt-pkg="${u}" data-tt-color="${s}" data-tt-meta="${`${G(e.node.value)} \xB7 ${t}% of bundle`}"><span class="bundle-treemap-label">${e.node.name}</span></div>`}_arc(e,t,r){let n=Ks(e.value,r),{color:s,label:o,named:c}=this._paint(e),u=o??m;if(e.isFile)return ye`<path
50
+ class="bundle-treemap-node bundle-treemap-arc"
51
+ d=${t}
52
+ fill=${s}
53
+ data-bundle-view-source=${e.resource?m:e.origPath}
54
+ data-tt-path=${e.path}
55
+ data-tt-pkg=${u}
56
+ data-tt-color=${s}
57
+ data-tt-meta=${`${G(e.value)} \xB7 ${n}% of bundle`}
58
+ ></path>`;let d=`${e.count} ${e.count===1?"file":"files"}`;return ye`<path
59
+ class="bundle-treemap-node bundle-treemap-arc"
60
+ d=${t}
61
+ fill=${s}
62
+ data-treemap-into=${e.path}
63
+ data-tt-path=${`${e.path}/`}
64
+ data-tt-pkg=${c?u:m}
65
+ data-tt-color=${c?s:m}
66
+ data-tt-meta=${`${G(e.value)} \xB7 ${d} \xB7 ${n}%`}
67
+ ></path>`}_renderSunburst(e){let t=this._w,r=this._h,n=t/2,s=r/2,o=Math.min(t,r)/2-6;if(o<30)return m;let c=kp(e,bp),u=Math.min(Math.max(o*.18,26),o*.45),d=(o-u)/c,p=this._meta.total||1,h=[],f=(k,_,x,S)=>{let T=[...k.children.values()].toSorted((A,z)=>z.value-A.value),F=x-_,O=_;for(let A of T){let z=F*(A.value/k.value),Z=u+(S-1)*d,re=Z+d;z*re>=Cf&&(h.push(this._arc(A,Lf(n,s,Z,re,O,O+z),p)),!A.isFile&&S<c&&A.children.size>0&&f(A,O,O+z,S+1)),O+=z}};f(e,-Math.PI/2,Math.PI*1.5,1);let b=this._focus.length>0,v=Math.max(u-4,10),g=b?ye`<circle
68
+ class="bundle-treemap-node bundle-treemap-center"
69
+ cx=${n} cy=${s} r=${v}
70
+ data-treemap-into=${e.parent.path}
71
+ data-tt-path=${`${e.path}/`}
72
+ data-tt-meta=${`${G(e.value)} \xB7 ${e.count} ${e.count===1?"file":"files"} \xB7 ${Ks(e.value,p)}%`}
73
+ ></circle>`:ye`<circle class="bundle-treemap-center" cx=${n} cy=${s} r=${v}></circle>`,y=ye`<text class="bundle-treemap-center-label" x=${n} y=${s} text-anchor="middle">
74
+ ${b?ye`<tspan x=${n} dy="-0.3em">${Mf(e.name,v*2-12)}</tspan><tspan class="bundle-treemap-center-sub" x=${n} dy="1.5em">${G(e.value)}</tspan>`:ye`<tspan x=${n} dy="0.35em">${G(e.value)}</tspan>`}
75
+ </text>`;return a`<svg class="bundle-treemap-sunburst" width="${t}" height="${r}" viewBox="${`0 0 ${t} ${r}`}">${h}${g}${y}</svg>`}render(){let e=this._focusNode,t=this._mode==="sunburst",r=this._status==="ok"&&e&&e.children&&this._w>0&&this._h>0,n=[];if(r&&!t){let u=[...e.children.values()].toSorted((d,p)=>p.value-d.value);for(let d of vp(u,{x:0,y:0,w:this._w,h:this._h}))wp(d.node,d.x,d.y,d.w,d.h,1,n)}let{prefix:s}=this._meta,o=e?e.count:0,c=e?e.value:0;return a`<header class="bundle-treemap-head">${this._renderCrumbs()} <span class="bundle-treemap-head-right"><span class="bundle-treemap-sub">${o} ${o===1?"file":"files"} · ${G(c)}${s?a`· <span class="mono">${s}</span>`:""}</span> ${this._reasons.size>0?a`<bundle-scope-selector compact="compact" .reasons="${[...this._reasons.keys()].map(u=>({id:`reason:${u}`,label:u}))}" .value="${this._reason?`reason:${this._reason}`:""}" label="Filter files" @scope-change="${this._changeReason}"></bundle-scope-selector>`:m} ${this._hasResources?a`<mode-switch compact="compact" label="Code" .checked="${this._codeOnly}" accessible-label="Show code only, without resources" @click="${this._toggleCode}"></mode-switch>`:m}<mode-switch compact="compact" label="Sunburst" .checked="${t}" accessible-label="Toggle sunburst view" @click="${this._toggleMode}"></mode-switch></span></header><div class="bundle-treemap-plot" @click="${this._onPlotClick}" @pointermove="${this._onPointerMove}" @pointerleave="${this._onPointerLeave}">${this._status==="loading"?a`<div class="bundle-treemap-empty">Loading…</div>`:this._status==="empty"?a`<div class="bundle-treemap-empty">${this._codeOnly&&this._hasResources?"No code here, only resources.":"This bundle doesn't carry any source content."}</div>`:t?r?this._renderSunburst(e):m:n.map(u=>this._cell(u))}<div class="bundle-treemap-tooltip"></div></div>`}};customElements.define("bundle-treemap",Gs);function Ws(i){return i===0?"\xB10":`${i>0?"+":"\u2212"}${Math.abs(i).toLocaleString()}`}function Ys(i){return i===0?"\xB10 B":`${i>0?"+":"\u2212"}${G(Math.abs(i))}`}function Rt(i){return i>0?"up":i<0?"down":""}function Pf(i,e){if(!e)return"";let t=i/e*100;return`${t>0?"+":t<0?"\u2212":"\xB1"}${Math.abs(t).toFixed(1)}%`}function $p(i){let e=i.totals,t=i.versionUpdates?.totals??{baseDeps:0,otherDeps:0},r=t.baseDeps>0||t.otherDeps>0,n=t.otherDeps-t.baseDeps,s=Pf(e.byteDelta,e.baseBytes);return a`<div class="bundle-compare-stats">${r?a`<div class="bundle-compare-metric"><span class="bundle-compare-metric-label">Deps</span> <span class="bundle-compare-metric-value">${t.baseDeps.toLocaleString()} → ${t.otherDeps.toLocaleString()}</span> <span class="${`bundle-compare-metric-delta ${Rt(n)}`}">${Ws(n)}</span></div>`:m}<div class="bundle-compare-metric"><span class="bundle-compare-metric-label">Size</span> <span class="bundle-compare-metric-value">${G(e.baseBytes)} → ${G(e.otherBytes)}</span> <span class="${`bundle-compare-metric-delta ${Rt(e.byteDelta)}`}">${Ys(e.byteDelta)}${s?a`${" "}<span class="bundle-compare-pct">(${s})</span>`:m}</span></div>${e.baseLines>0||e.otherLines>0?a`<div class="bundle-compare-metric"><span class="bundle-compare-metric-label">LoC</span> <span class="bundle-compare-metric-value">${e.baseLines.toLocaleString()} → ${e.otherLines.toLocaleString()}</span> <span class="${`bundle-compare-metric-delta ${Rt(e.otherLines-e.baseLines)}`}">${Ws(e.otherLines-e.baseLines)}</span></div>`:m}<div class="bundle-compare-files"><div class="bundle-compare-metric"><span class="bundle-compare-metric-label">Files</span> <span class="bundle-compare-metric-value">${e.baseFiles.toLocaleString()} → ${e.otherFiles.toLocaleString()}</span> <span class="${`bundle-compare-metric-delta ${Rt(e.fileDelta)}`}">${Ws(e.fileDelta)}</span></div><div class="bundle-compare-chips">${e.onlyBaseFiles>0?a`<span class="bundle-compare-chip removed">−${e.onlyBaseFiles.toLocaleString()} removed</span>`:m} ${e.onlyOtherFiles>0?a`<span class="bundle-compare-chip added">+${e.onlyOtherFiles.toLocaleString()} added</span>`:m} ${e.changedFiles>0?a`<span class="bundle-compare-chip changed">${e.changedFiles.toLocaleString()} changed${e.renamedFiles>0?` (${e.renamedFiles.toLocaleString()} renamed)`:""}</span>`:m} <span class="bundle-compare-chip unchanged">${e.unchangedFiles.toLocaleString()} unchanged</span> ${i.resolutions?.totalChanges>0?a`<span class="bundle-compare-chip changed">${i.resolutions.totalChanges.toLocaleString()} repointed ${i.resolutions.totalChanges===1?"resolution":"resolutions"}</span>`:m}</div></div></div>`}var Af=24;function Ne(i,e=t=>t.id){return i.map(t=>({id:e(t),integrity:e(t),kind:t.format,format:t.format,detail:t.detail,...t.date&&{date:t.date},...t.dateWarning&&{dateWarning:t.dateWarning},filename:t.name,displayLabel:t.displayLabel,size:"\u2014",summary:null}))}function If(i){if(!i)return m;let e=({name:r="",detail:n=""}={})=>r.length+Math.min(n.length,Af)*.87+1,t=(i.choices??[]).reduce((r,n)=>Math.max(r,e(n)),Math.max(`Choose a ${i.noun??"bundle"}\u2026`.length,e(i.widest)));return`--compare-select-chars: ${Math.ceil(t)}`}function kr({source:i,label:e="Compare",from:t,to:r,clear:n,swap:s,extras:o=m,comparison:c=null,disabled:u=!1,openLine:d}){let p=i?.noun??"bundle",h=`${p[0].toUpperCase()}${p.slice(1)}`,f=(b,v)=>a`<bundle-selector .bundles="${b.options}" .value="${b.value}" .noun="${p}" .versions="${!!i}" label="${b.label??v}" placeholder="${b.placeholder??`Choose a ${p}\u2026`}" ?disabled="${u}" @bundle-change="${g=>{g.stopPropagation(),b.pick(g.detail.value)}}"></bundle-selector>`;return a`<div class="${i?"bundle-compare-picker is-versions":"bundle-compare-picker"}" style="${If(i)}" @compare-open-line="${b=>d?.(b.detail)}"><div class="bundle-compare-select-wrap"><span class="bundle-compare-select-hint">${e}</span> ${f(t,`${h} to compare with`)} ${n?a`<button type="button" class="bundle-compare-clear" aria-label="${n.label??"Clear comparison"}" ?disabled="${u}" @click="${n.run}">×</button>`:m}</div><span class="bundle-compare-arrow" aria-hidden="true">→</span><div class="bundle-compare-select-wrap">${f(r,`${h} to compare`)} ${s?a`<button type="button" class="bundle-compare-swap" ?disabled="${u}" @click="${s}" aria-label="${`Swap the two ${p}s`}"><span class="bundle-compare-swap-icon" aria-hidden="true">↔</span>Swap</button>`:m}</div>${o}${c?i?.badges?.(c.base,c.other,c.files)??m:m}</div>`}function $r(i,e=m){return a`<div class="bundle-compare-summary">${$p(i)}${e}</div>`}function xr(i,e=m){return a`<header class="bundle-compare-head">${i}${e}</header>`}function Sr(i,e,t=null){let[r,n]=[i,e],s=kn(r,t),o=kn(n,t),c=Jc(s.keys(),o.keys()),u=Qc(Nt(r),Nt(n),c),p=ed(s,o,k=>pt(k,{packageDir:u?.get(k)}),c,[xn(r),xn(n)]),h=rn(r),f=rn(n),b=(k,_)=>{let x=0;for(let S of _)x+=k.get(S)??0;return x};Object.assign(p.totals,{baseLines:b(h,s.keys()),otherLines:b(f,o.keys())});for(let k of p.files.onlyBase)k.lines=h.get(k.basePath??k.path)??0;for(let k of p.files.onlyOther)k.lines=f.get(k.path)??0;for(let k of p.files.changed)Object.assign(k,{baseLines:h.get(k.basePath??k.path)??0,otherLines:f.get(k.path)??0});p.resolutions=Zc($n(r,t),$n(n,t),new Map(p.files.changed.filter(k=>k.renamedFrom!=null).map(k=>[k.basePath,k.path])),p.files.basePaths,p.files.root);let v=k=>pt("",{packageDir:k}),g=tn(r,t?s.keys():null,v),y=tn(n,t?o.keys():null,v);return p.versionUpdates=id(g,y),p.packageRows=td(p.packages,g,y),p.scope=t??"",p}function Cr(i,e){let{head:t,from:r,to:n,tail:s}=Yi(i,e);return a`${t}{<span class="bundle-compare-rename-from">${r}</span> → <span class="bundle-compare-rename-to">${n}</span>}${s}`}function Er({from:i,to:e}){return a`<span class="bundle-compare-rename-from">${i}</span> → <span class="bundle-compare-rename-to">${e}</span>`}function Tr(i){let e=new Map;if(!i)return e;for(let t of i.onlyBase)e.set(t.path,{kind:"removed",basePath:t.basePath,baseBytes:t.bytes,otherBytes:null});for(let t of i.onlyOther)e.set(t.path,{kind:"added",baseBytes:null,otherBytes:t.bytes});for(let t of i.changed){let r={...t.meta?{meta:t.meta}:{}};e.set(t.path,t.renamedFrom==null?{kind:"changed",basePath:t.basePath,baseBytes:t.baseBytes,otherBytes:t.otherBytes,...t.modified===!1?{modified:!1}:{},...r}:{kind:"renamed",basePath:t.basePath,renamedFrom:t.renamedFrom,modified:t.modified,baseBytes:t.baseBytes,otherBytes:t.otherBytes,...r})}return e}function ce(i,e,t,{kind:r,basePath:n=t}){let s=r==="added"?"":K(i).get(n),o=r==="removed"?"":K(e).get(t);return r==="repointed"&&(s=o=o??s),{before:s,after:o}}function Js(i,e,t,r=[]){let n=Tr(t);if(!t)return n;for(let s of r){if(!n.has(s.parent)){let c=Re(K(e).get(s.parent)??K(i).get(s.parent));n.set(s.parent,{kind:"repointed",baseBytes:c,otherBytes:c})}let o=n.get(s.parent);o.repointed=[...o.repointed??[],s]}return n}function xp(i,e,t){return[...Js(i,e,t.files,t.resolutions?.changed)].map(([r,n])=>({path:r,...n,...ce(i,e,r,n)}))}function Sp(i,{maxBytes:e,maxLines:t}){let r=0,n=0;for(let{before:s,after:o}of i)for(let c of[s,o])if(r+=Re(c)??0,r>=e||(typeof c=="string"&&c!==""&&(n+=(c.match(/\n/gu)?.length??0)+ +!c.endsWith(`
76
+ `)),n>=t))return!1;return!0}function Q(i){if(i==="")return[];let e=i.split(`
77
+ `);return e.at(-1)===""&&e.pop(),e}var Cp=i=>i===""||i.endsWith(`
78
+ `),Ep=i=>i.replace(/[ \t\n\v\f\r]+$/u,"").replaceAll(/[ \t\n\v\f\r]+/gu," ");function Ce(i,e,t=!1){let r=Ua(i,e,{format:"unified",context:0,whitespace:t?"change":"none"});return r?(Ha(r)[0]?.blocks??[]).map(({a0:n,a1:s,b0:o,b1:c})=>({a0:n,a1:s,b0:o,b1:c})):[]}function Tp(i,e,t,r=!1){if(!Array.isArray(t))return!1;let n=Q(i),s=Q(e),o=r?(d,p)=>Ep(d)===Ep(p):(d,p)=>d===p,c=0,u=0;for(let d of[...t,{a0:n.length,a1:n.length,b0:s.length,b1:s.length,last:!0}]){let{a0:p,a1:h,b0:f,b1:b}=d??{};if(![p,h,f,b].every(Number.isInteger)||p<c||f<u||h<p||b<f||h>n.length||b>s.length||!d.last&&h===p&&b===f||p-c!==f-u||d.last&&p>c&&!r&&Cp(i)!==Cp(e))return!1;for(;c<p;c++,u++)if(!o(n[c],s[u]))return!1;c=h,u=b}return!0}var Ff=3,ze=20,Df=4;function Lr(i,e,{ignoreWhitespace:t=!1,changes:r=null,marks:n=null}={}){let s=Q(i),o=Q(e),c=r?.blocks??Ce(i,e,t),u={a:i!==""&&!i.endsWith(`
79
+ `),b:e!==""&&!e.endsWith(`
80
+ `)};return{a:s,b:o,blocks:c,...Xs(c,n),noEol:u,words:new Map}}function Xs(i,e){let t=new Set((e??[]).map(({a0:c,a1:u,b0:d,b1:p})=>`${c},${u},${d},${p}`)),r=new Set,n=0,s=0,o=0;return i.forEach(({a0:c,a1:u,b0:d,b1:p},h)=>{t.has(`${c},${u},${d},${p}`)&&u-c===p-d?(r.add(h),o+=p-d):(n+=p-d,s+=u-c)}),{additions:n,deletions:s,renamed:o,marked:r}}var Of=2e6,Bf=2e4,Rr=i=>{let e=+(i!==""&&!i.endsWith(`
81
+ `));for(let t=i.indexOf(`
82
+ `);t!==-1;t=i.indexOf(`
83
+ `,t+1))e++;return e};function Rp(i,e){if(typeof i!="string"||typeof e!="string")return null;if(i===e)return{additions:0,deletions:0};if(i==="")return{additions:Rr(e),deletions:0};if(e==="")return{additions:0,deletions:Rr(i)};if(i.length+e.length>Of||Rr(i)+Rr(e)>Bf)return null;let t=0,r=0;for(let{a0:n,a1:s,b0:o,b1:c}of Ce(i,e))t+=c-o,r+=s-n;return{additions:t,deletions:r}}var Qs=(i,e,t=Ce(i,e,!0))=>!Tp(i,e,t);function Lp(i,e){let t=Ce(i,e,!0);return{hides:Qs(i,e,t),mixed:Jt(i,e,t)}}var Nf=new Set(["module","commonjs","module-typescript","commonjs-typescript","json","solidity","php","shell","rust","java","kotlin","gradle","objc","objcpp","swift","c","cpp","c-header","cpp-header","xml","cmake","pbxproj"]),zf=/\.(?:[cm]?js|jsx|[cm]?ts|tsx|json5?|jsonc|css|scss|less|html?|xhtml|xml|svg|c|h|cc|cpp|cxx|hh|hpp|hxx|java|kts?|go|rs|cs|swift|php|sh|bash|zsh)$/u,qf=new Set(["#!/usr/bin/env node","#! /usr/bin/env node","#!/usr/bin/node","#!/usr/local/bin/node","#!/usr/bin/env nodejs","#!/usr/bin/env deno","#!/usr/bin/env bun","#!/bin/sh","#! /bin/sh","#!/bin/sh -e","#!/usr/bin/env sh","#!/bin/bash","#! /bin/bash","#!/bin/bash -e","#!/usr/bin/env bash","#!/bin/zsh","#!/usr/bin/env zsh","#!/bin/dash"]);function Zs(i,e="",t=void 0){return typeof t=="string"?Nf.has(t):zf.test(i.toLowerCase())||typeof e=="string"&&qf.has(e.split(`
84
+ `,1)[0])}function Lt(i,e=new Map,{context:t=Ff,split:r=!1}={}){let{a:n,blocks:s}=i,o=[],c=0,u=0;for(let d=0;d<=s.length;d++){let p=s[d],h=(p?p.a0:n.length)-c,f=d===0,b=d===s.length,v=e.get(d),g=f?0:t+(v?.top??0),y=b?0:t+(v?.bottom??0);if(v?.all||h-g-y<Df)for(let _=0;_<h;_++)o.push({kind:"ctx",a:c+_,b:u+_});else{for(let _=0;_<g;_++)o.push({kind:"ctx",a:c+_,b:u+_});o.push({kind:"fold",run:d,a:c+g,b:u+g,count:h-g-y,up:!b,down:!f});for(let _=h-y;_<h;_++)o.push({kind:"ctx",a:c+_,b:u+_})}if(!p)break;let k=to(i,d);if(r)for(let[_,x,S]of k)o.push({kind:"change",change:d,left:_,right:x,paired:S});else{let _=new Map,x=new Map;for(let[S,T,F]of k)F&&(_.set(S,T),x.set(T,S));for(let S=p.a0;S<p.a1;S++)o.push({kind:"del",a:S,change:d,pair:_.get(S)??null});for(let S=p.b0;S<p.b1;S++)o.push({kind:"add",b:S,change:d,pair:x.get(S)??null})}c=p.a1,u=p.b1}return o}function Hf(i,e){return eo(i.a,i.b,e)}function eo(i,e,t){let r=Yc(i.slice(t.a0,t.a1),e.slice(t.b0,t.b1)).map(([c,u])=>[t.a0+c,t.b0+u]),n=[],s=t.a0,o=t.b0;for(let[c,u]of[...r,[t.a1,t.b1]]){for(;s<c||o<u;)n.push([s<c?s++:null,o<u?o++:null,!1]);c<t.a1&&(n.push([c,u,!0]),s=c+1,o=u+1)}return n}function to(i,e){return i.aligned??=new Map,i.aligned.has(e)||i.aligned.set(e,Hf(i,i.blocks[e])),i.aligned.get(e)}function Mp(i,e,t='<mark class="diff-word">',r="</mark>"){if(!e||e.length===0)return i;let n=!1,s="",o=0,c=0,u=()=>{for(;c<e.length&&o>=e[c][1];)n&&(s+=r,n=!1),c++};for(let d=0;d<i.length;){if(u(),i[d]==="<"){let f=i.indexOf(">",d),b=f===-1?i.slice(d):i.slice(d,f+1);s+=n?r+b+t:b,d+=b.length;continue}!n&&c<e.length&&o>=e[c][0]&&(s+=t,n=!0);let p=i[d]==="&"?i.indexOf(";",d):-1,h=p===-1||p-d>10?i[d]:i.slice(d,p+1);s+=h,d+=h.length,o++}return u(),n?s+r:s}function Pp(i,e){if(!e||e.length===0)return[{text:i,marked:!1}];let t=[],r=0;for(let[n,s]of e)n>r&&t.push({text:i.slice(r,n),marked:!1}),s>n&&t.push({text:i.slice(n,s),marked:!0}),r=s;return r<i.length&&t.push({text:i.slice(r),marked:!1}),t}var io=100,Mr=20;function ni(i,e,t=Mr,r=0,n=i.length){let s=[];for(let o=r;o<Math.min(n,i.length)&&s.length<t;o++){let c=e.ranges(i[o]);c.length>0&&s.push({line:o,text:i[o],ranges:c})}return s}var Ap=(i,e,t,r)=>eo(i,e,r);function Uf(i,e,t,r,{split:n=!1,align:s=Ap}={}){return i===e?ni(Q(e),t).map(o=>({...o,side:"b",sign:" "})):i===""?ni(Q(e),t).map(o=>({...o,side:"b",sign:"+"})):e===""?ni(Q(i),t).map(o=>({...o,side:"a",sign:"\u2212"})):Ip(Q(i),Q(e),t,r,n,s)}function Ip(i,e,t,r,n,s){let o=ni(e,t);if(!r)return o.map(h=>({...h,side:"b",sign:null}));let c=(h,f)=>{let[b,v]=h==="a"?["a0","a1"]:["b0","b1"],g=r.length,y=0;for(;y<g;){let k=y+g>>1;r[k][v]<=f?y=k+1:g=k}return y<r.length&&r[y][b]<=f?r[y]:null},u=[];for(let{a0:h,a1:f}of r){if(u.length===Mr)break;u.push(...ni(i,t,Mr-u.length,h,f))}let d=new Map;if(n){let h=new Set([...o.map(({line:f})=>c("b",f)),...u.map(({line:f})=>c("a",f))]);for(let f of h)f&&s(i,e,r,f).forEach(([b,v],g)=>{b!==null&&d.set(`a${b}`,g),v!==null&&d.set(`b${v}`,g)})}let p=h=>{let f=c(h.side,h.line);return f?n?[f.b0,0,d.get(`${h.side}${h.line}`),h.side==="a"?0:1]:h.side==="a"?[f.b0,0,0,h.line]:[h.line,1,0,0]:[h.line,1,0,0]};return[...o.map(h=>({...h,side:"b",sign:c("b",h.line)?"+":" "})),...u.map(h=>({...h,side:"a",sign:"\u2212"}))].toSorted((h,f)=>{let b=p(h),v=p(f);return b[0]-v[0]||b[1]-v[1]||b[2]-v[2]||b[3]-v[3]}).slice(0,Mr)}function Fp(i,e,t,{split:r=!1,align:n=Ap}={}){let s=[],o=0,c=u=>u!==""&&e.ranges(u).length>0;for(let{path:u,before:d,after:p}of i){if(typeof d!="string"||typeof p!="string"||!c(d)&&(d===p||!c(p)))continue;let h;if(d===p||d===""||p==="")h=Uf(d,p,e,null);else{let f=Q(d),b=Q(p),v=t(u,d,p);if(v?.length===0)continue;h=Ip(f,b,e,v,r,n)}if(h.length!==0){if(s.length===io)return{files:s,hits:o,truncated:!0};s.push({path:u,hits:h}),o+=h.length}}return{files:s,hits:o,truncated:!1}}var jf=2,Vf=2,Kf=5e3,Gf=5*6e4,Wf=30,no="The server's diff doesn't match this file as shown.",si=(i,e)=>!!(i?.managedId&&e?.managedId)||!!i?.npm&&!!e?.npm&&i.npm.name===e.npm.name,so=i=>!(i>=400&&i<500&&i!==429),Ee=new Map;function Op(i,e,t){let{before:r,reason:n,reads:s,prettyHash:o,otherPrettyHash:c,ignoringWhitespace:u}=i??{},d=[i,u].map(h=>Array.isArray(h?.blocks)&&Array.isArray(h.marks)?{blocks:h.blocks,marks:h.marks}:null);if(!(i?.hash===e&&i.otherHash===t&&typeof r=="string"&&(n==null||typeof n=="string")&&Array.isArray(s)&&s.every(h=>typeof h=="string")&&d.every(Boolean)&&typeof o=="string"&&typeof c=="string"))return null;let p=d.map(h=>({status:"ready",before:r,...h,reason:n??null,reads:s}));return{status:"ready",before:r,reason:n??null,reads:s,copies:[o,c],settings:p}}var Ar=(i,e,t)=>i.fileHashes?.get(e)??yi(t),Pr=new Set;function oo(i){i&&(Pr.size===0&&setTimeout(()=>{let e=[...Pr];Pr.clear();for(let t of e)t()},Wf),Pr.add(i))}function ao(i,e,t=0){let r=Math.min(Kf*2**t,Gf);return Object.assign(e,{until:Date.now()+r,tries:t+1}),setTimeout(()=>{i.notify?.()},r)?.unref?.(),e}function Bp(){for(let[i,e]of Ee){if(Ee.size<=jf)break;e.ended&&Ee.delete(i)}}async function Yf(i,e,t,r,n){let s=null;try{let o=async({path:c,otherPath:u,hash:d,otherHash:p,status:h,message:f,...b})=>{if(typeof c!="string"||typeof u!="string")return;let v=`${c}\0${u}`,g=()=>(e.diffs.get(v)?.status??"loading")!=="loading";if(g())return;let[y,k]=[K(t).get(c),K(r).get(u)],_=f===void 0?typeof y=="string"&&typeof k=="string"&&Op({...b,hash:d,otherHash:p},await Ar(t,c,y),await Ar(r,u,k)):!so(h)&&{status:"error",message:f,retry:!1};!_||g()||(_.tries=e.diffs.get(v)?.tries,e.diffs.set(v,_),oo(e.notify))};await(t.npm?Pd(t.npm.name,t.npm.version,r.npm.version,o):Md(t.managedId,r.managedId,o,{scope:n}))}catch(o){if(o?.name==="AbortError"){Ee.get(i)===e&&Ee.delete(i);return}s={status:"error",message:o?.message??String(o),retry:so(o?.status)}}Object.assign(e,{ended:!0,rest:s}),s?.retry&&ao(e,s,e.tries),oo(e.notify),Bp()}var ro=0,Dp=[];async function Jf(i){ro<Vf?ro++:await new Promise(e=>{Dp.push(e)});try{return await i()}finally{let e=Dp.shift();e?e():ro--}}async function Xf(i,e,t,r,n,s,o,c,u){let d;try{let[p,h]=await Promise.all([Ar(r,n,s),Ar(o,c,u)]),f={path:n,hash:p,otherPath:c,otherHash:h},b=await Jf(()=>r.npm?Ld(r.npm.name,r.npm.version,o.npm.version,f):Rd(r.managedId,o.managedId,f));d=Op(b,p,h)??{status:"error",message:no,retry:!0},d.tries=t.tries}catch(p){if(p?.name==="AbortError"){i.diffs.get(e)===t&&i.diffs.delete(e);return}d={status:"error",message:p?.message??String(p),retry:so(p?.status)}}i.diffs.get(e)===t&&(d.status==="error"&&d.retry&&ao(i,d,t.tries),i.diffs.set(e,d),oo(i.notify))}function Np(i,e,t,r,n,s,o,c,u,d=!1,p=""){let h=`${i.integrity}\0${r.integrity}\0${p}`,f=Ee.get(h);if(Ee.delete(h),(!f||f.rest?.until!==void 0&&Date.now()>=f.rest.until)&&(f={diffs:f?.diffs??new Map,notify:null,ended:!1,rest:null,tries:f?.rest?.tries},Yf(h,f,i,r,p)),Ee.set(h,f),Bp(),f.notify=c,t!==K(i).get(e)||s!==K(r).get(n))return{status:"error",message:no,retry:!1};let b=`${e}\0${n}`,v=f.diffs.get(b);if(!v&&!f.ended&&!d)return{status:"loading"};if(!v&&f.rest)return f.rest;if(v?.status==="ready"){if(v.copies[0]===u?.[0]&&v.copies[1]===u?.[1])return v.tries=0,v.settings[Number(o)];v=ao(f,{status:"error",message:no,retry:!0},v.tries),f.diffs.set(b,v)}if(v&&!(v.status==="error"&&v.until!==void 0&&Date.now()>=v.until))return v;let g={status:"loading",tries:v?.tries};return f.diffs.set(b,g),Xf(f,b,g,i,e,t,r,n,s),g}function zp(){for(let[i,e]of Ee)if(e.rest?.retry)Ee.delete(i);else for(let[t,r]of e.diffs)r.status==="error"&&r.retry&&e.diffs.delete(t)}var Qf=2,Zf=5e3,eg=5*6e4,tg=new Set(["ts","mts","cts"]),ig=i=>!(i>=400&&i<500&&i!==429),Hp=(i,e)=>`${i??""}\0${e??""}`,Te=new Map,lo=new Map;function Up(){for(let[i,e]of Te){if(Te.size<=Qf)break;e.ended&&Te.delete(i)}}async function qp(i,e,t){if(e===null)return t===null;let r=typeof e=="string"?K(i).get(e):void 0;return typeof r=="string"&&t===await(i.fileHashes?.get(e)??yi(r))}async function rg(i,e,t,r,n){let s=!1,o=new Set;try{let c=async({path:u,hash:d,otherPath:p,otherHash:h})=>{u===void 0||p===void 0||(u??p)===null||await qp(t,u,d)&&await qp(r,p,h)&&o.add(Hp(u,p))};await(t.npm?Id(t.npm.name,t.npm.version,r.npm.version,c):Ad(t.managedId,r.managedId,c,{scope:n}))}catch(c){if(c?.name==="AbortError"){Te.get(i)===e&&Te.delete(i);return}s=ig(c?.status)}if(Object.assign(e,{files:o,ended:!0}),s){let c=lo.get(i)??0;lo.set(i,c+1),setTimeout(()=>{Te.get(i)===e&&(Te.delete(i),e.notify?.())},Math.min(Zf*2**c,eg))?.unref?.()}else lo.delete(i);e.notify?.(),Up()}function jp(i,e,t,{kind:r,basePath:n=t},{before:s,after:o},c,u=""){if(r==="repointed"||!si(i,e))return!1;let d=[r==="added"?null:n,r==="removed"?null:t];if(!d.every(f=>f===null||tg.has(Wi(f)))||d[0]!==null&&s!==K(i).get(n)||d[1]!==null&&o!==K(e).get(t))return!1;let p=`${i.integrity}\0${e.integrity}\0${u}`,h=Te.get(p);return Te.delete(p),h||(h={files:new Set,notify:null,ended:!1},rg(p,h,i,e,u)),Te.set(p,h),Up(),h.notify=c,h.files.has(Hp(...d))}function ng(i,e){let t=e===void 0?"The bundle records no format for it now":`The bundle loads it as ${e}`,r=i===void 0?"no format recorded before":e===void 0?`${i} before`:`as ${i} before`,[n,s]=[en.isResourceFormat(i),en.isResourceFormat(e)];return`${t}, ${r}${n===s?"":n?", carried as data before, run as code now":", run as code before, carried as data now"}`}function oi(i=[],e=!1){return i.map(({field:t,from:r,to:n})=>t==="format"?a`<span class="bundle-compare-code-meta">${e?"format":`${r??"none"} \u2192 ${n??"none"}`}</span>`:a`<span class="${`bundle-compare-code-meta${n?"":" is-dropped"}`}">${t==="executable"?n?"+x":"\u2212x":n?"new entry":"entry"}</span>`)}var Vp=(i=[])=>i.filter(({field:e,to:t})=>e==="format"||t).map(({field:e,from:t,to:r})=>({name:e==="format"?`${t??"none"} \u2192 ${r??"none"}`:e==="executable"?"+x":"new entry",severity:"high"}));function Kp(i=[]){return i.map(({field:e,from:t,to:r})=>e==="format"?`${ng(t,r)}.`:e==="executable"?r?"It is now executable.":"It is no longer executable.":r?"It is now an entry point of the bundle.":"It is no longer an entry point of the bundle.").join(" ")}var Dr=[{kind:"changed",label:"Modified",letter:"M"},{kind:"renamed",label:"Renamed",letter:"\u2192"},{kind:"added",label:"Added",letter:"A"},{kind:"removed",label:"Removed",letter:"D"},{kind:"repointed",label:"Repointed",letter:"R"}],Ir=Object.fromEntries(Dr.map(i=>[i.kind,i])),te=2e3,sg=1e5,og=16*1024*1024,ag=24,Fr=3,lg=300,co=30,Gp=[{mode:"files",label:"Filter files",placeholder:"Filter changed files",icon:Ui},{mode:"code",label:"Search code",placeholder:"Search changed code",icon:ji}],Wp=ze/2,Yp=65536,Jp=new WeakSet,cg={large:"A large diff, not shown yet: the lines it removed aren't searched.",printed:"Shown pretty-printed: its lines as published, unsigned, the lines it removed not searched.",numbered:"Shown pretty-printed: its lines numbered as published."},Xp={"+":{name:"add",label:"Added"},"\u2212":{name:"del",label:"Removed"}," ":{name:"ctx",label:"Unchanged"}},N={layout:"unified",ignoreWhitespace:!1,ignoreRenames:!1,ignoreTypes:!1},Qp=()=>`${N.ignoreWhitespace}\0${N.ignoreRenames}`,Zp="Hide renamed names",eh="Hide type-only changes",th="Hide whitespace changes",ih={mixed:"Whitespace changes are shown: hiding them would hide blanks of more than one kind changing."},uo=(i,e)=>i?.kind==="stasis"?i.bundle?.formats?.get(e):void 0,mo=i=>/\.[cm]?js$/iu.test(i),dg=(i,{ignoreRenames:e}=N)=>e&&mo(i),rh=(i,e,t)=>Fc(i,e,t).category==="minified",nh="A license file",sh=new WeakMap;function ug(i){let e=sh.get(i);if(e)return e;e=new Map;let t=(n,s,o)=>{n&&e.set(n,[...e.get(n)??[],{label:s,note:o}])};if(i?.kind==="stasis")for(let n of i.bundle?.entries??[])t(n,"entry","An entry point of the bundle");let r=i?.npm?.manifest;if(r){let n=new Set(K(i).keys());for(let o of["main","module","types"])typeof r[o]=="string"&&t(bn(r[o],n),o,`package.json "${o}": ${r[o]}`);for(let[o,c]of Object.entries(r.bin??{}))typeof c=="string"&&t(bn(c,n),"bin",`package.json "bin" ${o}: ${c}`);let s=Map.groupBy(typeof r.license=="string"?Vc(r.license,[...n]).filter(o=>o.file):[],o=>o.file);for(let o of n)vn.test(o)&&t(o,"license",s.has(o)?`License: ${s.get(o).map(c=>c.text).join(", ")}`:nh)}else for(let n of K(i).keys())vn.test(n.slice(n.lastIndexOf("/")+1))&&t(n,"license",nh);return sh.set(i,e),e}var pg=/(?:^|\/)package\.json$/u,oh=new WeakMap;function ah(i,e,t){let r=oh.get(i);return r||oh.set(i,r=new Map),r.has(e)||r.set(e,jc(t,K(i).has(`${e.slice(0,-12)}binding.gyp`))),r.get(e)}var hg={unparsed:"the file couldn't be parsed",dynamic:"the file reads names by their spelling (eval or with)",jsx:"the file holds JSX","block-function":"the file declares a function in a block outside strict code",unverified:"the old side with the new names couldn't be checked to read as before"},lh=i=>`Renamed names are hidden, though the file reads ${i.map(e=>`.${e}`).join(", ")}, which a rename may change.`,bo=(i,e,t=N)=>`${i}\0${t.ignoreWhitespace}\0${dg(i,t)}\0${!!t.markRenames}\0${e}`,ch=new Map,po=new Set,dh=new WeakMap;function Or(i){let e=0;for(let t=i.indexOf(`
85
+ `);t!==-1;t=i.indexOf(`
86
+ `,t+1))e++;return e}var mg=i=>i.length*3<=Gi||i.length<=Gi&&da(i)<=Gi,Br=i=>i.printing?.applies?i.pretty??{status:"off"}:null,fg=5,gg=i=>i?i.length>fg?`
87
+ Affects files: ${i.length.toLocaleString()}`:`
88
+ Affects files:
89
+ ${i.join(`
90
+ `)}`:"",vo=(i,e)=>a`<span class="bundle-compare-code-counts" aria-label="${`${i} added, ${e} removed lines`}"><span class="add">+${i.toLocaleString()}</span><span class="del">−${e.toLocaleString()}</span></span>`,at=(i,e)=>i.length+e.length>og||Or(i)+Or(e)>sg,uh=i=>i.kind==="repointed"||i.kind==="renamed"&&!i.modified&&!!i.repointed&&!i.meta,fo=i=>Array.isArray(i)?i.some(fo):i?.strings?i.strings.some(e=>e.trim()!=="")||i.values.some(fo):i!=null&&i!==m&&i!==!1&&i!=="",ho=new WeakMap;function hh(i,e){if(ho.has(i))return ho.get(i);let t=new Set;for(let r of e)for(let n=r.lastIndexOf("/");n>0&&!t.has(r.slice(0,n));n=r.lastIndexOf("/",n-1))t.add(r.slice(0,n));return ho.set(i,t),t}function ph(i){let e=K(i);return hh(e,e.keys())}function go(i,e){for(let t of i.files.values())if(t===e)return!0;for(let t of i.dirs.values())if(go(t,e))return!0;return!1}var Mt=class extends U{static properties={base:{attribute:!1},other:{attribute:!1},files:{attribute:!1},scope:{attribute:!1},resolutions:{attribute:!1},baseAlerts:{attribute:!1},otherAlerts:{attribute:!1},alertTags:{attribute:!1},newHosts:{attribute:!1},newHostTag:{attribute:!1},dependencies:{attribute:!1},openDependency:{attribute:!1},dependencyTags:{attribute:!1},extensions:{attribute:!1},baseName:{},otherName:{},path:{},seek:{attribute:!1},_query:{state:!0},_kinds:{state:!0},_mode:{state:!0}};createRenderRoot(){return this}constructor(){super(),this.base=null,this.other=null,this.files=null,this.scope="",this.resolutions=[],this.baseAlerts=null,this.otherAlerts=null,this.alertTags=null,this.newHosts=null,this.newHostTag=null,this.extensions=null,this._treeLimit=300,this._treeRemaining=1/0,this.path=null,this._query="",this._kinds=new Set(Dr.map(e=>e.kind)),this._mode="files",this._blocks=new Map,this._found=null,this._rowless=new Map,this._rowlessCount=0,this._aligned=new WeakMap,this._sought=null,this._soughtRow=null,this._open=new Map,this._models=new Map,this._modelCap=ag,this._counted=new Map,this._countModels=new Map,this._drawnCounts=new Map,this._spaced=new Map,this._shorter=new Map,this._expansions=new Map,this._limits=new Map,this._forced=new Set,this._shownPath=null}willUpdate(e){let t=`${this.base?.integrity}|${this.other?.integrity}`;if((t!==this._pair||e.has("files"))&&(this._pair=t,this._models.clear(),this._spaced.clear(),this._shorter.clear(),this._expansions.clear(),this._limits.clear(),this._forced.clear()),["files","resolutions","base","other"].some(r=>e.has(r))&&(this._entries=Js(this.base,this.other,this.files,this.resolutions??[]),this._counted=new Map,this._countModels=new Map,this._drawnCounts=new Map,this._treeLimit=this.extensions?.treePageSize??1/0,this._blocks.clear(),this._rowless.clear(),this._sought=this._soughtRow=null,this._soughtSettling=!1),e.has("seek")&&this.seek&&!Jp.has(this.seek)){Jp.add(this.seek);let{path:r,line:n,query:s}=this.seek,o=this._entries?.get(r),c=o?ce(this.base,this.other,r,o).after:null,u=typeof c=="string"?Q(c)[n]?.toLowerCase().indexOf(s.toLowerCase())??-1:-1;this._sought={path:r,side:"b",line:n,at:Math.max(u,0),query:s},this._soughtRow=null,this._soughtSettling=!1}}updated(){if(this._current!==this._shownPath){this._shownPath=this._current;let e=this.querySelector(".bundle-compare-diff");e&&(e.scrollTop=0),this.querySelector(".bundle-compare-code-tree .bundle-code-tree-link.current")?.scrollIntoView({block:"nearest"})}this._scrollSought()}_scrollSought(){if(this._sought?.path===this._current&&!this._soughtSettling&&(this._sought=null),!this._soughtRow)return;let{path:e,index:t}=this._soughtRow;this._soughtRow=null;let n=[...this.querySelectorAll(".bundle-compare-diff-table")].find(o=>o.dataset.path===e)?.children[t];if(!n)return;let s=n.closest(".bundle-compare-diff");n.scrollIntoView({block:s&&n.offsetHeight>s.clientHeight/2?"start":"center"}),n.classList.remove("is-sought"),n.offsetWidth,n.classList.add("is-sought"),n.addEventListener("animationend",()=>n.classList.remove("is-sought"),{once:!0})}_shown(e){return this._kinds.has(e.kind)||!!e.modified&&this._kinds.has("changed")||!!e.repointed&&this._kinds.has("repointed")}_modules(){let e=this.base?.kind==="stasis"?this.base.bundle?.modules:null,t=this.other?.kind==="stasis"?this.other.bundle?.modules:null,r={root:this.files?.root,paths:this.files?.basePaths??new Map};return e||t?new Map([...[...e??[]].map(([n,s])=>[Xc(r,n,Object.keys(s.files??{})),s]),...t??[]]):null}_baseDirs(){let e=this.files?.root?this.files.basePaths:null;return e?hh(e,e.values()):ph(this.base)}_format(e){let t=this._entries.get(e),r=Zr(this.base,t?.basePath??e),n=Zr(this.other,e);return[r,n].find(ba)??(t?.kind==="removed"?r:n)}_tree(){let e=[this._entries,`${[...this._kinds].join()}:${!!this.extensions?.fullPaths}`];if(this._treeKey?.[0]===e[0]&&this._treeKey[1]===e[1])return this._treeMemo;let t=[...this._entries.keys()],r=this._modules(),n=Ji(this.files?.root,this.extensions?.fullPaths?"":Ec(ft(t).prefix,r,t)),{prefix:s}=n,o=t.filter(d=>this._shown(this._entries.get(d))),c=d=>s&&d.startsWith(s)?d.slice(s.length):d,u=Ki(o.map(c),o,r);return this._treeKey=e,this._treeMemo={prefix:s,root:n,tree:u,shown:o.length,allOrder:Wt(u)},this._treeMemo}_select(e){!e||e===this._current||this.extensions?.canSelect?.()===!1||this.dispatchEvent(new CustomEvent("compare-code-select",{detail:{path:e},bubbles:!0,composed:!0}))}_reveal(e,t){let r=(t&&e.startsWith(t)?e.slice(t.length):e).split("/");for(let n=1;n<r.length;n++)this._open.set(r.slice(0,n).join("/"),!0)}_railState(){let{prefix:e,root:t,tree:r,shown:n,allOrder:s}=this._tree(),o=Tc(r,this._mode==="files"?this._query:"",e,this.extensions?.fileFilter);return{prefix:e,root:t,tree:r,shown:n,filtered:o,order:o===r?s:o?Wt(o):[],allOrder:s}}_renderRail({prefix:e,root:t,tree:r,shown:n,filtered:s,order:o},c){this._countUntil=null,this._treeRemaining=this.extensions?.treePageSize?this._treeLimit:1/0,this._treeTruncated=!1;let u=this._mode==="code"?m:s?this._renderTree(s,c,0,!!this._query||n<=(this.extensions?.openAllMax??lg)):a`<div class="bundle-code-search-empty">No changed files match.</div>`,d=Object.fromEntries(Dr.map(({kind:h})=>[h,0]));for(let h of this._entries.values())h.kind!=="repointed"&&d[h.kind]++,h.modified&&d.changed++,h.repointed&&d.repointed++;let p=Gp.find(({mode:h})=>h===this._mode);return a`<aside class="bundle-code-rail"><div class="bundle-code-rail-head"><span class="bundle-code-rail-label">${this.extensions?.railLabel??"Changes"}</span> <span class="bundle-code-rail-count">${this._entries.size.toLocaleString()}</span> <span class="bundle-code-rail-actions"><button type="button" class="bundle-code-rail-action" aria-label="${this.extensions?.collapseLabel??"Collapse directories"}" data-tooltip="Collapse directories" ?disabled="${this._mode!=="files"||!!this._query&&!this.extensions?.collapseClearsSearch||r.dirs.size===0}" @click="${()=>this._collapseAll(r)}">${bc}</button></span></div>${t.from?a`<div class="bundle-code-rail-prefix mono" data-tooltip="${`Root moved: ${t.from} \u2192 ${t.to}`}">${Er(t)}</div>`:e?a`<div class="bundle-code-rail-prefix mono" data-tooltip-truncated data-tooltip="${e}">${e}</div>`:m}<div class="bundle-compare-code-filter"><label class="bundle-compare-code-search"><svg viewBox="0 0 16 16" width="12" height="12" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" aria-hidden="true"><circle cx="7" cy="7" r="4.5"/><path d="m10.5 10.5 3.5 3.5"/></svg> <input type="search" placeholder="${this._mode==="files"?this.extensions?.searchPlaceholder??p.placeholder:p.placeholder}" aria-label="${this._mode==="files"?this.extensions?.searchLabel??p.placeholder:p.placeholder}" spellcheck="false" autocomplete="off" .value="${j(this._query)}" @input="${h=>{this._query=h.target.value,this._treeLimit=this.extensions?.treePageSize??1/0}}"> <span class="bundle-code-search-modes" role="tablist">${Gp.map(({mode:h,label:f,icon:b})=>a`<button type="button" class="${I({"bundle-code-search-mode":!0,active:h===this._mode})}" role="tab" aria-selected="${String(h===this._mode)}" aria-label="${f}" data-tooltip="${f}" @click="${()=>{this._mode=h}}">${b}</button>`)}</span></label> ${this.extensions?.filters??a`<div class="bundle-compare-code-kinds" role="group" aria-label="Show changes">${Dr.filter(({kind:h})=>d[h]>0).map(({kind:h,label:f})=>a`<button type="button" class="${`bundle-compare-code-kind ${h}`}" aria-pressed="${String(this._kinds.has(h))}" data-tooltip="${`${this._kinds.has(h)?"Hide":"Show"} ${f.toLowerCase()} files`}" @click="${()=>this._toggleKind(h)}">${f.toLowerCase()}</button>`)}</div>`}</div><div class="bundle-code-rail-body bundle-compare-code-tree">${this._mode==="code"?this._renderSearch(o,c,e):u} ${this._mode==="files"&&this._treeTruncated?a`<button type="button" class="bundle-compare-code-action" @click="${()=>{this._treeLimit+=this.extensions.treePageSize,this.requestUpdate()}}">Show more files</button>`:m}</div>${this.extensions?.footer?.(h=>{this._query="",this._select(h)})??m}</aside><bundle-code-splitter role="separator" tabindex="0" aria-orientation="vertical" aria-label="Resize file tree" data-tooltip="Drag to resize · double-click to reset"></bundle-code-splitter>`}_arrived=0;_renamesAlone=!0;_repaint=()=>{this._arrived++,this.isConnected&&this.requestUpdate()};disconnectedCallback(){super.disconnectedCallback(),clearTimeout(this._countLater),clearTimeout(this._searchLater),this._countLater=this._searchLater=null}render(){let e=this._railState(),t=this._entries.has(this.path)?this.path:e.order[0]??null;t&&t!==this._current&&this._reveal(t,e.prefix),this._current=t,this._order=this.extensions?.filterContent===!1?e.allOrder:e.order;let r=t?a`${this._renderFile(t,this.extensions?.fullPaths?"":e.prefix)}${this.extensions?.fileActions?.(t,!1)??m}`:a`<div class="bundle-code-placeholder">No files differ in this comparison.</div>`;return a`<div class="bundle-code-view bundle-compare-code">${this._renderRail(e,t)}<div class="bundle-code-main">${r}</div></div>`}_toggleKind(e){let t=new Set(this._kinds);t.has(e)?t.delete(e):t.add(e),this._kinds=t}_collapseAll(e){this.extensions?.collapseClearsSearch&&(this._query=""),this._treeLimit=this.extensions?.treePageSize??1/0;let t=r=>{for(let n of r.dirs.values())this._open.set(n.path,!1),t(n)};t(e),this.requestUpdate()}_renderSearch(e,t,r){if(!this._query)return a`<div class="bundle-code-search-hint">Type to search the code of the changed files.</div>`;let{files:n,hits:s,truncated:o,unsigned:c}=this._searchResults(e);if(n.length===0)return a`<div class="bundle-code-search-empty">No matches.</div>`;let u=d=>r&&d.startsWith(r)?d.slice(r.length):d;return a`<div class="bundle-code-search-results bundle-compare-search"><div class="bundle-code-search-summary">${s.toLocaleString()} ${s===1?"hit":"hits"} in ${n.length.toLocaleString()} ${n.length===1?"file":"files"}${o?`, the first ${io}`:""}</div>${le(n,d=>d.path,({path:d,hits:p})=>a`<div class="${I({"bundle-code-search-file":!0,current:d===t})}"><button type="button" class="${`bundle-code-search-file-name bundle-compare-code-name ${this._entries.get(d).kind}`}" data-tooltip-truncated data-tooltip="${d}" @click="${()=>this._select(d)}">${u(d)}</button> ${c.has(d)?a`<p class="bundle-compare-search-note">${cg[c.get(d)]}</p>`:m}<ul class="bundle-code-search-hits">${p.map(h=>a`<li class="bundle-code-search-hit"><button type="button" class="bundle-code-search-hit-link" aria-label="${`${Xp[h.sign]?.label??"Line"} ${h.line+1}${h.side==="a"?" of the old text":""}: ${h.text.trim().slice(0,80)}`}" @click="${()=>this._seek(d,h)}"><span class="bundle-code-search-hit-ln">${h.line+1}</span> <span class="${`bundle-compare-search-sign ${Xp[h.sign]?.name??""}`}" aria-hidden="true">${h.sign??""}</span> <span class="bundle-code-search-hit-text mono">${_d(h.text,h.ranges)}</span></button></li>`)}</ul></div>`)}</div>`}_searchResults(e){let t=Qp(),r=`${this._query}\0${this._forced.size}\0${t}\0${N.layout}\0${!!l.bundleSourcePretty}\0${Nc()}\0${this._rowlessCount}\0${e.join("\0")}`;if(this._found?.key===r&&this._found.entries===this._entries)return this._found.result;let n=null,s=!0,o=new Map,c=(h,f,b)=>{if(o.get(h)==="printed")return null;let v=`${N.ignoreWhitespace}\0${h}`;if(this._blocks.has(v))return this._blocks.get(v);if(!this._forced.has(h)&&at(f,b))return o.set(h,"large"),null;let g=performance.now();if(n??=g+co,g>n)return s=!1,null;let y=N.ignoreWhitespace&&!this._unlisted(h,this._entries.get(h),{before:f,after:b}),k=Ce(f,b,y);return y&&Jt(f,b,k)&&(k=Ce(f,b)),this._blocks.set(v,k),k},u=e.flatMap(h=>{let f=this._entries.get(h);if(!this._searchable(f))return[];let b=ce(this.base,this.other,h,f),{before:v,after:g}=b;if(this._prettyShown(h,f,b)){if(!/\S/u.test(this._query))return[];let y=v!==""&&g!==""&&v!==g;if(y&&this._rowless.get(h)===t)return[];o.set(h,y?"printed":"numbered")}return[{path:h,...b}]}),d=(h,f,b,v)=>{let g=this._aligned.get(b);return g||this._aligned.set(b,g={a:h,b:f,blocks:b}),to(g,b.indexOf(v))},p={...Fp(u,yd(this._query,!1,!1),c,{split:N.layout==="split",align:d}),unsigned:o};return s?this._found={key:r,entries:this._entries,result:p}:this._searchLater??=setTimeout(()=>{this._searchLater=null,this.requestUpdate()}),p}_searchable(e){return e.modified!==!1||uh(e)}_prettyShown(e,t,r){if(!l.bundleSourcePretty)return!1;let n=this._printing(e,t,r);return!!n?.applies&&n.copies.status!=="error"}_noteRowless(e,t){let r=t?Qp():void 0;this._rowless.get(e)!==r&&(r===void 0?this._rowless.delete(e):this._rowless.set(e,r),this._rowlessCount++)}_seek(e,t){this._sought={path:e,side:t.side,line:t.line,at:t.ranges[0]?.[0]??0,query:this._query},e===this._current?this.requestUpdate():this._select(e,!1)}_soughtLine(e,t,r,n){let{side:s,line:o,at:c,query:u}=this._sought;if(r?.status!=="ready")return{side:s,line:o};let d=y=>y.replaceAll(/\s+/gu,""),p=Q(ce(this.base,this.other,e,t)[s==="a"?"before":"after"]??""),h=p.slice(0,o).reduce((y,k)=>y+d(k).length,0)+d(p[o]?.slice(0,c)??"").length,f=d(u).toLowerCase(),b=(y,k)=>{if(!f)return null;let _=0,x=0,S=0,T="";for(let F of y)for(let O=0;O<F.length;O+=Yp){T+=d(F.slice(O,O+Yp)).toLowerCase();for(let z=T.indexOf(f,_);z!==-1;z=T.indexOf(f,_),x++){if(k(x,S+z))return{index:x,start:S+z};_=z+f.length}let A=Math.max(_,T.length-f.length+1);T=T.slice(A),S+=A,_=Math.max(0,_-A)}return null},v=b(p,(y,k)=>k>=h),g=(v&&b(n[s],y=>y===v.index)?.start)??h;for(let y=0;y<n[s].length;y++)if(g-=d(n[s][y]).length,g<0)return{side:s,line:y};return null}_seekRows(e,t,{side:r,line:n},s){let o=h=>r==="b"?(h.kind==="ctx"||h.kind==="add")&&h.b===n||h.kind==="change"&&h.right===n:(h.kind==="ctx"||h.kind==="del")&&h.a===n||h.kind==="change"&&h.left===n,c=this._expansions.get(e)??new Map,u=Lt(t,c,{split:s}),d=u.findIndex(o);if(d===-1){let h=u.find(f=>f.kind==="fold"&&n>=f[r]&&n<f[r]+f.count);if(h){let f=c.get(h.run)??{},b=n-h[r];c=new Map(c).set(h.run,h.down?{...f,top:(f.top??0)+b+1+Wp}:h.up?{...f,bottom:(f.bottom??0)+h.count-b+Wp}:{all:!0}),this._expansions.set(e,c),u=Lt(t,c,{split:s}),d=u.findIndex(o)}}let p=this._limits.get(e)??te;return d>=p&&this._limits.set(e,Math.ceil((d+1)/te)*te),{rows:u,index:d}}_takeTreeRow(e=!1){return this._treeRemaining-- >0?!0:(this._treeTruncated=!0,e)}_renderTree(e,t,r,n){let s=[...e.dirs.entries()].toSorted(Mc),o=[...e.files.entries()].toSorted(([d],[p])=>d.localeCompare(p)),c=s.flatMap(([d,p])=>{let h=Rc(d,p,r),f=p.package,b=f?.ecosystem==="cargo"||f?.ecosystem==="composer"||f?.ecosystem==="soldeer",v=this._query?!0:this._open.get(p.path)??(n||r===0||go(p,t)),g=this._baseDirs().has(p.sourcePath)?ph(this.other).has(p.sourcePath)?null:"removed":"added";if(!this._takeTreeRow(go(p,t)))return[];let y=a`<li class="bundle-code-tree-dir"><details .open="${j(v)}" @toggle="${k=>{let _=k.currentTarget.open;this._open.get(p.path)!==_&&(this._open.set(p.path,_),this.extensions?.treePageSize&&this.requestUpdate())}}"><summary aria-label="${this.extensions?.directoryLabel?.(h.node)??m}"><span class="bundle-code-tree-chevron" aria-hidden="true"></span> ${f?va(f.ecosystem):m} <span class="${I({"bundle-code-tree-dirname":!0,"bundle-code-tree-package":!!f,"bundle-code-tree-package-vendored":b,"bundle-compare-code-name":!0,removed:g==="removed"})}" data-tooltip-truncated data-tooltip="${h.node.sourcePath}">${f?a`<span class="bundle-code-tree-package-name">${f.name}</span>${f.version?a`<span class="bundle-code-tree-package-version">${b?"- ":"@"}${f.version}</span>`:m}`:h.names.map((k,_)=>a`${_>0?a`<span class="bundle-code-tree-separator">/</span>`:m}${k}`)} </span>${f?.variant?a`<span class="bundle-code-tree-variant">variant ${f.variant}</span>`:m} <span class="bundle-compare-code-dir-count" data-tooltip="${`${p.fileCount} changed ${p.fileCount===1?"file":"files"}`}">${this.extensions?.directorySummary?.(h.node)??p.fileCount}</span> ${g?a`<span class="${`bundle-compare-code-letter ${g}`}" data-tooltip="${`${f?"Package":"Directory"} ${g}`}">${Ir[g].letter}</span>`:m}</summary>${v||!this.extensions?.treePageSize?this._renderTree(h.node,t,r+1,n):m}</details></li>`;return[{key:p.path,content:y}]}),u=o.flatMap(([d,p])=>{if(!this._takeTreeRow(p===t))return[];let{kind:h,repointed:f,renamedFrom:b,modified:v}=this._entries.get(p),g=f?`${f.length} repointed ${f.length===1?"import":"imports"}`:"",y=a`<li class="bundle-code-tree-file"><button type="button" class="${I({"bundle-code-tree-link":!0,current:p===t})}" aria-label="${this.extensions?.fileLabel?.(p)??m}" aria-current="${p===t?"true":m}" @click="${()=>this._select(p)}">${this.extensions?.filePrefix?.(p)??m}${Ve(p,this._format(p))}<span class="${`bundle-code-tree-name bundle-compare-code-name ${h}`}" data-tooltip-truncated data-tooltip="${p}">${d}</span> ${this.extensions?.fileSuffix?.(p)??m} ${b?a`<span class="bundle-compare-code-oldname" data-tooltip-truncated data-tooltip="${`Renamed from ${b}`}">← ${Yi(b,p,{extension:!1}).from}</span>`:m} ${this._fileTags(p,this._entries.get(p),!0)} ${this._treeCounts(p,this._entries.get(p))} ${f&&h!=="repointed"?a`<span class="bundle-compare-code-letter repointed" data-tooltip="${g}">R</span>`:m} <span class="${I({"bundle-compare-code-letter":!0,[h]:!0,pure:h==="renamed"&&!v})}" data-tooltip="${h==="repointed"?g:b?`Renamed${v?" and modified":""} from ${b}`:Ir[h].label}">${Ir[h].letter}</span></button></li>`;return[{key:p,content:y}]});return a`<ul class="${I({"bundle-code-tree":!0,root:r===0})}" aria-label="${r===0?this.extensions?.treeLabel??"Changed files":m}" @keydown="${r===0?Lc:m}">${le(c,d=>d.key,d=>d.content)}${le(u,d=>d.key,d=>d.content)}</ul>`}_treeCounts(e,t){if(t.kind==="repointed")return m;let r=this._lineCounts(e,t),n=r&&this._shownCounts(e,t);if(!r||n===void 0)return m;let{additions:s,deletions:o}=n??r,c=r.additions>0||r.deletions>0,u=t.kind==="renamed",d=n?.renamed>0?`
91
+ \u2248${n.renamed.toLocaleString()} lines differing in renamed names alone, marked`:"",p=n?`${n.aside.join(", ")}${d}
92
+ As published: +${r.additions.toLocaleString()} \u2212${r.deletions.toLocaleString()}`:null;if(s===0&&o===0){if((u||t.modified===!1)&&!c)return a`<span class="bundle-compare-code-line-counts unchanged" aria-label="No line changes">=</span>`;if(n&&c)return a`<span class="bundle-compare-code-line-counts unchanged" aria-label="${`No line changes with ${n.aside.join(", ")}`}" data-tooltip="${`No line changes with ${p}`}">≈</span>`}let h=n&&(s!==r.additions||o!==r.deletions);return a`<span class="bundle-compare-code-line-counts" aria-label="${`${s} added, ${o} removed lines`}" data-tooltip="${h?`With ${p}`:m}"><span class="${I({add:!0,empty:u&&s===0})}">+${s.toLocaleString()}</span> <span class="${I({del:!0,empty:t.kind==="added"||u&&o===0})}">−${o.toLocaleString()}</span></span>`}_countingState(e,t){return this._fileState(e,t,!0)}_shownCounts(e,t){if(!(l.bundleSourcePretty||N.ignoreWhitespace||N.ignoreRenames||N.ignoreTypes))return null;let r=`${!!l.bundleSourcePretty}\0${N.ignoreWhitespace}\0${N.ignoreRenames}\0${N.ignoreTypes}\0${this._arrived}\0${this._forced.size}`,n=this._drawnCounts.get(e);if(n?.settings===r)return n.counts;let s=performance.now();if(this._countUntil??=s+co,s>this._countUntil){this._countLater??=setTimeout(()=>{this._countLater=null,this.requestUpdate()});return}let{pretty:o,hiding:c,model:u,spacesHidden:d,typesHidden:p}=this._countingState(e,t),h=[o?.status==="ready"&&"Pretty-print",d&&th,c&&Zp,p&&eh].filter(Boolean),f=u&&h.length>0?{additions:u.additions,deletions:u.deletions,renamed:u.renamed,aside:h}:null;return this._drawnCounts.set(e,{settings:r,counts:f}),f}_lineCounts(e,t){if(this._counted.has(e))return this._counted.get(e);let r=performance.now();if(this._countUntil??=r+co,r>this._countUntil)return this._countLater??=setTimeout(()=>{this._countLater=null,this.requestUpdate()}),null;let{before:n,after:s}=ce(this.base,this.other,e,t),o=Rp(n,s);return this._counted.set(e,o),o}_model(e,t,r,n={},s=N.ignoreWhitespace){let o=n.changes?.blocks??n.marks??null,c=this._models.get(e);return this._models.delete(e),c?.before===t&&c.after===r&&c.given===o||(c={model:Lr(t,r,{...n,ignoreWhitespace:s}),before:t,after:r,given:o}),this._models.set(e,c),this._models.size>this._modelCap&&this._models.delete(this._models.keys().next().value),c.model}_counts(e,t,r,n,s){let o=n.changes?.blocks??n.marks??null,c=this._countModels.get(e);if(c?.before===t&&c.after===r&&c.given===o)return c.model;let u=n.changes?.blocks??Ce(t,r,s),d={blocks:u,...Xs(u,n.marks)};return this._countModels.set(e,{model:d,before:t,after:r,given:o}),d}_fileState(e,t,r=!1){let n=ce(this.base,this.other,e,t),s=typeof n.before=="string"&&typeof n.after=="string",o=s&&jp(this.base,this.other,e,t,n,this._repaint,this.scope);if(o&&N.ignoreTypes){let ne={a:[],b:[],blocks:[],additions:0,deletions:0,renamed:0,marked:new Set,noEol:{a:!1,b:!1},words:new Map};return r?{pretty:null,hiding:!1,model:ne,spacesHidden:!1,typesHidden:!0}:{...n,textual:s,large:!1,printing:null,pretty:null,key:null,generated:!1,renamed:!1,warned:[],hiding:!1,changes:null,model:ne,whitespace:null,spacesHidden:!1,types:o,typesHidden:!0}}let c=s&&(!r||l.bundleSourcePretty)?this._printing(e,t,n):null,u=l.bundleSourcePretty&&c?.applies?c.copies:null,{before:d,after:p}=u?.status==="ready"?u:n,h=s&&mo(e)&&mo(t.basePath??e)&&["ready","loading","error"].includes(u?.status)&&this._generated(e,t,n),f=h&&u.status==="ready";!r&&s&&this._sought?.path===e&&!this._forced.has(e)&&at(d,p)&&this._forced.add(e);let b=s&&!this._forced.has(e)&&at(d,p),{basePath:v=e}=t,g=ne=>{let se=f&&!b?Np(this.base,v,n.before,this.other,e,n.after,ne,this._repaint,u.hashes,!r&&this._renamesAlone,this.scope):null,Ft=se?.status==="ready",Ue=Ft&&N.ignoreRenames,Dt=Ft&&!Ue,hi=Ue&&se.reason===null?se.reads:[],mi=Ft&&se.reason===null?se.marks.length>0||N.ignoreRenames&&se.before!==d:N.ignoreRenames&&h,dt=bo(e,u?.status==="ready",{...N,ignoreWhitespace:ne,ignoreRenames:Ue,markRenames:Dt}),je=Ue?se.before:d,Vr=Ue?{changes:{blocks:se.blocks}}:Dt?{marks:se.marks}:{},fi=s&&!b&&(!se||Ft||!N.ignoreRenames)?r?this._counts(dt,je,p,Vr,ne):this._model(dt,je,p,Vr,ne):null;return{key:dt,changes:se,warned:hi,renamed:mi,hiding:Ue,shown:je,model:fi,ignoreWhitespace:ne}},y=this._unlisted(e,t,n),k=g(N.ignoreWhitespace&&!y),_=N.ignoreWhitespace&&!y&&!!k.model&&(k.model.mixed??=Jt(k.shown,p,k.model.blocks));_&&(k=g(!1));let{key:x,changes:S,warned:T,renamed:F,hiding:O,shown:A,model:z}=k;if(r)return{pretty:u,hiding:O,model:z,spacesHidden:k.ignoreWhitespace};u?.status==="ready"&&z?this._noteRowless(e,z.blocks.length===0):z&&(this._blocks.set(`${N.ignoreWhitespace}\0${e}`,z.blocks),this._aligned.set(z.blocks,z));let Z=z&&!y&&!N.ignoreWhitespace?this._whitespaceHidden(`${e}\0${u?.status==="ready"}\0${O}`,A,p):null,re=z===null||y?null:_?"mixed":N.ignoreWhitespace?Qs(A,p,z.blocks)?"hideable":null:Z.hides&&!Z.mixed?"hideable":null;return this._sought?.path===e&&(this._soughtSettling=u?.status==="loading"||N.ignoreRenames&&(S?.status==="loading"||S?.status==="error")),{before:A,after:p,textual:s,large:b,printing:c,pretty:u,key:x,generated:h,renamed:F,warned:T,hiding:O,changes:S,model:z,whitespace:re,spacesHidden:k.ignoreWhitespace,types:o}}_unlisted(e,{basePath:t=e},{before:r,after:n}){return!Zs(e,n,uo(this.other,e))||!Zs(t,r,uo(this.base,t))}_whitespaceHidden(e,t,r){let n=this._spaced.get(e);return n?.before===t&&n.after===r||(n={before:t,after:r,hidden:Lp(t,r)}),this._spaced.delete(e),this._spaced.set(e,n),this._spaced.size>this._modelCap&&this._spaced.delete(this._spaced.keys().next().value),n.hidden}_generated(e,{kind:t,basePath:r=e},{before:n,after:s}){return t!=="repointed"&&si(this.base,this.other)&&rh(this.base,r,n)&&rh(this.other,e,s)}_printing(e,t,r){let{kind:n,basePath:s=e,modified:o}=t,{before:c,after:u}=r;if(n==="repointed"||o===!1||typeof c!="string"||typeof u!="string"||c===u||!si(this.base,this.other))return null;let d=[["base",this.base,s,c],["other",this.other,e,u]];if(!d.every(([,,v,g])=>g===""||Wi(v)!==null&&mg(g)))return null;let p=d.some(([,v,g,y])=>y!==""&&zc(v,v,g,y)),h=d.map(([v,,g,y])=>y===""?{status:"ready",text:y}:qc(this.base,this.other,v,g,y,this._repaint)),f=h.find(v=>v.status==="error")??h.find(v=>v.status==="loading")??{status:"ready",before:h[0].text,after:h[1].text,hashes:h.map(v=>v.hash)},b=!p&&c!==""&&u!==""&&f.status==="ready"&&this._smaller(e,r,f);return{copies:f,minified:p,smaller:b,applies:p||b}}_smaller(e,{before:t,after:r},n){let s=this._shorter.get(e);if(s?.before===t&&s.after===r&&s.printed===n.before&&s.printedAfter===n.after)return s.smaller;let o=(u,d)=>Ce(u,d).reduce((p,{a0:h,a1:f,b0:b,b1:v})=>p+f-h+v-b,0),c=!at(t,r)&&!at(n.before,n.after)&&o(n.before,n.after)<o(t,r);return this._shorter.set(e,{before:t,after:r,printed:n.before,printedAfter:n.after,smaller:c}),c}_fileMessage(e,{kind:t,modified:r,meta:n},{before:s,after:o,textual:c,large:u,model:d,pretty:p,hiding:h,warned:f=[],changes:b,whitespace:v,typesHidden:g=!1}){let y=A=>G(A??0),k=Kp(n),_=`${t==="renamed"?k?"Renamed, its contents the same.":"Renamed without changes.":"The contents are the same."}${k?` ${k}`:""}`;if(c&&r===!1)return a`<div class="bundle-compare-code-message"><p>${_}</p></div>`;if(!c){if(t==="changed"&&r===!1)return a`<div class="bundle-compare-code-message">Binary file, its bytes the same · ${y(Re(o))}. ${k}</div>`;let A=t==="added"?y(Re(o)):t==="removed"?y(Re(s)):`${y(Re(s))} \u2192 ${y(Re(o))}`;return a`<div class="bundle-compare-code-message">Binary file ${t} · ${A}. A text diff is not available.${k?` ${k}`:""}</div>`}if(u)return a`<div class="bundle-compare-code-message"><p>This diff is large (${(Or(s)+Or(o)).toLocaleString()} lines across both sides) and may take a few seconds to compute.</p><button type="button" class="bundle-compare-code-action" @click="${()=>{this._forced.add(e),this.requestUpdate()}}">Show diff</button></div>`;if(g)return a`<div class="bundle-compare-code-message"><p>Only types changed in this file.${k?` ${k}`:""}</p><button type="button" class="bundle-compare-code-action" @click="${()=>this._setTypes(!1)}">Show type-only changes</button></div>`;if(b?.status==="loading"&&N.ignoreRenames)return a`<div class="bundle-compare-code-message" aria-busy="true">Hiding renamed names…</div>`;if(b?.status==="error"&&N.ignoreRenames)return a`<div class="bundle-compare-code-message"><p>Couldn't hide renamed names: ${b.message}</p><button type="button" class="bundle-compare-code-action" @click="${()=>this._setRenames(!1)}">Show renamed names</button></div>`;if(d.blocks.length>0)return null;let x=p?.status==="ready"&&p.before===p.after,S=!x&&N.ignoreWhitespace&&v==="hideable",T=!x&&h,F=[S&&"whitespace",T&&"renamed names"].filter(Boolean),O=x?"No actual code changes in this file.":F.length>0?`Only ${F.join(" and ")} changed in this file.`:null;return a`<div class="bundle-compare-code-message"><p>${O?`${O}${k?` ${k}`:""}`:_}</p>${f.length>0?a`<p>${lh(f)}</p>`:m} ${x?a`<button type="button" class="bundle-compare-code-action" @click="${()=>{Yt(),this.requestUpdate()}}">Show as published</button>`:m} ${S?a`<button type="button" class="bundle-compare-code-action" @click="${()=>this._setWhitespace(!1)}">Show whitespace changes</button>`:m} ${T?a`<button type="button" class="bundle-compare-code-action" @click="${()=>this._setRenames(!1)}">Show renamed names</button>`:m}</div>`}_fileName(e,t,r){let n=s=>r&&s.startsWith(r)?s.slice(r.length):s;return a`<span class="${I({"bundle-compare-code-pill":!0,[t.kind]:!0,pure:t.kind==="renamed"&&!t.modified})}">${Ir[t.kind].label}</span> ${Ve(e,this._format(e))} <span class="bundle-code-main-path mono" data-tooltip-truncated data-tooltip="${t.renamedFrom?`${t.renamedFrom} \u2192 ${e}`:e}">${t.renamedFrom?Cr(n(t.renamedFrom),n(e)):n(e)}</span> ${this._fileTags(e,t)}${this._githubLink(e,t)}`}_fileTags(e,t,r=!1){if(!r)return a`${this._entryTags(e,t)}${this._alertTags(e,t)}${this._runsTags(e,t)}${this._newHostTags(e,t)}${this._flagTags(e,t)}${this._readability(e,t)}${this._installTags(e,t)}${oi(t.meta)}`;let n=[this._alertTags(e,t),this._runsTags(e,t),this._newHostTags(e,t),this._flagTags(e,t,!1),this._treeTag(e,t),this._installTags(e,t,!0),oi(t.meta,!0)];return fo(n)?n:this._flagTags(e,t)}_githubLink(e,{kind:t,basePath:r=e}){let n=t==="removed"?pn(this.base,r):pn(this.other,e);return n?Pc(n):m}_alertTags(e,{kind:t,basePath:r=e}){let n=t==="removed"?this.baseAlerts?.get(r):this.otherAlerts?.get(e);return n?.length>0&&this.alertTags?this.alertTags(n):m}_newHostTags(e,{kind:t}){let r=t==="removed"?null:this.newHosts?.get(e);return r&&this.newHostTag?this.newHostTag(r):m}_runsTags(e,t){return[[rd,nd],[sd,od]].map(([r,n])=>{let{was:s,now:o}=this._reads(e,t,r);return t.kind==="removed"?n(s):n(o,s)})}_entryTags(e,{kind:t,basePath:r=e}){let n=ug(t==="removed"?this.base:this.other).get(t==="removed"?r:e)??[];return[...Map.groupBy(n,({label:o})=>o)].map(([o,c])=>a`<span class="${`bundle-compare-code-entry${o==="license"?" is-license":""}`}" data-tooltip="${c.map(({note:u})=>u).join(" \xB7 ")}">${o}</span>`)}_installTags(e,t,r=!1){if(!pg.test(e))return m;let{kind:n,basePath:s=e}=t,{before:o,after:c}=ce(this.base,this.other,e,t),u=new Map(n==="added"||o===void 0?[]:ah(this.base,s,o)),d=new Map(n==="removed"||c===void 0?[]:ah(this.other,e,c)),p=[...n==="removed"?u:d].map(([h,f])=>{let b=n==="removed"?f:u.get(h),v=b===void 0?", new":b===f?"":`, was: ${b}`;return a`<span class="bundle-compare-code-install" data-tooltip="${`${f}${v}`}">${h}</span>`});if(!r&&n!=="removed")for(let[h,f]of u)d.has(h)||p.push(a`<span class="bundle-compare-code-install is-dropped" data-tooltip="${`No longer run on install: ${f}`}">${h}</span>`);return p}_reads(e,t,r=Ic){let{kind:n,basePath:s=e}=t,{before:o,after:c}=ce(this.base,this.other,e,t);return{was:n==="added"?null:o===void 0?void 0:r(this.base,s,o),now:n==="removed"||c===void 0?null:r(this.other,e,c)}}_readability(e,t){let{was:r,now:n}=this._reads(e,t),s=c=>a`${hn(c)}${Dc(c)}`,o=!r||!n||Ci(r)===Ci(n)&&r.kind===n.kind?s(n??r):a`<span class="bundle-compare-code-readability">${s(r)}<span aria-hidden="true">→</span>${s(n)}</span>`;return a`${mn(n??r)}${o}`}_flagTags(e,t,r=!0){return t.kind==="removed"?fn(this.base,t.basePath??e,t.baseBytes,r):fn(this.other,e,t.otherBytes,r)}_treeTag(e,t){let{was:r,now:n}=this._reads(e,t),s=n??r;if(!s)return m;let o=s.category!=="map"&&Ea.get(Ci(s)).mark;return a`${mn(s,["warn"])}${o?hn(s,!0):m}`}_fileFigures({kind:e,baseBytes:t,otherBytes:r},n){let s=o=>G(o??0);return a`${n?.blocks.length>(n?.marked?.size??0)?vo(n.additions,n.deletions):m} ${n?.renamed>0?a`<span class="bundle-compare-code-renamed" aria-label="${`${n.renamed} lines differing in renamed names alone`}" data-tooltip="Lines differing in renamed names alone, marked">≈${n.renamed}</span>`:m} <span class="bundle-code-main-stats">${e==="added"?s(r):e==="removed"?s(t):`${s(t)} \u2192 ${s(r)}`}</span>`}_highlighted(e,t,r,n=""){if(!r)return null;let s=xi(t,uo(e,t),r);if(!s)return null;let o=`${e.integrity}\0${t}${n?`\0${n}`:""}`,c=ch.get(o);return c?.text===r?c.lines:(po.has(o)||(po.add(o),(async()=>{let u=await yt(r,s),d=typeof u=="string"?Ni(u):null;ch.set(o,{text:r,lines:d?.length===r.split(`
93
+ `).length?d:null}),po.delete(o),this.isConnected&&this.requestUpdate()})()),null)}_renderFile(e,t){let r=this._entries.get(e),{kind:n}=r,s=this._fileState(e,r),{after:o,before:c,textual:u,model:d}=s,p=uh(r),h=u&&(!p||d?.blocks.length>0),f=this._order.indexOf(e),b=t&&e.startsWith(t)?e.slice(t.length):e,v=n==="repointed"&&c===void 0?a`<div class="bundle-compare-code-message">Neither bundle carries this importer's source.</div>`:p&&d?.blocks.length===0?this._renderSource(e,o,r.repointed,s):this._fileMessage(e,r,s)??this._renderDiff(e,r,s);return a`<header class="bundle-code-main-bar bundle-compare-code-bar"><span class="bundle-code-file-nav"><button type="button" class="focus-code-nav-btn" aria-label="Previous file" data-tooltip="Previous file" ?disabled="${f<=0}" @click="${()=>this._select(this._order[f-1])}">${gc}</button> <button type="button" class="focus-code-nav-btn" aria-label="Next file" data-tooltip="Next file" ?disabled="${f===-1?this._order.length===0:f>=this._order.length-1}" @click="${()=>this._select(this._order[f+1])}">${xe}</button> </span>${this._fileName(e,r,t)} <button type="button" class="bundle-code-copy-path" data-copy-path="${e}" aria-label="Copy file path">${Hi}</button> <span class="bundle-code-main-spacer"></span> ${this._fileFigures(r,d)} ${this._toggles(h,Br(s),s.renamed,s.whitespace==="hideable",s.types)}</header><div class="bundle-compare-diff" tabindex="0" aria-label="${`Changes in ${b}`}">${this._dependencyChanges(e)} ${r.repointed?this._renderRepointed(e,r.repointed,[o,c].find(g=>typeof g=="string"&&g!=="")??null,u&&!h):m} ${v}</div>`}_toggles(e,t=null,r=!1,n=!1,s=!1){return a`${e?this._hides(r,n,s):m} ${t?a`<button type="button" class="${I({"bundle-compare-code-toggle":!0,"is-loading":t.status==="loading","is-error":t.status==="error"})}" aria-pressed="${String(!!l.bundleSourcePretty)}" aria-busy="${t.status==="loading"?"true":m}" aria-label="Pretty-print" data-tooltip="${`${Bc(t)}${gg(t.affects)}`}" @click="${()=>{Yt(),this.requestUpdate()}}">${Oc}</button>`:m} ${e?a`<span class="bundles-overview-sort bundle-compare-code-layout" role="group" aria-label="Diff layout">${[["unified","Unified"],["split","Split"]].map(([o,c])=>a`<button type="button" aria-pressed="${String(N.layout===o)}" @click="${()=>{N.layout=o,this.requestUpdate()}}">${c}</button>`)}</span>`:m}`}_importLines(e,t){let r=new Map;for(let{specifier:n}of e){if(r.has(n))continue;let s=["'",'"',"`"].map(o=>`${o}${n}${o}`);r.set(n,t.flatMap((o,c)=>s.some(u=>o.includes(u))?[c]:[]))}return r}_textSide(e){return K(this.other).has(e)?this.other:this.base}_dependencyChanges(e){if(e!=="package.json"||!this.dependencies)return m;let{added:t,changed:r,removed:n}=this.dependencies,s=[...t.map(d=>["added",d]),...r.map(d=>["changed",d]),...n.map(d=>["removed",d])];if(s.length===0)return m;let o=[[t,"new"],[r,"updated"],[n,"removed"]].filter(([d])=>d.length>0).map(([d,p])=>`${d.length} ${p}`),c=Map.groupBy(s.flatMap(([,d])=>d.flags??[]),({label:d})=>d),u=this.openDependency;return a`<section class="bundle-compare-code-deps" aria-label="Dependency changes"><h4>Dependencies <span>${o.join(" \xB7 ")}</span>${[...c].map(([d,p])=>a`<span class="bundle-compare-code-deps-flagged">${p.length} ${d}</span>`)}</h4><ul>${s.map(([d,p])=>{let h=d==="changed"?a`<span class="bundle-compare-code-dep-range">${p.from} → <b>${p.to}</b></span>`:a`<span class="bundle-compare-code-dep-range">${p.range}</span>`,f=a`<span class="bundle-compare-code-dep-name">${p.name}</span>${p.kind?a`<span class="npm-dependency-kind">${p.kind}</span>`:m}${h}${this.dependencyTags?.(p,d)??m}`,b=`${{added:"New",changed:"Updated",removed:"Removed"}[d]}: ${p.name}`;return a`<li>${u&&p.opens?a`<button type="button" class="${`bundle-compare-code-dep is-${d}`}" aria-label="${b}" @click="${()=>u(p)}">${f}</button>`:a`<span class="${`bundle-compare-code-dep is-${d}`}" aria-label="${b}">${f}</span>`}</li>`})}</ul></section>`}_renderRepointed(e,t,r,n){let s=r?r.split(`
94
+ `):[],o=r?this._highlighted(this._textSide(e),e,r):null,c=this._importLines(t,s),u=d=>d||"(empty target)";return a`<section class="bundle-compare-code-repointed" aria-label="Repointed imports"><h4>Repointed ${t.length===1?"import":"imports"} <b>${t.length}</b></h4><ul>${t.map(d=>{let p=c.get(d.specifier),h=`${d.conditions}${d.platform===null?"":` \xB7 Platform: ${d.platform}`}`;return a`<li><div class="bundle-compare-code-repointed-spec"><code data-tooltip-truncated data-tooltip="${d.specifier}">${d.specifier}</code> <span data-tooltip-truncated data-tooltip="${h}">${h}</span></div><div class="bundle-compare-code-repointed-targets"><span class="before"><span>Before</span><code data-tooltip-truncated data-tooltip="${u(d.baseTarget)}">${u(d.baseTarget)}</code></span> <span aria-hidden="true">→</span> <span class="after"><span>After</span><code data-tooltip-truncated data-tooltip="${u(d.otherTarget)}">${u(d.otherTarget)}</code></span></div>${p.slice(0,Fr).map(f=>this._importLine(f,s[f],o?.[f],d.specifier,n))} ${p.length>Fr?a`<span class="bundle-compare-code-repointed-more">and ${p.length-Fr} more ${p.length-Fr===1?"line":"lines"}</span>`:m}</li>`})}</ul></section>`}_importLine(e,t,r,n,s){let o=t.length>240?Math.max(0,t.indexOf(n)-80):0;return a`<button type="button" class="bundle-compare-code-repointed-line bundle-compare-diff-table" ?disabled="${!s}" aria-label="${`Go to line ${e+1}`}" @click="${()=>this._goToLine(e+1)}"><span class="diff-num">${e+1}</span> <code>${t.length<=240&&typeof r=="string"?J(dn(r,!0)):Vi(`${o>0?"\u2026":""}${t.slice(o,o+240)}${t.length>o+240?"\u2026":""}`,!0)}</code></button>`}_goToLine(e){let t=`${this._current}\0source`;e>(this._limits.get(t)??te)&&(this._limits.set(t,Math.ceil(e/te)*te),this.requestUpdate()),this.updateComplete.then(()=>this.querySelector(`.bundle-compare-diff [data-line="${e}"]`)?.scrollIntoView({block:"center"}))}_renderSource(e,t,r,{key:n,pretty:s}){let o=this._model(n,t,t),c={model:o,b:this._highlighted(this._textSide(e),e,t,s?.status==="ready"?"pretty":"")},u=new Set([...this._importLines(r,o.b).values()].flat()),d=`${e}\0source`,p=this._sought?.path===e&&this._sought.key!==n?this._soughtLine(e,this._entries.get(e),s,o):null;this._sought?.path===e&&(this._sought.key=n),p&&p.line<o.b.length&&(p.line>=(this._limits.get(d)??te)&&this._limits.set(d,Math.ceil((p.line+1)/te)*te),this._soughtRow={path:e,index:p.line});let h=this._limits.get(d)??te,f=o.b.length>h?o.b.slice(0,h):o.b;return a`<div class="bundle-compare-diff-table single" data-path="${e}" style="${_e({"--diff-num-width":`${String(o.b.length).length+1}ch`})}" role="table" aria-label="Source">${le(f,(b,v)=>v,(b,v)=>a`<div class="${I({"diff-row":!0,ctx:!0,"is-import":u.has(v)})}" role="row" data-line="${v+1}"><span class="diff-num">${v+1}</span>${this._codeCell(c,"b",v,null)}</div>`)}</div>${o.b.length>f.length?a`<div class="bundle-compare-code-more"><button type="button" class="bundle-compare-code-action" @click="${()=>{this._limits.set(d,h+te),this.requestUpdate()}}">Show ${Math.min(te,o.b.length-f.length).toLocaleString()} more lines</button> <span>${(o.b.length-f.length).toLocaleString()} not shown</span></div>`:m}`}_hides(e,t,r){let n=[e&&["Renames",Zp,N.ignoreRenames,()=>this._setRenames(!N.ignoreRenames)],t&&["Whitespace",th,N.ignoreWhitespace,()=>this._setWhitespace(!N.ignoreWhitespace)],r&&["Type-only",eh,N.ignoreTypes,()=>this._setTypes(!N.ignoreTypes)]].filter(Boolean);return n.length===0?m:a`<span class="bundle-compare-code-hide" role="group" aria-label="Hide"><span class="bundle-compare-code-hide-label" aria-hidden="true">Hide:</span>${n.map(([s,o,c,u])=>a`<mode-switch compact="compact" borderless .checked="${c}" accessible-label="${o}" label="${s}" @click="${u}"></mode-switch>`)}</span>`}_setWhitespace(e){N.ignoreWhitespace=e,this.requestUpdate()}_setTypes(e){N.ignoreTypes=e,this.requestUpdate()}_setRenames(e){N.ignoreRenames=e,e&&zp(),this.requestUpdate()}_renderDiff(e,t,{after:r,before:n,key:s,model:o,pretty:c,changes:u,hiding:d,warned:p=[],whitespace:h=null}){let{kind:f,basePath:b=e}=t,v=N.layout==="split",g=this._sought?.path===e&&this._sought.key!==s?this._soughtLine(e,t,c,o):null;this._sought?.path===e&&(this._sought.key=s);let y=g?this._seekRows(s,o,g,v):null;y?.index>=0&&(this._soughtRow={path:e,index:y.index+(v?1:0)});let k=this._expansions.get(s)??new Map,_=y?.rows??Lt(o,k,{split:v}),x=this._limits.get(s)??te,S=_.length>x?_.slice(0,x):_,T={model:o,a:f==="added"?null:this._highlighted(this.base,b,n,d?`renamed\0${this.other.integrity}\0${e}`:c?.status==="ready"?"pretty":""),b:f==="removed"?null:this._highlighted(this.other,e,r,c?.status==="ready"?"pretty":""),expand:(O,A)=>{let z=new Map(k);z.set(O,A==="all"?{all:!0}:{...z.get(O),[A]:(z.get(O)?.[A]??0)+ze}),this._expansions.set(s,z),this.requestUpdate()}},F=String(Math.max(o.a.length,o.b.length,1)).length;return a`${N.ignoreRenames&&u?.reason?a`<p class="bundle-compare-code-note">Renamed names are shown: ${hg[u.reason]??u.reason}.</p>`:m} ${ih[h]?a`<p class="bundle-compare-code-note">${ih[h]}</p>`:m} ${p.length>0?a`<p class="bundle-compare-code-note">${lh(p)} <button type="button" @click="${()=>this._setRenames(!1)}">Show them marked</button></p>`:m}<div class="${I({"bundle-compare-diff-table":!0,split:v,unified:!v})}" data-path="${e}" style="${_e({"--diff-num-width":`${F+1}ch`})}" role="table" aria-label="Diff">${v?a`<div class="diff-row diff-split-head" role="row"><span class="diff-half">Before<strong data-tooltip-truncated data-tooltip="${this.baseName}">${this.baseName}</strong></span> <span class="diff-half">After<strong data-tooltip-truncated data-tooltip="${this.otherName}">${this.otherName}</strong></span></div>`:m} ${le(S,O=>this._rowKey(O),O=>v?this._splitRow(O,T):this._unifiedRow(O,T))}</div>${_.length>S.length?a`<div class="bundle-compare-code-more"><button type="button" class="bundle-compare-code-action" @click="${()=>{this._limits.set(s,x+te),this.requestUpdate()}}">Show ${Math.min(te,_.length-S.length).toLocaleString()} more rows</button> <span>${(_.length-S.length).toLocaleString()} not shown</span></div>`:m}`}_rowKey(e){return e.kind==="fold"?`f${e.run}:${e.a}`:e.kind==="change"?`c${e.left??""}:${e.right??""}`:`${e.kind}${e.a??""}:${e.b??""}`}_words(e,t,r){if(t==null||r==null)return null;let n=`${t}:${r}`;return e.words.has(n)||e.words.set(n,Wc(e.a[t],e.b[r])),e.words.get(n)}_code(e,t,r,n){let s=n&&!(e.endsWith("\r")&&r?.at(-1)?.[1]===e.length);if(typeof t=="string")return J(dn(Mp(t,r),s));if(r){let o=Pp(e,r);return o.map((c,u)=>{let d=Vi(c.text,s&&u===o.length-1);return c.marked?a`<mark class="diff-word">${d}</mark>`:d})}return Vi(e,s)}_cell(e,t,r,n,s){return r==null?a`<span class="diff-num"></span><span class="diff-sign"></span><span class="diff-code diff-empty"></span>`:a`<span class="diff-num">${r+1}</span><span class="diff-sign">${n}</span>${this._codeCell(e,t,r,s)}`}_noEol(e,t,r){return r!=null&&e.noEol[t]&&r===e[t].length-1}_fold(e,t){let r=e.count<=ze;return a`<div class="diff-row diff-fold" role="row"><span class="diff-fold-actions">${!r&&e.down?a`<button type="button" aria-label="${`Show ${ze} more lines below`}" data-tooltip="${`Show ${ze} more lines`}" @click="${()=>t.expand(e.run,"top")}"><svg viewBox="0 0 16 16" width="12" height="12" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 3v9m-4-4 4 4 4-4"/></svg></button>`:m} ${!r&&e.up?a`<button type="button" aria-label="${`Show ${ze} more lines above`}" data-tooltip="${`Show ${ze} more lines`}" @click="${()=>t.expand(e.run,"bottom")}"><svg viewBox="0 0 16 16" width="12" height="12" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 13V4M4 8l4-4 4 4"/></svg></button>`:m} <button type="button" aria-label="${`Show all ${e.count} unchanged lines`}" data-tooltip="Show all" @click="${()=>t.expand(e.run,"all")}"><svg viewBox="0 0 16 16" width="12" height="12" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m4 6 4-4 4 4M4 10l4 4 4-4"/></svg></button> </span><span class="diff-fold-label">${e.count.toLocaleString()} unchanged ${e.count===1?"line":"lines"} · ${e.b+1}–${e.b+e.count}</span></div>`}_unifiedRow(e,t){let{model:r}=t;if(e.kind==="fold")return this._fold(e,t);if(e.kind==="ctx")return a`<div class="diff-row ctx" role="row"><span class="diff-num">${e.a+1}</span>${this._cell(t,"b",e.b," ",null)}</div>`;let n=e.kind==="del",s=n?this._words(r,e.a,e.pair)?.a:this._words(r,e.pair,e.b)?.b,o=r.marked?.has(e.change);return a`<div class="${`diff-row ${e.kind}${o?" renamed":""}`}" role="row" data-tooltip="${o?"Renamed names alone":m}">${n?a`<span class="diff-num">${e.a+1}</span><span class="diff-num"></span><span class="diff-sign">−</span>${this._codeCell(t,"a",e.a,s)}`:a`<span class="diff-num"></span><span class="diff-num">${e.b+1}</span><span class="diff-sign">+</span>${this._codeCell(t,"b",e.b,s)}`}</div>`}_codeCell(e,t,r,n){let s=e.model[t],o=e[t]?.[r],c=s[r],u=this._noEol(e.model,t,r),d=dh.get(s);d||dh.set(s,d=new Map);let p=d.get(r);return(!p||p.markup!==o||p.ranges!==n||p.noEol!==u)&&d.set(r,p={markup:o,ranges:n,noEol:u,drawn:this._code(c,o,n,!u)}),a`<span class="${I({"diff-code":!0,"diff-long":c.length>Cc})}">${p.drawn}${u?a`<span class="diff-no-eol" data-tooltip="No newline at end of file" aria-label="No newline at end of file">⊘</span>`:m}</span>`}_splitRow(e,t){let{model:r}=t;if(e.kind==="fold")return this._fold(e,t);if(e.kind==="ctx")return a`<div class="diff-row ctx" role="row"><span class="diff-half">${this._cell(t,"a",e.a," ",null)}</span> <span class="diff-half">${this._cell(t,"b",e.b," ",null)}</span></div>`;let n=e.paired?this._words(r,e.left,e.right):null,s=r.marked?.has(e.change);return a`<div class="${`diff-row change${s?" renamed":""}`}" role="row" data-tooltip="${s?"Renamed names alone":m}"><span class="${I({"diff-half":!0,del:e.left!==null,blank:e.left===null})}">${this._cell(t,"a",e.left,"\u2212",n?.a)}</span> <span class="${I({"diff-half":!0,add:e.right!==null,blank:e.right===null})}">${this._cell(t,"b",e.right,"+",n?.b)}</span></div>`}};customElements.define("bundle-compare-code",Mt);var fh=Symbol.for(""),bg=i=>{if(i?.r===fh)return i?._$litStatic$};var yo=(i,...e)=>({_$litStatic$:e.reduce((t,r,n)=>t+(s=>{if(s._$litStatic$!==void 0)return s._$litStatic$;throw Error(`Value passed to 'literal' function must be a 'literal' result: ${s}. Use 'unsafeStatic' to pass non-literal values, but
95
+ take care to ensure page security.`)})(r)+i[n+1],i[0]),r:fh}),mh=new Map,_o=i=>(e,...t)=>{let r=t.length,n,s,o=[],c=[],u,d=0,p=!1;for(;d<r;){for(u=e[d];d<r&&(s=t[d],(n=bg(s))!==void 0);)u+=n+e[++d],p=!0;d!==r&&c.push(s),o.push(u),d++}if(d===r&&o.push(e[r]),p){let h=o.join("$$lit$$");(e=mh.get(h))===void 0&&(o.raw=o,mh.set(h,e=o)),t=c}return i(e,...t)},gh=_o(a),xx=_o(ye),Sx=_o(Go);var ko=25e3,ai=40,vg=i=>[...i].toSorted(([e],[t])=>e.localeCompare(t));function bh(i,e,t,{resolutions:r=[],max:n=ko}={}){let s=new Map,o=Tr(t);if(o.size*2>=n)return{rows:1/0,models:s};let c=new Set(r.map(d=>d.parent).filter(d=>!o.has(d))),u=r.length*2+c.size;for(let[d,p]of vg(o)){u++;let{before:h,after:f}=ce(i,e,d,p);if(p.modified===!1)u++;else if(typeof h=="string"&&typeof f=="string"){if(at(h,f))return{rows:1/0,models:s};let b=Lr(h,f);s.set(d,b),u+=Math.max(Lt(b).length,1)}else u++;if(u>=n)break}return{rows:u,models:s}}var wo=class extends Mt{static properties={...Mt.properties,models:{attribute:!1}};constructor(){super(),this.models=null,this._modelCap=1/0,this._fileLimit=ai}_renamesAlone=!1;willUpdate(e){if(super.willUpdate(e),e.has("models"))for(let[t,r]of this.models??[]){let n=this._entries.get(t);if(!n)continue;let{before:s,after:o}=ce(this.base,this.other,t,n);this._models.set(bo(t,!1,{ignoreWhitespace:!1,ignoreRenames:!1}),{model:r,before:s,after:o,given:null})}e.has("files")&&(this._fileLimit=ai,this._current=this._picked=null),(e.has("path")||e.has("files"))&&this.path&&this.path!==this._current&&(this._goTo=this.path),e.has("files")&&(this._toTop=!0)}updated(){let e=this._goTo&&this._section(this._goTo);if(e)this._picked=this._goTo,e.scrollIntoView({block:"start"});else if(this._toTop){let t=this.querySelector(".bundle-compare-diff");t&&(t.scrollTop=0)}this._goTo=null,this._toTop=!1,this._current!==this._shownPath&&(this._shownPath=this._current,this.querySelector(".bundle-compare-code-tree .bundle-code-tree-link.current")?.scrollIntoView({block:"nearest"})),this._scrollSought()}_select(e,t=!0){!e||this.extensions?.canSelect?.()===!1||(this._current=this._picked=e,this.requestUpdate(),t&&this.updateComplete.then(()=>this._section(e)?.scrollIntoView({block:"start"})),this.dispatchEvent(new CustomEvent("compare-code-select",{detail:{path:e},bubbles:!0,composed:!0})))}_more(){this._fileLimit+=ai,this.requestUpdate()}_searchable(e){return e.modified!==!1&&e.kind!=="repointed"}_countingState(e,t){return this._states?.get(e)??super._countingState(e,t)}_section(e){return[...this.querySelectorAll(".bundle-compare-all-file")].find(t=>t.dataset.path===e)??null}_spy(){this._spying||this.extensions?.canSelect?.()===!1||(this._spying=requestAnimationFrame(()=>{this._spying=0;let e=this.querySelector(".bundle-compare-diff");if(!e||this.extensions?.canSelect?.()===!1)return;this._fileLimit<this._order.length&&e.scrollTop+2*e.clientHeight>=e.scrollHeight&&this._more();let{top:t,bottom:r}=e.getBoundingClientRect(),n=this._picked&&this._section(this._picked)?.getBoundingClientRect();if(n&&n.bottom>t&&n.top<r)return;this._picked=null;let s=null;for(let c of e.querySelectorAll(":scope > .bundle-compare-all-file")){if(c.getBoundingClientRect().top>t+4)break;s=c}let o=s?.dataset.path??this._order[0]??null;o!==this._current&&(this._current=o,this.requestUpdate(),this.dispatchEvent(new CustomEvent("compare-code-select",{detail:{path:o},bubbles:!0,composed:!0})))}))}_fileBody(e,t,r){let n=t.repointed?this._renderRepointed(e,t.repointed,[r.after,r.before].find(o=>typeof o=="string"&&o!=="")??null,!1):m,s=t.kind==="repointed"||t.kind==="renamed"&&!t.modified&&!!t.repointed&&!t.meta&&!(r.model?.blocks.length>0);return a`${this._dependencyChanges(e)}${n}${s?m:this._fileMessage(e,t,r)??this._renderDiff(e,t,r)}`}_fileContent(e,t,r,n){return a`<header class="bundle-code-main-bar bundle-compare-all-file-head">${this._fileName(e,t,n)} <span class="bundle-code-main-spacer"></span> ${this._fileFigures(t,r.model)}</header>${this._fileBody(e,t,r)}`}_layout(e,t){return a`<div class="bundle-code-view bundle-compare-code">${this._renderRail(e,this._current)}<div class="bundle-code-main">${t}</div></div>`}render(){let e=this._railState(),t=this.extensions?.fullPaths?"":e.prefix,r=this.extensions?.filterContent===!1?e.allOrder:e.order;this._order=r,this._goTo&&r.includes(this._goTo)&&(this._current=this._goTo),r.includes(this._current)||(this._current=r[0]??null),this._current&&(this._goTo||this._current!==this._shownPath)&&this._reveal(this._current,e.prefix);let n=r.indexOf(this._current);n>=this._fileLimit&&(this._fileLimit=Math.ceil((n+1)/ai)*ai);let s=r.map(g=>[g,this._entries.get(g)]),o=s.map(([g,y])=>({path:g,entry:y,file:this._fileState(g,y)})),c=o.reduce((g,{file:y})=>g+(y.model?.additions??0),0),u=o.reduce((g,{file:y})=>g+(y.model?.deletions??0),0);this._states=new Map(o.map(({path:g,file:y})=>[g,y]));let d=o.filter(({file:g})=>Br(g)),p=d.map(({file:g})=>Br(g)),h=p.filter(g=>g.status==="error"),f=h.length>0?{...h[0],failed:h.length,of:p.length}:p.find(g=>g.status==="loading")??p[0]??null,b=f&&{...f,affects:d.map(({path:g})=>g)},v=o.some(({file:g})=>g.model?.blocks.length>0||g.whitespace||g.hiding||g.types);return this._layout(e,a`<header class="bundle-code-main-bar bundle-compare-code-bar"><span class="bundle-compare-all-title">${s.length.toLocaleString()} ${s.length===1?"file":"files"} changed</span> ${c+u>0?vo(c,u):m} <span class="bundle-code-main-spacer"></span> ${this._toggles(v,b,o.some(({file:g})=>g.renamed),o.some(({file:g})=>g.whitespace==="hideable"),o.some(({file:g})=>g.types))}</header><div class="bundle-compare-diff" tabindex="0" aria-label="Every change" @scroll="${()=>this._spy()}">${s.length===0?a`<div class="bundle-code-placeholder">${this._entries.size===0?"No files differ in this comparison.":"No changed files match."}</div>`:le(o.slice(0,this._fileLimit),({path:g})=>g,({path:g,entry:y,file:k})=>a`<section class="bundle-compare-all-file" aria-label="${g}" data-path="${g}">${this.extensions?.fileActions?a`<div class="bundle-compare-file-content">${this._fileContent(g,y,k,t)}</div>${this.extensions.fileActions(g,!0)}`:this._fileContent(g,y,k,t)}</section>`)} ${o.length>this._fileLimit?a`<button type="button" class="bundle-compare-code-action bundle-compare-all-more" @click="${()=>this._more()}">Show more files (${(o.length-this._fileLimit).toLocaleString()} remaining)</button>`:m}</div>`)}};customElements.define("bundle-compare-all",wo);function Nr({base:i,other:e,diff:t,source:r,path:n,seek:s,baseName:o,otherName:c,select:u,extensions:d=null,mode:p}){let h=p?null:t.combined??=bh(i,e,t.files,{resolutions:t.resolutions?.changed??[]});p??=h.rows<ko?"diff":"code";let f=p==="diff"?yo`bundle-compare-all`:yo`bundle-compare-code`;return gh`<${f} .base=${i} .other=${e} .files=${t.files} .scope=${t.scope??""} .resolutions=${t.resolutions?.changed??[]}
96
+ .baseAlerts=${r?.files?.alerts?.(i)??null} .otherAlerts=${r?.files?.alerts?.(e)??null} .alertTags=${r?.files?.alertTags??null}
97
+ .newHosts=${r?.files?.newHosts?.(i,e)??null} .newHostTag=${r?.files?.newHostTag??null}
98
+ .dependencies=${r?.dependencies?.(i,e)??null} .openDependency=${r?.openDependency??null} .dependencyTags=${r?.dependencyTags??null}
99
+ .models=${h?.models??null} .path=${n} .seek=${s} .extensions=${d} baseName=${o} otherName=${c}
100
+ @compare-code-select=${b=>{b.stopPropagation(),u(b.detail.path)}}></${f}>`}var yg=400,vh=24,zr=["removed","added","changed"],ue=null;function qe(i){return i.join(", ")}var $o=class extends U{static properties={details:{attribute:!1},integrity:{attribute:!1},request:{attribute:!1},source:{attribute:!1},review:{attribute:!1},_targetIntegrity:{state:!0},_otherDetails:{state:!0},_status:{state:!0},_scope:{state:!0},_fileSort:{state:!0},_pkgSort:{state:!0},_openSections:{state:!0},_mode:{state:!0},_codePath:{state:!0},_codeSeek:{state:!0}};createRenderRoot(){return this}constructor(){super(),this.details=null,this.integrity=null,this.request=null,this.source=null,this._targetIntegrity=null,this._otherDetails=null,this._status="idle",this._scope="",this._fileSort={removed:"name",added:"name",changed:"name"},this._pkgSort={removed:"size",added:"size",changed:"size"},this._openSections=new Set,this._mode="overview",this._codePath=null,this._codeSeek=null,this._diff=null,this._diffKey=null,this._fitBody=null,this._fitObserver=null}connectedCallback(){super.connectedCallback(),this._fitBody&&this._fitObserver?.observe(this._fitBody)}disconnectedCallback(){super.disconnectedCallback(),this._fitObserver?.disconnect()}willUpdate(e){e.has("source")&&this.source&&!e.get("source")&&(this._openSections=new Set([...this._openSections,"files"])),(e.has("_otherDetails")||e.has("details"))&&this._status==="ready"&&!wn(this.details,this._otherDetails).some(t=>t.id===this._scope)&&(this._scope=""),e.has("integrity")&&this._rebase(),(e.has("request")||e.has("integrity"))&&this.integrity&&this.request?.bundle===this.integrity?(this.request.target!==this._targetIntegrity&&this._choose(this.request.target),this._mode=$i(this.request.mode)):e.has("request")&&!e.has("integrity")&&e.get("request")?.bundle===this.integrity&&(this._targetIntegrity&&this._choose(null),this._mode="overview")}updated(){let e=this.querySelector(".bundle-compare-body");e!==this._fitBody&&typeof ResizeObserver=="function"&&(this._fitObserver??=new ResizeObserver(()=>this._fitLists()),this._fitObserver.disconnect(),e&&this._fitObserver.observe(e),this._fitBody=e),this._fitLists()}_fitLists(){let e=this._fitBody;if(!e)return;let t=getComputedStyle(e),r=e.getBoundingClientRect().top+e.clientTop+parseFloat(t.paddingTop)-e.scrollTop,n=f=>{let b=f.getBoundingClientRect();return b.top-r+f.parentElement.getBoundingClientRect().bottom-b.bottom},s=e.querySelector(".bundle-compare-rows--fill");if(s){let f=n(s),b=s.closest(".bundle-compare-section");for(let v=b;v;v=v.nextElementSibling){let g=v.matches("details[open]")&&v.querySelector(":scope > summary"),y=v===b?0:g?g.getBoundingClientRect().bottom+parseFloat(getComputedStyle(g).marginBottom)-v.getBoundingClientRect().top:v.getBoundingClientRect().height;f+=y+parseFloat(getComputedStyle(v).marginBottom)}e.style.setProperty("--compare-fill-around",`${f}px`)}let o=[...e.querySelectorAll(".bundle-compare-rows--scroll:not(.bundle-compare-rows--fill)")];if(o.length===0)return;let c=e.lastElementChild,u=new Map(o.filter(f=>c.contains(f)).map(f=>[f,f.parentElement.getBoundingClientRect().top])),d=Math.max(...u.values()),p=e.clientHeight-parseFloat(t.paddingTop)-parseFloat(t.paddingBottom),h=parseFloat(getComputedStyle(c).marginBottom);for(let f of o)u.get(f)>=d-1?f.style.setProperty("--compare-rest",`${p-n(f)-h}px`):f.style.removeProperty("--compare-rest")}_rebase(){let e=this._baseKey;if(ue&&e&&e!==ue.base&&(ue=null),ue&&e===ue.base){let{target:t}=ue;if(this._scope=ue.scope,this._mode=ue.mode,this._codePath=ue.codePath,ue=null,!t){this._targetIntegrity=null,this._otherDetails=null,this._status="idle";return}this._targetIntegrity=t,this._diff=null,this._diffKey=null;let r=this.source?null:oc(t,n=>!!(n.json||n.bundle));r?(this._otherDetails=r,this._status="ready"):(this._otherDetails=null,this._status="loading",this._loadOther(t));return}this._targetIntegrity=null,this._otherDetails=null,this._status="idle",this._scope="",this._codePath=null,this._diff=null,this._diffKey=null}get _baseKey(){return this.source?this.source.base:this.integrity}_swap(){let e=this._targetIntegrity;e&&e!==this._baseKey&&this._reopen(e,this._baseKey)}_pickBase(e){!e||e===this._baseKey||(e===this._targetIntegrity?this._swap():this._reopen(e,this._targetIntegrity))}_reopen(e,t){if(this.source){ue={base:e,target:t,scope:this._scope,mode:this._mode,codePath:this._codePath},this.source.open(e,t,this._mode);return}if(!Gt(l.bundles??[],this.integrity).some(s=>s.integrity===e))return;ue={base:e,target:t,scope:this._scope,mode:this._mode,codePath:this._codePath};let r=s=>s&&!s.error&&(s.json||s.bundle)&&[e,t].includes(s.integrity),n=[this._otherDetails,this._baseReady?this.details:null].filter(r);this.dispatchEvent(new CustomEvent("bundle-swap",{bubbles:!0,composed:!0,detail:{integrity:e,target:t,bundles:n,mode:this._mode}}))}_nameFor(e){return this.source?this.source.name(e):(l.bundles??[]).find(r=>r.integrity===e)?.name??`${e.slice(0,15)}\u2026`}_pick(e){this._choose(e),this._notify()}_notify(){this.dispatchEvent(new CustomEvent("bundle-compare-change",{bubbles:!0,composed:!0,detail:{base:this.integrity,target:this._targetIntegrity,mode:this._mode}}))}_choose(e){let t=e||null;if(this._targetIntegrity=t,this._otherDetails=null,this._codePath=null,this._diff=null,this._diffKey=null,!t){this._status="idle",this._scope="";return}this._status="loading",this._loadOther(t)}async _loadOther(e){if(this.source){let n;try{n=await this.source.load(e)}catch(s){if(s.name==="AbortError")return;n={error:s.message}}if(this._targetIntegrity!==e)return;this._otherDetails=n,this._status="ready";return}let t=Gt(l.bundles??[],this.integrity).find(n=>n.integrity===e);if(!t){this._status="idle",this._targetIntegrity=null,this._notify();return}let r;try{r=await ac(e,t)}catch(n){if(n.name==="AbortError")return;throw n}this._targetIntegrity===e&&(this._otherDetails=r,this._status="ready")}get _baseReady(){return!!(this.details&&this.details.integrity===this.integrity&&(this.details.json||this.details.bundle))}_openFile(e){this._codePath=e,this._mode="code",this._notify()}_openLine({path:e,line:t,query:r}){this._codeSeek={path:e,line:t-1,query:r},this._openFile(e)}_fileRow(e,t,r,n=e,s=!1,o=void 0,c=e,u=void 0){let d=this.source?.files;return a`<li><button type="button" class="bundle-compare-row bundle-compare-row-link" @click="${()=>this._openFile(e)}">${d?d.icon(e,[[this._otherDetails,c],[this.details,e]]):m}<span class="bundle-compare-row-path mono" data-tooltip-truncated data-tooltip="${n}">${t}</span>${d&&s?d.tag(this.details,e,u):m}${oi(o)}${r}</button></li>`}_group(e,t,r,n,s,o=m,{fill:c=!1,lanes:u=zr,style:d={}}={}){return t.length===0?m:a`<section class="${`bundle-compare-group bundle-compare-${r}`}" style="${_e({"--compare-lane":String(u.indexOf(r)+1),...d})}"><header class="bundle-compare-group-head"><span class="bundle-compare-dot" aria-hidden="true"></span> <span class="bundle-compare-group-title" data-tooltip-truncated data-tooltip="${e}">${e}</span> <span class="bundle-compare-group-count">${t.length}</span> ${o}</header><ul class="${c?"bundle-compare-rows bundle-compare-rows--scroll bundle-compare-rows--fill":"bundle-compare-rows bundle-compare-rows--scroll"}">${le(t,n,s)}</ul></section>`}_sizeCells(e){let t=n=>n==null?"\u2014":G(n),r=n=>`${n.toLocaleString()} LoC`;return e.delta===void 0?a`<span class="bundle-compare-row-size" data-tooltip="${e.lines>0?r(e.lines):m}">${t(e.bytes)}</span>`:a`<span class="${`bundle-compare-row-delta ${e.delta===null?"":Rt(e.delta)}`}" data-tooltip="${`${t(e.baseBytes)} \u2192 ${t(e.otherBytes)}${e.baseLines>0||e.otherLines>0?` \xB7 ${e.baseLines.toLocaleString()} \u2192 ${r(e.otherLines)}`:""}`}">${e.delta===null?"\u2014":Ys(e.delta)}</span>`}_sortActions(e,t,r,n=!1,s=this[e][t]){return a`<span class="bundles-overview-sort" role="group" aria-label="${`${t} ${r} order`}">${[["name","Name"],["size","Size"],...n?[["flags","Flags"]]:[]].map(([o,c])=>a`<button type="button" aria-pressed="${String(s===o)}" @click="${()=>{this[e]={...this[e],[t]:o}}}">${c}</button>`)}</span>`}_fileGroup(e,t,r,n,s){let o=this.source?.files,c=r!=="removed",u=g=>r==="added"?null:{details:this._otherDetails,path:g.basePath??g.path},d=g=>[...c&&o?.flags?o.flags(this.details,g.path,u(g)):[],...Vp(g.meta)],p=t.some(g=>d(g).length>0),h=this._fileSort[r]==="flags"&&!p?"name":this._fileSort[r],f=g=>r==="changed"?Math.abs(g.delta):g.bytes,b=h==="flags"?pd(t,d,g=>g.path):t.toSorted((g,y)=>(h==="size"?f(y)-f(g):0)||g.path.localeCompare(y.path)),v=g=>g.renamedFrom==null?this._fileRow(g.path,n(g.path),this._sizeCells(g),g.path,c,g.meta,g.basePath??g.path,u(g)):this._fileRow(g.path,Cr(n(g.renamedFrom),n(g.path)),this._sizeCells(g),`${g.renamedFrom} \u2192 ${g.path}`,c,g.meta,g.basePath??g.path,u(g));return this._group(e,b,r,g=>g.path,v,this._sortActions("_fileSort",r,"file",p,h),{lanes:s})}_pkgGroup(e,t,r,n){let s=this._pkgSort[r],o=d=>{let p=r==="changed"?d.delta:d.bytes;return p==null?-1:Math.abs(p)},c=t.toSorted((d,p)=>(s==="size"?o(p)-o(d):0)||Ke(d.pkg).localeCompare(Ke(p.pkg))),u=r==="changed"?0:Math.min(vh,Math.max(0,...t.map(d=>qe(d.versions).length)));return this._group(e,c,r,d=>d.pkg,d=>a`<li><div class="bundle-compare-row"><span class="bundle-compare-pkg-dot" style="${_e({background:Mi(d.pkg)})}"></span> <span class="bundle-compare-row-path" data-tooltip-truncated data-tooltip="${Ke(d.pkg)}">${Ke(d.pkg)}</span> ${r==="changed"?this._versionCell(d):u>0?a`<span class="bundle-compare-dep-ver" data-tooltip-truncated data-tooltip="${qe(d.versions)}">${qe(d.versions)}</span>`:m} ${this._sizeCells(r==="changed"?d:{bytes:d.bytes})}</div></li>`,this._sortActions("_pkgSort",r,"package"),{fill:!0,lanes:n,style:u>0?{"--compare-version-width":`${u}ch`}:{}})}_versionCell(e){let t=e.otherVersions,r=e.baseVersions;if(r.join()===t.join())return r.length>0?a`<span class="bundle-compare-dep-ver">${qe(r)}</span>`:m;let n=e.direction??"changed",s=n==="up"?"\u2191":n==="down"?"\u2193":"\xB1";return a`<span class="bundle-compare-ver" aria-label="${`${n==="up"?"Upgraded":n==="down"?"Downgraded":"Changed"}: ${qe(r)||"none"} to ${qe(t)||"none"}`}"><span class="bundle-compare-ver-from">${qe(r)||"\u2014"}</span> <span class="bundle-compare-ver-arrow" aria-hidden="true">→</span> <span class="${`bundle-compare-ver-to ${n}`}">${qe(t)||"\u2014"}</span> <span class="${`bundle-compare-ver-dir ${n}`}" aria-hidden="true">${s}</span></span>`}_depGroup(e,t,r,n){let s=r==="changed"?0:Math.min(vh,Math.max(0,...t.map(u=>u.range.length))),o=u=>a`<span class="bundle-compare-row-path" data-tooltip-truncated data-tooltip="${u.name}">${u.name}</span> ${this.source?.dependencyTags?.(u,r)??m}${u.kind?a`<span class="npm-dependency-kind">${u.kind}</span>`:m} ${r==="changed"?a`<span class="bundle-compare-ver" aria-label="${`Changed: ${u.from} to ${u.to}`}"><span class="bundle-compare-ver-from">${u.from}</span> <span class="bundle-compare-ver-arrow" aria-hidden="true">→</span> <span class="bundle-compare-ver-to changed">${u.to}</span></span>`:a`<span class="bundle-compare-dep-ver" data-tooltip-truncated data-tooltip="${u.range}">${u.range}</span>`}`,c=this.source?.openDependency;return this._group(e,t,r,u=>u.key,u=>a`<li>${c&&u.opens?a`<button type="button" class="bundle-compare-row bundle-compare-row-link" @click="${()=>c(u)}">${o(u)}</button>`:a`<div class="bundle-compare-row">${o(u)}</div>`}</li>`,m,{fill:!0,lanes:n,style:s>0?{"--compare-version-width":`${s}ch`}:{}})}_renderDependencies(e,t,r,n){return n.length===0?m:a`<section class="bundle-compare-section"><h3 class="bundle-compare-section-head">Dependencies</h3>${this._cols(n,a`${this._depGroup(`Removed \xB7 only in ${t}`,e.removed,"removed",n)} ${this._depGroup(`Added \xB7 only in ${r}`,e.added,"added",n)} ${this._depGroup("Changed",e.changed,"changed",n)}`,"dependencies")}</section>`}_renderPackages(e,t,r,n=zr){return e.removed.length===0&&e.added.length===0&&e.changed.length===0?m:a`<section class="bundle-compare-section"><h3 class="bundle-compare-section-head">Packages</h3>${this._cols(n,a`${this._pkgGroup(`Removed \xB7 only in ${t}`,e.removed,"removed",n)} ${this._pkgGroup(`Added \xB7 only in ${r}`,e.added,"added",n)} ${this._pkgGroup("Changed",e.changed,"changed",n)}`,"packages")}</section>`}_cols(e,t,r){let n=e.map(s=>s==="changed"?"minmax(0, 5fr)":"minmax(0, 4fr)").join(" ");return a`<div class="bundle-compare-cols" data-lanes="${e.length}" data-section="${r}" style="${_e({"--compare-lanes":n})}">${t}</div>`}_collapsible(e,t,r,n,s=""){let o=this._openSections.has(e);return a`<details class="bundle-compare-section bundle-compare-collapsible" .open="${j(o)}" @toggle="${c=>this._setSection(e,c.currentTarget.open)}"><summary class="bundle-compare-section-head" @click="${c=>{c.preventDefault(),this._setSection(e,!o)}}">${t} <span class="bundle-compare-section-count">${r.toLocaleString()}</span>${s?a`<span class="bundle-compare-section-note" data-tooltip-truncated data-tooltip="${s}">${s}</span>`:m}</summary>${o?n():m}</details>`}_setSection(e,t){if(t===this._openSections.has(e))return;let r=new Set(this._openSections);t?r.add(e):r.delete(e),this._openSections=r}_renderResolutions(e){if(e.totalChanges===0)return m;let t=e.changed,r=t.slice(0,yg),n=t.length-r.length,s=(u,d="")=>a`<td class="${d}"><code data-tooltip-truncated data-tooltip="${u}">${u}</code></td>`,o=u=>`${u.conditions}${u.platform===null?"":` \xB7 Platform: ${u.platform}`}`,c=r.some(u=>o(u)!=="*");return this._collapsible("resolutions","Import resolutions",t.length,()=>a`<section class="bundle-compare-group bundle-compare-changed bundle-compare-resolutions"><header class="bundle-compare-group-head"><span class="bundle-compare-dot" aria-hidden="true"></span> <span class="bundle-compare-group-title">Repointed</span> <span class="bundle-compare-group-count">${t.length}</span></header><table class="${c?"":"bundle-compare-resolutions--no-context"}"><thead><tr><th>File</th><th>Import</th><th>Before</th><th>After</th>${c?a`<th>Conditions</th>`:m}</tr></thead><tbody>${le(r,u=>u.key,u=>{let d=o(u);return a`<tr><td><button type="button" class="bundle-compare-resolution-parent" data-tooltip-truncated data-tooltip="${u.parent}" @click="${()=>this._openFile(u.parent)}">${u.parent}</button></td>${s(u.specifier)} ${s(u.baseTarget||"(empty target)","bundle-compare-resolution-before")} ${s(u.otherTarget||"(empty target)","bundle-compare-resolution-after")} ${c?a`<td class="bundle-compare-resolution-context"><span data-tooltip-truncated data-tooltip="${d}">${d}</span></td>`:m}</tr>`})}</tbody></table>${n>0?a`<div class="bundle-compare-more">and ${n.toLocaleString()} more…</div>`:m}</section>`)}_diffFor(){let e=`${this.integrity}|${this._targetIntegrity}|${this._scope}`;return(this._diffKey!==e||!this._diff)&&(this._diff=Sr(this._otherDetails,this.details,this._scope),this._diffKey=e),this._diff}_renderSummary(e){return $r(e,a`<div class="bundle-compare-modes" role="tablist" aria-label="Comparison view">${[["overview","Overview"],["code","Code"]].map(([t,r])=>a`<button type="button" role="tab" aria-selected="${String(this._mode===t)}" @click="${()=>{this._mode=t,this._notify()}}">${r}</button>`)}</div>`)}_renderPicker(e,t,r,n){return kr({source:this.source,from:{options:e,value:this._targetIntegrity,pick:s=>this._pick(s)},to:{options:this._baseOptions(),value:this._baseKey,placeholder:this._nameFor(this.integrity),pick:s=>this._pickBase(s)},clear:t?{run:()=>this._pick(null)}:null,swap:t&&this.source?.canSwap?.(this._targetIntegrity)!==!1?()=>this._swap():null,extras:r,comparison:n,openLine:s=>this._openLine(s)})}_baseOptions(){if(this.source)return Ne(this.source.choices??[]);let e=(l.bundles??[]).find(r=>r.integrity===this.integrity),t=Gt(l.bundles??[],this.integrity);return this._bundleOptions(e?[e,...t]:t)}_otherOptions(){return this.source?Ne(this.source.options):this._bundleOptions(Gt(l.bundles??[],this.integrity))}_bundleOptions(e){let t=new Map;for(let r of e)t.set(r.name,(t.get(r.name)??0)+1);return e.map(r=>({id:r.integrity,integrity:r.integrity,kind:r.kind??(r.name.toLowerCase().endsWith(".map")?"sourcemap":"stasis"),summary:r.summary,size:typeof r.size=="number"?G(r.size):"\u2014",filename:t.get(r.name)>1?`${r.name} \xB7 ${r.integrity.slice(7,13)}\u2026`:r.name}))}render(){let e=this._otherOptions(),t=!!this._targetIntegrity&&(!!this.source||e.some(h=>h.integrity===this._targetIntegrity)),r=this._baseReady?wn(this.details,t?this._otherDetails:null):[],n=r.length>0?a`<bundle-scope-selector .reasons="${r}" .value="${this._scope}" label="Compare scope" @scope-change="${h=>{this._scope=h.detail.value}}"></bundle-scope-selector>`:m,s=this.source?.noun??"bundle",o=t&&this._status==="ready"&&this._otherDetails&&(this._otherDetails.json||this._otherDetails.bundle)&&!this._otherDetails.error,c=this._baseReady&&o?{base:this._otherDetails,other:this.details,files:this._diffFor().files}:null,u=e.length>0||this.source?this._renderPicker(e,t,n,c):n,d=this._baseReady&&o?this._mode:"overview",p;return this._baseReady?this.source&&!t&&(this.source.pending||this.source.error||e.length===0)?p=a`<div class="${`bundle-compare-empty${this.source.error?" is-error":""}`}">${this.source.pending?`Loading ${s}s\u2026`:this.source.error??a`No other ${s}s to compare <strong>${this._nameFor(this.integrity)}</strong> with.`}</div>`:e.length===0&&!this.source?p=a`<div class="bundle-compare-empty">No other bundles to compare with. Drop a second <code>.map</code> or <code>.stasis.code.br</code> bundle to diff against this one.</div>`:t?this._status==="loading"||!this._otherDetails?p=a`<div class="bundle-compare-empty">Comparing…</div>`:this._otherDetails.error?p=a`<div class="bundle-compare-empty is-error">Couldn't read the selected ${s}: ${this._otherDetails.error}</div>`:!this._otherDetails.json&&!this._otherDetails.bundle?p=a`<div class="bundle-compare-empty is-error">The selected ${s} couldn't be parsed.</div>`:d!=="code"&&(p=this._renderDiff()):p=a`<div class="bundle-compare-empty">Pick a ${s} above to compare <strong>${this._nameFor(this.integrity)}</strong> against.</div>`:p=a`<div class="bundle-compare-empty">Loading bundle…</div>`,a`<div class="bundle-compare">${xr(u,this._baseReady&&o?this._renderSummary(this._diffFor()):m)} ${d==="code"?Nr({base:this._otherDetails,other:this.details,diff:this._diffFor(),source:this.source,path:this._codePath,seek:this._codeSeek,baseName:this._nameFor(this._targetIntegrity),otherName:this._nameFor(this.integrity),select:h=>{this._codePath=h}}):a`<div class="bundle-compare-body">${p}</div>`}</div>`}_renderDiff(){let e=this._diffFor(),t=this._nameFor(this._targetIntegrity),r=this._nameFor(this.integrity),n=[...e.files.onlyBase.map(y=>y.path),...e.files.onlyOther.map(y=>y.path),...e.files.changed.flatMap(y=>y.renamedFrom==null?[y.path]:[y.path,y.renamedFrom])],s=Ji(e.files.root,ft(n).prefix),{prefix:o}=s,c=y=>o&&y.startsWith(o)?y.slice(o.length):y,u=e.files.onlyBase.length+e.files.onlyOther.length+e.files.changed.length,d={removed:e.files.onlyBase,added:e.files.onlyOther,changed:e.files.changed},p=!e.totals.identical,h=this.source?.dependencies?.(this._otherDetails,this.details)??null,f=zr.filter(y=>(h??e.packageRows)[y].length>0),b=p?zr.filter(y=>d[y].length>0):[],v=b.every(y=>f.includes(y))?f:b,g=p?this.source?.files?.warning(this.details,[...d.added,...d.changed].map(y=>y.path)):m;return a`${h?this._renderDependencies(h,t,r,f):this._renderPackages(e.packageRows,t,r,f)} ${g??m} ${e.totals.identical?e.resolutions.totalChanges>0?a`<div class="bundle-compare-caption">File contents are unchanged; import resolutions differ.</div>`:a`<div class="bundle-compare-identical">These two bundles carry identical files (${e.totals.unchangedFiles.toLocaleString()} ${e.totals.unchangedFiles===1?"file":"files"})${s.from?a`, moved <span class="mono">${Er(s)}</span>`:""}.</div>`:this._collapsible("files","Files",u,()=>this._cols(v,a`${this._fileGroup(`Removed \xB7 only in ${t}`,d.removed,"removed",c,v)} ${this._fileGroup(`Added \xB7 only in ${r}`,d.added,"added",c,v)} ${this._fileGroup("Changed",d.changed,"changed",c,v)}`,"files"),s.from?`${s.from} \u2192 ${s.to}`:o)} ${this._renderResolutions(e.resolutions)}`}};customElements.define("bundle-compare",$o);var xo=class extends Fl{static properties={reviewTitle:{type:String}};render(){return a`<dialog aria-labelledby="discard-review-title" @close="${this._onClose}"><header><h3 id="discard-review-title">Discard unpublished review?</h3></header><p class="lwd-body"><strong>${this.reviewTitle}</strong></p><p class="lwd-note">This permanently deletes this review and all its file verdicts and notes. This cannot be undone.</p><footer class="nwd-actions"><span class="nwd-spacer"></span> <button type="button" data-role="cancel" @click="${this._onCancel}">Cancel</button> <button type="button" class="danger" @click="${this._onConfirm}">Discard review</button></footer></dialog>`}};customElements.define("discard-review-dialog",xo);function qr(i){return Y("discard-review-dialog",i)}var Pt={...ad,"accept-with-nits":"Accept with nits"},_g=i=>i.revokedAt===null?i.publishedAt===null?"Draft":"Published":"Revoked",wg={accept:"\u2713","accept-with-nits":"\xB7","request-changes":"!",reject:"\xD7"},So=i=>a`<span class="${`npm-review-verdict-icon ${i??"unchecked"}`}" aria-hidden="true">${wg[i]??""}</span>`,At=i=>a`<span class="npm-review-verdict">${So(i)}${Pt[i]??"Not reviewed"}</span>`,ci=i=>a`<span class="${`npm-review-badge ${i.revokedAt===null?i.publishedAt===null?"":"published":"revoked"}`}">${_g(i)}</span>`,Co=i=>a`<time datetime="${new Date(i).toISOString()}">${new Date(i).toLocaleString()}</time>`,Eo=(i,e)=>a`<div class="npm-review-progress" role="progressbar" aria-label="Files checked" aria-valuemin="0" aria-valuemax="${e||1}" aria-valuenow="${i}"><span style="${`width:${e?i/e*100:0}%`}"></span></div>`;function yh(i=[],e=[]){let t=new Set(e);return new Map(i.filter(r=>r.status&&!t.has(r.file)).map(r=>[r.file,{status:r.status,notes:+!!r.comment.trim()}]))}function lt(i){let e=ud(i);if(e.length===0)return m;let t=e.filter(r=>r.bullet);return a`${e.filter(r=>!r.bullet).map(r=>a`<p class="npm-review-note">${r.text}</p>`)} ${t.length>0?a`<ul class="npm-review-note npm-review-note-list">${t.map(r=>a`<li>${r.text}</li>`)}</ul>`:m}`}var li=null,pe=(i,e)=>["ecosystem","package","version","integrity","basePackage","baseVersion","baseIntegrity"].every(t=>i[t]===e[t]);function di(i,e=!1){li={review:i,continueReview:e}}function _h(i){if(!li||!pe(li.review,i))return null;let e=li;return li=null,e}function Ae(i){let e=`${i.package} ${i.version}`;return i.basePackage?i.basePackage===i.package?`${i.package} ${i.baseVersion} -> ${i.version}`:`${i.basePackage} ${i.baseVersion} -> ${e}`:e}var ie=i=>i._blocked||i._loading,wh=i=>i._shownReview?.publishedAt!=null,kg=i=>i.coverage==="full"?"Full":"Partial",Ro=i=>i._error?a`<p class="npm-review-error" role="alert">${i._error}</p>`:m,kh=i=>i._saveBlocked?a`<div class="npm-review-saving" role="status">Saving changes…</div>`:m,To=i=>[i._continuation?.review,...i._reviews].filter(Boolean).toSorted((e,t)=>+(e.publishedAt!==null)-+(t.publishedAt!==null)||(t.publishedAt??t.time)-(e.publishedAt??e.time)),$h=i=>`npm-review-button npm-review-primary npm-review-finalize ${i._allowedVerdicts[0]}`,xh=(i,e,t,r,n=Object.keys(Pt),s=!1)=>a`<div class="npm-review-verdict-options" role="group" aria-label="Verdict">${Object.entries(s?{"":"Not checked",...Pt}:Pt).map(([o,c])=>a`<label class="${`npm-review-verdict-choice ${o||"unchecked"}`}"><input type="radio" name="${i}" aria-label="${c}" value="${o}" .checked="${j(e===o)}" ?disabled="${r||o!==""&&!n.includes(o)}" @change="${()=>t(o)}">${c}</label>`)}</div>`;function $g(i){let e=wh(i),t=i._shownReview,r=i._summary,n=i._canEdit?{label:"Finalize review",run:()=>i._beginPublish(),disabled:!r.checkedFiles}:!e||!i._writable?null:i._activeReview||i._ownPublished.length===0?{label:"Resume your review",run:()=>i._resume()}:t.user===i.session?.id?{label:"Revise review",run:()=>i._change({action:"continue",reviewId:t.id,revision:t.revision})}:null;return a`<div class="npm-review-summary-actions">${e||i._draftStarted?ci(t??{publishedAt:null,revokedAt:null}):m}<div class="npm-review-progress-block"><span>${i._unsaved&&(i._saveBlocked||i._error)?a`<button type="button" class="npm-review-button npm-review-text-button" @click="${()=>i._openPanel("unsaved")}">Unsaved changes</button>`:a`<strong>${r.checkedFiles} of ${r.totalFiles}</strong> files checked`}</span> ${Eo(r.checkedFiles,r.totalFiles)}</div>${n?a`<button type="button" class="${i._canEdit?$h(i):"npm-review-button"}" ?disabled="${ie(i)||n.disabled}" @click="${n.run}">${n.label} ${xe}</button>`:m}</div>`}function xg(i){let e=i.source??hd(i.entry),t=!!(i._target&&i._target!=="(empty)"),r=Ne(e.options,s=>`${i.entry.npm.name}@${s.id}`);t&&!r.some(s=>s.id===i._target)&&r.push(...Ne([{id:i._target,name:i._target,format:"npm"}]));let n=Ne(e.choices);return n.some(s=>s.id===i.entry.npm.version)||n.push(...Ne([{id:i.entry.npm.version,name:i.entry.npm.version,format:"npm"}])),xr(kr({source:e,label:"Review",disabled:ie(i),from:{options:r,value:t?i._target:null,label:"Review base",pick:s=>{i._navigate(s)}},to:{options:n,value:i.entry.npm.version,label:"Version to review",pick:s=>{i._navigateTo({view:"npm",packageName:i.entry.npm.name,packageSpec:s,bundleTab:"review",...i._location(i._target)})}},clear:t?{label:"Clear review base",run:()=>{i._navigate("(empty)")}}:null,openLine:s=>i._openLine(s),comparison:{base:i._base,other:i.details,files:i._diff.files}}),$r(i._diff))}function Sg(i){return a`<div class="npm-review-toolbar"><nav class="npm-review-toolbar-group" aria-label="Review breadcrumbs"><button type="button" class="npm-review-button npm-review-text-button" ?disabled="${ie(i)}" @click="${()=>{i._navigateTo({view:"reviews"})}}">My reviews</button> ${xe}<button type="button" class="npm-review-button npm-review-text-button npm-review-package" aria-haspopup="dialog" ?disabled="${i._blocked}" @click="${()=>i._openPanel("reviews")}"><span>${i.entry.npm.name}@${i.entry.npm.version}</span><span class="npm-review-count">${To(i).length}</span></button></nav>${$g(i)}</div>`}function Cg(i,e=i._file,t=!1){let r=i._editorState(e),n=i._shownReview?.entries.find(c=>c.file===e),s=i._nonTextFiles.includes(e),o=!s&&["accept-with-nits","request-changes","reject"].includes(r.status);return a`<section class="${`npm-review-decision${t?" npm-review-inline-decision":""}`}" aria-label="File decision">${i._canEdit?a`${xh(`file:${e}`,s?"":r.status,c=>{i._setFileStatus(e,c)},ie(i)||s,void 0,!0)} ${s?a`<p class="npm-review-help">Non-text file. Verdicts are not supported yet; this file remains unchecked.</p>`:m} ${o?a`<textarea aria-label="File note" rows="2" maxlength="20000" placeholder="Add a note (optional)…" .value="${j(r.comment)}" ?disabled="${ie(i)}" @input="${c=>i._editFile(e,{comment:c.target.value})}" @blur="${()=>{i._saveFile(e)}}"></textarea>`:m}`:a`${t?m:a`<header><strong>File review</strong><span class="npm-review-muted">${wh(i)?"Frozen":"Read only"}</span></header>`} ${n?.status&&!s?a`${At(n.status)}${lt(n.comment)}`:a`<p class="npm-review-muted">This file was not reviewed.</p>`} ${i._writable?m:a`<p class="npm-review-help">Triage access is required to add a review.</p>`}`}</section>`}function Sh(i,e,t,r,n,s){return a`<fieldset class="npm-review-team-options"><legend>${e}</legend>${t.map(o=>a`<mode-switch label="${o.name}" .checked="${r.has(o.id)}" .disabled="${ie(i)}" @click="${()=>{if(ie(i))return;let c=new Set(r);c.has(o.id)?c.delete(o.id):c.add(o.id),n(c)}}"></mode-switch>`)}${s}</fieldset>`}function Eg(i,e){let t=i._allowedVerdicts,r=Xt(e.entries,i._files,i._nonTextFiles),n=e.entries.filter(s=>s.status&&s.comment.trim()&&!i._nonTextFiles.includes(s.file));return a`<form class="npm-review-publish-form" @submit="${s=>{s.preventDefault(),i._publish()}}"><div class="npm-review-dialog-body"><section class="npm-review-coverage"><div><strong>${kg(r)} review</strong><span>${r.checkedFiles} of ${r.totalFiles} files checked</span></div>${Eo(r.checkedFiles,r.totalFiles)}<p>${r.totalFiles>r.checkedFiles?a`${r.totalFiles-r.checkedFiles} files not checked. <button type="button" class="npm-review-button npm-review-text-button" @click="${()=>{i._unchecked=!0,i._closePanel()}}">View files</button>`:"Every file has a verdict."}</p>${i._needsPackageJson?a`<p class="npm-review-error">Review ${i._files.includes("package.json")?a`<button type="button" class="npm-review-button npm-review-text-button" @click="${()=>{i._closePanel(),i._selectFile("package.json")}}">package.json</button>`:"package.json"} before publishing a partial review.</p>`:m}</section>${n.length>0?a`<section aria-label="File notes"><strong>File notes</strong><ul class="npm-review-publish-notes" tabindex="0" aria-label="Saved file notes">${n.map(s=>a`<li><span class="dependency-review-entry-file">${Ve(s.file)}<span>${s.file}</span></span> ${lt(s.comment)}</li>`)}</ul></section>`:m}<div><strong>Final verdict</strong>${xh("final-verdict",i._finalStatus,s=>{i._finalStatus=s},ie(i),t)}</div>${i._securityLimit==="reject"?a`<p class="npm-review-help">Malware detected. Only Reject is available.</p>`:i._securityLimit==="request-changes"?a`<p class="npm-review-help">Critical vulnerabilities detected.</p>`:m} <label>Final note <span class="npm-review-muted">· optional</span><textarea aria-label="Final comment" rows="3" maxlength="20000" .value="${j(i._finalComment)}" placeholder="Summarize your findings or explain what remains…" ?disabled="${ie(i)}" @input="${s=>{i._finalComment=s.target.value}}"></textarea></label> ${i._unchangedContinuation?a`<p class="npm-review-help">Change a verdict or note to publish a new review.</p>`:m} ${Sh(i,"Publish to teams",i._teams,i._selectedTeams,s=>{i._selectedTeams=s},i._selectedTeams.size>0?m:a`<p class="npm-review-error">${i._teams.length===0?"No teams you belong to have dependency review enabled.":"Select at least one team to publish."}</p>`)} ${Ro(i)}</div><footer class="npm-review-dialog-footer"><p>Publishing freezes your verdicts and notes.<br>You can continue in a new review to make changes.</p><button type="submit" class="${$h(i)}" ?disabled="${ie(i)||!i._canPublish}">Publish to ${i._selectedTeams.size} ${i._selectedTeams.size===1?"team":"teams"} ${xe}</button></footer></form>`}function Tg(i,e){let t=e===i._shownReview,r=e.publishedAt!==null,n=r?e:pe(e,i._context)?Xt(e.entries,i._files,i._nonTextFiles):{checkedFiles:e.entries.filter(p=>p.status).length,totalFiles:null},s=[i._continuation?.review,...i._reviews].some(p=>p?.publishedAt===null&&p.user===i.session?.id&&pe(p,e)),o=e.user===i.session?.id,c=i._teams.filter(p=>!e.teams.some(h=>h.id===p.id)),u=i._additionalTeams.get(e.id)??new Set(c.length===1?c.map(p=>p.id):[]),d=c.filter(p=>u.has(p.id)).map(p=>p.id);return a`<section class="npm-review-entry" aria-current="${String(t)}"><div class="npm-review-history-heading"><strong>${e.userLogin}</strong>${t?a`<span class="npm-review-current">Current</span>`:m}${ci(e)}</div><p class="npm-review-help">${e.basePackage?`${e.basePackage===e.package?e.baseVersion:`${e.basePackage}@${e.baseVersion}`} \u2192 ${e.version}`:"All package files"}</p><div class="npm-review-entry-result">${r?At(e.status):m}<span class="dependency-review-coverage"> ${r?a`${n.coverage==="full"?"Full":a`<span class="dependency-review-partial">Partial</span>`} ·`:m}${n.checkedFiles}${n.totalFiles===null?m:`/${n.totalFiles}`} files checked</span></div><p class="npm-review-help">${e.teams.length>0?`${e.teams.map(p=>p.name).join(", ")} \xB7 `:""}${Co(e.publishedAt??e.time)}</p>${lt(e.comment)}<div class="npm-review-entry-actions"><button type="button" class="npm-review-button" ?disabled="${ie(i)}" @click="${()=>{i._openReview(e)}}">Open ${xe}</button> ${r&&o&&!s&&i._writable?a`<button type="button" class="npm-review-button" aria-label="Revise in a new draft" ?disabled="${ie(i)}" @click="${()=>{i._openReview(e,!0)}}">Revise</button>`:m} ${r&&o&&i._writable&&e.revokedAt===null?a`<button type="button" class="npm-review-button npm-review-danger" ?disabled="${ie(i)}" @click="${()=>i._change({action:"revoke",reviewId:e.id,revision:e.revision})}">Revoke</button>`:m}<review-audit-copy .review="${e}"></review-audit-copy>${!r&&o&&i._writable?a`<button type="button" class="dependency-review-discard" aria-label="Discard review" ?disabled="${ie(i)}" @click="${()=>{i._discard(e)}}">${J(vi)}</button>`:m}</div>${r&&o&&i._writable&&e.revokedAt===null&&c.length>0?a`<details class="npm-review-share"><summary>Publish to more teams</summary>${Sh(i,"Teams",c,u,p=>{i._additionalTeams=new Map(i._additionalTeams).set(e.id,p)},a`<button type="button" class="npm-review-button" ?disabled="${ie(i)||d.length===0}" @click="${()=>i._change({action:"publish",reviewId:e.id,revision:e.revision,teamIds:d})}">Publish to more teams</button>`)}</details>`:m} ${e.revokedAt===null?m:a`<p class="npm-review-help">Revoked ${Co(e.revokedAt)}. Content and team links remain frozen.</p>`}</section>`}function Rg(i){if(!i._panel)return m;let e={publish:"Publish review",reviews:"Reviews",unsaved:"Unsaved changes"};return a`<dialog class="npm-review-dialog" aria-label="${e[i._panel]}" @cancel="${t=>{t.preventDefault(),i._closePanel()}}"><button type="button" class="detail-action npm-review-close" aria-label="Close panel" ?disabled="${i._blocked}" @click="${()=>i._closePanel()}">×</button><header class="npm-review-dialog-head"><h2>${e[i._panel]}</h2><p>${i._panel==="reviews"?`${i.entry.npm.name}@${i.entry.npm.version}`:Ae(i._context)}</p></header>${i._panel==="publish"?Eg(i,i._activeReview):a`<div class="${`npm-review-dialog-body${i._panel==="reviews"?" npm-review-entries":""}`}">${i._panel==="unsaved"?a`${i._dirtyFiles.map(t=>a`<button type="button" class="npm-review-button" @click="${()=>{i._closePanel(),i._selectFile(t)}}">${t} ${xe}</button>`)}`:To(i).map(t=>Tg(i,t))} ${i._panel==="reviews"&&To(i).length===0?a`<p class="npm-review-muted">No reviews yet.</p>`:m}${Ro(i)}</div>`} ${kh(i)}</dialog>`}function Lg(i){let e=i._shownReview?.entries,t=i._files,r=i._nonTextFiles;if(i._treeProgress?.entries!==e||i._treeProgress?.files!==t||i._treeProgress?.nonTextFiles!==r){let c=yh(e,r),u=new Map,d=0;for(let p of i._files){let h=p.split("/"),f=+!!c.get(p)?.status;d+=f;for(let b=1;b<h.length;b++){let v=h.slice(0,b).join("/"),g=u.get(v)??{total:0,checked:0};g.total++,g.checked+=f,u.set(v,g)}}i._treeProgress={entries:e,files:t,nonTextFiles:r,states:c,directories:u,checked:d}}let{states:n,directories:s,checked:o}=i._treeProgress;return{railLabel:"Files",treeLabel:"Review files",collapseLabel:"Collapse folders",searchLabel:"Find a file",searchPlaceholder:"Find a file\u2026",treePageSize:300,filterContent:!1,fullPaths:!0,collapseClearsSearch:!0,canSelect:()=>!i._blocked&&!i._panel,fileFilter:i._unchecked?c=>!n.get(c)?.status:null,fileLabel:c=>`${c}, ${Pt[n.get(c)?.status]??"Not reviewed"}`,filePrefix:c=>So(n.get(c)?.status),fileSuffix:c=>n.get(c)?.notes?a`<span class="npm-review-note-dot" aria-label="Has notes">•</span>`:m,directoryLabel:c=>{let u=s.get(c.sourcePath);return`${c.sourcePath}, ${u?.checked??0} of ${u?.total??0} checked`},directorySummary:c=>{let u=s.get(c.sourcePath);return`${u?.checked??0}/${u?.total??0}`},filters:a`<div class="npm-review-filters" aria-label="Filter review files"><button type="button" class="npm-review-button" aria-pressed="${String(!i._unchecked)}" @click="${()=>{i._unchecked=!1}}">All ${i._files.length}</button> <button type="button" class="npm-review-button" aria-pressed="${String(!!i._unchecked)}" @click="${()=>{i._unchecked=!0}}">Unchecked ${i._files.length-o}</button></div>`,fileActions:(c,u)=>Cg(i,c,u)}}function Ch(i){return i._base?a`${xg(i)}${Sg(i)}${i._panel?m:Ro(i)} ${Nr({base:i._base,other:i.details,diff:i._diff,source:i.source,path:i._path,seek:i._seek,baseName:i._base.npm?`${i._base.npm.name}@${i._base.npm.version}`:"Empty package",otherName:`${i.entry.npm.name}@${i.entry.npm.version}`,select:e=>i._selectFile(e),extensions:Lg(i),mode:i._mode})} <span class="npm-review-announcement" role="status">${i._notice??""}</span>${i._panel?m:kh(i)}${Rg(i)}`:a`<div class="npm-review-empty" role="${i._baseError?"alert":"status"}">${i._baseError??"Loading comparison\u2026"} ${i._baseError?a`<button type="button" class="npm-review-button" @click="${()=>{i._baseKey=null,i._loadBase(i._target,i.request?.resume)}}">Retry</button>`:m}</div>`}var Mg={maxLines:5e4,maxBytes:2*1024*1024},Pg={integrity:"(empty)",kind:"sourcemap",json:{version:3,sources:[],sourcesContent:[]},fileSizes:new Map},Eh=(i,e)=>({ecosystem:"npm",package:i.npm.name,version:i.npm.version,integrity:i.integrity,basePackage:e?.npm?.name??null,baseVersion:e?.npm?.version??null,baseIntegrity:e?.npm?e.integrity:null}),ui=(i,e)=>`${i}@${e??"latest"}`,Lo=class extends U{static properties={entry:{attribute:!1},details:{attribute:!1},request:{attribute:!1},session:{attribute:!1},source:{attribute:!1},_teams:{state:!0},_selectedTeams:{state:!0},_additionalTeams:{state:!0},_reviews:{state:!0},_loading:{state:!0},_error:{state:!0},_saving:{state:!0},_saveBlocked:{state:!0},_file:{state:!0},_seek:{state:!0},_finalStatus:{state:!0},_finalComment:{state:!0},_base:{state:!0},_baseError:{state:!0},_panel:{state:!0},_path:{state:!0},_selectedReview:{state:!0},_unchecked:{state:!0},_notice:{state:!0},_continuation:{state:!0}};createRenderRoot(){return this}constructor(){super(),this._teams=[],this._reviews=[],this._files=[],this._nonTextFiles=[],this._selectedTeams=new Set,this._additionalTeams=new Map,this._editors=new Map,this._file=null,this._path=null,this._loading=!1,this._saving=!1,this._error=null,this._context=null,this._key=null,this._controller=new AbortController,this._mode="code",this._panel=null,this._selectedReview=null,this._unchecked=!1,this._pendingSaves=[],this._saveBlocked=!1}disconnectedCallback(){super.disconnectedCallback(),this._controller.abort(),this._cancelSaves(),this._dismissLoading?.(),this._key=null,this._baseKey=null}updated(){let e=this.querySelector("dialog");e&&!e.open&&e.showModal(),this._rememberBase()}_rememberBase(){l.bundleDetailsTab!=="review"||l.selectedBundle!==this.entry?.integrity||!this._context||!this._activeReview&&this._ownPublished.length===0&&!this._unsaved||(l.npmReview={bundle:this.entry.integrity,...this._context.basePackage?{reviewPackage:this._context.basePackage,reviewSpec:this._context.baseVersion}:{},started:!0,user:this.session?.id})}get _writable(){return["triage","manage","admin"].includes(this.session?.role)&&!this.session?.viewer}get _activeReview(){return this._reviews.find(e=>e.user===this.session?.id&&e.publishedAt===null&&pe(e,this._context))??(this._continuation&&this._continuation.review.user===this.session?.id?this._continuation.review:null)}get _ownPublished(){return this._reviews.filter(e=>e.user===this.session?.id&&e.publishedAt!==null&&pe(e,this._context)).toSorted((e,t)=>t.publishedAt-e.publishedAt)}get _shownReview(){return this._selectedReview?this._reviews.find(e=>e.id===this._selectedReview):this._activeReview??this._ownPublished[0]??null}get _canEdit(){return this._writable&&!this._selectedReview&&(this._activeReview!==null||this._ownPublished.length===0)}_isDirty(e,t){return!this._nonTextFiles.includes(e)&&(t.comment!==(t.edit?.comment??"")||t.status!==(t.edit?.status??""))}get _dirtyFiles(){return[...this._editors].filter(([e,t])=>this._isDirty(e,t)).map(([e])=>e)}get _blocked(){return this._saving||this._saveBlocked}get _unsaved(){return this._pendingSaves.length>0||this._dirtyFiles.length>0}get _draftStarted(){return this._canEdit&&(this._unsaved||this._activeReview&&!this._continuation||this._continuation&&this._publishRevision!=null&&!this._unchangedContinuation)}get _summary(){return Xt(this._shownReview?.entries??[],this._files,this._nonTextFiles)}get _securityLimit(){return this.source?.reviewVerdictLimit?.(this.entry,this._base)??"accept"}get _allowedVerdicts(){let e=new Map((this._shownReview?.entries??[]).map(t=>[t.file,t]));if(this._canEdit)for(let[t,r]of this._editors)e.set(t,{file:t,status:r.status||null});return cd([...e.values()].filter(t=>!this._nonTextFiles.includes(t.file)),this._securityLimit)}get _needsPackageJson(){return dd(this._activeReview?.entries??[],this._files,this._nonTextFiles)}get _unchangedContinuation(){let e=this._continuation?.source;return!!(e&&this._finalStatus===e.status&&this._finalComment===e.comment)}get _canPublish(){return this._canEdit&&this._panel==="publish"&&this._activeReview?.revision===this._publishRevision&&this._summary.checkedFiles>0&&!this._needsPackageJson&&!this._unchangedContinuation&&this._selectedTeams.size>0&&!this._unsaved&&this._allowedVerdicts.includes(this._finalStatus)}_location(e){let t=e&&e!=="(empty)"?yn(e):null;return t?{reviewPackage:t.name,reviewSpec:t.spec}:{}}_navigate(e){return this._navigateTo(_n(this.entry,"review",this._location(e)))}async _navigateTo(e){if(this._blocked||this._loading)return;let t=this._key,r=this._navigation={};this._unsaved&&!await this._saveAll()||t===this._key&&r===this._navigation&&!this._unsaved&&await me?.navigate(e)}async _loadBase(e,t=!1){let r=JSON.stringify([this.entry.integrity,e,this.session?.id,this.session?.role]);if(this._baseKey!==r){this._baseKey=r,this._base=null,this._baseError=null,this._controller.abort(),this._cancelSaves(),this._key=null,this._controller=new AbortController;try{let n=t?await Bd(Eh(this.entry,null),this._controller.signal):null;if(this._baseKey!==r)return;n&&(e=n.basePackage?ui(n.basePackage,n.baseVersion):"(empty)");let s=e==="(empty)"?null:yn(e),o=s?(await Gc(s.name,s.spec??"latest")).details:Pg;if(this._baseKey!==r)return;t&&(n&&di(n),this._target=e,this.request={bundle:this.entry.integrity,...this._location(e)},this._baseKey=JSON.stringify([this.entry.integrity,e,this.session?.id,this.session?.role])),this._base=o,this._ensureContext(o)}catch(n){this._baseKey===r&&(this._baseError=n.message)}}}_ensureContext(e){let t=Eh(this.entry,e),r=JSON.stringify([this.session?.id,this.session?.role,t]);if(r===this._key)return;this._controller.abort(),this._cancelSaves(),this._controller=new AbortController,this._context=t,this._diff=Sr(e,this.details);let n=xp(e,this.details,this._diff);this._files=Wt(Ki(n.map(o=>o.path)));let s=new Set(n.filter(o=>!ld(o.before,o.after)).map(o=>o.path));if(this._nonTextFiles=this._files.filter(o=>s.has(o)),this._mode=Sp(n,Mg)?"diff":"code",this._key=r,this._teams=[],this._reviews=[],this._selectedTeams=new Set,this._additionalTeams=new Map,this._selectedReview=null,this._continuation=null,this._editors.clear(),this._path=this._files[0]??null,this._panel=null,this._notice="",this._resetEditor(this._path),this._saving=!1,this._refresh(!0),l.bundleDetailsTab==="review"&&l.selectedBundle===this.entry.integrity){let o=this._location(e.npm?ui(e.npm.name,e.npm.version):"(empty)");l.npmReview={bundle:this.entry.integrity,...o},this._baseKey=JSON.stringify([this.entry.integrity,e.npm?ui(e.npm.name,e.npm.version):"(empty)",this.session?.id,this.session?.role]),me?.replaceRoute(_n(this.entry,"review",o))}}async _refresh(e=!1){let t=this._key;for(;t===this._key&&this._pendingSaves.length>0;)if((await Promise.all(this._pendingSaves.map(n=>n.promise))).some(n=>!n))return;if(t!==this._key)return;this._dismissLoading?.();let r=this._dismissLoading=Oe("Loading reviews\u2026",{duration:0});this._loading=!0,this._error=null;try{let{reviews:n,teams:s}=await Zt({...this._context,allBases:!0},null,null,this._controller.signal);if(t===this._key){let o=this._unsaved;this._reviews=n,this._teams=s,n.some(d=>d.user===this.session?.id&&d.publishedAt===null&&pe(d,this._context))&&(this._continuation=null),this._rememberBase();let c=_h(this._context),u=c&&n.find(d=>d.id===c.review.id);u?.publishedAt!=null&&(c.continueReview?this._continue(u.id,u.revision):this._selectedReview=u.id),this._selectedTeams=new Set(s.filter(d=>e?s.length===1:this._selectedTeams.has(d.id)).map(d=>d.id)),o||(this._editors.clear(),this._resetEditor(this._file))}}catch(n){t===this._key&&n.name!=="AbortError"&&(this._error=n.message)}finally{r(),t===this._key&&(this._loading=!1)}}_resetEditor(e=null){this._publishRevision=null,this._file=e,this._editorState(e)}_editorState(e){let t=this._canEdit?this._editors.get(e):null;if(!t){let r=this._shownReview?.entries.find(n=>n.file===e&&n.status)??null;t={edit:r,revision:this._activeReview?.revision??null,comment:this._nonTextFiles.includes(e)?"":r?.comment??"",status:this._nonTextFiles.includes(e)?"":r?.status??""},this._canEdit&&this._editors.set(e,t)}return{...t,dirty:this._isDirty(e,t)}}_editFile(e,t){!this._canEdit||this._blocked||(this._resetEditor(e),Object.assign(this._editors.get(e),t),this.requestUpdate())}_setFileStatus(e,t){if(!(this._blocked||this._nonTextFiles.includes(e)))return this._editFile(e,{status:t,...t?{}:{comment:""}}),this._saveFile(e)}_selectFile(e){this._blocked||!this._files.includes(e)||(this._path=e,this._resetEditor(e))}_openLine({path:e,line:t,query:r}){this._blocked||!this._files.includes(e)||(this._seek={path:e,line:t-1,query:r},this._selectFile(e))}_openPanel(e){this._panel=e}async _openReview(e,t=!1){if(this._blocked||this._loading)return;if(pe(e,this._context)){t?this._continue(e.id,e.revision):e.publishedAt===null?this._resume():this._showPublished(e);return}let r=this._key;this._unsaved&&!await this._saveAll()||r!==this._key||(di(e,t),await this._navigate(e.basePackage?ui(e.basePackage,e.baseVersion):"(empty)"))}_closePanel(){this._blocked||(this.querySelector("dialog")?.close(),this._panel=null)}_showPublished(e){this._selectedReview=e.id,this._panel=null,this._file=this._path}_resume(){this._selectedReview=null,this._panel=null,this._resetEditor(this._path)}async _discard(e){if(this._blocked||this._loading||!this._writable||e.user!==this.session.id||e.publishedAt!==null)return;let t=e===this._activeReview,r=this._key,n=this._controller.signal;this._saving=!0,this._error=null;try{let{confirmed:s}=await qr({reviewTitle:Ae(e),signal:n});if(!s||n.aborted||r!==this._key||(await Promise.all(this._pendingSaves.map(c=>c.promise)),n.aborted||r!==this._key||!this._writable)||(e=t?this._activeReview:this._reviews.find(c=>c.id===e.id),!e||e.user!==this.session.id||e.publishedAt!==null))return;let o=e===this._continuation?.review;if(o||await Qi(e.id,e.revision,this.session.csrfToken,n),n.aborted||r!==this._key)return;o||(this._reviews=this._reviews.filter(c=>c.id!==e.id)),pe(e,this._context)&&(this._continuation=null,this._selectedReview=null,this._editors.clear(),this._resetEditor(this._path),this._finalStatus=null,this._finalComment="",this._panel=null,this._ownPublished.length===0&&l.npmReview?.bundle===this.entry.integrity&&delete l.npmReview.started),this._notice="Draft discarded."}catch(s){r===this._key&&s.name!=="AbortError"&&(this._error=s.message)}finally{r===this._key&&(this._saving=!1)}}_continue(e,t){let r=this._reviews.find(n=>n.id===e&&n.revision===t&&n.user===this.session?.id&&n.publishedAt!==null&&pe(n,this._context));return!r||this._activeReview?null:(this._continuation={source:r,review:{...r,publishedAt:null,revokedAt:null,status:null,teams:[]}},this._selectedTeams=new Set(this._teams.length===1?this._teams.map(n=>n.id):[]),this._selectedReview=null,this._panel=null,this._editors.clear(),this._resetEditor(this._path),this._notice="A new draft will be saved when you make a change.",this._activeReview)}async _persistContinuation(e){let t=this._continuation,r=this._key,{review:n}=await Zt(this._context,{action:"continue",reviewId:t.source.id,revision:t.source.revision},this.session.csrfToken,this._controller.signal);return r!==this._key||this._continuation!==t||e&&this._pendingSaves[0]!==e?null:(this._acceptSave(n,{revision:t.source.revision}),n)}_cancelSaves(){for(let e of this._pendingSaves)clearTimeout(e.timer),e.resolve(null);this._pendingSaves=[],this._saveBlocked=!1}_queueSave(e){let t=this._pendingSaves.findLast(n=>n.change.file===e.file);if(t&&t.change.comment===e.comment&&t.change.status===e.status)return t.promise;let r={change:e,slow:!1};return r.promise=new Promise(n=>{r.resolve=n}),r.timer=setTimeout(()=>{r.slow=!0,this._saveBlocked=!0},3e3),this._pendingSaves.push(r),this.requestUpdate(),this._pendingSaves.length===1&&this._flushSaves(),r.promise}_acceptSave(e,t){this._reviews=[...this._reviews.filter(r=>r.id!==e.id),e],this._continuation=null;for(let[r,n]of this._editors)n.revision===t.revision&&(n.revision=e.revision,n.edit=e.entries.find(s=>s.file===r&&s.status)??null);for(let{change:r}of this._pendingSaves.slice(1))r.revision===t.revision&&(r.revision=e.revision,r.reviewId=e.id,r.entryId=e.entries.find(n=>n.file===r.file)?.id??null);this._canEdit&&this._resetEditor(this._file),this._notice="Saved privately.",this._rememberBase()}async _flushSaves(){for(;this._pendingSaves.length>0;){let e=this._pendingSaves[0];this._error=null;try{if(this._continuation){let r=await this._persistContinuation(e);if(!r||this._pendingSaves[0]!==e)return;Object.assign(e.change,{reviewId:r.id,revision:r.revision,entryId:r.entries.find(n=>n.file===e.change.file)?.id??null})}let{review:t}=await Zt(this._context,e.change,this.session.csrfToken,this._controller.signal);if(this._pendingSaves[0]!==e)return;this._acceptSave(t,e.change),clearTimeout(e.timer),this._pendingSaves.shift(),e.resolve(t),this._saveBlocked=this._pendingSaves.some(r=>r.slow),this.requestUpdate()}catch(t){if(this._pendingSaves[0]!==e)return;this._cancelSaves(),t.name!=="AbortError"&&(this._error=t.message),this.requestUpdate();return}}}async _change(e){if(this._blocked||this._pendingSaves.length>0||this._loading||!this._writable)return null;if(e.action==="continue")return this._continue(e.reviewId,e.revision);let t=this._key;this._saving=!0,this._error=null;try{if(e.action==="publish"&&e.finalStatus&&this._continuation){let o=await this._persistContinuation();if(!o)return null;e={...e,reviewId:o.id,revision:o.revision}}let r=this._reviews.find(o=>o.id===e.reviewId)??this._context,n=Object.fromEntries(Object.keys(this._context).map(o=>[o,r[o]])),{review:s}=await Zt(n,e,this.session.csrfToken,this._controller.signal);return t!==this._key?null:(this._reviews=[...this._reviews.filter(o=>o.id!==s.id),s],e.action==="publish"&&e.finalStatus&&pe(s,this._context)&&(this._selectedReview=s.id,this._panel=null,this._editors.clear(),this._notice="Published. Verdicts and notes are now frozen."),this._rememberBase(),s)}catch(r){return t===this._key&&r.name!=="AbortError"&&(this._error=r.message),null}finally{t===this._key&&(this._saving=!1)}}_saveFile(e){if(!this._canEdit||this._saving||this._loading)return null;let t=this._editorState(e),r=this._pendingSaves.some(s=>s.change.file===e),n=this._activeReview;return!t.dirty&&!r?n:!t.status&&!t.comment.trim()&&!t.edit?.id&&!r?(this._editors.delete(e),e===this._file&&this._resetEditor(e),n):this._queueSave({action:"save",reviewId:n?.id??null,revision:t.revision,entryId:t.edit?.id??null,file:e,comment:t.comment,status:this._nonTextFiles.includes(e)?null:t.status||null})}async _saveAll(){let e=this._key;for(;e===this._key&&this._canEdit;){if(this._pendingSaves.length>0){if((await Promise.all(this._pendingSaves.map(r=>r.promise))).some(r=>!r))return!1;continue}let t=this._dirtyFiles;if(t.length===0)return!0;if(!await this._saveFile(t[0]))return!1}return!1}async _beginPublish(){if(!this._canEdit||this._saving||this._loading||this._finalizing||!this._summary.checkedFiles)return;let e=this._key;this._finalizing=!0;try{if(this._unsaved&&!await this._saveAll()||e!==this._key||!this._canEdit||this._unsaved||!this._summary.checkedFiles)return;let t=this._activeReview;if(!t)return;let r=this._allowedVerdicts,n=this._continuation?.source.status;this._finalStatus=r.includes(n)?n:r[0],this._finalComment=t.comment??"",this._publishRevision=t.revision,this._panel="publish"}finally{this._finalizing=!1}}_publish(){if(this._canPublish)return this._change({action:"publish",reviewId:this._activeReview.id,revision:this._publishRevision,teamIds:[...this._selectedTeams],finalStatus:this._finalStatus,finalComment:this._finalComment})}render(){if(!this.entry?.npm||!this.details)return m;let e=this.request?.bundle===this.entry.integrity?this.request:{};return this._target=e.reviewPackage?ui(e.reviewPackage,e.reviewSpec):"(empty)",this._loadBase(this._target,e.resume),Ch(this)}};customElements.define("npm-review",Lo);var Ag=i=>({view:"npm",packageName:i.package,packageSpec:i.version,bundleTab:"review",...i.basePackage===null?{}:{reviewPackage:i.basePackage,reviewSpec:i.baseVersion}}),Ig=i=>{let e=new Date(i);return a`<time datetime="${e.toISOString()}" data-tooltip="${e.toLocaleString()}">${e.toLocaleDateString(void 0,{month:"short",day:"numeric",...e.getFullYear()===new Date().getFullYear()?{}:{year:"numeric"}})} <span>${e.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"})}</span></time>`},Mo=class extends U{static properties={session:{attribute:!1},_reviews:{state:!0},_loading:{state:!0},_error:{state:!0},_next:{state:!0},_discarding:{state:!0},_expanded:{state:!0}};constructor(){super(),this._reviews=[],this._next=null,this._expanded=new Set,this._controller=new AbortController}createRenderRoot(){return this}disconnectedCallback(){super.disconnectedCallback(),this._controller.abort(),this._dismissLoading?.(),this._key=null}_canDiscard(e){return e.publishedAt===null&&e.user===this.session?.id&&["triage","manage","admin"].includes(this.session?.role)}async _discard(e){if(!this._canDiscard(e)||this._discarding||this._loading)return;let t=this._key,r=this._controller.signal;this._discarding=e.id,this._error=null;try{let{confirmed:n}=await qr({reviewTitle:Ae(e),signal:r});if(!n||r.aborted||t!==this._key||!this._canDiscard(e)||(await Qi(e.id,e.revision,this.session.csrfToken,r),t!==this._key||r.aborted))return;this._reviews=this._reviews.filter(s=>s.id!==e.id)}catch(n){t===this._key&&n.name!=="AbortError"&&(this._error=n.message)}finally{t===this._key&&(this._discarding=null)}}async _load(e=!1){let t=this._key;this._dismissLoading?.();let r=this._dismissLoading=Oe("Loading reviews\u2026",{duration:0});this._loading=!0,this._error=null;try{let{reviews:n,next:s}=await Od(e?this._next:null,this._controller.signal);if(t!==this._key)return;this._reviews=[...new Map([...e?this._reviews:[],...n].map(o=>[o.id,o])).values()],this._next=s}catch(n){t===this._key&&n.name!=="AbortError"&&(this._error=n.message)}finally{r(),t===this._key&&(this._loading=!1)}}_toggleDetails(e){let t=new Set(this._expanded);t.has(e)?t.delete(e):t.add(e),this._expanded=t}_details(e){let t=e.entries.filter(r=>r.status);return a`<section id="${`review-details-${e.id}`}" class="dependency-review-details" aria-label="${`Details for ${Ae(e)}`}">${e.comment?a`<div class="dependency-review-final-note" role="note" aria-label="Final note">${lt(e.comment)}</div>`:m} ${t.length>0?a`<ul class="dependency-review-entries">${t.map(r=>a`<li><span class="dependency-review-entry-file">${Ve(r.file)}<span>${r.file}</span></span> ${At(r.status)}<div>${lt(r.comment)}</div></li>`)}</ul>`:a`<p class="npm-review-muted">No file reviews yet.</p>`}</section>`}_row(e){let t=Ag(e),r=this._expanded.has(e.id),n=e.publishedAt!==null,s=new Set(e.entries.filter(u=>u.status).map(u=>u.file)).size,o=e.entries.filter(u=>u.status&&u.comment.trim()).length+ +!!e.comment.trim(),c=u=>{u.button===0&&!u.metaKey&&!u.ctrlKey&&!u.shiftKey&&!u.altKey&&me?.active&&(u.preventDefault(),di(e),me.navigate(t))};return a`<li class="${`dependency-review-row${r?" is-expanded":""}${e.revokedAt===null?"":" is-revoked"}`}"><div class="dependency-review-row-main"><button type="button" class="dependency-review-expand" aria-expanded="${r}" aria-controls="${`review-details-${e.id}`}" aria-label="${`${r?"Hide":"Show"} details for ${Ae(e)}`}" @click="${()=>this._toggleDetails(e.id)}">${xe}</button><div class="dependency-review-identity"><a class="dependency-review-title" href="${Yr(t)}" @click="${c}">${e.basePackage!==null&&e.basePackage!==e.package?a`<span>${e.basePackage} ${e.baseVersion} →</span>`:m} <strong>${e.package}</strong> <span>${e.basePackage===e.package?`${e.baseVersion} \u2192 `:""}${e.version}</span></a><div class="dependency-review-meta">${Ig(e.publishedAt??e.time)} ${n&&e.teams.length>0?a`<span class="dependency-review-teams">${e.teams.map(u=>u.name).join(", ")}</span>`:m} ${n&&o>0?a`<span class="dependency-review-note-count">${o} ${o===1?"note":"notes"}</span>`:m} ${e.revokedAt===null?m:ci(e)}</div></div><div class="dependency-review-result">${n?At(e.status):a`<span class="dependency-review-checked">${s} ${s===1?"file":"files"} checked</span>`} <span class="dependency-review-coverage">${n?a`${e.coverage==="full"?"Full":a`<span class="dependency-review-partial">Partial</span>`} · ${e.checkedFiles}/${e.totalFiles} files checked`:o?`${o} ${o===1?"note":"notes"}`:"No notes"}</span></div><div class="dependency-review-row-actions"><review-audit-copy .review="${e}"></review-audit-copy>${this._canDiscard(e)?a`<button type="button" class="dependency-review-discard" aria-label="Discard review" ?disabled="${this._loading||!!this._discarding}" @click="${()=>this._discard(e)}">${J(vi)}</button>`:m} <a class="dependency-review-open" href="${Yr(t)}" @click="${c}" aria-label="${`${n?"Open":"Continue"} review for ${Ae(e)}`}"><span aria-hidden="true">→</span></a></div></div>${r?this._details(e):m}</li>`}render(){let e=JSON.stringify([this.session?.id,this.session?.role]);return e!==this._key&&(this._controller.abort(),this._controller=new AbortController,this._key=e,this._reviews=[],this._next=null,this._discarding=null,this._expanded=new Set,this._load()),a`<section class="dependency-review-list"><header><h1>My reviews</h1></header><p>Your private work and the reviews you’ve shared with teams.</p>${this._error?a`<p role="alert">${this._error}</p>`:m} ${!this._loading&&!this._error&&this._reviews.length===0?a`<p>No reviews yet. Open a package’s Review tab to begin.</p>`:m} ${[["Drafts",!1],["Published reviews",!0]].map(([t,r])=>{let n=this._reviews.filter(s=>s.publishedAt!==null===r);return a`<section class="dependency-review-section"><h2>${t}<span class="npm-review-count">${n.length}</span></h2><ol>${n.map(s=>this._row(s))}</ol>${n.length===0&&!this._loading?a`<p class="npm-review-muted">${r?"No published reviews yet.":"No drafts."}</p>`:m}</section>`})} ${this._next?a`<button type="button" class="npm-review-button" ?disabled="${this._loading||!!this._discarding}" @click="${()=>this._load(!0)}">Load more</button>`:m}</section>`}};customElements.define("dependency-review-list",Mo);var Po=class extends U{static properties={review:{attribute:!1},_copied:{state:!0},_error:{state:!0}};createRenderRoot(){return this}disconnectedCallback(){super.disconnectedCallback(),clearTimeout(this._timer)}async _copy(){let e=Sn(this.review);if(e!==null){this._error=!1;try{await navigator.clipboard.writeText(e),this._copied=!0,clearTimeout(this._timer),this._timer=setTimeout(()=>{this._copied=!1},2e3)}catch{this._error=!0}}}render(){return!this.review||Sn(this.review)===null?m:a`<button type="button" class="${`bundle-code-copy-path${this._copied?" copied":""}`}" aria-label="Copy audit Markdown" @click="${()=>this._copy()}">${Hi}</button> ${this._error?a`<span role="alert">Could not copy to the clipboard.</span>`:m}`}};customElements.define("review-audit-copy",Po);var Ao=class extends D{createRenderRoot(){return this}render(){return l.reports.length>0&&l.currentView==="findings"&&l.viewMode!=="graph"&&l.viewMode!=="kanban"?a`<button type="button" class="toolbar-export-btn" aria-label="Download or print report" @click="${this._onClick}">${Zd}</button>`:m}_onClick=()=>{this.dispatchEvent(new CustomEvent("download-requested",{bubbles:!0,composed:!0}))}};customElements.define("download-button",Ao);var He=class extends D{static styles=ut`.preview{position:fixed;inset:auto;margin:0;padding:14px;box-sizing:border-box;width:min(24rem,calc(100vw - 24px));max-height:calc(100vh - 24px);overflow:auto;border:1px solid var(--border);border-radius:var(--ui-radius, 10px);background:var(--bg);color:var(--text);box-shadow:0 8px 28px #00000040;font:13px/1.45 system-ui,sans-serif;text-align:left;white-space:normal;overflow-wrap:anywhere;letter-spacing:normal;cursor:default}.preview.wide{width:min(36rem,calc(100vw - 24px))}@media print{.preview{display:none}}`;constructor(){super(),this.showTimer=null,this.hideTimer=null}connectedCallback(){super.connectedCallback(),ht(this.renderRoot)}disconnectedCallback(){this._hidePreview(),super.disconnectedCallback()}updated(){let e=this.renderRoot.querySelector(".preview");e?e.matches(":popover-open")&&this._positionPreview():this._hidePreview()}_schedulePreview(){clearTimeout(this.hideTimer),clearTimeout(this.showTimer),this.renderRoot.querySelector(".preview")&&(this.showTimer=setTimeout(()=>{if(!this.isConnected)return;let e=this.renderRoot.querySelector(".preview");e&&(Sa(),e.showPopover(),this._positionPreview(),document.addEventListener("keydown",this._previewKeyDown,!0),window.addEventListener("scroll",this._previewScroll,!0),window.addEventListener("resize",this._hidePreview))},150))}_keepPreview(){clearTimeout(this.hideTimer)}_leavePreview(){clearTimeout(this.showTimer),clearTimeout(this.hideTimer),this.hideTimer=setTimeout(()=>{this.renderRoot.querySelector(".preview")?.contains(this.renderRoot.activeElement)||this._hidePreview()},150)}_hidePreview=()=>{clearTimeout(this.showTimer),clearTimeout(this.hideTimer);let e=this.renderRoot?.querySelector(".preview");e?.matches(":popover-open")&&e.hidePopover(),document.removeEventListener("keydown",this._previewKeyDown,!0),window.removeEventListener("scroll",this._previewScroll,!0),window.removeEventListener("resize",this._hidePreview)};_previewKeyDown=e=>{e.key==="Escape"&&(e.preventDefault(),e.stopPropagation(),this.renderRoot.querySelector(".preview")?.contains(this.renderRoot.activeElement)&&this.renderRoot.querySelector("[aria-details]").focus({preventScroll:!0}),this._hidePreview())};_previewScroll=e=>{e.composedPath().includes(this.renderRoot.querySelector(".preview"))||this._hidePreview()};_positionPreview(){let e=this.renderRoot.querySelector(".preview"),t=this.renderRoot.querySelector("[aria-details]").getBoundingClientRect(),{width:r,height:n}=e.getBoundingClientRect(),s=8,o=12,c=Math.max(o,Math.min(t.left,window.innerWidth-r-o)),u=t.bottom+s+n<=window.innerHeight-o?t.bottom+s:Math.max(o,t.top-s-n);e.style.left=`${c}px`,e.style.top=`${u}px`}};var Io={open:"Open",draft:"Draft",closed:"Closed",merged:"Merged",completed:"Completed",not_planned:"Not planned",duplicate:"Duplicate",unknown:"Closed"},Fg=a`<svg viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="4" cy="3" r="1.75"/><circle cx="4" cy="13" r="1.75"/><circle cx="12" cy="13" r="1.75"/><path d="M4 4.75v6.5M12 11.25V5a2 2 0 0 0-2-2H8m2-2L8 3l2 2"/></svg>`,Dg=a`<svg viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><circle cx="8" cy="8" r="6.25"/><circle cx="8" cy="8" r="1.5" fill="currentColor" stroke="none"/></svg>`,Og=a`<svg viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="8" cy="8" r="6.25"/><path d="m5 8 2 2 4-4"/></svg>`,Bg=a`<svg viewBox="0 0 16 16" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true"><circle cx="8" cy="8" r="6.25"/><path d="m3.5 12.5 9-9"/></svg>`,Ng={completed:Og,not_planned:Bg},Fo=class extends He{static properties={url:{type:String},compact:{type:Boolean,reflect:!0}};static styles=[He.styles,ut`:host{display:inline;word-break:normal}a{color:var(--accent);text-decoration:none;overflow-wrap:anywhere;cursor:default}.status{display:inline-flex;align-items:center;gap:.3em;vertical-align:text-bottom;margin-right:.35em;font-weight:600;white-space:nowrap}svg{flex:none}.open{color:light-dark(#1a7f37,#3fb950)}.draft,.not_planned,.duplicate,.unknown,.unavailable{color:var(--muted)}.closed{color:light-dark(#d1242f,#f85149)}.merged,.completed{color:light-dark(#8250df,#a371f7)}:host(:not([compact])){display:block}:host(:not([compact])) .fix-link{display:flex;align-items:center;gap:.55rem;min-width:0}.link-icon{flex:none;line-height:1}.link-icon svg{display:block}.link-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text);font-weight:500;line-height:1.5}.link-icon.unavailable+.link-title{color:var(--accent)}.ref{min-width:0;max-width:32%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted);font-size:.74rem}.link-status{flex:none;padding:.15rem .4rem;border-radius:999px;background:color-mix(in srgb,currentColor 10%,transparent);font-size:.7rem;font-weight:500;line-height:1.3}:host([compact]){display:inline-flex}:host([compact]) .fix-link{display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%}:host([compact]) .fix-link svg{width:14px;height:14px}:host([compact]) .status{margin:0;font-size:1rem;line-height:1}.preview-header{display:flex;align-items:center;justify-content:space-between;gap:12px}.preview-ref{display:inline-flex;align-items:center;gap:.4rem;min-width:0;color:var(--muted);font-size:12px;line-height:1.4}.preview-ref span{min-width:0}.preview-description{margin-top:8px;white-space:pre-wrap}.preview-title{margin-top:8px;font-size:15px;font-weight:600;line-height:1.4}.preview .preview-header .status{flex:none;margin:0;font-size:12px;line-height:1.4}@media print{:host(:not([compact])) .fix-link{display:block}.link-title,.ref{white-space:normal;overflow:visible;text-overflow:clip;max-width:none}.link-icon{display:inline-block;vertical-align:middle;margin-right:.55rem}.ref,.link-status{margin-left:.55rem}.preview{display:none}}`];constructor(){super(),this.url="",this.compact=!1,this.unsubscribe=null}connectedCallback(){super.connectedCallback(),this.unsubscribe=Rl(()=>this.requestUpdate()),this.hasUpdated&&this.requestUpdate()}disconnectedCallback(){this.unsubscribe?.(),this.unsubscribe=null,super.disconnectedCallback()}updated(e){e.has("url")||e.has("compact")?this._hidePreview():super.updated(e)}render(){if(!wi(this.url))return a`${this.url}`;let e=Cl(this.url),t=!e&&El(this.url),r=e||t,n=Tl.read(this.url);if(!n&&!r){let p=`Open fix link: ${this.url}`;return a`<a class="${this.compact?"fix-link":""}" href="${this.url}" target="_blank" rel="noopener noreferrer" draggable="false" data-tooltip="${this.compact?p:m}" aria-label="${p}">${this.compact?a`<slot></slot>`:this.url}</a>`}let s=n?t&&n.status==="closed"?n.stateReason??"unknown":n.status:"unavailable",o=e?Fg:t?Ng[s]??Dg:null,c=r?`${r.repo}#${r.number}`:"",u=(n?.title.length??0)>40||(n?.description??"").split(/[\r\n]/u).some(p=>p.length>100),d=n?`${Io[s]} ${e?"pull request":"issue"}: ${n.title} (${c})`:r?`Open ${e?"pull request":"issue"}: ${c}`:`Open fix link: ${this.url}`;return a`<a class="fix-link" href="${this.url}" target="_blank" rel="noopener noreferrer" draggable="false" aria-label="${d}" aria-details="${this.compact&&r?"fix-preview":m}" data-tooltip="${this.compact&&!r?d:m}" @mouseenter="${this._schedulePreview}" @mouseleave="${this._leavePreview}" @focus="${this._schedulePreview}" @blur="${this._leavePreview}" @click="${this._hidePreview}">${this.compact?o?a`<span class="${`status ${s}`}">${o}</span>`:a`<slot></slot>`:a`${o?a`<span class="${`link-icon ${s}`}">${o}</span>`:m} <span class="link-title">${n?.title??(c||this.url)}</span> ${n?a`<span class="ref">${c}</span><span class="${`link-status ${s}`}">${Io[s]}</span>`:m}`} </a>${this.compact&&r?a`<a class="${u?"preview wide":"preview"}" id="fix-preview" popover="manual" href="${this.url}" target="_blank" rel="noopener noreferrer" draggable="false" aria-label="${`Open ${e?"pull request":"issue"} ${c} on GitHub`}" @mouseenter="${this._keepPreview}" @mouseleave="${this._leavePreview}" @focusin="${this._keepPreview}" @focusout="${this._leavePreview}" @click="${p=>{p.stopPropagation(),this._hidePreview()}}"><div class="preview-header"><span class="preview-ref">${J(bi)}<span>${c}</span></span> <span class="${`status ${s}`}">${o}${n?Io[s]:e?"Pull request":"Issue"}</span></div>${n?a`<div class="preview-title">${n.title}</div>`:m} ${n?.description?a`<div class="preview-description">${n.description}</div>`:m}</a>`:m}`}};customElements.define("managed-fix-link",Fo);var Do=class extends He{static properties={finding:{attribute:!1},comment:{type:String}};static styles=[He.styles,M(Ei),ut`:host{display:inline-flex}:host([hidden]){display:none!important}button{border:0;padding:0;background:none;color:inherit;font:inherit;cursor:default}.preview-trigger{display:inline-flex;align-items:center;justify-content:center;line-height:0}.preview-trigger:hover{color:var(--accent)}.managed-comment+.managed-comment{margin-top:12px;padding-top:12px;border-top:1px solid var(--border)}.comment-body{white-space:pre-wrap}.comment-body a{color:var(--accent);text-decoration:none}.comment-body a:hover{text-decoration:underline}.preview-footer{display:flex;justify-content:flex-end;margin-top:8px}.edit-hint{color:var(--muted);font-size:12px}.edit-hint:hover{color:var(--accent)}`];constructor(){super(),this.finding=null,this.comment="",this.unsubscribe=null}connectedCallback(){super.connectedCallback(),this._subscribe(),document.addEventListener("managed-comments-reset",this._resetComments),this.hasUpdated&&this.requestUpdate()}disconnectedCallback(){this.unsubscribe?.(),this.unsubscribe=null,document.removeEventListener("managed-comments-reset",this._resetComments),super.disconnectedCallback()}updated(e){this.hidden=!this.renderRoot.querySelector(".preview"),e.has("finding")&&(this._hidePreview(),this._subscribe()),super.updated(e)}_subscribe(){this.unsubscribe?.(),this.unsubscribe=this.finding?.id?mc(this.finding.id,()=>this.requestUpdate()):null}_resetComments=()=>{this._hidePreview(),this.requestUpdate()};_previewClick(e){if(e.target.closest("a, button")){this._hidePreview();return}window.getSelection?.()?.toString()||(e.stopPropagation(),this.renderRoot.querySelector(".preview-trigger").click())}render(){let e=H(),t=e?fc(this.finding):[];if(!(e?t.length>0:!!this.comment))return m;let s=(e?t.map(o=>o.body):[this.comment]).some(o=>o.split(/[\r\n]/u).some(c=>c.length>100));return a`<button type="button" class="preview-trigger mark-comment" aria-label="${e?"View comments":"Edit comment"}" aria-details="comment-preview" @mouseenter="${this._schedulePreview}" @mouseleave="${this._leavePreview}" @focus="${this._schedulePreview}" @blur="${this._leavePreview}" @click="${this._hidePreview}"><slot></slot></button><div class="${s?"preview wide":"preview"}" id="comment-preview" popover="manual" role="region" aria-label="${e?"Comments":"Comment"}" @mouseenter="${this._keepPreview}" @mouseleave="${this._leavePreview}" @focusin="${this._keepPreview}" @focusout="${this._leavePreview}" @click="${this._previewClick}">${e?t.map(o=>Ta(o,un(o.body))):a`<div class="comment-body">${un(this.comment)}</div><div class="preview-footer"><button type="button" class="mark-comment edit-hint">Edit</button></div>`}</div>`}};customElements.define("comment-preview",Do);function Lh(i){if(fa(i))throw new Error("This is a links file, not a report. Wrap report rows in a groups or findings object to compare them.");let e=i;try{let c=JSON.parse(i);Array.isArray(c)&&(e=JSON.stringify({groups:c}))}catch{}let{data:t,reason:r}=la(e);if(!t)throw new Error(r);let n=[],s=new Map,o=0;for(let c of aa(t)){let u=new Set;for(let d of Array.isArray(c)?c:[c])if(!(!d||typeof d!="object"||Array.isArray(d))){if(typeof d.id!="string"||!d.id){o++;continue}u.add(d.id),s.has(d.id)||s.set(d.id,[]),s.get(d.id).push(d)}n.push([...u].toSorted())}return{rows:n,byId:s,missingIds:o}}function zg(i){let e=new Set;for(let t of i){let r=[...new Set(t)].toSorted();for(let n=0;n<r.length;n++)for(let s=n+1;s<r.length;s++)e.add(JSON.stringify([r[n],r[s]]))}return e}function Th(i){let e=new Map,t=n=>{let s=n;for(;e.get(s)!==s;)e.set(s,e.get(e.get(s))),s=e.get(s);return s};for(let n of i){let[s,o]=JSON.parse(n);for(let c of[s,o])e.has(c)||e.set(c,c);e.set(t(s),t(o))}let r=new Map;for(let n of[...e.keys()].toSorted()){let s=t(n);r.has(s)||r.set(s,[]),r.get(s).push(n)}return[...r.values()].toSorted((n,s)=>n[0].localeCompare(s[0]))}function Ie(i,e,t){let r=(i.byId.get(e)??[]).map(n=>t==="verdict"?sa(n)||null:t==="severity"?ra(n)??null:t==="originalSeverity"?n.severity??null:t==="confidence"&&Number.isFinite(n.confidence)?n.confidence:null);return[...new Set(r)].toSorted((n,s)=>String(n).localeCompare(String(s),void 0,{numeric:!0}))}var Rh=(i,e)=>i.length===e.length&&i.every((t,r)=>t===e[r]),Hr=(i,e)=>[...i].filter(t=>!e.has(t)).toSorted();function Mh(i,e){let t=new Set(i.byId.keys()),r=new Set(e.byId.keys()),n=[...t].filter(v=>r.has(v)).toSorted(),s=new Set(n),o=v=>zg(v.rows.map(g=>g.filter(y=>s.has(y)))),c=o(i),u=o(e),d={confirmed:[],refuted:[],otherVerdicts:[],confidence:[],severity:[]};for(let v of n)for(let g of["verdict","confidence","severity"]){let y=Ie(i,v,g),k=Ie(e,v,g),_={id:v,before:y,after:k};if(g==="severity"&&(_.originalBefore=Ie(i,v,"originalSeverity"),_.originalAfter=Ie(e,v,"originalSeverity")),Rh(y,k)&&(g!=="severity"||Rh(_.originalBefore,_.originalAfter)))continue;if(g!=="verdict"){d[g].push(_);continue}let x=k.length===1&&k[0]==="confirmed"?"confirmed":k.length===1&&k[0]==="refuted"?"refuted":"otherVerdicts";d[x].push(_)}let p=Th(Hr(u,c)),h=Th(Hr(c,u)),f=Hr(r,t),b=Hr(t,r);return{before:i,after:e,added:f,removed:b,shared:n,joined:p,split:h,...d,unchanged:f.length===0&&b.length===0&&p.length===0&&h.length===0&&Object.values(d).every(v=>v.length===0)}}var Ph=`dialog{width:min(94vw,1180px);max-width:1180px;height:min(88dvh,960px);max-height:92dvh;margin-block:auto;padding:0;overflow:hidden;background:var(--theme-bar)}dialog[open]{display:flex;flex-direction:column}header{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:1.1rem 1.3rem}header h3{margin-bottom:.25rem;font-size:1.1rem}header p,.muted,.note,.empty{color:var(--muted);font-size:.78rem;line-height:1.5}button,select,input{font:inherit;font-size:.8rem}button,select,.file-button,.search{color:var(--text);background:var(--surface);border:1px solid var(--border);border-radius:var(--ui-radius, 6px);padding:.45rem .65rem}button:not(:disabled):hover,.file-button:hover{background:var(--surface-active)}button:disabled{opacity:.45}button:focus-visible,select:focus-visible,.search:focus-visible,.file-button:focus-within{outline:2px solid var(--accent);outline-offset:2px}.pickers{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:start;gap:1rem;padding:0 1.3rem 1rem;border-bottom:1px solid var(--border)}.picker{min-width:0}.picker>label{display:block;font-size:.72rem;font-weight:600;margin-bottom:.4rem;color:var(--muted)}.picker select{width:100%;text-overflow:ellipsis}.file-picker{display:flex;align-items:center;flex-wrap:wrap;gap:.6rem;margin-top:.55rem}.file-button{position:relative;display:inline-block;font-size:.74rem;padding:.3rem .5rem;overflow:hidden}.file-button input{position:absolute;inset:0;opacity:0;width:100%}.swap{align-self:start;margin-top:1.5rem;font-size:1rem}.results{overflow:auto;min-height:0;padding:1.1rem 1.3rem 1.4rem}.summary{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:.65rem}.summary>div{display:flex;flex-direction:column;gap:.35rem;padding:.8rem 1rem;background:var(--bg);border:1px solid var(--border);border-radius:var(--ui-radius, 7px)}.summary span{font-size:.72rem;color:var(--muted)}.summary strong{font-size:1.15rem;font-variant-numeric:tabular-nums}.positive h4{color:var(--green)}.negative h4,.verdict-confirmed h4,.summary .verdict-confirmed strong{color:var(--critical)}.verdict-refuted h4,.summary .verdict-refuted strong{color:var(--muted)}.change-counts{display:flex;flex-wrap:wrap;gap:.4rem;margin-top:.7rem}.change-counts span{font-size:.7rem;padding:.3rem .5rem;border-radius:5px;background:var(--bg);color:var(--muted)}.results-head{display:flex;align-items:center;flex-wrap:wrap;gap:.75rem;margin-block:1rem}.results-head p{flex:1;font-size:.78rem;color:var(--muted);overflow-wrap:anywhere}.search{width:min(100%,17rem)}.section-title{margin:1.2rem 0 .5rem;font-size:.87rem}.note{margin:-.15rem 0 .6rem}.columns{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.8rem}.change-section{border:1px solid var(--border);border-radius:var(--ui-radius, 7px);overflow:hidden;margin-bottom:.6rem}.change-section h4{display:flex;justify-content:space-between;align-items:center;gap:.5rem;font-size:.78rem;font-weight:600;padding:.65rem .8rem;background:var(--bg)}.count{font-variant-numeric:tabular-nums;font-size:.7rem}ul{list-style:none}li{border-top:1px solid var(--border);padding:.7rem .8rem}.change-row{display:flex;justify-content:space-between;align-items:start;gap:.8rem}.finding{display:flex;flex-direction:column;gap:.2rem;min-width:0;overflow-wrap:anywhere}.finding strong{font-size:.77rem;font-weight:500;line-height:1.4}.finding code,.finding small{color:var(--muted);font-size:.66rem;line-height:1.4}.change-value{display:flex;align-items:center;justify-content:end;flex-wrap:wrap;gap:.3rem;max-width:48%;flex-shrink:0;font-size:.73rem;text-align:end;overflow-wrap:anywhere}.from{color:var(--muted)}.change-value small{width:100%;color:var(--muted);font-size:.67rem}.group-members{display:flex;flex-direction:column;gap:.55rem}.group-shape{display:flex;flex-wrap:wrap;gap:.45rem;margin-top:.7rem;font:.66rem/1.5 monospace;overflow-wrap:anywhere}.group-shape>span{min-width:0}.empty{padding:.7rem .8rem}.more{margin:.5rem .8rem .7rem;font-size:.72rem}.placeholder{padding:4rem 1rem;text-align:center;color:var(--muted);font-size:.85rem}.identical{color:var(--green);font-size:.82rem;padding-block:.5rem}.error,.warning{font-size:.75rem;line-height:1.5;margin-top:.5rem;overflow-wrap:anywhere}.error{color:var(--critical)}.warning{color:var(--yellow)}dialog>.error{padding:0 1.3rem .6rem}@media(width<=650px){.pickers{gap:.5rem;padding-inline:.8rem}.columns{grid-template-columns:minmax(0,1fr);gap:0}.summary{grid-template-columns:repeat(2,minmax(0,1fr))}.summary>div{padding:.6rem}.results-head p{flex-basis:100%}.search{width:100%}header,.results{padding-inline:.8rem}.change-row{flex-wrap:wrap}.change-value{max-width:100%}}
101
+ `;var Oo=()=>({key:"",name:"",report:null,error:"",loading:!1}),ct=(i,e)=>i.map(t=>t===null?"Not supplied":e==="confidence"?`${t}/10`:String(t).replaceAll("_"," ")).join(" / "),Bo=50,No=class extends q{static styles=[...q.styles,M(Ph)];static properties={_names:{state:!0},_sides:{state:!0},_catalogError:{state:!0},_catalogLoading:{state:!0},_diff:{state:!0},_query:{state:!0},_limits:{state:!0}};constructor(){super(),this._names=[],this._sides=[Oo(),Oo()],this._tokens=[0,0],this._catalogError="",this._catalogLoading=!0,this._diff=null,this._query="",this._limits={}}beforeOpen(){this._loadCatalog()}focusInitial(){this.renderRoot.querySelector("select")?.focus()}async _loadCatalog(){try{let e=await gt();if(this._settled)return;this._names=e.filter(n=>ol(n)!==ma);let t=this._names.includes(l.currentFile)?l.currentFile:this._names[0];t&&!this._tokens[0]&&this._select(0,t);let r=this._names.find(n=>n!==t);r&&!this._tokens[1]&&this._select(1,r)}catch(e){this._settled||(this._catalogError=`Couldn't list saved reports: ${e.message}`)}finally{this._settled||(this._catalogLoading=!1)}}_setSide(e,t){this._sides=this._sides.map((s,o)=>o===e?t:s),this._limits={};let[r,n]=this._sides.map(s=>s.report);this._diff=r&&n?Mh(r,n):null}async _select(e,t,r){let n=++this._tokens[e],s={...Oo(),key:r?"":t,name:t,loading:!!t};if(this._setSide(e,s),!!t)try{let o=r?await r.text():await tl(t);if(this._settled||this._tokens[e]!==n)return;this._setSide(e,{...s,loading:!1,report:Lh(o)})}catch(o){!this._settled&&this._tokens[e]===n&&this._setSide(e,{...s,loading:!1,error:`Couldn't read ${t}: ${o.message}`})}}_file(e,t){let r=t.target.files?.[0];t.target.value="",r&&this._select(e,r.name,r)}_swap(){this._sides.some(e=>e.loading)||(this._tokens=this._tokens.map(e=>e+1),this._sides=this._sides.toReversed(),this._setSide(0,this._sides[0]))}_picker(e){let t=this._sides[e],r=e===0?"Before":"After";return a`<section class="picker"><label for="${`report-${e}`}">${r}</label> <select id="${`report-${e}`}" @change="${n=>this._select(e,n.target.value)}"><option value="" .selected="${!t.key}">${t.name&&!t.key?t.name:"Choose a saved report\u2026"}</option>${this._names.map(n=>a`<option value="${n}" .selected="${t.key===n}">${n}</option>`)}</select><div class="file-picker"><label class="file-button">Open file…<input type="file" accept=".json,.md,.markdown" aria-label="${`Open ${r.toLowerCase()} report file`}" @change="${n=>this._file(e,n)}"></label> <span class="muted">${t.loading?"Reading report\u2026":t.report?`${t.report.byId.size.toLocaleString()} unique findings`:"JSON or Markdown"}</span></div>${t.error?a`<p class="error" role="alert">${t.error}</p>`:m} ${t.report?.missingIds?a`<p class="warning">${t.report.missingIds} findings without an id excluded.</p>`:m}</section>`}_finding(e){let t=this._diff.after.byId.get(e)?.[0]??this._diff.before.byId.get(e)?.[0];return a`<span class="finding"><strong>${Bt(t)||e}</strong><code>${e}</code>${t.file?a`<small>${t.file}</small>`:m}</span>`}_matches(e){let t=this._query.trim().toLowerCase();if(!t)return!0;let r=[...this._diff.before.byId.get(e)??[],...this._diff.after.byId.get(e)??[]];return[e,...r.flatMap(n=>[Bt(n),n.file])].filter(Boolean).some(n=>n.toLowerCase().includes(t))}_section(e,t,r,n,s=""){let o=r.filter(u=>(Array.isArray(u)?u:[u.id??u]).some(d=>this._matches(d))),c=this._limits[e]??Bo;return a`<section class="${`change-section ${s}`}" aria-label="${t}"><h4>${t}<span class="count">${this._query.trim()?`${o.length} / `:""}${r.length}</span></h4>${o.length>0?a`<ul>${o.slice(0,c).map(n)}</ul>`:a`<p class="empty">${r.length>0?"No matching findings.":"No changes."}</p>`} ${o.length>c?a`<button class="more" @click="${()=>{this._limits={...this._limits,[e]:c+Bo}}}">Show ${Math.min(Bo,o.length-c)} more (${o.length-c} remaining)</button>`:m}</section>`}_changeRow(e,t){let r=t==="severity"&&JSON.stringify(e.originalBefore)!==JSON.stringify(e.originalAfter);return a`<li class="change-row">${this._finding(e.id)}<span class="change-value"> <span class="from">${ct(e.before,t)}</span><span aria-label="to">→</span><span>${ct(e.after,t)}</span> ${r?a`<small>Original: ${ct(e.originalBefore)} → ${ct(e.originalAfter)}</small>`:m}</span></li>`}_presenceRow(e,t){let r=ct(Ie(t,e,"verdict"));return a`<li class="change-row">${this._finding(e)}<span class="change-value"> <span>${ct(Ie(t,e,"severity"))}</span><span>${ct(Ie(t,e,"confidence"),"confidence")}</span> ${r==="Not supplied"?m:a`<small>${r}</small>`}</span></li>`}_groupRow(e){let t=new Set(e),r=n=>n.rows.map(s=>s.filter(o=>t.has(o))).filter(s=>s.length).map(s=>s.join(", ")).filter((s,o,c)=>c.indexOf(s)===o).join(" | ");return a`<li class="group-row"><div class="group-members">${e.map(n=>this._finding(n))}</div><div class="group-shape"><span class="from">${r(this._diff.before)}</span><span aria-label="to">→</span><span>${r(this._diff.after)}</span></div></li>`}_verdictCount(e,t){return[...e.byId.keys()].filter(r=>Ie(e,r,"verdict").includes(t)).length}_results(){let e=this._diff;return e?a`<div class="summary" aria-label="Comparison summary"><div><span>Unique findings</span><strong>${e.before.byId.size} → ${e.after.byId.size}</strong></div><div><span>In common</span><strong>${e.shared.length}</strong></div><div class="verdict-confirmed"><span>Confirmed</span><strong>${this._verdictCount(e.before,"confirmed")} → ${this._verdictCount(e.after,"confirmed")}</strong></div><div class="verdict-refuted"><span>Refuted</span><strong>${this._verdictCount(e.before,"refuted")} → ${this._verdictCount(e.after,"refuted")}</strong></div></div><div class="change-counts" aria-label="Change counts"><span>${e.added.length} added</span><span>${e.removed.length} removed</span> <span>${e.joined.length} joined</span><span>${e.split.length} split</span> <span>${e.confidence.length} confidence</span><span>${e.severity.length} severity</span></div><div class="results-head"><p>Changes from <strong>${this._sides[0].name}</strong> to <strong>${this._sides[1].name}</strong>.</p><input class="search" type="search" aria-label="Filter comparison findings" placeholder="Filter by id, title or file…" .value="${this._query}" @input="${t=>{this._query=t.target.value,this._limits={}}}"></div>${e.shared.length===0&&(e.before.missingIds||e.after.missingIds)?a`<p class="warning" role="status">No shared ids to compare. Findings without ids cannot be matched.</p>`:e.unchanged?a`<p class="identical" role="status">No differences in finding ids, grouping, verdicts, confidence or severity.</p>`:m}<h3 class="section-title">Findings</h3><div class="columns">${this._section("added","Added",e.added,t=>this._presenceRow(t,e.after),"positive")} ${this._section("removed","Removed",e.removed,t=>this._presenceRow(t,e.before),"negative")}</div><h3 class="section-title">Revalidation</h3><p class="note">Changed verdicts for shared ids, grouped by the after report’s verdict.</p><div class="columns">${this._section("confirmed","Confirmed",e.confirmed,t=>this._changeRow(t,"verdict"),"verdict-confirmed")} ${this._section("refuted","Refuted",e.refuted,t=>this._changeRow(t,"verdict"),"verdict-refuted")}</div>${e.otherVerdicts.length>0?this._section("other","Other verdict changes",e.otherVerdicts,t=>this._changeRow(t,"verdict")):m}<h3 class="section-title">Grouping</h3><p class="note">Only shared ids. Each cluster connects changed pairs; added or removed findings do not count as regrouping.</p><div class="columns">${this._section("joined","Joined",e.joined,t=>this._groupRow(t),"positive")} ${this._section("split","Split",e.split,t=>this._groupRow(t),"negative")}</div><h3 class="section-title">Ratings</h3><p class="note">Shared ids only. Severity includes report corrections; changes to original severity are also shown.</p><div class="columns">${this._section("confidence","Confidence changes",e.confidence,t=>this._changeRow(t,"confidence"))} ${this._section("severity","Severity changes",e.severity,t=>this._changeRow(t,"severity"))}</div>`:a`<p class="placeholder" role="status">${this._sides.some(t=>t.loading)||this._catalogLoading?"Loading reports\u2026":"Choose two saved reports or open two files to compare."}</p>`}render(){return a`<dialog aria-labelledby="compare-title" @close="${this._onClose}"><header><div><h3 id="compare-title">Compare reports</h3><p>Compare findings, grouping and ratings between two reports.</p></div><button aria-label="Close report comparison" @click="${this._onClose}">Close</button></header><div class="pickers">${this._picker(0)}<button class="swap" aria-label="Swap before and after reports" ?disabled="${this._sides.some(e=>e.loading)}" @click="${this._swap}">⇄</button>${this._picker(1)}</div>${this._catalogError?a`<p class="error" role="alert">${this._catalogError} You can still open files directly.</p>`:m}<div class="results">${this._results()}</div></dialog>`}};customElements.define("report-compare-dialog",No);function Ah(){if(H())throw new Error("Report comparison is available in local/E2E mode.");return Y("report-compare-dialog")}function pi(i){let e=new Map;for(let[t,r]of l.triage)r[i]&&e.set(t,r[i]);return e}var Hg={get markers(){return pi("color")},get triageState(){return pi("triage")},get comments(){return pi("comment")},get fixes(){return pi("fix")},get flags(){return pi("flagged")},get(i){let e=l.triage.get(i),t={};return e?.color&&(t.color=e.color),e?.triage&&(t.triage=e.triage),e?.comment&&(t.comment=e.comment),e?.fix&&(t.fix=e.fix),e?.flagged!==void 0&&(t.flagged=e.flagged),t},async set(i,{color:e,triage:t,comment:r,fix:n,flagged:s}={}){if(Ut())throw new Error("DeepView.triage.set: triage is read-only on this page");let o=!1;if(e!==void 0&&(e===null||e===""?X(l.triage,i,{color:void 0})&&(o=!0):l.triage.get(i)?.color!==e&&(X(l.triage,i,{color:e}),o=!0)),t!==void 0)if(t===null||t===""||t===!1)X(l.triage,i,{triage:void 0})&&(o=!0);else if(t==="inprogress"||t==="fixed"||t==="invalid"||t==="deleted"||t==="ignored")l.triage.get(i)?.triage!==t&&(X(l.triage,i,{triage:t}),o=!0);else throw new TypeError(`DeepView.triage.set: unknown triage value ${JSON.stringify(t)} (expected 'inprogress' | 'fixed' | 'invalid' | 'deleted' | 'ignored' | null)`);if(r!==void 0){let c=r?String(r):"";c?l.triage.get(i)?.comment!==c&&(X(l.triage,i,{comment:c}),o=!0):X(l.triage,i,{comment:void 0})&&(o=!0)}if(n!==void 0){let c=n?String(n):"";c?l.triage.get(i)?.fix!==c&&(X(l.triage,i,{fix:c}),o=!0):X(l.triage,i,{fix:void 0})&&(o=!0)}if(s!==void 0){let c=s===null||s===""?void 0:!!s;l.triage.get(i)?.flagged!==c&&(X(l.triage,i,{flagged:c}),o=!0)}return o&&(await ke(),$()),o}};window.DeepView={get reports(){return l.reports.slice()},get groups(){return Vt()},get findings(){return Vt().flat()},get currentFile(){return l.currentFile},get currentWorkspace(){return l.currentWorkspace},triage:Hg,forceManagedMode:qd,setTheme:Gu,get theme(){return Wu()},triageSync:Fi,refresh(){$()},export(){return rp()},compareReports(){return Ah()}};var Ug={default:Je.default,"claude-security":Je["claude-security"],"codex-security":Je["codex-security"],deepsec:Je.deepsec,piolium:Je.piolium,"markdown-generic":Je["markdown-generic"],bundle:Yo,workspace:Jo,links:gi,github:bi};for(let i of document.querySelectorAll(".drop-supported-icon[data-icon]")){let e=Ug[i.dataset.icon];e&&(i.innerHTML=e)}kl($);pl($);wl($);Fi.onStatusChange($);yl(async(i,e)=>{l.currentWorkspace===i?await it(i):l.currentFile&&l.currentFile===e?await tt(e):await fe()});_l(async()=>{await fe(),l.currentView==="bundles"&&$()});jd();Kd();async function Dh(){let i=vl();if(!i)return!1;try{history.replaceState(null,"",location.pathname)}catch{}let e;try{e=await Wd({encoded:i})}catch(r){return alert(`Couldn't open the share-link unlock prompt: ${r.message}`),!1}if(!e)return!1;let t=await ll({id:e.id,name:e.name,privateKey:e.privateKeyBase64});if(t.status==="already-attached")return alert(`This workspace is already attached as "${t.workspace.name}".`),!1;if(t.status==="name-collision"){let r=t.existing?.name;return alert(r?`A workspace named "${r}" already exists. Open the share link again and pick a different name.`:"The shared workspace name is empty or invalid. Ask the sender to re-share with a real name."),!1}return t.workspace?.id?await it(t.workspace.id):await fe(),!0}async function Oh(){let i=ha();if(!i)return!1;try{history.replaceState(null,"",location.pathname)}catch{}let e=await zd(i);return e.ok?!0:(alert(e.reason),!1)}var It=!1;async function Bh(){if(await St(),!It&&!(!H()&&we()&&!Ye())){It=!0;try{await jg()}finally{$a.hidden=!1}}}async function jg(){let i=cn(),e=()=>i===cn()&&!H();if(H()){await fe();return}if(await Ya(),!e()||(al(),await Promise.all([fe(),ul().catch(s=>console.warn("initial linked findings:",s))]),!e())||await Dh()||!e()||await Oh()||!e())return;let n=Wa(fd);if(n)if(n.startsWith("wbs:")||n.startsWith("wrs:"))await Xi(n.slice(4),n.startsWith("wrs:")?"reports":"bundles");else if(n.startsWith("ws:")){let s=n.slice(3);he().some(o=>o.id===s)&&await it(s)}else if(n.startsWith("b:")){let s=n.slice(2),o=s.indexOf(" "),c=o>=0?s.slice(0,o):s,u=o>=0?s.slice(o+1):"",d=ki.has(u)?u:"overview";if((l.bundles??[]).some(p=>p.integrity===c)){let p=he().filter(h=>h.bundles.includes(c));Kt(c,d,{workspaceId:p.length===1?p[0].id:null}),$(),wt(c),await fe()}}else{let s=await gt();if(!e())return;let o=hl(n);o&&s.includes(o.name)&&await tt(o.name,void 0,{workspaceId:o.workspaceId})}}var Ur=!1,Ih=!1;document.addEventListener("managed-client-mode-change",()=>{Ur=!H()&&we()});function Fh(i){Ih||(Ih=!0,queueMicrotask(()=>{alert(i+" This tab will reload to refresh its state. Any unsaved edits in this tab will be lost."),location.reload()}))}Pi(async()=>{if(await St(),H()){$();return}let i=Ur,e=we();if(Ur=e,$(),!It&&Ye()){Bh().catch(t=>console.warn("continueBoot:",t));return}if(It&&e&&!Ye()){Fh("Encryption was just enabled in another tab.");return}It&&i&&!e&&!ja()&&Fh("Encryption was disabled in another tab.")});window.addEventListener("hashchange",()=>{!It||H()||(async()=>{await Dh()||await Oh()})().catch(i=>console.warn("deep-link hashchange:",i))});(async()=>{if(!await Gd()){await St(),Ur=!H()&&we();try{let i=window.matchMedia?.("(display-mode: window-controls-overlay)"),e=()=>{let n=!1;try{n=localStorage.getItem("deepview.sidebarCollapsed")==="1"}catch{}xa.classList.toggle("collapsed",n&&!i?.matches)};e(),i?.addEventListener("change",e);let t=i?.matches;if(window.matchMedia?.("(display-mode: standalone)").matches||t){let n=document.querySelector('meta[name="viewport"]');n&&n.setAttribute("content","width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"),window.addEventListener("wheel",s=>{(s.ctrlKey||s.metaKey)&&s.preventDefault()},{passive:!1}),window.addEventListener("keydown",s=>{(s.ctrlKey||s.metaKey)&&(s.key==="="||s.key==="+"||s.key==="-"||s.key==="0")&&s.preventDefault()})}}catch{}!H()&&we()&&!Ye()||await Bh()}})();
93
102
  /*! Bundled license information:
94
103
 
95
- @lit/reactive-element/css-tag.js:
96
- (**
97
- * @license
98
- * Copyright 2019 Google LLC
99
- * SPDX-License-Identifier: BSD-3-Clause
100
- *)
101
-
102
- @lit/reactive-element/reactive-element.js:
103
- lit-html/lit-html.js:
104
- lit-element/lit-element.js:
105
- lit-html/directive.js:
106
- lit-html/directives/repeat.js:
107
- lit-html/directives/unsafe-html.js:
108
- (**
109
- * @license
110
- * Copyright 2017 Google LLC
111
- * SPDX-License-Identifier: BSD-3-Clause
112
- *)
113
-
114
- lit-html/is-server.js:
115
- (**
116
- * @license
117
- * Copyright 2022 Google LLC
118
- * SPDX-License-Identifier: BSD-3-Clause
119
- *)
120
-
121
- lit-html/directives/class-map.js:
122
- lit-html/directives/style-map.js:
123
- (**
124
- * @license
125
- * Copyright 2018 Google LLC
126
- * SPDX-License-Identifier: BSD-3-Clause
127
- *)
128
-
129
- lit-html/directive-helpers.js:
130
- lit-html/directives/live.js:
104
+ lit-html/static.js:
131
105
  (**
132
106
  * @license
133
107
  * Copyright 2020 Google LLC
134
108
  * SPDX-License-Identifier: BSD-3-Clause
135
109
  *)
136
-
137
- lit-html/directives/map.js:
138
- lit-html/directives/choose.js:
139
- (**
140
- * @license
141
- * Copyright 2021 Google LLC
142
- * SPDX-License-Identifier: BSD-3-Clause
143
- *)
144
110
  */