tide-commander 1.76.0 → 1.76.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/assets/{BossLogsModal-BSAIyY5Q.js → BossLogsModal-B41BvcEF.js} +1 -1
  2. package/dist/assets/{BossSpawnModal-DWG3vywZ.js → BossSpawnModal-DUTcju8I.js} +1 -1
  3. package/dist/assets/{ControlsModal-D7sQMy9U.js → ControlsModal-DbiIdKPt.js} +1 -1
  4. package/dist/assets/{DockerLogsModal-BxebN9cf.js → DockerLogsModal-5mrsMmlQ.js} +1 -1
  5. package/dist/assets/{EmbeddedEditor-BJ7l5Zuf.js → EmbeddedEditor-DirMT3E8.js} +1 -1
  6. package/dist/assets/{GmailOAuthSetup-CzdqIXK3.js → GmailOAuthSetup-CmGKGxui.js} +1 -1
  7. package/dist/assets/{GoogleOAuthSetup-DKjU--mc.js → GoogleOAuthSetup-CbWwCAK0.js} +1 -1
  8. package/dist/assets/{IframeModal-DkK8asfI.js → IframeModal-Dboa4JXN.js} +1 -1
  9. package/dist/assets/{IntegrationsPanel--yZ_3y5S.js → IntegrationsPanel-DS28YNJo.js} +2 -2
  10. package/dist/assets/{LogViewerModal-CxAnXG6j.js → LogViewerModal-UbrMLs2v.js} +1 -1
  11. package/dist/assets/{MonitoringModal-B2AaGtlF.js → MonitoringModal-B_XI1vTS.js} +1 -1
  12. package/dist/assets/{PM2LogsModal-auR8lVnW.js → PM2LogsModal-ChvPf5Uv.js} +1 -1
  13. package/dist/assets/{RestoreArchivedAreaModal-BJn-apo4.js → RestoreArchivedAreaModal-CEq_4zoQ.js} +1 -1
  14. package/dist/assets/{Scene2DCanvas-Q-FykJjz.js → Scene2DCanvas-DYDA_fv5.js} +1 -1
  15. package/dist/assets/{SceneManager-JpuslnCc.js → SceneManager-Be_I2Z9r.js} +1 -1
  16. package/dist/assets/{SkillsPanel-BYfp0jLH.js → SkillsPanel-CNIkJScD.js} +1 -1
  17. package/dist/assets/{SpawnModal-_wxlHhYk.js → SpawnModal-BXV32TQn.js} +1 -1
  18. package/dist/assets/{SubordinateAssignmentModal-tvfKFyRh.js → SubordinateAssignmentModal-DK3uJtBR.js} +1 -1
  19. package/dist/assets/{TriggerManagerPanel-DRKDuQAM.js → TriggerManagerPanel-C8JheOOO.js} +1 -1
  20. package/dist/assets/{WorkflowEditorPanel-BPBBCTem.js → WorkflowEditorPanel-DeLnt3ou.js} +1 -1
  21. package/dist/assets/{index-bu2bf20Y.js → index-B7BnOlMV.js} +2 -2
  22. package/dist/assets/index-BR3DNqtn.js +5 -0
  23. package/dist/assets/{index-DIDFZjvm.js → index-BZFjiZW2.js} +1 -1
  24. package/dist/assets/{index-CNo8F4Hv.js → index-C-HNvKyN.js} +1 -1
  25. package/dist/assets/{index-W693QVuI.js → index-C2QVwmIa.js} +1 -1
  26. package/dist/assets/{index-B87wqtN7.js → index-CymWdB1l.js} +1 -1
  27. package/dist/assets/{index-C8wnSaGW.js → index-D6ez6g4v.js} +1 -1
  28. package/dist/assets/{index-CPEajh-P.js → index-DHlpIGVI.js} +1 -1
  29. package/dist/assets/{index-snzCcqn6.js → index-DXjESpea.js} +3 -3
  30. package/dist/assets/{main-CjPuuFGh.js → main-BvvvhWnd.js} +6 -6
  31. package/dist/assets/{web-CY6mLlQ5.js → web-B-5bt6Uj.js} +1 -1
  32. package/dist/assets/{web-Bd3T_lvT.js → web-Dyi_JNTJ.js} +1 -1
  33. package/dist/index.html +1 -1
  34. package/dist/src/packages/server/services/runtime-command-execution.js +9 -0
  35. package/package.json +1 -1
  36. package/dist/assets/index-DybFI3Yz.js +0 -5
