tide-commander 1.32.2 → 1.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{BossLogsModal-2lqGyuCD.js → BossLogsModal-B_dgVF7L.js} +1 -1
- package/dist/assets/{BossSpawnModal-CR-ofDeB.js → BossSpawnModal-CSO1bYxA.js} +1 -1
- package/dist/assets/{ControlsModal-DQ8QVshA.js → ControlsModal-WMTTqbca.js} +1 -1
- package/dist/assets/{DockerLogsModal-D6yQTHy7.js → DockerLogsModal-THzhLHch.js} +1 -1
- package/dist/assets/{EmbeddedEditor-wechGxGl.js → EmbeddedEditor-DWLKJYav.js} +1 -1
- package/dist/assets/GmailOAuthSetup-DN9ceaS6.js +270 -0
- package/dist/assets/{GoogleOAuthSetup-BcpJEydM.js → GoogleOAuthSetup-bVST2EOB.js} +1 -1
- package/dist/assets/{IframeModal-E2E7NR08.js → IframeModal-BELsjvgi.js} +1 -1
- package/dist/assets/{IntegrationsPanel-CrS2QOFR.js → IntegrationsPanel-DwDr4BRt.js} +2 -2
- package/dist/assets/{LogViewerModal-BpIPZeFr.js → LogViewerModal-CMe04PO5.js} +1 -1
- package/dist/assets/MonitoringModal-CqSalNeY.js +1 -0
- package/dist/assets/{PM2LogsModal-CDk_2mi1.js → PM2LogsModal-CCmCDxVt.js} +1 -1
- package/dist/assets/{RestoreArchivedAreaModal-BmgBrk9J.js → RestoreArchivedAreaModal-IfzPidIv.js} +1 -1
- package/dist/assets/{SaveSnapshotModal-DWta9pcx.js → SaveSnapshotModal-DUhrVD5l.js} +1 -1
- package/dist/assets/{Scene2DCanvas-C3CcFsjU.js → Scene2DCanvas-Bl5DUC7w.js} +1 -1
- package/dist/assets/{SceneManager-mFUakRNl.js → SceneManager-BGO9tiaI.js} +1 -1
- package/dist/assets/{SkillsPanel-Br3h8GNh.js → SkillsPanel-CPFOI4Tl.js} +1 -1
- package/dist/assets/{SnapshotManager-CPYWfnPR.js → SnapshotManager-Cbu0tJBz.js} +1 -1
- package/dist/assets/{SpawnModal-DSDirR0j.js → SpawnModal-BqDbsYLY.js} +1 -1
- package/dist/assets/{SubordinateAssignmentModal-Daz67phV.js → SubordinateAssignmentModal-DOqkhL_L.js} +1 -1
- package/dist/assets/{SupervisorPanel-DoAl5e8W.js → SupervisorPanel-BvX-dlk_.js} +1 -1
- package/dist/assets/{TriggerManagerPanel-CVIHbqDt.js → TriggerManagerPanel-RUVFmKmf.js} +1 -1
- package/dist/assets/WorkflowEditorPanel-CwZpEqzM.js +42 -0
- package/dist/assets/browser-ponyfill-DZOWXZ4K.js +2 -0
- package/dist/assets/camera-D_KeL_pz.js +1 -0
- package/dist/assets/{index-I-I3pPPW.js → index-B-wV06cR.js} +1 -1
- package/dist/assets/index-BFguOWBW.js +2 -0
- package/dist/assets/{index-uXOqPsuU.js → index-C7gqY2AA.js} +1 -1
- package/dist/assets/{index-CE_GbjZ6.js → index-CiD1Rwaq.js} +1 -1
- package/dist/assets/index-D4nfDvz4.js +49 -0
- package/dist/assets/{index-CvMf5n2v.js → index-DDPUtz8-.js} +1 -1
- package/dist/assets/{index-Chrxgrys.js → index-EH8IBvSU.js} +1 -1
- package/dist/assets/{index-DWVQ48nQ.js → index-H0PzHVFw.js} +1 -1
- package/dist/assets/main-Cjm0d8dZ.js +152 -0
- package/dist/assets/main-DqC9_fF4.css +1 -0
- package/dist/assets/{prism-cpp-CcQnz8LL.js → prism-cpp-CK2Ly5dS.js} +1 -1
- package/dist/assets/{prism-csharp-DFIAaw4Y.js → prism-csharp-ByDDDiWW.js} +1 -1
- package/dist/assets/{prism-elixir-jP4m4T-8.js → prism-elixir-df27OMMQ.js} +1 -1
- package/dist/assets/{prism-haskell-BrMZM7_F.js → prism-haskell-Ce8aBmia.js} +1 -1
- package/dist/assets/{prism-java-BEsh8u4L.js → prism-java-CK6tws4L.js} +1 -1
- package/dist/assets/{prism-perl-ecHKp0bZ.js → prism-perl-UZfqnD51.js} +1 -1
- package/dist/assets/{prism-php-Ch-kk89U.js → prism-php-Dt9698bA.js} +1 -1
- package/dist/assets/{prism-ruby-zNpGDk6v.js → prism-ruby-CQBUuZIF.js} +1 -1
- package/dist/assets/{prism-scss-BeuXx0O0.js → prism-scss-CeN16CFC.js} +1 -1
- package/dist/assets/{vendor-react-uS-d4TUT.js → vendor-react--Eh9ivFN.js} +2 -2
- package/dist/assets/{web-IWJRtE3-.js → web-D1vWYL8u.js} +1 -1
- package/dist/assets/{web-DdRt5c0R.js → web-DUq3Undh.js} +1 -1
- package/dist/index.html +3 -3
- package/dist/src/packages/server/data/builtin-skills/boss-instructions.js +57 -66
- package/dist/src/packages/server/data/builtin-skills/index.js +2 -0
- package/dist/src/packages/server/data/builtin-skills/workflow-builder.js +253 -0
- package/dist/src/packages/server/data/builtin-skills/workflow-designer.js +157 -0
- package/dist/src/packages/server/data/event-queries.js +24 -0
- package/dist/src/packages/server/data/migrations/002_workflow_agent_binding.sql +14 -0
- package/dist/src/packages/server/data/migrations/003_matcher_executions.sql +19 -0
- package/dist/src/packages/server/data/migrations/004_matcher_message_source.sql +8 -0
- package/dist/src/packages/server/integrations/gmail/gmail-client.js +75 -15
- package/dist/src/packages/server/integrations/gmail/gmail-config.js +32 -2
- package/dist/src/packages/server/integrations/gmail/gmail-routes.js +5 -0
- package/dist/src/packages/server/integrations/gmail/index.js +23 -1
- package/dist/src/packages/server/integrations/jira/jira-client.js +11 -5
- package/dist/src/packages/server/integrations/jira/jira-routes.js +20 -3
- package/dist/src/packages/server/integrations/jira/jira-skill.js +110 -58
- package/dist/src/packages/server/routes/trigger-routes.js +22 -0
- package/dist/src/packages/server/routes/workflow-routes.js +86 -2
- package/dist/src/packages/server/services/boss-message-service.js +1 -1
- package/dist/src/packages/server/services/llm-matcher-service.js +50 -81
- package/dist/src/packages/server/services/trigger-service.js +195 -6
- package/dist/src/packages/server/services/workflow-executor.js +230 -0
- package/dist/src/packages/server/services/workflow-service.js +59 -13
- package/package.json +7 -7
- package/dist/assets/GmailOAuthSetup-B2GDjROU.js +0 -222
- package/dist/assets/MonitoringModal-CIF9MUm9.js +0 -1
- package/dist/assets/WorkflowEditorPanel-C4BRfmDM.js +0 -42
- package/dist/assets/browser-ponyfill-DIm4hKhx.js +0 -2
- package/dist/assets/camera-8crtHeRa.js +0 -1
- package/dist/assets/index--PCy0J0f.js +0 -49
- package/dist/assets/index-DOzx4Y9b.js +0 -2
- package/dist/assets/main-DQpuQfqS.css +0 -1
- package/dist/assets/main-DahZb6P4.js +0 -152
|
@@ -1 +1 @@
|
|
|
1
|
-
var Wt=Object.defineProperty;var Gt=(k,t,s)=>t in k?Wt(k,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):k[t]=s;var g=(k,t,s)=>Gt(k,typeof t!="symbol"?t+"":t,s);import{s as w,A as bt,k as St,T as yt,m as K,l as Ht,S as Ft,n as Yt,o as $t,p as Vt,F as at,r as E,j as xt}from"./main-DahZb6P4.js";import{l as Nt,s as It}from"./camera-8crtHeRa.js";import"./modulepreload-polyfill-B5Qt9EMX.js";import"./vendor-react-uS-d4TUT.js";import"./vendor-three-Chj50gSY.js";const ht=new Map,_t=512,J=new Map,kt=256;class rt{constructor(t,s){g(this,"ctx");g(this,"camera");g(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),l=parseInt(t.slice(3,5),16),a=parseInt(t.slice(5,7),16);return o=`rgba(${n}, ${l}, ${a}, ${e})`,ht.size>=_t&&ht.clear(),ht.set(i,o),o}lightenColor(t,s){const e=`L|${t}|${s}`;let i=J.get(e);if(i)return i;const o=parseInt(t.slice(1,3),16),n=parseInt(t.slice(3,5),16),l=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)),d=Math.min(255,Math.floor(l+(255-l)*s));return i=`#${a.toString(16).padStart(2,"0")}${r.toString(16).padStart(2,"0")}${d.toString(16).padStart(2,"0")}`,J.size>=kt&&J.clear(),J.set(e,i),i}darkenColor(t,s){const e=`D|${t}|${s}`;let i=J.get(e);if(i)return i;const o=parseInt(t.slice(1,3),16),n=parseInt(t.slice(3,5),16),l=parseInt(t.slice(5,7),16),a=Math.max(0,Math.floor(o*(1-s))),r=Math.max(0,Math.floor(n*(1-s))),d=Math.max(0,Math.floor(l*(1-s)));return i=`#${a.toString(16).padStart(2,"0")}${r.toString(16).padStart(2,"0")}${d.toString(16).padStart(2,"0")}`,J.size>=kt&&J.clear(),J.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 Ut=200;class jt extends rt{constructor(s,e){super(s,e);g(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,l=Math.min(1,n/Ut);o.fadeIn?o.opacity=this.easeOutCubic(l):(o.opacity=1-this.easeInCubic(l),l>=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 qt extends rt{constructor(s,e){super(s,e);g(this,"groundGradient",null);g(this,"groundViewportW",0);g(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,l=Math.sqrt(o*o+n*n)*1.2;this.groundGradient=this.ctx.createRadialGradient(o,n,0,o,n,l),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 l=Math.floor(i.minX/n)*n,a=Math.ceil(i.maxX/n)*n,r=Math.floor(i.minZ/n)*n,d=Math.ceil(i.maxZ/n)*n;this.camera.applyTransform(this.ctx);const h=s*.4,m=h*.5,f=1/o;for(let c=l;c<=a;c+=n){const u=Math.abs(c);let p=this.calculateGridAlpha(u,m,h);const T=Math.abs(c)%(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(c,i.minZ),this.ctx.lineTo(c,i.maxZ),this.ctx.stroke())}for(let c=r;c<=d;c+=n){const u=Math.abs(c);let p=this.calculateGridAlpha(u,m,h);const T=Math.abs(c)%(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,c),this.ctx.lineTo(i.maxX,c),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 l=20,a=6;this.ctx.strokeStyle="rgba(74, 158, 255, 0.4)",this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.moveTo(e-l,i),this.ctx.lineTo(e-a,i),this.ctx.moveTo(e+a,i),this.ctx.lineTo(e+l,i),this.ctx.moveTo(e,i-l),this.ctx.lineTo(e,i-a),this.ctx.moveTo(e,i+a),this.ctx.lineTo(e,i+l),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,l=Math.floor(o.minX/n)*n,a=Math.ceil(o.maxX/n)*n,r=Math.floor(o.minZ/n)*n,d=Math.ceil(o.maxZ/n)*n;this.ctx.font='10px "SF Mono", "Monaco", "Consolas", monospace',this.ctx.textBaseline="middle";for(let h=l;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 c=this.camera.worldToScreen(h,0);this.ctx.fillStyle=`rgba(100, 140, 180, ${f})`,this.ctx.textAlign="center",this.ctx.fillText(h.toString(),c.x,c.y+16)}}for(let h=r;h<=d;h+=n){if(Math.abs(h)<.001)continue;const m=Math.abs(h),f=this.calculateGridAlpha(m,e,i)*.4;if(f>.02){const c=this.camera.worldToScreen(0,h);this.ctx.fillStyle=`rgba(100, 140, 180, ${f})`,this.ctx.textAlign="left",this.ctx.fillText(h.toString(),c.x+16,c.y)}}}}const Kt=30,Jt=.18;function Qt(k,t,s){return Math.max(t,Math.min(s,k))}function At(k){return Qt(Math.max(k,1)/Kt,Jt,1)}function te(k){return At(k)}function ee(k,t){return At(k)}function se(k){return k>=30?"full":k>=24?"reduced":k>=18?"compact":"minimal"}class ie extends rt{constructor(s,e){super(s,e);g(this,"logoImages",new Map);g(this,"loadingLogos",new Set)}drawArea(s,e=!1){this.camera.applyTransform(this.ctx);const{x:i,z:o}=s.position,n=s.color||"#4a9eff",l=this.camera.getZoom();if(s.type==="rectangle"&&"width"in s.size){const{width:a,height:r}=s.size,d=i-a/2,h=o-r/2;if(this.drawRectangleArea(d,h,a,r,n,l,e),s.label&&this.drawAreaLabel(s.label,i,h,n,l,"top"),s.logo&&this.drawAreaLogo(s,i,o,a,r),s.hasDirectories){const c=Math.max(1,Math.floor((a-.6)/.675)),u=d+.5*.8,p=h+.5*.8;s.directories.forEach((T,A)=>{var M;const b=Math.floor(A/c),S=A%c,x=((M=s.directoryGitCounts)==null?void 0:M[A])??0;this.drawFolderIcon(u+S*.675,p+b*.675,.5,n,l,x)})}e&&this.drawRectangleResizeHandles(i,o,a,r,n,l)}else if(s.type==="circle"&&"radius"in s.size){const{radius:a}=s.size;if(this.drawCircleArea(i,o,a,n,l,e),s.label&&this.drawAreaLabel(s.label,i,o-a,n,l,"top"),s.logo){const r=a*1.414,d=a*1.414;this.drawAreaLogo(s,i,o,r,d)}if(s.hasDirectories){const d=a*.707,h=.5*1.35,m=Math.max(1,Math.floor((a*1.414-.5)/h)),f=i-d+.5*.5,c=o-d+.5*.5;s.directories.forEach((u,p)=>{var S;const T=Math.floor(p/m),A=p%m,b=((S=s.directoryGitCounts)==null?void 0:S[p])??0;this.drawFolderIcon(f+A*h,c+T*h,.5,n,l,b)})}e&&this.drawCircleResizeHandles(i,o,a,n,l)}this.camera.restoreTransform(this.ctx)}drawRectangleArea(s,e,i,o,n,l,a=!1){const r=this.ctx,d=Math.min(i,o)*.08;a&&(r.strokeStyle=this.hexToRgba(n,.5*.8),r.lineWidth=4/l,r.beginPath(),r.rect(s-2/l,e-2/l,i+4/l,o+4/l),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/l,r.beginPath(),r.moveTo(s+d,e+2/l),r.lineTo(s+i-d,e+2/l),r.stroke();const c=r.createLinearGradient(s,e+o,s+i,e+o);c.addColorStop(0,"transparent"),c.addColorStop(.2,this.hexToRgba(this.darkenColor(n,.5),.4)),c.addColorStop(.8,this.hexToRgba(this.darkenColor(n,.5),.4)),c.addColorStop(1,"transparent"),r.strokeStyle=c,r.lineWidth=2/l,r.beginPath(),r.moveTo(s+d,e+o-2/l),r.lineTo(s+i-d,e+o-2/l),r.stroke(),r.strokeStyle=this.hexToRgba(n,.7),r.lineWidth=2/l,r.setLineDash([8/l,4/l]),r.lineDashOffset=0,r.beginPath(),r.rect(s,e,i,o),r.stroke(),r.setLineDash([]),r.strokeStyle=this.hexToRgba(n,.9),r.lineWidth=3/l,r.lineCap="round",this.drawCornerMark(s,e,d,"top-left"),this.drawCornerMark(s+i,e,d,"top-right"),this.drawCornerMark(s,e+o,d,"bottom-left"),this.drawCornerMark(s+i,e+o,d,"bottom-right"),r.fillStyle=n;const u=3/l,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,l=!1){const a=this.ctx;l&&(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=l?.3:.2,d=a.createRadialGradient(s,e-i*.3,0,s,e,i);d.addColorStop(0,this.hexToRgba(o,r)),d.addColorStop(.6,this.hexToRgba(o,r*.5)),d.addColorStop(1,this.hexToRgba(o,r*.9)),a.fillStyle=d,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,A=e+Math.sin(p)*i;a.beginPath(),a.arc(T,A,f,0,Math.PI*2),a.fill()}const c=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,A=e+Math.sin(p)*i;a.beginPath(),a.arc(T,A,c,0,Math.PI*2),a.fill()}}drawAreaLabel(s,e,i,o,n,l){const a=this.ctx,r=At(n),d=11*r/n,h=6*r/n,m=l==="top"?-8*r/n:0;a.font=`bold ${d}px "Segoe UI", Arial, sans-serif`;const c=a.measureText(s).width,u=d,p=c+h*2,T=u+h,A=e-p/2,b=i+m-T/2,S=4*r/n,x=a.createLinearGradient(A,b,A,b+T);x.addColorStop(0,this.hexToRgba(this.darkenColor(o,.7),.9)),x.addColorStop(1,this.hexToRgba(this.darkenColor(o,.5),.9)),a.fillStyle=x,a.beginPath(),this.roundedRect(A,b,p,T,S),a.fill(),a.strokeStyle=this.hexToRgba(o,.8),a.lineWidth=1.5*r/n,a.beginPath(),this.roundedRect(A,b,p,T,S),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,l){const d=[{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 d)this.drawResizeHandle(m.x,m.z,.25,"#ffffff",l,.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",l,.9);this.drawResizeHandle(s,e,.25*1.2,"#ffcc00",l,.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,l,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 d=r.createRadialGradient(s-i*.3,e-i*.3,0,s,e,i);if(d.addColorStop(0,this.lightenColor(o,.3)),d.addColorStop(.5,o),d.addColorStop(1,this.darkenColor(o,.2)),r.fillStyle=d,r.globalAlpha=l,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,l=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 d=r*1.2,h=r*.9,m=d*.35,f=h*.2,c=h*.08,u=s-d/2,p=e-h/2;if(a.fillStyle=o,a.beginPath(),a.moveTo(u+c,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+c,p),a.arcTo(u,p,u,p+c,c),a.lineTo(u,p+h-c),a.arcTo(u,p+h,u+c,p+h,c),a.lineTo(u+d-c,p+h),a.arcTo(u+d,p+h,u+d,p+h-c,c),a.lineTo(u+d,p+f+c),a.arcTo(u+d,p+f,u+d-c,p+f,c),a.closePath(),a.fill(),a.strokeStyle=this.hexToRgba(this.lightenColor(o,.3),.6),a.lineWidth=1/n,a.beginPath(),a.moveTo(u+c,p+f+h*.08),a.lineTo(u+d-c,p+f+h*.08),a.stroke(),l>0){const T=r*.4,A=s+r*.7,b=e+r*.7;a.fillStyle="#e8943a",a.beginPath(),a.arc(A,b,T,0,Math.PI*2),a.fill(),a.strokeStyle="rgba(0, 0, 0, 0.6)",a.lineWidth=1.5/n,a.beginPath(),a.arc(A,b,T,0,Math.PI*2),a.stroke();const S=l>99?"99+":String(l),x=T*1.2;a.font=`bold ${x}px "Segoe UI", Arial, sans-serif`,a.fillStyle="#ffffff",a.textAlign="center",a.textBaseline="middle",a.fillText(S,A,b)}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 l=s.logo,a=this.getLogoImage(l.url);if(!a)return;const{position:r,width:d,height:h,opacity:m}=l,f=this.calculateLogoOffset(r,d,h,o,n),c=e+f.x-d/2,u=i+f.z-h/2,p=this.ctx;p.save(),p.globalAlpha=m,p.drawImage(a,c,u,d,h),p.restore()}calculateLogoOffset(s,e,i,o,n){if(s==="center")return{x:0,z:0};const l=e/2+.2,a=i/2+.2;switch(s){case"top-left":return{x:-o/2+l,z:-n/2+a};case"top-right":return{x:o/2-l,z:-n/2+a};case"bottom-left":return{x:-o/2+l,z:n/2-a};case"bottom-right":return{x:o/2-l,z:n/2-a};default:return{x:0,z:0}}}drawAreaPreview(s,e,i){const o=this.camera.getZoom(),n=this.ctx,l="#4a9eff";if(this.camera.applyTransform(n),i==="rectangle"){const a=Math.min(s.x,e.x),r=Math.max(s.x,e.x),d=Math.min(s.z,e.z),h=Math.max(s.z,e.z),m=r-a,f=h-d;if(m<.1&&f<.1){this.camera.restoreTransform(n);return}n.fillStyle="rgba(74, 158, 255, 0.2)",n.fillRect(a,d,m,f),n.setLineDash([6/o,4/o]),n.lineDashOffset=0,n.strokeStyle=l,n.lineWidth=2/o,n.strokeRect(a,d,m,f),n.setLineDash([])}else if(i==="circle"){const a=e.x-s.x,r=e.z-s.z,d=Math.sqrt(a*a+r*r);if(d<.1){this.camera.restoreTransform(n);return}n.fillStyle="rgba(74, 158, 255, 0.2)",n.beginPath(),n.arc(s.x,s.z,d,0,Math.PI*2),n.fill(),n.setLineDash([6/o,4/o]),n.lineDashOffset=0,n.strokeStyle=l,n.lineWidth=2/o,n.beginPath(),n.arc(s.x,s.z,d,0,Math.PI*2),n.stroke(),n.setLineDash([])}this.camera.restoreTransform(n)}}const Dt={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"}},Rt={"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 oe 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,l=Rt[t.style]||Rt["server-rack"],a=Dt[t.status]||Dt.stopped;let r=l.color,d=l.darkColor;t.color&&(r=t.color,d=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 Y=.5+Math.sin(this.animationTime*4)*.2;this.ctx.strokeStyle=`rgba(255, 255, 255, ${Y})`,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,d),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 c=.6+Math.sin(this.animationTime*3)*.15;this.ctx.strokeStyle=this.hexToRgba(a.color,c),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 A=this.ctx.createRadialGradient(p-u*.3,T-u*.3,0,p,T,u);A.addColorStop(0,this.lightenColor(a.color,.4)),A.addColorStop(1,a.color),this.ctx.fillStyle=A,this.ctx.beginPath(),this.ctx.arc(p,T,u,0,Math.PI*2),this.ctx.fill(),this.camera.restoreTransform(this.ctx);const b=this.camera.worldToScreen(i,o),S=n*this.camera.getZoom(),x=Math.max(8,S*.55);this.ctx.font=`${x}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(l.emoji,b.x+1,b.y+1),this.ctx.fillText(l.emoji,b.x,b.y);const M=this.camera.worldToScreen(i,o+n/2+.25),D=Math.max(6,S*.22);this.ctx.font=`bold ${D}px "Segoe UI", Arial, sans-serif`;const I=this.ctx.measureText(t.name).width,O=6,Z=D+6,et=this.ctx.createLinearGradient(M.x-I/2-O,M.y-Z/2,M.x-I/2-O,M.y+Z/2);if(et.addColorStop(0,"rgba(30, 35, 40, 0.9)"),et.addColorStop(1,"rgba(20, 25, 30, 0.95)"),this.ctx.fillStyle=et,this.ctx.beginPath(),this.roundedRectScreen(M.x-I/2-O,M.y-Z/2,I+O*2,Z,4),this.ctx.fill(),this.ctx.strokeStyle=this.hexToRgba(r,.6),this.ctx.lineWidth=1,this.ctx.beginPath(),this.roundedRectScreen(M.x-I/2-O,M.y-Z/2,I+O*2,Z,4),this.ctx.stroke(),this.ctx.fillStyle="#ffffff",this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(t.name,M.x,M.y),t.gitChangesCount&&t.gitChangesCount>0){const Y=this.camera.worldToScreen(i-n/2+.15,o-n/2+.15),q=Math.max(5,S*.1),N=t.gitChangesCount>99?"99+":String(t.gitChangesCount);this.ctx.fillStyle="#c89a5a",this.ctx.beginPath(),this.ctx.arc(Y.x,Y.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(Y.x,Y.y,q,0,Math.PI*2),this.ctx.stroke();const dt=Math.max(6,q*1.2);this.ctx.font=`bold ${dt}px Arial`,this.ctx.fillStyle="#ffffff",this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(N,Y.x,Y.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 Bt={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 ne extends rt{constructor(s,e,i){super(s,e);g(this,"effect");g(this,"frameCustomClasses",null);g(this,"frameUnseenOutput",null);this.effect=i}beginFrame(){const s=w.getState();this.frameCustomClasses=s.customAgentClasses,this.frameUnseenOutput=s.agentsWithUnseenOutput}getAgentClassIcon(s){var o;const e=bt[s];if(e)return e.icon;const i=(o=this.frameCustomClasses)==null?void 0:o.get(s);return i?i.icon:"🤖"}getDisplayName(s,e){return e!=="compact"||s.length<=12?s:`${s.slice(0,10)}..`}drawAgent(s,e,i,o,n){var Ct;const{x:l,z:a}=s.position,d=(s.isBoss?.7:.5)*o,h=this.camera.getZoom(),m=te(h),f=ee(h,n&&!!s.taskLabel),c=se(h),u=c!=="minimal",p=c==="full",T=c==="full",A=c==="full",b=c==="full"||c==="reduced",S=c==="compact"||c==="minimal",x=this.getDisplayName(s.name,c),D=this.animationTime*8,I=s.status==="working",O=I?Math.abs(Math.sin(this.animationTime*4))*4*m:0,Z=i?Math.sin(D*2)*.05:0,et=i?1+Math.sin(D*2)*.08:1,Y=i?Math.sin(D)*.15:0,q=Bt[s.status]||Bt.idle,N=this.numberToHex(s.color),dt=this.darkenColor(N,.4);this.lightenColor(N,.3);const Xt=this.getAgentClassIcon(s.class),P=this.camera.worldToScreen(l,a+Z),y=d*this.camera.getZoom();this.ctx.save(),this.ctx.fillStyle="rgba(0, 0, 0, 0.35)",this.ctx.beginPath(),this.ctx.ellipse(P.x+3,P.y+3,y*1.05,y*.95,0,0,Math.PI*2),this.ctx.fill();const wt=I?.75+Math.sin(this.animationTime*2.5)*.2:.85,gt=y+6,lt=this.ctx.createRadialGradient(P.x,P.y,y,P.x,P.y,gt+4);if(lt.addColorStop(0,"transparent"),lt.addColorStop(.5,this.hexToRgba(q.color,wt*.5)),lt.addColorStop(1,"transparent"),this.ctx.beginPath(),this.ctx.arc(P.x,P.y,gt+4,0,Math.PI*2),this.ctx.fillStyle=lt,this.ctx.fill(),this.ctx.beginPath(),this.ctx.arc(P.x,P.y,gt,0,Math.PI*2),this.ctx.strokeStyle=this.hexToRgba(q.color,wt*.8),this.ctx.lineWidth=2,this.ctx.stroke(),e){const z=s.isBoss?.4:.34,C=y+10,v=this.ctx.createRadialGradient(P.x,P.y,y+6,P.x,P.y,C+8);v.addColorStop(0,this.hexToRgba(N,z*.34)),v.addColorStop(.5,this.hexToRgba(N,z*.16)),v.addColorStop(1,"transparent"),this.ctx.beginPath(),this.ctx.arc(P.x,P.y,C+8,0,Math.PI*2),this.ctx.fillStyle=v,this.ctx.fill(),this.ctx.beginPath(),this.ctx.arc(P.x,P.y,C,0,Math.PI*2),this.ctx.strokeStyle=this.hexToRgba(N,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=y*.25,C=P.y+y*.7;this.ctx.fillStyle="rgba(0, 0, 0, 0.3)",this.ctx.beginPath(),this.ctx.ellipse(P.x,C+4,y*.6,y*.15,0,0,Math.PI*2),this.ctx.fill(),this.ctx.fillStyle=dt,this.ctx.beginPath(),this.ctx.arc(P.x-y*.3+Y*this.camera.getZoom(),C,z,0,Math.PI*2),this.ctx.fill(),this.ctx.beginPath(),this.ctx.arc(P.x+y*.3-Y*this.camera.getZoom(),C,z,0,Math.PI*2),this.ctx.fill()}const Zt=i?y/et:y,Et=i?y*et:y,ct=this.ctx.createRadialGradient(P.x-y*.3,P.y-y*.3,0,P.x,P.y,y);ct.addColorStop(0,"#3a3a3a"),ct.addColorStop(.5,"#1a1a1a"),ct.addColorStop(1,"#0a0a0a"),this.ctx.beginPath(),i?this.ctx.ellipse(P.x,P.y,Zt,Et,0,0,Math.PI*2):this.ctx.arc(P.x,P.y,y,0,Math.PI*2),this.ctx.fillStyle=ct,this.ctx.fill(),this.ctx.strokeStyle=this.hexToRgba(N,.6),this.ctx.lineWidth=2,this.ctx.stroke(),this.ctx.beginPath(),this.ctx.arc(P.x-y*.25,P.y-y*.25,y*.3,0,Math.PI*2),this.ctx.fillStyle="rgba(255, 255, 255, 0.1)",this.ctx.fill(),this.ctx.restore();const Ot=Math.max(6,Math.max(10*m,y*1.1));if(this.ctx.font=`${Ot}px "Segoe UI Emoji", "Apple Color Emoji", "Noto Color Emoji", sans-serif`,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(Xt,P.x,P.y+1-O),s.isBoss){const z=Math.max(6,Math.max(8*m,y*.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("👑",P.x,P.y-y-2)}if(S){const z=Math.max(1.5,3.2*m),C=P.x+y*.6,v=P.y-y*.6;this.ctx.beginPath(),this.ctx.arc(C,v,z+1.5,0,Math.PI*2),this.ctx.fillStyle=this.hexToRgba(q.color,.28),this.ctx.fill(),this.ctx.beginPath(),this.ctx.arc(C,v,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 C=0;C<4;C++){const v=D+C*1.5,L=P.x+Math.sin(v*1.5)*y*.5,R=P.y+y*.9+Math.abs(Math.sin(v))*8,B=2+Math.sin(v)*1,F=.4-Math.abs(Math.sin(v))*.3;this.ctx.beginPath(),this.ctx.arc(L,R,B,0,Math.PI*2),this.ctx.fillStyle=`rgba(180, 180, 180, ${F})`,this.ctx.fill()}const ut=o*m,st=P.y+y+12*m,zt=o*f;if(u){const z=Math.max(4.5,13*zt);this.ctx.font=`bold ${z}px "Segoe UI", Arial, sans-serif`;const C=this.ctx.measureText(x).width,v=Math.max(2,6*f),L=z+Math.max(2,4*f),R=c==="full"&&(s.provider==="claude"||s.provider==="codex"),B=R?z*.45:0,F=R?z*.3:0,$=B+F,W=C+$+v*2,_=P.x+$/2,V=this.ctx.createLinearGradient(P.x-W/2,st-L/2,P.x-W/2,st+L/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(P.x-W/2,st-L/2,W,L,Math.max(2,4*f)),this.ctx.fillStyle=V,this.ctx.fill(),this.ctx.strokeStyle=this.hexToRgba(N,.6),this.ctx.lineWidth=Math.max(.75,1.5*f),this.ctx.stroke(),R){const ot=P.x-W/2+v+B/2,mt=st,pt=s.provider==="codex"?"#4a9eff":"#ff9e4a";this.ctx.beginPath(),this.ctx.arc(ot,mt,B/2,0,Math.PI*2),this.ctx.fillStyle=pt,this.ctx.fill(),this.ctx.strokeStyle="rgba(255, 255, 255, 0.9)",this.ctx.lineWidth=Math.max(.75,B*.12),this.ctx.stroke()}this.ctx.fillStyle=N,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.font=`bold ${z}px "Segoe UI", Arial, sans-serif`,this.ctx.fillText(x,_,st)}const vt=St(s).freePercent,nt=Math.max(0,Math.min(100,vt))/100,U=st+(u?Math.max(2.5,(13*zt+Math.max(2,4*f))/2):0)+8*m,j=76*m,tt=7*m,ft=Math.max(1,2.2*m);if(p){if(this.ctx.beginPath(),this.roundedRectScreen(P.x-j/2,U,j,tt,ft),this.ctx.fillStyle="rgba(0, 0, 0, 0.7)",this.ctx.fill(),nt>0){let z,C;nt>.5?(z="#6a9a78",C="#4a7a58"):nt>.2?(z="#c89858",C="#a87838"):(z="#c85858",C="#a83838");const v=this.ctx.createLinearGradient(P.x-j/2,U,P.x-j/2+j*nt,U);v.addColorStop(0,z),v.addColorStop(1,C),this.ctx.beginPath(),this.roundedRectScreen(P.x-j/2,U,j*nt,tt,ft),this.ctx.fillStyle=v,this.ctx.fill()}if(this.ctx.beginPath(),this.roundedRectScreen(P.x-j/2,U,j,tt,ft),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(vt)}%`,C=Math.max(4.5,10*m);this.ctx.font=`bold ${C}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,P.x,U+tt/2)}}if(A&&s.status==="idle"&&s.lastActivity>0){const z=Math.floor((Date.now()-s.lastActivity)/1e3);if(z>=5){const C=this.formatIdleTime(z),v=U+tt+10*m;let L,R,B;z<60?(L="rgba(74, 158, 74, 0.9)",R="#aaffaa",B="💤"):(z<300,L="rgba(158, 120, 50, 0.9)",R="#ffdd88",B="⏳");const F=Math.max(4.5,9*ut);this.ctx.font=`bold ${F}px "Segoe UI Emoji", "Apple Color Emoji", Arial`;const $=`${B} ${C}`,W=this.ctx.measureText($).width,_=5*m,V=F+3*m;this.ctx.beginPath(),this.roundedRectScreen(P.x-W/2-_,v-V/2,W+_*2,V,V/2),this.ctx.fillStyle=L,this.ctx.fill(),this.ctx.fillStyle=R,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText($,P.x,v)}}this.effect.updateAgentTool(s.id,s.currentTool);const it=this.effect.getToolAnimation(s.id);if(A&&it&&it.opacity>.01){const z=yt[it.tool]||yt.default,C=U+tt+10*m,v=it.opacity,L=it.fadeIn?this.easeOutCubic(v):v,R=.8+.2*L,B=Math.max(4.5,10*ut)*R;this.ctx.font=`bold ${B}px "Segoe UI Emoji", "Apple Color Emoji", Arial`;const F=`${z} ${it.tool}`,$=this.ctx.measureText(F).width,W=6*m*R,_=B+4*m*R,V=(1-L)*4*m,ot=C+V;this.ctx.beginPath(),this.roundedRectScreen(P.x-$/2-W,ot-_/2,$+W*2,_,_/2),this.ctx.fillStyle=`rgba(74, 118, 158, ${.9*v})`,this.ctx.fill(),this.ctx.strokeStyle=`rgba(74, 158, 255, ${.6*v})`,this.ctx.lineWidth=1,this.ctx.stroke(),this.ctx.fillStyle=`rgba(170, 221, 255, ${v})`,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(F,P.x,ot)}if(A&&n&&s.taskLabel){const z=Math.max(5,15*ut);this.ctx.font=`bold italic ${z}px "Segoe UI", Arial, sans-serif`;const C=s.taskLabel.length>30?s.taskLabel.substring(0,28)+"..":s.taskLabel,v=this.ctx.measureText(C).width,L=6*m,R=z+5*m,B=U+tt+10*m;this.ctx.beginPath(),this.roundedRectScreen(P.x-v/2-L,B-R/2,v+L*2,R,R/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(C,P.x,B)}if(b&&((Ct=this.frameUnseenOutput)!=null&&Ct.has(s.id))){const z=10*m,C=P.x+y*.7,v=P.y-y*.7,L=this.ctx.createRadialGradient(C,v,0,C,v,z*1.5);L.addColorStop(0,"rgba(74, 158, 255, 0.8)"),L.addColorStop(1,"rgba(74, 158, 255, 0)"),this.ctx.beginPath(),this.ctx.arc(C,v,z*1.5,0,Math.PI*2),this.ctx.fillStyle=L,this.ctx.fill();const R=z*.9,B=-Math.PI/2,F=B+2*Math.PI/3,$=B+4*Math.PI/3,W=C+R*Math.cos(B),_=v+R*Math.sin(B),V=C+R*Math.cos(F),ot=v+R*Math.sin(F),mt=C+R*Math.cos($),pt=v+R*Math.sin($);this.ctx.beginPath(),this.ctx.moveTo(W,_),this.ctx.lineTo(V,ot),this.ctx.lineTo(mt,pt),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("!",C,v+1)}}drawSelectionBox(s,e){const i=this.camera.getZoom(),o=Math.min(s.x,e.x),n=Math.max(s.x,e.x),l=Math.min(s.z,e.z),a=Math.max(s.z,e.z),r=n-o,d=a-l;if(r<.1&&d<.1)return;this.camera.applyTransform(this.ctx);const h=this.ctx,m="#4a9eff",f=this.animationTime*30%24,c=6/i,u=3/i;h.strokeStyle="rgba(74, 158, 255, 0.2)",h.lineWidth=6/i,h.beginPath(),h.rect(o,l,r,d),h.stroke();const p=h.createLinearGradient(o,l,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,l,r,d),h.fill();const T=h.createLinearGradient(o,l,n,l);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,l+1/i),h.lineTo(n-r*.1,l+1/i),h.stroke(),h.strokeStyle="rgba(74, 158, 255, 0.9)",h.lineWidth=2/i,h.setLineDash([c,u]),h.lineDashOffset=-f/i,h.beginPath(),h.rect(o,l,r,d),h.stroke(),h.setLineDash([]),h.strokeStyle="rgba(74, 158, 255, 0.3)",h.lineWidth=1/i,h.beginPath(),h.rect(o-1/i,l-1/i,r+2/i,d+2/i),h.stroke();const A=Math.min(r,d)*.15,S=Math.max(A,.3);h.strokeStyle=m,h.lineWidth=3/i,h.lineCap="round",this.drawSelectionCorner(o,l,S,"top-left"),this.drawSelectionCorner(n,l,S,"top-right"),this.drawSelectionCorner(o,a,S,"bottom-left"),this.drawSelectionCorner(n,a,S,"bottom-right");const x=3/i;h.fillStyle=m;const M=.6+Math.sin(this.animationTime*4)*.3,D=[{x:o,y:l},{x:n,y:l},{x:o,y:a},{x:n,y:a}];for(const I of D)h.fillStyle=`rgba(74, 158, 255, ${M*.35})`,h.beginPath(),h.arc(I.x,I.y,x*2.5,0,Math.PI*2),h.fill(),h.fillStyle=m,h.beginPath(),h.arc(I.x,I.y,x,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 Lt{constructor(t,s){g(this,"grid");g(this,"area");g(this,"building");g(this,"agent");g(this,"effect");this.effect=new jt(t,s),this.grid=new qt(t,s),this.area=new ie(t,s),this.building=new oe(t,s),this.agent=new ne(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 G=class G{constructor(t,s,e){g(this,"canvas");g(this,"camera");g(this,"scene");g(this,"isMouseDown",!1);g(this,"isPanning",!1);g(this,"isSelecting",!1);g(this,"lastMouseX",0);g(this,"lastMouseY",0);g(this,"mouseDownX",0);g(this,"mouseDownY",0);g(this,"mouseDownTime",0);g(this,"lastClickTime",0);g(this,"lastClickTarget",null);g(this,"doubleClickDelay",400);g(this,"selectionBox",null);g(this,"hoveredAgentId",null);g(this,"hoveredBuildingId",null);g(this,"isMouseInCanvas",!1);g(this,"isResizingArea",!1);g(this,"resizeHandleType",null);g(this,"isDraggingBuilding",!1);g(this,"draggingBuildingId",null);g(this,"buildingDragStartPos",null);g(this,"isDraggingAgent",!1);g(this,"draggingAgentId",null);g(this,"agentDragStartPos",null);g(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 l=this.scene.getAgentAtScreenPos(e,i),a=this.scene.getBuildingAtScreenPos(e,i);if(l){this.draggingAgentId=l.id,this.agentDragStartPos={...o},this.isDraggingAgent=!1;return}if(a&&!l){this.draggingBuildingId=a.id,this.buildingDragStartPos={...o},this.isDraggingBuilding=!1;return}!l&&!a&&(this.isSelecting=!1,this.selectionBox={start:{...o},end:{...o}})}});g(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 l=this.scene.getBuildingAtScreenPos(e,i),a=(l==null?void 0:l.id)??null;if(a!==this.hoveredBuildingId&&(this.hoveredBuildingId=a,(f=(m=this.scene).handleBuildingHover)==null||f.call(m,a)),!this.isMouseDown){const c=this.camera.screenToWorld(e,i),u=this.scene.getAreaHandleAtWorldPos(c.x,c.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,d=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 c=h.x-this.agentDragStartPos.x,u=h.z-this.agentDragStartPos.z,p=Math.sqrt(c*c+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 c=h.x-this.buildingDragStartPos.x,u=h.z-this.buildingDragStartPos.z,p=Math.sqrt(c*c+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,d):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});g(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,l=this.isPanning;if(n&&this.selectionBox&&(this.scene.handleSelectionBox(this.selectionBox.start,this.selectionBox.end),this.selectionBox=null),!l&&!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:l}),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:l,wasSelecting:n,button:t.button});this.isMouseDown=!1,this.isPanning=!1,this.isSelecting=!1,this.canvas.classList.remove("panning","selecting")});g(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)});g(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)}});g(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),l=this.scene.getBuildingAtScreenPos(e,i),a=this.scene.getAreaAtScreenPos(e,i);if(w.getState().selectedAgentIds.size>0&&!n&&!l){this.scene.handleMoveCommand({x:o.x,z:o.z}),this.scene.createMoveOrderEffect({x:o.x,z:o.z});return}let d=null;n?d={type:"agent",id:n.id}:l?d={type:"building",id:l.id}:a&&(d={type:"area",id:a.id}),this.scene.handleContextMenu({x:t.clientX,y:t.clientY},{x:o.x,z:o.z},d)});g(this,"onKeyDown",t=>{const s=t.target,e=w.getState(),i=s.tagName==="INPUT"||s.tagName==="TEXTAREA"||s.isContentEditable,o=s.closest(".guake-terminal"),n=o==null?void 0:o.classList.contains("collapsed"),l=w.getShortcuts(),a=l.find(m=>m.id==="next-agent"),r=l.find(m=>m.id==="prev-agent"),d=l.find(m=>m.id==="open-terminal"),h=l.find(m=>m.id==="toggle-spotlight");if(K(t,h)){console.log("[Scene2DInput] Spotlight shortcut detected, passing through");return}if(i)if((K(t,a)||K(t,r))&&n)s.blur();else if(K(t,d)&&n)s.blur();else return;if((K(t,a)||K(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,c=f?m.findIndex(p=>p.id===f):-1;let u;K(t,a)?u=c===-1?0:(c+1)%m.length:u=c===-1?m.length-1:(c-1+m.length)%m.length,t.preventDefault(),w.selectAgent(m[u].id);return}if(K(t,d)){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(),w.selectAgent(m),w.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"),w.setTerminalOpen(!0)}});g(this,"touchStartPositions",[]);g(this,"initialPinchDistance",0);g(this,"longPressTimer",null);g(this,"longPressTriggered",!1);g(this,"touchIsPanning",!1);g(this,"touchPanVelocityX",0);g(this,"touchPanVelocityY",0);g(this,"lastTouchMoveTime",0);g(this,"touchInertiaFrameId",null);g(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 l=t.touches[0].clientX,a=t.touches[0].clientY;this.longPressTimer=setTimeout(()=>{this.longPressTriggered=!0,this.longPressTimer=null,this.handleTouchLongPress(l,a),navigator.vibrate&&navigator.vibrate(50)},G.TOUCH_LONG_PRESS_DURATION)}else t.touches.length===2&&(this.clearLongPressTimer(),this.initialPinchDistance=this.getPinchDistance(t.touches),this.isPanning=!1)});g(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)>G.TOUCH_DRAG_THRESHOLD||Math.abs(n)>G.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,d=i-this.lastMouseY,h=r/a,m=d/a;this.touchPanVelocityX=this.touchPanVelocityX*.7+h*.3,this.touchPanVelocityY=this.touchPanVelocityY*.7+m*.3,this.camera.panBy(r,d)}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}});g(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});g(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=Ht(Ft.AGENT_ORDER,[]).filter(f=>e.has(f)),l=s.filter(f=>!o.includes(f.id)).sort((f,c)=>(f.createdAt||0)-(c.createdAt||0)).map(f=>f.id),a=[...o,...l],r=new Map(s.map(f=>[f.id,f])),d=a.map(f=>r.get(f)).filter(f=>f!==void 0),h=new Map;for(const f of d){const c=w.getAreaForAgent(f.id),u=(c==null?void 0:c.id)||null;h.has(u)||h.set(u,{area:c?{name:c.name}:null,agents:[]}),h.get(u).agents.push(f)}const m=Array.from(h.values());return m.sort((f,c)=>{var u,p;return!f.area&&c.area?1:f.area&&!c.area?-1:!f.area&&!c.area?0:(((u=f.area)==null?void 0:u.name)||"").localeCompare(((p=c.area)==null?void 0:p.name)||"")}),m.flatMap(f=>f.agents)}startTouchInertia(){if(Math.hypot(this.touchPanVelocityX,this.touchPanVelocityY)<G.TOUCH_INERTIA_MIN_SPEED)return;this.stopTouchInertia();let s=this.touchPanVelocityX,e=this.touchPanVelocityY,i=performance.now();const o=n=>{const l=Math.max(1,n-i);i=n,this.camera.panBy(s*l,e*l);const a=Math.pow(G.TOUCH_INERTIA_DECAY,l/(1e3/60));if(s*=a,e*=a,Math.hypot(s,e)<G.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),l=this.scene.getAgentAtScreenPos(i,o),a=this.scene.getBuildingAtScreenPos(i,o),r=this.scene.getAreaAtScreenPos(i,o);if(w.getState().selectedAgentIds.size>0&&!l&&!a){this.scene.handleMoveCommand({x:n.x,z:n.z}),this.scene.createMoveOrderEffect({x:n.x,z:n.z});return}let h=null;l?h={type:"agent",id:l.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?w.openTerminalOnMobile(i.id):(w.selectAgent(i.id),w.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 l=this.canvas.getBoundingClientRect();this.scene.handleBuildingClick(o.id,{x:t+l.left,y:s+l.top}),this.lastClickTime=n,this.lastClickTarget=o.id}else{const l=this.scene.getAreaFolderIconAtScreenPos(t,s);if(l){this.scene.handleAreaFolderClick(l.areaId,l.folderPath),this.lastClickTime=0,this.lastClickTarget=null;return}const a=this.scene.getAreaAtScreenPos(t,s),r=this.camera.screenToWorld(t,s);if(a){const d=`area:${a.id}`;this.lastClickTarget===d&&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=d)}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}};g(G,"ENABLE_DOUBLE_CLICK_CAMERA_FOCUS",!1),g(G,"TOUCH_LONG_PRESS_DURATION",500),g(G,"TOUCH_DRAG_THRESHOLD",5),g(G,"TOUCH_INERTIA_DECAY",.9),g(G,"TOUCH_INERTIA_MIN_SPEED",.02);let Tt=G;class ae{constructor(t,s){g(this,"viewportWidth");g(this,"viewportHeight");g(this,"posX",0);g(this,"posZ",0);g(this,"zoom",30);g(this,"minZoom",5);g(this,"maxZoom",150);g(this,"targetPosX",0);g(this,"targetPosZ",0);g(this,"targetZoom",30);g(this,"panSmoothing",.12);g(this,"zoomSmoothing",.15);g(this,"focusSmoothing",.08);g(this,"currentPanSmoothing",.12);g(this,"panLimitEnabled",!0);g(this,"panLimitRadius",50);g(this,"edgePanEnabled",!1);g(this,"edgePanMargin",40);g(this,"edgePanSpeed",8);g(this,"mouseScreenX",0);g(this,"mouseScreenY",0);g(this,"isAnimating",!1);g(this,"animationCallback",null);g(this,"saveTimeout",null);g(this,"needsSave",!1);this.viewportWidth=t,this.viewportHeight=s,this.loadState()}loadState(){const t=Nt();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&&(It(this.posX,this.posZ,this.zoom),this.needsSave=!1),this.saveTimeout=null},500))}saveState(){this.saveTimeout&&(clearTimeout(this.saveTimeout),this.saveTimeout=null),It(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,l=this.clampPosition(o,n);this.posX=l.x,this.posZ=l.z,this.targetPosX=l.x,this.targetPosZ=l.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,l=(e+i)/2,a=s-t+o*2,r=i-e+o*2,d=this.viewportWidth/a,h=this.viewportHeight/r,m=Math.min(d,h)*.9;this.focusOn(n,l,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 l=this.viewportWidth/2,a=this.viewportHeight/2,r=this.targetPosX+(t-l)/o,d=this.targetPosZ+(s-a)/o,h=n.x-r,m=n.z-d,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 l=this.screenToWorld(t,s),a=this.clampPosition(this.posX+n.x-l.x,this.posZ+n.z-l.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,l=this.clampPosition(o,n);this.targetPosX=l.x,this.targetPosZ=l.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,l=.001,a=.01,r=Math.abs(this.targetPosX-this.posX)<l,d=Math.abs(this.targetPosZ-this.posZ)<l,h=Math.abs(this.targetZoom-this.zoom)<a;r?this.posX=this.targetPosX:this.posX+=(this.targetPosX-this.posX)*s,d?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&&d,f=h;this.isAnimating&&m&&f&&(this.isAnimating=!1,this.currentPanSmoothing=this.panSmoothing,this.animationCallback&&(this.animationCallback(),this.animationCallback=null));const c=Math.abs(this.posX-i)>1e-4||Math.abs(this.posZ-o)>1e-4||Math.abs(this.zoom-n)>1e-4;return c&&this.scheduleSave(),c}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 X={moveOrder:{primary:"#4aff9e",secondary:"#2ad87e"},bossLine:{primary:"#ffd700",secondary:"#ffaa00",glow:"rgba(255, 215, 0, 0.4)"},toolBubble:{background:["#2a3040","#1a2030"],border:"#4a9eff"}},H=class H{constructor(){g(this,"moveOrderEffects",[]);g(this,"toolBubbles",new Map);g(this,"statusParticles",[]);g(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(),l=Math.pow(1-o,1.5);s.applyTransform(t);const{x:a,z:r}=e.position,d=3;for(let b=0;b<d;b++){const S=Math.max(0,Math.min(1,o*1.5-b*.15));if(S<=0)continue;const x=l*(1-S)*(1-b*.25),M=.3+S*2,D=Math.max(1,3-S*2)/n,I=t.createRadialGradient(a,r,M*.8,a,r,M*1.2);I.addColorStop(0,this.hexToRgba(X.moveOrder.primary,x)),I.addColorStop(1,this.hexToRgba(X.moveOrder.secondary,x*.5)),t.strokeStyle=this.hexToRgba(X.moveOrder.primary,x*.3),t.lineWidth=D*3,t.beginPath(),t.arc(a,r,M,0,Math.PI*2),t.stroke(),t.strokeStyle=I,t.lineWidth=D,t.beginPath(),t.arc(a,r,M,0,Math.PI*2),t.stroke()}const h=l*.8,m=.25,f=this.animationTime*2;t.save(),t.translate(a,r),t.rotate(f),t.strokeStyle=this.hexToRgba(X.moveOrder.primary,h),t.lineWidth=2/n,t.lineCap="round";const c=m*.3,u=m;t.beginPath(),t.moveTo(0,-c),t.lineTo(0,-u),t.moveTo(0,c),t.lineTo(0,u),t.moveTo(-c,0),t.lineTo(-u,0),t.moveTo(c,0),t.lineTo(u,0),t.stroke(),t.restore();const p=i*.01%1,T=.06+Math.sin(p*Math.PI*2)*.02,A=t.createRadialGradient(a,r,0,a,r,T*2);A.addColorStop(0,this.hexToRgba(X.moveOrder.primary,h)),A.addColorStop(.5,this.hexToRgba(X.moveOrder.secondary,h*.8)),A.addColorStop(1,this.hexToRgba(X.moveOrder.secondary,0)),t.fillStyle=A,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 l=Math.sin(o*Math.PI*4)*.03+o*.15,a=s.worldToScreen(e.position.x,e.position.z-1.2-l),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,c=r+m*1.5,u=6,p=a.x-f/2,T=a.y-c/2;t.fillStyle=`rgba(0, 0, 0, ${.3*n})`,t.beginPath(),this.roundedRect(t,p+2,T+3,f,c,u),t.fill();const A=t.createLinearGradient(p,T,p,T+c);A.addColorStop(0,this.hexToRgba(X.toolBubble.background[0],n*.95)),A.addColorStop(1,this.hexToRgba(X.toolBubble.background[1],n*.98)),t.fillStyle=A,t.beginPath(),this.roundedRect(t,p,T,f,c,u),t.fill();const b=t.createLinearGradient(p+u,T+1,p+f-u,T+1);b.addColorStop(0,"transparent"),b.addColorStop(.2,`rgba(255, 255, 255, ${n*.15})`),b.addColorStop(.8,`rgba(255, 255, 255, ${n*.15})`),b.addColorStop(1,"transparent"),t.strokeStyle=b,t.lineWidth=1,t.beginPath(),t.moveTo(p+u,T+1),t.lineTo(p+f-u,T+1),t.stroke();const S=t.createLinearGradient(p,T,p,T+c);S.addColorStop(0,this.hexToRgba(X.toolBubble.border,n*.8)),S.addColorStop(1,this.hexToRgba(X.toolBubble.border,n*.5)),t.strokeStyle=S,t.lineWidth=1.5,t.beginPath(),this.roundedRect(t,p,T,f,c,u),t.stroke();const x=8,M=6,D=a.x,I=T+c;t.fillStyle=this.hexToRgba(X.toolBubble.background[1],n*.98),t.beginPath(),t.moveTo(D-x/2,I),t.lineTo(D+x/2,I),t.lineTo(D,I+M),t.closePath(),t.fill(),t.strokeStyle=this.hexToRgba(X.toolBubble.border,n*.6),t.lineWidth=1.5,t.beginPath(),t.moveTo(D-x/2-.5,I),t.lineTo(D,I+M),t.lineTo(D+x/2+.5,I),t.stroke();const O=r*.9;t.font=`${O}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,l=i.z-e.z,a=Math.sqrt(n*n+l*l),r=Math.atan2(l,n),d=t.createLinearGradient(e.x,e.z,i.x,i.z);d.addColorStop(0,this.hexToRgba(X.bossLine.primary,.7)),d.addColorStop(.5,this.hexToRgba(X.bossLine.secondary,.5)),d.addColorStop(1,this.hexToRgba(X.bossLine.primary,.7)),t.strokeStyle=X.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=d,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,A=e.x+n*T,b=e.z+l*T,S=.35;t.fillStyle=this.hexToRgba(X.bossLine.primary,S),t.beginPath(),t.arc(A,b,m,0,Math.PI*2),t.fill()}const f=.2,c=Math.PI/6,u={x:i.x-Math.cos(r)*.3,z:i.z-Math.sin(r)*.3};t.fillStyle=this.hexToRgba(X.bossLine.primary,.8),t.beginPath(),t.moveTo(u.x,u.z),t.lineTo(u.x-Math.cos(r-c)*f,u.z-Math.sin(r-c)*f),t.lineTo(u.x-Math.cos(r+c)*f,u.z-Math.sin(r+c)*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),l=e.size*(1-o*.5);s.applyTransform(t);const{x:a,z:r}=e.position,d=t.createRadialGradient(a,r,0,a,r,l*1.5);d.addColorStop(0,this.hexToRgba("#ffffff",n)),d.addColorStop(.2,this.hexToRgba(e.color,n)),d.addColorStop(.6,this.hexToRgba(e.color,n*.4)),d.addColorStop(1,this.hexToRgba(e.color,0)),t.fillStyle=d,t.beginPath(),t.arc(a,r,l*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=H.rgbaCache.get(i);if(o)return o;let n,l,a;if(t.startsWith("rgba")||t.startsWith("rgb")){const d=t.match(/[\d.]+/g);if(d)return n=parseInt(d[0]),l=parseInt(d[1]),a=parseInt(d[2]),o=`rgba(${n}, ${l}, ${a}, ${e})`,H.rgbaCache.size>=H.RGBA_CACHE_MAX&&H.rgbaCache.clear(),H.rgbaCache.set(i,o),o}const r=t.replace("#","");return r.length===3?(n=parseInt(r[0]+r[0],16),l=parseInt(r[1]+r[1],16),a=parseInt(r[2]+r[2],16)):(n=parseInt(r.slice(0,2),16),l=parseInt(r.slice(2,4),16),a=parseInt(r.slice(4,6),16)),o=`rgba(${n}, ${l}, ${a}, ${e})`,H.rgbaCache.size>=H.RGBA_CACHE_MAX&&H.rgbaCache.clear(),H.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=[]}};g(H,"rgbaCache",new Map),g(H,"RGBA_CACHE_MAX",256);let Pt=H;const Q=class Q{constructor(t){g(this,"canvas");g(this,"ctx");g(this,"renderer");g(this,"input");g(this,"camera");g(this,"effects");g(this,"staticCanvas");g(this,"staticCtx");g(this,"staticRenderer");g(this,"staticDirty",!0);g(this,"needsRender",!0);g(this,"agents",new Map);g(this,"buildings",new Map);g(this,"areas",new Map);g(this,"selectedAgentIds",new Set);g(this,"selectedBuildingIds",new Set);g(this,"animationFrameId",null);g(this,"lastFrameTime",0);g(this,"lastAnimationTime",0);g(this,"lastRenderTime",0);g(this,"isRunning",!1);g(this,"fpsLimit",0);g(this,"frameInterval",0);g(this,"currentDpr",1);g(this,"movements",new Map);g(this,"callbacks",{});g(this,"scale2d",.7);g(this,"showTaskLabels",!0);g(this,"showGrid",!0);g(this,"gridSize",30);g(this,"gridSpacing",2);g(this,"drawingTool",null);g(this,"isDrawing",!1);g(this,"drawStartPos",null);g(this,"drawCurrentPos",null);g(this,"sortedAreasAsc",[]);g(this,"sortedAreasDesc",[]);g(this,"areasSortDirty",!0);g(this,"selectedAreaId",null);g(this,"isResizingArea",!1);g(this,"resizeHandleType",null);g(this,"resizeStartPos",null);g(this,"resizeOriginalArea",null);g(this,"areaDragAgentStartPositions",new Map);g(this,"areaDragBuildingStartPositions",new Map);g(this,"handleResize",()=>{const t=this.canvas.parentElement;if(!t)return;let s=Math.min(window.devicePixelRatio||1,Q.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});g(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(),l=e||i||o||this.camera.isCurrentlyAnimating(),a=this.hasCameraChanged();if(a&&(this.staticDirty=!0,this.needsRender=!0),(l||n)&&(this.needsRender=!0),!this.needsRender&&this.agents.size===0)return;const r=1e3/Q.IDLE_FPS_LIMIT,d=1e3/Q.WORKING_FPS_LIMIT;let h;if(l||a?h=this.frameInterval:n?h=this.frameInterval>0?Math.min(this.frameInterval,d):d:h=this.frameInterval>0?Math.min(this.frameInterval,r):r,h>0){if(t-this.lastRenderTime<h)return;this.lastRenderTime=t}Yt.tick();const m=(t-this.lastAnimationTime)/1e3;this.lastAnimationTime=t,this.updateMovements(t),(l||n)&&(this.effects.update(m),this.renderer.update(m),this.staticRenderer.update(m)),this.render(),!l&&!n&&(this.needsRender=!1)});g(this,"lastCamX",NaN);g(this,"lastCamZ",NaN);g(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 ae(t.width,t.height),this.renderer=new Lt(s,this.camera),this.staticRenderer=new Lt(e,this.camera),this.effects=new Pt,this.input=new Tt(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,l=t.position.z+t.size.height/2;return!(o<s.minX-e||i>s.maxX+e||l<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=Math.min(1,o/i.duration),l=1-Math.pow(1-n,3),a=this.agents.get(e);a&&(a.position.x=i.startPos.x+(i.endPos.x-i.startPos.x)*l,a.position.z=i.startPos.z+(i.endPos.z-i.startPos.z)*l),n>=1&&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),d=this.movements.has(a.id);this.renderer.drawAgent(a,r,d,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 l=this.getDrawingPreview();l&&this.renderer.drawAreaPreview(l.start,l.end,l.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,l=!(o!=null&&o.subordinateIds)||o.subordinateIds.includes(i.id);o&&n&&l&&!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=bt[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:St(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()}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=bt[t.class],o=(i==null?void 0:i.color)??16777215,n=this.movements.get(t.id),l=.01;let a;if(n){const r=Math.abs(n.endPos.x-t.position.x),d=Math.abs(n.endPos.z-t.position.z);a=r>l||d>l}else{const r=Math.abs(e.position.x-t.position.x),d=Math.abs(e.position.z-t.position.z);a=r>l||d>l}if(a&&s){const d=Math.sqrt(Math.pow(t.position.x-e.position.x,2)+Math.pow(t.position.z-e.position.z,2))/2*1e3;this.movements.set(t.id,{startPos:{x:e.position.x,z:e.position.z},endPos:{x:t.position.x,z:t.position.z},startTime:performance.now(),duration:Math.max(500,Math.min(d,3e3))})}else a&&!s&&!n&&(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=St(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(e=>e.id));for(const e of this.agents.keys())(!s.has(e)||w.isAgentInArchivedArea(e))&&this.removeAgent(e);for(const e of t)w.isAgentInArchivedArea(e.id)||this.updateAgent(e,!1)}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=w.getState(),s=new Set(t.buildings.keys());for(const e of this.buildings.keys())s.has(e)||this.removeBuilding(e);for(const e of t.buildings.values())this.updateBuilding(e)}syncAreas(){var s;const t=w.getState();this.areas.clear(),this.invalidateAreaSort(),this.markStaticDirty();for(const e of t.areas.values()){if(e.archived)continue;const i=e.directories&&e.directories.length>0,o=(s=e.logo)!=null&&s.filename?{url:$t(Vt(`/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,w.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)),l=t-e.position.x,a=s-e.position.z;if(Math.sqrt(l*l+a*a)<=n)return{areaId:e.id,handleType:"move"};if(e.type==="rectangle"&&"width"in e.size){const{width:r,height:d}=e.size,h=[{type:"nw",x:e.position.x-r/2,z:e.position.z-d/2},{type:"ne",x:e.position.x+r/2,z:e.position.z-d/2},{type:"sw",x:e.position.x-r/2,z:e.position.z+d/2},{type:"se",x:e.position.x+r/2,z:e.position.z+d/2}];for(const f of h){const c=t-f.x,u=s-f.z;if(Math.sqrt(c*c+u*u)<=n)return{areaId:e.id,handleType:f.type}}const m=[{type:"n",x:e.position.x,z:e.position.z-d/2},{type:"s",x:e.position.x,z:e.position.z+d/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 c=t-f.x,u=s-f.z;if(Math.sqrt(c*c+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,d=e.position.z,h=t-r,m=s-d;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=w.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,l]of this.areaDragAgentStartPositions)w.moveAgentLocal(n,{x:l.x+i,y:l.y,z:l.z+o});for(const[n,l]of this.areaDragBuildingStartPositions)w.updateBuildingLocal(n,{position:{x:l.x+i,z:l.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,l=s.size.height,a=s.position.x,r=s.position.z,d=c=>{const u=Math.max(.5,n+c);return{width:u,cx:a+(u-n)/2}},h=c=>{const u=Math.max(.5,n-c);return{width:u,cx:a+(n-u)/2}},m=c=>{const u=Math.max(.5,l+c);return{height:u,cz:r+(u-l)/2}},f=c=>{const u=Math.max(.5,l-c);return{height:u,cz:r+(l-u)/2}};switch(this.resizeHandleType){case"se":{const c=d(i),u=m(o);e={width:c.width,height:u.height,center:{x:c.cx,z:u.cz}};break}case"sw":{const c=h(i),u=m(o);e={width:c.width,height:u.height,center:{x:c.cx,z:u.cz}};break}case"ne":{const c=d(i),u=f(o);e={width:c.width,height:u.height,center:{x:c.cx,z:u.cz}};break}case"nw":{const c=h(i),u=f(o);e={width:c.width,height:u.height,center:{x:c.cx,z:u.cz}};break}case"e":{const c=d(i);e={width:c.width,center:{x:c.cx,z:r}};break}case"w":{const c=h(i);e={width:c.width,center:{x:c.cx,z:r}};break}case"s":{const c=m(o);e={height:c.height,center:{x:a,z:c.cz}};break}case"n":{const c=f(o);e={height:c.height,center:{x:a,z:c.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&&(w.updateArea(this.selectedAreaId,e),this.syncAreas())}finishAreaResize(){if(this.resizeHandleType==="move"&&this.resizeOriginalArea&&this.resizeStartPos){const t=w.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)w.moveAgent(o,{x:n.x+e,y:n.y,z:n.z+i});for(const[o,n]of this.areaDragBuildingStartPositions)w.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=w.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=w.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((l,a)=>{const r=o[a];w.moveAgent(l,{x:r.x,y:0,z:r.z});const d=this.agents.get(l);if(d){const m=Math.sqrt(Math.pow(r.x-d.position.x,2)+Math.pow(r.z-d.position.z,2))/2*1e3;this.movements.set(l,{startPos:{x:d.position.x,z:d.position.z},endPos:{x:r.x,z:r.z},startTime:performance.now(),duration:Math.max(500,Math.min(m,3e3))})}})}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,l=(o-1)*at/2;for(let a=0;a<s;a++){const r=a%i,d=Math.floor(a/i);e.push({x:t.x+r*at-n,z:t.z+d*at-l})}}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){w.moveAgent(t,{x:s.x,y:0,z:s.z}),this.createMoveOrderEffect(s)}handleAgentDragCancel(t){const e=w.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?w.openFileExplorerForAreaFolder(t,s):w.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,l=i.directories||[];let a,r,d=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,d=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,d=Math.max(1,Math.floor((i.size.radius*1.414-o)/n))}else continue;const h=o*.7;for(let m=0;m<l.length;m++){const f=Math.floor(m/d),c=m%d,u=a+c*n,p=r+f*n,T=e.x-u,A=e.z-p;if(Math.sqrt(T*T+A*A)<=h)return{areaId:i.id,folderPath:l[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,l=e.position.x+i/2,a=e.position.z-o/2,r=e.position.z+o/2;if(t>=n&&t<=l&&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,w.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&&w.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),l=Math.max(t.z,s.z),a=o-i,r=l-n;return a<.5||r<.5?null:{id:e,name:"New Area",type:"rectangle",center:{x:(i+o)/2,z:(n+l)/2},width:a,height:r,color:"#4a9eff",zIndex:w.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:w.getNextZIndex(),assignedAgentIds:[],directories:[]}}return null}};g(Q,"IDLE_FPS_LIMIT",8),g(Q,"WORKING_FPS_LIMIT",15),g(Q,"MAX_DPR",1.25);let Mt=Q;function re(k,t={}){const s=E.useRef(null),e=E.useRef(t);e.current=t,E.useEffect(()=>{const f=k.current;if(!f)return;const c=new Mt(f);s.current=c,typeof window<"u"&&(window.__tideScene2D=c),c.setCallbacks({onAgentClick:(b,S)=>{var x,M;return(M=(x=e.current).onAgentClick)==null?void 0:M.call(x,b,S)},onAgentDoubleClick:b=>{var S,x;return(x=(S=e.current).onAgentDoubleClick)==null?void 0:x.call(S,b)},onAgentHover:(b,S)=>{var x,M;return(M=(x=e.current).onAgentHover)==null?void 0:M.call(x,b,S)},onBuildingClick:(b,S)=>{var x,M;return(M=(x=e.current).onBuildingClick)==null?void 0:M.call(x,b,S)},onBuildingDoubleClick:b=>{var S,x;return(x=(S=e.current).onBuildingDoubleClick)==null?void 0:x.call(S,b)},onBuildingDragStart:(b,S)=>{var x,M;return(M=(x=e.current).onBuildingDragStart)==null?void 0:M.call(x,b,S)},onBuildingDragMove:(b,S)=>{var x,M;return(M=(x=e.current).onBuildingDragMove)==null?void 0:M.call(x,b,S)},onBuildingDragEnd:(b,S)=>{var x,M;return(M=(x=e.current).onBuildingDragEnd)==null?void 0:M.call(x,b,S)},onBuildingDragCancel:b=>{var S,x;return(x=(S=e.current).onBuildingDragCancel)==null?void 0:x.call(S,b)},onContextMenu:(b,S,x)=>{var M,D;return(D=(M=e.current).onContextMenu)==null?void 0:D.call(M,b,S,x)},onGroundClick:b=>{var S,x;return(x=(S=e.current).onGroundClick)==null?void 0:x.call(S,b)},onMoveCommand:(b,S)=>{var x,M;return(M=(x=e.current).onMoveCommand)==null?void 0:M.call(x,b,S)},onAreaDoubleClick:b=>{var S,x;return(x=(S=e.current).onAreaDoubleClick)==null?void 0:x.call(S,b)},onSelectionBox:(b,S)=>{const x=Math.min(b.x,S.x),M=Math.max(b.x,S.x),D=Math.min(b.z,S.z),I=Math.max(b.z,S.z),O=[];for(const Z of c.getAgents().values())Z.position.x>=x&&Z.position.x<=M&&Z.position.z>=D&&Z.position.z<=I&&O.push(Z.id);if(O.length>0){w.selectAgent(O[0]);for(let Z=1;Z<O.length;Z++)w.addToSelection(O[Z])}else w.selectAgent(null)}});const u=w.getState();c.syncAreas(),c.syncBuildings(),c.syncAgents(Array.from(u.agents.values())),c.setSelectedAgents(u.selectedAgentIds),c.setSelectedBuildings(u.selectedBuildingIds),c.start();let p=new Map;for(const b of u.agents.values())p.set(b.id,{x:b.position.x,z:b.position.z});let T=u.agents.size>0;const A=w.subscribe(()=>{var S;const b=w.getState();if(!T&&b.agents.size>0){T=!0,c.syncAreas(),c.syncAgents(Array.from(b.agents.values()));for(const x of b.agents.values())p.set(x.id,{x:x.position.x,z:x.position.z})}else{for(const x of b.agents.values()){if(w.isAgentInArchivedArea(x.id)){p.has(x.id)&&(c.removeAgent(x.id),p.delete(x.id));continue}const M=p.get(x.id);!M||M.x!==x.position.x||M.z!==x.position.z?(c.updateAgent(x,!0),p.set(x.id,{x:x.position.x,z:x.position.z})):(S=c.hasActiveMovement)!=null&&S.call(c,x.id)||c.updateAgent(x,!1)}for(const x of p.keys())(!b.agents.has(x)||w.isAgentInArchivedArea(x))&&(c.removeAgent(x),p.delete(x))}c.syncBuildings(),c.syncAreas(),c.setSelectedAgents(b.selectedAgentIds),c.setSelectedBuildings(b.selectedBuildingIds)});return()=>{A(),c.dispose(),s.current=null,typeof window<"u"&&delete window.__tideScene2D}},[k]);const i=E.useCallback(f=>{var c;(c=s.current)==null||c.focusAgent(f)},[]),o=E.useCallback((f,c=!0)=>{var u;(u=s.current)==null||u.updateAgent(f,c)},[]),n=E.useCallback(f=>{var c;(c=s.current)==null||c.createMoveOrderEffect(f)},[]),l=E.useCallback((f,c)=>{var u;(u=s.current)==null||u.showToolBubble(f,c)},[]),a=E.useCallback(f=>{var c;(c=s.current)==null||c.setScale2D(f)},[]),r=E.useCallback(f=>{var c;(c=s.current)==null||c.setTaskLabelsVisible(f)},[]),d=E.useCallback(f=>{var c;(c=s.current)==null||c.setGridVisible(f)},[]),h=E.useCallback(f=>{var c;(c=s.current)==null||c.setDrawingTool(f)},[]),m=E.useCallback(f=>{var c;(c=s.current)==null||c.setFpsLimit(f)},[]);return{scene:s,focusAgent:i,updateAgent:o,createMoveOrderEffect:n,showToolBubble:l,setScale2D:a,setTaskLabelsVisible:r,setGridVisible:d,setDrawingTool:h,setFpsLimit:m}}function me({onAgentClick:k,onAgentDoubleClick:t,onAgentHover:s,onBuildingClick:e,onBuildingDoubleClick:i,onBuildingDragStart:o,onBuildingDragMove:n,onBuildingDragEnd:l,onBuildingDragCancel:a,onContextMenu:r,onGroundClick:d,onMoveCommand:h,onAreaDoubleClick:m,scale2d:f=1,showTaskLabels:c=!0,showGrid:u=!0,fpsLimit:p=0,className:T=""}){const A=E.useRef(null),{scene:b,setScale2D:S,setTaskLabelsVisible:x,setGridVisible:M,setDrawingTool:D,setFpsLimit:I}=re(A,{onAgentClick:k,onAgentDoubleClick:t,onAgentHover:s,onBuildingClick:e,onBuildingDoubleClick:i,onBuildingDragStart:o,onBuildingDragMove:n,onBuildingDragEnd:l,onBuildingDragCancel:a,onContextMenu:r,onGroundClick:d,onMoveCommand:h,onAreaDoubleClick:m});return E.useEffect(()=>(typeof window<"u"&&b.current&&(window.__tideScene2D_setDrawingTool=D),()=>{typeof window<"u"&&delete window.__tideScene2D_setDrawingTool}),[D,b]),E.useEffect(()=>{S(f)},[f,S]),E.useEffect(()=>{x(c)},[c,x]),E.useEffect(()=>{M(u)},[u,M]),E.useEffect(()=>{I(p)},[p,I]),xt.jsxs("div",{className:`scene-2d-container ${T}`,children:[xt.jsx("canvas",{ref:A,className:"scene-2d-canvas"}),xt.jsx("div",{className:"scene-2d-badge",children:"2D Mode"})]})}export{me as Scene2DCanvas,me as default};
|
|
1
|
+
var Wt=Object.defineProperty;var Gt=(k,t,s)=>t in k?Wt(k,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):k[t]=s;var g=(k,t,s)=>Gt(k,typeof t!="symbol"?t+"":t,s);import{s as w,A as bt,k as St,T as yt,m as K,l as Ht,S as Ft,n as Yt,o as $t,p as Vt,F as at,r as E,j as xt}from"./main-Cjm0d8dZ.js";import{l as Nt,s as It}from"./camera-D_KeL_pz.js";import"./modulepreload-polyfill-B5Qt9EMX.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";const ht=new Map,_t=512,J=new Map,kt=256;class rt{constructor(t,s){g(this,"ctx");g(this,"camera");g(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),l=parseInt(t.slice(3,5),16),a=parseInt(t.slice(5,7),16);return o=`rgba(${n}, ${l}, ${a}, ${e})`,ht.size>=_t&&ht.clear(),ht.set(i,o),o}lightenColor(t,s){const e=`L|${t}|${s}`;let i=J.get(e);if(i)return i;const o=parseInt(t.slice(1,3),16),n=parseInt(t.slice(3,5),16),l=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)),d=Math.min(255,Math.floor(l+(255-l)*s));return i=`#${a.toString(16).padStart(2,"0")}${r.toString(16).padStart(2,"0")}${d.toString(16).padStart(2,"0")}`,J.size>=kt&&J.clear(),J.set(e,i),i}darkenColor(t,s){const e=`D|${t}|${s}`;let i=J.get(e);if(i)return i;const o=parseInt(t.slice(1,3),16),n=parseInt(t.slice(3,5),16),l=parseInt(t.slice(5,7),16),a=Math.max(0,Math.floor(o*(1-s))),r=Math.max(0,Math.floor(n*(1-s))),d=Math.max(0,Math.floor(l*(1-s)));return i=`#${a.toString(16).padStart(2,"0")}${r.toString(16).padStart(2,"0")}${d.toString(16).padStart(2,"0")}`,J.size>=kt&&J.clear(),J.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 Ut=200;class jt extends rt{constructor(s,e){super(s,e);g(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,l=Math.min(1,n/Ut);o.fadeIn?o.opacity=this.easeOutCubic(l):(o.opacity=1-this.easeInCubic(l),l>=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 qt extends rt{constructor(s,e){super(s,e);g(this,"groundGradient",null);g(this,"groundViewportW",0);g(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,l=Math.sqrt(o*o+n*n)*1.2;this.groundGradient=this.ctx.createRadialGradient(o,n,0,o,n,l),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 l=Math.floor(i.minX/n)*n,a=Math.ceil(i.maxX/n)*n,r=Math.floor(i.minZ/n)*n,d=Math.ceil(i.maxZ/n)*n;this.camera.applyTransform(this.ctx);const h=s*.4,m=h*.5,f=1/o;for(let c=l;c<=a;c+=n){const u=Math.abs(c);let p=this.calculateGridAlpha(u,m,h);const T=Math.abs(c)%(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(c,i.minZ),this.ctx.lineTo(c,i.maxZ),this.ctx.stroke())}for(let c=r;c<=d;c+=n){const u=Math.abs(c);let p=this.calculateGridAlpha(u,m,h);const T=Math.abs(c)%(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,c),this.ctx.lineTo(i.maxX,c),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 l=20,a=6;this.ctx.strokeStyle="rgba(74, 158, 255, 0.4)",this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.moveTo(e-l,i),this.ctx.lineTo(e-a,i),this.ctx.moveTo(e+a,i),this.ctx.lineTo(e+l,i),this.ctx.moveTo(e,i-l),this.ctx.lineTo(e,i-a),this.ctx.moveTo(e,i+a),this.ctx.lineTo(e,i+l),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,l=Math.floor(o.minX/n)*n,a=Math.ceil(o.maxX/n)*n,r=Math.floor(o.minZ/n)*n,d=Math.ceil(o.maxZ/n)*n;this.ctx.font='10px "SF Mono", "Monaco", "Consolas", monospace',this.ctx.textBaseline="middle";for(let h=l;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 c=this.camera.worldToScreen(h,0);this.ctx.fillStyle=`rgba(100, 140, 180, ${f})`,this.ctx.textAlign="center",this.ctx.fillText(h.toString(),c.x,c.y+16)}}for(let h=r;h<=d;h+=n){if(Math.abs(h)<.001)continue;const m=Math.abs(h),f=this.calculateGridAlpha(m,e,i)*.4;if(f>.02){const c=this.camera.worldToScreen(0,h);this.ctx.fillStyle=`rgba(100, 140, 180, ${f})`,this.ctx.textAlign="left",this.ctx.fillText(h.toString(),c.x+16,c.y)}}}}const Kt=30,Jt=.18;function Qt(k,t,s){return Math.max(t,Math.min(s,k))}function At(k){return Qt(Math.max(k,1)/Kt,Jt,1)}function te(k){return At(k)}function ee(k,t){return At(k)}function se(k){return k>=30?"full":k>=24?"reduced":k>=18?"compact":"minimal"}class ie extends rt{constructor(s,e){super(s,e);g(this,"logoImages",new Map);g(this,"loadingLogos",new Set)}drawArea(s,e=!1){this.camera.applyTransform(this.ctx);const{x:i,z:o}=s.position,n=s.color||"#4a9eff",l=this.camera.getZoom();if(s.type==="rectangle"&&"width"in s.size){const{width:a,height:r}=s.size,d=i-a/2,h=o-r/2;if(this.drawRectangleArea(d,h,a,r,n,l,e),s.label&&this.drawAreaLabel(s.label,i,h,n,l,"top"),s.logo&&this.drawAreaLogo(s,i,o,a,r),s.hasDirectories){const c=Math.max(1,Math.floor((a-.6)/.675)),u=d+.5*.8,p=h+.5*.8;s.directories.forEach((T,A)=>{var M;const b=Math.floor(A/c),S=A%c,x=((M=s.directoryGitCounts)==null?void 0:M[A])??0;this.drawFolderIcon(u+S*.675,p+b*.675,.5,n,l,x)})}e&&this.drawRectangleResizeHandles(i,o,a,r,n,l)}else if(s.type==="circle"&&"radius"in s.size){const{radius:a}=s.size;if(this.drawCircleArea(i,o,a,n,l,e),s.label&&this.drawAreaLabel(s.label,i,o-a,n,l,"top"),s.logo){const r=a*1.414,d=a*1.414;this.drawAreaLogo(s,i,o,r,d)}if(s.hasDirectories){const d=a*.707,h=.5*1.35,m=Math.max(1,Math.floor((a*1.414-.5)/h)),f=i-d+.5*.5,c=o-d+.5*.5;s.directories.forEach((u,p)=>{var S;const T=Math.floor(p/m),A=p%m,b=((S=s.directoryGitCounts)==null?void 0:S[p])??0;this.drawFolderIcon(f+A*h,c+T*h,.5,n,l,b)})}e&&this.drawCircleResizeHandles(i,o,a,n,l)}this.camera.restoreTransform(this.ctx)}drawRectangleArea(s,e,i,o,n,l,a=!1){const r=this.ctx,d=Math.min(i,o)*.08;a&&(r.strokeStyle=this.hexToRgba(n,.5*.8),r.lineWidth=4/l,r.beginPath(),r.rect(s-2/l,e-2/l,i+4/l,o+4/l),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/l,r.beginPath(),r.moveTo(s+d,e+2/l),r.lineTo(s+i-d,e+2/l),r.stroke();const c=r.createLinearGradient(s,e+o,s+i,e+o);c.addColorStop(0,"transparent"),c.addColorStop(.2,this.hexToRgba(this.darkenColor(n,.5),.4)),c.addColorStop(.8,this.hexToRgba(this.darkenColor(n,.5),.4)),c.addColorStop(1,"transparent"),r.strokeStyle=c,r.lineWidth=2/l,r.beginPath(),r.moveTo(s+d,e+o-2/l),r.lineTo(s+i-d,e+o-2/l),r.stroke(),r.strokeStyle=this.hexToRgba(n,.7),r.lineWidth=2/l,r.setLineDash([8/l,4/l]),r.lineDashOffset=0,r.beginPath(),r.rect(s,e,i,o),r.stroke(),r.setLineDash([]),r.strokeStyle=this.hexToRgba(n,.9),r.lineWidth=3/l,r.lineCap="round",this.drawCornerMark(s,e,d,"top-left"),this.drawCornerMark(s+i,e,d,"top-right"),this.drawCornerMark(s,e+o,d,"bottom-left"),this.drawCornerMark(s+i,e+o,d,"bottom-right"),r.fillStyle=n;const u=3/l,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,l=!1){const a=this.ctx;l&&(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=l?.3:.2,d=a.createRadialGradient(s,e-i*.3,0,s,e,i);d.addColorStop(0,this.hexToRgba(o,r)),d.addColorStop(.6,this.hexToRgba(o,r*.5)),d.addColorStop(1,this.hexToRgba(o,r*.9)),a.fillStyle=d,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,A=e+Math.sin(p)*i;a.beginPath(),a.arc(T,A,f,0,Math.PI*2),a.fill()}const c=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,A=e+Math.sin(p)*i;a.beginPath(),a.arc(T,A,c,0,Math.PI*2),a.fill()}}drawAreaLabel(s,e,i,o,n,l){const a=this.ctx,r=At(n),d=11*r/n,h=6*r/n,m=l==="top"?-8*r/n:0;a.font=`bold ${d}px "Segoe UI", Arial, sans-serif`;const c=a.measureText(s).width,u=d,p=c+h*2,T=u+h,A=e-p/2,b=i+m-T/2,S=4*r/n,x=a.createLinearGradient(A,b,A,b+T);x.addColorStop(0,this.hexToRgba(this.darkenColor(o,.7),.9)),x.addColorStop(1,this.hexToRgba(this.darkenColor(o,.5),.9)),a.fillStyle=x,a.beginPath(),this.roundedRect(A,b,p,T,S),a.fill(),a.strokeStyle=this.hexToRgba(o,.8),a.lineWidth=1.5*r/n,a.beginPath(),this.roundedRect(A,b,p,T,S),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,l){const d=[{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 d)this.drawResizeHandle(m.x,m.z,.25,"#ffffff",l,.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",l,.9);this.drawResizeHandle(s,e,.25*1.2,"#ffcc00",l,.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,l,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 d=r.createRadialGradient(s-i*.3,e-i*.3,0,s,e,i);if(d.addColorStop(0,this.lightenColor(o,.3)),d.addColorStop(.5,o),d.addColorStop(1,this.darkenColor(o,.2)),r.fillStyle=d,r.globalAlpha=l,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,l=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 d=r*1.2,h=r*.9,m=d*.35,f=h*.2,c=h*.08,u=s-d/2,p=e-h/2;if(a.fillStyle=o,a.beginPath(),a.moveTo(u+c,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+c,p),a.arcTo(u,p,u,p+c,c),a.lineTo(u,p+h-c),a.arcTo(u,p+h,u+c,p+h,c),a.lineTo(u+d-c,p+h),a.arcTo(u+d,p+h,u+d,p+h-c,c),a.lineTo(u+d,p+f+c),a.arcTo(u+d,p+f,u+d-c,p+f,c),a.closePath(),a.fill(),a.strokeStyle=this.hexToRgba(this.lightenColor(o,.3),.6),a.lineWidth=1/n,a.beginPath(),a.moveTo(u+c,p+f+h*.08),a.lineTo(u+d-c,p+f+h*.08),a.stroke(),l>0){const T=r*.4,A=s+r*.7,b=e+r*.7;a.fillStyle="#e8943a",a.beginPath(),a.arc(A,b,T,0,Math.PI*2),a.fill(),a.strokeStyle="rgba(0, 0, 0, 0.6)",a.lineWidth=1.5/n,a.beginPath(),a.arc(A,b,T,0,Math.PI*2),a.stroke();const S=l>99?"99+":String(l),x=T*1.2;a.font=`bold ${x}px "Segoe UI", Arial, sans-serif`,a.fillStyle="#ffffff",a.textAlign="center",a.textBaseline="middle",a.fillText(S,A,b)}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 l=s.logo,a=this.getLogoImage(l.url);if(!a)return;const{position:r,width:d,height:h,opacity:m}=l,f=this.calculateLogoOffset(r,d,h,o,n),c=e+f.x-d/2,u=i+f.z-h/2,p=this.ctx;p.save(),p.globalAlpha=m,p.drawImage(a,c,u,d,h),p.restore()}calculateLogoOffset(s,e,i,o,n){if(s==="center")return{x:0,z:0};const l=e/2+.2,a=i/2+.2;switch(s){case"top-left":return{x:-o/2+l,z:-n/2+a};case"top-right":return{x:o/2-l,z:-n/2+a};case"bottom-left":return{x:-o/2+l,z:n/2-a};case"bottom-right":return{x:o/2-l,z:n/2-a};default:return{x:0,z:0}}}drawAreaPreview(s,e,i){const o=this.camera.getZoom(),n=this.ctx,l="#4a9eff";if(this.camera.applyTransform(n),i==="rectangle"){const a=Math.min(s.x,e.x),r=Math.max(s.x,e.x),d=Math.min(s.z,e.z),h=Math.max(s.z,e.z),m=r-a,f=h-d;if(m<.1&&f<.1){this.camera.restoreTransform(n);return}n.fillStyle="rgba(74, 158, 255, 0.2)",n.fillRect(a,d,m,f),n.setLineDash([6/o,4/o]),n.lineDashOffset=0,n.strokeStyle=l,n.lineWidth=2/o,n.strokeRect(a,d,m,f),n.setLineDash([])}else if(i==="circle"){const a=e.x-s.x,r=e.z-s.z,d=Math.sqrt(a*a+r*r);if(d<.1){this.camera.restoreTransform(n);return}n.fillStyle="rgba(74, 158, 255, 0.2)",n.beginPath(),n.arc(s.x,s.z,d,0,Math.PI*2),n.fill(),n.setLineDash([6/o,4/o]),n.lineDashOffset=0,n.strokeStyle=l,n.lineWidth=2/o,n.beginPath(),n.arc(s.x,s.z,d,0,Math.PI*2),n.stroke(),n.setLineDash([])}this.camera.restoreTransform(n)}}const Dt={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"}},Rt={"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 oe 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,l=Rt[t.style]||Rt["server-rack"],a=Dt[t.status]||Dt.stopped;let r=l.color,d=l.darkColor;t.color&&(r=t.color,d=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 Y=.5+Math.sin(this.animationTime*4)*.2;this.ctx.strokeStyle=`rgba(255, 255, 255, ${Y})`,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,d),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 c=.6+Math.sin(this.animationTime*3)*.15;this.ctx.strokeStyle=this.hexToRgba(a.color,c),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 A=this.ctx.createRadialGradient(p-u*.3,T-u*.3,0,p,T,u);A.addColorStop(0,this.lightenColor(a.color,.4)),A.addColorStop(1,a.color),this.ctx.fillStyle=A,this.ctx.beginPath(),this.ctx.arc(p,T,u,0,Math.PI*2),this.ctx.fill(),this.camera.restoreTransform(this.ctx);const b=this.camera.worldToScreen(i,o),S=n*this.camera.getZoom(),x=Math.max(8,S*.55);this.ctx.font=`${x}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(l.emoji,b.x+1,b.y+1),this.ctx.fillText(l.emoji,b.x,b.y);const M=this.camera.worldToScreen(i,o+n/2+.25),D=Math.max(6,S*.22);this.ctx.font=`bold ${D}px "Segoe UI", Arial, sans-serif`;const I=this.ctx.measureText(t.name).width,O=6,Z=D+6,et=this.ctx.createLinearGradient(M.x-I/2-O,M.y-Z/2,M.x-I/2-O,M.y+Z/2);if(et.addColorStop(0,"rgba(30, 35, 40, 0.9)"),et.addColorStop(1,"rgba(20, 25, 30, 0.95)"),this.ctx.fillStyle=et,this.ctx.beginPath(),this.roundedRectScreen(M.x-I/2-O,M.y-Z/2,I+O*2,Z,4),this.ctx.fill(),this.ctx.strokeStyle=this.hexToRgba(r,.6),this.ctx.lineWidth=1,this.ctx.beginPath(),this.roundedRectScreen(M.x-I/2-O,M.y-Z/2,I+O*2,Z,4),this.ctx.stroke(),this.ctx.fillStyle="#ffffff",this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(t.name,M.x,M.y),t.gitChangesCount&&t.gitChangesCount>0){const Y=this.camera.worldToScreen(i-n/2+.15,o-n/2+.15),q=Math.max(5,S*.1),N=t.gitChangesCount>99?"99+":String(t.gitChangesCount);this.ctx.fillStyle="#c89a5a",this.ctx.beginPath(),this.ctx.arc(Y.x,Y.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(Y.x,Y.y,q,0,Math.PI*2),this.ctx.stroke();const dt=Math.max(6,q*1.2);this.ctx.font=`bold ${dt}px Arial`,this.ctx.fillStyle="#ffffff",this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(N,Y.x,Y.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 Bt={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 ne extends rt{constructor(s,e,i){super(s,e);g(this,"effect");g(this,"frameCustomClasses",null);g(this,"frameUnseenOutput",null);this.effect=i}beginFrame(){const s=w.getState();this.frameCustomClasses=s.customAgentClasses,this.frameUnseenOutput=s.agentsWithUnseenOutput}getAgentClassIcon(s){var o;const e=bt[s];if(e)return e.icon;const i=(o=this.frameCustomClasses)==null?void 0:o.get(s);return i?i.icon:"🤖"}getDisplayName(s,e){return e!=="compact"||s.length<=12?s:`${s.slice(0,10)}..`}drawAgent(s,e,i,o,n){var Ct;const{x:l,z:a}=s.position,d=(s.isBoss?.7:.5)*o,h=this.camera.getZoom(),m=te(h),f=ee(h,n&&!!s.taskLabel),c=se(h),u=c!=="minimal",p=c==="full",T=c==="full",A=c==="full",b=c==="full"||c==="reduced",S=c==="compact"||c==="minimal",x=this.getDisplayName(s.name,c),D=this.animationTime*8,I=s.status==="working",O=I?Math.abs(Math.sin(this.animationTime*4))*4*m:0,Z=i?Math.sin(D*2)*.05:0,et=i?1+Math.sin(D*2)*.08:1,Y=i?Math.sin(D)*.15:0,q=Bt[s.status]||Bt.idle,N=this.numberToHex(s.color),dt=this.darkenColor(N,.4);this.lightenColor(N,.3);const Xt=this.getAgentClassIcon(s.class),P=this.camera.worldToScreen(l,a+Z),y=d*this.camera.getZoom();this.ctx.save(),this.ctx.fillStyle="rgba(0, 0, 0, 0.35)",this.ctx.beginPath(),this.ctx.ellipse(P.x+3,P.y+3,y*1.05,y*.95,0,0,Math.PI*2),this.ctx.fill();const wt=I?.75+Math.sin(this.animationTime*2.5)*.2:.85,gt=y+6,lt=this.ctx.createRadialGradient(P.x,P.y,y,P.x,P.y,gt+4);if(lt.addColorStop(0,"transparent"),lt.addColorStop(.5,this.hexToRgba(q.color,wt*.5)),lt.addColorStop(1,"transparent"),this.ctx.beginPath(),this.ctx.arc(P.x,P.y,gt+4,0,Math.PI*2),this.ctx.fillStyle=lt,this.ctx.fill(),this.ctx.beginPath(),this.ctx.arc(P.x,P.y,gt,0,Math.PI*2),this.ctx.strokeStyle=this.hexToRgba(q.color,wt*.8),this.ctx.lineWidth=2,this.ctx.stroke(),e){const z=s.isBoss?.4:.34,C=y+10,v=this.ctx.createRadialGradient(P.x,P.y,y+6,P.x,P.y,C+8);v.addColorStop(0,this.hexToRgba(N,z*.34)),v.addColorStop(.5,this.hexToRgba(N,z*.16)),v.addColorStop(1,"transparent"),this.ctx.beginPath(),this.ctx.arc(P.x,P.y,C+8,0,Math.PI*2),this.ctx.fillStyle=v,this.ctx.fill(),this.ctx.beginPath(),this.ctx.arc(P.x,P.y,C,0,Math.PI*2),this.ctx.strokeStyle=this.hexToRgba(N,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=y*.25,C=P.y+y*.7;this.ctx.fillStyle="rgba(0, 0, 0, 0.3)",this.ctx.beginPath(),this.ctx.ellipse(P.x,C+4,y*.6,y*.15,0,0,Math.PI*2),this.ctx.fill(),this.ctx.fillStyle=dt,this.ctx.beginPath(),this.ctx.arc(P.x-y*.3+Y*this.camera.getZoom(),C,z,0,Math.PI*2),this.ctx.fill(),this.ctx.beginPath(),this.ctx.arc(P.x+y*.3-Y*this.camera.getZoom(),C,z,0,Math.PI*2),this.ctx.fill()}const Zt=i?y/et:y,Et=i?y*et:y,ct=this.ctx.createRadialGradient(P.x-y*.3,P.y-y*.3,0,P.x,P.y,y);ct.addColorStop(0,"#3a3a3a"),ct.addColorStop(.5,"#1a1a1a"),ct.addColorStop(1,"#0a0a0a"),this.ctx.beginPath(),i?this.ctx.ellipse(P.x,P.y,Zt,Et,0,0,Math.PI*2):this.ctx.arc(P.x,P.y,y,0,Math.PI*2),this.ctx.fillStyle=ct,this.ctx.fill(),this.ctx.strokeStyle=this.hexToRgba(N,.6),this.ctx.lineWidth=2,this.ctx.stroke(),this.ctx.beginPath(),this.ctx.arc(P.x-y*.25,P.y-y*.25,y*.3,0,Math.PI*2),this.ctx.fillStyle="rgba(255, 255, 255, 0.1)",this.ctx.fill(),this.ctx.restore();const Ot=Math.max(6,Math.max(10*m,y*1.1));if(this.ctx.font=`${Ot}px "Segoe UI Emoji", "Apple Color Emoji", "Noto Color Emoji", sans-serif`,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(Xt,P.x,P.y+1-O),s.isBoss){const z=Math.max(6,Math.max(8*m,y*.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("👑",P.x,P.y-y-2)}if(S){const z=Math.max(1.5,3.2*m),C=P.x+y*.6,v=P.y-y*.6;this.ctx.beginPath(),this.ctx.arc(C,v,z+1.5,0,Math.PI*2),this.ctx.fillStyle=this.hexToRgba(q.color,.28),this.ctx.fill(),this.ctx.beginPath(),this.ctx.arc(C,v,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 C=0;C<4;C++){const v=D+C*1.5,L=P.x+Math.sin(v*1.5)*y*.5,R=P.y+y*.9+Math.abs(Math.sin(v))*8,B=2+Math.sin(v)*1,F=.4-Math.abs(Math.sin(v))*.3;this.ctx.beginPath(),this.ctx.arc(L,R,B,0,Math.PI*2),this.ctx.fillStyle=`rgba(180, 180, 180, ${F})`,this.ctx.fill()}const ut=o*m,st=P.y+y+12*m,zt=o*f;if(u){const z=Math.max(4.5,13*zt);this.ctx.font=`bold ${z}px "Segoe UI", Arial, sans-serif`;const C=this.ctx.measureText(x).width,v=Math.max(2,6*f),L=z+Math.max(2,4*f),R=c==="full"&&(s.provider==="claude"||s.provider==="codex"),B=R?z*.45:0,F=R?z*.3:0,$=B+F,W=C+$+v*2,_=P.x+$/2,V=this.ctx.createLinearGradient(P.x-W/2,st-L/2,P.x-W/2,st+L/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(P.x-W/2,st-L/2,W,L,Math.max(2,4*f)),this.ctx.fillStyle=V,this.ctx.fill(),this.ctx.strokeStyle=this.hexToRgba(N,.6),this.ctx.lineWidth=Math.max(.75,1.5*f),this.ctx.stroke(),R){const ot=P.x-W/2+v+B/2,mt=st,pt=s.provider==="codex"?"#4a9eff":"#ff9e4a";this.ctx.beginPath(),this.ctx.arc(ot,mt,B/2,0,Math.PI*2),this.ctx.fillStyle=pt,this.ctx.fill(),this.ctx.strokeStyle="rgba(255, 255, 255, 0.9)",this.ctx.lineWidth=Math.max(.75,B*.12),this.ctx.stroke()}this.ctx.fillStyle=N,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.font=`bold ${z}px "Segoe UI", Arial, sans-serif`,this.ctx.fillText(x,_,st)}const vt=St(s).freePercent,nt=Math.max(0,Math.min(100,vt))/100,U=st+(u?Math.max(2.5,(13*zt+Math.max(2,4*f))/2):0)+8*m,j=76*m,tt=7*m,ft=Math.max(1,2.2*m);if(p){if(this.ctx.beginPath(),this.roundedRectScreen(P.x-j/2,U,j,tt,ft),this.ctx.fillStyle="rgba(0, 0, 0, 0.7)",this.ctx.fill(),nt>0){let z,C;nt>.5?(z="#6a9a78",C="#4a7a58"):nt>.2?(z="#c89858",C="#a87838"):(z="#c85858",C="#a83838");const v=this.ctx.createLinearGradient(P.x-j/2,U,P.x-j/2+j*nt,U);v.addColorStop(0,z),v.addColorStop(1,C),this.ctx.beginPath(),this.roundedRectScreen(P.x-j/2,U,j*nt,tt,ft),this.ctx.fillStyle=v,this.ctx.fill()}if(this.ctx.beginPath(),this.roundedRectScreen(P.x-j/2,U,j,tt,ft),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(vt)}%`,C=Math.max(4.5,10*m);this.ctx.font=`bold ${C}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,P.x,U+tt/2)}}if(A&&s.status==="idle"&&s.lastActivity>0){const z=Math.floor((Date.now()-s.lastActivity)/1e3);if(z>=5){const C=this.formatIdleTime(z),v=U+tt+10*m;let L,R,B;z<60?(L="rgba(74, 158, 74, 0.9)",R="#aaffaa",B="💤"):(z<300,L="rgba(158, 120, 50, 0.9)",R="#ffdd88",B="⏳");const F=Math.max(4.5,9*ut);this.ctx.font=`bold ${F}px "Segoe UI Emoji", "Apple Color Emoji", Arial`;const $=`${B} ${C}`,W=this.ctx.measureText($).width,_=5*m,V=F+3*m;this.ctx.beginPath(),this.roundedRectScreen(P.x-W/2-_,v-V/2,W+_*2,V,V/2),this.ctx.fillStyle=L,this.ctx.fill(),this.ctx.fillStyle=R,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText($,P.x,v)}}this.effect.updateAgentTool(s.id,s.currentTool);const it=this.effect.getToolAnimation(s.id);if(A&&it&&it.opacity>.01){const z=yt[it.tool]||yt.default,C=U+tt+10*m,v=it.opacity,L=it.fadeIn?this.easeOutCubic(v):v,R=.8+.2*L,B=Math.max(4.5,10*ut)*R;this.ctx.font=`bold ${B}px "Segoe UI Emoji", "Apple Color Emoji", Arial`;const F=`${z} ${it.tool}`,$=this.ctx.measureText(F).width,W=6*m*R,_=B+4*m*R,V=(1-L)*4*m,ot=C+V;this.ctx.beginPath(),this.roundedRectScreen(P.x-$/2-W,ot-_/2,$+W*2,_,_/2),this.ctx.fillStyle=`rgba(74, 118, 158, ${.9*v})`,this.ctx.fill(),this.ctx.strokeStyle=`rgba(74, 158, 255, ${.6*v})`,this.ctx.lineWidth=1,this.ctx.stroke(),this.ctx.fillStyle=`rgba(170, 221, 255, ${v})`,this.ctx.textAlign="center",this.ctx.textBaseline="middle",this.ctx.fillText(F,P.x,ot)}if(A&&n&&s.taskLabel){const z=Math.max(5,15*ut);this.ctx.font=`bold italic ${z}px "Segoe UI", Arial, sans-serif`;const C=s.taskLabel.length>30?s.taskLabel.substring(0,28)+"..":s.taskLabel,v=this.ctx.measureText(C).width,L=6*m,R=z+5*m,B=U+tt+10*m;this.ctx.beginPath(),this.roundedRectScreen(P.x-v/2-L,B-R/2,v+L*2,R,R/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(C,P.x,B)}if(b&&((Ct=this.frameUnseenOutput)!=null&&Ct.has(s.id))){const z=10*m,C=P.x+y*.7,v=P.y-y*.7,L=this.ctx.createRadialGradient(C,v,0,C,v,z*1.5);L.addColorStop(0,"rgba(74, 158, 255, 0.8)"),L.addColorStop(1,"rgba(74, 158, 255, 0)"),this.ctx.beginPath(),this.ctx.arc(C,v,z*1.5,0,Math.PI*2),this.ctx.fillStyle=L,this.ctx.fill();const R=z*.9,B=-Math.PI/2,F=B+2*Math.PI/3,$=B+4*Math.PI/3,W=C+R*Math.cos(B),_=v+R*Math.sin(B),V=C+R*Math.cos(F),ot=v+R*Math.sin(F),mt=C+R*Math.cos($),pt=v+R*Math.sin($);this.ctx.beginPath(),this.ctx.moveTo(W,_),this.ctx.lineTo(V,ot),this.ctx.lineTo(mt,pt),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("!",C,v+1)}}drawSelectionBox(s,e){const i=this.camera.getZoom(),o=Math.min(s.x,e.x),n=Math.max(s.x,e.x),l=Math.min(s.z,e.z),a=Math.max(s.z,e.z),r=n-o,d=a-l;if(r<.1&&d<.1)return;this.camera.applyTransform(this.ctx);const h=this.ctx,m="#4a9eff",f=this.animationTime*30%24,c=6/i,u=3/i;h.strokeStyle="rgba(74, 158, 255, 0.2)",h.lineWidth=6/i,h.beginPath(),h.rect(o,l,r,d),h.stroke();const p=h.createLinearGradient(o,l,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,l,r,d),h.fill();const T=h.createLinearGradient(o,l,n,l);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,l+1/i),h.lineTo(n-r*.1,l+1/i),h.stroke(),h.strokeStyle="rgba(74, 158, 255, 0.9)",h.lineWidth=2/i,h.setLineDash([c,u]),h.lineDashOffset=-f/i,h.beginPath(),h.rect(o,l,r,d),h.stroke(),h.setLineDash([]),h.strokeStyle="rgba(74, 158, 255, 0.3)",h.lineWidth=1/i,h.beginPath(),h.rect(o-1/i,l-1/i,r+2/i,d+2/i),h.stroke();const A=Math.min(r,d)*.15,S=Math.max(A,.3);h.strokeStyle=m,h.lineWidth=3/i,h.lineCap="round",this.drawSelectionCorner(o,l,S,"top-left"),this.drawSelectionCorner(n,l,S,"top-right"),this.drawSelectionCorner(o,a,S,"bottom-left"),this.drawSelectionCorner(n,a,S,"bottom-right");const x=3/i;h.fillStyle=m;const M=.6+Math.sin(this.animationTime*4)*.3,D=[{x:o,y:l},{x:n,y:l},{x:o,y:a},{x:n,y:a}];for(const I of D)h.fillStyle=`rgba(74, 158, 255, ${M*.35})`,h.beginPath(),h.arc(I.x,I.y,x*2.5,0,Math.PI*2),h.fill(),h.fillStyle=m,h.beginPath(),h.arc(I.x,I.y,x,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 Lt{constructor(t,s){g(this,"grid");g(this,"area");g(this,"building");g(this,"agent");g(this,"effect");this.effect=new jt(t,s),this.grid=new qt(t,s),this.area=new ie(t,s),this.building=new oe(t,s),this.agent=new ne(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 G=class G{constructor(t,s,e){g(this,"canvas");g(this,"camera");g(this,"scene");g(this,"isMouseDown",!1);g(this,"isPanning",!1);g(this,"isSelecting",!1);g(this,"lastMouseX",0);g(this,"lastMouseY",0);g(this,"mouseDownX",0);g(this,"mouseDownY",0);g(this,"mouseDownTime",0);g(this,"lastClickTime",0);g(this,"lastClickTarget",null);g(this,"doubleClickDelay",400);g(this,"selectionBox",null);g(this,"hoveredAgentId",null);g(this,"hoveredBuildingId",null);g(this,"isMouseInCanvas",!1);g(this,"isResizingArea",!1);g(this,"resizeHandleType",null);g(this,"isDraggingBuilding",!1);g(this,"draggingBuildingId",null);g(this,"buildingDragStartPos",null);g(this,"isDraggingAgent",!1);g(this,"draggingAgentId",null);g(this,"agentDragStartPos",null);g(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 l=this.scene.getAgentAtScreenPos(e,i),a=this.scene.getBuildingAtScreenPos(e,i);if(l){this.draggingAgentId=l.id,this.agentDragStartPos={...o},this.isDraggingAgent=!1;return}if(a&&!l){this.draggingBuildingId=a.id,this.buildingDragStartPos={...o},this.isDraggingBuilding=!1;return}!l&&!a&&(this.isSelecting=!1,this.selectionBox={start:{...o},end:{...o}})}});g(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 l=this.scene.getBuildingAtScreenPos(e,i),a=(l==null?void 0:l.id)??null;if(a!==this.hoveredBuildingId&&(this.hoveredBuildingId=a,(f=(m=this.scene).handleBuildingHover)==null||f.call(m,a)),!this.isMouseDown){const c=this.camera.screenToWorld(e,i),u=this.scene.getAreaHandleAtWorldPos(c.x,c.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,d=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 c=h.x-this.agentDragStartPos.x,u=h.z-this.agentDragStartPos.z,p=Math.sqrt(c*c+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 c=h.x-this.buildingDragStartPos.x,u=h.z-this.buildingDragStartPos.z,p=Math.sqrt(c*c+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,d):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});g(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,l=this.isPanning;if(n&&this.selectionBox&&(this.scene.handleSelectionBox(this.selectionBox.start,this.selectionBox.end),this.selectionBox=null),!l&&!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:l}),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:l,wasSelecting:n,button:t.button});this.isMouseDown=!1,this.isPanning=!1,this.isSelecting=!1,this.canvas.classList.remove("panning","selecting")});g(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)});g(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)}});g(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),l=this.scene.getBuildingAtScreenPos(e,i),a=this.scene.getAreaAtScreenPos(e,i);if(w.getState().selectedAgentIds.size>0&&!n&&!l){this.scene.handleMoveCommand({x:o.x,z:o.z}),this.scene.createMoveOrderEffect({x:o.x,z:o.z});return}let d=null;n?d={type:"agent",id:n.id}:l?d={type:"building",id:l.id}:a&&(d={type:"area",id:a.id}),this.scene.handleContextMenu({x:t.clientX,y:t.clientY},{x:o.x,z:o.z},d)});g(this,"onKeyDown",t=>{const s=t.target,e=w.getState(),i=s.tagName==="INPUT"||s.tagName==="TEXTAREA"||s.isContentEditable,o=s.closest(".guake-terminal"),n=o==null?void 0:o.classList.contains("collapsed"),l=w.getShortcuts(),a=l.find(m=>m.id==="next-agent"),r=l.find(m=>m.id==="prev-agent"),d=l.find(m=>m.id==="open-terminal"),h=l.find(m=>m.id==="toggle-spotlight");if(K(t,h)){console.log("[Scene2DInput] Spotlight shortcut detected, passing through");return}if(i)if((K(t,a)||K(t,r))&&n)s.blur();else if(K(t,d)&&n)s.blur();else return;if((K(t,a)||K(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,c=f?m.findIndex(p=>p.id===f):-1;let u;K(t,a)?u=c===-1?0:(c+1)%m.length:u=c===-1?m.length-1:(c-1+m.length)%m.length,t.preventDefault(),w.selectAgent(m[u].id);return}if(K(t,d)){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(),w.selectAgent(m),w.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"),w.setTerminalOpen(!0)}});g(this,"touchStartPositions",[]);g(this,"initialPinchDistance",0);g(this,"longPressTimer",null);g(this,"longPressTriggered",!1);g(this,"touchIsPanning",!1);g(this,"touchPanVelocityX",0);g(this,"touchPanVelocityY",0);g(this,"lastTouchMoveTime",0);g(this,"touchInertiaFrameId",null);g(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 l=t.touches[0].clientX,a=t.touches[0].clientY;this.longPressTimer=setTimeout(()=>{this.longPressTriggered=!0,this.longPressTimer=null,this.handleTouchLongPress(l,a),navigator.vibrate&&navigator.vibrate(50)},G.TOUCH_LONG_PRESS_DURATION)}else t.touches.length===2&&(this.clearLongPressTimer(),this.initialPinchDistance=this.getPinchDistance(t.touches),this.isPanning=!1)});g(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)>G.TOUCH_DRAG_THRESHOLD||Math.abs(n)>G.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,d=i-this.lastMouseY,h=r/a,m=d/a;this.touchPanVelocityX=this.touchPanVelocityX*.7+h*.3,this.touchPanVelocityY=this.touchPanVelocityY*.7+m*.3,this.camera.panBy(r,d)}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}});g(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});g(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=Ht(Ft.AGENT_ORDER,[]).filter(f=>e.has(f)),l=s.filter(f=>!o.includes(f.id)).sort((f,c)=>(f.createdAt||0)-(c.createdAt||0)).map(f=>f.id),a=[...o,...l],r=new Map(s.map(f=>[f.id,f])),d=a.map(f=>r.get(f)).filter(f=>f!==void 0),h=new Map;for(const f of d){const c=w.getAreaForAgent(f.id),u=(c==null?void 0:c.id)||null;h.has(u)||h.set(u,{area:c?{name:c.name}:null,agents:[]}),h.get(u).agents.push(f)}const m=Array.from(h.values());return m.sort((f,c)=>{var u,p;return!f.area&&c.area?1:f.area&&!c.area?-1:!f.area&&!c.area?0:(((u=f.area)==null?void 0:u.name)||"").localeCompare(((p=c.area)==null?void 0:p.name)||"")}),m.flatMap(f=>f.agents)}startTouchInertia(){if(Math.hypot(this.touchPanVelocityX,this.touchPanVelocityY)<G.TOUCH_INERTIA_MIN_SPEED)return;this.stopTouchInertia();let s=this.touchPanVelocityX,e=this.touchPanVelocityY,i=performance.now();const o=n=>{const l=Math.max(1,n-i);i=n,this.camera.panBy(s*l,e*l);const a=Math.pow(G.TOUCH_INERTIA_DECAY,l/(1e3/60));if(s*=a,e*=a,Math.hypot(s,e)<G.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),l=this.scene.getAgentAtScreenPos(i,o),a=this.scene.getBuildingAtScreenPos(i,o),r=this.scene.getAreaAtScreenPos(i,o);if(w.getState().selectedAgentIds.size>0&&!l&&!a){this.scene.handleMoveCommand({x:n.x,z:n.z}),this.scene.createMoveOrderEffect({x:n.x,z:n.z});return}let h=null;l?h={type:"agent",id:l.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?w.openTerminalOnMobile(i.id):(w.selectAgent(i.id),w.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 l=this.canvas.getBoundingClientRect();this.scene.handleBuildingClick(o.id,{x:t+l.left,y:s+l.top}),this.lastClickTime=n,this.lastClickTarget=o.id}else{const l=this.scene.getAreaFolderIconAtScreenPos(t,s);if(l){this.scene.handleAreaFolderClick(l.areaId,l.folderPath),this.lastClickTime=0,this.lastClickTarget=null;return}const a=this.scene.getAreaAtScreenPos(t,s),r=this.camera.screenToWorld(t,s);if(a){const d=`area:${a.id}`;this.lastClickTarget===d&&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=d)}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}};g(G,"ENABLE_DOUBLE_CLICK_CAMERA_FOCUS",!1),g(G,"TOUCH_LONG_PRESS_DURATION",500),g(G,"TOUCH_DRAG_THRESHOLD",5),g(G,"TOUCH_INERTIA_DECAY",.9),g(G,"TOUCH_INERTIA_MIN_SPEED",.02);let Tt=G;class ae{constructor(t,s){g(this,"viewportWidth");g(this,"viewportHeight");g(this,"posX",0);g(this,"posZ",0);g(this,"zoom",30);g(this,"minZoom",5);g(this,"maxZoom",150);g(this,"targetPosX",0);g(this,"targetPosZ",0);g(this,"targetZoom",30);g(this,"panSmoothing",.12);g(this,"zoomSmoothing",.15);g(this,"focusSmoothing",.08);g(this,"currentPanSmoothing",.12);g(this,"panLimitEnabled",!0);g(this,"panLimitRadius",50);g(this,"edgePanEnabled",!1);g(this,"edgePanMargin",40);g(this,"edgePanSpeed",8);g(this,"mouseScreenX",0);g(this,"mouseScreenY",0);g(this,"isAnimating",!1);g(this,"animationCallback",null);g(this,"saveTimeout",null);g(this,"needsSave",!1);this.viewportWidth=t,this.viewportHeight=s,this.loadState()}loadState(){const t=Nt();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&&(It(this.posX,this.posZ,this.zoom),this.needsSave=!1),this.saveTimeout=null},500))}saveState(){this.saveTimeout&&(clearTimeout(this.saveTimeout),this.saveTimeout=null),It(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,l=this.clampPosition(o,n);this.posX=l.x,this.posZ=l.z,this.targetPosX=l.x,this.targetPosZ=l.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,l=(e+i)/2,a=s-t+o*2,r=i-e+o*2,d=this.viewportWidth/a,h=this.viewportHeight/r,m=Math.min(d,h)*.9;this.focusOn(n,l,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 l=this.viewportWidth/2,a=this.viewportHeight/2,r=this.targetPosX+(t-l)/o,d=this.targetPosZ+(s-a)/o,h=n.x-r,m=n.z-d,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 l=this.screenToWorld(t,s),a=this.clampPosition(this.posX+n.x-l.x,this.posZ+n.z-l.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,l=this.clampPosition(o,n);this.targetPosX=l.x,this.targetPosZ=l.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,l=.001,a=.01,r=Math.abs(this.targetPosX-this.posX)<l,d=Math.abs(this.targetPosZ-this.posZ)<l,h=Math.abs(this.targetZoom-this.zoom)<a;r?this.posX=this.targetPosX:this.posX+=(this.targetPosX-this.posX)*s,d?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&&d,f=h;this.isAnimating&&m&&f&&(this.isAnimating=!1,this.currentPanSmoothing=this.panSmoothing,this.animationCallback&&(this.animationCallback(),this.animationCallback=null));const c=Math.abs(this.posX-i)>1e-4||Math.abs(this.posZ-o)>1e-4||Math.abs(this.zoom-n)>1e-4;return c&&this.scheduleSave(),c}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 X={moveOrder:{primary:"#4aff9e",secondary:"#2ad87e"},bossLine:{primary:"#ffd700",secondary:"#ffaa00",glow:"rgba(255, 215, 0, 0.4)"},toolBubble:{background:["#2a3040","#1a2030"],border:"#4a9eff"}},H=class H{constructor(){g(this,"moveOrderEffects",[]);g(this,"toolBubbles",new Map);g(this,"statusParticles",[]);g(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(),l=Math.pow(1-o,1.5);s.applyTransform(t);const{x:a,z:r}=e.position,d=3;for(let b=0;b<d;b++){const S=Math.max(0,Math.min(1,o*1.5-b*.15));if(S<=0)continue;const x=l*(1-S)*(1-b*.25),M=.3+S*2,D=Math.max(1,3-S*2)/n,I=t.createRadialGradient(a,r,M*.8,a,r,M*1.2);I.addColorStop(0,this.hexToRgba(X.moveOrder.primary,x)),I.addColorStop(1,this.hexToRgba(X.moveOrder.secondary,x*.5)),t.strokeStyle=this.hexToRgba(X.moveOrder.primary,x*.3),t.lineWidth=D*3,t.beginPath(),t.arc(a,r,M,0,Math.PI*2),t.stroke(),t.strokeStyle=I,t.lineWidth=D,t.beginPath(),t.arc(a,r,M,0,Math.PI*2),t.stroke()}const h=l*.8,m=.25,f=this.animationTime*2;t.save(),t.translate(a,r),t.rotate(f),t.strokeStyle=this.hexToRgba(X.moveOrder.primary,h),t.lineWidth=2/n,t.lineCap="round";const c=m*.3,u=m;t.beginPath(),t.moveTo(0,-c),t.lineTo(0,-u),t.moveTo(0,c),t.lineTo(0,u),t.moveTo(-c,0),t.lineTo(-u,0),t.moveTo(c,0),t.lineTo(u,0),t.stroke(),t.restore();const p=i*.01%1,T=.06+Math.sin(p*Math.PI*2)*.02,A=t.createRadialGradient(a,r,0,a,r,T*2);A.addColorStop(0,this.hexToRgba(X.moveOrder.primary,h)),A.addColorStop(.5,this.hexToRgba(X.moveOrder.secondary,h*.8)),A.addColorStop(1,this.hexToRgba(X.moveOrder.secondary,0)),t.fillStyle=A,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 l=Math.sin(o*Math.PI*4)*.03+o*.15,a=s.worldToScreen(e.position.x,e.position.z-1.2-l),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,c=r+m*1.5,u=6,p=a.x-f/2,T=a.y-c/2;t.fillStyle=`rgba(0, 0, 0, ${.3*n})`,t.beginPath(),this.roundedRect(t,p+2,T+3,f,c,u),t.fill();const A=t.createLinearGradient(p,T,p,T+c);A.addColorStop(0,this.hexToRgba(X.toolBubble.background[0],n*.95)),A.addColorStop(1,this.hexToRgba(X.toolBubble.background[1],n*.98)),t.fillStyle=A,t.beginPath(),this.roundedRect(t,p,T,f,c,u),t.fill();const b=t.createLinearGradient(p+u,T+1,p+f-u,T+1);b.addColorStop(0,"transparent"),b.addColorStop(.2,`rgba(255, 255, 255, ${n*.15})`),b.addColorStop(.8,`rgba(255, 255, 255, ${n*.15})`),b.addColorStop(1,"transparent"),t.strokeStyle=b,t.lineWidth=1,t.beginPath(),t.moveTo(p+u,T+1),t.lineTo(p+f-u,T+1),t.stroke();const S=t.createLinearGradient(p,T,p,T+c);S.addColorStop(0,this.hexToRgba(X.toolBubble.border,n*.8)),S.addColorStop(1,this.hexToRgba(X.toolBubble.border,n*.5)),t.strokeStyle=S,t.lineWidth=1.5,t.beginPath(),this.roundedRect(t,p,T,f,c,u),t.stroke();const x=8,M=6,D=a.x,I=T+c;t.fillStyle=this.hexToRgba(X.toolBubble.background[1],n*.98),t.beginPath(),t.moveTo(D-x/2,I),t.lineTo(D+x/2,I),t.lineTo(D,I+M),t.closePath(),t.fill(),t.strokeStyle=this.hexToRgba(X.toolBubble.border,n*.6),t.lineWidth=1.5,t.beginPath(),t.moveTo(D-x/2-.5,I),t.lineTo(D,I+M),t.lineTo(D+x/2+.5,I),t.stroke();const O=r*.9;t.font=`${O}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,l=i.z-e.z,a=Math.sqrt(n*n+l*l),r=Math.atan2(l,n),d=t.createLinearGradient(e.x,e.z,i.x,i.z);d.addColorStop(0,this.hexToRgba(X.bossLine.primary,.7)),d.addColorStop(.5,this.hexToRgba(X.bossLine.secondary,.5)),d.addColorStop(1,this.hexToRgba(X.bossLine.primary,.7)),t.strokeStyle=X.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=d,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,A=e.x+n*T,b=e.z+l*T,S=.35;t.fillStyle=this.hexToRgba(X.bossLine.primary,S),t.beginPath(),t.arc(A,b,m,0,Math.PI*2),t.fill()}const f=.2,c=Math.PI/6,u={x:i.x-Math.cos(r)*.3,z:i.z-Math.sin(r)*.3};t.fillStyle=this.hexToRgba(X.bossLine.primary,.8),t.beginPath(),t.moveTo(u.x,u.z),t.lineTo(u.x-Math.cos(r-c)*f,u.z-Math.sin(r-c)*f),t.lineTo(u.x-Math.cos(r+c)*f,u.z-Math.sin(r+c)*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),l=e.size*(1-o*.5);s.applyTransform(t);const{x:a,z:r}=e.position,d=t.createRadialGradient(a,r,0,a,r,l*1.5);d.addColorStop(0,this.hexToRgba("#ffffff",n)),d.addColorStop(.2,this.hexToRgba(e.color,n)),d.addColorStop(.6,this.hexToRgba(e.color,n*.4)),d.addColorStop(1,this.hexToRgba(e.color,0)),t.fillStyle=d,t.beginPath(),t.arc(a,r,l*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=H.rgbaCache.get(i);if(o)return o;let n,l,a;if(t.startsWith("rgba")||t.startsWith("rgb")){const d=t.match(/[\d.]+/g);if(d)return n=parseInt(d[0]),l=parseInt(d[1]),a=parseInt(d[2]),o=`rgba(${n}, ${l}, ${a}, ${e})`,H.rgbaCache.size>=H.RGBA_CACHE_MAX&&H.rgbaCache.clear(),H.rgbaCache.set(i,o),o}const r=t.replace("#","");return r.length===3?(n=parseInt(r[0]+r[0],16),l=parseInt(r[1]+r[1],16),a=parseInt(r[2]+r[2],16)):(n=parseInt(r.slice(0,2),16),l=parseInt(r.slice(2,4),16),a=parseInt(r.slice(4,6),16)),o=`rgba(${n}, ${l}, ${a}, ${e})`,H.rgbaCache.size>=H.RGBA_CACHE_MAX&&H.rgbaCache.clear(),H.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=[]}};g(H,"rgbaCache",new Map),g(H,"RGBA_CACHE_MAX",256);let Pt=H;const Q=class Q{constructor(t){g(this,"canvas");g(this,"ctx");g(this,"renderer");g(this,"input");g(this,"camera");g(this,"effects");g(this,"staticCanvas");g(this,"staticCtx");g(this,"staticRenderer");g(this,"staticDirty",!0);g(this,"needsRender",!0);g(this,"agents",new Map);g(this,"buildings",new Map);g(this,"areas",new Map);g(this,"selectedAgentIds",new Set);g(this,"selectedBuildingIds",new Set);g(this,"animationFrameId",null);g(this,"lastFrameTime",0);g(this,"lastAnimationTime",0);g(this,"lastRenderTime",0);g(this,"isRunning",!1);g(this,"fpsLimit",0);g(this,"frameInterval",0);g(this,"currentDpr",1);g(this,"movements",new Map);g(this,"callbacks",{});g(this,"scale2d",.7);g(this,"showTaskLabels",!0);g(this,"showGrid",!0);g(this,"gridSize",30);g(this,"gridSpacing",2);g(this,"drawingTool",null);g(this,"isDrawing",!1);g(this,"drawStartPos",null);g(this,"drawCurrentPos",null);g(this,"sortedAreasAsc",[]);g(this,"sortedAreasDesc",[]);g(this,"areasSortDirty",!0);g(this,"selectedAreaId",null);g(this,"isResizingArea",!1);g(this,"resizeHandleType",null);g(this,"resizeStartPos",null);g(this,"resizeOriginalArea",null);g(this,"areaDragAgentStartPositions",new Map);g(this,"areaDragBuildingStartPositions",new Map);g(this,"handleResize",()=>{const t=this.canvas.parentElement;if(!t)return;let s=Math.min(window.devicePixelRatio||1,Q.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});g(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(),l=e||i||o||this.camera.isCurrentlyAnimating(),a=this.hasCameraChanged();if(a&&(this.staticDirty=!0,this.needsRender=!0),(l||n)&&(this.needsRender=!0),!this.needsRender&&this.agents.size===0)return;const r=1e3/Q.IDLE_FPS_LIMIT,d=1e3/Q.WORKING_FPS_LIMIT;let h;if(l||a?h=this.frameInterval:n?h=this.frameInterval>0?Math.min(this.frameInterval,d):d:h=this.frameInterval>0?Math.min(this.frameInterval,r):r,h>0){if(t-this.lastRenderTime<h)return;this.lastRenderTime=t}Yt.tick();const m=(t-this.lastAnimationTime)/1e3;this.lastAnimationTime=t,this.updateMovements(t),(l||n)&&(this.effects.update(m),this.renderer.update(m),this.staticRenderer.update(m)),this.render(),!l&&!n&&(this.needsRender=!1)});g(this,"lastCamX",NaN);g(this,"lastCamZ",NaN);g(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 ae(t.width,t.height),this.renderer=new Lt(s,this.camera),this.staticRenderer=new Lt(e,this.camera),this.effects=new Pt,this.input=new Tt(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,l=t.position.z+t.size.height/2;return!(o<s.minX-e||i>s.maxX+e||l<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=Math.min(1,o/i.duration),l=1-Math.pow(1-n,3),a=this.agents.get(e);a&&(a.position.x=i.startPos.x+(i.endPos.x-i.startPos.x)*l,a.position.z=i.startPos.z+(i.endPos.z-i.startPos.z)*l),n>=1&&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),d=this.movements.has(a.id);this.renderer.drawAgent(a,r,d,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 l=this.getDrawingPreview();l&&this.renderer.drawAreaPreview(l.start,l.end,l.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,l=!(o!=null&&o.subordinateIds)||o.subordinateIds.includes(i.id);o&&n&&l&&!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=bt[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:St(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()}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=bt[t.class],o=(i==null?void 0:i.color)??16777215,n=this.movements.get(t.id),l=.01;let a;if(n){const r=Math.abs(n.endPos.x-t.position.x),d=Math.abs(n.endPos.z-t.position.z);a=r>l||d>l}else{const r=Math.abs(e.position.x-t.position.x),d=Math.abs(e.position.z-t.position.z);a=r>l||d>l}if(a&&s){const d=Math.sqrt(Math.pow(t.position.x-e.position.x,2)+Math.pow(t.position.z-e.position.z,2))/2*1e3;this.movements.set(t.id,{startPos:{x:e.position.x,z:e.position.z},endPos:{x:t.position.x,z:t.position.z},startTime:performance.now(),duration:Math.max(500,Math.min(d,3e3))})}else a&&!s&&!n&&(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=St(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(e=>e.id));for(const e of this.agents.keys())(!s.has(e)||w.isAgentInArchivedArea(e))&&this.removeAgent(e);for(const e of t)w.isAgentInArchivedArea(e.id)||this.updateAgent(e,!1)}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=w.getState(),s=new Set(t.buildings.keys());for(const e of this.buildings.keys())s.has(e)||this.removeBuilding(e);for(const e of t.buildings.values())this.updateBuilding(e)}syncAreas(){var s;const t=w.getState();this.areas.clear(),this.invalidateAreaSort(),this.markStaticDirty();for(const e of t.areas.values()){if(e.archived)continue;const i=e.directories&&e.directories.length>0,o=(s=e.logo)!=null&&s.filename?{url:$t(Vt(`/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,w.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)),l=t-e.position.x,a=s-e.position.z;if(Math.sqrt(l*l+a*a)<=n)return{areaId:e.id,handleType:"move"};if(e.type==="rectangle"&&"width"in e.size){const{width:r,height:d}=e.size,h=[{type:"nw",x:e.position.x-r/2,z:e.position.z-d/2},{type:"ne",x:e.position.x+r/2,z:e.position.z-d/2},{type:"sw",x:e.position.x-r/2,z:e.position.z+d/2},{type:"se",x:e.position.x+r/2,z:e.position.z+d/2}];for(const f of h){const c=t-f.x,u=s-f.z;if(Math.sqrt(c*c+u*u)<=n)return{areaId:e.id,handleType:f.type}}const m=[{type:"n",x:e.position.x,z:e.position.z-d/2},{type:"s",x:e.position.x,z:e.position.z+d/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 c=t-f.x,u=s-f.z;if(Math.sqrt(c*c+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,d=e.position.z,h=t-r,m=s-d;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=w.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,l]of this.areaDragAgentStartPositions)w.moveAgentLocal(n,{x:l.x+i,y:l.y,z:l.z+o});for(const[n,l]of this.areaDragBuildingStartPositions)w.updateBuildingLocal(n,{position:{x:l.x+i,z:l.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,l=s.size.height,a=s.position.x,r=s.position.z,d=c=>{const u=Math.max(.5,n+c);return{width:u,cx:a+(u-n)/2}},h=c=>{const u=Math.max(.5,n-c);return{width:u,cx:a+(n-u)/2}},m=c=>{const u=Math.max(.5,l+c);return{height:u,cz:r+(u-l)/2}},f=c=>{const u=Math.max(.5,l-c);return{height:u,cz:r+(l-u)/2}};switch(this.resizeHandleType){case"se":{const c=d(i),u=m(o);e={width:c.width,height:u.height,center:{x:c.cx,z:u.cz}};break}case"sw":{const c=h(i),u=m(o);e={width:c.width,height:u.height,center:{x:c.cx,z:u.cz}};break}case"ne":{const c=d(i),u=f(o);e={width:c.width,height:u.height,center:{x:c.cx,z:u.cz}};break}case"nw":{const c=h(i),u=f(o);e={width:c.width,height:u.height,center:{x:c.cx,z:u.cz}};break}case"e":{const c=d(i);e={width:c.width,center:{x:c.cx,z:r}};break}case"w":{const c=h(i);e={width:c.width,center:{x:c.cx,z:r}};break}case"s":{const c=m(o);e={height:c.height,center:{x:a,z:c.cz}};break}case"n":{const c=f(o);e={height:c.height,center:{x:a,z:c.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&&(w.updateArea(this.selectedAreaId,e),this.syncAreas())}finishAreaResize(){if(this.resizeHandleType==="move"&&this.resizeOriginalArea&&this.resizeStartPos){const t=w.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)w.moveAgent(o,{x:n.x+e,y:n.y,z:n.z+i});for(const[o,n]of this.areaDragBuildingStartPositions)w.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=w.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=w.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((l,a)=>{const r=o[a];w.moveAgent(l,{x:r.x,y:0,z:r.z});const d=this.agents.get(l);if(d){const m=Math.sqrt(Math.pow(r.x-d.position.x,2)+Math.pow(r.z-d.position.z,2))/2*1e3;this.movements.set(l,{startPos:{x:d.position.x,z:d.position.z},endPos:{x:r.x,z:r.z},startTime:performance.now(),duration:Math.max(500,Math.min(m,3e3))})}})}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,l=(o-1)*at/2;for(let a=0;a<s;a++){const r=a%i,d=Math.floor(a/i);e.push({x:t.x+r*at-n,z:t.z+d*at-l})}}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){w.moveAgent(t,{x:s.x,y:0,z:s.z}),this.createMoveOrderEffect(s)}handleAgentDragCancel(t){const e=w.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?w.openFileExplorerForAreaFolder(t,s):w.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,l=i.directories||[];let a,r,d=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,d=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,d=Math.max(1,Math.floor((i.size.radius*1.414-o)/n))}else continue;const h=o*.7;for(let m=0;m<l.length;m++){const f=Math.floor(m/d),c=m%d,u=a+c*n,p=r+f*n,T=e.x-u,A=e.z-p;if(Math.sqrt(T*T+A*A)<=h)return{areaId:i.id,folderPath:l[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,l=e.position.x+i/2,a=e.position.z-o/2,r=e.position.z+o/2;if(t>=n&&t<=l&&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,w.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&&w.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),l=Math.max(t.z,s.z),a=o-i,r=l-n;return a<.5||r<.5?null:{id:e,name:"New Area",type:"rectangle",center:{x:(i+o)/2,z:(n+l)/2},width:a,height:r,color:"#4a9eff",zIndex:w.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:w.getNextZIndex(),assignedAgentIds:[],directories:[]}}return null}};g(Q,"IDLE_FPS_LIMIT",8),g(Q,"WORKING_FPS_LIMIT",15),g(Q,"MAX_DPR",1.25);let Mt=Q;function re(k,t={}){const s=E.useRef(null),e=E.useRef(t);e.current=t,E.useEffect(()=>{const f=k.current;if(!f)return;const c=new Mt(f);s.current=c,typeof window<"u"&&(window.__tideScene2D=c),c.setCallbacks({onAgentClick:(b,S)=>{var x,M;return(M=(x=e.current).onAgentClick)==null?void 0:M.call(x,b,S)},onAgentDoubleClick:b=>{var S,x;return(x=(S=e.current).onAgentDoubleClick)==null?void 0:x.call(S,b)},onAgentHover:(b,S)=>{var x,M;return(M=(x=e.current).onAgentHover)==null?void 0:M.call(x,b,S)},onBuildingClick:(b,S)=>{var x,M;return(M=(x=e.current).onBuildingClick)==null?void 0:M.call(x,b,S)},onBuildingDoubleClick:b=>{var S,x;return(x=(S=e.current).onBuildingDoubleClick)==null?void 0:x.call(S,b)},onBuildingDragStart:(b,S)=>{var x,M;return(M=(x=e.current).onBuildingDragStart)==null?void 0:M.call(x,b,S)},onBuildingDragMove:(b,S)=>{var x,M;return(M=(x=e.current).onBuildingDragMove)==null?void 0:M.call(x,b,S)},onBuildingDragEnd:(b,S)=>{var x,M;return(M=(x=e.current).onBuildingDragEnd)==null?void 0:M.call(x,b,S)},onBuildingDragCancel:b=>{var S,x;return(x=(S=e.current).onBuildingDragCancel)==null?void 0:x.call(S,b)},onContextMenu:(b,S,x)=>{var M,D;return(D=(M=e.current).onContextMenu)==null?void 0:D.call(M,b,S,x)},onGroundClick:b=>{var S,x;return(x=(S=e.current).onGroundClick)==null?void 0:x.call(S,b)},onMoveCommand:(b,S)=>{var x,M;return(M=(x=e.current).onMoveCommand)==null?void 0:M.call(x,b,S)},onAreaDoubleClick:b=>{var S,x;return(x=(S=e.current).onAreaDoubleClick)==null?void 0:x.call(S,b)},onSelectionBox:(b,S)=>{const x=Math.min(b.x,S.x),M=Math.max(b.x,S.x),D=Math.min(b.z,S.z),I=Math.max(b.z,S.z),O=[];for(const Z of c.getAgents().values())Z.position.x>=x&&Z.position.x<=M&&Z.position.z>=D&&Z.position.z<=I&&O.push(Z.id);if(O.length>0){w.selectAgent(O[0]);for(let Z=1;Z<O.length;Z++)w.addToSelection(O[Z])}else w.selectAgent(null)}});const u=w.getState();c.syncAreas(),c.syncBuildings(),c.syncAgents(Array.from(u.agents.values())),c.setSelectedAgents(u.selectedAgentIds),c.setSelectedBuildings(u.selectedBuildingIds),c.start();let p=new Map;for(const b of u.agents.values())p.set(b.id,{x:b.position.x,z:b.position.z});let T=u.agents.size>0;const A=w.subscribe(()=>{var S;const b=w.getState();if(!T&&b.agents.size>0){T=!0,c.syncAreas(),c.syncAgents(Array.from(b.agents.values()));for(const x of b.agents.values())p.set(x.id,{x:x.position.x,z:x.position.z})}else{for(const x of b.agents.values()){if(w.isAgentInArchivedArea(x.id)){p.has(x.id)&&(c.removeAgent(x.id),p.delete(x.id));continue}const M=p.get(x.id);!M||M.x!==x.position.x||M.z!==x.position.z?(c.updateAgent(x,!0),p.set(x.id,{x:x.position.x,z:x.position.z})):(S=c.hasActiveMovement)!=null&&S.call(c,x.id)||c.updateAgent(x,!1)}for(const x of p.keys())(!b.agents.has(x)||w.isAgentInArchivedArea(x))&&(c.removeAgent(x),p.delete(x))}c.syncBuildings(),c.syncAreas(),c.setSelectedAgents(b.selectedAgentIds),c.setSelectedBuildings(b.selectedBuildingIds)});return()=>{A(),c.dispose(),s.current=null,typeof window<"u"&&delete window.__tideScene2D}},[k]);const i=E.useCallback(f=>{var c;(c=s.current)==null||c.focusAgent(f)},[]),o=E.useCallback((f,c=!0)=>{var u;(u=s.current)==null||u.updateAgent(f,c)},[]),n=E.useCallback(f=>{var c;(c=s.current)==null||c.createMoveOrderEffect(f)},[]),l=E.useCallback((f,c)=>{var u;(u=s.current)==null||u.showToolBubble(f,c)},[]),a=E.useCallback(f=>{var c;(c=s.current)==null||c.setScale2D(f)},[]),r=E.useCallback(f=>{var c;(c=s.current)==null||c.setTaskLabelsVisible(f)},[]),d=E.useCallback(f=>{var c;(c=s.current)==null||c.setGridVisible(f)},[]),h=E.useCallback(f=>{var c;(c=s.current)==null||c.setDrawingTool(f)},[]),m=E.useCallback(f=>{var c;(c=s.current)==null||c.setFpsLimit(f)},[]);return{scene:s,focusAgent:i,updateAgent:o,createMoveOrderEffect:n,showToolBubble:l,setScale2D:a,setTaskLabelsVisible:r,setGridVisible:d,setDrawingTool:h,setFpsLimit:m}}function me({onAgentClick:k,onAgentDoubleClick:t,onAgentHover:s,onBuildingClick:e,onBuildingDoubleClick:i,onBuildingDragStart:o,onBuildingDragMove:n,onBuildingDragEnd:l,onBuildingDragCancel:a,onContextMenu:r,onGroundClick:d,onMoveCommand:h,onAreaDoubleClick:m,scale2d:f=1,showTaskLabels:c=!0,showGrid:u=!0,fpsLimit:p=0,className:T=""}){const A=E.useRef(null),{scene:b,setScale2D:S,setTaskLabelsVisible:x,setGridVisible:M,setDrawingTool:D,setFpsLimit:I}=re(A,{onAgentClick:k,onAgentDoubleClick:t,onAgentHover:s,onBuildingClick:e,onBuildingDoubleClick:i,onBuildingDragStart:o,onBuildingDragMove:n,onBuildingDragEnd:l,onBuildingDragCancel:a,onContextMenu:r,onGroundClick:d,onMoveCommand:h,onAreaDoubleClick:m});return E.useEffect(()=>(typeof window<"u"&&b.current&&(window.__tideScene2D_setDrawingTool=D),()=>{typeof window<"u"&&delete window.__tideScene2D_setDrawingTool}),[D,b]),E.useEffect(()=>{S(f)},[f,S]),E.useEffect(()=>{x(c)},[c,x]),E.useEffect(()=>{M(u)},[u,M]),E.useEffect(()=>{I(p)},[p,I]),xt.jsxs("div",{className:`scene-2d-container ${T}`,children:[xt.jsx("canvas",{ref:A,className:"scene-2d-canvas"}),xt.jsx("div",{className:"scene-2d-badge",children:"2D Mode"})]})}export{me as Scene2DCanvas,me as default};
|