tide-commander 1.167.1 → 1.168.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 +14 -0
- package/dist/assets/{BossLogsModal-C1fvmbcN.js → BossLogsModal-BRDh5IzT.js} +1 -1
- package/dist/assets/{BossSpawnModal-B-1O9ZP7.js → BossSpawnModal-Dg_EGtCG.js} +1 -1
- package/dist/assets/{ControlsModal-DxDjUTGb.js → ControlsModal-DAovIlUf.js} +1 -1
- package/dist/assets/{DockerLogsModal-Da9yHnmj.js → DockerLogsModal-BRrYrApc.js} +1 -1
- package/dist/assets/{EmbeddedEditor-Bt471BjS.js → EmbeddedEditor-Df75irwV.js} +1 -1
- package/dist/assets/{GmailOAuthSetup-N5JL1wj1.js → GmailOAuthSetup-DSMzywmo.js} +1 -1
- package/dist/assets/{GoogleOAuthSetup-DB_L3CSU.js → GoogleOAuthSetup-CXJ459pG.js} +1 -1
- package/dist/assets/{IframeModal-Cp-zWTdB.js → IframeModal-Dne8Lb1Z.js} +1 -1
- package/dist/assets/{IntegrationsPanel-CDbEslW3.js → IntegrationsPanel-BXgfwVa5.js} +2 -2
- package/dist/assets/{LogViewerModal-CvE-S6la.js → LogViewerModal-31Wfm8Rt.js} +1 -1
- package/dist/assets/{MonitoringModal-CnWOSvDm.js → MonitoringModal-B_QGViPq.js} +1 -1
- package/dist/assets/{PM2LogsModal-BA5dIvFa.js → PM2LogsModal-BhillnFo.js} +1 -1
- package/dist/assets/{RestoreArchivedAreaModal-BWE1vBbp.js → RestoreArchivedAreaModal-DmaOjUu2.js} +1 -1
- package/dist/assets/{Scene2DCanvas-Bkw11_k3.js → Scene2DCanvas-6mD-xaPc.js} +1 -1
- package/dist/assets/{SceneManager-DcIJ0fwQ.js → SceneManager-CG6XpqNd.js} +2 -2
- package/dist/assets/{SkillsPanel-CiUnZ-p6.js → SkillsPanel-BoSmdSJs.js} +1 -1
- package/dist/assets/{SlackMultiInstanceSetup-D72RPfOJ.js → SlackMultiInstanceSetup-bWNrYDUy.js} +1 -1
- package/dist/assets/{SpawnModal-C7SE5U7Q.js → SpawnModal-BzYvzKzO.js} +1 -1
- package/dist/assets/{StatisticsModal-DToMH_hE.js → StatisticsModal-CYR72CEI.js} +1 -1
- package/dist/assets/{SubordinateAssignmentModal-B2vDLdp1.js → SubordinateAssignmentModal-DtVPNb6T.js} +1 -1
- package/dist/assets/{TriggerManagerPanel-Bl-7r3SA.js → TriggerManagerPanel-DodDg2zU.js} +1 -1
- package/dist/assets/{WorkflowEditorPanel-B5WatRJn.js → WorkflowEditorPanel-BlwRtKNj.js} +1 -1
- package/dist/assets/{abnfDiagram-VRR7QNED-CZtFQa7q.js → abnfDiagram-VRR7QNED-DV46IvPQ.js} +1 -1
- package/dist/assets/{arc-DpOW7Rzk.js → arc-BfG00eQZ.js} +1 -1
- package/dist/assets/{architectureDiagram-ZJ3FMSHR-BaxzpkYc.js → architectureDiagram-ZJ3FMSHR--SDr6CQp.js} +1 -1
- package/dist/assets/{area-logos-viFj5Uls.js → area-logos-NK9NedhA.js} +1 -1
- package/dist/assets/{blockDiagram-677ZJIJ3-CdSlu9z0.js → blockDiagram-677ZJIJ3-FdI0ZiKJ.js} +1 -1
- package/dist/assets/{c4Diagram-LMCZKHZV-QEoKm8Zq.js → c4Diagram-LMCZKHZV-CSdYTskf.js} +1 -1
- package/dist/assets/channel-rgk7L86y.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-CPHPRLk0.js → chunk-2Q5K7J3B-eHm3Jjqg.js} +1 -1
- package/dist/assets/{chunk-32BRIVSS-Cuk_gIdG.js → chunk-32BRIVSS-DnRrfnni.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-5r6zermk.js → chunk-5VM5RSS4-7y5gKPmH.js} +1 -1
- package/dist/assets/{chunk-EX3LRPZG-Cs5LqZTp.js → chunk-EX3LRPZG-d8hPAccK.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-CqbF8JzJ.js → chunk-JWPE2WC7-Dq4bisB-.js} +1 -1
- package/dist/assets/{chunk-MOJQB5TN-CFmxz4-y.js → chunk-MOJQB5TN-CqVJuhM2.js} +1 -1
- package/dist/assets/{chunk-RYQCIY6F-C3kPXotN.js → chunk-RYQCIY6F-CytU8lKk.js} +1 -1
- package/dist/assets/{chunk-V7JOEXUC-wG8nLKy3.js → chunk-V7JOEXUC-DsjA47Dg.js} +1 -1
- package/dist/assets/{chunk-VR4S4FIN-Z8m3eai1.js → chunk-VR4S4FIN-BeB7BeCa.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-Cvxssa50.js → chunk-XXDRQBXY-Iej6pbIn.js} +1 -1
- package/dist/assets/classDiagram-OUVF2IWQ-Djbioyb2.js +1 -0
- package/dist/assets/classDiagram-v2-EOCWNBFH-Djbioyb2.js +1 -0
- package/dist/assets/{cose-bilkent-JH36ORCC-CZGh2_1m.js → cose-bilkent-JH36ORCC-Dffsz0s9.js} +1 -1
- package/dist/assets/{cynefin-VYW2F7L2-D1ekvVHL.js → cynefin-VYW2F7L2-DAKVOmNx.js} +1 -1
- package/dist/assets/{cynefinDiagram-TSTJHNR4-DG8TQQPp.js → cynefinDiagram-TSTJHNR4-BA5C2KL1.js} +1 -1
- package/dist/assets/{dagre-VKFMJZFB-BaiXaaS0.js → dagre-VKFMJZFB-C6mn8ByB.js} +1 -1
- package/dist/assets/{diagram-FQU43EPY-CeqWvREU.js → diagram-FQU43EPY-DZl8znlN.js} +1 -1
- package/dist/assets/{diagram-G47NLZAW-DFCzg162.js → diagram-G47NLZAW-jrn-1PWd.js} +1 -1
- package/dist/assets/{diagram-NH7WQ7WH-C0YAgzIc.js → diagram-NH7WQ7WH-CDJaB7ft.js} +1 -1
- package/dist/assets/{diagram-OA4YK3LP-jOEhkL10.js → diagram-OA4YK3LP-5tLeZhG7.js} +1 -1
- package/dist/assets/{diagram-WEI45ONY-lgBM2AIi.js → diagram-WEI45ONY-BYKLblkU.js} +1 -1
- package/dist/assets/{ebnfDiagram-CCIWWBDH-CyJH9jIa.js → ebnfDiagram-CCIWWBDH-CB8CztXl.js} +1 -1
- package/dist/assets/{erDiagram-Q63AITRT-ClSGogYA.js → erDiagram-Q63AITRT-BhWSOENq.js} +1 -1
- package/dist/assets/{flowDiagram-23GEKE2U-BT_kAtVI.js → flowDiagram-23GEKE2U-DLCyMvrI.js} +1 -1
- package/dist/assets/{ganttDiagram-NO4QXBWP-B9GC2kvS.js → ganttDiagram-NO4QXBWP-CthAkGjh.js} +1 -1
- package/dist/assets/{gitGraphDiagram-IHSO6WYX-DBrpQaop.js → gitGraphDiagram-IHSO6WYX-CJNbJs-c.js} +1 -1
- package/dist/assets/{index-5JAolFEo.js → index-BuPTyaSq.js} +1 -1
- package/dist/assets/{index-3dubbj4M.js → index-CyWPMhiK.js} +1 -1
- package/dist/assets/{index-D9zcjksy.js → index-DCtotvv_.js} +3 -3
- package/dist/assets/{index-C8QDHgbv.js → index-DWBOLCR5.js} +1 -1
- package/dist/assets/{index-_Zoawk3E.js → index-DkdR8OgS.js} +1 -1
- package/dist/assets/{index-D-MHMY5o.js → index-DmdKGC5r.js} +2 -2
- package/dist/assets/{index-B7SDYZt7.js → index-UVREchNy.js} +1 -1
- package/dist/assets/{index-Cl65xHPu.js → index-iSsXS9va.js} +1 -1
- package/dist/assets/{index-B17qBYiT.js → index-jBRZu4R1.js} +1 -1
- package/dist/assets/{infoDiagram-FWYZ7A6U-BQ2RoWJP.js → infoDiagram-FWYZ7A6U-vnru1cOG.js} +1 -1
- package/dist/assets/{ishikawaDiagram-FXEZZL3T-Cu_l3XL1.js → ishikawaDiagram-FXEZZL3T-jw6pd0XL.js} +1 -1
- package/dist/assets/{journeyDiagram-5HDEW3XC-DLd41wKP.js → journeyDiagram-5HDEW3XC-13FNnW_u.js} +1 -1
- package/dist/assets/{kanban-definition-HUTT4EX6-C7s5ZCmY.js → kanban-definition-HUTT4EX6-Vt7C4aKT.js} +1 -1
- package/dist/assets/{linear-BSpfaY-I.js → linear--OdqFD4b.js} +1 -1
- package/dist/assets/{main-BzGnAbiA.css → main-CDftdafQ.css} +1 -1
- package/dist/assets/{main-B9Esx3nK.js → main-CTWrCxkg.js} +127 -127
- package/dist/assets/{mermaid.core-DEflf7Dd.js → mermaid.core-DdqcSTTz.js} +4 -4
- package/dist/assets/{mindmap-definition-LN4V7U3C-BDK-VY2F.js → mindmap-definition-LN4V7U3C-BunNxjrv.js} +1 -1
- package/dist/assets/{pegDiagram-2B236MQR-B62yTbzD.js → pegDiagram-2B236MQR-1jfwpxB4.js} +1 -1
- package/dist/assets/{pieDiagram-ENE6RG2P-D4gWoKL0.js → pieDiagram-ENE6RG2P-VPhbzpR3.js} +1 -1
- package/dist/assets/{quadrantDiagram-ABIIQ3AL-DVfsHeV1.js → quadrantDiagram-ABIIQ3AL-CA8qn1UA.js} +1 -1
- package/dist/assets/{railroadDiagram-RFXS5EU6-CmSiouVY.js → railroadDiagram-RFXS5EU6-DQEN24bM.js} +1 -1
- package/dist/assets/{requirementDiagram-TGXJPOKE-tWX1wqNI.js → requirementDiagram-TGXJPOKE-CkTBTAcc.js} +1 -1
- package/dist/assets/{sankeyDiagram-HTMAVEWB-IBtqbfIe.js → sankeyDiagram-HTMAVEWB-CkHzzx_W.js} +1 -1
- package/dist/assets/{sequenceDiagram-DBY2YBRQ-DEpwIJoi.js → sequenceDiagram-DBY2YBRQ-B2N2aADA.js} +1 -1
- package/dist/assets/{sizeCapture-X5ZJPWSS-lKEocil5.js → sizeCapture-X5ZJPWSS-DkAf4MCe.js} +1 -1
- package/dist/assets/{stateDiagram-2N3HPSRC-CKaeiZlp.js → stateDiagram-2N3HPSRC-ZbK9t3aI.js} +1 -1
- package/dist/assets/stateDiagram-v2-6OUMAXLB-D5FQEolN.js +1 -0
- package/dist/assets/{swimlanes-5IMT3BWC-CJmBE5ud.js → swimlanes-5IMT3BWC-E-6JK_JW.js} +2 -2
- package/dist/assets/swimlanesDiagram-G3AALYLV-DDY3h6sU.js +8 -0
- package/dist/assets/{timeline-definition-FHXFAJF6-BFSV77MF.js → timeline-definition-FHXFAJF6-lYAjPLNZ.js} +1 -1
- package/dist/assets/{vennDiagram-L72KCM5P-DYJN4_O_.js → vennDiagram-L72KCM5P-ClUik7nN.js} +1 -1
- package/dist/assets/{wardleyDiagram-EHGQE667-DrCdYDR9.js → wardleyDiagram-EHGQE667-CXKG_SoK.js} +1 -1
- package/dist/assets/{web-CudwTJjC.js → web-DJYPxOOT.js} +1 -1
- package/dist/assets/{web-wwQhOb-1.js → web-DXEGbo5s.js} +1 -1
- package/dist/assets/{web-CZN__NfW.js → web-seUVb2bI.js} +1 -1
- package/dist/assets/{xychartDiagram-FW5EYKEG-BT8ULt0d.js → xychartDiagram-FW5EYKEG-6EAZ2I9V.js} +1 -1
- package/dist/build-info.json +1 -1
- package/dist/index.html +2 -2
- package/dist/src/packages/server/claude/backend.js +2 -0
- package/dist/src/packages/server/claude/interactive/interactive-backend-args.js +2 -0
- package/dist/src/packages/server/data/builtin-skills/boss-instructions.js +1 -1
- package/dist/src/packages/server/services/llm-matcher-service.js +5 -1
- package/dist/src/packages/shared/agent-types.js +3 -1
- package/package.json +1 -1
- package/dist/assets/channel-2V7dJeDN.js +0 -1
- package/dist/assets/classDiagram-OUVF2IWQ-D7WYtecl.js +0 -1
- package/dist/assets/classDiagram-v2-EOCWNBFH-D7WYtecl.js +0 -1
- package/dist/assets/stateDiagram-v2-6OUMAXLB-Cp1B1MYN.js +0 -1
- package/dist/assets/swimlanesDiagram-G3AALYLV-DGhMYKaY.js +0 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
import{R as ts,u as rs,a6 as _s,a7 as vs,a8 as Is,j as s,I as U,n as Es,a9 as $s,aa as Ds,ab as Ms,ac as Ls,r as o,ad as Ss,x as Xs,f as Ps,_ as Rs,ae as Ys,af as Gs,ag as Us,ah as Fs,ai as Hs,aj as Zs,s as M,ak as Bs,al as G}from"./main-B9Esx3nK.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-3OKhI9bz.js";const bs=ts.memo(({agent:a,isSelected:z,isKeyboardFocused:F=!1,onSelect:L,onDoubleClick:r,onChat:g,onFocus:h,onKill:w,onDragStart:S})=>{const{t:x}=rs(["dashboard","common"]),X=_s().has(a.id),N=vs(a.status),H=Is(a),j=Ls(H),I=a.taskLabel?s.jsxs(s.Fragment,{children:[s.jsx(U,{name:"task",size:12})," ",a.taskLabel]}):a.currentTask||a.lastAssignedTask,m=a.status==="idle"&&a.lastActivity>0,[,Z]=ts.useState(0);return ts.useEffect(()=>{if(!m)return;const b=window.setInterval(()=>Z(q=>q+1),15e3);return()=>window.clearInterval(b)},[m]),s.jsxs("div",{className:`dash-card dash-card--${N} ${z?"dash-card--selected":""} ${F?"dash-card--keyboard-focused":""}`,"data-agent-id":a.id,onClick:()=>L(a.id),onDoubleClick:b=>{b.stopPropagation(),r(a.id)},onDragStart:b=>{S==null||S(a),b.dataTransfer.effectAllowed="move"},draggable:!0,title:x("cards.doubleClickHint"),children:[s.jsxs("div",{className:"dash-card__row1",children:[s.jsx("span",{className:`dash-card__status-dot dash-card__status-dot--${N}`}),s.jsx("span",{className:"dash-card__name",children:a.name}),s.jsxs("span",{className:"dash-card__class",children:[s.jsx(Es,{agent:a,size:14})," ",a.class]}),s.jsxs("span",{className:`dash-card__provider dash-card__provider--${a.provider}`,children:[s.jsx(U,{name:a.provider==="codex"||a.provider==="opencode"||a.provider==="grok"?"status-pending":"robot",size:11,weight:a.provider==="codex"||a.provider==="opencode"||a.provider==="grok"?"fill":"regular",color:a.provider==="codex"?"#a16207":a.provider==="opencode"?"#4ade80":a.provider==="grok"?"#6366f1":void 0})," ",a.provider]}),X&&s.jsx("span",{className:"dash-card__unseen-badge",title:"New output available - click to view",children:"!"})]}),s.jsxs("div",{className:"dash-card__row2",children:[s.jsx("span",{className:`dash-card__status dash-card__status--${N}`,children:X?"Unseen":a.status}),s.jsxs("div",{className:"dash-card__context",children:[s.jsx("div",{className:"dash-card__context-bar",children:s.jsx("div",{className:`dash-card__context-fill dash-card__context-fill--${j}`,style:{width:`${H}%`}})}),s.jsxs("span",{className:`dash-card__context-pct dash-card__context-pct--${j}`,children:[H,"%"]})]})]}),s.jsxs("div",{className:"dash-card__row3",children:[s.jsxs("span",{className:"dash-card__workdir",title:a.cwd,children:[s.jsx(U,{name:"folder",size:11})," ",a.cwd.split("/").pop()||a.cwd]}),m&&s.jsxs("span",{className:"dash-card__idle-time",style:{color:Ms(a.lastActivity)},title:Ds(a.lastActivity),children:[s.jsx(U,{name:"status-waiting-input",size:10})," ",$s(a.lastActivity)]})]}),I&&s.jsx("div",{className:"dash-card__row4",children:s.jsx("span",{className:"dash-card__task",children:I})}),s.jsxs("div",{className:"dash-card__actions",children:[g&&s.jsx("button",{className:"dash-card__action-btn dash-card__action-btn--chat",onClick:b=>{b.stopPropagation(),g(a.id)},title:x("cards.openTerminal"),children:x("cards.chat")}),w&&s.jsx("button",{className:"dash-card__action-btn dash-card__action-btn--danger",onClick:b=>{b.stopPropagation(),w(a.id)},title:x("cards.killAgent"),children:x("cards.stop")})]})]})});bs.displayName="AgentCard";const fs=({buildings:a,onSelectBuilding:z})=>{const{t:F}=rs(["dashboard"]),L=o.useMemo(()=>Array.from(a.values()).sort((r,g)=>r.name.localeCompare(g.name)),[a]);return s.jsxs("div",{className:"dashboard-view__buildings",children:[s.jsxs("div",{className:"dashboard-view__buildings-header",children:[s.jsx("span",{className:"dashboard-view__buildings-title",children:F("buildings.title")}),s.jsx("span",{className:"dashboard-view__buildings-count",children:L.length})]}),s.jsx("div",{className:"dashboard-view__buildings-row",children:L.map(r=>{const g=vs(r.status),h=Ss(r.type);return s.jsxs("button",{className:`dash-pill dash-pill--${g}`,onClick:()=>z==null?void 0:z(r.id),title:`${r.name} (${r.type}) - ${r.status}`,children:[s.jsx("span",{className:"dash-pill__icon",children:s.jsx(U,{name:h,size:14})}),s.jsx("span",{className:"dash-pill__name",children:r.name}),s.jsx("span",{className:`dash-pill__dot dash-pill__dot--${g}`})]},r.id)})})]})};fs.displayName="BuildingPills";function qs({onSelectAgent:a,onFocusAgent:z,onKillAgent:F,onSelectBuilding:L,onOpenTerminal:r,onFocusZone:g}){const{t:h}=rs(["dashboard","common"]),w=Xs(),S=Ps(),x=Rs(),ns=Ys(),X=_s(),[N,H]=o.useState(""),[j,I]=o.useState("all"),[m,Z]=o.useState("zone"),[b,q]=o.useState(new Set),[k,J]=o.useState(null),[ws,K]=o.useState(null),[P,Q]=o.useState(!1),[p,B]=o.useState(null),W=o.useMemo(()=>{const e=Array.from(w.values());return{total:e.length,working:e.filter(d=>d.status==="working"||d.status==="waiting"||d.status==="waiting_permission").length,idle:e.filter(d=>d.status==="idle").length,error:e.filter(d=>d.status==="error"||d.status==="offline"||d.status==="orphaned").length}},[w]),is=o.useMemo(()=>m==="zone"?Gs(w,x):m==="status"?Us(w,X):Fs(w),[w,x,m,X]),T=o.useMemo(()=>{const e=N.toLowerCase().trim(),d=is.map(l=>({...l,agents:l.agents.filter(_=>{if(j==="working"){if(_.status!=="working"&&_.status!=="waiting"&&_.status!=="waiting_permission")return!1}else if(j==="error"&&_.status!=="error"&&_.status!=="offline"&&_.status!=="orphaned")return!1;return!(e&&!_.name.toLowerCase().includes(e)&&!_.class.toLowerCase().includes(e))})}));return m==="zone"?d:d.filter(l=>l.agents.length>0)},[is,j,N,m]),O=o.useCallback(e=>e.area?`area:${e.area.id}`:`${m}:${e.label}`,[m]),ss=o.useMemo(()=>T.map(e=>({...e,sortedAgents:m==="status"?Hs(e.agents,{prioritizeRecentlyIdle:!0}):Zs(e.agents)})),[T,m]),C=o.useMemo(()=>{const e=[];return ss.forEach(d=>{const l=O(d);b.has(l)||e.push(...d.sortedAgents)}),e},[ss,b,O]),ps=o.useCallback(e=>{q(d=>{const l=new Set(d);return l.has(e)?l.delete(e):l.add(e),l})},[]),gs=o.useCallback(e=>{r==null||r(e)},[r]),xs=o.useCallback(e=>{a==null||a(e),Q(!0),B(e)},[a]),js=o.useCallback(e=>{r==null||r(e)},[r]),Ns=o.useCallback(e=>{J(e)},[]),ks=o.useCallback((e,d)=>{e.preventDefault(),e.dataTransfer.dropEffect="move",K(d)},[]),Cs=o.useCallback(()=>{K(null)},[]),ys=o.useCallback(e=>{if(!k)return;if(e===null){const E=M.getState(),t=Array.from(E.areas.values()).find(n=>n.assignedAgentIds.includes(k.id));t&&M.unassignAgentFromArea(k.id,t.id),J(null),K(null);return}const d=x.get(e);if(!d)return;const l=Array.from(w.values()),_=Bs(d,l,k.position);M.updateAgent({...k,position:{...k.position,x:_.x,z:_.z}}),M.assignAgentToArea(k.id,e),J(null),K(null)},[k,x,w]);return o.useEffect(()=>{if(C.length===0){Q(!1),B(null);return}P&&(!p||!C.some(e=>e.id===p))&&(B(C[0].id),a==null||a(C[0].id))},[C,P,p,a]),o.useEffect(()=>{const e=t=>t instanceof HTMLElement?t.tagName==="INPUT"||t.tagName==="TEXTAREA"||t.tagName==="SELECT"||t.isContentEditable:!1,d=t=>t instanceof HTMLElement?!!t.closest(".guake-terminal")||t.classList.contains("guake-input")||t.classList.contains("agent-panel-input"):!1,l=t=>{const n=Array.from(document.querySelectorAll(".dash-card[data-agent-id]")).find(A=>A.dataset.agentId===t);n==null||n.scrollIntoView({block:"nearest",inline:"nearest"})},_=(t,n)=>{var os,cs,ls,us,hs,ms;const A=Array.from(document.querySelectorAll(".dash-card[data-agent-id]")).map(i=>{const u=i.dataset.agentId;if(!u)return null;const y=i.getBoundingClientRect();return{id:u,centerX:y.left+y.width/2,centerY:y.top+y.height/2,height:y.height}}).filter(i=>i!==null).sort((i,u)=>i.centerY-u.centerY||i.centerX-u.centerX);if(A.length===0)return t;const es=A.reduce((i,u)=>i+u.height,0)/A.length,as=Math.max(18,es*.6),f=[];for(const i of A){const u=f[f.length-1];if(!u){f.push([{id:i.id,centerX:i.centerX,centerY:i.centerY}]);continue}const y=u.reduce((As,zs)=>As+zs.centerY,0)/u.length;Math.abs(i.centerY-y)<=as?u.push({id:i.id,centerX:i.centerX,centerY:i.centerY}):f.push([{id:i.id,centerX:i.centerX,centerY:i.centerY}])}f.forEach(i=>i.sort((u,y)=>u.centerX-y.centerX));const R=f.findIndex(i=>i.some(u=>u.id===t));if(R===-1)return((cs=(os=f[0])==null?void 0:os[0])==null?void 0:cs.id)??t;const $=f[R],v=$.findIndex(i=>i.id===t);if(v===-1)return((us=(ls=f[0])==null?void 0:ls[0])==null?void 0:us.id)??t;if(n==="left")return((hs=$[Math.max(0,v-1)])==null?void 0:hs.id)??t;if(n==="right")return((ms=$[Math.min($.length-1,v+1)])==null?void 0:ms.id)??t;const V=n==="up"?Math.max(0,R-1):Math.min(f.length-1,R+1),c=f[V],Y=$[v].centerX;let D=c[0],ds=Math.abs(D.centerX-Y);for(const i of c){const u=Math.abs(i.centerX-Y);u<ds&&(D=i,ds=u)}return(D==null?void 0:D.id)??t},E=t=>{const n=M.getShortcuts(),A=n.find(c=>c.id==="dashboard-selector-toggle"),es=n.find(c=>c.id==="dashboard-vim-left"),as=n.find(c=>c.id==="dashboard-vim-down"),f=n.find(c=>c.id==="dashboard-vim-up"),R=n.find(c=>c.id==="dashboard-vim-right"),$=n.find(c=>c.id==="open-terminal"),v=M.getState();if(e(t.target))if(!v.terminalOpen&&d(t.target)&&document.activeElement instanceof HTMLElement)document.activeElement.blur();else return;if(G(t,A)){if(C.length===0)return;t.preventDefault(),t.stopPropagation(),Q(!0),B(c=>{const Y=c&&C.some(D=>D.id===c)?c:C[0].id;return a==null||a(Y),window.setTimeout(()=>l(Y),0),Y});return}const V=G(t,es)||t.key==="ArrowLeft"?"left":G(t,as)||t.key==="ArrowDown"?"down":G(t,f)||t.key==="ArrowUp"?"up":G(t,R)||t.key==="ArrowRight"?"right":null;if(V&&P&&p){t.preventDefault(),t.stopPropagation();const c=_(p,V);c!==p&&(B(c),a==null||a(c),window.setTimeout(()=>l(c),0));return}if(G(t,$)){if(v.terminalOpen)return;if(P&&p&&v.agents.has(p)){t.preventDefault(),r==null||r(p);return}if(v.selectedAgentIds.size===1){t.preventDefault();const c=Array.from(v.selectedAgentIds)[0];r==null||r(c);return}if(v.lastSelectedAgentId&&v.agents.has(v.lastSelectedAgentId)){t.preventDefault(),r==null||r(v.lastSelectedAgentId);return}}};return document.addEventListener("keydown",E,!0),()=>document.removeEventListener("keydown",E,!0)},[C,P,p,r,a]),o.useEffect(()=>{const e=document.activeElement;e instanceof HTMLElement&&e.closest(".guake-terminal")&&!M.getState().terminalOpen&&e.blur()},[]),s.jsxs("div",{className:"dashboard-view",children:[s.jsxs("div",{className:"dashboard-view__topbar",children:[s.jsxs("div",{className:"dashboard-view__metrics",children:[s.jsxs("button",{className:`dashboard-view__metric-btn ${j==="all"?"dashboard-view__metric-btn--active":""}`,onClick:()=>I("all"),children:[s.jsx("span",{className:"dashboard-view__metric-value",children:W.total}),s.jsx("span",{className:"dashboard-view__metric-label",children:h("common:labels.agents")})]}),s.jsxs("button",{className:`dashboard-view__metric-btn dashboard-view__metric-btn--working ${j==="working"?"dashboard-view__metric-btn--active":""}`,onClick:()=>I("working"),children:[s.jsx("span",{className:"dashboard-view__metric-value",children:W.working}),s.jsx("span",{className:"dashboard-view__metric-label",children:h("common:status.working")})]}),s.jsxs("button",{className:"dashboard-view__metric-btn dashboard-view__metric-btn--idle ",onClick:()=>I("all"),children:[s.jsx("span",{className:"dashboard-view__metric-value",children:W.idle}),s.jsx("span",{className:"dashboard-view__metric-label",children:h("common:status.idle")})]}),s.jsxs("button",{className:`dashboard-view__metric-btn dashboard-view__metric-btn--error ${j==="error"?"dashboard-view__metric-btn--active":""}`,onClick:()=>I("error"),children:[s.jsx("span",{className:"dashboard-view__metric-value",children:W.error}),s.jsx("span",{className:"dashboard-view__metric-label",children:h("common:status.error")})]})]}),s.jsx("input",{className:"dashboard-view__search",type:"text",placeholder:h("searchPlaceholder"),value:N,onChange:e=>H(e.target.value)})]}),s.jsxs("div",{className:"dashboard-view__grouping",children:[s.jsx("button",{className:`dashboard-view__grouping-btn ${m==="zone"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>Z("zone"),children:h("grouping.byZone")}),s.jsx("button",{className:`dashboard-view__grouping-btn ${m==="status"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>Z("status"),children:h("grouping.byStatus")}),s.jsx("button",{className:`dashboard-view__grouping-btn ${m==="activity"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>Z("activity"),children:h("grouping.byActivity")})]}),s.jsxs("div",{className:"dashboard-view__content",children:[ss.map(e=>{const d=O(e),l=b.has(d),_=e.sortedAgents,E=e.agents.filter(n=>n.status==="working"||n.status==="waiting"||n.status==="waiting_permission").length,t=e.agents.filter(n=>X.has(n.id)).length;return s.jsxs("div",{className:`dashboard-view__zone ${ws===(e.area?e.area.id:null)&&k?"dashboard-view__zone--drag-over":""}`,onDragOver:n=>ks(n,e.area?e.area.id:null),onDragLeave:Cs,onDrop:()=>ys(e.area?e.area.id:null),children:[s.jsxs("div",{className:"dashboard-view__zone-header",onClick:()=>ps(d),children:[s.jsxs("div",{className:"dashboard-view__zone-left",children:[s.jsx("span",{className:`dashboard-view__zone-chevron ${l?"dashboard-view__zone-chevron--collapsed":""}`,children:s.jsx(U,{name:"caret-down",size:12})}),s.jsx("span",{className:"dashboard-view__zone-dot",style:{backgroundColor:e.color}}),s.jsx("span",{className:"dashboard-view__zone-name",children:e.label}),s.jsxs("span",{className:"dashboard-view__zone-count",children:[h("agentCount",{count:e.agents.length}),E>0&&s.jsxs("span",{className:"dashboard-view__zone-working",children:[" · ",E," ",h("working")]}),t>0&&s.jsxs("span",{className:"dashboard-view__zone-unseen",children:[" · ",t," Unseen"]})]})]}),e.area&&g&&s.jsx("button",{className:"dashboard-view__zone-focus",onClick:n=>{n.stopPropagation(),g(e.area.id)},title:h("focusZone"),children:h("focusZone")})]}),!l&&s.jsx("div",{className:"dashboard-view__zone-grid",children:_.map(n=>s.jsx(bs,{agent:n,isSelected:ns.has(n.id),isKeyboardFocused:P&&p===n.id,onSelect:xs,onDoubleClick:gs,onChat:js,onFocus:z,onKill:F,onDragStart:Ns},n.id))})]},d)}),T.length===0&&s.jsx("div",{className:"dashboard-view__empty",children:N?h("noAgentsMatching",{search:N}):h("noAgentsSpawned")}),S.size>0&&s.jsx(fs,{buildings:S,onSelectBuilding:L})]})]})}export{qs as DashboardView};
|
|
1
|
+
import{R as ts,u as rs,a6 as _s,a7 as vs,a8 as Is,j as s,I as U,n as Es,a9 as $s,aa as Ds,ab as Ms,ac as Ls,r as o,ad as Ss,x as Xs,f as Ps,_ as Rs,ae as Ys,af as Gs,ag as Us,ah as Fs,ai as Hs,aj as Zs,s as M,ak as Bs,al as G}from"./main-CTWrCxkg.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-3OKhI9bz.js";const bs=ts.memo(({agent:a,isSelected:z,isKeyboardFocused:F=!1,onSelect:L,onDoubleClick:r,onChat:g,onFocus:h,onKill:w,onDragStart:S})=>{const{t:x}=rs(["dashboard","common"]),X=_s().has(a.id),N=vs(a.status),H=Is(a),j=Ls(H),I=a.taskLabel?s.jsxs(s.Fragment,{children:[s.jsx(U,{name:"task",size:12})," ",a.taskLabel]}):a.currentTask||a.lastAssignedTask,m=a.status==="idle"&&a.lastActivity>0,[,Z]=ts.useState(0);return ts.useEffect(()=>{if(!m)return;const b=window.setInterval(()=>Z(q=>q+1),15e3);return()=>window.clearInterval(b)},[m]),s.jsxs("div",{className:`dash-card dash-card--${N} ${z?"dash-card--selected":""} ${F?"dash-card--keyboard-focused":""}`,"data-agent-id":a.id,onClick:()=>L(a.id),onDoubleClick:b=>{b.stopPropagation(),r(a.id)},onDragStart:b=>{S==null||S(a),b.dataTransfer.effectAllowed="move"},draggable:!0,title:x("cards.doubleClickHint"),children:[s.jsxs("div",{className:"dash-card__row1",children:[s.jsx("span",{className:`dash-card__status-dot dash-card__status-dot--${N}`}),s.jsx("span",{className:"dash-card__name",children:a.name}),s.jsxs("span",{className:"dash-card__class",children:[s.jsx(Es,{agent:a,size:14})," ",a.class]}),s.jsxs("span",{className:`dash-card__provider dash-card__provider--${a.provider}`,children:[s.jsx(U,{name:a.provider==="codex"||a.provider==="opencode"||a.provider==="grok"?"status-pending":"robot",size:11,weight:a.provider==="codex"||a.provider==="opencode"||a.provider==="grok"?"fill":"regular",color:a.provider==="codex"?"#a16207":a.provider==="opencode"?"#4ade80":a.provider==="grok"?"#6366f1":void 0})," ",a.provider]}),X&&s.jsx("span",{className:"dash-card__unseen-badge",title:"New output available - click to view",children:"!"})]}),s.jsxs("div",{className:"dash-card__row2",children:[s.jsx("span",{className:`dash-card__status dash-card__status--${N}`,children:X?"Unseen":a.status}),s.jsxs("div",{className:"dash-card__context",children:[s.jsx("div",{className:"dash-card__context-bar",children:s.jsx("div",{className:`dash-card__context-fill dash-card__context-fill--${j}`,style:{width:`${H}%`}})}),s.jsxs("span",{className:`dash-card__context-pct dash-card__context-pct--${j}`,children:[H,"%"]})]})]}),s.jsxs("div",{className:"dash-card__row3",children:[s.jsxs("span",{className:"dash-card__workdir",title:a.cwd,children:[s.jsx(U,{name:"folder",size:11})," ",a.cwd.split("/").pop()||a.cwd]}),m&&s.jsxs("span",{className:"dash-card__idle-time",style:{color:Ms(a.lastActivity)},title:Ds(a.lastActivity),children:[s.jsx(U,{name:"status-waiting-input",size:10})," ",$s(a.lastActivity)]})]}),I&&s.jsx("div",{className:"dash-card__row4",children:s.jsx("span",{className:"dash-card__task",children:I})}),s.jsxs("div",{className:"dash-card__actions",children:[g&&s.jsx("button",{className:"dash-card__action-btn dash-card__action-btn--chat",onClick:b=>{b.stopPropagation(),g(a.id)},title:x("cards.openTerminal"),children:x("cards.chat")}),w&&s.jsx("button",{className:"dash-card__action-btn dash-card__action-btn--danger",onClick:b=>{b.stopPropagation(),w(a.id)},title:x("cards.killAgent"),children:x("cards.stop")})]})]})});bs.displayName="AgentCard";const fs=({buildings:a,onSelectBuilding:z})=>{const{t:F}=rs(["dashboard"]),L=o.useMemo(()=>Array.from(a.values()).sort((r,g)=>r.name.localeCompare(g.name)),[a]);return s.jsxs("div",{className:"dashboard-view__buildings",children:[s.jsxs("div",{className:"dashboard-view__buildings-header",children:[s.jsx("span",{className:"dashboard-view__buildings-title",children:F("buildings.title")}),s.jsx("span",{className:"dashboard-view__buildings-count",children:L.length})]}),s.jsx("div",{className:"dashboard-view__buildings-row",children:L.map(r=>{const g=vs(r.status),h=Ss(r.type);return s.jsxs("button",{className:`dash-pill dash-pill--${g}`,onClick:()=>z==null?void 0:z(r.id),title:`${r.name} (${r.type}) - ${r.status}`,children:[s.jsx("span",{className:"dash-pill__icon",children:s.jsx(U,{name:h,size:14})}),s.jsx("span",{className:"dash-pill__name",children:r.name}),s.jsx("span",{className:`dash-pill__dot dash-pill__dot--${g}`})]},r.id)})})]})};fs.displayName="BuildingPills";function qs({onSelectAgent:a,onFocusAgent:z,onKillAgent:F,onSelectBuilding:L,onOpenTerminal:r,onFocusZone:g}){const{t:h}=rs(["dashboard","common"]),w=Xs(),S=Ps(),x=Rs(),ns=Ys(),X=_s(),[N,H]=o.useState(""),[j,I]=o.useState("all"),[m,Z]=o.useState("zone"),[b,q]=o.useState(new Set),[k,J]=o.useState(null),[ws,K]=o.useState(null),[P,Q]=o.useState(!1),[p,B]=o.useState(null),W=o.useMemo(()=>{const e=Array.from(w.values());return{total:e.length,working:e.filter(d=>d.status==="working"||d.status==="waiting"||d.status==="waiting_permission").length,idle:e.filter(d=>d.status==="idle").length,error:e.filter(d=>d.status==="error"||d.status==="offline"||d.status==="orphaned").length}},[w]),is=o.useMemo(()=>m==="zone"?Gs(w,x):m==="status"?Us(w,X):Fs(w),[w,x,m,X]),T=o.useMemo(()=>{const e=N.toLowerCase().trim(),d=is.map(l=>({...l,agents:l.agents.filter(_=>{if(j==="working"){if(_.status!=="working"&&_.status!=="waiting"&&_.status!=="waiting_permission")return!1}else if(j==="error"&&_.status!=="error"&&_.status!=="offline"&&_.status!=="orphaned")return!1;return!(e&&!_.name.toLowerCase().includes(e)&&!_.class.toLowerCase().includes(e))})}));return m==="zone"?d:d.filter(l=>l.agents.length>0)},[is,j,N,m]),O=o.useCallback(e=>e.area?`area:${e.area.id}`:`${m}:${e.label}`,[m]),ss=o.useMemo(()=>T.map(e=>({...e,sortedAgents:m==="status"?Hs(e.agents,{prioritizeRecentlyIdle:!0}):Zs(e.agents)})),[T,m]),C=o.useMemo(()=>{const e=[];return ss.forEach(d=>{const l=O(d);b.has(l)||e.push(...d.sortedAgents)}),e},[ss,b,O]),ps=o.useCallback(e=>{q(d=>{const l=new Set(d);return l.has(e)?l.delete(e):l.add(e),l})},[]),gs=o.useCallback(e=>{r==null||r(e)},[r]),xs=o.useCallback(e=>{a==null||a(e),Q(!0),B(e)},[a]),js=o.useCallback(e=>{r==null||r(e)},[r]),Ns=o.useCallback(e=>{J(e)},[]),ks=o.useCallback((e,d)=>{e.preventDefault(),e.dataTransfer.dropEffect="move",K(d)},[]),Cs=o.useCallback(()=>{K(null)},[]),ys=o.useCallback(e=>{if(!k)return;if(e===null){const E=M.getState(),t=Array.from(E.areas.values()).find(n=>n.assignedAgentIds.includes(k.id));t&&M.unassignAgentFromArea(k.id,t.id),J(null),K(null);return}const d=x.get(e);if(!d)return;const l=Array.from(w.values()),_=Bs(d,l,k.position);M.updateAgent({...k,position:{...k.position,x:_.x,z:_.z}}),M.assignAgentToArea(k.id,e),J(null),K(null)},[k,x,w]);return o.useEffect(()=>{if(C.length===0){Q(!1),B(null);return}P&&(!p||!C.some(e=>e.id===p))&&(B(C[0].id),a==null||a(C[0].id))},[C,P,p,a]),o.useEffect(()=>{const e=t=>t instanceof HTMLElement?t.tagName==="INPUT"||t.tagName==="TEXTAREA"||t.tagName==="SELECT"||t.isContentEditable:!1,d=t=>t instanceof HTMLElement?!!t.closest(".guake-terminal")||t.classList.contains("guake-input")||t.classList.contains("agent-panel-input"):!1,l=t=>{const n=Array.from(document.querySelectorAll(".dash-card[data-agent-id]")).find(A=>A.dataset.agentId===t);n==null||n.scrollIntoView({block:"nearest",inline:"nearest"})},_=(t,n)=>{var os,cs,ls,us,hs,ms;const A=Array.from(document.querySelectorAll(".dash-card[data-agent-id]")).map(i=>{const u=i.dataset.agentId;if(!u)return null;const y=i.getBoundingClientRect();return{id:u,centerX:y.left+y.width/2,centerY:y.top+y.height/2,height:y.height}}).filter(i=>i!==null).sort((i,u)=>i.centerY-u.centerY||i.centerX-u.centerX);if(A.length===0)return t;const es=A.reduce((i,u)=>i+u.height,0)/A.length,as=Math.max(18,es*.6),f=[];for(const i of A){const u=f[f.length-1];if(!u){f.push([{id:i.id,centerX:i.centerX,centerY:i.centerY}]);continue}const y=u.reduce((As,zs)=>As+zs.centerY,0)/u.length;Math.abs(i.centerY-y)<=as?u.push({id:i.id,centerX:i.centerX,centerY:i.centerY}):f.push([{id:i.id,centerX:i.centerX,centerY:i.centerY}])}f.forEach(i=>i.sort((u,y)=>u.centerX-y.centerX));const R=f.findIndex(i=>i.some(u=>u.id===t));if(R===-1)return((cs=(os=f[0])==null?void 0:os[0])==null?void 0:cs.id)??t;const $=f[R],v=$.findIndex(i=>i.id===t);if(v===-1)return((us=(ls=f[0])==null?void 0:ls[0])==null?void 0:us.id)??t;if(n==="left")return((hs=$[Math.max(0,v-1)])==null?void 0:hs.id)??t;if(n==="right")return((ms=$[Math.min($.length-1,v+1)])==null?void 0:ms.id)??t;const V=n==="up"?Math.max(0,R-1):Math.min(f.length-1,R+1),c=f[V],Y=$[v].centerX;let D=c[0],ds=Math.abs(D.centerX-Y);for(const i of c){const u=Math.abs(i.centerX-Y);u<ds&&(D=i,ds=u)}return(D==null?void 0:D.id)??t},E=t=>{const n=M.getShortcuts(),A=n.find(c=>c.id==="dashboard-selector-toggle"),es=n.find(c=>c.id==="dashboard-vim-left"),as=n.find(c=>c.id==="dashboard-vim-down"),f=n.find(c=>c.id==="dashboard-vim-up"),R=n.find(c=>c.id==="dashboard-vim-right"),$=n.find(c=>c.id==="open-terminal"),v=M.getState();if(e(t.target))if(!v.terminalOpen&&d(t.target)&&document.activeElement instanceof HTMLElement)document.activeElement.blur();else return;if(G(t,A)){if(C.length===0)return;t.preventDefault(),t.stopPropagation(),Q(!0),B(c=>{const Y=c&&C.some(D=>D.id===c)?c:C[0].id;return a==null||a(Y),window.setTimeout(()=>l(Y),0),Y});return}const V=G(t,es)||t.key==="ArrowLeft"?"left":G(t,as)||t.key==="ArrowDown"?"down":G(t,f)||t.key==="ArrowUp"?"up":G(t,R)||t.key==="ArrowRight"?"right":null;if(V&&P&&p){t.preventDefault(),t.stopPropagation();const c=_(p,V);c!==p&&(B(c),a==null||a(c),window.setTimeout(()=>l(c),0));return}if(G(t,$)){if(v.terminalOpen)return;if(P&&p&&v.agents.has(p)){t.preventDefault(),r==null||r(p);return}if(v.selectedAgentIds.size===1){t.preventDefault();const c=Array.from(v.selectedAgentIds)[0];r==null||r(c);return}if(v.lastSelectedAgentId&&v.agents.has(v.lastSelectedAgentId)){t.preventDefault(),r==null||r(v.lastSelectedAgentId);return}}};return document.addEventListener("keydown",E,!0),()=>document.removeEventListener("keydown",E,!0)},[C,P,p,r,a]),o.useEffect(()=>{const e=document.activeElement;e instanceof HTMLElement&&e.closest(".guake-terminal")&&!M.getState().terminalOpen&&e.blur()},[]),s.jsxs("div",{className:"dashboard-view",children:[s.jsxs("div",{className:"dashboard-view__topbar",children:[s.jsxs("div",{className:"dashboard-view__metrics",children:[s.jsxs("button",{className:`dashboard-view__metric-btn ${j==="all"?"dashboard-view__metric-btn--active":""}`,onClick:()=>I("all"),children:[s.jsx("span",{className:"dashboard-view__metric-value",children:W.total}),s.jsx("span",{className:"dashboard-view__metric-label",children:h("common:labels.agents")})]}),s.jsxs("button",{className:`dashboard-view__metric-btn dashboard-view__metric-btn--working ${j==="working"?"dashboard-view__metric-btn--active":""}`,onClick:()=>I("working"),children:[s.jsx("span",{className:"dashboard-view__metric-value",children:W.working}),s.jsx("span",{className:"dashboard-view__metric-label",children:h("common:status.working")})]}),s.jsxs("button",{className:"dashboard-view__metric-btn dashboard-view__metric-btn--idle ",onClick:()=>I("all"),children:[s.jsx("span",{className:"dashboard-view__metric-value",children:W.idle}),s.jsx("span",{className:"dashboard-view__metric-label",children:h("common:status.idle")})]}),s.jsxs("button",{className:`dashboard-view__metric-btn dashboard-view__metric-btn--error ${j==="error"?"dashboard-view__metric-btn--active":""}`,onClick:()=>I("error"),children:[s.jsx("span",{className:"dashboard-view__metric-value",children:W.error}),s.jsx("span",{className:"dashboard-view__metric-label",children:h("common:status.error")})]})]}),s.jsx("input",{className:"dashboard-view__search",type:"text",placeholder:h("searchPlaceholder"),value:N,onChange:e=>H(e.target.value)})]}),s.jsxs("div",{className:"dashboard-view__grouping",children:[s.jsx("button",{className:`dashboard-view__grouping-btn ${m==="zone"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>Z("zone"),children:h("grouping.byZone")}),s.jsx("button",{className:`dashboard-view__grouping-btn ${m==="status"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>Z("status"),children:h("grouping.byStatus")}),s.jsx("button",{className:`dashboard-view__grouping-btn ${m==="activity"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>Z("activity"),children:h("grouping.byActivity")})]}),s.jsxs("div",{className:"dashboard-view__content",children:[ss.map(e=>{const d=O(e),l=b.has(d),_=e.sortedAgents,E=e.agents.filter(n=>n.status==="working"||n.status==="waiting"||n.status==="waiting_permission").length,t=e.agents.filter(n=>X.has(n.id)).length;return s.jsxs("div",{className:`dashboard-view__zone ${ws===(e.area?e.area.id:null)&&k?"dashboard-view__zone--drag-over":""}`,onDragOver:n=>ks(n,e.area?e.area.id:null),onDragLeave:Cs,onDrop:()=>ys(e.area?e.area.id:null),children:[s.jsxs("div",{className:"dashboard-view__zone-header",onClick:()=>ps(d),children:[s.jsxs("div",{className:"dashboard-view__zone-left",children:[s.jsx("span",{className:`dashboard-view__zone-chevron ${l?"dashboard-view__zone-chevron--collapsed":""}`,children:s.jsx(U,{name:"caret-down",size:12})}),s.jsx("span",{className:"dashboard-view__zone-dot",style:{backgroundColor:e.color}}),s.jsx("span",{className:"dashboard-view__zone-name",children:e.label}),s.jsxs("span",{className:"dashboard-view__zone-count",children:[h("agentCount",{count:e.agents.length}),E>0&&s.jsxs("span",{className:"dashboard-view__zone-working",children:[" · ",E," ",h("working")]}),t>0&&s.jsxs("span",{className:"dashboard-view__zone-unseen",children:[" · ",t," Unseen"]})]})]}),e.area&&g&&s.jsx("button",{className:"dashboard-view__zone-focus",onClick:n=>{n.stopPropagation(),g(e.area.id)},title:h("focusZone"),children:h("focusZone")})]}),!l&&s.jsx("div",{className:"dashboard-view__zone-grid",children:_.map(n=>s.jsx(bs,{agent:n,isSelected:ns.has(n.id),isKeyboardFocused:P&&p===n.id,onSelect:xs,onDoubleClick:gs,onChat:js,onFocus:z,onKill:F,onDragStart:Ns},n.id))})]},d)}),T.length===0&&s.jsx("div",{className:"dashboard-view__empty",children:N?h("noAgentsMatching",{search:N}):h("noAgentsSpawned")}),S.size>0&&s.jsx(fs,{buildings:S,onSelectBuilding:L})]})]})}export{qs as DashboardView};
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/EmbeddedEditor-
|
|
2
|
-
import{r as t,c as W,d as B,K as Zt,a_ as Ys,S as Ht,a$ as Xs,s as _e,u as oe,j as e,I as M,ca as At,bj as _n,cb as Qs,$ as Kn,cc as Zs,cd as en,ce as Vn,cf as Wn,cg as Lt,ch as qn,ci as Jn,cj as Yn,ck as Ot,cl as Xn,cm as as,cn as Qn,co as tn,cp as $t,cq as zt,bi as it,cr as gt,cs as xt,ct as As,cu as Zn,a2 as ea,cv as ns,_ as ta,cw as sa,cx as na,cy as Pt,cz as aa,cA as ra,cB as ia,cC as la,cD as oa,cE as Os,X as ca,al as da}from"./main-B9Esx3nK.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-3OKhI9bz.js";function ua(s){const[n,l]=t.useState(null),[c,i]=t.useState(!1),r=t.useCallback(async()=>{if(s){i(!0);try{const h=await W(B(`/api/files/git-status?path=${encodeURIComponent(s)}`)),o=await h.json();h.ok?l(o):l({isGitRepo:!1,files:[]})}catch(h){console.error("[FileExplorer] Failed to load git status:",h),l({isGitRepo:!1,files:[]})}finally{i(!1)}}},[s]);return{gitStatus:n,loading:c,loadGitStatus:r}}async function ha(s){try{const n=await W(B(`/api/files/git-original?path=${encodeURIComponent(s)}`)),l=await n.json();return n.ok&&!l.isNew?{content:l.content,isNew:!1}:{content:null,isNew:!0}}catch(n){return console.error("[FileExplorer] Failed to load original file:",n),{content:null,isNew:!0}}}const ma=new Set([".txt",".md",".markdown",".json",".yaml",".yml",".xml",".html",".htm",".css",".scss",".sass",".less",".js",".jsx",".ts",".tsx",".mjs",".cjs",".py",".rb",".c",".cpp",".h",".hpp",".cs",".go",".rs",".swift",".kt",".scala",".clj",".ex",".exs",".erl",".hs",".ml",".fs",".sql",".sh",".bash",".zsh",".fish",".ps1",".bat",".cmd",".toml",".ini",".cfg",".conf",".env",".gitignore",".dockerignore",".editorconfig",".prettierrc",".eslintrc",".babelrc",".log",".csv",".tsv",".svg",""]),fa=new Set([".png",".jpg",".jpeg",".gif",".webp",".bmp",".ico",".svg"]),pa=new Set([".pdf"]),ga=new Set([".xlsx",".xls",".docx",".doc",".pptx",".ppt",".zip",".tar",".gz",".rar",".7z",".exe",".dmg",".app",".deb",".rpm",".apk",".aab",".ipa",".msi",".mp3",".mp4",".wav",".avi",".mov",".mkv",".flac",".ogg",".webm",".ttf",".otf",".woff",".woff2",".eot",".sqlite",".db",".so",".dll",".dylib",".a",".o",".obj",".bin",".dat",".iso",".img",".jar",".war",".ear",".class"]);function xa(s){const n=s.toLowerCase();return fa.has(n)?"image":pa.has(n)?"pdf":ga.has(n)?"binary":(ma.has(n),"text")}function ya(){const[s,n]=t.useState(null),[l,c]=t.useState(!1),[i,r]=t.useState(null),h=t.useCallback(async u=>{var p,b;c(!0),r(null);try{const f=u.substring(u.lastIndexOf(".")).toLowerCase(),v=xa(f),N=u.substring(u.lastIndexOf("/")+1);if(v==="image"){const k=await W(B(`/api/files/binary?path=${encodeURIComponent(u)}`));if(!k.ok){const w=await k.json().catch(()=>({error:"Failed to load image"}));r(w.error||"Failed to load image"),n(null);return}const g=await k.blob(),j=URL.createObjectURL(g);n({path:u,filename:N,extension:f,content:"",size:g.size,modified:new Date().toISOString(),fileType:"image",dataUrl:j});return}if(v==="pdf"){const k=await W(B(`/api/files/info?path=${encodeURIComponent(u)}`)),g=await k.json();if(!k.ok){r(g.error||"Failed to load PDF info"),n(null);return}n({path:u,filename:N,extension:f,content:"",size:g.size,modified:g.modified,fileType:"pdf",dataUrl:B(`/api/files/binary?path=${encodeURIComponent(u)}&token=${encodeURIComponent(Zt())}`)});return}if(v==="binary"){const k=await W(B(`/api/files/info?path=${encodeURIComponent(u)}`)),g=await k.json();if(!k.ok){r(g.error||"Failed to load file info"),n(null);return}n({path:u,filename:N,extension:f,content:"",size:g.size,modified:g.modified,fileType:"binary",dataUrl:B(`/api/files/binary?path=${encodeURIComponent(u)}&download=true&token=${encodeURIComponent(Zt())}`)});return}const R=await W(B(`/api/files/read?path=${encodeURIComponent(u)}`)),y=await R.json();if(!R.ok){if((p=y.error)!=null&&p.includes("too large")||(b=y.error)!=null&&b.includes("binary")){const k=await W(B(`/api/files/info?path=${encodeURIComponent(u)}`)),g=await k.json();if(k.ok){n({path:u,filename:N,extension:f,content:"",size:g.size,modified:g.modified,fileType:"binary",dataUrl:B(`/api/files/binary?path=${encodeURIComponent(u)}&download=true&token=${encodeURIComponent(Zt())}`)});return}}r(y.error||"Failed to load file"),n(null);return}n({...y,fileType:"text"})}catch(f){const v=f instanceof Error?f.message:"Failed to load file";r(v),n(null)}finally{c(!1)}},[]),o=t.useCallback(()=>{n(u=>(u!=null&&u.dataUrl&&u.dataUrl.startsWith("blob:")&&URL.revokeObjectURL(u.dataUrl),null)),r(null)},[]);return{file:s,loading:l,error:i,loadFile:h,clearFile:o,setFile:n}}const ba="file-explorer-state",Gs="file-explorer-recent-projects",ja=10080*60*1e3,va=12;function es(s){return`${ba}-folder-${s}`}async function wa(s){try{const n=await W(B(`/api/files/exists?path=${encodeURIComponent(s)}`));return n.ok?(await n.json()).exists===!0:!1}catch{return!1}}function Ca(){const s=t.useCallback(async i=>{if(!i)return null;try{const r=localStorage.getItem(es(i));if(!r)return null;const h=JSON.parse(r);if(Date.now()-h.timestamp>ja)return localStorage.removeItem(es(i)),null;const u=(await Promise.all((h.tabs||[]).map(async b=>({tab:b,exists:await wa(b.path)})))).filter(({exists:b})=>b).map(({tab:b})=>b);let p=h.activeTabPath;return p&&!u.some(b=>b.path===p)&&(p=u.length>0?u[0].path:null),{tabs:u,activeTabPath:p,viewMode:h.viewMode||"files",expandedPaths:new Set(h.expandedPaths||[])}}catch(r){return console.error("[FileExplorerStorage] Failed to load project state:",r),null}},[]),n=t.useCallback((i,r)=>{if(i)try{const h={tabs:r.tabs,activeTabPath:r.activeTabPath,viewMode:r.viewMode,expandedPaths:Array.from(r.expandedPaths),timestamp:Date.now()};localStorage.setItem(es(i),JSON.stringify(h))}catch(h){console.error("[FileExplorerStorage] Failed to save project state:",h)}},[]),l=t.useCallback(()=>{try{const i=localStorage.getItem(Gs);if(!i)return[];const r=JSON.parse(i);return Array.isArray(r)?r.filter(h=>typeof h=="string"):[]}catch{return[]}},[]),c=t.useCallback(i=>{if(!i)return l();const r=[i,...l().filter(h=>h!==i)].slice(0,va);try{localStorage.setItem(Gs,JSON.stringify(r))}catch{}return r},[l]);return{loadProjectState:s,saveProjectState:n,loadRecentProjects:l,pushRecentProject:c}}const Us=280,Bs=150,_s=1200;function Na(){const[s,n]=t.useState(()=>{const p=Ys(Ht.TREE_PANEL_WIDTH,Us);return p>=Bs&&p<=_s?p:Us}),l=t.useRef(!1),[c,i]=t.useState(!1),r=t.useRef(0),h=t.useRef(0),o=t.useRef(s);o.current=s;const u=t.useCallback(p=>{p.preventDefault(),l.current=!0,i(!0),r.current=p.clientX,h.current=s,document.body.style.cursor="ew-resize",document.body.style.userSelect="none"},[s]);return t.useEffect(()=>{const p=f=>{if(!l.current)return;const v=f.clientX-r.current,N=Math.min(_s,Math.max(Bs,h.current+v));n(N)},b=()=>{l.current&&(l.current=!1,i(!1),document.body.style.cursor="",document.body.style.userSelect="",Xs(Ht.TREE_PANEL_WIDTH,o.current))};return document.addEventListener("mousemove",p),document.addEventListener("mouseup",b),()=>{document.removeEventListener("mousemove",p),document.removeEventListener("mouseup",b)}},[]),{treePanelWidth:s,handleResizeStart:u,isResizing:c}}const ka=100,Ea=.65,Sa=36;function Ta(){const[s,n]=t.useState(()=>Ys(Ht.MOBILE_TREE_PANEL_HEIGHT,0)),l=t.useRef(s);l.current=s;const c=t.useRef(0),i=t.useRef(0),r=()=>Math.floor((window.innerHeight-Sa)*Ea),h=f=>Math.min(r(),Math.max(ka,f)),o=t.useCallback(f=>{n(f);const v=document.querySelector(".file-explorer-main");v&&v.style.setProperty("--fe-mobile-tree-height",`${f}px`)},[]),u=t.useCallback(()=>{document.body.style.cursor="",document.body.style.userSelect="",Xs(Ht.MOBILE_TREE_PANEL_HEIGHT,l.current),_e.setTerminalResizing(!1)},[]),p=t.useCallback(f=>{f.preventDefault();const v=document.querySelector(".file-explorer-tree-panel"),N=l.current>0?l.current:(v==null?void 0:v.getBoundingClientRect().height)??240;c.current=f.clientY,i.current=N,document.body.style.cursor="ns-resize",document.body.style.userSelect="none",_e.setTerminalResizing(!0);const R=k=>{const g=k.clientY-c.current;o(h(i.current+g))},y=()=>{document.removeEventListener("mousemove",R),document.removeEventListener("mouseup",y),u()};document.addEventListener("mousemove",R),document.addEventListener("mouseup",y)},[o,u]),b=t.useCallback(f=>{if(f.touches.length!==1)return;const v=document.querySelector(".file-explorer-tree-panel"),N=l.current>0?l.current:(v==null?void 0:v.getBoundingClientRect().height)??240;c.current=f.touches[0].clientY,i.current=N,document.body.style.cursor="ns-resize",document.body.style.userSelect="none",_e.setTerminalResizing(!0);const R=k=>{if(k.touches.length!==1)return;k.preventDefault();const g=k.touches[0].clientY-c.current;o(h(i.current+g))},y=()=>{document.removeEventListener("touchmove",R),document.removeEventListener("touchend",y),document.removeEventListener("touchcancel",y),u()};document.addEventListener("touchmove",R,{passive:!1}),document.addEventListener("touchend",y),document.addEventListener("touchcancel",y)},[o,u]);return{mobileTreeHeight:s,handleResizeMouseDown:p,handleResizeTouchStart:b}}function rs(){const[s,n]=t.useState([]),[l,c]=t.useState(!1),[i,r]=t.useState(null),[h,o]=t.useState(null),u=t.useCallback(async k=>{c(!0),r(null);try{const g=await W(B(`/api/files/git-branches?path=${encodeURIComponent(k)}`)),j=await g.json();g.ok?n(j.branches||[]):(r(j.error||"Failed to load branches"),n([]))}catch(g){console.error("[GitBranches] Failed to load branches:",g),r("Failed to load branches"),n([])}finally{c(!1)}},[]),p=t.useCallback(async(k,g)=>{o("checkout"),r(null);try{const j=await W(B("/api/files/git-checkout"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:k,branch:g})}),w=await j.json();return j.ok||r(w.error||"Checkout failed"),w}catch(j){console.error("[GitBranches] Checkout failed:",j);const w={success:!1,error:"Checkout failed"};return r(w.error),w}finally{o(null)}},[]),b=t.useCallback(async(k,g,j)=>{o("create"),r(null);try{const w=await W(B("/api/files/git-branch-create"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:k,name:g,startPoint:j})}),T=await w.json();return w.ok||r(T.error||"Failed to create branch"),T}catch(w){console.error("[GitBranches] Create branch failed:",w);const T={success:!1,error:"Failed to create branch"};return r(T.error),T}finally{o(null)}},[]),f=t.useCallback(async k=>{o("pull"),r(null);try{const g=await W(B("/api/files/git-pull"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:k})}),j=await g.json();return!g.ok&&!j.conflicts&&r(j.error||"Pull failed"),j}catch(g){console.error("[GitBranches] Pull failed:",g);const j={success:!1,error:"Pull failed"};return r(j.error),j}finally{o(null)}},[]),v=t.useCallback(async k=>{o("push"),r(null);try{const g=await W(B("/api/files/git-push"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:k})}),j=await g.json();return g.ok||r(j.error||"Push failed"),j}catch(g){console.error("[GitBranches] Push failed:",g);const j={success:!1,error:"Push failed"};return r(j.error),j}finally{o(null)}},[]),N=t.useCallback(async(k,g)=>{o("merge"),r(null);try{const j=await W(B("/api/files/git-merge"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:k,branch:g})}),w=await j.json();return!j.ok&&!w.conflicts&&r(w.error||"Merge failed"),w}catch(j){console.error("[GitBranches] Merge failed:",j);const w={success:!1,error:"Merge failed"};return r(w.error),w}finally{o(null)}},[]),R=t.useCallback(async k=>{o("merge-abort"),r(null);try{const g=await W(B("/api/files/git-merge-abort"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:k})}),j=await g.json();return g.ok||r(j.error||"Merge abort failed"),j}catch(g){console.error("[GitBranches] Merge abort failed:",g);const j={success:!1,error:"Merge abort failed"};return r(j.error),j}finally{o(null)}},[]),y=t.useCallback(async k=>{o("merge-continue"),r(null);try{const g=await W(B("/api/files/git-merge-continue"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:k})}),j=await g.json();return g.ok||r(j.error||"Merge continue failed"),j}catch(g){console.error("[GitBranches] Merge continue failed:",g);const j={success:!1,error:"Merge continue failed"};return r(j.error),j}finally{o(null)}},[]);return{branches:s,loading:l,error:i,operationInProgress:h,loadBranches:u,checkoutBranch:p,createBranch:b,pullFromRemote:f,pushToRemote:v,mergeBranch:N,mergeAbort:R,mergeContinue:y}}const Ma=50,Da=400,Ks={branch:"",author:"",since:"",until:"",searchPath:"",search:""};function Ra(){const[s,n]=t.useState([]),[l,c]=t.useState(!1),[i,r]=t.useState(!1),[h,o]=t.useState(null),[u,p]=t.useState(!1),[b,f]=t.useState(0),[v,N]=t.useState({...Ks}),[R,y]=t.useState(null),[k,g]=t.useState([]),[j,w]=t.useState(!1),[T,A]=t.useState([]),[K,C]=t.useState(!1),O=t.useRef(null),ae=t.useRef(""),Y=t.useCallback((U,Z,P)=>{const G=P||v,I=new URLSearchParams;return I.set("path",U),I.set("limit",String(Ma)),I.set("offset",String(Z)),G.branch&&I.set("branch",G.branch),G.author&&I.set("author",G.author),G.since&&I.set("since",G.since),G.until&&I.set("until",G.until),G.searchPath&&I.set("searchPath",G.searchPath),G.search&&I.set("search",G.search),I.toString()},[v]),D=t.useCallback(async U=>{ae.current=U,c(!0),o(null),y(null),g([]);try{const Z=Y(U,0),P=await W(B(`/api/files/git-log?${Z}`)),G=await P.json();P.ok?(n(G.commits||[]),f(G.total||0),p(G.hasMore||!1)):(o(G.error||"Failed to load git history"),n([]))}catch(Z){console.error("[useGitHistory] loadHistory error:",Z),o("Failed to load git history"),n([])}finally{c(!1)}},[Y]),F=t.useCallback(async U=>{if(!(i||!u)){r(!0);try{const Z=Y(U,s.length),P=await W(B(`/api/files/git-log?${Z}`)),G=await P.json();P.ok&&(n(I=>[...I,...G.commits||[]]),f(G.total||0),p(G.hasMore||!1))}catch(Z){console.error("[useGitHistory] loadMore error:",Z)}finally{r(!1)}}},[Y,s.length,u,i]),V=t.useCallback(async U=>{if(y(U),!U){g([]);return}w(!0);try{const Z=ae.current,P=new URLSearchParams({path:Z,hash:U.hash}),G=await W(B(`/api/files/git-commit-files?${P}`)),I=await G.json();G.ok?g(I.files||[]):g([])}catch(Z){console.error("[useGitHistory] selectCommit files error:",Z),g([])}finally{w(!1)}},[]),ne=t.useCallback((U,Z)=>{N(P=>({...P,[U]:Z}))},[]),re=t.useCallback(()=>{N({...Ks})},[]);t.useEffect(()=>{const U=ae.current;if(U)return O.current&&clearTimeout(O.current),O.current=setTimeout(()=>{D(U)},Da),()=>{O.current&&clearTimeout(O.current)}},[v]);const je=t.useCallback(async U=>{C(!0);try{const Z=new URLSearchParams({path:U}),P=await W(B(`/api/files/git-authors?${Z}`)),G=await P.json();P.ok&&A(G.authors||[])}catch(Z){console.error("[useGitHistory] loadAuthors error:",Z)}finally{C(!1)}},[]);return{commits:s,loading:l,loadingMore:i,error:h,hasMore:u,total:b,filters:v,setFilter:ne,resetFilters:re,selectedCommit:R,selectCommit:V,commitFiles:k,commitFilesLoading:j,loadHistory:D,loadMore:F,authors:T,authorsLoading:K,loadAuthors:je}}function Fa(s){if(!s.current)return null;const n=[".file-viewer-code-with-lines",".file-viewer-markdown-wrapper",".file-viewer-code-wrapper",".file-viewer-diagram-wrapper",".file-viewer-image-wrapper",".file-viewer-pdf-wrapper"];for(const l of n){const c=s.current.querySelector(l);if(c&&Vs(c))return c}return Vs(s.current)?s.current:null}function Vs(s){const n=["auto","scroll"].includes(getComputedStyle(s).overflowY),l=s.scrollHeight>s.clientHeight||s.scrollWidth>s.clientWidth;return n&&l}function sn(s){if(!s)return 19.5;const n=parseFloat(getComputedStyle(s).lineHeight);return isNaN(n)?19.5:n}function ts(s,n=!0){const l=n?s.scrollHeight:0;s.scrollTo({top:l,behavior:"smooth"})}function Pa(s){const{scrollTop:n,scrollHeight:l,clientHeight:c}=s;return l<=c?100:Math.round(n/(l-c)*100)}function Ia(s,n){const l=sn(s),c=s.scrollTop,i=Math.floor(c/l)+1,r=n.split(`
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/EmbeddedEditor-Df75irwV.js","assets/main-CTWrCxkg.js","assets/vendor-react--Eh9ivFN.js","assets/vendor-three-3OKhI9bz.js","assets/main-CDftdafQ.css","assets/EmbeddedEditor-BipHj7Fz.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as t,c as W,d as B,K as Zt,a_ as Ys,S as Ht,a$ as Xs,s as _e,u as oe,j as e,I as M,ca as At,bj as _n,cb as Qs,$ as Kn,cc as Zs,cd as en,ce as Vn,cf as Wn,cg as Lt,ch as qn,ci as Jn,cj as Yn,ck as Ot,cl as Xn,cm as as,cn as Qn,co as tn,cp as $t,cq as zt,bi as it,cr as gt,cs as xt,ct as As,cu as Zn,a2 as ea,cv as ns,_ as ta,cw as sa,cx as na,cy as Pt,cz as aa,cA as ra,cB as ia,cC as la,cD as oa,cE as Os,X as ca,al as da}from"./main-CTWrCxkg.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-3OKhI9bz.js";function ua(s){const[n,l]=t.useState(null),[c,i]=t.useState(!1),r=t.useCallback(async()=>{if(s){i(!0);try{const h=await W(B(`/api/files/git-status?path=${encodeURIComponent(s)}`)),o=await h.json();h.ok?l(o):l({isGitRepo:!1,files:[]})}catch(h){console.error("[FileExplorer] Failed to load git status:",h),l({isGitRepo:!1,files:[]})}finally{i(!1)}}},[s]);return{gitStatus:n,loading:c,loadGitStatus:r}}async function ha(s){try{const n=await W(B(`/api/files/git-original?path=${encodeURIComponent(s)}`)),l=await n.json();return n.ok&&!l.isNew?{content:l.content,isNew:!1}:{content:null,isNew:!0}}catch(n){return console.error("[FileExplorer] Failed to load original file:",n),{content:null,isNew:!0}}}const ma=new Set([".txt",".md",".markdown",".json",".yaml",".yml",".xml",".html",".htm",".css",".scss",".sass",".less",".js",".jsx",".ts",".tsx",".mjs",".cjs",".py",".rb",".c",".cpp",".h",".hpp",".cs",".go",".rs",".swift",".kt",".scala",".clj",".ex",".exs",".erl",".hs",".ml",".fs",".sql",".sh",".bash",".zsh",".fish",".ps1",".bat",".cmd",".toml",".ini",".cfg",".conf",".env",".gitignore",".dockerignore",".editorconfig",".prettierrc",".eslintrc",".babelrc",".log",".csv",".tsv",".svg",""]),fa=new Set([".png",".jpg",".jpeg",".gif",".webp",".bmp",".ico",".svg"]),pa=new Set([".pdf"]),ga=new Set([".xlsx",".xls",".docx",".doc",".pptx",".ppt",".zip",".tar",".gz",".rar",".7z",".exe",".dmg",".app",".deb",".rpm",".apk",".aab",".ipa",".msi",".mp3",".mp4",".wav",".avi",".mov",".mkv",".flac",".ogg",".webm",".ttf",".otf",".woff",".woff2",".eot",".sqlite",".db",".so",".dll",".dylib",".a",".o",".obj",".bin",".dat",".iso",".img",".jar",".war",".ear",".class"]);function xa(s){const n=s.toLowerCase();return fa.has(n)?"image":pa.has(n)?"pdf":ga.has(n)?"binary":(ma.has(n),"text")}function ya(){const[s,n]=t.useState(null),[l,c]=t.useState(!1),[i,r]=t.useState(null),h=t.useCallback(async u=>{var p,b;c(!0),r(null);try{const f=u.substring(u.lastIndexOf(".")).toLowerCase(),v=xa(f),N=u.substring(u.lastIndexOf("/")+1);if(v==="image"){const k=await W(B(`/api/files/binary?path=${encodeURIComponent(u)}`));if(!k.ok){const w=await k.json().catch(()=>({error:"Failed to load image"}));r(w.error||"Failed to load image"),n(null);return}const g=await k.blob(),j=URL.createObjectURL(g);n({path:u,filename:N,extension:f,content:"",size:g.size,modified:new Date().toISOString(),fileType:"image",dataUrl:j});return}if(v==="pdf"){const k=await W(B(`/api/files/info?path=${encodeURIComponent(u)}`)),g=await k.json();if(!k.ok){r(g.error||"Failed to load PDF info"),n(null);return}n({path:u,filename:N,extension:f,content:"",size:g.size,modified:g.modified,fileType:"pdf",dataUrl:B(`/api/files/binary?path=${encodeURIComponent(u)}&token=${encodeURIComponent(Zt())}`)});return}if(v==="binary"){const k=await W(B(`/api/files/info?path=${encodeURIComponent(u)}`)),g=await k.json();if(!k.ok){r(g.error||"Failed to load file info"),n(null);return}n({path:u,filename:N,extension:f,content:"",size:g.size,modified:g.modified,fileType:"binary",dataUrl:B(`/api/files/binary?path=${encodeURIComponent(u)}&download=true&token=${encodeURIComponent(Zt())}`)});return}const R=await W(B(`/api/files/read?path=${encodeURIComponent(u)}`)),y=await R.json();if(!R.ok){if((p=y.error)!=null&&p.includes("too large")||(b=y.error)!=null&&b.includes("binary")){const k=await W(B(`/api/files/info?path=${encodeURIComponent(u)}`)),g=await k.json();if(k.ok){n({path:u,filename:N,extension:f,content:"",size:g.size,modified:g.modified,fileType:"binary",dataUrl:B(`/api/files/binary?path=${encodeURIComponent(u)}&download=true&token=${encodeURIComponent(Zt())}`)});return}}r(y.error||"Failed to load file"),n(null);return}n({...y,fileType:"text"})}catch(f){const v=f instanceof Error?f.message:"Failed to load file";r(v),n(null)}finally{c(!1)}},[]),o=t.useCallback(()=>{n(u=>(u!=null&&u.dataUrl&&u.dataUrl.startsWith("blob:")&&URL.revokeObjectURL(u.dataUrl),null)),r(null)},[]);return{file:s,loading:l,error:i,loadFile:h,clearFile:o,setFile:n}}const ba="file-explorer-state",Gs="file-explorer-recent-projects",ja=10080*60*1e3,va=12;function es(s){return`${ba}-folder-${s}`}async function wa(s){try{const n=await W(B(`/api/files/exists?path=${encodeURIComponent(s)}`));return n.ok?(await n.json()).exists===!0:!1}catch{return!1}}function Ca(){const s=t.useCallback(async i=>{if(!i)return null;try{const r=localStorage.getItem(es(i));if(!r)return null;const h=JSON.parse(r);if(Date.now()-h.timestamp>ja)return localStorage.removeItem(es(i)),null;const u=(await Promise.all((h.tabs||[]).map(async b=>({tab:b,exists:await wa(b.path)})))).filter(({exists:b})=>b).map(({tab:b})=>b);let p=h.activeTabPath;return p&&!u.some(b=>b.path===p)&&(p=u.length>0?u[0].path:null),{tabs:u,activeTabPath:p,viewMode:h.viewMode||"files",expandedPaths:new Set(h.expandedPaths||[])}}catch(r){return console.error("[FileExplorerStorage] Failed to load project state:",r),null}},[]),n=t.useCallback((i,r)=>{if(i)try{const h={tabs:r.tabs,activeTabPath:r.activeTabPath,viewMode:r.viewMode,expandedPaths:Array.from(r.expandedPaths),timestamp:Date.now()};localStorage.setItem(es(i),JSON.stringify(h))}catch(h){console.error("[FileExplorerStorage] Failed to save project state:",h)}},[]),l=t.useCallback(()=>{try{const i=localStorage.getItem(Gs);if(!i)return[];const r=JSON.parse(i);return Array.isArray(r)?r.filter(h=>typeof h=="string"):[]}catch{return[]}},[]),c=t.useCallback(i=>{if(!i)return l();const r=[i,...l().filter(h=>h!==i)].slice(0,va);try{localStorage.setItem(Gs,JSON.stringify(r))}catch{}return r},[l]);return{loadProjectState:s,saveProjectState:n,loadRecentProjects:l,pushRecentProject:c}}const Us=280,Bs=150,_s=1200;function Na(){const[s,n]=t.useState(()=>{const p=Ys(Ht.TREE_PANEL_WIDTH,Us);return p>=Bs&&p<=_s?p:Us}),l=t.useRef(!1),[c,i]=t.useState(!1),r=t.useRef(0),h=t.useRef(0),o=t.useRef(s);o.current=s;const u=t.useCallback(p=>{p.preventDefault(),l.current=!0,i(!0),r.current=p.clientX,h.current=s,document.body.style.cursor="ew-resize",document.body.style.userSelect="none"},[s]);return t.useEffect(()=>{const p=f=>{if(!l.current)return;const v=f.clientX-r.current,N=Math.min(_s,Math.max(Bs,h.current+v));n(N)},b=()=>{l.current&&(l.current=!1,i(!1),document.body.style.cursor="",document.body.style.userSelect="",Xs(Ht.TREE_PANEL_WIDTH,o.current))};return document.addEventListener("mousemove",p),document.addEventListener("mouseup",b),()=>{document.removeEventListener("mousemove",p),document.removeEventListener("mouseup",b)}},[]),{treePanelWidth:s,handleResizeStart:u,isResizing:c}}const ka=100,Ea=.65,Sa=36;function Ta(){const[s,n]=t.useState(()=>Ys(Ht.MOBILE_TREE_PANEL_HEIGHT,0)),l=t.useRef(s);l.current=s;const c=t.useRef(0),i=t.useRef(0),r=()=>Math.floor((window.innerHeight-Sa)*Ea),h=f=>Math.min(r(),Math.max(ka,f)),o=t.useCallback(f=>{n(f);const v=document.querySelector(".file-explorer-main");v&&v.style.setProperty("--fe-mobile-tree-height",`${f}px`)},[]),u=t.useCallback(()=>{document.body.style.cursor="",document.body.style.userSelect="",Xs(Ht.MOBILE_TREE_PANEL_HEIGHT,l.current),_e.setTerminalResizing(!1)},[]),p=t.useCallback(f=>{f.preventDefault();const v=document.querySelector(".file-explorer-tree-panel"),N=l.current>0?l.current:(v==null?void 0:v.getBoundingClientRect().height)??240;c.current=f.clientY,i.current=N,document.body.style.cursor="ns-resize",document.body.style.userSelect="none",_e.setTerminalResizing(!0);const R=k=>{const g=k.clientY-c.current;o(h(i.current+g))},y=()=>{document.removeEventListener("mousemove",R),document.removeEventListener("mouseup",y),u()};document.addEventListener("mousemove",R),document.addEventListener("mouseup",y)},[o,u]),b=t.useCallback(f=>{if(f.touches.length!==1)return;const v=document.querySelector(".file-explorer-tree-panel"),N=l.current>0?l.current:(v==null?void 0:v.getBoundingClientRect().height)??240;c.current=f.touches[0].clientY,i.current=N,document.body.style.cursor="ns-resize",document.body.style.userSelect="none",_e.setTerminalResizing(!0);const R=k=>{if(k.touches.length!==1)return;k.preventDefault();const g=k.touches[0].clientY-c.current;o(h(i.current+g))},y=()=>{document.removeEventListener("touchmove",R),document.removeEventListener("touchend",y),document.removeEventListener("touchcancel",y),u()};document.addEventListener("touchmove",R,{passive:!1}),document.addEventListener("touchend",y),document.addEventListener("touchcancel",y)},[o,u]);return{mobileTreeHeight:s,handleResizeMouseDown:p,handleResizeTouchStart:b}}function rs(){const[s,n]=t.useState([]),[l,c]=t.useState(!1),[i,r]=t.useState(null),[h,o]=t.useState(null),u=t.useCallback(async k=>{c(!0),r(null);try{const g=await W(B(`/api/files/git-branches?path=${encodeURIComponent(k)}`)),j=await g.json();g.ok?n(j.branches||[]):(r(j.error||"Failed to load branches"),n([]))}catch(g){console.error("[GitBranches] Failed to load branches:",g),r("Failed to load branches"),n([])}finally{c(!1)}},[]),p=t.useCallback(async(k,g)=>{o("checkout"),r(null);try{const j=await W(B("/api/files/git-checkout"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:k,branch:g})}),w=await j.json();return j.ok||r(w.error||"Checkout failed"),w}catch(j){console.error("[GitBranches] Checkout failed:",j);const w={success:!1,error:"Checkout failed"};return r(w.error),w}finally{o(null)}},[]),b=t.useCallback(async(k,g,j)=>{o("create"),r(null);try{const w=await W(B("/api/files/git-branch-create"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:k,name:g,startPoint:j})}),T=await w.json();return w.ok||r(T.error||"Failed to create branch"),T}catch(w){console.error("[GitBranches] Create branch failed:",w);const T={success:!1,error:"Failed to create branch"};return r(T.error),T}finally{o(null)}},[]),f=t.useCallback(async k=>{o("pull"),r(null);try{const g=await W(B("/api/files/git-pull"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:k})}),j=await g.json();return!g.ok&&!j.conflicts&&r(j.error||"Pull failed"),j}catch(g){console.error("[GitBranches] Pull failed:",g);const j={success:!1,error:"Pull failed"};return r(j.error),j}finally{o(null)}},[]),v=t.useCallback(async k=>{o("push"),r(null);try{const g=await W(B("/api/files/git-push"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:k})}),j=await g.json();return g.ok||r(j.error||"Push failed"),j}catch(g){console.error("[GitBranches] Push failed:",g);const j={success:!1,error:"Push failed"};return r(j.error),j}finally{o(null)}},[]),N=t.useCallback(async(k,g)=>{o("merge"),r(null);try{const j=await W(B("/api/files/git-merge"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:k,branch:g})}),w=await j.json();return!j.ok&&!w.conflicts&&r(w.error||"Merge failed"),w}catch(j){console.error("[GitBranches] Merge failed:",j);const w={success:!1,error:"Merge failed"};return r(w.error),w}finally{o(null)}},[]),R=t.useCallback(async k=>{o("merge-abort"),r(null);try{const g=await W(B("/api/files/git-merge-abort"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:k})}),j=await g.json();return g.ok||r(j.error||"Merge abort failed"),j}catch(g){console.error("[GitBranches] Merge abort failed:",g);const j={success:!1,error:"Merge abort failed"};return r(j.error),j}finally{o(null)}},[]),y=t.useCallback(async k=>{o("merge-continue"),r(null);try{const g=await W(B("/api/files/git-merge-continue"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:k})}),j=await g.json();return g.ok||r(j.error||"Merge continue failed"),j}catch(g){console.error("[GitBranches] Merge continue failed:",g);const j={success:!1,error:"Merge continue failed"};return r(j.error),j}finally{o(null)}},[]);return{branches:s,loading:l,error:i,operationInProgress:h,loadBranches:u,checkoutBranch:p,createBranch:b,pullFromRemote:f,pushToRemote:v,mergeBranch:N,mergeAbort:R,mergeContinue:y}}const Ma=50,Da=400,Ks={branch:"",author:"",since:"",until:"",searchPath:"",search:""};function Ra(){const[s,n]=t.useState([]),[l,c]=t.useState(!1),[i,r]=t.useState(!1),[h,o]=t.useState(null),[u,p]=t.useState(!1),[b,f]=t.useState(0),[v,N]=t.useState({...Ks}),[R,y]=t.useState(null),[k,g]=t.useState([]),[j,w]=t.useState(!1),[T,A]=t.useState([]),[K,C]=t.useState(!1),O=t.useRef(null),ae=t.useRef(""),Y=t.useCallback((U,Z,P)=>{const G=P||v,I=new URLSearchParams;return I.set("path",U),I.set("limit",String(Ma)),I.set("offset",String(Z)),G.branch&&I.set("branch",G.branch),G.author&&I.set("author",G.author),G.since&&I.set("since",G.since),G.until&&I.set("until",G.until),G.searchPath&&I.set("searchPath",G.searchPath),G.search&&I.set("search",G.search),I.toString()},[v]),D=t.useCallback(async U=>{ae.current=U,c(!0),o(null),y(null),g([]);try{const Z=Y(U,0),P=await W(B(`/api/files/git-log?${Z}`)),G=await P.json();P.ok?(n(G.commits||[]),f(G.total||0),p(G.hasMore||!1)):(o(G.error||"Failed to load git history"),n([]))}catch(Z){console.error("[useGitHistory] loadHistory error:",Z),o("Failed to load git history"),n([])}finally{c(!1)}},[Y]),F=t.useCallback(async U=>{if(!(i||!u)){r(!0);try{const Z=Y(U,s.length),P=await W(B(`/api/files/git-log?${Z}`)),G=await P.json();P.ok&&(n(I=>[...I,...G.commits||[]]),f(G.total||0),p(G.hasMore||!1))}catch(Z){console.error("[useGitHistory] loadMore error:",Z)}finally{r(!1)}}},[Y,s.length,u,i]),V=t.useCallback(async U=>{if(y(U),!U){g([]);return}w(!0);try{const Z=ae.current,P=new URLSearchParams({path:Z,hash:U.hash}),G=await W(B(`/api/files/git-commit-files?${P}`)),I=await G.json();G.ok?g(I.files||[]):g([])}catch(Z){console.error("[useGitHistory] selectCommit files error:",Z),g([])}finally{w(!1)}},[]),ne=t.useCallback((U,Z)=>{N(P=>({...P,[U]:Z}))},[]),re=t.useCallback(()=>{N({...Ks})},[]);t.useEffect(()=>{const U=ae.current;if(U)return O.current&&clearTimeout(O.current),O.current=setTimeout(()=>{D(U)},Da),()=>{O.current&&clearTimeout(O.current)}},[v]);const je=t.useCallback(async U=>{C(!0);try{const Z=new URLSearchParams({path:U}),P=await W(B(`/api/files/git-authors?${Z}`)),G=await P.json();P.ok&&A(G.authors||[])}catch(Z){console.error("[useGitHistory] loadAuthors error:",Z)}finally{C(!1)}},[]);return{commits:s,loading:l,loadingMore:i,error:h,hasMore:u,total:b,filters:v,setFilter:ne,resetFilters:re,selectedCommit:R,selectCommit:V,commitFiles:k,commitFilesLoading:j,loadHistory:D,loadMore:F,authors:T,authorsLoading:K,loadAuthors:je}}function Fa(s){if(!s.current)return null;const n=[".file-viewer-code-with-lines",".file-viewer-markdown-wrapper",".file-viewer-code-wrapper",".file-viewer-diagram-wrapper",".file-viewer-image-wrapper",".file-viewer-pdf-wrapper"];for(const l of n){const c=s.current.querySelector(l);if(c&&Vs(c))return c}return Vs(s.current)?s.current:null}function Vs(s){const n=["auto","scroll"].includes(getComputedStyle(s).overflowY),l=s.scrollHeight>s.clientHeight||s.scrollWidth>s.clientWidth;return n&&l}function sn(s){if(!s)return 19.5;const n=parseFloat(getComputedStyle(s).lineHeight);return isNaN(n)?19.5:n}function ts(s,n=!0){const l=n?s.scrollHeight:0;s.scrollTo({top:l,behavior:"smooth"})}function Pa(s){const{scrollTop:n,scrollHeight:l,clientHeight:c}=s;return l<=c?100:Math.round(n/(l-c)*100)}function Ia(s,n){const l=sn(s),c=s.scrollTop,i=Math.floor(c/l)+1,r=n.split(`
|
|
3
3
|
`).length;return Math.min(i,r)}function La(s,n,l=!1){if(!n)return[];l||s.toLowerCase();const c=l?n:n.toLowerCase(),i=[];let r=0;const h=s.split(`
|
|
4
4
|
`);let o=0;for(let u=0;u<h.length;u++){const p=h[u],b=l?p:p.toLowerCase();let f=0,v=b.indexOf(c);for(;v!==-1;){const N=o+v;i.push({index:r++,line:u+1,column:v,length:c.length,charIndex:N}),f=v+c.length,v=b.indexOf(c,f)}o+=p.length+1}return i}function lt(s){return/[\w]/.test(s)}function Ke(s){return/\s/.test(s)}function $a(s,n,l){let c=n-1,i=l;const r=s.length,h=s[c]||"";if(i<h.length){const p=lt(h[i]);if(!Ke(h[i]))for(;i<h.length&&!Ke(h[i])&<(h[i])===p;)i++}for(;c<r;){const p=s[c]||"";for(;i<p.length&&Ke(p[i]);)i++;if(i<p.length)return{line:c+1,col:i};c++,i=0}const o=r,u=Math.max(0,(s[r-1]||"").length-1);return{line:o,col:u}}function za(s,n,l){let c=n-1,i=l+1;const r=s.length;for(;c<r;){const u=s[c]||"";for(;i<u.length&&Ke(u[i]);)i++;if(i<u.length)break;c++,i=0}if(c>=r)return{line:r,col:Math.max(0,(s[r-1]||"").length-1)};const h=s[c]||"",o=lt(h[i]);for(;i+1<h.length&&!Ke(h[i+1])&<(h[i+1])===o;)i++;return{line:c+1,col:i}}function Ha(s,n,l){let c=n-1,i=l-1;for(;c>=0;){const o=s[c]||"";for(;i>=0&&Ke(o[i]);)i--;if(i>=0)break;c--,c>=0&&(i=(s[c]||"").length-1)}if(c<0)return{line:1,col:0};const r=s[c]||"",h=lt(r[i]);for(;i>0&&!Ke(r[i-1])&<(r[i-1])===h;)i--;return{line:c+1,col:i}}function Aa(s,n,l,c){if(c==="none")return"";const{anchorLine:i,anchorCol:r,headLine:h,headCol:o}=l;if(c==="line"){const N=Math.min(i,h),R=Math.max(i,h);return n.slice(N-1,R).join(`
|
|
5
5
|
`)}let u,p,b,f;if(i<h||i===h&&r<=o?(u=i,p=r,b=h,f=o):(u=h,p=o,b=i,f=r),u===b)return(n[u-1]||"").substring(p,f+1);const v=[];v.push((n[u-1]||"").substring(p));for(let N=u;N<b-1;N++)v.push(n[N]||"");return v.push((n[b-1]||"").substring(0,f+1)),v.join(`
|
|
6
6
|
`)}function nn(s){const{containerRef:n,isEnabled:l=!0,content:c="",onClose:i,onSearchOpen:r}=s,h=t.useRef({percentage:0,line:1,column:1}),o=t.useRef(null),u=t.useRef(19.5),p=t.useMemo(()=>c.split(`
|
|
7
|
-
`),[c]),b=p.length,[f,v]=t.useState(1),[N,R]=t.useState(0),[y,k]=t.useState(!1),[g,j]=t.useState("none"),[w,T]=t.useState(null),[A,K]=t.useState(!1),[C,O]=t.useState(""),[ae,Y]=t.useState(0),[D,F]=t.useState(!1),V=t.useMemo(()=>La(c,C,!1),[c,C]),ne=t.useCallback(()=>{const m=o.current;if(!m)return;const X=Pa(m),le=Ia(m,c),$=Math.max(1,Math.round(m.scrollLeft/7.8)+1);h.current={percentage:X,line:le,column:$}},[c]),re=t.useCallback(()=>{K(!0),O(""),Y(0),r==null||r()},[r]),je=t.useCallback(()=>{K(!1),O(""),Y(0)},[]),U=t.useCallback(()=>{F(m=>!m)},[]),Z=t.useCallback(m=>{const X=o.current;if(!X)return;const le=X.querySelector(".file-viewer-pre"),H=le&&parseFloat(getComputedStyle(le).lineHeight)||u.current,$=le&&parseFloat(getComputedStyle(le).paddingTop)||0,te=(le?le.offsetTop:0)+$+(m-1)*H,Q=H*3;X.scrollTo({top:Math.max(0,te-Q),behavior:"smooth"})},[]);t.useEffect(()=>{!A||V.length===0||Y(0)},[V,A]),t.useEffect(()=>{if(!A||V.length===0)return;const m=V[ae];m&&(v(m.line),R(m.column),Z(m.line))},[A,V,ae,Z]);const P=t.useCallback(()=>{V.length!==0&&Y(m=>(m+1)%V.length)},[V]),G=t.useCallback(()=>{V.length!==0&&Y(m=>(m-1+V.length)%V.length)},[V]),I=t.useCallback(m=>{const X=o.current;if(!X)return;const le=X.querySelector(".file-viewer-pre");if(!le)return;const H=parseFloat(getComputedStyle(le).lineHeight),$=isNaN(H)?u.current:H,S=parseFloat(getComputedStyle(le).paddingTop)||0,Q=le.offsetTop+S+(m-1)*$,de=Q+$,pe=X.scrollTop,se=pe+X.clientHeight;Q<pe?X.scrollTo({top:Math.max(0,Q),behavior:"auto"}):de>se&&X.scrollTo({top:de-X.clientHeight,behavior:"auto"})},[]),ie=t.useCallback((m,X)=>{v(m),R(X),I(m),g!=="none"&&T(le=>le?{...le,headLine:m,headCol:X}:null)},[g,I]),ee=t.useCallback(()=>{if(g==="none"||!w)return;const m=Aa(c,p,w,g);m&&navigator.clipboard.writeText(m).catch(()=>{const X=document.createElement("textarea");X.value=m,X.style.position="fixed",X.style.left="-9999px",document.body.appendChild(X),X.select(),document.execCommand("copy"),document.body.removeChild(X)}),j("none"),T(null)},[g,w,c,p]),ve=t.useCallback(m=>{const X=m.target;if((X.tagName==="INPUT"||X.tagName==="TEXTAREA")&&m.key!=="Escape")return;const H=o.current;if(!H)return;let $=!1;const S=u.current,te=Math.max(1,Math.floor(H.clientHeight/S)),Q=Math.max(1,Math.floor(te/2)),de=(se,we)=>{const Ge=Math.max(0,(p[se-1]||"").length-1);return Math.min(we,Math.max(0,Ge))},pe=(se,we)=>{const Ge=de(se,we);ie(se,Ge)};if(m.key==="v"&&!m.shiftKey&&!m.ctrlKey&&!A)m.preventDefault(),m.stopPropagation(),g==="char"?(j("none"),T(null)):(j("char"),T({anchorLine:f,anchorCol:N,headLine:f,headCol:N})),$=!0;else if(m.key==="V"&&m.shiftKey&&!m.ctrlKey&&!A)m.preventDefault(),m.stopPropagation(),g==="line"?(j("none"),T(null)):(j("line"),T({anchorLine:f,anchorCol:0,headLine:f,headCol:0})),$=!0;else if(m.key==="y"&&!m.ctrlKey&&g!=="none")m.preventDefault(),m.stopPropagation(),ee(),$=!0;else if(m.key==="j"||m.key==="ArrowDown"){m.preventDefault(),m.stopPropagation();const se=Math.min(f+1,b);pe(se,N),$=!0}else if(m.key==="k"||m.key==="ArrowUp"){m.preventDefault(),m.stopPropagation();const se=Math.max(f-1,1);pe(se,N),$=!0}else if(m.key==="d"&&m.ctrlKey||m.key==="d"&&g==="none"&&!A){m.preventDefault(),m.stopPropagation();const se=Math.min(f+Q,b);pe(se,N),$=!0}else if(m.key==="u"&&m.ctrlKey||m.key==="u"&&g==="none"&&!A){m.preventDefault(),m.stopPropagation();const se=Math.max(f-Q,1);pe(se,N),$=!0}else if((m.ctrlKey||m.metaKey)&&m.key==="f")m.preventDefault(),m.stopPropagation(),re(),$=!0;else if(m.key==="f"&&!m.ctrlKey&&!m.metaKey&&g==="none"&&!A){m.preventDefault(),m.stopPropagation();const se=Math.min(f+te,b);pe(se,N),$=!0}else if(m.key===" "||m.key==="PageDown"){m.preventDefault(),m.stopPropagation();const se=Math.min(f+te,b);pe(se,N),$=!0}else if(m.key==="b"&&!y&&g==="none"&&!A||m.key==="PageUp"){m.preventDefault(),m.stopPropagation();const se=Math.max(f-te,1);pe(se,N),$=!0}else if(m.key==="g"&&!m.shiftKey&&g==="none"&&!A)m.preventDefault(),m.stopPropagation(),ie(1,0),ts(H,!1),$=!0;else if(m.key==="Home")m.preventDefault(),m.stopPropagation(),ie(1,0),ts(H,!1),$=!0;else if(m.key==="G"&&m.shiftKey||m.key==="End")m.preventDefault(),m.stopPropagation(),ie(b,0),ts(H,!0),$=!0;else if(m.key==="h"||m.key==="ArrowLeft")m.preventDefault(),m.stopPropagation(),ie(f,Math.max(0,N-1)),$=!0;else if(m.key==="l"||m.key==="ArrowRight"){m.preventDefault(),m.stopPropagation();const se=(p[f-1]||"").length;ie(f,Math.min(N+1,Math.max(0,se-1))),$=!0}else if(m.key==="w"&&!m.ctrlKey&&!A){m.preventDefault(),m.stopPropagation();const se=$a(p,f,N);ie(se.line,se.col),$=!0}else if(m.key==="e"&&!m.ctrlKey&&!A){m.preventDefault(),m.stopPropagation();const se=za(p,f,N);ie(se.line,se.col),$=!0}else if(m.key==="b"&&!A){m.preventDefault(),m.stopPropagation();const se=Ha(p,f,N);ie(se.line,se.col),$=!0}else if(m.key==="0")m.preventDefault(),m.stopPropagation(),ie(f,0),$=!0;else if(m.key==="$")m.preventDefault(),m.stopPropagation(),ie(f,Math.max(0,(p[f-1]||"").length-1)),$=!0;else if(m.key==="^"){m.preventDefault(),m.stopPropagation();const we=(p[f-1]||"").search(/\S/);ie(f,we>=0?we:0),$=!0}else m.key==="/"?(m.preventDefault(),m.stopPropagation(),re(),$=!0):m.key==="n"&&!A?(m.preventDefault(),m.stopPropagation(),P(),$=!0):m.key==="N"&&m.shiftKey&&!A?(m.preventDefault(),m.stopPropagation(),G(),$=!0):m.key==="?"&&g==="none"?(m.preventDefault(),m.stopPropagation(),U(),$=!0):m.key==="q"&&g==="none"?(m.preventDefault(),m.stopPropagation(),i==null||i(),$=!0):m.key==="Escape"&&(g!=="none"?(m.preventDefault(),m.stopPropagation(),j("none"),T(null),$=!0):A?(m.preventDefault(),m.stopPropagation(),je(),$=!0):y&&(m.preventDefault(),m.stopPropagation(),k(!1),$=!0));$&&(m.key!=="Escape"&&!y&&k(!0),requestAnimationFrame(ne))},[i,ne,b,p,f,N,I,A,je,g,y,ie,ee,re,P,G,U]);return t.useEffect(()=>{if(!l)return;const m=Fa(n);if(o.current=m,!m){console.warn("[useLessNavigation] Could not find scrollable container");return}u.current=sn(m);const X=()=>{ne()};return window.addEventListener("keydown",ve,{capture:!0}),m.addEventListener("scroll",X,{passive:!0}),ne(),()=>{window.removeEventListener("keydown",ve,{capture:!0}),m.removeEventListener("scroll",X)}},[l,ve,ne]),{scrollPercentage:h.current.percentage,currentLine:h.current.line,currentColumn:h.current.column,totalLines:b,cursorLine:f,cursorCol:N,cursorModeActive:y,visualMode:g,selection:w,searchActive:A,searchQuery:C,searchMatches:V,currentMatchIndex:ae,startSearch:re,setSearchQuery:O,nextMatch:P,prevMatch:G,clearSearch:je,helpActive:D,toggleHelp:U}}const is=({query:s,onQueryChange:n,matchCount:l,currentIndex:c,onNext:i,onPrev:r,onClose:h})=>{const{t:o}=oe(["terminal"]),u=t.useRef(null);t.useEffect(()=>{var f;(f=u.current)==null||f.focus()},[]);const p=t.useCallback(f=>{f.stopPropagation(),f.key==="Enter"||f.key==="ArrowDown"?(f.preventDefault(),i()):f.key==="ArrowUp"&&(f.preventDefault(),r())},[i,r]),b=l===0&&s?o("terminal:fileExplorer.noMatches"):l>0?`${c+1}/${l}`:"";return e.jsxs("div",{className:"file-viewer-search-bar",children:[e.jsxs("div",{className:"file-viewer-search-input-wrapper",children:[e.jsx("span",{className:"file-viewer-search-prefix",children:"/"}),e.jsx("input",{ref:u,type:"text",className:"file-viewer-search-input",placeholder:o("terminal:fileExplorer.searchInFile"),value:s,onChange:f=>n(f.target.value),onKeyDown:p,autoComplete:"off",spellCheck:"false"})]}),s&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"file-viewer-search-counter",children:b}),e.jsxs("div",{className:"file-viewer-search-nav",children:[e.jsx("button",{className:"file-viewer-search-btn file-viewer-search-prev",onClick:r,disabled:l===0,title:o("terminal:fileExplorer.previousMatch"),"aria-label":o("terminal:fileExplorer.previousMatch"),children:e.jsx(M,{name:"caret-up",size:10})}),e.jsx("button",{className:"file-viewer-search-btn file-viewer-search-next",onClick:i,disabled:l===0,title:o("terminal:fileExplorer.nextMatch"),"aria-label":o("terminal:fileExplorer.nextMatch"),children:e.jsx(M,{name:"caret-down",size:10})})]})]}),e.jsx("button",{className:"file-viewer-search-close",onClick:h,title:o("terminal:fileExplorer.closeSearch"),"aria-label":o("terminal:fileExplorer.closeSearch"),children:e.jsx(M,{name:"close",size:12})})]})};is.displayName="SearchBar";const Oa=[{keys:["j","↓"],description:"Move cursor down one line",category:"Navigation"},{keys:["k","↑"],description:"Move cursor up one line",category:"Navigation"},{keys:["h","←"],description:"Move cursor left",category:"Navigation"},{keys:["l","→"],description:"Move cursor right",category:"Navigation"},{keys:["0"],description:"Jump to start of line",category:"Navigation"},{keys:["$"],description:"Jump to end of line",category:"Navigation"},{keys:["^"],description:"First non-whitespace char",category:"Navigation"},{keys:["d","Ctrl+D"],description:"Half page down",category:"Navigation"},{keys:["u","Ctrl+U"],description:"Half page up",category:"Navigation"},{keys:["f","Space"],description:"Full page down",category:"Navigation"},{keys:["b","Page Up"],description:"Full page up",category:"Navigation"},{keys:["g","Home"],description:"Jump to top of file",category:"Navigation"},{keys:["G","End"],description:"Jump to bottom of file",category:"Navigation"},{keys:["w"],description:"Next word start",category:"Word Motion"},{keys:["e"],description:"Next word end",category:"Word Motion"},{keys:["b"],description:"Previous word start",category:"Word Motion"},{keys:["v"],description:"Character visual mode",category:"Visual Mode"},{keys:["V"],description:"Line visual mode",category:"Visual Mode"},{keys:["y"],description:"Yank (copy) selection",category:"Visual Mode"},{keys:["Escape"],description:"Exit visual mode",category:"Visual Mode"},{keys:["/"],description:"Open search bar",category:"Search"},{keys:["n"],description:"Next match",category:"Search"},{keys:["N"],description:"Previous match",category:"Search"},{keys:["?"],description:"Toggle this help overlay",category:"Help"},{keys:["Escape"],description:"Exit cursor mode (or visual/search)",category:"Help"},{keys:["Alt+E"],description:"Close file viewer",category:"Help"},{keys:["q"],description:"Close file viewer",category:"Help"}],ls=({onClose:s})=>{const{t:n}=oe(["terminal"]),l=t.useCallback(r=>{r.target===r.currentTarget&&s()},[s]),c=t.useCallback(r=>{(r.key==="Escape"||r.key==="?")&&(r.preventDefault(),r.stopPropagation(),s())},[s]),i=Oa.reduce((r,h)=>(r[h.category]||(r[h.category]=[]),r[h.category].push(h),r),{});return e.jsx("div",{className:"keybindings-help-overlay",onClick:l,onKeyDown:c,tabIndex:0,role:"dialog","aria-label":n("terminal:fileExplorer.keybindingsHelp"),children:e.jsxs("div",{className:"keybindings-help-content",children:[e.jsx("button",{className:"keybindings-help-close",onClick:s,"aria-label":n("terminal:fileExplorer.closeHelp"),title:n("terminal:fileExplorer.pressEscapeToClose"),children:e.jsx(M,{name:"close",size:14})}),e.jsx("h2",{className:"keybindings-help-title",children:n("terminal:fileExplorer.keybindingsHelp")}),e.jsx("p",{className:"keybindings-help-subtitle",children:n("terminal:fileExplorer.keybindingsSubtitle")}),e.jsx("div",{className:"keybindings-help-categories",children:Object.entries(i).map(([r,h])=>e.jsxs("div",{className:"keybindings-help-category",children:[e.jsx("h3",{className:"keybindings-help-category-title",children:r}),e.jsx("div",{className:"keybindings-help-list",children:h.map((o,u)=>e.jsxs("div",{className:"keybindings-help-item",children:[e.jsx("div",{className:"keybindings-help-keys",children:o.keys.map((p,b)=>e.jsx("kbd",{className:"keybindings-help-key",children:p},b))}),e.jsx("div",{className:"keybindings-help-description",children:o.description})]},u))})]},r))}),e.jsx("p",{className:"keybindings-help-footer",children:n("terminal:fileExplorer.keybindingsFooter")})]})})};ls.displayName="KeybindingsHelp";const Ws=t.lazy(()=>Kn(()=>import("./EmbeddedEditor-Bt471BjS.js"),__vite__mapDeps([0,1,2,3,4,5])).then(s=>({default:s.EmbeddedEditor}))),Ga=[".md",".mdx",".markdown"],qs="file-viewer-markdown-render",Ua=[".puml",".plantuml",".iuml",".pu"],Js="file-viewer-plantuml-render",Ba="https://kroki.io/plantuml/svg";function _a(s){return Ga.includes(s.toLowerCase())}function Ka(s){return Ua.includes(s.toLowerCase())}function Va(){const[s,n]=t.useState(()=>{try{const c=localStorage.getItem(qs);return c===null?!0:c==="true"}catch{return!0}}),l=t.useCallback(()=>{n(c=>{const i=!c;try{localStorage.setItem(qs,String(i))}catch{}return i})},[]);return[s,l]}function Wa(){const[s,n]=t.useState(()=>{try{const c=localStorage.getItem(Js);return c===null?!0:c==="true"}catch{return!0}}),l=t.useCallback(()=>{n(c=>{const i=!c;try{localStorage.setItem(Js,String(i))}catch{}return i})},[]);return[s,l]}function qa(s){const n=new TextEncoder().encode(s);let l="";for(const c of n)l+=String.fromCharCode(c);return`data:image/svg+xml;base64,${window.btoa(l)}`}function Ve({file:s,rightContent:n,onRevealInTree:l,editMode:c,onToggleEdit:i}){const{t:r}=oe(["terminal","common"]),[h,o]=t.useState("idle"),[u,p]=t.useState("idle"),[b,f]=t.useState("idle"),v=s.fileType==="text"?At(s.extension):s.extension.slice(1).toUpperCase(),N=s.fileType==="text"&&s.content!=null,R=_n(),y=async()=>{try{await Lt(s.content),f("copied"),setTimeout(()=>f("idle"),2e3)}catch{f("error"),setTimeout(()=>f("idle"),2e3)}},k=async()=>{const T=B(`/api/files/binary?path=${encodeURIComponent(s.path)}&download=true`);await Ot(T,s.filename,"text/plain;charset=utf-8")},g=async()=>{o("loading");try{const T=await W(B("/api/files/open-in-editor"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:s.path,...R.externalEditorCommand&&{editorCommand:R.externalEditorCommand}})});if(!T.ok){const A=await T.json().catch(()=>({error:"Unknown error"}));console.error("Failed to open in editor:",A),o("error"),setTimeout(()=>o("idle"),2e3);return}o("success"),setTimeout(()=>o("idle"),2e3)}catch(T){console.error("Error opening file in editor:",T),o("error"),setTimeout(()=>o("idle"),2e3)}},j=async()=>{if(s.path)try{await Xn(s.path),p("success"),setTimeout(()=>p("idle"),2e3)}catch(T){console.error("Error opening file explorer:",T),p("error"),setTimeout(()=>p("idle"),2e3)}},w=r("terminal:fileExplorer.openInFileExplorer");return e.jsxs("div",{className:"file-viewer-header",children:[e.jsxs("div",{className:"file-viewer-header-left",children:[e.jsx("span",{className:"file-viewer-filename",children:s.filename}),e.jsxs("span",{className:"file-viewer-meta",children:[Qs(s.size)," • ",v,s.content&&` • ${s.content.split(`
|
|
7
|
+
`),[c]),b=p.length,[f,v]=t.useState(1),[N,R]=t.useState(0),[y,k]=t.useState(!1),[g,j]=t.useState("none"),[w,T]=t.useState(null),[A,K]=t.useState(!1),[C,O]=t.useState(""),[ae,Y]=t.useState(0),[D,F]=t.useState(!1),V=t.useMemo(()=>La(c,C,!1),[c,C]),ne=t.useCallback(()=>{const m=o.current;if(!m)return;const X=Pa(m),le=Ia(m,c),$=Math.max(1,Math.round(m.scrollLeft/7.8)+1);h.current={percentage:X,line:le,column:$}},[c]),re=t.useCallback(()=>{K(!0),O(""),Y(0),r==null||r()},[r]),je=t.useCallback(()=>{K(!1),O(""),Y(0)},[]),U=t.useCallback(()=>{F(m=>!m)},[]),Z=t.useCallback(m=>{const X=o.current;if(!X)return;const le=X.querySelector(".file-viewer-pre"),H=le&&parseFloat(getComputedStyle(le).lineHeight)||u.current,$=le&&parseFloat(getComputedStyle(le).paddingTop)||0,te=(le?le.offsetTop:0)+$+(m-1)*H,Q=H*3;X.scrollTo({top:Math.max(0,te-Q),behavior:"smooth"})},[]);t.useEffect(()=>{!A||V.length===0||Y(0)},[V,A]),t.useEffect(()=>{if(!A||V.length===0)return;const m=V[ae];m&&(v(m.line),R(m.column),Z(m.line))},[A,V,ae,Z]);const P=t.useCallback(()=>{V.length!==0&&Y(m=>(m+1)%V.length)},[V]),G=t.useCallback(()=>{V.length!==0&&Y(m=>(m-1+V.length)%V.length)},[V]),I=t.useCallback(m=>{const X=o.current;if(!X)return;const le=X.querySelector(".file-viewer-pre");if(!le)return;const H=parseFloat(getComputedStyle(le).lineHeight),$=isNaN(H)?u.current:H,S=parseFloat(getComputedStyle(le).paddingTop)||0,Q=le.offsetTop+S+(m-1)*$,de=Q+$,pe=X.scrollTop,se=pe+X.clientHeight;Q<pe?X.scrollTo({top:Math.max(0,Q),behavior:"auto"}):de>se&&X.scrollTo({top:de-X.clientHeight,behavior:"auto"})},[]),ie=t.useCallback((m,X)=>{v(m),R(X),I(m),g!=="none"&&T(le=>le?{...le,headLine:m,headCol:X}:null)},[g,I]),ee=t.useCallback(()=>{if(g==="none"||!w)return;const m=Aa(c,p,w,g);m&&navigator.clipboard.writeText(m).catch(()=>{const X=document.createElement("textarea");X.value=m,X.style.position="fixed",X.style.left="-9999px",document.body.appendChild(X),X.select(),document.execCommand("copy"),document.body.removeChild(X)}),j("none"),T(null)},[g,w,c,p]),ve=t.useCallback(m=>{const X=m.target;if((X.tagName==="INPUT"||X.tagName==="TEXTAREA")&&m.key!=="Escape")return;const H=o.current;if(!H)return;let $=!1;const S=u.current,te=Math.max(1,Math.floor(H.clientHeight/S)),Q=Math.max(1,Math.floor(te/2)),de=(se,we)=>{const Ge=Math.max(0,(p[se-1]||"").length-1);return Math.min(we,Math.max(0,Ge))},pe=(se,we)=>{const Ge=de(se,we);ie(se,Ge)};if(m.key==="v"&&!m.shiftKey&&!m.ctrlKey&&!A)m.preventDefault(),m.stopPropagation(),g==="char"?(j("none"),T(null)):(j("char"),T({anchorLine:f,anchorCol:N,headLine:f,headCol:N})),$=!0;else if(m.key==="V"&&m.shiftKey&&!m.ctrlKey&&!A)m.preventDefault(),m.stopPropagation(),g==="line"?(j("none"),T(null)):(j("line"),T({anchorLine:f,anchorCol:0,headLine:f,headCol:0})),$=!0;else if(m.key==="y"&&!m.ctrlKey&&g!=="none")m.preventDefault(),m.stopPropagation(),ee(),$=!0;else if(m.key==="j"||m.key==="ArrowDown"){m.preventDefault(),m.stopPropagation();const se=Math.min(f+1,b);pe(se,N),$=!0}else if(m.key==="k"||m.key==="ArrowUp"){m.preventDefault(),m.stopPropagation();const se=Math.max(f-1,1);pe(se,N),$=!0}else if(m.key==="d"&&m.ctrlKey||m.key==="d"&&g==="none"&&!A){m.preventDefault(),m.stopPropagation();const se=Math.min(f+Q,b);pe(se,N),$=!0}else if(m.key==="u"&&m.ctrlKey||m.key==="u"&&g==="none"&&!A){m.preventDefault(),m.stopPropagation();const se=Math.max(f-Q,1);pe(se,N),$=!0}else if((m.ctrlKey||m.metaKey)&&m.key==="f")m.preventDefault(),m.stopPropagation(),re(),$=!0;else if(m.key==="f"&&!m.ctrlKey&&!m.metaKey&&g==="none"&&!A){m.preventDefault(),m.stopPropagation();const se=Math.min(f+te,b);pe(se,N),$=!0}else if(m.key===" "||m.key==="PageDown"){m.preventDefault(),m.stopPropagation();const se=Math.min(f+te,b);pe(se,N),$=!0}else if(m.key==="b"&&!y&&g==="none"&&!A||m.key==="PageUp"){m.preventDefault(),m.stopPropagation();const se=Math.max(f-te,1);pe(se,N),$=!0}else if(m.key==="g"&&!m.shiftKey&&g==="none"&&!A)m.preventDefault(),m.stopPropagation(),ie(1,0),ts(H,!1),$=!0;else if(m.key==="Home")m.preventDefault(),m.stopPropagation(),ie(1,0),ts(H,!1),$=!0;else if(m.key==="G"&&m.shiftKey||m.key==="End")m.preventDefault(),m.stopPropagation(),ie(b,0),ts(H,!0),$=!0;else if(m.key==="h"||m.key==="ArrowLeft")m.preventDefault(),m.stopPropagation(),ie(f,Math.max(0,N-1)),$=!0;else if(m.key==="l"||m.key==="ArrowRight"){m.preventDefault(),m.stopPropagation();const se=(p[f-1]||"").length;ie(f,Math.min(N+1,Math.max(0,se-1))),$=!0}else if(m.key==="w"&&!m.ctrlKey&&!A){m.preventDefault(),m.stopPropagation();const se=$a(p,f,N);ie(se.line,se.col),$=!0}else if(m.key==="e"&&!m.ctrlKey&&!A){m.preventDefault(),m.stopPropagation();const se=za(p,f,N);ie(se.line,se.col),$=!0}else if(m.key==="b"&&!A){m.preventDefault(),m.stopPropagation();const se=Ha(p,f,N);ie(se.line,se.col),$=!0}else if(m.key==="0")m.preventDefault(),m.stopPropagation(),ie(f,0),$=!0;else if(m.key==="$")m.preventDefault(),m.stopPropagation(),ie(f,Math.max(0,(p[f-1]||"").length-1)),$=!0;else if(m.key==="^"){m.preventDefault(),m.stopPropagation();const we=(p[f-1]||"").search(/\S/);ie(f,we>=0?we:0),$=!0}else m.key==="/"?(m.preventDefault(),m.stopPropagation(),re(),$=!0):m.key==="n"&&!A?(m.preventDefault(),m.stopPropagation(),P(),$=!0):m.key==="N"&&m.shiftKey&&!A?(m.preventDefault(),m.stopPropagation(),G(),$=!0):m.key==="?"&&g==="none"?(m.preventDefault(),m.stopPropagation(),U(),$=!0):m.key==="q"&&g==="none"?(m.preventDefault(),m.stopPropagation(),i==null||i(),$=!0):m.key==="Escape"&&(g!=="none"?(m.preventDefault(),m.stopPropagation(),j("none"),T(null),$=!0):A?(m.preventDefault(),m.stopPropagation(),je(),$=!0):y&&(m.preventDefault(),m.stopPropagation(),k(!1),$=!0));$&&(m.key!=="Escape"&&!y&&k(!0),requestAnimationFrame(ne))},[i,ne,b,p,f,N,I,A,je,g,y,ie,ee,re,P,G,U]);return t.useEffect(()=>{if(!l)return;const m=Fa(n);if(o.current=m,!m){console.warn("[useLessNavigation] Could not find scrollable container");return}u.current=sn(m);const X=()=>{ne()};return window.addEventListener("keydown",ve,{capture:!0}),m.addEventListener("scroll",X,{passive:!0}),ne(),()=>{window.removeEventListener("keydown",ve,{capture:!0}),m.removeEventListener("scroll",X)}},[l,ve,ne]),{scrollPercentage:h.current.percentage,currentLine:h.current.line,currentColumn:h.current.column,totalLines:b,cursorLine:f,cursorCol:N,cursorModeActive:y,visualMode:g,selection:w,searchActive:A,searchQuery:C,searchMatches:V,currentMatchIndex:ae,startSearch:re,setSearchQuery:O,nextMatch:P,prevMatch:G,clearSearch:je,helpActive:D,toggleHelp:U}}const is=({query:s,onQueryChange:n,matchCount:l,currentIndex:c,onNext:i,onPrev:r,onClose:h})=>{const{t:o}=oe(["terminal"]),u=t.useRef(null);t.useEffect(()=>{var f;(f=u.current)==null||f.focus()},[]);const p=t.useCallback(f=>{f.stopPropagation(),f.key==="Enter"||f.key==="ArrowDown"?(f.preventDefault(),i()):f.key==="ArrowUp"&&(f.preventDefault(),r())},[i,r]),b=l===0&&s?o("terminal:fileExplorer.noMatches"):l>0?`${c+1}/${l}`:"";return e.jsxs("div",{className:"file-viewer-search-bar",children:[e.jsxs("div",{className:"file-viewer-search-input-wrapper",children:[e.jsx("span",{className:"file-viewer-search-prefix",children:"/"}),e.jsx("input",{ref:u,type:"text",className:"file-viewer-search-input",placeholder:o("terminal:fileExplorer.searchInFile"),value:s,onChange:f=>n(f.target.value),onKeyDown:p,autoComplete:"off",spellCheck:"false"})]}),s&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"file-viewer-search-counter",children:b}),e.jsxs("div",{className:"file-viewer-search-nav",children:[e.jsx("button",{className:"file-viewer-search-btn file-viewer-search-prev",onClick:r,disabled:l===0,title:o("terminal:fileExplorer.previousMatch"),"aria-label":o("terminal:fileExplorer.previousMatch"),children:e.jsx(M,{name:"caret-up",size:10})}),e.jsx("button",{className:"file-viewer-search-btn file-viewer-search-next",onClick:i,disabled:l===0,title:o("terminal:fileExplorer.nextMatch"),"aria-label":o("terminal:fileExplorer.nextMatch"),children:e.jsx(M,{name:"caret-down",size:10})})]})]}),e.jsx("button",{className:"file-viewer-search-close",onClick:h,title:o("terminal:fileExplorer.closeSearch"),"aria-label":o("terminal:fileExplorer.closeSearch"),children:e.jsx(M,{name:"close",size:12})})]})};is.displayName="SearchBar";const Oa=[{keys:["j","↓"],description:"Move cursor down one line",category:"Navigation"},{keys:["k","↑"],description:"Move cursor up one line",category:"Navigation"},{keys:["h","←"],description:"Move cursor left",category:"Navigation"},{keys:["l","→"],description:"Move cursor right",category:"Navigation"},{keys:["0"],description:"Jump to start of line",category:"Navigation"},{keys:["$"],description:"Jump to end of line",category:"Navigation"},{keys:["^"],description:"First non-whitespace char",category:"Navigation"},{keys:["d","Ctrl+D"],description:"Half page down",category:"Navigation"},{keys:["u","Ctrl+U"],description:"Half page up",category:"Navigation"},{keys:["f","Space"],description:"Full page down",category:"Navigation"},{keys:["b","Page Up"],description:"Full page up",category:"Navigation"},{keys:["g","Home"],description:"Jump to top of file",category:"Navigation"},{keys:["G","End"],description:"Jump to bottom of file",category:"Navigation"},{keys:["w"],description:"Next word start",category:"Word Motion"},{keys:["e"],description:"Next word end",category:"Word Motion"},{keys:["b"],description:"Previous word start",category:"Word Motion"},{keys:["v"],description:"Character visual mode",category:"Visual Mode"},{keys:["V"],description:"Line visual mode",category:"Visual Mode"},{keys:["y"],description:"Yank (copy) selection",category:"Visual Mode"},{keys:["Escape"],description:"Exit visual mode",category:"Visual Mode"},{keys:["/"],description:"Open search bar",category:"Search"},{keys:["n"],description:"Next match",category:"Search"},{keys:["N"],description:"Previous match",category:"Search"},{keys:["?"],description:"Toggle this help overlay",category:"Help"},{keys:["Escape"],description:"Exit cursor mode (or visual/search)",category:"Help"},{keys:["Alt+E"],description:"Close file viewer",category:"Help"},{keys:["q"],description:"Close file viewer",category:"Help"}],ls=({onClose:s})=>{const{t:n}=oe(["terminal"]),l=t.useCallback(r=>{r.target===r.currentTarget&&s()},[s]),c=t.useCallback(r=>{(r.key==="Escape"||r.key==="?")&&(r.preventDefault(),r.stopPropagation(),s())},[s]),i=Oa.reduce((r,h)=>(r[h.category]||(r[h.category]=[]),r[h.category].push(h),r),{});return e.jsx("div",{className:"keybindings-help-overlay",onClick:l,onKeyDown:c,tabIndex:0,role:"dialog","aria-label":n("terminal:fileExplorer.keybindingsHelp"),children:e.jsxs("div",{className:"keybindings-help-content",children:[e.jsx("button",{className:"keybindings-help-close",onClick:s,"aria-label":n("terminal:fileExplorer.closeHelp"),title:n("terminal:fileExplorer.pressEscapeToClose"),children:e.jsx(M,{name:"close",size:14})}),e.jsx("h2",{className:"keybindings-help-title",children:n("terminal:fileExplorer.keybindingsHelp")}),e.jsx("p",{className:"keybindings-help-subtitle",children:n("terminal:fileExplorer.keybindingsSubtitle")}),e.jsx("div",{className:"keybindings-help-categories",children:Object.entries(i).map(([r,h])=>e.jsxs("div",{className:"keybindings-help-category",children:[e.jsx("h3",{className:"keybindings-help-category-title",children:r}),e.jsx("div",{className:"keybindings-help-list",children:h.map((o,u)=>e.jsxs("div",{className:"keybindings-help-item",children:[e.jsx("div",{className:"keybindings-help-keys",children:o.keys.map((p,b)=>e.jsx("kbd",{className:"keybindings-help-key",children:p},b))}),e.jsx("div",{className:"keybindings-help-description",children:o.description})]},u))})]},r))}),e.jsx("p",{className:"keybindings-help-footer",children:n("terminal:fileExplorer.keybindingsFooter")})]})})};ls.displayName="KeybindingsHelp";const Ws=t.lazy(()=>Kn(()=>import("./EmbeddedEditor-Df75irwV.js"),__vite__mapDeps([0,1,2,3,4,5])).then(s=>({default:s.EmbeddedEditor}))),Ga=[".md",".mdx",".markdown"],qs="file-viewer-markdown-render",Ua=[".puml",".plantuml",".iuml",".pu"],Js="file-viewer-plantuml-render",Ba="https://kroki.io/plantuml/svg";function _a(s){return Ga.includes(s.toLowerCase())}function Ka(s){return Ua.includes(s.toLowerCase())}function Va(){const[s,n]=t.useState(()=>{try{const c=localStorage.getItem(qs);return c===null?!0:c==="true"}catch{return!0}}),l=t.useCallback(()=>{n(c=>{const i=!c;try{localStorage.setItem(qs,String(i))}catch{}return i})},[]);return[s,l]}function Wa(){const[s,n]=t.useState(()=>{try{const c=localStorage.getItem(Js);return c===null?!0:c==="true"}catch{return!0}}),l=t.useCallback(()=>{n(c=>{const i=!c;try{localStorage.setItem(Js,String(i))}catch{}return i})},[]);return[s,l]}function qa(s){const n=new TextEncoder().encode(s);let l="";for(const c of n)l+=String.fromCharCode(c);return`data:image/svg+xml;base64,${window.btoa(l)}`}function Ve({file:s,rightContent:n,onRevealInTree:l,editMode:c,onToggleEdit:i}){const{t:r}=oe(["terminal","common"]),[h,o]=t.useState("idle"),[u,p]=t.useState("idle"),[b,f]=t.useState("idle"),v=s.fileType==="text"?At(s.extension):s.extension.slice(1).toUpperCase(),N=s.fileType==="text"&&s.content!=null,R=_n(),y=async()=>{try{await Lt(s.content),f("copied"),setTimeout(()=>f("idle"),2e3)}catch{f("error"),setTimeout(()=>f("idle"),2e3)}},k=async()=>{const T=B(`/api/files/binary?path=${encodeURIComponent(s.path)}&download=true`);await Ot(T,s.filename,"text/plain;charset=utf-8")},g=async()=>{o("loading");try{const T=await W(B("/api/files/open-in-editor"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:s.path,...R.externalEditorCommand&&{editorCommand:R.externalEditorCommand}})});if(!T.ok){const A=await T.json().catch(()=>({error:"Unknown error"}));console.error("Failed to open in editor:",A),o("error"),setTimeout(()=>o("idle"),2e3);return}o("success"),setTimeout(()=>o("idle"),2e3)}catch(T){console.error("Error opening file in editor:",T),o("error"),setTimeout(()=>o("idle"),2e3)}},j=async()=>{if(s.path)try{await Xn(s.path),p("success"),setTimeout(()=>p("idle"),2e3)}catch(T){console.error("Error opening file explorer:",T),p("error"),setTimeout(()=>p("idle"),2e3)}},w=r("terminal:fileExplorer.openInFileExplorer");return e.jsxs("div",{className:"file-viewer-header",children:[e.jsxs("div",{className:"file-viewer-header-left",children:[e.jsx("span",{className:"file-viewer-filename",children:s.filename}),e.jsxs("span",{className:"file-viewer-meta",children:[Qs(s.size)," • ",v,s.content&&` • ${s.content.split(`
|
|
8
8
|
`).length} lines`]})]}),e.jsxs("div",{className:"file-viewer-header-right",children:[i&&s.fileType==="text"&&e.jsx("button",{className:`file-viewer-edit-btn${c?" active":""}`,onClick:i,title:r(c?"terminal:fileExplorer.exitEdit":"terminal:fileExplorer.editFile"),children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M11.013 1.427a1.75 1.75 0 012.474 0l1.086 1.086a1.75 1.75 0 010 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 01-.927-.928l.929-3.25a1.75 1.75 0 01.445-.758l8.61-8.61zm1.414 1.06a.25.25 0 00-.354 0L3.463 11.1a.25.25 0 00-.064.108l-.558 1.953 1.953-.558a.25.25 0 00.108-.064l8.61-8.61a.25.25 0 000-.354l-1.086-1.086z"})})}),N&&e.jsxs(e.Fragment,{children:[e.jsx("button",{className:`file-viewer-copy-html-btn ${b}`,onClick:y,title:r("terminal:fileExplorer.copyAllTitle"),children:r(b==="copied"?"terminal:fileExplorer.copied":b==="error"?"terminal:fileExplorer.copyError":"terminal:fileExplorer.copyAll")}),e.jsx("button",{className:"file-viewer-download-btn",onClick:k,title:r("terminal:fileExplorer.downloadFileTitle"),children:r("common:buttons.download")})]}),e.jsx("button",{className:`file-viewer-reveal-explorer-btn ${u}`,onClick:j,disabled:!s.path,title:w,"aria-label":w,children:u==="success"?e.jsx(M,{name:"check",size:14}):u==="error"?e.jsx(M,{name:"cross",size:14}):e.jsx(M,{name:"folder-open",size:14})}),e.jsx("button",{className:`file-viewer-open-editor-btn ${h}`,onClick:g,disabled:h==="loading",title:r(h==="error"?"terminal:fileExplorer.failedToOpenEditor":h==="success"?"terminal:fileExplorer.openingInEditor":"terminal:fileExplorer.openInEditor"),children:h==="success"?e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M13.78 4.22a.75.75 0 010 1.06l-7.25 7.25a.75.75 0 11-1.06-1.06l7.25-7.25a.75.75 0 011.06 0z"})}):h==="error"?e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M3.72 3.72a.75.75 0 011.06 0L8 6.94l3.22-3.22a.75.75 0 111.06 1.06L9.06 8l3.22 3.22a.75.75 0 11-1.06 1.06L8 9.06l-3.22 3.22a.75.75 0 01-1.06-1.06L6.94 8 3.72 4.78a.75.75 0 010-1.06z"})}):e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M1.5 1h6v1.5h-5v11h11v-5H15v6.5H0V1h1.5zm8 0H15v5.5h-1.5V3.56L7.28 9.78l-1.06-1.06L12.44 2.5H9.5V1z"})})}),l&&e.jsx("button",{className:"file-viewer-locate-btn",onClick:()=>l(s.path),title:r("terminal:fileExplorer.locateInTree"),children:e.jsx(M,{name:"target",size:14})}),n]})]})}function Ja({file:s,onRevealInTree:n,renderMarkdown:l,onToggleRender:c,editMode:i,onToggleEdit:r}){const h=t.useRef(null),o=t.useRef(null),u=t.useRef(null),{t:p}=oe(["terminal","common"]),[b,f]=t.useState("idle"),[v,N]=t.useState("idle"),[R,y]=t.useState("idle"),[k,g]=t.useState("idle"),j=nn({containerRef:u,isEnabled:!0,content:s.content});t.useEffect(()=>{if(!l&&h.current){const O=At(s.extension);Zs(O).then(()=>{h.current&&en(h.current)})}},[s,l]);const w=t.useCallback(async()=>{if(!o.current){f("error"),setTimeout(()=>f("idle"),2e3);return}try{const O=o.current.innerHTML,ae=Vn(O),Y=o.current.innerText;await Wn(ae,Y),f("copied"),setTimeout(()=>f("idle"),2e3)}catch{f("error"),setTimeout(()=>f("idle"),2e3)}},[]),T=t.useCallback(async()=>{if(!o.current){N("error"),setTimeout(()=>N("idle"),2e3);return}try{const O=o.current.innerHTML;await Lt(O),N("copied"),setTimeout(()=>N("idle"),2e3)}catch{N("error"),setTimeout(()=>N("idle"),2e3)}},[]),A=t.useCallback(async()=>{try{await Lt(s.content),y("copied"),setTimeout(()=>y("idle"),2e3)}catch{y("error"),setTimeout(()=>y("idle"),2e3)}},[s.content]),K=t.useCallback(async()=>{try{await Lt(s.content),g("copied"),setTimeout(()=>g("idle"),2e3)}catch{g("error"),setTimeout(()=>g("idle"),2e3)}},[s.content]),C=e.jsxs("div",{className:"file-viewer-header-buttons",children:[l&&e.jsxs(e.Fragment,{children:[e.jsx("button",{className:`file-viewer-copy-html-btn ${b}`,onClick:w,title:p("terminal:fileExplorer.copyRichTextTitle"),children:p(b==="copied"?"terminal:fileExplorer.copied":b==="error"?"terminal:fileExplorer.copyError":"terminal:fileExplorer.copyRichText")}),e.jsx("button",{className:`file-viewer-copy-html-btn ${v}`,onClick:T,title:p("terminal:fileExplorer.copyHtmlTitle"),children:p(v==="copied"?"terminal:fileExplorer.copied":v==="error"?"terminal:fileExplorer.copyError":"terminal:fileExplorer.copyHtml")}),e.jsx("button",{className:`file-viewer-copy-html-btn ${R}`,onClick:A,title:p("terminal:fileExplorer.copyMarkdownTitle"),children:p(R==="copied"?"terminal:fileExplorer.copied":R==="error"?"terminal:fileExplorer.copyError":"terminal:fileExplorer.copyMarkdown")}),e.jsx("button",{className:`file-viewer-copy-html-btn ${k}`,onClick:K,title:p("terminal:fileExplorer.copyOriginalTitle"),children:p(k==="copied"?"terminal:fileExplorer.copied":k==="error"?"terminal:fileExplorer.copyError":"terminal:fileExplorer.copyOriginal")})]}),e.jsx("button",{className:`file-viewer-render-toggle ${l?"active":""}`,onClick:c,title:p(l?"terminal:fileExplorer.showSource":"terminal:fileExplorer.renderMarkdown"),children:l?"</>":"Aa"})]});return e.jsxs(e.Fragment,{children:[e.jsx(Ve,{file:s,onRevealInTree:n,rightContent:C,editMode:i,onToggleEdit:r}),e.jsxs("div",{className:"file-viewer-content-wrapper",ref:u,children:[l?e.jsx("div",{className:"file-viewer-markdown-wrapper",children:e.jsx("div",{className:"markdown-content",ref:o,children:e.jsx(qn,{remarkPlugins:[Jn],children:s.content})})}):e.jsx("div",{className:"file-viewer-code-wrapper",children:e.jsx("pre",{className:"file-viewer-pre",children:e.jsx("code",{ref:h,className:"language-markdown",children:s.content})})}),e.jsx("div",{className:"file-viewer-scroll-indicator",title:`Line ${j.currentLine}/${j.totalLines}`,children:j.scrollPercentage===100?"END":j.scrollPercentage===0?"TOP":`${j.scrollPercentage}%`}),j.searchActive&&e.jsx(is,{query:j.searchQuery,onQueryChange:j.setSearchQuery,matchCount:j.searchMatches.length,currentIndex:j.currentMatchIndex,onNext:j.nextMatch,onPrev:j.prevMatch,onClose:j.clearSearch})]}),j.helpActive&&e.jsx(ls,{onClose:j.toggleHelp})]})}function Ya({file:s,onRevealInTree:n,renderPlantUml:l,onToggleRender:c,editMode:i,onToggleEdit:r}){const{t:h}=oe(["terminal"]),o=t.useRef(null),u=t.useRef(null),[p,b]=t.useState(null),[f,v]=t.useState(!1),[N,R]=t.useState(null),y=nn({containerRef:u,isEnabled:!0,content:s.content});t.useEffect(()=>{if(!l&&o.current){const g=At(s.extension);Zs(g).then(()=>{o.current&&en(o.current)})}},[s,l]),t.useEffect(()=>{if(!l)return;if(!s.content.trim()){b(null),R("Diagram is empty");return}const g=new AbortController;return v(!0),R(null),(async()=>{try{const w=await fetch(Ba,{method:"POST",headers:{"Content-Type":"text/plain; charset=utf-8",Accept:"image/svg+xml"},body:s.content,signal:g.signal});if(!w.ok)throw new Error(`Render failed (${w.status})`);const T=await w.text();if(!T.includes("<svg"))throw new Error("Invalid SVG output");b(qa(T))}catch(w){if(g.signal.aborted)return;const T=w instanceof Error?w.message:"Failed to render diagram";R(T),b(null)}finally{g.signal.aborted||v(!1)}})(),()=>g.abort()},[s.path,s.content,l]);const k=e.jsx("div",{className:"file-viewer-header-buttons",children:e.jsx("button",{className:`file-viewer-render-toggle ${l?"active":""}`,onClick:c,title:h(l?"terminal:fileExplorer.showSource":"terminal:fileExplorer.renderDiagram"),children:l?"</>":h("terminal:fileExplorer.diagram")})});return e.jsxs(e.Fragment,{children:[e.jsx(Ve,{file:s,onRevealInTree:n,rightContent:k,editMode:i,onToggleEdit:r}),e.jsxs("div",{className:"file-viewer-content-wrapper",ref:u,children:[l?e.jsxs("div",{className:"file-viewer-diagram-wrapper",children:[f&&e.jsx("div",{className:"file-viewer-placeholder",children:h("terminal:fileExplorer.renderingDiagram")}),!f&&p&&e.jsx("img",{src:p,alt:s.filename,className:"file-viewer-diagram-image"}),!f&&N&&e.jsxs("div",{className:"file-viewer-diagram-error",children:[e.jsxs("div",{children:[h("terminal:fileExplorer.couldNotRender"),": ",N]}),e.jsx("button",{className:"file-viewer-render-toggle",onClick:c,children:h("terminal:fileExplorer.showSource")})]})]}):e.jsx("div",{className:"file-viewer-code-wrapper",children:e.jsx("pre",{className:"file-viewer-pre",children:e.jsx("code",{ref:o,className:"language-plaintext",children:s.content})})}),e.jsx("div",{className:"file-viewer-scroll-indicator",title:`Line ${y.currentLine}/${y.totalLines}`,children:y.scrollPercentage===100?"END":y.scrollPercentage===0?"TOP":`${y.scrollPercentage}%`}),y.searchActive&&e.jsx(is,{query:y.searchQuery,onQueryChange:y.setSearchQuery,matchCount:y.searchMatches.length,currentIndex:y.currentMatchIndex,onNext:y.nextMatch,onPrev:y.prevMatch,onClose:y.clearSearch})]}),y.helpActive&&e.jsx(ls,{onClose:y.toggleHelp})]})}function Xa({file:s,onRevealInTree:n}){const{t:l}=oe(["common","terminal"]),c=async()=>{const i=B(`/api/files/binary?path=${encodeURIComponent(s.path)}&download=true`);await Ot(i,s.filename)};return e.jsxs(e.Fragment,{children:[e.jsx(Ve,{file:s,onRevealInTree:n,rightContent:e.jsx("button",{className:"file-viewer-download-btn",onClick:c,title:l("common:buttons.download"),children:l("common:buttons.download")})}),e.jsx("div",{className:"file-viewer-image-wrapper zoomable",children:s.dataUrl?e.jsx(Yn,{src:s.dataUrl,alt:s.filename}):e.jsx("div",{className:"file-viewer-placeholder",children:l("terminal:fileExplorer.failedToLoadImage")})})]})}function Qa({file:s,onRevealInTree:n}){const{t:l}=oe(["common","terminal"]),c=async()=>{const i=B(`/api/files/binary?path=${encodeURIComponent(s.path)}&download=true`);await Ot(i,s.filename,"application/pdf")};return e.jsxs(e.Fragment,{children:[e.jsx(Ve,{file:s,onRevealInTree:n,rightContent:e.jsx("button",{className:"file-viewer-download-btn",onClick:c,title:l("common:buttons.download"),children:l("common:buttons.download")})}),e.jsx("div",{className:"file-viewer-pdf-wrapper",children:s.dataUrl?e.jsx("iframe",{src:s.dataUrl,title:s.filename,className:"file-viewer-pdf"}):e.jsx("div",{className:"file-viewer-placeholder",children:l("terminal:fileExplorer.failedToLoadPdf")})})]})}function Za({file:s,onRevealInTree:n}){const{t:l}=oe(["terminal","common"]),c=async()=>{const r=B(`/api/files/binary?path=${encodeURIComponent(s.path)}&download=true`);await Ot(r,s.filename)},i=()=>{const r=s.extension.toLowerCase();return[".xlsx",".xls"].includes(r)?e.jsx(M,{name:"dashboard",size:48}):[".docx",".doc"].includes(r)?e.jsx(M,{name:"edit",size:48}):[".pptx",".ppt"].includes(r)?e.jsx(M,{name:"film",size:48}):[".zip",".tar",".gz",".rar",".7z"].includes(r)?e.jsx(M,{name:"file-zip",size:48}):[".mp3",".wav",".flac",".ogg"].includes(r)?e.jsx(M,{name:"music-note",size:48}):[".mp4",".avi",".mov",".mkv",".webm"].includes(r)?e.jsx(M,{name:"film",size:48}):[".exe",".dmg",".app",".msi"].includes(r)?e.jsx(M,{name:"gear",size:48}):[".apk",".aab",".ipa"].includes(r)?e.jsx(M,{name:"mobile",size:48}):[".jar",".war",".ear"].includes(r)?e.jsx(M,{name:"coffee",size:48}):[".iso",".img"].includes(r)?e.jsx(M,{name:"disc",size:48}):[".so",".dll",".dylib"].includes(r)?e.jsx(M,{name:"wrench",size:48}):e.jsx(M,{name:"folder",size:48})};return e.jsxs(e.Fragment,{children:[e.jsx(Ve,{file:s,onRevealInTree:n}),e.jsxs("div",{className:"file-viewer-binary",children:[e.jsx("div",{className:"file-viewer-binary-icon",children:i()}),e.jsx("div",{className:"file-viewer-binary-name",children:s.filename}),e.jsx("div",{className:"file-viewer-binary-size",children:Qs(s.size)}),e.jsx("div",{className:"file-viewer-binary-message",children:l("terminal:fileExplorer.cannotPreview")}),e.jsx("button",{className:"file-viewer-download-btn large",onClick:c,children:l("terminal:fileExplorer.downloadFile")})]})]})}function er({file:s,loading:n,error:l,onRevealInTree:c,onFileEdited:i}){const{t:r}=oe(["terminal","common"]),[h,o]=Va(),[u,p]=Wa(),[b,f]=t.useState(!1);t.useEffect(()=>{f(!1)},[s==null?void 0:s.path]);const v=t.useCallback(async w=>{if(!s)return;const T=await W(B("/api/files/write"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:s.path,content:w})});if(!T.ok){const A=await T.json().catch(()=>({error:"Save failed"}));throw new Error(A.error||"Save failed")}},[s]),N=t.useCallback(()=>{f(w=>(w&&s&&(i==null||i(s.path)),!w))},[s,i]),R=t.useCallback(()=>{s&&(i==null||i(s.path))},[s,i]);if(n)return e.jsx("div",{className:"file-viewer-placeholder",children:r("common:status.loading")});if(l)return e.jsx("div",{className:"file-viewer-placeholder error",children:l});if(!s)return e.jsxs("div",{className:"file-viewer-placeholder",children:[e.jsx("div",{className:"placeholder-icon",children:e.jsx(M,{name:"folder-open",size:32})}),e.jsx("div",{className:"placeholder-text",children:r("terminal:fileExplorer.selectFileToView")})]});const y=s.fileType||"text",k=y==="text"&&_a(s.extension),g=y==="text"&&Ka(s.extension),j=k||g;return j&&b&&s.content!=null?e.jsxs("div",{className:"file-viewer-content",children:[e.jsx(Ve,{file:s,onRevealInTree:c,editMode:!0,onToggleEdit:N}),e.jsx(t.Suspense,{fallback:e.jsx("div",{className:"file-viewer-placeholder",children:r("common:status.loading")}),children:e.jsx(Ws,{content:s.content,extension:s.extension,onSave:v,onCancel:N},s.path)})]}):y==="text"&&!j&&s.content!=null?e.jsxs("div",{className:"file-viewer-content",children:[e.jsx(Ve,{file:s,onRevealInTree:c}),e.jsx(t.Suspense,{fallback:e.jsx("div",{className:"file-viewer-placeholder",children:r("common:status.loading")}),children:e.jsx(Ws,{content:s.content,extension:s.extension,onSave:v,onCancel:R},s.path)})]}):e.jsxs("div",{className:"file-viewer-content",children:[k&&e.jsx(Ja,{file:s,onRevealInTree:c,renderMarkdown:h,onToggleRender:o,editMode:b,onToggleEdit:N}),g&&!k&&e.jsx(Ya,{file:s,onRevealInTree:c,renderPlantUml:u,onToggleRender:p,editMode:b,onToggleEdit:N}),y==="image"&&e.jsx(Xa,{file:s,onRevealInTree:c}),y==="pdf"&&e.jsx(Qa,{file:s,onRevealInTree:c}),y==="binary"&&e.jsx(Za,{file:s,onRevealInTree:c})]})}const an=t.memo(er,(s,n)=>s.loading!==n.loading||s.error!==n.error?!1:s.file===null&&n.file===null?!0:s.file===null||n.file===null?!1:s.file.path===n.file.path&&s.file.content===n.file.content&&s.file.modified===n.file.modified);an.displayName="FileViewer";function rn({text:s,query:n}){if(!n)return e.jsx(e.Fragment,{children:s});const l=Qn(s,n);if(l)return e.jsxs(e.Fragment,{children:[s.slice(0,l.start),e.jsx("mark",{className:"search-highlight",children:s.slice(l.start,l.end)}),s.slice(l.end)]});const c=n.toLowerCase(),r=s.toLowerCase().indexOf(c);return r===-1?e.jsx(e.Fragment,{children:s}):e.jsxs(e.Fragment,{children:[s.slice(0,r),e.jsx("mark",{className:"search-highlight",children:s.slice(r,r+n.length)}),s.slice(r+n.length)]})}const tr=t.memo(function({node:n,query:l,isSelected:c,onSelect:i,lineNumber:r}){const h=n.isDirectory?null:as(n),o=n.path.split("/");o[o.length-1];const u=o.slice(0,-1).join("/");return e.jsxs("div",{className:`search-result-item ${c?"selected":""}`,onClick:()=>i(n),children:[n.isDirectory?e.jsx("span",{className:"search-result-icon",children:e.jsx(M,{name:"folder",size:14})}):h?e.jsx("span",{className:"search-result-icon",style:{backgroundImage:`url('${h}')`},role:"img","aria-label":"file icon"}):e.jsx("span",{className:"search-result-icon",children:e.jsx(M,{name:"file-text",size:14})}),e.jsxs("div",{className:"search-result-info",children:[e.jsxs("span",{className:"search-result-name",children:[e.jsx(rn,{text:n.name,query:l}),r&&e.jsxs("span",{className:"search-result-line-badge",children:[":",r]})]}),e.jsx("span",{className:"search-result-path",children:u})]})]})}),sr=t.memo(function({match:n,query:l,isSelected:c,onSelect:i}){const{t:r}=oe(["terminal"]),h={name:n.name,path:n.path,isDirectory:!1,extension:n.extension},o=as(h),u=n.path.split("/"),p=u[u.length-1],b=u.slice(0,-1).join("/");return e.jsxs("div",{className:`content-search-item ${c?"selected":""}`,children:[e.jsxs("div",{className:`content-search-header ${c?"selected":""}`,onClick:()=>i(n.path),children:[o?e.jsx("span",{className:"content-search-icon",style:{backgroundImage:`url('${o}')`},role:"img","aria-label":"file icon"}):e.jsx("span",{className:"content-search-icon",children:e.jsx(M,{name:"file-text",size:14})}),e.jsxs("div",{style:{flex:1,minWidth:0,display:"flex",flexDirection:"column",gap:"2px"},children:[e.jsx("span",{className:"content-search-name",children:p}),e.jsx("span",{className:"search-result-path",style:{fontSize:"10px"},children:b})]}),e.jsx("span",{className:"content-search-count",children:n.matches.length})]}),e.jsxs("div",{className:"content-search-matches",children:[n.matches.slice(0,5).map((f,v)=>e.jsxs("div",{className:"content-search-match",onClick:()=>i(n.path,f.line),children:[e.jsx("span",{className:"content-search-line-num",children:f.line}),e.jsx("span",{className:"content-search-line-content",children:e.jsx(rn,{text:f.content.trim(),query:l})})]},`${n.path}-${f.line}-${v}`)),n.matches.length>5&&e.jsxs("div",{className:"content-search-match",style:{opacity:.6,cursor:"default"},children:[e.jsx("span",{className:"content-search-line-num",children:"..."}),e.jsx("span",{className:"content-search-line-content",children:r("terminal:fileExplorer.moreMatches",{count:n.matches.length-5})})]})]})]})});function nr({filenameResults:s,contentResults:n,onSelectFile:l,onSelectContent:c,selectedPath:i,query:r,lineNumber:h}){const{t:o}=oe(["terminal"]),u=s.length>0,p=n.length>0;return!u&&!p?e.jsx("div",{className:"search-no-results",children:o("terminal:fileExplorer.noMatchesFound")}):e.jsxs("div",{className:"unified-search-results",children:[u&&e.jsxs("div",{className:"unified-search-section",children:[e.jsxs("div",{className:"unified-search-section-header",children:[e.jsx("span",{className:"unified-search-section-icon",children:e.jsx(M,{name:"file-text",size:14})}),e.jsx("span",{className:"unified-search-section-title",children:o("terminal:fileExplorer.files")}),e.jsx("span",{className:"unified-search-section-count",children:s.length})]}),e.jsx("div",{className:"unified-search-section-content",children:s.map(b=>e.jsx(tr,{node:b,query:r,isSelected:i===b.path,onSelect:l,lineNumber:h},b.path))})]}),p&&e.jsxs("div",{className:"unified-search-section",children:[e.jsxs("div",{className:"unified-search-section-header",children:[e.jsx("span",{className:"unified-search-section-icon",children:e.jsx(M,{name:"edit",size:14})}),e.jsx("span",{className:"unified-search-section-title",children:o("terminal:fileExplorer.content")}),e.jsx("span",{className:"unified-search-section-count",children:o("terminal:fileExplorer.matchesInFiles",{matches:n.reduce((b,f)=>b+f.matches.length,0),files:n.length})})]}),e.jsx("div",{className:"unified-search-section-content",children:n.map(b=>e.jsx(sr,{match:b,query:r,isSelected:i===b.path,onSelect:c},b.path))})]})]})}const ln=t.memo(nr,(s,n)=>!(s.query!==n.query||s.selectedPath!==n.selectedPath||s.filenameResults.length!==n.filenameResults.length||s.contentResults.length!==n.contentResults.length));ln.displayName="UnifiedSearchResults";const ar=t.memo(function({file:n,isSelected:l,onSelect:c,onStage:i,isStaging:r,showDirPath:h,isChecked:o,onToggleCheck:u,onContextMenu:p,onDiscard:b}){const{t:f}=oe(["terminal"]),v=n.status,N=xt[v],R=v==="deleted",y=v==="untracked"&&i,k=n.name.includes(".")?"."+n.name.split(".").pop():"",g=h&&n.path.includes("/")?n.path.slice(0,n.path.lastIndexOf("/")):"";return e.jsxs("div",{className:`git-file-item ${l?"selected":""}`,onClick:()=>!R&&c(n.path,v),onContextMenu:j=>{j.preventDefault(),p==null||p(j,n,v)},style:{cursor:R?"not-allowed":"pointer"},title:n.path,children:[u&&e.jsx("input",{type:"checkbox",className:"git-file-checkbox",checked:o||!1,onChange:j=>{j.stopPropagation(),u(n.path)},onClick:j=>j.stopPropagation()}),e.jsx("img",{className:"tree-icon",src:gt(k),alt:"file"}),e.jsxs("span",{className:"git-file-name",children:[n.name,g&&e.jsx("span",{className:"git-file-dir",children:g})]}),e.jsx("span",{className:"git-file-status",style:{color:N.color},children:N.icon}),n.oldPath&&e.jsxs("span",{className:"git-file-renamed",children:[e.jsx(M,{name:"subitem",size:10,style:{transform:"rotate(180deg)"}})," ",n.oldPath.split("/").pop()]}),y&&e.jsx("button",{className:`git-stage-btn ${r?"staging":""}`,onClick:j=>{j.stopPropagation(),r||i(n.path)},title:f("terminal:fileExplorer.stageFile"),disabled:r,children:r?"...":"+"}),b&&e.jsx("button",{className:"git-discard-btn",onClick:j=>{j.stopPropagation(),b(n,v)},title:v==="untracked"||v==="added"?"Delete file":"Discard changes",children:e.jsx(M,{name:"revert",size:12})})]})}),rr=16,ir=22,lr=t.memo(function s({node:n,depth:l,expandedDirs:c,onToggleDir:i,selectedPath:r,onSelect:h,onStage:o,stagingPaths:u,checkedFiles:p,onToggleCheck:b,onContextMenu:f,onDirContextMenu:v,onDiscard:N}){const{t:R}=oe(["terminal"]),y=l*rr;if(!n.isDirectory){const g=n.file.status,j=xt[g];return e.jsxs("div",{className:`git-file-item ${r===n.path?"selected":""}`,onClick:()=>g!=="deleted"&&h(n.file.path,g),onContextMenu:w=>{w.preventDefault(),f==null||f(w,n.file,g)},style:{paddingLeft:`${y+ir}px`,cursor:g==="deleted"?"not-allowed":"pointer"},title:n.file.path,children:[b&&e.jsx("input",{type:"checkbox",className:"git-file-checkbox",checked:(p==null?void 0:p.has(n.file.path))||!1,onChange:w=>{w.stopPropagation(),b(n.file.path)},onClick:w=>w.stopPropagation()}),e.jsx("img",{className:"tree-icon",src:gt(n.file.name.includes(".")?"."+n.file.name.split(".").pop():""),alt:"file"}),e.jsx("span",{className:"git-file-name",children:n.file.name}),e.jsx("span",{className:"git-file-status",style:{color:j.color},children:j.icon}),n.file.oldPath&&e.jsxs("span",{className:"git-file-renamed",children:[e.jsx(M,{name:"subitem",size:10,style:{transform:"rotate(180deg)"}})," ",n.file.oldPath.split("/").pop()]}),g==="untracked"&&o&&e.jsx("button",{className:`git-stage-btn ${u!=null&&u.has(n.path)?"staging":""}`,onClick:w=>{w.stopPropagation(),u!=null&&u.has(n.path)||o(n.file.path)},title:R("terminal:fileExplorer.stageFile"),disabled:u==null?void 0:u.has(n.path),children:u!=null&&u.has(n.path)?"...":"+"}),N&&e.jsx("button",{className:"git-discard-btn",onClick:w=>{w.stopPropagation(),N(n.file,g)},title:g==="untracked"||g==="added"?"Delete file":"Discard changes",children:e.jsx(M,{name:"revert",size:12})})]})}const k=c.has(n.path);return e.jsxs("div",{className:"tree-node-wrapper",children:[e.jsxs("div",{className:`tree-node directory ${k?"expanded":""}`,style:{paddingLeft:`${y}px`},onClick:()=>i(n.path),onContextMenu:g=>{g.preventDefault(),g.stopPropagation(),v==null||v(g,n)},children:[e.jsx("span",{className:`tree-arrow ${k?"expanded":""}`,children:e.jsx(M,{name:"caret-right",size:10})}),e.jsx("img",{className:"tree-folder-icon",src:k?"/assets/vscode-icons/default_folder_opened.svg":"/assets/vscode-icons/default_folder.svg",alt:"folder"}),e.jsx("span",{className:"tree-name",children:n.name}),e.jsx("span",{className:"git-tree-file-count",children:R("terminal:fileExplorer.fileCount",{count:n.fileCount})})]}),k&&e.jsx("div",{className:"tree-children",children:n.children.map(g=>e.jsx(s,{node:g,depth:l+1,expandedDirs:c,onToggleDir:i,selectedPath:r,onSelect:h,onStage:o,stagingPaths:u,checkedFiles:p,onToggleCheck:b,onContextMenu:f,onDirContextMenu:v,onDiscard:N},g.path))})]})}),ss=t.memo(function({groupLabel:n,groupIcon:l,groupColor:c,files:i,treeNodes:r,viewMode:h,selectedPath:o,expandedDirs:u,onToggleDir:p,onFileSelect:b,onStageFile:f,onStageAll:v,stagingPaths:N,checkedFiles:R,onToggleCheck:y,onContextMenu:k,onDirContextMenu:g,onDiscardFile:j,onDiscardAll:w}){const{t:T}=oe(["terminal"]);if(i.length===0)return null;const A=i.some(O=>O.status==="untracked"),K=A&&v&&i.length>0,C=N?i.every(O=>N.has(O.path)):!1;return e.jsxs("div",{className:"git-status-group",children:[e.jsxs("div",{className:"git-status-group-header",style:{color:c},children:[e.jsx("span",{className:"git-status-badge",style:{background:c},children:l}),n," (",i.length,")",K&&e.jsx("button",{className:`git-stage-all-btn ${C?"staging":""}`,onClick:O=>{O.stopPropagation(),C||v()},title:T("terminal:fileExplorer.stageAllUntracked"),disabled:C,children:C?"...":T("terminal:fileExplorer.stageAll")}),w&&e.jsxs("button",{className:"git-discard-all-btn",onClick:O=>{O.stopPropagation(),w()},title:A?`Delete all ${i.length} files`:`Discard all ${i.length} changes`,children:[e.jsx(M,{name:"revert",size:12})," All"]})]}),h==="tree"?e.jsx("div",{className:"git-tree-content",children:r.map(O=>e.jsx(lr,{node:O,depth:0,expandedDirs:u,onToggleDir:p,selectedPath:o,onSelect:b,onStage:f,stagingPaths:N,checkedFiles:R,onToggleCheck:y,onContextMenu:k,onDirContextMenu:g,onDiscard:j},O.path))}):e.jsx("div",{className:"git-flat-content",children:i.map(O=>e.jsx(ar,{file:O,isSelected:o===O.path,onSelect:b,onStage:O.status==="untracked"?f:void 0,isStaging:N==null?void 0:N.has(O.path),showDirPath:!0,isChecked:R==null?void 0:R.has(O.path),onToggleCheck:y,onContextMenu:k,onDiscard:j},O.path))})]})});function or({gitStatus:s,loading:n,onFileSelect:l,selectedPath:c,onRefresh:i,onStageFiles:r,stagingPaths:h,currentFolder:o,onCommitComplete:u,mergeInProgress:p,mergingBranch:b,onMergeContinue:f,onMergeAbort:v,onConflictOpen:N,onRevealInTree:R}){const{t:y}=oe(["terminal","common"]),[k,g]=t.useState("tree"),[j,w]=t.useState(new Set),[T,A]=t.useState(""),[K,C]=t.useState(""),[O,ae]=t.useState(!1),[Y,D]=t.useState(new Set),[F,V]=t.useState(!1),[ne,re]=t.useState(null),je=t.useRef(null),{showToast:U}=tn(),[Z,P]=t.useState(null),[G,I]=t.useState(null),[ie,ee]=t.useState(null),ve=t.useCallback((E,L)=>{ee({files:[E],label:E.name})},[]),m=t.useCallback(async()=>{if(!(!ie||!o))try{const E=await W(B("/api/files/git-discard"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({files:ie.files.map(_=>({path:_.path,status:_.status})),directory:o})}),L=await E.json();E.ok&&L.success?(U("success","Discarded",`Reverted ${ie.files.length} file(s)`),i()):U("error","Discard Failed",L.error||"Could not discard changes")}catch{U("error","Discard Failed","Network error")}finally{ee(null)}},[ie,o,i,U]),X=t.useCallback((E,L,_)=>{E.preventDefault(),E.stopPropagation(),P({isOpen:!0,position:{x:E.clientX,y:E.clientY},file:L,status:_})},[]),le=t.useCallback(async(E,L)=>{if(o)try{const _=await W(B("/api/files/git-discard"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({files:[{path:E.path,status:L}],directory:o})}),be=await _.json();_.ok&&be.success?(U("success","Discarded",`Restored ${E.name}`),i()):U("error","Discard Failed",be.error||"Could not discard changes")}catch{U("error","Discard Failed","Network error")}},[o,i,U]),H=t.useCallback(async E=>{try{await navigator.clipboard.writeText(E),U("success","Copied","Full path copied")}catch{U("error","Copy Failed","Could not copy path")}},[U]),$=t.useCallback(async E=>{const L=o&&E.startsWith(o+"/")?E.slice(o.length+1):E;try{await navigator.clipboard.writeText(L),U("success","Copied","Relative path copied")}catch{U("error","Copy Failed","Could not copy path")}},[o,U]),S=t.useMemo(()=>{if(!Z)return[];const{file:E,status:L}=Z,_=[];return L==="conflict"&&N?_.push({id:"open-conflict",label:y("terminal:fileExplorer.gitContextMenu.openConflictResolver"),icon:e.jsx(M,{name:"warn",size:14}),onClick:()=>N(E.path)}):L!=="deleted"&&_.push({id:"open-file",label:y("terminal:fileExplorer.gitContextMenu.openFile"),icon:e.jsx(M,{name:"file-text",size:14}),onClick:()=>l(E.path,L)}),L!=="conflict"&&_.push({id:"stage-file",label:y("terminal:fileExplorer.gitContextMenu.stageFile"),icon:e.jsx(M,{name:"plus",size:14}),onClick:()=>{r([E.path])}}),_.push({id:"divider-1",label:"",divider:!0,onClick:()=>{}}),(L==="modified"||L==="deleted"||L==="renamed"||L==="conflict")&&_.push({id:"discard-changes",label:y("terminal:fileExplorer.gitContextMenu.discardChanges"),icon:e.jsx(M,{name:"revert",size:14}),danger:!0,onClick:()=>{le(E,L)}}),(L==="untracked"||L==="added")&&_.push({id:"delete-file",label:y("terminal:fileExplorer.gitContextMenu.deleteFile"),icon:e.jsx(M,{name:"trash",size:14}),danger:!0,onClick:()=>{le(E,L)}}),_.push({id:"divider-2",label:"",divider:!0,onClick:()=>{}}),_.push({id:"copy-full-path",label:y("terminal:fileExplorer.gitContextMenu.copyFullPath"),icon:e.jsx(M,{name:"pin",size:14}),onClick:()=>{H(E.path)}}),_.push({id:"copy-relative-path",label:y("terminal:fileExplorer.gitContextMenu.copyRelativePath"),icon:e.jsx(M,{name:"clipboard",size:14}),onClick:()=>{$(E.path)}}),R&&L!=="deleted"&&_.push({id:"reveal-in-tree",label:y("terminal:fileExplorer.gitContextMenu.revealInTree"),icon:e.jsx(M,{name:"target",size:14}),onClick:()=>R(E.path)}),_},[Z,l,r,N,R,le,H,$,y]),te=t.useCallback((E,L)=>{E.preventDefault(),E.stopPropagation(),I({isOpen:!0,position:{x:E.clientX,y:E.clientY},node:L})},[]),Q=t.useCallback(E=>!E.isDirectory&&E.file?[E.file]:E.children.flatMap(L=>Q(L)),[]),de=t.useCallback(async E=>{if(!o)return;const L=Q(E);if(L.length!==0)try{const _=await W(B("/api/files/git-discard"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({files:L.map(Me=>({path:Me.path,status:Me.status})),directory:o})}),be=await _.json();_.ok&&be.success?(U("success","Discarded",`Reverted ${L.length} file(s) in ${E.name}`),i()):U("error","Discard Failed",be.error||"Could not discard changes")}catch{U("error","Discard Failed","Network error")}},[o,Q,i,U]),pe=t.useMemo(()=>{if(!G)return[];const{node:E}=G,L=Q(E);return[{id:"discard-dir",label:`Discard Changes (${L.length} files)`,icon:e.jsx(M,{name:"revert",size:14}),danger:!0,onClick:()=>{de(E)}},{id:"stage-dir",label:`Stage All (${L.length} files)`,icon:e.jsx(M,{name:"plus",size:14}),onClick:()=>{r(L.map(_=>_.path))}}]},[G,Q,de,r]),se=t.useCallback(E=>{w(L=>{const _=new Set(L);return _.has(E)?_.delete(E):_.add(E),_})},[]),{conflictFiles:we,conflictTree:Ge,changesFiles:ze,changesTree:Gt,untrackedFiles:He,untrackedTree:yt,allDirPaths:Ue}=t.useMemo(()=>{if(!s||!s.isGitRepo||s.files.length===0)return{conflictFiles:[],conflictTree:[],changesFiles:[],changesTree:[],untrackedFiles:[],untrackedTree:[],allDirPaths:new Set};const E=new Set,L=s.files.filter(me=>me.status==="conflict"),_=$t(L);zt(_,E);const be=s.files.filter(me=>me.status==="modified"||me.status==="added"||me.status==="deleted"||me.status==="renamed"),Me=$t(be);zt(Me,E);const qe=s.files.filter(me=>me.status==="untracked"),ct=$t(qe);return zt(ct,E),{conflictFiles:L,conflictTree:_,changesFiles:be,changesTree:Me,untrackedFiles:qe,untrackedTree:ct,allDirPaths:E}},[s]);t.useEffect(()=>{w(Ue)},[Ue]),t.useEffect(()=>{s!=null&&s.files&&D(new Set(s.files.map(E=>E.path)))},[s==null?void 0:s.files]);const ot=t.useCallback(()=>{ze.length!==0&&ee({files:ze,label:`${ze.length} changed files`})},[ze]),bt=t.useCallback(()=>{He.length!==0&&ee({files:He,label:`${He.length} unversioned files`})},[He]),jt=t.useCallback(()=>{we.length!==0&&ee({files:we,label:`${we.length} conflicted files`})},[we]),vt=we.length>0;t.useEffect(()=>{if(ne){const E=ne.type==="error"?8e3:4e3,L=setTimeout(()=>re(null),E);return()=>clearTimeout(L)}},[ne]);const wt=t.useCallback(async()=>{const E=!O;if(ae(E),E&&o){C(T);try{const _=await(await W(B(`/api/files/git-log-message?path=${encodeURIComponent(o)}`))).json();_.message&&A(_.message)}catch{}}else A(K)},[O,o,T,K]),ye=t.useCallback(E=>{D(L=>{const _=new Set(L);return _.has(E)?_.delete(E):_.add(E),_})},[]),ue=t.useCallback(()=>{if(!(s!=null&&s.files))return;const E=s.files.map(_=>_.path),L=E.every(_=>Y.has(_));D(L?new Set:new Set(E))},[s==null?void 0:s.files,Y]),xe=t.useCallback(async E=>{if(!(!o||!T.trim()||Y.size===0||F)){V(!0),re(null);try{const L=await W(B("/api/files/git-commit"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:o,message:T.trim(),amend:O,paths:Array.from(Y)})}),_=await L.json();if(!L.ok||!_.success){re({type:"error",text:_.error||"Commit failed"}),V(!1);return}if(E)try{const be=await W(B("/api/files/git-push"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:o})}),Me=await be.json();be.ok&&Me.success?re({type:"success",text:y("terminal:fileExplorer.committedAndPushed")}):re({type:"error",text:y("terminal:fileExplorer.committedButPushFailed",{error:Me.error||"Unknown error"})})}catch{re({type:"error",text:y("terminal:fileExplorer.committedButPushFailed",{error:"Network error"})})}else re({type:"success",text:y("terminal:fileExplorer.committedSuccessfully")});A(""),C(""),ae(!1),i(),u==null||u()}catch(L){re({type:"error",text:L.message||"Commit failed"})}finally{V(!1)}}},[o,T,O,Y,F,i,u]);if(n)return e.jsx("div",{className:"git-changes-loading",children:y("terminal:fileExplorer.loadingGitStatus")});if(!s||!s.isGitRepo)return e.jsxs("div",{className:"git-changes-empty",children:[e.jsx("div",{className:"git-empty-icon",children:e.jsx(M,{name:"package",size:32})}),e.jsx("div",{className:"git-empty-text",children:y("terminal:fileExplorer.notGitRepo")})]});if(s.files.length===0)return e.jsxs("div",{className:"git-changes-empty",children:[e.jsx("div",{className:"git-empty-icon",children:e.jsx(M,{name:"sparkle",size:32})}),e.jsx("div",{className:"git-empty-text",children:y("terminal:fileExplorer.workingTreeClean")}),e.jsx("div",{className:"git-empty-branch",children:y("terminal:fileExplorer.onBranch",{branch:s.branch})})]});const ke=E=>{r([E])},We=()=>{const E=He.map(L=>L.path);E.length>0&&r(E)},Re=(E,L)=>{L==="conflict"&&N?N(E):l(E,L)};return e.jsxs("div",{className:"git-changes",children:[e.jsxs("div",{className:"git-changes-header",children:[e.jsxs("span",{className:"git-branch",children:[e.jsx("span",{className:"git-branch-icon",children:e.jsx(M,{name:"git-branch",size:12})}),s.branch]}),s.counts&&e.jsxs("div",{className:"git-changes-summary",children:[(s.counts.conflict??0)>0&&e.jsxs("span",{className:"git-count conflict",children:[s.counts.conflict,"C"]}),s.counts.modified>0&&e.jsxs("span",{className:"git-count modified",children:[s.counts.modified,"M"]}),s.counts.added>0&&e.jsxs("span",{className:"git-count added",children:[s.counts.added,"A"]}),s.counts.deleted>0&&e.jsxs("span",{className:"git-count deleted",children:[s.counts.deleted,"D"]}),s.counts.untracked>0&&e.jsxs("span",{className:"git-count untracked",children:[s.counts.untracked,"?"]})]}),e.jsxs("div",{className:"git-view-toggle",children:[e.jsx("button",{className:`git-view-toggle-btn ${k==="flat"?"active":""}`,onClick:()=>g("flat"),title:y("terminal:fileExplorer.flatList"),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"currentColor",children:[e.jsx("rect",{x:"2",y:"3",width:"12",height:"1.5",rx:"0.5"}),e.jsx("rect",{x:"2",y:"7",width:"12",height:"1.5",rx:"0.5"}),e.jsx("rect",{x:"2",y:"11",width:"12",height:"1.5",rx:"0.5"})]})}),e.jsx("button",{className:`git-view-toggle-btn ${k==="tree"?"active":""}`,onClick:()=>g("tree"),title:y("terminal:fileExplorer.directoryTree"),children:e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"currentColor",children:[e.jsx("rect",{x:"1",y:"2",width:"6",height:"1.5",rx:"0.5"}),e.jsx("rect",{x:"4",y:"5.5",width:"8",height:"1.5",rx:"0.5"}),e.jsx("rect",{x:"4",y:"9",width:"8",height:"1.5",rx:"0.5"}),e.jsx("rect",{x:"7",y:"12.5",width:"7",height:"1.5",rx:"0.5"})]})})]}),e.jsx("button",{className:"git-refresh-btn",onClick:i,title:y("common:buttons.refresh"),children:e.jsx(M,{name:"refresh",size:12})})]}),p&&e.jsxs("div",{className:"git-merge-banner",children:[e.jsx("span",{className:"git-merge-banner-icon",children:"⚠"}),e.jsx("span",{className:"git-merge-banner-text",children:y("terminal:fileExplorer.mergeInProgress",{branch:b?` (${b})`:""})}),e.jsxs("div",{className:"git-merge-actions",children:[e.jsx("button",{className:"git-merge-continue-btn",onClick:f,disabled:vt,title:y(vt?"terminal:fileExplorer.resolveAllConflictsFirst":"terminal:fileExplorer.continueMerge"),children:y("terminal:fileExplorer.continue")}),e.jsx("button",{className:"git-merge-abort-btn",onClick:v,title:y("terminal:fileExplorer.abortMerge"),children:y("terminal:fileExplorer.abort")})]})]}),e.jsxs("div",{className:"git-changes-list",children:[e.jsx(ss,{groupLabel:y("terminal:fileExplorer.gitGroups.conflicts"),groupIcon:"C",groupColor:"#ff5555",files:we,treeNodes:Ge,viewMode:k,selectedPath:c,expandedDirs:j,onToggleDir:se,onFileSelect:Re,checkedFiles:Y,onToggleCheck:ye,onContextMenu:X,onDirContextMenu:te,onDiscardFile:ve,onDiscardAll:jt}),e.jsx(ss,{groupLabel:y("terminal:fileExplorer.gitGroups.changes"),groupIcon:"~",groupColor:"#c89a5a",files:ze,treeNodes:Gt,viewMode:k,selectedPath:c,expandedDirs:j,onToggleDir:se,onFileSelect:Re,checkedFiles:Y,onToggleCheck:ye,onContextMenu:X,onDirContextMenu:te,onDiscardFile:ve,onDiscardAll:ot}),e.jsx(ss,{groupLabel:y("terminal:fileExplorer.gitGroups.unversioned"),groupIcon:"?",groupColor:"#6ab8c8",files:He,treeNodes:yt,viewMode:k,selectedPath:c,expandedDirs:j,onToggleDir:se,onFileSelect:Re,onStageFile:ke,onStageAll:We,stagingPaths:h,checkedFiles:Y,onToggleCheck:ye,onContextMenu:X,onDirContextMenu:te,onDiscardFile:ve,onDiscardAll:bt})]}),e.jsxs("div",{className:"git-commit-panel",children:[e.jsxs("div",{className:"git-commit-options",children:[e.jsxs("label",{className:"git-commit-amend-label",children:[e.jsx("input",{type:"checkbox",className:"git-commit-amend-checkbox",checked:O,onChange:wt}),y("terminal:fileExplorer.amend")]}),e.jsx("span",{className:"git-commit-file-count",children:y("terminal:fileExplorer.fileCount",{count:Y.size})}),e.jsx("button",{className:"git-commit-select-toggle",onClick:ue,title:Y.size===s.files.length?y("terminal:fileExplorer.deselectAll"):y("terminal:fileExplorer.selectAll"),children:Y.size===s.files.length?y("terminal:fileExplorer.deselectAll"):y("terminal:fileExplorer.selectAll")})]}),e.jsx("textarea",{ref:je,className:"git-commit-message",placeholder:y("terminal:fileExplorer.commitMessagePlaceholder"),value:T,onChange:E=>A(E.target.value),onKeyDown:E=>{(E.metaKey||E.ctrlKey)&&E.key==="Enter"&&(E.preventDefault(),xe(!1)),(E.metaKey||E.ctrlKey)&&E.shiftKey&&E.key==="Enter"&&(E.preventDefault(),xe(!0)),E.stopPropagation()},rows:3,disabled:F}),ne&&e.jsx("div",{className:`git-commit-status ${ne.type}`,children:ne.text}),e.jsxs("div",{className:"git-commit-actions",children:[e.jsx("button",{className:"git-commit-btn",onClick:()=>xe(!1),disabled:!T.trim()||Y.size===0||F,title:y("terminal:fileExplorer.commitCtrlEnter"),children:y(F?"terminal:fileExplorer.committing":"terminal:fileExplorer.commitAction")}),e.jsx("button",{className:"git-commit-push-btn",onClick:()=>xe(!0),disabled:!T.trim()||Y.size===0||F,title:y("terminal:fileExplorer.commitAndPushCtrlShiftEnter"),children:F?"...":y("terminal:fileExplorer.commitAndPush")})]})]}),Z&&e.jsx(it,{isOpen:Z.isOpen,position:Z.position,worldPosition:{x:0,z:0},actions:S,onClose:()=>P(null)}),G&&e.jsx(it,{isOpen:G.isOpen,position:G.position,worldPosition:{x:0,z:0},actions:pe,onClose:()=>I(null)}),ie&&e.jsx("div",{className:"git-discard-confirm-overlay",onClick:()=>ee(null),children:e.jsxs("div",{className:"git-discard-confirm",onClick:E=>E.stopPropagation(),children:[e.jsx("p",{children:ie.files.some(E=>E.status==="untracked"||E.status==="added")?e.jsxs(e.Fragment,{children:["Delete ",e.jsx("strong",{children:ie.label}),"?"]}):e.jsxs(e.Fragment,{children:["Discard changes to ",e.jsx("strong",{children:ie.label}),"?"]})}),e.jsx("p",{className:"git-discard-confirm-hint",children:"This cannot be undone."}),e.jsxs("div",{className:"git-discard-confirm-actions",children:[e.jsx("button",{className:"git-discard-confirm-cancel",onClick:()=>ee(null),children:"Cancel"}),e.jsx("button",{className:"git-discard-confirm-btn",onClick:m,children:ie.files.some(E=>E.status==="untracked"||E.status==="added")?"Delete":"Discard"})]})]})})]})}const on=t.memo(or,(s,n)=>s.loading!==n.loading||s.selectedPath!==n.selectedPath||s.stagingPaths!==n.stagingPaths||s.currentFolder!==n.currentFolder||s.mergeInProgress!==n.mergeInProgress||s.mergingBranch!==n.mergingBranch?!1:s.gitStatus===null&&n.gitStatus===null?!0:!(s.gitStatus===null||n.gitStatus===null||s.gitStatus.isGitRepo!==n.gitStatus.isGitRepo||s.gitStatus.branch!==n.gitStatus.branch||s.gitStatus.files.length!==n.gitStatus.files.length||s.gitStatus.mergeInProgress!==n.gitStatus.mergeInProgress));on.displayName="GitChanges";const cr=t.memo(function({tab:n,isActive:l,onSelect:c,onClose:i,onContextMenu:r}){const{t:h}=oe(["terminal"]),o={name:n.filename,path:n.path,isDirectory:!1,extension:n.extension},u=t.useCallback(()=>{c(n.path)},[c,n.path]),p=t.useCallback(v=>{v.button===1&&(v.preventDefault(),v.stopPropagation(),i(n.path))},[i,n.path]),b=t.useCallback(v=>{v.preventDefault(),v.stopPropagation(),i(n.path)},[i,n.path]),f=t.useCallback(v=>{v.preventDefault(),v.stopPropagation(),r(v,n)},[r,n]);return e.jsxs("div",{className:`file-tab ${l?"active":""}`,onClick:u,onMouseDown:p,onContextMenu:f,title:n.path,children:[e.jsx("img",{className:"file-tab-icon",src:as(o),alt:"file"}),e.jsx("span",{className:"file-tab-name",children:n.filename}),e.jsx("button",{className:"file-tab-close",onClick:b,title:h("terminal:fileExplorer.closeMiddleClick"),children:"×"})]})});function dr(s){return typeof s.path=="string"&&s.path.startsWith("/")}function ur({tabs:s,activeTabPath:n,onSelectTab:l,onCloseTab:c,onCloseAllTabs:i,onShowGitHistory:r}){const{t:h}=oe(["terminal"]),[o,u]=t.useState(null),p=t.useCallback((v,N)=>{u({isOpen:!0,position:{x:v.clientX,y:v.clientY},tab:N})},[]),b=t.useCallback(()=>u(null),[]),f=t.useMemo(()=>{if(!o)return[];const v=o.tab,N=!!r&&dr(v),R=[{id:"git-history",label:h("terminal:fileExplorer.showGitHistory")??"Show Git History",icon:e.jsx(M,{name:"git-commit",size:14}),disabled:!N,onClick:()=>{N&&r(v.path)}}];return i&&R.push({id:"divider-close-all",label:"",divider:!0,onClick:()=>{}},{id:"close-all-tabs",label:h("terminal:fileExplorer.closeAllTabs")??"Close all tabs",icon:e.jsx(M,{name:"cross",size:14}),danger:!0,onClick:()=>i()}),R},[o,r,i,h]);return s.length===0?null:e.jsxs("div",{className:"file-tabs-bar",children:[e.jsx("div",{className:"file-tabs-container",children:s.map(v=>e.jsx(cr,{tab:v,isActive:n===v.path,onSelect:l,onClose:c,onContextMenu:p},v.path))}),o&&e.jsx(it,{isOpen:o.isOpen,position:o.position,worldPosition:{x:0,z:0},actions:f,onClose:b})]})}const cn=t.memo(ur,(s,n)=>{if(s.activeTabPath!==n.activeTabPath||s.tabs.length!==n.tabs.length||s.onShowGitHistory!==n.onShowGitHistory||s.onCloseAllTabs!==n.onCloseAllTabs)return!1;for(let l=0;l<s.tabs.length;l++)if(s.tabs[l].path!==n.tabs[l].path)return!1;return!0});cn.displayName="FileTabs";const hr=t.memo(function({currentFolder:n,gitStatus:l,onBranchChanged:c,onMerge:i,onCompare:r,onPullConflicts:h}){const{t:o}=oe(["terminal","common"]),[u,p]=t.useState(!1),[b,f]=t.useState(""),[v,N]=t.useState(!1),[R,y]=t.useState(""),[k,g]=t.useState(!1),[j,w]=t.useState(null),[T,A]=t.useState(null),K=t.useRef(null),C=t.useRef(null),O=t.useRef(null),{branches:ae,loading:Y,operationInProgress:D,loadBranches:F,checkoutBranch:V,createBranch:ne,pullFromRemote:re,pushToRemote:je}=rs();t.useEffect(()=>{u&&n&&(F(n),setTimeout(()=>{var S;return(S=C.current)==null?void 0:S.focus()},50)),u||(f(""),N(!1),y(""),w(null))},[u,n,F]),t.useEffect(()=>{if(j){const S=j.type==="error"?8e3:3e3,te=setTimeout(()=>w(null),S);return()=>clearTimeout(te)}},[j]),t.useEffect(()=>{v&&setTimeout(()=>{var S;return(S=O.current)==null?void 0:S.focus()},50)},[v]),t.useEffect(()=>{if(!u)return;const S=Q=>{const de=Q.target;!de.closest(".branch-widget-selector")&&!de.closest(".branch-widget-dropdown")&&p(!1)},te=Q=>{Q.key==="Escape"&&(Q.preventDefault(),Q.stopPropagation(),p(!1))};return document.addEventListener("click",S),document.addEventListener("keydown",te,!0),()=>{document.removeEventListener("click",S),document.removeEventListener("keydown",te,!0)}},[u]);const U=t.useCallback(async S=>{if(!n||D||S.isCurrent)return;const te=await V(n,S.name);te.success?(w({type:"success",text:o("terminal:fileExplorer.switchedToBranch",{branch:te.branch||S.name})}),c(),F(n)):w({type:"error",text:te.error||o("terminal:fileExplorer.checkoutFailed")})},[n,D,V,c,F]),Z=t.useCallback(async()=>{if(!n||!R.trim()||D)return;const S=await ne(n,R.trim());S.success?(w({type:"success",text:o("terminal:fileExplorer.createdBranch",{branch:S.branch})}),N(!1),y(""),c(),F(n)):w({type:"error",text:S.error||o("terminal:fileExplorer.createBranchFailed")})},[n,R,D,ne,c,F]),P=t.useCallback(async()=>{if(!n||D)return;const S=await re(n);S.success?(S.stashConflicts&&S.stashConflicts.length>0?(w({type:"error",text:`Pull succeeded but stash pop had conflicts: ${S.stashConflicts.length} file(s). Resolve manually.`}),h==null||h(S.stashConflicts),p(!1)):S.stashed?w({type:"success",text:"Pull complete. Local changes were auto-stashed and restored."}):w({type:"success",text:o("terminal:fileExplorer.pullComplete")}),c(),F(n)):S.conflicts&&S.conflicts.length>0?(w({type:"error",text:`Pull conflicts: ${S.conflicts.length} file(s)`}),h==null||h(S.conflicts),p(!1)):w({type:"error",text:S.error||o("terminal:fileExplorer.pullFailed")})},[n,D,re,c,F,h]),G=t.useCallback(async()=>{if(!n||D)return;const S=await je(n);S.success?w({type:"success",text:o("terminal:fileExplorer.pushComplete")}):w({type:"error",text:S.error||o("terminal:fileExplorer.pushFailed")})},[n,D,je]),[I,ie]=t.useState(!1),ee=t.useCallback(async()=>{if(!(!n||D||I)){ie(!0);try{const S=await W(B("/api/files/git-fetch"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:n})});if(S.ok)w({type:"success",text:"Fetch complete"}),c(),F(n);else{const te=await S.json().catch(()=>({error:"Fetch failed"}));w({type:"error",text:te.error||"Fetch failed"})}}catch{w({type:"error",text:"Fetch failed"})}finally{ie(!1)}}},[n,D,I,c,F]),ve=(l==null?void 0:l.branch)||"unknown",m=!!D,X=t.useCallback((S,te)=>{te.isCurrent||(S.preventDefault(),S.stopPropagation(),A({isOpen:!0,position:{x:S.clientX,y:S.clientY},branch:te.name}))},[]),le=t.useMemo(()=>{if(!T)return[];const S=!!D||(l==null?void 0:l.mergeInProgress);return[{id:"compare",label:o("terminal:fileExplorer.showDiffWith",{branch:T.branch}),icon:e.jsx(M,{name:"arrows-horizontal",size:14}),disabled:!!D,onClick:()=>{r==null||r(T.branch),p(!1)}},{id:"merge",label:o("terminal:fileExplorer.mergeInto",{source:T.branch,target:ve}),icon:"⤵",disabled:!!S,onClick:()=>{i&&i(T.branch),p(!1)}},{id:"divider-1",label:"",divider:!0,onClick:()=>{}},{id:"checkout",label:o("terminal:fileExplorer.checkoutBranch",{branch:T.branch}),icon:e.jsx(M,{name:"git-branch",size:14}),disabled:!!D,onClick:()=>{const te=ae.find(Q=>Q.name===T.branch);te&&U(te)}}]},[T,D,l==null?void 0:l.mergeInProgress,ve,i,r,ae,U]),H=t.useMemo(()=>{const S=ae.filter(Q=>!Q.isRemote);if(!b)return S;const te=b.toLowerCase();return S.filter(Q=>Q.name.toLowerCase().includes(te))},[ae,b]),$=t.useMemo(()=>{const S=ae.filter(Q=>Q.isRemote);if(!b)return S;const te=b.toLowerCase();return S.filter(Q=>Q.name.toLowerCase().includes(te))},[ae,b]);return e.jsxs("div",{className:"branch-widget",style:{position:"relative"},children:[e.jsxs("div",{className:"branch-widget-selector",onClick:S=>{S.stopPropagation(),p(!u)},title:`Branch: ${ve}`,children:[e.jsx("svg",{className:"branch-widget-icon",width:"14",height:"14",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M5 3.25a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0Zm0 2.122a2.25 2.25 0 1 0-1 0v1.836A2.25 2.25 0 0 0 5.75 9.5h1.378a2.251 2.251 0 1 0 0-1H5.75a1.25 1.25 0 0 1-1.25-1.25V5.372Zm7.75 4.878a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3-8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"})}),e.jsx("span",{className:"branch-widget-name",children:ve}),e.jsx("span",{className:"branch-widget-arrow",children:"▼"})]}),u&&e.jsxs("div",{className:"branch-widget-dropdown",ref:K,children:[e.jsx("div",{className:"branch-widget-search",children:e.jsx("input",{ref:C,type:"text",className:"branch-widget-search-input",placeholder:o("terminal:fileExplorer.searchBranches"),value:b,onChange:S=>f(S.target.value),onKeyDown:S=>S.stopPropagation()})}),j&&e.jsx("div",{className:`branch-widget-status ${j.type}`,children:j.text}),e.jsx("div",{className:"branch-widget-section-header",children:o("terminal:fileExplorer.actions")}),e.jsxs("div",{className:"branch-widget-actions",children:[e.jsxs("div",{className:`branch-widget-action-item ${m||I?"disabled":""}`,onClick:ee,children:[e.jsx("span",{className:"branch-widget-action-icon",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M8 13l-3-3h2V6h2v4h2l-3 3zM8 3l3 3h-2v4H7V6H5l3-3z"})})}),e.jsx("span",{className:"branch-widget-action-label",children:I?"Fetching...":"Fetch"})]}),e.jsxs("div",{className:`branch-widget-action-item ${m?"disabled":""}`,onClick:P,children:[e.jsx("span",{className:"branch-widget-action-icon",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M8 12l-4-4h2.5V3h3v5H12L8 12z"})})}),e.jsx("span",{className:"branch-widget-action-label",children:o(D==="pull"?"terminal:fileExplorer.pulling":"terminal:fileExplorer.pull")})]}),e.jsxs("div",{className:`branch-widget-action-item ${m?"disabled":""}`,onClick:G,children:[e.jsx("span",{className:"branch-widget-action-icon",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M8 4l4 4h-2.5v5h-3V8H4l4-4z"})})}),e.jsx("span",{className:"branch-widget-action-label",children:o(D==="push"?"terminal:fileExplorer.pushing":"terminal:fileExplorer.push")})]}),e.jsxs("div",{className:`branch-widget-action-item ${m?"disabled":""}`,onClick:()=>{m||N(!v)},children:[e.jsx("span",{className:"branch-widget-action-icon",children:e.jsx("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"currentColor",children:e.jsx("path",{d:"M8 2v5H3v2h5v5h2V9h5V7H10V2H8z"})})}),e.jsx("span",{className:"branch-widget-action-label",children:o("terminal:fileExplorer.newBranch")})]})]}),v&&e.jsxs("div",{className:"branch-widget-new-branch",children:[e.jsx("input",{ref:O,type:"text",className:"branch-widget-new-branch-input",placeholder:o("terminal:fileExplorer.branchNamePlaceholder"),value:R,onChange:S=>y(S.target.value),onKeyDown:S=>{S.stopPropagation(),S.key==="Enter"&&Z(),S.key==="Escape"&&(N(!1),y(""))}}),e.jsx("button",{className:"branch-widget-new-branch-confirm",onClick:Z,disabled:!R.trim()||m,children:D==="create"?"...":o("common:buttons.create")})]}),e.jsxs("div",{className:"branch-widget-section-header",children:[o("terminal:fileExplorer.localBranches"),Y&&e.jsxs("span",{className:"branch-widget-loading-hint",children:[" ",o("terminal:fileExplorer.loading")]})]}),e.jsxs("div",{className:"branch-widget-branch-list",children:[H.length===0&&!Y&&e.jsx("div",{className:"branch-widget-empty",children:o("terminal:fileExplorer.noBranchesFound")}),H.map(S=>e.jsxs("div",{className:`branch-widget-branch-item ${S.isCurrent?"current":""} ${m?"disabled":""}`,onClick:()=>U(S),onContextMenu:te=>X(te,S),title:S.lastMessage||S.name,children:[e.jsxs("span",{className:"branch-widget-branch-name",children:[S.isCurrent&&e.jsx("span",{className:"branch-widget-current-marker",children:"*"}),S.name]}),S.lastCommit&&e.jsx("span",{className:"branch-widget-branch-commit",children:S.lastCommit})]},S.name))]}),$.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"branch-widget-section-header clickable",onClick:()=>g(!k),children:[e.jsx("span",{className:"branch-widget-section-toggle",children:k?"▾":"▸"}),o("terminal:fileExplorer.remoteBranches",{count:$.length})]}),k&&e.jsx("div",{className:"branch-widget-branch-list",children:$.map(S=>e.jsxs("div",{className:`branch-widget-branch-item remote ${m?"disabled":""}`,onClick:()=>U(S),onContextMenu:te=>X(te,S),title:S.lastMessage||S.name,children:[e.jsx("span",{className:"branch-widget-branch-name",children:S.name}),S.lastCommit&&e.jsx("span",{className:"branch-widget-branch-commit",children:S.lastCommit})]},S.name))})]})]}),T&&e.jsx(it,{isOpen:T.isOpen,position:T.position,worldPosition:{x:0,z:0},actions:le,onClose:()=>A(null)})]})});function mr(s){return s.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function It(s,n){if(!s)return"";const l=As.languages[n];return l?As.highlight(s,l,n):mr(s)}function fr(s){const n=[],l=s.split(`
|
|
9
9
|
`);let c=[],i=!1,r=[],h=[],o=!1;for(const u of l)u.startsWith("<<<<<<<")?(c.length>0&&(n.push({type:"unchanged",content:c.join(`
|
|
10
10
|
`)}),c=[]),i=!0,o=!1,r=[],h=[]):u.startsWith("=======")&&i?o=!0:u.startsWith(">>>>>>>")&&i?(n.push({type:"conflict",ours:r.join(`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{as as He,r as t,s as I,d as ye,at as Ee,c as Oe,j as e,I as O,u as fe,au as _e,av as Te,aw as Be,ax as Ue,ay as Ke,az as We,a3 as De,aA as Ve,aB as Ge,aC as qe,aD as Ye,z as Je,m as Me,S as le,F as Xe,C as Qe,n as Ze,w as Ie,x as et,_ as tt,aE as st,al as X,aF as nt}from"./main-
|
|
1
|
+
import{as as He,r as t,s as I,d as ye,at as Ee,c as Oe,j as e,I as O,u as fe,au as _e,av as Te,aw as Be,ax as Ue,ay as Ke,az as We,a3 as De,aA as Ve,aB as Ge,aC as qe,aD as Ye,z as Je,m as Me,S as le,F as Xe,C as Qe,n as Ze,w as Ie,x as et,_ as tt,aE as st,al as X,aF as nt}from"./main-CTWrCxkg.js";import{FileExplorerPanel as at}from"./index-DCtotvv_.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-3OKhI9bz.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
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,$=0)=>{if(d.current.add(i.id),$>0&&await new Promise(x=>setTimeout(x,$)),p(x=>{const b=new Map(x);return b.set(i.id,{agentId:i.id,messages:[],loading:!0,hasMore:!1,totalCount:0}),b}),!i.sessionId){k&&k.length>0&&I.mergeOutputsWithHistory(i.id,[],k),p(x=>{const b=new Map(x);return b.set(i.id,{agentId:i.id,messages:[],loading:!1,hasMore:!1,totalCount:0}),b});return}try{const b=await(await Oe(ye(`/api/agents/${i.id}/history?limit=${Ee}&offset=0`))).json(),P=b.messages||[],W=P.length>0?Math.max(...P.map(w=>w.timestamp?new Date(w.timestamp).getTime():0)):0,Y=new Set(P.map(w=>w.uuid).filter(w=>!!w)),V=new Map;for(const w of P){if(w.type!=="user"&&w.type!=="assistant")continue;const o=$e(w.type,w.content),L=w.timestamp?new Date(w.timestamp).getTime():0,K=V.get(o)??0;L>K&&V.set(o,L)}const G=I.getOutputs(i.id),U=(k&&k.length>0?[...k,...G]:G).filter(w=>it(w,Y,V,W));I.clearOutputs(i.id);for(const w of U)I.addOutput(i.id,w);p(w=>{const o=new Map(w);return o.set(i.id,{agentId:i.id,messages:P,loading:!1,hasMore:b.hasMore||!1,totalCount:b.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 b of k)I.addOutput(i.id,b)}p(b=>{const P=new Map(b);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),N=t.useRef(f);R.current=a,N.current=f;const C=t.useCallback(async j=>{const h=R.current.get(j),v=N.current.get(j);if(!(h!=null&&h.sessionId)||!v||!v.hasMore)return;const u=v.messages.length;try{const i=await(await fetch(ye(`/api/agents/${j}/history?limit=${Ee}&offset=${u}`))).json();i.messages&&i.messages.length>0&&p(k=>{const $=new Map(k),x=k.get(j);return x&&$.set(j,{...x,messages:[...i.messages,...x.messages],hasMore:i.hasMore||!1}),$})}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:N,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,K=Math.min(o.scrollHeight,L);o.style.height=`${K}px`},[s,c,v]);const $=t.useCallback(async o=>{const L=o.clipboardData.items;for(const _ of L)if(_.type.startsWith("image/")){o.preventDefault();const F=_.getAsFile();if(F){const z=await C(F);z&&R(z)}return}const K=o.clipboardData.files;if(K.length>0){o.preventDefault();for(const _ of K){const F=await C(_);F&&R(F)}return}const B=o.clipboardData.getData("text"),te=(B.match(/\n/g)||[]).length+1;if(te>5){o.preventDefault();const F=`[Pasted text #${E(B)} +${te} lines]`,z=o.target,se=z.selectionStart||0,ae=z.selectionEnd||0,ne=s.slice(0,se)+F+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 K of L){const B=await C(K);B&&R(B)}D.current&&(D.current.value="")}},[C,R]),b=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=>{},[]),W=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",Q=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:()=>N(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:W,children:[e.jsx("button",{className:Q,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:b,onPaste:$,onMouseDown:P}):e.jsx("input",{ref:u,type:"text",placeholder:j,value:s,onChange:o=>a(o.target.value),onKeyDown:b,onPaste:$,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:N,onClearHistory:C}){const{t:E}=fe(["terminal","common"]),j=_e(s.id),h=t.useRef(null),[v,u]=t.useState(!1),D=t.useRef(0),i=t.useRef(!1),[k,$]=t.useState(!0),[x,b]=t.useState(!1),[P,W]=t.useState(null),[Y,V]=t.useState(null),[G,Q]=t.useState(null);Te(`commander-image-modal-${s.id}`,P!==null,()=>W(null));const{command:U,setCommand:w,forceTextarea:o,setForceTextarea:L,useTextarea:K,setPastedTexts:B,incrementPastedCount:te,resetPastedCount:_,attachedFiles:F,setAttachedFiles:z,removeAttachedFile:se,uploadFile:ae,expandPastedTexts:ne}=Be({selectedAgentId:s.id}),ce=U.trim().length>0||F.length>0,n=Ue({outputs:c,viewMode:d?"advanced":"simple"}),l=t.useMemo(()=>{const S=Ke(s);return{usedPercent:S.usedPercent,freePercent:S.freePercent,hasData:!!s.contextStats,totalTokens:S.totalTokens,contextWindow:S.contextWindow}},[s.contextStats,s.contextUsed,s.contextLimit]),g=t.useCallback(()=>{!v&&(a!=null&&a.hasMore)&&N&&(u(!0),D.current=h.current?h.current.scrollHeight-h.current.scrollTop:0,N())},[v,a==null?void 0:a.hasMore,N]);t.useEffect(()=>{v&&a&&!a.loading&&u(!1)},[a,v]);const m=t.useCallback(()=>{i.current=!0,$(!1)},[]),T=t.useRef(f),Z=t.useRef(p);t.useEffect(()=>{(f&&!T.current||p&&!Z.current)&&(i.current=!1,$(!0),b(!0)),T.current=f,Z.current=p},[f,p]);const ee=t.useRef(a==null?void 0:a.loading);t.useEffect(()=>{ee.current&&!(a!=null&&a.loading)&&(i.current=!1,$(!0),b(!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,ze=Ne-Fe-Le<=2;if(Math.abs(Ne-ue)<=1&&ze?H+=1:H=0,ue=Ne,H>=3){b(!1);return}if(performance.now()-y>5e3){b(!1);return}be=requestAnimationFrame(Re)};return be=requestAnimationFrame(Re),()=>cancelAnimationFrame(be)},[x]),t.useEffect(()=>{i.current||$(!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=>{z(y=>[...y,S])},[z]),xe=t.useCallback(()=>{if(!ce)return;if(U.trim()==="/clear"&&F.length===0){I.clearContext(s.id),C(),w(""),L(!1),B(new Map),z([]),_();return}let S=ne(U.trim());if(F.length>0){const y=F.map(H=>H.isImage?`[Image: ${H.path}]`:`[File: ${H.path}]`).join(`
|
|
3
3
|
`);S=S?`${S}
|
|
4
4
|
|