tide-commander 1.148.0 → 1.149.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/CHANGELOG.md +17 -0
- package/README.md +6 -3
- package/dist/assets/{BossLogsModal-CZMHgMBE.js → BossLogsModal-Cs4kWugD.js} +1 -1
- package/dist/assets/BossSpawnModal-BudMgJqj.js +1 -0
- package/dist/assets/{ControlsModal-DJ8Scm16.js → ControlsModal-Bh6_3qtH.js} +1 -1
- package/dist/assets/{DockerLogsModal-Vb4gqdFz.js → DockerLogsModal-Nf4wQFfz.js} +1 -1
- package/dist/assets/{EmbeddedEditor-D4sHERAj.js → EmbeddedEditor-BfRXRX50.js} +1 -1
- package/dist/assets/{GmailOAuthSetup-COIYIbJS.js → GmailOAuthSetup-CXUtjA0r.js} +1 -1
- package/dist/assets/{GoogleOAuthSetup-DJS59Soi.js → GoogleOAuthSetup-D-_rwicD.js} +1 -1
- package/dist/assets/{IframeModal-CFysTkn9.js → IframeModal-CdaXsQK0.js} +1 -1
- package/dist/assets/{IntegrationsPanel-BK8g9ceY.js → IntegrationsPanel-ZsSVxcWr.js} +2 -2
- package/dist/assets/{LogViewerModal-DRxR0HYq.js → LogViewerModal-BAf-klB2.js} +1 -1
- package/dist/assets/{MonitoringModal-CL7UMOdX.js → MonitoringModal-BjRbh5z4.js} +1 -1
- package/dist/assets/{PM2LogsModal-I3aouUlw.js → PM2LogsModal-SaywDZVL.js} +1 -1
- package/dist/assets/{RestoreArchivedAreaModal-PWAg6w6b.js → RestoreArchivedAreaModal-jru2Ez9a.js} +1 -1
- package/dist/assets/Scene2DCanvas-NJHoe2Qg.js +1 -0
- package/dist/assets/SceneManager-i9wVMa_V.js +104 -0
- package/dist/assets/{SkillsPanel-EQ74sIa6.js → SkillsPanel-BHfKLzWe.js} +3 -3
- package/dist/assets/{SlackMultiInstanceSetup-CLMUteI0.js → SlackMultiInstanceSetup-BfVevCSo.js} +1 -1
- package/dist/assets/SpawnModal-29x5z53B.js +1 -0
- package/dist/assets/{StatisticsModal-D6MgA_o0.js → StatisticsModal-MbIByjWD.js} +1 -1
- package/dist/assets/{SubordinateAssignmentModal-C6n0pMn3.js → SubordinateAssignmentModal-DF0vYaM6.js} +1 -1
- package/dist/assets/{TriggerManagerPanel-Umd8iUg1.js → TriggerManagerPanel-EGcKS1Pt.js} +1 -1
- package/dist/assets/{WorkflowEditorPanel-CxjBxs9O.js → WorkflowEditorPanel-BLmejfqe.js} +1 -1
- package/dist/assets/{area-logos-CThPeqIM.js → area-logos-C4fgpLgO.js} +1 -1
- package/dist/assets/grok.ico +0 -0
- package/dist/assets/grok.png +0 -0
- package/dist/assets/{index-h3Cuh2Zn.js → index-B-2H7O_Y.js} +2 -2
- package/dist/assets/{index-DelocTaH.js → index-B9xpLAcH.js} +1 -1
- package/dist/assets/{index-BUN7MVf5.js → index-BZ4wZwRu.js} +3 -3
- package/dist/assets/index-BiiLWTXJ.js +1 -0
- package/dist/assets/{index-maZSt2YW.js → index-C6Kf4ewu.js} +5 -5
- package/dist/assets/{index-Cz-ypmob.js → index-C8CGfmXP.js} +1 -1
- package/dist/assets/index-DThK5_yS.js +5 -0
- package/dist/assets/index-DYgVP0G3.js +2 -0
- package/dist/assets/{index-DOzFBkSH.js → index-DhD3m2Qx.js} +1 -1
- package/dist/assets/main-B0UlZnfk.js +260 -0
- package/dist/assets/main-DeiAIdzy.css +1 -0
- package/dist/assets/{web-CfvEypdU.js → web-CXC8P25z.js} +1 -1
- package/dist/assets/{web-CNjTPilF.js → web-LGEDa25c.js} +1 -1
- package/dist/assets/{web-bcYaAwP6.js → web-NM4dUqWg.js} +1 -1
- package/dist/index.html +2 -2
- package/dist/locales/en/tools.json +4 -2
- package/dist/src/packages/server/claude/runner/process-lifecycle.js +53 -0
- package/dist/src/packages/server/claude/runner/stdout-pipeline.js +125 -4
- package/dist/src/packages/server/claude/runner/watchdog.js +12 -0
- package/dist/src/packages/server/claude/session-loader.js +280 -0
- package/dist/src/packages/server/data/index.js +1 -0
- package/dist/src/packages/server/grok/backend.js +231 -0
- package/dist/src/packages/server/grok/index.js +4 -0
- package/dist/src/packages/server/grok/json-event-parser.js +138 -0
- package/dist/src/packages/server/grok/session-watcher.js +460 -0
- package/dist/src/packages/server/routes/agents.js +7 -2
- package/dist/src/packages/server/runtime/grok-runtime-provider.js +11 -0
- package/dist/src/packages/server/runtime/index.js +1 -0
- package/dist/src/packages/server/services/agent-service.js +26 -5
- package/dist/src/packages/server/services/runtime-command-execution.js +4 -2
- package/dist/src/packages/server/services/runtime-events.js +46 -7
- package/dist/src/packages/server/services/runtime-service.js +19 -3
- package/dist/src/packages/server/utils/tool-formatting.js +40 -12
- package/dist/src/packages/server/websocket/handlers/agent-handler.js +70 -17
- package/dist/src/packages/server/websocket/listeners/runtime-listeners.js +63 -7
- package/dist/src/packages/shared/agent-types.js +10 -0
- package/package.json +1 -1
- package/dist/assets/BossSpawnModal-C6DxqtKP.js +0 -1
- package/dist/assets/Scene2DCanvas-DYPHkU3i.js +0 -1
- package/dist/assets/SceneManager-QqKygyaw.js +0 -104
- package/dist/assets/SpawnModal-BOeStihN.js +0 -1
- package/dist/assets/index-DP7kd91h.js +0 -1
- package/dist/assets/index-DRyMARFk.js +0 -5
- package/dist/assets/index-DuWmOZdY.js +0 -2
- package/dist/assets/main-C2zgPci-.js +0 -256
- package/dist/assets/main-C3JO2TRI.css +0 -1
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{bW as He,r as t,s as I,k as ye,bX as Ee,i as Oe,j as e,I as O,u as fe,bY as ze,Z as Te,bZ as Be,b_ as Ue,q as We,b$ as Ke,c0 as De,c1 as Ve,ak as Ge,al as qe,am as Ye,bj as Je,_ as Me,S as le,bc as Xe,b9 as Ze,a9 as Qe,$ as Ie,aC as et,a5 as tt,c2 as st,t as X,c3 as nt}from"./main-B0UlZnfk.js";import{FileExplorerPanel as at}from"./index-BZ4wZwRu.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";const Se={status:"all",activity:"all",sort:"activity"},ct={"1h":3600*1e3,"6h":360*60*1e3,"24h":1440*60*1e3},Ae=20,me=3,lt={idle:"#4aff9e",working:"#4a9eff",waiting:"#ff9e4a",waiting_permission:"#ffcc00",error:"#ff4a4a",offline:"#888888",orphaned:"#ff9e4a"},ot=12e4;function rt(s){return s.trim().replace(/\r\n/g,`
|
|
2
|
+
`)}function $e(s,a){return`${s}:${rt(a)}`}function it(s,a,c,f){if(s.uuid&&a.has(s.uuid))return!1;if(s.uuid)return!0;const p=s.isUserPrompt?"user":"assistant",d=$e(p,s.text),M=s.timestamp||0,A=c.get(d);return A!==void 0&&Math.abs(M-A)<=ot?!1:M>f}function dt({isOpen:s,agents:a}){const c=He(),[f,p]=t.useState(new Map),d=t.useRef(new Set);t.useRef(a);const M=t.useMemo(()=>Array.from(a.keys()).sort().join(","),[a]),A=t.useMemo(()=>Array.from(a.values()).map(j=>`${j.id}:${j.sessionId||""}`).sort().join(","),[a]);t.useEffect(()=>{s||(d.current.clear(),p(new Map))},[s]),t.useEffect(()=>{if(!s)return;const j=new Set(Array.from(a.keys()));for(const i of d.current)j.has(i)||d.current.delete(i);let h=null;c>0&&(h=I.preserveOutputs(),d.current.clear());const v=async(i,k,F=0)=>{if(d.current.add(i.id),F>0&&await new Promise(x=>setTimeout(x,F)),p(x=>{const N=new Map(x);return N.set(i.id,{agentId:i.id,messages:[],loading:!0,hasMore:!1,totalCount:0}),N}),!i.sessionId){k&&k.length>0&&I.mergeOutputsWithHistory(i.id,[],k),p(x=>{const N=new Map(x);return N.set(i.id,{agentId:i.id,messages:[],loading:!1,hasMore:!1,totalCount:0}),N});return}try{const N=await(await Oe(ye(`/api/agents/${i.id}/history?limit=${Ee}&offset=0`))).json(),P=N.messages||[],K=P.length>0?Math.max(...P.map(w=>w.timestamp?new Date(w.timestamp).getTime():0)):0,Y=new Set(P.map(w=>w.uuid).filter(w=>!!w)),V=new Map;for(const w of P){if(w.type!=="user"&&w.type!=="assistant")continue;const o=$e(w.type,w.content),L=w.timestamp?new Date(w.timestamp).getTime():0,W=V.get(o)??0;L>W&&V.set(o,L)}const G=I.getOutputs(i.id),U=(k&&k.length>0?[...k,...G]:G).filter(w=>it(w,Y,V,K));I.clearOutputs(i.id);for(const w of U)I.addOutput(i.id,w);p(w=>{const o=new Map(w);return o.set(i.id,{agentId:i.id,messages:P,loading:!1,hasMore:N.hasMore||!1,totalCount:N.totalCount||0}),o})}catch(x){if(console.error(`Failed to load history for ${i.name}:`,x),k&&k.length>0){I.clearOutputs(i.id);for(const N of k)I.addOutput(i.id,N)}p(N=>{const P=new Map(N);return P.set(i.id,{agentId:i.id,messages:[],loading:!1,hasMore:!1,totalCount:0}),P})}},u=c>0?500:0,D=Array.from(a.values());for(const i of D)if(!d.current.has(i.id)){const k=h==null?void 0:h.get(i.id);v(i,k,u)}},[s,M,A,c]);const R=t.useRef(a),b=t.useRef(f);R.current=a,b.current=f;const C=t.useCallback(async j=>{const h=R.current.get(j),v=b.current.get(j);if(!(h!=null&&h.sessionId)||!v||!v.hasMore)return;const u=v.messages.length;try{const i=await(await fetch(ye(`/api/agents/${j}/history?limit=${Ee}&offset=${u}`))).json();i.messages&&i.messages.length>0&&p(k=>{const F=new Map(k),x=k.get(j);return x&&F.set(j,{...x,messages:[...i.messages,...x.messages],hasMore:i.hasMore||!1}),F})}catch(D){console.error(`Failed to load more history for agent ${j}:`,D)}},[]),E=t.useCallback(j=>{d.current.delete(j),p(h=>{const v=new Map(h),u=h.get(j);return u&&v.set(j,{...u,messages:[],hasMore:!1,totalCount:0,loading:!1}),v})},[]);return{histories:f,loadMoreHistory:C,clearAgentHistory:E}}function ut({command:s,onCommandChange:a,useTextarea:c,forceTextarea:f,onForceTextarea:p,onSend:d,canSend:M,attachedFiles:A,onAddFile:R,onRemoveFile:b,uploadFile:C,onAddPastedText:E,placeholder:j="Message...",className:h="",compact:v=!1,inputRef:u}){const D=t.useRef(null),i=t.useRef(null),k=t.useRef(c);t.useEffect(()=>{if(c&&!k.current&&i.current){const o=i.current;o.focus(),o.selectionStart=o.selectionEnd=o.value.length}k.current=c},[c]),t.useEffect(()=>{const o=i.current;if(!o||!c)return;o.style.height="auto";const L=v?120:180,W=Math.min(o.scrollHeight,L);o.style.height=`${W}px`},[s,c,v]);const F=t.useCallback(async o=>{const L=o.clipboardData.items;for(const z of L)if(z.type.startsWith("image/")){o.preventDefault();const $=z.getAsFile();if($){const _=await C($);_&&R(_)}return}const W=o.clipboardData.files;if(W.length>0){o.preventDefault();for(const z of W){const $=await C(z);$&&R($)}return}const B=o.clipboardData.getData("text"),te=(B.match(/\n/g)||[]).length+1;if(te>5){o.preventDefault();const $=`[Pasted text #${E(B)} +${te} lines]`,_=o.target,se=_.selectionStart||0,ae=_.selectionEnd||0,ne=s.slice(0,se)+$+s.slice(ae);a(ne),c||p(!0)}},[s,a,c,p,C,R,E]),x=t.useCallback(async o=>{const L=o.target.files;if(L){for(const W of L){const B=await C(W);B&&R(B)}D.current&&(D.current.value="")}},[C,R]),N=t.useCallback(o=>{if(o.key==="Enter"&&o.shiftKey){c||(o.preventDefault(),p(!0));return}o.key==="Enter"&&(o.preventDefault(),d())},[c,p,d]),P=t.useCallback(o=>{},[]),K=t.useCallback(o=>{o.button===1&&(o.preventDefault(),o.stopPropagation())},[]),Y=t.useCallback(o=>{i.current=o,u==null||u(o)},[u]),V=v?"agent-panel-input":"guake-input",G=v?"agent-panel-input-container":"guake-input-container",Z=v?"agent-panel-attach-btn":"guake-attach-btn",U=v?"agent-panel-send-btn":"",w=c?v?"agent-panel-input-expanded":"guake-input-expanded":"";return e.jsxs(e.Fragment,{children:[A.length>0&&e.jsx("div",{className:v?"agent-panel-attachments":"guake-attachments",children:A.map(o=>e.jsxs("div",{className:`${v?"agent-panel-attachment":"guake-attachment"} ${o.isImage?"is-image":""}`,children:[e.jsx("span",{className:v?"agent-panel-attachment-icon":"guake-attachment-icon",children:e.jsx(O,{name:o.isImage?"file":"paperclip",size:12})}),e.jsx("span",{className:v?"agent-panel-attachment-name":"guake-attachment-name",title:o.path,children:o.name}),!v&&e.jsxs("span",{className:"guake-attachment-size",children:["(",Math.round(o.size/1024),"KB)"]}),e.jsx("button",{className:v?"agent-panel-attachment-remove":"guake-attachment-remove",onClick:()=>b(o.id),title:"Remove",children:"×"})]},o.id))}),e.jsxs("div",{className:`${V} ${w} ${h}`,children:[e.jsx("input",{ref:D,type:"file",multiple:!0,onChange:x,style:{display:"none"},accept:"*"}),e.jsxs("div",{className:G,onAuxClick:K,children:[e.jsx("button",{className:Z,onClick:()=>{var o;return(o=D.current)==null?void 0:o.click()},title:"Attach file (or paste image)",children:e.jsx(O,{name:"paperclip",size:14})}),c?e.jsx("textarea",{ref:Y,placeholder:j,value:s,onChange:o=>a(o.target.value),onKeyDown:N,onPaste:F,onMouseDown:P}):e.jsx("input",{ref:u,type:"text",placeholder:j,value:s,onChange:o=>a(o.target.value),onKeyDown:N,onPaste:F,onMouseDown:P}),e.jsx("button",{className:U,onClick:d,disabled:!M,title:"Send",children:e.jsx(O,{name:"send",size:14})})]})]})]})}function mt(s){const a=Math.floor(s/1e3),c=Math.floor(a/60),f=a%60;return`${c}:${f.toString().padStart(2,"0")}`}const ft=t.memo(function({agentId:a,isWorking:c,timestamp:f}){const{t:p}=fe(["terminal"]),[d,M]=t.useState(0);return t.useEffect(()=>{if(!c||!f){M(0);return}M(Date.now()-f);const A=setInterval(()=>{M(Date.now()-f)},1e3);return()=>clearInterval(A)},[c,f]),c?e.jsxs("div",{className:"guake-stop-bar",children:[e.jsx("span",{className:"guake-elapsed-timer",children:mt(d)}),e.jsxs("button",{className:"guake-stop-btn",onClick:()=>I.stopAgent(a),title:p("terminal:input.stopOperation"),children:[e.jsx("span",{className:"stop-icon",children:e.jsx(O,{name:"stop",size:12,weight:"fill"})}),e.jsx("span",{className:"stop-label",children:p("terminal:input.stop")})]})]}):null});function pt({agent:s,history:a,outputs:c,isExpanded:f,isFocused:p,advancedView:d,onExpand:M,onFocus:A,inputRef:R,onLoadMore:b,onClearHistory:C}){const{t:E}=fe(["terminal","common"]),j=ze(s.id),h=t.useRef(null),[v,u]=t.useState(!1),D=t.useRef(0),i=t.useRef(!1),[k,F]=t.useState(!0),[x,N]=t.useState(!1),[P,K]=t.useState(null),[Y,V]=t.useState(null),[G,Z]=t.useState(null);Te(`commander-image-modal-${s.id}`,P!==null,()=>K(null));const{command:U,setCommand:w,forceTextarea:o,setForceTextarea:L,useTextarea:W,setPastedTexts:B,incrementPastedCount:te,resetPastedCount:z,attachedFiles:$,setAttachedFiles:_,removeAttachedFile:se,uploadFile:ae,expandPastedTexts:ne}=Be({selectedAgentId:s.id}),ce=U.trim().length>0||$.length>0,n=Ue({outputs:c,viewMode:d?"advanced":"simple"}),l=t.useMemo(()=>{const S=We(s);return{usedPercent:S.usedPercent,freePercent:S.freePercent,hasData:!!s.contextStats,totalTokens:S.totalTokens,contextWindow:S.contextWindow}},[s.contextStats,s.contextUsed,s.contextLimit]),g=t.useCallback(()=>{!v&&(a!=null&&a.hasMore)&&b&&(u(!0),D.current=h.current?h.current.scrollHeight-h.current.scrollTop:0,b())},[v,a==null?void 0:a.hasMore,b]);t.useEffect(()=>{v&&a&&!a.loading&&u(!1)},[a,v]);const m=t.useCallback(()=>{i.current=!0,F(!1)},[]),T=t.useRef(f),Q=t.useRef(p);t.useEffect(()=>{(f&&!T.current||p&&!Q.current)&&(i.current=!1,F(!0),N(!0)),T.current=f,Q.current=p},[f,p]);const ee=t.useRef(a==null?void 0:a.loading);t.useEffect(()=>{ee.current&&!(a!=null&&a.loading)&&(i.current=!1,F(!0),N(!0)),ee.current=a==null?void 0:a.loading},[a==null?void 0:a.loading]),t.useEffect(()=>{if(!x)return;const S=h.current;if(!S)return;const y=performance.now();let H=0,ue=-1,be;const Re=()=>{const{scrollTop:Fe,scrollHeight:Ne,clientHeight:Le}=S,_e=Ne-Fe-Le<=2;if(Math.abs(Ne-ue)<=1&&_e?H+=1:H=0,ue=Ne,H>=3){N(!1);return}if(performance.now()-y>5e3){N(!1);return}be=requestAnimationFrame(Re)};return be=requestAnimationFrame(Re),()=>cancelAnimationFrame(be)},[x]),t.useEffect(()=>{i.current||F(!0)},[n.length]);const q=t.useCallback(()=>!1,[]),ie=t.useCallback(S=>{const y=te();return B(H=>new Map(H).set(y,S)),y},[te,B]),he=t.useCallback(S=>{_(y=>[...y,S])},[_]),xe=t.useCallback(()=>{if(!ce)return;if(U.trim()==="/clear"&&$.length===0){I.clearContext(s.id),C(),w(""),L(!1),B(new Map),_([]),z();return}let S=ne(U.trim());if($.length>0){const y=$.map(H=>H.isImage?`[Image: ${H.path}]`:`[File: ${H.path}]`).join(`
|
|
3
|
+
`);S=S?`${S}
|
|
4
|
+
|
|
5
|
+
${y}`:y}I.sendCommand(s.id,S),w(""),L(!1),B(new Map),_([]),z()},[s.id,U,ce,$,ne,C,z,w,L,B,_]),ge=t.useCallback((S,y)=>{K({url:S,name:y})},[]),ve=t.useCallback((S,y)=>{const H=Ke(S,s.cwd),ue=H.line?{...y||{},targetLine:H.line}:y;I.setFileViewerPath(H.path,ue,s.cwd)},[s.cwd]),je=t.useCallback((S,y)=>{V({command:S,output:y,isLive:y==="Running..."})},[]),we=t.useCallback(S=>{Z(S)},[]),Ce=t.useCallback(()=>{N(!1),i.current=!0,F(!1)},[]),ke=t.useCallback(()=>K(null),[]),r=t.useCallback(()=>V(null),[]),J=t.useCallback(()=>Z(null),[]),de=t.useCallback(S=>{S.stopPropagation(),M()},[M]),oe=lt[s.status]||"#888888",re=(a==null?void 0:a.messages)||[];return e.jsxs("div",{className:`agent-panel ${s.status==="working"?"working":""} ${f?"expanded":""} ${p?"focused":""}`,onClick:p?void 0:A,children:[e.jsxs("div",{className:"agent-panel-header",onClick:p?A:void 0,children:[e.jsxs("div",{className:"agent-panel-info",children:[e.jsx("span",{className:"agent-panel-status",style:{background:oe},title:s.status}),e.jsxs("span",{className:"agent-panel-name",children:[(s.isBoss||s.class==="boss")&&e.jsx("span",{className:"agent-panel-boss-crown",children:e.jsx(O,{name:"crown",size:14})}),s.name]}),e.jsx("span",{className:`agent-panel-status-label ${s.status}`,children:s.status}),e.jsx("span",{className:"agent-panel-class",children:s.class}),e.jsx("span",{className:`agent-panel-provider ${s.provider==="codex"?"codex":s.provider==="opencode"?"opencode":s.provider==="grok"?"grok":"claude"}`,children:s.provider||"claude"}),e.jsxs("span",{className:"agent-panel-id",title:`ID: ${s.id}`,children:["[",s.id.substring(0,4),"]"]}),s.taskLabel?e.jsxs("div",{className:"agent-panel-task agent-panel-task-label",title:s.taskLabel,children:[e.jsx(O,{name:"task",size:12})," ",s.taskLabel]}):s.currentTask?e.jsxs("div",{className:"agent-panel-task",title:s.currentTask,children:[s.currentTask.substring(0,40),"..."]}):null]}),e.jsxs("div",{className:"agent-panel-context",title:`Context: ${Math.round(l.usedPercent)}% used (${De(l.totalTokens)} / ${De(l.contextWindow)})`,children:[e.jsx("div",{className:"agent-panel-context-bar",style:{background:l.freePercent<20?"#ff4a4a":l.freePercent<50?"#ff9e4a":"#4aff9e",width:`${l.freePercent}%`}}),e.jsxs("span",{className:"agent-panel-context-text",children:[Math.round(l.freePercent),"%"]})]}),e.jsx("div",{className:"agent-panel-actions",children:e.jsx("button",{className:"agent-panel-expand",onClick:de,title:E(f?"commander.collapsePanel":"commander.expandPanel"),children:f?e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("polyline",{points:"4 14 10 14 10 20"}),e.jsx("polyline",{points:"20 10 14 10 14 4"}),e.jsx("line",{x1:"14",y1:"10",x2:"21",y2:"3"}),e.jsx("line",{x1:"3",y1:"21",x2:"10",y2:"14"})]}):e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("polyline",{points:"15 3 21 3 21 9"}),e.jsx("polyline",{points:"9 21 3 21 3 15"}),e.jsx("line",{x1:"21",y1:"3",x2:"14",y2:"10"}),e.jsx("line",{x1:"3",y1:"21",x2:"10",y2:"14"})]})})})]}),e.jsx("div",{className:"agent-panel-content",ref:h,children:a!=null&&a.loading?e.jsx("div",{className:"agent-panel-loading",children:E("common:status.loading")}):e.jsx(e.Fragment,{children:!re.length&&!n.length?e.jsxs("div",{className:"agent-panel-empty",children:[E("commander.noMessages"),!s.sessionId&&e.jsx("div",{style:{fontSize:"10px",color:"#666"},children:E("commander.noSessionId")})]}):e.jsx(Ve,{historyMessages:re,liveOutputs:n,agentId:s.id,viewMode:d?"advanced":"simple",selectedMessageIndex:null,isMessageSelected:q,onImageClick:ge,onFileClick:ve,onBashClick:je,onViewMarkdown:we,scrollContainerRef:h,onScrollTopReached:g,isLoadingMore:v,hasMore:a==null?void 0:a.hasMore,shouldAutoScroll:k,onUserScroll:m,pinToBottom:x,onPinCancel:Ce,isLoadingHistory:a==null?void 0:a.loading})})}),e.jsxs("div",{className:`guake-input-wrapper ${s.status==="working"?"has-stop-btn is-working":""}`,children:[e.jsx(ft,{agentId:s.id,isWorking:s.status==="working",timestamp:j==null?void 0:j.timestamp}),e.jsx(ut,{command:U,onCommandChange:w,useTextarea:W,forceTextarea:o,onForceTextarea:L,onSend:xe,canSend:ce,attachedFiles:$,onAddFile:he,onRemoveFile:se,uploadFile:ae,onAddPastedText:ie,placeholder:E("commander.command",{name:s.name}),compact:!1,inputRef:R})]}),P&&e.jsx(Ge,{url:P.url,name:P.name,onClose:ke}),Y&&e.jsx(qe,{state:Y,onClose:r}),e.jsx(Ye,{agent:s,content:G,onClose:J})]})}function ht({currentArea:s,onClose:a}){const{t:c}=fe(["terminal","common"]),[f,p]=t.useState(()=>{const u=new Set(Array.from(I.getState().agents.values()).map(D=>D.name));return Je.find(D=>!u.has(D))||`Agent-${Date.now().toString(36)}`}),[d,M]=t.useState(()=>Me(le.LAST_CWD)),[A,R]=t.useState("scout"),[b,C]=t.useState("claude"),[E,j]=t.useState(!1),h=()=>{if(!f.trim()||!d.trim())return;j(!0),Ie(le.LAST_CWD,d);let u;s&&(u={x:s.center.x,z:s.center.z}),I.spawnAgent(f.trim(),A,d.trim(),u,void 0,void 0,void 0,void 0,b),setTimeout(()=>{a()},500)},v=u=>{u.key==="Enter"&&!u.shiftKey&&(u.preventDefault(),h()),u.key==="Escape"&&a()};return e.jsx("div",{className:"commander-spawn-overlay",onClick:a,children:e.jsxs("div",{className:"commander-spawn-form",onClick:u=>u.stopPropagation(),children:[e.jsxs("div",{className:"commander-spawn-header",children:[e.jsx("h3",{children:c("spawn.addNewAgent")}),s&&e.jsxs("span",{className:"commander-spawn-area",children:[e.jsx("span",{className:"commander-spawn-area-dot",style:{background:s.color}}),s.name]})]}),e.jsxs("div",{className:"commander-spawn-body",children:[e.jsxs("div",{className:"commander-spawn-field",children:[e.jsx("label",{children:c("common:labels.name")}),e.jsx("input",{type:"text",value:f,onChange:u=>p(u.target.value),onKeyDown:v,autoFocus:!0})]}),e.jsxs("div",{className:"commander-spawn-field",children:[e.jsx("label",{children:c("common:labels.workingDirectory")}),e.jsx(Xe,{value:d,onChange:M,onSubmit:h,placeholder:c("spawn.workingDirPlaceholder"),directoriesOnly:!0})]}),e.jsxs("div",{className:"commander-spawn-field",children:[e.jsx("label",{children:c("common:labels.class")}),e.jsx("div",{className:"commander-spawn-classes",children:Ze.map(u=>e.jsxs("button",{className:`commander-spawn-class ${A===u.id?"selected":""}`,onClick:()=>R(u.id),children:[e.jsx(Qe,{classId:u.id,size:18,className:"commander-spawn-class-icon"}),e.jsx("span",{children:u.name})]},u.id))})]}),e.jsxs("div",{className:"commander-spawn-field",children:[e.jsx("label",{children:c("common:labels.runtime")}),e.jsxs("div",{className:"commander-spawn-classes",children:[e.jsxs("button",{className:`commander-spawn-class ${b==="claude"?"selected":""}`,onClick:()=>C("claude"),children:[e.jsx("span",{className:"commander-spawn-class-icon",children:e.jsx(O,{name:"brain",size:14})}),e.jsx("span",{children:"Claude"})]}),e.jsxs("button",{className:`commander-spawn-class ${b==="codex"?"selected":""}`,onClick:()=>C("codex"),children:[e.jsx("span",{className:"commander-spawn-class-icon",children:e.jsx(O,{name:"gear",size:14})}),e.jsx("span",{children:"Codex"})]}),e.jsxs("button",{className:`commander-spawn-class ${b==="opencode"?"selected":""}`,onClick:()=>C("opencode"),children:[e.jsx("span",{className:"commander-spawn-class-icon",children:e.jsx(O,{name:"status-pending",size:12,weight:"fill",color:"#4ade80"})}),e.jsx("span",{children:"OpenCode"})]}),e.jsxs("button",{className:`commander-spawn-class ${b==="grok"?"selected":""}`,onClick:()=>C("grok"),children:[e.jsx("span",{className:"commander-spawn-class-icon",children:e.jsx(O,{name:"status-pending",size:12,weight:"fill",color:"#6366f1"})}),e.jsx("span",{children:"Grok"})]})]})]})]}),e.jsxs("div",{className:"commander-spawn-footer",children:[e.jsx("button",{className:"commander-spawn-cancel",onClick:a,children:c("common:buttons.cancel")}),e.jsx("button",{className:"commander-spawn-submit",onClick:h,disabled:!f.trim()||!d.trim()||E,children:c(E?"common:buttons.deploying":"common:buttons.deploy")})]})]})})}const Pe=t.memo(function({agent:a,history:c,isExpanded:f,isFocused:p,advancedView:d,index:M,onExpand:A,onCollapse:R,onFocus:b,onInputRef:C,onLoadMore:E,onClearHistory:j}){const h=nt(a.id),v=t.useCallback(()=>{f?R():A(a.id)},[a.id,f,A,R]),u=t.useCallback(()=>{b(p?-1:M)},[M,p,b]),D=t.useCallback(F=>{C(a.id,F)},[a.id,C]),i=t.useCallback(()=>{E(a.id)},[a.id,E]),k=t.useCallback(()=>{j(a.id)},[a.id,j]);return e.jsx(pt,{agent:a,history:c,outputs:h,isExpanded:f,isFocused:p,advancedView:d,onExpand:v,onFocus:u,inputRef:D,onLoadMore:i,onClearHistory:k})});function Ct({isOpen:s,onClose:a}){const{t:c}=fe(["terminal","common"]),f=et(),p=tt(),[d,M]=t.useState(()=>Me(le.COMMANDER_TAB,"all")),[A,R]=t.useState(0),[b,C]=t.useState(null),E=t.useRef(null),[j,h]=t.useState(0),[v,u]=t.useState(!1),[D,i]=t.useState(null),[k,F]=t.useState(!1),[x,N]=t.useState(()=>{try{const n=Me(le.COMMANDER_FILTERS,"");if(n)return{...Se,...JSON.parse(n)}}catch{}return Se}),P=t.useRef(new Map),K=t.useRef([]),Y=t.useRef(0),V=t.useRef([]),G=t.useRef(d),{histories:Z,loadMoreHistory:U,clearAgentHistory:w}=dt({isOpen:s,agents:f});t.useEffect(()=>{s||(C(null),h(0),u(!1))},[s]);const o=t.useMemo(()=>{const n=Array.from(p.values()).sort((g,m)=>g.name.localeCompare(m.name)),l=[{id:"all",name:c("common:labels.all")}];for(const g of n)l.push({id:g.id,name:g.name,color:g.color});return l.push({id:"unassigned",name:c("commander.unassigned")}),l},[p]),L=t.useMemo(()=>d==="all"||d==="unassigned"?null:p.get(d)||null,[d,p]),W=t.useMemo(()=>{const n=new Map;n.set("all",f.size);let l=0;for(const g of f.values()){const m=I.getAreaForAgent(g.id);m?n.set(m.id,(n.get(m.id)||0)+1):l++}return n.set("unassigned",l),n},[f]),B=x.status!=="all"||x.activity!=="all"||x.sort!=="activity",te=(x.status!=="all"?1:0)+(x.activity!=="all"?1:0)+(x.sort!=="activity"?1:0),z=t.useMemo(()=>{const n=m=>m.isBoss===!0||m.class==="boss",l=Date.now();let g=Array.from(f.values());if(d==="unassigned"?g=g.filter(m=>!I.getAreaForAgent(m.id)):d!=="all"&&(g=g.filter(m=>{const T=I.getAreaForAgent(m.id);return(T==null?void 0:T.id)===d})),x.status!=="all"&&(g=g.filter(m=>{switch(x.status){case"working":return m.status==="working";case"idle":return m.status==="idle";case"error":return m.status==="error"||m.status==="waiting"||m.status==="waiting_permission";case"offline":return m.status==="offline"||m.status==="orphaned";default:return!0}})),x.activity!=="all"){const m=ct[x.activity];g=g.filter(T=>l-(T.lastActivity||0)<m)}return g.sort((m,T)=>{var Q,ee;if(n(m)&&!n(T))return-1;if(!n(m)&&n(T))return 1;switch(x.sort){case"activity":return(T.lastActivity||0)-(m.lastActivity||0);case"name":return m.name.localeCompare(T.name);case"created":return(m.createdAt||0)-(T.createdAt||0);case"context":{const q=((Q=m.contextStats)==null?void 0:Q.usedPercent)??(m.contextUsed||0)/(m.contextLimit||2e5)*100;return(((ee=T.contextStats)==null?void 0:ee.usedPercent)??(T.contextUsed||0)/(T.contextLimit||2e5)*100)-q}default:return(T.lastActivity||0)-(m.lastActivity||0)}}),g},[f,d,x]),$=Math.ceil(z.length/Ae),_=t.useMemo(()=>z.slice(A*Ae,(A+1)*Ae),[z,A]);K.current=_,E.current=b,Y.current=j,V.current=o,G.current=d,Te("commander-expanded",b!==null,()=>C(null));const se=st();t.useEffect(()=>{s&&se&&(C(se),I.clearCommanderExpandRequest())},[s,se]);const ae=t.useCallback(()=>C(null),[]),ne=t.useCallback(n=>C(n),[]),ce=t.useCallback(n=>h(n),[]),pe=t.useCallback((n,l)=>{l?P.current.set(n,l):P.current.delete(n)},[]);return t.useEffect(()=>{R(0),Ie(le.COMMANDER_TAB,d)},[d]),t.useEffect(()=>{Ie(le.COMMANDER_FILTERS,JSON.stringify(x)),R(0)},[x]),t.useEffect(()=>{var l;if(!s||window.matchMedia("(pointer: coarse)").matches)return;const n=b||((l=K.current[j])==null?void 0:l.id);if(n){const g=P.current.get(n);g&&document.activeElement!==g&&setTimeout(()=>g.focus(),50)}},[s,j,b]),t.useEffect(()=>{if(!s)return;const n=l=>{const g=I.getShortcuts(),m=l.target,T=m.tagName==="INPUT"||m.tagName==="TEXTAREA",Q=K.current,ee=Q.length-1,q=E.current,ie=g.find(r=>r.id==="commander-close");if(X(l,ie)){const{fileViewerPath:r,contextModalAgentId:J}=I.getState();if(r||J)return;l.preventDefault(),l.stopImmediatePropagation(),q?C(null):a();return}const he=g.find(r=>r.id==="commander-vim-left");if(X(l,he)&&!q){l.preventDefault(),h(r=>r>0?r-1:r);return}const xe=g.find(r=>r.id==="commander-vim-right");if(X(l,xe)&&!q){l.preventDefault(),h(r=>r<ee?r+1:r);return}const ge=g.find(r=>r.id==="commander-vim-up");if(X(l,ge)&&!q){l.preventDefault(),h(r=>r>=me?r-me:r);return}const ve=g.find(r=>r.id==="commander-vim-down");if(X(l,ve)&&!q){l.preventDefault(),h(r=>r+me<=ee?r+me:r);return}const je=g.find(r=>r.id==="commander-expand");if(X(l,je)){if(l.preventDefault(),q)C(null);else{const r=Q[Y.current];r&&C(r.id)}return}const we=g.find(r=>r.id==="commander-new-agent");if(X(l,we)){l.preventDefault(),u(!0);return}const Ce=g.find(r=>r.id==="commander-next-tab"),ke=g.find(r=>r.id==="commander-prev-tab");if(!T){const r=V.current;if(X(l,Ce)){const J=I.getState().latestNotificationAgentId;if(J){if(l.preventDefault(),l.stopPropagation(),!I.getState().agents.get(J)){I.setLatestNotificationAgentId(null);return}const y=I.getAreaForAgent(J);y&&r.some(H=>H.id===y.id)?M(y.id):M("unassigned"),C(J),h(0),R(0),I.setLatestNotificationAgentId(null);return}l.preventDefault(),l.stopPropagation();const oe=(r.findIndex(re=>re.id===G.current)+1)%r.length;M(r[oe].id),h(0);return}if(X(l,ke)){l.preventDefault(),l.stopPropagation();const de=(r.findIndex(oe=>oe.id===G.current)-1+r.length)%r.length;M(r[de].id),h(0);return}}};return document.addEventListener("keydown",n,!0),()=>document.removeEventListener("keydown",n,!0)},[s,a]),s?e.jsx("div",{className:"commander-overlay",onClick:a,children:e.jsxs("div",{className:"commander-view",onClick:n=>n.stopPropagation(),children:[e.jsxs("div",{className:"commander-header",children:[e.jsxs("div",{className:"commander-title-section",children:[e.jsx("h2",{className:"commander-title",children:c("commander.title")}),e.jsx("span",{className:"commander-shortcuts",children:c("commander.shortcuts")})]}),e.jsxs("div",{className:"commander-controls",children:[e.jsx("button",{className:`commander-view-toggle ${k?"active":""}`,onClick:()=>F(!k),title:c(k?"commander.simple":"commander.advanced"),children:k?e.jsxs(e.Fragment,{children:[e.jsx(O,{name:"target",size:12})," ",c("commander.advanced")]}):e.jsxs(e.Fragment,{children:[e.jsx(O,{name:"status-pending",size:12})," ",c("commander.simple")]})}),e.jsx("button",{className:"commander-add-btn",onClick:()=>u(!0),title:c("commander.addAgent"),children:c("commander.addAgent")}),e.jsx("button",{className:"commander-close",onClick:a,children:c("commander.close")})]})]}),e.jsx("div",{className:"commander-tabs",children:o.map(n=>{const l=n.id!=="all"&&n.id!=="unassigned"?p.get(n.id):null,g=l&&l.directories&&l.directories.length>0;return e.jsxs("button",{className:`commander-tab ${d===n.id?"active":""}`,onClick:()=>{M(n.id),h(0)},style:n.color?{borderBottomColor:d===n.id?n.color:"transparent"}:void 0,children:[n.color&&e.jsx("span",{className:"commander-tab-dot",style:{background:n.color}}),e.jsx("span",{children:n.name}),e.jsx("span",{className:"commander-tab-count",children:W.get(n.id)||0}),g&&e.jsx("span",{className:"commander-tab-folder",onClick:m=>{m.stopPropagation(),i(n.id)},title:c("commander.openFileExplorer"),children:e.jsx(O,{name:"folder",size:12})})]},n.id)})}),e.jsxs("div",{className:"commander-filters",children:[e.jsxs("div",{className:"commander-filter-group",children:[e.jsx("span",{className:"commander-filter-label",children:c("commander.filters.status")}),["all","working","idle","error","offline"].map(n=>e.jsx("button",{className:`commander-filter-btn ${x.status===n?"active":""}`,onClick:()=>N(l=>({...l,status:n})),children:n==="all"?c("commander.filters.all"):n==="error"?c("commander.filters.needsAttn"):n.charAt(0).toUpperCase()+n.slice(1)},n))]}),e.jsxs("div",{className:"commander-filter-group",children:[e.jsx("span",{className:"commander-filter-label",children:c("commander.filters.active")}),["all","1h","6h","24h"].map(n=>e.jsx("button",{className:`commander-filter-btn ${x.activity===n?"active":""}`,onClick:()=>N(l=>({...l,activity:n})),children:n==="all"?c("commander.filters.any"):`< ${n}`},n))]}),e.jsxs("div",{className:"commander-filter-group",children:[e.jsx("span",{className:"commander-filter-label",children:c("commander.filters.sort")}),["activity","name","created","context"].map(n=>e.jsx("button",{className:`commander-filter-btn ${x.sort===n?"active":""}`,onClick:()=>N(l=>({...l,sort:n})),children:n==="activity"?c("commander.filters.recent"):n==="context"?c("commander.filters.context"):n.charAt(0).toUpperCase()+n.slice(1)},n))]}),B&&e.jsx("button",{className:"commander-filter-clear",onClick:()=>N(Se),title:c("commander.clearFilters"),children:c("commander.filters.clearFilters",{count:te})})]}),$>1&&e.jsxs("div",{className:"commander-pagination",children:[e.jsxs("button",{className:"commander-page-btn",onClick:()=>R(n=>Math.max(0,n-1)),disabled:A===0,children:[e.jsx(O,{name:"caret-left",size:12})," ",c("commander.prev")]}),e.jsx("span",{className:"commander-page-info",children:c("commander.page",{current:A+1,total:$,count:z.length})}),e.jsxs("button",{className:"commander-page-btn",onClick:()=>R(n=>Math.min($-1,n+1)),disabled:A===$-1,children:[c("commander.next")," ",e.jsx(O,{name:"caret-right",size:12})]})]}),e.jsx("div",{className:`commander-grid ${b?"has-expanded":""}`,"data-agent-count":b?1:_.length,children:_.length===0?e.jsx("div",{className:"commander-empty",children:c(d==="all"?"commander.noAgentsAll":d==="unassigned"?"commander.noAgentsUnassigned":"commander.noAgentsArea")}):b?(()=>{const n=f.get(b);return n?e.jsx(Pe,{agent:n,history:Z.get(n.id),isExpanded:!0,isFocused:!0,advancedView:k,index:0,onExpand:ne,onCollapse:ae,onFocus:ce,onInputRef:pe,onLoadMore:U,onClearHistory:w},n.id):null})():_.map((n,l)=>e.jsx(Pe,{agent:n,history:Z.get(n.id),isExpanded:!1,isFocused:l===j,advancedView:k,index:l,onExpand:ne,onCollapse:ae,onFocus:ce,onInputRef:pe,onLoadMore:U,onClearHistory:w},n.id))}),v&&e.jsx(ht,{currentArea:L,onClose:()=>u(!1)}),D&&e.jsx(at,{isOpen:!0,areaId:D,onClose:()=>i(null),onChangeArea:n=>i(n)})]})}):null}export{Ct as CommanderView};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as a,H as Cn,J as qt,K as rn,L as on,j as e,M as cn,N as Nn,u as Ut,O as kn,P as yn,U as An,V as Sn,W as En,X as In,Y as Mn,Z as Tn,_ as Yt,S as E,$ as Kt,a0 as Ht,a1 as Zt,a2 as Nt,a3 as Ae,a4 as Pn,s as f,a5 as dn,m as un,a6 as Ln,z as Jt,B as Qt,I as p,a7 as Rn,q as Dn,a8 as $n,a9 as pn,aa as mn,ab as fn,ac as hn,ad as zn,ae as On,af as Bn,ag as Fn,ah as Wn,ai as Hn,aj as Un,ak as Vn,al as Xn,am as Gn,an as qn,ao as Yn,ap as en,C as Kn,aq as Zn,ar as tn,as as Jn,at as Qn,au as ea,av as ta,aw as na,ax as aa,ay as sa,az as ia,aA as la,aB as ra,aC as oa,aD as ca,aE as da,aF as ua,aG as Ke,aH as pa,aI as ma,aJ as fa,aK as ha,aL as rt,aM as ga,aN as xa,aO as ba,aP as _a,aQ as wa,aR as nn,aS as va}from"./main-B0UlZnfk.js";import{g as ja}from"./area-logos-C4fgpLgO.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-Chj50gSY.js";function Ca(c){const o=a.useRef(c);o.current=c,a.useEffect(()=>{if(!Cn())return;let m=null,h=!1;return qt.addListener("backButton",()=>{o.current()==="exit"&&qt.exitApp()}).then(k=>{h?k.remove():m=k}),()=>{h=!0,m&&(m.remove(),m=null)}},[])}async function Na(c){const o=rn(),m=await fetch(`${on()}/api/agents/${c}/terminal`,{method:"POST",headers:{Authorization:`Bearer ${o}`}});if(!m.ok){const h=await m.json().catch(()=>({}));throw new Error((h==null?void 0:h.error)||`Failed to start terminal (${m.status})`)}return m.json()}async function ka(c){const o=rn();await fetch(`${on()}/api/agents/${c}/terminal`,{method:"DELETE",headers:{Authorization:`Bearer ${o}`}})}const ot=new Map;function ya({agentId:c}){const[o,m]=a.useState(null),[h,k]=a.useState(null);return a.useEffect(()=>{let L=!1;const I=ot.get(c);return I&&(clearTimeout(I),ot.delete(c)),m(null),k(null),Na(c).then(T=>{L||m(T.url)}).catch(T=>{L||k(T instanceof Error?T.message:"Failed to start terminal")}),()=>{L=!0;const T=ot.get(c);T&&clearTimeout(T),ot.set(c,setTimeout(()=>{ot.delete(c),ka(c)},2500))}},[c]),h?e.jsx("div",{className:"flat-classic-terminal flat-classic-terminal--message",children:e.jsx("span",{children:h})}):o?e.jsx("div",{className:"flat-classic-terminal",children:e.jsx(cn,{terminalUrl:o,visible:!0})}):e.jsx("div",{className:"flat-classic-terminal flat-classic-terminal--message",children:e.jsx("span",{children:"Attaching to interactive session…"})})}const Bt=new Map,Aa=6e4;function Sa({agentId:c,contextSummary:o}){const{t:m}=Ut(["terminal","common"]),[h,k]=a.useState(()=>{var z;return((z=Bt.get(c))==null?void 0:z.snapshot)??null}),[L,I]=a.useState(!1),[T,te]=a.useState(null),w=a.useRef(0);a.useEffect(()=>{const z=Bt.get(c);if(z&&Date.now()-z.fetchedAt<Aa){k(z.snapshot);return}const X=++w.current;I(!0),te(null),kn(c).then(J=>{X===w.current&&(Bt.set(c,{snapshot:J,fetchedAt:Date.now()}),k(J),I(!1))}).catch(J=>{X===w.current&&(te(J.message||"Failed to load plan limits"),I(!1))})},[c]);const F=[];if(h!=null&&h.rateLimits){const z=[{key:"fiveHour",label:m("terminal:usage.currentSession"),window:h.rateLimits.fiveHour},{key:"sevenDay",label:m("terminal:usage.currentWeekAll"),window:h.rateLimits.sevenDay},{key:"sevenDayOpus",label:m("terminal:usage.currentWeekOpus"),window:h.rateLimits.sevenDayOpus},{key:"sevenDaySonnet",label:m("terminal:usage.currentWeekSonnet"),window:h.rateLimits.sevenDaySonnet}];for(const X of z)X.window&&F.push({...X,window:X.window})}return e.jsxs("div",{className:"plan-limits-tooltip",children:[o&&e.jsx("div",{className:"plan-limits-tooltip__context",children:o}),e.jsx("div",{className:"plan-limits-tooltip__title",children:m("terminal:usage.limits")}),L&&!h&&e.jsxs("div",{className:"plan-limits-tooltip__muted",children:[m("common:status.loading"),"…"]}),!L&&T&&!h&&e.jsx("div",{className:"plan-limits-tooltip__muted",children:m("terminal:usage.limitsError",{message:T})}),F.length>0?e.jsx("div",{className:"plan-limits-tooltip__gauges",children:F.map(({key:z,label:X,window:J})=>{const Q=Math.max(0,Math.min(100,J.utilization)),oe=An(Q);return e.jsxs("div",{className:"plan-limits-tooltip__gauge",children:[e.jsxs("div",{className:"plan-limits-tooltip__gauge-head",children:[e.jsx("span",{className:"plan-limits-tooltip__gauge-label",children:X}),e.jsx("span",{className:"plan-limits-tooltip__gauge-percent",style:{color:oe},children:m("terminal:usage.percentUsed",{percent:Math.round(Q)})})]}),e.jsx("div",{className:"plan-limits-tooltip__bar",children:e.jsx("div",{className:"plan-limits-tooltip__bar-fill",style:{width:`${Q}%`,background:oe}})}),e.jsx("div",{className:"plan-limits-tooltip__reset",children:m("terminal:usage.resets",{time:yn(J.resetsAt)})})]},z)})}):h&&!L&&e.jsx("div",{className:"plan-limits-tooltip__muted",children:h.rateLimitsError?m("terminal:usage.limitsError",{message:h.rateLimitsError}):h.cliHint})]})}function Ea({agentId:c,disabled:o,contextSummary:m,children:h}){return e.jsx(Nn,{position:"top",maxWidth:320,disabled:o,className:"plan-limits-tooltip-wrapper",triggerStyle:{display:"inline-flex",alignItems:"center"},content:e.jsx(Sa,{agentId:c,contextSummary:m}),children:h})}const Ia=a.memo(function({className:o=""}){const{t:m}=Ut(["common"]),[h,k]=Sn(),L=a.useRef(null),[I,T]=a.useState(null);a.useLayoutEffect(()=>{const w=L.current;if(!w)return;const F=w.querySelector(".view-mode-toggle__btn--active");F&&T({left:F.offsetLeft,width:F.offsetWidth})},[h]);const te=a.useCallback(w=>{if(w!==h){if(typeof window<"u"&&window.dispatchEvent(new CustomEvent("tide:viewmode-switch-pressed",{detail:{mode:w}})),w==="3d"){requestAnimationFrame(()=>k(w));return}k(w)}},[h,k]);return e.jsxs("div",{className:`view-mode-toggle ${o}`,ref:L,children:[I&&e.jsx("div",{className:"view-mode-toggle__indicator",style:{left:I.left,width:I.width}}),En.map(w=>e.jsxs("button",{className:`view-mode-toggle__btn ${h===w?"view-mode-toggle__btn--active":""}`,onClick:()=>te(w),title:m(`common:viewMode.descriptions.${w}`),children:[e.jsxs("span",{className:"view-mode-toggle__icon",children:[w==="2d"&&e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("rect",{x:"3",y:"3",width:"18",height:"18",rx:"2"}),e.jsx("line",{x1:"3",y1:"12",x2:"21",y2:"12"}),e.jsx("line",{x1:"12",y1:"3",x2:"12",y2:"21"})]}),w==="3d"&&e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("path",{d:"M12 2L2 7l10 5 10-5-10-5z"}),e.jsx("path",{d:"M2 17l10 5 10-5"}),e.jsx("path",{d:"M2 12l10 5 10-5"})]}),w==="flat"&&e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("rect",{x:"3",y:"3",width:"8",height:"8",rx:"1"}),e.jsx("rect",{x:"13",y:"3",width:"8",height:"8",rx:"1"}),e.jsx("rect",{x:"3",y:"13",width:"8",height:"8",rx:"1"}),e.jsx("rect",{x:"13",y:"13",width:"8",height:"8",rx:"1"})]}),w==="dashboard"&&e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[e.jsx("rect",{x:"3",y:"3",width:"7",height:"9",rx:"1"}),e.jsx("rect",{x:"14",y:"3",width:"7",height:"5",rx:"1"}),e.jsx("rect",{x:"14",y:"12",width:"7",height:"9",rx:"1"}),e.jsx("rect",{x:"3",y:"16",width:"7",height:"5",rx:"1"})]})]}),e.jsx("span",{className:"view-mode-toggle__label",children:m(`common:viewMode.labels.${w}`)})]},w))]})}),kt=3,yt=280,an=320,Ft=240,sn=64,Ma=["simple","chat","advanced"],Ta={simple:"Simple",chat:"Chat",advanced:"Advanced"},Pa={simple:"○",chat:"◐",advanced:"◉"},La={simple:"Simple view — clean messages only",chat:"Chat view — assistant replies (no tool calls)",advanced:"Advanced view — everything including tools"},ln="flat-clear-context",gn="tide:flat-embedded-panels";function xn(){try{const c=localStorage.getItem(gn),o=c?JSON.parse(c):{};return o&&typeof o=="object"?o:{}}catch{return{}}}function Wt(c,o){try{const m=xn();o?m[c]=o:delete m[c],localStorage.setItem(gn,JSON.stringify(m))}catch{}}function Ra(c){const o=c.split("/").filter(Boolean);return o.length===0?c:o.slice(-2).join("/")}function Da(c){if(c.provider==="codex"){const L=c.codexModel||"gpt-5.6-luna",I=wa[L];return{model:(I==null?void 0:I.label)||L}}if(c.provider==="opencode")return{model:c.opencodeModel||"opencode"};if(c.provider==="grok"){const L=c.grokModel||"grok-4.5",I=c.effort,T=I?nn[I]:void 0;return{model:L,effort:T==null?void 0:T.label}}const o=c.model||"sonnet",m=va[o],h=c.effort,k=h?nn[h]:void 0;return{model:(m==null?void 0:m.label)||o,effort:k==null?void 0:k.label}}function $a(c,o){if(o.type==="rectangle"&&o.width&&o.height){const m=o.width/2,h=o.height/2;return c.x>=o.center.x-m&&c.x<=o.center.x+m&&c.z>=o.center.z-h&&c.z<=o.center.z+h}if(o.type==="circle"&&o.radius){const m=c.x-o.center.x,h=c.z-o.center.z;return m*m+h*h<=o.radius*o.radius}return!1}const za=Zn.memo(function({agentId:o,terminalViewMode:m,onTerminalViewModeChange:h,inspectorOpen:k,onToggleInspector:L,onImageClick:I,onFileClick:T,onBashClick:te,onViewMarkdown:w,onRequestClearSubordinates:F,keyboard:z,canNavigateBack:X,canNavigateForward:J,onNavigateBack:Q,onNavigateForward:oe,agentInfoOpen:Fe,onToggleAgentInfo:Ze,onHeaderContextMenu:ct,onBuildingContextMenu:K}){var it,bt;const b=tn(o),P=un(),Je=Jn(),ne=a.useRef(null),We=a.useRef(null),{displayedAgentId:Re,fadingOut:Qe}=Qn(o),dt=tn(Re),He=!!Je.interactiveMode&&((b==null?void 0:b.provider)??"claude")==="claude"&&!!(b!=null&&b.sessionId),[fe,De]=a.useState(!1);a.useEffect(()=>{De(!1)},[o]),a.useEffect(()=>{!He&&fe&&De(!1)},[He,fe]),a.useEffect(()=>{const n=We.current;if(!n)return;const r=d=>{d.button===3?(d.preventDefault(),d.stopPropagation(),Q()):d.button===4&&(d.preventDefault(),d.stopPropagation(),oe())},i=d=>{(d.button===3||d.button===4)&&d.preventDefault()};return n.addEventListener("mouseup",r),n.addEventListener("mousedown",i),()=>{n.removeEventListener("mouseup",r),n.removeEventListener("mousedown",i)}},[Q,oe]),a.useEffect(()=>{const n=We.current;if(!n)return;let r=0,i=0,d=0;const B=250,re=600,R=80,Le=1.5,Ye=D=>{let U=D instanceof HTMLElement?D:null;for(;U&&U!==n;){const wt=window.getComputedStyle(U).overflowX;if((wt==="auto"||wt==="scroll")&&U.scrollWidth>U.clientWidth)return!0;U=U.parentElement}return!1},_t=D=>{const U=Date.now();if(U<d){D.preventDefault();return}if(Math.abs(D.deltaX)<=Math.abs(D.deltaY)*Le){r=0;return}if(Ye(D.target)){r=0;return}U-i>B&&(r=0),i=U,r+=D.deltaX,r<=-R?(r=0,d=U+re,D.preventDefault(),Q()):r>=R&&(r=0,d=U+re,D.preventDefault(),oe())};return n.addEventListener("wheel",_t,{passive:!1}),()=>n.removeEventListener("wheel",_t)},[Q,oe]);const et=dn(),Se=a.useMemo(()=>{if(!b)return null;const n=new Set,r=[];for(const i of et.values())i.archived||i.directories.length===0||i.assignedAgentIds.includes(o)&&(n.add(i.id),r.push(i));for(const i of et.values())i.archived||i.directories.length===0||n.has(i.id)||$a({x:b.position.x,z:b.position.z},i)&&(n.add(i.id),r.push(i));return r.length===0?null:r.flatMap(i=>i.directories.filter(d=>d&&d.trim().length>0).map(d=>({areaId:i.id,areaName:i.name,dir:d})))},[b,o,et]),{branches:Ee,fetchRemote:he,fetchingDirs:ge}=ea(Se),Ue=a.useMemo(()=>{var i;const n=f.getAreaForAgent(o);if(!n)return[];const r=[];for(const d of P.values())d.type==="terminal"&&f.isPositionInArea(d.position,n)&&r.push({id:d.id,name:d.name,hasUrl:!!((i=d.terminalStatus)!=null&&i.url)});return r},[o,P]),Ve=a.useMemo(()=>{var i;const n=f.getAreaForAgent(o);if(!n)return[];const r=[];for(const d of P.values())d.type==="server"&&((i=d.pm2)!=null&&i.enabled)&&f.isPositionInArea(d.position,n)&&r.push({id:d.id,name:d.name});return r},[o,P]),xe=a.useMemo(()=>{const n=f.getAreaForAgent(o);if(!n)return[];const r=[];for(const i of P.values())i.type==="database"&&i.database&&f.isPositionInArea(i.position,n)&&r.push({id:i.id,name:i.name});return r},[o,P]),Ie=ta(),ce=a.useMemo(()=>{const n=f.getAreaForAgent(o);if(!n)return[];const r=[];for(const i of P.values())if(i.type==="tests"&&f.isPositionInArea(i.position,n)){const d=!!i.folderPath&&Ie.some(B=>na(B,i.folderPath));r.push({id:i.id,name:i.name,working:d})}return r},[o,P,Ie]),be=a.useMemo(()=>{const n=f.getAreaForAgent(o);if(!n)return[];const r=[];for(const i of P.values())i.type==="http"&&f.isPositionInArea(i.position,n)&&r.push({id:i.id,name:i.name});return r},[o,P]),[,de]=a.useReducer(n=>n+1,0),_e=((it=ne.current)==null?void 0:it.search.searchMode)??!1,Me=a.useCallback(()=>{var n;(n=ne.current)==null||n.search.toggleSearch(),de()},[]),we=aa(),tt=we.isPending(ln),[j,ve]=a.useState(null),W=j?P.get(j.buildingId):null,[ut,Te]=a.useState(""),[je,At]=a.useState(()=>sa()),O=a.useMemo(()=>{var n;return((n=f.getAreaForAgent(o))==null?void 0:n.id)??null},[o,P]),$e=a.useCallback((n,r)=>{Te(""),ve(i=>{const d=(i==null?void 0:i.buildingId)===r?null:{type:n,buildingId:r};return O&&Wt(O,d),d})},[O]),ae=a.useCallback(()=>{Te(""),ve(null),O&&Wt(O,null)},[O]);a.useEffect(()=>{if((j==null?void 0:j.type)!=="pm2-logs")return;const n=j.buildingId;return f.startLogStreaming(n,200),()=>f.stopLogStreaming(n)},[j]);const{height:St,onResizeStart:Et}=ia(),{sidePanelWidth:It,handleSidePanelResizeStart:Mt}=la(),[ze,pt]=a.useState(()=>Ht(E.GIT_PANEL_OPEN,!1)),[Ce,_]=a.useState(()=>Ht(E.BUILDINGS_PANEL_OPEN,!1)),[Oe,mt]=a.useState(!1),Ne=a.useCallback(()=>{mt(n=>{const r=!n;return r&&ra.setEnabled(!0),r})},[]),se=a.useCallback(()=>mt(!1),[]),Xe=a.useCallback(()=>{pt(n=>{const r=!n;return Ae(E.GIT_PANEL_OPEN,r),r})},[]),ft=a.useCallback(()=>{_(n=>{const r=!n;return Ae(E.BUILDINGS_PANEL_OPEN,r),r})},[]),Tt=a.useCallback(()=>{pt(!1),Ae(E.GIT_PANEL_OPEN,!1)},[]),Pt=a.useCallback(()=>{_(!1),Ae(E.BUILDINGS_PANEL_OPEN,!1)},[]),Lt=oa(),Pe=a.useMemo(()=>({terminal:Ue,"pm2-logs":Ve,database:xe,tests:ce,http:be}),[Ue,Ve,xe,ce,be]);a.useEffect(()=>{if(!j)return;Pe[j.type].some(r=>r.id===j.buildingId)||(Te(""),ve(null))},[j,Pe]);const Ge=a.useRef(void 0);a.useEffect(()=>{var r;if(Ge.current===O)return;Ge.current=O;const n=O?xn()[O]:void 0;Te(""),n&&((r=Pe[n.type])!=null&&r.some(i=>i.id===n.buildingId))?ve(n):ve(null)},[O,Pe]),a.useEffect(()=>{const n=r=>{var B;const i=r.detail;if(!(i!=null&&i.buildingId)||!(i!=null&&i.type)||!((B=Pe[i.type])!=null&&B.some(re=>re.id===i.buildingId)))return;i.handled=!0,Te("");const d={type:i.type,buildingId:i.buildingId};ve(d),O&&Wt(O,d)};return window.addEventListener("tide:dock-building-flat",n),()=>window.removeEventListener("tide:dock-building-flat",n)},[Pe,O]);const[ie,ue]=a.useState(!1),pe=a.useRef(null);if(a.useEffect(()=>{if(!ie)return;const n=r=>{pe.current&&!pe.current.contains(r.target)&&ue(!1)};return document.addEventListener("mousedown",n),()=>document.removeEventListener("mousedown",n)},[ie]),!b)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 ke=b.contextStats,Z=!!ke,ye=ke?ke.totalTokens:b.contextUsed||0,ht=ke?ke.contextWindow:b.contextLimit||(b.provider==="grok"?5e5:2e5),Rt=ke?ke.usedPercent:Math.round(ye/ht*100),me=Math.max(0,Math.min(100,Rt)),nt=Math.round(me*10)/10,Dt=Math.round((100-me)*10)/10,gt=me>=80?"#ff4a4a":me>=60?"#ff9e4a":me>=40?"#ffd700":"#4aff9e",at=(ye/1e3).toFixed(1),ee=(ht/1e3).toFixed(1),le=b.cwd,st=le?Ra(le):null,qe=((bt=b.subordinateIds)==null?void 0:bt.length)||0,xt=qe>0;return e.jsxs("div",{ref:We,className:`flat-terminal-wrapper ${ze||Ce||Oe?"flat-terminal-wrapper--with-side-panel":""} ${Qe?"pane-fading-out":""}`,style:{"--guake-side-panel-width":`min(${It}px, 70%)`},children:[e.jsxs("div",{className:"flat-terminal-wrapper__header",children:[e.jsxs("button",{type:"button",className:`flat-terminal-wrapper__header-main ${Fe?"flat-terminal-wrapper__header-main--active":""}`,onClick:Ze,onContextMenu:n=>{n.preventDefault(),n.stopPropagation(),ct({x:n.clientX,y:n.clientY})},title:Fe?"Hide agent info":"Show agent info","aria-pressed":Fe,children:[e.jsx(pn,{agent:b,size:28}),e.jsxs("span",{className:"flat-terminal-wrapper__header-info",children:[e.jsx("span",{className:"flat-terminal-wrapper__header-name",children:b.name}),e.jsx("span",{className:"flat-terminal-wrapper__header-status",style:{color:hn(b.status)},children:b.status})]}),b.taskLabel&&e.jsxs("span",{className:"flat-terminal-wrapper__header-task",title:b.taskLabel,children:["📋 ",b.taskLabel]}),e.jsxs("span",{className:"flat-terminal-wrapper__header-model",children:[e.jsx("img",{src:fn(b.provider,"/"),alt:b.provider,className:"flat-terminal-wrapper__header-provider-icon",title:mn(b.provider)}),(()=>{const{model:n,effort:r}=Da(b);return e.jsxs("span",{className:"flat-terminal-wrapper__header-model-chip",title:r?`Model: ${n} · Effort: ${r}`:`Model: ${n}`,children:[e.jsx("span",{className:"flat-terminal-wrapper__header-model-name",children:n}),r&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"flat-terminal-wrapper__header-model-sep","aria-hidden":"true",children:"·"}),e.jsx("span",{className:"flat-terminal-wrapper__header-model-effort",children:r})]})]})})()]})]}),e.jsxs("div",{className:"flat-terminal-wrapper__header-meta",children:[e.jsxs("div",{className:"flat-terminal-wrapper__view-mode",role:"group","aria-label":"Message view mode",children:[Ma.map(n=>e.jsxs("button",{type:"button",className:`flat-terminal-wrapper__view-mode-btn ${!fe&&m===n?"flat-terminal-wrapper__view-mode-btn--active":""}`,onClick:()=>{De(!1),h(n)},title:La[n],"aria-pressed":!fe&&m===n,children:[e.jsx("span",{className:"flat-terminal-wrapper__view-mode-icon","aria-hidden":"true",children:Pa[n]}),e.jsx("span",{className:"flat-terminal-wrapper__view-mode-label",children:Ta[n]})]},n)),He&&e.jsxs("button",{type:"button",className:`flat-terminal-wrapper__view-mode-btn ${fe?"flat-terminal-wrapper__view-mode-btn--active":""}`,onClick:()=>De(n=>!n),title:"Classic TUI — attach to the live interactive claude session in a terminal","aria-pressed":fe,children:[e.jsx("span",{className:"flat-terminal-wrapper__view-mode-icon","aria-hidden":"true",children:e.jsx(p,{name:"terminal",size:13})}),e.jsx("span",{className:"flat-terminal-wrapper__view-mode-label",children:"Classic TUI"})]})]}),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:Q,disabled:!X,title:"Back to previous agent","aria-label":"Back to previous agent",children:e.jsx(p,{name:"arrow-left",size:14})}),e.jsx("button",{type:"button",className:"flat-terminal-wrapper__action-btn",onClick:oe,disabled:!J,title:"Forward to next agent","aria-label":"Forward to next agent",children:e.jsx(p,{name:"arrow-right",size:14})}),e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${_e?"flat-terminal-wrapper__action-btn--active":""}`,onClick:Me,title:_e?"Close search":"Search messages","aria-pressed":_e,children:e.jsx(p,{name:_e?"cross":"search",size:14})}),e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn flat-terminal-wrapper__action-btn--danger ${tt?"flat-terminal-wrapper__action-btn--confirm":""}`,onClick:()=>we.handleClick(ln,()=>{var n;f.clearContext(o),(n=ne.current)==null||n.historyLoader.clearHistory()}),title:tt?"Click again to confirm clear context":"Clear context",children:e.jsx(p,{name:tt?"question":"clear",size:14})}),e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${ze?"flat-terminal-wrapper__action-btn--active":""}`,onClick:Xe,title:ze?"Hide git panel":"Show git changes","aria-pressed":ze,children:e.jsx(p,{name:"git-branch",size:14})}),e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${Ce?"flat-terminal-wrapper__action-btn--active":""}`,onClick:ft,title:Ce?"Hide buildings panel":"Show area buildings","aria-pressed":Ce,children:e.jsx(p,{name:"buildings",size:14})}),e.jsxs("div",{className:"flat-terminal-wrapper__more",ref:pe,children:[e.jsx("button",{type:"button",className:`flat-terminal-wrapper__action-btn ${ie?"flat-terminal-wrapper__action-btn--active":""}`,onClick:()=>ue(n=>!n),title:"More actions","aria-expanded":ie,children:"⋮"}),ie&&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 ${Oe?"flat-terminal-wrapper__more-item--active":""}`,onClick:()=>{Ne(),ue(!1)},title:Oe?"Hide Debug Panel":"Show Debug Panel",children:[e.jsx(p,{name:"bug",size:14}),e.jsx("span",{children:Oe?"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(o),ue(!1)},disabled:b.status!=="idle",title:b.status!=="idle"?"Agent must be idle to collapse context":"Collapse context",children:[e.jsx(p,{name:"package",size:14}),e.jsx("span",{children:"Collapse context"})]}),xt&&e.jsxs("button",{type:"button",role:"menuitem",className:"flat-terminal-wrapper__more-item flat-terminal-wrapper__more-item--danger",onClick:()=>{F(o,qe),ue(!1)},children:[e.jsx(p,{name:"crown",size:14}),e.jsxs("span",{children:["Clear ",qe," subordinate",qe===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(o),ue(!1)},children:[e.jsx(p,{name:"cross",size:14}),e.jsx("span",{children:"Remove agent"})]})]})]})]}),e.jsxs("button",{type:"button",className:`flat-terminal-wrapper__inspector-toggle ${k?"flat-terminal-wrapper__inspector-toggle--active":""}`,onClick:L,title:k?"Hide inspector panel":"Show inspector panel","aria-label":k?"Hide inspector panel":"Show inspector panel","aria-pressed":k,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(p,{name:"cross",size:14})})]})]}),fe&&He?e.jsx(ya,{agentId:o}):Re&&dt?e.jsx(ca,{ref:ne,agentId:Re,agent:dt,viewMode:m,isOpen:!0,onImageClick:I,onFileClick:T,onBashClick:te,onViewMarkdown:w,keyboard:z,hasModalOpen:!1},Re):null,j&&W&&(()=>{var B,re;const n=j.type,r={terminal:"terminal","pm2-logs":"scroll",database:"hard-drives",tests:"flask",http:"globe"},i=n==="terminal"&&!((B=W.terminalStatus)!=null&&B.url),d=!i;return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"guake-bottom-terminal-resize",onMouseDown:Et,role:"separator","aria-orientation":"horizontal","aria-label":"Resize embedded panel"}),e.jsxs("div",{className:"flat-bottom-panel",role:"region","aria-label":`${W.name} panel`,style:{height:St},children:[e.jsxs("div",{className:"flat-bottom-panel__header",children:[e.jsxs("span",{className:"flat-bottom-panel__title",children:[e.jsx(p,{name:r[n],size:12}),e.jsx("span",{children:W.name}),i&&e.jsx("span",{className:"flat-bottom-panel__muted",children:"(starting...)"})]}),e.jsxs("span",{className:"flat-bottom-panel__header-actions",children:[n==="pm2-logs"&&e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"text",className:"guake-bottom-terminal-filter",value:ut,onChange:R=>Te(R.target.value),placeholder:"Filter logs","aria-label":`Filter logs for ${W.name}`,spellCheck:!1}),e.jsx("select",{className:"guake-bottom-terminal-retention",value:je===null?"unlimited":String(je),onChange:R=>{const Le=R.target.value==="unlimited"?null:Number(R.target.value);At(Le),ua(Le)},"aria-label":`Max log retention for ${W.name}`,children:da.map(R=>e.jsx("option",{value:R===null?"unlimited":String(R),children:R===null?"Unlimited":`${R.toLocaleString()} lines`},R===null?"unlimited":R))}),e.jsx("button",{type:"button",className:"flat-bottom-panel__close",onClick:()=>f.clearStreamingLogs(j.buildingId),title:"Clear logs",children:e.jsx(p,{name:"trash",size:12})}),e.jsx("button",{type:"button",className:"flat-bottom-panel__close",onClick:()=>f.sendBuildingCommand(j.buildingId,"restart"),title:"Restart",children:e.jsx(p,{name:"restart",size:12})})]}),d&&e.jsx("button",{type:"button",className:"flat-bottom-panel__close",onClick:()=>{ae(),Ke(j.buildingId)},title:"Maximize — open as modal","aria-label":"Open as modal",children:e.jsx(p,{name:"fullscreen",size:12})}),e.jsx("button",{type:"button",className:"flat-bottom-panel__close",onClick:ae,title:"Close panel","aria-label":"Close panel",children:e.jsx(p,{name:"cross",size:12})})]})]}),e.jsx("div",{className:"flat-bottom-panel__body",children:n==="terminal"?(re=W.terminalStatus)!=null&&re.url?e.jsx(cn,{terminalUrl:W.terminalStatus.url,visible:!0}):e.jsx("div",{className:"flat-bottom-panel__placeholder",children:"Starting terminal..."}):n==="pm2-logs"?e.jsx(pa,{buildingId:j.buildingId,filterText:ut,maxRetention:je}):n==="database"?e.jsx(ma,{building:W}):n==="tests"?e.jsx("div",{className:"tests-panel-host",children:e.jsx(fa,{building:W,autoFocusSearch:!1})}):e.jsx("div",{className:"http-requests-panel-host",children:e.jsx(ha,{building:W,autoFocusSearch:!1})})})]})]})})(),e.jsxs("div",{className:"flat-terminal-wrapper__statusbar",role:"contentinfo",children:[b.isDetached&&e.jsxs("span",{className:"flat-terminal-wrapper__detached",title:"Reattaching session...",children:[e.jsx(p,{name:"refresh",size:12}),e.jsx("span",{children:"Reattaching"})]}),le&&st&&e.jsxs("span",{className:"flat-terminal-wrapper__cwd",title:`Open in file explorer: ${le}`,"aria-label":`Open ${le} in file explorer`,role:"button",tabIndex:0,onClick:()=>f.openFileExplorer(le),onKeyDown:n=>{(n.key==="Enter"||n.key===" ")&&(n.preventDefault(),f.openFileExplorer(le))},children:[e.jsx("span",{className:"flat-terminal-wrapper__cwd-icon",children:e.jsx(p,{name:"folder",size:12})}),e.jsx("span",{className:"flat-terminal-wrapper__cwd-text",children:st})]}),Se&&Se.map(({areaId:n,areaName:r,dir:i})=>{const d=Ee.get(i),B=ge.has(i),re=i.split("/").filter(Boolean).pop()||i;return e.jsxs("span",{className:"flat-terminal-wrapper__area-dir",title:`${r}: ${i}${d?` (${d.branch}${d.ahead?` ↑${d.ahead}`:""}${d.behind?` ↓${d.behind}`:""})`:""}`,onClick:()=>f.openFileExplorerForAreaFolder(n,i),children:[e.jsx(p,{name:"folder-open",size:12}),e.jsx("span",{className:"flat-terminal-wrapper__area-dir-name",children:re}),d&&e.jsxs(e.Fragment,{children:[e.jsxs("span",{className:"flat-terminal-wrapper__area-dir-branch",children:[e.jsx(p,{name:"git-branch",size:10})," ",d.branch]}),d.ahead>0&&e.jsxs("span",{className:"flat-terminal-wrapper__branch-ahead",title:`${d.ahead} ahead`,children:[e.jsx(p,{name:"arrow-up",size:9}),d.ahead]}),d.behind>0&&e.jsxs("span",{className:"flat-terminal-wrapper__branch-behind",title:`${d.behind} behind`,children:[e.jsx(p,{name:"arrow-down",size:9}),d.behind]}),e.jsx("span",{className:`flat-terminal-wrapper__area-fetch ${B?"flat-terminal-wrapper__area-fetch--fetching":""}`,title:"Git fetch",onClick:R=>{R.stopPropagation(),he(i)},children:e.jsx(p,{name:B?"hourglass":"download",size:12})})]})]},`${n}:${i}`)}),e.jsx(Ea,{agentId:o,disabled:((b==null?void 0:b.provider)??"claude")!=="claude",contextSummary:Z?`Context: ${at}k / ${ee}k tokens (${nt}% used)`:void 0,children:e.jsxs("span",{className:"flat-terminal-wrapper__context",tabIndex:0,role:"button",onClick:()=>f.setContextModalAgentId(o),onKeyDown:n=>{(n.key==="Enter"||n.key===" ")&&(n.preventDefault(),f.setContextModalAgentId(o))},title:((b==null?void 0:b.provider)??"claude")!=="claude"?Z?`Context usage: ${at}k / ${ee}k tokens (${nt}% used). Click to view stats.`:"Click to fetch context stats":void 0,children:[e.jsx("span",{className:"flat-terminal-wrapper__context-icon",children:e.jsx(p,{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:`${me}%`,backgroundColor:gt}})}),e.jsxs("span",{className:"flat-terminal-wrapper__context-tokens",style:{color:gt},children:[at,"k/",ee,"k"]}),e.jsxs("span",{className:"flat-terminal-wrapper__context-free",children:["(",Dt,"% free)"]}),!Z&&e.jsx("span",{className:"flat-terminal-wrapper__context-warning",title:"No context stats yet",children:e.jsx(p,{name:"warn",size:12})})]})}),e.jsx("div",{className:"flat-terminal-wrapper__statusbar-spacer","aria-hidden":"true"}),Ue.length>0&&e.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area terminals",children:Ue.map(n=>{const r=(j==null?void 0:j.buildingId)===n.id;return e.jsx("button",{type:"button",className:`flat-terminal-wrapper__building-btn ${r?"flat-terminal-wrapper__building-btn--active":""} ${n.hasUrl?"":"flat-terminal-wrapper__building-btn--offline"}`,title:`${r?"Hide":"Show"} terminal: ${n.name}${n.hasUrl?"":" (starting...)"}`,onClick:()=>{if(r){ae();return}if(n.hasUrl&&rt(n.id)==="modal"){Ke(n.id);return}n.hasUrl||f.sendBuildingCommand(n.id,"start"),$e("terminal",n.id)},onContextMenu:i=>{i.preventDefault(),i.stopPropagation(),K(n.id,{x:i.clientX,y:i.clientY})},children:e.jsx(p,{name:"terminal",size:14})},n.id)})}),Ve.length>0&&e.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area PM2 logs",children:Ve.map(n=>{const r=(j==null?void 0:j.buildingId)===n.id;return e.jsx("button",{type:"button",className:`flat-terminal-wrapper__building-btn ${r?"flat-terminal-wrapper__building-btn--active":""}`,title:`${r?"Hide":"Show"} logs: ${n.name}`,onClick:()=>{r?ae():rt(n.id)==="modal"?Ke(n.id):$e("pm2-logs",n.id)},onContextMenu:i=>{i.preventDefault(),i.stopPropagation(),K(n.id,{x:i.clientX,y:i.clientY})},children:e.jsx(p,{name:"scroll",size:14})},n.id)})}),xe.length>0&&e.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area databases",children:xe.map(n=>{const r=(j==null?void 0:j.buildingId)===n.id;return e.jsx("button",{type:"button",className:`flat-terminal-wrapper__building-btn ${r?"flat-terminal-wrapper__building-btn--active":""}`,title:`${r?"Hide":"Show"} database: ${n.name}`,onClick:()=>{r?ae():rt(n.id)==="modal"?Ke(n.id):$e("database",n.id)},onContextMenu:i=>{i.preventDefault(),i.stopPropagation(),K(n.id,{x:i.clientX,y:i.clientY})},children:e.jsx(p,{name:"hard-drives",size:14})},n.id)})}),ce.length>0&&e.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area tests",children:ce.map(n=>{const r=(j==null?void 0:j.buildingId)===n.id;return e.jsx("button",{type:"button",className:`flat-terminal-wrapper__building-btn ${r?"flat-terminal-wrapper__building-btn--active":""} ${n.working?"flat-terminal-wrapper__building-btn--tests-working":""}`,title:n.working?`Running tests: ${n.name}`:`${r?"Hide":"Show"} tests: ${n.name}`,onClick:()=>{r?ae():rt(n.id)==="modal"?Ke(n.id):$e("tests",n.id)},onContextMenu:i=>{i.preventDefault(),i.stopPropagation(),K(n.id,{x:i.clientX,y:i.clientY})},children:e.jsx(p,{name:"flask",size:14})},n.id)})}),be.length>0&&e.jsx("span",{className:"flat-terminal-wrapper__buildings",role:"group","aria-label":"Area HTTP requests",children:be.map(n=>{const r=(j==null?void 0:j.buildingId)===n.id;return e.jsx("button",{type:"button",className:`flat-terminal-wrapper__building-btn ${r?"flat-terminal-wrapper__building-btn--active":""}`,title:`${r?"Hide":"Show"} HTTP requests: ${n.name}`,onClick:()=>{r?ae():rt(n.id)==="modal"?Ke(n.id):$e("http",n.id)},onContextMenu:i=>{i.preventDefault(),i.stopPropagation(),K(n.id,{x:i.clientX,y:i.clientY})},children:e.jsx(p,{name:"globe",size:14})},n.id)})}),e.jsx("div",{className:"flat-terminal-wrapper__theme",children:e.jsx(ga,{})})]}),ze&&e.jsx(xa,{agentId:o,agents:Lt,onClose:Tt,branchInfoMap:Ee,fetchRemote:he,fetchingDirs:ge,onResizeStart:n=>Mt(n,"right")}),Ce&&e.jsx(ba,{agentId:o,onClose:Pt}),Oe&&e.jsx(_a,{agentId:o,onClose:se})]})}),Oa={groups:[],gridCols:1,gridRows:1,positions:new Map};function Ua({onAgentClick:c,onBuildingClick:o,onBuildingDoubleClick:m,onBuildingPopup:h,onAreaContextMenu:k,onOpenSpawnModal:L,onOpenBossSpawnModal:I,onOpenAreaModal:T}){const{t:te}=Ut(["common"]),w=In(),F=Mn(),[z,X]=a.useState(null),[J,Q]=a.useState(null),[oe,Fe]=a.useState(null);Tn("flatview-image-modal",z!==null,()=>X(null));const[Ze,ct]=a.useState(null),[K,b]=a.useState(null),[P,Je]=a.useState(null),[ne,We]=a.useState(null),[Re,Qe]=a.useState(!1),dt=a.useCallback(()=>{Qe(t=>!t)},[]),He=a.useCallback(()=>{Qe(!1)},[]),[fe,De]=a.useState(()=>{const t=Yt(E.VIEW_MODE);return t==="simple"||t==="chat"||t==="advanced"?t:"simple"}),et=a.useCallback(t=>{De(t),Kt(E.VIEW_MODE,t)},[]);a.useEffect(()=>{const t=s=>{if(s.key!==E.VIEW_MODE)return;const l=s.newValue;(l==="simple"||l==="chat"||l==="advanced")&&De(l)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)},[]);const[Se,Ee]=a.useState(()=>Ht(E.FLAT_INSPECTOR_OPEN,!1)),[he,ge]=a.useState(!1),Ue=a.useCallback(()=>ge(t=>!t),[]),Ve=a.useCallback(()=>ge(!1),[]);a.useEffect(()=>{window.dispatchEvent(new CustomEvent("tide-flat-agents-drawer-state",{detail:{open:he}}))},[he]),a.useEffect(()=>{window.dispatchEvent(new CustomEvent("tide-flat-inspector-state",{detail:{open:Se}}))},[Se]),a.useEffect(()=>{const t=()=>ge(C=>!C),s=()=>{Ee(C=>{const y=!C;return Ae(E.FLAT_INSPECTOR_OPEN,y),y})},l=()=>{ge(!1),Ee(!1),Ae(E.FLAT_INSPECTOR_OPEN,!1)},g=()=>ge(!1),x=()=>{Ee(!1),Ae(E.FLAT_INSPECTOR_OPEN,!1)};return window.addEventListener("tide-toggle-flat-agents-drawer",t),window.addEventListener("tide-toggle-flat-inspector",s),window.addEventListener("tide-close-flat-side-views",l),window.addEventListener("tide-close-flat-agents-drawer-only",g),window.addEventListener("tide-close-flat-inspector-only",x),()=>{window.removeEventListener("tide-toggle-flat-agents-drawer",t),window.removeEventListener("tide-toggle-flat-inspector",s),window.removeEventListener("tide-close-flat-side-views",l),window.removeEventListener("tide-close-flat-agents-drawer-only",g),window.removeEventListener("tide-close-flat-inspector-only",x)}},[]);const xe=a.useRef(null),Ie=a.useRef(null),[ce,be]=a.useState(()=>{const t=Zt(E.FLAT_MIDDLE_WIDTH,0);return t>=yt?t:null}),[de,_e]=a.useState(()=>{const t=Zt(E.FLAT_INSPECTOR_WIDTH,0);return t>=Ft?t:null}),Me=a.useCallback(t=>{if(typeof window>"u")return t;const s=de!==null?kt+de:0,l=window.innerWidth-sn-kt-an-s;return Math.max(yt,Math.min(Math.max(l,yt),t))},[de]),we=a.useCallback(t=>{var x;if(typeof window>"u")return t;const s=(x=xe.current)==null?void 0:x.querySelector(".flat-middle"),l=(s==null?void 0:s.getBoundingClientRect().width)??yt,g=window.innerWidth-sn-l-kt-an-kt;return Math.max(Ft,Math.min(Math.max(g,Ft),t))},[]);a.useEffect(()=>{if(ce===null&&de===null)return;const t=()=>{be(s=>{if(s===null)return s;const l=Me(s);return l===s?s:l}),_e(s=>{if(s===null)return s;const l=we(s);return l===s?s:l})};return window.addEventListener("resize",t),()=>window.removeEventListener("resize",t)},[ce,de,Me,we]);const tt=a.useCallback(t=>{var l;if(t.button!==0)return;const s=(l=xe.current)==null?void 0:l.querySelector(".flat-middle");s&&(t.currentTarget.setPointerCapture(t.pointerId),Ie.current={kind:"middle",startX:t.clientX,startWidth:s.getBoundingClientRect().width,pointerId:t.pointerId},document.body.classList.add("flat-splitter-dragging"))},[]),j=a.useCallback(t=>{var l;if(t.button!==0)return;const s=(l=xe.current)==null?void 0:l.querySelector(".flat-inspector");s&&(t.currentTarget.setPointerCapture(t.pointerId),Ie.current={kind:"inspector",startX:t.clientX,startWidth:s.getBoundingClientRect().width,pointerId:t.pointerId},document.body.classList.add("flat-splitter-dragging"))},[]),ve=a.useCallback(t=>{const s=Ie.current;if(!s||t.pointerId!==s.pointerId)return;const l=t.clientX-s.startX;s.kind==="middle"?be(Me(s.startWidth+l)):_e(we(s.startWidth-l))},[Me,we]),W=a.useCallback(t=>{const s=Ie.current;if(!s||t.pointerId!==s.pointerId)return;try{t.currentTarget.releasePointerCapture(t.pointerId)}catch{}if(Ie.current=null,document.body.classList.remove("flat-splitter-dragging"),!(Math.abs(t.clientX-s.startX)>2))return;const g=t.clientX-s.startX;if(s.kind==="middle"){const x=Me(s.startWidth+g);be(x),Nt(E.FLAT_MIDDLE_WIDTH,x)}else{const x=we(s.startWidth-g);_e(x),Nt(E.FLAT_INSPECTOR_WIDTH,x)}},[Me,we]),ut=a.useCallback(()=>{be(null),Nt(E.FLAT_MIDDLE_WIDTH,0)},[]),Te=a.useCallback(()=>{_e(null),Nt(E.FLAT_INSPECTOR_WIDTH,0)},[]),[je,At]=a.useState(()=>Yt(E.FLAT_INSPECTOR_VIEW)==="tracking"?"tracking":"agent"),O=a.useCallback(t=>{At(t),Kt(E.FLAT_INSPECTOR_VIEW,t)},[]),$e=a.useCallback(()=>{Ee(t=>{const s=!t;return Ae(E.FLAT_INSPECTOR_OPEN,s),s})},[]),ae=a.useCallback(()=>{Ee(!1),Ae(E.FLAT_INSPECTOR_OPEN,!1)},[]),St=Pn(),Et=a.useCallback((t,s)=>{X({url:t,name:s})},[]),It=a.useCallback((t,s)=>{Q({command:t,output:s,isLive:!1})},[]),Mt=a.useCallback((t,s)=>{var x;const l=F.size>0?Array.from(F)[0]:null,g=l?(x=f.getState().agents.get(l))==null?void 0:x.cwd:void 0;f.setFileViewerPath(t,s,g)},[F]),ze=a.useCallback(t=>{Fe(t)},[]),pt=a.useCallback((t,s)=>{ct({agentId:t,count:s})},[]),Ce=a.useCallback(t=>{m?m(t):o(t)},[o,m]),_=a.useMemo(()=>F.size>0?Array.from(F)[0]:null,[F]),Oe=a.useCallback(t=>{_&&b({agentId:_,position:t})},[_]),mt=a.useCallback((t,s)=>{Je({buildingId:t,position:s})},[]);a.useEffect(()=>{Qe(!1)},[_]);const Ne=a.useRef([]),se=a.useRef(-1),Xe=a.useRef(!1),ft=a.useRef(null),[Tt,Pt]=a.useState(!1),[Lt,Pe]=a.useState(!1),Ge=a.useRef(!1),ie=a.useRef(null),ue=a.useRef(!1),pe=a.useMemo(()=>new Set(w.map(t=>t.id)),[w]),ke=a.useMemo(()=>{const t=new Map(w.map(l=>[l.id,l])),s=new Map;for(const l of w)if((l.isBoss||l.class==="boss")&&l.subordinateIds&&l.subordinateIds.length>0){const g=l.subordinateIds.map(x=>t.get(x)).filter(x=>x!==void 0);g.length>0&&s.set(l.id,g)}return s},[w]),Z=a.useCallback(()=>{const t=Ne.current,s=se.current;Pt(s>0),Pe(s>=0&&s<t.length-1)},[]),ye=a.useCallback(t=>{const s=Ne.current;if(s.length===0)return;let l=se.current+t;for(;l>=0&&l<s.length;){const g=s[l];if(pe.has(g)){Xe.current=!0,se.current=l,Z(),f.selectAgent(g);return}l+=t}},[pe,Z]),ht=a.useCallback(()=>ye(-1),[ye]),Rt=a.useCallback(()=>ye(1),[ye]);Ca(a.useCallback(()=>{const t=Ne.current,s=se.current;return t.length>0&&s>0?(ye(-1),"handled"):"exit"},[ye]));const me=a.useCallback((t,s)=>{if(typeof window>"u")return;const l=window.history.state,x={...typeof l=="object"&&l!==null?l:{},__flatAgentNav:{agentId:t}};s==="replace"?window.history.replaceState(x,"",window.location.href):window.history.pushState(x,"",window.location.href)},[]);a.useEffect(()=>{if(!_){Ge.current=!1,ie.current=null;return}if(!Ge.current){me(_,"replace"),Ge.current=!0,ie.current=_;return}if(ue.current){ue.current=!1,ie.current=_;return}ie.current!==_&&(me(_,"push"),ie.current=_)},[_,me]),a.useEffect(()=>{const t=s=>{var C,y;const l=(y=(C=s.state)==null?void 0:C.__flatAgentNav)==null?void 0:y.agentId;if(!l||typeof l!="string"||!pe.has(l)||l===_)return;ue.current=!0,Xe.current=!0;const g=Ne.current,x=g.lastIndexOf(l);x>=0?se.current=x:(g.push(l),se.current=g.length-1),Z(),f.selectAgent(l)};return window.addEventListener("popstate",t),()=>window.removeEventListener("popstate",t)},[pe,_,Z]),a.useEffect(()=>{if(!_){Ne.current=[],se.current=-1,Z();return}if(ft.current=_,Xe.current){Xe.current=!1,Z();return}const t=Ne.current,s=se.current;if(s>=0&&t[s]===_){Z();return}const l=s<t.length-1?t.slice(0,s+1):t.slice();l.push(_),l.length>100&&l.shift(),Ne.current=l,se.current=l.length-1,Z()},[_,Z]);const nt=a.useCallback(t=>{c(t),ge(!1)},[c]),Dt=_??"",gt=a.useCallback(()=>{},[]),at=a.useCallback(t=>{nt(t)},[nt]),ee=Se,[le,st]=a.useState(ee),[qe,xt]=a.useState(ee);a.useEffect(()=>{if(ee){st(!0);return}xt(!1);const t=setTimeout(()=>st(!1),240);return()=>clearTimeout(t)},[ee]),a.useEffect(()=>{if(!le||!ee)return;let t=0;const s=requestAnimationFrame(()=>{t=requestAnimationFrame(()=>xt(!0))});return()=>{cancelAnimationFrame(s),cancelAnimationFrame(t)}},[le,ee]);const it=a.useRef(null);a.useEffect(()=>{if(_)return;const t=s=>{if(s.key!==" "&&s.key!=="Backspace")return;const l=s.target;if(l.tagName==="INPUT"||l.tagName==="TEXTAREA"||l.isContentEditable)return;const g=ft.current;!g||!pe.has(g)||(s.preventDefault(),f.selectAgent(g))};return document.addEventListener("keydown",t),()=>document.removeEventListener("keydown",t)},[_,pe]);const[bt,n]=a.useState(new Set),r=a.useCallback(t=>{n(s=>{const l=new Set(s);return l.has(t)?l.delete(t):l.add(t),l})},[]),[i,d]=a.useState(()=>typeof window<"u"&&window.matchMedia("(max-width: 768px)").matches);a.useEffect(()=>{if(typeof window>"u")return;const t=window.matchMedia("(max-width: 768px)"),s=l=>d(l.matches);return t.addEventListener("change",s),()=>t.removeEventListener("change",s)},[]);const[B,re]=a.useState(null),R=a.useCallback(t=>{re(s=>s===t?null:t)},[]),Le=dn(),Ye=un(),[_t]=Ln(),D=a.useMemo(()=>{if(_)return Oa;const t=new Map,s=[];for(const v of w){const S=f.getAreaForAgent(v.id);if(!Jt((S==null?void 0:S.id)??null))continue;if(!S||S.archived){s.push(v);continue}const M=t.get(S.id);M?M.push(v):t.set(S.id,[v])}const l=new Map,g=[];for(const v of Ye.values()){let S=!1;for(const M of Le.values())if(!M.archived&&Qt(M.id)&&f.isPositionInArea(v.position,M)){const G=l.get(M.id);G?G.push(v):l.set(M.id,[v]),S=!0;break}!S&&Jt(null)&&g.push(v)}const x=[];for(const[,v]of Le){if(v.archived||!Qt(v.id))continue;const S=t.get(v.id),M=l.get(v.id)??[];(S&&S.length>0||M.length>0)&&x.push({area:v,agents:S??[],buildings:M})}(s.length>0||g.length>0)&&x.push({area:{id:"__unassigned__",name:"Unassigned",color:"#6272a4",center:{x:0,z:0},type:"circle",radius:0,directories:[],archived:!1,assignedAgentIds:[],zIndex:0},agents:s,buildings:g});const C=x.filter(v=>v.area.id!=="__unassigned__"),y=x.filter(v=>v.area.id==="__unassigned__");let u=1,A=1;const V=new Map;if(C.length>1){let v=1/0,S=-1/0,M=1/0,G=-1/0;for(const q of C)v=Math.min(v,q.area.center.x),S=Math.max(S,q.area.center.x),M=Math.min(M,q.area.center.z),G=Math.max(G,q.area.center.z);const vt=S-v||1,jt=G-M||1;if(C.length<=4){u=C.length,A=1;const q=[...C].sort((Y,$t)=>Y.area.center.x-$t.area.center.x);for(let Y=0;Y<q.length;Y++)V.set(q[Y].area.id,{row:1,col:Y+1})}else{const q=[...C].sort((N,H)=>N.area.center.x-H.area.center.x),Y=[];for(let N=1;N<q.length;N++)Y.push(q[N].area.center.x-q[N-1].area.center.x);const $t=Y.reduce((N,H)=>N+H,0)/Y.length||1;let Vt=1;for(const N of Y)N>$t*1.3&&Vt++;u=Math.max(2,Math.min(Vt,C.length));const zt=[...C].sort((N,H)=>N.area.center.z-H.area.center.z),Ct=[];for(let N=1;N<zt.length;N++)Ct.push(zt[N].area.center.z-zt[N-1].area.center.z);const _n=Ct.reduce((N,H)=>N+H,0)/Ct.length||1;let Xt=1;for(const N of Ct)N>_n*1.3&&Xt++;A=Math.max(2,Math.min(Xt,C.length)),u=Math.max(u,Math.ceil(C.length/A)),A=Math.max(A,Math.ceil(C.length/u));const wn=vt/u,vn=jt/A,Ot=new Set;for(const N of C){let H=Math.min(u-1,Math.max(0,Math.floor((N.area.center.x-v)/wn))),Be=Math.min(A-1,Math.max(0,Math.floor((N.area.center.z-M)/vn))),lt=`${Be},${H}`,Gt=0;const jn=A*u;for(;Ot.has(lt)&&Gt<jn;)H++,H>=u&&(H=0,Be=(Be+1)%A),lt=`${Be},${H}`,Gt++;Ot.has(lt)&&(Be=A,H=0,lt=`${Be},${H}`,A++),Ot.add(lt),V.set(N.area.id,{row:Be+1,col:H+1})}}}const $=v=>{v.sort((S,M)=>{var vt,jt,q,Y;const G=(((vt=S.position)==null?void 0:vt.z)??0)-(((jt=M.position)==null?void 0:jt.z)??0);return G!==0?G:(((q=S.position)==null?void 0:q.x)??0)-(((Y=M.position)==null?void 0:Y.x)??0)})};for(const v of C)$(v.agents);for(const v of y)$(v.agents);return{groups:[...C,...y],gridCols:u,gridRows:A,positions:V}},[w,Le,Ye,_t,_]),U=a.useMemo(()=>{if(!K)return[];const t=w.find(s=>s.id===K.agentId);return t?[{id:"edit-agent",label:"Edit Agent",icon:e.jsx(p,{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(p,{name:"chat",size:14}),onClick:()=>c(t.id)},{id:"clone-agent",label:"Clone Agent",icon:e.jsx(p,{name:"clipboard",size:14}),onClick:()=>f.cloneAgent(t.id)},{id:"fork-agent",label:"Fork Agent (with history)",icon:e.jsx(p,{name:"git-branch",size:14}),onClick:()=>f.forkAgent(t.id)},{id:"delete-agent",label:"Delete Agent",icon:e.jsx(p,{name:"trash",size:14}),danger:!0,onClick:()=>{We({agentId:t.id,name:t.name})}}]:[]},[K,w,c]),wt=a.useMemo(()=>{var C;if(!P)return[];const t=Ye.get(P.buildingId);if(!t)return[];const s=[],l=t.type==="server"||t.type==="docker"||t.type==="terminal",g=t.status==="running",x=t.type==="boss";if(s.push({id:"open",label:t.type==="database"?"Open Database":t.type==="folder"?"Open Folder":t.type==="tests"?"Open Tests":t.type==="http"?"Open Requests":t.type==="boss"?"View Boss Logs":t.type==="terminal"?"Open Terminal":t.type==="server"&&((C=t.pm2)!=null&&C.enabled)?"View PM2 Logs":"Open",icon:e.jsx(p,{name:t.type==="database"?"database":t.type==="folder"?"folder":t.type==="tests"?"flask":t.type==="http"?"globe":t.type==="terminal"?"terminal":"eye",size:14}),onClick:()=>Ce(t.id)}),l&&(g||s.push({id:"start",label:"Start",icon:e.jsx(p,{name:"play",size:14}),onClick:()=>f.sendBuildingCommand(t.id,"start")}),g&&(s.push({id:"restart",label:"Restart",icon:e.jsx(p,{name:"refresh",size:14}),onClick:()=>f.sendBuildingCommand(t.id,"restart")}),s.push({id:"stop",label:"Stop",icon:e.jsx(p,{name:"stop",size:14}),onClick:()=>f.sendBuildingCommand(t.id,"stop")}))),x&&t.subordinateBuildingIds&&t.subordinateBuildingIds.length>0&&(s.push({id:"start-all",label:"Start All Subordinates",icon:e.jsx(p,{name:"launch",size:14}),onClick:()=>{for(const y of t.subordinateBuildingIds)f.sendBuildingCommand(y,"start")}}),s.push({id:"stop-all",label:"Stop All Subordinates",icon:e.jsx(p,{name:"pause",size:14}),onClick:()=>{for(const y of t.subordinateBuildingIds)f.sendBuildingCommand(y,"stop")}}),s.push({id:"restart-all",label:"Restart All Subordinates",icon:e.jsx(p,{name:"restart",size:14}),onClick:()=>{for(const y of t.subordinateBuildingIds)f.sendBuildingCommand(y,"restart")}})),l&&s.push({id:"health-check",label:"Health Check",icon:e.jsx(p,{name:"health",size:14}),onClick:()=>f.sendBuildingCommand(t.id,"healthCheck")}),s.push({id:"divider-edit",label:"",divider:!0,onClick:()=>{}}),s.push({id:"edit",label:"Edit Building",icon:e.jsx(p,{name:"edit",size:14}),onClick:()=>{window.dispatchEvent(new CustomEvent("tide:building-edit",{detail:{buildingId:t.id}}))}}),s.push({id:"clone",label:"Clone Building",icon:e.jsx(p,{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 y of t.urls)s.push({id:`url-${y.label}`,label:y.label,icon:e.jsx(p,{name:"link",size:14}),onClick:()=>window.open(y.url,"_blank","noopener,noreferrer")});return s.push({id:"divider-danger",label:"",divider:!0,onClick:()=>{}}),s.push({id:"delete",label:"Delete Building",icon:e.jsx(p,{name:"trash",size:14}),danger:!0,onClick:()=>f.deleteBuilding(t.id)}),s},[P,Ye,Ce]),bn=a.useCallback(t=>{const s=new Set(D.groups.map(l=>l.area.id));s.delete(t),n(s),requestAnimationFrame(()=>{const l=it.current;if(!l)return;const g=l.querySelector(`[data-area-id="${t}"]`);if(!g)return;const x=l.getBoundingClientRect(),y=g.getBoundingClientRect().top-x.top+l.scrollTop-8;l.scrollTo({top:Math.max(0,y),behavior:"smooth"})})},[D]);return e.jsxs("div",{ref:xe,className:`flat-view ${ee?"flat-view--with-inspector":""} ${_?"flat-view--has-chat":""} ${he?"flat-view--mobile-sidebar-open":""}`,style:(()=>{if(ce===null&&de===null)return;const t={};return ce!==null&&(t["--flat-middle-width"]=`${ce}px`),de!==null&&(t["--flat-inspector-width"]=`${de}px`),t})(),children:[he&&e.jsx("div",{className:"flat-mobile-sidebar-backdrop",onClick:Ve,"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:L,title:"Create new agent",children:"+ Agent"}),e.jsx("button",{className:"flat-cta-btn flat-cta-btn--boss",onClick:I,title:"Create new boss agent",children:"+ Boss"}),e.jsx("button",{className:"flat-cta-btn flat-cta-btn--area",onClick:T,title:"Create new area",children:"+ Area"})]})}),e.jsx("div",{className:"flat-middle__content",children:e.jsx(Rn,{activeAgentId:Dt,onClose:gt,onSelectAgent:at,collapsedAreas:bt,onToggleArea:r,agentListRef:it})})]}),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:tt,onPointerMove:ve,onPointerUp:W,onPointerCancel:W,onDoubleClick:ut}),e.jsxs("div",{className:"flat-right",children:[e.jsxs("button",{type:"button",className:"flat-mobile-sidebar-toggle","aria-label":he?"Close agents sidebar":"Open agents sidebar","aria-expanded":he,onClick:Ue,children:[e.jsx(p,{name:"list",size:18}),e.jsx("span",{className:"flat-mobile-sidebar-toggle__label",children:"Agents"})]}),_?e.jsx(za,{agentId:_,terminalViewMode:fe,onTerminalViewModeChange:et,inspectorOpen:Se,onToggleInspector:$e,onImageClick:Et,onFileClick:Mt,onBashClick:It,onViewMarkdown:ze,onRequestClearSubordinates:pt,keyboard:St,canNavigateBack:Tt,canNavigateForward:Lt,onNavigateBack:ht,onNavigateForward:Rt,agentInfoOpen:Re,onToggleAgentInfo:dt,onHeaderContextMenu:Oe,onBuildingContextMenu:mt}):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(Ia,{className:"flat-map__view-mode"})]}),e.jsx("div",{className:"flat-map__grid",style:{gridTemplateColumns:`repeat(${D.gridCols}, 1fr)`},children:D.groups.length===0?e.jsx("div",{className:"flat-map__empty",children:e.jsx("span",{children:"No areas or agents yet"})}):(()=>{var s;const t=i&&B?((s=D.positions.get(B))==null?void 0:s.row)??null:null;return D.groups.map(l=>{var y;const g=l.area.id,x=D.positions.get(g),C=i&&B!==g;return i&&t!=null&&(x==null?void 0:x.row)===t&&g!==B?null:e.jsxs("div",{className:`flat-map-area-card${C?" flat-map-area-card--collapsed":""}`,style:{"--area-color":l.area.color,gridRow:x==null?void 0:x.row,gridColumn:x==null?void 0:x.col},onContextMenu:u=>{k&&(u.preventDefault(),u.stopPropagation(),k(g,{x:u.clientX,y:u.clientY}))},children:[((y=l.area.logo)==null?void 0:y.filename)&&e.jsx("img",{className:"flat-map-area-card__logo",src:ja(l.area.logo.filename),alt:"","aria-hidden":"true",onError:u=>{u.currentTarget.style.display="none"}}),e.jsxs("button",{type:"button",className:"flat-map-area-card__header",onClick:()=>i?R(g):bn(g),title:i?C?`Expand ${l.area.name}`:`Collapse ${l.area.name}`:`Focus ${l.area.name} in left panel`,"aria-expanded":i?!C:void 0,children:[e.jsx("span",{className:"flat-map-area-card__color",style:{background:l.area.color}}),e.jsx("span",{className:"flat-map-area-card__name",children:l.area.name}),e.jsx("span",{className:"flat-map-area-card__count",children:l.agents.length}),i&&e.jsx(p,{name:C?"caret-down":"caret-up",size:11,className:"flat-map-area-card__caret"})]}),e.jsx("div",{className:"flat-map-area-card__agents",children:l.agents.map(u=>{const A=u.isBoss||u.class==="boss",V=A?ke.get(u.id):void 0,$=Dn(u),v=$.usedPercent>=80?"#ff4a4a":$.usedPercent>=60?"#ff9e4a":$.usedPercent>=40?"#ffd700":"#4aff9e",S=`Context: ${($.totalTokens/1e3).toFixed(1)}k / ${($.contextWindow/1e3).toFixed(1)}k (${$.usedPercent}% used, ${$.freePercent}% free)`,M=u.latestTodos&&u.latestTodos.length>0||V&&V.length>0;return e.jsx($n,{todos:u.latestTodos,subordinates:V,position:"top",children:e.jsxs("button",{type:"button",className:`flat-map-agent-chip ${u.status}`,onClick:()=>c(u.id),onContextMenu:G=>{G.preventDefault(),G.stopPropagation(),b({agentId:u.id,position:{x:G.clientX,y:G.clientY}})},title:M?void 0:`${A?"Boss · ":""}Open chat with ${u.name}
|
|
2
|
+
${S}`,children:[e.jsx(pn,{agent:u,size:16}),A&&e.jsx("span",{className:"flat-map-agent-chip__crown","aria-hidden":"true",children:e.jsx(p,{name:"crown",size:11,color:"#ffd700",weight:"fill"})}),e.jsx("span",{className:"flat-map-agent-chip__name",children:u.name}),e.jsx("img",{src:fn(u.provider,"/"),alt:u.provider,className:"flat-map-agent-chip__provider-icon",title:mn(u.provider)}),e.jsx("span",{className:"flat-map-agent-chip__dot",style:{backgroundColor:hn(u.status)}}),u.latestTodos&&u.latestTodos.length>0&&e.jsx(zn,{todos:u.latestTodos,maxDots:6}),A&&V&&V.length>0&&e.jsx(On,{subordinates:V,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:`${$.usedPercent}%`,backgroundColor:v}})})]})},u.id)})}),l.area.directories.length>0&&e.jsx("div",{className:"flat-map-area-card__folders",role:"group","aria-label":`${l.area.name} folders`,children:l.area.directories.map(u=>{const A=u.split("/").filter(Boolean).pop()||u;return e.jsxs("button",{type:"button",className:"flat-map-folder-chip",onClick:V=>{V.stopPropagation(),f.openFileExplorerForAreaFolder(g,u)},title:`Open in file explorer: ${u}`,children:[e.jsx(p,{name:"folder-open",size:12}),e.jsx("span",{className:"flat-map-folder-chip__name",children:A})]},u)})}),l.buildings.length>0&&e.jsx("div",{className:"flat-map-area-card__buildings",children:l.buildings.map(u=>{var V;const A=(V=Bn[u.type])==null?void 0:V.color;return e.jsxs("button",{type:"button",className:`flat-map-building-chip flat-map-building-chip--${u.status}`,style:A?{"--building-type-color":A}:void 0,onClick:$=>{if(h){const v=$.currentTarget.getBoundingClientRect();h(u.id,{x:v.right,y:v.top+v.height/2})}else Ce(u.id)},onContextMenu:$=>{$.preventDefault(),$.stopPropagation(),Je({buildingId:u.id,position:{x:$.clientX,y:$.clientY}})},title:`${u.name} · ${u.type} · ${u.status}`,children:[e.jsx(p,{name:Fn(u.type),size:12,color:A}),e.jsx("span",{className:"flat-map-building-chip__name",children:u.name}),e.jsx("span",{className:"flat-map-building-chip__dot",style:{backgroundColor:Wn(u.status)}})]},u.id)})})]},g)})})()})]})})]}),ee&&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:j,onPointerMove:ve,onPointerUp:W,onPointerCancel:W,onDoubleClick:Te}),le&&e.jsxs("aside",{className:`flat-inspector ${qe?"flat-inspector--open":"flat-inspector--closing"}`,"aria-label":"Inspector panel",children:[e.jsxs("div",{className:"flat-inspector__header",children:[e.jsxs("div",{className:"flat-inspector__tabs",role:"tablist","aria-label":"Inspector view",children:[e.jsx("button",{type:"button",role:"tab","aria-selected":je==="agent",className:`flat-inspector__tab ${je==="agent"?"flat-inspector__tab--active":""}`,onClick:()=>O("agent"),children:"Agent"}),e.jsx("button",{type:"button",role:"tab","aria-selected":je==="tracking",className:`flat-inspector__tab ${je==="tracking"?"flat-inspector__tab--active":""}`,onClick:()=>O("tracking"),children:"Tracking"})]}),e.jsx("button",{type:"button",className:"flat-inspector__close",onClick:ae,title:"Close inspector","aria-label":"Close inspector",children:"✕"})]}),e.jsx("div",{className:"flat-inspector__body",children:je==="tracking"?e.jsx(Hn,{activeAgentId:_??"",onSelectAgent:t=>{c(t),window.innerWidth<=768&&ae()}}):(()=>{if(!_)return e.jsx("div",{className:"flat-inspector__empty",children:e.jsx("span",{children:"Select an agent to inspect"})});const t=w.find(s=>s.id===_);return t?e.jsx(Un,{agent:t,onFocusAgent:s=>{c(s),window.innerWidth<=768&&ae()},onKillAgent:s=>f.killAgent(s)}):e.jsx("div",{className:"flat-inspector__empty",children:e.jsx("span",{children:"Agent not found"})})})()})]}),z&&e.jsx(Vn,{url:z.url,name:z.name,onClose:()=>X(null)}),J&&e.jsx(Xn,{state:J,onClose:()=>Q(null)}),e.jsx(Gn,{agent:_?w.find(t=>t.id===_)??null:null,content:oe,onClose:()=>Fe(null)}),Ze&&e.jsx(qn,{action:"clear-subordinates",selectedAgentId:Ze.agentId,subordinateCount:Ze.count,onClose:()=>ct(null),onClearHistory:()=>{}}),e.jsx(Yn,{agent:_?w.find(t=>t.id===_)??null:null,isOpen:Re&&!!_,onClose:He}),e.jsx(en,{isOpen:K!==null,position:(K==null?void 0:K.position)??{x:0,y:0},worldPosition:{x:0,z:0},actions:U,onClose:()=>b(null)}),e.jsx(en,{isOpen:P!==null,position:(P==null?void 0:P.position)??{x:0,y:0},worldPosition:{x:0,z:0},actions:wt,onClose:()=>Je(null)}),e.jsx(Kn,{isOpen:ne!==null,title:te("common:confirm.removeAgentTitle"),message:te("common:confirm.removeAgentMessage",{name:(ne==null?void 0:ne.name)??""}),confirmLabel:te("common:buttons.remove"),cancelLabel:te("common:buttons.cancel"),variant:"danger",onConfirm:()=>{ne&&f.removeAgentFromServer(ne.agentId)},onClose:()=>We(null)})]})}export{Ua as FlatView};
|