sparkforensics-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/index.js +147 -0
  2. package/lib/static-files.js +50 -0
  3. package/package.json +28 -0
  4. package/public/assets/AutoscalingChurn-CP5OjN6v.js +1 -0
  5. package/public/assets/CacheUtilization-BjyawXL6.js +1 -0
  6. package/public/assets/CachingOpportunity-DV2ABG2G.js +1 -0
  7. package/public/assets/ConfigAudit-DMiBhAoG.js +1 -0
  8. package/public/assets/CoreUsageArea-CGYIgPnt.js +1 -0
  9. package/public/assets/Dashboard-D1_IrWRs.js +12 -0
  10. package/public/assets/ExecutorTimeline-DkaAGqQT.js +1 -0
  11. package/public/assets/Failures-Crngoicu.js +1 -0
  12. package/public/assets/GcPressure-CFXm4BnA.js +1 -0
  13. package/public/assets/IncompleteRun-BWEJTb13.js +1 -0
  14. package/public/assets/JobFailures-BmjxCA-h.js +1 -0
  15. package/public/assets/MemoryUtilization-Bu2uQJbd.js +1 -0
  16. package/public/assets/PlanExplorer-DKUwF0uz.js +1 -0
  17. package/public/assets/PlanGraphRoute-BjPSugIG.js +1 -0
  18. package/public/assets/ShuffleIO--Rur3neu.js +1 -0
  19. package/public/assets/Spill-DIMpt8c2.js +1 -0
  20. package/public/assets/TaskSkew-BDr1DbeI.js +1 -0
  21. package/public/assets/charts-vendor-NMqKV0H4.js +59 -0
  22. package/public/assets/index-4id52G-A.js +9 -0
  23. package/public/assets/index-D9kwVYIO.css +1 -0
  24. package/public/assets/parser-worker-00O9WEQC.js +65 -0
  25. package/public/assets/plan-graph-vendor-BnuhLJ6X.css +1 -0
  26. package/public/assets/plan-graph-vendor-vZQHG2EJ.js +7 -0
  27. package/public/assets/react-vendor-u4pyvC5Y.js +9 -0
  28. package/public/assets/useRecentFiles-46iBU9zJ.js +5 -0
  29. package/public/docs/404.html +26 -0
  30. package/public/docs/assets/app.Bxy4_HVA.js +1 -0
  31. package/public/docs/assets/chunks/@localSearchIndexroot.DclgKtlT.js +1 -0
  32. package/public/docs/assets/chunks/VPLocalSearchBox.L5jNOIR3.js +9 -0
  33. package/public/docs/assets/chunks/framework.CNDaxUod.js +20 -0
  34. package/public/docs/assets/chunks/theme.CoT6y5bf.js +2 -0
  35. package/public/docs/assets/contributor-guide_architecture_board-widgets.md.BtjoE_1k.js +1 -0
  36. package/public/docs/assets/contributor-guide_architecture_board-widgets.md.BtjoE_1k.lean.js +1 -0
  37. package/public/docs/assets/contributor-guide_architecture_detector-contract.md.DQyCHQNM.js +1 -0
  38. package/public/docs/assets/contributor-guide_architecture_detector-contract.md.DQyCHQNM.lean.js +1 -0
  39. package/public/docs/assets/contributor-guide_architecture_drill-down.md.BKfyDQck.js +1 -0
  40. package/public/docs/assets/contributor-guide_architecture_drill-down.md.BKfyDQck.lean.js +1 -0
  41. package/public/docs/assets/contributor-guide_architecture_impact-estimation.md.CzlXOnCq.js +1 -0
  42. package/public/docs/assets/contributor-guide_architecture_impact-estimation.md.CzlXOnCq.lean.js +1 -0
  43. package/public/docs/assets/contributor-guide_architecture_index.md.94lNbF-4.js +1 -0
  44. package/public/docs/assets/contributor-guide_architecture_index.md.94lNbF-4.lean.js +1 -0
  45. package/public/docs/assets/contributor-guide_architecture_overview.md.mQFlN66o.js +1 -0
  46. package/public/docs/assets/contributor-guide_architecture_overview.md.mQFlN66o.lean.js +1 -0
  47. package/public/docs/assets/contributor-guide_architecture_state-and-history.md.DaqttKgQ.js +1 -0
  48. package/public/docs/assets/contributor-guide_architecture_state-and-history.md.DaqttKgQ.lean.js +1 -0
  49. package/public/docs/assets/contributor-guide_architecture_widget-rendering.md.Bk6Iyj9S.js +1 -0
  50. package/public/docs/assets/contributor-guide_architecture_widget-rendering.md.Bk6Iyj9S.lean.js +1 -0
  51. package/public/docs/assets/contributor-guide_architecture_worker-protocol.md.BaS_L10g.js +6 -0
  52. package/public/docs/assets/contributor-guide_architecture_worker-protocol.md.BaS_L10g.lean.js +1 -0
  53. package/public/docs/assets/contributor-guide_contributing.md.C-lKs70I.js +1 -0
  54. package/public/docs/assets/contributor-guide_contributing.md.C-lKs70I.lean.js +1 -0
  55. package/public/docs/assets/contributor-guide_development-setup.md.CpUMVtIK.js +12 -0
  56. package/public/docs/assets/contributor-guide_development-setup.md.CpUMVtIK.lean.js +1 -0
  57. package/public/docs/assets/contributor-guide_testing.md.C0q-BJfl.js +1 -0
  58. package/public/docs/assets/contributor-guide_testing.md.C0q-BJfl.lean.js +1 -0
  59. package/public/docs/assets/index.md.CETnDZzR.js +1 -0
  60. package/public/docs/assets/index.md.CETnDZzR.lean.js +1 -0
  61. package/public/docs/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  62. package/public/docs/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  63. package/public/docs/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  64. package/public/docs/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  65. package/public/docs/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  66. package/public/docs/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  67. package/public/docs/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  68. package/public/docs/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  69. package/public/docs/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  70. package/public/docs/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  71. package/public/docs/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  72. package/public/docs/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  73. package/public/docs/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  74. package/public/docs/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  75. package/public/docs/assets/style.D2mY0HUs.css +1 -0
  76. package/public/docs/assets/user-guide_getting-started.md.BJdD7a7_.js +3 -0
  77. package/public/docs/assets/user-guide_getting-started.md.BJdD7a7_.lean.js +1 -0
  78. package/public/docs/assets/user-guide_mcp-tools.md.DwYI1d6C.js +95 -0
  79. package/public/docs/assets/user-guide_mcp-tools.md.DwYI1d6C.lean.js +1 -0
  80. package/public/docs/assets/user-guide_run-comparison.md.5-oaOfTu.js +1 -0
  81. package/public/docs/assets/user-guide_run-comparison.md.5-oaOfTu.lean.js +1 -0
  82. package/public/docs/assets/user-guide_understanding-findings.md.CK2WZ0Tf.js +1 -0
  83. package/public/docs/assets/user-guide_understanding-findings.md.CK2WZ0Tf.lean.js +1 -0
  84. package/public/docs/contributor-guide/architecture/board-widgets.html +29 -0
  85. package/public/docs/contributor-guide/architecture/detector-contract.html +29 -0
  86. package/public/docs/contributor-guide/architecture/drill-down.html +29 -0
  87. package/public/docs/contributor-guide/architecture/impact-estimation.html +29 -0
  88. package/public/docs/contributor-guide/architecture/index.html +29 -0
  89. package/public/docs/contributor-guide/architecture/overview.html +29 -0
  90. package/public/docs/contributor-guide/architecture/state-and-history.html +29 -0
  91. package/public/docs/contributor-guide/architecture/widget-rendering.html +29 -0
  92. package/public/docs/contributor-guide/architecture/worker-protocol.html +34 -0
  93. package/public/docs/contributor-guide/contributing.html +29 -0
  94. package/public/docs/contributor-guide/development-setup.html +40 -0
  95. package/public/docs/contributor-guide/testing.html +29 -0
  96. package/public/docs/favicon.svg +4 -0
  97. package/public/docs/hashmap.json +1 -0
  98. package/public/docs/index.html +29 -0
  99. package/public/docs/user-guide/getting-started.html +31 -0
  100. package/public/docs/user-guide/mcp-tools.html +123 -0
  101. package/public/docs/user-guide/run-comparison.html +29 -0
  102. package/public/docs/user-guide/understanding-findings.html +29 -0
  103. package/public/docs/vp-icons.css +0 -0
  104. package/public/favicon.svg +4 -0
  105. package/public/index.html +36 -0
  106. package/public/vendor/spark-doc/anchors.json +205 -0
  107. package/public/vendor/spark-doc/index.html +4202 -0
  108. package/public/vendor/spark-doc/landing.html +418 -0
  109. package/public/vendor/spark-doc/meta.html +970 -0
  110. package/vendor-core/analyzer.js +167 -0
  111. package/vendor-core/assert-never.js +3 -0
  112. package/vendor-core/cli/budgets.js +203 -0
  113. package/vendor-core/cli/collect-run.js +107 -0
  114. package/vendor-core/core-count.js +68 -0
  115. package/vendor-core/core-locality-ratio.js +54 -0
  116. package/vendor-core/core-time-series.js +92 -0
  117. package/vendor-core/core-usage-locality.js +70 -0
  118. package/vendor-core/detectors.js +1989 -0
  119. package/vendor-core/docs-config.js +72 -0
  120. package/vendor-core/docs-site-config.js +23 -0
  121. package/vendor-core/efficiency-model.js +62 -0
  122. package/vendor-core/etl-phases.js +28 -0
  123. package/vendor-core/event-handlers.js +906 -0
  124. package/vendor-core/event-schemas.js +405 -0
  125. package/vendor-core/evidence-availability.js +121 -0
  126. package/vendor-core/evidence-report.js +459 -0
  127. package/vendor-core/finding-action-label.js +97 -0
  128. package/vendor-core/finding-filter-predicate.js +38 -0
  129. package/vendor-core/format-utils.js +167 -0
  130. package/vendor-core/impact-band.js +50 -0
  131. package/vendor-core/impact-estimator.js +428 -0
  132. package/vendor-core/ingest.js +139 -0
  133. package/vendor-core/job-groups.js +30 -0
  134. package/vendor-core/load-vendored.js +24 -0
  135. package/vendor-core/lz4-block.js +135 -0
  136. package/vendor-core/mcp-error.js +3 -0
  137. package/vendor-core/mcp-server-factory.js +115 -0
  138. package/vendor-core/mcp-tools.js +331 -0
  139. package/vendor-core/model-assembler.js +76 -0
  140. package/vendor-core/occupancy.js +202 -0
  141. package/vendor-core/parser-worker.js +249 -0
  142. package/vendor-core/plan-dot.js +25 -0
  143. package/vendor-core/plan-duration-attribution.js +185 -0
  144. package/vendor-core/plan-graph-model.js +171 -0
  145. package/vendor-core/plan-node-detail.js +159 -0
  146. package/vendor-core/plan-summary.js +233 -0
  147. package/vendor-core/plan-tree-walk.js +29 -0
  148. package/vendor-core/proxy.js +157 -0
  149. package/vendor-core/recommendation-rollup.js +197 -0
  150. package/vendor-core/redact.js +175 -0
  151. package/vendor-core/rolling-log-reassembly.js +52 -0
  152. package/vendor-core/run-aggregates.js +44 -0
  153. package/vendor-core/run-comparison.js +458 -0
  154. package/vendor-core/scaling-sim.js +73 -0
  155. package/vendor-core/session-snapshot.js +79 -0
  156. package/vendor-core/shs-fetch.js +196 -0
  157. package/vendor-core/shs-load.js +121 -0
  158. package/vendor-core/shs-request.js +101 -0
  159. package/vendor-core/shs-schemas.js +13 -0
  160. package/vendor-core/snappy-block.js +140 -0
  161. package/vendor-core/stage-quantiles.js +199 -0
  162. package/vendor-core/threshold-summary.js +35 -0
  163. package/vendor-core/types.js +286 -0
  164. package/vendor-core/vendor/fflate.js +2695 -0
  165. package/vendor-core/vendor/fzstd.js +768 -0
  166. package/vendor-core/wall-clock.js +36 -0
  167. package/vendor-core/wasted-core-hours.js +68 -0
