tide-commander 1.43.0 → 1.44.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-CnIyv0O7.js → BossLogsModal-CTo4Bbm7.js} +1 -1
- package/dist/assets/BossSpawnModal-DOk9u7EW.js +1 -0
- package/dist/assets/{ControlsModal-DJ6kwJQg.js → ControlsModal-BzBzF0Cw.js} +1 -1
- package/dist/assets/{DockerLogsModal-wLLPPw3N.js → DockerLogsModal-CrHd6OZ3.js} +1 -1
- package/dist/assets/{EmbeddedEditor-BZUBqqzE.js → EmbeddedEditor-h8IrAy4E.js} +1 -1
- package/dist/assets/{GmailOAuthSetup-DU-rYgPc.js → GmailOAuthSetup-io57q0N8.js} +1 -1
- package/dist/assets/{GoogleOAuthSetup-DUG794k5.js → GoogleOAuthSetup-YyNFVd9Y.js} +1 -1
- package/dist/assets/{IframeModal-BEaeYao1.js → IframeModal-DqmSDXCT.js} +1 -1
- package/dist/assets/{IntegrationsPanel-CrT3G7gD.js → IntegrationsPanel-DiW8UeG5.js} +2 -2
- package/dist/assets/{LogViewerModal-pmKvg2_3.js → LogViewerModal-CGW8yajP.js} +1 -1
- package/dist/assets/{MonitoringModal-BopLTYX0.js → MonitoringModal-BfsYrF1j.js} +1 -1
- package/dist/assets/{PM2LogsModal-akdCsnNY.js → PM2LogsModal-BJytXxKY.js} +1 -1
- package/dist/assets/{RestoreArchivedAreaModal-BAe0BLNN.js → RestoreArchivedAreaModal-CtRiwwzT.js} +1 -1
- package/dist/assets/{SaveSnapshotModal-CCK5ncy-.js → SaveSnapshotModal-BHBdh1dK.js} +1 -1
- package/dist/assets/{Scene2DCanvas-CTrNCLiT.js → Scene2DCanvas-BYUuUYur.js} +1 -1
- package/dist/assets/{SceneManager-WQvF4y8-.js → SceneManager-u4hiSYdk.js} +1 -1
- package/dist/assets/{SkillsPanel-BpY-jIMP.js → SkillsPanel-D4IHFehE.js} +1 -1
- package/dist/assets/{SnapshotManager-DlJQAEC-.js → SnapshotManager-Cys1dllC.js} +1 -1
- package/dist/assets/{SpawnModal-Ci_uvH1F.js → SpawnModal-DUK7X8ql.js} +1 -1
- package/dist/assets/{SubordinateAssignmentModal-kFDllrhg.js → SubordinateAssignmentModal-DeH34tA3.js} +1 -1
- package/dist/assets/{SupervisorPanel-CPyoCa6i.js → SupervisorPanel-D0c7Kkzt.js} +1 -1
- package/dist/assets/{TriggerManagerPanel-B7qEVCh4.js → TriggerManagerPanel-RsbYDmIC.js} +1 -1
- package/dist/assets/{WorkflowEditorPanel-D8FwpAyj.js → WorkflowEditorPanel-lpYmT8iN.js} +1 -1
- package/dist/assets/{index-M90uUgxL.js → index-BOY5J4U4.js} +1 -1
- package/dist/assets/{index-C5IJ99Dq.js → index-BQdQ0iv_.js} +1 -1
- package/dist/assets/{index-BWCjlz0C.js → index-BexCA27h.js} +3 -3
- package/dist/assets/{index-OOJWJ_4Z.js → index-BqPgrat9.js} +1 -1
- package/dist/assets/{index-CRD8TN18.js → index-C6GdsxBK.js} +1 -1
- package/dist/assets/{index-DkhEv4qN.js → index-CpwhIgf8.js} +1 -1
- package/dist/assets/{index-Bu3B9Eke.js → index-X9qZZBXG.js} +2 -2
- package/dist/assets/{index-CjH90tsj.js → index-t5WzFf-W.js} +1 -1
- package/dist/assets/{main-DB67UbmQ.js → main-CrRMpn-n.js} +56 -56
- package/dist/assets/main-DjGrMNoB.css +1 -0
- package/dist/assets/{web-DRj84zWD.js → web-D94DaG2N.js} +1 -1
- package/dist/assets/{web-D4vvRMYa.js → web-XswRIovf.js} +1 -1
- package/dist/index.html +2 -2
- package/dist/src/packages/server/data/index.js +40 -0
- package/dist/src/packages/server/index.js +2 -0
- package/dist/src/packages/server/routes/agents.js +33 -0
- package/dist/src/packages/server/services/agent-service.js +42 -2
- package/dist/src/packages/server/websocket/handler.js +3 -1
- package/dist/src/packages/server/websocket/handlers/agent-handler.js +45 -0
- package/package.json +1 -1
- package/dist/assets/BossSpawnModal-C5JHnXoV.js +0 -1
- package/dist/assets/main-Chjl2UXl.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z as ts,u as ns,B as _s,j as e,C as Is,E as Ms,G as Es,r as g,H as $s,I as Ds,J as Ss,K as Ls,s as Y,m as B}from"./main-DB67UbmQ.js";import"./modulepreload-polyfill-B5Qt9EMX.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";const Xs=1,gs=Xs*2.5;function Rs(s,v,d){const l=v.filter(o=>o.position&&!isNaN(o.position.x)&&!isNaN(o.position.z));let t,i,n,u;if(s.type==="rectangle"){const o=(s.width||10)/2,N=(s.height||10)/2;t=s.center.x-o,i=s.center.x+o,n=s.center.z-N,u=s.center.z+N}else{const o=s.radius||5;t=s.center.x-o,i=s.center.x+o,n=s.center.z-o,u=s.center.z+o}const b=2;if(t+=b,i-=b,n+=b,u-=b,d){const o={...d};if(o.x=Math.max(t,Math.min(i,o.x)),o.z=Math.max(n,Math.min(u,o.z)),fs(o,l,s))return o}const x=(t+i)/2,S=(n+u)/2,j=Math.min(i-x,u-S);for(let o=0;o<j;o+=gs*.5)for(let N=0;N<Math.PI*2;N+=Math.PI/8){const C=x+Math.cos(N)*o,E=S+Math.sin(N)*o,_={x:C,z:E};if(_.x=Math.max(t,Math.min(i,_.x)),_.z=Math.max(n,Math.min(u,_.z)),fs(_,l,s))return _}return{x,z:S}}function fs(s,v,d){for(const l of v){if(!l.position)continue;if(Math.hypot(s.x-l.position.x,s.z-l.position.z)<gs)return!1}if(d.type==="rectangle"){const l=(d.width||10)/2,t=(d.height||10)/2,i=s.x>=d.center.x-l+1&&s.x<=d.center.x+l-1,n=s.z>=d.center.z-t+1&&s.z<=d.center.z+t-1;return i&&n}else{const l=(d.radius||5)-1;return Math.hypot(s.x-d.center.x,s.z-d.center.z)<=l}}function vs(s){switch(s){case"idle":case"running":return"healthy";case"working":case"waiting":case"waiting_permission":case"starting":case"stopping":return"working";case"error":case"offline":case"orphaned":case"stopped":return"error";default:return"unknown"}}function Ps(s){switch(s){case"scout":return"🔍";case"builder":return"🔨";case"debugger":return"🐛";case"architect":return"📐";case"warrior":return"⚔️";case"support":return"🛟";case"boss":return"👑";default:return"🤖"}}function Us(s){switch(s){case"server":return"🖥️";case"link":return"🔗";case"database":return"🗄️";case"docker":return"🐳";case"monitor":return"📊";case"folder":return"📁";case"boss":return"🏰";default:return"🏢"}}function Ys(s,v){const d=[],l=new Set;for(const i of v.values()){if(i.archived)continue;const n=[];for(const u of i.assignedAgentIds){const b=s.get(u);b&&(n.push(b),l.add(u))}d.push({area:i,agents:n,label:i.name,color:i.color})}d.sort((i,n)=>i.label.localeCompare(n.label));const t=[];for(const i of s.values())l.has(i.id)||t.push(i);return t.length>0&&d.push({area:null,agents:t,label:"Unassigned",color:"#555"}),d}function Gs(s,v){const d=[],l=[],t=[];for(const n of s.values())n.status==="working"||n.status==="waiting"||n.status==="waiting_permission"?d.push(n):n.status==="error"||n.status==="offline"||n.status==="orphaned"?t.push(n):v&&v.has(n.id)?d.push(n):l.push(n);const i=[];return t.length>0&&i.push({area:null,agents:t,label:"Errors",color:"#d64545"}),d.length>0&&i.push({area:null,agents:d,label:"Working & Unseen",color:"#f5d76e"}),l.length>0&&i.push({area:null,agents:l,label:"Idle",color:"#5cb88a"}),i}function Hs(s){const v=Date.now(),l=[...Array.from(s.values())].sort((o,N)=>(N.lastActivity||0)-(o.lastActivity||0)),t=[],i=[],n=[],u=[],b=300*1e3,x=3600*1e3,S=1440*60*1e3;for(const o of l){const N=v-(o.lastActivity||0);N<b?t.push(o):N<x?i.push(o):N<S?n.push(o):u.push(o)}const j=[];return t.length>0&&j.push({area:null,agents:t,label:"Just Now (< 5m)",color:"#4ade80"}),i.length>0&&j.push({area:null,agents:i,label:"Recent (5m - 1h)",color:"#60a5fa"}),n.length>0&&j.push({area:null,agents:n,label:"Stale (1h - 1d)",color:"#facc15"}),u.length>0&&j.push({area:null,agents:u,label:"Very Stale (> 1d)",color:"#f87171"}),j}function Zs(s){return s.contextLimit<=0?0:Math.round(s.contextUsed/s.contextLimit*100)}function Bs(s){return s>=80?"red":s>=50?"yellow":"green"}function ms(s){return as(s)}function as(s,v={}){const{prioritizeRecentlyIdle:d=!1}=v;return[...s].sort((l,t)=>{const i={error:0,offline:0,orphaned:0,working:1,waiting:1,waiting_permission:1,idle:2},n=i[l.status]??3,u=i[t.status]??3;if(n!==u)return n-u;if(d&&l.status==="idle"&&t.status==="idle"){const b=!!l.taskLabel,x=!!t.taskLabel;return b!==x?b?-1:1:(t.lastActivity||0)-(l.lastActivity||0)}return l.name.localeCompare(t.name)})}const bs=ts.memo(({agent:s,isSelected:v,isKeyboardFocused:d=!1,onSelect:l,onDoubleClick:t,onChat:i,onFocus:n,onKill:u,onDragStart:b})=>{const{t:x}=ns(["dashboard","common"]),j=_s().has(s.id),o=vs(s.status),N=Ps(s.class),C=Zs(s),E=Bs(C),_=s.taskLabel?`📋 ${s.taskLabel}`:s.currentTask||s.lastAssignedTask,X=s.status==="idle"&&s.lastActivity>0,[,F]=ts.useState(0);return ts.useEffect(()=>{if(!X)return;const z=window.setInterval(()=>F(I=>I+1),15e3);return()=>window.clearInterval(z)},[X]),e.jsxs("div",{className:`dash-card dash-card--${o} ${v?"dash-card--selected":""} ${d?"dash-card--keyboard-focused":""}`,"data-agent-id":s.id,onClick:l,onDoubleClick:z=>{z.stopPropagation(),t()},onDragStart:z=>{b==null||b(s),z.dataTransfer.effectAllowed="move"},draggable:!0,title:x("cards.doubleClickHint"),children:[e.jsxs("div",{className:"dash-card__row1",children:[e.jsx("span",{className:`dash-card__status-dot dash-card__status-dot--${o}`}),e.jsx("span",{className:"dash-card__name",children:s.name}),e.jsxs("span",{className:"dash-card__class",children:[N," ",s.class]}),e.jsxs("span",{className:`dash-card__provider dash-card__provider--${s.provider}`,children:[s.provider==="codex"?"🔸":s.provider==="opencode"?"🟢":"🤖"," ",s.provider]}),j&&e.jsx("span",{className:"dash-card__unseen-badge",title:"New output available - click to view",children:"!"})]}),e.jsxs("div",{className:"dash-card__row2",children:[e.jsx("span",{className:`dash-card__status dash-card__status--${o}`,children:j?"Unseen":s.status}),e.jsxs("div",{className:"dash-card__context",children:[e.jsx("div",{className:"dash-card__context-bar",children:e.jsx("div",{className:`dash-card__context-fill dash-card__context-fill--${E}`,style:{width:`${C}%`}})}),e.jsxs("span",{className:`dash-card__context-pct dash-card__context-pct--${E}`,children:[C,"%"]})]})]}),e.jsxs("div",{className:"dash-card__row3",children:[e.jsxs("span",{className:"dash-card__workdir",title:s.cwd,children:["📁 ",s.cwd.split("/").pop()||s.cwd]}),X&&e.jsxs("span",{className:"dash-card__idle-time",style:{color:Es(s.lastActivity)},title:Ms(s.lastActivity),children:["⏱ ",Is(s.lastActivity)]})]}),_&&e.jsx("div",{className:"dash-card__row4",children:e.jsx("span",{className:"dash-card__task",children:_})}),e.jsxs("div",{className:"dash-card__actions",children:[i&&e.jsx("button",{className:"dash-card__action-btn dash-card__action-btn--chat",onClick:z=>{z.stopPropagation(),i()},title:x("cards.openTerminal"),children:x("cards.chat")}),u&&e.jsx("button",{className:"dash-card__action-btn dash-card__action-btn--danger",onClick:z=>{z.stopPropagation(),u()},title:x("cards.killAgent"),children:x("cards.stop")})]})]})});bs.displayName="AgentCard";const ps=({buildings:s,onSelectBuilding:v})=>{const{t:d}=ns(["dashboard"]),l=g.useMemo(()=>Array.from(s.values()).sort((t,i)=>t.name.localeCompare(i.name)),[s]);return e.jsxs("div",{className:"dashboard-view__buildings",children:[e.jsxs("div",{className:"dashboard-view__buildings-header",children:[e.jsx("span",{className:"dashboard-view__buildings-title",children:d("buildings.title")}),e.jsx("span",{className:"dashboard-view__buildings-count",children:l.length})]}),e.jsx("div",{className:"dashboard-view__buildings-row",children:l.map(t=>{const i=vs(t.status),n=Us(t.type);return e.jsxs("button",{className:`dash-pill dash-pill--${i}`,onClick:()=>v==null?void 0:v(t.id),title:`${t.name} (${t.type}) - ${t.status}`,children:[e.jsx("span",{className:"dash-pill__icon",children:n}),e.jsx("span",{className:"dash-pill__name",children:t.name}),e.jsx("span",{className:`dash-pill__dot dash-pill__dot--${i}`})]},t.id)})})]})};ps.displayName="BuildingPills";function Ks({onSelectAgent:s,onFocusAgent:v,onKillAgent:d,onSelectBuilding:l,onOpenTerminal:t,onFocusZone:i}){const{t:n}=ns(["dashboard","common"]),u=$s(),b=Ds(),x=Ss(),S=Ls(),j=_s(),[o,N]=g.useState(""),[C,E]=g.useState("all"),[_,X]=g.useState("zone"),[F,z]=g.useState(new Set),[I,J]=g.useState(null),[ws,V]=g.useState(null),[G,Q]=g.useState(!1),[M,T]=g.useState(null),W=g.useMemo(()=>{const a=Array.from(u.values());return{total:a.length,working:a.filter(h=>h.status==="working"||h.status==="waiting"||h.status==="waiting_permission").length,idle:a.filter(h=>h.status==="idle").length,error:a.filter(h=>h.status==="error"||h.status==="offline"||h.status==="orphaned").length}},[u]),rs=g.useMemo(()=>_==="zone"?Ys(u,x):_==="status"?Gs(u,j):Hs(u),[u,x,_,j]),K=g.useMemo(()=>{const a=o.toLowerCase().trim(),h=rs.map(p=>({...p,agents:p.agents.filter(k=>{if(C==="working"){if(k.status!=="working"&&k.status!=="waiting"&&k.status!=="waiting_permission")return!1}else if(C==="error"&&k.status!=="error"&&k.status!=="offline"&&k.status!=="orphaned")return!1;return!(a&&!k.name.toLowerCase().includes(a)&&!k.class.toLowerCase().includes(a))})}));return _==="zone"?h:h.filter(p=>p.agents.length>0)},[rs,C,o,_]),O=g.useCallback(a=>a.area?`area:${a.area.id}`:`${_}:${a.label}`,[_]),$=g.useMemo(()=>{const a=[];return K.forEach(h=>{const p=O(h);if(F.has(p))return;const k=_==="status"?as(h.agents,{prioritizeRecentlyIdle:!0}):ms(h.agents);a.push(...k)}),a},[K,F,_,O]),xs=g.useCallback(a=>{z(h=>{const p=new Set(h);return p.has(a)?p.delete(a):p.add(a),p})},[]),Ns=g.useCallback(a=>{t==null||t(a)},[t]),ks=g.useCallback(a=>{J(a)},[]),js=g.useCallback((a,h)=>{a.preventDefault(),a.dataTransfer.dropEffect="move",V(h)},[]),ys=g.useCallback(()=>{V(null)},[]),Cs=g.useCallback(a=>{if(!I)return;if(a===null){const R=Y.getState(),r=Array.from(R.areas.values()).find(c=>c.assignedAgentIds.includes(I.id));r&&Y.unassignAgentFromArea(I.id,r.id),J(null),V(null);return}const h=x.get(a);if(!h)return;const p=Array.from(u.values()),k=Rs(h,p,I.position);Y.updateAgent({...I,position:{...I.position,x:k.x,z:k.z}}),Y.assignAgentToArea(I.id,a),J(null),V(null)},[I,x,u]);return g.useEffect(()=>{if($.length===0){Q(!1),T(null);return}G&&(!M||!$.some(a=>a.id===M))&&(T($[0].id),s==null||s($[0].id))},[$,G,M,s]),g.useEffect(()=>{const a=r=>r instanceof HTMLElement?r.tagName==="INPUT"||r.tagName==="TEXTAREA"||r.tagName==="SELECT"||r.isContentEditable:!1,h=r=>r instanceof HTMLElement?!!r.closest(".guake-terminal")||r.classList.contains("guake-input")||r.classList.contains("agent-panel-input"):!1,p=r=>{const c=Array.from(document.querySelectorAll(".dash-card[data-agent-id]")).find(L=>L.dataset.agentId===r);c==null||c.scrollIntoView({block:"nearest",inline:"nearest"})},k=(r,c)=>{var os,cs,ds,ls,us,hs;const L=Array.from(document.querySelectorAll(".dash-card[data-agent-id]")).map(f=>{const w=f.dataset.agentId;if(!w)return null;const D=f.getBoundingClientRect();return{id:w,centerX:D.left+D.width/2,centerY:D.top+D.height/2,height:D.height}}).filter(f=>f!==null).sort((f,w)=>f.centerY-w.centerY||f.centerX-w.centerX);if(L.length===0)return r;const ss=L.reduce((f,w)=>f+w.height,0)/L.length,es=Math.max(18,ss*.6),A=[];for(const f of L){const w=A[A.length-1];if(!w){A.push([{id:f.id,centerX:f.centerX,centerY:f.centerY}]);continue}const D=w.reduce((As,zs)=>As+zs.centerY,0)/w.length;Math.abs(f.centerY-D)<=es?w.push({id:f.id,centerX:f.centerX,centerY:f.centerY}):A.push([{id:f.id,centerX:f.centerX,centerY:f.centerY}])}A.forEach(f=>f.sort((w,D)=>w.centerX-D.centerX));const H=A.findIndex(f=>f.some(w=>w.id===r));if(H===-1)return((cs=(os=A[0])==null?void 0:os[0])==null?void 0:cs.id)??r;const P=A[H],y=P.findIndex(f=>f.id===r);if(y===-1)return((ls=(ds=A[0])==null?void 0:ds[0])==null?void 0:ls.id)??r;if(c==="left")return((us=P[Math.max(0,y-1)])==null?void 0:us.id)??r;if(c==="right")return((hs=P[Math.min(P.length-1,y+1)])==null?void 0:hs.id)??r;const q=c==="up"?Math.max(0,H-1):Math.min(A.length-1,H+1),m=A[q],Z=P[y].centerX;let U=m[0],is=Math.abs(U.centerX-Z);for(const f of m){const w=Math.abs(f.centerX-Z);w<is&&(U=f,is=w)}return(U==null?void 0:U.id)??r},R=r=>{const c=Y.getShortcuts(),L=c.find(m=>m.id==="dashboard-selector-toggle"),ss=c.find(m=>m.id==="dashboard-vim-left"),es=c.find(m=>m.id==="dashboard-vim-down"),A=c.find(m=>m.id==="dashboard-vim-up"),H=c.find(m=>m.id==="dashboard-vim-right"),P=c.find(m=>m.id==="open-terminal"),y=Y.getState();if(a(r.target))if(!y.terminalOpen&&h(r.target)&&document.activeElement instanceof HTMLElement)document.activeElement.blur();else return;if(B(r,L)){if($.length===0)return;r.preventDefault(),r.stopPropagation(),Q(!0),T(m=>{const Z=m&&$.some(U=>U.id===m)?m:$[0].id;return s==null||s(Z),window.setTimeout(()=>p(Z),0),Z});return}const q=B(r,ss)||r.key==="ArrowLeft"?"left":B(r,es)||r.key==="ArrowDown"?"down":B(r,A)||r.key==="ArrowUp"?"up":B(r,H)||r.key==="ArrowRight"?"right":null;if(q&&G&&M){r.preventDefault(),r.stopPropagation();const m=k(M,q);m!==M&&(T(m),s==null||s(m),window.setTimeout(()=>p(m),0));return}if(B(r,P)){if(y.terminalOpen)return;if(G&&M&&y.agents.has(M)){r.preventDefault(),t==null||t(M);return}if(y.selectedAgentIds.size===1){r.preventDefault();const m=Array.from(y.selectedAgentIds)[0];t==null||t(m);return}if(y.lastSelectedAgentId&&y.agents.has(y.lastSelectedAgentId)){r.preventDefault(),t==null||t(y.lastSelectedAgentId);return}}};return document.addEventListener("keydown",R,!0),()=>document.removeEventListener("keydown",R,!0)},[$,G,M,t,s]),g.useEffect(()=>{const a=document.activeElement;a instanceof HTMLElement&&a.closest(".guake-terminal")&&!Y.getState().terminalOpen&&a.blur()},[]),e.jsxs("div",{className:"dashboard-view",children:[e.jsxs("div",{className:"dashboard-view__topbar",children:[e.jsxs("div",{className:"dashboard-view__metrics",children:[e.jsxs("button",{className:`dashboard-view__metric-btn ${C==="all"?"dashboard-view__metric-btn--active":""}`,onClick:()=>E("all"),children:[e.jsx("span",{className:"dashboard-view__metric-value",children:W.total}),e.jsx("span",{className:"dashboard-view__metric-label",children:n("common:labels.agents")})]}),e.jsxs("button",{className:`dashboard-view__metric-btn dashboard-view__metric-btn--working ${C==="working"?"dashboard-view__metric-btn--active":""}`,onClick:()=>E("working"),children:[e.jsx("span",{className:"dashboard-view__metric-value",children:W.working}),e.jsx("span",{className:"dashboard-view__metric-label",children:n("common:status.working")})]}),e.jsxs("button",{className:"dashboard-view__metric-btn dashboard-view__metric-btn--idle ",onClick:()=>E("all"),children:[e.jsx("span",{className:"dashboard-view__metric-value",children:W.idle}),e.jsx("span",{className:"dashboard-view__metric-label",children:n("common:status.idle")})]}),e.jsxs("button",{className:`dashboard-view__metric-btn dashboard-view__metric-btn--error ${C==="error"?"dashboard-view__metric-btn--active":""}`,onClick:()=>E("error"),children:[e.jsx("span",{className:"dashboard-view__metric-value",children:W.error}),e.jsx("span",{className:"dashboard-view__metric-label",children:n("common:status.error")})]})]}),e.jsx("input",{className:"dashboard-view__search",type:"text",placeholder:n("searchPlaceholder"),value:o,onChange:a=>N(a.target.value)})]}),e.jsxs("div",{className:"dashboard-view__grouping",children:[e.jsx("button",{className:`dashboard-view__grouping-btn ${_==="zone"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>X("zone"),children:n("grouping.byZone")}),e.jsx("button",{className:`dashboard-view__grouping-btn ${_==="status"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>X("status"),children:n("grouping.byStatus")}),e.jsx("button",{className:`dashboard-view__grouping-btn ${_==="activity"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>X("activity"),children:n("grouping.byActivity")})]}),e.jsxs("div",{className:"dashboard-view__content",children:[K.map(a=>{const h=O(a),p=F.has(h),k=_==="status"?as(a.agents,{prioritizeRecentlyIdle:!0}):ms(a.agents),R=a.agents.filter(c=>c.status==="working"||c.status==="waiting"||c.status==="waiting_permission").length,r=a.agents.filter(c=>j.has(c.id)).length;return e.jsxs("div",{className:`dashboard-view__zone ${ws===(a.area?a.area.id:null)&&I?"dashboard-view__zone--drag-over":""}`,onDragOver:c=>js(c,a.area?a.area.id:null),onDragLeave:ys,onDrop:()=>Cs(a.area?a.area.id:null),children:[e.jsxs("div",{className:"dashboard-view__zone-header",onClick:()=>xs(h),children:[e.jsxs("div",{className:"dashboard-view__zone-left",children:[e.jsx("span",{className:`dashboard-view__zone-chevron ${p?"dashboard-view__zone-chevron--collapsed":""}`,children:"▼"}),e.jsx("span",{className:"dashboard-view__zone-dot",style:{backgroundColor:a.color}}),e.jsx("span",{className:"dashboard-view__zone-name",children:a.label}),e.jsxs("span",{className:"dashboard-view__zone-count",children:[n("agentCount",{count:a.agents.length}),R>0&&e.jsxs("span",{className:"dashboard-view__zone-working",children:[" · ",R," ",n("working")]}),r>0&&e.jsxs("span",{className:"dashboard-view__zone-unseen",children:[" · ",r," Unseen"]})]})]}),a.area&&i&&e.jsx("button",{className:"dashboard-view__zone-focus",onClick:c=>{c.stopPropagation(),i(a.area.id)},title:n("focusZone"),children:n("focusZone")})]}),!p&&e.jsx("div",{className:"dashboard-view__zone-grid",children:k.map(c=>e.jsx(bs,{agent:c,isSelected:S.has(c.id),isKeyboardFocused:G&&M===c.id,onSelect:()=>{s==null||s(c.id),Q(!0),T(c.id)},onDoubleClick:()=>Ns(c.id),onChat:()=>t==null?void 0:t(c.id),onFocus:v?()=>v(c.id):void 0,onKill:d?()=>d(c.id):void 0,onDragStart:ks},c.id))})]},h)}),K.length===0&&e.jsx("div",{className:"dashboard-view__empty",children:o?n("noAgentsMatching",{search:o}):n("noAgentsSpawned")}),b.size>0&&e.jsx(ps,{buildings:b,onSelectBuilding:l})]})]})}export{Ks as DashboardView};
|
|
1
|
+
import{z as ts,u as ns,B as _s,j as e,C as Is,E as Ms,G as Es,r as g,H as $s,I as Ds,J as Ss,K as Ls,s as Y,m as B}from"./main-CrRMpn-n.js";import"./modulepreload-polyfill-B5Qt9EMX.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";const Xs=1,gs=Xs*2.5;function Rs(s,v,d){const l=v.filter(o=>o.position&&!isNaN(o.position.x)&&!isNaN(o.position.z));let t,i,n,u;if(s.type==="rectangle"){const o=(s.width||10)/2,N=(s.height||10)/2;t=s.center.x-o,i=s.center.x+o,n=s.center.z-N,u=s.center.z+N}else{const o=s.radius||5;t=s.center.x-o,i=s.center.x+o,n=s.center.z-o,u=s.center.z+o}const b=2;if(t+=b,i-=b,n+=b,u-=b,d){const o={...d};if(o.x=Math.max(t,Math.min(i,o.x)),o.z=Math.max(n,Math.min(u,o.z)),fs(o,l,s))return o}const x=(t+i)/2,S=(n+u)/2,j=Math.min(i-x,u-S);for(let o=0;o<j;o+=gs*.5)for(let N=0;N<Math.PI*2;N+=Math.PI/8){const C=x+Math.cos(N)*o,E=S+Math.sin(N)*o,_={x:C,z:E};if(_.x=Math.max(t,Math.min(i,_.x)),_.z=Math.max(n,Math.min(u,_.z)),fs(_,l,s))return _}return{x,z:S}}function fs(s,v,d){for(const l of v){if(!l.position)continue;if(Math.hypot(s.x-l.position.x,s.z-l.position.z)<gs)return!1}if(d.type==="rectangle"){const l=(d.width||10)/2,t=(d.height||10)/2,i=s.x>=d.center.x-l+1&&s.x<=d.center.x+l-1,n=s.z>=d.center.z-t+1&&s.z<=d.center.z+t-1;return i&&n}else{const l=(d.radius||5)-1;return Math.hypot(s.x-d.center.x,s.z-d.center.z)<=l}}function vs(s){switch(s){case"idle":case"running":return"healthy";case"working":case"waiting":case"waiting_permission":case"starting":case"stopping":return"working";case"error":case"offline":case"orphaned":case"stopped":return"error";default:return"unknown"}}function Ps(s){switch(s){case"scout":return"🔍";case"builder":return"🔨";case"debugger":return"🐛";case"architect":return"📐";case"warrior":return"⚔️";case"support":return"🛟";case"boss":return"👑";default:return"🤖"}}function Us(s){switch(s){case"server":return"🖥️";case"link":return"🔗";case"database":return"🗄️";case"docker":return"🐳";case"monitor":return"📊";case"folder":return"📁";case"boss":return"🏰";default:return"🏢"}}function Ys(s,v){const d=[],l=new Set;for(const i of v.values()){if(i.archived)continue;const n=[];for(const u of i.assignedAgentIds){const b=s.get(u);b&&(n.push(b),l.add(u))}d.push({area:i,agents:n,label:i.name,color:i.color})}d.sort((i,n)=>i.label.localeCompare(n.label));const t=[];for(const i of s.values())l.has(i.id)||t.push(i);return t.length>0&&d.push({area:null,agents:t,label:"Unassigned",color:"#555"}),d}function Gs(s,v){const d=[],l=[],t=[];for(const n of s.values())n.status==="working"||n.status==="waiting"||n.status==="waiting_permission"?d.push(n):n.status==="error"||n.status==="offline"||n.status==="orphaned"?t.push(n):v&&v.has(n.id)?d.push(n):l.push(n);const i=[];return t.length>0&&i.push({area:null,agents:t,label:"Errors",color:"#d64545"}),d.length>0&&i.push({area:null,agents:d,label:"Working & Unseen",color:"#f5d76e"}),l.length>0&&i.push({area:null,agents:l,label:"Idle",color:"#5cb88a"}),i}function Hs(s){const v=Date.now(),l=[...Array.from(s.values())].sort((o,N)=>(N.lastActivity||0)-(o.lastActivity||0)),t=[],i=[],n=[],u=[],b=300*1e3,x=3600*1e3,S=1440*60*1e3;for(const o of l){const N=v-(o.lastActivity||0);N<b?t.push(o):N<x?i.push(o):N<S?n.push(o):u.push(o)}const j=[];return t.length>0&&j.push({area:null,agents:t,label:"Just Now (< 5m)",color:"#4ade80"}),i.length>0&&j.push({area:null,agents:i,label:"Recent (5m - 1h)",color:"#60a5fa"}),n.length>0&&j.push({area:null,agents:n,label:"Stale (1h - 1d)",color:"#facc15"}),u.length>0&&j.push({area:null,agents:u,label:"Very Stale (> 1d)",color:"#f87171"}),j}function Zs(s){return s.contextLimit<=0?0:Math.round(s.contextUsed/s.contextLimit*100)}function Bs(s){return s>=80?"red":s>=50?"yellow":"green"}function ms(s){return as(s)}function as(s,v={}){const{prioritizeRecentlyIdle:d=!1}=v;return[...s].sort((l,t)=>{const i={error:0,offline:0,orphaned:0,working:1,waiting:1,waiting_permission:1,idle:2},n=i[l.status]??3,u=i[t.status]??3;if(n!==u)return n-u;if(d&&l.status==="idle"&&t.status==="idle"){const b=!!l.taskLabel,x=!!t.taskLabel;return b!==x?b?-1:1:(t.lastActivity||0)-(l.lastActivity||0)}return l.name.localeCompare(t.name)})}const bs=ts.memo(({agent:s,isSelected:v,isKeyboardFocused:d=!1,onSelect:l,onDoubleClick:t,onChat:i,onFocus:n,onKill:u,onDragStart:b})=>{const{t:x}=ns(["dashboard","common"]),j=_s().has(s.id),o=vs(s.status),N=Ps(s.class),C=Zs(s),E=Bs(C),_=s.taskLabel?`📋 ${s.taskLabel}`:s.currentTask||s.lastAssignedTask,X=s.status==="idle"&&s.lastActivity>0,[,F]=ts.useState(0);return ts.useEffect(()=>{if(!X)return;const z=window.setInterval(()=>F(I=>I+1),15e3);return()=>window.clearInterval(z)},[X]),e.jsxs("div",{className:`dash-card dash-card--${o} ${v?"dash-card--selected":""} ${d?"dash-card--keyboard-focused":""}`,"data-agent-id":s.id,onClick:l,onDoubleClick:z=>{z.stopPropagation(),t()},onDragStart:z=>{b==null||b(s),z.dataTransfer.effectAllowed="move"},draggable:!0,title:x("cards.doubleClickHint"),children:[e.jsxs("div",{className:"dash-card__row1",children:[e.jsx("span",{className:`dash-card__status-dot dash-card__status-dot--${o}`}),e.jsx("span",{className:"dash-card__name",children:s.name}),e.jsxs("span",{className:"dash-card__class",children:[N," ",s.class]}),e.jsxs("span",{className:`dash-card__provider dash-card__provider--${s.provider}`,children:[s.provider==="codex"?"🔸":s.provider==="opencode"?"🟢":"🤖"," ",s.provider]}),j&&e.jsx("span",{className:"dash-card__unseen-badge",title:"New output available - click to view",children:"!"})]}),e.jsxs("div",{className:"dash-card__row2",children:[e.jsx("span",{className:`dash-card__status dash-card__status--${o}`,children:j?"Unseen":s.status}),e.jsxs("div",{className:"dash-card__context",children:[e.jsx("div",{className:"dash-card__context-bar",children:e.jsx("div",{className:`dash-card__context-fill dash-card__context-fill--${E}`,style:{width:`${C}%`}})}),e.jsxs("span",{className:`dash-card__context-pct dash-card__context-pct--${E}`,children:[C,"%"]})]})]}),e.jsxs("div",{className:"dash-card__row3",children:[e.jsxs("span",{className:"dash-card__workdir",title:s.cwd,children:["📁 ",s.cwd.split("/").pop()||s.cwd]}),X&&e.jsxs("span",{className:"dash-card__idle-time",style:{color:Es(s.lastActivity)},title:Ms(s.lastActivity),children:["⏱ ",Is(s.lastActivity)]})]}),_&&e.jsx("div",{className:"dash-card__row4",children:e.jsx("span",{className:"dash-card__task",children:_})}),e.jsxs("div",{className:"dash-card__actions",children:[i&&e.jsx("button",{className:"dash-card__action-btn dash-card__action-btn--chat",onClick:z=>{z.stopPropagation(),i()},title:x("cards.openTerminal"),children:x("cards.chat")}),u&&e.jsx("button",{className:"dash-card__action-btn dash-card__action-btn--danger",onClick:z=>{z.stopPropagation(),u()},title:x("cards.killAgent"),children:x("cards.stop")})]})]})});bs.displayName="AgentCard";const ps=({buildings:s,onSelectBuilding:v})=>{const{t:d}=ns(["dashboard"]),l=g.useMemo(()=>Array.from(s.values()).sort((t,i)=>t.name.localeCompare(i.name)),[s]);return e.jsxs("div",{className:"dashboard-view__buildings",children:[e.jsxs("div",{className:"dashboard-view__buildings-header",children:[e.jsx("span",{className:"dashboard-view__buildings-title",children:d("buildings.title")}),e.jsx("span",{className:"dashboard-view__buildings-count",children:l.length})]}),e.jsx("div",{className:"dashboard-view__buildings-row",children:l.map(t=>{const i=vs(t.status),n=Us(t.type);return e.jsxs("button",{className:`dash-pill dash-pill--${i}`,onClick:()=>v==null?void 0:v(t.id),title:`${t.name} (${t.type}) - ${t.status}`,children:[e.jsx("span",{className:"dash-pill__icon",children:n}),e.jsx("span",{className:"dash-pill__name",children:t.name}),e.jsx("span",{className:`dash-pill__dot dash-pill__dot--${i}`})]},t.id)})})]})};ps.displayName="BuildingPills";function Ks({onSelectAgent:s,onFocusAgent:v,onKillAgent:d,onSelectBuilding:l,onOpenTerminal:t,onFocusZone:i}){const{t:n}=ns(["dashboard","common"]),u=$s(),b=Ds(),x=Ss(),S=Ls(),j=_s(),[o,N]=g.useState(""),[C,E]=g.useState("all"),[_,X]=g.useState("zone"),[F,z]=g.useState(new Set),[I,J]=g.useState(null),[ws,V]=g.useState(null),[G,Q]=g.useState(!1),[M,T]=g.useState(null),W=g.useMemo(()=>{const a=Array.from(u.values());return{total:a.length,working:a.filter(h=>h.status==="working"||h.status==="waiting"||h.status==="waiting_permission").length,idle:a.filter(h=>h.status==="idle").length,error:a.filter(h=>h.status==="error"||h.status==="offline"||h.status==="orphaned").length}},[u]),rs=g.useMemo(()=>_==="zone"?Ys(u,x):_==="status"?Gs(u,j):Hs(u),[u,x,_,j]),K=g.useMemo(()=>{const a=o.toLowerCase().trim(),h=rs.map(p=>({...p,agents:p.agents.filter(k=>{if(C==="working"){if(k.status!=="working"&&k.status!=="waiting"&&k.status!=="waiting_permission")return!1}else if(C==="error"&&k.status!=="error"&&k.status!=="offline"&&k.status!=="orphaned")return!1;return!(a&&!k.name.toLowerCase().includes(a)&&!k.class.toLowerCase().includes(a))})}));return _==="zone"?h:h.filter(p=>p.agents.length>0)},[rs,C,o,_]),O=g.useCallback(a=>a.area?`area:${a.area.id}`:`${_}:${a.label}`,[_]),$=g.useMemo(()=>{const a=[];return K.forEach(h=>{const p=O(h);if(F.has(p))return;const k=_==="status"?as(h.agents,{prioritizeRecentlyIdle:!0}):ms(h.agents);a.push(...k)}),a},[K,F,_,O]),xs=g.useCallback(a=>{z(h=>{const p=new Set(h);return p.has(a)?p.delete(a):p.add(a),p})},[]),Ns=g.useCallback(a=>{t==null||t(a)},[t]),ks=g.useCallback(a=>{J(a)},[]),js=g.useCallback((a,h)=>{a.preventDefault(),a.dataTransfer.dropEffect="move",V(h)},[]),ys=g.useCallback(()=>{V(null)},[]),Cs=g.useCallback(a=>{if(!I)return;if(a===null){const R=Y.getState(),r=Array.from(R.areas.values()).find(c=>c.assignedAgentIds.includes(I.id));r&&Y.unassignAgentFromArea(I.id,r.id),J(null),V(null);return}const h=x.get(a);if(!h)return;const p=Array.from(u.values()),k=Rs(h,p,I.position);Y.updateAgent({...I,position:{...I.position,x:k.x,z:k.z}}),Y.assignAgentToArea(I.id,a),J(null),V(null)},[I,x,u]);return g.useEffect(()=>{if($.length===0){Q(!1),T(null);return}G&&(!M||!$.some(a=>a.id===M))&&(T($[0].id),s==null||s($[0].id))},[$,G,M,s]),g.useEffect(()=>{const a=r=>r instanceof HTMLElement?r.tagName==="INPUT"||r.tagName==="TEXTAREA"||r.tagName==="SELECT"||r.isContentEditable:!1,h=r=>r instanceof HTMLElement?!!r.closest(".guake-terminal")||r.classList.contains("guake-input")||r.classList.contains("agent-panel-input"):!1,p=r=>{const c=Array.from(document.querySelectorAll(".dash-card[data-agent-id]")).find(L=>L.dataset.agentId===r);c==null||c.scrollIntoView({block:"nearest",inline:"nearest"})},k=(r,c)=>{var os,cs,ds,ls,us,hs;const L=Array.from(document.querySelectorAll(".dash-card[data-agent-id]")).map(f=>{const w=f.dataset.agentId;if(!w)return null;const D=f.getBoundingClientRect();return{id:w,centerX:D.left+D.width/2,centerY:D.top+D.height/2,height:D.height}}).filter(f=>f!==null).sort((f,w)=>f.centerY-w.centerY||f.centerX-w.centerX);if(L.length===0)return r;const ss=L.reduce((f,w)=>f+w.height,0)/L.length,es=Math.max(18,ss*.6),A=[];for(const f of L){const w=A[A.length-1];if(!w){A.push([{id:f.id,centerX:f.centerX,centerY:f.centerY}]);continue}const D=w.reduce((As,zs)=>As+zs.centerY,0)/w.length;Math.abs(f.centerY-D)<=es?w.push({id:f.id,centerX:f.centerX,centerY:f.centerY}):A.push([{id:f.id,centerX:f.centerX,centerY:f.centerY}])}A.forEach(f=>f.sort((w,D)=>w.centerX-D.centerX));const H=A.findIndex(f=>f.some(w=>w.id===r));if(H===-1)return((cs=(os=A[0])==null?void 0:os[0])==null?void 0:cs.id)??r;const P=A[H],y=P.findIndex(f=>f.id===r);if(y===-1)return((ls=(ds=A[0])==null?void 0:ds[0])==null?void 0:ls.id)??r;if(c==="left")return((us=P[Math.max(0,y-1)])==null?void 0:us.id)??r;if(c==="right")return((hs=P[Math.min(P.length-1,y+1)])==null?void 0:hs.id)??r;const q=c==="up"?Math.max(0,H-1):Math.min(A.length-1,H+1),m=A[q],Z=P[y].centerX;let U=m[0],is=Math.abs(U.centerX-Z);for(const f of m){const w=Math.abs(f.centerX-Z);w<is&&(U=f,is=w)}return(U==null?void 0:U.id)??r},R=r=>{const c=Y.getShortcuts(),L=c.find(m=>m.id==="dashboard-selector-toggle"),ss=c.find(m=>m.id==="dashboard-vim-left"),es=c.find(m=>m.id==="dashboard-vim-down"),A=c.find(m=>m.id==="dashboard-vim-up"),H=c.find(m=>m.id==="dashboard-vim-right"),P=c.find(m=>m.id==="open-terminal"),y=Y.getState();if(a(r.target))if(!y.terminalOpen&&h(r.target)&&document.activeElement instanceof HTMLElement)document.activeElement.blur();else return;if(B(r,L)){if($.length===0)return;r.preventDefault(),r.stopPropagation(),Q(!0),T(m=>{const Z=m&&$.some(U=>U.id===m)?m:$[0].id;return s==null||s(Z),window.setTimeout(()=>p(Z),0),Z});return}const q=B(r,ss)||r.key==="ArrowLeft"?"left":B(r,es)||r.key==="ArrowDown"?"down":B(r,A)||r.key==="ArrowUp"?"up":B(r,H)||r.key==="ArrowRight"?"right":null;if(q&&G&&M){r.preventDefault(),r.stopPropagation();const m=k(M,q);m!==M&&(T(m),s==null||s(m),window.setTimeout(()=>p(m),0));return}if(B(r,P)){if(y.terminalOpen)return;if(G&&M&&y.agents.has(M)){r.preventDefault(),t==null||t(M);return}if(y.selectedAgentIds.size===1){r.preventDefault();const m=Array.from(y.selectedAgentIds)[0];t==null||t(m);return}if(y.lastSelectedAgentId&&y.agents.has(y.lastSelectedAgentId)){r.preventDefault(),t==null||t(y.lastSelectedAgentId);return}}};return document.addEventListener("keydown",R,!0),()=>document.removeEventListener("keydown",R,!0)},[$,G,M,t,s]),g.useEffect(()=>{const a=document.activeElement;a instanceof HTMLElement&&a.closest(".guake-terminal")&&!Y.getState().terminalOpen&&a.blur()},[]),e.jsxs("div",{className:"dashboard-view",children:[e.jsxs("div",{className:"dashboard-view__topbar",children:[e.jsxs("div",{className:"dashboard-view__metrics",children:[e.jsxs("button",{className:`dashboard-view__metric-btn ${C==="all"?"dashboard-view__metric-btn--active":""}`,onClick:()=>E("all"),children:[e.jsx("span",{className:"dashboard-view__metric-value",children:W.total}),e.jsx("span",{className:"dashboard-view__metric-label",children:n("common:labels.agents")})]}),e.jsxs("button",{className:`dashboard-view__metric-btn dashboard-view__metric-btn--working ${C==="working"?"dashboard-view__metric-btn--active":""}`,onClick:()=>E("working"),children:[e.jsx("span",{className:"dashboard-view__metric-value",children:W.working}),e.jsx("span",{className:"dashboard-view__metric-label",children:n("common:status.working")})]}),e.jsxs("button",{className:"dashboard-view__metric-btn dashboard-view__metric-btn--idle ",onClick:()=>E("all"),children:[e.jsx("span",{className:"dashboard-view__metric-value",children:W.idle}),e.jsx("span",{className:"dashboard-view__metric-label",children:n("common:status.idle")})]}),e.jsxs("button",{className:`dashboard-view__metric-btn dashboard-view__metric-btn--error ${C==="error"?"dashboard-view__metric-btn--active":""}`,onClick:()=>E("error"),children:[e.jsx("span",{className:"dashboard-view__metric-value",children:W.error}),e.jsx("span",{className:"dashboard-view__metric-label",children:n("common:status.error")})]})]}),e.jsx("input",{className:"dashboard-view__search",type:"text",placeholder:n("searchPlaceholder"),value:o,onChange:a=>N(a.target.value)})]}),e.jsxs("div",{className:"dashboard-view__grouping",children:[e.jsx("button",{className:`dashboard-view__grouping-btn ${_==="zone"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>X("zone"),children:n("grouping.byZone")}),e.jsx("button",{className:`dashboard-view__grouping-btn ${_==="status"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>X("status"),children:n("grouping.byStatus")}),e.jsx("button",{className:`dashboard-view__grouping-btn ${_==="activity"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>X("activity"),children:n("grouping.byActivity")})]}),e.jsxs("div",{className:"dashboard-view__content",children:[K.map(a=>{const h=O(a),p=F.has(h),k=_==="status"?as(a.agents,{prioritizeRecentlyIdle:!0}):ms(a.agents),R=a.agents.filter(c=>c.status==="working"||c.status==="waiting"||c.status==="waiting_permission").length,r=a.agents.filter(c=>j.has(c.id)).length;return e.jsxs("div",{className:`dashboard-view__zone ${ws===(a.area?a.area.id:null)&&I?"dashboard-view__zone--drag-over":""}`,onDragOver:c=>js(c,a.area?a.area.id:null),onDragLeave:ys,onDrop:()=>Cs(a.area?a.area.id:null),children:[e.jsxs("div",{className:"dashboard-view__zone-header",onClick:()=>xs(h),children:[e.jsxs("div",{className:"dashboard-view__zone-left",children:[e.jsx("span",{className:`dashboard-view__zone-chevron ${p?"dashboard-view__zone-chevron--collapsed":""}`,children:"▼"}),e.jsx("span",{className:"dashboard-view__zone-dot",style:{backgroundColor:a.color}}),e.jsx("span",{className:"dashboard-view__zone-name",children:a.label}),e.jsxs("span",{className:"dashboard-view__zone-count",children:[n("agentCount",{count:a.agents.length}),R>0&&e.jsxs("span",{className:"dashboard-view__zone-working",children:[" · ",R," ",n("working")]}),r>0&&e.jsxs("span",{className:"dashboard-view__zone-unseen",children:[" · ",r," Unseen"]})]})]}),a.area&&i&&e.jsx("button",{className:"dashboard-view__zone-focus",onClick:c=>{c.stopPropagation(),i(a.area.id)},title:n("focusZone"),children:n("focusZone")})]}),!p&&e.jsx("div",{className:"dashboard-view__zone-grid",children:k.map(c=>e.jsx(bs,{agent:c,isSelected:S.has(c.id),isKeyboardFocused:G&&M===c.id,onSelect:()=>{s==null||s(c.id),Q(!0),T(c.id)},onDoubleClick:()=>Ns(c.id),onChat:()=>t==null?void 0:t(c.id),onFocus:v?()=>v(c.id):void 0,onKill:d?()=>d(c.id):void 0,onDragStart:ks},c.id))})]},h)}),K.length===0&&e.jsx("div",{className:"dashboard-view__empty",children:o?n("noAgentsMatching",{search:o}):n("noAgentsSpawned")}),b.size>0&&e.jsx(ps,{buildings:b,onSelectBuilding:l})]})]})}export{Ks as DashboardView};
|