@@ -1 +1 @@
1
- var Nt=Object.defineProperty;var $t=(R,t,s)=>t in R?Nt(R,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):R[t]=s;var d=(R,t,s)=>$t(R,typeof t!="symbol"?t+"":t,s);import{s as M,A as Tt,k as Wt,l as Gt,m as At,T as Rt,n as Q,o as _t,S as Vt,p as Ut,q as Bt,t as jt,v as dt,w as bt,F as at,x as Pt,r as O,y as qt,j as St}from"./main-CjPuuFGh.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";const ht=new Map,Kt=512,tt=new Map,Lt=256;class rt{constructor(t,s){d(this,"ctx");d(this,"camera");d(this,"animationTime",0);this.ctx=t,this.camera=s}setAnimationTime(t){this.animationTime=t}roundedRect(t,s,e,i,o){this.ctx.moveTo(t+o,s),this.ctx.lineTo(t+e-o,s),this.ctx.arcTo(t+e,s,t+e,s+o,o),this.ctx.lineTo(t+e,s+i-o),this.ctx.arcTo(t+e,s+i,t+e-o,s+i,o),this.ctx.lineTo(t+o,s+i),this.ctx.arcTo(t,s+i,t,s+i-o,o),this.ctx.lineTo(t,s+o),this.ctx.arcTo(t,s,t+o,s,o)}roundedRectScreen(t,s,e,i,o){this.ctx.moveTo(t+o,s),this.ctx.lineTo(t+e-o,s),this.ctx.arcTo(t+e,s,t+e,s+o,o),this.ctx.lineTo(t+e,s+i-o),this.ctx.arcTo(t+e,s+i,t+e-o,s+i,o),this.ctx.lineTo(t+o,s+i),this.ctx.arcTo(t,s+i,t,s+i-o,o),this.ctx.lineTo(t,s+o),this.ctx.arcTo(t,s,t+o,s,o)}numberToHex(t){return`#${t.toString(16).padStart(6,"0")}`}hexToRgba(t,s){const e=Math.round(s*100)/100,i=`${t}|${e}`;let o=ht.get(i);if(o)return o;const n=parseInt(t.slice(1,3),16),c=parseInt(t.slice(3,5),16),a=parseInt(t.slice(5,7),16);return o=`rgba(${n}, ${c}, ${a}, ${e})`,ht.size>=Kt&&ht.clear(),ht.set(i,o),o}lightenColor(t,s){const e=`L|${t}|${s}`;let i=tt.get(e);if(i)return i;const o=parseInt(t.slice(1,3),16),n=parseInt(t.slice(3,5),16),c=parseInt(t.slice(5,7),16),a=Math.min(255,Math.floor(o+(255-o)*s)),r=Math.min(255,Math.floor(n+(255-n)*s)),g=Math.min(255,Math.floor(c+(255-c)*s));return i=`#${a.toString(16).padStart(2,"0")}${r.toString(16).padStart(2,"0")}${g.toString(16).padStart(2,"0")}`,tt.size>=Lt&&tt.clear(),tt.set(e,i),i}darkenColor(t,s){const e=`D|${t}|${s}`;let i=tt.get(e);if(i)return i;const o=parseInt(t.slice(1,3),16),n=parseInt(t.slice(3,5),16),c=parseInt(t.slice(5,7),16),a=Math.max(0,Math.floor(o*(1-s))),r=Math.max(0,Math.floor(n*(1-s))),g=Math.max(0,Math.floor(c*(1-s)));return i=`#${a.toString(16).padStart(2,"0")}${r.toString(16).padStart(2,"0")}${g.toString(16).padStart(2,"0")}`,tt.size>=Lt&&tt.clear(),tt.set(e,i),i}formatIdleTime(t){return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m`:`${Math.floor(t/3600)}h`}easeOutCubic(t){return 1-Math.pow(1-t,3)}easeInCubic(t){return t*t*t}}const Jt=200;class Qt extends rt{constructor(s,e){super(s,e);d(this,"toolAnimations",new Map)}update(s){this.animationTime+=s,this.updateToolAnimations()}getAnimationTime(){return this.animationTime}updateToolAnimations(){const s=performance.now(),e=[];for(const[i,o]of this.toolAnimations){const n=s-o.startTime,c=Math.min(1,n/Jt);o.fadeIn?o.opacity=this.easeOutCubic(c):(o.opacity=1-this.easeInCubic(c),c>=1&&e.push(i))}for(const i of e)this.toolAnimations.delete(i)}updateAgentTool(s,e){const i=this.toolAnimations.get(s),o=performance.now();e?(!i||i.tool!==e||!i.fadeIn)&&this.toolAnimations.set(s,{tool:e,startTime:o,fadeIn:!0,opacity:(i==null?void 0:i.opacity)??0}):i&&i.fadeIn&&(i.fadeIn=!1,i.startTime=o)}getToolAnimation(s){return this.toolAnimations.get(s)}}class te extends rt{constructor(s,e){super(s,e);d(this,"groundGradient",null);d(this,"groundViewportW",0);d(this,"groundViewportH",0)}drawGround(s){const{width:e,height:i}=this.camera.getViewportSize();if(!this.groundGradient||e!==this.groundViewportW||i!==this.groundViewportH){const o=e/2,n=i/2,c=Math.sqrt(o*o+n*n)*1.2;this.groundGradient=this.ctx.createRadialGradient(o,n,0,o,n,c),this.groundGradient.addColorStop(0,"#1a1f2e"),this.groundGradient.addColorStop(.5,"#141820"),this.groundGradient.addColorStop(1,"#0a0c12"),this.groundViewportW=e,this.groundViewportH=i}this.ctx.fillStyle=this.groundGradient,this.ctx.fillRect(0,0,e,i)}drawGrid(s,e){const i=this.camera.getVisibleBounds(),o=this.camera.getZoom();let n=e;o<20&&(n=e*2),o<12&&(n=e*4);const c=Math.floor(i.minX/n)*n,a=Math.ceil(i.maxX/n)*n,r=Math.floor(i.minZ/n)*n,g=Math.ceil(i.maxZ/n)*n;this.camera.applyTransform(this.ctx);const h=s*.4,m=h*.5,f=1/o;for(let l=c;l<=a;l+=n){const u=Math.abs(l);let p=this.calculateGridAlpha(u,m,h);const T=Math.abs(l)%(n*5)<.001;p*=T?.12:.05,p>.005&&(this.ctx.strokeStyle=`rgba(100, 140, 180, ${p})`,this.ctx.lineWidth=T?f*1.5:f,this.ctx.beginPath(),this.ctx.moveTo(l,i.minZ),this.ctx.lineTo(l,i.maxZ),this.ctx.stroke())}for(let l=r;l<=g;l+=n){const u=Math.abs(l);let p=this.calculateGridAlpha(u,m,h);const T=Math.abs(l)%(n*5)<.001;p*=T?.12:.05,p>.005&&(this.ctx.strokeStyle=`rgba(100, 140, 180, ${p})`,this.ctx.lineWidth=T?f*1.5:f,this.ctx.beginPath(),this.ctx.moveTo(i.minX,l),this.ctx.lineTo(i.maxX,l),this.ctx.stroke())}this.camera.restoreTransform(this.ctx),this.drawOriginMarker(),o>15&&this.drawCoordinateLabels(n,m,h)}calculateGridAlpha(s,e,i){if(s<=e)return 1;if(s>=i)return 0;const o=(s-e)/(i-e);return 1-o*o}drawOriginMarker(){const s=this.camera.worldToScreen(0,0),{x:e,y:i}=s,o=12,n=this.ctx.createRadialGradient(e,i,0,e,i,o*2);n.addColorStop(0,"rgba(74, 158, 255, 0.15)"),n.addColorStop(1,"rgba(74, 158, 255, 0)"),this.ctx.fillStyle=n,this.ctx.beginPath(),this.ctx.arc(e,i,o*2,0,Math.PI*2),this.ctx.fill();const c=20,a=6;this.ctx.strokeStyle="rgba(74, 158, 255, 0.4)",this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.moveTo(e-c,i),this.ctx.lineTo(e-a,i),this.ctx.moveTo(e+a,i),this.ctx.lineTo(e+c,i),this.ctx.moveTo(e,i-c),this.ctx.lineTo(e,i-a),this.ctx.moveTo(e,i+a),this.ctx.lineTo(e,i+c),this.ctx.stroke(),this.ctx.strokeStyle="rgba(74, 158, 255, 0.5)",this.ctx.lineWidth=1.5,this.ctx.beginPath(),this.ctx.arc(e,i,o,0,Math.PI*2),this.ctx.stroke(),this.ctx.fillStyle="rgba(74, 158, 255, 0.8)",this.ctx.beginPath(),this.ctx.arc(e,i,2,0,Math.PI*2),this.ctx.fill();const r=3;this.ctx.strokeStyle="rgba(74, 158, 255, 0.6)",this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.moveTo(e,i-o),this.ctx.lineTo(e,i-o+r),this.ctx.moveTo(e,i+o),this.ctx.lineTo(e,i+o-r),this.ctx.moveTo(e-o,i),this.ctx.lineTo(e-o+r,i),this.ctx.moveTo(e+o,i),this.ctx.lineTo(e+o-r,i),this.ctx.stroke()}drawCoordinateLabels(s,e,i){const o=this.camera.getVisibleBounds(),n=s*5,c=Math.floor(o.minX/n)*n,a=Math.ceil(o.maxX/n)*n,r=Math.floor(o.minZ/n)*n,g=Math.ceil(o.maxZ/n)*n;this.ctx.font='10px "SF Mono", "Monaco", "Consolas", monospace',this.ctx.textBaseline="middle";for(let h=c;h<=a;h+=n){if(Math.abs(h)<.001)continue;const m=Math.abs(h),f=this.calculateGridAlpha(m,e,i)*.4;if(f>.02){const l=this.camera.worldToScreen(h,0);this.ctx.fillStyle=`rgba(100, 140, 180, ${f})`,this.ctx.textAlign="center",this.ctx.fillText(h.toString(),l.x,l.y+16)}}for(let h=r;h<=g;h+=n){if(Math.abs(h)<.001)continue;const m=Math.abs(h),f=this.calculateGridAlpha(m,e,i)*.4;if(f>.02){const l=this.camera.worldToScreen(0,h);this.ctx.fillStyle=`rgba(100, 140, 180, ${f})`,this.ctx.textAlign="left",this.ctx.fillText(h.toString(),l.x+16,l.y)}}}}const ee=30,se=.18;function ie(R,t,s){return Math.max(t,Math.min(s,R))}function vt(R){return ie(Math.max(R,1)/ee,se,1)}function oe(R){return vt(R)}function ne(R,t){return vt(R)}function ae(R){return R>=30?"full":R>=24?"reduced":R>=18?"compact":"minimal"}class re extends rt{constructor(s,e){super(s,e);d(this,"logoImages",new Map);d(this,"loadingLogos",new Set)}drawArea(s,e=!1){this.camera.applyTransform(this.ctx);const{x:i,z:o}=s.position,n=s.color||"#4a9eff",c=this.camera.getZoom();if(s.type==="rectangle"&&"width"in s.size){const{width:a,height:r}=s.size,g=i-a/2,h=o-r/2;if(this.drawRectangleArea(g,h,a,r,n,c,e),s.label&&this.drawAreaLabel(s.label,i,h,n,c,"top"),s.logo&&this.drawAreaLogo(s,i,o,a,r),s.hasDirectories){const l=Math.max(1,Math.floor((a-.6)/.675)),u=g+.5*.8,p=h+.5*.8;s.directories.forEach((T,w)=>{var b;const y=Math.floor(w/l),x=w%l,S=((b=s.directoryGitCounts)==null?void 0:b[w])??0;this.drawFolderIcon(u+x*.675,p+y*.675,.5,n,c,S)})}e&&this.drawRectangleResizeHandles(i,o,a,r,n,c)}else if(s.type==="circle"&&"radius"in s.size){const{radius:a}=s.size;if(this.drawCircleArea(i,o,a,n,c,e),s.label&&this.drawAreaLabel(s.label,i,o-a,n,c,"top"),s.logo){const r=a*1.414,g=a*1.414;this.drawAreaLogo(s,i,o,r,g)}if(s.hasDirectories){const g=a*.707,h=.5*1.35,m=Math.max(1,Math.floor((a*1.414-.5)/h)),f=i-g+.5*.5,l=o-g+.5*.5;s.directories.forEach((u,p)=>{var x;const T=Math.floor(p/m),w=p%m,y=((x=s.directoryGitCounts)==null?void 0:x[p])??0;this.drawFolderIcon(f+w*h,l+T*h,.5,n,c,y)})}e&&this.drawCircleResizeHandles(i,o,a,n,c)}this.camera.restoreTransform(this.ctx)}drawRectangleArea(s,e,i,o,n,c,a=!1){const r=this.ctx,g=Math.min(i,o)*.08;a&&(r.strokeStyle=this.hexToRgba(n,.5*.8),r.lineWidth=4/c,r.beginPath(),r.rect(s-2/c,e-2/c,i+4/c,o+4/c),r.stroke());const h=a?.25:.15,m=r.createLinearGradient(s,e,s+i,e+o);m.addColorStop(0,this.hexToRgba(n,h)),m.addColorStop(.5,this.hexToRgba(n,h*.5)),m.addColorStop(1,this.hexToRgba(n,h*1.3)),r.fillStyle=m,r.beginPath(),r.rect(s,e,i,o),r.fill();const f=r.createLinearGradient(s,e,s+i,e);f.addColorStop(0,"transparent"),f.addColorStop(.2,this.hexToRgba(n,.3)),f.addColorStop(.8,this.hexToRgba(n,.3)),f.addColorStop(1,"transparent"),r.strokeStyle=f,r.lineWidth=2/c,r.beginPath(),r.moveTo(s+g,e+2/c),r.lineTo(s+i-g,e+2/c),r.stroke();const l=r.createLinearGradient(s,e+o,s+i,e+o);l.addColorStop(0,"transparent"),l.addColorStop(.2,this.hexToRgba(this.darkenColor(n,.5),.4)),l.addColorStop(.8,this.hexToRgba(this.darkenColor(n,.5),.4)),l.addColorStop(1,"transparent"),r.strokeStyle=l,r.lineWidth=2/c,r.beginPath(),r.moveTo(s+g,e+o-2/c),r.lineTo(s+i-g,e+o-2/c),r.stroke(),r.strokeStyle=this.hexToRgba(n,.7),r.lineWidth=2/c,r.setLineDash([8/c,4/c]),r.lineDashOffset=0,r.beginPath(),r.rect(s,e,i,o),r.stroke(),r.setLineDash([]),r.strokeStyle=this.hexToRgba(n,.9),r.lineWidth=3/c,r.lineCap="round",this.drawCornerMark(s,e,g,"top-left"),this.drawCornerMark(s+i,e,g,"top-right"),this.drawCornerMark(s,e+o,g,"bottom-left"),this.drawCornerMark(s+i,e+o,g,"bottom-right"),r.fillStyle=n;const u=3/c,p=[{x:s,y:e},{x:s+i,y:e},{x:s,y:e+o},{x:s+i,y:e+o}];for(const T of p)r.beginPath(),r.arc(T.x,T.y,u,0,Math.PI*2),r.fill()}drawCornerMark(s,e,i,o){const n=this.ctx;switch(n.beginPath(),o){case"top-left":n.moveTo(s,e+i),n.lineTo(s,e),n.lineTo(s+i,e);break;case"top-right":n.moveTo(s-i,e),n.lineTo(s,e),n.lineTo(s,e+i);break;case"bottom-left":n.moveTo(s,e-i),n.lineTo(s,e),n.lineTo(s+i,e);break;case"bottom-right":n.moveTo(s-i,e),n.lineTo(s,e),n.lineTo(s,e-i);break}n.stroke()}drawCircleArea(s,e,i,o,n,c=!1){const a=this.ctx;c&&(a.strokeStyle=this.hexToRgba(o,.5*.8),a.lineWidth=4/n,a.beginPath(),a.arc(s,e,i+3/n,0,Math.PI*2),a.stroke());const r=c?.3:.2,g=a.createRadialGradient(s,e-i*.3,0,s,e,i);g.addColorStop(0,this.hexToRgba(o,r)),g.addColorStop(.6,this.hexToRgba(o,r*.5)),g.addColorStop(1,this.hexToRgba(o,r*.9)),a.fillStyle=g,a.beginPath(),a.arc(s,e,i,0,Math.PI*2),a.fill();const h=a.createLinearGradient(s-i*.7,e-i,s+i*.7,e-i);h.addColorStop(0,"transparent"),h.addColorStop(.3,this.hexToRgba(o,.4)),h.addColorStop(.7,this.hexToRgba(o,.4)),h.addColorStop(1,"transparent"),a.strokeStyle=h,a.lineWidth=2/n,a.beginPath(),a.arc(s,e,i-2/n,-Math.PI*.8,-Math.PI*.2),a.stroke(),a.strokeStyle=this.hexToRgba(o,.7),a.lineWidth=2/n,a.setLineDash([8/n,4/n]),a.lineDashOffset=0,a.beginPath(),a.arc(s,e,i,0,Math.PI*2),a.stroke(),a.setLineDash([]);const m=8,f=3/n;a.fillStyle=o;for(let u=0;u<m;u++){const p=u/m*Math.PI*2-Math.PI/2,T=s+Math.cos(p)*i,w=e+Math.sin(p)*i;a.beginPath(),a.arc(T,w,f,0,Math.PI*2),a.fill()}const l=4.5/n;for(let u=0;u<4;u++){const p=u/4*Math.PI*2-Math.PI/2,T=s+Math.cos(p)*i,w=e+Math.sin(p)*i;a.beginPath(),a.arc(T,w,l,0,Math.PI*2),a.fill()}}drawAreaLabel(s,e,i,o,n,c){const a=this.ctx,r=vt(n),g=11*r/n,h=6*r/n,m=c==="top"?-8*r/n:0;a.font=`bold ${g}px "Segoe UI", Arial, sans-serif`;const l=a.measureText(s).width,u=g,p=l+h*2,T=u+h,w=e-p/2,y=i+m-T/2,x=4*r/n,S=a.createLinearGradient(w,y,w,y+T);S.addColorStop(0,this.hexToRgba(this.darkenColor(o,.7),.9)),S.addColorStop(1,this.hexToRgba(this.darkenColor(o,.5),.9)),a.fillStyle=S,a.beginPath(),this.roundedRect(w,y,p,T,x),a.fill(),a.strokeStyle=this.hexToRgba(o,.8),a.lineWidth=1.5*r/n,a.beginPath(),this.roundedRect(w,y,p,T,x),a.stroke(),a.fillStyle=this.lightenColor(o,.3),a.textAlign="center",a.textBaseline="middle",a.fillText(s,e,i+m)}drawRectangleResizeHandles(s,e,i,o,n,c){const g=[{x:s-i/2,z:e-o/2},{x:s+i/2,z:e-o/2},{x:s-i/2,z:e+o/2},{x:s+i/2,z:e+o/2}];for(const m of g)this.drawResizeHandle(m.x,m.z,.25,"#ffffff",c,.9);const h=[{x:s,z:e-o/2},{x:s,z:e+o/2},{x:s+i/2,z:e},{x:s-i/2,z:e}];for(const m of h)this.drawResizeHandle(m.x,m.z,.25*.8,"#aaddff",c,.9);this.drawResizeHandle(s,e,.25*1.2,"#ffcc00",c,.9,!0)}drawCircleResizeHandles(s,e,i,o,n){this.drawResizeHandle(s+i,e,.25,"#ffffff",n,.9),this.drawResizeHandle(s,e,.25*1.2,"#ffcc00",n,.9,!0)}drawResizeHandle(s,e,i,o,n,c,a=!1){const r=this.ctx;r.save(),r.fillStyle="rgba(0, 0, 0, 0.5)",r.beginPath(),r.arc(s,e,i*1.3,0,Math.PI*2),r.fill();const g=r.createRadialGradient(s-i*.3,e-i*.3,0,s,e,i);if(g.addColorStop(0,this.lightenColor(o,.3)),g.addColorStop(.5,o),g.addColorStop(1,this.darkenColor(o,.2)),r.fillStyle=g,r.globalAlpha=c,r.beginPath(),r.arc(s,e,i,0,Math.PI*2),r.fill(),r.globalAlpha=1,r.strokeStyle="rgba(255, 255, 255, 0.8)",r.lineWidth=1.5/n,r.beginPath(),r.arc(s,e,i,0,Math.PI*2),r.stroke(),a){const h=i*.5;r.strokeStyle="rgba(0, 0, 0, 0.7)",r.lineWidth=2/n,r.lineCap="round",r.beginPath(),r.moveTo(s-h,e),r.lineTo(s+h,e),r.moveTo(s,e-h),r.lineTo(s,e+h),r.stroke()}r.restore()}drawFolderIcon(s,e,i,o,n,c=0){const a=this.ctx,r=i*.45;a.save(),a.fillStyle=this.hexToRgba(this.darkenColor(o,.6),.85),a.beginPath(),a.arc(s,e,r*1.1,0,Math.PI*2),a.fill(),a.strokeStyle=this.hexToRgba(o,.8),a.lineWidth=1.5/n,a.beginPath(),a.arc(s,e,r*1.1,0,Math.PI*2),a.stroke();const g=r*1.2,h=r*.9,m=g*.35,f=h*.2,l=h*.08,u=s-g/2,p=e-h/2;if(a.fillStyle=o,a.beginPath(),a.moveTo(u+l,p+f),a.lineTo(u+m,p+f),a.lineTo(u+m+f*.6,p),a.lineTo(u+m+m*.4,p),a.lineTo(u+l,p),a.arcTo(u,p,u,p+l,l),a.lineTo(u,p+h-l),a.arcTo(u,p+h,u+l,p+h,l),a.lineTo(u+g-l,p+h),a.arcTo(u+g,p+h,u+g,p+h-l,l),a.lineTo(u+g,p+f+l),a.arcTo(u+g,p+f,u+g-l,p+f,l),a.closePath(),a.fill(),a.strokeStyle=this.hexToRgba(this.lightenColor(o,.3),.6),a.lineWidth=1/n,a.beginPath(),a.moveTo(u+l,p+f+h*.08),a.lineTo(u+g-l,p+f+h*.08),a.stroke(),c>0){const T=r*.4,w=s+r*.7,y=e+r*.7;a.fillStyle="#e8943a",a.beginPath(),a.arc(w,y,T,0,Math.PI*2),a.fill(),a.strokeStyle="rgba(0, 0, 0, 0.6)",a.lineWidth=1.5/n,a.beginPath(),a.arc(w,y,T,0,Math.PI*2),a.stroke();const x=c>99?"99+":String(c),S=T*1.2;a.font=`bold ${S}px "Segoe UI", Arial, sans-serif`,a.fillStyle="#ffffff",a.textAlign="center",a.textBaseline="middle",a.fillText(x,w,y)}a.restore()}getLogoImage(s){const e=this.logoImages.get(s);if(e)return e;if(!this.loadingLogos.has(s)){this.loadingLogos.add(s);const i=new Image;i.crossOrigin="anonymous",i.onload=()=>{this.logoImages.set(s,i),this.loadingLogos.delete(s)},i.onerror=()=>{this.loadingLogos.delete(s)},i.src=s}return null}drawAreaLogo(s,e,i,o,n){const c=s.logo,a=this.getLogoImage(c.url);if(!a)return;const{position:r,width:g,height:h,opacity:m}=c,f=this.calculateLogoOffset(r,g,h,o,n),l=e+f.x-g/2,u=i+f.z-h/2,p=this.ctx;p.save(),p.globalAlpha=m,p.drawImage(a,l,u,g,h),p.restore()}calculateLogoOffset(s,e,i,o,n){if(s==="center")return{x:0,z:0};const c=e/2+.2,a=i/2+.2;switch(s){case"top-left":return{x:-o/2+c,z:-n/2+a};case"top-right":return{x:o/2-c,z:-n/2+a};case"bottom-left":return{x:-o/2+c,z:n/2-a};case"bottom-right":return{x:o/2-c,z:n/2-a};default:return{x:0,z:0}}}drawAreaPreview(s,e,i){const o=this.camera.getZoom(),n=this.ctx,c="#4a9eff";if(this.camera.applyTransform(n),i==="rectangle"){const a=Math.min(s.x,e.x),r=Math.max(s.x,e.x),g=Math.min(s.z,e.z),h=Math.max(s.z,e.z),m=r-a,f=h-g;if(m<.1&&f<.1){this.camera.restoreTransform(n);return}n.fillStyle="rgba(74, 158, 255, 0.2)",n.fillRect(a,g,m,f),n.setLineDash([6/o,4/o]),n.lineDashOffset=0,n.strokeStyle=c,n.lineWidth=2/o,n.strokeRect(a,g,m,f),n.setLineDash([])}else if(i==="circle"){const a=e.x-s.x,r=e.z-s.z,g=Math.sqrt(a*a+r*r);if(g<.1){this.camera.restoreTransform(n);return}n.fillStyle="rgba(74, 158, 255, 0.2)",n.beginPath(),n.arc(s.x,s.z,g,0,Math.PI*2),n.fill(),n.setLineDash([6/o,4/o]),n.lineDashOffset=0,n.strokeStyle=c,n.lineWidth=2/o,n.beginPath(),n.arc(s.x,s.z,g,0,Math.PI*2),n.stroke(),n.setLineDash([])}this.camera.restoreTransform(n)}}const Xt={idle:{color:"#4aff9e",glow:"rgba(74, 255, 158, 0.6)",darkColor:"#2a9a5e"},working:{color:"#4a9eff",glow:"rgba(74, 158, 255, 0.6)",darkColor:"#2a5e9a"},waiting:{color:"#ffcc00",glow:"rgba(255, 204, 0, 0.6)",darkColor:"#9a7a00"},waiting_permission:{color:"#ffcc00",glow:"rgba(255, 204, 0, 0.6)",darkColor:"#9a7a00"},orphaned:{color:"#ff00ff",glow:"rgba(255, 0, 255, 0.6)",darkColor:"#9a009a"},running:{color:"#4aff9e",glow:"rgba(74, 255, 158, 0.6)",darkColor:"#2a9a5e"},stopped:{color:"#8a8a8a",glow:"rgba(138, 138, 138, 0.6)",darkColor:"#5a5a5a"},starting:{color:"#4a9eff",glow:"rgba(74, 158, 255, 0.6)",darkColor:"#2a5e9a"},stopping:{color:"#ffaa00",glow:"rgba(255, 170, 0, 0.6)",darkColor:"#9a6a00"},unknown:{color:"#ffaa00",glow:"rgba(255, 170, 0, 0.6)",darkColor:"#9a6a00"},error:{color:"#ff4a4a",glow:"rgba(255, 74, 74, 0.6)",darkColor:"#9a2a2a"}},Zt={"server-rack":{color:"#5a7a9a",darkColor:"#3a5a7a",emoji:"🖥️"},desktop:{color:"#7a9a7a",darkColor:"#5a7a5a",emoji:"💻"},"filing-cabinet":{color:"#9a8a6a",darkColor:"#7a6a4a",emoji:"🗄️"},factory:{color:"#9a6a6a",darkColor:"#7a4a4a",emoji:"🏭"},satellite:{color:"#6a6a9a",darkColor:"#4a4a7a",emoji:"📡"},crystal:{color:"#9a6a9a",darkColor:"#7a4a7a",emoji:"💎"},tower:{color:"#6a9a9a",darkColor:"#4a7a7a",emoji:"🗼"},dome:{color:"#7a7a9a",darkColor:"#5a5a7a",emoji:"🔮"},pyramid:{color:"#9a9a6a",darkColor:"#7a7a4a",emoji:"🔺"},"command-center":{color:"#ba9a5a",darkColor:"#9a7a3a",emoji:"🏛️"}};class ce extends rt{constructor(t,s){super(t,s)}drawBuilding(t,s,e=!1){const{x:i,z:o}=t.position,n=1.8*t.scale,c=Zt[t.style]||Zt["server-rack"],a=Xt[t.status]||Xt.stopped;let r=c.color,g=c.darkColor;t.color&&(r=t.color,g=this.darkenColor(t.color,.3)),this.camera.applyTransform(this.ctx);const h=.08,m=.12;if(this.ctx.fillStyle="rgba(0, 0, 0, 0.35)",this.ctx.beginPath(),this.roundedRect(i-n/2+h,o-n/2+m,n,n,.15),this.ctx.fill(),s){const N=.5+Math.sin(this.animationTime*4)*.2;this.ctx.strokeStyle=`rgba(255, 255, 255, ${N})`,this.ctx.lineWidth=4/this.camera.getZoom(),this.ctx.beginPath(),this.roundedRect(i-n/2-.05,o-n/2-.05,n+.1,n+.1,.2),this.ctx.stroke()}e&&!s&&(this.ctx.strokeStyle="rgba(255, 255, 255, 0.4)",this.ctx.lineWidth=2/this.camera.getZoom(),this.ctx.beginPath(),this.roundedRect(i-n/2,o-n/2,n,n,.15),this.ctx.stroke());const f=this.ctx.createLinearGradient(i-n/2,o-n/2,i+n/2,o+n/2);f.addColorStop(0,this.lightenColor(r,.2)),f.addColorStop(.3,r),f.addColorStop(1,g),this.ctx.fillStyle=f,this.ctx.beginPath(),this.roundedRect(i-n/2,o-n/2,n,n,.15),this.ctx.fill(),this.ctx.strokeStyle="rgba(255, 255, 255, 0.25)",this.ctx.lineWidth=2/this.camera.getZoom(),this.ctx.beginPath(),this.ctx.moveTo(i-n/2+.15,o-n/2+.02),this.ctx.lineTo(i+n/2-.15,o-n/2+.02),this.ctx.stroke(),this.ctx.strokeStyle="rgba(0, 0, 0, 0.3)",this.ctx.lineWidth=2/this.camera.getZoom(),this.ctx.beginPath(),this.ctx.moveTo(i-n/2+.15,o+n/2-.02),this.ctx.lineTo(i+n/2-.15,o+n/2-.02),this.ctx.stroke();const l=.6+Math.sin(this.animationTime*3)*.15;this.ctx.strokeStyle=this.hexToRgba(a.color,l),this.ctx.lineWidth=3/this.camera.getZoom(),this.ctx.beginPath(),this.roundedRect(i-n/2,o-n/2,n,n,.15),this.ctx.stroke(),this.ctx.strokeStyle="rgba(0, 0, 0, 0.4)",this.ctx.lineWidth=1/this.camera.getZoom(),this.ctx.beginPath(),this.roundedRect(i-n/2-.02,o-n/2-.02,n+.04,n+.04,.17),this.ctx.stroke();const u=.18*t.scale,p=i+n/2-u-.1,T=o-n/2+u+.1;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.beginPath(),this.ctx.arc(p,T,u+.03,0,Math.PI*2),this.ctx.fill();const w=this.ctx.createRadialGradient(p-u*.3,T-u*.3,0,p,T,u);w.addColorStop(0,this.lightenColor(a.color,.4)),w.addColorStop(1,a.color),this.ctx.fillStyle=w,this.ctx.beginPath(),this.ctx.arc(p,T,u,0,Math.PI*2),this.ctx.fill(),this.camera.restoreTransform(this.ctx);const y=this.camera.worldToScreen(i,o),x=n*this.camera.getZoom(),S=Math.max(8,x*.55);this.ctx.font=`${S}px "Segoe UI Emoji", "Apple Color Emoji", "Noto Color Emoji", serif`,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillStyle="rgba(0, 0, 0, 0.3)",this.ctx.fillText(c.emoji,y.x+1,y.y+1),this.ctx.fillText(c.emoji,y.x,y.y);const b=this.camera.worldToScreen(i,o+n/2+.25),P=Math.max(6,x*.22);this.ctx.font=`bold ${P}px "Segoe UI", Arial, sans-serif`;const v=this.ctx.measureText(t.name).width,k=6,W=P+6,Z=this.ctx.createLinearGradient(b.x-v/2-k,b.y-W/2,b.x-v/2-k,b.y+W/2);if(Z.addColorStop(0,"rgba(30, 35, 40, 0.9)"),Z.addColorStop(1,"rgba(20, 25, 30, 0.95)"),this.ctx.fillStyle=Z,this.ctx.beginPath(),this.roundedRectScreen(b.x-v/2-k,b.y-W/2,v+k*2,W,4),this.ctx.fill(),this.ctx.strokeStyle=this.hexToRgba(r,.6),this.ctx.lineWidth=1,this.ctx.beginPath(),this.roundedRectScreen(b.x-v/2-k,b.y-W/2,v+k*2,W,4),this.ctx.stroke(),this.ctx.fillStyle="#ffffff",this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(t.name,b.x,b.y),t.gitChangesCount&&t.gitChangesCount>0){const N=this.camera.worldToScreen(i-n/2+.15,o-n/2+.15),q=Math.max(5,x*.1),U=t.gitChangesCount>99?"99+":String(t.gitChangesCount);this.ctx.fillStyle="#c89a5a",this.ctx.beginPath(),this.ctx.arc(N.x,N.y,q,0,Math.PI*2),this.ctx.fill(),this.ctx.strokeStyle="rgba(0, 0, 0, 0.5)",this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.arc(N.x,N.y,q,0,Math.PI*2),this.ctx.stroke();const gt=Math.max(6,q*1.2);this.ctx.font=`bold ${gt}px Arial`,this.ctx.fillStyle="#ffffff",this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(U,N.x,N.y)}}drawBossLine(t,s){this.camera.applyTransform(this.ctx),this.ctx.strokeStyle="rgba(255, 215, 0, 0.4)",this.ctx.lineWidth=2/this.camera.getZoom(),this.ctx.setLineDash([4/this.camera.getZoom(),4/this.camera.getZoom()]),this.ctx.beginPath(),this.ctx.moveTo(t.x,t.z),this.ctx.lineTo(s.x,s.z),this.ctx.stroke(),this.ctx.setLineDash([]),this.camera.restoreTransform(this.ctx)}}const Et={idle:{color:"#4aff9e",glow:"rgba(74, 255, 158, 0.6)",darkColor:"#2a9a5e"},working:{color:"#4a9eff",glow:"rgba(74, 158, 255, 0.6)",darkColor:"#2a5e9a"},waiting:{color:"#ffcc00",glow:"rgba(255, 204, 0, 0.6)",darkColor:"#9a7a00"},waiting_permission:{color:"#ffcc00",glow:"rgba(255, 204, 0, 0.6)",darkColor:"#9a7a00"},error:{color:"#ff4a4a",glow:"rgba(255, 74, 74, 0.6)",darkColor:"#9a2a2a"},orphaned:{color:"#ff00ff",glow:"rgba(255, 0, 255, 0.6)",darkColor:"#9a009a"}};class le extends rt{constructor(s,e,i){super(s,e);d(this,"effect");d(this,"frameCustomClasses",null);d(this,"frameUnseenOutput",null);d(this,"iconImageCache",new Map);d(this,"iconLoadingSet",new Set);this.effect=i}beginFrame(){const s=M.getState();this.frameCustomClasses=s.customAgentClasses,this.frameUnseenOutput=s.agentsWithUnseenOutput}getAgentClassIcon(s){var o;const e=Tt[s];if(e)return e.icon;const i=(o=this.frameCustomClasses)==null?void 0:o.get(s);return i?i.icon:"🤖"}getAgentIconImage(s){var o;const e=(o=this.frameCustomClasses)==null?void 0:o.get(s);if(!(e!=null&&e.iconPath))return null;const i=this.iconImageCache.get(e.iconPath);if(i)return i;if(!this.iconLoadingSet.has(e.iconPath)){this.iconLoadingSet.add(e.iconPath);const n=new Image;n.src=Wt(Gt(`/api/custom-class-icons/${e.iconPath}`)),n.onload=()=>{this.iconImageCache.set(e.iconPath,n),this.iconLoadingSet.delete(e.iconPath)},n.onerror=()=>{this.iconLoadingSet.delete(e.iconPath)}}return null}getDisplayName(s,e){return e!=="compact"||s.length<=12?s:`${s.slice(0,10)}..`}drawAgent(s,e,i,o,n){var Dt;const{x:c,z:a}=s.position,g=(s.isBoss?.7:.5)*o,h=this.camera.getZoom(),m=oe(h),f=ne(h,n&&!!s.taskLabel),l=ae(h),u=l!=="minimal",p=l==="full",T=l==="full",w=l==="full",y=l==="full"||l==="reduced",x=l==="compact"||l==="minimal",S=this.getDisplayName(s.name,l),P=this.animationTime*8,v=s.status==="working",k=v?Math.abs(Math.sin(this.animationTime*4))*4*m:0,W=i?Math.sin(P*2)*.05:0,Z=i?1+Math.sin(P*2)*.08:1,N=i?Math.sin(P)*.15:0,q=Et[s.status]||Et.idle,U=this.numberToHex(s.color),gt=this.darkenColor(U,.4);this.lightenColor(U,.3);const Ht=this.getAgentClassIcon(s.class),A=this.camera.worldToScreen(c,a+W),D=g*this.camera.getZoom();this.ctx.save(),this.ctx.fillStyle="rgba(0, 0, 0, 0.35)",this.ctx.beginPath(),this.ctx.ellipse(A.x+3,A.y+3,D*1.05,D*.95,0,0,Math.PI*2),this.ctx.fill();const Ct=v?.75+Math.sin(this.animationTime*2.5)*.2:.85,ut=D+6,ct=this.ctx.createRadialGradient(A.x,A.y,D,A.x,A.y,ut+4);if(ct.addColorStop(0,"transparent"),ct.addColorStop(.5,this.hexToRgba(q.color,Ct*.5)),ct.addColorStop(1,"transparent"),this.ctx.beginPath(),this.ctx.arc(A.x,A.y,ut+4,0,Math.PI*2),this.ctx.fillStyle=ct,this.ctx.fill(),this.ctx.beginPath(),this.ctx.arc(A.x,A.y,ut,0,Math.PI*2),this.ctx.strokeStyle=this.hexToRgba(q.color,Ct*.8),this.ctx.lineWidth=2,this.ctx.stroke(),e){const z=s.isBoss?.4:.34,I=D+10,C=this.ctx.createRadialGradient(A.x,A.y,D+6,A.x,A.y,I+8);C.addColorStop(0,this.hexToRgba(U,z*.34)),C.addColorStop(.5,this.hexToRgba(U,z*.16)),C.addColorStop(1,"transparent"),this.ctx.beginPath(),this.ctx.arc(A.x,A.y,I+8,0,Math.PI*2),this.ctx.fillStyle=C,this.ctx.fill(),this.ctx.beginPath(),this.ctx.arc(A.x,A.y,I,0,Math.PI*2),this.ctx.strokeStyle=this.hexToRgba(U,s.isBoss?.44:.36),this.ctx.lineWidth=s.isBoss?2.2:1.8,this.ctx.setLineDash([8,4]),this.ctx.lineDashOffset=-this.animationTime*12,this.ctx.stroke(),this.ctx.setLineDash([])}if(i){const z=D*.25,I=A.y+D*.7;this.ctx.fillStyle="rgba(0, 0, 0, 0.3)",this.ctx.beginPath(),this.ctx.ellipse(A.x,I+4,D*.6,D*.15,0,0,Math.PI*2),this.ctx.fill(),this.ctx.fillStyle=gt,this.ctx.beginPath(),this.ctx.arc(A.x-D*.3+N*this.camera.getZoom(),I,z,0,Math.PI*2),this.ctx.fill(),this.ctx.beginPath(),this.ctx.arc(A.x+D*.3-N*this.camera.getZoom(),I,z,0,Math.PI*2),this.ctx.fill()}const Ft=i?D/Z:D,Yt=i?D*Z:D,lt=this.ctx.createRadialGradient(A.x-D*.3,A.y-D*.3,0,A.x,A.y,D);lt.addColorStop(0,"#3a3a3a"),lt.addColorStop(.5,"#1a1a1a"),lt.addColorStop(1,"#0a0a0a"),this.ctx.beginPath(),i?this.ctx.ellipse(A.x,A.y,Ft,Yt,0,0,Math.PI*2):this.ctx.arc(A.x,A.y,D,0,Math.PI*2),this.ctx.fillStyle=lt,this.ctx.fill(),this.ctx.strokeStyle=this.hexToRgba(U,.6),this.ctx.lineWidth=2,this.ctx.stroke(),this.ctx.beginPath(),this.ctx.arc(A.x-D*.25,A.y-D*.25,D*.3,0,Math.PI*2),this.ctx.fillStyle="rgba(255, 255, 255, 0.1)",this.ctx.fill(),this.ctx.restore();const yt=this.getAgentIconImage(s.class);if(yt){const z=Math.max(12,D*1.6);this.ctx.save(),this.ctx.beginPath(),this.ctx.arc(A.x,A.y-k,z/2,0,Math.PI*2),this.ctx.clip(),this.ctx.drawImage(yt,A.x-z/2,A.y-k-z/2,z,z),this.ctx.restore()}else{const z=Math.max(6,Math.max(10*m,D*1.1));this.ctx.font=`${z}px "Segoe UI Emoji", "Apple Color Emoji", "Noto Color Emoji", sans-serif`,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(Ht,A.x,A.y+1-k)}if(s.isBoss){const z=Math.max(6,Math.max(8*m,D*.6));this.ctx.font=`${z}px "Segoe UI Emoji", "Apple Color Emoji", "Noto Color Emoji", serif`,this.ctx.textAlign="center",this.ctx.textBaseline="bottom",this.ctx.fillText("👑",A.x,A.y-D-2)}if(x){const z=Math.max(1.5,3.2*m),I=A.x+D*.6,C=A.y-D*.6;this.ctx.beginPath(),this.ctx.arc(I,C,z+1.5,0,Math.PI*2),this.ctx.fillStyle=this.hexToRgba(q.color,.28),this.ctx.fill(),this.ctx.beginPath(),this.ctx.arc(I,C,z,0,Math.PI*2),this.ctx.fillStyle=q.color,this.ctx.fill(),this.ctx.strokeStyle="rgba(255, 255, 255, 0.9)",this.ctx.lineWidth=1,this.ctx.stroke()}if(i)for(let I=0;I<4;I++){const C=P+I*1.5,X=A.x+Math.sin(C*1.5)*D*.5,B=A.y+D*.9+Math.abs(Math.sin(C))*8,L=2+Math.sin(C)*1,$=.4-Math.abs(Math.sin(C))*.3;this.ctx.beginPath(),this.ctx.arc(X,B,L,0,Math.PI*2),this.ctx.fillStyle=`rgba(180, 180, 180, ${$})`,this.ctx.fill()}const ft=o*m,st=A.y+D+12*m,It=o*f;if(u){const z=Math.max(4.5,13*It);this.ctx.font=`bold ${z}px "Segoe UI", Arial, sans-serif`;const I=this.ctx.measureText(S).width,C=Math.max(2,6*f),X=z+Math.max(2,4*f),B=l==="full"&&(s.provider==="claude"||s.provider==="codex"||s.provider==="opencode"),L=B?z*.45:0,$=B?z*.3:0,_=L+$,H=I+_+C*2,j=A.x+_/2,V=this.ctx.createLinearGradient(A.x-H/2,st-X/2,A.x-H/2,st+X/2);if(V.addColorStop(0,"rgba(30, 30, 40, 0.95)"),V.addColorStop(1,"rgba(20, 20, 30, 0.95)"),this.ctx.beginPath(),this.roundedRectScreen(A.x-H/2,st-X/2,H,X,Math.max(2,4*f)),this.ctx.fillStyle=V,this.ctx.fill(),this.ctx.strokeStyle=this.hexToRgba(U,.6),this.ctx.lineWidth=Math.max(.75,1.5*f),this.ctx.stroke(),B){const ot=A.x-H/2+C+L/2,pt=st,xt=s.provider==="codex"?"#4a9eff":s.provider==="opencode"?"#10b981":"#ff9e4a";this.ctx.beginPath(),this.ctx.arc(ot,pt,L/2,0,Math.PI*2),this.ctx.fillStyle=xt,this.ctx.fill(),this.ctx.strokeStyle="rgba(255, 255, 255, 0.9)",this.ctx.lineWidth=Math.max(.75,L*.12),this.ctx.stroke()}this.ctx.fillStyle=U,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.font=`bold ${z}px "Segoe UI", Arial, sans-serif`,this.ctx.fillText(S,j,st)}const kt=At(s).freePercent,nt=Math.max(0,Math.min(100,kt))/100,K=st+(u?Math.max(2.5,(13*It+Math.max(2,4*f))/2):0)+8*m,J=76*m,et=7*m,mt=Math.max(1,2.2*m);if(p){if(this.ctx.beginPath(),this.roundedRectScreen(A.x-J/2,K,J,et,mt),this.ctx.fillStyle="rgba(0, 0, 0, 0.7)",this.ctx.fill(),nt>0){let z,I;nt>.5?(z="#6a9a78",I="#4a7a58"):nt>.2?(z="#c89858",I="#a87838"):(z="#c85858",I="#a83838");const C=this.ctx.createLinearGradient(A.x-J/2,K,A.x-J/2+J*nt,K);C.addColorStop(0,z),C.addColorStop(1,I),this.ctx.beginPath(),this.roundedRectScreen(A.x-J/2,K,J*nt,et,mt),this.ctx.fillStyle=C,this.ctx.fill()}if(this.ctx.beginPath(),this.roundedRectScreen(A.x-J/2,K,J,et,mt),this.ctx.strokeStyle="rgba(100, 150, 150, 0.6)",this.ctx.lineWidth=Math.max(.75,1.5*m),this.ctx.stroke(),T){const z=`${Math.round(kt)}%`,I=Math.max(4.5,10*m);this.ctx.font=`bold ${I}px "Segoe UI", Arial, sans-serif`,this.ctx.fillStyle="rgba(255, 255, 255, 0.95)",this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(z,A.x,K+et/2)}}if(w&&s.status==="idle"&&s.lastActivity>0){const z=Math.floor((Date.now()-s.lastActivity)/1e3);if(z>=5){const I=this.formatIdleTime(z),C=K+et+10*m;let X,B,L;z<60?(X="rgba(74, 158, 74, 0.9)",B="#aaffaa",L="💤"):(z<300,X="rgba(158, 120, 50, 0.9)",B="#ffdd88",L="⏳");const $=Math.max(4.5,9*ft);this.ctx.font=`bold ${$}px "Segoe UI Emoji", "Apple Color Emoji", Arial`;const _=`${L} ${I}`,H=this.ctx.measureText(_).width,j=5*m,V=$+3*m;this.ctx.beginPath(),this.roundedRectScreen(A.x-H/2-j,C-V/2,H+j*2,V,V/2),this.ctx.fillStyle=X,this.ctx.fill(),this.ctx.fillStyle=B,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(_,A.x,C)}}this.effect.updateAgentTool(s.id,s.currentTool);const it=this.effect.getToolAnimation(s.id);if(w&&it&&it.opacity>.01){const z=Rt[it.tool]||Rt.default,I=K+et+10*m,C=it.opacity,X=it.fadeIn?this.easeOutCubic(C):C,B=.8+.2*X,L=Math.max(4.5,10*ft)*B;this.ctx.font=`bold ${L}px "Segoe UI Emoji", "Apple Color Emoji", Arial`;const $=`${z} ${it.tool}`,_=this.ctx.measureText($).width,H=6*m*B,j=L+4*m*B,V=(1-X)*4*m,ot=I+V;this.ctx.beginPath(),this.roundedRectScreen(A.x-_/2-H,ot-j/2,_+H*2,j,j/2),this.ctx.fillStyle=`rgba(74, 118, 158, ${.9*C})`,this.ctx.fill(),this.ctx.strokeStyle=`rgba(74, 158, 255, ${.6*C})`,this.ctx.lineWidth=1,this.ctx.stroke(),this.ctx.fillStyle=`rgba(170, 221, 255, ${C})`,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText($,A.x,ot)}if(w&&n&&s.taskLabel){const z=Math.max(5,15*ft);this.ctx.font=`bold italic ${z}px "Segoe UI", Arial, sans-serif`;const I=s.taskLabel.length>30?s.taskLabel.substring(0,28)+"..":s.taskLabel,C=this.ctx.measureText(I).width,X=6*m,B=z+5*m,L=K+et+10*m;this.ctx.beginPath(),this.roundedRectScreen(A.x-C/2-X,L-B/2,C+X*2,B,B/2),this.ctx.fillStyle="rgba(60, 60, 80, 0.8)",this.ctx.fill(),this.ctx.fillStyle="rgba(180, 195, 215, 0.95)",this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(I,A.x,L)}if(y&&((Dt=this.frameUnseenOutput)!=null&&Dt.has(s.id))){const z=10*m,I=A.x+D*.7,C=A.y-D*.7,X=this.ctx.createRadialGradient(I,C,0,I,C,z*1.5);X.addColorStop(0,"rgba(74, 158, 255, 0.8)"),X.addColorStop(1,"rgba(74, 158, 255, 0)"),this.ctx.beginPath(),this.ctx.arc(I,C,z*1.5,0,Math.PI*2),this.ctx.fillStyle=X,this.ctx.fill();const B=z*.9,L=-Math.PI/2,$=L+2*Math.PI/3,_=L+4*Math.PI/3,H=I+B*Math.cos(L),j=C+B*Math.sin(L),V=I+B*Math.cos($),ot=C+B*Math.sin($),pt=I+B*Math.cos(_),xt=C+B*Math.sin(_);this.ctx.beginPath(),this.ctx.moveTo(H,j),this.ctx.lineTo(V,ot),this.ctx.lineTo(pt,xt),this.ctx.closePath(),this.ctx.fillStyle="#4a9eff",this.ctx.fill(),this.ctx.strokeStyle="#282a36",this.ctx.lineWidth=2,this.ctx.stroke(),this.ctx.fillStyle="#ffffff",this.ctx.font=`bold ${Math.max(8,z*1.2)}px Arial`,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText("!",I,C+1)}}drawSelectionBox(s,e){const i=this.camera.getZoom(),o=Math.min(s.x,e.x),n=Math.max(s.x,e.x),c=Math.min(s.z,e.z),a=Math.max(s.z,e.z),r=n-o,g=a-c;if(r<.1&&g<.1)return;this.camera.applyTransform(this.ctx);const h=this.ctx,m="#4a9eff",f=this.animationTime*30%24,l=6/i,u=3/i;h.strokeStyle="rgba(74, 158, 255, 0.2)",h.lineWidth=6/i,h.beginPath(),h.rect(o,c,r,g),h.stroke();const p=h.createLinearGradient(o,c,n,a);p.addColorStop(0,"rgba(74, 158, 255, 0.15)"),p.addColorStop(.4,"rgba(74, 158, 255, 0.08)"),p.addColorStop(.6,"rgba(74, 158, 255, 0.12)"),p.addColorStop(1,"rgba(100, 180, 255, 0.18)"),h.fillStyle=p,h.beginPath(),h.rect(o,c,r,g),h.fill();const T=h.createLinearGradient(o,c,n,c);T.addColorStop(0,"transparent"),T.addColorStop(.2,"rgba(150, 200, 255, 0.4)"),T.addColorStop(.8,"rgba(150, 200, 255, 0.4)"),T.addColorStop(1,"transparent"),h.strokeStyle=T,h.lineWidth=1.5/i,h.beginPath(),h.moveTo(o+r*.1,c+1/i),h.lineTo(n-r*.1,c+1/i),h.stroke(),h.strokeStyle="rgba(74, 158, 255, 0.9)",h.lineWidth=2/i,h.setLineDash([l,u]),h.lineDashOffset=-f/i,h.beginPath(),h.rect(o,c,r,g),h.stroke(),h.setLineDash([]),h.strokeStyle="rgba(74, 158, 255, 0.3)",h.lineWidth=1/i,h.beginPath(),h.rect(o-1/i,c-1/i,r+2/i,g+2/i),h.stroke();const w=Math.min(r,g)*.15,x=Math.max(w,.3);h.strokeStyle=m,h.lineWidth=3/i,h.lineCap="round",this.drawSelectionCorner(o,c,x,"top-left"),this.drawSelectionCorner(n,c,x,"top-right"),this.drawSelectionCorner(o,a,x,"bottom-left"),this.drawSelectionCorner(n,a,x,"bottom-right");const S=3/i;h.fillStyle=m;const b=.6+Math.sin(this.animationTime*4)*.3,P=[{x:o,y:c},{x:n,y:c},{x:o,y:a},{x:n,y:a}];for(const v of P)h.fillStyle=`rgba(74, 158, 255, ${b*.35})`,h.beginPath(),h.arc(v.x,v.y,S*2.5,0,Math.PI*2),h.fill(),h.fillStyle=m,h.beginPath(),h.arc(v.x,v.y,S,0,Math.PI*2),h.fill();this.camera.restoreTransform(this.ctx)}drawSelectionCorner(s,e,i,o){const n=this.ctx;switch(n.beginPath(),o){case"top-left":n.moveTo(s,e+i),n.lineTo(s,e),n.lineTo(s+i,e);break;case"top-right":n.moveTo(s-i,e),n.lineTo(s,e),n.lineTo(s,e+i);break;case"bottom-left":n.moveTo(s,e-i),n.lineTo(s,e),n.lineTo(s+i,e);break;case"bottom-right":n.moveTo(s-i,e),n.lineTo(s,e),n.lineTo(s,e-i);break}n.stroke()}}class Ot{constructor(t,s){d(this,"grid");d(this,"area");d(this,"building");d(this,"agent");d(this,"effect");this.effect=new Qt(t,s),this.grid=new te(t,s),this.area=new re(t,s),this.building=new ce(t,s),this.agent=new le(t,s,this.effect)}update(t){this.effect.update(t);const s=this.effect.getAnimationTime();this.grid.setAnimationTime(s),this.area.setAnimationTime(s),this.building.setAnimationTime(s),this.agent.setAnimationTime(s)}drawGround(t){this.grid.drawGround(t)}drawGrid(t,s){this.grid.drawGrid(t,s)}drawArea(t,s=!1){this.area.drawArea(t,s)}drawBuilding(t,s,e=!1){this.building.drawBuilding(t,s,e)}beginAgentFrame(){this.agent.beginFrame()}drawAgent(t,s,e,i,o){this.agent.drawAgent(t,s,e,i,o)}drawBossLine(t,s){this.building.drawBossLine(t,s)}drawSelectionBox(t,s){this.agent.drawSelectionBox(t,s)}drawAreaPreview(t,s,e){this.area.drawAreaPreview(t,s,e)}updateAgentTool(t,s){this.effect.updateAgentTool(t,s)}getToolAnimation(t){return this.effect.getToolAnimation(t)}}const F=class F{constructor(t,s,e){d(this,"canvas");d(this,"camera");d(this,"scene");d(this,"isMouseDown",!1);d(this,"isPanning",!1);d(this,"isSelecting",!1);d(this,"lastMouseX",0);d(this,"lastMouseY",0);d(this,"mouseDownX",0);d(this,"mouseDownY",0);d(this,"mouseDownTime",0);d(this,"lastClickTime",0);d(this,"lastClickTarget",null);d(this,"doubleClickDelay",400);d(this,"selectionBox",null);d(this,"hoveredAgentId",null);d(this,"hoveredBuildingId",null);d(this,"isMouseInCanvas",!1);d(this,"isResizingArea",!1);d(this,"resizeHandleType",null);d(this,"isDraggingBuilding",!1);d(this,"draggingBuildingId",null);d(this,"buildingDragStartPos",null);d(this,"isDraggingAgent",!1);d(this,"draggingAgentId",null);d(this,"agentDragStartPos",null);d(this,"onMouseDown",t=>{const s=this.canvas.getBoundingClientRect(),e=t.clientX-s.left,i=t.clientY-s.top;if(this.isMouseDown=!0,this.mouseDownX=e,this.mouseDownY=i,this.lastMouseX=e,this.lastMouseY=i,this.mouseDownTime=Date.now(),t.button===1){this.isPanning=!0,this.canvas.classList.add("panning"),t.preventDefault();return}if(t.button===0){const o=this.camera.screenToWorld(e,i);if(this.scene.isInDrawingMode()){this.scene.startDrawing(o);return}const n=this.scene.getAreaHandleAtWorldPos(o.x,o.z);if(n){this.isResizingArea=!0,this.resizeHandleType=n.handleType,this.scene.startAreaResize(n.handleType,o);const r=n.handleType;this.canvas.style.cursor=r==="move"?"move":r==="n"||r==="s"?"ns-resize":r==="e"||r==="w"||r==="radius"?"ew-resize":r==="ne"||r==="sw"?"nesw-resize":"nwse-resize";return}const c=this.scene.getAgentAtScreenPos(e,i),a=this.scene.getBuildingAtScreenPos(e,i);if(c){this.draggingAgentId=c.id,this.agentDragStartPos={...o},this.isDraggingAgent=!1;return}if(a&&!c){this.draggingBuildingId=a.id,this.buildingDragStartPos={...o},this.isDraggingBuilding=!1;return}!c&&!a&&(this.isSelecting=!1,this.selectionBox={start:{...o},end:{...o}})}});d(this,"onMouseMove",t=>{var m,f;const s=this.canvas.getBoundingClientRect(),e=t.clientX-s.left,i=t.clientY-s.top;this.camera.setMousePosition(e,i),this.isMouseInCanvas=!0;const o=this.scene.getAgentAtScreenPos(e,i),n=(o==null?void 0:o.id)??null;n!==this.hoveredAgentId&&(this.hoveredAgentId=n,this.scene.handleAgentHover(n,n?{x:t.clientX,y:t.clientY}:null));const c=this.scene.getBuildingAtScreenPos(e,i),a=(c==null?void 0:c.id)??null;if(a!==this.hoveredBuildingId&&(this.hoveredBuildingId=a,(f=(m=this.scene).handleBuildingHover)==null||f.call(m,a)),!this.isMouseDown){const l=this.camera.screenToWorld(e,i),u=this.scene.getAreaHandleAtWorldPos(l.x,l.z);u?u.handleType==="move"?this.canvas.style.cursor="move":u.handleType==="nw"||u.handleType==="se"?this.canvas.style.cursor="nwse-resize":u.handleType==="ne"||u.handleType==="sw"?this.canvas.style.cursor="nesw-resize":u.handleType==="n"||u.handleType==="s"?this.canvas.style.cursor="ns-resize":(u.handleType==="e"||u.handleType==="w"||u.handleType==="radius")&&(this.canvas.style.cursor="ew-resize"):this.canvas.style.cursor=""}if(!this.isMouseDown){this.lastMouseX=e,this.lastMouseY=i;return}const r=e-this.lastMouseX,g=i-this.lastMouseY,h=this.camera.screenToWorld(e,i);if(this.scene.isCurrentlyDrawing()){this.scene.updateDrawing(h),this.lastMouseX=e,this.lastMouseY=i;return}if(this.isResizingArea){this.scene.updateAreaResize(h),this.lastMouseX=e,this.lastMouseY=i;return}if(this.draggingAgentId&&this.agentDragStartPos){const l=h.x-this.agentDragStartPos.x,u=h.z-this.agentDragStartPos.z,p=Math.sqrt(l*l+u*u);!this.isDraggingAgent&&p>.5&&(this.isDraggingAgent=!0,this.canvas.style.cursor="move"),this.isDraggingAgent&&this.scene.handleAgentDragMove(this.draggingAgentId,h),this.lastMouseX=e,this.lastMouseY=i;return}if(this.draggingBuildingId&&this.buildingDragStartPos){const l=h.x-this.buildingDragStartPos.x,u=h.z-this.buildingDragStartPos.z,p=Math.sqrt(l*l+u*u);!this.isDraggingBuilding&&p>.5&&(this.isDraggingBuilding=!0,this.scene.handleBuildingDragStart(this.draggingBuildingId,this.buildingDragStartPos),this.canvas.style.cursor="move"),this.isDraggingBuilding&&this.scene.handleBuildingDragMove(this.draggingBuildingId,h),this.lastMouseX=e,this.lastMouseY=i;return}this.isPanning?this.camera.panBy(r,g):this.selectionBox&&(Math.sqrt(Math.pow(e-this.mouseDownX,2)+Math.pow(i-this.mouseDownY,2))>5&&!this.isSelecting&&(this.isSelecting=!0,this.canvas.classList.add("selecting")),this.isSelecting&&(this.selectionBox.end={...h})),this.lastMouseX=e,this.lastMouseY=i});d(this,"onMouseUp",t=>{const s=this.canvas.getBoundingClientRect(),e=t.clientX-s.left,i=t.clientY-s.top,o=this.camera.screenToWorld(e,i);if(this.scene.isCurrentlyDrawing()){this.scene.finishDrawing(o),this.isMouseDown=!1;return}if(this.isResizingArea){this.scene.finishAreaResize(),this.isResizingArea=!1,this.resizeHandleType=null,this.canvas.style.cursor="",this.isMouseDown=!1;return}if(this.draggingAgentId)if(this.isDraggingAgent){this.scene.handleAgentDragEnd(this.draggingAgentId,o),this.draggingAgentId=null,this.agentDragStartPos=null,this.isDraggingAgent=!1,this.canvas.style.cursor="",this.isMouseDown=!1;return}else this.draggingAgentId=null,this.agentDragStartPos=null,this.isDraggingAgent=!1;if(this.draggingBuildingId)if(this.isDraggingBuilding){this.scene.handleBuildingDragEnd(this.draggingBuildingId,o),this.draggingBuildingId=null,this.buildingDragStartPos=null,this.isDraggingBuilding=!1,this.canvas.style.cursor="",this.isMouseDown=!1;return}else this.draggingBuildingId=null,this.buildingDragStartPos=null,this.isDraggingBuilding=!1,this.canvas.style.cursor="";const n=this.isSelecting,c=this.isPanning;if(n&&this.selectionBox&&(this.scene.handleSelectionBox(this.selectionBox.start,this.selectionBox.end),this.selectionBox=null),!c&&!n&&t.button===0){const a=Date.now()-this.mouseDownTime,r=Math.sqrt(Math.pow(e-this.mouseDownX,2)+Math.pow(i-this.mouseDownY,2));console.log("[2D Scene] mouseUp click check",{clickDuration:a,distFromStart:r,shiftKey:t.shiftKey,wasSelecting:n,wasPanning:c}),a<500&&r<10?this.handleClick(e,i,t.shiftKey):console.log("[2D Scene] mouseUp REJECTED as click",{clickDuration:a,distFromStart:r})}else console.log("[2D Scene] mouseUp NOT a click candidate",{wasPanning:c,wasSelecting:n,button:t.button});this.isMouseDown=!1,this.isPanning=!1,this.isSelecting=!1,this.canvas.classList.remove("panning","selecting")});d(this,"onMouseLeave",()=>{var e,i,o,n;this.isMouseDown=!1,this.isPanning=!1,this.isSelecting=!1,this.selectionBox=null,this.isMouseInCanvas=!1,this.canvas.classList.remove("panning","selecting"),this.canvas.style.cursor="",this.isResizingArea&&(this.scene.finishAreaResize(),this.isResizingArea=!1,this.resizeHandleType=null),this.isDraggingAgent&&this.draggingAgentId&&this.scene.handleAgentDragCancel(this.draggingAgentId),this.draggingAgentId=null,this.agentDragStartPos=null,this.isDraggingAgent=!1,this.isDraggingBuilding&&this.draggingBuildingId&&((i=(e=this.scene).handleBuildingDragCancel)==null||i.call(e,this.draggingBuildingId)),this.draggingBuildingId=null,this.buildingDragStartPos=null,this.isDraggingBuilding=!1,this.hoveredAgentId&&(this.hoveredAgentId=null,this.scene.handleAgentHover(null,null)),this.hoveredBuildingId&&(this.hoveredBuildingId=null,(n=(o=this.scene).handleBuildingHover)==null||n.call(o,null));const{width:t,height:s}=this.camera.getViewportSize();this.camera.setMousePosition(t/2,s/2)});d(this,"onWheel",t=>{t.preventDefault();const s=this.canvas.getBoundingClientRect(),e=t.clientX-s.left,i=t.clientY-s.top,o=!t.ctrlKey&&(Math.abs(t.deltaX)>0||t.deltaMode===0&&Math.abs(t.deltaY)<50);if(t.ctrlKey){const n=-t.deltaY*.01;this.camera.zoomAtPoint(e,i,n)}else if(o)this.camera.panBy(-t.deltaX,-t.deltaY);else{const n=-t.deltaY*.001;this.camera.zoomAtPoint(e,i,n)}});d(this,"onContextMenu",t=>{t.preventDefault();const s=this.canvas.getBoundingClientRect(),e=t.clientX-s.left,i=t.clientY-s.top,o=this.camera.screenToWorld(e,i),n=this.scene.getAgentAtScreenPos(e,i),c=this.scene.getBuildingAtScreenPos(e,i),a=this.scene.getAreaAtScreenPos(e,i);if(M.getState().selectedAgentIds.size>0&&!n&&!c){this.scene.handleMoveCommand({x:o.x,z:o.z}),this.scene.createMoveOrderEffect({x:o.x,z:o.z});return}let g=null;n?g={type:"agent",id:n.id}:c?g={type:"building",id:c.id}:a&&(g={type:"area",id:a.id}),this.scene.handleContextMenu({x:t.clientX,y:t.clientY},{x:o.x,z:o.z},g)});d(this,"onKeyDown",t=>{const s=t.target,e=M.getState(),i=s.tagName==="INPUT"||s.tagName==="TEXTAREA"||s.isContentEditable,o=s.closest(".guake-terminal"),n=o==null?void 0:o.classList.contains("collapsed"),c=M.getShortcuts(),a=c.find(m=>m.id==="next-agent"),r=c.find(m=>m.id==="prev-agent"),g=c.find(m=>m.id==="open-terminal"),h=c.find(m=>m.id==="toggle-spotlight");if(Q(t,h)){console.log("[Scene2DInput] Spotlight shortcut detected, passing through");return}if(i)if((Q(t,a)||Q(t,r))&&n)s.blur();else if(Q(t,g)&&n)s.blur();else return;if((Q(t,a)||Q(t,r))&&!e.terminalOpen){const m=this.getOrderedAgents(e.agents);if(m.length<=1)return;const f=e.selectedAgentIds.size===1?Array.from(e.selectedAgentIds)[0]:null,l=f?m.findIndex(p=>p.id===f):-1;let u;Q(t,a)?u=l===-1?0:(l+1)%m.length:u=l===-1?m.length-1:(l-1+m.length)%m.length,t.preventDefault(),M.selectAgent(m[u].id);return}if(Q(t,g)){if(console.log("[Scene2DInput] Space pressed",{guakeTerminal:!!o,isCollapsedTerminal:n,targetTag:s.tagName,terminalOpen:e.terminalOpen,selectedAgents:e.selectedAgentIds.size,selectedBuildings:e.selectedBuildingIds.size,selectedArea:e.selectedAreaId,lastSelectedAgentId:e.lastSelectedAgentId}),o&&!n){console.log("[Scene2DInput] Space: blocked - inside open terminal");return}if(s.tagName==="BUTTON"||s.tagName==="A"){console.log("[Scene2DInput] Space: blocked - button/link focused");return}if(e.terminalOpen){console.log("[Scene2DInput] Space: blocked - terminal already open");return}if(e.selectedBuildingIds.size>0||e.selectedAreaId!==null){console.log("[Scene2DInput] Space: blocked - building or area focused");return}if(e.selectedAgentIds.size===0){const m=e.lastSelectedAgentId;console.log("[Scene2DInput] Space: no agent selected, trying lastAgentId:",m),m&&e.agents.has(m)?(t.preventDefault(),M.selectAgent(m),M.setTerminalOpen(!0),console.log("[Scene2DInput] Space: opened terminal for last agent:",m)):console.log("[Scene2DInput] Space: no valid last agent to open");return}t.preventDefault(),console.log("[Scene2DInput] Space: opening terminal for selected agent"),M.setTerminalOpen(!0)}});d(this,"touchStartPositions",[]);d(this,"initialPinchDistance",0);d(this,"longPressTimer",null);d(this,"longPressTriggered",!1);d(this,"touchIsPanning",!1);d(this,"touchPanVelocityX",0);d(this,"touchPanVelocityY",0);d(this,"lastTouchMoveTime",0);d(this,"touchInertiaFrameId",null);d(this,"onTouchStart",t=>{t.preventDefault(),this.stopTouchInertia(),this.clearLongPressTimer(),this.longPressTriggered=!1,this.touchIsPanning=!1,this.touchPanVelocityX=0,this.touchPanVelocityY=0,this.lastTouchMoveTime=0;const s=this.canvas.getBoundingClientRect();if(this.touchStartPositions=Array.from(t.touches).map(e=>({x:e.clientX-s.left,y:e.clientY-s.top})),t.touches.length===1){const e=this.touchStartPositions[0].x,i=this.touchStartPositions[0].y;if(this.mouseDownX=e,this.mouseDownY=i,this.lastMouseX=e,this.lastMouseY=i,this.mouseDownTime=Date.now(),this.isMouseDown=!0,this.scene.isInDrawingMode()){const r=this.camera.screenToWorld(e,i);this.scene.startDrawing(r);return}const o=this.camera.screenToWorld(e,i),n=this.scene.getAreaHandleAtWorldPos(o.x,o.z);if(n){this.isResizingArea=!0,this.resizeHandleType=n.handleType,this.scene.startAreaResize(n.handleType,o);return}const c=t.touches[0].clientX,a=t.touches[0].clientY;this.longPressTimer=setTimeout(()=>{this.longPressTriggered=!0,this.longPressTimer=null,this.handleTouchLongPress(c,a),navigator.vibrate&&navigator.vibrate(50)},F.TOUCH_LONG_PRESS_DURATION)}else t.touches.length===2&&(this.clearLongPressTimer(),this.initialPinchDistance=this.getPinchDistance(t.touches),this.isPanning=!1)});d(this,"onTouchMove",t=>{t.preventDefault();const s=this.canvas.getBoundingClientRect();if(t.touches.length===1){const e=t.touches[0].clientX-s.left,i=t.touches[0].clientY-s.top;if(this.scene.isCurrentlyDrawing()){const a=this.camera.screenToWorld(e,i);this.scene.updateDrawing(a),this.lastMouseX=e,this.lastMouseY=i;return}if(this.isResizingArea){const a=this.camera.screenToWorld(e,i);this.scene.updateAreaResize(a),this.lastMouseX=e,this.lastMouseY=i;return}const o=e-this.mouseDownX,n=i-this.mouseDownY;if((Math.abs(o)>F.TOUCH_DRAG_THRESHOLD||Math.abs(n)>F.TOUCH_DRAG_THRESHOLD)&&(this.clearLongPressTimer(),this.touchIsPanning=!0),this.touchIsPanning){const a=this.lastTouchMoveTime>0?Math.max(1,t.timeStamp-this.lastTouchMoveTime):16,r=e-this.lastMouseX,g=i-this.lastMouseY,h=r/a,m=g/a;this.touchPanVelocityX=this.touchPanVelocityX*.7+h*.3,this.touchPanVelocityY=this.touchPanVelocityY*.7+m*.3,this.camera.panBy(r,g)}this.lastTouchMoveTime=t.timeStamp,this.lastMouseX=e,this.lastMouseY=i}else if(t.touches.length===2){this.clearLongPressTimer();const e=this.getPinchDistance(t.touches),i=(e-this.initialPinchDistance)*.01,o=(t.touches[0].clientX+t.touches[1].clientX)/2-s.left,n=(t.touches[0].clientY+t.touches[1].clientY)/2-s.top;this.camera.zoomAtPoint(o,n,i),this.initialPinchDistance=e}});d(this,"onTouchEnd",t=>{if(this.clearLongPressTimer(),t.touches.length===0&&this.touchStartPositions.length===1){if(this.scene.isCurrentlyDrawing()){const i=this.camera.screenToWorld(this.lastMouseX,this.lastMouseY);this.scene.finishDrawing(i),this.isMouseDown=!1,this.touchStartPositions=[],this.touchIsPanning=!1;return}if(this.isResizingArea){this.scene.finishAreaResize(),this.isResizingArea=!1,this.resizeHandleType=null,this.isMouseDown=!1,this.touchStartPositions=[],this.touchIsPanning=!1;return}if(this.longPressTriggered){this.longPressTriggered=!1,this.isMouseDown=!1,this.isPanning=!1,this.touchStartPositions=[],this.touchIsPanning=!1,this.touchPanVelocityX=0,this.touchPanVelocityY=0,this.lastTouchMoveTime=0;return}const s=Date.now()-this.mouseDownTime,e=Math.sqrt(Math.pow(this.lastMouseX-this.mouseDownX,2)+Math.pow(this.lastMouseY-this.mouseDownY,2));s<300&&e<20&&this.handleClick(this.lastMouseX,this.lastMouseY,!1),this.touchIsPanning&&this.startTouchInertia()}this.isMouseDown=!1,this.isPanning=!1,this.touchStartPositions=[],this.touchIsPanning=!1,this.lastTouchMoveTime=0});d(this,"onTouchCancel",()=>{this.stopTouchInertia(),this.clearLongPressTimer(),this.longPressTriggered=!1,this.isMouseDown=!1,this.isPanning=!1,this.touchStartPositions=[],this.touchIsPanning=!1,this.touchPanVelocityX=0,this.touchPanVelocityY=0,this.lastTouchMoveTime=0});this.canvas=t,this.camera=s,this.scene=e,this.setupEventListeners()}dispose(){this.stopTouchInertia(),this.canvas.removeEventListener("mousedown",this.onMouseDown),this.canvas.removeEventListener("mousemove",this.onMouseMove),this.canvas.removeEventListener("mouseup",this.onMouseUp),this.canvas.removeEventListener("mouseleave",this.onMouseLeave),this.canvas.removeEventListener("wheel",this.onWheel),this.canvas.removeEventListener("contextmenu",this.onContextMenu),this.canvas.removeEventListener("touchstart",this.onTouchStart),this.canvas.removeEventListener("touchmove",this.onTouchMove),this.canvas.removeEventListener("touchend",this.onTouchEnd),this.canvas.removeEventListener("touchcancel",this.onTouchCancel),document.removeEventListener("keydown",this.onKeyDown,!0),this.clearLongPressTimer()}setupEventListeners(){this.canvas.addEventListener("mousedown",this.onMouseDown),this.canvas.addEventListener("mousemove",this.onMouseMove),this.canvas.addEventListener("mouseup",this.onMouseUp),this.canvas.addEventListener("mouseleave",this.onMouseLeave),this.canvas.addEventListener("wheel",this.onWheel,{passive:!1}),this.canvas.addEventListener("contextmenu",this.onContextMenu),this.canvas.addEventListener("touchstart",this.onTouchStart,{passive:!1}),this.canvas.addEventListener("touchmove",this.onTouchMove,{passive:!1}),this.canvas.addEventListener("touchend",this.onTouchEnd),this.canvas.addEventListener("touchcancel",this.onTouchCancel),document.addEventListener("keydown",this.onKeyDown,!0)}getOrderedAgents(t){const s=Array.from(t.values()),e=new Set(s.map(f=>f.id)),o=_t(Vt.AGENT_ORDER,[]).filter(f=>e.has(f)),c=s.filter(f=>!o.includes(f.id)).sort((f,l)=>(f.createdAt||0)-(l.createdAt||0)).map(f=>f.id),a=[...o,...c],r=new Map(s.map(f=>[f.id,f])),g=a.map(f=>r.get(f)).filter(f=>f!==void 0),h=new Map;for(const f of g){const l=M.getAreaForAgent(f.id),u=(l==null?void 0:l.id)||null;h.has(u)||h.set(u,{area:l?{name:l.name}:null,agents:[]}),h.get(u).agents.push(f)}const m=Array.from(h.values());return m.sort((f,l)=>{var u,p;return!f.area&&l.area?1:f.area&&!l.area?-1:!f.area&&!l.area?0:(((u=f.area)==null?void 0:u.name)||"").localeCompare(((p=l.area)==null?void 0:p.name)||"")}),m.flatMap(f=>f.agents)}startTouchInertia(){if(Math.hypot(this.touchPanVelocityX,this.touchPanVelocityY)<F.TOUCH_INERTIA_MIN_SPEED)return;this.stopTouchInertia();let s=this.touchPanVelocityX,e=this.touchPanVelocityY,i=performance.now();const o=n=>{const c=Math.max(1,n-i);i=n,this.camera.panBy(s*c,e*c);const a=Math.pow(F.TOUCH_INERTIA_DECAY,c/(1e3/60));if(s*=a,e*=a,Math.hypot(s,e)<F.TOUCH_INERTIA_MIN_SPEED){this.touchInertiaFrameId=null,this.touchPanVelocityX=0,this.touchPanVelocityY=0;return}this.touchInertiaFrameId=requestAnimationFrame(o)};this.touchInertiaFrameId=requestAnimationFrame(o)}stopTouchInertia(){this.touchInertiaFrameId!==null&&(cancelAnimationFrame(this.touchInertiaFrameId),this.touchInertiaFrameId=null)}clearLongPressTimer(){this.longPressTimer&&(clearTimeout(this.longPressTimer),this.longPressTimer=null)}handleTouchLongPress(t,s){const e=this.canvas.getBoundingClientRect(),i=t-e.left,o=s-e.top,n=this.camera.screenToWorld(i,o),c=this.scene.getAgentAtScreenPos(i,o),a=this.scene.getBuildingAtScreenPos(i,o),r=this.scene.getAreaAtScreenPos(i,o);if(M.getState().selectedAgentIds.size>0&&!c&&!a){this.scene.handleMoveCommand({x:n.x,z:n.z}),this.scene.createMoveOrderEffect({x:n.x,z:n.z});return}let h=null;c?h={type:"agent",id:c.id}:a?h={type:"building",id:a.id}:r?h={type:"area",id:r.id}:h={type:"ground"},this.scene.handleContextMenu({x:t,y:s},{x:n.x,z:n.z},h)}getPinchDistance(t){return Math.sqrt(Math.pow(t[0].clientX-t[1].clientX,2)+Math.pow(t[0].clientY-t[1].clientY,2))}handleClick(t,s,e){const i=this.scene.getAgentAtScreenPos(t,s),o=this.scene.getBuildingAtScreenPos(t,s),n=Date.now();if(console.log("[2D Scene] handleClick",{agentId:i==null?void 0:i.id,buildingId:o==null?void 0:o.id,shiftKey:e}),i)this.lastClickTarget===i.id&&n-this.lastClickTime<this.doubleClickDelay?(window.innerWidth<=768?M.openTerminalOnMobile(i.id):(M.selectAgent(i.id),M.setTerminalOpen(!0)),this.scene.handleAgentDoubleClick(i.id),this.lastClickTime=0,this.lastClickTarget=null):(this.scene.handleAgentClick(i.id,e),this.lastClickTime=n,this.lastClickTarget=i.id);else if(o)if(this.lastClickTarget===o.id&&n-this.lastClickTime<this.doubleClickDelay)this.scene.handleBuildingDoubleClick(o.id),this.lastClickTime=0,this.lastClickTarget=null;else{const c=this.canvas.getBoundingClientRect();this.scene.handleBuildingClick(o.id,{x:t+c.left,y:s+c.top}),this.lastClickTime=n,this.lastClickTarget=o.id}else{const c=this.scene.getAreaFolderIconAtScreenPos(t,s);if(c){this.scene.handleAreaFolderClick(c.areaId,c.folderPath),this.lastClickTime=0,this.lastClickTarget=null;return}const a=this.scene.getAreaAtScreenPos(t,s),r=this.camera.screenToWorld(t,s);if(a){const g=`area:${a.id}`;this.lastClickTarget===g&&n-this.lastClickTime<this.doubleClickDelay?(this.scene.selectArea(a.id),this.scene.handleAreaDoubleClick(a.id),this.lastClickTime=0,this.lastClickTarget=null):(this.scene.selectArea(a.id),this.lastClickTime=n,this.lastClickTarget=g)}else this.scene.selectArea(null),this.scene.handleGroundClick({x:r.x,z:r.z}),this.lastClickTime=0,this.lastClickTarget=null}}focusCameraOnAgent(t){const s=this.scene.getAgentData(t);s&&this.camera.focusOn(s.position.x,s.position.z,50)}focusCameraOnBuilding(t){const s=this.scene.getBuildingData(t);s&&this.camera.focusOn(s.position.x,s.position.z,40)}getSelectionBox(){return this.selectionBox}};d(F,"ENABLE_DOUBLE_CLICK_CAMERA_FOCUS",!1),d(F,"TOUCH_LONG_PRESS_DURATION",500),d(F,"TOUCH_DRAG_THRESHOLD",5),d(F,"TOUCH_INERTIA_DECAY",.9),d(F,"TOUCH_INERTIA_MIN_SPEED",.02);let Mt=F;class he{constructor(t,s){d(this,"viewportWidth");d(this,"viewportHeight");d(this,"posX",0);d(this,"posZ",0);d(this,"zoom",30);d(this,"minZoom",5);d(this,"maxZoom",150);d(this,"targetPosX",0);d(this,"targetPosZ",0);d(this,"targetZoom",30);d(this,"panSmoothing",.12);d(this,"zoomSmoothing",.15);d(this,"focusSmoothing",.08);d(this,"currentPanSmoothing",.12);d(this,"panLimitEnabled",!0);d(this,"panLimitRadius",50);d(this,"edgePanEnabled",!1);d(this,"edgePanMargin",40);d(this,"edgePanSpeed",8);d(this,"mouseScreenX",0);d(this,"mouseScreenY",0);d(this,"isAnimating",!1);d(this,"animationCallback",null);d(this,"saveTimeout",null);d(this,"needsSave",!1);this.viewportWidth=t,this.viewportHeight=s,this.loadState()}loadState(){const t=Ut();t&&(this.posX=t.posX,this.posZ=t.posZ,this.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,t.zoom)),this.targetPosX=this.posX,this.targetPosZ=this.posZ,this.targetZoom=this.zoom)}scheduleSave(){this.needsSave=!0,!this.saveTimeout&&(this.saveTimeout=setTimeout(()=>{this.needsSave&&(Bt(this.posX,this.posZ,this.zoom),this.needsSave=!1),this.saveTimeout=null},500))}saveState(){this.saveTimeout&&(clearTimeout(this.saveTimeout),this.saveTimeout=null),Bt(this.posX,this.posZ,this.zoom),this.needsSave=!1}setViewportSize(t,s){this.viewportWidth=t,this.viewportHeight=s}getViewportSize(){return{width:this.viewportWidth,height:this.viewportHeight}}getPosition(){return{x:this.posX,z:this.posZ}}setPosition(t,s){const e=this.clampPosition(t,s);this.posX=e.x,this.posZ=e.z,this.targetPosX=e.x,this.targetPosZ=e.z}panTo(t,s,e=!0){const i=this.clampPosition(t,s);e?(this.targetPosX=i.x,this.targetPosZ=i.z,this.currentPanSmoothing=this.panSmoothing):(this.posX=i.x,this.posZ=i.z,this.targetPosX=i.x,this.targetPosZ=i.z)}panBy(t,s){const e=t/this.zoom,i=s/this.zoom,o=this.posX-e,n=this.posZ-i,c=this.clampPosition(o,n);this.posX=c.x,this.posZ=c.z,this.targetPosX=c.x,this.targetPosZ=c.z}focusOn(t,s,e,i){this.isAnimating=!0,this.animationCallback=i||null,this.currentPanSmoothing=this.focusSmoothing;const o=this.clampPosition(t,s);this.targetPosX=o.x,this.targetPosZ=o.z,e!==void 0&&(this.targetZoom=Math.max(this.minZoom,Math.min(this.maxZoom,e)))}focusOnBounds(t,s,e,i,o=2){const n=(t+s)/2,c=(e+i)/2,a=s-t+o*2,r=i-e+o*2,g=this.viewportWidth/a,h=this.viewportHeight/r,m=Math.min(g,h)*.9;this.focusOn(n,c,Math.max(this.minZoom,Math.min(this.maxZoom,m)))}getZoom(){return this.zoom}getZoomLimits(){return{min:this.minZoom,max:this.maxZoom}}setZoom(t){this.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,t)),this.targetZoom=this.zoom}setZoomLimits(t,s){this.minZoom=t,this.maxZoom=s,this.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.zoom)),this.targetZoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.targetZoom))}zoomTo(t,s=!0){const e=Math.max(this.minZoom,Math.min(this.maxZoom,t));s?this.targetZoom=e:(this.zoom=e,this.targetZoom=e)}zoomAtPoint(t,s,e,i=!0){const o=Math.max(this.minZoom,Math.min(this.maxZoom,this.targetZoom*(1+e)));if(i){const n=this.screenToWorld(t,s);this.targetZoom=o;const c=this.viewportWidth/2,a=this.viewportHeight/2,r=this.targetPosX+(t-c)/o,g=this.targetPosZ+(s-a)/o,h=n.x-r,m=n.z-g,f=this.clampPosition(this.targetPosX+h,this.targetPosZ+m);this.targetPosX=f.x,this.targetPosZ=f.z}else{const n=this.screenToWorld(t,s);this.zoom=o,this.targetZoom=o;const c=this.screenToWorld(t,s),a=this.clampPosition(this.posX+n.x-c.x,this.posZ+n.z-c.z);this.posX=a.x,this.posZ=a.z,this.targetPosX=a.x,this.targetPosZ=a.z}}setPanLimits(t,s){this.panLimitEnabled=t,s!==void 0&&(this.panLimitRadius=s)}getPanLimits(){return{enabled:this.panLimitEnabled,radius:this.panLimitRadius}}clampPosition(t,s){if(!this.panLimitEnabled)return{x:t,z:s};const e=Math.max(-this.panLimitRadius,Math.min(this.panLimitRadius,t)),i=Math.max(-this.panLimitRadius,Math.min(this.panLimitRadius,s));return{x:e,z:i}}setEdgePanning(t,s,e){this.edgePanEnabled=t,s!==void 0&&(this.edgePanMargin=s),e!==void 0&&(this.edgePanSpeed=e)}getEdgePanSettings(){return{enabled:this.edgePanEnabled,margin:this.edgePanMargin,speed:this.edgePanSpeed}}setMousePosition(t,s){this.mouseScreenX=t,this.mouseScreenY=s}processEdgePanning(t){if(!this.edgePanEnabled)return;let s=0,e=0;if(this.mouseScreenX<this.edgePanMargin?s=-1*(1-this.mouseScreenX/this.edgePanMargin):this.mouseScreenX>this.viewportWidth-this.edgePanMargin&&(s=1*(1-(this.viewportWidth-this.mouseScreenX)/this.edgePanMargin)),this.mouseScreenY<this.edgePanMargin?e=-1*(1-this.mouseScreenY/this.edgePanMargin):this.mouseScreenY>this.viewportHeight-this.edgePanMargin&&(e=1*(1-(this.viewportHeight-this.mouseScreenY)/this.edgePanMargin)),s!==0||e!==0){const i=this.edgePanSpeed*t,o=this.targetPosX+s*i,n=this.targetPosZ+e*i,c=this.clampPosition(o,n);this.targetPosX=c.x,this.targetPosZ=c.z}}screenToWorld(t,s){const e=this.viewportWidth/2,i=this.viewportHeight/2,o=this.posX+(t-e)/this.zoom,n=this.posZ+(s-i)/this.zoom;return{x:o,z:n}}worldToScreen(t,s){const e=this.viewportWidth/2,i=this.viewportHeight/2,o=e+(t-this.posX)*this.zoom,n=i+(s-this.posZ)*this.zoom;return{x:o,y:n}}getVisibleBounds(){const t=this.viewportWidth/2/this.zoom,s=this.viewportHeight/2/this.zoom;return{minX:this.posX-t,maxX:this.posX+t,minZ:this.posZ-s,maxZ:this.posZ+s}}isVisible(t,s,e=0){const i=this.getVisibleBounds();return t>=i.minX-e&&t<=i.maxX+e&&s>=i.minZ-e&&s<=i.maxZ+e}update(t=1/60){this.processEdgePanning(t);const s=1-Math.exp(-this.currentPanSmoothing*60*t),e=1-Math.exp(-this.zoomSmoothing*60*t),i=this.posX,o=this.posZ,n=this.zoom,c=.001,a=.01,r=Math.abs(this.targetPosX-this.posX)<c,g=Math.abs(this.targetPosZ-this.posZ)<c,h=Math.abs(this.targetZoom-this.zoom)<a;r?this.posX=this.targetPosX:this.posX+=(this.targetPosX-this.posX)*s,g?this.posZ=this.targetPosZ:this.posZ+=(this.targetPosZ-this.posZ)*s,h?this.zoom=this.targetZoom:this.zoom+=(this.targetZoom-this.zoom)*e;const m=r&&g,f=h;this.isAnimating&&m&&f&&(this.isAnimating=!1,this.currentPanSmoothing=this.panSmoothing,this.animationCallback&&(this.animationCallback(),this.animationCallback=null));const l=Math.abs(this.posX-i)>1e-4||Math.abs(this.posZ-o)>1e-4||Math.abs(this.zoom-n)>1e-4;return l&&this.scheduleSave(),l}isCurrentlyAnimating(){return Math.abs(this.posX-this.targetPosX)>.01||Math.abs(this.posZ-this.targetPosZ)>.01||Math.abs(this.zoom-this.targetZoom)>.1}applyTransform(t){t.save(),t.translate(this.viewportWidth/2,this.viewportHeight/2),t.scale(this.zoom,this.zoom),t.translate(-this.posX,-this.posZ)}restoreTransform(t){t.restore()}}const E={moveOrder:{primary:"#4aff9e",secondary:"#2ad87e"},bossLine:{primary:"#ffd700",secondary:"#ffaa00",glow:"rgba(255, 215, 0, 0.4)"},toolBubble:{background:["#2a3040","#1a2030"],border:"#4a9eff"}},Y=class Y{constructor(){d(this,"moveOrderEffects",[]);d(this,"toolBubbles",new Map);d(this,"statusParticles",[]);d(this,"animationTime",0)}update(t){const s=performance.now();this.animationTime+=t,this.moveOrderEffects=this.moveOrderEffects.filter(e=>s-e.startTime<e.duration);for(const[e,i]of this.toolBubbles)s-i.startTime>=i.duration&&this.toolBubbles.delete(e);this.statusParticles=this.statusParticles.filter(e=>s-e.startTime<e.duration);for(const e of this.statusParticles)e.position.x+=e.velocity.x*t,e.position.z+=e.velocity.z*t,e.velocity.z+=t*.5}hasActiveEffects(){return this.moveOrderEffects.length>0||this.toolBubbles.size>0||this.statusParticles.length>0}render(t,s){const e=performance.now();for(const i of this.moveOrderEffects)this.renderMoveOrderEffect(t,s,i,e);for(const i of this.statusParticles)this.renderStatusParticle(t,s,i,e);for(const i of this.toolBubbles.values())this.renderToolBubble(t,s,i,e)}addMoveOrderEffect(t){this.moveOrderEffects.push({position:{...t},startTime:performance.now(),duration:1500})}renderMoveOrderEffect(t,s,e,i){const o=Math.min(1,Math.max(0,(i-e.startTime)/e.duration)),n=s.getZoom(),c=Math.pow(1-o,1.5);s.applyTransform(t);const{x:a,z:r}=e.position,g=3;for(let y=0;y<g;y++){const x=Math.max(0,Math.min(1,o*1.5-y*.15));if(x<=0)continue;const S=c*(1-x)*(1-y*.25),b=.3+x*2,P=Math.max(1,3-x*2)/n,v=t.createRadialGradient(a,r,b*.8,a,r,b*1.2);v.addColorStop(0,this.hexToRgba(E.moveOrder.primary,S)),v.addColorStop(1,this.hexToRgba(E.moveOrder.secondary,S*.5)),t.strokeStyle=this.hexToRgba(E.moveOrder.primary,S*.3),t.lineWidth=P*3,t.beginPath(),t.arc(a,r,b,0,Math.PI*2),t.stroke(),t.strokeStyle=v,t.lineWidth=P,t.beginPath(),t.arc(a,r,b,0,Math.PI*2),t.stroke()}const h=c*.8,m=.25,f=this.animationTime*2;t.save(),t.translate(a,r),t.rotate(f),t.strokeStyle=this.hexToRgba(E.moveOrder.primary,h),t.lineWidth=2/n,t.lineCap="round";const l=m*.3,u=m;t.beginPath(),t.moveTo(0,-l),t.lineTo(0,-u),t.moveTo(0,l),t.lineTo(0,u),t.moveTo(-l,0),t.lineTo(-u,0),t.moveTo(l,0),t.lineTo(u,0),t.stroke(),t.restore();const p=i*.01%1,T=.06+Math.sin(p*Math.PI*2)*.02,w=t.createRadialGradient(a,r,0,a,r,T*2);w.addColorStop(0,this.hexToRgba(E.moveOrder.primary,h)),w.addColorStop(.5,this.hexToRgba(E.moveOrder.secondary,h*.8)),w.addColorStop(1,this.hexToRgba(E.moveOrder.secondary,0)),t.fillStyle=w,t.beginPath(),t.arc(a,r,T*2,0,Math.PI*2),t.fill(),s.restoreTransform(t)}addToolBubble(t,s,e){this.toolBubbles.set(t,{agentId:t,position:{...s},text:e,startTime:performance.now(),duration:4e3})}updateToolBubblePosition(t,s){const e=this.toolBubbles.get(t);e&&(e.position={...s})}removeToolBubble(t){this.toolBubbles.delete(t)}renderToolBubble(t,s,e,i){const o=(i-e.startTime)/e.duration;let n=1;o<.1?n=this.easeOutCubic(o/.1):o>.75&&(n=this.easeInCubic((1-o)/.25));const c=Math.sin(o*Math.PI*4)*.03+o*.15,a=s.worldToScreen(e.position.x,e.position.z-1.2-c),r=Math.max(11,Math.min(14,12*s.getZoom()));t.font=`bold ${r}px "Segoe UI", Arial, sans-serif`;const h=t.measureText(e.text).width,m=10,f=h+m*2,l=r+m*1.5,u=6,p=a.x-f/2,T=a.y-l/2;t.fillStyle=`rgba(0, 0, 0, ${.3*n})`,t.beginPath(),this.roundedRect(t,p+2,T+3,f,l,u),t.fill();const w=t.createLinearGradient(p,T,p,T+l);w.addColorStop(0,this.hexToRgba(E.toolBubble.background[0],n*.95)),w.addColorStop(1,this.hexToRgba(E.toolBubble.background[1],n*.98)),t.fillStyle=w,t.beginPath(),this.roundedRect(t,p,T,f,l,u),t.fill();const y=t.createLinearGradient(p+u,T+1,p+f-u,T+1);y.addColorStop(0,"transparent"),y.addColorStop(.2,`rgba(255, 255, 255, ${n*.15})`),y.addColorStop(.8,`rgba(255, 255, 255, ${n*.15})`),y.addColorStop(1,"transparent"),t.strokeStyle=y,t.lineWidth=1,t.beginPath(),t.moveTo(p+u,T+1),t.lineTo(p+f-u,T+1),t.stroke();const x=t.createLinearGradient(p,T,p,T+l);x.addColorStop(0,this.hexToRgba(E.toolBubble.border,n*.8)),x.addColorStop(1,this.hexToRgba(E.toolBubble.border,n*.5)),t.strokeStyle=x,t.lineWidth=1.5,t.beginPath(),this.roundedRect(t,p,T,f,l,u),t.stroke();const S=8,b=6,P=a.x,v=T+l;t.fillStyle=this.hexToRgba(E.toolBubble.background[1],n*.98),t.beginPath(),t.moveTo(P-S/2,v),t.lineTo(P+S/2,v),t.lineTo(P,v+b),t.closePath(),t.fill(),t.strokeStyle=this.hexToRgba(E.toolBubble.border,n*.6),t.lineWidth=1.5,t.beginPath(),t.moveTo(P-S/2-.5,v),t.lineTo(P,v+b),t.lineTo(P+S/2+.5,v),t.stroke();const k=r*.9;t.font=`${k}px "Segoe UI Emoji", "Apple Color Emoji", serif`,t.fillStyle=this.hexToRgba("#ffcc00",n),t.textAlign="left",t.textBaseline="middle",t.font=`bold ${r}px "Segoe UI", Arial, sans-serif`,t.fillStyle=`rgba(255, 255, 255, ${n})`,t.textAlign="center",t.textBaseline="middle",t.fillText(e.text,a.x,a.y)}renderBossLine(t,s,e,i){s.applyTransform(t);const o=s.getZoom(),n=i.x-e.x,c=i.z-e.z,a=Math.sqrt(n*n+c*c),r=Math.atan2(c,n),g=t.createLinearGradient(e.x,e.z,i.x,i.z);g.addColorStop(0,this.hexToRgba(E.bossLine.primary,.7)),g.addColorStop(.5,this.hexToRgba(E.bossLine.secondary,.5)),g.addColorStop(1,this.hexToRgba(E.bossLine.primary,.7)),t.strokeStyle=E.bossLine.glow,t.lineWidth=6/o,t.lineCap="round",t.beginPath(),t.moveTo(e.x,e.z),t.lineTo(i.x,i.z),t.stroke(),t.strokeStyle=g,t.lineWidth=2.5/o,t.setLineDash([8/o,4/o]),t.lineDashOffset=0,t.beginPath(),t.moveTo(e.x,e.z),t.lineTo(i.x,i.z),t.stroke(),t.setLineDash([]);const h=Math.max(2,Math.floor(a/1.5)),m=.06;for(let p=0;p<=h;p++){const T=p/h,w=e.x+n*T,y=e.z+c*T,x=.35;t.fillStyle=this.hexToRgba(E.bossLine.primary,x),t.beginPath(),t.arc(w,y,m,0,Math.PI*2),t.fill()}const f=.2,l=Math.PI/6,u={x:i.x-Math.cos(r)*.3,z:i.z-Math.sin(r)*.3};t.fillStyle=this.hexToRgba(E.bossLine.primary,.8),t.beginPath(),t.moveTo(u.x,u.z),t.lineTo(u.x-Math.cos(r-l)*f,u.z-Math.sin(r-l)*f),t.lineTo(u.x-Math.cos(r+l)*f,u.z-Math.sin(r+l)*f),t.closePath(),t.fill(),s.restoreTransform(t)}addStatusChangeEffect(t,s){for(let i=0;i<8;i++){const o=i/8*Math.PI*2+Math.random()*.5,n=.5+Math.random()*.8;this.statusParticles.push({position:{...t},velocity:{x:Math.cos(o)*n,z:Math.sin(o)*n-1},color:s,size:.05+Math.random()*.04,startTime:performance.now(),duration:800+Math.random()*400})}}renderStatusParticle(t,s,e,i){const o=(i-e.startTime)/e.duration,n=this.easeOutCubic(1-o),c=e.size*(1-o*.5);s.applyTransform(t);const{x:a,z:r}=e.position,g=t.createRadialGradient(a,r,0,a,r,c*1.5);g.addColorStop(0,this.hexToRgba("#ffffff",n)),g.addColorStop(.2,this.hexToRgba(e.color,n)),g.addColorStop(.6,this.hexToRgba(e.color,n*.4)),g.addColorStop(1,this.hexToRgba(e.color,0)),t.fillStyle=g,t.beginPath(),t.arc(a,r,c*1.5,0,Math.PI*2),t.fill(),s.restoreTransform(t)}addSelectionSparkle(t,s){for(let e=0;e<4;e++){const i=Math.random()*Math.PI*2,o=.3+Math.random()*.2;this.statusParticles.push({position:{x:t.x+Math.cos(i)*o,z:t.z+Math.sin(i)*o},velocity:{x:Math.cos(i)*.3,z:-.5-Math.random()*.3},color:s,size:.04+Math.random()*.03,startTime:performance.now(),duration:500+Math.random()*300})}}roundedRect(t,s,e,i,o,n){t.moveTo(s+n,e),t.lineTo(s+i-n,e),t.arcTo(s+i,e,s+i,e+n,n),t.lineTo(s+i,e+o-n),t.arcTo(s+i,e+o,s+i-n,e+o,n),t.lineTo(s+n,e+o),t.arcTo(s,e+o,s,e+o-n,n),t.lineTo(s,e+n),t.arcTo(s,e,s+n,e,n)}hexToRgba(t,s){const e=Math.round(s*100)/100,i=`${t}|${e}`;let o=Y.rgbaCache.get(i);if(o)return o;let n,c,a;if(t.startsWith("rgba")||t.startsWith("rgb")){const g=t.match(/[\d.]+/g);if(g)return n=parseInt(g[0]),c=parseInt(g[1]),a=parseInt(g[2]),o=`rgba(${n}, ${c}, ${a}, ${e})`,Y.rgbaCache.size>=Y.RGBA_CACHE_MAX&&Y.rgbaCache.clear(),Y.rgbaCache.set(i,o),o}const r=t.replace("#","");return r.length===3?(n=parseInt(r[0]+r[0],16),c=parseInt(r[1]+r[1],16),a=parseInt(r[2]+r[2],16)):(n=parseInt(r.slice(0,2),16),c=parseInt(r.slice(2,4),16),a=parseInt(r.slice(4,6),16)),o=`rgba(${n}, ${c}, ${a}, ${e})`,Y.rgbaCache.size>=Y.RGBA_CACHE_MAX&&Y.rgbaCache.clear(),Y.rgbaCache.set(i,o),o}easeOutCubic(t){return 1-Math.pow(1-t,3)}easeInCubic(t){return t*t*t}clear(){this.moveOrderEffects=[],this.toolBubbles.clear(),this.statusParticles=[]}};d(Y,"rgbaCache",new Map),d(Y,"RGBA_CACHE_MAX",256);let wt=Y;const G=class G{constructor(t){d(this,"canvas");d(this,"ctx");d(this,"renderer");d(this,"input");d(this,"camera");d(this,"effects");d(this,"staticCanvas");d(this,"staticCtx");d(this,"staticRenderer");d(this,"staticDirty",!0);d(this,"needsRender",!0);d(this,"agents",new Map);d(this,"buildings",new Map);d(this,"areas",new Map);d(this,"selectedAgentIds",new Set);d(this,"selectedBuildingIds",new Set);d(this,"animationFrameId",null);d(this,"lastFrameTime",0);d(this,"lastAnimationTime",0);d(this,"lastRenderTime",0);d(this,"isRunning",!1);d(this,"fpsLimit",0);d(this,"frameInterval",0);d(this,"currentDpr",1);d(this,"movements",new Map);d(this,"callbacks",{});d(this,"scale2d",.7);d(this,"showTaskLabels",!0);d(this,"showGrid",!0);d(this,"gridSize",30);d(this,"gridSpacing",2);d(this,"drawingTool",null);d(this,"isDrawing",!1);d(this,"drawStartPos",null);d(this,"drawCurrentPos",null);d(this,"sortedAreasAsc",[]);d(this,"sortedAreasDesc",[]);d(this,"areasSortDirty",!0);d(this,"selectedAreaId",null);d(this,"isResizingArea",!1);d(this,"resizeHandleType",null);d(this,"resizeStartPos",null);d(this,"resizeOriginalArea",null);d(this,"areaDragAgentStartPositions",new Map);d(this,"areaDragBuildingStartPositions",new Map);d(this,"handleResize",()=>{const t=this.canvas.parentElement;if(!t)return;let s=Math.min(window.devicePixelRatio||1,G.MAX_DPR);const e=t.clientWidth,i=t.clientHeight,o=4e6;e*i*s*s>o&&(s=Math.sqrt(o/(e*i))),this.currentDpr=s,this.canvas.width=e*s,this.canvas.height=i*s,this.canvas.style.width=`${e}px`,this.canvas.style.height=`${i}px`,this.staticCanvas.width=e*s,this.staticCanvas.height=i*s,this.ctx.setTransform(1,0,0,1,0,0),this.ctx.scale(s,s),this.staticCtx.setTransform(1,0,0,1,0,0),this.staticCtx.scale(s,s),this.camera.setViewportSize(e,i),this.staticDirty=!0,this.needsRender=!0});d(this,"animate",()=>{if(!this.isRunning)return;this.animationFrameId=requestAnimationFrame(this.animate);const t=performance.now(),s=(t-this.lastFrameTime)/1e3;this.lastFrameTime=t,this.camera.update(s);const e=this.movements.size>0,i=this.effects.hasActiveEffects(),o=this.isDrawing||this.isResizingArea||this.input.getSelectionBox()!==null,n=this.hasWorkingAgents(),c=e||i||o||this.camera.isCurrentlyAnimating(),a=this.hasCameraChanged();if(a&&(this.staticDirty=!0,this.needsRender=!0),(c||n)&&(this.needsRender=!0),!this.needsRender&&this.agents.size===0)return;const r=1e3/G.IDLE_FPS_LIMIT,g=1e3/G.WORKING_FPS_LIMIT;let h;if(c||a?h=this.frameInterval:n?h=this.frameInterval>0?Math.min(this.frameInterval,g):g:h=this.frameInterval>0?Math.min(this.frameInterval,r):r,h>0){if(t-this.lastRenderTime<h)return;this.lastRenderTime=t}jt.tick();const m=(t-this.lastAnimationTime)/1e3;this.lastAnimationTime=t,this.updateMovements(t),(c||n)&&(this.effects.update(m),this.renderer.update(m),this.staticRenderer.update(m)),this.render(),!c&&!n&&(this.needsRender=!1)});d(this,"lastCamX",NaN);d(this,"lastCamZ",NaN);d(this,"lastCamZoom",NaN);this.canvas=t;const s=t.getContext("2d");if(!s)throw new Error("Failed to get 2D context");this.ctx=s,this.staticCanvas=document.createElement("canvas");const e=this.staticCanvas.getContext("2d");if(!e)throw new Error("Failed to get static 2D context");this.staticCtx=e,this.camera=new he(t.width,t.height),this.renderer=new Ot(s,this.camera),this.staticRenderer=new Ot(e,this.camera),this.effects=new wt,this.input=new Mt(t,this.camera,this),this.handleResize(),window.addEventListener("resize",this.handleResize)}start(){this.isRunning||(this.isRunning=!0,this.lastFrameTime=performance.now(),this.lastAnimationTime=this.lastFrameTime,this.animate())}stop(){this.isRunning=!1,this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null)}dispose(){this.stop(),this.camera.saveState(),window.removeEventListener("resize",this.handleResize),this.input.dispose(),this.agents.clear(),this.buildings.clear(),this.areas.clear(),this.invalidateAreaSort(),this.staticCanvas.width=0,this.staticCanvas.height=0}hasCameraChanged(){const t=this.camera.getPosition(),s=this.camera.getZoom(),e=Math.round(t.x*1e3),i=Math.round(t.z*1e3),o=Math.round(s*1e3);return e!==this.lastCamX||i!==this.lastCamZ||o!==this.lastCamZoom?(this.lastCamX=e,this.lastCamZ=i,this.lastCamZoom=o,!0):!1}markStaticDirty(){this.staticDirty=!0,this.needsRender=!0}markDirty(){this.needsRender=!0}invalidateAreaSort(){this.areasSortDirty=!0}getSortedAreasAsc(){return this.areasSortDirty&&(this.sortedAreasAsc=Array.from(this.areas.values()).sort((t,s)=>t.zIndex-s.zIndex),this.sortedAreasDesc=Array.from(this.areas.values()).sort((t,s)=>s.zIndex-t.zIndex),this.areasSortDirty=!1),this.sortedAreasAsc}getSortedAreasDesc(){return this.areasSortDirty&&(this.sortedAreasAsc=Array.from(this.areas.values()).sort((t,s)=>t.zIndex-s.zIndex),this.sortedAreasDesc=Array.from(this.areas.values()).sort((t,s)=>s.zIndex-t.zIndex),this.areasSortDirty=!1),this.sortedAreasDesc}hasWorkingAgents(){for(const t of this.agents.values())if(t.status==="working")return!0;return!1}isPointVisible(t,s,e=0){return this.camera.isVisible(t,s,e)}isAreaVisible(t){const s=this.camera.getVisibleBounds(),e=2;if(t.type==="rectangle"&&"width"in t.size){const i=t.position.x-t.size.width/2,o=t.position.x+t.size.width/2,n=t.position.z-t.size.height/2,c=t.position.z+t.size.height/2;return!(o<s.minX-e||i>s.maxX+e||c<s.minZ-e||n>s.maxZ+e)}if(t.type==="circle"&&"radius"in t.size){const i=t.size.radius;return!(t.position.x+i<s.minX-e||t.position.x-i>s.maxX+e||t.position.z+i<s.minZ-e||t.position.z-i>s.maxZ+e)}return!0}updateMovements(t){const s=[];for(const[e,i]of this.movements){const o=t-i.startTime,n=this.agents.get(e);if(!n){s.push(e);continue}const c=Math.min(1,o/i.duration);n.position.x=i.startPos.x+(i.endPos.x-i.startPos.x)*c,n.position.z=i.startPos.z+(i.endPos.z-i.startPos.z)*c;const a=Math.hypot(i.endPos.x-n.position.x,i.endPos.z-n.position.z);(c>=1||a<=G.AGENT_MOVE_SNAP_DISTANCE)&&(n.position.x=i.endPos.x,n.position.z=i.endPos.z,s.push(e))}for(const e of s)this.movements.delete(e)}render(){const{width:t,height:s}=this.canvas,e=this.currentDpr,i=t/e,o=s/e;if(this.staticDirty){this.staticCtx.clearRect(0,0,i,o),this.staticRenderer.drawGround(this.gridSize),this.showGrid&&this.staticRenderer.drawGrid(this.gridSize,this.gridSpacing);for(const a of this.getSortedAreasAsc()){if(!this.isAreaVisible(a))continue;const r=a.id===this.selectedAreaId;this.staticRenderer.drawArea(a,r)}for(const a of this.buildings.values()){if(!this.isPointVisible(a.position.x,a.position.z,2))continue;const r=this.selectedBuildingIds.has(a.id);this.staticRenderer.drawBuilding(a,r)}this.staticDirty=!1}this.ctx.save(),this.ctx.setTransform(1,0,0,1,0,0),this.ctx.drawImage(this.staticCanvas,0,0),this.ctx.restore(),this.renderBossLines(),this.renderer.beginAgentFrame();for(const a of this.agents.values()){if(!this.isPointVisible(a.position.x,a.position.z,2.5))continue;const r=this.selectedAgentIds.has(a.id),g=this.movements.has(a.id);this.renderer.drawAgent(a,r,g,this.scale2d,this.showTaskLabels)}this.effects.render(this.ctx,this.camera);const n=this.input.getSelectionBox();n&&this.renderer.drawSelectionBox(n.start,n.end);const c=this.getDrawingPreview();c&&this.renderer.drawAreaPreview(c.start,c.end,c.tool)}renderBossLines(){var s;const t=new Set;for(const e of this.selectedAgentIds){const i=this.agents.get(e);if(i){if(i.isBoss&&i.subordinateIds)for(const o of i.subordinateIds){const n=this.agents.get(o);n&&(this.isPointVisible(i.position.x,i.position.z,2.5)||this.isPointVisible(n.position.x,n.position.z,2.5))&&(t.add(`${i.id}:${n.id}`),this.effects.renderBossLine(this.ctx,this.camera,i.position,n.position))}if(i.bossId){const o=this.agents.get(i.bossId),n=o?`${o.id}:${i.id}`:null,c=!(o!=null&&o.subordinateIds)||o.subordinateIds.includes(i.id);o&&n&&c&&!t.has(n)&&(this.isPointVisible(o.position.x,o.position.z,2.5)||this.isPointVisible(i.position.x,i.position.z,2.5))&&(t.add(n),this.effects.renderBossLine(this.ctx,this.camera,o.position,i.position))}}}for(const e of this.selectedBuildingIds){const i=this.buildings.get(e);if(i&&i.subordinateBuildingIds&&i.subordinateBuildingIds.length>0)for(const o of i.subordinateBuildingIds){const n=this.buildings.get(o);n&&(this.isPointVisible(i.position.x,i.position.z,2)||this.isPointVisible(n.position.x,n.position.z,2))&&this.effects.renderBossLine(this.ctx,this.camera,i.position,n.position)}}for(const e of this.selectedBuildingIds)for(const i of this.buildings.values())if((s=i.subordinateBuildingIds)!=null&&s.includes(e)){for(const o of i.subordinateBuildingIds){const n=this.buildings.get(o);n&&(this.isPointVisible(i.position.x,i.position.z,2)||this.isPointVisible(n.position.x,n.position.z,2))&&this.effects.renderBossLine(this.ctx,this.camera,i.position,n.position)}break}}addAgent(t){const s=Tt[t.class],e=(s==null?void 0:s.color)??16777215;this.agents.set(t.id,{id:t.id,position:{x:t.position.x,z:t.position.z},name:t.name,class:t.class,status:t.status,isBoss:t.isBoss===!0||t.class==="boss",color:e,contextRemaining:At(t).freePercent,lastActivity:t.lastActivity,subordinateIds:t.subordinateIds,bossId:t.bossId,currentTool:t.currentTool,contextUsed:t.contextUsed,contextLimit:t.contextLimit,contextStats:t.contextStats,provider:t.provider}),this.markDirty()}startAgentMovement(t,s,e){this.movements.set(t,{startPos:{...s},endPos:{...e},startTime:performance.now(),duration:G.AGENT_MOVE_ANIMATION_DURATION_MS})}removeAgent(t){this.agents.delete(t),this.movements.delete(t),this.selectedAgentIds.delete(t),this.markDirty()}updateAgent(t,s=!0){const e=this.agents.get(t.id);if(!e){this.addAgent(t);return}const i=Tt[t.class],o=(i==null?void 0:i.color)??16777215,n=this.movements.get(t.id),c=(n==null?void 0:n.endPos)??e.position;if(Math.hypot(c.x-t.position.x,c.z-t.position.z)>G.AGENT_MOVE_SNAP_DISTANCE){const r=Math.hypot(t.position.x-e.position.x,t.position.z-e.position.z);s&&r>G.AGENT_MOVE_ANIMATION_THRESHOLD?this.startAgentMovement(t.id,e.position,{x:t.position.x,z:t.position.z}):(this.movements.delete(t.id),e.position.x=t.position.x,e.position.z=t.position.z)}e.name=t.name,e.class=t.class,e.status=t.status,e.isBoss=t.isBoss===!0||t.class==="boss",e.color=o,e.contextRemaining=At(t).freePercent,e.lastActivity=t.lastActivity,e.subordinateIds=t.subordinateIds,e.bossId=t.bossId,e.currentTool=t.currentTool,e.contextUsed=t.contextUsed,e.contextLimit=t.contextLimit,e.contextStats=t.contextStats,e.provider=t.provider,e.taskLabel=t.taskLabel,this.markDirty()}syncAgents(t){const s=new Set(t.map(i=>i.id)),e=Pt();for(const i of this.agents.keys())if(!s.has(i)||M.isAgentInArchivedArea(i))this.removeAgent(i);else if(e){const o=M.getAreaForAgent(i);dt((o==null?void 0:o.id)??null)||this.removeAgent(i)}for(const i of t)if(!M.isAgentInArchivedArea(i.id)){if(e){const o=M.getAreaForAgent(i.id);if(!dt((o==null?void 0:o.id)??null))continue}this.updateAgent(i,!0)}}addBuilding(t){this.buildings.set(t.id,{id:t.id,position:{x:t.position.x,z:t.position.z},name:t.name,style:t.style,status:t.status,color:t.color,scale:t.scale||1,subordinateBuildingIds:t.subordinateBuildingIds,gitChangesCount:t.gitChangesCount}),this.markStaticDirty()}removeBuilding(t){this.buildings.delete(t),this.selectedBuildingIds.delete(t),this.markStaticDirty()}updateBuilding(t){const s=this.buildings.get(t.id);if(!s){this.addBuilding(t);return}s.position.x=t.position.x,s.position.z=t.position.z,s.name=t.name,s.style=t.style,s.status=t.status,s.color=t.color,s.scale=t.scale||1,s.subordinateBuildingIds=t.subordinateBuildingIds,s.gitChangesCount=t.gitChangesCount,this.markStaticDirty()}syncBuildings(){this.markStaticDirty();const t=M.getState(),s=!!Pt();for(const e of this.buildings.keys()){const i=t.buildings.get(e);(!i||s&&this.isBuildingHiddenByWorkspace(i,t.areas))&&this.removeBuilding(e)}for(const e of t.buildings.values())s&&this.isBuildingHiddenByWorkspace(e,t.areas)||this.updateBuilding(e)}isBuildingHiddenByWorkspace(t,s){for(const e of s.values())if(!e.archived){if(e.type==="rectangle"&&e.width&&e.height){const i=e.width/2,o=e.height/2;if(t.position.x>=e.center.x-i&&t.position.x<=e.center.x+i&&t.position.z>=e.center.z-o&&t.position.z<=e.center.z+o)return!bt(e.id)}else if(e.type==="circle"&&e.radius){const i=t.position.x-e.center.x,o=t.position.z-e.center.z;if(i*i+o*o<=e.radius*e.radius)return!bt(e.id)}}return!1}syncAreas(){var s;const t=M.getState();this.areas.clear(),this.invalidateAreaSort(),this.markStaticDirty();for(const e of t.areas.values()){if(e.archived||!bt(e.id))continue;const i=e.directories&&e.directories.length>0,o=(s=e.logo)!=null&&s.filename?{url:Wt(Gt(`/api/areas/logos/${e.logo.filename}`)),position:e.logo.position,width:e.logo.width,height:e.logo.height,opacity:e.logo.opacity??.8}:void 0;e.type==="rectangle"&&e.width&&e.height?this.areas.set(e.id,{id:e.id,type:"rectangle",position:{x:e.center.x,z:e.center.z},size:{width:e.width,height:e.height},color:e.color,label:e.name,zIndex:e.zIndex??0,directories:[...e.directories],hasDirectories:i,directoryGitCounts:e.directoryGitCounts?[...e.directoryGitCounts]:void 0,logo:o}):e.type==="circle"&&e.radius&&this.areas.set(e.id,{id:e.id,type:"circle",position:{x:e.center.x,z:e.center.z},size:{radius:e.radius},color:e.color,label:e.name,zIndex:e.zIndex??0,directories:[...e.directories],hasDirectories:i,directoryGitCounts:e.directoryGitCounts?[...e.directoryGitCounts]:void 0,logo:o})}}getSelectedAreaId(){return this.selectedAreaId}selectArea(t){this.selectedAreaId=t,M.selectArea(t),this.markStaticDirty()}isAreaSelected(){return this.selectedAreaId!==null}getAreaHandleAtWorldPos(t,s){if(!this.selectedAreaId)return null;const e=this.areas.get(this.selectedAreaId);if(!e)return null;const i=.4,o=this.camera.getZoom(),n=i*(30/Math.max(o,10)),c=t-e.position.x,a=s-e.position.z;if(Math.sqrt(c*c+a*a)<=n)return{areaId:e.id,handleType:"move"};if(e.type==="rectangle"&&"width"in e.size){const{width:r,height:g}=e.size,h=[{type:"nw",x:e.position.x-r/2,z:e.position.z-g/2},{type:"ne",x:e.position.x+r/2,z:e.position.z-g/2},{type:"sw",x:e.position.x-r/2,z:e.position.z+g/2},{type:"se",x:e.position.x+r/2,z:e.position.z+g/2}];for(const f of h){const l=t-f.x,u=s-f.z;if(Math.sqrt(l*l+u*u)<=n)return{areaId:e.id,handleType:f.type}}const m=[{type:"n",x:e.position.x,z:e.position.z-g/2},{type:"s",x:e.position.x,z:e.position.z+g/2},{type:"e",x:e.position.x+r/2,z:e.position.z},{type:"w",x:e.position.x-r/2,z:e.position.z}];for(const f of m){const l=t-f.x,u=s-f.z;if(Math.sqrt(l*l+u*u)<=n)return{areaId:e.id,handleType:f.type}}}else if(e.type==="circle"&&"radius"in e.size){const r=e.position.x+e.size.radius,g=e.position.z,h=t-r,m=s-g;if(Math.sqrt(h*h+m*m)<=n)return{areaId:e.id,handleType:"radius"}}return null}startAreaResize(t,s){if(!this.selectedAreaId)return;const e=this.areas.get(this.selectedAreaId);if(e&&(this.isResizingArea=!0,this.resizeHandleType=t,this.resizeStartPos={...s},this.resizeOriginalArea={...e,size:{...e.size}},this.areaDragAgentStartPositions.clear(),this.areaDragBuildingStartPositions.clear(),t==="move")){const i=M.getState();for(const o of i.agents.values())this.isPointInsideArea(o.position.x,o.position.z,e)&&this.areaDragAgentStartPositions.set(o.id,{...o.position});for(const o of i.buildings.values())this.isPointInsideArea(o.position.x,o.position.z,e)&&this.areaDragBuildingStartPositions.set(o.id,{...o.position})}}updateAreaResize(t){if(!this.isResizingArea||!this.resizeOriginalArea||!this.resizeHandleType||!this.resizeStartPos)return;const s=this.resizeOriginalArea;let e={};if(this.resizeHandleType==="move"){const i=t.x-this.resizeStartPos.x,o=t.z-this.resizeStartPos.z;e={center:{x:s.position.x+i,z:s.position.z+o}};for(const[n,c]of this.areaDragAgentStartPositions)M.moveAgentLocal(n,{x:c.x+i,y:c.y,z:c.z+o});for(const[n,c]of this.areaDragBuildingStartPositions)M.updateBuildingLocal(n,{position:{x:c.x+i,z:c.z+o}})}else if(s.type==="rectangle"&&"width"in s.size){const i=t.x-this.resizeStartPos.x,o=t.z-this.resizeStartPos.z,n=s.size.width,c=s.size.height,a=s.position.x,r=s.position.z,g=l=>{const u=Math.max(.5,n+l);return{width:u,cx:a+(u-n)/2}},h=l=>{const u=Math.max(.5,n-l);return{width:u,cx:a+(n-u)/2}},m=l=>{const u=Math.max(.5,c+l);return{height:u,cz:r+(u-c)/2}},f=l=>{const u=Math.max(.5,c-l);return{height:u,cz:r+(c-u)/2}};switch(this.resizeHandleType){case"se":{const l=g(i),u=m(o);e={width:l.width,height:u.height,center:{x:l.cx,z:u.cz}};break}case"sw":{const l=h(i),u=m(o);e={width:l.width,height:u.height,center:{x:l.cx,z:u.cz}};break}case"ne":{const l=g(i),u=f(o);e={width:l.width,height:u.height,center:{x:l.cx,z:u.cz}};break}case"nw":{const l=h(i),u=f(o);e={width:l.width,height:u.height,center:{x:l.cx,z:u.cz}};break}case"e":{const l=g(i);e={width:l.width,center:{x:l.cx,z:r}};break}case"w":{const l=h(i);e={width:l.width,center:{x:l.cx,z:r}};break}case"s":{const l=m(o);e={height:l.height,center:{x:a,z:l.cz}};break}case"n":{const l=f(o);e={height:l.height,center:{x:a,z:l.cz}};break}}}else if(s.type==="circle"&&this.resizeHandleType==="radius"){const i=t.x-s.position.x,o=t.z-s.position.z;e={radius:Math.max(.5,Math.sqrt(i*i+o*o))}}Object.keys(e).length>0&&(M.updateArea(this.selectedAreaId,e),this.syncAreas())}finishAreaResize(){if(this.resizeHandleType==="move"&&this.resizeOriginalArea&&this.resizeStartPos){const t=M.getState(),s=this.selectedAreaId?t.areas.get(this.selectedAreaId):null;if(s){const e=s.center.x-this.resizeOriginalArea.position.x,i=s.center.z-this.resizeOriginalArea.position.z;if(e!==0||i!==0){for(const[o,n]of this.areaDragAgentStartPositions)M.moveAgent(o,{x:n.x+e,y:n.y,z:n.z+i});for(const[o,n]of this.areaDragBuildingStartPositions)M.moveBuilding(o,{x:n.x+e,z:n.z+i})}}}this.isResizingArea=!1,this.resizeHandleType=null,this.resizeStartPos=null,this.resizeOriginalArea=null,this.areaDragAgentStartPositions.clear(),this.areaDragBuildingStartPositions.clear()}isPointInsideArea(t,s,e){if(e.type==="rectangle"&&"width"in e.size){const i=e.size.width/2,o=e.size.height/2;return t>=e.position.x-i&&t<=e.position.x+i&&s>=e.position.z-o&&s<=e.position.z+o}if(e.type==="circle"&&"radius"in e.size){const i=t-e.position.x,o=s-e.position.z;return i*i+o*o<=e.size.radius*e.size.radius}return!1}isCurrentlyResizingArea(){return this.isResizingArea}setSelectedAgents(t){this.selectedAgentIds=new Set(t),this.markDirty()}setSelectedBuildings(t){this.selectedBuildingIds=new Set(t),this.markStaticDirty()}refreshSelectionVisuals(){const t=M.getState();this.selectedAgentIds=new Set(t.selectedAgentIds),this.selectedBuildingIds=new Set(t.selectedBuildingIds),this.markStaticDirty()}createMoveOrderEffect(t){this.effects.addMoveOrderEffect(t),this.markDirty()}callSubordinates(t){var n;const e=M.getState().agents.get(t);if(!e||!(e.isBoss||e.class==="boss")||!((n=e.subordinateIds)!=null&&n.length))return;const i={x:e.position.x,z:e.position.z},o=this.calculateFormationPositions(i,e.subordinateIds.length);this.effects.addMoveOrderEffect(i),e.subordinateIds.forEach((c,a)=>{const r=o[a];M.moveAgent(c,{x:r.x,y:0,z:r.z});const g=this.agents.get(c);g&&this.startAgentMovement(c,g.position,r)})}calculateFormationPositions(t,s){const e=[];if(s===1)return[{x:t.x,z:t.z}];if(s<=6){const i=at*Math.max(1,s/3);for(let o=0;o<s;o++){const n=o/s*Math.PI*2-Math.PI/2;e.push({x:t.x+Math.cos(n)*i,z:t.z+Math.sin(n)*i})}}else{const i=Math.ceil(Math.sqrt(s)),o=Math.ceil(s/i),n=(i-1)*at/2,c=(o-1)*at/2;for(let a=0;a<s;a++){const r=a%i,g=Math.floor(a/i);e.push({x:t.x+r*at-n,z:t.z+g*at-c})}}return e}showToolBubble(t,s){const e=this.agents.get(t);e&&(this.effects.addToolBubble(t,e.position,s),this.markDirty())}focusAgent(t,s){const e=this.agents.get(t);e&&this.camera.focusOn(e.position.x,e.position.z,s)}focusBuilding(t,s){const e=this.buildings.get(t);e&&this.camera.focusOn(e.position.x,e.position.z,s)}focusOnContent(){if(this.agents.size===0&&this.buildings.size===0){this.camera.focusOn(0,0,30);return}let t=1/0,s=-1/0,e=1/0,i=-1/0;for(const o of this.agents.values())t=Math.min(t,o.position.x),s=Math.max(s,o.position.x),e=Math.min(e,o.position.z),i=Math.max(i,o.position.z);for(const o of this.buildings.values())t=Math.min(t,o.position.x),s=Math.max(s,o.position.x),e=Math.min(e,o.position.z),i=Math.max(i,o.position.z);this.camera.focusOnBounds(t,s,e,i,3)}getCamera(){return this.camera}setScale2D(t){this.scale2d=t,this.needsRender=!0}setTaskLabelsVisible(t){this.showTaskLabels=t,this.needsRender=!0}setGridVisible(t){this.showGrid=t,this.markStaticDirty()}setFpsLimit(t){this.fpsLimit=t,this.frameInterval=t>0?1e3/t:0,console.log(`[Tide 2D] FPS limit set to ${t}, frameInterval: ${this.frameInterval}ms`)}setCallbacks(t){this.callbacks={...this.callbacks,...t}}handleAgentClick(t,s){var e,i;(i=(e=this.callbacks).onAgentClick)==null||i.call(e,t,s)}handleAgentDoubleClick(t){var s,e;(e=(s=this.callbacks).onAgentDoubleClick)==null||e.call(s,t)}handleAgentHover(t,s){var e,i;(i=(e=this.callbacks).onAgentHover)==null||i.call(e,t,s)}handleBuildingClick(t,s){var e,i;(i=(e=this.callbacks).onBuildingClick)==null||i.call(e,t,s)}handleBuildingDoubleClick(t){var s,e;(e=(s=this.callbacks).onBuildingDoubleClick)==null||e.call(s,t)}handleBuildingHover(t){}handleAgentDragMove(t,s){const e=this.agents.get(t);e&&(this.movements.delete(t),e.position.x=s.x,e.position.z=s.z)}handleAgentDragEnd(t,s){M.moveAgent(t,{x:s.x,y:0,z:s.z}),this.createMoveOrderEffect(s)}handleAgentDragCancel(t){const e=M.getState().agents.get(t),i=this.agents.get(t);i&&e&&(i.position.x=e.position.x,i.position.z=e.position.z)}handleBuildingDragStart(t,s){var e,i;(i=(e=this.callbacks).onBuildingDragStart)==null||i.call(e,t,s)}handleBuildingDragMove(t,s){var e,i;(i=(e=this.callbacks).onBuildingDragMove)==null||i.call(e,t,s)}handleBuildingDragEnd(t,s){var e,i;(i=(e=this.callbacks).onBuildingDragEnd)==null||i.call(e,t,s)}handleBuildingDragCancel(t){var s,e;(e=(s=this.callbacks).onBuildingDragCancel)==null||e.call(s,t)}handleContextMenu(t,s,e){var i,o;(o=(i=this.callbacks).onContextMenu)==null||o.call(i,t,s,e)}handleGroundClick(t){var s,e;(e=(s=this.callbacks).onGroundClick)==null||e.call(s,t)}handleAreaFolderClick(t,s){var e,i;s?M.openFileExplorerForAreaFolder(t,s):M.openFileExplorerForArea(t),(i=(e=this.callbacks).onAreaFolderClick)==null||i.call(e,t,s)}handleAreaDoubleClick(t){var s,e;(e=(s=this.callbacks).onAreaDoubleClick)==null||e.call(s,t)}getAreaFolderIconAtScreenPos(t,s){const e=this.camera.screenToWorld(t,s);this.camera.getZoom();for(const i of this.getSortedAreasDesc()){if(!i.hasDirectories)continue;const o=.5,n=o*1.35,c=i.directories||[];let a,r,g=3;if(i.type==="rectangle"&&"width"in i.size)a=i.position.x-i.size.width/2+o*.8,r=i.position.z-i.size.height/2+o*.8,g=Math.max(1,Math.floor((i.size.width-o*1.2)/n));else if(i.type==="circle"&&"radius"in i.size){const m=i.size.radius*.707;a=i.position.x-m+o*.5,r=i.position.z-m+o*.5,g=Math.max(1,Math.floor((i.size.radius*1.414-o)/n))}else continue;const h=o*.7;for(let m=0;m<c.length;m++){const f=Math.floor(m/g),l=m%g,u=a+l*n,p=r+f*n,T=e.x-u,w=e.z-p;if(Math.sqrt(T*T+w*w)<=h)return{areaId:i.id,folderPath:c[m]}}}return null}handleSelectionBox(t,s){var e,i;(i=(e=this.callbacks).onSelectionBox)==null||i.call(e,t,s)}handleMoveCommand(t){var e,i;const s=Array.from(this.selectedAgentIds);(i=(e=this.callbacks).onMoveCommand)==null||i.call(e,s,t)}getAgents(){return this.agents}getBuildings(){return this.buildings}getAgentData(t){return this.agents.get(t)??null}hasActiveMovement(t){return this.movements.has(t)}getBuildingData(t){return this.buildings.get(t)??null}getAgentAtScreenPos(t,s){const e=this.camera.screenToWorld(t,s);return this.getAgentAtWorldPos(e.x,e.z)}getAgentAtWorldPos(t,s){for(const i of this.agents.values()){const o=t-i.position.x,n=s-i.position.z;if(Math.sqrt(o*o+n*n)<=.8)return i}return null}getBuildingAtScreenPos(t,s){const e=this.camera.screenToWorld(t,s);return this.getBuildingAtWorldPos(e.x,e.z)}getBuildingAtWorldPos(t,s){for(const i of this.buildings.values()){const o=t-i.position.x,n=s-i.position.z;if(Math.sqrt(o*o+n*n)<=1.5*i.scale)return i}return null}getAreaAtScreenPos(t,s){const e=this.camera.screenToWorld(t,s);return this.getAreaAtWorldPos(e.x,e.z)}getAreaAtWorldPos(t,s){for(const e of this.getSortedAreasDesc())if(e.type==="rectangle"&&"width"in e.size){const{width:i,height:o}=e.size,n=e.position.x-i/2,c=e.position.x+i/2,a=e.position.z-o/2,r=e.position.z+o/2;if(t>=n&&t<=c&&s>=a&&s<=r)return e}else if(e.type==="circle"&&"radius"in e.size){const{radius:i}=e.size,o=t-e.position.x,n=s-e.position.z;if(Math.sqrt(o*o+n*n)<=i)return e}return null}setDrawingTool(t){this.drawingTool=t,M.setActiveTool(t),(!t||t==="select")&&this.cancelDrawing()}getDrawingTool(){return this.drawingTool}isInDrawingMode(){return this.drawingTool==="rectangle"||this.drawingTool==="circle"}startDrawing(t){this.isInDrawingMode()&&(this.isDrawing=!0,this.drawStartPos={...t},this.drawCurrentPos={...t})}updateDrawing(t){!this.isDrawing||!this.drawStartPos||(this.drawCurrentPos={...t})}finishDrawing(t){if(!this.isDrawing||!this.drawStartPos){this.cancelDrawing();return}this.drawCurrentPos={...t};const s=this.createAreaFromDraw(this.drawStartPos,t);this.cancelDrawing(),s&&M.addArea(s)}cancelDrawing(){this.isDrawing=!1,this.drawStartPos=null,this.drawCurrentPos=null}isCurrentlyDrawing(){return this.isDrawing}getDrawingPreview(){return!this.isDrawing||!this.drawStartPos||!this.drawCurrentPos||!this.drawingTool||this.drawingTool==="select"?null:{start:this.drawStartPos,end:this.drawCurrentPos,tool:this.drawingTool}}createAreaFromDraw(t,s){if(!this.drawingTool||this.drawingTool==="select")return null;const e=`area-${Date.now()}-${Math.random().toString(36).slice(2,9)}`;if(this.drawingTool==="rectangle"){const i=Math.min(t.x,s.x),o=Math.max(t.x,s.x),n=Math.min(t.z,s.z),c=Math.max(t.z,s.z),a=o-i,r=c-n;return a<.5||r<.5?null:{id:e,name:"New Area",type:"rectangle",center:{x:(i+o)/2,z:(n+c)/2},width:a,height:r,color:"#4a9eff",zIndex:M.getNextZIndex(),assignedAgentIds:[],directories:[]}}else if(this.drawingTool==="circle"){const i=s.x-t.x,o=s.z-t.z,n=Math.sqrt(i*i+o*o);return n<.5?null:{id:e,name:"New Area",type:"circle",center:{x:t.x,z:t.z},radius:n,color:"#4a9eff",zIndex:M.getNextZIndex(),assignedAgentIds:[],directories:[]}}return null}};d(G,"IDLE_FPS_LIMIT",8),d(G,"WORKING_FPS_LIMIT",15),d(G,"MAX_DPR",1.25),d(G,"AGENT_MOVE_ANIMATION_DURATION_MS",500),d(G,"AGENT_MOVE_ANIMATION_THRESHOLD",.5),d(G,"AGENT_MOVE_SNAP_DISTANCE",.01);let zt=G;function de(R,t={}){const s=O.useRef(null),e=O.useRef(t);e.current=t,O.useEffect(()=>{const f=R.current;if(!f)return;const l=new zt(f);s.current=l,typeof window<"u"&&(window.__tideScene2D=l),l.setCallbacks({onAgentClick:(x,S)=>{var b,P;return(P=(b=e.current).onAgentClick)==null?void 0:P.call(b,x,S)},onAgentDoubleClick:x=>{var S,b;return(b=(S=e.current).onAgentDoubleClick)==null?void 0:b.call(S,x)},onAgentHover:(x,S)=>{var b,P;return(P=(b=e.current).onAgentHover)==null?void 0:P.call(b,x,S)},onBuildingClick:(x,S)=>{var b,P;return(P=(b=e.current).onBuildingClick)==null?void 0:P.call(b,x,S)},onBuildingDoubleClick:x=>{var S,b;return(b=(S=e.current).onBuildingDoubleClick)==null?void 0:b.call(S,x)},onBuildingDragStart:(x,S)=>{var b,P;return(P=(b=e.current).onBuildingDragStart)==null?void 0:P.call(b,x,S)},onBuildingDragMove:(x,S)=>{var b,P;return(P=(b=e.current).onBuildingDragMove)==null?void 0:P.call(b,x,S)},onBuildingDragEnd:(x,S)=>{var b,P;return(P=(b=e.current).onBuildingDragEnd)==null?void 0:P.call(b,x,S)},onBuildingDragCancel:x=>{var S,b;return(b=(S=e.current).onBuildingDragCancel)==null?void 0:b.call(S,x)},onContextMenu:(x,S,b)=>{var P,v;return(v=(P=e.current).onContextMenu)==null?void 0:v.call(P,x,S,b)},onGroundClick:x=>{var S,b;return(b=(S=e.current).onGroundClick)==null?void 0:b.call(S,x)},onMoveCommand:(x,S)=>{var b,P;return(P=(b=e.current).onMoveCommand)==null?void 0:P.call(b,x,S)},onAreaDoubleClick:x=>{var S,b;return(b=(S=e.current).onAreaDoubleClick)==null?void 0:b.call(S,x)},onSelectionBox:(x,S)=>{const b=Math.min(x.x,S.x),P=Math.max(x.x,S.x),v=Math.min(x.z,S.z),k=Math.max(x.z,S.z),W=[];for(const Z of l.getAgents().values())Z.position.x>=b&&Z.position.x<=P&&Z.position.z>=v&&Z.position.z<=k&&W.push(Z.id);if(W.length>0){M.selectAgent(W[0]);for(let Z=1;Z<W.length;Z++)M.addToSelection(W[Z])}else M.selectAgent(null)}});const u=M.getState();l.syncAreas(),l.syncBuildings(),l.syncAgents(Array.from(u.agents.values())),l.setSelectedAgents(u.selectedAgentIds),l.setSelectedBuildings(u.selectedBuildingIds),l.start();let p=new Map;for(const x of u.agents.values())p.set(x.id,{x:x.position.x,z:x.position.z});let T=u.agents.size>0;const w=M.subscribe(()=>{var S,b,P;const x=M.getState();if(!T&&x.agents.size>0){T=!0,l.syncAreas(),l.syncAgents(Array.from(x.agents.values()));for(const v of x.agents.values())p.set(v.id,{x:v.position.x,z:v.position.z})}else{const v=Pt();for(const k of x.agents.values()){if(M.isAgentInArchivedArea(k.id)||v&&!dt(((S=M.getAreaForAgent(k.id))==null?void 0:S.id)??null)){p.has(k.id)&&(l.removeAgent(k.id),p.delete(k.id));continue}const Z=p.get(k.id);!Z||Z.x!==k.position.x||Z.z!==k.position.z?(l.updateAgent(k,!0),p.set(k.id,{x:k.position.x,z:k.position.z})):(b=l.hasActiveMovement)!=null&&b.call(l,k.id)||l.updateAgent(k,!1)}for(const k of p.keys()){const W=v&&!dt(((P=M.getAreaForAgent(k))==null?void 0:P.id)??null);(!x.agents.has(k)||M.isAgentInArchivedArea(k)||W)&&(l.removeAgent(k),p.delete(k))}}l.syncBuildings(),l.syncAreas(),l.setSelectedAgents(x.selectedAgentIds),l.setSelectedBuildings(x.selectedBuildingIds)}),y=qt(()=>{l.syncAreas(),l.syncBuildings(),l.syncAgents(Array.from(M.getState().agents.values()))});return()=>{w(),y(),l.dispose(),s.current=null,typeof window<"u"&&delete window.__tideScene2D}},[R]);const i=O.useCallback(f=>{var l;(l=s.current)==null||l.focusAgent(f)},[]),o=O.useCallback((f,l=!0)=>{var u;(u=s.current)==null||u.updateAgent(f,l)},[]),n=O.useCallback(f=>{var l;(l=s.current)==null||l.createMoveOrderEffect(f)},[]),c=O.useCallback((f,l)=>{var u;(u=s.current)==null||u.showToolBubble(f,l)},[]),a=O.useCallback(f=>{var l;(l=s.current)==null||l.setScale2D(f)},[]),r=O.useCallback(f=>{var l;(l=s.current)==null||l.setTaskLabelsVisible(f)},[]),g=O.useCallback(f=>{var l;(l=s.current)==null||l.setGridVisible(f)},[]),h=O.useCallback(f=>{var l;(l=s.current)==null||l.setDrawingTool(f)},[]),m=O.useCallback(f=>{var l;(l=s.current)==null||l.setFpsLimit(f)},[]);return{scene:s,focusAgent:i,updateAgent:o,createMoveOrderEffect:n,showToolBubble:c,setScale2D:a,setTaskLabelsVisible:r,setGridVisible:g,setDrawingTool:h,setFpsLimit:m}}function xe({onAgentClick:R,onAgentDoubleClick:t,onAgentHover:s,onBuildingClick:e,onBuildingDoubleClick:i,onBuildingDragStart:o,onBuildingDragMove:n,onBuildingDragEnd:c,onBuildingDragCancel:a,onContextMenu:r,onGroundClick:g,onMoveCommand:h,onAreaDoubleClick:m,scale2d:f=1,showTaskLabels:l=!0,showGrid:u=!0,fpsLimit:p=0,className:T=""}){const w=O.useRef(null),{scene:y,setScale2D:x,setTaskLabelsVisible:S,setGridVisible:b,setDrawingTool:P,setFpsLimit:v}=de(w,{onAgentClick:R,onAgentDoubleClick:t,onAgentHover:s,onBuildingClick:e,onBuildingDoubleClick:i,onBuildingDragStart:o,onBuildingDragMove:n,onBuildingDragEnd:c,onBuildingDragCancel:a,onContextMenu:r,onGroundClick:g,onMoveCommand:h,onAreaDoubleClick:m});return O.useEffect(()=>(typeof window<"u"&&y.current&&(window.__tideScene2D_setDrawingTool=P),()=>{typeof window<"u"&&delete window.__tideScene2D_setDrawingTool}),[P,y]),O.useEffect(()=>{x(f)},[f,x]),O.useEffect(()=>{S(l)},[l,S]),O.useEffect(()=>{b(u)},[u,b]),O.useEffect(()=>{v(p)},[p,v]),St.jsxs("div",{className:`scene-2d-container ${T}`,children:[St.jsx("canvas",{ref:w,className:"scene-2d-canvas"}),St.jsx("div",{className:"scene-2d-badge",children:"2D Mode"})]})}export{xe as Scene2DCanvas,xe as default};
1
+ var Nt=Object.defineProperty;var $t=(R,t,s)=>t in R?Nt(R,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):R[t]=s;var d=(R,t,s)=>$t(R,typeof t!="symbol"?t+"":t,s);import{s as M,A as Tt,k as Wt,l as Gt,m as At,T as Rt,n as Q,o as _t,S as Vt,p as Ut,q as Bt,t as jt,v as dt,w as bt,F as at,x as Pt,r as O,y as qt,j as St}from"./main-BvvvhWnd.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";const ht=new Map,Kt=512,tt=new Map,Lt=256;class rt{constructor(t,s){d(this,"ctx");d(this,"camera");d(this,"animationTime",0);this.ctx=t,this.camera=s}setAnimationTime(t){this.animationTime=t}roundedRect(t,s,e,i,o){this.ctx.moveTo(t+o,s),this.ctx.lineTo(t+e-o,s),this.ctx.arcTo(t+e,s,t+e,s+o,o),this.ctx.lineTo(t+e,s+i-o),this.ctx.arcTo(t+e,s+i,t+e-o,s+i,o),this.ctx.lineTo(t+o,s+i),this.ctx.arcTo(t,s+i,t,s+i-o,o),this.ctx.lineTo(t,s+o),this.ctx.arcTo(t,s,t+o,s,o)}roundedRectScreen(t,s,e,i,o){this.ctx.moveTo(t+o,s),this.ctx.lineTo(t+e-o,s),this.ctx.arcTo(t+e,s,t+e,s+o,o),this.ctx.lineTo(t+e,s+i-o),this.ctx.arcTo(t+e,s+i,t+e-o,s+i,o),this.ctx.lineTo(t+o,s+i),this.ctx.arcTo(t,s+i,t,s+i-o,o),this.ctx.lineTo(t,s+o),this.ctx.arcTo(t,s,t+o,s,o)}numberToHex(t){return`#${t.toString(16).padStart(6,"0")}`}hexToRgba(t,s){const e=Math.round(s*100)/100,i=`${t}|${e}`;let o=ht.get(i);if(o)return o;const n=parseInt(t.slice(1,3),16),c=parseInt(t.slice(3,5),16),a=parseInt(t.slice(5,7),16);return o=`rgba(${n}, ${c}, ${a}, ${e})`,ht.size>=Kt&&ht.clear(),ht.set(i,o),o}lightenColor(t,s){const e=`L|${t}|${s}`;let i=tt.get(e);if(i)return i;const o=parseInt(t.slice(1,3),16),n=parseInt(t.slice(3,5),16),c=parseInt(t.slice(5,7),16),a=Math.min(255,Math.floor(o+(255-o)*s)),r=Math.min(255,Math.floor(n+(255-n)*s)),g=Math.min(255,Math.floor(c+(255-c)*s));return i=`#${a.toString(16).padStart(2,"0")}${r.toString(16).padStart(2,"0")}${g.toString(16).padStart(2,"0")}`,tt.size>=Lt&&tt.clear(),tt.set(e,i),i}darkenColor(t,s){const e=`D|${t}|${s}`;let i=tt.get(e);if(i)return i;const o=parseInt(t.slice(1,3),16),n=parseInt(t.slice(3,5),16),c=parseInt(t.slice(5,7),16),a=Math.max(0,Math.floor(o*(1-s))),r=Math.max(0,Math.floor(n*(1-s))),g=Math.max(0,Math.floor(c*(1-s)));return i=`#${a.toString(16).padStart(2,"0")}${r.toString(16).padStart(2,"0")}${g.toString(16).padStart(2,"0")}`,tt.size>=Lt&&tt.clear(),tt.set(e,i),i}formatIdleTime(t){return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m`:`${Math.floor(t/3600)}h`}easeOutCubic(t){return 1-Math.pow(1-t,3)}easeInCubic(t){return t*t*t}}const Jt=200;class Qt extends rt{constructor(s,e){super(s,e);d(this,"toolAnimations",new Map)}update(s){this.animationTime+=s,this.updateToolAnimations()}getAnimationTime(){return this.animationTime}updateToolAnimations(){const s=performance.now(),e=[];for(const[i,o]of this.toolAnimations){const n=s-o.startTime,c=Math.min(1,n/Jt);o.fadeIn?o.opacity=this.easeOutCubic(c):(o.opacity=1-this.easeInCubic(c),c>=1&&e.push(i))}for(const i of e)this.toolAnimations.delete(i)}updateAgentTool(s,e){const i=this.toolAnimations.get(s),o=performance.now();e?(!i||i.tool!==e||!i.fadeIn)&&this.toolAnimations.set(s,{tool:e,startTime:o,fadeIn:!0,opacity:(i==null?void 0:i.opacity)??0}):i&&i.fadeIn&&(i.fadeIn=!1,i.startTime=o)}getToolAnimation(s){return this.toolAnimations.get(s)}}class te extends rt{constructor(s,e){super(s,e);d(this,"groundGradient",null);d(this,"groundViewportW",0);d(this,"groundViewportH",0)}drawGround(s){const{width:e,height:i}=this.camera.getViewportSize();if(!this.groundGradient||e!==this.groundViewportW||i!==this.groundViewportH){const o=e/2,n=i/2,c=Math.sqrt(o*o+n*n)*1.2;this.groundGradient=this.ctx.createRadialGradient(o,n,0,o,n,c),this.groundGradient.addColorStop(0,"#1a1f2e"),this.groundGradient.addColorStop(.5,"#141820"),this.groundGradient.addColorStop(1,"#0a0c12"),this.groundViewportW=e,this.groundViewportH=i}this.ctx.fillStyle=this.groundGradient,this.ctx.fillRect(0,0,e,i)}drawGrid(s,e){const i=this.camera.getVisibleBounds(),o=this.camera.getZoom();let n=e;o<20&&(n=e*2),o<12&&(n=e*4);const c=Math.floor(i.minX/n)*n,a=Math.ceil(i.maxX/n)*n,r=Math.floor(i.minZ/n)*n,g=Math.ceil(i.maxZ/n)*n;this.camera.applyTransform(this.ctx);const h=s*.4,m=h*.5,f=1/o;for(let l=c;l<=a;l+=n){const u=Math.abs(l);let p=this.calculateGridAlpha(u,m,h);const T=Math.abs(l)%(n*5)<.001;p*=T?.12:.05,p>.005&&(this.ctx.strokeStyle=`rgba(100, 140, 180, ${p})`,this.ctx.lineWidth=T?f*1.5:f,this.ctx.beginPath(),this.ctx.moveTo(l,i.minZ),this.ctx.lineTo(l,i.maxZ),this.ctx.stroke())}for(let l=r;l<=g;l+=n){const u=Math.abs(l);let p=this.calculateGridAlpha(u,m,h);const T=Math.abs(l)%(n*5)<.001;p*=T?.12:.05,p>.005&&(this.ctx.strokeStyle=`rgba(100, 140, 180, ${p})`,this.ctx.lineWidth=T?f*1.5:f,this.ctx.beginPath(),this.ctx.moveTo(i.minX,l),this.ctx.lineTo(i.maxX,l),this.ctx.stroke())}this.camera.restoreTransform(this.ctx),this.drawOriginMarker(),o>15&&this.drawCoordinateLabels(n,m,h)}calculateGridAlpha(s,e,i){if(s<=e)return 1;if(s>=i)return 0;const o=(s-e)/(i-e);return 1-o*o}drawOriginMarker(){const s=this.camera.worldToScreen(0,0),{x:e,y:i}=s,o=12,n=this.ctx.createRadialGradient(e,i,0,e,i,o*2);n.addColorStop(0,"rgba(74, 158, 255, 0.15)"),n.addColorStop(1,"rgba(74, 158, 255, 0)"),this.ctx.fillStyle=n,this.ctx.beginPath(),this.ctx.arc(e,i,o*2,0,Math.PI*2),this.ctx.fill();const c=20,a=6;this.ctx.strokeStyle="rgba(74, 158, 255, 0.4)",this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.moveTo(e-c,i),this.ctx.lineTo(e-a,i),this.ctx.moveTo(e+a,i),this.ctx.lineTo(e+c,i),this.ctx.moveTo(e,i-c),this.ctx.lineTo(e,i-a),this.ctx.moveTo(e,i+a),this.ctx.lineTo(e,i+c),this.ctx.stroke(),this.ctx.strokeStyle="rgba(74, 158, 255, 0.5)",this.ctx.lineWidth=1.5,this.ctx.beginPath(),this.ctx.arc(e,i,o,0,Math.PI*2),this.ctx.stroke(),this.ctx.fillStyle="rgba(74, 158, 255, 0.8)",this.ctx.beginPath(),this.ctx.arc(e,i,2,0,Math.PI*2),this.ctx.fill();const r=3;this.ctx.strokeStyle="rgba(74, 158, 255, 0.6)",this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.moveTo(e,i-o),this.ctx.lineTo(e,i-o+r),this.ctx.moveTo(e,i+o),this.ctx.lineTo(e,i+o-r),this.ctx.moveTo(e-o,i),this.ctx.lineTo(e-o+r,i),this.ctx.moveTo(e+o,i),this.ctx.lineTo(e+o-r,i),this.ctx.stroke()}drawCoordinateLabels(s,e,i){const o=this.camera.getVisibleBounds(),n=s*5,c=Math.floor(o.minX/n)*n,a=Math.ceil(o.maxX/n)*n,r=Math.floor(o.minZ/n)*n,g=Math.ceil(o.maxZ/n)*n;this.ctx.font='10px "SF Mono", "Monaco", "Consolas", monospace',this.ctx.textBaseline="middle";for(let h=c;h<=a;h+=n){if(Math.abs(h)<.001)continue;const m=Math.abs(h),f=this.calculateGridAlpha(m,e,i)*.4;if(f>.02){const l=this.camera.worldToScreen(h,0);this.ctx.fillStyle=`rgba(100, 140, 180, ${f})`,this.ctx.textAlign="center",this.ctx.fillText(h.toString(),l.x,l.y+16)}}for(let h=r;h<=g;h+=n){if(Math.abs(h)<.001)continue;const m=Math.abs(h),f=this.calculateGridAlpha(m,e,i)*.4;if(f>.02){const l=this.camera.worldToScreen(0,h);this.ctx.fillStyle=`rgba(100, 140, 180, ${f})`,this.ctx.textAlign="left",this.ctx.fillText(h.toString(),l.x+16,l.y)}}}}const ee=30,se=.18;function ie(R,t,s){return Math.max(t,Math.min(s,R))}function vt(R){return ie(Math.max(R,1)/ee,se,1)}function oe(R){return vt(R)}function ne(R,t){return vt(R)}function ae(R){return R>=30?"full":R>=24?"reduced":R>=18?"compact":"minimal"}class re extends rt{constructor(s,e){super(s,e);d(this,"logoImages",new Map);d(this,"loadingLogos",new Set)}drawArea(s,e=!1){this.camera.applyTransform(this.ctx);const{x:i,z:o}=s.position,n=s.color||"#4a9eff",c=this.camera.getZoom();if(s.type==="rectangle"&&"width"in s.size){const{width:a,height:r}=s.size,g=i-a/2,h=o-r/2;if(this.drawRectangleArea(g,h,a,r,n,c,e),s.label&&this.drawAreaLabel(s.label,i,h,n,c,"top"),s.logo&&this.drawAreaLogo(s,i,o,a,r),s.hasDirectories){const l=Math.max(1,Math.floor((a-.6)/.675)),u=g+.5*.8,p=h+.5*.8;s.directories.forEach((T,w)=>{var b;const y=Math.floor(w/l),x=w%l,S=((b=s.directoryGitCounts)==null?void 0:b[w])??0;this.drawFolderIcon(u+x*.675,p+y*.675,.5,n,c,S)})}e&&this.drawRectangleResizeHandles(i,o,a,r,n,c)}else if(s.type==="circle"&&"radius"in s.size){const{radius:a}=s.size;if(this.drawCircleArea(i,o,a,n,c,e),s.label&&this.drawAreaLabel(s.label,i,o-a,n,c,"top"),s.logo){const r=a*1.414,g=a*1.414;this.drawAreaLogo(s,i,o,r,g)}if(s.hasDirectories){const g=a*.707,h=.5*1.35,m=Math.max(1,Math.floor((a*1.414-.5)/h)),f=i-g+.5*.5,l=o-g+.5*.5;s.directories.forEach((u,p)=>{var x;const T=Math.floor(p/m),w=p%m,y=((x=s.directoryGitCounts)==null?void 0:x[p])??0;this.drawFolderIcon(f+w*h,l+T*h,.5,n,c,y)})}e&&this.drawCircleResizeHandles(i,o,a,n,c)}this.camera.restoreTransform(this.ctx)}drawRectangleArea(s,e,i,o,n,c,a=!1){const r=this.ctx,g=Math.min(i,o)*.08;a&&(r.strokeStyle=this.hexToRgba(n,.5*.8),r.lineWidth=4/c,r.beginPath(),r.rect(s-2/c,e-2/c,i+4/c,o+4/c),r.stroke());const h=a?.25:.15,m=r.createLinearGradient(s,e,s+i,e+o);m.addColorStop(0,this.hexToRgba(n,h)),m.addColorStop(.5,this.hexToRgba(n,h*.5)),m.addColorStop(1,this.hexToRgba(n,h*1.3)),r.fillStyle=m,r.beginPath(),r.rect(s,e,i,o),r.fill();const f=r.createLinearGradient(s,e,s+i,e);f.addColorStop(0,"transparent"),f.addColorStop(.2,this.hexToRgba(n,.3)),f.addColorStop(.8,this.hexToRgba(n,.3)),f.addColorStop(1,"transparent"),r.strokeStyle=f,r.lineWidth=2/c,r.beginPath(),r.moveTo(s+g,e+2/c),r.lineTo(s+i-g,e+2/c),r.stroke();const l=r.createLinearGradient(s,e+o,s+i,e+o);l.addColorStop(0,"transparent"),l.addColorStop(.2,this.hexToRgba(this.darkenColor(n,.5),.4)),l.addColorStop(.8,this.hexToRgba(this.darkenColor(n,.5),.4)),l.addColorStop(1,"transparent"),r.strokeStyle=l,r.lineWidth=2/c,r.beginPath(),r.moveTo(s+g,e+o-2/c),r.lineTo(s+i-g,e+o-2/c),r.stroke(),r.strokeStyle=this.hexToRgba(n,.7),r.lineWidth=2/c,r.setLineDash([8/c,4/c]),r.lineDashOffset=0,r.beginPath(),r.rect(s,e,i,o),r.stroke(),r.setLineDash([]),r.strokeStyle=this.hexToRgba(n,.9),r.lineWidth=3/c,r.lineCap="round",this.drawCornerMark(s,e,g,"top-left"),this.drawCornerMark(s+i,e,g,"top-right"),this.drawCornerMark(s,e+o,g,"bottom-left"),this.drawCornerMark(s+i,e+o,g,"bottom-right"),r.fillStyle=n;const u=3/c,p=[{x:s,y:e},{x:s+i,y:e},{x:s,y:e+o},{x:s+i,y:e+o}];for(const T of p)r.beginPath(),r.arc(T.x,T.y,u,0,Math.PI*2),r.fill()}drawCornerMark(s,e,i,o){const n=this.ctx;switch(n.beginPath(),o){case"top-left":n.moveTo(s,e+i),n.lineTo(s,e),n.lineTo(s+i,e);break;case"top-right":n.moveTo(s-i,e),n.lineTo(s,e),n.lineTo(s,e+i);break;case"bottom-left":n.moveTo(s,e-i),n.lineTo(s,e),n.lineTo(s+i,e);break;case"bottom-right":n.moveTo(s-i,e),n.lineTo(s,e),n.lineTo(s,e-i);break}n.stroke()}drawCircleArea(s,e,i,o,n,c=!1){const a=this.ctx;c&&(a.strokeStyle=this.hexToRgba(o,.5*.8),a.lineWidth=4/n,a.beginPath(),a.arc(s,e,i+3/n,0,Math.PI*2),a.stroke());const r=c?.3:.2,g=a.createRadialGradient(s,e-i*.3,0,s,e,i);g.addColorStop(0,this.hexToRgba(o,r)),g.addColorStop(.6,this.hexToRgba(o,r*.5)),g.addColorStop(1,this.hexToRgba(o,r*.9)),a.fillStyle=g,a.beginPath(),a.arc(s,e,i,0,Math.PI*2),a.fill();const h=a.createLinearGradient(s-i*.7,e-i,s+i*.7,e-i);h.addColorStop(0,"transparent"),h.addColorStop(.3,this.hexToRgba(o,.4)),h.addColorStop(.7,this.hexToRgba(o,.4)),h.addColorStop(1,"transparent"),a.strokeStyle=h,a.lineWidth=2/n,a.beginPath(),a.arc(s,e,i-2/n,-Math.PI*.8,-Math.PI*.2),a.stroke(),a.strokeStyle=this.hexToRgba(o,.7),a.lineWidth=2/n,a.setLineDash([8/n,4/n]),a.lineDashOffset=0,a.beginPath(),a.arc(s,e,i,0,Math.PI*2),a.stroke(),a.setLineDash([]);const m=8,f=3/n;a.fillStyle=o;for(let u=0;u<m;u++){const p=u/m*Math.PI*2-Math.PI/2,T=s+Math.cos(p)*i,w=e+Math.sin(p)*i;a.beginPath(),a.arc(T,w,f,0,Math.PI*2),a.fill()}const l=4.5/n;for(let u=0;u<4;u++){const p=u/4*Math.PI*2-Math.PI/2,T=s+Math.cos(p)*i,w=e+Math.sin(p)*i;a.beginPath(),a.arc(T,w,l,0,Math.PI*2),a.fill()}}drawAreaLabel(s,e,i,o,n,c){const a=this.ctx,r=vt(n),g=11*r/n,h=6*r/n,m=c==="top"?-8*r/n:0;a.font=`bold ${g}px "Segoe UI", Arial, sans-serif`;const l=a.measureText(s).width,u=g,p=l+h*2,T=u+h,w=e-p/2,y=i+m-T/2,x=4*r/n,S=a.createLinearGradient(w,y,w,y+T);S.addColorStop(0,this.hexToRgba(this.darkenColor(o,.7),.9)),S.addColorStop(1,this.hexToRgba(this.darkenColor(o,.5),.9)),a.fillStyle=S,a.beginPath(),this.roundedRect(w,y,p,T,x),a.fill(),a.strokeStyle=this.hexToRgba(o,.8),a.lineWidth=1.5*r/n,a.beginPath(),this.roundedRect(w,y,p,T,x),a.stroke(),a.fillStyle=this.lightenColor(o,.3),a.textAlign="center",a.textBaseline="middle",a.fillText(s,e,i+m)}drawRectangleResizeHandles(s,e,i,o,n,c){const g=[{x:s-i/2,z:e-o/2},{x:s+i/2,z:e-o/2},{x:s-i/2,z:e+o/2},{x:s+i/2,z:e+o/2}];for(const m of g)this.drawResizeHandle(m.x,m.z,.25,"#ffffff",c,.9);const h=[{x:s,z:e-o/2},{x:s,z:e+o/2},{x:s+i/2,z:e},{x:s-i/2,z:e}];for(const m of h)this.drawResizeHandle(m.x,m.z,.25*.8,"#aaddff",c,.9);this.drawResizeHandle(s,e,.25*1.2,"#ffcc00",c,.9,!0)}drawCircleResizeHandles(s,e,i,o,n){this.drawResizeHandle(s+i,e,.25,"#ffffff",n,.9),this.drawResizeHandle(s,e,.25*1.2,"#ffcc00",n,.9,!0)}drawResizeHandle(s,e,i,o,n,c,a=!1){const r=this.ctx;r.save(),r.fillStyle="rgba(0, 0, 0, 0.5)",r.beginPath(),r.arc(s,e,i*1.3,0,Math.PI*2),r.fill();const g=r.createRadialGradient(s-i*.3,e-i*.3,0,s,e,i);if(g.addColorStop(0,this.lightenColor(o,.3)),g.addColorStop(.5,o),g.addColorStop(1,this.darkenColor(o,.2)),r.fillStyle=g,r.globalAlpha=c,r.beginPath(),r.arc(s,e,i,0,Math.PI*2),r.fill(),r.globalAlpha=1,r.strokeStyle="rgba(255, 255, 255, 0.8)",r.lineWidth=1.5/n,r.beginPath(),r.arc(s,e,i,0,Math.PI*2),r.stroke(),a){const h=i*.5;r.strokeStyle="rgba(0, 0, 0, 0.7)",r.lineWidth=2/n,r.lineCap="round",r.beginPath(),r.moveTo(s-h,e),r.lineTo(s+h,e),r.moveTo(s,e-h),r.lineTo(s,e+h),r.stroke()}r.restore()}drawFolderIcon(s,e,i,o,n,c=0){const a=this.ctx,r=i*.45;a.save(),a.fillStyle=this.hexToRgba(this.darkenColor(o,.6),.85),a.beginPath(),a.arc(s,e,r*1.1,0,Math.PI*2),a.fill(),a.strokeStyle=this.hexToRgba(o,.8),a.lineWidth=1.5/n,a.beginPath(),a.arc(s,e,r*1.1,0,Math.PI*2),a.stroke();const g=r*1.2,h=r*.9,m=g*.35,f=h*.2,l=h*.08,u=s-g/2,p=e-h/2;if(a.fillStyle=o,a.beginPath(),a.moveTo(u+l,p+f),a.lineTo(u+m,p+f),a.lineTo(u+m+f*.6,p),a.lineTo(u+m+m*.4,p),a.lineTo(u+l,p),a.arcTo(u,p,u,p+l,l),a.lineTo(u,p+h-l),a.arcTo(u,p+h,u+l,p+h,l),a.lineTo(u+g-l,p+h),a.arcTo(u+g,p+h,u+g,p+h-l,l),a.lineTo(u+g,p+f+l),a.arcTo(u+g,p+f,u+g-l,p+f,l),a.closePath(),a.fill(),a.strokeStyle=this.hexToRgba(this.lightenColor(o,.3),.6),a.lineWidth=1/n,a.beginPath(),a.moveTo(u+l,p+f+h*.08),a.lineTo(u+g-l,p+f+h*.08),a.stroke(),c>0){const T=r*.4,w=s+r*.7,y=e+r*.7;a.fillStyle="#e8943a",a.beginPath(),a.arc(w,y,T,0,Math.PI*2),a.fill(),a.strokeStyle="rgba(0, 0, 0, 0.6)",a.lineWidth=1.5/n,a.beginPath(),a.arc(w,y,T,0,Math.PI*2),a.stroke();const x=c>99?"99+":String(c),S=T*1.2;a.font=`bold ${S}px "Segoe UI", Arial, sans-serif`,a.fillStyle="#ffffff",a.textAlign="center",a.textBaseline="middle",a.fillText(x,w,y)}a.restore()}getLogoImage(s){const e=this.logoImages.get(s);if(e)return e;if(!this.loadingLogos.has(s)){this.loadingLogos.add(s);const i=new Image;i.crossOrigin="anonymous",i.onload=()=>{this.logoImages.set(s,i),this.loadingLogos.delete(s)},i.onerror=()=>{this.loadingLogos.delete(s)},i.src=s}return null}drawAreaLogo(s,e,i,o,n){const c=s.logo,a=this.getLogoImage(c.url);if(!a)return;const{position:r,width:g,height:h,opacity:m}=c,f=this.calculateLogoOffset(r,g,h,o,n),l=e+f.x-g/2,u=i+f.z-h/2,p=this.ctx;p.save(),p.globalAlpha=m,p.drawImage(a,l,u,g,h),p.restore()}calculateLogoOffset(s,e,i,o,n){if(s==="center")return{x:0,z:0};const c=e/2+.2,a=i/2+.2;switch(s){case"top-left":return{x:-o/2+c,z:-n/2+a};case"top-right":return{x:o/2-c,z:-n/2+a};case"bottom-left":return{x:-o/2+c,z:n/2-a};case"bottom-right":return{x:o/2-c,z:n/2-a};default:return{x:0,z:0}}}drawAreaPreview(s,e,i){const o=this.camera.getZoom(),n=this.ctx,c="#4a9eff";if(this.camera.applyTransform(n),i==="rectangle"){const a=Math.min(s.x,e.x),r=Math.max(s.x,e.x),g=Math.min(s.z,e.z),h=Math.max(s.z,e.z),m=r-a,f=h-g;if(m<.1&&f<.1){this.camera.restoreTransform(n);return}n.fillStyle="rgba(74, 158, 255, 0.2)",n.fillRect(a,g,m,f),n.setLineDash([6/o,4/o]),n.lineDashOffset=0,n.strokeStyle=c,n.lineWidth=2/o,n.strokeRect(a,g,m,f),n.setLineDash([])}else if(i==="circle"){const a=e.x-s.x,r=e.z-s.z,g=Math.sqrt(a*a+r*r);if(g<.1){this.camera.restoreTransform(n);return}n.fillStyle="rgba(74, 158, 255, 0.2)",n.beginPath(),n.arc(s.x,s.z,g,0,Math.PI*2),n.fill(),n.setLineDash([6/o,4/o]),n.lineDashOffset=0,n.strokeStyle=c,n.lineWidth=2/o,n.beginPath(),n.arc(s.x,s.z,g,0,Math.PI*2),n.stroke(),n.setLineDash([])}this.camera.restoreTransform(n)}}const Xt={idle:{color:"#4aff9e",glow:"rgba(74, 255, 158, 0.6)",darkColor:"#2a9a5e"},working:{color:"#4a9eff",glow:"rgba(74, 158, 255, 0.6)",darkColor:"#2a5e9a"},waiting:{color:"#ffcc00",glow:"rgba(255, 204, 0, 0.6)",darkColor:"#9a7a00"},waiting_permission:{color:"#ffcc00",glow:"rgba(255, 204, 0, 0.6)",darkColor:"#9a7a00"},orphaned:{color:"#ff00ff",glow:"rgba(255, 0, 255, 0.6)",darkColor:"#9a009a"},running:{color:"#4aff9e",glow:"rgba(74, 255, 158, 0.6)",darkColor:"#2a9a5e"},stopped:{color:"#8a8a8a",glow:"rgba(138, 138, 138, 0.6)",darkColor:"#5a5a5a"},starting:{color:"#4a9eff",glow:"rgba(74, 158, 255, 0.6)",darkColor:"#2a5e9a"},stopping:{color:"#ffaa00",glow:"rgba(255, 170, 0, 0.6)",darkColor:"#9a6a00"},unknown:{color:"#ffaa00",glow:"rgba(255, 170, 0, 0.6)",darkColor:"#9a6a00"},error:{color:"#ff4a4a",glow:"rgba(255, 74, 74, 0.6)",darkColor:"#9a2a2a"}},Zt={"server-rack":{color:"#5a7a9a",darkColor:"#3a5a7a",emoji:"🖥️"},desktop:{color:"#7a9a7a",darkColor:"#5a7a5a",emoji:"💻"},"filing-cabinet":{color:"#9a8a6a",darkColor:"#7a6a4a",emoji:"🗄️"},factory:{color:"#9a6a6a",darkColor:"#7a4a4a",emoji:"🏭"},satellite:{color:"#6a6a9a",darkColor:"#4a4a7a",emoji:"📡"},crystal:{color:"#9a6a9a",darkColor:"#7a4a7a",emoji:"💎"},tower:{color:"#6a9a9a",darkColor:"#4a7a7a",emoji:"🗼"},dome:{color:"#7a7a9a",darkColor:"#5a5a7a",emoji:"🔮"},pyramid:{color:"#9a9a6a",darkColor:"#7a7a4a",emoji:"🔺"},"command-center":{color:"#ba9a5a",darkColor:"#9a7a3a",emoji:"🏛️"}};class ce extends rt{constructor(t,s){super(t,s)}drawBuilding(t,s,e=!1){const{x:i,z:o}=t.position,n=1.8*t.scale,c=Zt[t.style]||Zt["server-rack"],a=Xt[t.status]||Xt.stopped;let r=c.color,g=c.darkColor;t.color&&(r=t.color,g=this.darkenColor(t.color,.3)),this.camera.applyTransform(this.ctx);const h=.08,m=.12;if(this.ctx.fillStyle="rgba(0, 0, 0, 0.35)",this.ctx.beginPath(),this.roundedRect(i-n/2+h,o-n/2+m,n,n,.15),this.ctx.fill(),s){const N=.5+Math.sin(this.animationTime*4)*.2;this.ctx.strokeStyle=`rgba(255, 255, 255, ${N})`,this.ctx.lineWidth=4/this.camera.getZoom(),this.ctx.beginPath(),this.roundedRect(i-n/2-.05,o-n/2-.05,n+.1,n+.1,.2),this.ctx.stroke()}e&&!s&&(this.ctx.strokeStyle="rgba(255, 255, 255, 0.4)",this.ctx.lineWidth=2/this.camera.getZoom(),this.ctx.beginPath(),this.roundedRect(i-n/2,o-n/2,n,n,.15),this.ctx.stroke());const f=this.ctx.createLinearGradient(i-n/2,o-n/2,i+n/2,o+n/2);f.addColorStop(0,this.lightenColor(r,.2)),f.addColorStop(.3,r),f.addColorStop(1,g),this.ctx.fillStyle=f,this.ctx.beginPath(),this.roundedRect(i-n/2,o-n/2,n,n,.15),this.ctx.fill(),this.ctx.strokeStyle="rgba(255, 255, 255, 0.25)",this.ctx.lineWidth=2/this.camera.getZoom(),this.ctx.beginPath(),this.ctx.moveTo(i-n/2+.15,o-n/2+.02),this.ctx.lineTo(i+n/2-.15,o-n/2+.02),this.ctx.stroke(),this.ctx.strokeStyle="rgba(0, 0, 0, 0.3)",this.ctx.lineWidth=2/this.camera.getZoom(),this.ctx.beginPath(),this.ctx.moveTo(i-n/2+.15,o+n/2-.02),this.ctx.lineTo(i+n/2-.15,o+n/2-.02),this.ctx.stroke();const l=.6+Math.sin(this.animationTime*3)*.15;this.ctx.strokeStyle=this.hexToRgba(a.color,l),this.ctx.lineWidth=3/this.camera.getZoom(),this.ctx.beginPath(),this.roundedRect(i-n/2,o-n/2,n,n,.15),this.ctx.stroke(),this.ctx.strokeStyle="rgba(0, 0, 0, 0.4)",this.ctx.lineWidth=1/this.camera.getZoom(),this.ctx.beginPath(),this.roundedRect(i-n/2-.02,o-n/2-.02,n+.04,n+.04,.17),this.ctx.stroke();const u=.18*t.scale,p=i+n/2-u-.1,T=o-n/2+u+.1;this.ctx.fillStyle="rgba(0, 0, 0, 0.5)",this.ctx.beginPath(),this.ctx.arc(p,T,u+.03,0,Math.PI*2),this.ctx.fill();const w=this.ctx.createRadialGradient(p-u*.3,T-u*.3,0,p,T,u);w.addColorStop(0,this.lightenColor(a.color,.4)),w.addColorStop(1,a.color),this.ctx.fillStyle=w,this.ctx.beginPath(),this.ctx.arc(p,T,u,0,Math.PI*2),this.ctx.fill(),this.camera.restoreTransform(this.ctx);const y=this.camera.worldToScreen(i,o),x=n*this.camera.getZoom(),S=Math.max(8,x*.55);this.ctx.font=`${S}px "Segoe UI Emoji", "Apple Color Emoji", "Noto Color Emoji", serif`,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillStyle="rgba(0, 0, 0, 0.3)",this.ctx.fillText(c.emoji,y.x+1,y.y+1),this.ctx.fillText(c.emoji,y.x,y.y);const b=this.camera.worldToScreen(i,o+n/2+.25),P=Math.max(6,x*.22);this.ctx.font=`bold ${P}px "Segoe UI", Arial, sans-serif`;const v=this.ctx.measureText(t.name).width,k=6,W=P+6,Z=this.ctx.createLinearGradient(b.x-v/2-k,b.y-W/2,b.x-v/2-k,b.y+W/2);if(Z.addColorStop(0,"rgba(30, 35, 40, 0.9)"),Z.addColorStop(1,"rgba(20, 25, 30, 0.95)"),this.ctx.fillStyle=Z,this.ctx.beginPath(),this.roundedRectScreen(b.x-v/2-k,b.y-W/2,v+k*2,W,4),this.ctx.fill(),this.ctx.strokeStyle=this.hexToRgba(r,.6),this.ctx.lineWidth=1,this.ctx.beginPath(),this.roundedRectScreen(b.x-v/2-k,b.y-W/2,v+k*2,W,4),this.ctx.stroke(),this.ctx.fillStyle="#ffffff",this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(t.name,b.x,b.y),t.gitChangesCount&&t.gitChangesCount>0){const N=this.camera.worldToScreen(i-n/2+.15,o-n/2+.15),q=Math.max(5,x*.1),U=t.gitChangesCount>99?"99+":String(t.gitChangesCount);this.ctx.fillStyle="#c89a5a",this.ctx.beginPath(),this.ctx.arc(N.x,N.y,q,0,Math.PI*2),this.ctx.fill(),this.ctx.strokeStyle="rgba(0, 0, 0, 0.5)",this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.arc(N.x,N.y,q,0,Math.PI*2),this.ctx.stroke();const gt=Math.max(6,q*1.2);this.ctx.font=`bold ${gt}px Arial`,this.ctx.fillStyle="#ffffff",this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(U,N.x,N.y)}}drawBossLine(t,s){this.camera.applyTransform(this.ctx),this.ctx.strokeStyle="rgba(255, 215, 0, 0.4)",this.ctx.lineWidth=2/this.camera.getZoom(),this.ctx.setLineDash([4/this.camera.getZoom(),4/this.camera.getZoom()]),this.ctx.beginPath(),this.ctx.moveTo(t.x,t.z),this.ctx.lineTo(s.x,s.z),this.ctx.stroke(),this.ctx.setLineDash([]),this.camera.restoreTransform(this.ctx)}}const Et={idle:{color:"#4aff9e",glow:"rgba(74, 255, 158, 0.6)",darkColor:"#2a9a5e"},working:{color:"#4a9eff",glow:"rgba(74, 158, 255, 0.6)",darkColor:"#2a5e9a"},waiting:{color:"#ffcc00",glow:"rgba(255, 204, 0, 0.6)",darkColor:"#9a7a00"},waiting_permission:{color:"#ffcc00",glow:"rgba(255, 204, 0, 0.6)",darkColor:"#9a7a00"},error:{color:"#ff4a4a",glow:"rgba(255, 74, 74, 0.6)",darkColor:"#9a2a2a"},orphaned:{color:"#ff00ff",glow:"rgba(255, 0, 255, 0.6)",darkColor:"#9a009a"}};class le extends rt{constructor(s,e,i){super(s,e);d(this,"effect");d(this,"frameCustomClasses",null);d(this,"frameUnseenOutput",null);d(this,"iconImageCache",new Map);d(this,"iconLoadingSet",new Set);this.effect=i}beginFrame(){const s=M.getState();this.frameCustomClasses=s.customAgentClasses,this.frameUnseenOutput=s.agentsWithUnseenOutput}getAgentClassIcon(s){var o;const e=Tt[s];if(e)return e.icon;const i=(o=this.frameCustomClasses)==null?void 0:o.get(s);return i?i.icon:"🤖"}getAgentIconImage(s){var o;const e=(o=this.frameCustomClasses)==null?void 0:o.get(s);if(!(e!=null&&e.iconPath))return null;const i=this.iconImageCache.get(e.iconPath);if(i)return i;if(!this.iconLoadingSet.has(e.iconPath)){this.iconLoadingSet.add(e.iconPath);const n=new Image;n.src=Wt(Gt(`/api/custom-class-icons/${e.iconPath}`)),n.onload=()=>{this.iconImageCache.set(e.iconPath,n),this.iconLoadingSet.delete(e.iconPath)},n.onerror=()=>{this.iconLoadingSet.delete(e.iconPath)}}return null}getDisplayName(s,e){return e!=="compact"||s.length<=12?s:`${s.slice(0,10)}..`}drawAgent(s,e,i,o,n){var Dt;const{x:c,z:a}=s.position,g=(s.isBoss?.7:.5)*o,h=this.camera.getZoom(),m=oe(h),f=ne(h,n&&!!s.taskLabel),l=ae(h),u=l!=="minimal",p=l==="full",T=l==="full",w=l==="full",y=l==="full"||l==="reduced",x=l==="compact"||l==="minimal",S=this.getDisplayName(s.name,l),P=this.animationTime*8,v=s.status==="working",k=v?Math.abs(Math.sin(this.animationTime*4))*4*m:0,W=i?Math.sin(P*2)*.05:0,Z=i?1+Math.sin(P*2)*.08:1,N=i?Math.sin(P)*.15:0,q=Et[s.status]||Et.idle,U=this.numberToHex(s.color),gt=this.darkenColor(U,.4);this.lightenColor(U,.3);const Ht=this.getAgentClassIcon(s.class),A=this.camera.worldToScreen(c,a+W),D=g*this.camera.getZoom();this.ctx.save(),this.ctx.fillStyle="rgba(0, 0, 0, 0.35)",this.ctx.beginPath(),this.ctx.ellipse(A.x+3,A.y+3,D*1.05,D*.95,0,0,Math.PI*2),this.ctx.fill();const Ct=v?.75+Math.sin(this.animationTime*2.5)*.2:.85,ut=D+6,ct=this.ctx.createRadialGradient(A.x,A.y,D,A.x,A.y,ut+4);if(ct.addColorStop(0,"transparent"),ct.addColorStop(.5,this.hexToRgba(q.color,Ct*.5)),ct.addColorStop(1,"transparent"),this.ctx.beginPath(),this.ctx.arc(A.x,A.y,ut+4,0,Math.PI*2),this.ctx.fillStyle=ct,this.ctx.fill(),this.ctx.beginPath(),this.ctx.arc(A.x,A.y,ut,0,Math.PI*2),this.ctx.strokeStyle=this.hexToRgba(q.color,Ct*.8),this.ctx.lineWidth=2,this.ctx.stroke(),e){const z=s.isBoss?.4:.34,I=D+10,C=this.ctx.createRadialGradient(A.x,A.y,D+6,A.x,A.y,I+8);C.addColorStop(0,this.hexToRgba(U,z*.34)),C.addColorStop(.5,this.hexToRgba(U,z*.16)),C.addColorStop(1,"transparent"),this.ctx.beginPath(),this.ctx.arc(A.x,A.y,I+8,0,Math.PI*2),this.ctx.fillStyle=C,this.ctx.fill(),this.ctx.beginPath(),this.ctx.arc(A.x,A.y,I,0,Math.PI*2),this.ctx.strokeStyle=this.hexToRgba(U,s.isBoss?.44:.36),this.ctx.lineWidth=s.isBoss?2.2:1.8,this.ctx.setLineDash([8,4]),this.ctx.lineDashOffset=-this.animationTime*12,this.ctx.stroke(),this.ctx.setLineDash([])}if(i){const z=D*.25,I=A.y+D*.7;this.ctx.fillStyle="rgba(0, 0, 0, 0.3)",this.ctx.beginPath(),this.ctx.ellipse(A.x,I+4,D*.6,D*.15,0,0,Math.PI*2),this.ctx.fill(),this.ctx.fillStyle=gt,this.ctx.beginPath(),this.ctx.arc(A.x-D*.3+N*this.camera.getZoom(),I,z,0,Math.PI*2),this.ctx.fill(),this.ctx.beginPath(),this.ctx.arc(A.x+D*.3-N*this.camera.getZoom(),I,z,0,Math.PI*2),this.ctx.fill()}const Ft=i?D/Z:D,Yt=i?D*Z:D,lt=this.ctx.createRadialGradient(A.x-D*.3,A.y-D*.3,0,A.x,A.y,D);lt.addColorStop(0,"#3a3a3a"),lt.addColorStop(.5,"#1a1a1a"),lt.addColorStop(1,"#0a0a0a"),this.ctx.beginPath(),i?this.ctx.ellipse(A.x,A.y,Ft,Yt,0,0,Math.PI*2):this.ctx.arc(A.x,A.y,D,0,Math.PI*2),this.ctx.fillStyle=lt,this.ctx.fill(),this.ctx.strokeStyle=this.hexToRgba(U,.6),this.ctx.lineWidth=2,this.ctx.stroke(),this.ctx.beginPath(),this.ctx.arc(A.x-D*.25,A.y-D*.25,D*.3,0,Math.PI*2),this.ctx.fillStyle="rgba(255, 255, 255, 0.1)",this.ctx.fill(),this.ctx.restore();const yt=this.getAgentIconImage(s.class);if(yt){const z=Math.max(12,D*1.6);this.ctx.save(),this.ctx.beginPath(),this.ctx.arc(A.x,A.y-k,z/2,0,Math.PI*2),this.ctx.clip(),this.ctx.drawImage(yt,A.x-z/2,A.y-k-z/2,z,z),this.ctx.restore()}else{const z=Math.max(6,Math.max(10*m,D*1.1));this.ctx.font=`${z}px "Segoe UI Emoji", "Apple Color Emoji", "Noto Color Emoji", sans-serif`,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(Ht,A.x,A.y+1-k)}if(s.isBoss){const z=Math.max(6,Math.max(8*m,D*.6));this.ctx.font=`${z}px "Segoe UI Emoji", "Apple Color Emoji", "Noto Color Emoji", serif`,this.ctx.textAlign="center",this.ctx.textBaseline="bottom",this.ctx.fillText("👑",A.x,A.y-D-2)}if(x){const z=Math.max(1.5,3.2*m),I=A.x+D*.6,C=A.y-D*.6;this.ctx.beginPath(),this.ctx.arc(I,C,z+1.5,0,Math.PI*2),this.ctx.fillStyle=this.hexToRgba(q.color,.28),this.ctx.fill(),this.ctx.beginPath(),this.ctx.arc(I,C,z,0,Math.PI*2),this.ctx.fillStyle=q.color,this.ctx.fill(),this.ctx.strokeStyle="rgba(255, 255, 255, 0.9)",this.ctx.lineWidth=1,this.ctx.stroke()}if(i)for(let I=0;I<4;I++){const C=P+I*1.5,X=A.x+Math.sin(C*1.5)*D*.5,B=A.y+D*.9+Math.abs(Math.sin(C))*8,L=2+Math.sin(C)*1,$=.4-Math.abs(Math.sin(C))*.3;this.ctx.beginPath(),this.ctx.arc(X,B,L,0,Math.PI*2),this.ctx.fillStyle=`rgba(180, 180, 180, ${$})`,this.ctx.fill()}const ft=o*m,st=A.y+D+12*m,It=o*f;if(u){const z=Math.max(4.5,13*It);this.ctx.font=`bold ${z}px "Segoe UI", Arial, sans-serif`;const I=this.ctx.measureText(S).width,C=Math.max(2,6*f),X=z+Math.max(2,4*f),B=l==="full"&&(s.provider==="claude"||s.provider==="codex"||s.provider==="opencode"),L=B?z*.45:0,$=B?z*.3:0,_=L+$,H=I+_+C*2,j=A.x+_/2,V=this.ctx.createLinearGradient(A.x-H/2,st-X/2,A.x-H/2,st+X/2);if(V.addColorStop(0,"rgba(30, 30, 40, 0.95)"),V.addColorStop(1,"rgba(20, 20, 30, 0.95)"),this.ctx.beginPath(),this.roundedRectScreen(A.x-H/2,st-X/2,H,X,Math.max(2,4*f)),this.ctx.fillStyle=V,this.ctx.fill(),this.ctx.strokeStyle=this.hexToRgba(U,.6),this.ctx.lineWidth=Math.max(.75,1.5*f),this.ctx.stroke(),B){const ot=A.x-H/2+C+L/2,pt=st,xt=s.provider==="codex"?"#4a9eff":s.provider==="opencode"?"#10b981":"#ff9e4a";this.ctx.beginPath(),this.ctx.arc(ot,pt,L/2,0,Math.PI*2),this.ctx.fillStyle=xt,this.ctx.fill(),this.ctx.strokeStyle="rgba(255, 255, 255, 0.9)",this.ctx.lineWidth=Math.max(.75,L*.12),this.ctx.stroke()}this.ctx.fillStyle=U,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.font=`bold ${z}px "Segoe UI", Arial, sans-serif`,this.ctx.fillText(S,j,st)}const kt=At(s).freePercent,nt=Math.max(0,Math.min(100,kt))/100,K=st+(u?Math.max(2.5,(13*It+Math.max(2,4*f))/2):0)+8*m,J=76*m,et=7*m,mt=Math.max(1,2.2*m);if(p){if(this.ctx.beginPath(),this.roundedRectScreen(A.x-J/2,K,J,et,mt),this.ctx.fillStyle="rgba(0, 0, 0, 0.7)",this.ctx.fill(),nt>0){let z,I;nt>.5?(z="#6a9a78",I="#4a7a58"):nt>.2?(z="#c89858",I="#a87838"):(z="#c85858",I="#a83838");const C=this.ctx.createLinearGradient(A.x-J/2,K,A.x-J/2+J*nt,K);C.addColorStop(0,z),C.addColorStop(1,I),this.ctx.beginPath(),this.roundedRectScreen(A.x-J/2,K,J*nt,et,mt),this.ctx.fillStyle=C,this.ctx.fill()}if(this.ctx.beginPath(),this.roundedRectScreen(A.x-J/2,K,J,et,mt),this.ctx.strokeStyle="rgba(100, 150, 150, 0.6)",this.ctx.lineWidth=Math.max(.75,1.5*m),this.ctx.stroke(),T){const z=`${Math.round(kt)}%`,I=Math.max(4.5,10*m);this.ctx.font=`bold ${I}px "Segoe UI", Arial, sans-serif`,this.ctx.fillStyle="rgba(255, 255, 255, 0.95)",this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(z,A.x,K+et/2)}}if(w&&s.status==="idle"&&s.lastActivity>0){const z=Math.floor((Date.now()-s.lastActivity)/1e3);if(z>=5){const I=this.formatIdleTime(z),C=K+et+10*m;let X,B,L;z<60?(X="rgba(74, 158, 74, 0.9)",B="#aaffaa",L="💤"):(z<300,X="rgba(158, 120, 50, 0.9)",B="#ffdd88",L="⏳");const $=Math.max(4.5,9*ft);this.ctx.font=`bold ${$}px "Segoe UI Emoji", "Apple Color Emoji", Arial`;const _=`${L} ${I}`,H=this.ctx.measureText(_).width,j=5*m,V=$+3*m;this.ctx.beginPath(),this.roundedRectScreen(A.x-H/2-j,C-V/2,H+j*2,V,V/2),this.ctx.fillStyle=X,this.ctx.fill(),this.ctx.fillStyle=B,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(_,A.x,C)}}this.effect.updateAgentTool(s.id,s.currentTool);const it=this.effect.getToolAnimation(s.id);if(w&&it&&it.opacity>.01){const z=Rt[it.tool]||Rt.default,I=K+et+10*m,C=it.opacity,X=it.fadeIn?this.easeOutCubic(C):C,B=.8+.2*X,L=Math.max(4.5,10*ft)*B;this.ctx.font=`bold ${L}px "Segoe UI Emoji", "Apple Color Emoji", Arial`;const $=`${z} ${it.tool}`,_=this.ctx.measureText($).width,H=6*m*B,j=L+4*m*B,V=(1-X)*4*m,ot=I+V;this.ctx.beginPath(),this.roundedRectScreen(A.x-_/2-H,ot-j/2,_+H*2,j,j/2),this.ctx.fillStyle=`rgba(74, 118, 158, ${.9*C})`,this.ctx.fill(),this.ctx.strokeStyle=`rgba(74, 158, 255, ${.6*C})`,this.ctx.lineWidth=1,this.ctx.stroke(),this.ctx.fillStyle=`rgba(170, 221, 255, ${C})`,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText($,A.x,ot)}if(w&&n&&s.taskLabel){const z=Math.max(5,15*ft);this.ctx.font=`bold italic ${z}px "Segoe UI", Arial, sans-serif`;const I=s.taskLabel.length>30?s.taskLabel.substring(0,28)+"..":s.taskLabel,C=this.ctx.measureText(I).width,X=6*m,B=z+5*m,L=K+et+10*m;this.ctx.beginPath(),this.roundedRectScreen(A.x-C/2-X,L-B/2,C+X*2,B,B/2),this.ctx.fillStyle="rgba(60, 60, 80, 0.8)",this.ctx.fill(),this.ctx.fillStyle="rgba(180, 195, 215, 0.95)",this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(I,A.x,L)}if(y&&((Dt=this.frameUnseenOutput)!=null&&Dt.has(s.id))){const z=10*m,I=A.x+D*.7,C=A.y-D*.7,X=this.ctx.createRadialGradient(I,C,0,I,C,z*1.5);X.addColorStop(0,"rgba(74, 158, 255, 0.8)"),X.addColorStop(1,"rgba(74, 158, 255, 0)"),this.ctx.beginPath(),this.ctx.arc(I,C,z*1.5,0,Math.PI*2),this.ctx.fillStyle=X,this.ctx.fill();const B=z*.9,L=-Math.PI/2,$=L+2*Math.PI/3,_=L+4*Math.PI/3,H=I+B*Math.cos(L),j=C+B*Math.sin(L),V=I+B*Math.cos($),ot=C+B*Math.sin($),pt=I+B*Math.cos(_),xt=C+B*Math.sin(_);this.ctx.beginPath(),this.ctx.moveTo(H,j),this.ctx.lineTo(V,ot),this.ctx.lineTo(pt,xt),this.ctx.closePath(),this.ctx.fillStyle="#4a9eff",this.ctx.fill(),this.ctx.strokeStyle="#282a36",this.ctx.lineWidth=2,this.ctx.stroke(),this.ctx.fillStyle="#ffffff",this.ctx.font=`bold ${Math.max(8,z*1.2)}px Arial`,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText("!",I,C+1)}}drawSelectionBox(s,e){const i=this.camera.getZoom(),o=Math.min(s.x,e.x),n=Math.max(s.x,e.x),c=Math.min(s.z,e.z),a=Math.max(s.z,e.z),r=n-o,g=a-c;if(r<.1&&g<.1)return;this.camera.applyTransform(this.ctx);const h=this.ctx,m="#4a9eff",f=this.animationTime*30%24,l=6/i,u=3/i;h.strokeStyle="rgba(74, 158, 255, 0.2)",h.lineWidth=6/i,h.beginPath(),h.rect(o,c,r,g),h.stroke();const p=h.createLinearGradient(o,c,n,a);p.addColorStop(0,"rgba(74, 158, 255, 0.15)"),p.addColorStop(.4,"rgba(74, 158, 255, 0.08)"),p.addColorStop(.6,"rgba(74, 158, 255, 0.12)"),p.addColorStop(1,"rgba(100, 180, 255, 0.18)"),h.fillStyle=p,h.beginPath(),h.rect(o,c,r,g),h.fill();const T=h.createLinearGradient(o,c,n,c);T.addColorStop(0,"transparent"),T.addColorStop(.2,"rgba(150, 200, 255, 0.4)"),T.addColorStop(.8,"rgba(150, 200, 255, 0.4)"),T.addColorStop(1,"transparent"),h.strokeStyle=T,h.lineWidth=1.5/i,h.beginPath(),h.moveTo(o+r*.1,c+1/i),h.lineTo(n-r*.1,c+1/i),h.stroke(),h.strokeStyle="rgba(74, 158, 255, 0.9)",h.lineWidth=2/i,h.setLineDash([l,u]),h.lineDashOffset=-f/i,h.beginPath(),h.rect(o,c,r,g),h.stroke(),h.setLineDash([]),h.strokeStyle="rgba(74, 158, 255, 0.3)",h.lineWidth=1/i,h.beginPath(),h.rect(o-1/i,c-1/i,r+2/i,g+2/i),h.stroke();const w=Math.min(r,g)*.15,x=Math.max(w,.3);h.strokeStyle=m,h.lineWidth=3/i,h.lineCap="round",this.drawSelectionCorner(o,c,x,"top-left"),this.drawSelectionCorner(n,c,x,"top-right"),this.drawSelectionCorner(o,a,x,"bottom-left"),this.drawSelectionCorner(n,a,x,"bottom-right");const S=3/i;h.fillStyle=m;const b=.6+Math.sin(this.animationTime*4)*.3,P=[{x:o,y:c},{x:n,y:c},{x:o,y:a},{x:n,y:a}];for(const v of P)h.fillStyle=`rgba(74, 158, 255, ${b*.35})`,h.beginPath(),h.arc(v.x,v.y,S*2.5,0,Math.PI*2),h.fill(),h.fillStyle=m,h.beginPath(),h.arc(v.x,v.y,S,0,Math.PI*2),h.fill();this.camera.restoreTransform(this.ctx)}drawSelectionCorner(s,e,i,o){const n=this.ctx;switch(n.beginPath(),o){case"top-left":n.moveTo(s,e+i),n.lineTo(s,e),n.lineTo(s+i,e);break;case"top-right":n.moveTo(s-i,e),n.lineTo(s,e),n.lineTo(s,e+i);break;case"bottom-left":n.moveTo(s,e-i),n.lineTo(s,e),n.lineTo(s+i,e);break;case"bottom-right":n.moveTo(s-i,e),n.lineTo(s,e),n.lineTo(s,e-i);break}n.stroke()}}class Ot{constructor(t,s){d(this,"grid");d(this,"area");d(this,"building");d(this,"agent");d(this,"effect");this.effect=new Qt(t,s),this.grid=new te(t,s),this.area=new re(t,s),this.building=new ce(t,s),this.agent=new le(t,s,this.effect)}update(t){this.effect.update(t);const s=this.effect.getAnimationTime();this.grid.setAnimationTime(s),this.area.setAnimationTime(s),this.building.setAnimationTime(s),this.agent.setAnimationTime(s)}drawGround(t){this.grid.drawGround(t)}drawGrid(t,s){this.grid.drawGrid(t,s)}drawArea(t,s=!1){this.area.drawArea(t,s)}drawBuilding(t,s,e=!1){this.building.drawBuilding(t,s,e)}beginAgentFrame(){this.agent.beginFrame()}drawAgent(t,s,e,i,o){this.agent.drawAgent(t,s,e,i,o)}drawBossLine(t,s){this.building.drawBossLine(t,s)}drawSelectionBox(t,s){this.agent.drawSelectionBox(t,s)}drawAreaPreview(t,s,e){this.area.drawAreaPreview(t,s,e)}updateAgentTool(t,s){this.effect.updateAgentTool(t,s)}getToolAnimation(t){return this.effect.getToolAnimation(t)}}const F=class F{constructor(t,s,e){d(this,"canvas");d(this,"camera");d(this,"scene");d(this,"isMouseDown",!1);d(this,"isPanning",!1);d(this,"isSelecting",!1);d(this,"lastMouseX",0);d(this,"lastMouseY",0);d(this,"mouseDownX",0);d(this,"mouseDownY",0);d(this,"mouseDownTime",0);d(this,"lastClickTime",0);d(this,"lastClickTarget",null);d(this,"doubleClickDelay",400);d(this,"selectionBox",null);d(this,"hoveredAgentId",null);d(this,"hoveredBuildingId",null);d(this,"isMouseInCanvas",!1);d(this,"isResizingArea",!1);d(this,"resizeHandleType",null);d(this,"isDraggingBuilding",!1);d(this,"draggingBuildingId",null);d(this,"buildingDragStartPos",null);d(this,"isDraggingAgent",!1);d(this,"draggingAgentId",null);d(this,"agentDragStartPos",null);d(this,"onMouseDown",t=>{const s=this.canvas.getBoundingClientRect(),e=t.clientX-s.left,i=t.clientY-s.top;if(this.isMouseDown=!0,this.mouseDownX=e,this.mouseDownY=i,this.lastMouseX=e,this.lastMouseY=i,this.mouseDownTime=Date.now(),t.button===1){this.isPanning=!0,this.canvas.classList.add("panning"),t.preventDefault();return}if(t.button===0){const o=this.camera.screenToWorld(e,i);if(this.scene.isInDrawingMode()){this.scene.startDrawing(o);return}const n=this.scene.getAreaHandleAtWorldPos(o.x,o.z);if(n){this.isResizingArea=!0,this.resizeHandleType=n.handleType,this.scene.startAreaResize(n.handleType,o);const r=n.handleType;this.canvas.style.cursor=r==="move"?"move":r==="n"||r==="s"?"ns-resize":r==="e"||r==="w"||r==="radius"?"ew-resize":r==="ne"||r==="sw"?"nesw-resize":"nwse-resize";return}const c=this.scene.getAgentAtScreenPos(e,i),a=this.scene.getBuildingAtScreenPos(e,i);if(c){this.draggingAgentId=c.id,this.agentDragStartPos={...o},this.isDraggingAgent=!1;return}if(a&&!c){this.draggingBuildingId=a.id,this.buildingDragStartPos={...o},this.isDraggingBuilding=!1;return}!c&&!a&&(this.isSelecting=!1,this.selectionBox={start:{...o},end:{...o}})}});d(this,"onMouseMove",t=>{var m,f;const s=this.canvas.getBoundingClientRect(),e=t.clientX-s.left,i=t.clientY-s.top;this.camera.setMousePosition(e,i),this.isMouseInCanvas=!0;const o=this.scene.getAgentAtScreenPos(e,i),n=(o==null?void 0:o.id)??null;n!==this.hoveredAgentId&&(this.hoveredAgentId=n,this.scene.handleAgentHover(n,n?{x:t.clientX,y:t.clientY}:null));const c=this.scene.getBuildingAtScreenPos(e,i),a=(c==null?void 0:c.id)??null;if(a!==this.hoveredBuildingId&&(this.hoveredBuildingId=a,(f=(m=this.scene).handleBuildingHover)==null||f.call(m,a)),!this.isMouseDown){const l=this.camera.screenToWorld(e,i),u=this.scene.getAreaHandleAtWorldPos(l.x,l.z);u?u.handleType==="move"?this.canvas.style.cursor="move":u.handleType==="nw"||u.handleType==="se"?this.canvas.style.cursor="nwse-resize":u.handleType==="ne"||u.handleType==="sw"?this.canvas.style.cursor="nesw-resize":u.handleType==="n"||u.handleType==="s"?this.canvas.style.cursor="ns-resize":(u.handleType==="e"||u.handleType==="w"||u.handleType==="radius")&&(this.canvas.style.cursor="ew-resize"):this.canvas.style.cursor=""}if(!this.isMouseDown){this.lastMouseX=e,this.lastMouseY=i;return}const r=e-this.lastMouseX,g=i-this.lastMouseY,h=this.camera.screenToWorld(e,i);if(this.scene.isCurrentlyDrawing()){this.scene.updateDrawing(h),this.lastMouseX=e,this.lastMouseY=i;return}if(this.isResizingArea){this.scene.updateAreaResize(h),this.lastMouseX=e,this.lastMouseY=i;return}if(this.draggingAgentId&&this.agentDragStartPos){const l=h.x-this.agentDragStartPos.x,u=h.z-this.agentDragStartPos.z,p=Math.sqrt(l*l+u*u);!this.isDraggingAgent&&p>.5&&(this.isDraggingAgent=!0,this.canvas.style.cursor="move"),this.isDraggingAgent&&this.scene.handleAgentDragMove(this.draggingAgentId,h),this.lastMouseX=e,this.lastMouseY=i;return}if(this.draggingBuildingId&&this.buildingDragStartPos){const l=h.x-this.buildingDragStartPos.x,u=h.z-this.buildingDragStartPos.z,p=Math.sqrt(l*l+u*u);!this.isDraggingBuilding&&p>.5&&(this.isDraggingBuilding=!0,this.scene.handleBuildingDragStart(this.draggingBuildingId,this.buildingDragStartPos),this.canvas.style.cursor="move"),this.isDraggingBuilding&&this.scene.handleBuildingDragMove(this.draggingBuildingId,h),this.lastMouseX=e,this.lastMouseY=i;return}this.isPanning?this.camera.panBy(r,g):this.selectionBox&&(Math.sqrt(Math.pow(e-this.mouseDownX,2)+Math.pow(i-this.mouseDownY,2))>5&&!this.isSelecting&&(this.isSelecting=!0,this.canvas.classList.add("selecting")),this.isSelecting&&(this.selectionBox.end={...h})),this.lastMouseX=e,this.lastMouseY=i});d(this,"onMouseUp",t=>{const s=this.canvas.getBoundingClientRect(),e=t.clientX-s.left,i=t.clientY-s.top,o=this.camera.screenToWorld(e,i);if(this.scene.isCurrentlyDrawing()){this.scene.finishDrawing(o),this.isMouseDown=!1;return}if(this.isResizingArea){this.scene.finishAreaResize(),this.isResizingArea=!1,this.resizeHandleType=null,this.canvas.style.cursor="",this.isMouseDown=!1;return}if(this.draggingAgentId)if(this.isDraggingAgent){this.scene.handleAgentDragEnd(this.draggingAgentId,o),this.draggingAgentId=null,this.agentDragStartPos=null,this.isDraggingAgent=!1,this.canvas.style.cursor="",this.isMouseDown=!1;return}else this.draggingAgentId=null,this.agentDragStartPos=null,this.isDraggingAgent=!1;if(this.draggingBuildingId)if(this.isDraggingBuilding){this.scene.handleBuildingDragEnd(this.draggingBuildingId,o),this.draggingBuildingId=null,this.buildingDragStartPos=null,this.isDraggingBuilding=!1,this.canvas.style.cursor="",this.isMouseDown=!1;return}else this.draggingBuildingId=null,this.buildingDragStartPos=null,this.isDraggingBuilding=!1,this.canvas.style.cursor="";const n=this.isSelecting,c=this.isPanning;if(n&&this.selectionBox&&(this.scene.handleSelectionBox(this.selectionBox.start,this.selectionBox.end),this.selectionBox=null),!c&&!n&&t.button===0){const a=Date.now()-this.mouseDownTime,r=Math.sqrt(Math.pow(e-this.mouseDownX,2)+Math.pow(i-this.mouseDownY,2));console.log("[2D Scene] mouseUp click check",{clickDuration:a,distFromStart:r,shiftKey:t.shiftKey,wasSelecting:n,wasPanning:c}),a<500&&r<10?this.handleClick(e,i,t.shiftKey):console.log("[2D Scene] mouseUp REJECTED as click",{clickDuration:a,distFromStart:r})}else console.log("[2D Scene] mouseUp NOT a click candidate",{wasPanning:c,wasSelecting:n,button:t.button});this.isMouseDown=!1,this.isPanning=!1,this.isSelecting=!1,this.canvas.classList.remove("panning","selecting")});d(this,"onMouseLeave",()=>{var e,i,o,n;this.isMouseDown=!1,this.isPanning=!1,this.isSelecting=!1,this.selectionBox=null,this.isMouseInCanvas=!1,this.canvas.classList.remove("panning","selecting"),this.canvas.style.cursor="",this.isResizingArea&&(this.scene.finishAreaResize(),this.isResizingArea=!1,this.resizeHandleType=null),this.isDraggingAgent&&this.draggingAgentId&&this.scene.handleAgentDragCancel(this.draggingAgentId),this.draggingAgentId=null,this.agentDragStartPos=null,this.isDraggingAgent=!1,this.isDraggingBuilding&&this.draggingBuildingId&&((i=(e=this.scene).handleBuildingDragCancel)==null||i.call(e,this.draggingBuildingId)),this.draggingBuildingId=null,this.buildingDragStartPos=null,this.isDraggingBuilding=!1,this.hoveredAgentId&&(this.hoveredAgentId=null,this.scene.handleAgentHover(null,null)),this.hoveredBuildingId&&(this.hoveredBuildingId=null,(n=(o=this.scene).handleBuildingHover)==null||n.call(o,null));const{width:t,height:s}=this.camera.getViewportSize();this.camera.setMousePosition(t/2,s/2)});d(this,"onWheel",t=>{t.preventDefault();const s=this.canvas.getBoundingClientRect(),e=t.clientX-s.left,i=t.clientY-s.top,o=!t.ctrlKey&&(Math.abs(t.deltaX)>0||t.deltaMode===0&&Math.abs(t.deltaY)<50);if(t.ctrlKey){const n=-t.deltaY*.01;this.camera.zoomAtPoint(e,i,n)}else if(o)this.camera.panBy(-t.deltaX,-t.deltaY);else{const n=-t.deltaY*.001;this.camera.zoomAtPoint(e,i,n)}});d(this,"onContextMenu",t=>{t.preventDefault();const s=this.canvas.getBoundingClientRect(),e=t.clientX-s.left,i=t.clientY-s.top,o=this.camera.screenToWorld(e,i),n=this.scene.getAgentAtScreenPos(e,i),c=this.scene.getBuildingAtScreenPos(e,i),a=this.scene.getAreaAtScreenPos(e,i);if(M.getState().selectedAgentIds.size>0&&!n&&!c){this.scene.handleMoveCommand({x:o.x,z:o.z}),this.scene.createMoveOrderEffect({x:o.x,z:o.z});return}let g=null;n?g={type:"agent",id:n.id}:c?g={type:"building",id:c.id}:a&&(g={type:"area",id:a.id}),this.scene.handleContextMenu({x:t.clientX,y:t.clientY},{x:o.x,z:o.z},g)});d(this,"onKeyDown",t=>{const s=t.target,e=M.getState(),i=s.tagName==="INPUT"||s.tagName==="TEXTAREA"||s.isContentEditable,o=s.closest(".guake-terminal"),n=o==null?void 0:o.classList.contains("collapsed"),c=M.getShortcuts(),a=c.find(m=>m.id==="next-agent"),r=c.find(m=>m.id==="prev-agent"),g=c.find(m=>m.id==="open-terminal"),h=c.find(m=>m.id==="toggle-spotlight");if(Q(t,h)){console.log("[Scene2DInput] Spotlight shortcut detected, passing through");return}if(i)if((Q(t,a)||Q(t,r))&&n)s.blur();else if(Q(t,g)&&n)s.blur();else return;if((Q(t,a)||Q(t,r))&&!e.terminalOpen){const m=this.getOrderedAgents(e.agents);if(m.length<=1)return;const f=e.selectedAgentIds.size===1?Array.from(e.selectedAgentIds)[0]:null,l=f?m.findIndex(p=>p.id===f):-1;let u;Q(t,a)?u=l===-1?0:(l+1)%m.length:u=l===-1?m.length-1:(l-1+m.length)%m.length,t.preventDefault(),M.selectAgent(m[u].id);return}if(Q(t,g)){if(console.log("[Scene2DInput] Space pressed",{guakeTerminal:!!o,isCollapsedTerminal:n,targetTag:s.tagName,terminalOpen:e.terminalOpen,selectedAgents:e.selectedAgentIds.size,selectedBuildings:e.selectedBuildingIds.size,selectedArea:e.selectedAreaId,lastSelectedAgentId:e.lastSelectedAgentId}),o&&!n){console.log("[Scene2DInput] Space: blocked - inside open terminal");return}if(s.tagName==="BUTTON"||s.tagName==="A"){console.log("[Scene2DInput] Space: blocked - button/link focused");return}if(e.terminalOpen){console.log("[Scene2DInput] Space: blocked - terminal already open");return}if(e.selectedBuildingIds.size>0||e.selectedAreaId!==null){console.log("[Scene2DInput] Space: blocked - building or area focused");return}if(e.selectedAgentIds.size===0){const m=e.lastSelectedAgentId;console.log("[Scene2DInput] Space: no agent selected, trying lastAgentId:",m),m&&e.agents.has(m)?(t.preventDefault(),M.selectAgent(m),M.setTerminalOpen(!0),console.log("[Scene2DInput] Space: opened terminal for last agent:",m)):console.log("[Scene2DInput] Space: no valid last agent to open");return}t.preventDefault(),console.log("[Scene2DInput] Space: opening terminal for selected agent"),M.setTerminalOpen(!0)}});d(this,"touchStartPositions",[]);d(this,"initialPinchDistance",0);d(this,"longPressTimer",null);d(this,"longPressTriggered",!1);d(this,"touchIsPanning",!1);d(this,"touchPanVelocityX",0);d(this,"touchPanVelocityY",0);d(this,"lastTouchMoveTime",0);d(this,"touchInertiaFrameId",null);d(this,"onTouchStart",t=>{t.preventDefault(),this.stopTouchInertia(),this.clearLongPressTimer(),this.longPressTriggered=!1,this.touchIsPanning=!1,this.touchPanVelocityX=0,this.touchPanVelocityY=0,this.lastTouchMoveTime=0;const s=this.canvas.getBoundingClientRect();if(this.touchStartPositions=Array.from(t.touches).map(e=>({x:e.clientX-s.left,y:e.clientY-s.top})),t.touches.length===1){const e=this.touchStartPositions[0].x,i=this.touchStartPositions[0].y;if(this.mouseDownX=e,this.mouseDownY=i,this.lastMouseX=e,this.lastMouseY=i,this.mouseDownTime=Date.now(),this.isMouseDown=!0,this.scene.isInDrawingMode()){const r=this.camera.screenToWorld(e,i);this.scene.startDrawing(r);return}const o=this.camera.screenToWorld(e,i),n=this.scene.getAreaHandleAtWorldPos(o.x,o.z);if(n){this.isResizingArea=!0,this.resizeHandleType=n.handleType,this.scene.startAreaResize(n.handleType,o);return}const c=t.touches[0].clientX,a=t.touches[0].clientY;this.longPressTimer=setTimeout(()=>{this.longPressTriggered=!0,this.longPressTimer=null,this.handleTouchLongPress(c,a),navigator.vibrate&&navigator.vibrate(50)},F.TOUCH_LONG_PRESS_DURATION)}else t.touches.length===2&&(this.clearLongPressTimer(),this.initialPinchDistance=this.getPinchDistance(t.touches),this.isPanning=!1)});d(this,"onTouchMove",t=>{t.preventDefault();const s=this.canvas.getBoundingClientRect();if(t.touches.length===1){const e=t.touches[0].clientX-s.left,i=t.touches[0].clientY-s.top;if(this.scene.isCurrentlyDrawing()){const a=this.camera.screenToWorld(e,i);this.scene.updateDrawing(a),this.lastMouseX=e,this.lastMouseY=i;return}if(this.isResizingArea){const a=this.camera.screenToWorld(e,i);this.scene.updateAreaResize(a),this.lastMouseX=e,this.lastMouseY=i;return}const o=e-this.mouseDownX,n=i-this.mouseDownY;if((Math.abs(o)>F.TOUCH_DRAG_THRESHOLD||Math.abs(n)>F.TOUCH_DRAG_THRESHOLD)&&(this.clearLongPressTimer(),this.touchIsPanning=!0),this.touchIsPanning){const a=this.lastTouchMoveTime>0?Math.max(1,t.timeStamp-this.lastTouchMoveTime):16,r=e-this.lastMouseX,g=i-this.lastMouseY,h=r/a,m=g/a;this.touchPanVelocityX=this.touchPanVelocityX*.7+h*.3,this.touchPanVelocityY=this.touchPanVelocityY*.7+m*.3,this.camera.panBy(r,g)}this.lastTouchMoveTime=t.timeStamp,this.lastMouseX=e,this.lastMouseY=i}else if(t.touches.length===2){this.clearLongPressTimer();const e=this.getPinchDistance(t.touches),i=(e-this.initialPinchDistance)*.01,o=(t.touches[0].clientX+t.touches[1].clientX)/2-s.left,n=(t.touches[0].clientY+t.touches[1].clientY)/2-s.top;this.camera.zoomAtPoint(o,n,i),this.initialPinchDistance=e}});d(this,"onTouchEnd",t=>{if(this.clearLongPressTimer(),t.touches.length===0&&this.touchStartPositions.length===1){if(this.scene.isCurrentlyDrawing()){const i=this.camera.screenToWorld(this.lastMouseX,this.lastMouseY);this.scene.finishDrawing(i),this.isMouseDown=!1,this.touchStartPositions=[],this.touchIsPanning=!1;return}if(this.isResizingArea){this.scene.finishAreaResize(),this.isResizingArea=!1,this.resizeHandleType=null,this.isMouseDown=!1,this.touchStartPositions=[],this.touchIsPanning=!1;return}if(this.longPressTriggered){this.longPressTriggered=!1,this.isMouseDown=!1,this.isPanning=!1,this.touchStartPositions=[],this.touchIsPanning=!1,this.touchPanVelocityX=0,this.touchPanVelocityY=0,this.lastTouchMoveTime=0;return}const s=Date.now()-this.mouseDownTime,e=Math.sqrt(Math.pow(this.lastMouseX-this.mouseDownX,2)+Math.pow(this.lastMouseY-this.mouseDownY,2));s<300&&e<20&&this.handleClick(this.lastMouseX,this.lastMouseY,!1),this.touchIsPanning&&this.startTouchInertia()}this.isMouseDown=!1,this.isPanning=!1,this.touchStartPositions=[],this.touchIsPanning=!1,this.lastTouchMoveTime=0});d(this,"onTouchCancel",()=>{this.stopTouchInertia(),this.clearLongPressTimer(),this.longPressTriggered=!1,this.isMouseDown=!1,this.isPanning=!1,this.touchStartPositions=[],this.touchIsPanning=!1,this.touchPanVelocityX=0,this.touchPanVelocityY=0,this.lastTouchMoveTime=0});this.canvas=t,this.camera=s,this.scene=e,this.setupEventListeners()}dispose(){this.stopTouchInertia(),this.canvas.removeEventListener("mousedown",this.onMouseDown),this.canvas.removeEventListener("mousemove",this.onMouseMove),this.canvas.removeEventListener("mouseup",this.onMouseUp),this.canvas.removeEventListener("mouseleave",this.onMouseLeave),this.canvas.removeEventListener("wheel",this.onWheel),this.canvas.removeEventListener("contextmenu",this.onContextMenu),this.canvas.removeEventListener("touchstart",this.onTouchStart),this.canvas.removeEventListener("touchmove",this.onTouchMove),this.canvas.removeEventListener("touchend",this.onTouchEnd),this.canvas.removeEventListener("touchcancel",this.onTouchCancel),document.removeEventListener("keydown",this.onKeyDown,!0),this.clearLongPressTimer()}setupEventListeners(){this.canvas.addEventListener("mousedown",this.onMouseDown),this.canvas.addEventListener("mousemove",this.onMouseMove),this.canvas.addEventListener("mouseup",this.onMouseUp),this.canvas.addEventListener("mouseleave",this.onMouseLeave),this.canvas.addEventListener("wheel",this.onWheel,{passive:!1}),this.canvas.addEventListener("contextmenu",this.onContextMenu),this.canvas.addEventListener("touchstart",this.onTouchStart,{passive:!1}),this.canvas.addEventListener("touchmove",this.onTouchMove,{passive:!1}),this.canvas.addEventListener("touchend",this.onTouchEnd),this.canvas.addEventListener("touchcancel",this.onTouchCancel),document.addEventListener("keydown",this.onKeyDown,!0)}getOrderedAgents(t){const s=Array.from(t.values()),e=new Set(s.map(f=>f.id)),o=_t(Vt.AGENT_ORDER,[]).filter(f=>e.has(f)),c=s.filter(f=>!o.includes(f.id)).sort((f,l)=>(f.createdAt||0)-(l.createdAt||0)).map(f=>f.id),a=[...o,...c],r=new Map(s.map(f=>[f.id,f])),g=a.map(f=>r.get(f)).filter(f=>f!==void 0),h=new Map;for(const f of g){const l=M.getAreaForAgent(f.id),u=(l==null?void 0:l.id)||null;h.has(u)||h.set(u,{area:l?{name:l.name}:null,agents:[]}),h.get(u).agents.push(f)}const m=Array.from(h.values());return m.sort((f,l)=>{var u,p;return!f.area&&l.area?1:f.area&&!l.area?-1:!f.area&&!l.area?0:(((u=f.area)==null?void 0:u.name)||"").localeCompare(((p=l.area)==null?void 0:p.name)||"")}),m.flatMap(f=>f.agents)}startTouchInertia(){if(Math.hypot(this.touchPanVelocityX,this.touchPanVelocityY)<F.TOUCH_INERTIA_MIN_SPEED)return;this.stopTouchInertia();let s=this.touchPanVelocityX,e=this.touchPanVelocityY,i=performance.now();const o=n=>{const c=Math.max(1,n-i);i=n,this.camera.panBy(s*c,e*c);const a=Math.pow(F.TOUCH_INERTIA_DECAY,c/(1e3/60));if(s*=a,e*=a,Math.hypot(s,e)<F.TOUCH_INERTIA_MIN_SPEED){this.touchInertiaFrameId=null,this.touchPanVelocityX=0,this.touchPanVelocityY=0;return}this.touchInertiaFrameId=requestAnimationFrame(o)};this.touchInertiaFrameId=requestAnimationFrame(o)}stopTouchInertia(){this.touchInertiaFrameId!==null&&(cancelAnimationFrame(this.touchInertiaFrameId),this.touchInertiaFrameId=null)}clearLongPressTimer(){this.longPressTimer&&(clearTimeout(this.longPressTimer),this.longPressTimer=null)}handleTouchLongPress(t,s){const e=this.canvas.getBoundingClientRect(),i=t-e.left,o=s-e.top,n=this.camera.screenToWorld(i,o),c=this.scene.getAgentAtScreenPos(i,o),a=this.scene.getBuildingAtScreenPos(i,o),r=this.scene.getAreaAtScreenPos(i,o);if(M.getState().selectedAgentIds.size>0&&!c&&!a){this.scene.handleMoveCommand({x:n.x,z:n.z}),this.scene.createMoveOrderEffect({x:n.x,z:n.z});return}let h=null;c?h={type:"agent",id:c.id}:a?h={type:"building",id:a.id}:r?h={type:"area",id:r.id}:h={type:"ground"},this.scene.handleContextMenu({x:t,y:s},{x:n.x,z:n.z},h)}getPinchDistance(t){return Math.sqrt(Math.pow(t[0].clientX-t[1].clientX,2)+Math.pow(t[0].clientY-t[1].clientY,2))}handleClick(t,s,e){const i=this.scene.getAgentAtScreenPos(t,s),o=this.scene.getBuildingAtScreenPos(t,s),n=Date.now();if(console.log("[2D Scene] handleClick",{agentId:i==null?void 0:i.id,buildingId:o==null?void 0:o.id,shiftKey:e}),i)this.lastClickTarget===i.id&&n-this.lastClickTime<this.doubleClickDelay?(window.innerWidth<=768?M.openTerminalOnMobile(i.id):(M.selectAgent(i.id),M.setTerminalOpen(!0)),this.scene.handleAgentDoubleClick(i.id),this.lastClickTime=0,this.lastClickTarget=null):(this.scene.handleAgentClick(i.id,e),this.lastClickTime=n,this.lastClickTarget=i.id);else if(o)if(this.lastClickTarget===o.id&&n-this.lastClickTime<this.doubleClickDelay)this.scene.handleBuildingDoubleClick(o.id),this.lastClickTime=0,this.lastClickTarget=null;else{const c=this.canvas.getBoundingClientRect();this.scene.handleBuildingClick(o.id,{x:t+c.left,y:s+c.top}),this.lastClickTime=n,this.lastClickTarget=o.id}else{const c=this.scene.getAreaFolderIconAtScreenPos(t,s);if(c){this.scene.handleAreaFolderClick(c.areaId,c.folderPath),this.lastClickTime=0,this.lastClickTarget=null;return}const a=this.scene.getAreaAtScreenPos(t,s),r=this.camera.screenToWorld(t,s);if(a){const g=`area:${a.id}`;this.lastClickTarget===g&&n-this.lastClickTime<this.doubleClickDelay?(this.scene.selectArea(a.id),this.scene.handleAreaDoubleClick(a.id),this.lastClickTime=0,this.lastClickTarget=null):(this.scene.selectArea(a.id),this.lastClickTime=n,this.lastClickTarget=g)}else this.scene.selectArea(null),this.scene.handleGroundClick({x:r.x,z:r.z}),this.lastClickTime=0,this.lastClickTarget=null}}focusCameraOnAgent(t){const s=this.scene.getAgentData(t);s&&this.camera.focusOn(s.position.x,s.position.z,50)}focusCameraOnBuilding(t){const s=this.scene.getBuildingData(t);s&&this.camera.focusOn(s.position.x,s.position.z,40)}getSelectionBox(){return this.selectionBox}};d(F,"ENABLE_DOUBLE_CLICK_CAMERA_FOCUS",!1),d(F,"TOUCH_LONG_PRESS_DURATION",500),d(F,"TOUCH_DRAG_THRESHOLD",5),d(F,"TOUCH_INERTIA_DECAY",.9),d(F,"TOUCH_INERTIA_MIN_SPEED",.02);let Mt=F;class he{constructor(t,s){d(this,"viewportWidth");d(this,"viewportHeight");d(this,"posX",0);d(this,"posZ",0);d(this,"zoom",30);d(this,"minZoom",5);d(this,"maxZoom",150);d(this,"targetPosX",0);d(this,"targetPosZ",0);d(this,"targetZoom",30);d(this,"panSmoothing",.12);d(this,"zoomSmoothing",.15);d(this,"focusSmoothing",.08);d(this,"currentPanSmoothing",.12);d(this,"panLimitEnabled",!0);d(this,"panLimitRadius",50);d(this,"edgePanEnabled",!1);d(this,"edgePanMargin",40);d(this,"edgePanSpeed",8);d(this,"mouseScreenX",0);d(this,"mouseScreenY",0);d(this,"isAnimating",!1);d(this,"animationCallback",null);d(this,"saveTimeout",null);d(this,"needsSave",!1);this.viewportWidth=t,this.viewportHeight=s,this.loadState()}loadState(){const t=Ut();t&&(this.posX=t.posX,this.posZ=t.posZ,this.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,t.zoom)),this.targetPosX=this.posX,this.targetPosZ=this.posZ,this.targetZoom=this.zoom)}scheduleSave(){this.needsSave=!0,!this.saveTimeout&&(this.saveTimeout=setTimeout(()=>{this.needsSave&&(Bt(this.posX,this.posZ,this.zoom),this.needsSave=!1),this.saveTimeout=null},500))}saveState(){this.saveTimeout&&(clearTimeout(this.saveTimeout),this.saveTimeout=null),Bt(this.posX,this.posZ,this.zoom),this.needsSave=!1}setViewportSize(t,s){this.viewportWidth=t,this.viewportHeight=s}getViewportSize(){return{width:this.viewportWidth,height:this.viewportHeight}}getPosition(){return{x:this.posX,z:this.posZ}}setPosition(t,s){const e=this.clampPosition(t,s);this.posX=e.x,this.posZ=e.z,this.targetPosX=e.x,this.targetPosZ=e.z}panTo(t,s,e=!0){const i=this.clampPosition(t,s);e?(this.targetPosX=i.x,this.targetPosZ=i.z,this.currentPanSmoothing=this.panSmoothing):(this.posX=i.x,this.posZ=i.z,this.targetPosX=i.x,this.targetPosZ=i.z)}panBy(t,s){const e=t/this.zoom,i=s/this.zoom,o=this.posX-e,n=this.posZ-i,c=this.clampPosition(o,n);this.posX=c.x,this.posZ=c.z,this.targetPosX=c.x,this.targetPosZ=c.z}focusOn(t,s,e,i){this.isAnimating=!0,this.animationCallback=i||null,this.currentPanSmoothing=this.focusSmoothing;const o=this.clampPosition(t,s);this.targetPosX=o.x,this.targetPosZ=o.z,e!==void 0&&(this.targetZoom=Math.max(this.minZoom,Math.min(this.maxZoom,e)))}focusOnBounds(t,s,e,i,o=2){const n=(t+s)/2,c=(e+i)/2,a=s-t+o*2,r=i-e+o*2,g=this.viewportWidth/a,h=this.viewportHeight/r,m=Math.min(g,h)*.9;this.focusOn(n,c,Math.max(this.minZoom,Math.min(this.maxZoom,m)))}getZoom(){return this.zoom}getZoomLimits(){return{min:this.minZoom,max:this.maxZoom}}setZoom(t){this.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,t)),this.targetZoom=this.zoom}setZoomLimits(t,s){this.minZoom=t,this.maxZoom=s,this.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.zoom)),this.targetZoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.targetZoom))}zoomTo(t,s=!0){const e=Math.max(this.minZoom,Math.min(this.maxZoom,t));s?this.targetZoom=e:(this.zoom=e,this.targetZoom=e)}zoomAtPoint(t,s,e,i=!0){const o=Math.max(this.minZoom,Math.min(this.maxZoom,this.targetZoom*(1+e)));if(i){const n=this.screenToWorld(t,s);this.targetZoom=o;const c=this.viewportWidth/2,a=this.viewportHeight/2,r=this.targetPosX+(t-c)/o,g=this.targetPosZ+(s-a)/o,h=n.x-r,m=n.z-g,f=this.clampPosition(this.targetPosX+h,this.targetPosZ+m);this.targetPosX=f.x,this.targetPosZ=f.z}else{const n=this.screenToWorld(t,s);this.zoom=o,this.targetZoom=o;const c=this.screenToWorld(t,s),a=this.clampPosition(this.posX+n.x-c.x,this.posZ+n.z-c.z);this.posX=a.x,this.posZ=a.z,this.targetPosX=a.x,this.targetPosZ=a.z}}setPanLimits(t,s){this.panLimitEnabled=t,s!==void 0&&(this.panLimitRadius=s)}getPanLimits(){return{enabled:this.panLimitEnabled,radius:this.panLimitRadius}}clampPosition(t,s){if(!this.panLimitEnabled)return{x:t,z:s};const e=Math.max(-this.panLimitRadius,Math.min(this.panLimitRadius,t)),i=Math.max(-this.panLimitRadius,Math.min(this.panLimitRadius,s));return{x:e,z:i}}setEdgePanning(t,s,e){this.edgePanEnabled=t,s!==void 0&&(this.edgePanMargin=s),e!==void 0&&(this.edgePanSpeed=e)}getEdgePanSettings(){return{enabled:this.edgePanEnabled,margin:this.edgePanMargin,speed:this.edgePanSpeed}}setMousePosition(t,s){this.mouseScreenX=t,this.mouseScreenY=s}processEdgePanning(t){if(!this.edgePanEnabled)return;let s=0,e=0;if(this.mouseScreenX<this.edgePanMargin?s=-1*(1-this.mouseScreenX/this.edgePanMargin):this.mouseScreenX>this.viewportWidth-this.edgePanMargin&&(s=1*(1-(this.viewportWidth-this.mouseScreenX)/this.edgePanMargin)),this.mouseScreenY<this.edgePanMargin?e=-1*(1-this.mouseScreenY/this.edgePanMargin):this.mouseScreenY>this.viewportHeight-this.edgePanMargin&&(e=1*(1-(this.viewportHeight-this.mouseScreenY)/this.edgePanMargin)),s!==0||e!==0){const i=this.edgePanSpeed*t,o=this.targetPosX+s*i,n=this.targetPosZ+e*i,c=this.clampPosition(o,n);this.targetPosX=c.x,this.targetPosZ=c.z}}screenToWorld(t,s){const e=this.viewportWidth/2,i=this.viewportHeight/2,o=this.posX+(t-e)/this.zoom,n=this.posZ+(s-i)/this.zoom;return{x:o,z:n}}worldToScreen(t,s){const e=this.viewportWidth/2,i=this.viewportHeight/2,o=e+(t-this.posX)*this.zoom,n=i+(s-this.posZ)*this.zoom;return{x:o,y:n}}getVisibleBounds(){const t=this.viewportWidth/2/this.zoom,s=this.viewportHeight/2/this.zoom;return{minX:this.posX-t,maxX:this.posX+t,minZ:this.posZ-s,maxZ:this.posZ+s}}isVisible(t,s,e=0){const i=this.getVisibleBounds();return t>=i.minX-e&&t<=i.maxX+e&&s>=i.minZ-e&&s<=i.maxZ+e}update(t=1/60){this.processEdgePanning(t);const s=1-Math.exp(-this.currentPanSmoothing*60*t),e=1-Math.exp(-this.zoomSmoothing*60*t),i=this.posX,o=this.posZ,n=this.zoom,c=.001,a=.01,r=Math.abs(this.targetPosX-this.posX)<c,g=Math.abs(this.targetPosZ-this.posZ)<c,h=Math.abs(this.targetZoom-this.zoom)<a;r?this.posX=this.targetPosX:this.posX+=(this.targetPosX-this.posX)*s,g?this.posZ=this.targetPosZ:this.posZ+=(this.targetPosZ-this.posZ)*s,h?this.zoom=this.targetZoom:this.zoom+=(this.targetZoom-this.zoom)*e;const m=r&&g,f=h;this.isAnimating&&m&&f&&(this.isAnimating=!1,this.currentPanSmoothing=this.panSmoothing,this.animationCallback&&(this.animationCallback(),this.animationCallback=null));const l=Math.abs(this.posX-i)>1e-4||Math.abs(this.posZ-o)>1e-4||Math.abs(this.zoom-n)>1e-4;return l&&this.scheduleSave(),l}isCurrentlyAnimating(){return Math.abs(this.posX-this.targetPosX)>.01||Math.abs(this.posZ-this.targetPosZ)>.01||Math.abs(this.zoom-this.targetZoom)>.1}applyTransform(t){t.save(),t.translate(this.viewportWidth/2,this.viewportHeight/2),t.scale(this.zoom,this.zoom),t.translate(-this.posX,-this.posZ)}restoreTransform(t){t.restore()}}const E={moveOrder:{primary:"#4aff9e",secondary:"#2ad87e"},bossLine:{primary:"#ffd700",secondary:"#ffaa00",glow:"rgba(255, 215, 0, 0.4)"},toolBubble:{background:["#2a3040","#1a2030"],border:"#4a9eff"}},Y=class Y{constructor(){d(this,"moveOrderEffects",[]);d(this,"toolBubbles",new Map);d(this,"statusParticles",[]);d(this,"animationTime",0)}update(t){const s=performance.now();this.animationTime+=t,this.moveOrderEffects=this.moveOrderEffects.filter(e=>s-e.startTime<e.duration);for(const[e,i]of this.toolBubbles)s-i.startTime>=i.duration&&this.toolBubbles.delete(e);this.statusParticles=this.statusParticles.filter(e=>s-e.startTime<e.duration);for(const e of this.statusParticles)e.position.x+=e.velocity.x*t,e.position.z+=e.velocity.z*t,e.velocity.z+=t*.5}hasActiveEffects(){return this.moveOrderEffects.length>0||this.toolBubbles.size>0||this.statusParticles.length>0}render(t,s){const e=performance.now();for(const i of this.moveOrderEffects)this.renderMoveOrderEffect(t,s,i,e);for(const i of this.statusParticles)this.renderStatusParticle(t,s,i,e);for(const i of this.toolBubbles.values())this.renderToolBubble(t,s,i,e)}addMoveOrderEffect(t){this.moveOrderEffects.push({position:{...t},startTime:performance.now(),duration:1500})}renderMoveOrderEffect(t,s,e,i){const o=Math.min(1,Math.max(0,(i-e.startTime)/e.duration)),n=s.getZoom(),c=Math.pow(1-o,1.5);s.applyTransform(t);const{x:a,z:r}=e.position,g=3;for(let y=0;y<g;y++){const x=Math.max(0,Math.min(1,o*1.5-y*.15));if(x<=0)continue;const S=c*(1-x)*(1-y*.25),b=.3+x*2,P=Math.max(1,3-x*2)/n,v=t.createRadialGradient(a,r,b*.8,a,r,b*1.2);v.addColorStop(0,this.hexToRgba(E.moveOrder.primary,S)),v.addColorStop(1,this.hexToRgba(E.moveOrder.secondary,S*.5)),t.strokeStyle=this.hexToRgba(E.moveOrder.primary,S*.3),t.lineWidth=P*3,t.beginPath(),t.arc(a,r,b,0,Math.PI*2),t.stroke(),t.strokeStyle=v,t.lineWidth=P,t.beginPath(),t.arc(a,r,b,0,Math.PI*2),t.stroke()}const h=c*.8,m=.25,f=this.animationTime*2;t.save(),t.translate(a,r),t.rotate(f),t.strokeStyle=this.hexToRgba(E.moveOrder.primary,h),t.lineWidth=2/n,t.lineCap="round";const l=m*.3,u=m;t.beginPath(),t.moveTo(0,-l),t.lineTo(0,-u),t.moveTo(0,l),t.lineTo(0,u),t.moveTo(-l,0),t.lineTo(-u,0),t.moveTo(l,0),t.lineTo(u,0),t.stroke(),t.restore();const p=i*.01%1,T=.06+Math.sin(p*Math.PI*2)*.02,w=t.createRadialGradient(a,r,0,a,r,T*2);w.addColorStop(0,this.hexToRgba(E.moveOrder.primary,h)),w.addColorStop(.5,this.hexToRgba(E.moveOrder.secondary,h*.8)),w.addColorStop(1,this.hexToRgba(E.moveOrder.secondary,0)),t.fillStyle=w,t.beginPath(),t.arc(a,r,T*2,0,Math.PI*2),t.fill(),s.restoreTransform(t)}addToolBubble(t,s,e){this.toolBubbles.set(t,{agentId:t,position:{...s},text:e,startTime:performance.now(),duration:4e3})}updateToolBubblePosition(t,s){const e=this.toolBubbles.get(t);e&&(e.position={...s})}removeToolBubble(t){this.toolBubbles.delete(t)}renderToolBubble(t,s,e,i){const o=(i-e.startTime)/e.duration;let n=1;o<.1?n=this.easeOutCubic(o/.1):o>.75&&(n=this.easeInCubic((1-o)/.25));const c=Math.sin(o*Math.PI*4)*.03+o*.15,a=s.worldToScreen(e.position.x,e.position.z-1.2-c),r=Math.max(11,Math.min(14,12*s.getZoom()));t.font=`bold ${r}px "Segoe UI", Arial, sans-serif`;const h=t.measureText(e.text).width,m=10,f=h+m*2,l=r+m*1.5,u=6,p=a.x-f/2,T=a.y-l/2;t.fillStyle=`rgba(0, 0, 0, ${.3*n})`,t.beginPath(),this.roundedRect(t,p+2,T+3,f,l,u),t.fill();const w=t.createLinearGradient(p,T,p,T+l);w.addColorStop(0,this.hexToRgba(E.toolBubble.background[0],n*.95)),w.addColorStop(1,this.hexToRgba(E.toolBubble.background[1],n*.98)),t.fillStyle=w,t.beginPath(),this.roundedRect(t,p,T,f,l,u),t.fill();const y=t.createLinearGradient(p+u,T+1,p+f-u,T+1);y.addColorStop(0,"transparent"),y.addColorStop(.2,`rgba(255, 255, 255, ${n*.15})`),y.addColorStop(.8,`rgba(255, 255, 255, ${n*.15})`),y.addColorStop(1,"transparent"),t.strokeStyle=y,t.lineWidth=1,t.beginPath(),t.moveTo(p+u,T+1),t.lineTo(p+f-u,T+1),t.stroke();const x=t.createLinearGradient(p,T,p,T+l);x.addColorStop(0,this.hexToRgba(E.toolBubble.border,n*.8)),x.addColorStop(1,this.hexToRgba(E.toolBubble.border,n*.5)),t.strokeStyle=x,t.lineWidth=1.5,t.beginPath(),this.roundedRect(t,p,T,f,l,u),t.stroke();const S=8,b=6,P=a.x,v=T+l;t.fillStyle=this.hexToRgba(E.toolBubble.background[1],n*.98),t.beginPath(),t.moveTo(P-S/2,v),t.lineTo(P+S/2,v),t.lineTo(P,v+b),t.closePath(),t.fill(),t.strokeStyle=this.hexToRgba(E.toolBubble.border,n*.6),t.lineWidth=1.5,t.beginPath(),t.moveTo(P-S/2-.5,v),t.lineTo(P,v+b),t.lineTo(P+S/2+.5,v),t.stroke();const k=r*.9;t.font=`${k}px "Segoe UI Emoji", "Apple Color Emoji", serif`,t.fillStyle=this.hexToRgba("#ffcc00",n),t.textAlign="left",t.textBaseline="middle",t.font=`bold ${r}px "Segoe UI", Arial, sans-serif`,t.fillStyle=`rgba(255, 255, 255, ${n})`,t.textAlign="center",t.textBaseline="middle",t.fillText(e.text,a.x,a.y)}renderBossLine(t,s,e,i){s.applyTransform(t);const o=s.getZoom(),n=i.x-e.x,c=i.z-e.z,a=Math.sqrt(n*n+c*c),r=Math.atan2(c,n),g=t.createLinearGradient(e.x,e.z,i.x,i.z);g.addColorStop(0,this.hexToRgba(E.bossLine.primary,.7)),g.addColorStop(.5,this.hexToRgba(E.bossLine.secondary,.5)),g.addColorStop(1,this.hexToRgba(E.bossLine.primary,.7)),t.strokeStyle=E.bossLine.glow,t.lineWidth=6/o,t.lineCap="round",t.beginPath(),t.moveTo(e.x,e.z),t.lineTo(i.x,i.z),t.stroke(),t.strokeStyle=g,t.lineWidth=2.5/o,t.setLineDash([8/o,4/o]),t.lineDashOffset=0,t.beginPath(),t.moveTo(e.x,e.z),t.lineTo(i.x,i.z),t.stroke(),t.setLineDash([]);const h=Math.max(2,Math.floor(a/1.5)),m=.06;for(let p=0;p<=h;p++){const T=p/h,w=e.x+n*T,y=e.z+c*T,x=.35;t.fillStyle=this.hexToRgba(E.bossLine.primary,x),t.beginPath(),t.arc(w,y,m,0,Math.PI*2),t.fill()}const f=.2,l=Math.PI/6,u={x:i.x-Math.cos(r)*.3,z:i.z-Math.sin(r)*.3};t.fillStyle=this.hexToRgba(E.bossLine.primary,.8),t.beginPath(),t.moveTo(u.x,u.z),t.lineTo(u.x-Math.cos(r-l)*f,u.z-Math.sin(r-l)*f),t.lineTo(u.x-Math.cos(r+l)*f,u.z-Math.sin(r+l)*f),t.closePath(),t.fill(),s.restoreTransform(t)}addStatusChangeEffect(t,s){for(let i=0;i<8;i++){const o=i/8*Math.PI*2+Math.random()*.5,n=.5+Math.random()*.8;this.statusParticles.push({position:{...t},velocity:{x:Math.cos(o)*n,z:Math.sin(o)*n-1},color:s,size:.05+Math.random()*.04,startTime:performance.now(),duration:800+Math.random()*400})}}renderStatusParticle(t,s,e,i){const o=(i-e.startTime)/e.duration,n=this.easeOutCubic(1-o),c=e.size*(1-o*.5);s.applyTransform(t);const{x:a,z:r}=e.position,g=t.createRadialGradient(a,r,0,a,r,c*1.5);g.addColorStop(0,this.hexToRgba("#ffffff",n)),g.addColorStop(.2,this.hexToRgba(e.color,n)),g.addColorStop(.6,this.hexToRgba(e.color,n*.4)),g.addColorStop(1,this.hexToRgba(e.color,0)),t.fillStyle=g,t.beginPath(),t.arc(a,r,c*1.5,0,Math.PI*2),t.fill(),s.restoreTransform(t)}addSelectionSparkle(t,s){for(let e=0;e<4;e++){const i=Math.random()*Math.PI*2,o=.3+Math.random()*.2;this.statusParticles.push({position:{x:t.x+Math.cos(i)*o,z:t.z+Math.sin(i)*o},velocity:{x:Math.cos(i)*.3,z:-.5-Math.random()*.3},color:s,size:.04+Math.random()*.03,startTime:performance.now(),duration:500+Math.random()*300})}}roundedRect(t,s,e,i,o,n){t.moveTo(s+n,e),t.lineTo(s+i-n,e),t.arcTo(s+i,e,s+i,e+n,n),t.lineTo(s+i,e+o-n),t.arcTo(s+i,e+o,s+i-n,e+o,n),t.lineTo(s+n,e+o),t.arcTo(s,e+o,s,e+o-n,n),t.lineTo(s,e+n),t.arcTo(s,e,s+n,e,n)}hexToRgba(t,s){const e=Math.round(s*100)/100,i=`${t}|${e}`;let o=Y.rgbaCache.get(i);if(o)return o;let n,c,a;if(t.startsWith("rgba")||t.startsWith("rgb")){const g=t.match(/[\d.]+/g);if(g)return n=parseInt(g[0]),c=parseInt(g[1]),a=parseInt(g[2]),o=`rgba(${n}, ${c}, ${a}, ${e})`,Y.rgbaCache.size>=Y.RGBA_CACHE_MAX&&Y.rgbaCache.clear(),Y.rgbaCache.set(i,o),o}const r=t.replace("#","");return r.length===3?(n=parseInt(r[0]+r[0],16),c=parseInt(r[1]+r[1],16),a=parseInt(r[2]+r[2],16)):(n=parseInt(r.slice(0,2),16),c=parseInt(r.slice(2,4),16),a=parseInt(r.slice(4,6),16)),o=`rgba(${n}, ${c}, ${a}, ${e})`,Y.rgbaCache.size>=Y.RGBA_CACHE_MAX&&Y.rgbaCache.clear(),Y.rgbaCache.set(i,o),o}easeOutCubic(t){return 1-Math.pow(1-t,3)}easeInCubic(t){return t*t*t}clear(){this.moveOrderEffects=[],this.toolBubbles.clear(),this.statusParticles=[]}};d(Y,"rgbaCache",new Map),d(Y,"RGBA_CACHE_MAX",256);let wt=Y;const G=class G{constructor(t){d(this,"canvas");d(this,"ctx");d(this,"renderer");d(this,"input");d(this,"camera");d(this,"effects");d(this,"staticCanvas");d(this,"staticCtx");d(this,"staticRenderer");d(this,"staticDirty",!0);d(this,"needsRender",!0);d(this,"agents",new Map);d(this,"buildings",new Map);d(this,"areas",new Map);d(this,"selectedAgentIds",new Set);d(this,"selectedBuildingIds",new Set);d(this,"animationFrameId",null);d(this,"lastFrameTime",0);d(this,"lastAnimationTime",0);d(this,"lastRenderTime",0);d(this,"isRunning",!1);d(this,"fpsLimit",0);d(this,"frameInterval",0);d(this,"currentDpr",1);d(this,"movements",new Map);d(this,"callbacks",{});d(this,"scale2d",.7);d(this,"showTaskLabels",!0);d(this,"showGrid",!0);d(this,"gridSize",30);d(this,"gridSpacing",2);d(this,"drawingTool",null);d(this,"isDrawing",!1);d(this,"drawStartPos",null);d(this,"drawCurrentPos",null);d(this,"sortedAreasAsc",[]);d(this,"sortedAreasDesc",[]);d(this,"areasSortDirty",!0);d(this,"selectedAreaId",null);d(this,"isResizingArea",!1);d(this,"resizeHandleType",null);d(this,"resizeStartPos",null);d(this,"resizeOriginalArea",null);d(this,"areaDragAgentStartPositions",new Map);d(this,"areaDragBuildingStartPositions",new Map);d(this,"handleResize",()=>{const t=this.canvas.parentElement;if(!t)return;let s=Math.min(window.devicePixelRatio||1,G.MAX_DPR);const e=t.clientWidth,i=t.clientHeight,o=4e6;e*i*s*s>o&&(s=Math.sqrt(o/(e*i))),this.currentDpr=s,this.canvas.width=e*s,this.canvas.height=i*s,this.canvas.style.width=`${e}px`,this.canvas.style.height=`${i}px`,this.staticCanvas.width=e*s,this.staticCanvas.height=i*s,this.ctx.setTransform(1,0,0,1,0,0),this.ctx.scale(s,s),this.staticCtx.setTransform(1,0,0,1,0,0),this.staticCtx.scale(s,s),this.camera.setViewportSize(e,i),this.staticDirty=!0,this.needsRender=!0});d(this,"animate",()=>{if(!this.isRunning)return;this.animationFrameId=requestAnimationFrame(this.animate);const t=performance.now(),s=(t-this.lastFrameTime)/1e3;this.lastFrameTime=t,this.camera.update(s);const e=this.movements.size>0,i=this.effects.hasActiveEffects(),o=this.isDrawing||this.isResizingArea||this.input.getSelectionBox()!==null,n=this.hasWorkingAgents(),c=e||i||o||this.camera.isCurrentlyAnimating(),a=this.hasCameraChanged();if(a&&(this.staticDirty=!0,this.needsRender=!0),(c||n)&&(this.needsRender=!0),!this.needsRender&&this.agents.size===0)return;const r=1e3/G.IDLE_FPS_LIMIT,g=1e3/G.WORKING_FPS_LIMIT;let h;if(c||a?h=this.frameInterval:n?h=this.frameInterval>0?Math.min(this.frameInterval,g):g:h=this.frameInterval>0?Math.min(this.frameInterval,r):r,h>0){if(t-this.lastRenderTime<h)return;this.lastRenderTime=t}jt.tick();const m=(t-this.lastAnimationTime)/1e3;this.lastAnimationTime=t,this.updateMovements(t),(c||n)&&(this.effects.update(m),this.renderer.update(m),this.staticRenderer.update(m)),this.render(),!c&&!n&&(this.needsRender=!1)});d(this,"lastCamX",NaN);d(this,"lastCamZ",NaN);d(this,"lastCamZoom",NaN);this.canvas=t;const s=t.getContext("2d");if(!s)throw new Error("Failed to get 2D context");this.ctx=s,this.staticCanvas=document.createElement("canvas");const e=this.staticCanvas.getContext("2d");if(!e)throw new Error("Failed to get static 2D context");this.staticCtx=e,this.camera=new he(t.width,t.height),this.renderer=new Ot(s,this.camera),this.staticRenderer=new Ot(e,this.camera),this.effects=new wt,this.input=new Mt(t,this.camera,this),this.handleResize(),window.addEventListener("resize",this.handleResize)}start(){this.isRunning||(this.isRunning=!0,this.lastFrameTime=performance.now(),this.lastAnimationTime=this.lastFrameTime,this.animate())}stop(){this.isRunning=!1,this.animationFrameId!==null&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null)}dispose(){this.stop(),this.camera.saveState(),window.removeEventListener("resize",this.handleResize),this.input.dispose(),this.agents.clear(),this.buildings.clear(),this.areas.clear(),this.invalidateAreaSort(),this.staticCanvas.width=0,this.staticCanvas.height=0}hasCameraChanged(){const t=this.camera.getPosition(),s=this.camera.getZoom(),e=Math.round(t.x*1e3),i=Math.round(t.z*1e3),o=Math.round(s*1e3);return e!==this.lastCamX||i!==this.lastCamZ||o!==this.lastCamZoom?(this.lastCamX=e,this.lastCamZ=i,this.lastCamZoom=o,!0):!1}markStaticDirty(){this.staticDirty=!0,this.needsRender=!0}markDirty(){this.needsRender=!0}invalidateAreaSort(){this.areasSortDirty=!0}getSortedAreasAsc(){return this.areasSortDirty&&(this.sortedAreasAsc=Array.from(this.areas.values()).sort((t,s)=>t.zIndex-s.zIndex),this.sortedAreasDesc=Array.from(this.areas.values()).sort((t,s)=>s.zIndex-t.zIndex),this.areasSortDirty=!1),this.sortedAreasAsc}getSortedAreasDesc(){return this.areasSortDirty&&(this.sortedAreasAsc=Array.from(this.areas.values()).sort((t,s)=>t.zIndex-s.zIndex),this.sortedAreasDesc=Array.from(this.areas.values()).sort((t,s)=>s.zIndex-t.zIndex),this.areasSortDirty=!1),this.sortedAreasDesc}hasWorkingAgents(){for(const t of this.agents.values())if(t.status==="working")return!0;return!1}isPointVisible(t,s,e=0){return this.camera.isVisible(t,s,e)}isAreaVisible(t){const s=this.camera.getVisibleBounds(),e=2;if(t.type==="rectangle"&&"width"in t.size){const i=t.position.x-t.size.width/2,o=t.position.x+t.size.width/2,n=t.position.z-t.size.height/2,c=t.position.z+t.size.height/2;return!(o<s.minX-e||i>s.maxX+e||c<s.minZ-e||n>s.maxZ+e)}if(t.type==="circle"&&"radius"in t.size){const i=t.size.radius;return!(t.position.x+i<s.minX-e||t.position.x-i>s.maxX+e||t.position.z+i<s.minZ-e||t.position.z-i>s.maxZ+e)}return!0}updateMovements(t){const s=[];for(const[e,i]of this.movements){const o=t-i.startTime,n=this.agents.get(e);if(!n){s.push(e);continue}const c=Math.min(1,o/i.duration);n.position.x=i.startPos.x+(i.endPos.x-i.startPos.x)*c,n.position.z=i.startPos.z+(i.endPos.z-i.startPos.z)*c;const a=Math.hypot(i.endPos.x-n.position.x,i.endPos.z-n.position.z);(c>=1||a<=G.AGENT_MOVE_SNAP_DISTANCE)&&(n.position.x=i.endPos.x,n.position.z=i.endPos.z,s.push(e))}for(const e of s)this.movements.delete(e)}render(){const{width:t,height:s}=this.canvas,e=this.currentDpr,i=t/e,o=s/e;if(this.staticDirty){this.staticCtx.clearRect(0,0,i,o),this.staticRenderer.drawGround(this.gridSize),this.showGrid&&this.staticRenderer.drawGrid(this.gridSize,this.gridSpacing);for(const a of this.getSortedAreasAsc()){if(!this.isAreaVisible(a))continue;const r=a.id===this.selectedAreaId;this.staticRenderer.drawArea(a,r)}for(const a of this.buildings.values()){if(!this.isPointVisible(a.position.x,a.position.z,2))continue;const r=this.selectedBuildingIds.has(a.id);this.staticRenderer.drawBuilding(a,r)}this.staticDirty=!1}this.ctx.save(),this.ctx.setTransform(1,0,0,1,0,0),this.ctx.drawImage(this.staticCanvas,0,0),this.ctx.restore(),this.renderBossLines(),this.renderer.beginAgentFrame();for(const a of this.agents.values()){if(!this.isPointVisible(a.position.x,a.position.z,2.5))continue;const r=this.selectedAgentIds.has(a.id),g=this.movements.has(a.id);this.renderer.drawAgent(a,r,g,this.scale2d,this.showTaskLabels)}this.effects.render(this.ctx,this.camera);const n=this.input.getSelectionBox();n&&this.renderer.drawSelectionBox(n.start,n.end);const c=this.getDrawingPreview();c&&this.renderer.drawAreaPreview(c.start,c.end,c.tool)}renderBossLines(){var s;const t=new Set;for(const e of this.selectedAgentIds){const i=this.agents.get(e);if(i){if(i.isBoss&&i.subordinateIds)for(const o of i.subordinateIds){const n=this.agents.get(o);n&&(this.isPointVisible(i.position.x,i.position.z,2.5)||this.isPointVisible(n.position.x,n.position.z,2.5))&&(t.add(`${i.id}:${n.id}`),this.effects.renderBossLine(this.ctx,this.camera,i.position,n.position))}if(i.bossId){const o=this.agents.get(i.bossId),n=o?`${o.id}:${i.id}`:null,c=!(o!=null&&o.subordinateIds)||o.subordinateIds.includes(i.id);o&&n&&c&&!t.has(n)&&(this.isPointVisible(o.position.x,o.position.z,2.5)||this.isPointVisible(i.position.x,i.position.z,2.5))&&(t.add(n),this.effects.renderBossLine(this.ctx,this.camera,o.position,i.position))}}}for(const e of this.selectedBuildingIds){const i=this.buildings.get(e);if(i&&i.subordinateBuildingIds&&i.subordinateBuildingIds.length>0)for(const o of i.subordinateBuildingIds){const n=this.buildings.get(o);n&&(this.isPointVisible(i.position.x,i.position.z,2)||this.isPointVisible(n.position.x,n.position.z,2))&&this.effects.renderBossLine(this.ctx,this.camera,i.position,n.position)}}for(const e of this.selectedBuildingIds)for(const i of this.buildings.values())if((s=i.subordinateBuildingIds)!=null&&s.includes(e)){for(const o of i.subordinateBuildingIds){const n=this.buildings.get(o);n&&(this.isPointVisible(i.position.x,i.position.z,2)||this.isPointVisible(n.position.x,n.position.z,2))&&this.effects.renderBossLine(this.ctx,this.camera,i.position,n.position)}break}}addAgent(t){const s=Tt[t.class],e=(s==null?void 0:s.color)??16777215;this.agents.set(t.id,{id:t.id,position:{x:t.position.x,z:t.position.z},name:t.name,class:t.class,status:t.status,isBoss:t.isBoss===!0||t.class==="boss",color:e,contextRemaining:At(t).freePercent,lastActivity:t.lastActivity,subordinateIds:t.subordinateIds,bossId:t.bossId,currentTool:t.currentTool,contextUsed:t.contextUsed,contextLimit:t.contextLimit,contextStats:t.contextStats,provider:t.provider}),this.markDirty()}startAgentMovement(t,s,e){this.movements.set(t,{startPos:{...s},endPos:{...e},startTime:performance.now(),duration:G.AGENT_MOVE_ANIMATION_DURATION_MS})}removeAgent(t){this.agents.delete(t),this.movements.delete(t),this.selectedAgentIds.delete(t),this.markDirty()}updateAgent(t,s=!0){const e=this.agents.get(t.id);if(!e){this.addAgent(t);return}const i=Tt[t.class],o=(i==null?void 0:i.color)??16777215,n=this.movements.get(t.id),c=(n==null?void 0:n.endPos)??e.position;if(Math.hypot(c.x-t.position.x,c.z-t.position.z)>G.AGENT_MOVE_SNAP_DISTANCE){const r=Math.hypot(t.position.x-e.position.x,t.position.z-e.position.z);s&&r>G.AGENT_MOVE_ANIMATION_THRESHOLD?this.startAgentMovement(t.id,e.position,{x:t.position.x,z:t.position.z}):(this.movements.delete(t.id),e.position.x=t.position.x,e.position.z=t.position.z)}e.name=t.name,e.class=t.class,e.status=t.status,e.isBoss=t.isBoss===!0||t.class==="boss",e.color=o,e.contextRemaining=At(t).freePercent,e.lastActivity=t.lastActivity,e.subordinateIds=t.subordinateIds,e.bossId=t.bossId,e.currentTool=t.currentTool,e.contextUsed=t.contextUsed,e.contextLimit=t.contextLimit,e.contextStats=t.contextStats,e.provider=t.provider,e.taskLabel=t.taskLabel,this.markDirty()}syncAgents(t){const s=new Set(t.map(i=>i.id)),e=Pt();for(const i of this.agents.keys())if(!s.has(i)||M.isAgentInArchivedArea(i))this.removeAgent(i);else if(e){const o=M.getAreaForAgent(i);dt((o==null?void 0:o.id)??null)||this.removeAgent(i)}for(const i of t)if(!M.isAgentInArchivedArea(i.id)){if(e){const o=M.getAreaForAgent(i.id);if(!dt((o==null?void 0:o.id)??null))continue}this.updateAgent(i,!0)}}addBuilding(t){this.buildings.set(t.id,{id:t.id,position:{x:t.position.x,z:t.position.z},name:t.name,style:t.style,status:t.status,color:t.color,scale:t.scale||1,subordinateBuildingIds:t.subordinateBuildingIds,gitChangesCount:t.gitChangesCount}),this.markStaticDirty()}removeBuilding(t){this.buildings.delete(t),this.selectedBuildingIds.delete(t),this.markStaticDirty()}updateBuilding(t){const s=this.buildings.get(t.id);if(!s){this.addBuilding(t);return}s.position.x=t.position.x,s.position.z=t.position.z,s.name=t.name,s.style=t.style,s.status=t.status,s.color=t.color,s.scale=t.scale||1,s.subordinateBuildingIds=t.subordinateBuildingIds,s.gitChangesCount=t.gitChangesCount,this.markStaticDirty()}syncBuildings(){this.markStaticDirty();const t=M.getState(),s=!!Pt();for(const e of this.buildings.keys()){const i=t.buildings.get(e);(!i||s&&this.isBuildingHiddenByWorkspace(i,t.areas))&&this.removeBuilding(e)}for(const e of t.buildings.values())s&&this.isBuildingHiddenByWorkspace(e,t.areas)||this.updateBuilding(e)}isBuildingHiddenByWorkspace(t,s){for(const e of s.values())if(!e.archived){if(e.type==="rectangle"&&e.width&&e.height){const i=e.width/2,o=e.height/2;if(t.position.x>=e.center.x-i&&t.position.x<=e.center.x+i&&t.position.z>=e.center.z-o&&t.position.z<=e.center.z+o)return!bt(e.id)}else if(e.type==="circle"&&e.radius){const i=t.position.x-e.center.x,o=t.position.z-e.center.z;if(i*i+o*o<=e.radius*e.radius)return!bt(e.id)}}return!1}syncAreas(){var s;const t=M.getState();this.areas.clear(),this.invalidateAreaSort(),this.markStaticDirty();for(const e of t.areas.values()){if(e.archived||!bt(e.id))continue;const i=e.directories&&e.directories.length>0,o=(s=e.logo)!=null&&s.filename?{url:Wt(Gt(`/api/areas/logos/${e.logo.filename}`)),position:e.logo.position,width:e.logo.width,height:e.logo.height,opacity:e.logo.opacity??.8}:void 0;e.type==="rectangle"&&e.width&&e.height?this.areas.set(e.id,{id:e.id,type:"rectangle",position:{x:e.center.x,z:e.center.z},size:{width:e.width,height:e.height},color:e.color,label:e.name,zIndex:e.zIndex??0,directories:[...e.directories],hasDirectories:i,directoryGitCounts:e.directoryGitCounts?[...e.directoryGitCounts]:void 0,logo:o}):e.type==="circle"&&e.radius&&this.areas.set(e.id,{id:e.id,type:"circle",position:{x:e.center.x,z:e.center.z},size:{radius:e.radius},color:e.color,label:e.name,zIndex:e.zIndex??0,directories:[...e.directories],hasDirectories:i,directoryGitCounts:e.directoryGitCounts?[...e.directoryGitCounts]:void 0,logo:o})}}getSelectedAreaId(){return this.selectedAreaId}selectArea(t){this.selectedAreaId=t,M.selectArea(t),this.markStaticDirty()}isAreaSelected(){return this.selectedAreaId!==null}getAreaHandleAtWorldPos(t,s){if(!this.selectedAreaId)return null;const e=this.areas.get(this.selectedAreaId);if(!e)return null;const i=.4,o=this.camera.getZoom(),n=i*(30/Math.max(o,10)),c=t-e.position.x,a=s-e.position.z;if(Math.sqrt(c*c+a*a)<=n)return{areaId:e.id,handleType:"move"};if(e.type==="rectangle"&&"width"in e.size){const{width:r,height:g}=e.size,h=[{type:"nw",x:e.position.x-r/2,z:e.position.z-g/2},{type:"ne",x:e.position.x+r/2,z:e.position.z-g/2},{type:"sw",x:e.position.x-r/2,z:e.position.z+g/2},{type:"se",x:e.position.x+r/2,z:e.position.z+g/2}];for(const f of h){const l=t-f.x,u=s-f.z;if(Math.sqrt(l*l+u*u)<=n)return{areaId:e.id,handleType:f.type}}const m=[{type:"n",x:e.position.x,z:e.position.z-g/2},{type:"s",x:e.position.x,z:e.position.z+g/2},{type:"e",x:e.position.x+r/2,z:e.position.z},{type:"w",x:e.position.x-r/2,z:e.position.z}];for(const f of m){const l=t-f.x,u=s-f.z;if(Math.sqrt(l*l+u*u)<=n)return{areaId:e.id,handleType:f.type}}}else if(e.type==="circle"&&"radius"in e.size){const r=e.position.x+e.size.radius,g=e.position.z,h=t-r,m=s-g;if(Math.sqrt(h*h+m*m)<=n)return{areaId:e.id,handleType:"radius"}}return null}startAreaResize(t,s){if(!this.selectedAreaId)return;const e=this.areas.get(this.selectedAreaId);if(e&&(this.isResizingArea=!0,this.resizeHandleType=t,this.resizeStartPos={...s},this.resizeOriginalArea={...e,size:{...e.size}},this.areaDragAgentStartPositions.clear(),this.areaDragBuildingStartPositions.clear(),t==="move")){const i=M.getState();for(const o of i.agents.values())this.isPointInsideArea(o.position.x,o.position.z,e)&&this.areaDragAgentStartPositions.set(o.id,{...o.position});for(const o of i.buildings.values())this.isPointInsideArea(o.position.x,o.position.z,e)&&this.areaDragBuildingStartPositions.set(o.id,{...o.position})}}updateAreaResize(t){if(!this.isResizingArea||!this.resizeOriginalArea||!this.resizeHandleType||!this.resizeStartPos)return;const s=this.resizeOriginalArea;let e={};if(this.resizeHandleType==="move"){const i=t.x-this.resizeStartPos.x,o=t.z-this.resizeStartPos.z;e={center:{x:s.position.x+i,z:s.position.z+o}};for(const[n,c]of this.areaDragAgentStartPositions)M.moveAgentLocal(n,{x:c.x+i,y:c.y,z:c.z+o});for(const[n,c]of this.areaDragBuildingStartPositions)M.updateBuildingLocal(n,{position:{x:c.x+i,z:c.z+o}})}else if(s.type==="rectangle"&&"width"in s.size){const i=t.x-this.resizeStartPos.x,o=t.z-this.resizeStartPos.z,n=s.size.width,c=s.size.height,a=s.position.x,r=s.position.z,g=l=>{const u=Math.max(.5,n+l);return{width:u,cx:a+(u-n)/2}},h=l=>{const u=Math.max(.5,n-l);return{width:u,cx:a+(n-u)/2}},m=l=>{const u=Math.max(.5,c+l);return{height:u,cz:r+(u-c)/2}},f=l=>{const u=Math.max(.5,c-l);return{height:u,cz:r+(c-u)/2}};switch(this.resizeHandleType){case"se":{const l=g(i),u=m(o);e={width:l.width,height:u.height,center:{x:l.cx,z:u.cz}};break}case"sw":{const l=h(i),u=m(o);e={width:l.width,height:u.height,center:{x:l.cx,z:u.cz}};break}case"ne":{const l=g(i),u=f(o);e={width:l.width,height:u.height,center:{x:l.cx,z:u.cz}};break}case"nw":{const l=h(i),u=f(o);e={width:l.width,height:u.height,center:{x:l.cx,z:u.cz}};break}case"e":{const l=g(i);e={width:l.width,center:{x:l.cx,z:r}};break}case"w":{const l=h(i);e={width:l.width,center:{x:l.cx,z:r}};break}case"s":{const l=m(o);e={height:l.height,center:{x:a,z:l.cz}};break}case"n":{const l=f(o);e={height:l.height,center:{x:a,z:l.cz}};break}}}else if(s.type==="circle"&&this.resizeHandleType==="radius"){const i=t.x-s.position.x,o=t.z-s.position.z;e={radius:Math.max(.5,Math.sqrt(i*i+o*o))}}Object.keys(e).length>0&&(M.updateArea(this.selectedAreaId,e),this.syncAreas())}finishAreaResize(){if(this.resizeHandleType==="move"&&this.resizeOriginalArea&&this.resizeStartPos){const t=M.getState(),s=this.selectedAreaId?t.areas.get(this.selectedAreaId):null;if(s){const e=s.center.x-this.resizeOriginalArea.position.x,i=s.center.z-this.resizeOriginalArea.position.z;if(e!==0||i!==0){for(const[o,n]of this.areaDragAgentStartPositions)M.moveAgent(o,{x:n.x+e,y:n.y,z:n.z+i});for(const[o,n]of this.areaDragBuildingStartPositions)M.moveBuilding(o,{x:n.x+e,z:n.z+i})}}}this.isResizingArea=!1,this.resizeHandleType=null,this.resizeStartPos=null,this.resizeOriginalArea=null,this.areaDragAgentStartPositions.clear(),this.areaDragBuildingStartPositions.clear()}isPointInsideArea(t,s,e){if(e.type==="rectangle"&&"width"in e.size){const i=e.size.width/2,o=e.size.height/2;return t>=e.position.x-i&&t<=e.position.x+i&&s>=e.position.z-o&&s<=e.position.z+o}if(e.type==="circle"&&"radius"in e.size){const i=t-e.position.x,o=s-e.position.z;return i*i+o*o<=e.size.radius*e.size.radius}return!1}isCurrentlyResizingArea(){return this.isResizingArea}setSelectedAgents(t){this.selectedAgentIds=new Set(t),this.markDirty()}setSelectedBuildings(t){this.selectedBuildingIds=new Set(t),this.markStaticDirty()}refreshSelectionVisuals(){const t=M.getState();this.selectedAgentIds=new Set(t.selectedAgentIds),this.selectedBuildingIds=new Set(t.selectedBuildingIds),this.markStaticDirty()}createMoveOrderEffect(t){this.effects.addMoveOrderEffect(t),this.markDirty()}callSubordinates(t){var n;const e=M.getState().agents.get(t);if(!e||!(e.isBoss||e.class==="boss")||!((n=e.subordinateIds)!=null&&n.length))return;const i={x:e.position.x,z:e.position.z},o=this.calculateFormationPositions(i,e.subordinateIds.length);this.effects.addMoveOrderEffect(i),e.subordinateIds.forEach((c,a)=>{const r=o[a];M.moveAgent(c,{x:r.x,y:0,z:r.z});const g=this.agents.get(c);g&&this.startAgentMovement(c,g.position,r)})}calculateFormationPositions(t,s){const e=[];if(s===1)return[{x:t.x,z:t.z}];if(s<=6){const i=at*Math.max(1,s/3);for(let o=0;o<s;o++){const n=o/s*Math.PI*2-Math.PI/2;e.push({x:t.x+Math.cos(n)*i,z:t.z+Math.sin(n)*i})}}else{const i=Math.ceil(Math.sqrt(s)),o=Math.ceil(s/i),n=(i-1)*at/2,c=(o-1)*at/2;for(let a=0;a<s;a++){const r=a%i,g=Math.floor(a/i);e.push({x:t.x+r*at-n,z:t.z+g*at-c})}}return e}showToolBubble(t,s){const e=this.agents.get(t);e&&(this.effects.addToolBubble(t,e.position,s),this.markDirty())}focusAgent(t,s){const e=this.agents.get(t);e&&this.camera.focusOn(e.position.x,e.position.z,s)}focusBuilding(t,s){const e=this.buildings.get(t);e&&this.camera.focusOn(e.position.x,e.position.z,s)}focusOnContent(){if(this.agents.size===0&&this.buildings.size===0){this.camera.focusOn(0,0,30);return}let t=1/0,s=-1/0,e=1/0,i=-1/0;for(const o of this.agents.values())t=Math.min(t,o.position.x),s=Math.max(s,o.position.x),e=Math.min(e,o.position.z),i=Math.max(i,o.position.z);for(const o of this.buildings.values())t=Math.min(t,o.position.x),s=Math.max(s,o.position.x),e=Math.min(e,o.position.z),i=Math.max(i,o.position.z);this.camera.focusOnBounds(t,s,e,i,3)}getCamera(){return this.camera}setScale2D(t){this.scale2d=t,this.needsRender=!0}setTaskLabelsVisible(t){this.showTaskLabels=t,this.needsRender=!0}setGridVisible(t){this.showGrid=t,this.markStaticDirty()}setFpsLimit(t){this.fpsLimit=t,this.frameInterval=t>0?1e3/t:0,console.log(`[Tide 2D] FPS limit set to ${t}, frameInterval: ${this.frameInterval}ms`)}setCallbacks(t){this.callbacks={...this.callbacks,...t}}handleAgentClick(t,s){var e,i;(i=(e=this.callbacks).onAgentClick)==null||i.call(e,t,s)}handleAgentDoubleClick(t){var s,e;(e=(s=this.callbacks).onAgentDoubleClick)==null||e.call(s,t)}handleAgentHover(t,s){var e,i;(i=(e=this.callbacks).onAgentHover)==null||i.call(e,t,s)}handleBuildingClick(t,s){var e,i;(i=(e=this.callbacks).onBuildingClick)==null||i.call(e,t,s)}handleBuildingDoubleClick(t){var s,e;(e=(s=this.callbacks).onBuildingDoubleClick)==null||e.call(s,t)}handleBuildingHover(t){}handleAgentDragMove(t,s){const e=this.agents.get(t);e&&(this.movements.delete(t),e.position.x=s.x,e.position.z=s.z)}handleAgentDragEnd(t,s){M.moveAgent(t,{x:s.x,y:0,z:s.z}),this.createMoveOrderEffect(s)}handleAgentDragCancel(t){const e=M.getState().agents.get(t),i=this.agents.get(t);i&&e&&(i.position.x=e.position.x,i.position.z=e.position.z)}handleBuildingDragStart(t,s){var e,i;(i=(e=this.callbacks).onBuildingDragStart)==null||i.call(e,t,s)}handleBuildingDragMove(t,s){var e,i;(i=(e=this.callbacks).onBuildingDragMove)==null||i.call(e,t,s)}handleBuildingDragEnd(t,s){var e,i;(i=(e=this.callbacks).onBuildingDragEnd)==null||i.call(e,t,s)}handleBuildingDragCancel(t){var s,e;(e=(s=this.callbacks).onBuildingDragCancel)==null||e.call(s,t)}handleContextMenu(t,s,e){var i,o;(o=(i=this.callbacks).onContextMenu)==null||o.call(i,t,s,e)}handleGroundClick(t){var s,e;(e=(s=this.callbacks).onGroundClick)==null||e.call(s,t)}handleAreaFolderClick(t,s){var e,i;s?M.openFileExplorerForAreaFolder(t,s):M.openFileExplorerForArea(t),(i=(e=this.callbacks).onAreaFolderClick)==null||i.call(e,t,s)}handleAreaDoubleClick(t){var s,e;(e=(s=this.callbacks).onAreaDoubleClick)==null||e.call(s,t)}getAreaFolderIconAtScreenPos(t,s){const e=this.camera.screenToWorld(t,s);this.camera.getZoom();for(const i of this.getSortedAreasDesc()){if(!i.hasDirectories)continue;const o=.5,n=o*1.35,c=i.directories||[];let a,r,g=3;if(i.type==="rectangle"&&"width"in i.size)a=i.position.x-i.size.width/2+o*.8,r=i.position.z-i.size.height/2+o*.8,g=Math.max(1,Math.floor((i.size.width-o*1.2)/n));else if(i.type==="circle"&&"radius"in i.size){const m=i.size.radius*.707;a=i.position.x-m+o*.5,r=i.position.z-m+o*.5,g=Math.max(1,Math.floor((i.size.radius*1.414-o)/n))}else continue;const h=o*.7;for(let m=0;m<c.length;m++){const f=Math.floor(m/g),l=m%g,u=a+l*n,p=r+f*n,T=e.x-u,w=e.z-p;if(Math.sqrt(T*T+w*w)<=h)return{areaId:i.id,folderPath:c[m]}}}return null}handleSelectionBox(t,s){var e,i;(i=(e=this.callbacks).onSelectionBox)==null||i.call(e,t,s)}handleMoveCommand(t){var e,i;const s=Array.from(this.selectedAgentIds);(i=(e=this.callbacks).onMoveCommand)==null||i.call(e,s,t)}getAgents(){return this.agents}getBuildings(){return this.buildings}getAgentData(t){return this.agents.get(t)??null}hasActiveMovement(t){return this.movements.has(t)}getBuildingData(t){return this.buildings.get(t)??null}getAgentAtScreenPos(t,s){const e=this.camera.screenToWorld(t,s);return this.getAgentAtWorldPos(e.x,e.z)}getAgentAtWorldPos(t,s){for(const i of this.agents.values()){const o=t-i.position.x,n=s-i.position.z;if(Math.sqrt(o*o+n*n)<=.8)return i}return null}getBuildingAtScreenPos(t,s){const e=this.camera.screenToWorld(t,s);return this.getBuildingAtWorldPos(e.x,e.z)}getBuildingAtWorldPos(t,s){for(const i of this.buildings.values()){const o=t-i.position.x,n=s-i.position.z;if(Math.sqrt(o*o+n*n)<=1.5*i.scale)return i}return null}getAreaAtScreenPos(t,s){const e=this.camera.screenToWorld(t,s);return this.getAreaAtWorldPos(e.x,e.z)}getAreaAtWorldPos(t,s){for(const e of this.getSortedAreasDesc())if(e.type==="rectangle"&&"width"in e.size){const{width:i,height:o}=e.size,n=e.position.x-i/2,c=e.position.x+i/2,a=e.position.z-o/2,r=e.position.z+o/2;if(t>=n&&t<=c&&s>=a&&s<=r)return e}else if(e.type==="circle"&&"radius"in e.size){const{radius:i}=e.size,o=t-e.position.x,n=s-e.position.z;if(Math.sqrt(o*o+n*n)<=i)return e}return null}setDrawingTool(t){this.drawingTool=t,M.setActiveTool(t),(!t||t==="select")&&this.cancelDrawing()}getDrawingTool(){return this.drawingTool}isInDrawingMode(){return this.drawingTool==="rectangle"||this.drawingTool==="circle"}startDrawing(t){this.isInDrawingMode()&&(this.isDrawing=!0,this.drawStartPos={...t},this.drawCurrentPos={...t})}updateDrawing(t){!this.isDrawing||!this.drawStartPos||(this.drawCurrentPos={...t})}finishDrawing(t){if(!this.isDrawing||!this.drawStartPos){this.cancelDrawing();return}this.drawCurrentPos={...t};const s=this.createAreaFromDraw(this.drawStartPos,t);this.cancelDrawing(),s&&M.addArea(s)}cancelDrawing(){this.isDrawing=!1,this.drawStartPos=null,this.drawCurrentPos=null}isCurrentlyDrawing(){return this.isDrawing}getDrawingPreview(){return!this.isDrawing||!this.drawStartPos||!this.drawCurrentPos||!this.drawingTool||this.drawingTool==="select"?null:{start:this.drawStartPos,end:this.drawCurrentPos,tool:this.drawingTool}}createAreaFromDraw(t,s){if(!this.drawingTool||this.drawingTool==="select")return null;const e=`area-${Date.now()}-${Math.random().toString(36).slice(2,9)}`;if(this.drawingTool==="rectangle"){const i=Math.min(t.x,s.x),o=Math.max(t.x,s.x),n=Math.min(t.z,s.z),c=Math.max(t.z,s.z),a=o-i,r=c-n;return a<.5||r<.5?null:{id:e,name:"New Area",type:"rectangle",center:{x:(i+o)/2,z:(n+c)/2},width:a,height:r,color:"#4a9eff",zIndex:M.getNextZIndex(),assignedAgentIds:[],directories:[]}}else if(this.drawingTool==="circle"){const i=s.x-t.x,o=s.z-t.z,n=Math.sqrt(i*i+o*o);return n<.5?null:{id:e,name:"New Area",type:"circle",center:{x:t.x,z:t.z},radius:n,color:"#4a9eff",zIndex:M.getNextZIndex(),assignedAgentIds:[],directories:[]}}return null}};d(G,"IDLE_FPS_LIMIT",8),d(G,"WORKING_FPS_LIMIT",15),d(G,"MAX_DPR",1.25),d(G,"AGENT_MOVE_ANIMATION_DURATION_MS",500),d(G,"AGENT_MOVE_ANIMATION_THRESHOLD",.5),d(G,"AGENT_MOVE_SNAP_DISTANCE",.01);let zt=G;function de(R,t={}){const s=O.useRef(null),e=O.useRef(t);e.current=t,O.useEffect(()=>{const f=R.current;if(!f)return;const l=new zt(f);s.current=l,typeof window<"u"&&(window.__tideScene2D=l),l.setCallbacks({onAgentClick:(x,S)=>{var b,P;return(P=(b=e.current).onAgentClick)==null?void 0:P.call(b,x,S)},onAgentDoubleClick:x=>{var S,b;return(b=(S=e.current).onAgentDoubleClick)==null?void 0:b.call(S,x)},onAgentHover:(x,S)=>{var b,P;return(P=(b=e.current).onAgentHover)==null?void 0:P.call(b,x,S)},onBuildingClick:(x,S)=>{var b,P;return(P=(b=e.current).onBuildingClick)==null?void 0:P.call(b,x,S)},onBuildingDoubleClick:x=>{var S,b;return(b=(S=e.current).onBuildingDoubleClick)==null?void 0:b.call(S,x)},onBuildingDragStart:(x,S)=>{var b,P;return(P=(b=e.current).onBuildingDragStart)==null?void 0:P.call(b,x,S)},onBuildingDragMove:(x,S)=>{var b,P;return(P=(b=e.current).onBuildingDragMove)==null?void 0:P.call(b,x,S)},onBuildingDragEnd:(x,S)=>{var b,P;return(P=(b=e.current).onBuildingDragEnd)==null?void 0:P.call(b,x,S)},onBuildingDragCancel:x=>{var S,b;return(b=(S=e.current).onBuildingDragCancel)==null?void 0:b.call(S,x)},onContextMenu:(x,S,b)=>{var P,v;return(v=(P=e.current).onContextMenu)==null?void 0:v.call(P,x,S,b)},onGroundClick:x=>{var S,b;return(b=(S=e.current).onGroundClick)==null?void 0:b.call(S,x)},onMoveCommand:(x,S)=>{var b,P;return(P=(b=e.current).onMoveCommand)==null?void 0:P.call(b,x,S)},onAreaDoubleClick:x=>{var S,b;return(b=(S=e.current).onAreaDoubleClick)==null?void 0:b.call(S,x)},onSelectionBox:(x,S)=>{const b=Math.min(x.x,S.x),P=Math.max(x.x,S.x),v=Math.min(x.z,S.z),k=Math.max(x.z,S.z),W=[];for(const Z of l.getAgents().values())Z.position.x>=b&&Z.position.x<=P&&Z.position.z>=v&&Z.position.z<=k&&W.push(Z.id);if(W.length>0){M.selectAgent(W[0]);for(let Z=1;Z<W.length;Z++)M.addToSelection(W[Z])}else M.selectAgent(null)}});const u=M.getState();l.syncAreas(),l.syncBuildings(),l.syncAgents(Array.from(u.agents.values())),l.setSelectedAgents(u.selectedAgentIds),l.setSelectedBuildings(u.selectedBuildingIds),l.start();let p=new Map;for(const x of u.agents.values())p.set(x.id,{x:x.position.x,z:x.position.z});let T=u.agents.size>0;const w=M.subscribe(()=>{var S,b,P;const x=M.getState();if(!T&&x.agents.size>0){T=!0,l.syncAreas(),l.syncAgents(Array.from(x.agents.values()));for(const v of x.agents.values())p.set(v.id,{x:v.position.x,z:v.position.z})}else{const v=Pt();for(const k of x.agents.values()){if(M.isAgentInArchivedArea(k.id)||v&&!dt(((S=M.getAreaForAgent(k.id))==null?void 0:S.id)??null)){p.has(k.id)&&(l.removeAgent(k.id),p.delete(k.id));continue}const Z=p.get(k.id);!Z||Z.x!==k.position.x||Z.z!==k.position.z?(l.updateAgent(k,!0),p.set(k.id,{x:k.position.x,z:k.position.z})):(b=l.hasActiveMovement)!=null&&b.call(l,k.id)||l.updateAgent(k,!1)}for(const k of p.keys()){const W=v&&!dt(((P=M.getAreaForAgent(k))==null?void 0:P.id)??null);(!x.agents.has(k)||M.isAgentInArchivedArea(k)||W)&&(l.removeAgent(k),p.delete(k))}}l.syncBuildings(),l.syncAreas(),l.setSelectedAgents(x.selectedAgentIds),l.setSelectedBuildings(x.selectedBuildingIds)}),y=qt(()=>{l.syncAreas(),l.syncBuildings(),l.syncAgents(Array.from(M.getState().agents.values()))});return()=>{w(),y(),l.dispose(),s.current=null,typeof window<"u"&&delete window.__tideScene2D}},[R]);const i=O.useCallback(f=>{var l;(l=s.current)==null||l.focusAgent(f)},[]),o=O.useCallback((f,l=!0)=>{var u;(u=s.current)==null||u.updateAgent(f,l)},[]),n=O.useCallback(f=>{var l;(l=s.current)==null||l.createMoveOrderEffect(f)},[]),c=O.useCallback((f,l)=>{var u;(u=s.current)==null||u.showToolBubble(f,l)},[]),a=O.useCallback(f=>{var l;(l=s.current)==null||l.setScale2D(f)},[]),r=O.useCallback(f=>{var l;(l=s.current)==null||l.setTaskLabelsVisible(f)},[]),g=O.useCallback(f=>{var l;(l=s.current)==null||l.setGridVisible(f)},[]),h=O.useCallback(f=>{var l;(l=s.current)==null||l.setDrawingTool(f)},[]),m=O.useCallback(f=>{var l;(l=s.current)==null||l.setFpsLimit(f)},[]);return{scene:s,focusAgent:i,updateAgent:o,createMoveOrderEffect:n,showToolBubble:c,setScale2D:a,setTaskLabelsVisible:r,setGridVisible:g,setDrawingTool:h,setFpsLimit:m}}function xe({onAgentClick:R,onAgentDoubleClick:t,onAgentHover:s,onBuildingClick:e,onBuildingDoubleClick:i,onBuildingDragStart:o,onBuildingDragMove:n,onBuildingDragEnd:c,onBuildingDragCancel:a,onContextMenu:r,onGroundClick:g,onMoveCommand:h,onAreaDoubleClick:m,scale2d:f=1,showTaskLabels:l=!0,showGrid:u=!0,fpsLimit:p=0,className:T=""}){const w=O.useRef(null),{scene:y,setScale2D:x,setTaskLabelsVisible:S,setGridVisible:b,setDrawingTool:P,setFpsLimit:v}=de(w,{onAgentClick:R,onAgentDoubleClick:t,onAgentHover:s,onBuildingClick:e,onBuildingDoubleClick:i,onBuildingDragStart:o,onBuildingDragMove:n,onBuildingDragEnd:c,onBuildingDragCancel:a,onContextMenu:r,onGroundClick:g,onMoveCommand:h,onAreaDoubleClick:m});return O.useEffect(()=>(typeof window<"u"&&y.current&&(window.__tideScene2D_setDrawingTool=P),()=>{typeof window<"u"&&delete window.__tideScene2D_setDrawingTool}),[P,y]),O.useEffect(()=>{x(f)},[f,x]),O.useEffect(()=>{S(l)},[l,S]),O.useEffect(()=>{b(u)},[u,b]),O.useEffect(()=>{v(p)},[p,v]),St.jsxs("div",{className:`scene-2d-container ${T}`,children:[St.jsx("canvas",{ref:w,className:"scene-2d-canvas"}),St.jsx("div",{className:"scene-2d-badge",children:"2D Mode"})]})}export{xe as Scene2DCanvas,xe as default};