tide-commander 1.82.0 → 1.83.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{BossLogsModal-c_-m-65A.js → BossLogsModal-Bgg8MqNZ.js} +1 -1
- package/dist/assets/{BossSpawnModal-xoclsIKS.js → BossSpawnModal-SQNEPxH1.js} +1 -1
- package/dist/assets/{ControlsModal-DvbJLRQI.js → ControlsModal-ImEPi76l.js} +1 -1
- package/dist/assets/{DockerLogsModal-BEwlDjvB.js → DockerLogsModal-Cs3jjehG.js} +1 -1
- package/dist/assets/{EmbeddedEditor-Ce0A9MPZ.js → EmbeddedEditor-Cg3lq_Cv.js} +1 -1
- package/dist/assets/{GmailOAuthSetup-CxPmSlXq.js → GmailOAuthSetup-1Gh5-yZt.js} +1 -1
- package/dist/assets/{GoogleOAuthSetup-C5XDtkWo.js → GoogleOAuthSetup-DmXPQyOR.js} +1 -1
- package/dist/assets/{IframeModal-B30rL5T9.js → IframeModal-BEItm7bf.js} +1 -1
- package/dist/assets/{IntegrationsPanel-DOiXFhKJ.js → IntegrationsPanel-epI8eaV_.js} +2 -2
- package/dist/assets/{LogViewerModal-BDDX94V7.js → LogViewerModal-B4ryb52t.js} +1 -1
- package/dist/assets/{MonitoringModal-Bb-ofaiK.js → MonitoringModal-CzUjqD5Y.js} +1 -1
- package/dist/assets/{PM2LogsModal-BbwXHEqR.js → PM2LogsModal-Ex9G2Mly.js} +1 -1
- package/dist/assets/{RestoreArchivedAreaModal-DDndv4rZ.js → RestoreArchivedAreaModal-DIsamY35.js} +1 -1
- package/dist/assets/{Scene2DCanvas-D0mV81Bm.js → Scene2DCanvas-B5VdT-R2.js} +1 -1
- package/dist/assets/{SceneManager-BT7vcVki.js → SceneManager-CgkTa3Uf.js} +1 -1
- package/dist/assets/{SkillsPanel-Db_tfT8F.js → SkillsPanel-DXxAlZbz.js} +1 -1
- package/dist/assets/{SpawnModal-BgBB9Nre.js → SpawnModal-_1Af5rTQ.js} +1 -1
- package/dist/assets/{SubordinateAssignmentModal-CsNUXzAa.js → SubordinateAssignmentModal-CZ1p4KxH.js} +1 -1
- package/dist/assets/{TriggerManagerPanel-DLjvwFj_.js → TriggerManagerPanel-DnOvAQq6.js} +1 -1
- package/dist/assets/{WorkflowEditorPanel-CtWq2X20.js → WorkflowEditorPanel-Dr896thl.js} +1 -1
- package/dist/assets/{index-CeGEneIm.js → index-C70mj1bd.js} +1 -1
- package/dist/assets/{index-dz45uNT2.js → index-CgPa_6TH.js} +1 -1
- package/dist/assets/{index-BKRYCHvF.js → index-CkhtIUBY.js} +1 -1
- package/dist/assets/{index-DjcUPqW1.js → index-CoUtzDXD.js} +1 -1
- package/dist/assets/{index-BWFXqJh3.js → index-DCHHa29_.js} +1 -1
- package/dist/assets/{index-Bx7MluX4.js → index-DVqDWfDB.js} +2 -2
- package/dist/assets/{index-Blb2sMy-.js → index-DvRrAd9Y.js} +1 -1
- package/dist/assets/{index-kLrB6kGv.js → index-OYmdvKdM.js} +3 -3
- package/dist/assets/{index-B-kiGa62.js → index-ave_XgRW.js} +1 -1
- package/dist/assets/{main-C0wLbrjb.js → main-CHfGSVnw.js} +94 -93
- package/dist/assets/main-DmmvYoEs.css +1 -0
- package/dist/assets/{web-CQeInubf.js → web-D1aYcbd6.js} +1 -1
- package/dist/assets/{web-Dpd6fLBM.js → web-rv0WAVTk.js} +1 -1
- package/dist/index.html +2 -2
- package/dist/src/packages/server/claude/runner/internal-events.js +6 -3
- package/dist/src/packages/server/claude/runner/tmux-helper.js +10 -0
- package/dist/src/packages/server/claude/runner/watchdog.js +14 -0
- package/dist/src/packages/server/claude/runner.js +35 -13
- package/dist/src/packages/server/claude/session-loader.js +240 -0
- package/dist/src/packages/server/routes/agents.js +4 -0
- package/dist/src/packages/server/routes/index.js +2 -0
- package/dist/src/packages/server/routes/sessions.js +93 -0
- package/dist/src/packages/server/services/runtime-command-execution.js +13 -0
- package/dist/src/packages/server/services/runtime-service.js +7 -0
- package/dist/src/packages/server/utils/index.js +1 -0
- package/dist/src/packages/server/utils/log-context.js +10 -0
- package/dist/src/packages/server/utils/logger.js +6 -1
- package/dist/src/packages/server/websocket/handlers/agent-handler.js +17 -5
- package/package.json +1 -1
- package/dist/assets/main-DrNeyjdE.css +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as Xt,z as Ut,B as qt,r as n,E as Nt,S as j,G as kt,H as wt,J as It,K as st,L as Ae,M as Kt,s as f,N as Pt,O as zt,P as Yt,v as At,w as St,j as e,I as u,U as Zt,m as Jt,V as Qt,W as Dt,X as Rt,Y as ea,Z as ta,_ as aa,$ as na,a0 as sa,a1 as la,a2 as ra,a3 as ia,a4 as oa,a5 as ca,a6 as yt,C as da,a7 as ua,a8 as pa,a9 as ma,aa as fa,ab as ha,ac as ga,ad as ba,ae as xa,af as _a,ag as wa,ah as Ca,ai as ja,aj as va,ak as Na,al as ka,am as Ia}from"./main-C0wLbrjb.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";const lt=3,rt=280,Mt=320,_t=240,Et=64,Aa=["simple","chat","advanced"],Sa={simple:"Simple",chat:"Chat",advanced:"Advanced"},ya={simple:"○",chat:"◐",advanced:"◉"},Ma={simple:"Simple view — clean messages only",chat:"Chat view — assistant replies (no tool calls)",advanced:"Advanced view — everything including tools"},Tt="flat-clear-context";function Ea(_){const d=_.split("/").filter(Boolean);return d.length===0?_:d.slice(-2).join("/")}function Ta(_){if(_.provider==="codex"){const he=_.codexModel||"gpt-5.3-codex",ne=Na[he];return{model:(ne==null?void 0:ne.label)||he}}if(_.provider==="opencode")return{model:_.opencodeModel||"opencode"};const d=_.model||"sonnet",N=Ia[d],E=_.effort,B=E?ka[E]:void 0;return{model:(N==null?void 0:N.label)||d,effort:B==null?void 0:B.label}}function Pa(_,d){if(d.type==="rectangle"&&d.width&&d.height){const N=d.width/2,E=d.height/2;return _.x>=d.center.x-N&&_.x<=d.center.x+N&&_.z>=d.center.z-E&&_.z<=d.center.z+E}if(d.type==="circle"&&d.radius){const N=_.x-d.center.x,E=_.z-d.center.z;return N*N+E*E<=d.radius*d.radius}return!1}const za=ua.memo(function({agentId:d,terminalViewMode:N,onTerminalViewModeChange:E,inspectorOpen:B,onToggleInspector:he,onImageClick:ne,onFileClick:ge,onBashClick:T,onViewMarkdown:Se,onRequestClearSubordinates:ye,onOpenBuilding:Me,keyboard:We,canNavigateBack:He,canNavigateForward:Ee,onNavigateBack:Y,onNavigateForward:P,agentInfoOpen:be,onToggleAgentInfo:G}){var te,ve,q,Qe;const h=pa(d),A=zt(),se=n.useRef(null),xe=n.useRef(null);n.useEffect(()=>{const s=xe.current;if(!s)return;const i=o=>{o.button===3?(o.preventDefault(),o.stopPropagation(),Y()):o.button===4&&(o.preventDefault(),o.stopPropagation(),P())},c=o=>{(o.button===3||o.button===4)&&o.preventDefault()};return s.addEventListener("mouseup",i),s.addEventListener("mousedown",c),()=>{s.removeEventListener("mouseup",i),s.removeEventListener("mousedown",c)}},[Y,P]),n.useEffect(()=>{const s=xe.current;if(!s)return;let i=0,c=0,o=0;const ae=250,pe=600,Ne=80,mt=1.5,ft=D=>{let I=D instanceof HTMLElement?D:null;for(;I&&I!==s;){const Oe=window.getComputedStyle(I).overflowX;if((Oe==="auto"||Oe==="scroll")&&I.scrollWidth>I.clientWidth)return!0;I=I.parentElement}return!1},ke=D=>{const I=Date.now();if(I<o){D.preventDefault();return}if(Math.abs(D.deltaX)<=Math.abs(D.deltaY)*mt){i=0;return}if(ft(D.target)){i=0;return}I-c>ae&&(i=0),c=I,i+=D.deltaX,i<=-Ne?(i=0,o=I+pe,D.preventDefault(),Y()):i>=Ne&&(i=0,o=I+pe,D.preventDefault(),P())};return s.addEventListener("wheel",ke,{passive:!1}),()=>s.removeEventListener("wheel",ke)},[Y,P]);const le=Pt(),Te=n.useMemo(()=>{if(!h)return null;const s=new Set,i=[];for(const c of le.values())c.archived||c.directories.length===0||c.assignedAgentIds.includes(d)&&(s.add(c.id),i.push(c));for(const c of le.values())c.archived||c.directories.length===0||s.has(c.id)||Pa({x:h.position.x,z:h.position.z},c)&&(s.add(c.id),i.push(c));return i.length===0?null:i.flatMap(c=>c.directories.filter(o=>o&&o.trim().length>0).map(o=>({areaId:c.id,areaName:c.name,dir:o})))},[h,d,le]),{branches:Ge,fetchRemote:Ve,fetchingDirs:Pe}=ma(Te),_e=n.useMemo(()=>{var c;const s=f.getAreaForAgent(d);if(!s)return[];const i=[];for(const o of A.values())o.type==="terminal"&&f.isPositionInArea(o.position,s)&&i.push({id:o.id,name:o.name,hasUrl:!!((c=o.terminalStatus)!=null&&c.url)});return i},[d,A]),ze=n.useMemo(()=>{var c;const s=f.getAreaForAgent(d);if(!s)return[];const i=[];for(const o of A.values())o.type==="server"&&((c=o.pm2)!=null&&c.enabled)&&f.isPositionInArea(o.position,s)&&i.push({id:o.id,name:o.name});return i},[d,A]),De=n.useMemo(()=>{const s=f.getAreaForAgent(d);if(!s)return[];const i=[];for(const c of A.values())c.type==="database"&&c.database&&f.isPositionInArea(c.position,s)&&i.push({id:c.id,name:c.name});return i},[d,A]),[,we]=n.useReducer(s=>s+1,0),Z=((te=se.current)==null?void 0:te.search.searchMode)??!1,it=n.useCallback(()=>{var s;(s=se.current)==null||s.search.toggleSearch(),we()},[]),Xe=fa(),J=Xe.isPending(Tt),[R,F]=n.useState(null),O=R?A.get(R):null,{height:W,onResizeStart:Ce}=ha(),[L,V]=n.useState(()=>wt(j.GIT_PANEL_OPEN,!1)),[re,Ue]=n.useState(()=>wt(j.BUILDINGS_PANEL_OPEN,!1)),[Q,ie]=n.useState(!1),ot=n.useCallback(()=>{ie(s=>{const i=!s;return i&&ga.setEnabled(!0),i})},[]),ct=n.useCallback(()=>ie(!1),[]),oe=n.useCallback(()=>{V(s=>{const i=!s;return Ae(j.GIT_PANEL_OPEN,i),i})},[]),dt=n.useCallback(()=>{Ue(s=>{const i=!s;return Ae(j.BUILDINGS_PANEL_OPEN,i),i})},[]),qe=n.useCallback(()=>{V(!1),Ae(j.GIT_PANEL_OPEN,!1)},[]),ut=n.useCallback(()=>{Ue(!1),Ae(j.BUILDINGS_PANEL_OPEN,!1)},[]),pt=ba();n.useEffect(()=>{if(!R)return;_e.some(i=>i.id===R)||F(null)},[R,_e]);const[ce,ee]=n.useState(!1),Re=n.useRef(null);if(n.useEffect(()=>{if(!ce)return;const s=i=>{Re.current&&!Re.current.contains(i.target)&&ee(!1)};return document.addEventListener("mousedown",s),()=>document.removeEventListener("mousedown",s)},[ce]),!h)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 X=h.contextStats,Ke=!!X,Ye=X?X.totalTokens:h.contextUsed||0,de=X?X.contextWindow:h.contextLimit||2e5,g=X?X.usedPercent:Math.round(Ye/de*100),z=Math.max(0,Math.min(100,g)),H=Math.max(0,100-z),ue=z>=80?"#ff4a4a":z>=60?"#ff9e4a":z>=40?"#ffd700":"#4aff9e",Le=(Ye/1e3).toFixed(1),Ze=(de/1e3).toFixed(1),U=h.cwd,Je=U?Ea(U):null,je=((ve=h.subordinateIds)==null?void 0:ve.length)||0,$e=je>0;return e.jsxs("div",{ref:xe,className:`flat-terminal-wrapper ${L||re||Q?"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 ${be?"flat-terminal-wrapper__header-main--active":""}`,onClick:G,title:be?"Hide agent info":"Show agent info","aria-pressed":be,children:[e.jsx(Dt,{agent:h,size:28}),e.jsxs("span",{className:"flat-terminal-wrapper__header-info",children:[e.jsx("span",{className:"flat-terminal-wrapper__header-name",children:h.name}),e.jsx("span",{className:"flat-terminal-wrapper__header-status",style:{color:Rt(h.status)},children:h.status})]}),h.taskLabel&&e.jsxs("span",{className:"flat-terminal-wrapper__header-task",title:h.taskLabel,children:["📋 ",h.taskLabel]}),e.jsxs("span",{className:"flat-terminal-wrapper__header-model",children:[e.jsx("img",{src:h.provider==="codex"?"/assets/codex.png":h.provider==="opencode"?"/assets/opencode.png":"/assets/claude.png",alt:h.provider,className:"flat-terminal-wrapper__header-provider-icon",title:h.provider==="codex"?"Codex Agent":h.provider==="opencode"?"OpenCode Agent":"Claude Agent"}),(()=>{const{model:s,effort:i}=Ta(h);return e.jsxs("span",{className:"flat-terminal-wrapper__header-model-chip",title:i?`Model: ${s} · Effort: ${i}`:`Model: ${s}`,children:[e.jsx("span",{className:"flat-terminal-wrapper__header-model-name",children:s}),i&&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:i})]})]})})()]})]}),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:Aa.map(s=>e.jsxs("button",{type:"button",className:`flat-terminal-wrapper__view-mode-btn ${N===s?"flat-terminal-wrapper__view-mode-btn--active":""}`,onClick:()=>E(s),title:Ma[s],"aria-pressed":N===s,children:[e.jsx("span",{className:"flat-terminal-wrapper__view-mode-icon","aria-hidden":"true",children:ya[s]}),e.jsx("span",{className:"flat-terminal-wrapper__view-mode-label",children:Sa[s]})]},s))}),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:Y,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:P,disabled:!Ee,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 ${Z?"flat-terminal-wrapper__action-btn--active":""}`,onClick:it,title:Z?"Close search":"Search messages","aria-pressed":Z,children:e.jsx(u,{name:Z?"cross":"search",size:14})}),e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn flat-terminal-wrapper__action-btn--danger ${J?"flat-terminal-wrapper__action-btn--confirm":""}`,onClick:()=>Xe.handleClick(Tt,()=>{var s;f.clearContext(d),(s=se.current)==null||s.historyLoader.clearHistory()}),title:J?"Click again to confirm clear context":"Clear context",children:e.jsx(u,{name:J?"question":"clear",size:14})}),e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${L?"flat-terminal-wrapper__action-btn--active":""}`,onClick:oe,title:L?"Hide git panel":"Show git changes","aria-pressed":L,children:e.jsx(u,{name:"git-branch",size:14})}),e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${re?"flat-terminal-wrapper__action-btn--active":""}`,onClick:dt,title:re?"Hide buildings panel":"Show area buildings","aria-pressed":re,children:e.jsx(u,{name:"buildings",size:14})}),e.jsxs("div",{className:"flat-terminal-wrapper__more",ref:Re,children:[e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${ce?"flat-terminal-wrapper__action-btn--active":""}`,onClick:()=>ee(s=>!s),title:"More actions","aria-expanded":ce,children:"⋮"}),ce&&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 ${Q?"flat-terminal-wrapper__more-item--active":""}`,onClick:()=>{ot(),ee(!1)},title:Q?"Hide Debug Panel":"Show Debug Panel",children:[e.jsx(u,{name:"bug",size:14}),e.jsx("span",{children:Q?"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:()=>{f.collapseContext(d),ee(!1)},disabled:h.status!=="idle",title:h.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"})]}),$e&&e.jsxs("button",{type:"button",role:"menuitem",className:"flat-terminal-wrapper__more-item flat-terminal-wrapper__more-item--danger",onClick:()=>{ye(d,je),ee(!1)},children:[e.jsx(u,{name:"crown",size:14}),e.jsxs("span",{children:["Clear ",je," subordinate",je===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:()=>{f.killAgent(d),ee(!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 ${B?"flat-terminal-wrapper__inspector-toggle--active":""}`,onClick:he,title:B?"Hide inspector panel":"Show inspector panel","aria-label":B?"Hide inspector panel":"Show inspector panel","aria-pressed":B,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:()=>f.deselectAll(),title:"Close chat","aria-label":"Close chat",children:e.jsx(u,{name:"cross",size:14})})]})]}),e.jsx(xa,{ref:se,agentId:d,agent:h,viewMode:N,isOpen:!0,onImageClick:ne,onFileClick:ge,onBashClick:T,onViewMarkdown:Se,keyboard:We,hasModalOpen:!1}),O&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"guake-bottom-terminal-resize",onMouseDown:Ce,role:"separator","aria-orientation":"horizontal","aria-label":"Resize embedded terminal"}),e.jsxs("div",{className:"flat-bottom-panel",role:"region","aria-label":`Embedded terminal: ${O.name}`,style:{height:W},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:O.name}),!((q=O.terminalStatus)!=null&&q.url)&&e.jsx("span",{className:"flat-bottom-panel__muted",children:"(starting...)"})]}),e.jsx("button",{type:"button",className:"flat-bottom-panel__close",onClick:()=>F(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=O.terminalStatus)!=null&&Qe.url?e.jsx(_a,{terminalUrl:O.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:[h.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"})]}),U&&Je&&e.jsxs("span",{className:"flat-terminal-wrapper__cwd",title:`Open in file explorer: ${U}`,"aria-label":`Open ${U} in file explorer`,role:"button",tabIndex:0,onClick:()=>f.openFileExplorer(U),onKeyDown:s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),f.openFileExplorer(U))},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})]}),Te&&Te.map(({areaId:s,areaName:i,dir:c})=>{const o=Ge.get(c),ae=Pe.has(c),pe=c.split("/").filter(Boolean).pop()||c;return e.jsxs("span",{className:"flat-terminal-wrapper__area-dir",title:`${i}: ${c}${o?` (${o.branch}${o.ahead?` ↑${o.ahead}`:""}${o.behind?` ↓${o.behind}`:""})`:""}`,onClick:()=>f.openFileExplorerForAreaFolder(s,c),children:[e.jsx(u,{name:"folder-open",size:12}),e.jsx("span",{className:"flat-terminal-wrapper__area-dir-name",children:pe}),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 ${ae?"flat-terminal-wrapper__area-fetch--fetching":""}`,title:"Git fetch",onClick:Ne=>{Ne.stopPropagation(),Ve(c)},children:e.jsx(u,{name:ae?"hourglass":"download",size:12})})]})]},`${s}:${c}`)}),e.jsxs("span",{className:"flat-terminal-wrapper__context",onClick:()=>f.setContextModalAgentId(d),title:Ke?`Context usage: ${Le}k / ${Ze}k tokens (${z}% 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:`${z}%`,backgroundColor:ue}})}),e.jsxs("span",{className:"flat-terminal-wrapper__context-tokens",style:{color:ue},children:[Le,"k/",Ze,"k"]}),e.jsxs("span",{className:"flat-terminal-wrapper__context-free",children:["(",H,"% 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"}),_e.length>0&&e.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area terminals",children:_e.map(s=>{const i=R===s.id;return e.jsx("button",{type:"button",className:`flat-terminal-wrapper__building-btn ${i?"flat-terminal-wrapper__building-btn--active":""} ${s.hasUrl?"":"flat-terminal-wrapper__building-btn--offline"}`,title:`${i?"Hide":"Show"} terminal: ${s.name}${s.hasUrl?"":" (starting...)"}`,onClick:()=>{if(i){F(null);return}s.hasUrl||f.sendBuildingCommand(s.id,"start"),F(s.id)},children:e.jsx(u,{name:"terminal",size:14})},s.id)})}),ze.length>0&&e.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area PM2 logs",children:ze.map(s=>e.jsx("button",{type:"button",className:"flat-terminal-wrapper__building-btn",title:`Open logs: ${s.name}`,onClick:()=>Me(s.id),children:e.jsx(u,{name:"scroll",size:14})},s.id))}),De.length>0&&e.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area databases",children:De.map(s=>e.jsx("button",{type:"button",className:"flat-terminal-wrapper__building-btn",title:`Open database: ${s.name}`,onClick:()=>Me(s.id),children:e.jsx(u,{name:"hard-drives",size:14})},s.id))}),e.jsx("div",{className:"flat-terminal-wrapper__theme",children:e.jsx(wa,{})})]}),L&&e.jsx(Ca,{agentId:d,agents:pt,onClose:qe,branchInfoMap:Ge,fetchRemote:Ve,fetchingDirs:Pe}),re&&e.jsx(ja,{agentId:d,onClose:ut}),Q&&e.jsx(va,{agentId:d,onClose:ct})]})});function $a({onAgentClick:_,onBuildingClick:d,onBuildingDoubleClick:N,onBuildingPopup:E,onOpenSpawnModal:B,onOpenBossSpawnModal:he,onOpenAreaModal:ne}){const{t:ge}=Xt(["common"]),T=Ut(),Se=qt(),[ye,Me]=n.useState(null),[We,He]=n.useState(null),[Ee,Y]=n.useState(null),[P,be]=n.useState(null),[G,h]=n.useState(null),[A,se]=n.useState(null),[xe,le]=n.useState(!1),Te=n.useCallback(()=>{le(t=>!t)},[]),Ge=n.useCallback(()=>{le(!1)},[]),[Ve,Pe]=n.useState(()=>{const t=Nt(j.VIEW_MODE);return t==="simple"||t==="chat"||t==="advanced"?t:"simple"}),_e=n.useCallback(t=>{Pe(t),kt(j.VIEW_MODE,t)},[]);n.useEffect(()=>{const t=a=>{if(a.key!==j.VIEW_MODE)return;const l=a.newValue;(l==="simple"||l==="chat"||l==="advanced")&&Pe(l)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)},[]);const[ze,De]=n.useState(()=>wt(j.FLAT_INSPECTOR_OPEN,!1)),[we,Z]=n.useState(!1),it=n.useCallback(()=>Z(t=>!t),[]),Xe=n.useCallback(()=>Z(!1),[]),J=n.useRef(null),R=n.useRef(null),[F,O]=n.useState(()=>{const t=It(j.FLAT_MIDDLE_WIDTH,0);return t>=rt?t:null}),[W,Ce]=n.useState(()=>{const t=It(j.FLAT_INSPECTOR_WIDTH,0);return t>=_t?t:null}),L=n.useCallback(t=>{if(typeof window>"u")return t;const a=W!==null?lt+W:0,l=window.innerWidth-Et-lt-Mt-a;return Math.max(rt,Math.min(Math.max(l,rt),t))},[W]),V=n.useCallback(t=>{var p;if(typeof window>"u")return t;const a=(p=J.current)==null?void 0:p.querySelector(".flat-middle"),l=(a==null?void 0:a.getBoundingClientRect().width)??rt,r=window.innerWidth-Et-l-lt-Mt-lt;return Math.max(_t,Math.min(Math.max(r,_t),t))},[]);n.useEffect(()=>{if(F===null&&W===null)return;const t=()=>{O(a=>{if(a===null)return a;const l=L(a);return l===a?a:l}),Ce(a=>{if(a===null)return a;const l=V(a);return l===a?a:l})};return window.addEventListener("resize",t),()=>window.removeEventListener("resize",t)},[F,W,L,V]);const re=n.useCallback(t=>{var l;if(t.button!==0)return;const a=(l=J.current)==null?void 0:l.querySelector(".flat-middle");a&&(t.currentTarget.setPointerCapture(t.pointerId),R.current={kind:"middle",startX:t.clientX,startWidth:a.getBoundingClientRect().width,pointerId:t.pointerId},document.body.classList.add("flat-splitter-dragging"))},[]),Ue=n.useCallback(t=>{var l;if(t.button!==0)return;const a=(l=J.current)==null?void 0:l.querySelector(".flat-inspector");a&&(t.currentTarget.setPointerCapture(t.pointerId),R.current={kind:"inspector",startX:t.clientX,startWidth:a.getBoundingClientRect().width,pointerId:t.pointerId},document.body.classList.add("flat-splitter-dragging"))},[]),Q=n.useCallback(t=>{const a=R.current;if(!a||t.pointerId!==a.pointerId)return;const l=t.clientX-a.startX;a.kind==="middle"?O(L(a.startWidth+l)):Ce(V(a.startWidth-l))},[L,V]),ie=n.useCallback(t=>{const a=R.current;if(!a||t.pointerId!==a.pointerId)return;try{t.currentTarget.releasePointerCapture(t.pointerId)}catch{}if(R.current=null,document.body.classList.remove("flat-splitter-dragging"),!(Math.abs(t.clientX-a.startX)>2))return;const r=t.clientX-a.startX;if(a.kind==="middle"){const p=L(a.startWidth+r);O(p),st(j.FLAT_MIDDLE_WIDTH,p)}else{const p=V(a.startWidth-r);Ce(p),st(j.FLAT_INSPECTOR_WIDTH,p)}},[L,V]),ot=n.useCallback(()=>{O(null),st(j.FLAT_MIDDLE_WIDTH,0)},[]),ct=n.useCallback(()=>{Ce(null),st(j.FLAT_INSPECTOR_WIDTH,0)},[]),[oe,dt]=n.useState(()=>Nt(j.FLAT_INSPECTOR_VIEW)==="tracking"?"tracking":"agent"),qe=n.useCallback(t=>{dt(t),kt(j.FLAT_INSPECTOR_VIEW,t)},[]),ut=n.useCallback(()=>{De(t=>{const a=!t;return Ae(j.FLAT_INSPECTOR_OPEN,a),a})},[]),pt=n.useCallback(()=>{De(!1),Ae(j.FLAT_INSPECTOR_OPEN,!1)},[]),ce=Kt(),ee=n.useCallback((t,a)=>{Me({url:t,name:a})},[]),Re=n.useCallback((t,a)=>{He({command:t,output:a,isLive:!1})},[]),X=n.useCallback((t,a)=>{f.setFileViewerPath(t,a)},[]),Ke=n.useCallback(t=>{},[]),Ye=n.useCallback((t,a)=>{Y({agentId:t,count:a})},[]),de=n.useCallback(t=>{N?N(t):d(t)},[d,N]),g=n.useMemo(()=>Se.size>0?Array.from(Se)[0]:null,[Se]);n.useEffect(()=>{le(!1)},[g]);const z=n.useRef([]),H=n.useRef(-1),ue=n.useRef(!1),Le=n.useRef(null),[Ze,U]=n.useState(!1),[Je,je]=n.useState(!1),$e=n.useRef(!1),te=n.useRef(null),ve=n.useRef(!1),q=n.useMemo(()=>new Set(T.map(t=>t.id)),[T]),Qe=n.useMemo(()=>{const t=new Map(T.map(l=>[l.id,l])),a=new Map;for(const l of T)if((l.isBoss||l.class==="boss")&&l.subordinateIds&&l.subordinateIds.length>0){const r=l.subordinateIds.map(p=>t.get(p)).filter(p=>p!==void 0);r.length>0&&a.set(l.id,r)}return a},[T]),s=n.useCallback(()=>{const t=z.current,a=H.current;U(a>0),je(a>=0&&a<t.length-1)},[]),i=n.useCallback(t=>{const a=z.current;if(a.length===0)return;let l=H.current+t;for(;l>=0&&l<a.length;){const r=a[l];if(q.has(r)){ue.current=!0,H.current=l,s(),f.selectAgent(r);return}l+=t}},[q,s]),c=n.useCallback(()=>i(-1),[i]),o=n.useCallback(()=>i(1),[i]),ae=n.useCallback((t,a)=>{if(typeof window>"u")return;const l=window.history.state,p={...typeof l=="object"&&l!==null?l:{},__flatAgentNav:{agentId:t}};a==="replace"?window.history.replaceState(p,"",window.location.href):window.history.pushState(p,"",window.location.href)},[]);n.useEffect(()=>{if(!g){$e.current=!1,te.current=null;return}if(!$e.current){ae(g,"replace"),$e.current=!0,te.current=g;return}if(ve.current){ve.current=!1,te.current=g;return}te.current!==g&&(ae(g,"push"),te.current=g)},[g,ae]),n.useEffect(()=>{const t=a=>{var m,x;const l=(x=(m=a.state)==null?void 0:m.__flatAgentNav)==null?void 0:x.agentId;if(!l||typeof l!="string"||!q.has(l)||l===g)return;ve.current=!0,ue.current=!0;const r=z.current,p=r.lastIndexOf(l);p>=0?H.current=p:(r.push(l),H.current=r.length-1),s(),f.selectAgent(l)};return window.addEventListener("popstate",t),()=>window.removeEventListener("popstate",t)},[q,g,s]),n.useEffect(()=>{if(!g){z.current=[],H.current=-1,s();return}if(Le.current=g,ue.current){ue.current=!1,s();return}const t=z.current,a=H.current;if(a>=0&&t[a]===g){s();return}const l=a<t.length-1?t.slice(0,a+1):t.slice();l.push(g),l.length>100&&l.shift(),z.current=l,H.current=l.length-1,s()},[g,s]);const pe=n.useCallback(t=>{_(t),Z(!1)},[_]),Ne=g??"",mt=n.useCallback(()=>{},[]),ft=n.useCallback(t=>{pe(t)},[pe]),ke=ze,D=n.useRef(null);n.useEffect(()=>{if(g)return;const t=a=>{if(a.key!==" "&&a.key!=="Backspace")return;const l=a.target;if(l.tagName==="INPUT"||l.tagName==="TEXTAREA"||l.isContentEditable)return;const r=Le.current;!r||!q.has(r)||(a.preventDefault(),f.selectAgent(r))};return document.addEventListener("keydown",t),()=>document.removeEventListener("keydown",t)},[g,q]);const[I,Oe]=n.useState(new Set),Lt=n.useCallback(t=>{Oe(a=>{const l=new Set(a);return l.has(t)?l.delete(t):l.add(t),l})},[]),ht=Pt(),et=zt(),[$t]=Yt(),Ie=n.useMemo(()=>{const t=new Map,a=[];for(const b of T){const C=f.getAreaForAgent(b.id);if(!At((C==null?void 0:C.id)??null))continue;if(!C||C.archived){a.push(b);continue}const v=t.get(C.id);v?v.push(b):t.set(C.id,[b])}const l=new Map,r=[];for(const b of et.values()){let C=!1;for(const v of ht.values())if(!v.archived&&St(v.id)&&f.isPositionInArea(b.position,v)){const K=l.get(v.id);K?K.push(b):l.set(v.id,[b]),C=!0;break}!C&&At(null)&&r.push(b)}const p=[];for(const[,b]of ht){if(b.archived||!St(b.id))continue;const C=t.get(b.id),v=l.get(b.id)??[];(C&&C.length>0||v.length>0)&&p.push({area:b,agents:C??[],buildings:v})}(a.length>0||r.length>0)&&p.push({area:{id:"__unassigned__",name:"Unassigned",color:"#6272a4",center:{x:0,z:0},type:"circle",radius:0,directories:[],archived:!1,assignedAgentIds:[],zIndex:0},agents:a,buildings:r});const m=p.filter(b=>b.area.id!=="__unassigned__"),x=p.filter(b=>b.area.id==="__unassigned__");let $=1,S=1;const Be=new Map;if(m.length>1){let b=1/0,C=-1/0,v=1/0,K=-1/0;for(const y of m)b=Math.min(b,y.area.center.x),C=Math.max(C,y.area.center.x),v=Math.min(v,y.area.center.z),K=Math.max(K,y.area.center.z);const tt=C-b||1,at=K-v||1;if(m.length<=4){$=m.length,S=1;const y=[...m].sort((M,gt)=>M.area.center.x-gt.area.center.x);for(let M=0;M<y.length;M++)Be.set(y[M].area.id,{row:1,col:M+1})}else{const y=[...m].sort((w,k)=>w.area.center.x-k.area.center.x),M=[];for(let w=1;w<y.length;w++)M.push(y[w].area.center.x-y[w-1].area.center.x);const gt=M.reduce((w,k)=>w+k,0)/M.length||1;let Ct=1;for(const w of M)w>gt*1.3&&Ct++;$=Math.max(2,Math.min(Ct,m.length));const bt=[...m].sort((w,k)=>w.area.center.z-k.area.center.z),nt=[];for(let w=1;w<bt.length;w++)nt.push(bt[w].area.center.z-bt[w-1].area.center.z);const Wt=nt.reduce((w,k)=>w+k,0)/nt.length||1;let jt=1;for(const w of nt)w>Wt*1.3&&jt++;S=Math.max(2,Math.min(jt,m.length)),$=Math.max($,Math.ceil(m.length/S)),S=Math.max(S,Math.ceil(m.length/$));const Ht=tt/$,Gt=at/S,xt=new Set;for(const w of m){let k=Math.min($-1,Math.max(0,Math.floor((w.area.center.x-b)/Ht))),fe=Math.min(S-1,Math.max(0,Math.floor((w.area.center.z-v)/Gt))),Fe=`${fe},${k}`,vt=0;const Vt=S*$;for(;xt.has(Fe)&&vt<Vt;)k++,k>=$&&(k=0,fe=(fe+1)%S),Fe=`${fe},${k}`,vt++;xt.has(Fe)&&(fe=S,k=0,Fe=`${fe},${k}`,S++),xt.add(Fe),Be.set(w.area.id,{row:fe+1,col:k+1})}}}const me=b=>{b.sort((C,v)=>{var tt,at,y,M;const K=(((tt=C.position)==null?void 0:tt.z)??0)-(((at=v.position)==null?void 0:at.z)??0);return K!==0?K:(((y=C.position)==null?void 0:y.x)??0)-(((M=v.position)==null?void 0:M.x)??0)})};for(const b of m)me(b.agents);for(const b of x)me(b.agents);return{groups:[...m,...x],gridCols:$,gridRows:S,positions:Be}},[T,ht,et,$t]),Ot=n.useMemo(()=>{if(!P)return[];const t=T.find(a=>a.id===P.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:()=>{se({agentId:t.id,name:t.name})}}]:[]},[P,T,_]),Bt=n.useMemo(()=>{var m;if(!G)return[];const t=et.get(G.buildingId);if(!t)return[];const a=[],l=t.type==="server"||t.type==="docker"||t.type==="terminal",r=t.status==="running",p=t.type==="boss";if(a.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"&&((m=t.pm2)!=null&&m.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:()=>de(t.id)}),l&&(r||a.push({id:"start",label:"Start",icon:e.jsx(u,{name:"play",size:14}),onClick:()=>f.sendBuildingCommand(t.id,"start")}),r&&(a.push({id:"restart",label:"Restart",icon:e.jsx(u,{name:"refresh",size:14}),onClick:()=>f.sendBuildingCommand(t.id,"restart")}),a.push({id:"stop",label:"Stop",icon:e.jsx(u,{name:"stop",size:14}),onClick:()=>f.sendBuildingCommand(t.id,"stop")}))),p&&t.subordinateBuildingIds&&t.subordinateBuildingIds.length>0&&(a.push({id:"start-all",label:"Start All Subordinates",icon:e.jsx(u,{name:"launch",size:14}),onClick:()=>{for(const x of t.subordinateBuildingIds)f.sendBuildingCommand(x,"start")}}),a.push({id:"stop-all",label:"Stop All Subordinates",icon:e.jsx(u,{name:"pause",size:14}),onClick:()=>{for(const x of t.subordinateBuildingIds)f.sendBuildingCommand(x,"stop")}}),a.push({id:"restart-all",label:"Restart All Subordinates",icon:e.jsx(u,{name:"restart",size:14}),onClick:()=>{for(const x of t.subordinateBuildingIds)f.sendBuildingCommand(x,"restart")}})),l&&a.push({id:"health-check",label:"Health Check",icon:e.jsx(u,{name:"health",size:14}),onClick:()=>f.sendBuildingCommand(t.id,"healthCheck")}),a.push({id:"divider-edit",label:"",divider:!0,onClick:()=>{}}),a.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}}))}}),a.push({id:"clone",label:"Clone Building",icon:e.jsx(u,{name:"copy",size:14}),onClick:()=>{f.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 x of t.urls)a.push({id:`url-${x.label}`,label:x.label,icon:e.jsx(u,{name:"link",size:14}),onClick:()=>window.open(x.url,"_blank","noopener,noreferrer")});return a.push({id:"divider-danger",label:"",divider:!0,onClick:()=>{}}),a.push({id:"delete",label:"Delete Building",icon:e.jsx(u,{name:"trash",size:14}),danger:!0,onClick:()=>f.deleteBuilding(t.id)}),a},[G,et,de]),Ft=n.useCallback(t=>{const a=new Set(Ie.groups.map(l=>l.area.id));a.delete(t),Oe(a),requestAnimationFrame(()=>{const l=D.current;if(!l)return;const r=l.querySelector(`[data-area-id="${t}"]`);if(!r)return;const p=l.getBoundingClientRect(),x=r.getBoundingClientRect().top-p.top+l.scrollTop-8;l.scrollTo({top:Math.max(0,x),behavior:"smooth"})})},[Ie]);return e.jsxs("div",{ref:J,className:`flat-view ${ke?"flat-view--with-inspector":""} ${g?"flat-view--has-chat":""} ${we?"flat-view--mobile-sidebar-open":""}`,style:(()=>{if(F===null&&W===null)return;const t={};return F!==null&&(t["--flat-middle-width"]=`${F}px`),W!==null&&(t["--flat-inspector-width"]=`${W}px`),t})(),children:[we&&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:B,title:"Create new agent",children:"+ Agent"}),e.jsx("button",{className:"flat-cta-btn flat-cta-btn--boss",onClick:he,title:"Create new boss agent",children:"+ Boss"}),e.jsx("button",{className:"flat-cta-btn flat-cta-btn--area",onClick:ne,title:"Create new area",children:"+ Area"})]})}),e.jsx("div",{className:"flat-middle__content",children:e.jsx(Zt,{activeAgentId:Ne,onClose:mt,onSelectAgent:ft,collapsedAreas:I,onToggleArea:Lt,agentListRef:D})})]}),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:re,onPointerMove:Q,onPointerUp:ie,onPointerCancel:ie,onDoubleClick:ot}),e.jsxs("div",{className:"flat-right",children:[e.jsxs("button",{type:"button",className:"flat-mobile-sidebar-toggle","aria-label":we?"Close agents sidebar":"Open agents sidebar","aria-expanded":we,onClick:it,children:[e.jsx(u,{name:"list",size:18}),e.jsx("span",{className:"flat-mobile-sidebar-toggle__label",children:"Agents"})]}),g?e.jsx(za,{agentId:g,terminalViewMode:Ve,onTerminalViewModeChange:_e,inspectorOpen:ze,onToggleInspector:ut,onImageClick:ee,onFileClick:X,onBashClick:Re,onViewMarkdown:Ke,onRequestClearSubordinates:Ye,onOpenBuilding:de,keyboard:ce,canNavigateBack:Ze,canNavigateForward:Je,onNavigateBack:c,onNavigateForward:o,agentInfoOpen:xe,onToggleAgentInfo:Te}):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("div",{className:"flat-map__grid",style:{gridTemplateColumns:`repeat(${Ie.gridCols}, 1fr)`},children:Ie.groups.length===0?e.jsx("div",{className:"flat-map__empty",children:e.jsx("span",{children:"No areas or agents yet"})}):Ie.groups.map(t=>{const a=t.area.id,l=Ie.positions.get(a);return e.jsxs("div",{className:"flat-map-area-card",style:{"--area-color":t.area.color,gridRow:l==null?void 0:l.row,gridColumn:l==null?void 0:l.col},children:[e.jsxs("button",{type:"button",className:"flat-map-area-card__header",onClick:()=>Ft(a),title:`Focus ${t.area.name} in left panel`,children:[e.jsx("span",{className:"flat-map-area-card__color",style:{background:t.area.color}}),e.jsx("span",{className:"flat-map-area-card__name",children:t.area.name}),e.jsx("span",{className:"flat-map-area-card__count",children:t.agents.length})]}),e.jsx("div",{className:"flat-map-area-card__agents",children:t.agents.map(r=>{const p=r.isBoss||r.class==="boss",m=p?Qe.get(r.id):void 0,x=Jt(r),$=x.usedPercent>=80?"#ff4a4a":x.usedPercent>=60?"#ff9e4a":x.usedPercent>=40?"#ffd700":"#4aff9e",S=`Context: ${(x.totalTokens/1e3).toFixed(1)}k / ${(x.contextWindow/1e3).toFixed(1)}k (${x.usedPercent}% used, ${x.freePercent}% free)`,Be=r.latestTodos&&r.latestTodos.length>0||m&&m.length>0;return e.jsx(Qt,{todos:r.latestTodos,subordinates:m,position:"top",children:e.jsxs("button",{type:"button",className:`flat-map-agent-chip ${r.status}`,onClick:()=>_(r.id),onContextMenu:me=>{me.preventDefault(),me.stopPropagation(),be({agentId:r.id,position:{x:me.clientX,y:me.clientY}})},title:Be?void 0:`${p?"Boss · ":""}Open chat with ${r.name}
|
|
1
|
+
import{u as Xt,z as Ut,B as qt,r as n,E as Nt,S as j,G as kt,H as wt,J as It,K as st,L as Ae,M as Kt,s as f,N as Pt,O as zt,P as Yt,v as At,w as St,j as e,I as u,U as Zt,m as Jt,V as Qt,W as Dt,X as Rt,Y as ea,Z as ta,_ as aa,$ as na,a0 as sa,a1 as la,a2 as ra,a3 as ia,a4 as oa,a5 as ca,a6 as yt,C as da,a7 as ua,a8 as pa,a9 as ma,aa as fa,ab as ha,ac as ga,ad as ba,ae as xa,af as _a,ag as wa,ah as Ca,ai as ja,aj as va,ak as Na,al as ka,am as Ia}from"./main-CHfGSVnw.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";const lt=3,rt=280,Mt=320,_t=240,Et=64,Aa=["simple","chat","advanced"],Sa={simple:"Simple",chat:"Chat",advanced:"Advanced"},ya={simple:"○",chat:"◐",advanced:"◉"},Ma={simple:"Simple view — clean messages only",chat:"Chat view — assistant replies (no tool calls)",advanced:"Advanced view — everything including tools"},Tt="flat-clear-context";function Ea(_){const d=_.split("/").filter(Boolean);return d.length===0?_:d.slice(-2).join("/")}function Ta(_){if(_.provider==="codex"){const he=_.codexModel||"gpt-5.3-codex",ne=Na[he];return{model:(ne==null?void 0:ne.label)||he}}if(_.provider==="opencode")return{model:_.opencodeModel||"opencode"};const d=_.model||"sonnet",N=Ia[d],E=_.effort,B=E?ka[E]:void 0;return{model:(N==null?void 0:N.label)||d,effort:B==null?void 0:B.label}}function Pa(_,d){if(d.type==="rectangle"&&d.width&&d.height){const N=d.width/2,E=d.height/2;return _.x>=d.center.x-N&&_.x<=d.center.x+N&&_.z>=d.center.z-E&&_.z<=d.center.z+E}if(d.type==="circle"&&d.radius){const N=_.x-d.center.x,E=_.z-d.center.z;return N*N+E*E<=d.radius*d.radius}return!1}const za=ua.memo(function({agentId:d,terminalViewMode:N,onTerminalViewModeChange:E,inspectorOpen:B,onToggleInspector:he,onImageClick:ne,onFileClick:ge,onBashClick:T,onViewMarkdown:Se,onRequestClearSubordinates:ye,onOpenBuilding:Me,keyboard:We,canNavigateBack:He,canNavigateForward:Ee,onNavigateBack:Y,onNavigateForward:P,agentInfoOpen:be,onToggleAgentInfo:G}){var te,ve,q,Qe;const h=pa(d),A=zt(),se=n.useRef(null),xe=n.useRef(null);n.useEffect(()=>{const s=xe.current;if(!s)return;const i=o=>{o.button===3?(o.preventDefault(),o.stopPropagation(),Y()):o.button===4&&(o.preventDefault(),o.stopPropagation(),P())},c=o=>{(o.button===3||o.button===4)&&o.preventDefault()};return s.addEventListener("mouseup",i),s.addEventListener("mousedown",c),()=>{s.removeEventListener("mouseup",i),s.removeEventListener("mousedown",c)}},[Y,P]),n.useEffect(()=>{const s=xe.current;if(!s)return;let i=0,c=0,o=0;const ae=250,pe=600,Ne=80,mt=1.5,ft=D=>{let I=D instanceof HTMLElement?D:null;for(;I&&I!==s;){const Oe=window.getComputedStyle(I).overflowX;if((Oe==="auto"||Oe==="scroll")&&I.scrollWidth>I.clientWidth)return!0;I=I.parentElement}return!1},ke=D=>{const I=Date.now();if(I<o){D.preventDefault();return}if(Math.abs(D.deltaX)<=Math.abs(D.deltaY)*mt){i=0;return}if(ft(D.target)){i=0;return}I-c>ae&&(i=0),c=I,i+=D.deltaX,i<=-Ne?(i=0,o=I+pe,D.preventDefault(),Y()):i>=Ne&&(i=0,o=I+pe,D.preventDefault(),P())};return s.addEventListener("wheel",ke,{passive:!1}),()=>s.removeEventListener("wheel",ke)},[Y,P]);const le=Pt(),Te=n.useMemo(()=>{if(!h)return null;const s=new Set,i=[];for(const c of le.values())c.archived||c.directories.length===0||c.assignedAgentIds.includes(d)&&(s.add(c.id),i.push(c));for(const c of le.values())c.archived||c.directories.length===0||s.has(c.id)||Pa({x:h.position.x,z:h.position.z},c)&&(s.add(c.id),i.push(c));return i.length===0?null:i.flatMap(c=>c.directories.filter(o=>o&&o.trim().length>0).map(o=>({areaId:c.id,areaName:c.name,dir:o})))},[h,d,le]),{branches:Ge,fetchRemote:Ve,fetchingDirs:Pe}=ma(Te),_e=n.useMemo(()=>{var c;const s=f.getAreaForAgent(d);if(!s)return[];const i=[];for(const o of A.values())o.type==="terminal"&&f.isPositionInArea(o.position,s)&&i.push({id:o.id,name:o.name,hasUrl:!!((c=o.terminalStatus)!=null&&c.url)});return i},[d,A]),ze=n.useMemo(()=>{var c;const s=f.getAreaForAgent(d);if(!s)return[];const i=[];for(const o of A.values())o.type==="server"&&((c=o.pm2)!=null&&c.enabled)&&f.isPositionInArea(o.position,s)&&i.push({id:o.id,name:o.name});return i},[d,A]),De=n.useMemo(()=>{const s=f.getAreaForAgent(d);if(!s)return[];const i=[];for(const c of A.values())c.type==="database"&&c.database&&f.isPositionInArea(c.position,s)&&i.push({id:c.id,name:c.name});return i},[d,A]),[,we]=n.useReducer(s=>s+1,0),Z=((te=se.current)==null?void 0:te.search.searchMode)??!1,it=n.useCallback(()=>{var s;(s=se.current)==null||s.search.toggleSearch(),we()},[]),Xe=fa(),J=Xe.isPending(Tt),[R,F]=n.useState(null),O=R?A.get(R):null,{height:W,onResizeStart:Ce}=ha(),[L,V]=n.useState(()=>wt(j.GIT_PANEL_OPEN,!1)),[re,Ue]=n.useState(()=>wt(j.BUILDINGS_PANEL_OPEN,!1)),[Q,ie]=n.useState(!1),ot=n.useCallback(()=>{ie(s=>{const i=!s;return i&&ga.setEnabled(!0),i})},[]),ct=n.useCallback(()=>ie(!1),[]),oe=n.useCallback(()=>{V(s=>{const i=!s;return Ae(j.GIT_PANEL_OPEN,i),i})},[]),dt=n.useCallback(()=>{Ue(s=>{const i=!s;return Ae(j.BUILDINGS_PANEL_OPEN,i),i})},[]),qe=n.useCallback(()=>{V(!1),Ae(j.GIT_PANEL_OPEN,!1)},[]),ut=n.useCallback(()=>{Ue(!1),Ae(j.BUILDINGS_PANEL_OPEN,!1)},[]),pt=ba();n.useEffect(()=>{if(!R)return;_e.some(i=>i.id===R)||F(null)},[R,_e]);const[ce,ee]=n.useState(!1),Re=n.useRef(null);if(n.useEffect(()=>{if(!ce)return;const s=i=>{Re.current&&!Re.current.contains(i.target)&&ee(!1)};return document.addEventListener("mousedown",s),()=>document.removeEventListener("mousedown",s)},[ce]),!h)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 X=h.contextStats,Ke=!!X,Ye=X?X.totalTokens:h.contextUsed||0,de=X?X.contextWindow:h.contextLimit||2e5,g=X?X.usedPercent:Math.round(Ye/de*100),z=Math.max(0,Math.min(100,g)),H=Math.max(0,100-z),ue=z>=80?"#ff4a4a":z>=60?"#ff9e4a":z>=40?"#ffd700":"#4aff9e",Le=(Ye/1e3).toFixed(1),Ze=(de/1e3).toFixed(1),U=h.cwd,Je=U?Ea(U):null,je=((ve=h.subordinateIds)==null?void 0:ve.length)||0,$e=je>0;return e.jsxs("div",{ref:xe,className:`flat-terminal-wrapper ${L||re||Q?"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 ${be?"flat-terminal-wrapper__header-main--active":""}`,onClick:G,title:be?"Hide agent info":"Show agent info","aria-pressed":be,children:[e.jsx(Dt,{agent:h,size:28}),e.jsxs("span",{className:"flat-terminal-wrapper__header-info",children:[e.jsx("span",{className:"flat-terminal-wrapper__header-name",children:h.name}),e.jsx("span",{className:"flat-terminal-wrapper__header-status",style:{color:Rt(h.status)},children:h.status})]}),h.taskLabel&&e.jsxs("span",{className:"flat-terminal-wrapper__header-task",title:h.taskLabel,children:["📋 ",h.taskLabel]}),e.jsxs("span",{className:"flat-terminal-wrapper__header-model",children:[e.jsx("img",{src:h.provider==="codex"?"/assets/codex.png":h.provider==="opencode"?"/assets/opencode.png":"/assets/claude.png",alt:h.provider,className:"flat-terminal-wrapper__header-provider-icon",title:h.provider==="codex"?"Codex Agent":h.provider==="opencode"?"OpenCode Agent":"Claude Agent"}),(()=>{const{model:s,effort:i}=Ta(h);return e.jsxs("span",{className:"flat-terminal-wrapper__header-model-chip",title:i?`Model: ${s} · Effort: ${i}`:`Model: ${s}`,children:[e.jsx("span",{className:"flat-terminal-wrapper__header-model-name",children:s}),i&&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:i})]})]})})()]})]}),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:Aa.map(s=>e.jsxs("button",{type:"button",className:`flat-terminal-wrapper__view-mode-btn ${N===s?"flat-terminal-wrapper__view-mode-btn--active":""}`,onClick:()=>E(s),title:Ma[s],"aria-pressed":N===s,children:[e.jsx("span",{className:"flat-terminal-wrapper__view-mode-icon","aria-hidden":"true",children:ya[s]}),e.jsx("span",{className:"flat-terminal-wrapper__view-mode-label",children:Sa[s]})]},s))}),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:Y,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:P,disabled:!Ee,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 ${Z?"flat-terminal-wrapper__action-btn--active":""}`,onClick:it,title:Z?"Close search":"Search messages","aria-pressed":Z,children:e.jsx(u,{name:Z?"cross":"search",size:14})}),e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn flat-terminal-wrapper__action-btn--danger ${J?"flat-terminal-wrapper__action-btn--confirm":""}`,onClick:()=>Xe.handleClick(Tt,()=>{var s;f.clearContext(d),(s=se.current)==null||s.historyLoader.clearHistory()}),title:J?"Click again to confirm clear context":"Clear context",children:e.jsx(u,{name:J?"question":"clear",size:14})}),e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${L?"flat-terminal-wrapper__action-btn--active":""}`,onClick:oe,title:L?"Hide git panel":"Show git changes","aria-pressed":L,children:e.jsx(u,{name:"git-branch",size:14})}),e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${re?"flat-terminal-wrapper__action-btn--active":""}`,onClick:dt,title:re?"Hide buildings panel":"Show area buildings","aria-pressed":re,children:e.jsx(u,{name:"buildings",size:14})}),e.jsxs("div",{className:"flat-terminal-wrapper__more",ref:Re,children:[e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${ce?"flat-terminal-wrapper__action-btn--active":""}`,onClick:()=>ee(s=>!s),title:"More actions","aria-expanded":ce,children:"⋮"}),ce&&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 ${Q?"flat-terminal-wrapper__more-item--active":""}`,onClick:()=>{ot(),ee(!1)},title:Q?"Hide Debug Panel":"Show Debug Panel",children:[e.jsx(u,{name:"bug",size:14}),e.jsx("span",{children:Q?"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:()=>{f.collapseContext(d),ee(!1)},disabled:h.status!=="idle",title:h.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"})]}),$e&&e.jsxs("button",{type:"button",role:"menuitem",className:"flat-terminal-wrapper__more-item flat-terminal-wrapper__more-item--danger",onClick:()=>{ye(d,je),ee(!1)},children:[e.jsx(u,{name:"crown",size:14}),e.jsxs("span",{children:["Clear ",je," subordinate",je===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:()=>{f.killAgent(d),ee(!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 ${B?"flat-terminal-wrapper__inspector-toggle--active":""}`,onClick:he,title:B?"Hide inspector panel":"Show inspector panel","aria-label":B?"Hide inspector panel":"Show inspector panel","aria-pressed":B,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:()=>f.deselectAll(),title:"Close chat","aria-label":"Close chat",children:e.jsx(u,{name:"cross",size:14})})]})]}),e.jsx(xa,{ref:se,agentId:d,agent:h,viewMode:N,isOpen:!0,onImageClick:ne,onFileClick:ge,onBashClick:T,onViewMarkdown:Se,keyboard:We,hasModalOpen:!1}),O&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"guake-bottom-terminal-resize",onMouseDown:Ce,role:"separator","aria-orientation":"horizontal","aria-label":"Resize embedded terminal"}),e.jsxs("div",{className:"flat-bottom-panel",role:"region","aria-label":`Embedded terminal: ${O.name}`,style:{height:W},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:O.name}),!((q=O.terminalStatus)!=null&&q.url)&&e.jsx("span",{className:"flat-bottom-panel__muted",children:"(starting...)"})]}),e.jsx("button",{type:"button",className:"flat-bottom-panel__close",onClick:()=>F(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=O.terminalStatus)!=null&&Qe.url?e.jsx(_a,{terminalUrl:O.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:[h.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"})]}),U&&Je&&e.jsxs("span",{className:"flat-terminal-wrapper__cwd",title:`Open in file explorer: ${U}`,"aria-label":`Open ${U} in file explorer`,role:"button",tabIndex:0,onClick:()=>f.openFileExplorer(U),onKeyDown:s=>{(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),f.openFileExplorer(U))},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})]}),Te&&Te.map(({areaId:s,areaName:i,dir:c})=>{const o=Ge.get(c),ae=Pe.has(c),pe=c.split("/").filter(Boolean).pop()||c;return e.jsxs("span",{className:"flat-terminal-wrapper__area-dir",title:`${i}: ${c}${o?` (${o.branch}${o.ahead?` ↑${o.ahead}`:""}${o.behind?` ↓${o.behind}`:""})`:""}`,onClick:()=>f.openFileExplorerForAreaFolder(s,c),children:[e.jsx(u,{name:"folder-open",size:12}),e.jsx("span",{className:"flat-terminal-wrapper__area-dir-name",children:pe}),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 ${ae?"flat-terminal-wrapper__area-fetch--fetching":""}`,title:"Git fetch",onClick:Ne=>{Ne.stopPropagation(),Ve(c)},children:e.jsx(u,{name:ae?"hourglass":"download",size:12})})]})]},`${s}:${c}`)}),e.jsxs("span",{className:"flat-terminal-wrapper__context",onClick:()=>f.setContextModalAgentId(d),title:Ke?`Context usage: ${Le}k / ${Ze}k tokens (${z}% 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:`${z}%`,backgroundColor:ue}})}),e.jsxs("span",{className:"flat-terminal-wrapper__context-tokens",style:{color:ue},children:[Le,"k/",Ze,"k"]}),e.jsxs("span",{className:"flat-terminal-wrapper__context-free",children:["(",H,"% 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"}),_e.length>0&&e.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area terminals",children:_e.map(s=>{const i=R===s.id;return e.jsx("button",{type:"button",className:`flat-terminal-wrapper__building-btn ${i?"flat-terminal-wrapper__building-btn--active":""} ${s.hasUrl?"":"flat-terminal-wrapper__building-btn--offline"}`,title:`${i?"Hide":"Show"} terminal: ${s.name}${s.hasUrl?"":" (starting...)"}`,onClick:()=>{if(i){F(null);return}s.hasUrl||f.sendBuildingCommand(s.id,"start"),F(s.id)},children:e.jsx(u,{name:"terminal",size:14})},s.id)})}),ze.length>0&&e.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area PM2 logs",children:ze.map(s=>e.jsx("button",{type:"button",className:"flat-terminal-wrapper__building-btn",title:`Open logs: ${s.name}`,onClick:()=>Me(s.id),children:e.jsx(u,{name:"scroll",size:14})},s.id))}),De.length>0&&e.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area databases",children:De.map(s=>e.jsx("button",{type:"button",className:"flat-terminal-wrapper__building-btn",title:`Open database: ${s.name}`,onClick:()=>Me(s.id),children:e.jsx(u,{name:"hard-drives",size:14})},s.id))}),e.jsx("div",{className:"flat-terminal-wrapper__theme",children:e.jsx(wa,{})})]}),L&&e.jsx(Ca,{agentId:d,agents:pt,onClose:qe,branchInfoMap:Ge,fetchRemote:Ve,fetchingDirs:Pe}),re&&e.jsx(ja,{agentId:d,onClose:ut}),Q&&e.jsx(va,{agentId:d,onClose:ct})]})});function $a({onAgentClick:_,onBuildingClick:d,onBuildingDoubleClick:N,onBuildingPopup:E,onOpenSpawnModal:B,onOpenBossSpawnModal:he,onOpenAreaModal:ne}){const{t:ge}=Xt(["common"]),T=Ut(),Se=qt(),[ye,Me]=n.useState(null),[We,He]=n.useState(null),[Ee,Y]=n.useState(null),[P,be]=n.useState(null),[G,h]=n.useState(null),[A,se]=n.useState(null),[xe,le]=n.useState(!1),Te=n.useCallback(()=>{le(t=>!t)},[]),Ge=n.useCallback(()=>{le(!1)},[]),[Ve,Pe]=n.useState(()=>{const t=Nt(j.VIEW_MODE);return t==="simple"||t==="chat"||t==="advanced"?t:"simple"}),_e=n.useCallback(t=>{Pe(t),kt(j.VIEW_MODE,t)},[]);n.useEffect(()=>{const t=a=>{if(a.key!==j.VIEW_MODE)return;const l=a.newValue;(l==="simple"||l==="chat"||l==="advanced")&&Pe(l)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)},[]);const[ze,De]=n.useState(()=>wt(j.FLAT_INSPECTOR_OPEN,!1)),[we,Z]=n.useState(!1),it=n.useCallback(()=>Z(t=>!t),[]),Xe=n.useCallback(()=>Z(!1),[]),J=n.useRef(null),R=n.useRef(null),[F,O]=n.useState(()=>{const t=It(j.FLAT_MIDDLE_WIDTH,0);return t>=rt?t:null}),[W,Ce]=n.useState(()=>{const t=It(j.FLAT_INSPECTOR_WIDTH,0);return t>=_t?t:null}),L=n.useCallback(t=>{if(typeof window>"u")return t;const a=W!==null?lt+W:0,l=window.innerWidth-Et-lt-Mt-a;return Math.max(rt,Math.min(Math.max(l,rt),t))},[W]),V=n.useCallback(t=>{var p;if(typeof window>"u")return t;const a=(p=J.current)==null?void 0:p.querySelector(".flat-middle"),l=(a==null?void 0:a.getBoundingClientRect().width)??rt,r=window.innerWidth-Et-l-lt-Mt-lt;return Math.max(_t,Math.min(Math.max(r,_t),t))},[]);n.useEffect(()=>{if(F===null&&W===null)return;const t=()=>{O(a=>{if(a===null)return a;const l=L(a);return l===a?a:l}),Ce(a=>{if(a===null)return a;const l=V(a);return l===a?a:l})};return window.addEventListener("resize",t),()=>window.removeEventListener("resize",t)},[F,W,L,V]);const re=n.useCallback(t=>{var l;if(t.button!==0)return;const a=(l=J.current)==null?void 0:l.querySelector(".flat-middle");a&&(t.currentTarget.setPointerCapture(t.pointerId),R.current={kind:"middle",startX:t.clientX,startWidth:a.getBoundingClientRect().width,pointerId:t.pointerId},document.body.classList.add("flat-splitter-dragging"))},[]),Ue=n.useCallback(t=>{var l;if(t.button!==0)return;const a=(l=J.current)==null?void 0:l.querySelector(".flat-inspector");a&&(t.currentTarget.setPointerCapture(t.pointerId),R.current={kind:"inspector",startX:t.clientX,startWidth:a.getBoundingClientRect().width,pointerId:t.pointerId},document.body.classList.add("flat-splitter-dragging"))},[]),Q=n.useCallback(t=>{const a=R.current;if(!a||t.pointerId!==a.pointerId)return;const l=t.clientX-a.startX;a.kind==="middle"?O(L(a.startWidth+l)):Ce(V(a.startWidth-l))},[L,V]),ie=n.useCallback(t=>{const a=R.current;if(!a||t.pointerId!==a.pointerId)return;try{t.currentTarget.releasePointerCapture(t.pointerId)}catch{}if(R.current=null,document.body.classList.remove("flat-splitter-dragging"),!(Math.abs(t.clientX-a.startX)>2))return;const r=t.clientX-a.startX;if(a.kind==="middle"){const p=L(a.startWidth+r);O(p),st(j.FLAT_MIDDLE_WIDTH,p)}else{const p=V(a.startWidth-r);Ce(p),st(j.FLAT_INSPECTOR_WIDTH,p)}},[L,V]),ot=n.useCallback(()=>{O(null),st(j.FLAT_MIDDLE_WIDTH,0)},[]),ct=n.useCallback(()=>{Ce(null),st(j.FLAT_INSPECTOR_WIDTH,0)},[]),[oe,dt]=n.useState(()=>Nt(j.FLAT_INSPECTOR_VIEW)==="tracking"?"tracking":"agent"),qe=n.useCallback(t=>{dt(t),kt(j.FLAT_INSPECTOR_VIEW,t)},[]),ut=n.useCallback(()=>{De(t=>{const a=!t;return Ae(j.FLAT_INSPECTOR_OPEN,a),a})},[]),pt=n.useCallback(()=>{De(!1),Ae(j.FLAT_INSPECTOR_OPEN,!1)},[]),ce=Kt(),ee=n.useCallback((t,a)=>{Me({url:t,name:a})},[]),Re=n.useCallback((t,a)=>{He({command:t,output:a,isLive:!1})},[]),X=n.useCallback((t,a)=>{f.setFileViewerPath(t,a)},[]),Ke=n.useCallback(t=>{},[]),Ye=n.useCallback((t,a)=>{Y({agentId:t,count:a})},[]),de=n.useCallback(t=>{N?N(t):d(t)},[d,N]),g=n.useMemo(()=>Se.size>0?Array.from(Se)[0]:null,[Se]);n.useEffect(()=>{le(!1)},[g]);const z=n.useRef([]),H=n.useRef(-1),ue=n.useRef(!1),Le=n.useRef(null),[Ze,U]=n.useState(!1),[Je,je]=n.useState(!1),$e=n.useRef(!1),te=n.useRef(null),ve=n.useRef(!1),q=n.useMemo(()=>new Set(T.map(t=>t.id)),[T]),Qe=n.useMemo(()=>{const t=new Map(T.map(l=>[l.id,l])),a=new Map;for(const l of T)if((l.isBoss||l.class==="boss")&&l.subordinateIds&&l.subordinateIds.length>0){const r=l.subordinateIds.map(p=>t.get(p)).filter(p=>p!==void 0);r.length>0&&a.set(l.id,r)}return a},[T]),s=n.useCallback(()=>{const t=z.current,a=H.current;U(a>0),je(a>=0&&a<t.length-1)},[]),i=n.useCallback(t=>{const a=z.current;if(a.length===0)return;let l=H.current+t;for(;l>=0&&l<a.length;){const r=a[l];if(q.has(r)){ue.current=!0,H.current=l,s(),f.selectAgent(r);return}l+=t}},[q,s]),c=n.useCallback(()=>i(-1),[i]),o=n.useCallback(()=>i(1),[i]),ae=n.useCallback((t,a)=>{if(typeof window>"u")return;const l=window.history.state,p={...typeof l=="object"&&l!==null?l:{},__flatAgentNav:{agentId:t}};a==="replace"?window.history.replaceState(p,"",window.location.href):window.history.pushState(p,"",window.location.href)},[]);n.useEffect(()=>{if(!g){$e.current=!1,te.current=null;return}if(!$e.current){ae(g,"replace"),$e.current=!0,te.current=g;return}if(ve.current){ve.current=!1,te.current=g;return}te.current!==g&&(ae(g,"push"),te.current=g)},[g,ae]),n.useEffect(()=>{const t=a=>{var m,x;const l=(x=(m=a.state)==null?void 0:m.__flatAgentNav)==null?void 0:x.agentId;if(!l||typeof l!="string"||!q.has(l)||l===g)return;ve.current=!0,ue.current=!0;const r=z.current,p=r.lastIndexOf(l);p>=0?H.current=p:(r.push(l),H.current=r.length-1),s(),f.selectAgent(l)};return window.addEventListener("popstate",t),()=>window.removeEventListener("popstate",t)},[q,g,s]),n.useEffect(()=>{if(!g){z.current=[],H.current=-1,s();return}if(Le.current=g,ue.current){ue.current=!1,s();return}const t=z.current,a=H.current;if(a>=0&&t[a]===g){s();return}const l=a<t.length-1?t.slice(0,a+1):t.slice();l.push(g),l.length>100&&l.shift(),z.current=l,H.current=l.length-1,s()},[g,s]);const pe=n.useCallback(t=>{_(t),Z(!1)},[_]),Ne=g??"",mt=n.useCallback(()=>{},[]),ft=n.useCallback(t=>{pe(t)},[pe]),ke=ze,D=n.useRef(null);n.useEffect(()=>{if(g)return;const t=a=>{if(a.key!==" "&&a.key!=="Backspace")return;const l=a.target;if(l.tagName==="INPUT"||l.tagName==="TEXTAREA"||l.isContentEditable)return;const r=Le.current;!r||!q.has(r)||(a.preventDefault(),f.selectAgent(r))};return document.addEventListener("keydown",t),()=>document.removeEventListener("keydown",t)},[g,q]);const[I,Oe]=n.useState(new Set),Lt=n.useCallback(t=>{Oe(a=>{const l=new Set(a);return l.has(t)?l.delete(t):l.add(t),l})},[]),ht=Pt(),et=zt(),[$t]=Yt(),Ie=n.useMemo(()=>{const t=new Map,a=[];for(const b of T){const C=f.getAreaForAgent(b.id);if(!At((C==null?void 0:C.id)??null))continue;if(!C||C.archived){a.push(b);continue}const v=t.get(C.id);v?v.push(b):t.set(C.id,[b])}const l=new Map,r=[];for(const b of et.values()){let C=!1;for(const v of ht.values())if(!v.archived&&St(v.id)&&f.isPositionInArea(b.position,v)){const K=l.get(v.id);K?K.push(b):l.set(v.id,[b]),C=!0;break}!C&&At(null)&&r.push(b)}const p=[];for(const[,b]of ht){if(b.archived||!St(b.id))continue;const C=t.get(b.id),v=l.get(b.id)??[];(C&&C.length>0||v.length>0)&&p.push({area:b,agents:C??[],buildings:v})}(a.length>0||r.length>0)&&p.push({area:{id:"__unassigned__",name:"Unassigned",color:"#6272a4",center:{x:0,z:0},type:"circle",radius:0,directories:[],archived:!1,assignedAgentIds:[],zIndex:0},agents:a,buildings:r});const m=p.filter(b=>b.area.id!=="__unassigned__"),x=p.filter(b=>b.area.id==="__unassigned__");let $=1,S=1;const Be=new Map;if(m.length>1){let b=1/0,C=-1/0,v=1/0,K=-1/0;for(const y of m)b=Math.min(b,y.area.center.x),C=Math.max(C,y.area.center.x),v=Math.min(v,y.area.center.z),K=Math.max(K,y.area.center.z);const tt=C-b||1,at=K-v||1;if(m.length<=4){$=m.length,S=1;const y=[...m].sort((M,gt)=>M.area.center.x-gt.area.center.x);for(let M=0;M<y.length;M++)Be.set(y[M].area.id,{row:1,col:M+1})}else{const y=[...m].sort((w,k)=>w.area.center.x-k.area.center.x),M=[];for(let w=1;w<y.length;w++)M.push(y[w].area.center.x-y[w-1].area.center.x);const gt=M.reduce((w,k)=>w+k,0)/M.length||1;let Ct=1;for(const w of M)w>gt*1.3&&Ct++;$=Math.max(2,Math.min(Ct,m.length));const bt=[...m].sort((w,k)=>w.area.center.z-k.area.center.z),nt=[];for(let w=1;w<bt.length;w++)nt.push(bt[w].area.center.z-bt[w-1].area.center.z);const Wt=nt.reduce((w,k)=>w+k,0)/nt.length||1;let jt=1;for(const w of nt)w>Wt*1.3&&jt++;S=Math.max(2,Math.min(jt,m.length)),$=Math.max($,Math.ceil(m.length/S)),S=Math.max(S,Math.ceil(m.length/$));const Ht=tt/$,Gt=at/S,xt=new Set;for(const w of m){let k=Math.min($-1,Math.max(0,Math.floor((w.area.center.x-b)/Ht))),fe=Math.min(S-1,Math.max(0,Math.floor((w.area.center.z-v)/Gt))),Fe=`${fe},${k}`,vt=0;const Vt=S*$;for(;xt.has(Fe)&&vt<Vt;)k++,k>=$&&(k=0,fe=(fe+1)%S),Fe=`${fe},${k}`,vt++;xt.has(Fe)&&(fe=S,k=0,Fe=`${fe},${k}`,S++),xt.add(Fe),Be.set(w.area.id,{row:fe+1,col:k+1})}}}const me=b=>{b.sort((C,v)=>{var tt,at,y,M;const K=(((tt=C.position)==null?void 0:tt.z)??0)-(((at=v.position)==null?void 0:at.z)??0);return K!==0?K:(((y=C.position)==null?void 0:y.x)??0)-(((M=v.position)==null?void 0:M.x)??0)})};for(const b of m)me(b.agents);for(const b of x)me(b.agents);return{groups:[...m,...x],gridCols:$,gridRows:S,positions:Be}},[T,ht,et,$t]),Ot=n.useMemo(()=>{if(!P)return[];const t=T.find(a=>a.id===P.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:()=>{se({agentId:t.id,name:t.name})}}]:[]},[P,T,_]),Bt=n.useMemo(()=>{var m;if(!G)return[];const t=et.get(G.buildingId);if(!t)return[];const a=[],l=t.type==="server"||t.type==="docker"||t.type==="terminal",r=t.status==="running",p=t.type==="boss";if(a.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"&&((m=t.pm2)!=null&&m.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:()=>de(t.id)}),l&&(r||a.push({id:"start",label:"Start",icon:e.jsx(u,{name:"play",size:14}),onClick:()=>f.sendBuildingCommand(t.id,"start")}),r&&(a.push({id:"restart",label:"Restart",icon:e.jsx(u,{name:"refresh",size:14}),onClick:()=>f.sendBuildingCommand(t.id,"restart")}),a.push({id:"stop",label:"Stop",icon:e.jsx(u,{name:"stop",size:14}),onClick:()=>f.sendBuildingCommand(t.id,"stop")}))),p&&t.subordinateBuildingIds&&t.subordinateBuildingIds.length>0&&(a.push({id:"start-all",label:"Start All Subordinates",icon:e.jsx(u,{name:"launch",size:14}),onClick:()=>{for(const x of t.subordinateBuildingIds)f.sendBuildingCommand(x,"start")}}),a.push({id:"stop-all",label:"Stop All Subordinates",icon:e.jsx(u,{name:"pause",size:14}),onClick:()=>{for(const x of t.subordinateBuildingIds)f.sendBuildingCommand(x,"stop")}}),a.push({id:"restart-all",label:"Restart All Subordinates",icon:e.jsx(u,{name:"restart",size:14}),onClick:()=>{for(const x of t.subordinateBuildingIds)f.sendBuildingCommand(x,"restart")}})),l&&a.push({id:"health-check",label:"Health Check",icon:e.jsx(u,{name:"health",size:14}),onClick:()=>f.sendBuildingCommand(t.id,"healthCheck")}),a.push({id:"divider-edit",label:"",divider:!0,onClick:()=>{}}),a.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}}))}}),a.push({id:"clone",label:"Clone Building",icon:e.jsx(u,{name:"copy",size:14}),onClick:()=>{f.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 x of t.urls)a.push({id:`url-${x.label}`,label:x.label,icon:e.jsx(u,{name:"link",size:14}),onClick:()=>window.open(x.url,"_blank","noopener,noreferrer")});return a.push({id:"divider-danger",label:"",divider:!0,onClick:()=>{}}),a.push({id:"delete",label:"Delete Building",icon:e.jsx(u,{name:"trash",size:14}),danger:!0,onClick:()=>f.deleteBuilding(t.id)}),a},[G,et,de]),Ft=n.useCallback(t=>{const a=new Set(Ie.groups.map(l=>l.area.id));a.delete(t),Oe(a),requestAnimationFrame(()=>{const l=D.current;if(!l)return;const r=l.querySelector(`[data-area-id="${t}"]`);if(!r)return;const p=l.getBoundingClientRect(),x=r.getBoundingClientRect().top-p.top+l.scrollTop-8;l.scrollTo({top:Math.max(0,x),behavior:"smooth"})})},[Ie]);return e.jsxs("div",{ref:J,className:`flat-view ${ke?"flat-view--with-inspector":""} ${g?"flat-view--has-chat":""} ${we?"flat-view--mobile-sidebar-open":""}`,style:(()=>{if(F===null&&W===null)return;const t={};return F!==null&&(t["--flat-middle-width"]=`${F}px`),W!==null&&(t["--flat-inspector-width"]=`${W}px`),t})(),children:[we&&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:B,title:"Create new agent",children:"+ Agent"}),e.jsx("button",{className:"flat-cta-btn flat-cta-btn--boss",onClick:he,title:"Create new boss agent",children:"+ Boss"}),e.jsx("button",{className:"flat-cta-btn flat-cta-btn--area",onClick:ne,title:"Create new area",children:"+ Area"})]})}),e.jsx("div",{className:"flat-middle__content",children:e.jsx(Zt,{activeAgentId:Ne,onClose:mt,onSelectAgent:ft,collapsedAreas:I,onToggleArea:Lt,agentListRef:D})})]}),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:re,onPointerMove:Q,onPointerUp:ie,onPointerCancel:ie,onDoubleClick:ot}),e.jsxs("div",{className:"flat-right",children:[e.jsxs("button",{type:"button",className:"flat-mobile-sidebar-toggle","aria-label":we?"Close agents sidebar":"Open agents sidebar","aria-expanded":we,onClick:it,children:[e.jsx(u,{name:"list",size:18}),e.jsx("span",{className:"flat-mobile-sidebar-toggle__label",children:"Agents"})]}),g?e.jsx(za,{agentId:g,terminalViewMode:Ve,onTerminalViewModeChange:_e,inspectorOpen:ze,onToggleInspector:ut,onImageClick:ee,onFileClick:X,onBashClick:Re,onViewMarkdown:Ke,onRequestClearSubordinates:Ye,onOpenBuilding:de,keyboard:ce,canNavigateBack:Ze,canNavigateForward:Je,onNavigateBack:c,onNavigateForward:o,agentInfoOpen:xe,onToggleAgentInfo:Te}):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("div",{className:"flat-map__grid",style:{gridTemplateColumns:`repeat(${Ie.gridCols}, 1fr)`},children:Ie.groups.length===0?e.jsx("div",{className:"flat-map__empty",children:e.jsx("span",{children:"No areas or agents yet"})}):Ie.groups.map(t=>{const a=t.area.id,l=Ie.positions.get(a);return e.jsxs("div",{className:"flat-map-area-card",style:{"--area-color":t.area.color,gridRow:l==null?void 0:l.row,gridColumn:l==null?void 0:l.col},children:[e.jsxs("button",{type:"button",className:"flat-map-area-card__header",onClick:()=>Ft(a),title:`Focus ${t.area.name} in left panel`,children:[e.jsx("span",{className:"flat-map-area-card__color",style:{background:t.area.color}}),e.jsx("span",{className:"flat-map-area-card__name",children:t.area.name}),e.jsx("span",{className:"flat-map-area-card__count",children:t.agents.length})]}),e.jsx("div",{className:"flat-map-area-card__agents",children:t.agents.map(r=>{const p=r.isBoss||r.class==="boss",m=p?Qe.get(r.id):void 0,x=Jt(r),$=x.usedPercent>=80?"#ff4a4a":x.usedPercent>=60?"#ff9e4a":x.usedPercent>=40?"#ffd700":"#4aff9e",S=`Context: ${(x.totalTokens/1e3).toFixed(1)}k / ${(x.contextWindow/1e3).toFixed(1)}k (${x.usedPercent}% used, ${x.freePercent}% free)`,Be=r.latestTodos&&r.latestTodos.length>0||m&&m.length>0;return e.jsx(Qt,{todos:r.latestTodos,subordinates:m,position:"top",children:e.jsxs("button",{type:"button",className:`flat-map-agent-chip ${r.status}`,onClick:()=>_(r.id),onContextMenu:me=>{me.preventDefault(),me.stopPropagation(),be({agentId:r.id,position:{x:me.clientX,y:me.clientY}})},title:Be?void 0:`${p?"Boss · ":""}Open chat with ${r.name}
|
|
2
2
|
${S}`,children:[e.jsx(Dt,{agent:r,size:16}),p&&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:r.name}),e.jsx("img",{src:r.provider==="codex"?"/assets/codex.png":r.provider==="opencode"?"/assets/opencode.png":"/assets/claude.png",alt:r.provider,className:"flat-map-agent-chip__provider-icon",title:r.provider==="codex"?"Codex Agent":r.provider==="opencode"?"OpenCode Agent":"Claude Agent"}),e.jsx("span",{className:"flat-map-agent-chip__dot",style:{backgroundColor:Rt(r.status)}}),r.latestTodos&&r.latestTodos.length>0&&e.jsx(ea,{todos:r.latestTodos,maxDots:6}),p&&m&&m.length>0&&e.jsx(ta,{subordinates:m,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:`${x.usedPercent}%`,backgroundColor:$}})})]})},r.id)})}),t.buildings.length>0&&e.jsx("div",{className:"flat-map-area-card__buildings",children:t.buildings.map(r=>e.jsxs("button",{type:"button",className:`flat-map-building-chip flat-map-building-chip--${r.status}`,onClick:p=>{if(E){const m=p.currentTarget.getBoundingClientRect();E(r.id,{x:m.right,y:m.top+m.height/2})}else de(r.id)},onContextMenu:p=>{p.preventDefault(),p.stopPropagation(),h({buildingId:r.id,position:{x:p.clientX,y:p.clientY}})},title:`${r.name} · ${r.type} · ${r.status}`,children:[e.jsx(u,{name:aa(r.type),size:12}),e.jsx("span",{className:"flat-map-building-chip__name",children:r.name}),e.jsx("span",{className:"flat-map-building-chip__dot",style:{backgroundColor:na(r.status)}})]},r.id))})]},a)})})]})})]}),ke&&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:Q,onPointerUp:ie,onPointerCancel:ie,onDoubleClick:ct}),ke&&e.jsxs("aside",{className:"flat-inspector","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":oe==="agent",className:`flat-inspector__tab ${oe==="agent"?"flat-inspector__tab--active":""}`,onClick:()=>qe("agent"),children:"Agent"}),e.jsx("button",{type:"button",role:"tab","aria-selected":oe==="tracking",className:`flat-inspector__tab ${oe==="tracking"?"flat-inspector__tab--active":""}`,onClick:()=>qe("tracking"),children:"Tracking"})]}),e.jsx("button",{type:"button",className:"flat-inspector__close",onClick:pt,title:"Close inspector","aria-label":"Close inspector",children:"✕"})]}),e.jsx("div",{className:"flat-inspector__body",children:oe==="tracking"?e.jsx(sa,{activeAgentId:g??"",onSelectAgent:t=>_(t)}):(()=>{if(!g)return e.jsx("div",{className:"flat-inspector__empty",children:e.jsx("span",{children:"Select an agent to inspect"})});const t=T.find(a=>a.id===g);return t?e.jsx(la,{agent:t,onFocusAgent:a=>_(a),onKillAgent:a=>f.killAgent(a)}):e.jsx("div",{className:"flat-inspector__empty",children:e.jsx("span",{children:"Agent not found"})})})()})]}),ye&&e.jsx(ra,{url:ye.url,name:ye.name,onClose:()=>Me(null)}),We&&e.jsx(ia,{state:We,onClose:()=>He(null)}),Ee&&e.jsx(oa,{action:"clear-subordinates",selectedAgentId:Ee.agentId,subordinateCount:Ee.count,onClose:()=>Y(null),onClearHistory:()=>{}}),e.jsx(ca,{agent:g?T.find(t=>t.id===g)??null:null,isOpen:xe&&!!g,onClose:Ge}),e.jsx(yt,{isOpen:P!==null,position:(P==null?void 0:P.position)??{x:0,y:0},worldPosition:{x:0,z:0},actions:Ot,onClose:()=>be(null)}),e.jsx(yt,{isOpen:G!==null,position:(G==null?void 0:G.position)??{x:0,y:0},worldPosition:{x:0,z:0},actions:Bt,onClose:()=>h(null)}),e.jsx(da,{isOpen:A!==null,title:ge("common:confirm.removeAgentTitle"),message:ge("common:confirm.removeAgentMessage",{name:(A==null?void 0:A.name)??""}),confirmLabel:ge("common:buttons.remove"),cancelLabel:ge("common:buttons.cancel"),variant:"danger",onConfirm:()=>{A&&f.removeAgentFromServer(A.agentId)},onClose:()=>se(null)})]})}export{$a as FlatView};
|