@@ -0,0 +1,5 @@
1
+ import{j as s,E as Ce,F as Ee,G as Te,H as Re,r as x,D as De,m as Me,o as se,n as Be,I as ze,l as Ae,J as Fe,M as Pe,K as Le,L as Oe,N as _e,O as Ke,S as Ve,Q as We,U as Ue,V as qe,W as Ge}from"./react-vendor-u4pyvC5Y.js";import{c as E,d as b,e as He,w as re,s as ie,U as Je,Z as _,f as I,a7 as S,B as j,a9 as Qe,T as oe,aa as ce,ab as Xe,X as Ye,K as k,J as T,ac as Ze,ad as et,ae as tt,af as le,t as K,a as ue,g as nt,h as de,ag as at,I as st,ah as rt,ai as it,C as ot,b as D,aj as ct,ak as lt,al as ut,am as dt,an as pt,ao as mt,ap as ft,aq as gt}from"./index-4id52G-A.js";const ht=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],xt=E("check",ht);const bt=[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]],vt=E("chevron-right",bt);const yt=[["path",{d:"M12 15V3",key:"m9g1x1"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["path",{d:"m7 10 5 5 5-5",key:"brsn70"}]],wt=E("download",yt);const jt=[["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"19",cy:"12",r:"1",key:"1wjl8i"}],["circle",{cx:"5",cy:"12",r:"1",key:"1pcz8c"}]],kt=E("ellipsis",jt);const Nt=[["rect",{width:"8",height:"8",x:"3",y:"3",rx:"2",key:"by2w9f"}],["path",{d:"M7 11v4a2 2 0 0 0 2 2h4",key:"xkn7yn"}],["rect",{width:"8",height:"8",x:"13",y:"13",rx:"2",key:"1cgmvn"}]],F=E("workflow",Nt);function St({className:e,orientation:t="horizontal",...n}){return s.jsx(Ce,{"data-slot":"tabs","data-orientation":t,className:b("group/tabs flex gap-2 data-horizontal:flex-col",e),...n})}const $t=He("group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-8 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none data-[variant=chrome]:w-full data-[variant=chrome]:items-end data-[variant=chrome]:justify-start data-[variant=chrome]:gap-1 data-[variant=chrome]:rounded-none data-[variant=chrome]:border-b data-[variant=chrome]:border-border data-[variant=chrome]:p-0 group-data-horizontal/tabs:data-[variant=chrome]:h-auto",{variants:{variant:{default:"bg-muted",line:"gap-1 bg-transparent",chrome:"bg-transparent"}},defaultVariants:{variant:"default"}});function It({className:e,variant:t="default",...n}){return s.jsx(Ee,{"data-slot":"tabs-list","data-variant":t,className:b($t({variant:t}),e),...n})}function J({className:e,...t}){return s.jsx(Te,{"data-slot":"tabs-trigger",className:b("relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:text-muted-foreground dark:hover:text-foreground group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4","group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent","data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground","after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100","group-data-[variant=chrome]/tabs-list:h-auto group-data-[variant=chrome]/tabs-list:flex-none group-data-[variant=chrome]/tabs-list:gap-2 group-data-[variant=chrome]/tabs-list:rounded-t-md group-data-[variant=chrome]/tabs-list:rounded-b-none group-data-[variant=chrome]/tabs-list:border-x group-data-[variant=chrome]/tabs-list:border-t group-data-[variant=chrome]/tabs-list:border-transparent group-data-[variant=chrome]/tabs-list:px-4 group-data-[variant=chrome]/tabs-list:py-2 group-data-[variant=chrome]/tabs-list:text-sm group-data-[variant=chrome]/tabs-list:font-semibold group-data-[variant=chrome]/tabs-list:text-muted-foreground group-data-[variant=chrome]/tabs-list:hover:bg-muted/40 group-data-[variant=chrome]/tabs-list:hover:text-foreground","group-data-[variant=chrome]/tabs-list:data-active:-mb-px group-data-[variant=chrome]/tabs-list:data-active:border-border group-data-[variant=chrome]/tabs-list:data-active:bg-background group-data-[variant=chrome]/tabs-list:data-active:text-foreground group-data-[variant=chrome]/tabs-list:data-active:shadow-none dark:group-data-[variant=chrome]/tabs-list:data-active:border-border dark:group-data-[variant=chrome]/tabs-list:data-active:bg-background","before:absolute before:inset-x-3 before:top-0 before:h-0.5 before:rounded-full before:bg-accent before:opacity-0 before:transition-opacity group-data-[variant=chrome]/tabs-list:data-active:before:opacity-100","tap-target-comfortable tap-target-comfortable--sm",e),...t})}function Q({className:e,...t}){return s.jsx(Re,{"data-slot":"tabs-content",className:b("flex-1 text-sm outline-none",e),...t})}function X(e){return String(e).replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function Ct(e,{title:t="plan"}={}){if(!e)return"";const n=[`digraph "${X(t)}" {`," rankdir=BT;"," node [shape=box];"],r=new WeakMap,a=[];let o=0;return re(e,(l,c)=>{const i=`n${o++}`;r.set(l,i);const u=l.detail&&l.detail!==l.name?`${l.name}\\n${l.detail}`:l.name;n.push(` ${i} [label="${X(u)}"];`),c&&a.push(` ${r.get(c)} -> ${i};`)},{dedupe:!0}),[...n,...a,"}"].join(`
2
+ `)}function Et(e){return/exchange/i.test(e.name)}function Tt(e){for(const t of e.metrics??[]){if(t.metricType==="timing")return t.value;if(t.metricType==="nsTiming")return t.value/1e6}for(const t of e.metrics??[])if(/time/i.test(t.name)&&typeof t.value=="number")return t.value;return null}function Rt(e){const t=[],n=new Map,r=new Map;if(!e)return{segments:t,segOf:n,segmentTopology:r};let a=1,o=0;return re(e,(l,c)=>{let i;if(!c)i=0,r.set(i,{parentIndex:null,depth:0,traversalOrder:o++});else if(Et(c)){const u=n.get(c);i=a++,r.set(i,{parentIndex:u,depth:r.get(u).depth+1,traversalOrder:o++})}else i=n.get(c);n.set(l,i),(t[i]??=[]).push(l)},{dedupe:!0}),{segments:t,segOf:n,segmentTopology:r}}function pe(e,t,n,r){const a=e.filter(Boolean).map((i,u)=>({i:u,nodes:i,...r.get(u)})).sort((i,u)=>u.depth-i.depth||i.traversalOrder-u.traversalOrder),o=[...n].map(i=>({id:i,s:t.get(i)})).filter(i=>!!i.s).sort((i,u)=>i.s.submittedAt-u.s.submittedAt),l=Math.min(a.length,o.length),c=[];for(let i=0;i<l;i++)c.push({segmentIndex:a[i].i,stageId:o[i].id,nodes:a[i].nodes,stage:o[i].s});return{orderedSegments:a,orderedStages:o,pairs:c}}function Y(e,t,n){const r=new Map;let a=e,o=0;for(;a!=null;)r.set(a,o++),a=n.get(a)?.parentIndex??null;for(a=t,o=0;a!=null;){const l=r.get(a);if(l!=null)return l+o;a=n.get(a)?.parentIndex??null,o++}return Number.POSITIVE_INFINITY}function Un(e,t,n,r){const a=t,o=r,{orderedSegments:l,pairs:c}=pe(e,a,n,o),i=new Map(c.map(p=>[p.segmentIndex,p.stageId])),u=c.map(p=>p.segmentIndex);if(u.length===0)return i;for(const{i:p}of l){if(i.has(p))continue;let m=u[0],d=Y(p,m,o);for(const f of u){const v=Y(p,f,o);v<d&&(d=v,m=f)}i.set(p,i.get(m))}return i}function Dt(e,t,n){const r=new Map,a=n?.stageIds??[];if(!e||a.length===0)return r;const{segments:o,segmentTopology:l}=Rt(e),c=t,{pairs:i}=pe(o,c,a,l);for(const{nodes:u,stage:p}of i){const{submittedAt:m,completedAt:d}=p,f=Math.max(0,d-m),v=u.map(Tt),y=v.reduce((w,h)=>w+(h??0),0);u.forEach((w,h)=>{const N=y>0?f*((v[h]??0)/y):f/u.length;r.set(w,N)})}return r}const me=["serializefromobject","deserializetoobject","mapelements","mappartitions","inputadapter","columnartorow","rowtocolumnar","union"];function Mt(e){const t=(e??"").toLowerCase();return t.startsWith("scan")?"scan":t.includes("exchange")?"exchange":t.includes("join")?"join":t.includes("aggregate")?"aggregate":t.startsWith("sort")?"sort":t.startsWith("filter")?"filter":t==="adaptivesparkplan"?"aqe":me.some(n=>t.startsWith(n))||t.startsWith("wholestagecodegen")?"boilerplate":"transform"}function Bt(e,t){if(!t||t===e)return"";const n=(e??"").toLowerCase(),r=o=>o.replace(/#\d+/g,"");if(me.some(o=>n.startsWith(o))||n==="adaptivesparkplan")return"";if(n.startsWith("wholestagecodegen")){const o=e.match(/\((\d+)\)/);return o?`codegen #${o[1]}`:""}if(n.includes("exchange")){const o=t.match(/Exchange\s+(\w+partitioning)\(([^)]+)\)/i);if(o){const c=o[1].toLowerCase().startsWith("hash")?"hash":"range",i=r(o[2]).split(",").map(d=>d.trim()),p=/^\d+$/.test(i[i.length-1])?i.pop():null,m=i.map(d=>d.replace(/\s+ASC(\s+NULLS\s+\w+)?$/i,"↑").replace(/\s+DESC(\s+NULLS\s+\w+)?$/i,"↓").trim()).slice(0,3);return`${c}(${m.join(", ")}${p?`, ${p}`:""})`}const l=t.match(/Exchange\s+(\w+)/);return l?l[1]:""}if(n.startsWith("sort")&&!n.includes("merge")){const o=t.match(/Sort\s+\[([^\]]+)\]/);if(o)return r(o[1]).split(",").map(l=>l.trim().replace(/\s+ASC(\s+NULLS\s+\w+)?$/i,"↑").replace(/\s+DESC(\s+NULLS\s+\w+)?$/i,"↓")).slice(0,4).join(", ")}if(n.includes("join")){const o=t.match(/Join\s+\[([^\]]*)\][^,]*,\s*\[[^\]]*\][^,]*,\s*(\w+)/i);if(o){const l=r(o[1]).split(",")[0].trim();return l?`${l} ${o[2]}`:o[2]}}if(n.includes("aggregate")){const o=t.match(/functions=\[([^\]]+)\]/);if(o){const l=[...new Set(o[1].split(",").map(c=>(c.trim().match(/^(\w+)\(/)?.[1]??"").replace(/^partial_/,"")))].filter(Boolean);return l.slice(0,5).join(", ")+(l.length>5?` +${l.length-5}`:"")}}if(n.startsWith("filter")){const o=t.match(/Filter\s+(.+)/s);if(o){const l=r(o[1]).trim().replace(/^\((.+)\)$/s,"$1");return l.length>70?l.slice(0,70)+"…":l}}if(n.startsWith("project")){const o=t.match(/Project\s+\[([^\]]+)\]/);if(o){const l=r(o[1]).split(",").map(c=>c.trim());return l.length<=3?l.join(", "):`${l.length} columns`}return""}if(n.startsWith("scan")){if(n.includes("existingrdd")){const l=Je(e);if(l!==e)return l}const o=e.match(/Scan\s+(\S+)/);return o?o[1]:""}const a=r(t);return a.length>80?a.slice(0,80)+"…":a}function fe(e){const{value:t,metricType:n}=e;return typeof t=="string"?t:n==="size"?_(t):n==="timing"?I(t):n==="nsTiming"?I(t/1e6):t.toLocaleString("en-US")}function zt(e){if(!e||e.length===0)return"";const n=["number of output rows","size of files read","spill size","duration"].map(r=>e.find(a=>a.name===r)).find(Boolean)??e[0];return fe(n)}function At(e,t,n,r){if(!e||!n)return null;const a=ie(r,t.stages);if(!a.length)return null;const o=new Map;for(const l of a){const c=t.stages.get(l);c&&o.set(l,{submittedAt:c.submittedAt,completedAt:c.completedAt})}return Dt(e,o,{...n,stageIds:a})}function ge({title:e,rows:t,children:n}){const r=t.filter(a=>!!a);return r.length===0&&!n?null:s.jsxs("section",{className:"space-y-2",children:[e?s.jsx("h3",{className:"font-heading text-sm font-medium",children:e}):null,s.jsx("div",{className:"grid min-w-0 grid-cols-[auto_1fr] gap-x-4 gap-y-1 text-sm",children:r.map(([a,o],l)=>s.jsxs(x.Fragment,{children:[s.jsx("span",{className:"text-muted-foreground",children:a}),s.jsx("span",{className:"break-words",children:o})]},l))}),n]})}const Z="Derived from best-effort plan-text parsing: cross-check against the raw physical plan text (Copy button above) before acting.";function P(){const e=x.useId();return s.jsxs("span",{className:"text-muted-foreground text-xs italic",title:Z,tabIndex:0,"aria-describedby":e,children:["low confidence: verify",s.jsx("span",{id:e,className:"sr-only",children:Z})]})}function Ft(e){try{return Xe(e)}catch{return null}}function Pt(e){try{return Qe(e)}catch{return null}}function Lt(e,t){try{return Ct(e,{title:`stage-${t}`})||null}catch{return null}}function Ot(e,t,n,r){if(!n||r==null)return null;try{return At(e,t,n,r)}catch{return null}}function _t(e,t){const n=t.stages.get(e);return(n?.sqlExecutionId!=null?t.sql.get(n.sqlExecutionId):null)?.planTree??null}function Kt(e){switch(e.kind){case"scan":return[e.path?["Path",e.path]:null,e.format?["Format",e.format]:null,e.projectedColumns?.length?["Columns",e.projectedColumns.join(", ")]:null,e.pushedFilters?.length?["Filters",e.pushedFilters.join(", ")]:null];case"join":return[["Left keys",e.leftKeys?.length?e.leftKeys.join(", "):"(none)"],["Right keys",e.rightKeys?.length?e.rightKeys.join(", "):"(none)"]];case"agg":return[["Group by",e.groupByKeys?.length?e.groupByKeys.join(", "):"(none)"],["Functions",e.aggregations?.length?e.aggregations.join(", "):"(none)"]];case"exchange":return[e.partitioning?["Partitioning",e.partitioning]:null,e.keys?.length?["Keys",e.keys.join(", ")]:null,e.numPartitions?["Partitions",String(e.numPartitions)]:null];default:return[]}}function Vt({rows:e}){const[t,n]=x.useState(!1);return s.jsxs("details",{className:"pt-1 pl-4",onToggle:r=>n(r.currentTarget.open),children:[s.jsx("summary",{className:"cursor-pointer text-xs text-muted-foreground",children:"full detail"}),t?s.jsx("div",{className:"pt-1",children:s.jsx(ge,{rows:e})}):null]})}function he({node:e,depth:t,durationMap:n}){const r=x.useRef(null),[a,o]=x.useState(t<=1);x.useEffect(()=>{r.current&&(r.current.open=t<=1)},[]);const l=Mt(e.name),c=e.detail??"",i=Ft(e),u=i?Kt(i):[],p=u.some(Boolean),m=i?.kind==="scan"?"":Bt(e.name,c),d=n?.get(e),f=e.metrics??[],v=f.length>0?zt(f):"",y=e.children??[],w=y.length>0||f.length>0||p;return s.jsxs("details",{ref:r,"data-op":l,className:"rounded-md",onToggle:h=>o(h.currentTarget.open),children:[s.jsxs("summary",{className:`flex list-none flex-wrap items-center gap-2 rounded-md px-1.5 py-1 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring [&::-webkit-details-marker]:hidden ${w?"cursor-pointer hover:bg-muted":"cursor-default"}`,children:[w?s.jsx(vt,{"aria-hidden":"true",className:`size-3.5 shrink-0 text-muted-foreground transition-transform ${a?"rotate-90":""}`}):s.jsx("span",{className:"size-3.5 shrink-0"}),s.jsx("span",{className:"font-medium",children:e.name}),m?s.jsx("span",{title:c,className:"text-xs text-muted-foreground",children:m}):null,i?.warning?s.jsxs(s.Fragment,{children:[s.jsx(oe,{type:"duplicatePlanSubtree",impactBand:"warning",className:ce}),s.jsx("span",{className:"text-xs text-muted-foreground",children:i.warning.detail}),s.jsx(P,{})]}):null,d!=null&&d>0?s.jsxs("span",{title:"Approximate wall-time attributed to this operator",className:"text-xs text-muted-foreground",children:["~",I(d)]}):null,v?s.jsx("span",{className:"text-xs text-muted-foreground",children:v}):null]}),f.length>0?s.jsx("div",{className:"flex flex-wrap gap-x-3 gap-y-1 pt-1 pl-6 text-xs text-muted-foreground",children:f.map((h,N)=>s.jsxs("span",{children:[h.name,": ",fe(h)]},N))}):null,p?s.jsx(Vt,{rows:u}):null,y.length>0?s.jsx("div",{className:"ml-[7px] space-y-1 border-l border-border/60 pt-1 pl-3.5",children:y.map((h,N)=>s.jsx(he,{node:h,depth:t+1,durationMap:n},N))}):null]})}function Wt(e){return`${e.path||"(unknown path)"} (${e.format})`}function Ut(e){const t=e.leftKeys.length||e.rightKeys.length?` on ${e.leftKeys.join(", ")||"(none)"} / ${e.rightKeys.join(", ")||"(none)"}`:"";return`${e.joinType}${t}`}function qt(e){const t=e.aggregations.join(", ")||"(none)";return e.groupByKeys.length?`${t} by ${e.groupByKeys.join(", ")}`:t}function Gt(e){const t=new Map;for(const n of e)t.set(n.partitioning,(t.get(n.partitioning)??0)+1);return[...t.entries()].map(([n,r])=>`${n}×${r}`).join(", ")}function Ht({summary:e}){const{scans:t,joins:n,aggs:r,exchanges:a,warnings:o}=e,l=a.length>=4;return s.jsx(ge,{rows:[t.length>0&&[`Sources (${t.length})`,t.map(Wt).join(", ")],n.length>0&&[`Joins (${n.length})`,n.map(Ut).join("; ")],r.length>0&&[`Aggregations (${r.length})`,r.map(qt).join("; ")],a.length>0&&[`Exchanges (${a.length})`,s.jsxs(s.Fragment,{children:[Gt(a),l?s.jsxs(s.Fragment,{children:[" ",s.jsx("span",{className:"text-muted-foreground",children:"— consider whether some joins/aggregations could share a partitioning scheme to avoid redundant shuffles."})," ",s.jsx(P,{})]}):null]})],o.length>0&&[`Warnings (${o.length})`,s.jsxs("span",{className:"flex flex-wrap items-center gap-1.5",children:[s.jsx(oe,{type:"duplicatePlanSubtree",impactBand:"warning",className:ce}),o.map(c=>c.detail).join("; "),s.jsx(P,{})]})]]})}function qn({stageId:e,appModel:t}){const n=S(u=>u.openPlanGraph),r=_t(e,t);if(!r)return null;const a=t.stages.get(e),o=a?.sqlExecutionId!=null?t.sql.get(a.sqlExecutionId):null,l=Ot(r,t,o,a?.sqlExecutionId),c=Pt(r),i=Lt(r,e);return s.jsxs(St,{defaultValue:"tree",children:[s.jsxs("div",{className:"flex items-center justify-between gap-2",children:[s.jsxs(It,{"aria-label":"Plan view",children:[s.jsx(J,{value:"tree",children:"Tree"}),s.jsx(J,{value:"summary",children:"Summary"})]}),s.jsx("div",{className:"flex gap-2",children:i?s.jsx(j,{type:"button",variant:"ghost",size:"sm",onClick:()=>n(e),children:"View plan graph"}):null})]}),s.jsx(Q,{value:"tree",children:s.jsxs("div",{className:"space-y-2 pt-3",children:[s.jsx(he,{node:r,depth:0,durationMap:l}),s.jsx("p",{className:"text-xs text-muted-foreground",children:"Showing initial (pre-AQE) plan. Metrics reflect operators as planned; adaptive optimizations may have rewritten the actual execution."})]})}),s.jsx(Q,{value:"summary",children:s.jsx("div",{className:"pt-3",children:c?s.jsx(Ht,{summary:c}):s.jsx("p",{className:"text-xs text-muted-foreground",children:"Plan summary couldn’t be parsed."})})})]})}function Jt({...e}){return s.jsx(De,{"data-slot":"dialog",...e})}function Qt({...e}){return s.jsx(Ae,{"data-slot":"dialog-portal",...e})}function Xt({className:e,...t}){return s.jsx(Fe,{"data-slot":"dialog-overlay",className:b("fixed inset-0 isolate z-50 bg-(--overlay-scrim) duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0 motion-reduce:animate-none",e),...t})}function Yt({className:e,children:t,showCloseButton:n=!0,...r}){return s.jsxs(Qt,{children:[s.jsx(Xt,{}),s.jsxs(Me,{"data-slot":"dialog-content",className:b("fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 motion-reduce:animate-none",e),...r,children:[t,n&&s.jsxs(se,{"data-slot":"dialog-close",render:s.jsx(j,{variant:"ghost",className:"absolute top-2 right-2",size:"icon-sm"}),children:[s.jsx(Ye,{}),s.jsx("span",{className:"sr-only",children:"Close"})]})]})]})}function Zt({className:e,...t}){return s.jsx("div",{"data-slot":"dialog-header",className:b("flex flex-col gap-2",e),...t})}function Gn({className:e,showCloseButton:t=!1,children:n,...r}){return s.jsxs("div",{"data-slot":"dialog-footer",className:b("-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end",e),...r,children:[n,t&&s.jsx(se,{render:s.jsx(j,{variant:"outline"}),children:"Close"})]})}function en({className:e,...t}){return s.jsx(Be,{"data-slot":"dialog-title",className:b("font-heading text-base leading-none font-medium",e),...t})}function tn({className:e,...t}){return s.jsx(ze,{"data-slot":"dialog-description",className:b("text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",e),...t})}function V({...e}){return s.jsx(Pe,{"data-slot":"dropdown-menu",...e})}function W({...e}){return s.jsx(Le,{"data-slot":"dropdown-menu-trigger",...e})}function U({align:e="start",alignOffset:t=0,side:n="bottom",sideOffset:r=4,className:a,...o}){return s.jsx(Oe,{children:s.jsx(_e,{className:"isolate z-50 outline-none",align:e,alignOffset:t,side:n,sideOffset:r,children:s.jsx(Ke,{"data-slot":"dropdown-menu-content",className:b("z-50 max-h-(--available-height) w-(--anchor-width) min-w-32 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:overflow-hidden data-closed:fade-out-0 data-closed:zoom-out-95 motion-reduce:animate-none",a),...o})})})}function $({className:e,inset:t,variant:n="default",...r}){return s.jsx(We,{"data-slot":"dropdown-menu-item","data-inset":t,"data-variant":n,className:b("group/dropdown-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive",e),...r})}function nn({className:e,children:t,checked:n,inset:r,...a}){return s.jsxs(Ue,{"data-slot":"dropdown-menu-checkbox-item","data-inset":r,className:b("relative flex cursor-default items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",e),checked:n,...a,children:[s.jsx("span",{className:"pointer-events-none absolute right-2 flex items-center justify-center","data-slot":"dropdown-menu-checkbox-item-indicator",children:s.jsx(qe,{children:s.jsx(xt,{})})}),t]})}function q({className:e,...t}){return s.jsx(Ve,{"data-slot":"dropdown-menu-separator",className:b("-mx-1 my-1 h-px bg-border",e),...t})}const an=[/\bip(?:-\d{1,3}){4}(?:\.[a-z0-9][a-z0-9-]*)*/gi,/\b(?:\d{1,3}\.){3}\d{1,3}\b/g],sn=[/\bapplication_\d{10,}_\d+\b/g];function L(e,t){if(typeof e=="string"){for(const{patterns:n,out:r}of t)for(const a of n){const o=e.match(a);if(o)for(const l of o)r.add(l)}return}if(Array.isArray(e)){for(const n of e)L(n,t);return}if(e&&typeof e=="object")for(const n of Object.values(e))L(n,t)}function rn(e){const t=new Set,n=new Set,r=e?.summary?.app?.id;typeof r=="string"&&r.length>0&&t.add(r);for(const a of e?.findings??[])for(const o of[a?.host,a?.evidence?.host])typeof o=="string"&&o.length>0&&n.add(o);return L(e,[{patterns:an,out:n},{patterns:sn,out:t}]),{appIds:t,hosts:n}}function ee(e,t){const n=new Map;return[...e].sort((r,a)=>r.localeCompare(a,"en",{numeric:!0})).forEach((r,a)=>n.set(r,`${t}-${a+1}`)),n}function O(e,t){if(typeof e=="string"){let n=e;for(const[r,a]of t)n=n.split(r).join(a);return n}if(Array.isArray(e))return e.map(n=>O(n,t));if(e&&typeof e=="object"){const n={};for(const[r,a]of Object.entries(e))n[r]=O(a,t);return n}return e}function on(e,t){const n=[...t.appIds?ee(t.appIds,"app"):[],...ee(t.hosts,"host")];return n.sort((r,a)=>a[0].length-r[0].length),O(e,n)}function cn(e){const{appIds:t,hosts:n}=rn(e);return on(e,{appIds:t,hosts:n})}function xe(e){switch(e.type){case"skew":return"Fix task skew";case"stageShape":switch(e.rule){case"lowParallelism":return"Increase parallelism";case"dataExplosion":return"Check for exploding join";case"taskStageSkew":return"Fix straggler task"}break;case"shuffle":return"Reduce shuffle size";case"partitionSizing":switch(e.rule){case"shufflePartitionSkew":return"Fix skewed partition";case"lowShuffleParallelism":return"Add shuffle partitions";case"maxPartitionTooBig":return"Repartition oversized data"}break;case"spill":return"Reduce spill";case"gc":return e.direction==="low"?"Right-size executor memory":"Reduce GC pressure";case"slowHost":return e.variant==="durationShare"?"Fix data locality":e.variant==="multiDim"?"Investigate degraded executor":"Check slow host";case"stageSlowness":return"Profile slow stage";case"stageFailed":return"Inspect stage failure";case"failures":return"Investigate task failures";case"straggler":return"Fix stragglers";case"speculationWaste":return"Tune speculation settings";case"retryWaste":return"Investigate retry cause";case"tinyTask":return"Coalesce small tasks";case"coldStart":return"Pre-warm cluster";case"utilization":return"Reduce cluster size";case"memoryUtilization":switch(e.variant){case"idleCores":return"Reduce idle cores";case"wasteModel":return"Right-size executor memory";case"memoryBand":return e.dataUnavailable?"Enable memory metrics":e.rule==="heapNearCapacity"?"Increase executor memory":"Reduce executor memory"}break;case"cacheUtilization":return"Increase cache memory";case"coreLocality":return"Fix data locality";case"autoscalingChurn":return"Reduce autoscaling churn";case"cachingOpportunity":return e.variant==="composite"?"Cache repeated result":"Cache shared table";case"jobFailureRate":return"Investigate failed jobs";case"configAudit":switch(e.property){case"spark.shuffle.service.enabled":return"Enable shuffle service";case"spark.dynamicAllocation.minExecutors":return"Fix autoscaling bounds";case"spark.dynamicAllocation.maxExecutors":return"Set max executors";case"spark.serializer":return"Switch to Kryo";case"spark.executor.memoryOverhead":return"Raise memory overhead"}break;case"duplicatePlanSubtree":return"Dedupe repeated subtree";case"smallFiles":return e.direction==="write"?"Coalesce output files":"Compact small files";case"underBroadcast":return"Use broadcast join";case"overBroadcast":return"Fix oversized broadcast"}}function M(e){return e==null?!1:(Array.isArray(e)?e.length:e.size)>0}function B(e,t){return Array.isArray(e)?e.includes(t):e.has(t)}function ln(e,t){if(M(t.impactBand)&&!B(t.impactBand,e.impactBand)||M(t.type)&&!B(t.type,e.type))return!1;const{stageId:n}=t;if(typeof n=="number"){if(e.stageId!==n)return!1}else if(M(n)&&(e.stageId==null||!B(n,e.stageId)))return!1;return!0}function un(e,t){const n=[];for(const r of e){const a=t.get(r);a&&(a.submittedAt==null||a.completedAt==null||n.push([a.submittedAt,a.completedAt]))}return Ze(n).reduce((r,[a,o])=>r+(o-a),0)}function dn(e){const t=new Map;for(const n of e){const r=t.get(n.type)??[];r.push(n),t.set(n.type,r)}return t}function pn(e){return e.stageIds?e.stageIds:e.stageId!=null?[e.stageId]:[]}function mn(e,t,n){const r=[...new Set(t.flatMap(pn))],a=t.reduce((l,c)=>l+(c.impactEstimate?.wallClock?.high??0),0),o=r.length>0?Math.min(a,un(r,n)):a;return{kind:"time",type:e,findingCount:t.length,stageCount:r.length,recoverableMsHigh:o,findings:t}}function fn(e,t){const n=t[0].impactEstimate.rawWaste.unit,r=t.reduce((a,o)=>a+(o.impactEstimate?.rawWaste?.value??0),0);return{kind:"resource",type:e,findingCount:t.length,unit:n,total:r,findings:t}}function gn(e,t){const n={};for(const r of t)n[r.impactBand]=(n[r.impactBand]??0)+1;return{kind:"count",type:e,findingCount:t.length,byImpactBand:n,findings:t}}const te={time:0,resource:1,count:2};function hn(e,t){const n=[];for(const[r,a]of dn(e)){const o=a.filter(i=>i.impactEstimate?.wallClock!=null),l=a.filter(i=>i.impactEstimate?.wallClock==null&&i.impactEstimate?.rawWaste!=null),c=a.filter(i=>i.impactEstimate?.wallClock==null&&i.impactEstimate?.rawWaste==null);if(o.length>0&&n.push(mn(r,o,t)),l.length>0){const i=new Map;for(const u of l){const p=u.impactEstimate.rawWaste.unit,m=i.get(p)??[];m.push(u),i.set(p,m)}for(const u of i.values())n.push(fn(r,u))}c.length>0&&n.push(gn(r,c))}return n.sort((r,a)=>{const o=te[r.kind]-te[a.kind];if(o!==0)return o;if(r.kind==="time"&&a.kind==="time")return a.recoverableMsHigh-r.recoverableMsHigh;const l=k[T(r.findings)??"info"]??9,c=k[T(a.findings)??"info"]??9;return l-c})}function xn(e){return!(e.type==="incompleteRun"||e.type==="memoryUtilization"&&e.variant==="memoryBand"&&e.dataUnavailable)}const be=0,bn=1,vn=2;function z(e){const t=e.impactEstimate;return t?.wallClock?be:t?.rawWaste?bn:vn}function yn(e){return[...e].sort((t,n)=>{const r=z(t)-z(n);return r!==0?r:z(t)===be?n.impactEstimate.wallClock.high-t.impactEstimate.wallClock.high:(k[t.impactBand]??9)-(k[n.impactBand]??9)})}const wn={spill:"single-task disk spill above 1 GiB",shuffle:"shuffle read above the configured minimum byte threshold",skew:"task duration skew above the configured ratio",gc:"JVM GC time share above the configured ratio",slowHost:"a host running 2x+ slower than its peers by mean task duration (per-executor byte/time dimensions use a separate, narrower ratio ladder starting at 1.33x; only those can reach critical on ratio alone)",stageSlowness:"a stage running far longer than its peers, not attributable to a single slow host",straggler:"one or more tasks finishing far after the rest of their stage",speculationWaste:"speculative task attempts that completed after the original",tinyTask:"median task duration below the configured floor",partitionSizing:"partition byte size outside the configured target range",stageShape:"low parallelism, data explosion, or task-count skew relative to core count",stageFailed:"a stage that failed outright",failures:"task failures above the configured rate",retryWaste:"retried task attempts consuming executor time",coldStart:"executor startup time above the configured floor",incompleteRun:"an event log missing its terminal ApplicationEnd/job-completion event",utilization:"core occupancy below the configured floor across the run",memoryUtilization:"executor heap usage outside the configured band",cacheUtilization:"cached partitions evicted or spilled to disk",coreLocality:"task placement missing data-local core assignment",cachingOpportunity:"a dataset re-read from source multiple times with no cache/persist",jobFailureRate:"job failure rate above the configured threshold",autoscalingChurn:"executor add/remove churn above the configured rate",configAudit:"a Spark conf value outside the recommended range",duplicatePlanSubtree:"the same physical plan subtree executed more than once",smallFiles:"output files below the configured target size",overBroadcast:"a broadcast join above the configured size ceiling",underBroadcast:"a join below the configured size floor that skipped broadcast",broadcastSizing:"a broadcast join outside the configured size range in either direction"};function jn(e){return wn[e]??"criteria not met"}const kn=3,Nn=new Set(["id","type","impactBand","stageId","metric","value","recommendation","detectorVersion","confidence","validationRequired","docAnchor","impactEstimate","actionLabel"]);function Sn(e){const t={};for(const r of Object.keys(e).sort())Nn.has(r)||(t[r]=e[r]);const n={id:e.id??null,type:e.type,tag:K(e.type),impactBand:e.impactBand,stageId:e.stageId??null,metric:e.metric??null,value:e.value??null,recommendation:e.recommendation??null,detectorVersion:e.detectorVersion??1,evidence:t,actionLabel:xe(e)??e.type};return e.confidence!=null&&(n.confidence=e.confidence),e.validationRequired!=null&&(n.validationRequired=e.validationRequired),e.docAnchor!=null&&(n.docAnchor=e.docAnchor),e.impactEstimate!=null&&(n.impactEstimate=e.impactEstimate),n}function $n(e){return[...e].sort((t,n)=>{const r=(k[t.impactBand]??9)-(k[n.impactBand]??9);if(r!==0)return r;if(t.type!==n.type)return t.type<n.type?-1:1;const a=t.stageId??-1,o=n.stageId??-1;return a!==o?a-o:(t.id??"")<(n.id??"")?-1:(t.id??"")>(n.id??"")?1:0})}function In(e,t){const n=e.filter(xn);return hn(n,t).map(a=>{const o=yn(a.findings),l=o[0],c=o.map(u=>u.id).filter(u=>u!=null),i={type:a.type,tag:K(a.type),actionLabel:xe(l)??l.type,findingCount:a.findingCount,findingIds:c};return a.kind==="time"?{...i,kind:"time",stageCount:a.stageCount,recoverableMsHigh:a.recoverableMsHigh,impact:ve(a.recoverableMsHigh,a.recoverableMsHigh)}:a.kind==="resource"?{...i,kind:"resource",unit:a.unit,total:a.total,impact:ye({value:a.total,unit:a.unit})}:{...i,kind:"count",byImpactBand:a.byImpactBand,impact:null}})}function Cn(e){const t=new Set(e.map(a=>a.type)),n=new Set,r=[];for(const a of le())t.has(a.type)||n.has(a.type)||(n.add(a.type),r.push({type:a.type,tag:K(a.type),thresholdSummary:jn(a.type)}));return r}const ne=new WeakMap;function En(e){const t=ne.get(e);if(t)return t;const{app:n,stages:r,executors:a,sql:o,jobs:l,runAggregates:c,evidenceAvailability:i}=e,u=et(n,r,a?.added??[],a?.removed??[],l??new Map,o??new Map,c??null),p=tt(n),m=[...u,...p],d=$n(m.map(Sn)),f=In(m,r??new Map),v=Cn(m),y={critical:0,warning:0,info:0};for(const h of d)h.impactBand in y&&(y[h.impactBand]+=1);const w={schemaVersion:kn,summary:{app:{id:n?.id??null,name:n?.name??null,sparkVersion:n?.sparkVersion??null},stageCount:r?.size??0,jobCount:l?.size??0,sqlExecutionCount:o?.size??0,findingCount:d.length,impactBandCounts:y},evidenceAvailability:i??null,detectors:le(),findings:d,recommendations:f,cleanChecks:v};return ne.set(e,w),w}function Tn(e,t){return typeof t=="number"&&/bytes$/i.test(e)?_(t):t!==null&&typeof t=="object"?JSON.stringify(t):String(t)}function ve(e,t){const n=r=>r===0?"0s":I(r);return e===t?`Est. ${n(t)}`:`Est. ${n(e)}-${n(t)}`}function ye(e){const t=Math.round(e.value*10)/10;switch(e.unit){case"bytes":return _(e.value);case"ms":return I(e.value);case"mbSeconds":return`${t} MB-s`;case"coreHours":return`${t.toFixed(1)} core-h`;case"coreMs":return`${t} core-ms`;default:return String(e.value)}}function Rn(e){const t=e.wallClock?ve(e.wallClock.low,e.wallClock.high):null,n=e.rawWaste?ye(e.rawWaste):null;return!t&&!n?null:`${[t,n].filter(a=>a!=null).join(" · ")} (estimateMethod: ${e.estimateMethod})`}function Dn(e){const{summary:t,findings:n,evidenceAvailability:r,detectors:a,recommendations:o,cleanChecks:l}=e,c=[];c.push("# Spark run evidence report"),c.push(""),c.push(`- Application: ${t.app.name??"(unknown)"} (${t.app.id??"n/a"})`),c.push(`- Spark version: ${t.app.sparkVersion??"n/a"}`),c.push(`- Stages: ${t.stageCount} · Jobs: ${t.jobCount} · SQL executions: ${t.sqlExecutionCount}`),c.push(`- Findings: ${t.findingCount} (critical ${t.impactBandCounts.critical}, warning ${t.impactBandCounts.warning}, info ${t.impactBandCounts.info})`),c.push(""),o.length>0&&(c.push(`## Fix these first (${o.length})`),c.push(""),o.forEach((i,u)=>{c.push(`${u+1}. [${i.tag}] ${i.actionLabel}`);const p=i.kind==="count"?Object.entries(i.byImpactBand??{}).map(([m,d])=>`${d} ${m}`).join(", "):i.impact;c.push(` - ${p} · ×${i.findingCount} finding(s)`)}),c.push("")),c.push(`## Findings (${n.length})`),c.push("");for(const i of n){const u=i.stageId!=null?` (stage ${i.stageId})`:"";c.push(`### [${i.tag}] ${i.type} · ${i.impactBand}${u}`),c.push(`- action: ${i.actionLabel}`),i.metric!=null&&c.push(`- ${i.metric}: ${i.value}`),i.recommendation&&c.push(`- ${i.recommendation}`),i.confidence&&c.push(`- confidence: ${i.confidence}`),i.validationRequired&&c.push(`- validation: ${i.validationRequired}`);const p=i.impactEstimate?Rn(i.impactEstimate):null;p&&c.push(`- impact: ${p}`),c.push(`- detector version: ${i.detectorVersion}`);const m=Object.entries(i.evidence??{}).sort(([d],[f])=>d<f?-1:d>f?1:0);if(m.length){c.push("- evidence:");for(const[d,f]of m)c.push(` - ${d}: ${Tn(d,f)}`)}c.push("")}if(r?.entries?.length){c.push("## Evidence availability"),c.push("");for(const i of r.entries)c.push(`- ${i.key}: ${i.state} (${i.summary})`);c.push("")}if(Array.isArray(a)&&a.length){c.push("## Detectors"),c.push("");for(const i of a)c.push(`- ${i.type} (v${i.version}, ${i.scope}), thresholds: ${JSON.stringify(i.thresholds)}`);c.push("")}if(l.length>0){c.push(`## Clean checks (${l.length})`),c.push("");for(const i of l)c.push(`- [${i.tag}] ${i.type}: ${i.thresholdSummary}`);c.push("")}return c.join(`
3
+ `)}function Mn(e,t){return ln(e,t)}function Bn(e,{redact:t=!1,markdown:n=!0,findingsFilter:r}={}){let a=En(e);return t&&(a=cn(a)),r&&(a={...a,findings:a.findings.filter(l=>Mn(l,r))}),{markdown:n?Dn(a):"",json:a}}function ae(e,t,n){const r=new Blob([e],{type:n}),a=URL.createObjectURL(r),o=document.createElement("a");o.href=a,o.download=t,document.body.appendChild(o),o.click(),o.remove(),URL.revokeObjectURL(a)}function zn(e,t,n){return`evidence-${String(e??"report").replace(/[^\w.-]/g,"_")}${n?"-redacted":""}.${t==="json"?"json":"md"}`}function we(){const e=S(a=>a.appModel),[t,n]=x.useState(!1);return{redact:t,setRedact:n,download:a=>{const{markdown:o,json:l}=Bn(e,{redact:t}),c=l.summary?.app?.id??null,i=zn(c,a,t);a==="json"?ae(`${JSON.stringify(l,null,2)}
4
+ `,i,"application/json"):ae(`${o}
5
+ `,i,"text/markdown")}}}function je({redact:e,setRedact:t,download:n}){return s.jsxs(s.Fragment,{children:[s.jsx(nn,{checked:e,onClick:r=>r.preventDefault(),onCheckedChange:r=>t(!!r),children:"Redact identifiers"}),s.jsx(q,{}),s.jsx($,{onClick:()=>n("markdown"),children:"Download Markdown"}),s.jsx($,{onClick:()=>n("json"),children:"Download JSON"})]})}function An(){const e=we();return s.jsxs(V,{children:[s.jsxs(W,{render:s.jsx(j,{variant:"ghost",size:"sm"}),children:[s.jsx(wt,{"aria-hidden":"true"}),"Export evidence"]}),s.jsx(U,{align:"end",children:s.jsx(je,{...e})})]})}function Fn({activeName:e,activeSub:t,activeId:n=null,entries:r,onPick:a,onRemove:o,onOpenNew:l}){const{pickRecent:c}=ue(),i=x.useCallback(u=>{if(a){a(u);return}c(u,r.find(p=>p.id===u)?.handle)},[a,r,c]);return s.jsxs(V,{children:[s.jsxs(W,{className:b(de({variant:"ghost"}),"h-auto min-w-0 shrink max-w-40 flex-col items-start justify-center gap-0 py-1 sm:max-w-80"),children:[s.jsxs("span",{className:"flex w-full min-w-0 items-center gap-1.5",children:[s.jsx("span",{className:"min-w-0 truncate font-heading text-sm font-semibold",children:e??"No file"}),s.jsx(nt,{"aria-hidden":"true",className:"ml-auto shrink-0 opacity-60"})]}),t?s.jsx("span",{className:"w-full min-w-0 truncate text-left text-xs text-muted-foreground",children:t}):null]}),s.jsxs(U,{className:"w-72 p-2",children:[s.jsx(at,{entries:r,activeId:n,onPick:i,onRemove:o}),s.jsx(q,{}),s.jsx($,{onClick:()=>l?.(),children:"Load new file…"})]})]})}function Pn({className:e,type:t,...n}){return s.jsx(Ge,{type:t,"data-slot":"input",className:b("h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-[3px] aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",e),...n})}function Ln({open:e,entries:t,onSelect:n,onOpenChange:r}){const[a,o]=x.useState(""),l=x.useRef(null);x.useEffect(()=>{e||o("")},[e]);const c=a.trim().toLowerCase(),i=c?t.filter(d=>d.label.toLowerCase().includes(c)||d.secondary.toLowerCase().includes(c)||String(d.executionId).includes(c)):t;function u(d){(l.current?.querySelectorAll("button")??[])[d]?.focus()}function p(d,f){d.key==="ArrowDown"?(d.preventDefault(),u(f+1)):d.key==="ArrowUp"&&(d.preventDefault(),u(f-1))}function m(d){d.key==="Enter"?i.length===1&&n(i[0].stageId):d.key==="ArrowDown"&&(d.preventDefault(),u(0))}return s.jsx(Jt,{open:e,onOpenChange:r,children:s.jsxs(Yt,{className:"flex max-h-[85vh] flex-col sm:max-w-xl",children:[s.jsxs(Zt,{children:[s.jsxs(en,{className:"flex items-center gap-1.5",children:[s.jsx(F,{"aria-hidden":"true",className:"size-4 text-plan-aggregate"}),"Open plan graph"]}),s.jsx(tn,{children:"Choose which SQL execution's plan to open."})]}),s.jsx(Pn,{autoFocus:!0,placeholder:"Filter executions…",value:a,onChange:d=>o(d.target.value),onKeyDown:m}),i.length===0?s.jsx("p",{className:"px-1.5 py-1 text-sm text-muted-foreground",children:"No matching executions"}):s.jsx("ul",{ref:l,className:"flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto",children:i.map((d,f)=>s.jsx("li",{children:s.jsxs("button",{type:"button",className:"flex w-full min-w-0 flex-col items-start gap-0.5 rounded-md px-1.5 py-1 text-left hover:bg-muted",onClick:()=>n(d.stageId),onKeyDown:v=>p(v,f),children:[s.jsxs("span",{className:"flex w-full min-w-0 items-center gap-1.5",children:[d.impactBand!=null&&s.jsxs(s.Fragment,{children:[s.jsx(st,{impactBand:d.impactBand}),s.jsxs("span",{className:"shrink-0 text-xs font-normal text-muted-foreground",children:[d.findingCount," finding",d.findingCount===1?"":"s"]})]}),s.jsx("span",{className:"truncate text-sm font-medium",children:d.secondary})]}),s.jsx("span",{className:"w-full truncate text-xs text-muted-foreground",children:d.label})]})},d.executionId))})]})})}const A="/docs/";function On(e,t){return e==="warning"?`${t} warning${t===1?"":"s"}`:`${t} ${e}`}function _n(e,t){return e.stageId!=null&&t.includes(e.stageId)?!0:e.stageIds?.some(n=>t.includes(n))??!1}function Kn(e,t){const n=[];for(const[r,a]of e.sql){if(!a.planTree)continue;const o=ie(r,e.stages),l=o.length>0?Math.min(...o):null;if(l==null)continue;const c=a.description,i=typeof c=="string"&&c.trim()?c:`SQL execution #${r}`,u=a.startTime,p=a.endTime,m=typeof u=="number"&&typeof p=="number"?I(p-u):null,d=t.filter(w=>_n(w,o)),v=T(d)??null,y=d.length;n.push({executionId:r,stageId:l,label:i,secondary:m?`#${r} · ${m}`:`#${r}`,impactBand:v,findingCount:y})}return n.sort((r,a)=>{const o=r.impactBand?k[r.impactBand]:1/0,l=a.impactBand?k[a.impactBand]:1/0;return o!==l?o-l:r.executionId-a.executionId}),n}function Hn({onOpenDocs:e,onLoadNew:t,recentEntries:n,activeFileId:r,onPickRecent:a,onRemoveRecent:o,sectionControls:l}){const c=S(g=>g.appModel.app),i=S(g=>g.catalog),u=S(g=>g.skippedLines),{theme:p,toggle:m}=rt(),d=it(),f=x.useRef(null),v=S(g=>g.comparison),y=we(),w=S(g=>g.appModel),h=x.useMemo(()=>Kn(w,i),[w,i]),[N,R]=x.useState(!1);function G(){if(h.length!==0){if(h.length===1){D.getState().openPlanGraph(h[0].stageId,{initialScope:"full"});return}R(!0)}}function ke(g){D.getState().openPlanGraph(g,{initialScope:"full"}),R(!1)}function H(g){!d||g.metaKey||g.ctrlKey||g.shiftKey||g.altKey||g.button!==0||(g.preventDefault(),d.openSite(A))}const Ne=c?.name||"Spark Application",Se=[c?.id,c?.sparkVersion?`Spark ${c.sparkVersion}`:null].filter(Boolean).join(" · "),C=T(i),$e=C?i.filter(g=>g.impactBand===C).length:0;return s.jsxs("header",{className:"flex min-w-0 flex-wrap items-center gap-3 border-b border-border px-4 py-2",children:[l?null:s.jsx("h1",{className:"sr-only",children:"SparkForensics"}),s.jsxs("div",{className:"flex min-w-0 flex-1 items-center gap-3",children:[s.jsx(Fn,{activeName:Ne,activeSub:Se,activeId:r,entries:n,onPick:a,onRemove:o,onOpenNew:t}),u>0?s.jsxs("div",{className:"min-w-0 truncate text-xs text-warning",children:[u," line",u===1?"":"s"," skipped: malformed or invalid data"]}):null]}),l?s.jsx("div",{className:"flex min-w-0 shrink-0 flex-wrap items-center gap-3 max-sm:order-3 max-sm:w-full max-sm:shrink max-sm:gap-2",children:l}):C?s.jsx(ot,{label:On(C,$e),impactBand:C,className:"shrink-0"}):s.jsxs("span",{className:b("inline-flex shrink-0 items-center gap-1.5 rounded-full bg-clean/10 px-2 py-0.5 text-xs font-medium text-clean"),children:[s.jsx("span",{"aria-hidden":"true",className:"inline-block size-2 shrink-0 rounded-full bg-clean"}),"No findings"]}),s.jsxs("div",{className:"flex shrink-0 items-center gap-1",children:[!l&&v.baselineId&&!v.active?s.jsx(j,{variant:"ghost",size:"sm",className:"tap-target-comfortable",onClick:()=>D.getState().setComparisonActive(!0),children:"← Back to comparison"}):null,s.jsxs("div",{className:"hidden items-center gap-1 sm:flex",children:[l?null:s.jsx(An,{}),s.jsxs(j,{variant:"ghost",size:"sm",className:"tap-target-comfortable",title:"Spark tuning reference",onClick:e,children:[s.jsx(ct,{"aria-hidden":"true"}),"Tuning reference"]}),s.jsxs("a",{href:A,target:"_blank",rel:"noopener noreferrer",onClick:H,title:"SparkForensics docs",className:b(de({variant:"ghost",size:"sm"}),"tap-target-comfortable"),children:[s.jsx(lt,{"aria-hidden":"true"}),"Docs"]}),!l&&h.length>0?s.jsxs(j,{variant:"ghost",size:"sm",className:"tap-target-comfortable",onClick:G,children:[s.jsx(F,{"aria-hidden":"true",className:"text-plan-aggregate"}),"Plan graph"]}):null,s.jsx(j,{variant:"ghost",size:"icon",className:"tap-target-comfortable","aria-label":"Toggle theme","aria-pressed":p==="light",title:"Toggle theme",onClick:m,children:p==="dark"?s.jsx(ut,{"aria-hidden":"true"}):s.jsx(dt,{"aria-hidden":"true"})})]}),s.jsxs(V,{onOpenChange:(g,Ie)=>{!g&&Ie.reason==="outside-press"&&setTimeout(()=>{document.activeElement===document.body&&f.current?.focus()})},children:[s.jsx(W,{ref:f,className:"tap-target-comfortable inline-flex size-8 items-center justify-center rounded-lg hover:bg-muted hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring/50 sm:hidden","aria-label":"More options",children:s.jsx(kt,{"aria-hidden":"true"})}),s.jsxs(U,{align:"end",children:[l?null:s.jsxs(s.Fragment,{children:[s.jsx(je,{...y}),s.jsx(q,{})]}),s.jsx($,{title:"Spark tuning reference",onClick:e,children:"Tuning reference"}),s.jsx($,{title:"SparkForensics docs",render:s.jsx("a",{href:A,target:"_blank",rel:"noopener noreferrer",onClick:H}),children:"Docs"}),!l&&h.length>0?s.jsxs($,{onClick:G,children:[s.jsx(F,{"aria-hidden":"true",className:"text-plan-aggregate"}),"Plan graph"]}):null,s.jsx($,{onClick:m,children:"Toggle theme"})]})]})]}),s.jsx(Ln,{open:N,entries:h,onSelect:ke,onOpenChange:R})]})}function Jn(e){const{pickRecent:t}=ue(),[n,r]=x.useState([]),a=x.useCallback(()=>{pt().then(c=>r(c)).catch(()=>r([]))},[]);x.useEffect(()=>{a()},[a,e]);const o=x.useCallback(async c=>{const i=n.find(p=>p.id===c),u=await t(c,i?.handle);(u==="restored"||u==="gone")&&a()},[n,t,a]),l=x.useCallback(c=>{const i=n.find(u=>u.id===c);mt(c).catch(()=>{}).finally(a),i&&ft(`Removed "${i.appName||i.name}" from recent files`,{action:{label:"Undo",onClick:()=>{gt(i).catch(()=>{}).finally(a)}}})},[n,a]);return{recentEntries:n,onPickRecent:o,onRemoveRecent:l}}export{xt as C,Jt as D,Pn as I,qn as P,ge as S,Hn as T,Mt as a,At as b,Rt as c,Yt as d,Zt as e,en as f,zt as g,Gn as h,ln as i,nn as j,V as k,W as l,Un as m,U as n,jn as o,Bt as p,xe as q,_t as r,hn as s,yn as t,Jn as u,xn as v,St as w,It as x,J as y,Q as z};
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en-US" dir="ltr">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <title>404 | SparkForensics</title>
7
+ <meta name="description" content="Not Found">
8
+ <meta name="generator" content="VitePress v1.6.4">
9
+ <link rel="preload stylesheet" href="/docs/assets/style.D2mY0HUs.css" as="style">
10
+ <link rel="preload stylesheet" href="/docs/vp-icons.css" as="style">
11
+
12
+ <script type="module" src="/docs/assets/app.Bxy4_HVA.js"></script>
13
+ <link rel="preload" href="/docs/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
14
+ <link rel="icon" type="image/svg+xml" href="/docs/favicon.svg">
15
+ <link rel="preconnect" href="https://fonts.googleapis.com">
16
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="">
17
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Recursive:wght,CASL@400..700,0..1&amp;family=JetBrains+Mono:wght@400;500;600&amp;display=swap">
18
+ <script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
19
+ <script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
20
+ </head>
21
+ <body>
22
+ <div id="app"></div>
23
+ <script>window.__VP_HASH_MAP__=JSON.parse("{\"contributor-guide_architecture_board-widgets.md\":\"BtjoE_1k\",\"contributor-guide_architecture_detector-contract.md\":\"DQyCHQNM\",\"contributor-guide_architecture_drill-down.md\":\"BKfyDQck\",\"contributor-guide_architecture_impact-estimation.md\":\"CzlXOnCq\",\"contributor-guide_architecture_index.md\":\"94lNbF-4\",\"contributor-guide_architecture_overview.md\":\"mQFlN66o\",\"contributor-guide_architecture_state-and-history.md\":\"DaqttKgQ\",\"contributor-guide_architecture_widget-rendering.md\":\"Bk6Iyj9S\",\"contributor-guide_architecture_worker-protocol.md\":\"BaS_L10g\",\"contributor-guide_contributing.md\":\"C-lKs70I\",\"contributor-guide_development-setup.md\":\"CpUMVtIK\",\"contributor-guide_testing.md\":\"C0q-BJfl\",\"index.md\":\"CETnDZzR\",\"user-guide_getting-started.md\":\"BJdD7a7_\",\"user-guide_mcp-tools.md\":\"DwYI1d6C\",\"user-guide_run-comparison.md\":\"5-oaOfTu\",\"user-guide_understanding-findings.md\":\"CK2WZ0Tf\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"SparkForensics\",\"description\":\"Docs for using and contributing to SparkForensics\",\"base\":\"/docs/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"/favicon.svg\",\"nav\":[{\"text\":\"User Guide\",\"link\":\"/user-guide/getting-started\"},{\"text\":\"Contributor Guide\",\"link\":\"/contributor-guide/development-setup\"}],\"sidebar\":{\"/user-guide/\":[{\"text\":\"User Guide\",\"items\":[{\"text\":\"Getting started\",\"link\":\"/user-guide/getting-started\"},{\"text\":\"Understanding findings\",\"link\":\"/user-guide/understanding-findings\"},{\"text\":\"Run comparison mode\",\"link\":\"/user-guide/run-comparison\"},{\"text\":\"MCP tools reference\",\"link\":\"/user-guide/mcp-tools\"}]}],\"/contributor-guide/\":[{\"text\":\"Contributor Guide\",\"items\":[{\"text\":\"Development setup\",\"link\":\"/contributor-guide/development-setup\"},{\"text\":\"Architecture\",\"link\":\"/contributor-guide/architecture/\",\"collapsed\":true,\"items\":[{\"text\":\"Overview\",\"link\":\"/contributor-guide/architecture/overview\"},{\"text\":\"Worker protocol\",\"link\":\"/contributor-guide/architecture/worker-protocol\"},{\"text\":\"State & history intake\",\"link\":\"/contributor-guide/architecture/state-and-history\"},{\"text\":\"Detector contract\",\"link\":\"/contributor-guide/architecture/detector-contract\"},{\"text\":\"Impact estimation\",\"link\":\"/contributor-guide/architecture/impact-estimation\"},{\"text\":\"Widget rendering\",\"link\":\"/contributor-guide/architecture/widget-rendering\"},{\"text\":\"Board widgets\",\"link\":\"/contributor-guide/architecture/board-widgets\"},{\"text\":\"Drill-down\",\"link\":\"/contributor-guide/architecture/drill-down\"}]},{\"text\":\"Testing & verification\",\"link\":\"/contributor-guide/testing\"},{\"text\":\"Contributing\",\"link\":\"/contributor-guide/contributing\"}]}]},\"search\":{\"provider\":\"local\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
24
+
25
+ </body>
26
+ </html>
@@ -0,0 +1 @@
1
+ import{t as p}from"./chunks/theme.CoT6y5bf.js";import{R as s,a3 as i,a4 as u,a5 as c,a6 as l,a7 as f,a8 as d,a9 as m,aa as h,ab as g,ac as A,d as v,u as y,v as C,s as P,ad as b,ae as w,af as R,ag as E}from"./chunks/framework.CNDaxUod.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{P(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&b(),w(),R(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(S)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp};