tide-commander 1.84.4 → 1.84.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/assets/{BossLogsModal-RKUS5he3.js → BossLogsModal-Cdpx6ycE.js} +1 -1
  2. package/dist/assets/{BossSpawnModal-Z-KIzG1l.js → BossSpawnModal-Dggt0YfE.js} +1 -1
  3. package/dist/assets/{ControlsModal-sWKF7juv.js → ControlsModal-CUlAiEBw.js} +1 -1
  4. package/dist/assets/{DockerLogsModal-Chv6wO7i.js → DockerLogsModal-CMXFBadq.js} +1 -1
  5. package/dist/assets/{EmbeddedEditor-BnJunhJ5.js → EmbeddedEditor-BCndZBxL.js} +1 -1
  6. package/dist/assets/{GmailOAuthSetup-CD24tWFR.js → GmailOAuthSetup-Cc5WGia9.js} +1 -1
  7. package/dist/assets/{GoogleOAuthSetup-D7lmU7_z.js → GoogleOAuthSetup-bcxBts0d.js} +1 -1
  8. package/dist/assets/{IframeModal-B7M2Iclq.js → IframeModal-DVZTZXmQ.js} +1 -1
  9. package/dist/assets/{IntegrationsPanel-BXniP3m6.js → IntegrationsPanel-Qk_q6nK2.js} +2 -2
  10. package/dist/assets/{LogViewerModal-BkbO5Lcx.js → LogViewerModal-CGlMdoYd.js} +1 -1
  11. package/dist/assets/{MonitoringModal-BLwOrxXn.js → MonitoringModal-Cz9QeKZW.js} +1 -1
  12. package/dist/assets/{PM2LogsModal-Cc5muLh8.js → PM2LogsModal-Bx2vdQ-E.js} +1 -1
  13. package/dist/assets/{RestoreArchivedAreaModal-C2kLOEom.js → RestoreArchivedAreaModal-DcJJGwXu.js} +1 -1
  14. package/dist/assets/{Scene2DCanvas-B_ILFcMh.js → Scene2DCanvas-CfE7OMGC.js} +1 -1
  15. package/dist/assets/{SceneManager-C24V9ffc.js → SceneManager-rHjb08q0.js} +1 -1
  16. package/dist/assets/{SkillsPanel-B7M9i9GP.js → SkillsPanel-BHzuGofi.js} +1 -1
  17. package/dist/assets/{SpawnModal-C47v5dNY.js → SpawnModal-DIdl2Drd.js} +1 -1
  18. package/dist/assets/{SubordinateAssignmentModal-KRP5mXby.js → SubordinateAssignmentModal-DQwdL9vl.js} +1 -1
  19. package/dist/assets/{TriggerManagerPanel-CLmwH7fs.js → TriggerManagerPanel-DyBatEQL.js} +1 -1
  20. package/dist/assets/{WorkflowEditorPanel-CFubZORK.js → WorkflowEditorPanel-BgmL4Ch-.js} +1 -1
  21. package/dist/assets/{index-DQVaH0CS.js → index-1OSS3ui-.js} +1 -1
  22. package/dist/assets/{index-CO5NGvTa.js → index-4c1B05V1.js} +1 -1
  23. package/dist/assets/{index-BEc3pZNf.js → index-BGT2utqA.js} +1 -1
  24. package/dist/assets/{index-D94lnP2P.js → index-CWlU_PZq.js} +1 -1
  25. package/dist/assets/{index-5oP0HT38.js → index-Czc4WA-r.js} +3 -3
  26. package/dist/assets/{index-CztWNLcY.js → index-DMQ6F_-M.js} +1 -1
  27. package/dist/assets/{index-C0L5LEWi.js → index-DMhLboZ5.js} +1 -1
  28. package/dist/assets/{index-7TgA90RK.js → index-DWbo7Hf3.js} +1 -1
  29. package/dist/assets/{index-D3lbWfGO.js → index-DaMAErCi.js} +2 -2
  30. package/dist/assets/{main-DFVcOIIz.js → main-DrsDQIKU.js} +5 -5
  31. package/dist/assets/{web-BRpVSwLu.js → web-BP2TNYTf.js} +1 -1
  32. package/dist/assets/{web-DskROW-O.js → web-D1RJXxjR.js} +1 -1
  33. package/dist/index.html +1 -1
  34. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- import{r as a,u as Ot,z as nn,j as e,V as an,B as sn,E as ln,G as St,S as k,H as Et,J as vt,K as Mt,L as rt,M as ae,N as rn,s as h,O as $t,P as Bt,U as on,v as Tt,w as Pt,I as u,W as cn,m as dn,X as un,Y as Ft,Z as Wt,_ as pn,$ as mn,a0 as fn,a1 as hn,a2 as gn,a3 as xn,a4 as bn,a5 as _n,a6 as wn,a7 as Cn,a8 as Lt,C as vn,a9 as jn,aa as Nn,ab as kn,ac as yn,ad as In,ae as An,af as Sn,ag as En,ah as Mn,ai as Tn,aj as Pn,ak as Ln,al as Rn,am as zn,an as Dn,ao as On}from"./main-DFVcOIIz.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";const $n=a.memo(function({className:c=""}){const{t:I}=Ot(["common"]),[A,T]=nn(),K=a.useRef(null),[W,se]=a.useState(null);a.useLayoutEffect(()=>{const C=K.current;if(!C)return;const Y=C.querySelector(".view-mode-toggle__btn--active");Y&&se({left:Y.offsetLeft,width:Y.offsetWidth})},[A]);const M=a.useCallback(C=>{if(C!==A){if(typeof window<"u"&&window.dispatchEvent(new CustomEvent("tide:viewmode-switch-pressed",{detail:{mode:C}})),C==="3d"){requestAnimationFrame(()=>T(C));return}T(C)}},[A,T]);return e.jsxs("div",{className:`view-mode-toggle ${c}`,ref:K,children:[W&&e.jsx("div",{className:"view-mode-toggle__indicator",style:{left:W.left,width:W.width}}),an.map(C=>e.jsxs("button",{className:`view-mode-toggle__btn ${A===C?"view-mode-toggle__btn--active":""}`,onClick:()=>M(C),title:I(`common:viewMode.descriptions.${C}`),children:[e.jsxs("span",{className:"view-mode-toggle__icon",children:[C==="2d"&&e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("rect",{x:"3",y:"3",width:"18",height:"18",rx:"2"}),e.jsx("line",{x1:"3",y1:"12",x2:"21",y2:"12"}),e.jsx("line",{x1:"12",y1:"3",x2:"12",y2:"21"})]}),C==="3d"&&e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M12 2L2 7l10 5 10-5-10-5z"}),e.jsx("path",{d:"M2 17l10 5 10-5"}),e.jsx("path",{d:"M2 12l10 5 10-5"})]}),C==="flat"&&e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("rect",{x:"3",y:"3",width:"8",height:"8",rx:"1"}),e.jsx("rect",{x:"13",y:"3",width:"8",height:"8",rx:"1"}),e.jsx("rect",{x:"3",y:"13",width:"8",height:"8",rx:"1"}),e.jsx("rect",{x:"13",y:"13",width:"8",height:"8",rx:"1"})]}),C==="dashboard"&&e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("rect",{x:"3",y:"3",width:"7",height:"9",rx:"1"}),e.jsx("rect",{x:"14",y:"3",width:"7",height:"5",rx:"1"}),e.jsx("rect",{x:"14",y:"12",width:"7",height:"9",rx:"1"}),e.jsx("rect",{x:"3",y:"16",width:"7",height:"5",rx:"1"})]})]}),e.jsx("span",{className:"view-mode-toggle__label",children:I(`common:viewMode.labels.${C}`)})]},C))]})}),ot=3,ct=280,Rt=320,Ct=240,zt=64,Bn=["simple","chat","advanced"],Fn={simple:"Simple",chat:"Chat",advanced:"Advanced"},Wn={simple:"○",chat:"◐",advanced:"◉"},Hn={simple:"Simple view — clean messages only",chat:"Chat view — assistant replies (no tool calls)",advanced:"Advanced view — everything including tools"},Dt="flat-clear-context";function Vn(_){const c=_.split("/").filter(Boolean);return c.length===0?_:c.slice(-2).join("/")}function Gn(_){if(_.provider==="codex"){const K=_.codexModel||"gpt-5.3-codex",W=zn[K];return{model:(W==null?void 0:W.label)||K}}if(_.provider==="opencode")return{model:_.opencodeModel||"opencode"};const c=_.model||"sonnet",I=On[c],A=_.effort,T=A?Dn[A]:void 0;return{model:(I==null?void 0:I.label)||c,effort:T==null?void 0:T.label}}function Xn(_,c){if(c.type==="rectangle"&&c.width&&c.height){const I=c.width/2,A=c.height/2;return _.x>=c.center.x-I&&_.x<=c.center.x+I&&_.z>=c.center.z-A&&_.z<=c.center.z+A}if(c.type==="circle"&&c.radius){const I=_.x-c.center.x,A=_.z-c.center.z;return I*I+A*A<=c.radius*c.radius}return!1}const Un=jn.memo(function({agentId:c,terminalViewMode:I,onTerminalViewModeChange:A,inspectorOpen:T,onToggleInspector:K,onImageClick:W,onFileClick:se,onBashClick:M,onViewMarkdown:C,onRequestClearSubordinates:Y,onOpenBuilding:Pe,keyboard:We,canNavigateBack:He,canNavigateForward:Le,onNavigateBack:le,onNavigateForward:D,agentInfoOpen:ye,onToggleAgentInfo:Z}){var ue,Me,te,Qe;const g=Nn(c),P=Bt(),me=a.useRef(null),Ie=a.useRef(null);a.useEffect(()=>{const l=Ie.current;if(!l)return;const r=o=>{o.button===3?(o.preventDefault(),o.stopPropagation(),le()):o.button===4&&(o.preventDefault(),o.stopPropagation(),D())},d=o=>{(o.button===3||o.button===4)&&o.preventDefault()};return l.addEventListener("mouseup",r),l.addEventListener("mousedown",d),()=>{l.removeEventListener("mouseup",r),l.removeEventListener("mousedown",d)}},[le,D]),a.useEffect(()=>{const l=Ie.current;if(!l)return;let r=0,d=0,o=0;const pe=250,ve=600,Te=80,ht=1.5,gt=L=>{let S=L instanceof HTMLElement?L:null;for(;S&&S!==l;){const et=window.getComputedStyle(S).overflowX;if((et==="auto"||et==="scroll")&&S.scrollWidth>S.clientWidth)return!0;S=S.parentElement}return!1},G=L=>{const S=Date.now();if(S<o){L.preventDefault();return}if(Math.abs(L.deltaX)<=Math.abs(L.deltaY)*ht){r=0;return}if(gt(L.target)){r=0;return}S-d>pe&&(r=0),d=S,r+=L.deltaX,r<=-Te?(r=0,o=S+ve,L.preventDefault(),le()):r>=Te&&(r=0,o=S+ve,L.preventDefault(),D())};return l.addEventListener("wheel",G,{passive:!1}),()=>l.removeEventListener("wheel",G)},[le,D]);const fe=$t(),Re=a.useMemo(()=>{if(!g)return null;const l=new Set,r=[];for(const d of fe.values())d.archived||d.directories.length===0||d.assignedAgentIds.includes(c)&&(l.add(d.id),r.push(d));for(const d of fe.values())d.archived||d.directories.length===0||l.has(d.id)||Xn({x:g.position.x,z:g.position.z},d)&&(l.add(d.id),r.push(d));return r.length===0?null:r.flatMap(d=>d.directories.filter(o=>o&&o.trim().length>0).map(o=>({areaId:d.id,areaName:d.name,dir:o})))},[g,c,fe]),{branches:Ve,fetchRemote:Ge,fetchingDirs:ze}=kn(Re),Ae=a.useMemo(()=>{var d;const l=h.getAreaForAgent(c);if(!l)return[];const r=[];for(const o of P.values())o.type==="terminal"&&h.isPositionInArea(o.position,l)&&r.push({id:o.id,name:o.name,hasUrl:!!((d=o.terminalStatus)!=null&&d.url)});return r},[c,P]),he=a.useMemo(()=>{var d;const l=h.getAreaForAgent(c);if(!l)return[];const r=[];for(const o of P.values())o.type==="server"&&((d=o.pm2)!=null&&d.enabled)&&h.isPositionInArea(o.position,l)&&r.push({id:o.id,name:o.name});return r},[c,P]),ie=a.useMemo(()=>{const l=h.getAreaForAgent(c);if(!l)return[];const r=[];for(const d of P.values())d.type==="database"&&d.database&&h.isPositionInArea(d.position,l)&&r.push({id:d.id,name:d.name});return r},[c,P]),[,re]=a.useReducer(l=>l+1,0),H=((ue=me.current)==null?void 0:ue.search.searchMode)??!1,dt=a.useCallback(()=>{var l;(l=me.current)==null||l.search.toggleSearch(),re()},[]),Xe=yn(),oe=Xe.isPending(Dt),[$,X]=a.useState(null),V=$?P.get($):null,{height:U,onResizeStart:Se}=In(),[B,J]=a.useState(()=>vt(k.GIT_PANEL_OPEN,!1)),[ge,Ue]=a.useState(()=>vt(k.BUILDINGS_PANEL_OPEN,!1)),[ce,xe]=a.useState(!1),ut=a.useCallback(()=>{xe(l=>{const r=!l;return r&&An.setEnabled(!0),r})},[]),pt=a.useCallback(()=>xe(!1),[]),be=a.useCallback(()=>{J(l=>{const r=!l;return ae(k.GIT_PANEL_OPEN,r),r})},[]),mt=a.useCallback(()=>{Ue(l=>{const r=!l;return ae(k.BUILDINGS_PANEL_OPEN,r),r})},[]),qe=a.useCallback(()=>{J(!1),ae(k.GIT_PANEL_OPEN,!1)},[]),ft=a.useCallback(()=>{Ue(!1),ae(k.BUILDINGS_PANEL_OPEN,!1)},[]),De=Sn();a.useEffect(()=>{if(!$)return;Ae.some(r=>r.id===$)||X(null)},[$,Ae]);const[_e,de]=a.useState(!1),Oe=a.useRef(null);if(a.useEffect(()=>{if(!_e)return;const l=r=>{Oe.current&&!Oe.current.contains(r.target)&&de(!1)};return document.addEventListener("mousedown",l),()=>document.removeEventListener("mousedown",l)},[_e]),!g)return e.jsx("div",{className:"flat-chat flat-chat--empty",children:e.jsxs("div",{className:"flat-chat__placeholder",children:[e.jsx("span",{className:"flat-chat__placeholder-icon",children:"💬"}),e.jsx("span",{className:"flat-chat__placeholder-text",children:"Select an agent to start chatting"})]})});const Q=g.contextStats,Ke=!!Q,Ye=Q?Q.totalTokens:g.contextUsed||0,we=Q?Q.contextWindow:g.contextLimit||2e5,x=Q?Q.usedPercent:Math.round(Ye/we*100),O=Math.max(0,Math.min(100,x)),q=Math.max(0,100-O),Ce=O>=80?"#ff4a4a":O>=60?"#ff9e4a":O>=40?"#ffd700":"#4aff9e",$e=(Ye/1e3).toFixed(1),Ze=(we/1e3).toFixed(1),ee=g.cwd,Je=ee?Vn(ee):null,Ee=((Me=g.subordinateIds)==null?void 0:Me.length)||0,Be=Ee>0;return e.jsxs("div",{ref:Ie,className:`flat-terminal-wrapper ${B||ge||ce?"flat-terminal-wrapper--with-side-panel":""}`,children:[e.jsxs("div",{className:"flat-terminal-wrapper__header",children:[e.jsxs("button",{type:"button",className:`flat-terminal-wrapper__header-main ${ye?"flat-terminal-wrapper__header-main--active":""}`,onClick:Z,title:ye?"Hide agent info":"Show agent info","aria-pressed":ye,children:[e.jsx(Ft,{agent:g,size:28}),e.jsxs("span",{className:"flat-terminal-wrapper__header-info",children:[e.jsx("span",{className:"flat-terminal-wrapper__header-name",children:g.name}),e.jsx("span",{className:"flat-terminal-wrapper__header-status",style:{color:Wt(g.status)},children:g.status})]}),g.taskLabel&&e.jsxs("span",{className:"flat-terminal-wrapper__header-task",title:g.taskLabel,children:["📋 ",g.taskLabel]}),e.jsxs("span",{className:"flat-terminal-wrapper__header-model",children:[e.jsx("img",{src:g.provider==="codex"?"/assets/codex.png":g.provider==="opencode"?"/assets/opencode.png":"/assets/claude.png",alt:g.provider,className:"flat-terminal-wrapper__header-provider-icon",title:g.provider==="codex"?"Codex Agent":g.provider==="opencode"?"OpenCode Agent":"Claude Agent"}),(()=>{const{model:l,effort:r}=Gn(g);return e.jsxs("span",{className:"flat-terminal-wrapper__header-model-chip",title:r?`Model: ${l} · Effort: ${r}`:`Model: ${l}`,children:[e.jsx("span",{className:"flat-terminal-wrapper__header-model-name",children:l}),r&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"flat-terminal-wrapper__header-model-sep","aria-hidden":"true",children:"·"}),e.jsx("span",{className:"flat-terminal-wrapper__header-model-effort",children:r})]})]})})()]})]}),e.jsxs("div",{className:"flat-terminal-wrapper__header-meta",children:[e.jsx("div",{className:"flat-terminal-wrapper__view-mode",role:"group","aria-label":"Message view mode",children:Bn.map(l=>e.jsxs("button",{type:"button",className:`flat-terminal-wrapper__view-mode-btn ${I===l?"flat-terminal-wrapper__view-mode-btn--active":""}`,onClick:()=>A(l),title:Hn[l],"aria-pressed":I===l,children:[e.jsx("span",{className:"flat-terminal-wrapper__view-mode-icon","aria-hidden":"true",children:Wn[l]}),e.jsx("span",{className:"flat-terminal-wrapper__view-mode-label",children:Fn[l]})]},l))}),e.jsxs("div",{className:"flat-terminal-wrapper__actions",role:"group","aria-label":"Terminal actions",children:[e.jsx("button",{type:"button",className:"flat-terminal-wrapper__action-btn",onClick:le,disabled:!He,title:"Back to previous agent","aria-label":"Back to previous agent",children:e.jsx(u,{name:"arrow-left",size:14})}),e.jsx("button",{type:"button",className:"flat-terminal-wrapper__action-btn",onClick:D,disabled:!Le,title:"Forward to next agent","aria-label":"Forward to next agent",children:e.jsx(u,{name:"arrow-right",size:14})}),e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${H?"flat-terminal-wrapper__action-btn--active":""}`,onClick:dt,title:H?"Close search":"Search messages","aria-pressed":H,children:e.jsx(u,{name:H?"cross":"search",size:14})}),e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn flat-terminal-wrapper__action-btn--danger ${oe?"flat-terminal-wrapper__action-btn--confirm":""}`,onClick:()=>Xe.handleClick(Dt,()=>{var l;h.clearContext(c),(l=me.current)==null||l.historyLoader.clearHistory()}),title:oe?"Click again to confirm clear context":"Clear context",children:e.jsx(u,{name:oe?"question":"clear",size:14})}),e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${B?"flat-terminal-wrapper__action-btn--active":""}`,onClick:be,title:B?"Hide git panel":"Show git changes","aria-pressed":B,children:e.jsx(u,{name:"git-branch",size:14})}),e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${ge?"flat-terminal-wrapper__action-btn--active":""}`,onClick:mt,title:ge?"Hide buildings panel":"Show area buildings","aria-pressed":ge,children:e.jsx(u,{name:"buildings",size:14})}),e.jsxs("div",{className:"flat-terminal-wrapper__more",ref:Oe,children:[e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${_e?"flat-terminal-wrapper__action-btn--active":""}`,onClick:()=>de(l=>!l),title:"More actions","aria-expanded":_e,children:"⋮"}),_e&&e.jsxs("div",{className:"flat-terminal-wrapper__more-menu",role:"menu",children:[e.jsxs("button",{type:"button",role:"menuitem",className:`flat-terminal-wrapper__more-item ${ce?"flat-terminal-wrapper__more-item--active":""}`,onClick:()=>{ut(),de(!1)},title:ce?"Hide Debug Panel":"Show Debug Panel",children:[e.jsx(u,{name:"bug",size:14}),e.jsx("span",{children:ce?"Hide Debug Panel":"Show Debug Panel"})]}),e.jsx("div",{className:"flat-terminal-wrapper__more-divider"}),e.jsxs("button",{type:"button",role:"menuitem",className:"flat-terminal-wrapper__more-item",onClick:()=>{h.collapseContext(c),de(!1)},disabled:g.status!=="idle",title:g.status!=="idle"?"Agent must be idle to collapse context":"Collapse context",children:[e.jsx(u,{name:"package",size:14}),e.jsx("span",{children:"Collapse context"})]}),Be&&e.jsxs("button",{type:"button",role:"menuitem",className:"flat-terminal-wrapper__more-item flat-terminal-wrapper__more-item--danger",onClick:()=>{Y(c,Ee),de(!1)},children:[e.jsx(u,{name:"crown",size:14}),e.jsxs("span",{children:["Clear ",Ee," subordinate",Ee===1?"":"s"]})]}),e.jsx("div",{className:"flat-terminal-wrapper__more-divider"}),e.jsxs("button",{type:"button",role:"menuitem",className:"flat-terminal-wrapper__more-item flat-terminal-wrapper__more-item--danger",onClick:()=>{h.killAgent(c),de(!1)},children:[e.jsx(u,{name:"cross",size:14}),e.jsx("span",{children:"Remove agent"})]})]})]})]}),e.jsxs("button",{type:"button",className:`flat-terminal-wrapper__inspector-toggle ${T?"flat-terminal-wrapper__inspector-toggle--active":""}`,onClick:K,title:T?"Hide inspector panel":"Show inspector panel","aria-label":T?"Hide inspector panel":"Show inspector panel","aria-pressed":T,children:[e.jsx("span",{className:"flat-terminal-wrapper__inspector-icon","aria-hidden":"true",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("rect",{x:"1.5",y:"2.5",width:"13",height:"11",rx:"1.5"}),e.jsx("line",{x1:"10",y1:"2.5",x2:"10",y2:"13.5"})]})}),e.jsx("span",{className:"flat-terminal-wrapper__inspector-label",children:"Inspector"})]}),e.jsx("button",{type:"button",className:"flat-terminal-wrapper__close",onClick:()=>h.deselectAll(),title:"Close chat","aria-label":"Close chat",children:e.jsx(u,{name:"cross",size:14})})]})]}),e.jsx(En,{ref:me,agentId:c,agent:g,viewMode:I,isOpen:!0,onImageClick:W,onFileClick:se,onBashClick:M,onViewMarkdown:C,keyboard:We,hasModalOpen:!1}),V&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"guake-bottom-terminal-resize",onMouseDown:Se,role:"separator","aria-orientation":"horizontal","aria-label":"Resize embedded terminal"}),e.jsxs("div",{className:"flat-bottom-panel",role:"region","aria-label":`Embedded terminal: ${V.name}`,style:{height:U},children:[e.jsxs("div",{className:"flat-bottom-panel__header",children:[e.jsxs("span",{className:"flat-bottom-panel__title",children:[e.jsx(u,{name:"terminal",size:12}),e.jsx("span",{children:V.name}),!((te=V.terminalStatus)!=null&&te.url)&&e.jsx("span",{className:"flat-bottom-panel__muted",children:"(starting...)"})]}),e.jsx("button",{type:"button",className:"flat-bottom-panel__close",onClick:()=>X(null),title:"Close embedded terminal","aria-label":"Close embedded terminal",children:e.jsx(u,{name:"cross",size:12})})]}),e.jsx("div",{className:"flat-bottom-panel__body",children:(Qe=V.terminalStatus)!=null&&Qe.url?e.jsx(Mn,{terminalUrl:V.terminalStatus.url,visible:!0}):e.jsx("div",{className:"flat-bottom-panel__placeholder",children:"Starting terminal..."})})]})]}),e.jsxs("div",{className:"flat-terminal-wrapper__statusbar",role:"contentinfo",children:[g.isDetached&&e.jsxs("span",{className:"flat-terminal-wrapper__detached",title:"Reattaching session...",children:[e.jsx(u,{name:"refresh",size:12}),e.jsx("span",{children:"Reattaching"})]}),ee&&Je&&e.jsxs("span",{className:"flat-terminal-wrapper__cwd",title:`Open in file explorer: ${ee}`,"aria-label":`Open ${ee} in file explorer`,role:"button",tabIndex:0,onClick:()=>h.openFileExplorer(ee),onKeyDown:l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),h.openFileExplorer(ee))},children:[e.jsx("span",{className:"flat-terminal-wrapper__cwd-icon",children:e.jsx(u,{name:"folder",size:12})}),e.jsx("span",{className:"flat-terminal-wrapper__cwd-text",children:Je})]}),Re&&Re.map(({areaId:l,areaName:r,dir:d})=>{const o=Ve.get(d),pe=ze.has(d),ve=d.split("/").filter(Boolean).pop()||d;return e.jsxs("span",{className:"flat-terminal-wrapper__area-dir",title:`${r}: ${d}${o?` (${o.branch}${o.ahead?` ↑${o.ahead}`:""}${o.behind?` ↓${o.behind}`:""})`:""}`,onClick:()=>h.openFileExplorerForAreaFolder(l,d),children:[e.jsx(u,{name:"folder-open",size:12}),e.jsx("span",{className:"flat-terminal-wrapper__area-dir-name",children:ve}),o&&e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"flat-terminal-wrapper__area-dir-branch",children:[e.jsx(u,{name:"git-branch",size:10})," ",o.branch]}),o.ahead>0&&e.jsxs("span",{className:"flat-terminal-wrapper__branch-ahead",title:`${o.ahead} ahead`,children:[e.jsx(u,{name:"arrow-up",size:9}),o.ahead]}),o.behind>0&&e.jsxs("span",{className:"flat-terminal-wrapper__branch-behind",title:`${o.behind} behind`,children:[e.jsx(u,{name:"arrow-down",size:9}),o.behind]}),e.jsx("span",{className:`flat-terminal-wrapper__area-fetch ${pe?"flat-terminal-wrapper__area-fetch--fetching":""}`,title:"Git fetch",onClick:Te=>{Te.stopPropagation(),Ge(d)},children:e.jsx(u,{name:pe?"hourglass":"download",size:12})})]})]},`${l}:${d}`)}),e.jsxs("span",{className:"flat-terminal-wrapper__context",onClick:()=>h.setContextModalAgentId(c),title:Ke?`Context usage: ${$e}k / ${Ze}k tokens (${O}% used). Click to view stats.`:"Click to fetch context stats",children:[e.jsx("span",{className:"flat-terminal-wrapper__context-icon",children:e.jsx(u,{name:"dashboard",size:12})}),e.jsx("span",{className:"flat-terminal-wrapper__context-label",children:"Ctx:"}),e.jsx("span",{className:"flat-terminal-wrapper__context-bar",children:e.jsx("span",{className:"flat-terminal-wrapper__context-bar-fill",style:{width:`${O}%`,backgroundColor:Ce}})}),e.jsxs("span",{className:"flat-terminal-wrapper__context-tokens",style:{color:Ce},children:[$e,"k/",Ze,"k"]}),e.jsxs("span",{className:"flat-terminal-wrapper__context-free",children:["(",q,"% free)"]}),!Ke&&e.jsx("span",{className:"flat-terminal-wrapper__context-warning",title:"No context stats yet",children:e.jsx(u,{name:"warn",size:12})})]}),e.jsx("div",{className:"flat-terminal-wrapper__statusbar-spacer","aria-hidden":"true"}),Ae.length>0&&e.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area terminals",children:Ae.map(l=>{const r=$===l.id;return e.jsx("button",{type:"button",className:`flat-terminal-wrapper__building-btn ${r?"flat-terminal-wrapper__building-btn--active":""} ${l.hasUrl?"":"flat-terminal-wrapper__building-btn--offline"}`,title:`${r?"Hide":"Show"} terminal: ${l.name}${l.hasUrl?"":" (starting...)"}`,onClick:()=>{if(r){X(null);return}l.hasUrl||h.sendBuildingCommand(l.id,"start"),X(l.id)},children:e.jsx(u,{name:"terminal",size:14})},l.id)})}),he.length>0&&e.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area PM2 logs",children:he.map(l=>e.jsx("button",{type:"button",className:"flat-terminal-wrapper__building-btn",title:`Open logs: ${l.name}`,onClick:()=>Pe(l.id),children:e.jsx(u,{name:"scroll",size:14})},l.id))}),ie.length>0&&e.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area databases",children:ie.map(l=>e.jsx("button",{type:"button",className:"flat-terminal-wrapper__building-btn",title:`Open database: ${l.name}`,onClick:()=>Pe(l.id),children:e.jsx(u,{name:"hard-drives",size:14})},l.id))}),e.jsx("div",{className:"flat-terminal-wrapper__theme",children:e.jsx(Tn,{})})]}),B&&e.jsx(Pn,{agentId:c,agents:De,onClose:qe,branchInfoMap:Ve,fetchRemote:Ge,fetchingDirs:ze}),ge&&e.jsx(Ln,{agentId:c,onClose:ft}),ce&&e.jsx(Rn,{agentId:c,onClose:pt})]})});function Zn({onAgentClick:_,onBuildingClick:c,onBuildingDoubleClick:I,onBuildingPopup:A,onOpenSpawnModal:T,onOpenBossSpawnModal:K,onOpenAreaModal:W}){const{t:se}=Ot(["common"]),M=sn(),C=ln(),[Y,Pe]=a.useState(null),[We,He]=a.useState(null),[Le,le]=a.useState(null),[D,ye]=a.useState(null),[Z,g]=a.useState(null),[P,me]=a.useState(null),[Ie,fe]=a.useState(!1),Re=a.useCallback(()=>{fe(t=>!t)},[]),Ve=a.useCallback(()=>{fe(!1)},[]),[Ge,ze]=a.useState(()=>{const t=St(k.VIEW_MODE);return t==="simple"||t==="chat"||t==="advanced"?t:"simple"}),Ae=a.useCallback(t=>{ze(t),Et(k.VIEW_MODE,t)},[]);a.useEffect(()=>{const t=n=>{if(n.key!==k.VIEW_MODE)return;const s=n.newValue;(s==="simple"||s==="chat"||s==="advanced")&&ze(s)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)},[]);const[he,ie]=a.useState(()=>vt(k.FLAT_INSPECTOR_OPEN,!1)),[re,H]=a.useState(!1),dt=a.useCallback(()=>H(t=>!t),[]),Xe=a.useCallback(()=>H(!1),[]);a.useEffect(()=>{window.dispatchEvent(new CustomEvent("tide-flat-agents-drawer-state",{detail:{open:re}}))},[re]),a.useEffect(()=>{window.dispatchEvent(new CustomEvent("tide-flat-inspector-state",{detail:{open:he}}))},[he]),a.useEffect(()=>{const t=()=>H(b=>!b),n=()=>{ie(b=>{const i=!b;return ae(k.FLAT_INSPECTOR_OPEN,i),i})},s=()=>{H(!1),ie(!1),ae(k.FLAT_INSPECTOR_OPEN,!1)},p=()=>H(!1),m=()=>{ie(!1),ae(k.FLAT_INSPECTOR_OPEN,!1)};return window.addEventListener("tide-toggle-flat-agents-drawer",t),window.addEventListener("tide-toggle-flat-inspector",n),window.addEventListener("tide-close-flat-side-views",s),window.addEventListener("tide-close-flat-agents-drawer-only",p),window.addEventListener("tide-close-flat-inspector-only",m),()=>{window.removeEventListener("tide-toggle-flat-agents-drawer",t),window.removeEventListener("tide-toggle-flat-inspector",n),window.removeEventListener("tide-close-flat-side-views",s),window.removeEventListener("tide-close-flat-agents-drawer-only",p),window.removeEventListener("tide-close-flat-inspector-only",m)}},[]);const oe=a.useRef(null),$=a.useRef(null),[X,V]=a.useState(()=>{const t=Mt(k.FLAT_MIDDLE_WIDTH,0);return t>=ct?t:null}),[U,Se]=a.useState(()=>{const t=Mt(k.FLAT_INSPECTOR_WIDTH,0);return t>=Ct?t:null}),B=a.useCallback(t=>{if(typeof window>"u")return t;const n=U!==null?ot+U:0,s=window.innerWidth-zt-ot-Rt-n;return Math.max(ct,Math.min(Math.max(s,ct),t))},[U]),J=a.useCallback(t=>{var m;if(typeof window>"u")return t;const n=(m=oe.current)==null?void 0:m.querySelector(".flat-middle"),s=(n==null?void 0:n.getBoundingClientRect().width)??ct,p=window.innerWidth-zt-s-ot-Rt-ot;return Math.max(Ct,Math.min(Math.max(p,Ct),t))},[]);a.useEffect(()=>{if(X===null&&U===null)return;const t=()=>{V(n=>{if(n===null)return n;const s=B(n);return s===n?n:s}),Se(n=>{if(n===null)return n;const s=J(n);return s===n?n:s})};return window.addEventListener("resize",t),()=>window.removeEventListener("resize",t)},[X,U,B,J]);const ge=a.useCallback(t=>{var s;if(t.button!==0)return;const n=(s=oe.current)==null?void 0:s.querySelector(".flat-middle");n&&(t.currentTarget.setPointerCapture(t.pointerId),$.current={kind:"middle",startX:t.clientX,startWidth:n.getBoundingClientRect().width,pointerId:t.pointerId},document.body.classList.add("flat-splitter-dragging"))},[]),Ue=a.useCallback(t=>{var s;if(t.button!==0)return;const n=(s=oe.current)==null?void 0:s.querySelector(".flat-inspector");n&&(t.currentTarget.setPointerCapture(t.pointerId),$.current={kind:"inspector",startX:t.clientX,startWidth:n.getBoundingClientRect().width,pointerId:t.pointerId},document.body.classList.add("flat-splitter-dragging"))},[]),ce=a.useCallback(t=>{const n=$.current;if(!n||t.pointerId!==n.pointerId)return;const s=t.clientX-n.startX;n.kind==="middle"?V(B(n.startWidth+s)):Se(J(n.startWidth-s))},[B,J]),xe=a.useCallback(t=>{const n=$.current;if(!n||t.pointerId!==n.pointerId)return;try{t.currentTarget.releasePointerCapture(t.pointerId)}catch{}if($.current=null,document.body.classList.remove("flat-splitter-dragging"),!(Math.abs(t.clientX-n.startX)>2))return;const p=t.clientX-n.startX;if(n.kind==="middle"){const m=B(n.startWidth+p);V(m),rt(k.FLAT_MIDDLE_WIDTH,m)}else{const m=J(n.startWidth-p);Se(m),rt(k.FLAT_INSPECTOR_WIDTH,m)}},[B,J]),ut=a.useCallback(()=>{V(null),rt(k.FLAT_MIDDLE_WIDTH,0)},[]),pt=a.useCallback(()=>{Se(null),rt(k.FLAT_INSPECTOR_WIDTH,0)},[]),[be,mt]=a.useState(()=>St(k.FLAT_INSPECTOR_VIEW)==="tracking"?"tracking":"agent"),qe=a.useCallback(t=>{mt(t),Et(k.FLAT_INSPECTOR_VIEW,t)},[]),ft=a.useCallback(()=>{ie(t=>{const n=!t;return ae(k.FLAT_INSPECTOR_OPEN,n),n})},[]),De=a.useCallback(()=>{ie(!1),ae(k.FLAT_INSPECTOR_OPEN,!1)},[]),_e=rn(),de=a.useCallback((t,n)=>{Pe({url:t,name:n})},[]),Oe=a.useCallback((t,n)=>{He({command:t,output:n,isLive:!1})},[]),Q=a.useCallback((t,n)=>{h.setFileViewerPath(t,n)},[]),Ke=a.useCallback(t=>{},[]),Ye=a.useCallback((t,n)=>{le({agentId:t,count:n})},[]),we=a.useCallback(t=>{I?I(t):c(t)},[c,I]),x=a.useMemo(()=>C.size>0?Array.from(C)[0]:null,[C]);a.useEffect(()=>{fe(!1)},[x]);const O=a.useRef([]),q=a.useRef(-1),Ce=a.useRef(!1),$e=a.useRef(null),[Ze,ee]=a.useState(!1),[Je,Ee]=a.useState(!1),Be=a.useRef(!1),ue=a.useRef(null),Me=a.useRef(!1),te=a.useMemo(()=>new Set(M.map(t=>t.id)),[M]),Qe=a.useMemo(()=>{const t=new Map(M.map(s=>[s.id,s])),n=new Map;for(const s of M)if((s.isBoss||s.class==="boss")&&s.subordinateIds&&s.subordinateIds.length>0){const p=s.subordinateIds.map(m=>t.get(m)).filter(m=>m!==void 0);p.length>0&&n.set(s.id,p)}return n},[M]),l=a.useCallback(()=>{const t=O.current,n=q.current;ee(n>0),Ee(n>=0&&n<t.length-1)},[]),r=a.useCallback(t=>{const n=O.current;if(n.length===0)return;let s=q.current+t;for(;s>=0&&s<n.length;){const p=n[s];if(te.has(p)){Ce.current=!0,q.current=s,l(),h.selectAgent(p);return}s+=t}},[te,l]),d=a.useCallback(()=>r(-1),[r]),o=a.useCallback(()=>r(1),[r]),pe=a.useCallback((t,n)=>{if(typeof window>"u")return;const s=window.history.state,m={...typeof s=="object"&&s!==null?s:{},__flatAgentNav:{agentId:t}};n==="replace"?window.history.replaceState(m,"",window.location.href):window.history.pushState(m,"",window.location.href)},[]);a.useEffect(()=>{if(!x){Be.current=!1,ue.current=null;return}if(!Be.current){pe(x,"replace"),Be.current=!0,ue.current=x;return}if(Me.current){Me.current=!1,ue.current=x;return}ue.current!==x&&(pe(x,"push"),ue.current=x)},[x,pe]),a.useEffect(()=>{const t=n=>{var b,i;const s=(i=(b=n.state)==null?void 0:b.__flatAgentNav)==null?void 0:i.agentId;if(!s||typeof s!="string"||!te.has(s)||s===x)return;Me.current=!0,Ce.current=!0;const p=O.current,m=p.lastIndexOf(s);m>=0?q.current=m:(p.push(s),q.current=p.length-1),l(),h.selectAgent(s)};return window.addEventListener("popstate",t),()=>window.removeEventListener("popstate",t)},[te,x,l]),a.useEffect(()=>{if(!x){O.current=[],q.current=-1,l();return}if($e.current=x,Ce.current){Ce.current=!1,l();return}const t=O.current,n=q.current;if(n>=0&&t[n]===x){l();return}const s=n<t.length-1?t.slice(0,n+1):t.slice();s.push(x),s.length>100&&s.shift(),O.current=s,q.current=s.length-1,l()},[x,l]);const ve=a.useCallback(t=>{_(t),H(!1)},[_]),Te=x??"",ht=a.useCallback(()=>{},[]),gt=a.useCallback(t=>{ve(t)},[ve]),G=he,[L,S]=a.useState(G),[et,jt]=a.useState(G);a.useEffect(()=>{if(G){S(!0);return}jt(!1);const t=setTimeout(()=>S(!1),240);return()=>clearTimeout(t)},[G]),a.useEffect(()=>{if(!L||!G)return;let t=0;const n=requestAnimationFrame(()=>{t=requestAnimationFrame(()=>jt(!0))});return()=>{cancelAnimationFrame(n),cancelAnimationFrame(t)}},[L,G]);const Nt=a.useRef(null);a.useEffect(()=>{if(x)return;const t=n=>{if(n.key!==" "&&n.key!=="Backspace")return;const s=n.target;if(s.tagName==="INPUT"||s.tagName==="TEXTAREA"||s.isContentEditable)return;const p=$e.current;!p||!te.has(p)||(n.preventDefault(),h.selectAgent(p))};return document.addEventListener("keydown",t),()=>document.removeEventListener("keydown",t)},[x,te]);const[Ht,kt]=a.useState(new Set),Vt=a.useCallback(t=>{kt(n=>{const s=new Set(n);return s.has(t)?s.delete(t):s.add(t),s})},[]),[je,Gt]=a.useState(()=>typeof window<"u"&&window.matchMedia("(max-width: 768px)").matches);a.useEffect(()=>{if(typeof window>"u")return;const t=window.matchMedia("(max-width: 768px)"),n=s=>Gt(s.matches);return t.addEventListener("change",n),()=>t.removeEventListener("change",n)},[]);const[tt,Xt]=a.useState(null),Ut=a.useCallback(t=>{Xt(n=>n===t?null:t)},[]),xt=$t(),nt=Bt(),[qt]=on(),Ne=a.useMemo(()=>{const t=new Map,n=[];for(const f of M){const N=h.getAreaForAgent(f.id);if(!Tt((N==null?void 0:N.id)??null))continue;if(!N||N.archived){n.push(f);continue}const v=t.get(N.id);v?v.push(f):t.set(N.id,[f])}const s=new Map,p=[];for(const f of nt.values()){let N=!1;for(const v of xt.values())if(!v.archived&&Pt(v.id)&&h.isPositionInArea(f.position,v)){const ne=s.get(v.id);ne?ne.push(f):s.set(v.id,[f]),N=!0;break}!N&&Tt(null)&&p.push(f)}const m=[];for(const[,f]of xt){if(f.archived||!Pt(f.id))continue;const N=t.get(f.id),v=s.get(f.id)??[];(N&&N.length>0||v.length>0)&&m.push({area:f,agents:N??[],buildings:v})}(n.length>0||p.length>0)&&m.push({area:{id:"__unassigned__",name:"Unassigned",color:"#6272a4",center:{x:0,z:0},type:"circle",radius:0,directories:[],archived:!1,assignedAgentIds:[],zIndex:0},agents:n,buildings:p});const b=m.filter(f=>f.area.id!=="__unassigned__"),i=m.filter(f=>f.area.id==="__unassigned__");let y=1,j=1;const F=new Map;if(b.length>1){let f=1/0,N=-1/0,v=1/0,ne=-1/0;for(const R of b)f=Math.min(f,R.area.center.x),N=Math.max(N,R.area.center.x),v=Math.min(v,R.area.center.z),ne=Math.max(ne,R.area.center.z);const st=N-f||1,lt=ne-v||1;if(b.length<=4){y=b.length,j=1;const R=[...b].sort((z,bt)=>z.area.center.x-bt.area.center.x);for(let z=0;z<R.length;z++)F.set(R[z].area.id,{row:1,col:z+1})}else{const R=[...b].sort((w,E)=>w.area.center.x-E.area.center.x),z=[];for(let w=1;w<R.length;w++)z.push(R[w].area.center.x-R[w-1].area.center.x);const bt=z.reduce((w,E)=>w+E,0)/z.length||1;let yt=1;for(const w of z)w>bt*1.3&&yt++;y=Math.max(2,Math.min(yt,b.length));const _t=[...b].sort((w,E)=>w.area.center.z-E.area.center.z),it=[];for(let w=1;w<_t.length;w++)it.push(_t[w].area.center.z-_t[w-1].area.center.z);const Jt=it.reduce((w,E)=>w+E,0)/it.length||1;let It=1;for(const w of it)w>Jt*1.3&&It++;j=Math.max(2,Math.min(It,b.length)),y=Math.max(y,Math.ceil(b.length/j)),j=Math.max(j,Math.ceil(b.length/y));const Qt=st/y,en=lt/j,wt=new Set;for(const w of b){let E=Math.min(y-1,Math.max(0,Math.floor((w.area.center.x-f)/Qt))),ke=Math.min(j-1,Math.max(0,Math.floor((w.area.center.z-v)/en))),Fe=`${ke},${E}`,At=0;const tn=j*y;for(;wt.has(Fe)&&At<tn;)E++,E>=y&&(E=0,ke=(ke+1)%j),Fe=`${ke},${E}`,At++;wt.has(Fe)&&(ke=j,E=0,Fe=`${ke},${E}`,j++),wt.add(Fe),F.set(w.area.id,{row:ke+1,col:E+1})}}}const at=f=>{f.sort((N,v)=>{var st,lt,R,z;const ne=(((st=N.position)==null?void 0:st.z)??0)-(((lt=v.position)==null?void 0:lt.z)??0);return ne!==0?ne:(((R=N.position)==null?void 0:R.x)??0)-(((z=v.position)==null?void 0:z.x)??0)})};for(const f of b)at(f.agents);for(const f of i)at(f.agents);return{groups:[...b,...i],gridCols:y,gridRows:j,positions:F}},[M,xt,nt,qt]),Kt=a.useMemo(()=>{if(!D)return[];const t=M.find(n=>n.id===D.agentId);return t?[{id:"edit-agent",label:"Edit Agent",icon:e.jsx(u,{name:"edit",size:14}),onClick:()=>{window.dispatchEvent(new CustomEvent("tide:open-agent-edit",{detail:{agentId:t.id}}))}},{id:"open-chat",label:"Open Chat",icon:e.jsx(u,{name:"chat",size:14}),onClick:()=>_(t.id)},{id:"delete-agent",label:"Delete Agent",icon:e.jsx(u,{name:"trash",size:14}),danger:!0,onClick:()=>{me({agentId:t.id,name:t.name})}}]:[]},[D,M,_]),Yt=a.useMemo(()=>{var b;if(!Z)return[];const t=nt.get(Z.buildingId);if(!t)return[];const n=[],s=t.type==="server"||t.type==="docker"||t.type==="terminal",p=t.status==="running",m=t.type==="boss";if(n.push({id:"open",label:t.type==="database"?"Open Database":t.type==="folder"?"Open Folder":t.type==="boss"?"View Boss Logs":t.type==="terminal"?"Open Terminal":t.type==="server"&&((b=t.pm2)!=null&&b.enabled)?"View PM2 Logs":"Open",icon:e.jsx(u,{name:t.type==="database"?"database":t.type==="folder"?"folder":t.type==="terminal"?"terminal":"eye",size:14}),onClick:()=>we(t.id)}),s&&(p||n.push({id:"start",label:"Start",icon:e.jsx(u,{name:"play",size:14}),onClick:()=>h.sendBuildingCommand(t.id,"start")}),p&&(n.push({id:"restart",label:"Restart",icon:e.jsx(u,{name:"refresh",size:14}),onClick:()=>h.sendBuildingCommand(t.id,"restart")}),n.push({id:"stop",label:"Stop",icon:e.jsx(u,{name:"stop",size:14}),onClick:()=>h.sendBuildingCommand(t.id,"stop")}))),m&&t.subordinateBuildingIds&&t.subordinateBuildingIds.length>0&&(n.push({id:"start-all",label:"Start All Subordinates",icon:e.jsx(u,{name:"launch",size:14}),onClick:()=>{for(const i of t.subordinateBuildingIds)h.sendBuildingCommand(i,"start")}}),n.push({id:"stop-all",label:"Stop All Subordinates",icon:e.jsx(u,{name:"pause",size:14}),onClick:()=>{for(const i of t.subordinateBuildingIds)h.sendBuildingCommand(i,"stop")}}),n.push({id:"restart-all",label:"Restart All Subordinates",icon:e.jsx(u,{name:"restart",size:14}),onClick:()=>{for(const i of t.subordinateBuildingIds)h.sendBuildingCommand(i,"restart")}})),s&&n.push({id:"health-check",label:"Health Check",icon:e.jsx(u,{name:"health",size:14}),onClick:()=>h.sendBuildingCommand(t.id,"healthCheck")}),n.push({id:"divider-edit",label:"",divider:!0,onClick:()=>{}}),n.push({id:"edit",label:"Edit Building",icon:e.jsx(u,{name:"edit",size:14}),onClick:()=>{window.dispatchEvent(new CustomEvent("tide:building-edit",{detail:{buildingId:t.id}}))}}),n.push({id:"clone",label:"Clone Building",icon:e.jsx(u,{name:"copy",size:14}),onClick:()=>{h.createBuilding({name:`${t.name} (Copy)`,type:t.type,style:t.style,color:t.color,scale:t.scale,position:{x:t.position.x+2,z:t.position.z+2},cwd:t.cwd,folderPath:t.folderPath,commands:t.commands,pm2:t.pm2,docker:t.docker,database:t.database,terminal:t.terminal,urls:t.urls,subordinateBuildingIds:t.subordinateBuildingIds})}}),t.urls&&t.urls.length>0)for(const i of t.urls)n.push({id:`url-${i.label}`,label:i.label,icon:e.jsx(u,{name:"link",size:14}),onClick:()=>window.open(i.url,"_blank","noopener,noreferrer")});return n.push({id:"divider-danger",label:"",divider:!0,onClick:()=>{}}),n.push({id:"delete",label:"Delete Building",icon:e.jsx(u,{name:"trash",size:14}),danger:!0,onClick:()=>h.deleteBuilding(t.id)}),n},[Z,nt,we]),Zt=a.useCallback(t=>{const n=new Set(Ne.groups.map(s=>s.area.id));n.delete(t),kt(n),requestAnimationFrame(()=>{const s=Nt.current;if(!s)return;const p=s.querySelector(`[data-area-id="${t}"]`);if(!p)return;const m=s.getBoundingClientRect(),i=p.getBoundingClientRect().top-m.top+s.scrollTop-8;s.scrollTo({top:Math.max(0,i),behavior:"smooth"})})},[Ne]);return e.jsxs("div",{ref:oe,className:`flat-view ${G?"flat-view--with-inspector":""} ${x?"flat-view--has-chat":""} ${re?"flat-view--mobile-sidebar-open":""}`,style:(()=>{if(X===null&&U===null)return;const t={};return X!==null&&(t["--flat-middle-width"]=`${X}px`),U!==null&&(t["--flat-inspector-width"]=`${U}px`),t})(),children:[re&&e.jsx("div",{className:"flat-mobile-sidebar-backdrop",onClick:Xe,"aria-hidden":"true"}),e.jsxs("div",{className:"flat-middle",children:[e.jsx("div",{className:"flat-middle__header",children:e.jsxs("div",{className:"flat-middle__actions",children:[e.jsx("button",{className:"flat-cta-btn flat-cta-btn--agent",onClick:T,title:"Create new agent",children:"+ Agent"}),e.jsx("button",{className:"flat-cta-btn flat-cta-btn--boss",onClick:K,title:"Create new boss agent",children:"+ Boss"}),e.jsx("button",{className:"flat-cta-btn flat-cta-btn--area",onClick:W,title:"Create new area",children:"+ Area"})]})}),e.jsx("div",{className:"flat-middle__content",children:e.jsx(cn,{activeAgentId:Te,onClose:ht,onSelectAgent:gt,collapsedAreas:Ht,onToggleArea:Vt,agentListRef:Nt})})]}),e.jsx("div",{className:"flat-splitter flat-splitter--middle",role:"separator","aria-orientation":"vertical","aria-label":"Resize agents panel",title:"Drag to resize · Double-click to reset",onPointerDown:ge,onPointerMove:ce,onPointerUp:xe,onPointerCancel:xe,onDoubleClick:ut}),e.jsxs("div",{className:"flat-right",children:[e.jsxs("button",{type:"button",className:"flat-mobile-sidebar-toggle","aria-label":re?"Close agents sidebar":"Open agents sidebar","aria-expanded":re,onClick:dt,children:[e.jsx(u,{name:"list",size:18}),e.jsx("span",{className:"flat-mobile-sidebar-toggle__label",children:"Agents"})]}),x?e.jsx(Un,{agentId:x,terminalViewMode:Ge,onTerminalViewModeChange:Ae,inspectorOpen:he,onToggleInspector:ft,onImageClick:de,onFileClick:Q,onBashClick:Oe,onViewMarkdown:Ke,onRequestClearSubordinates:Ye,onOpenBuilding:we,keyboard:_e,canNavigateBack:Ze,canNavigateForward:Je,onNavigateBack:d,onNavigateForward:o,agentInfoOpen:Ie,onToggleAgentInfo:Re}):e.jsx("div",{className:"flat-chat flat-chat--empty",children:e.jsxs("div",{className:"flat-map",children:[e.jsxs("div",{className:"flat-map__header",children:[e.jsx("span",{className:"flat-map__title",children:"🗺️ Areas"}),e.jsx("span",{className:"flat-map__hint",children:"Click an area to focus it, or an agent to chat"}),e.jsx($n,{className:"flat-map__view-mode"})]}),e.jsx("div",{className:"flat-map__grid",style:{gridTemplateColumns:`repeat(${Ne.gridCols}, 1fr)`},children:Ne.groups.length===0?e.jsx("div",{className:"flat-map__empty",children:e.jsx("span",{children:"No areas or agents yet"})}):(()=>{var n;const t=je&&tt?((n=Ne.positions.get(tt))==null?void 0:n.row)??null:null;return Ne.groups.map(s=>{const p=s.area.id,m=Ne.positions.get(p),b=je&&tt!==p;return je&&t!=null&&(m==null?void 0:m.row)===t&&p!==tt?null:e.jsxs("div",{className:`flat-map-area-card${b?" flat-map-area-card--collapsed":""}`,style:{"--area-color":s.area.color,gridRow:m==null?void 0:m.row,gridColumn:m==null?void 0:m.col},children:[e.jsxs("button",{type:"button",className:"flat-map-area-card__header",onClick:()=>je?Ut(p):Zt(p),title:je?b?`Expand ${s.area.name}`:`Collapse ${s.area.name}`:`Focus ${s.area.name} in left panel`,"aria-expanded":je?!b:void 0,children:[e.jsx("span",{className:"flat-map-area-card__color",style:{background:s.area.color}}),e.jsx("span",{className:"flat-map-area-card__name",children:s.area.name}),e.jsx("span",{className:"flat-map-area-card__count",children:s.agents.length}),je&&e.jsx(u,{name:b?"caret-down":"caret-up",size:11,className:"flat-map-area-card__caret"})]}),e.jsx("div",{className:"flat-map-area-card__agents",children:s.agents.map(i=>{const y=i.isBoss||i.class==="boss",j=y?Qe.get(i.id):void 0,F=dn(i),at=F.usedPercent>=80?"#ff4a4a":F.usedPercent>=60?"#ff9e4a":F.usedPercent>=40?"#ffd700":"#4aff9e",f=`Context: ${(F.totalTokens/1e3).toFixed(1)}k / ${(F.contextWindow/1e3).toFixed(1)}k (${F.usedPercent}% used, ${F.freePercent}% free)`,N=i.latestTodos&&i.latestTodos.length>0||j&&j.length>0;return e.jsx(un,{todos:i.latestTodos,subordinates:j,position:"top",children:e.jsxs("button",{type:"button",className:`flat-map-agent-chip ${i.status}`,onClick:()=>_(i.id),onContextMenu:v=>{v.preventDefault(),v.stopPropagation(),ye({agentId:i.id,position:{x:v.clientX,y:v.clientY}})},title:N?void 0:`${y?"Boss · ":""}Open chat with ${i.name}
1
+ import{r as a,u as Ot,z as nn,j as e,V as an,B as sn,E as ln,G as St,S as k,H as Et,J as vt,K as Mt,L as rt,M as ae,N as rn,s as h,O as $t,P as Bt,U as on,v as Tt,w as Pt,I as u,W as cn,m as dn,X as un,Y as Ft,Z as Wt,_ as pn,$ as mn,a0 as fn,a1 as hn,a2 as gn,a3 as xn,a4 as bn,a5 as _n,a6 as wn,a7 as Cn,a8 as Lt,C as vn,a9 as jn,aa as Nn,ab as kn,ac as yn,ad as In,ae as An,af as Sn,ag as En,ah as Mn,ai as Tn,aj as Pn,ak as Ln,al as Rn,am as zn,an as Dn,ao as On}from"./main-DrsDQIKU.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";const $n=a.memo(function({className:c=""}){const{t:I}=Ot(["common"]),[A,T]=nn(),K=a.useRef(null),[W,se]=a.useState(null);a.useLayoutEffect(()=>{const C=K.current;if(!C)return;const Y=C.querySelector(".view-mode-toggle__btn--active");Y&&se({left:Y.offsetLeft,width:Y.offsetWidth})},[A]);const M=a.useCallback(C=>{if(C!==A){if(typeof window<"u"&&window.dispatchEvent(new CustomEvent("tide:viewmode-switch-pressed",{detail:{mode:C}})),C==="3d"){requestAnimationFrame(()=>T(C));return}T(C)}},[A,T]);return e.jsxs("div",{className:`view-mode-toggle ${c}`,ref:K,children:[W&&e.jsx("div",{className:"view-mode-toggle__indicator",style:{left:W.left,width:W.width}}),an.map(C=>e.jsxs("button",{className:`view-mode-toggle__btn ${A===C?"view-mode-toggle__btn--active":""}`,onClick:()=>M(C),title:I(`common:viewMode.descriptions.${C}`),children:[e.jsxs("span",{className:"view-mode-toggle__icon",children:[C==="2d"&&e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("rect",{x:"3",y:"3",width:"18",height:"18",rx:"2"}),e.jsx("line",{x1:"3",y1:"12",x2:"21",y2:"12"}),e.jsx("line",{x1:"12",y1:"3",x2:"12",y2:"21"})]}),C==="3d"&&e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M12 2L2 7l10 5 10-5-10-5z"}),e.jsx("path",{d:"M2 17l10 5 10-5"}),e.jsx("path",{d:"M2 12l10 5 10-5"})]}),C==="flat"&&e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("rect",{x:"3",y:"3",width:"8",height:"8",rx:"1"}),e.jsx("rect",{x:"13",y:"3",width:"8",height:"8",rx:"1"}),e.jsx("rect",{x:"3",y:"13",width:"8",height:"8",rx:"1"}),e.jsx("rect",{x:"13",y:"13",width:"8",height:"8",rx:"1"})]}),C==="dashboard"&&e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("rect",{x:"3",y:"3",width:"7",height:"9",rx:"1"}),e.jsx("rect",{x:"14",y:"3",width:"7",height:"5",rx:"1"}),e.jsx("rect",{x:"14",y:"12",width:"7",height:"9",rx:"1"}),e.jsx("rect",{x:"3",y:"16",width:"7",height:"5",rx:"1"})]})]}),e.jsx("span",{className:"view-mode-toggle__label",children:I(`common:viewMode.labels.${C}`)})]},C))]})}),ot=3,ct=280,Rt=320,Ct=240,zt=64,Bn=["simple","chat","advanced"],Fn={simple:"Simple",chat:"Chat",advanced:"Advanced"},Wn={simple:"○",chat:"◐",advanced:"◉"},Hn={simple:"Simple view — clean messages only",chat:"Chat view — assistant replies (no tool calls)",advanced:"Advanced view — everything including tools"},Dt="flat-clear-context";function Vn(_){const c=_.split("/").filter(Boolean);return c.length===0?_:c.slice(-2).join("/")}function Gn(_){if(_.provider==="codex"){const K=_.codexModel||"gpt-5.3-codex",W=zn[K];return{model:(W==null?void 0:W.label)||K}}if(_.provider==="opencode")return{model:_.opencodeModel||"opencode"};const c=_.model||"sonnet",I=On[c],A=_.effort,T=A?Dn[A]:void 0;return{model:(I==null?void 0:I.label)||c,effort:T==null?void 0:T.label}}function Xn(_,c){if(c.type==="rectangle"&&c.width&&c.height){const I=c.width/2,A=c.height/2;return _.x>=c.center.x-I&&_.x<=c.center.x+I&&_.z>=c.center.z-A&&_.z<=c.center.z+A}if(c.type==="circle"&&c.radius){const I=_.x-c.center.x,A=_.z-c.center.z;return I*I+A*A<=c.radius*c.radius}return!1}const Un=jn.memo(function({agentId:c,terminalViewMode:I,onTerminalViewModeChange:A,inspectorOpen:T,onToggleInspector:K,onImageClick:W,onFileClick:se,onBashClick:M,onViewMarkdown:C,onRequestClearSubordinates:Y,onOpenBuilding:Pe,keyboard:We,canNavigateBack:He,canNavigateForward:Le,onNavigateBack:le,onNavigateForward:D,agentInfoOpen:ye,onToggleAgentInfo:Z}){var ue,Me,te,Qe;const g=Nn(c),P=Bt(),me=a.useRef(null),Ie=a.useRef(null);a.useEffect(()=>{const l=Ie.current;if(!l)return;const r=o=>{o.button===3?(o.preventDefault(),o.stopPropagation(),le()):o.button===4&&(o.preventDefault(),o.stopPropagation(),D())},d=o=>{(o.button===3||o.button===4)&&o.preventDefault()};return l.addEventListener("mouseup",r),l.addEventListener("mousedown",d),()=>{l.removeEventListener("mouseup",r),l.removeEventListener("mousedown",d)}},[le,D]),a.useEffect(()=>{const l=Ie.current;if(!l)return;let r=0,d=0,o=0;const pe=250,ve=600,Te=80,ht=1.5,gt=L=>{let S=L instanceof HTMLElement?L:null;for(;S&&S!==l;){const et=window.getComputedStyle(S).overflowX;if((et==="auto"||et==="scroll")&&S.scrollWidth>S.clientWidth)return!0;S=S.parentElement}return!1},G=L=>{const S=Date.now();if(S<o){L.preventDefault();return}if(Math.abs(L.deltaX)<=Math.abs(L.deltaY)*ht){r=0;return}if(gt(L.target)){r=0;return}S-d>pe&&(r=0),d=S,r+=L.deltaX,r<=-Te?(r=0,o=S+ve,L.preventDefault(),le()):r>=Te&&(r=0,o=S+ve,L.preventDefault(),D())};return l.addEventListener("wheel",G,{passive:!1}),()=>l.removeEventListener("wheel",G)},[le,D]);const fe=$t(),Re=a.useMemo(()=>{if(!g)return null;const l=new Set,r=[];for(const d of fe.values())d.archived||d.directories.length===0||d.assignedAgentIds.includes(c)&&(l.add(d.id),r.push(d));for(const d of fe.values())d.archived||d.directories.length===0||l.has(d.id)||Xn({x:g.position.x,z:g.position.z},d)&&(l.add(d.id),r.push(d));return r.length===0?null:r.flatMap(d=>d.directories.filter(o=>o&&o.trim().length>0).map(o=>({areaId:d.id,areaName:d.name,dir:o})))},[g,c,fe]),{branches:Ve,fetchRemote:Ge,fetchingDirs:ze}=kn(Re),Ae=a.useMemo(()=>{var d;const l=h.getAreaForAgent(c);if(!l)return[];const r=[];for(const o of P.values())o.type==="terminal"&&h.isPositionInArea(o.position,l)&&r.push({id:o.id,name:o.name,hasUrl:!!((d=o.terminalStatus)!=null&&d.url)});return r},[c,P]),he=a.useMemo(()=>{var d;const l=h.getAreaForAgent(c);if(!l)return[];const r=[];for(const o of P.values())o.type==="server"&&((d=o.pm2)!=null&&d.enabled)&&h.isPositionInArea(o.position,l)&&r.push({id:o.id,name:o.name});return r},[c,P]),ie=a.useMemo(()=>{const l=h.getAreaForAgent(c);if(!l)return[];const r=[];for(const d of P.values())d.type==="database"&&d.database&&h.isPositionInArea(d.position,l)&&r.push({id:d.id,name:d.name});return r},[c,P]),[,re]=a.useReducer(l=>l+1,0),H=((ue=me.current)==null?void 0:ue.search.searchMode)??!1,dt=a.useCallback(()=>{var l;(l=me.current)==null||l.search.toggleSearch(),re()},[]),Xe=yn(),oe=Xe.isPending(Dt),[$,X]=a.useState(null),V=$?P.get($):null,{height:U,onResizeStart:Se}=In(),[B,J]=a.useState(()=>vt(k.GIT_PANEL_OPEN,!1)),[ge,Ue]=a.useState(()=>vt(k.BUILDINGS_PANEL_OPEN,!1)),[ce,xe]=a.useState(!1),ut=a.useCallback(()=>{xe(l=>{const r=!l;return r&&An.setEnabled(!0),r})},[]),pt=a.useCallback(()=>xe(!1),[]),be=a.useCallback(()=>{J(l=>{const r=!l;return ae(k.GIT_PANEL_OPEN,r),r})},[]),mt=a.useCallback(()=>{Ue(l=>{const r=!l;return ae(k.BUILDINGS_PANEL_OPEN,r),r})},[]),qe=a.useCallback(()=>{J(!1),ae(k.GIT_PANEL_OPEN,!1)},[]),ft=a.useCallback(()=>{Ue(!1),ae(k.BUILDINGS_PANEL_OPEN,!1)},[]),De=Sn();a.useEffect(()=>{if(!$)return;Ae.some(r=>r.id===$)||X(null)},[$,Ae]);const[_e,de]=a.useState(!1),Oe=a.useRef(null);if(a.useEffect(()=>{if(!_e)return;const l=r=>{Oe.current&&!Oe.current.contains(r.target)&&de(!1)};return document.addEventListener("mousedown",l),()=>document.removeEventListener("mousedown",l)},[_e]),!g)return e.jsx("div",{className:"flat-chat flat-chat--empty",children:e.jsxs("div",{className:"flat-chat__placeholder",children:[e.jsx("span",{className:"flat-chat__placeholder-icon",children:"💬"}),e.jsx("span",{className:"flat-chat__placeholder-text",children:"Select an agent to start chatting"})]})});const Q=g.contextStats,Ke=!!Q,Ye=Q?Q.totalTokens:g.contextUsed||0,we=Q?Q.contextWindow:g.contextLimit||2e5,x=Q?Q.usedPercent:Math.round(Ye/we*100),O=Math.max(0,Math.min(100,x)),q=Math.max(0,100-O),Ce=O>=80?"#ff4a4a":O>=60?"#ff9e4a":O>=40?"#ffd700":"#4aff9e",$e=(Ye/1e3).toFixed(1),Ze=(we/1e3).toFixed(1),ee=g.cwd,Je=ee?Vn(ee):null,Ee=((Me=g.subordinateIds)==null?void 0:Me.length)||0,Be=Ee>0;return e.jsxs("div",{ref:Ie,className:`flat-terminal-wrapper ${B||ge||ce?"flat-terminal-wrapper--with-side-panel":""}`,children:[e.jsxs("div",{className:"flat-terminal-wrapper__header",children:[e.jsxs("button",{type:"button",className:`flat-terminal-wrapper__header-main ${ye?"flat-terminal-wrapper__header-main--active":""}`,onClick:Z,title:ye?"Hide agent info":"Show agent info","aria-pressed":ye,children:[e.jsx(Ft,{agent:g,size:28}),e.jsxs("span",{className:"flat-terminal-wrapper__header-info",children:[e.jsx("span",{className:"flat-terminal-wrapper__header-name",children:g.name}),e.jsx("span",{className:"flat-terminal-wrapper__header-status",style:{color:Wt(g.status)},children:g.status})]}),g.taskLabel&&e.jsxs("span",{className:"flat-terminal-wrapper__header-task",title:g.taskLabel,children:["📋 ",g.taskLabel]}),e.jsxs("span",{className:"flat-terminal-wrapper__header-model",children:[e.jsx("img",{src:g.provider==="codex"?"/assets/codex.png":g.provider==="opencode"?"/assets/opencode.png":"/assets/claude.png",alt:g.provider,className:"flat-terminal-wrapper__header-provider-icon",title:g.provider==="codex"?"Codex Agent":g.provider==="opencode"?"OpenCode Agent":"Claude Agent"}),(()=>{const{model:l,effort:r}=Gn(g);return e.jsxs("span",{className:"flat-terminal-wrapper__header-model-chip",title:r?`Model: ${l} · Effort: ${r}`:`Model: ${l}`,children:[e.jsx("span",{className:"flat-terminal-wrapper__header-model-name",children:l}),r&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"flat-terminal-wrapper__header-model-sep","aria-hidden":"true",children:"·"}),e.jsx("span",{className:"flat-terminal-wrapper__header-model-effort",children:r})]})]})})()]})]}),e.jsxs("div",{className:"flat-terminal-wrapper__header-meta",children:[e.jsx("div",{className:"flat-terminal-wrapper__view-mode",role:"group","aria-label":"Message view mode",children:Bn.map(l=>e.jsxs("button",{type:"button",className:`flat-terminal-wrapper__view-mode-btn ${I===l?"flat-terminal-wrapper__view-mode-btn--active":""}`,onClick:()=>A(l),title:Hn[l],"aria-pressed":I===l,children:[e.jsx("span",{className:"flat-terminal-wrapper__view-mode-icon","aria-hidden":"true",children:Wn[l]}),e.jsx("span",{className:"flat-terminal-wrapper__view-mode-label",children:Fn[l]})]},l))}),e.jsxs("div",{className:"flat-terminal-wrapper__actions",role:"group","aria-label":"Terminal actions",children:[e.jsx("button",{type:"button",className:"flat-terminal-wrapper__action-btn",onClick:le,disabled:!He,title:"Back to previous agent","aria-label":"Back to previous agent",children:e.jsx(u,{name:"arrow-left",size:14})}),e.jsx("button",{type:"button",className:"flat-terminal-wrapper__action-btn",onClick:D,disabled:!Le,title:"Forward to next agent","aria-label":"Forward to next agent",children:e.jsx(u,{name:"arrow-right",size:14})}),e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${H?"flat-terminal-wrapper__action-btn--active":""}`,onClick:dt,title:H?"Close search":"Search messages","aria-pressed":H,children:e.jsx(u,{name:H?"cross":"search",size:14})}),e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn flat-terminal-wrapper__action-btn--danger ${oe?"flat-terminal-wrapper__action-btn--confirm":""}`,onClick:()=>Xe.handleClick(Dt,()=>{var l;h.clearContext(c),(l=me.current)==null||l.historyLoader.clearHistory()}),title:oe?"Click again to confirm clear context":"Clear context",children:e.jsx(u,{name:oe?"question":"clear",size:14})}),e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${B?"flat-terminal-wrapper__action-btn--active":""}`,onClick:be,title:B?"Hide git panel":"Show git changes","aria-pressed":B,children:e.jsx(u,{name:"git-branch",size:14})}),e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${ge?"flat-terminal-wrapper__action-btn--active":""}`,onClick:mt,title:ge?"Hide buildings panel":"Show area buildings","aria-pressed":ge,children:e.jsx(u,{name:"buildings",size:14})}),e.jsxs("div",{className:"flat-terminal-wrapper__more",ref:Oe,children:[e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${_e?"flat-terminal-wrapper__action-btn--active":""}`,onClick:()=>de(l=>!l),title:"More actions","aria-expanded":_e,children:"⋮"}),_e&&e.jsxs("div",{className:"flat-terminal-wrapper__more-menu",role:"menu",children:[e.jsxs("button",{type:"button",role:"menuitem",className:`flat-terminal-wrapper__more-item ${ce?"flat-terminal-wrapper__more-item--active":""}`,onClick:()=>{ut(),de(!1)},title:ce?"Hide Debug Panel":"Show Debug Panel",children:[e.jsx(u,{name:"bug",size:14}),e.jsx("span",{children:ce?"Hide Debug Panel":"Show Debug Panel"})]}),e.jsx("div",{className:"flat-terminal-wrapper__more-divider"}),e.jsxs("button",{type:"button",role:"menuitem",className:"flat-terminal-wrapper__more-item",onClick:()=>{h.collapseContext(c),de(!1)},disabled:g.status!=="idle",title:g.status!=="idle"?"Agent must be idle to collapse context":"Collapse context",children:[e.jsx(u,{name:"package",size:14}),e.jsx("span",{children:"Collapse context"})]}),Be&&e.jsxs("button",{type:"button",role:"menuitem",className:"flat-terminal-wrapper__more-item flat-terminal-wrapper__more-item--danger",onClick:()=>{Y(c,Ee),de(!1)},children:[e.jsx(u,{name:"crown",size:14}),e.jsxs("span",{children:["Clear ",Ee," subordinate",Ee===1?"":"s"]})]}),e.jsx("div",{className:"flat-terminal-wrapper__more-divider"}),e.jsxs("button",{type:"button",role:"menuitem",className:"flat-terminal-wrapper__more-item flat-terminal-wrapper__more-item--danger",onClick:()=>{h.killAgent(c),de(!1)},children:[e.jsx(u,{name:"cross",size:14}),e.jsx("span",{children:"Remove agent"})]})]})]})]}),e.jsxs("button",{type:"button",className:`flat-terminal-wrapper__inspector-toggle ${T?"flat-terminal-wrapper__inspector-toggle--active":""}`,onClick:K,title:T?"Hide inspector panel":"Show inspector panel","aria-label":T?"Hide inspector panel":"Show inspector panel","aria-pressed":T,children:[e.jsx("span",{className:"flat-terminal-wrapper__inspector-icon","aria-hidden":"true",children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round",children:[e.jsx("rect",{x:"1.5",y:"2.5",width:"13",height:"11",rx:"1.5"}),e.jsx("line",{x1:"10",y1:"2.5",x2:"10",y2:"13.5"})]})}),e.jsx("span",{className:"flat-terminal-wrapper__inspector-label",children:"Inspector"})]}),e.jsx("button",{type:"button",className:"flat-terminal-wrapper__close",onClick:()=>h.deselectAll(),title:"Close chat","aria-label":"Close chat",children:e.jsx(u,{name:"cross",size:14})})]})]}),e.jsx(En,{ref:me,agentId:c,agent:g,viewMode:I,isOpen:!0,onImageClick:W,onFileClick:se,onBashClick:M,onViewMarkdown:C,keyboard:We,hasModalOpen:!1}),V&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"guake-bottom-terminal-resize",onMouseDown:Se,role:"separator","aria-orientation":"horizontal","aria-label":"Resize embedded terminal"}),e.jsxs("div",{className:"flat-bottom-panel",role:"region","aria-label":`Embedded terminal: ${V.name}`,style:{height:U},children:[e.jsxs("div",{className:"flat-bottom-panel__header",children:[e.jsxs("span",{className:"flat-bottom-panel__title",children:[e.jsx(u,{name:"terminal",size:12}),e.jsx("span",{children:V.name}),!((te=V.terminalStatus)!=null&&te.url)&&e.jsx("span",{className:"flat-bottom-panel__muted",children:"(starting...)"})]}),e.jsx("button",{type:"button",className:"flat-bottom-panel__close",onClick:()=>X(null),title:"Close embedded terminal","aria-label":"Close embedded terminal",children:e.jsx(u,{name:"cross",size:12})})]}),e.jsx("div",{className:"flat-bottom-panel__body",children:(Qe=V.terminalStatus)!=null&&Qe.url?e.jsx(Mn,{terminalUrl:V.terminalStatus.url,visible:!0}):e.jsx("div",{className:"flat-bottom-panel__placeholder",children:"Starting terminal..."})})]})]}),e.jsxs("div",{className:"flat-terminal-wrapper__statusbar",role:"contentinfo",children:[g.isDetached&&e.jsxs("span",{className:"flat-terminal-wrapper__detached",title:"Reattaching session...",children:[e.jsx(u,{name:"refresh",size:12}),e.jsx("span",{children:"Reattaching"})]}),ee&&Je&&e.jsxs("span",{className:"flat-terminal-wrapper__cwd",title:`Open in file explorer: ${ee}`,"aria-label":`Open ${ee} in file explorer`,role:"button",tabIndex:0,onClick:()=>h.openFileExplorer(ee),onKeyDown:l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),h.openFileExplorer(ee))},children:[e.jsx("span",{className:"flat-terminal-wrapper__cwd-icon",children:e.jsx(u,{name:"folder",size:12})}),e.jsx("span",{className:"flat-terminal-wrapper__cwd-text",children:Je})]}),Re&&Re.map(({areaId:l,areaName:r,dir:d})=>{const o=Ve.get(d),pe=ze.has(d),ve=d.split("/").filter(Boolean).pop()||d;return e.jsxs("span",{className:"flat-terminal-wrapper__area-dir",title:`${r}: ${d}${o?` (${o.branch}${o.ahead?` ↑${o.ahead}`:""}${o.behind?` ↓${o.behind}`:""})`:""}`,onClick:()=>h.openFileExplorerForAreaFolder(l,d),children:[e.jsx(u,{name:"folder-open",size:12}),e.jsx("span",{className:"flat-terminal-wrapper__area-dir-name",children:ve}),o&&e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"flat-terminal-wrapper__area-dir-branch",children:[e.jsx(u,{name:"git-branch",size:10})," ",o.branch]}),o.ahead>0&&e.jsxs("span",{className:"flat-terminal-wrapper__branch-ahead",title:`${o.ahead} ahead`,children:[e.jsx(u,{name:"arrow-up",size:9}),o.ahead]}),o.behind>0&&e.jsxs("span",{className:"flat-terminal-wrapper__branch-behind",title:`${o.behind} behind`,children:[e.jsx(u,{name:"arrow-down",size:9}),o.behind]}),e.jsx("span",{className:`flat-terminal-wrapper__area-fetch ${pe?"flat-terminal-wrapper__area-fetch--fetching":""}`,title:"Git fetch",onClick:Te=>{Te.stopPropagation(),Ge(d)},children:e.jsx(u,{name:pe?"hourglass":"download",size:12})})]})]},`${l}:${d}`)}),e.jsxs("span",{className:"flat-terminal-wrapper__context",onClick:()=>h.setContextModalAgentId(c),title:Ke?`Context usage: ${$e}k / ${Ze}k tokens (${O}% used). Click to view stats.`:"Click to fetch context stats",children:[e.jsx("span",{className:"flat-terminal-wrapper__context-icon",children:e.jsx(u,{name:"dashboard",size:12})}),e.jsx("span",{className:"flat-terminal-wrapper__context-label",children:"Ctx:"}),e.jsx("span",{className:"flat-terminal-wrapper__context-bar",children:e.jsx("span",{className:"flat-terminal-wrapper__context-bar-fill",style:{width:`${O}%`,backgroundColor:Ce}})}),e.jsxs("span",{className:"flat-terminal-wrapper__context-tokens",style:{color:Ce},children:[$e,"k/",Ze,"k"]}),e.jsxs("span",{className:"flat-terminal-wrapper__context-free",children:["(",q,"% free)"]}),!Ke&&e.jsx("span",{className:"flat-terminal-wrapper__context-warning",title:"No context stats yet",children:e.jsx(u,{name:"warn",size:12})})]}),e.jsx("div",{className:"flat-terminal-wrapper__statusbar-spacer","aria-hidden":"true"}),Ae.length>0&&e.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area terminals",children:Ae.map(l=>{const r=$===l.id;return e.jsx("button",{type:"button",className:`flat-terminal-wrapper__building-btn ${r?"flat-terminal-wrapper__building-btn--active":""} ${l.hasUrl?"":"flat-terminal-wrapper__building-btn--offline"}`,title:`${r?"Hide":"Show"} terminal: ${l.name}${l.hasUrl?"":" (starting...)"}`,onClick:()=>{if(r){X(null);return}l.hasUrl||h.sendBuildingCommand(l.id,"start"),X(l.id)},children:e.jsx(u,{name:"terminal",size:14})},l.id)})}),he.length>0&&e.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area PM2 logs",children:he.map(l=>e.jsx("button",{type:"button",className:"flat-terminal-wrapper__building-btn",title:`Open logs: ${l.name}`,onClick:()=>Pe(l.id),children:e.jsx(u,{name:"scroll",size:14})},l.id))}),ie.length>0&&e.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area databases",children:ie.map(l=>e.jsx("button",{type:"button",className:"flat-terminal-wrapper__building-btn",title:`Open database: ${l.name}`,onClick:()=>Pe(l.id),children:e.jsx(u,{name:"hard-drives",size:14})},l.id))}),e.jsx("div",{className:"flat-terminal-wrapper__theme",children:e.jsx(Tn,{})})]}),B&&e.jsx(Pn,{agentId:c,agents:De,onClose:qe,branchInfoMap:Ve,fetchRemote:Ge,fetchingDirs:ze}),ge&&e.jsx(Ln,{agentId:c,onClose:ft}),ce&&e.jsx(Rn,{agentId:c,onClose:pt})]})});function Zn({onAgentClick:_,onBuildingClick:c,onBuildingDoubleClick:I,onBuildingPopup:A,onOpenSpawnModal:T,onOpenBossSpawnModal:K,onOpenAreaModal:W}){const{t:se}=Ot(["common"]),M=sn(),C=ln(),[Y,Pe]=a.useState(null),[We,He]=a.useState(null),[Le,le]=a.useState(null),[D,ye]=a.useState(null),[Z,g]=a.useState(null),[P,me]=a.useState(null),[Ie,fe]=a.useState(!1),Re=a.useCallback(()=>{fe(t=>!t)},[]),Ve=a.useCallback(()=>{fe(!1)},[]),[Ge,ze]=a.useState(()=>{const t=St(k.VIEW_MODE);return t==="simple"||t==="chat"||t==="advanced"?t:"simple"}),Ae=a.useCallback(t=>{ze(t),Et(k.VIEW_MODE,t)},[]);a.useEffect(()=>{const t=n=>{if(n.key!==k.VIEW_MODE)return;const s=n.newValue;(s==="simple"||s==="chat"||s==="advanced")&&ze(s)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)},[]);const[he,ie]=a.useState(()=>vt(k.FLAT_INSPECTOR_OPEN,!1)),[re,H]=a.useState(!1),dt=a.useCallback(()=>H(t=>!t),[]),Xe=a.useCallback(()=>H(!1),[]);a.useEffect(()=>{window.dispatchEvent(new CustomEvent("tide-flat-agents-drawer-state",{detail:{open:re}}))},[re]),a.useEffect(()=>{window.dispatchEvent(new CustomEvent("tide-flat-inspector-state",{detail:{open:he}}))},[he]),a.useEffect(()=>{const t=()=>H(b=>!b),n=()=>{ie(b=>{const i=!b;return ae(k.FLAT_INSPECTOR_OPEN,i),i})},s=()=>{H(!1),ie(!1),ae(k.FLAT_INSPECTOR_OPEN,!1)},p=()=>H(!1),m=()=>{ie(!1),ae(k.FLAT_INSPECTOR_OPEN,!1)};return window.addEventListener("tide-toggle-flat-agents-drawer",t),window.addEventListener("tide-toggle-flat-inspector",n),window.addEventListener("tide-close-flat-side-views",s),window.addEventListener("tide-close-flat-agents-drawer-only",p),window.addEventListener("tide-close-flat-inspector-only",m),()=>{window.removeEventListener("tide-toggle-flat-agents-drawer",t),window.removeEventListener("tide-toggle-flat-inspector",n),window.removeEventListener("tide-close-flat-side-views",s),window.removeEventListener("tide-close-flat-agents-drawer-only",p),window.removeEventListener("tide-close-flat-inspector-only",m)}},[]);const oe=a.useRef(null),$=a.useRef(null),[X,V]=a.useState(()=>{const t=Mt(k.FLAT_MIDDLE_WIDTH,0);return t>=ct?t:null}),[U,Se]=a.useState(()=>{const t=Mt(k.FLAT_INSPECTOR_WIDTH,0);return t>=Ct?t:null}),B=a.useCallback(t=>{if(typeof window>"u")return t;const n=U!==null?ot+U:0,s=window.innerWidth-zt-ot-Rt-n;return Math.max(ct,Math.min(Math.max(s,ct),t))},[U]),J=a.useCallback(t=>{var m;if(typeof window>"u")return t;const n=(m=oe.current)==null?void 0:m.querySelector(".flat-middle"),s=(n==null?void 0:n.getBoundingClientRect().width)??ct,p=window.innerWidth-zt-s-ot-Rt-ot;return Math.max(Ct,Math.min(Math.max(p,Ct),t))},[]);a.useEffect(()=>{if(X===null&&U===null)return;const t=()=>{V(n=>{if(n===null)return n;const s=B(n);return s===n?n:s}),Se(n=>{if(n===null)return n;const s=J(n);return s===n?n:s})};return window.addEventListener("resize",t),()=>window.removeEventListener("resize",t)},[X,U,B,J]);const ge=a.useCallback(t=>{var s;if(t.button!==0)return;const n=(s=oe.current)==null?void 0:s.querySelector(".flat-middle");n&&(t.currentTarget.setPointerCapture(t.pointerId),$.current={kind:"middle",startX:t.clientX,startWidth:n.getBoundingClientRect().width,pointerId:t.pointerId},document.body.classList.add("flat-splitter-dragging"))},[]),Ue=a.useCallback(t=>{var s;if(t.button!==0)return;const n=(s=oe.current)==null?void 0:s.querySelector(".flat-inspector");n&&(t.currentTarget.setPointerCapture(t.pointerId),$.current={kind:"inspector",startX:t.clientX,startWidth:n.getBoundingClientRect().width,pointerId:t.pointerId},document.body.classList.add("flat-splitter-dragging"))},[]),ce=a.useCallback(t=>{const n=$.current;if(!n||t.pointerId!==n.pointerId)return;const s=t.clientX-n.startX;n.kind==="middle"?V(B(n.startWidth+s)):Se(J(n.startWidth-s))},[B,J]),xe=a.useCallback(t=>{const n=$.current;if(!n||t.pointerId!==n.pointerId)return;try{t.currentTarget.releasePointerCapture(t.pointerId)}catch{}if($.current=null,document.body.classList.remove("flat-splitter-dragging"),!(Math.abs(t.clientX-n.startX)>2))return;const p=t.clientX-n.startX;if(n.kind==="middle"){const m=B(n.startWidth+p);V(m),rt(k.FLAT_MIDDLE_WIDTH,m)}else{const m=J(n.startWidth-p);Se(m),rt(k.FLAT_INSPECTOR_WIDTH,m)}},[B,J]),ut=a.useCallback(()=>{V(null),rt(k.FLAT_MIDDLE_WIDTH,0)},[]),pt=a.useCallback(()=>{Se(null),rt(k.FLAT_INSPECTOR_WIDTH,0)},[]),[be,mt]=a.useState(()=>St(k.FLAT_INSPECTOR_VIEW)==="tracking"?"tracking":"agent"),qe=a.useCallback(t=>{mt(t),Et(k.FLAT_INSPECTOR_VIEW,t)},[]),ft=a.useCallback(()=>{ie(t=>{const n=!t;return ae(k.FLAT_INSPECTOR_OPEN,n),n})},[]),De=a.useCallback(()=>{ie(!1),ae(k.FLAT_INSPECTOR_OPEN,!1)},[]),_e=rn(),de=a.useCallback((t,n)=>{Pe({url:t,name:n})},[]),Oe=a.useCallback((t,n)=>{He({command:t,output:n,isLive:!1})},[]),Q=a.useCallback((t,n)=>{h.setFileViewerPath(t,n)},[]),Ke=a.useCallback(t=>{},[]),Ye=a.useCallback((t,n)=>{le({agentId:t,count:n})},[]),we=a.useCallback(t=>{I?I(t):c(t)},[c,I]),x=a.useMemo(()=>C.size>0?Array.from(C)[0]:null,[C]);a.useEffect(()=>{fe(!1)},[x]);const O=a.useRef([]),q=a.useRef(-1),Ce=a.useRef(!1),$e=a.useRef(null),[Ze,ee]=a.useState(!1),[Je,Ee]=a.useState(!1),Be=a.useRef(!1),ue=a.useRef(null),Me=a.useRef(!1),te=a.useMemo(()=>new Set(M.map(t=>t.id)),[M]),Qe=a.useMemo(()=>{const t=new Map(M.map(s=>[s.id,s])),n=new Map;for(const s of M)if((s.isBoss||s.class==="boss")&&s.subordinateIds&&s.subordinateIds.length>0){const p=s.subordinateIds.map(m=>t.get(m)).filter(m=>m!==void 0);p.length>0&&n.set(s.id,p)}return n},[M]),l=a.useCallback(()=>{const t=O.current,n=q.current;ee(n>0),Ee(n>=0&&n<t.length-1)},[]),r=a.useCallback(t=>{const n=O.current;if(n.length===0)return;let s=q.current+t;for(;s>=0&&s<n.length;){const p=n[s];if(te.has(p)){Ce.current=!0,q.current=s,l(),h.selectAgent(p);return}s+=t}},[te,l]),d=a.useCallback(()=>r(-1),[r]),o=a.useCallback(()=>r(1),[r]),pe=a.useCallback((t,n)=>{if(typeof window>"u")return;const s=window.history.state,m={...typeof s=="object"&&s!==null?s:{},__flatAgentNav:{agentId:t}};n==="replace"?window.history.replaceState(m,"",window.location.href):window.history.pushState(m,"",window.location.href)},[]);a.useEffect(()=>{if(!x){Be.current=!1,ue.current=null;return}if(!Be.current){pe(x,"replace"),Be.current=!0,ue.current=x;return}if(Me.current){Me.current=!1,ue.current=x;return}ue.current!==x&&(pe(x,"push"),ue.current=x)},[x,pe]),a.useEffect(()=>{const t=n=>{var b,i;const s=(i=(b=n.state)==null?void 0:b.__flatAgentNav)==null?void 0:i.agentId;if(!s||typeof s!="string"||!te.has(s)||s===x)return;Me.current=!0,Ce.current=!0;const p=O.current,m=p.lastIndexOf(s);m>=0?q.current=m:(p.push(s),q.current=p.length-1),l(),h.selectAgent(s)};return window.addEventListener("popstate",t),()=>window.removeEventListener("popstate",t)},[te,x,l]),a.useEffect(()=>{if(!x){O.current=[],q.current=-1,l();return}if($e.current=x,Ce.current){Ce.current=!1,l();return}const t=O.current,n=q.current;if(n>=0&&t[n]===x){l();return}const s=n<t.length-1?t.slice(0,n+1):t.slice();s.push(x),s.length>100&&s.shift(),O.current=s,q.current=s.length-1,l()},[x,l]);const ve=a.useCallback(t=>{_(t),H(!1)},[_]),Te=x??"",ht=a.useCallback(()=>{},[]),gt=a.useCallback(t=>{ve(t)},[ve]),G=he,[L,S]=a.useState(G),[et,jt]=a.useState(G);a.useEffect(()=>{if(G){S(!0);return}jt(!1);const t=setTimeout(()=>S(!1),240);return()=>clearTimeout(t)},[G]),a.useEffect(()=>{if(!L||!G)return;let t=0;const n=requestAnimationFrame(()=>{t=requestAnimationFrame(()=>jt(!0))});return()=>{cancelAnimationFrame(n),cancelAnimationFrame(t)}},[L,G]);const Nt=a.useRef(null);a.useEffect(()=>{if(x)return;const t=n=>{if(n.key!==" "&&n.key!=="Backspace")return;const s=n.target;if(s.tagName==="INPUT"||s.tagName==="TEXTAREA"||s.isContentEditable)return;const p=$e.current;!p||!te.has(p)||(n.preventDefault(),h.selectAgent(p))};return document.addEventListener("keydown",t),()=>document.removeEventListener("keydown",t)},[x,te]);const[Ht,kt]=a.useState(new Set),Vt=a.useCallback(t=>{kt(n=>{const s=new Set(n);return s.has(t)?s.delete(t):s.add(t),s})},[]),[je,Gt]=a.useState(()=>typeof window<"u"&&window.matchMedia("(max-width: 768px)").matches);a.useEffect(()=>{if(typeof window>"u")return;const t=window.matchMedia("(max-width: 768px)"),n=s=>Gt(s.matches);return t.addEventListener("change",n),()=>t.removeEventListener("change",n)},[]);const[tt,Xt]=a.useState(null),Ut=a.useCallback(t=>{Xt(n=>n===t?null:t)},[]),xt=$t(),nt=Bt(),[qt]=on(),Ne=a.useMemo(()=>{const t=new Map,n=[];for(const f of M){const N=h.getAreaForAgent(f.id);if(!Tt((N==null?void 0:N.id)??null))continue;if(!N||N.archived){n.push(f);continue}const v=t.get(N.id);v?v.push(f):t.set(N.id,[f])}const s=new Map,p=[];for(const f of nt.values()){let N=!1;for(const v of xt.values())if(!v.archived&&Pt(v.id)&&h.isPositionInArea(f.position,v)){const ne=s.get(v.id);ne?ne.push(f):s.set(v.id,[f]),N=!0;break}!N&&Tt(null)&&p.push(f)}const m=[];for(const[,f]of xt){if(f.archived||!Pt(f.id))continue;const N=t.get(f.id),v=s.get(f.id)??[];(N&&N.length>0||v.length>0)&&m.push({area:f,agents:N??[],buildings:v})}(n.length>0||p.length>0)&&m.push({area:{id:"__unassigned__",name:"Unassigned",color:"#6272a4",center:{x:0,z:0},type:"circle",radius:0,directories:[],archived:!1,assignedAgentIds:[],zIndex:0},agents:n,buildings:p});const b=m.filter(f=>f.area.id!=="__unassigned__"),i=m.filter(f=>f.area.id==="__unassigned__");let y=1,j=1;const F=new Map;if(b.length>1){let f=1/0,N=-1/0,v=1/0,ne=-1/0;for(const R of b)f=Math.min(f,R.area.center.x),N=Math.max(N,R.area.center.x),v=Math.min(v,R.area.center.z),ne=Math.max(ne,R.area.center.z);const st=N-f||1,lt=ne-v||1;if(b.length<=4){y=b.length,j=1;const R=[...b].sort((z,bt)=>z.area.center.x-bt.area.center.x);for(let z=0;z<R.length;z++)F.set(R[z].area.id,{row:1,col:z+1})}else{const R=[...b].sort((w,E)=>w.area.center.x-E.area.center.x),z=[];for(let w=1;w<R.length;w++)z.push(R[w].area.center.x-R[w-1].area.center.x);const bt=z.reduce((w,E)=>w+E,0)/z.length||1;let yt=1;for(const w of z)w>bt*1.3&&yt++;y=Math.max(2,Math.min(yt,b.length));const _t=[...b].sort((w,E)=>w.area.center.z-E.area.center.z),it=[];for(let w=1;w<_t.length;w++)it.push(_t[w].area.center.z-_t[w-1].area.center.z);const Jt=it.reduce((w,E)=>w+E,0)/it.length||1;let It=1;for(const w of it)w>Jt*1.3&&It++;j=Math.max(2,Math.min(It,b.length)),y=Math.max(y,Math.ceil(b.length/j)),j=Math.max(j,Math.ceil(b.length/y));const Qt=st/y,en=lt/j,wt=new Set;for(const w of b){let E=Math.min(y-1,Math.max(0,Math.floor((w.area.center.x-f)/Qt))),ke=Math.min(j-1,Math.max(0,Math.floor((w.area.center.z-v)/en))),Fe=`${ke},${E}`,At=0;const tn=j*y;for(;wt.has(Fe)&&At<tn;)E++,E>=y&&(E=0,ke=(ke+1)%j),Fe=`${ke},${E}`,At++;wt.has(Fe)&&(ke=j,E=0,Fe=`${ke},${E}`,j++),wt.add(Fe),F.set(w.area.id,{row:ke+1,col:E+1})}}}const at=f=>{f.sort((N,v)=>{var st,lt,R,z;const ne=(((st=N.position)==null?void 0:st.z)??0)-(((lt=v.position)==null?void 0:lt.z)??0);return ne!==0?ne:(((R=N.position)==null?void 0:R.x)??0)-(((z=v.position)==null?void 0:z.x)??0)})};for(const f of b)at(f.agents);for(const f of i)at(f.agents);return{groups:[...b,...i],gridCols:y,gridRows:j,positions:F}},[M,xt,nt,qt]),Kt=a.useMemo(()=>{if(!D)return[];const t=M.find(n=>n.id===D.agentId);return t?[{id:"edit-agent",label:"Edit Agent",icon:e.jsx(u,{name:"edit",size:14}),onClick:()=>{window.dispatchEvent(new CustomEvent("tide:open-agent-edit",{detail:{agentId:t.id}}))}},{id:"open-chat",label:"Open Chat",icon:e.jsx(u,{name:"chat",size:14}),onClick:()=>_(t.id)},{id:"delete-agent",label:"Delete Agent",icon:e.jsx(u,{name:"trash",size:14}),danger:!0,onClick:()=>{me({agentId:t.id,name:t.name})}}]:[]},[D,M,_]),Yt=a.useMemo(()=>{var b;if(!Z)return[];const t=nt.get(Z.buildingId);if(!t)return[];const n=[],s=t.type==="server"||t.type==="docker"||t.type==="terminal",p=t.status==="running",m=t.type==="boss";if(n.push({id:"open",label:t.type==="database"?"Open Database":t.type==="folder"?"Open Folder":t.type==="boss"?"View Boss Logs":t.type==="terminal"?"Open Terminal":t.type==="server"&&((b=t.pm2)!=null&&b.enabled)?"View PM2 Logs":"Open",icon:e.jsx(u,{name:t.type==="database"?"database":t.type==="folder"?"folder":t.type==="terminal"?"terminal":"eye",size:14}),onClick:()=>we(t.id)}),s&&(p||n.push({id:"start",label:"Start",icon:e.jsx(u,{name:"play",size:14}),onClick:()=>h.sendBuildingCommand(t.id,"start")}),p&&(n.push({id:"restart",label:"Restart",icon:e.jsx(u,{name:"refresh",size:14}),onClick:()=>h.sendBuildingCommand(t.id,"restart")}),n.push({id:"stop",label:"Stop",icon:e.jsx(u,{name:"stop",size:14}),onClick:()=>h.sendBuildingCommand(t.id,"stop")}))),m&&t.subordinateBuildingIds&&t.subordinateBuildingIds.length>0&&(n.push({id:"start-all",label:"Start All Subordinates",icon:e.jsx(u,{name:"launch",size:14}),onClick:()=>{for(const i of t.subordinateBuildingIds)h.sendBuildingCommand(i,"start")}}),n.push({id:"stop-all",label:"Stop All Subordinates",icon:e.jsx(u,{name:"pause",size:14}),onClick:()=>{for(const i of t.subordinateBuildingIds)h.sendBuildingCommand(i,"stop")}}),n.push({id:"restart-all",label:"Restart All Subordinates",icon:e.jsx(u,{name:"restart",size:14}),onClick:()=>{for(const i of t.subordinateBuildingIds)h.sendBuildingCommand(i,"restart")}})),s&&n.push({id:"health-check",label:"Health Check",icon:e.jsx(u,{name:"health",size:14}),onClick:()=>h.sendBuildingCommand(t.id,"healthCheck")}),n.push({id:"divider-edit",label:"",divider:!0,onClick:()=>{}}),n.push({id:"edit",label:"Edit Building",icon:e.jsx(u,{name:"edit",size:14}),onClick:()=>{window.dispatchEvent(new CustomEvent("tide:building-edit",{detail:{buildingId:t.id}}))}}),n.push({id:"clone",label:"Clone Building",icon:e.jsx(u,{name:"copy",size:14}),onClick:()=>{h.createBuilding({name:`${t.name} (Copy)`,type:t.type,style:t.style,color:t.color,scale:t.scale,position:{x:t.position.x+2,z:t.position.z+2},cwd:t.cwd,folderPath:t.folderPath,commands:t.commands,pm2:t.pm2,docker:t.docker,database:t.database,terminal:t.terminal,urls:t.urls,subordinateBuildingIds:t.subordinateBuildingIds})}}),t.urls&&t.urls.length>0)for(const i of t.urls)n.push({id:`url-${i.label}`,label:i.label,icon:e.jsx(u,{name:"link",size:14}),onClick:()=>window.open(i.url,"_blank","noopener,noreferrer")});return n.push({id:"divider-danger",label:"",divider:!0,onClick:()=>{}}),n.push({id:"delete",label:"Delete Building",icon:e.jsx(u,{name:"trash",size:14}),danger:!0,onClick:()=>h.deleteBuilding(t.id)}),n},[Z,nt,we]),Zt=a.useCallback(t=>{const n=new Set(Ne.groups.map(s=>s.area.id));n.delete(t),kt(n),requestAnimationFrame(()=>{const s=Nt.current;if(!s)return;const p=s.querySelector(`[data-area-id="${t}"]`);if(!p)return;const m=s.getBoundingClientRect(),i=p.getBoundingClientRect().top-m.top+s.scrollTop-8;s.scrollTo({top:Math.max(0,i),behavior:"smooth"})})},[Ne]);return e.jsxs("div",{ref:oe,className:`flat-view ${G?"flat-view--with-inspector":""} ${x?"flat-view--has-chat":""} ${re?"flat-view--mobile-sidebar-open":""}`,style:(()=>{if(X===null&&U===null)return;const t={};return X!==null&&(t["--flat-middle-width"]=`${X}px`),U!==null&&(t["--flat-inspector-width"]=`${U}px`),t})(),children:[re&&e.jsx("div",{className:"flat-mobile-sidebar-backdrop",onClick:Xe,"aria-hidden":"true"}),e.jsxs("div",{className:"flat-middle",children:[e.jsx("div",{className:"flat-middle__header",children:e.jsxs("div",{className:"flat-middle__actions",children:[e.jsx("button",{className:"flat-cta-btn flat-cta-btn--agent",onClick:T,title:"Create new agent",children:"+ Agent"}),e.jsx("button",{className:"flat-cta-btn flat-cta-btn--boss",onClick:K,title:"Create new boss agent",children:"+ Boss"}),e.jsx("button",{className:"flat-cta-btn flat-cta-btn--area",onClick:W,title:"Create new area",children:"+ Area"})]})}),e.jsx("div",{className:"flat-middle__content",children:e.jsx(cn,{activeAgentId:Te,onClose:ht,onSelectAgent:gt,collapsedAreas:Ht,onToggleArea:Vt,agentListRef:Nt})})]}),e.jsx("div",{className:"flat-splitter flat-splitter--middle",role:"separator","aria-orientation":"vertical","aria-label":"Resize agents panel",title:"Drag to resize · Double-click to reset",onPointerDown:ge,onPointerMove:ce,onPointerUp:xe,onPointerCancel:xe,onDoubleClick:ut}),e.jsxs("div",{className:"flat-right",children:[e.jsxs("button",{type:"button",className:"flat-mobile-sidebar-toggle","aria-label":re?"Close agents sidebar":"Open agents sidebar","aria-expanded":re,onClick:dt,children:[e.jsx(u,{name:"list",size:18}),e.jsx("span",{className:"flat-mobile-sidebar-toggle__label",children:"Agents"})]}),x?e.jsx(Un,{agentId:x,terminalViewMode:Ge,onTerminalViewModeChange:Ae,inspectorOpen:he,onToggleInspector:ft,onImageClick:de,onFileClick:Q,onBashClick:Oe,onViewMarkdown:Ke,onRequestClearSubordinates:Ye,onOpenBuilding:we,keyboard:_e,canNavigateBack:Ze,canNavigateForward:Je,onNavigateBack:d,onNavigateForward:o,agentInfoOpen:Ie,onToggleAgentInfo:Re}):e.jsx("div",{className:"flat-chat flat-chat--empty",children:e.jsxs("div",{className:"flat-map",children:[e.jsxs("div",{className:"flat-map__header",children:[e.jsx("span",{className:"flat-map__title",children:"🗺️ Areas"}),e.jsx("span",{className:"flat-map__hint",children:"Click an area to focus it, or an agent to chat"}),e.jsx($n,{className:"flat-map__view-mode"})]}),e.jsx("div",{className:"flat-map__grid",style:{gridTemplateColumns:`repeat(${Ne.gridCols}, 1fr)`},children:Ne.groups.length===0?e.jsx("div",{className:"flat-map__empty",children:e.jsx("span",{children:"No areas or agents yet"})}):(()=>{var n;const t=je&&tt?((n=Ne.positions.get(tt))==null?void 0:n.row)??null:null;return Ne.groups.map(s=>{const p=s.area.id,m=Ne.positions.get(p),b=je&&tt!==p;return je&&t!=null&&(m==null?void 0:m.row)===t&&p!==tt?null:e.jsxs("div",{className:`flat-map-area-card${b?" flat-map-area-card--collapsed":""}`,style:{"--area-color":s.area.color,gridRow:m==null?void 0:m.row,gridColumn:m==null?void 0:m.col},children:[e.jsxs("button",{type:"button",className:"flat-map-area-card__header",onClick:()=>je?Ut(p):Zt(p),title:je?b?`Expand ${s.area.name}`:`Collapse ${s.area.name}`:`Focus ${s.area.name} in left panel`,"aria-expanded":je?!b:void 0,children:[e.jsx("span",{className:"flat-map-area-card__color",style:{background:s.area.color}}),e.jsx("span",{className:"flat-map-area-card__name",children:s.area.name}),e.jsx("span",{className:"flat-map-area-card__count",children:s.agents.length}),je&&e.jsx(u,{name:b?"caret-down":"caret-up",size:11,className:"flat-map-area-card__caret"})]}),e.jsx("div",{className:"flat-map-area-card__agents",children:s.agents.map(i=>{const y=i.isBoss||i.class==="boss",j=y?Qe.get(i.id):void 0,F=dn(i),at=F.usedPercent>=80?"#ff4a4a":F.usedPercent>=60?"#ff9e4a":F.usedPercent>=40?"#ffd700":"#4aff9e",f=`Context: ${(F.totalTokens/1e3).toFixed(1)}k / ${(F.contextWindow/1e3).toFixed(1)}k (${F.usedPercent}% used, ${F.freePercent}% free)`,N=i.latestTodos&&i.latestTodos.length>0||j&&j.length>0;return e.jsx(un,{todos:i.latestTodos,subordinates:j,position:"top",children:e.jsxs("button",{type:"button",className:`flat-map-agent-chip ${i.status}`,onClick:()=>_(i.id),onContextMenu:v=>{v.preventDefault(),v.stopPropagation(),ye({agentId:i.id,position:{x:v.clientX,y:v.clientY}})},title:N?void 0:`${y?"Boss · ":""}Open chat with ${i.name}
2
2
  ${f}`,children:[e.jsx(Ft,{agent:i,size:16}),y&&e.jsx("span",{className:"flat-map-agent-chip__crown","aria-hidden":"true",children:e.jsx(u,{name:"crown",size:11,color:"#ffd700",weight:"fill"})}),e.jsx("span",{className:"flat-map-agent-chip__name",children:i.name}),e.jsx("img",{src:i.provider==="codex"?"/assets/codex.png":i.provider==="opencode"?"/assets/opencode.png":"/assets/claude.png",alt:i.provider,className:"flat-map-agent-chip__provider-icon",title:i.provider==="codex"?"Codex Agent":i.provider==="opencode"?"OpenCode Agent":"Claude Agent"}),e.jsx("span",{className:"flat-map-agent-chip__dot",style:{backgroundColor:Wt(i.status)}}),i.latestTodos&&i.latestTodos.length>0&&e.jsx(pn,{todos:i.latestTodos,maxDots:6}),y&&j&&j.length>0&&e.jsx(mn,{subordinates:j,maxDots:6}),e.jsx("span",{className:"flat-map-agent-chip__context-bar","aria-hidden":"true",children:e.jsx("span",{className:"flat-map-agent-chip__context-bar-fill",style:{width:`${F.usedPercent}%`,backgroundColor:at}})})]})},i.id)})}),s.buildings.length>0&&e.jsx("div",{className:"flat-map-area-card__buildings",children:s.buildings.map(i=>e.jsxs("button",{type:"button",className:`flat-map-building-chip flat-map-building-chip--${i.status}`,onClick:y=>{if(A){const j=y.currentTarget.getBoundingClientRect();A(i.id,{x:j.right,y:j.top+j.height/2})}else we(i.id)},onContextMenu:y=>{y.preventDefault(),y.stopPropagation(),g({buildingId:i.id,position:{x:y.clientX,y:y.clientY}})},title:`${i.name} · ${i.type} · ${i.status}`,children:[e.jsx(u,{name:fn(i.type),size:12}),e.jsx("span",{className:"flat-map-building-chip__name",children:i.name}),e.jsx("span",{className:"flat-map-building-chip__dot",style:{backgroundColor:hn(i.status)}})]},i.id))})]},p)})})()})]})})]}),G&&e.jsx("div",{className:"flat-splitter flat-splitter--inspector",role:"separator","aria-orientation":"vertical","aria-label":"Resize inspector panel",title:"Drag to resize · Double-click to reset",onPointerDown:Ue,onPointerMove:ce,onPointerUp:xe,onPointerCancel:xe,onDoubleClick:pt}),L&&e.jsxs("aside",{className:`flat-inspector ${et?"flat-inspector--open":"flat-inspector--closing"}`,"aria-label":"Inspector panel",children:[e.jsxs("div",{className:"flat-inspector__header",children:[e.jsxs("div",{className:"flat-inspector__tabs",role:"tablist","aria-label":"Inspector view",children:[e.jsx("button",{type:"button",role:"tab","aria-selected":be==="agent",className:`flat-inspector__tab ${be==="agent"?"flat-inspector__tab--active":""}`,onClick:()=>qe("agent"),children:"Agent"}),e.jsx("button",{type:"button",role:"tab","aria-selected":be==="tracking",className:`flat-inspector__tab ${be==="tracking"?"flat-inspector__tab--active":""}`,onClick:()=>qe("tracking"),children:"Tracking"})]}),e.jsx("button",{type:"button",className:"flat-inspector__close",onClick:De,title:"Close inspector","aria-label":"Close inspector",children:"✕"})]}),e.jsx("div",{className:"flat-inspector__body",children:be==="tracking"?e.jsx(gn,{activeAgentId:x??"",onSelectAgent:t=>{_(t),De()}}):(()=>{if(!x)return e.jsx("div",{className:"flat-inspector__empty",children:e.jsx("span",{children:"Select an agent to inspect"})});const t=M.find(n=>n.id===x);return t?e.jsx(xn,{agent:t,onFocusAgent:n=>{_(n),De()},onKillAgent:n=>h.killAgent(n)}):e.jsx("div",{className:"flat-inspector__empty",children:e.jsx("span",{children:"Agent not found"})})})()})]}),Y&&e.jsx(bn,{url:Y.url,name:Y.name,onClose:()=>Pe(null)}),We&&e.jsx(_n,{state:We,onClose:()=>He(null)}),Le&&e.jsx(wn,{action:"clear-subordinates",selectedAgentId:Le.agentId,subordinateCount:Le.count,onClose:()=>le(null),onClearHistory:()=>{}}),e.jsx(Cn,{agent:x?M.find(t=>t.id===x)??null:null,isOpen:Ie&&!!x,onClose:Ve}),e.jsx(Lt,{isOpen:D!==null,position:(D==null?void 0:D.position)??{x:0,y:0},worldPosition:{x:0,z:0},actions:Kt,onClose:()=>ye(null)}),e.jsx(Lt,{isOpen:Z!==null,position:(Z==null?void 0:Z.position)??{x:0,y:0},worldPosition:{x:0,z:0},actions:Yt,onClose:()=>g(null)}),e.jsx(vn,{isOpen:P!==null,title:se("common:confirm.removeAgentTitle"),message:se("common:confirm.removeAgentMessage",{name:(P==null?void 0:P.name)??""}),confirmLabel:se("common:buttons.remove"),cancelLabel:se("common:buttons.cancel"),variant:"danger",onConfirm:()=>{P&&h.removeAgentFromServer(P.agentId)},onClose:()=>me(null)})]})}export{Zn as FlatView};
@@ -1,4 +1,4 @@
1
- import{bm as Oe,r as t,s as I,l as ye,bn as Ee,aH as _e,j as e,I as z,u as fe,bo as ze,bp as Te,bq as Be,br as Ue,m as Ke,bs as We,bt as De,bu as Ve,a4 as Ge,a5 as qe,bv as Ye,aQ as Je,G as Me,S as oe,aK as Qe,aG as Xe,Y as Ze,H as Ie,af as et,O as tt,bw as st,n as Q,bx as nt}from"./main-DFVcOIIz.js";import{F as at}from"./index-5oP0HT38.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";const Ne={status:"all",activity:"all",sort:"activity"},lt={"1h":3600*1e3,"6h":360*60*1e3,"24h":1440*60*1e3},Ae=20,me=3,ot={idle:"#4aff9e",working:"#4a9eff",waiting:"#ff9e4a",waiting_permission:"#ffcc00",error:"#ff4a4a",offline:"#888888",orphaned:"#ff9e4a"},ct=12e4;function rt(s){return s.trim().replace(/\r\n/g,`
1
+ import{bm as Oe,r as t,s as I,l as ye,bn as Ee,aH as _e,j as e,I as z,u as fe,bo as ze,bp as Te,bq as Be,br as Ue,m as Ke,bs as We,bt as De,bu as Ve,a4 as Ge,a5 as qe,bv as Ye,aQ as Je,G as Me,S as oe,aK as Qe,aG as Xe,Y as Ze,H as Ie,af as et,O as tt,bw as st,n as Q,bx as nt}from"./main-DrsDQIKU.js";import{F as at}from"./index-Czc4WA-r.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";const Ne={status:"all",activity:"all",sort:"activity"},lt={"1h":3600*1e3,"6h":360*60*1e3,"24h":1440*60*1e3},Ae=20,me=3,ot={idle:"#4aff9e",working:"#4a9eff",waiting:"#ff9e4a",waiting_permission:"#ffcc00",error:"#ff4a4a",offline:"#888888",orphaned:"#ff9e4a"},ct=12e4;function rt(s){return s.trim().replace(/\r\n/g,`
2
2
  `)}function $e(s,a){return`${s}:${rt(a)}`}function it(s,a,l,f){if(s.uuid&&a.has(s.uuid))return!1;if(s.uuid)return!0;const p=s.isUserPrompt?"user":"assistant",d=$e(p,s.text),M=s.timestamp||0,A=l.get(d);return A!==void 0&&Math.abs(M-A)<=ct?!1:M>f}function dt({isOpen:s,agents:a}){const l=Oe(),[f,p]=t.useState(new Map),d=t.useRef(new Set);t.useRef(a);const M=t.useMemo(()=>Array.from(a.keys()).sort().join(","),[a]),A=t.useMemo(()=>Array.from(a.values()).map(j=>`${j.id}:${j.sessionId||""}`).sort().join(","),[a]);t.useEffect(()=>{s||(d.current.clear(),p(new Map))},[s]),t.useEffect(()=>{if(!s)return;const j=new Set(Array.from(a.keys()));for(const i of d.current)j.has(i)||d.current.delete(i);let h=null;l>0&&(h=I.preserveOutputs(),d.current.clear());const v=async(i,C,F=0)=>{if(d.current.add(i.id),F>0&&await new Promise(x=>setTimeout(x,F)),p(x=>{const k=new Map(x);return k.set(i.id,{agentId:i.id,messages:[],loading:!0,hasMore:!1,totalCount:0}),k}),!i.sessionId){C&&C.length>0&&I.mergeOutputsWithHistory(i.id,[],C),p(x=>{const k=new Map(x);return k.set(i.id,{agentId:i.id,messages:[],loading:!1,hasMore:!1,totalCount:0}),k});return}try{const k=await(await _e(ye(`/api/agents/${i.id}/history?limit=${Ee}&offset=0`))).json(),P=k.messages||[],W=P.length>0?Math.max(...P.map(w=>w.timestamp?new Date(w.timestamp).getTime():0)):0,Y=new Set(P.map(w=>w.uuid).filter(w=>!!w)),V=new Map;for(const w of P){if(w.type!=="user"&&w.type!=="assistant")continue;const c=$e(w.type,w.content),L=w.timestamp?new Date(w.timestamp).getTime():0,K=V.get(c)??0;L>K&&V.set(c,L)}const G=I.getOutputs(i.id),U=(C&&C.length>0?[...C,...G]:G).filter(w=>it(w,Y,V,W));I.clearOutputs(i.id);for(const w of U)I.addOutput(i.id,w);p(w=>{const c=new Map(w);return c.set(i.id,{agentId:i.id,messages:P,loading:!1,hasMore:k.hasMore||!1,totalCount:k.totalCount||0}),c})}catch(x){if(console.error(`Failed to load history for ${i.name}:`,x),C&&C.length>0){I.clearOutputs(i.id);for(const k of C)I.addOutput(i.id,k)}p(k=>{const P=new Map(k);return P.set(i.id,{agentId:i.id,messages:[],loading:!1,hasMore:!1,totalCount:0}),P})}},u=l>0?500:0,D=Array.from(a.values());for(const i of D)if(!d.current.has(i.id)){const C=h==null?void 0:h.get(i.id);v(i,C,u)}},[s,M,A,l]);const R=t.useRef(a),N=t.useRef(f);R.current=a,N.current=f;const b=t.useCallback(async j=>{const h=R.current.get(j),v=N.current.get(j);if(!(h!=null&&h.sessionId)||!v||!v.hasMore)return;const u=v.messages.length;try{const i=await(await fetch(ye(`/api/agents/${j}/history?limit=${Ee}&offset=${u}`))).json();i.messages&&i.messages.length>0&&p(C=>{const F=new Map(C),x=C.get(j);return x&&F.set(j,{...x,messages:[...i.messages,...x.messages],hasMore:i.hasMore||!1}),F})}catch(D){console.error(`Failed to load more history for agent ${j}:`,D)}},[]),E=t.useCallback(j=>{d.current.delete(j),p(h=>{const v=new Map(h),u=h.get(j);return u&&v.set(j,{...u,messages:[],hasMore:!1,totalCount:0,loading:!1}),v})},[]);return{histories:f,loadMoreHistory:b,clearAgentHistory:E}}function ut({command:s,onCommandChange:a,useTextarea:l,forceTextarea:f,onForceTextarea:p,onSend:d,canSend:M,attachedFiles:A,onAddFile:R,onRemoveFile:N,uploadFile:b,onAddPastedText:E,placeholder:j="Message...",className:h="",compact:v=!1,inputRef:u}){const D=t.useRef(null),i=t.useRef(null),C=t.useRef(l);t.useEffect(()=>{if(l&&!C.current&&i.current){const c=i.current;c.focus(),c.selectionStart=c.selectionEnd=c.value.length}C.current=l},[l]),t.useEffect(()=>{const c=i.current;if(!c||!l)return;c.style.height="auto";const L=v?120:180,K=Math.min(c.scrollHeight,L);c.style.height=`${K}px`},[s,l,v]);const F=t.useCallback(async c=>{const L=c.clipboardData.items;for(const _ of L)if(_.type.startsWith("image/")){c.preventDefault();const $=_.getAsFile();if($){const H=await b($);H&&R(H)}return}const K=c.clipboardData.files;if(K.length>0){c.preventDefault();for(const _ of K){const $=await b(_);$&&R($)}return}const B=c.clipboardData.getData("text"),te=(B.match(/\n/g)||[]).length+1;if(te>5){c.preventDefault();const $=`[Pasted text #${E(B)} +${te} lines]`,H=c.target,se=H.selectionStart||0,ae=H.selectionEnd||0,ne=s.slice(0,se)+$+s.slice(ae);a(ne),l||p(!0)}},[s,a,l,p,b,R,E]),x=t.useCallback(async c=>{const L=c.target.files;if(L){for(const K of L){const B=await b(K);B&&R(B)}D.current&&(D.current.value="")}},[b,R]),k=t.useCallback(c=>{if(c.key==="Enter"&&c.shiftKey){l||(c.preventDefault(),p(!0));return}c.key==="Enter"&&(c.preventDefault(),d())},[l,p,d]),P=t.useCallback(c=>{},[]),W=t.useCallback(c=>{c.button===1&&(c.preventDefault(),c.stopPropagation())},[]),Y=t.useCallback(c=>{i.current=c,u==null||u(c)},[u]),V=v?"agent-panel-input":"guake-input",G=v?"agent-panel-input-container":"guake-input-container",X=v?"agent-panel-attach-btn":"guake-attach-btn",U=v?"agent-panel-send-btn":"",w=l?v?"agent-panel-input-expanded":"guake-input-expanded":"";return e.jsxs(e.Fragment,{children:[A.length>0&&e.jsx("div",{className:v?"agent-panel-attachments":"guake-attachments",children:A.map(c=>e.jsxs("div",{className:`${v?"agent-panel-attachment":"guake-attachment"} ${c.isImage?"is-image":""}`,children:[e.jsx("span",{className:v?"agent-panel-attachment-icon":"guake-attachment-icon",children:e.jsx(z,{name:c.isImage?"file":"paperclip",size:12})}),e.jsx("span",{className:v?"agent-panel-attachment-name":"guake-attachment-name",title:c.path,children:c.name}),!v&&e.jsxs("span",{className:"guake-attachment-size",children:["(",Math.round(c.size/1024),"KB)"]}),e.jsx("button",{className:v?"agent-panel-attachment-remove":"guake-attachment-remove",onClick:()=>N(c.id),title:"Remove",children:"×"})]},c.id))}),e.jsxs("div",{className:`${V} ${w} ${h}`,children:[e.jsx("input",{ref:D,type:"file",multiple:!0,onChange:x,style:{display:"none"},accept:"*"}),e.jsxs("div",{className:G,onAuxClick:W,children:[e.jsx("button",{className:X,onClick:()=>{var c;return(c=D.current)==null?void 0:c.click()},title:"Attach file (or paste image)",children:e.jsx(z,{name:"paperclip",size:14})}),l?e.jsx("textarea",{ref:Y,placeholder:j,value:s,onChange:c=>a(c.target.value),onKeyDown:k,onPaste:F,onMouseDown:P}):e.jsx("input",{ref:u,type:"text",placeholder:j,value:s,onChange:c=>a(c.target.value),onKeyDown:k,onPaste:F,onMouseDown:P}),e.jsx("button",{className:U,onClick:d,disabled:!M,title:"Send",children:e.jsx(z,{name:"send",size:14})})]})]})]})}function mt(s){const a=Math.floor(s/1e3),l=Math.floor(a/60),f=a%60;return`${l}:${f.toString().padStart(2,"0")}`}const ft=t.memo(function({agentId:a,isWorking:l,timestamp:f}){const{t:p}=fe(["terminal"]),[d,M]=t.useState(0);return t.useEffect(()=>{if(!l||!f){M(0);return}M(Date.now()-f);const A=setInterval(()=>{M(Date.now()-f)},1e3);return()=>clearInterval(A)},[l,f]),l?e.jsxs("div",{className:"guake-stop-bar",children:[e.jsx("span",{className:"guake-elapsed-timer",children:mt(d)}),e.jsxs("button",{className:"guake-stop-btn",onClick:()=>I.stopAgent(a),title:p("terminal:input.stopOperation"),children:[e.jsx("span",{className:"stop-icon",children:e.jsx(z,{name:"stop",size:12,weight:"fill"})}),e.jsx("span",{className:"stop-label",children:p("terminal:input.stop")})]})]}):null});function pt({agent:s,history:a,outputs:l,isExpanded:f,isFocused:p,advancedView:d,onExpand:M,onFocus:A,inputRef:R,onLoadMore:N,onClearHistory:b}){const{t:E}=fe(["terminal","common"]),j=ze(s.id),h=t.useRef(null),[v,u]=t.useState(!1),D=t.useRef(0),i=t.useRef(!1),[C,F]=t.useState(!0),[x,k]=t.useState(!1),[P,W]=t.useState(null),[Y,V]=t.useState(null),[G,X]=t.useState(null);Te(`commander-image-modal-${s.id}`,P!==null,()=>W(null));const{command:U,setCommand:w,forceTextarea:c,setForceTextarea:L,useTextarea:K,setPastedTexts:B,incrementPastedCount:te,resetPastedCount:_,attachedFiles:$,setAttachedFiles:H,removeAttachedFile:se,uploadFile:ae,expandPastedTexts:ne}=Be({selectedAgentId:s.id}),le=U.trim().length>0||$.length>0,n=Ue({outputs:l,viewMode:d?"advanced":"simple"}),o=t.useMemo(()=>{const S=Ke(s);return{usedPercent:S.usedPercent,freePercent:S.freePercent,hasData:!!s.contextStats,totalTokens:S.totalTokens,contextWindow:S.contextWindow}},[s.contextStats,s.contextUsed,s.contextLimit]),g=t.useCallback(()=>{!v&&(a!=null&&a.hasMore)&&N&&(u(!0),D.current=h.current?h.current.scrollHeight-h.current.scrollTop:0,N())},[v,a==null?void 0:a.hasMore,N]);t.useEffect(()=>{v&&a&&!a.loading&&u(!1)},[a,v]);const m=t.useCallback(()=>{i.current=!0,F(!1)},[]),T=t.useRef(f),Z=t.useRef(p);t.useEffect(()=>{(f&&!T.current||p&&!Z.current)&&(i.current=!1,F(!0),k(!0)),T.current=f,Z.current=p},[f,p]);const ee=t.useRef(a==null?void 0:a.loading);t.useEffect(()=>{ee.current&&!(a!=null&&a.loading)&&(i.current=!1,F(!0),k(!0)),ee.current=a==null?void 0:a.loading},[a==null?void 0:a.loading]),t.useEffect(()=>{if(!x)return;const S=h.current;if(!S)return;const y=performance.now();let O=0,ue=-1,ke;const Re=()=>{const{scrollTop:Fe,scrollHeight:Se,clientHeight:Le}=S,He=Se-Fe-Le<=2;if(Math.abs(Se-ue)<=1&&He?O+=1:O=0,ue=Se,O>=3){k(!1);return}if(performance.now()-y>5e3){k(!1);return}ke=requestAnimationFrame(Re)};return ke=requestAnimationFrame(Re),()=>cancelAnimationFrame(ke)},[x]),t.useEffect(()=>{i.current||F(!0)},[n.length]);const q=t.useCallback(()=>!1,[]),ie=t.useCallback(S=>{const y=te();return B(O=>new Map(O).set(y,S)),y},[te,B]),he=t.useCallback(S=>{H(y=>[...y,S])},[H]),xe=t.useCallback(()=>{if(!le)return;if(U.trim()==="/clear"&&$.length===0){I.clearContext(s.id),b(),w(""),L(!1),B(new Map),H([]),_();return}let S=ne(U.trim());if($.length>0){const y=$.map(O=>O.isImage?`[Image: ${O.path}]`:`[File: ${O.path}]`).join(`
3
3
  `);S=S?`${S}
4
4
 
@@ -1 +1 @@
1
- import{a9 as as,u as ts,ap as vs,aq as bs,ar as zs,j as s,I as F,Y as Is,as as Es,at as $s,au as Ds,av as Ms,r as c,a0 as Ls,af as Ps,P as Ss,O as Xs,E as Ys,aw as Rs,ax as Gs,ay as Us,az as ms,aA as _s,s as M,aB as Fs,n as U}from"./main-DFVcOIIz.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";const fs=as.memo(({agent:a,isSelected:A,isKeyboardFocused:L=!1,onSelect:P,onDoubleClick:n,onChat:g,onFocus:h,onKill:w,onDragStart:S})=>{const{t:x}=ts(["dashboard","common"]),X=vs().has(a.id),N=bs(a.status),B=zs(a),j=Ms(B),I=a.taskLabel?s.jsxs(s.Fragment,{children:[s.jsx(F,{name:"task",size:12})," ",a.taskLabel]}):a.currentTask||a.lastAssignedTask,m=a.status==="idle"&&a.lastActivity>0,[,H]=as.useState(0);return as.useEffect(()=>{if(!m)return;const b=window.setInterval(()=>H(T=>T+1),15e3);return()=>window.clearInterval(b)},[m]),s.jsxs("div",{className:`dash-card dash-card--${N} ${A?"dash-card--selected":""} ${L?"dash-card--keyboard-focused":""}`,"data-agent-id":a.id,onClick:P,onDoubleClick:b=>{b.stopPropagation(),n()},onDragStart:b=>{S==null||S(a),b.dataTransfer.effectAllowed="move"},draggable:!0,title:x("cards.doubleClickHint"),children:[s.jsxs("div",{className:"dash-card__row1",children:[s.jsx("span",{className:`dash-card__status-dot dash-card__status-dot--${N}`}),s.jsx("span",{className:"dash-card__name",children:a.name}),s.jsxs("span",{className:"dash-card__class",children:[s.jsx(Is,{agent:a,size:14})," ",a.class]}),s.jsxs("span",{className:`dash-card__provider dash-card__provider--${a.provider}`,children:[s.jsx(F,{name:a.provider==="codex"||a.provider==="opencode"?"status-pending":"robot",size:11,weight:a.provider==="codex"||a.provider==="opencode"?"fill":"regular",color:a.provider==="codex"?"#a16207":a.provider==="opencode"?"#4ade80":void 0})," ",a.provider]}),X&&s.jsx("span",{className:"dash-card__unseen-badge",title:"New output available - click to view",children:"!"})]}),s.jsxs("div",{className:"dash-card__row2",children:[s.jsx("span",{className:`dash-card__status dash-card__status--${N}`,children:X?"Unseen":a.status}),s.jsxs("div",{className:"dash-card__context",children:[s.jsx("div",{className:"dash-card__context-bar",children:s.jsx("div",{className:`dash-card__context-fill dash-card__context-fill--${j}`,style:{width:`${B}%`}})}),s.jsxs("span",{className:`dash-card__context-pct dash-card__context-pct--${j}`,children:[B,"%"]})]})]}),s.jsxs("div",{className:"dash-card__row3",children:[s.jsxs("span",{className:"dash-card__workdir",title:a.cwd,children:[s.jsx(F,{name:"folder",size:11})," ",a.cwd.split("/").pop()||a.cwd]}),m&&s.jsxs("span",{className:"dash-card__idle-time",style:{color:Ds(a.lastActivity)},title:$s(a.lastActivity),children:[s.jsx(F,{name:"status-waiting-input",size:10})," ",Es(a.lastActivity)]})]}),I&&s.jsx("div",{className:"dash-card__row4",children:s.jsx("span",{className:"dash-card__task",children:I})}),s.jsxs("div",{className:"dash-card__actions",children:[g&&s.jsx("button",{className:"dash-card__action-btn dash-card__action-btn--chat",onClick:b=>{b.stopPropagation(),g()},title:x("cards.openTerminal"),children:x("cards.chat")}),w&&s.jsx("button",{className:"dash-card__action-btn dash-card__action-btn--danger",onClick:b=>{b.stopPropagation(),w()},title:x("cards.killAgent"),children:x("cards.stop")})]})]})});fs.displayName="AgentCard";const ws=({buildings:a,onSelectBuilding:A})=>{const{t:L}=ts(["dashboard"]),P=c.useMemo(()=>Array.from(a.values()).sort((n,g)=>n.name.localeCompare(g.name)),[a]);return s.jsxs("div",{className:"dashboard-view__buildings",children:[s.jsxs("div",{className:"dashboard-view__buildings-header",children:[s.jsx("span",{className:"dashboard-view__buildings-title",children:L("buildings.title")}),s.jsx("span",{className:"dashboard-view__buildings-count",children:P.length})]}),s.jsx("div",{className:"dashboard-view__buildings-row",children:P.map(n=>{const g=bs(n.status),h=Ls(n.type);return s.jsxs("button",{className:`dash-pill dash-pill--${g}`,onClick:()=>A==null?void 0:A(n.id),title:`${n.name} (${n.type}) - ${n.status}`,children:[s.jsx("span",{className:"dash-pill__icon",children:s.jsx(F,{name:h,size:14})}),s.jsx("span",{className:"dash-pill__name",children:n.name}),s.jsx("span",{className:`dash-pill__dot dash-pill__dot--${g}`})]},n.id)})})]})};ws.displayName="BuildingPills";function Ws({onSelectAgent:a,onFocusAgent:A,onKillAgent:L,onSelectBuilding:P,onOpenTerminal:n,onFocusZone:g}){const{t:h}=ts(["dashboard","common"]),w=Ps(),S=Ss(),x=Xs(),rs=Ys(),X=vs(),[N,B]=c.useState(""),[j,I]=c.useState("all"),[m,H]=c.useState("zone"),[b,T]=c.useState(new Set),[k,J]=c.useState(null),[ps,W]=c.useState(null),[Y,Q]=c.useState(!1),[p,Z]=c.useState(null),K=c.useMemo(()=>{const e=Array.from(w.values());return{total:e.length,working:e.filter(i=>i.status==="working"||i.status==="waiting"||i.status==="waiting_permission").length,idle:e.filter(i=>i.status==="idle").length,error:e.filter(i=>i.status==="error"||i.status==="offline"||i.status==="orphaned").length}},[w]),ns=c.useMemo(()=>m==="zone"?Rs(w,x):m==="status"?Gs(w,X):Us(w),[w,x,m,X]),V=c.useMemo(()=>{const e=N.toLowerCase().trim(),i=ns.map(l=>({...l,agents:l.agents.filter(_=>{if(j==="working"){if(_.status!=="working"&&_.status!=="waiting"&&_.status!=="waiting_permission")return!1}else if(j==="error"&&_.status!=="error"&&_.status!=="offline"&&_.status!=="orphaned")return!1;return!(e&&!_.name.toLowerCase().includes(e)&&!_.class.toLowerCase().includes(e))})}));return m==="zone"?i:i.filter(l=>l.agents.length>0)},[ns,j,N,m]),O=c.useCallback(e=>e.area?`area:${e.area.id}`:`${m}:${e.label}`,[m]),y=c.useMemo(()=>{const e=[];return V.forEach(i=>{const l=O(i);if(b.has(l))return;const _=m==="status"?ms(i.agents,{prioritizeRecentlyIdle:!0}):_s(i.agents);e.push(..._)}),e},[V,b,m,O]),gs=c.useCallback(e=>{T(i=>{const l=new Set(i);return l.has(e)?l.delete(e):l.add(e),l})},[]),xs=c.useCallback(e=>{n==null||n(e)},[n]),js=c.useCallback(e=>{J(e)},[]),Ns=c.useCallback((e,i)=>{e.preventDefault(),e.dataTransfer.dropEffect="move",W(i)},[]),ks=c.useCallback(()=>{W(null)},[]),ys=c.useCallback(e=>{if(!k)return;if(e===null){const E=M.getState(),t=Array.from(E.areas.values()).find(r=>r.assignedAgentIds.includes(k.id));t&&M.unassignAgentFromArea(k.id,t.id),J(null),W(null);return}const i=x.get(e);if(!i)return;const l=Array.from(w.values()),_=Fs(i,l,k.position);M.updateAgent({...k,position:{...k.position,x:_.x,z:_.z}}),M.assignAgentToArea(k.id,e),J(null),W(null)},[k,x,w]);return c.useEffect(()=>{if(y.length===0){Q(!1),Z(null);return}Y&&(!p||!y.some(e=>e.id===p))&&(Z(y[0].id),a==null||a(y[0].id))},[y,Y,p,a]),c.useEffect(()=>{const e=t=>t instanceof HTMLElement?t.tagName==="INPUT"||t.tagName==="TEXTAREA"||t.tagName==="SELECT"||t.isContentEditable:!1,i=t=>t instanceof HTMLElement?!!t.closest(".guake-terminal")||t.classList.contains("guake-input")||t.classList.contains("agent-panel-input"):!1,l=t=>{const r=Array.from(document.querySelectorAll(".dash-card[data-agent-id]")).find(z=>z.dataset.agentId===t);r==null||r.scrollIntoView({block:"nearest",inline:"nearest"})},_=(t,r)=>{var ds,os,cs,ls,us,hs;const z=Array.from(document.querySelectorAll(".dash-card[data-agent-id]")).map(d=>{const u=d.dataset.agentId;if(!u)return null;const C=d.getBoundingClientRect();return{id:u,centerX:C.left+C.width/2,centerY:C.top+C.height/2,height:C.height}}).filter(d=>d!==null).sort((d,u)=>d.centerY-u.centerY||d.centerX-u.centerX);if(z.length===0)return t;const ss=z.reduce((d,u)=>d+u.height,0)/z.length,es=Math.max(18,ss*.6),f=[];for(const d of z){const u=f[f.length-1];if(!u){f.push([{id:d.id,centerX:d.centerX,centerY:d.centerY}]);continue}const C=u.reduce((Cs,As)=>Cs+As.centerY,0)/u.length;Math.abs(d.centerY-C)<=es?u.push({id:d.id,centerX:d.centerX,centerY:d.centerY}):f.push([{id:d.id,centerX:d.centerX,centerY:d.centerY}])}f.forEach(d=>d.sort((u,C)=>u.centerX-C.centerX));const R=f.findIndex(d=>d.some(u=>u.id===t));if(R===-1)return((os=(ds=f[0])==null?void 0:ds[0])==null?void 0:os.id)??t;const $=f[R],v=$.findIndex(d=>d.id===t);if(v===-1)return((ls=(cs=f[0])==null?void 0:cs[0])==null?void 0:ls.id)??t;if(r==="left")return((us=$[Math.max(0,v-1)])==null?void 0:us.id)??t;if(r==="right")return((hs=$[Math.min($.length-1,v+1)])==null?void 0:hs.id)??t;const q=r==="up"?Math.max(0,R-1):Math.min(f.length-1,R+1),o=f[q],G=$[v].centerX;let D=o[0],is=Math.abs(D.centerX-G);for(const d of o){const u=Math.abs(d.centerX-G);u<is&&(D=d,is=u)}return(D==null?void 0:D.id)??t},E=t=>{const r=M.getShortcuts(),z=r.find(o=>o.id==="dashboard-selector-toggle"),ss=r.find(o=>o.id==="dashboard-vim-left"),es=r.find(o=>o.id==="dashboard-vim-down"),f=r.find(o=>o.id==="dashboard-vim-up"),R=r.find(o=>o.id==="dashboard-vim-right"),$=r.find(o=>o.id==="open-terminal"),v=M.getState();if(e(t.target))if(!v.terminalOpen&&i(t.target)&&document.activeElement instanceof HTMLElement)document.activeElement.blur();else return;if(U(t,z)){if(y.length===0)return;t.preventDefault(),t.stopPropagation(),Q(!0),Z(o=>{const G=o&&y.some(D=>D.id===o)?o:y[0].id;return a==null||a(G),window.setTimeout(()=>l(G),0),G});return}const q=U(t,ss)||t.key==="ArrowLeft"?"left":U(t,es)||t.key==="ArrowDown"?"down":U(t,f)||t.key==="ArrowUp"?"up":U(t,R)||t.key==="ArrowRight"?"right":null;if(q&&Y&&p){t.preventDefault(),t.stopPropagation();const o=_(p,q);o!==p&&(Z(o),a==null||a(o),window.setTimeout(()=>l(o),0));return}if(U(t,$)){if(v.terminalOpen)return;if(Y&&p&&v.agents.has(p)){t.preventDefault(),n==null||n(p);return}if(v.selectedAgentIds.size===1){t.preventDefault();const o=Array.from(v.selectedAgentIds)[0];n==null||n(o);return}if(v.lastSelectedAgentId&&v.agents.has(v.lastSelectedAgentId)){t.preventDefault(),n==null||n(v.lastSelectedAgentId);return}}};return document.addEventListener("keydown",E,!0),()=>document.removeEventListener("keydown",E,!0)},[y,Y,p,n,a]),c.useEffect(()=>{const e=document.activeElement;e instanceof HTMLElement&&e.closest(".guake-terminal")&&!M.getState().terminalOpen&&e.blur()},[]),s.jsxs("div",{className:"dashboard-view",children:[s.jsxs("div",{className:"dashboard-view__topbar",children:[s.jsxs("div",{className:"dashboard-view__metrics",children:[s.jsxs("button",{className:`dashboard-view__metric-btn ${j==="all"?"dashboard-view__metric-btn--active":""}`,onClick:()=>I("all"),children:[s.jsx("span",{className:"dashboard-view__metric-value",children:K.total}),s.jsx("span",{className:"dashboard-view__metric-label",children:h("common:labels.agents")})]}),s.jsxs("button",{className:`dashboard-view__metric-btn dashboard-view__metric-btn--working ${j==="working"?"dashboard-view__metric-btn--active":""}`,onClick:()=>I("working"),children:[s.jsx("span",{className:"dashboard-view__metric-value",children:K.working}),s.jsx("span",{className:"dashboard-view__metric-label",children:h("common:status.working")})]}),s.jsxs("button",{className:"dashboard-view__metric-btn dashboard-view__metric-btn--idle ",onClick:()=>I("all"),children:[s.jsx("span",{className:"dashboard-view__metric-value",children:K.idle}),s.jsx("span",{className:"dashboard-view__metric-label",children:h("common:status.idle")})]}),s.jsxs("button",{className:`dashboard-view__metric-btn dashboard-view__metric-btn--error ${j==="error"?"dashboard-view__metric-btn--active":""}`,onClick:()=>I("error"),children:[s.jsx("span",{className:"dashboard-view__metric-value",children:K.error}),s.jsx("span",{className:"dashboard-view__metric-label",children:h("common:status.error")})]})]}),s.jsx("input",{className:"dashboard-view__search",type:"text",placeholder:h("searchPlaceholder"),value:N,onChange:e=>B(e.target.value)})]}),s.jsxs("div",{className:"dashboard-view__grouping",children:[s.jsx("button",{className:`dashboard-view__grouping-btn ${m==="zone"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>H("zone"),children:h("grouping.byZone")}),s.jsx("button",{className:`dashboard-view__grouping-btn ${m==="status"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>H("status"),children:h("grouping.byStatus")}),s.jsx("button",{className:`dashboard-view__grouping-btn ${m==="activity"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>H("activity"),children:h("grouping.byActivity")})]}),s.jsxs("div",{className:"dashboard-view__content",children:[V.map(e=>{const i=O(e),l=b.has(i),_=m==="status"?ms(e.agents,{prioritizeRecentlyIdle:!0}):_s(e.agents),E=e.agents.filter(r=>r.status==="working"||r.status==="waiting"||r.status==="waiting_permission").length,t=e.agents.filter(r=>X.has(r.id)).length;return s.jsxs("div",{className:`dashboard-view__zone ${ps===(e.area?e.area.id:null)&&k?"dashboard-view__zone--drag-over":""}`,onDragOver:r=>Ns(r,e.area?e.area.id:null),onDragLeave:ks,onDrop:()=>ys(e.area?e.area.id:null),children:[s.jsxs("div",{className:"dashboard-view__zone-header",onClick:()=>gs(i),children:[s.jsxs("div",{className:"dashboard-view__zone-left",children:[s.jsx("span",{className:`dashboard-view__zone-chevron ${l?"dashboard-view__zone-chevron--collapsed":""}`,children:s.jsx(F,{name:"caret-down",size:12})}),s.jsx("span",{className:"dashboard-view__zone-dot",style:{backgroundColor:e.color}}),s.jsx("span",{className:"dashboard-view__zone-name",children:e.label}),s.jsxs("span",{className:"dashboard-view__zone-count",children:[h("agentCount",{count:e.agents.length}),E>0&&s.jsxs("span",{className:"dashboard-view__zone-working",children:[" · ",E," ",h("working")]}),t>0&&s.jsxs("span",{className:"dashboard-view__zone-unseen",children:[" · ",t," Unseen"]})]})]}),e.area&&g&&s.jsx("button",{className:"dashboard-view__zone-focus",onClick:r=>{r.stopPropagation(),g(e.area.id)},title:h("focusZone"),children:h("focusZone")})]}),!l&&s.jsx("div",{className:"dashboard-view__zone-grid",children:_.map(r=>s.jsx(fs,{agent:r,isSelected:rs.has(r.id),isKeyboardFocused:Y&&p===r.id,onSelect:()=>{a==null||a(r.id),Q(!0),Z(r.id)},onDoubleClick:()=>xs(r.id),onChat:()=>n==null?void 0:n(r.id),onFocus:A?()=>A(r.id):void 0,onKill:L?()=>L(r.id):void 0,onDragStart:js},r.id))})]},i)}),V.length===0&&s.jsx("div",{className:"dashboard-view__empty",children:N?h("noAgentsMatching",{search:N}):h("noAgentsSpawned")}),S.size>0&&s.jsx(ws,{buildings:S,onSelectBuilding:P})]})]})}export{Ws as DashboardView};
1
+ import{a9 as as,u as ts,ap as vs,aq as bs,ar as zs,j as s,I as F,Y as Is,as as Es,at as $s,au as Ds,av as Ms,r as c,a0 as Ls,af as Ps,P as Ss,O as Xs,E as Ys,aw as Rs,ax as Gs,ay as Us,az as ms,aA as _s,s as M,aB as Fs,n as U}from"./main-DrsDQIKU.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";const fs=as.memo(({agent:a,isSelected:A,isKeyboardFocused:L=!1,onSelect:P,onDoubleClick:n,onChat:g,onFocus:h,onKill:w,onDragStart:S})=>{const{t:x}=ts(["dashboard","common"]),X=vs().has(a.id),N=bs(a.status),B=zs(a),j=Ms(B),I=a.taskLabel?s.jsxs(s.Fragment,{children:[s.jsx(F,{name:"task",size:12})," ",a.taskLabel]}):a.currentTask||a.lastAssignedTask,m=a.status==="idle"&&a.lastActivity>0,[,H]=as.useState(0);return as.useEffect(()=>{if(!m)return;const b=window.setInterval(()=>H(T=>T+1),15e3);return()=>window.clearInterval(b)},[m]),s.jsxs("div",{className:`dash-card dash-card--${N} ${A?"dash-card--selected":""} ${L?"dash-card--keyboard-focused":""}`,"data-agent-id":a.id,onClick:P,onDoubleClick:b=>{b.stopPropagation(),n()},onDragStart:b=>{S==null||S(a),b.dataTransfer.effectAllowed="move"},draggable:!0,title:x("cards.doubleClickHint"),children:[s.jsxs("div",{className:"dash-card__row1",children:[s.jsx("span",{className:`dash-card__status-dot dash-card__status-dot--${N}`}),s.jsx("span",{className:"dash-card__name",children:a.name}),s.jsxs("span",{className:"dash-card__class",children:[s.jsx(Is,{agent:a,size:14})," ",a.class]}),s.jsxs("span",{className:`dash-card__provider dash-card__provider--${a.provider}`,children:[s.jsx(F,{name:a.provider==="codex"||a.provider==="opencode"?"status-pending":"robot",size:11,weight:a.provider==="codex"||a.provider==="opencode"?"fill":"regular",color:a.provider==="codex"?"#a16207":a.provider==="opencode"?"#4ade80":void 0})," ",a.provider]}),X&&s.jsx("span",{className:"dash-card__unseen-badge",title:"New output available - click to view",children:"!"})]}),s.jsxs("div",{className:"dash-card__row2",children:[s.jsx("span",{className:`dash-card__status dash-card__status--${N}`,children:X?"Unseen":a.status}),s.jsxs("div",{className:"dash-card__context",children:[s.jsx("div",{className:"dash-card__context-bar",children:s.jsx("div",{className:`dash-card__context-fill dash-card__context-fill--${j}`,style:{width:`${B}%`}})}),s.jsxs("span",{className:`dash-card__context-pct dash-card__context-pct--${j}`,children:[B,"%"]})]})]}),s.jsxs("div",{className:"dash-card__row3",children:[s.jsxs("span",{className:"dash-card__workdir",title:a.cwd,children:[s.jsx(F,{name:"folder",size:11})," ",a.cwd.split("/").pop()||a.cwd]}),m&&s.jsxs("span",{className:"dash-card__idle-time",style:{color:Ds(a.lastActivity)},title:$s(a.lastActivity),children:[s.jsx(F,{name:"status-waiting-input",size:10})," ",Es(a.lastActivity)]})]}),I&&s.jsx("div",{className:"dash-card__row4",children:s.jsx("span",{className:"dash-card__task",children:I})}),s.jsxs("div",{className:"dash-card__actions",children:[g&&s.jsx("button",{className:"dash-card__action-btn dash-card__action-btn--chat",onClick:b=>{b.stopPropagation(),g()},title:x("cards.openTerminal"),children:x("cards.chat")}),w&&s.jsx("button",{className:"dash-card__action-btn dash-card__action-btn--danger",onClick:b=>{b.stopPropagation(),w()},title:x("cards.killAgent"),children:x("cards.stop")})]})]})});fs.displayName="AgentCard";const ws=({buildings:a,onSelectBuilding:A})=>{const{t:L}=ts(["dashboard"]),P=c.useMemo(()=>Array.from(a.values()).sort((n,g)=>n.name.localeCompare(g.name)),[a]);return s.jsxs("div",{className:"dashboard-view__buildings",children:[s.jsxs("div",{className:"dashboard-view__buildings-header",children:[s.jsx("span",{className:"dashboard-view__buildings-title",children:L("buildings.title")}),s.jsx("span",{className:"dashboard-view__buildings-count",children:P.length})]}),s.jsx("div",{className:"dashboard-view__buildings-row",children:P.map(n=>{const g=bs(n.status),h=Ls(n.type);return s.jsxs("button",{className:`dash-pill dash-pill--${g}`,onClick:()=>A==null?void 0:A(n.id),title:`${n.name} (${n.type}) - ${n.status}`,children:[s.jsx("span",{className:"dash-pill__icon",children:s.jsx(F,{name:h,size:14})}),s.jsx("span",{className:"dash-pill__name",children:n.name}),s.jsx("span",{className:`dash-pill__dot dash-pill__dot--${g}`})]},n.id)})})]})};ws.displayName="BuildingPills";function Ws({onSelectAgent:a,onFocusAgent:A,onKillAgent:L,onSelectBuilding:P,onOpenTerminal:n,onFocusZone:g}){const{t:h}=ts(["dashboard","common"]),w=Ps(),S=Ss(),x=Xs(),rs=Ys(),X=vs(),[N,B]=c.useState(""),[j,I]=c.useState("all"),[m,H]=c.useState("zone"),[b,T]=c.useState(new Set),[k,J]=c.useState(null),[ps,W]=c.useState(null),[Y,Q]=c.useState(!1),[p,Z]=c.useState(null),K=c.useMemo(()=>{const e=Array.from(w.values());return{total:e.length,working:e.filter(i=>i.status==="working"||i.status==="waiting"||i.status==="waiting_permission").length,idle:e.filter(i=>i.status==="idle").length,error:e.filter(i=>i.status==="error"||i.status==="offline"||i.status==="orphaned").length}},[w]),ns=c.useMemo(()=>m==="zone"?Rs(w,x):m==="status"?Gs(w,X):Us(w),[w,x,m,X]),V=c.useMemo(()=>{const e=N.toLowerCase().trim(),i=ns.map(l=>({...l,agents:l.agents.filter(_=>{if(j==="working"){if(_.status!=="working"&&_.status!=="waiting"&&_.status!=="waiting_permission")return!1}else if(j==="error"&&_.status!=="error"&&_.status!=="offline"&&_.status!=="orphaned")return!1;return!(e&&!_.name.toLowerCase().includes(e)&&!_.class.toLowerCase().includes(e))})}));return m==="zone"?i:i.filter(l=>l.agents.length>0)},[ns,j,N,m]),O=c.useCallback(e=>e.area?`area:${e.area.id}`:`${m}:${e.label}`,[m]),y=c.useMemo(()=>{const e=[];return V.forEach(i=>{const l=O(i);if(b.has(l))return;const _=m==="status"?ms(i.agents,{prioritizeRecentlyIdle:!0}):_s(i.agents);e.push(..._)}),e},[V,b,m,O]),gs=c.useCallback(e=>{T(i=>{const l=new Set(i);return l.has(e)?l.delete(e):l.add(e),l})},[]),xs=c.useCallback(e=>{n==null||n(e)},[n]),js=c.useCallback(e=>{J(e)},[]),Ns=c.useCallback((e,i)=>{e.preventDefault(),e.dataTransfer.dropEffect="move",W(i)},[]),ks=c.useCallback(()=>{W(null)},[]),ys=c.useCallback(e=>{if(!k)return;if(e===null){const E=M.getState(),t=Array.from(E.areas.values()).find(r=>r.assignedAgentIds.includes(k.id));t&&M.unassignAgentFromArea(k.id,t.id),J(null),W(null);return}const i=x.get(e);if(!i)return;const l=Array.from(w.values()),_=Fs(i,l,k.position);M.updateAgent({...k,position:{...k.position,x:_.x,z:_.z}}),M.assignAgentToArea(k.id,e),J(null),W(null)},[k,x,w]);return c.useEffect(()=>{if(y.length===0){Q(!1),Z(null);return}Y&&(!p||!y.some(e=>e.id===p))&&(Z(y[0].id),a==null||a(y[0].id))},[y,Y,p,a]),c.useEffect(()=>{const e=t=>t instanceof HTMLElement?t.tagName==="INPUT"||t.tagName==="TEXTAREA"||t.tagName==="SELECT"||t.isContentEditable:!1,i=t=>t instanceof HTMLElement?!!t.closest(".guake-terminal")||t.classList.contains("guake-input")||t.classList.contains("agent-panel-input"):!1,l=t=>{const r=Array.from(document.querySelectorAll(".dash-card[data-agent-id]")).find(z=>z.dataset.agentId===t);r==null||r.scrollIntoView({block:"nearest",inline:"nearest"})},_=(t,r)=>{var ds,os,cs,ls,us,hs;const z=Array.from(document.querySelectorAll(".dash-card[data-agent-id]")).map(d=>{const u=d.dataset.agentId;if(!u)return null;const C=d.getBoundingClientRect();return{id:u,centerX:C.left+C.width/2,centerY:C.top+C.height/2,height:C.height}}).filter(d=>d!==null).sort((d,u)=>d.centerY-u.centerY||d.centerX-u.centerX);if(z.length===0)return t;const ss=z.reduce((d,u)=>d+u.height,0)/z.length,es=Math.max(18,ss*.6),f=[];for(const d of z){const u=f[f.length-1];if(!u){f.push([{id:d.id,centerX:d.centerX,centerY:d.centerY}]);continue}const C=u.reduce((Cs,As)=>Cs+As.centerY,0)/u.length;Math.abs(d.centerY-C)<=es?u.push({id:d.id,centerX:d.centerX,centerY:d.centerY}):f.push([{id:d.id,centerX:d.centerX,centerY:d.centerY}])}f.forEach(d=>d.sort((u,C)=>u.centerX-C.centerX));const R=f.findIndex(d=>d.some(u=>u.id===t));if(R===-1)return((os=(ds=f[0])==null?void 0:ds[0])==null?void 0:os.id)??t;const $=f[R],v=$.findIndex(d=>d.id===t);if(v===-1)return((ls=(cs=f[0])==null?void 0:cs[0])==null?void 0:ls.id)??t;if(r==="left")return((us=$[Math.max(0,v-1)])==null?void 0:us.id)??t;if(r==="right")return((hs=$[Math.min($.length-1,v+1)])==null?void 0:hs.id)??t;const q=r==="up"?Math.max(0,R-1):Math.min(f.length-1,R+1),o=f[q],G=$[v].centerX;let D=o[0],is=Math.abs(D.centerX-G);for(const d of o){const u=Math.abs(d.centerX-G);u<is&&(D=d,is=u)}return(D==null?void 0:D.id)??t},E=t=>{const r=M.getShortcuts(),z=r.find(o=>o.id==="dashboard-selector-toggle"),ss=r.find(o=>o.id==="dashboard-vim-left"),es=r.find(o=>o.id==="dashboard-vim-down"),f=r.find(o=>o.id==="dashboard-vim-up"),R=r.find(o=>o.id==="dashboard-vim-right"),$=r.find(o=>o.id==="open-terminal"),v=M.getState();if(e(t.target))if(!v.terminalOpen&&i(t.target)&&document.activeElement instanceof HTMLElement)document.activeElement.blur();else return;if(U(t,z)){if(y.length===0)return;t.preventDefault(),t.stopPropagation(),Q(!0),Z(o=>{const G=o&&y.some(D=>D.id===o)?o:y[0].id;return a==null||a(G),window.setTimeout(()=>l(G),0),G});return}const q=U(t,ss)||t.key==="ArrowLeft"?"left":U(t,es)||t.key==="ArrowDown"?"down":U(t,f)||t.key==="ArrowUp"?"up":U(t,R)||t.key==="ArrowRight"?"right":null;if(q&&Y&&p){t.preventDefault(),t.stopPropagation();const o=_(p,q);o!==p&&(Z(o),a==null||a(o),window.setTimeout(()=>l(o),0));return}if(U(t,$)){if(v.terminalOpen)return;if(Y&&p&&v.agents.has(p)){t.preventDefault(),n==null||n(p);return}if(v.selectedAgentIds.size===1){t.preventDefault();const o=Array.from(v.selectedAgentIds)[0];n==null||n(o);return}if(v.lastSelectedAgentId&&v.agents.has(v.lastSelectedAgentId)){t.preventDefault(),n==null||n(v.lastSelectedAgentId);return}}};return document.addEventListener("keydown",E,!0),()=>document.removeEventListener("keydown",E,!0)},[y,Y,p,n,a]),c.useEffect(()=>{const e=document.activeElement;e instanceof HTMLElement&&e.closest(".guake-terminal")&&!M.getState().terminalOpen&&e.blur()},[]),s.jsxs("div",{className:"dashboard-view",children:[s.jsxs("div",{className:"dashboard-view__topbar",children:[s.jsxs("div",{className:"dashboard-view__metrics",children:[s.jsxs("button",{className:`dashboard-view__metric-btn ${j==="all"?"dashboard-view__metric-btn--active":""}`,onClick:()=>I("all"),children:[s.jsx("span",{className:"dashboard-view__metric-value",children:K.total}),s.jsx("span",{className:"dashboard-view__metric-label",children:h("common:labels.agents")})]}),s.jsxs("button",{className:`dashboard-view__metric-btn dashboard-view__metric-btn--working ${j==="working"?"dashboard-view__metric-btn--active":""}`,onClick:()=>I("working"),children:[s.jsx("span",{className:"dashboard-view__metric-value",children:K.working}),s.jsx("span",{className:"dashboard-view__metric-label",children:h("common:status.working")})]}),s.jsxs("button",{className:"dashboard-view__metric-btn dashboard-view__metric-btn--idle ",onClick:()=>I("all"),children:[s.jsx("span",{className:"dashboard-view__metric-value",children:K.idle}),s.jsx("span",{className:"dashboard-view__metric-label",children:h("common:status.idle")})]}),s.jsxs("button",{className:`dashboard-view__metric-btn dashboard-view__metric-btn--error ${j==="error"?"dashboard-view__metric-btn--active":""}`,onClick:()=>I("error"),children:[s.jsx("span",{className:"dashboard-view__metric-value",children:K.error}),s.jsx("span",{className:"dashboard-view__metric-label",children:h("common:status.error")})]})]}),s.jsx("input",{className:"dashboard-view__search",type:"text",placeholder:h("searchPlaceholder"),value:N,onChange:e=>B(e.target.value)})]}),s.jsxs("div",{className:"dashboard-view__grouping",children:[s.jsx("button",{className:`dashboard-view__grouping-btn ${m==="zone"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>H("zone"),children:h("grouping.byZone")}),s.jsx("button",{className:`dashboard-view__grouping-btn ${m==="status"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>H("status"),children:h("grouping.byStatus")}),s.jsx("button",{className:`dashboard-view__grouping-btn ${m==="activity"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>H("activity"),children:h("grouping.byActivity")})]}),s.jsxs("div",{className:"dashboard-view__content",children:[V.map(e=>{const i=O(e),l=b.has(i),_=m==="status"?ms(e.agents,{prioritizeRecentlyIdle:!0}):_s(e.agents),E=e.agents.filter(r=>r.status==="working"||r.status==="waiting"||r.status==="waiting_permission").length,t=e.agents.filter(r=>X.has(r.id)).length;return s.jsxs("div",{className:`dashboard-view__zone ${ps===(e.area?e.area.id:null)&&k?"dashboard-view__zone--drag-over":""}`,onDragOver:r=>Ns(r,e.area?e.area.id:null),onDragLeave:ks,onDrop:()=>ys(e.area?e.area.id:null),children:[s.jsxs("div",{className:"dashboard-view__zone-header",onClick:()=>gs(i),children:[s.jsxs("div",{className:"dashboard-view__zone-left",children:[s.jsx("span",{className:`dashboard-view__zone-chevron ${l?"dashboard-view__zone-chevron--collapsed":""}`,children:s.jsx(F,{name:"caret-down",size:12})}),s.jsx("span",{className:"dashboard-view__zone-dot",style:{backgroundColor:e.color}}),s.jsx("span",{className:"dashboard-view__zone-name",children:e.label}),s.jsxs("span",{className:"dashboard-view__zone-count",children:[h("agentCount",{count:e.agents.length}),E>0&&s.jsxs("span",{className:"dashboard-view__zone-working",children:[" · ",E," ",h("working")]}),t>0&&s.jsxs("span",{className:"dashboard-view__zone-unseen",children:[" · ",t," Unseen"]})]})]}),e.area&&g&&s.jsx("button",{className:"dashboard-view__zone-focus",onClick:r=>{r.stopPropagation(),g(e.area.id)},title:h("focusZone"),children:h("focusZone")})]}),!l&&s.jsx("div",{className:"dashboard-view__zone-grid",children:_.map(r=>s.jsx(fs,{agent:r,isSelected:rs.has(r.id),isKeyboardFocused:Y&&p===r.id,onSelect:()=>{a==null||a(r.id),Q(!0),Z(r.id)},onDoubleClick:()=>xs(r.id),onChat:()=>n==null?void 0:n(r.id),onFocus:A?()=>A(r.id):void 0,onKill:L?()=>L(r.id):void 0,onDragStart:js},r.id))})]},i)}),V.length===0&&s.jsx("div",{className:"dashboard-view__empty",children:N?h("noAgentsMatching",{search:N}):h("noAgentsSpawned")}),S.size>0&&s.jsx(ws,{buildings:S,onSelectBuilding:P})]})]})}export{Ws as DashboardView};
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/web-BRpVSwLu.js","assets/main-DFVcOIIz.js","assets/vendor-react--Eh9ivFN.js","assets/vendor-three-Chj50gSY.js","assets/main-CFu_SP_0.css"])))=>i.map(i=>d[i]);
2
- import{c7 as e,bA as o}from"./main-DFVcOIIz.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";var i;(function(r){r.Heavy="HEAVY",r.Medium="MEDIUM",r.Light="LIGHT"})(i||(i={}));var t;(function(r){r.Success="SUCCESS",r.Warning="WARNING",r.Error="ERROR"})(t||(t={}));const c=e("Haptics",{web:()=>o(()=>import("./web-BRpVSwLu.js"),__vite__mapDeps([0,1,2,3,4])).then(r=>new r.HapticsWeb)});export{c as Haptics,i as ImpactStyle,t as NotificationType};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/web-BP2TNYTf.js","assets/main-DrsDQIKU.js","assets/vendor-react--Eh9ivFN.js","assets/vendor-three-Chj50gSY.js","assets/main-CFu_SP_0.css"])))=>i.map(i=>d[i]);
2
+ import{c7 as e,bA as o}from"./main-DrsDQIKU.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";var i;(function(r){r.Heavy="HEAVY",r.Medium="MEDIUM",r.Light="LIGHT"})(i||(i={}));var t;(function(r){r.Success="SUCCESS",r.Warning="WARNING",r.Error="ERROR"})(t||(t={}));const c=e("Haptics",{web:()=>o(()=>import("./web-BP2TNYTf.js"),__vite__mapDeps([0,1,2,3,4])).then(r=>new r.HapticsWeb)});export{c as Haptics,i as ImpactStyle,t as NotificationType};