tide-commander 1.210.0 → 1.211.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 +15 -0
- package/dist/assets/{AudioPlayer-CElliTTR.js → AudioPlayer-BkW6rbHa.js} +1 -1
- package/dist/assets/{BossLogsModal-DO0Vs1lM.js → BossLogsModal-CWJfLRLA.js} +1 -1
- package/dist/assets/{BossSpawnModal-BuDifEmB.js → BossSpawnModal-DMxCXROC.js} +1 -1
- package/dist/assets/{ControlsModal-DPcrW0oK.js → ControlsModal-BaSSGPXP.js} +1 -1
- package/dist/assets/{DockerLogsModal-DaGU7BRb.js → DockerLogsModal-C_Nb5L_a.js} +1 -1
- package/dist/assets/{EmbeddedEditor-BFwoN_46.js → EmbeddedEditor-CG0ULJUZ.js} +1 -1
- package/dist/assets/{FcStdViewer-D0qXXGZb.js → FcStdViewer-BgEgrxaw.js} +1 -1
- package/dist/assets/{GcodeViewer-DqMtMidS.js → GcodeViewer-CTlX7eA7.js} +1 -1
- package/dist/assets/{GlbViewer-B3jqR181.js → GlbViewer-CKaX8cFI.js} +1 -1
- package/dist/assets/{GmailOAuthSetup-G3QuK-qX.js → GmailOAuthSetup-1AhXjBRc.js} +1 -1
- package/dist/assets/{GoogleOAuthSetup-dCjYnCta.js → GoogleOAuthSetup-DqPgZjOY.js} +1 -1
- package/dist/assets/{IframeModal-DYJCvfYE.js → IframeModal-ClN_kGcP.js} +1 -1
- package/dist/assets/{IntegrationsPanel-M73zpDQj.js → IntegrationsPanel-ckrmRwYi.js} +2 -2
- package/dist/assets/{LogViewerModal-IwhEcaYj.js → LogViewerModal-D_eGItAQ.js} +1 -1
- package/dist/assets/{MonitoringModal-k5DVlUx4.js → MonitoringModal-BrsQN8tD.js} +1 -1
- package/dist/assets/{PM2LogsModal-CK08IAnZ.js → PM2LogsModal-CKfdmFqw.js} +1 -1
- package/dist/assets/{PluginsPanel-DAmAgJvL.js → PluginsPanel-Bfqcnrsb.js} +1 -1
- package/dist/assets/{RestoreArchivedAreaModal-BCn-HylF.js → RestoreArchivedAreaModal-oZSTlXhf.js} +1 -1
- package/dist/assets/{Scene2DCanvas-DZ3LFW07.js → Scene2DCanvas-B2oTAqlK.js} +1 -1
- package/dist/assets/{SceneManager-aCcayL_T.js → SceneManager-pnDsJdS-.js} +1 -1
- package/dist/assets/{SkillsPanel-mr09RF0o.js → SkillsPanel-AQimvs-1.js} +1 -1
- package/dist/assets/{SlackMultiInstanceSetup-JSGJZGh6.js → SlackMultiInstanceSetup-U4d0XsWJ.js} +1 -1
- package/dist/assets/SpawnModal-DgKO0K6L.js +1 -0
- package/dist/assets/{StatisticsModal-DyUUvnxL.js → StatisticsModal-DDC8OYen.js} +1 -1
- package/dist/assets/{StlViewer-B0mqqtbi.js → StlViewer-DJZ7Qgp0.js} +1 -1
- package/dist/assets/{SubordinateAssignmentModal-C7XdTSBc.js → SubordinateAssignmentModal-DCM6PpB_.js} +1 -1
- package/dist/assets/{ThreeAreaSelector-Cxtggsnt.js → ThreeAreaSelector-CjEcL3Kh.js} +1 -1
- package/dist/assets/{ThreeViewShortcuts-BqvxjuDQ.js → ThreeViewShortcuts-UakjRD8w.js} +1 -1
- package/dist/assets/{TriggerManagerPanel-BnTWDT1K.js → TriggerManagerPanel-C42VLQu6.js} +1 -1
- package/dist/assets/{VideoPlayer-jknjvQg9.js → VideoPlayer-UW43AiLH.js} +1 -1
- package/dist/assets/{WorkflowEditorPanel-CvWwQ2Rk.js → WorkflowEditorPanel-DUvf5X0c.js} +1 -1
- package/dist/assets/{abnfDiagram-VRR7QNED-CUyx8tcg.js → abnfDiagram-VRR7QNED-KDmvD_Gi.js} +1 -1
- package/dist/assets/{arc-x9pqF0PL.js → arc-D8Dnwz7O.js} +1 -1
- package/dist/assets/{architectureDiagram-ZJ3FMSHR-BL9aDWOo.js → architectureDiagram-ZJ3FMSHR-DzHUfCXK.js} +1 -1
- package/dist/assets/{area-logos-Dr_ZUFxK.js → area-logos-JqUib9Ux.js} +1 -1
- package/dist/assets/{blockDiagram-677ZJIJ3-CaM55zZQ.js → blockDiagram-677ZJIJ3-CwOc3I3e.js} +1 -1
- package/dist/assets/{c4Diagram-LMCZKHZV-CCXnyLaP.js → c4Diagram-LMCZKHZV-ByDTz6Pi.js} +1 -1
- package/dist/assets/channel-C9DXs2xS.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-CUBfQrLS.js → chunk-2Q5K7J3B-CJ-5lUjr.js} +1 -1
- package/dist/assets/{chunk-32BRIVSS-CBsYvxtB.js → chunk-32BRIVSS-ClxbX6JR.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-D9K_iBqe.js → chunk-5VM5RSS4-D-B4g6BP.js} +1 -1
- package/dist/assets/{chunk-EX3LRPZG-BArv7wZg.js → chunk-EX3LRPZG-DE_ym6tm.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-nqIaplf_.js → chunk-JWPE2WC7-DbFNU_Ef.js} +1 -1
- package/dist/assets/{chunk-MOJQB5TN-D9-EvsXA.js → chunk-MOJQB5TN-BonkkykU.js} +1 -1
- package/dist/assets/{chunk-RYQCIY6F-DhEtjvXf.js → chunk-RYQCIY6F-CqaRznBG.js} +1 -1
- package/dist/assets/{chunk-V7JOEXUC-CloPxFmQ.js → chunk-V7JOEXUC-DI5OpSJo.js} +1 -1
- package/dist/assets/{chunk-VR4S4FIN-B_gj6T5J.js → chunk-VR4S4FIN-DzHJs5bu.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-CYQuP2YZ.js → chunk-XXDRQBXY-x9Zsg6mD.js} +1 -1
- package/dist/assets/classDiagram-OUVF2IWQ-apBPMHmB.js +1 -0
- package/dist/assets/classDiagram-v2-EOCWNBFH-apBPMHmB.js +1 -0
- package/dist/assets/{cose-bilkent-JH36ORCC-CnNLLImF.js → cose-bilkent-JH36ORCC-B4Gh0RgK.js} +1 -1
- package/dist/assets/{cynefin-VYW2F7L2-CIlHlZVD.js → cynefin-VYW2F7L2-1rocbocI.js} +1 -1
- package/dist/assets/{cynefinDiagram-TSTJHNR4-DhQrqCi2.js → cynefinDiagram-TSTJHNR4-BCbOrdTH.js} +1 -1
- package/dist/assets/{dagre-VKFMJZFB-XKh2Tzhw.js → dagre-VKFMJZFB-CquTDGCQ.js} +1 -1
- package/dist/assets/{diagram-FQU43EPY-C7LI8otY.js → diagram-FQU43EPY-CtRps2DK.js} +1 -1
- package/dist/assets/{diagram-G47NLZAW-BMBTikTC.js → diagram-G47NLZAW-C8uHzoun.js} +1 -1
- package/dist/assets/{diagram-NH7WQ7WH-BW_TXoVZ.js → diagram-NH7WQ7WH-BzGxTXmO.js} +1 -1
- package/dist/assets/{diagram-OA4YK3LP-PDlY_6C8.js → diagram-OA4YK3LP-BoUlY6He.js} +1 -1
- package/dist/assets/{diagram-WEI45ONY-svn0tX11.js → diagram-WEI45ONY-EewNkn4I.js} +1 -1
- package/dist/assets/{ebnfDiagram-CCIWWBDH-BUIULs-0.js → ebnfDiagram-CCIWWBDH-DAp0_rYI.js} +1 -1
- package/dist/assets/{erDiagram-Q63AITRT-BiLmEbtK.js → erDiagram-Q63AITRT-CIDiaIv_.js} +1 -1
- package/dist/assets/{flowDiagram-23GEKE2U-Mc6PRVJ8.js → flowDiagram-23GEKE2U-ZQudeco2.js} +1 -1
- package/dist/assets/{ganttDiagram-NO4QXBWP-BRUNbUed.js → ganttDiagram-NO4QXBWP-DDa9u7Kj.js} +1 -1
- package/dist/assets/{gitGraphDiagram-IHSO6WYX-ezzuOWgX.js → gitGraphDiagram-IHSO6WYX-D0LPqp_M.js} +1 -1
- package/dist/assets/{index-D_NWG6YH.js → index-BMILmzZt.js} +3 -3
- package/dist/assets/{index-CdgtzuJp.js → index-BuW-OFAQ.js} +1 -1
- package/dist/assets/{index-BfLoArjP.js → index-CM0wRsAP.js} +1 -1
- package/dist/assets/{index-DfYkUGiD.js → index-CbjaD3wY.js} +2 -2
- package/dist/assets/{index-D8VUtdAF.js → index-CgtrBMsu.js} +1 -1
- package/dist/assets/index-CmZ79Am7.js +2 -0
- package/dist/assets/{index-BhcdiVTj.js → index-D0O_xUmt.js} +1 -1
- package/dist/assets/{index-Y6_p8QBS.js → index-DjZWtEFJ.js} +1 -1
- package/dist/assets/{index-SspfO_Hv.js → index-tU947Zt1.js} +1 -1
- package/dist/assets/{infoDiagram-FWYZ7A6U-BlWhqgLQ.js → infoDiagram-FWYZ7A6U-CD4Ws76i.js} +1 -1
- package/dist/assets/{ishikawaDiagram-FXEZZL3T-C52xQkXn.js → ishikawaDiagram-FXEZZL3T-DSEmTd2f.js} +1 -1
- package/dist/assets/{journeyDiagram-5HDEW3XC-DyobJuKu.js → journeyDiagram-5HDEW3XC-3_c5LjHs.js} +1 -1
- package/dist/assets/{kanban-definition-HUTT4EX6-D3TWdW5B.js → kanban-definition-HUTT4EX6-24lijuGn.js} +1 -1
- package/dist/assets/{linear-kXdtPjWH.js → linear-B_K6Qcv3.js} +1 -1
- package/dist/assets/{main-BmGgLw1j.css → main-6EJsyrfW.css} +1 -1
- package/dist/assets/main-D0r07JA_.js +344 -0
- package/dist/assets/{mermaid.core-jkxx9VU-.js → mermaid.core-B6sgvfs-.js} +4 -4
- package/dist/assets/{mindmap-definition-LN4V7U3C-CbFsW2ye.js → mindmap-definition-LN4V7U3C-BsAOrAHj.js} +1 -1
- package/dist/assets/{pegDiagram-2B236MQR-D2nH_y6d.js → pegDiagram-2B236MQR-DdfupKz5.js} +1 -1
- package/dist/assets/{pieDiagram-ENE6RG2P-CaK3PEMJ.js → pieDiagram-ENE6RG2P-D1YBZYdK.js} +1 -1
- package/dist/assets/{quadrantDiagram-ABIIQ3AL-UgYM7N6C.js → quadrantDiagram-ABIIQ3AL-Bw-hoDGQ.js} +1 -1
- package/dist/assets/{railroadDiagram-RFXS5EU6-CC2ZEDL4.js → railroadDiagram-RFXS5EU6-CkmO-Wgv.js} +1 -1
- package/dist/assets/{requirementDiagram-TGXJPOKE-nlqWI7vA.js → requirementDiagram-TGXJPOKE-CSI19yqY.js} +1 -1
- package/dist/assets/{sankeyDiagram-HTMAVEWB-9uWggzcO.js → sankeyDiagram-HTMAVEWB-BvLYUk8J.js} +1 -1
- package/dist/assets/{sequenceDiagram-DBY2YBRQ-0p9VY0Wu.js → sequenceDiagram-DBY2YBRQ-DSQLX4Eb.js} +1 -1
- package/dist/assets/{sizeCapture-X5ZJPWSS-B2sHn0MG.js → sizeCapture-X5ZJPWSS-DfyzoJ-u.js} +1 -1
- package/dist/assets/{stateDiagram-2N3HPSRC-DpATBmQQ.js → stateDiagram-2N3HPSRC-G3bxzIPH.js} +1 -1
- package/dist/assets/stateDiagram-v2-6OUMAXLB-DCUADcVF.js +1 -0
- package/dist/assets/{swimlanes-5IMT3BWC-BPpym6MS.js → swimlanes-5IMT3BWC-CDZGonhF.js} +2 -2
- package/dist/assets/swimlanesDiagram-G3AALYLV-Ddwy1JnL.js +8 -0
- package/dist/assets/{timeline-definition-FHXFAJF6-SrMCxAjV.js → timeline-definition-FHXFAJF6-C5QDZq49.js} +1 -1
- package/dist/assets/{vennDiagram-L72KCM5P-_9HfkXQN.js → vennDiagram-L72KCM5P-0a1v0gi5.js} +1 -1
- package/dist/assets/{wardleyDiagram-EHGQE667-EnATDQOK.js → wardleyDiagram-EHGQE667-DArhtjvR.js} +1 -1
- package/dist/assets/{web-BkIE9AAN.js → web-BU7b4YVF.js} +1 -1
- package/dist/assets/{web-CB0hTO4y.js → web-BgCc_AGi.js} +1 -1
- package/dist/assets/{web-6vks_1wd.js → web-BiQ9JdSl.js} +1 -1
- package/dist/assets/{xychartDiagram-FW5EYKEG-DlMpFz7X.js → xychartDiagram-FW5EYKEG-BIZcXzGL.js} +1 -1
- package/dist/build-info.json +1 -1
- package/dist/index.html +2 -2
- package/dist/src/packages/server/data/builtin-skills/conversation-history.js +3 -2
- package/dist/src/packages/server/data/event-queries.js +16 -6
- package/dist/src/packages/server/data/migrations/009_whatsapp_participant_jid.sql +9 -0
- package/dist/src/packages/server/data/migrations/010_whatsapp_participant_alt_jid.sql +9 -0
- package/dist/src/packages/server/integrations/whatsapp/whatsapp-client.js +6 -2
- package/dist/src/packages/server/integrations/whatsapp/whatsapp-routes.js +103 -2
- package/dist/src/packages/server/integrations/whatsapp/whatsapp-skill.js +11 -0
- package/dist/src/packages/server/integrations/whatsapp/whatsapp-trigger-handler.js +48 -5
- package/dist/src/packages/server/routes/event-routes.js +2 -0
- package/dist/src/packages/server/routes/files.js +169 -0
- package/package.json +1 -1
- package/dist/assets/SpawnModal-Rduhhunw.js +0 -1
- package/dist/assets/channel-W4AeOLhF.js +0 -1
- package/dist/assets/classDiagram-OUVF2IWQ-39XSHTF2.js +0 -1
- package/dist/assets/classDiagram-v2-EOCWNBFH-39XSHTF2.js +0 -1
- package/dist/assets/index-C9Axek5A.js +0 -2
- package/dist/assets/main-Bt4E0_YW.js +0 -344
- package/dist/assets/stateDiagram-v2-6OUMAXLB-CQH1oSae.js +0 -1
- package/dist/assets/swimlanesDiagram-G3AALYLV-BhNebkPx.js +0 -8
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/EmbeddedEditor-
|
|
2
|
-
import{r as s,c as V,d as A,Q as It,cE as Yn,cF as qn,b2 as Qs,S as Ot,b3 as Zs,s as Ve,u as ie,j as e,I as D,cl as Ut,bm as en,cG as tn,a2 as rs,cH as sn,cI as nn,cJ as Xn,cK as Qn,aA as zt,cL as Zn,cM as ea,cN as ta,a9 as ct,cO as sa,cP as is,cQ as na,cR as an,cS as rn,cT as ln,cU as Ht,cV as At,bl as lt,cW as bt,cX as jt,cY as Us,cZ as aa,a5 as ra,ck as as,a1 as ia,c_ as la,c$ as oa,d0 as Lt,d1 as ca,d2 as da,d3 as ua,d4 as ha,c9 as ma,d5 as pa,d6 as Gs,_ as fa,ax as ga}from"./main-Bt4E0_YW.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DYBBrXTx.js";function xa(t){const[n,l]=s.useState(null),[c,r]=s.useState(!1),i=s.useCallback(async()=>{if(t){r(!0);try{const h=await V(A(`/api/files/git-status?path=${encodeURIComponent(t)}`)),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{r(!1)}}},[t]);return{gitStatus:n,loading:c,loadGitStatus:i}}async function ya(t){try{const n=await V(A(`/api/files/git-original?path=${encodeURIComponent(t)}`)),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 ba=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",""]),ja=new Set([".png",".jpg",".jpeg",".gif",".webp",".bmp",".ico",".svg"]),va=new Set([".pdf"]),wa=new Set([".xlsx",".xls",".docx",".doc",".pptx",".ppt",".zip",".tar",".gz",".rar",".7z",".exe",".dmg",".app",".deb",".rpm",".apk",".aab",".ipa",".msi",".ttf",".otf",".woff",".woff2",".eot",".sqlite",".db",".so",".dll",".dylib",".a",".o",".obj",".bin",".dat",".iso",".img",".jar",".war",".ear",".class"]);function Ca(t){const n=t.toLowerCase();return ja.has(n)?"image":va.has(n)?"pdf":Yn(n)?"audio":qn(n)?"video":wa.has(n)?"binary":(ba.has(n),"text")}function Na(){const[t,n]=s.useState(null),[l,c]=s.useState(!1),[r,i]=s.useState(null),h=s.useCallback(async d=>{var g,b;c(!0),i(null);try{const p=d.substring(d.lastIndexOf(".")).toLowerCase(),v=Ca(p),k=d.substring(d.lastIndexOf("/")+1);if(v==="image"){const E=await V(A(`/api/files/binary?path=${encodeURIComponent(d)}`));if(!E.ok){const C=await E.json().catch(()=>({error:"Failed to load image"}));i(C.error||"Failed to load image"),n(null);return}const f=await E.blob(),j=URL.createObjectURL(f);n({path:d,filename:k,extension:p,content:"",size:f.size,modified:new Date().toISOString(),fileType:"image",dataUrl:j});return}if(v==="pdf"){const E=await V(A(`/api/files/info?path=${encodeURIComponent(d)}`)),f=await E.json();if(!E.ok){i(f.error||"Failed to load PDF info"),n(null);return}n({path:d,filename:k,extension:p,content:"",size:f.size,modified:f.modified,fileType:"pdf",dataUrl:A(`/api/files/binary?path=${encodeURIComponent(d)}&token=${encodeURIComponent(It())}`)});return}if(v==="audio"||v==="video"){const E=await V(A(`/api/files/info?path=${encodeURIComponent(d)}`)),f=await E.json();if(!E.ok){i(f.error||"Failed to load media info"),n(null);return}const j=v==="video"?`&token=${encodeURIComponent(It())}`:"";n({path:d,filename:k,extension:p,content:"",size:f.size,modified:f.modified,fileType:v,dataUrl:A(`/api/files/binary?path=${encodeURIComponent(d)}${j}`)});return}if(v==="binary"){const E=await V(A(`/api/files/info?path=${encodeURIComponent(d)}`)),f=await E.json();if(!E.ok){i(f.error||"Failed to load file info"),n(null);return}n({path:d,filename:k,extension:p,content:"",size:f.size,modified:f.modified,fileType:"binary",dataUrl:A(`/api/files/binary?path=${encodeURIComponent(d)}&download=true&token=${encodeURIComponent(It())}`)});return}const F=await V(A(`/api/files/read?path=${encodeURIComponent(d)}`)),y=await F.json();if(!F.ok){if((g=y.error)!=null&&g.includes("too large")||(b=y.error)!=null&&b.includes("binary")){const E=await V(A(`/api/files/info?path=${encodeURIComponent(d)}`)),f=await E.json();if(E.ok){n({path:d,filename:k,extension:p,content:"",size:f.size,modified:f.modified,fileType:"binary",dataUrl:A(`/api/files/binary?path=${encodeURIComponent(d)}&download=true&token=${encodeURIComponent(It())}`)});return}}i(y.error||"Failed to load file"),n(null);return}n({...y,fileType:"text"})}catch(p){const v=p instanceof Error?p.message:"Failed to load file";i(v),n(null)}finally{c(!1)}},[]),o=s.useCallback(()=>{n(d=>(d!=null&&d.dataUrl&&d.dataUrl.startsWith("blob:")&&URL.revokeObjectURL(d.dataUrl),null)),i(null)},[]);return{file:t,loading:l,error:r,loadFile:h,clearFile:o,setFile:n}}const ka="file-explorer-state",_s="file-explorer-recent-projects",Ea=10080*60*1e3,Sa=12;function ts(t){return`${ka}-folder-${t}`}async function Ta(t){try{const n=await V(A(`/api/files/exists?path=${encodeURIComponent(t)}`));return n.ok?(await n.json()).exists===!0:!1}catch{return!1}}function Da(){const t=s.useCallback(async r=>{if(!r)return null;try{const i=localStorage.getItem(ts(r));if(!i)return null;const h=JSON.parse(i);if(Date.now()-h.timestamp>Ea)return localStorage.removeItem(ts(r)),null;const d=(await Promise.all((h.tabs||[]).map(async b=>({tab:b,exists:await Ta(b.path)})))).filter(({exists:b})=>b).map(({tab:b})=>b);let g=h.activeTabPath;return g&&!d.some(b=>b.path===g)&&(g=d.length>0?d[0].path:null),{tabs:d,activeTabPath:g,viewMode:h.viewMode||"files",expandedPaths:new Set(h.expandedPaths||[])}}catch(i){return console.error("[FileExplorerStorage] Failed to load project state:",i),null}},[]),n=s.useCallback((r,i)=>{if(r)try{const h={tabs:i.tabs,activeTabPath:i.activeTabPath,viewMode:i.viewMode,expandedPaths:Array.from(i.expandedPaths),timestamp:Date.now()};localStorage.setItem(ts(r),JSON.stringify(h))}catch(h){console.error("[FileExplorerStorage] Failed to save project state:",h)}},[]),l=s.useCallback(()=>{try{const r=localStorage.getItem(_s);if(!r)return[];const i=JSON.parse(r);return Array.isArray(i)?i.filter(h=>typeof h=="string"):[]}catch{return[]}},[]),c=s.useCallback(r=>{if(!r)return l();const i=[r,...l().filter(h=>h!==r)].slice(0,Sa);try{localStorage.setItem(_s,JSON.stringify(i))}catch{}return i},[l]);return{loadProjectState:t,saveProjectState:n,loadRecentProjects:l,pushRecentProject:c}}const Bs=280,Vs=150,Ks=1200;function Ma(){const[t,n]=s.useState(()=>{const g=Qs(Ot.TREE_PANEL_WIDTH,Bs);return g>=Vs&&g<=Ks?g:Bs}),l=s.useRef(!1),[c,r]=s.useState(!1),i=s.useRef(0),h=s.useRef(0),o=s.useRef(t);o.current=t;const d=s.useCallback(g=>{g.preventDefault(),l.current=!0,r(!0),i.current=g.clientX,h.current=t,document.body.style.cursor="ew-resize",document.body.style.userSelect="none"},[t]);return s.useEffect(()=>{const g=p=>{if(!l.current)return;const v=p.clientX-i.current,k=Math.min(Ks,Math.max(Vs,h.current+v));n(k)},b=()=>{l.current&&(l.current=!1,r(!1),document.body.style.cursor="",document.body.style.userSelect="",Zs(Ot.TREE_PANEL_WIDTH,o.current))};return document.addEventListener("mousemove",g),document.addEventListener("mouseup",b),()=>{document.removeEventListener("mousemove",g),document.removeEventListener("mouseup",b)}},[]),{treePanelWidth:t,handleResizeStart:d,isResizing:c}}const Ra=100,Fa=.65,Pa=36;function Ia(){const[t,n]=s.useState(()=>Qs(Ot.MOBILE_TREE_PANEL_HEIGHT,0)),l=s.useRef(t);l.current=t;const c=s.useRef(0),r=s.useRef(0),i=()=>Math.floor((window.innerHeight-Pa)*Fa),h=p=>Math.min(i(),Math.max(Ra,p)),o=s.useCallback(p=>{n(p);const v=document.querySelector(".file-explorer-main");v&&v.style.setProperty("--fe-mobile-tree-height",`${p}px`)},[]),d=s.useCallback(()=>{document.body.style.cursor="",document.body.style.userSelect="",Zs(Ot.MOBILE_TREE_PANEL_HEIGHT,l.current),Ve.setTerminalResizing(!1)},[]),g=s.useCallback(p=>{p.preventDefault();const v=document.querySelector(".file-explorer-tree-panel"),k=l.current>0?l.current:(v==null?void 0:v.getBoundingClientRect().height)??240;c.current=p.clientY,r.current=k,document.body.style.cursor="ns-resize",document.body.style.userSelect="none",Ve.setTerminalResizing(!0);const F=E=>{const f=E.clientY-c.current;o(h(r.current+f))},y=()=>{document.removeEventListener("mousemove",F),document.removeEventListener("mouseup",y),d()};document.addEventListener("mousemove",F),document.addEventListener("mouseup",y)},[o,d]),b=s.useCallback(p=>{if(p.touches.length!==1)return;const v=document.querySelector(".file-explorer-tree-panel"),k=l.current>0?l.current:(v==null?void 0:v.getBoundingClientRect().height)??240;c.current=p.touches[0].clientY,r.current=k,document.body.style.cursor="ns-resize",document.body.style.userSelect="none",Ve.setTerminalResizing(!0);const F=E=>{if(E.touches.length!==1)return;E.preventDefault();const f=E.touches[0].clientY-c.current;o(h(r.current+f))},y=()=>{document.removeEventListener("touchmove",F),document.removeEventListener("touchend",y),document.removeEventListener("touchcancel",y),d()};document.addEventListener("touchmove",F,{passive:!1}),document.addEventListener("touchend",y),document.addEventListener("touchcancel",y)},[o,d]);return{mobileTreeHeight:t,handleResizeMouseDown:g,handleResizeTouchStart:b}}function ls(){const[t,n]=s.useState([]),[l,c]=s.useState(!1),[r,i]=s.useState(null),[h,o]=s.useState(null),d=s.useCallback(async E=>{c(!0),i(null);try{const f=await V(A(`/api/files/git-branches?path=${encodeURIComponent(E)}`)),j=await f.json();f.ok?n(j.branches||[]):(i(j.error||"Failed to load branches"),n([]))}catch(f){console.error("[GitBranches] Failed to load branches:",f),i("Failed to load branches"),n([])}finally{c(!1)}},[]),g=s.useCallback(async(E,f)=>{o("checkout"),i(null);try{const j=await V(A("/api/files/git-checkout"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:E,branch:f})}),C=await j.json();return j.ok||i(C.error||"Checkout failed"),C}catch(j){console.error("[GitBranches] Checkout failed:",j);const C={success:!1,error:"Checkout failed"};return i(C.error),C}finally{o(null)}},[]),b=s.useCallback(async(E,f,j)=>{o("create"),i(null);try{const C=await V(A("/api/files/git-branch-create"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:E,name:f,startPoint:j})}),M=await C.json();return C.ok||i(M.error||"Failed to create branch"),M}catch(C){console.error("[GitBranches] Create branch failed:",C);const M={success:!1,error:"Failed to create branch"};return i(M.error),M}finally{o(null)}},[]),p=s.useCallback(async E=>{o("pull"),i(null);try{const f=await V(A("/api/files/git-pull"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:E})}),j=await f.json();return!f.ok&&!j.conflicts&&i(j.error||"Pull failed"),j}catch(f){console.error("[GitBranches] Pull failed:",f);const j={success:!1,error:"Pull failed"};return i(j.error),j}finally{o(null)}},[]),v=s.useCallback(async E=>{o("push"),i(null);try{const f=await V(A("/api/files/git-push"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:E})}),j=await f.json();return f.ok||i(j.error||"Push failed"),j}catch(f){console.error("[GitBranches] Push failed:",f);const j={success:!1,error:"Push failed"};return i(j.error),j}finally{o(null)}},[]),k=s.useCallback(async(E,f)=>{o("merge"),i(null);try{const j=await V(A("/api/files/git-merge"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:E,branch:f})}),C=await j.json();return!j.ok&&!C.conflicts&&i(C.error||"Merge failed"),C}catch(j){console.error("[GitBranches] Merge failed:",j);const C={success:!1,error:"Merge failed"};return i(C.error),C}finally{o(null)}},[]),F=s.useCallback(async E=>{o("merge-abort"),i(null);try{const f=await V(A("/api/files/git-merge-abort"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:E})}),j=await f.json();return f.ok||i(j.error||"Merge abort failed"),j}catch(f){console.error("[GitBranches] Merge abort failed:",f);const j={success:!1,error:"Merge abort failed"};return i(j.error),j}finally{o(null)}},[]),y=s.useCallback(async E=>{o("merge-continue"),i(null);try{const f=await V(A("/api/files/git-merge-continue"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:E})}),j=await f.json();return f.ok||i(j.error||"Merge continue failed"),j}catch(f){console.error("[GitBranches] Merge continue failed:",f);const j={success:!1,error:"Merge continue failed"};return i(j.error),j}finally{o(null)}},[]);return{branches:t,loading:l,error:r,operationInProgress:h,loadBranches:d,checkoutBranch:g,createBranch:b,pullFromRemote:p,pushToRemote:v,mergeBranch:k,mergeAbort:F,mergeContinue:y}}const La=50,$a=400,Ws={branch:"",author:"",since:"",until:"",searchPath:"",search:""};function za(){const[t,n]=s.useState([]),[l,c]=s.useState(!1),[r,i]=s.useState(!1),[h,o]=s.useState(null),[d,g]=s.useState(!1),[b,p]=s.useState(0),[v,k]=s.useState({...Ws}),[F,y]=s.useState(null),[E,f]=s.useState([]),[j,C]=s.useState(!1),[M,H]=s.useState([]),[G,K]=s.useState(!1),w=s.useRef(null),re=s.useRef(""),_=s.useCallback((U,se,I)=>{const B=I||v,Z=new URLSearchParams;return Z.set("path",U),Z.set("limit",String(La)),Z.set("offset",String(se)),B.branch&&Z.set("branch",B.branch),B.author&&Z.set("author",B.author),B.since&&Z.set("since",B.since),B.until&&Z.set("until",B.until),B.searchPath&&Z.set("searchPath",B.searchPath),B.search&&Z.set("search",B.search),Z.toString()},[v]),R=s.useCallback(async U=>{re.current=U,c(!0),o(null),y(null),f([]);try{const se=_(U,0),I=await V(A(`/api/files/git-log?${se}`)),B=await I.json();I.ok?(n(B.commits||[]),p(B.total||0),g(B.hasMore||!1)):(o(B.error||"Failed to load git history"),n([]))}catch(se){console.error("[useGitHistory] loadHistory error:",se),o("Failed to load git history"),n([])}finally{c(!1)}},[_]),P=s.useCallback(async U=>{if(!(r||!d)){i(!0);try{const se=_(U,t.length),I=await V(A(`/api/files/git-log?${se}`)),B=await I.json();I.ok&&(n(Z=>[...Z,...B.commits||[]]),p(B.total||0),g(B.hasMore||!1))}catch(se){console.error("[useGitHistory] loadMore error:",se)}finally{i(!1)}}},[_,t.length,d,r]),X=s.useCallback(async U=>{if(y(U),!U){f([]);return}C(!0);try{const se=re.current,I=new URLSearchParams({path:se,hash:U.hash}),B=await V(A(`/api/files/git-commit-files?${I}`)),Z=await B.json();B.ok?f(Z.files||[]):f([])}catch(se){console.error("[useGitHistory] selectCommit files error:",se),f([])}finally{C(!1)}},[]),Q=s.useCallback((U,se)=>{k(I=>({...I,[U]:se}))},[]),ne=s.useCallback(()=>{k({...Ws})},[]);s.useEffect(()=>{const U=re.current;if(U)return w.current&&clearTimeout(w.current),w.current=setTimeout(()=>{R(U)},$a),()=>{w.current&&clearTimeout(w.current)}},[v]);const ue=s.useCallback(async U=>{K(!0);try{const se=new URLSearchParams({path:U}),I=await V(A(`/api/files/git-authors?${se}`)),B=await I.json();I.ok&&H(B.authors||[])}catch(se){console.error("[useGitHistory] loadAuthors error:",se)}finally{K(!1)}},[]);return{commits:t,loading:l,loadingMore:r,error:h,hasMore:d,total:b,filters:v,setFilter:Q,resetFilters:ne,selectedCommit:F,selectCommit:X,commitFiles:E,commitFilesLoading:j,loadHistory:R,loadMore:P,authors:M,authorsLoading:G,loadAuthors:ue}}function Ha(t){if(!t.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=t.current.querySelector(l);if(c&&Js(c))return c}return Js(t.current)?t.current:null}function Js(t){const n=["auto","scroll"].includes(getComputedStyle(t).overflowY),l=t.scrollHeight>t.clientHeight||t.scrollWidth>t.clientWidth;return n&&l}function on(t){if(!t)return 19.5;const n=parseFloat(getComputedStyle(t).lineHeight);return isNaN(n)?19.5:n}function ss(t,n=!0){const l=n?t.scrollHeight:0;t.scrollTo({top:l,behavior:"smooth"})}function Aa(t){const{scrollTop:n,scrollHeight:l,clientHeight:c}=t;return l<=c?100:Math.round(n/(l-c)*100)}function Oa(t,n){const l=on(t),c=t.scrollTop,r=Math.floor(c/l)+1,i=n.split(`
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/EmbeddedEditor-CG0ULJUZ.js","assets/main-D0r07JA_.js","assets/vendor-react--Eh9ivFN.js","assets/vendor-three-DYBBrXTx.js","assets/main-6EJsyrfW.css","assets/EmbeddedEditor-BipHj7Fz.css","assets/AudioPlayer-BkW6rbHa.js","assets/VideoPlayer-UW43AiLH.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as s,c as V,d as A,Q as It,cE as Yn,cF as qn,b2 as Qs,S as Ot,b3 as Zs,s as Ve,u as ie,j as e,I as D,cl as Ut,bm as en,cG as tn,a2 as rs,cH as sn,cI as nn,cJ as Xn,cK as Qn,aA as zt,cL as Zn,cM as ea,cN as ta,a9 as ct,cO as sa,cP as is,cQ as na,cR as an,cS as rn,cT as ln,cU as Ht,cV as At,bl as lt,cW as bt,cX as jt,cY as Us,cZ as aa,a5 as ra,ck as as,a1 as ia,c_ as la,c$ as oa,d0 as Lt,d1 as ca,d2 as da,d3 as ua,d4 as ha,c9 as ma,d5 as pa,d6 as Gs,_ as fa,ax as ga}from"./main-D0r07JA_.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DYBBrXTx.js";function xa(t){const[n,l]=s.useState(null),[c,r]=s.useState(!1),i=s.useCallback(async()=>{if(t){r(!0);try{const h=await V(A(`/api/files/git-status?path=${encodeURIComponent(t)}`)),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{r(!1)}}},[t]);return{gitStatus:n,loading:c,loadGitStatus:i}}async function ya(t){try{const n=await V(A(`/api/files/git-original?path=${encodeURIComponent(t)}`)),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 ba=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",""]),ja=new Set([".png",".jpg",".jpeg",".gif",".webp",".bmp",".ico",".svg"]),va=new Set([".pdf"]),wa=new Set([".xlsx",".xls",".docx",".doc",".pptx",".ppt",".zip",".tar",".gz",".rar",".7z",".exe",".dmg",".app",".deb",".rpm",".apk",".aab",".ipa",".msi",".ttf",".otf",".woff",".woff2",".eot",".sqlite",".db",".so",".dll",".dylib",".a",".o",".obj",".bin",".dat",".iso",".img",".jar",".war",".ear",".class"]);function Ca(t){const n=t.toLowerCase();return ja.has(n)?"image":va.has(n)?"pdf":Yn(n)?"audio":qn(n)?"video":wa.has(n)?"binary":(ba.has(n),"text")}function Na(){const[t,n]=s.useState(null),[l,c]=s.useState(!1),[r,i]=s.useState(null),h=s.useCallback(async d=>{var g,b;c(!0),i(null);try{const p=d.substring(d.lastIndexOf(".")).toLowerCase(),v=Ca(p),k=d.substring(d.lastIndexOf("/")+1);if(v==="image"){const E=await V(A(`/api/files/binary?path=${encodeURIComponent(d)}`));if(!E.ok){const C=await E.json().catch(()=>({error:"Failed to load image"}));i(C.error||"Failed to load image"),n(null);return}const f=await E.blob(),j=URL.createObjectURL(f);n({path:d,filename:k,extension:p,content:"",size:f.size,modified:new Date().toISOString(),fileType:"image",dataUrl:j});return}if(v==="pdf"){const E=await V(A(`/api/files/info?path=${encodeURIComponent(d)}`)),f=await E.json();if(!E.ok){i(f.error||"Failed to load PDF info"),n(null);return}n({path:d,filename:k,extension:p,content:"",size:f.size,modified:f.modified,fileType:"pdf",dataUrl:A(`/api/files/binary?path=${encodeURIComponent(d)}&token=${encodeURIComponent(It())}`)});return}if(v==="audio"||v==="video"){const E=await V(A(`/api/files/info?path=${encodeURIComponent(d)}`)),f=await E.json();if(!E.ok){i(f.error||"Failed to load media info"),n(null);return}const j=v==="video"?`&token=${encodeURIComponent(It())}`:"";n({path:d,filename:k,extension:p,content:"",size:f.size,modified:f.modified,fileType:v,dataUrl:A(`/api/files/binary?path=${encodeURIComponent(d)}${j}`)});return}if(v==="binary"){const E=await V(A(`/api/files/info?path=${encodeURIComponent(d)}`)),f=await E.json();if(!E.ok){i(f.error||"Failed to load file info"),n(null);return}n({path:d,filename:k,extension:p,content:"",size:f.size,modified:f.modified,fileType:"binary",dataUrl:A(`/api/files/binary?path=${encodeURIComponent(d)}&download=true&token=${encodeURIComponent(It())}`)});return}const F=await V(A(`/api/files/read?path=${encodeURIComponent(d)}`)),y=await F.json();if(!F.ok){if((g=y.error)!=null&&g.includes("too large")||(b=y.error)!=null&&b.includes("binary")){const E=await V(A(`/api/files/info?path=${encodeURIComponent(d)}`)),f=await E.json();if(E.ok){n({path:d,filename:k,extension:p,content:"",size:f.size,modified:f.modified,fileType:"binary",dataUrl:A(`/api/files/binary?path=${encodeURIComponent(d)}&download=true&token=${encodeURIComponent(It())}`)});return}}i(y.error||"Failed to load file"),n(null);return}n({...y,fileType:"text"})}catch(p){const v=p instanceof Error?p.message:"Failed to load file";i(v),n(null)}finally{c(!1)}},[]),o=s.useCallback(()=>{n(d=>(d!=null&&d.dataUrl&&d.dataUrl.startsWith("blob:")&&URL.revokeObjectURL(d.dataUrl),null)),i(null)},[]);return{file:t,loading:l,error:r,loadFile:h,clearFile:o,setFile:n}}const ka="file-explorer-state",_s="file-explorer-recent-projects",Ea=10080*60*1e3,Sa=12;function ts(t){return`${ka}-folder-${t}`}async function Ta(t){try{const n=await V(A(`/api/files/exists?path=${encodeURIComponent(t)}`));return n.ok?(await n.json()).exists===!0:!1}catch{return!1}}function Da(){const t=s.useCallback(async r=>{if(!r)return null;try{const i=localStorage.getItem(ts(r));if(!i)return null;const h=JSON.parse(i);if(Date.now()-h.timestamp>Ea)return localStorage.removeItem(ts(r)),null;const d=(await Promise.all((h.tabs||[]).map(async b=>({tab:b,exists:await Ta(b.path)})))).filter(({exists:b})=>b).map(({tab:b})=>b);let g=h.activeTabPath;return g&&!d.some(b=>b.path===g)&&(g=d.length>0?d[0].path:null),{tabs:d,activeTabPath:g,viewMode:h.viewMode||"files",expandedPaths:new Set(h.expandedPaths||[])}}catch(i){return console.error("[FileExplorerStorage] Failed to load project state:",i),null}},[]),n=s.useCallback((r,i)=>{if(r)try{const h={tabs:i.tabs,activeTabPath:i.activeTabPath,viewMode:i.viewMode,expandedPaths:Array.from(i.expandedPaths),timestamp:Date.now()};localStorage.setItem(ts(r),JSON.stringify(h))}catch(h){console.error("[FileExplorerStorage] Failed to save project state:",h)}},[]),l=s.useCallback(()=>{try{const r=localStorage.getItem(_s);if(!r)return[];const i=JSON.parse(r);return Array.isArray(i)?i.filter(h=>typeof h=="string"):[]}catch{return[]}},[]),c=s.useCallback(r=>{if(!r)return l();const i=[r,...l().filter(h=>h!==r)].slice(0,Sa);try{localStorage.setItem(_s,JSON.stringify(i))}catch{}return i},[l]);return{loadProjectState:t,saveProjectState:n,loadRecentProjects:l,pushRecentProject:c}}const Bs=280,Vs=150,Ks=1200;function Ma(){const[t,n]=s.useState(()=>{const g=Qs(Ot.TREE_PANEL_WIDTH,Bs);return g>=Vs&&g<=Ks?g:Bs}),l=s.useRef(!1),[c,r]=s.useState(!1),i=s.useRef(0),h=s.useRef(0),o=s.useRef(t);o.current=t;const d=s.useCallback(g=>{g.preventDefault(),l.current=!0,r(!0),i.current=g.clientX,h.current=t,document.body.style.cursor="ew-resize",document.body.style.userSelect="none"},[t]);return s.useEffect(()=>{const g=p=>{if(!l.current)return;const v=p.clientX-i.current,k=Math.min(Ks,Math.max(Vs,h.current+v));n(k)},b=()=>{l.current&&(l.current=!1,r(!1),document.body.style.cursor="",document.body.style.userSelect="",Zs(Ot.TREE_PANEL_WIDTH,o.current))};return document.addEventListener("mousemove",g),document.addEventListener("mouseup",b),()=>{document.removeEventListener("mousemove",g),document.removeEventListener("mouseup",b)}},[]),{treePanelWidth:t,handleResizeStart:d,isResizing:c}}const Ra=100,Fa=.65,Pa=36;function Ia(){const[t,n]=s.useState(()=>Qs(Ot.MOBILE_TREE_PANEL_HEIGHT,0)),l=s.useRef(t);l.current=t;const c=s.useRef(0),r=s.useRef(0),i=()=>Math.floor((window.innerHeight-Pa)*Fa),h=p=>Math.min(i(),Math.max(Ra,p)),o=s.useCallback(p=>{n(p);const v=document.querySelector(".file-explorer-main");v&&v.style.setProperty("--fe-mobile-tree-height",`${p}px`)},[]),d=s.useCallback(()=>{document.body.style.cursor="",document.body.style.userSelect="",Zs(Ot.MOBILE_TREE_PANEL_HEIGHT,l.current),Ve.setTerminalResizing(!1)},[]),g=s.useCallback(p=>{p.preventDefault();const v=document.querySelector(".file-explorer-tree-panel"),k=l.current>0?l.current:(v==null?void 0:v.getBoundingClientRect().height)??240;c.current=p.clientY,r.current=k,document.body.style.cursor="ns-resize",document.body.style.userSelect="none",Ve.setTerminalResizing(!0);const F=E=>{const f=E.clientY-c.current;o(h(r.current+f))},y=()=>{document.removeEventListener("mousemove",F),document.removeEventListener("mouseup",y),d()};document.addEventListener("mousemove",F),document.addEventListener("mouseup",y)},[o,d]),b=s.useCallback(p=>{if(p.touches.length!==1)return;const v=document.querySelector(".file-explorer-tree-panel"),k=l.current>0?l.current:(v==null?void 0:v.getBoundingClientRect().height)??240;c.current=p.touches[0].clientY,r.current=k,document.body.style.cursor="ns-resize",document.body.style.userSelect="none",Ve.setTerminalResizing(!0);const F=E=>{if(E.touches.length!==1)return;E.preventDefault();const f=E.touches[0].clientY-c.current;o(h(r.current+f))},y=()=>{document.removeEventListener("touchmove",F),document.removeEventListener("touchend",y),document.removeEventListener("touchcancel",y),d()};document.addEventListener("touchmove",F,{passive:!1}),document.addEventListener("touchend",y),document.addEventListener("touchcancel",y)},[o,d]);return{mobileTreeHeight:t,handleResizeMouseDown:g,handleResizeTouchStart:b}}function ls(){const[t,n]=s.useState([]),[l,c]=s.useState(!1),[r,i]=s.useState(null),[h,o]=s.useState(null),d=s.useCallback(async E=>{c(!0),i(null);try{const f=await V(A(`/api/files/git-branches?path=${encodeURIComponent(E)}`)),j=await f.json();f.ok?n(j.branches||[]):(i(j.error||"Failed to load branches"),n([]))}catch(f){console.error("[GitBranches] Failed to load branches:",f),i("Failed to load branches"),n([])}finally{c(!1)}},[]),g=s.useCallback(async(E,f)=>{o("checkout"),i(null);try{const j=await V(A("/api/files/git-checkout"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:E,branch:f})}),C=await j.json();return j.ok||i(C.error||"Checkout failed"),C}catch(j){console.error("[GitBranches] Checkout failed:",j);const C={success:!1,error:"Checkout failed"};return i(C.error),C}finally{o(null)}},[]),b=s.useCallback(async(E,f,j)=>{o("create"),i(null);try{const C=await V(A("/api/files/git-branch-create"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:E,name:f,startPoint:j})}),M=await C.json();return C.ok||i(M.error||"Failed to create branch"),M}catch(C){console.error("[GitBranches] Create branch failed:",C);const M={success:!1,error:"Failed to create branch"};return i(M.error),M}finally{o(null)}},[]),p=s.useCallback(async E=>{o("pull"),i(null);try{const f=await V(A("/api/files/git-pull"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:E})}),j=await f.json();return!f.ok&&!j.conflicts&&i(j.error||"Pull failed"),j}catch(f){console.error("[GitBranches] Pull failed:",f);const j={success:!1,error:"Pull failed"};return i(j.error),j}finally{o(null)}},[]),v=s.useCallback(async E=>{o("push"),i(null);try{const f=await V(A("/api/files/git-push"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:E})}),j=await f.json();return f.ok||i(j.error||"Push failed"),j}catch(f){console.error("[GitBranches] Push failed:",f);const j={success:!1,error:"Push failed"};return i(j.error),j}finally{o(null)}},[]),k=s.useCallback(async(E,f)=>{o("merge"),i(null);try{const j=await V(A("/api/files/git-merge"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:E,branch:f})}),C=await j.json();return!j.ok&&!C.conflicts&&i(C.error||"Merge failed"),C}catch(j){console.error("[GitBranches] Merge failed:",j);const C={success:!1,error:"Merge failed"};return i(C.error),C}finally{o(null)}},[]),F=s.useCallback(async E=>{o("merge-abort"),i(null);try{const f=await V(A("/api/files/git-merge-abort"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:E})}),j=await f.json();return f.ok||i(j.error||"Merge abort failed"),j}catch(f){console.error("[GitBranches] Merge abort failed:",f);const j={success:!1,error:"Merge abort failed"};return i(j.error),j}finally{o(null)}},[]),y=s.useCallback(async E=>{o("merge-continue"),i(null);try{const f=await V(A("/api/files/git-merge-continue"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:E})}),j=await f.json();return f.ok||i(j.error||"Merge continue failed"),j}catch(f){console.error("[GitBranches] Merge continue failed:",f);const j={success:!1,error:"Merge continue failed"};return i(j.error),j}finally{o(null)}},[]);return{branches:t,loading:l,error:r,operationInProgress:h,loadBranches:d,checkoutBranch:g,createBranch:b,pullFromRemote:p,pushToRemote:v,mergeBranch:k,mergeAbort:F,mergeContinue:y}}const La=50,$a=400,Ws={branch:"",author:"",since:"",until:"",searchPath:"",search:""};function za(){const[t,n]=s.useState([]),[l,c]=s.useState(!1),[r,i]=s.useState(!1),[h,o]=s.useState(null),[d,g]=s.useState(!1),[b,p]=s.useState(0),[v,k]=s.useState({...Ws}),[F,y]=s.useState(null),[E,f]=s.useState([]),[j,C]=s.useState(!1),[M,H]=s.useState([]),[G,K]=s.useState(!1),w=s.useRef(null),re=s.useRef(""),_=s.useCallback((U,se,I)=>{const B=I||v,Z=new URLSearchParams;return Z.set("path",U),Z.set("limit",String(La)),Z.set("offset",String(se)),B.branch&&Z.set("branch",B.branch),B.author&&Z.set("author",B.author),B.since&&Z.set("since",B.since),B.until&&Z.set("until",B.until),B.searchPath&&Z.set("searchPath",B.searchPath),B.search&&Z.set("search",B.search),Z.toString()},[v]),R=s.useCallback(async U=>{re.current=U,c(!0),o(null),y(null),f([]);try{const se=_(U,0),I=await V(A(`/api/files/git-log?${se}`)),B=await I.json();I.ok?(n(B.commits||[]),p(B.total||0),g(B.hasMore||!1)):(o(B.error||"Failed to load git history"),n([]))}catch(se){console.error("[useGitHistory] loadHistory error:",se),o("Failed to load git history"),n([])}finally{c(!1)}},[_]),P=s.useCallback(async U=>{if(!(r||!d)){i(!0);try{const se=_(U,t.length),I=await V(A(`/api/files/git-log?${se}`)),B=await I.json();I.ok&&(n(Z=>[...Z,...B.commits||[]]),p(B.total||0),g(B.hasMore||!1))}catch(se){console.error("[useGitHistory] loadMore error:",se)}finally{i(!1)}}},[_,t.length,d,r]),X=s.useCallback(async U=>{if(y(U),!U){f([]);return}C(!0);try{const se=re.current,I=new URLSearchParams({path:se,hash:U.hash}),B=await V(A(`/api/files/git-commit-files?${I}`)),Z=await B.json();B.ok?f(Z.files||[]):f([])}catch(se){console.error("[useGitHistory] selectCommit files error:",se),f([])}finally{C(!1)}},[]),Q=s.useCallback((U,se)=>{k(I=>({...I,[U]:se}))},[]),ne=s.useCallback(()=>{k({...Ws})},[]);s.useEffect(()=>{const U=re.current;if(U)return w.current&&clearTimeout(w.current),w.current=setTimeout(()=>{R(U)},$a),()=>{w.current&&clearTimeout(w.current)}},[v]);const ue=s.useCallback(async U=>{K(!0);try{const se=new URLSearchParams({path:U}),I=await V(A(`/api/files/git-authors?${se}`)),B=await I.json();I.ok&&H(B.authors||[])}catch(se){console.error("[useGitHistory] loadAuthors error:",se)}finally{K(!1)}},[]);return{commits:t,loading:l,loadingMore:r,error:h,hasMore:d,total:b,filters:v,setFilter:Q,resetFilters:ne,selectedCommit:F,selectCommit:X,commitFiles:E,commitFilesLoading:j,loadHistory:R,loadMore:P,authors:M,authorsLoading:G,loadAuthors:ue}}function Ha(t){if(!t.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=t.current.querySelector(l);if(c&&Js(c))return c}return Js(t.current)?t.current:null}function Js(t){const n=["auto","scroll"].includes(getComputedStyle(t).overflowY),l=t.scrollHeight>t.clientHeight||t.scrollWidth>t.clientWidth;return n&&l}function on(t){if(!t)return 19.5;const n=parseFloat(getComputedStyle(t).lineHeight);return isNaN(n)?19.5:n}function ss(t,n=!0){const l=n?t.scrollHeight:0;t.scrollTo({top:l,behavior:"smooth"})}function Aa(t){const{scrollTop:n,scrollHeight:l,clientHeight:c}=t;return l<=c?100:Math.round(n/(l-c)*100)}function Oa(t,n){const l=on(t),c=t.scrollTop,r=Math.floor(c/l)+1,i=n.split(`
|
|
3
3
|
`).length;return Math.min(r,i)}function Ua(t,n,l=!1){if(!n)return[];l||t.toLowerCase();const c=l?n:n.toLowerCase(),r=[];let i=0;const h=t.split(`
|
|
4
4
|
`);let o=0;for(let d=0;d<h.length;d++){const g=h[d],b=l?g:g.toLowerCase();let p=0,v=b.indexOf(c);for(;v!==-1;){const k=o+v;r.push({index:i++,line:d+1,column:v,length:c.length,charIndex:k}),p=v+c.length,v=b.indexOf(c,p)}o+=g.length+1}return r}function ot(t){return/[\w]/.test(t)}function Ke(t){return/\s/.test(t)}function Ga(t,n,l){let c=n-1,r=l;const i=t.length,h=t[c]||"";if(r<h.length){const g=ot(h[r]);if(!Ke(h[r]))for(;r<h.length&&!Ke(h[r])&&ot(h[r])===g;)r++}for(;c<i;){const g=t[c]||"";for(;r<g.length&&Ke(g[r]);)r++;if(r<g.length)return{line:c+1,col:r};c++,r=0}const o=i,d=Math.max(0,(t[i-1]||"").length-1);return{line:o,col:d}}function _a(t,n,l){let c=n-1,r=l+1;const i=t.length;for(;c<i;){const d=t[c]||"";for(;r<d.length&&Ke(d[r]);)r++;if(r<d.length)break;c++,r=0}if(c>=i)return{line:i,col:Math.max(0,(t[i-1]||"").length-1)};const h=t[c]||"",o=ot(h[r]);for(;r+1<h.length&&!Ke(h[r+1])&&ot(h[r+1])===o;)r++;return{line:c+1,col:r}}function Ba(t,n,l){let c=n-1,r=l-1;for(;c>=0;){const o=t[c]||"";for(;r>=0&&Ke(o[r]);)r--;if(r>=0)break;c--,c>=0&&(r=(t[c]||"").length-1)}if(c<0)return{line:1,col:0};const i=t[c]||"",h=ot(i[r]);for(;r>0&&!Ke(i[r-1])&&ot(i[r-1])===h;)r--;return{line:c+1,col:r}}function Va(t,n,l,c){if(c==="none")return"";const{anchorLine:r,anchorCol:i,headLine:h,headCol:o}=l;if(c==="line"){const k=Math.min(r,h),F=Math.max(r,h);return n.slice(k-1,F).join(`
|
|
5
5
|
`)}let d,g,b,p;if(r<h||r===h&&i<=o?(d=r,g=i,b=h,p=o):(d=h,g=o,b=r,p=i),d===b)return(n[d-1]||"").substring(g,p+1);const v=[];v.push((n[d-1]||"").substring(g));for(let k=d;k<b-1;k++)v.push(n[k]||"");return v.push((n[b-1]||"").substring(0,p+1)),v.join(`
|
|
6
6
|
`)}function cn(t){const{containerRef:n,isEnabled:l=!0,content:c="",onClose:r,onSearchOpen:i}=t,h=s.useRef({percentage:0,line:1,column:1}),o=s.useRef(null),d=s.useRef(19.5),g=s.useMemo(()=>c.split(`
|
|
7
|
-
`),[c]),b=g.length,[p,v]=s.useState(1),[k,F]=s.useState(0),[y,E]=s.useState(!1),[f,j]=s.useState("none"),[C,M]=s.useState(null),[H,G]=s.useState(!1),[K,w]=s.useState(""),[re,_]=s.useState(0),[R,P]=s.useState(!1),X=s.useMemo(()=>Ua(c,K,!1),[c,K]),Q=s.useCallback(()=>{const m=o.current;if(!m)return;const q=Aa(m),le=Oa(m,c),T=Math.max(1,Math.round(m.scrollLeft/7.8)+1);h.current={percentage:q,line:le,column:T}},[c]),ne=s.useCallback(()=>{G(!0),w(""),_(0),i==null||i()},[i]),ue=s.useCallback(()=>{G(!1),w(""),_(0)},[]),U=s.useCallback(()=>{P(m=>!m)},[]),se=s.useCallback(m=>{const q=o.current;if(!q)return;const le=q.querySelector(".file-viewer-pre"),me=le&&parseFloat(getComputedStyle(le).lineHeight)||d.current,T=le&&parseFloat(getComputedStyle(le).paddingTop)||0,te=(le?le.offsetTop:0)+T+(m-1)*me,ae=me*3;q.scrollTo({top:Math.max(0,te-ae),behavior:"smooth"})},[]);s.useEffect(()=>{!H||X.length===0||_(0)},[X,H]),s.useEffect(()=>{if(!H||X.length===0)return;const m=X[re];m&&(v(m.line),F(m.column),se(m.line))},[H,X,re,se]);const I=s.useCallback(()=>{X.length!==0&&_(m=>(m+1)%X.length)},[X]),B=s.useCallback(()=>{X.length!==0&&_(m=>(m-1+X.length)%X.length)},[X]),Z=s.useCallback(m=>{const q=o.current;if(!q)return;const le=q.querySelector(".file-viewer-pre");if(!le)return;const me=parseFloat(getComputedStyle(le).lineHeight),T=isNaN(me)?d.current:me,S=parseFloat(getComputedStyle(le).paddingTop)||0,ae=le.offsetTop+S+(m-1)*T,pe=ae+T,oe=q.scrollTop,W=oe+q.clientHeight;ae<oe?q.scrollTo({top:Math.max(0,ae),behavior:"auto"}):pe>W&&q.scrollTo({top:pe-q.clientHeight,behavior:"auto"})},[]),L=s.useCallback((m,q)=>{v(m),F(q),Z(m),f!=="none"&&M(le=>le?{...le,headLine:m,headCol:q}:null)},[f,Z]),we=s.useCallback(()=>{if(f==="none"||!C)return;const m=Va(c,g,C,f);m&&navigator.clipboard.writeText(m).catch(()=>{const q=document.createElement("textarea");q.value=m,q.style.position="fixed",q.style.left="-9999px",document.body.appendChild(q),q.select(),document.execCommand("copy"),document.body.removeChild(q)}),j("none"),M(null)},[f,C,c,g]),ee=s.useCallback(m=>{const q=m.target;if((q.tagName==="INPUT"||q.tagName==="TEXTAREA")&&m.key!=="Escape")return;const me=o.current;if(!me)return;let T=!1;const S=d.current,te=Math.max(1,Math.floor(me.clientHeight/S)),ae=Math.max(1,Math.floor(te/2)),pe=(W,ye)=>{const Ge=Math.max(0,(g[W-1]||"").length-1);return Math.min(ye,Math.max(0,Ge))},oe=(W,ye)=>{const Ge=pe(W,ye);L(W,Ge)};if(m.key==="v"&&!m.shiftKey&&!m.ctrlKey&&!H)m.preventDefault(),m.stopPropagation(),f==="char"?(j("none"),M(null)):(j("char"),M({anchorLine:p,anchorCol:k,headLine:p,headCol:k})),T=!0;else if(m.key==="V"&&m.shiftKey&&!m.ctrlKey&&!H)m.preventDefault(),m.stopPropagation(),f==="line"?(j("none"),M(null)):(j("line"),M({anchorLine:p,anchorCol:0,headLine:p,headCol:0})),T=!0;else if(m.key==="y"&&!m.ctrlKey&&f!=="none")m.preventDefault(),m.stopPropagation(),we(),T=!0;else if(m.key==="j"||m.key==="ArrowDown"){m.preventDefault(),m.stopPropagation();const W=Math.min(p+1,b);oe(W,k),T=!0}else if(m.key==="k"||m.key==="ArrowUp"){m.preventDefault(),m.stopPropagation();const W=Math.max(p-1,1);oe(W,k),T=!0}else if(m.key==="d"&&m.ctrlKey||m.key==="d"&&f==="none"&&!H){m.preventDefault(),m.stopPropagation();const W=Math.min(p+ae,b);oe(W,k),T=!0}else if(m.key==="u"&&m.ctrlKey||m.key==="u"&&f==="none"&&!H){m.preventDefault(),m.stopPropagation();const W=Math.max(p-ae,1);oe(W,k),T=!0}else if((m.ctrlKey||m.metaKey)&&m.key==="f")m.preventDefault(),m.stopPropagation(),ne(),T=!0;else if(m.key==="f"&&!m.ctrlKey&&!m.metaKey&&f==="none"&&!H){m.preventDefault(),m.stopPropagation();const W=Math.min(p+te,b);oe(W,k),T=!0}else if(m.key===" "||m.key==="PageDown"){m.preventDefault(),m.stopPropagation();const W=Math.min(p+te,b);oe(W,k),T=!0}else if(m.key==="b"&&!y&&f==="none"&&!H||m.key==="PageUp"){m.preventDefault(),m.stopPropagation();const W=Math.max(p-te,1);oe(W,k),T=!0}else if(m.key==="g"&&!m.shiftKey&&f==="none"&&!H)m.preventDefault(),m.stopPropagation(),L(1,0),ss(me,!1),T=!0;else if(m.key==="Home")m.preventDefault(),m.stopPropagation(),L(1,0),ss(me,!1),T=!0;else if(m.key==="G"&&m.shiftKey||m.key==="End")m.preventDefault(),m.stopPropagation(),L(b,0),ss(me,!0),T=!0;else if(m.key==="h"||m.key==="ArrowLeft")m.preventDefault(),m.stopPropagation(),L(p,Math.max(0,k-1)),T=!0;else if(m.key==="l"||m.key==="ArrowRight"){m.preventDefault(),m.stopPropagation();const W=(g[p-1]||"").length;L(p,Math.min(k+1,Math.max(0,W-1))),T=!0}else if(m.key==="w"&&!m.ctrlKey&&!H){m.preventDefault(),m.stopPropagation();const W=Ga(g,p,k);L(W.line,W.col),T=!0}else if(m.key==="e"&&!m.ctrlKey&&!H){m.preventDefault(),m.stopPropagation();const W=_a(g,p,k);L(W.line,W.col),T=!0}else if(m.key==="b"&&!H){m.preventDefault(),m.stopPropagation();const W=Ba(g,p,k);L(W.line,W.col),T=!0}else if(m.key==="0")m.preventDefault(),m.stopPropagation(),L(p,0),T=!0;else if(m.key==="$")m.preventDefault(),m.stopPropagation(),L(p,Math.max(0,(g[p-1]||"").length-1)),T=!0;else if(m.key==="^"){m.preventDefault(),m.stopPropagation();const ye=(g[p-1]||"").search(/\S/);L(p,ye>=0?ye:0),T=!0}else m.key==="/"?(m.preventDefault(),m.stopPropagation(),ne(),T=!0):m.key==="n"&&!H?(m.preventDefault(),m.stopPropagation(),I(),T=!0):m.key==="N"&&m.shiftKey&&!H?(m.preventDefault(),m.stopPropagation(),B(),T=!0):m.key==="?"&&f==="none"?(m.preventDefault(),m.stopPropagation(),U(),T=!0):m.key==="q"&&f==="none"?(m.preventDefault(),m.stopPropagation(),r==null||r(),T=!0):m.key==="Escape"&&(f!=="none"?(m.preventDefault(),m.stopPropagation(),j("none"),M(null),T=!0):H?(m.preventDefault(),m.stopPropagation(),ue(),T=!0):y&&(m.preventDefault(),m.stopPropagation(),E(!1),T=!0));T&&(m.key!=="Escape"&&!y&&E(!0),requestAnimationFrame(Q))},[r,Q,b,g,p,k,Z,H,ue,f,y,L,we,ne,I,B,U]);return s.useEffect(()=>{if(!l)return;const m=Ha(n);if(o.current=m,!m){console.warn("[useLessNavigation] Could not find scrollable container");return}d.current=on(m);const q=()=>{Q()};return window.addEventListener("keydown",ee,{capture:!0}),m.addEventListener("scroll",q,{passive:!0}),Q(),()=>{window.removeEventListener("keydown",ee,{capture:!0}),m.removeEventListener("scroll",q)}},[l,ee,Q]),{scrollPercentage:h.current.percentage,currentLine:h.current.line,currentColumn:h.current.column,totalLines:b,cursorLine:p,cursorCol:k,cursorModeActive:y,visualMode:f,selection:C,searchActive:H,searchQuery:K,searchMatches:X,currentMatchIndex:re,startSearch:ne,setSearchQuery:w,nextMatch:I,prevMatch:B,clearSearch:ue,helpActive:R,toggleHelp:U}}const os=({query:t,onQueryChange:n,matchCount:l,currentIndex:c,onNext:r,onPrev:i,onClose:h})=>{const{t:o}=ie(["terminal"]),d=s.useRef(null);s.useEffect(()=>{var p;(p=d.current)==null||p.focus()},[]);const g=s.useCallback(p=>{p.stopPropagation(),p.key==="Enter"||p.key==="ArrowDown"?(p.preventDefault(),r()):p.key==="ArrowUp"&&(p.preventDefault(),i())},[r,i]),b=l===0&&t?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:d,type:"text",className:"file-viewer-search-input",placeholder:o("terminal:fileExplorer.searchInFile"),value:t,onChange:p=>n(p.target.value),onKeyDown:g,autoComplete:"off",spellCheck:"false"})]}),t&&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:i,disabled:l===0,title:o("terminal:fileExplorer.previousMatch"),"aria-label":o("terminal:fileExplorer.previousMatch"),children:e.jsx(D,{name:"caret-up",size:10})}),e.jsx("button",{className:"file-viewer-search-btn file-viewer-search-next",onClick:r,disabled:l===0,title:o("terminal:fileExplorer.nextMatch"),"aria-label":o("terminal:fileExplorer.nextMatch"),children:e.jsx(D,{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(D,{name:"close",size:12})})]})};os.displayName="SearchBar";const Ka=[{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"}],cs=({onClose:t})=>{const{t:n}=ie(["terminal"]),l=s.useCallback(i=>{i.target===i.currentTarget&&t()},[t]),c=s.useCallback(i=>{(i.key==="Escape"||i.key==="?")&&(i.preventDefault(),i.stopPropagation(),t())},[t]),r=Ka.reduce((i,h)=>(i[h.category]||(i[h.category]=[]),i[h.category].push(h),i),{});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:t,"aria-label":n("terminal:fileExplorer.closeHelp"),title:n("terminal:fileExplorer.pressEscapeToClose"),children:e.jsx(D,{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(r).map(([i,h])=>e.jsxs("div",{className:"keybindings-help-category",children:[e.jsx("h3",{className:"keybindings-help-category-title",children:i}),e.jsx("div",{className:"keybindings-help-list",children:h.map((o,d)=>e.jsxs("div",{className:"keybindings-help-item",children:[e.jsx("div",{className:"keybindings-help-keys",children:o.keys.map((g,b)=>e.jsx("kbd",{className:"keybindings-help-key",children:g},b))}),e.jsx("div",{className:"keybindings-help-description",children:o.description})]},d))})]},i))}),e.jsx("p",{className:"keybindings-help-footer",children:n("terminal:fileExplorer.keybindingsFooter")})]})})};cs.displayName="KeybindingsHelp";const Ys=s.lazy(()=>rs(()=>import("./EmbeddedEditor-BFwoN_46.js"),__vite__mapDeps([0,1,2,3,4,5])).then(t=>({default:t.EmbeddedEditor}))),Wa=s.lazy(()=>rs(()=>import("./AudioPlayer-CElliTTR.js"),__vite__mapDeps([6,1,2,3,4])).then(t=>({default:t.AudioPlayer}))),Ja=s.lazy(()=>rs(()=>import("./VideoPlayer-jknjvQg9.js"),__vite__mapDeps([7,1,2,3,4])).then(t=>({default:t.VideoPlayer}))),Ya=[".md",".mdx",".markdown"],qs="file-viewer-markdown-render",qa=[".puml",".plantuml",".iuml",".pu"],Xs="file-viewer-plantuml-render",Xa="https://kroki.io/plantuml/svg";function Qa(t){return Ya.includes(t.toLowerCase())}function Za(t){return qa.includes(t.toLowerCase())}function er(){const[t,n]=s.useState(()=>{try{const c=localStorage.getItem(qs);return c===null?!0:c==="true"}catch{return!0}}),l=s.useCallback(()=>{n(c=>{const r=!c;try{localStorage.setItem(qs,String(r))}catch{}return r})},[]);return[t,l]}function tr(){const[t,n]=s.useState(()=>{try{const c=localStorage.getItem(Xs);return c===null?!0:c==="true"}catch{return!0}}),l=s.useCallback(()=>{n(c=>{const r=!c;try{localStorage.setItem(Xs,String(r))}catch{}return r})},[]);return[t,l]}function sr(t){const n=new TextEncoder().encode(t);let l="";for(const c of n)l+=String.fromCharCode(c);return`data:image/svg+xml;base64,${window.btoa(l)}`}function ze({file:t,rightContent:n,onRevealInTree:l,editMode:c,onToggleEdit:r}){const{t:i}=ie(["terminal","common"]),[h,o]=s.useState("idle"),[d,g]=s.useState("idle"),[b,p]=s.useState("idle"),v=t.fileType==="text"?Ut(t.extension):t.extension.slice(1).toUpperCase(),k=t.fileType==="text"&&t.content!=null,F=en(),y=async()=>{try{await zt(t.content),p("copied"),setTimeout(()=>p("idle"),2e3)}catch{p("error"),setTimeout(()=>p("idle"),2e3)}},E=async()=>{const M=A(`/api/files/binary?path=${encodeURIComponent(t.path)}&download=true`);await ct(M,t.filename,"text/plain;charset=utf-8")},f=async()=>{o("loading");try{const M=await V(A("/api/files/open-in-editor"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:t.path,...F.externalEditorCommand&&{editorCommand:F.externalEditorCommand}})});if(!M.ok){const H=await M.json().catch(()=>({error:"Unknown error"}));console.error("Failed to open in editor:",H),o("error"),setTimeout(()=>o("idle"),2e3);return}o("success"),setTimeout(()=>o("idle"),2e3)}catch(M){console.error("Error opening file in editor:",M),o("error"),setTimeout(()=>o("idle"),2e3)}},j=async()=>{if(t.path)try{await sa(t.path),g("success"),setTimeout(()=>g("idle"),2e3)}catch(M){console.error("Error opening file explorer:",M),g("error"),setTimeout(()=>g("idle"),2e3)}},C=i("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:t.filename}),e.jsxs("span",{className:"file-viewer-meta",children:[tn(t.size)," • ",v,t.content&&` • ${t.content.split(`
|
|
7
|
+
`),[c]),b=g.length,[p,v]=s.useState(1),[k,F]=s.useState(0),[y,E]=s.useState(!1),[f,j]=s.useState("none"),[C,M]=s.useState(null),[H,G]=s.useState(!1),[K,w]=s.useState(""),[re,_]=s.useState(0),[R,P]=s.useState(!1),X=s.useMemo(()=>Ua(c,K,!1),[c,K]),Q=s.useCallback(()=>{const m=o.current;if(!m)return;const q=Aa(m),le=Oa(m,c),T=Math.max(1,Math.round(m.scrollLeft/7.8)+1);h.current={percentage:q,line:le,column:T}},[c]),ne=s.useCallback(()=>{G(!0),w(""),_(0),i==null||i()},[i]),ue=s.useCallback(()=>{G(!1),w(""),_(0)},[]),U=s.useCallback(()=>{P(m=>!m)},[]),se=s.useCallback(m=>{const q=o.current;if(!q)return;const le=q.querySelector(".file-viewer-pre"),me=le&&parseFloat(getComputedStyle(le).lineHeight)||d.current,T=le&&parseFloat(getComputedStyle(le).paddingTop)||0,te=(le?le.offsetTop:0)+T+(m-1)*me,ae=me*3;q.scrollTo({top:Math.max(0,te-ae),behavior:"smooth"})},[]);s.useEffect(()=>{!H||X.length===0||_(0)},[X,H]),s.useEffect(()=>{if(!H||X.length===0)return;const m=X[re];m&&(v(m.line),F(m.column),se(m.line))},[H,X,re,se]);const I=s.useCallback(()=>{X.length!==0&&_(m=>(m+1)%X.length)},[X]),B=s.useCallback(()=>{X.length!==0&&_(m=>(m-1+X.length)%X.length)},[X]),Z=s.useCallback(m=>{const q=o.current;if(!q)return;const le=q.querySelector(".file-viewer-pre");if(!le)return;const me=parseFloat(getComputedStyle(le).lineHeight),T=isNaN(me)?d.current:me,S=parseFloat(getComputedStyle(le).paddingTop)||0,ae=le.offsetTop+S+(m-1)*T,pe=ae+T,oe=q.scrollTop,W=oe+q.clientHeight;ae<oe?q.scrollTo({top:Math.max(0,ae),behavior:"auto"}):pe>W&&q.scrollTo({top:pe-q.clientHeight,behavior:"auto"})},[]),L=s.useCallback((m,q)=>{v(m),F(q),Z(m),f!=="none"&&M(le=>le?{...le,headLine:m,headCol:q}:null)},[f,Z]),we=s.useCallback(()=>{if(f==="none"||!C)return;const m=Va(c,g,C,f);m&&navigator.clipboard.writeText(m).catch(()=>{const q=document.createElement("textarea");q.value=m,q.style.position="fixed",q.style.left="-9999px",document.body.appendChild(q),q.select(),document.execCommand("copy"),document.body.removeChild(q)}),j("none"),M(null)},[f,C,c,g]),ee=s.useCallback(m=>{const q=m.target;if((q.tagName==="INPUT"||q.tagName==="TEXTAREA")&&m.key!=="Escape")return;const me=o.current;if(!me)return;let T=!1;const S=d.current,te=Math.max(1,Math.floor(me.clientHeight/S)),ae=Math.max(1,Math.floor(te/2)),pe=(W,ye)=>{const Ge=Math.max(0,(g[W-1]||"").length-1);return Math.min(ye,Math.max(0,Ge))},oe=(W,ye)=>{const Ge=pe(W,ye);L(W,Ge)};if(m.key==="v"&&!m.shiftKey&&!m.ctrlKey&&!H)m.preventDefault(),m.stopPropagation(),f==="char"?(j("none"),M(null)):(j("char"),M({anchorLine:p,anchorCol:k,headLine:p,headCol:k})),T=!0;else if(m.key==="V"&&m.shiftKey&&!m.ctrlKey&&!H)m.preventDefault(),m.stopPropagation(),f==="line"?(j("none"),M(null)):(j("line"),M({anchorLine:p,anchorCol:0,headLine:p,headCol:0})),T=!0;else if(m.key==="y"&&!m.ctrlKey&&f!=="none")m.preventDefault(),m.stopPropagation(),we(),T=!0;else if(m.key==="j"||m.key==="ArrowDown"){m.preventDefault(),m.stopPropagation();const W=Math.min(p+1,b);oe(W,k),T=!0}else if(m.key==="k"||m.key==="ArrowUp"){m.preventDefault(),m.stopPropagation();const W=Math.max(p-1,1);oe(W,k),T=!0}else if(m.key==="d"&&m.ctrlKey||m.key==="d"&&f==="none"&&!H){m.preventDefault(),m.stopPropagation();const W=Math.min(p+ae,b);oe(W,k),T=!0}else if(m.key==="u"&&m.ctrlKey||m.key==="u"&&f==="none"&&!H){m.preventDefault(),m.stopPropagation();const W=Math.max(p-ae,1);oe(W,k),T=!0}else if((m.ctrlKey||m.metaKey)&&m.key==="f")m.preventDefault(),m.stopPropagation(),ne(),T=!0;else if(m.key==="f"&&!m.ctrlKey&&!m.metaKey&&f==="none"&&!H){m.preventDefault(),m.stopPropagation();const W=Math.min(p+te,b);oe(W,k),T=!0}else if(m.key===" "||m.key==="PageDown"){m.preventDefault(),m.stopPropagation();const W=Math.min(p+te,b);oe(W,k),T=!0}else if(m.key==="b"&&!y&&f==="none"&&!H||m.key==="PageUp"){m.preventDefault(),m.stopPropagation();const W=Math.max(p-te,1);oe(W,k),T=!0}else if(m.key==="g"&&!m.shiftKey&&f==="none"&&!H)m.preventDefault(),m.stopPropagation(),L(1,0),ss(me,!1),T=!0;else if(m.key==="Home")m.preventDefault(),m.stopPropagation(),L(1,0),ss(me,!1),T=!0;else if(m.key==="G"&&m.shiftKey||m.key==="End")m.preventDefault(),m.stopPropagation(),L(b,0),ss(me,!0),T=!0;else if(m.key==="h"||m.key==="ArrowLeft")m.preventDefault(),m.stopPropagation(),L(p,Math.max(0,k-1)),T=!0;else if(m.key==="l"||m.key==="ArrowRight"){m.preventDefault(),m.stopPropagation();const W=(g[p-1]||"").length;L(p,Math.min(k+1,Math.max(0,W-1))),T=!0}else if(m.key==="w"&&!m.ctrlKey&&!H){m.preventDefault(),m.stopPropagation();const W=Ga(g,p,k);L(W.line,W.col),T=!0}else if(m.key==="e"&&!m.ctrlKey&&!H){m.preventDefault(),m.stopPropagation();const W=_a(g,p,k);L(W.line,W.col),T=!0}else if(m.key==="b"&&!H){m.preventDefault(),m.stopPropagation();const W=Ba(g,p,k);L(W.line,W.col),T=!0}else if(m.key==="0")m.preventDefault(),m.stopPropagation(),L(p,0),T=!0;else if(m.key==="$")m.preventDefault(),m.stopPropagation(),L(p,Math.max(0,(g[p-1]||"").length-1)),T=!0;else if(m.key==="^"){m.preventDefault(),m.stopPropagation();const ye=(g[p-1]||"").search(/\S/);L(p,ye>=0?ye:0),T=!0}else m.key==="/"?(m.preventDefault(),m.stopPropagation(),ne(),T=!0):m.key==="n"&&!H?(m.preventDefault(),m.stopPropagation(),I(),T=!0):m.key==="N"&&m.shiftKey&&!H?(m.preventDefault(),m.stopPropagation(),B(),T=!0):m.key==="?"&&f==="none"?(m.preventDefault(),m.stopPropagation(),U(),T=!0):m.key==="q"&&f==="none"?(m.preventDefault(),m.stopPropagation(),r==null||r(),T=!0):m.key==="Escape"&&(f!=="none"?(m.preventDefault(),m.stopPropagation(),j("none"),M(null),T=!0):H?(m.preventDefault(),m.stopPropagation(),ue(),T=!0):y&&(m.preventDefault(),m.stopPropagation(),E(!1),T=!0));T&&(m.key!=="Escape"&&!y&&E(!0),requestAnimationFrame(Q))},[r,Q,b,g,p,k,Z,H,ue,f,y,L,we,ne,I,B,U]);return s.useEffect(()=>{if(!l)return;const m=Ha(n);if(o.current=m,!m){console.warn("[useLessNavigation] Could not find scrollable container");return}d.current=on(m);const q=()=>{Q()};return window.addEventListener("keydown",ee,{capture:!0}),m.addEventListener("scroll",q,{passive:!0}),Q(),()=>{window.removeEventListener("keydown",ee,{capture:!0}),m.removeEventListener("scroll",q)}},[l,ee,Q]),{scrollPercentage:h.current.percentage,currentLine:h.current.line,currentColumn:h.current.column,totalLines:b,cursorLine:p,cursorCol:k,cursorModeActive:y,visualMode:f,selection:C,searchActive:H,searchQuery:K,searchMatches:X,currentMatchIndex:re,startSearch:ne,setSearchQuery:w,nextMatch:I,prevMatch:B,clearSearch:ue,helpActive:R,toggleHelp:U}}const os=({query:t,onQueryChange:n,matchCount:l,currentIndex:c,onNext:r,onPrev:i,onClose:h})=>{const{t:o}=ie(["terminal"]),d=s.useRef(null);s.useEffect(()=>{var p;(p=d.current)==null||p.focus()},[]);const g=s.useCallback(p=>{p.stopPropagation(),p.key==="Enter"||p.key==="ArrowDown"?(p.preventDefault(),r()):p.key==="ArrowUp"&&(p.preventDefault(),i())},[r,i]),b=l===0&&t?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:d,type:"text",className:"file-viewer-search-input",placeholder:o("terminal:fileExplorer.searchInFile"),value:t,onChange:p=>n(p.target.value),onKeyDown:g,autoComplete:"off",spellCheck:"false"})]}),t&&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:i,disabled:l===0,title:o("terminal:fileExplorer.previousMatch"),"aria-label":o("terminal:fileExplorer.previousMatch"),children:e.jsx(D,{name:"caret-up",size:10})}),e.jsx("button",{className:"file-viewer-search-btn file-viewer-search-next",onClick:r,disabled:l===0,title:o("terminal:fileExplorer.nextMatch"),"aria-label":o("terminal:fileExplorer.nextMatch"),children:e.jsx(D,{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(D,{name:"close",size:12})})]})};os.displayName="SearchBar";const Ka=[{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"}],cs=({onClose:t})=>{const{t:n}=ie(["terminal"]),l=s.useCallback(i=>{i.target===i.currentTarget&&t()},[t]),c=s.useCallback(i=>{(i.key==="Escape"||i.key==="?")&&(i.preventDefault(),i.stopPropagation(),t())},[t]),r=Ka.reduce((i,h)=>(i[h.category]||(i[h.category]=[]),i[h.category].push(h),i),{});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:t,"aria-label":n("terminal:fileExplorer.closeHelp"),title:n("terminal:fileExplorer.pressEscapeToClose"),children:e.jsx(D,{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(r).map(([i,h])=>e.jsxs("div",{className:"keybindings-help-category",children:[e.jsx("h3",{className:"keybindings-help-category-title",children:i}),e.jsx("div",{className:"keybindings-help-list",children:h.map((o,d)=>e.jsxs("div",{className:"keybindings-help-item",children:[e.jsx("div",{className:"keybindings-help-keys",children:o.keys.map((g,b)=>e.jsx("kbd",{className:"keybindings-help-key",children:g},b))}),e.jsx("div",{className:"keybindings-help-description",children:o.description})]},d))})]},i))}),e.jsx("p",{className:"keybindings-help-footer",children:n("terminal:fileExplorer.keybindingsFooter")})]})})};cs.displayName="KeybindingsHelp";const Ys=s.lazy(()=>rs(()=>import("./EmbeddedEditor-CG0ULJUZ.js"),__vite__mapDeps([0,1,2,3,4,5])).then(t=>({default:t.EmbeddedEditor}))),Wa=s.lazy(()=>rs(()=>import("./AudioPlayer-BkW6rbHa.js"),__vite__mapDeps([6,1,2,3,4])).then(t=>({default:t.AudioPlayer}))),Ja=s.lazy(()=>rs(()=>import("./VideoPlayer-UW43AiLH.js"),__vite__mapDeps([7,1,2,3,4])).then(t=>({default:t.VideoPlayer}))),Ya=[".md",".mdx",".markdown"],qs="file-viewer-markdown-render",qa=[".puml",".plantuml",".iuml",".pu"],Xs="file-viewer-plantuml-render",Xa="https://kroki.io/plantuml/svg";function Qa(t){return Ya.includes(t.toLowerCase())}function Za(t){return qa.includes(t.toLowerCase())}function er(){const[t,n]=s.useState(()=>{try{const c=localStorage.getItem(qs);return c===null?!0:c==="true"}catch{return!0}}),l=s.useCallback(()=>{n(c=>{const r=!c;try{localStorage.setItem(qs,String(r))}catch{}return r})},[]);return[t,l]}function tr(){const[t,n]=s.useState(()=>{try{const c=localStorage.getItem(Xs);return c===null?!0:c==="true"}catch{return!0}}),l=s.useCallback(()=>{n(c=>{const r=!c;try{localStorage.setItem(Xs,String(r))}catch{}return r})},[]);return[t,l]}function sr(t){const n=new TextEncoder().encode(t);let l="";for(const c of n)l+=String.fromCharCode(c);return`data:image/svg+xml;base64,${window.btoa(l)}`}function ze({file:t,rightContent:n,onRevealInTree:l,editMode:c,onToggleEdit:r}){const{t:i}=ie(["terminal","common"]),[h,o]=s.useState("idle"),[d,g]=s.useState("idle"),[b,p]=s.useState("idle"),v=t.fileType==="text"?Ut(t.extension):t.extension.slice(1).toUpperCase(),k=t.fileType==="text"&&t.content!=null,F=en(),y=async()=>{try{await zt(t.content),p("copied"),setTimeout(()=>p("idle"),2e3)}catch{p("error"),setTimeout(()=>p("idle"),2e3)}},E=async()=>{const M=A(`/api/files/binary?path=${encodeURIComponent(t.path)}&download=true`);await ct(M,t.filename,"text/plain;charset=utf-8")},f=async()=>{o("loading");try{const M=await V(A("/api/files/open-in-editor"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:t.path,...F.externalEditorCommand&&{editorCommand:F.externalEditorCommand}})});if(!M.ok){const H=await M.json().catch(()=>({error:"Unknown error"}));console.error("Failed to open in editor:",H),o("error"),setTimeout(()=>o("idle"),2e3);return}o("success"),setTimeout(()=>o("idle"),2e3)}catch(M){console.error("Error opening file in editor:",M),o("error"),setTimeout(()=>o("idle"),2e3)}},j=async()=>{if(t.path)try{await sa(t.path),g("success"),setTimeout(()=>g("idle"),2e3)}catch(M){console.error("Error opening file explorer:",M),g("error"),setTimeout(()=>g("idle"),2e3)}},C=i("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:t.filename}),e.jsxs("span",{className:"file-viewer-meta",children:[tn(t.size)," • ",v,t.content&&` • ${t.content.split(`
|
|
8
8
|
`).length} lines`]})]}),e.jsxs("div",{className:"file-viewer-header-right",children:[r&&t.fileType==="text"&&e.jsx("button",{className:`file-viewer-edit-btn${c?" active":""}`,onClick:r,title:i(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"})})}),k&&e.jsxs(e.Fragment,{children:[e.jsx("button",{className:`file-viewer-copy-html-btn ${b}`,onClick:y,title:i("terminal:fileExplorer.copyAllTitle"),children:i(b==="copied"?"terminal:fileExplorer.copied":b==="error"?"terminal:fileExplorer.copyError":"terminal:fileExplorer.copyAll")}),e.jsx("button",{className:"file-viewer-download-btn",onClick:E,title:i("terminal:fileExplorer.downloadFileTitle"),children:i("common:buttons.download")})]}),e.jsx("button",{className:`file-viewer-reveal-explorer-btn ${d}`,onClick:j,disabled:!t.path,title:C,"aria-label":C,children:d==="success"?e.jsx(D,{name:"check",size:14}):d==="error"?e.jsx(D,{name:"cross",size:14}):e.jsx(D,{name:"folder-open",size:14})}),e.jsx("button",{className:`file-viewer-open-editor-btn ${h}`,onClick:f,disabled:h==="loading",title:i(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(t.path),title:i("terminal:fileExplorer.locateInTree"),children:e.jsx(D,{name:"target",size:14})}),n]})]})}function nr({file:t,onRevealInTree:n,renderMarkdown:l,onToggleRender:c,editMode:r,onToggleEdit:i}){const h=s.useRef(null),o=s.useRef(null),d=s.useRef(null),{t:g}=ie(["terminal","common"]),[b,p]=s.useState("idle"),[v,k]=s.useState("idle"),[F,y]=s.useState("idle"),[E,f]=s.useState("idle"),j=cn({containerRef:d,isEnabled:!0,content:t.content});s.useEffect(()=>{if(!l&&h.current){const w=Ut(t.extension);sn(w).then(()=>{h.current&&nn(h.current)})}},[t,l]);const C=s.useCallback(async()=>{if(!o.current){p("error"),setTimeout(()=>p("idle"),2e3);return}try{const w=o.current.innerHTML,re=Xn(w),_=o.current.innerText;await Qn(re,_),p("copied"),setTimeout(()=>p("idle"),2e3)}catch{p("error"),setTimeout(()=>p("idle"),2e3)}},[]),M=s.useCallback(async()=>{if(!o.current){k("error"),setTimeout(()=>k("idle"),2e3);return}try{const w=o.current.innerHTML;await zt(w),k("copied"),setTimeout(()=>k("idle"),2e3)}catch{k("error"),setTimeout(()=>k("idle"),2e3)}},[]),H=s.useCallback(async()=>{try{await zt(t.content),y("copied"),setTimeout(()=>y("idle"),2e3)}catch{y("error"),setTimeout(()=>y("idle"),2e3)}},[t.content]),G=s.useCallback(async()=>{try{await zt(t.content),f("copied"),setTimeout(()=>f("idle"),2e3)}catch{f("error"),setTimeout(()=>f("idle"),2e3)}},[t.content]),K=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:C,title:g("terminal:fileExplorer.copyRichTextTitle"),children:g(b==="copied"?"terminal:fileExplorer.copied":b==="error"?"terminal:fileExplorer.copyError":"terminal:fileExplorer.copyRichText")}),e.jsx("button",{className:`file-viewer-copy-html-btn ${v}`,onClick:M,title:g("terminal:fileExplorer.copyHtmlTitle"),children:g(v==="copied"?"terminal:fileExplorer.copied":v==="error"?"terminal:fileExplorer.copyError":"terminal:fileExplorer.copyHtml")}),e.jsx("button",{className:`file-viewer-copy-html-btn ${F}`,onClick:H,title:g("terminal:fileExplorer.copyMarkdownTitle"),children:g(F==="copied"?"terminal:fileExplorer.copied":F==="error"?"terminal:fileExplorer.copyError":"terminal:fileExplorer.copyMarkdown")}),e.jsx("button",{className:`file-viewer-copy-html-btn ${E}`,onClick:G,title:g("terminal:fileExplorer.copyOriginalTitle"),children:g(E==="copied"?"terminal:fileExplorer.copied":E==="error"?"terminal:fileExplorer.copyError":"terminal:fileExplorer.copyOriginal")})]}),e.jsx("button",{className:`file-viewer-render-toggle ${l?"active":""}`,onClick:c,title:g(l?"terminal:fileExplorer.showSource":"terminal:fileExplorer.renderMarkdown"),children:l?"</>":"Aa"})]});return e.jsxs(e.Fragment,{children:[e.jsx(ze,{file:t,onRevealInTree:n,rightContent:K,editMode:r,onToggleEdit:i}),e.jsxs("div",{className:"file-viewer-content-wrapper",ref:d,children:[l?e.jsx("div",{className:"file-viewer-markdown-wrapper",children:e.jsx("div",{className:"markdown-content",ref:o,children:e.jsx(Zn,{remarkPlugins:[ea],children:t.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:t.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(os,{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(cs,{onClose:j.toggleHelp})]})}function ar({file:t,onRevealInTree:n,renderPlantUml:l,onToggleRender:c,editMode:r,onToggleEdit:i}){const{t:h}=ie(["terminal"]),o=s.useRef(null),d=s.useRef(null),[g,b]=s.useState(null),[p,v]=s.useState(!1),[k,F]=s.useState(null),y=cn({containerRef:d,isEnabled:!0,content:t.content});s.useEffect(()=>{if(!l&&o.current){const f=Ut(t.extension);sn(f).then(()=>{o.current&&nn(o.current)})}},[t,l]),s.useEffect(()=>{if(!l)return;if(!t.content.trim()){b(null),F("Diagram is empty");return}const f=new AbortController;return v(!0),F(null),(async()=>{try{const C=await fetch(Xa,{method:"POST",headers:{"Content-Type":"text/plain; charset=utf-8",Accept:"image/svg+xml"},body:t.content,signal:f.signal});if(!C.ok)throw new Error(`Render failed (${C.status})`);const M=await C.text();if(!M.includes("<svg"))throw new Error("Invalid SVG output");b(sr(M))}catch(C){if(f.signal.aborted)return;const M=C instanceof Error?C.message:"Failed to render diagram";F(M),b(null)}finally{f.signal.aborted||v(!1)}})(),()=>f.abort()},[t.path,t.content,l]);const E=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(ze,{file:t,onRevealInTree:n,rightContent:E,editMode:r,onToggleEdit:i}),e.jsxs("div",{className:"file-viewer-content-wrapper",ref:d,children:[l?e.jsxs("div",{className:"file-viewer-diagram-wrapper",children:[p&&e.jsx("div",{className:"file-viewer-placeholder",children:h("terminal:fileExplorer.renderingDiagram")}),!p&&g&&e.jsx("img",{src:g,alt:t.filename,className:"file-viewer-diagram-image"}),!p&&k&&e.jsxs("div",{className:"file-viewer-diagram-error",children:[e.jsxs("div",{children:[h("terminal:fileExplorer.couldNotRender"),": ",k]}),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:t.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(os,{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(cs,{onClose:y.toggleHelp})]})}function rr({file:t,onRevealInTree:n}){const{t:l}=ie(["common","terminal"]),c=async()=>{const r=A(`/api/files/binary?path=${encodeURIComponent(t.path)}&download=true`);await ct(r,t.filename)};return e.jsxs(e.Fragment,{children:[e.jsx(ze,{file:t,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:t.dataUrl?e.jsx(ta,{src:t.dataUrl,alt:t.filename}):e.jsx("div",{className:"file-viewer-placeholder",children:l("terminal:fileExplorer.failedToLoadImage")})})]})}function ir({file:t,onRevealInTree:n}){const{t:l}=ie(["common","terminal"]),c=async()=>{const r=A(`/api/files/binary?path=${encodeURIComponent(t.path)}&download=true`);await ct(r,t.filename,"application/pdf")};return e.jsxs(e.Fragment,{children:[e.jsx(ze,{file:t,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:t.dataUrl?e.jsx("iframe",{src:t.dataUrl,title:t.filename,className:"file-viewer-pdf"}):e.jsx("div",{className:"file-viewer-placeholder",children:l("terminal:fileExplorer.failedToLoadPdf")})})]})}function lr({file:t,onRevealInTree:n}){const{t:l}=ie(["common","terminal"]),c=async()=>{const r=A(`/api/files/binary?path=${encodeURIComponent(t.path)}&download=true`);await ct(r,t.filename)};return e.jsxs(e.Fragment,{children:[e.jsx(ze,{file:t,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-audio-wrapper",children:t.dataUrl?e.jsx(s.Suspense,{fallback:e.jsx("div",{className:"file-viewer-placeholder",children:l("common:status.loading")}),children:e.jsx(Wa,{url:t.dataUrl,filename:t.filename})}):e.jsx("div",{className:"file-viewer-placeholder",children:l("terminal:audioPlayer.loadError",{defaultValue:"Could not load audio"})})})]})}function or({file:t,onRevealInTree:n}){const{t:l}=ie(["common","terminal"]),c=A(`/api/files/binary?path=${encodeURIComponent(t.path)}&download=true`),r=async()=>{await ct(c,t.filename)};return e.jsxs(e.Fragment,{children:[e.jsx(ze,{file:t,onRevealInTree:n,rightContent:e.jsx("button",{className:"file-viewer-download-btn",onClick:r,title:l("common:buttons.download"),children:l("common:buttons.download")})}),e.jsx("div",{className:"file-viewer-video-wrapper",children:t.dataUrl?e.jsx(s.Suspense,{fallback:e.jsx("div",{className:"file-viewer-placeholder",children:l("common:status.loading")}),children:e.jsx(Ja,{url:t.dataUrl,downloadUrl:c,filename:t.filename})}):e.jsx("div",{className:"file-viewer-placeholder",children:l("terminal:videoPlayer.loadError",{defaultValue:"Could not load video"})})})]})}function cr({file:t,onRevealInTree:n}){const{t:l}=ie(["terminal","common"]),c=async()=>{const i=A(`/api/files/binary?path=${encodeURIComponent(t.path)}&download=true`);await ct(i,t.filename)},r=()=>{const i=t.extension.toLowerCase();return[".xlsx",".xls"].includes(i)?e.jsx(D,{name:"dashboard",size:48}):[".docx",".doc"].includes(i)?e.jsx(D,{name:"edit",size:48}):[".pptx",".ppt"].includes(i)?e.jsx(D,{name:"film",size:48}):[".zip",".tar",".gz",".rar",".7z"].includes(i)?e.jsx(D,{name:"file-zip",size:48}):[".mp3",".wav",".flac",".ogg"].includes(i)?e.jsx(D,{name:"music-note",size:48}):[".mp4",".avi",".mov",".mkv",".webm"].includes(i)?e.jsx(D,{name:"film",size:48}):[".exe",".dmg",".app",".msi"].includes(i)?e.jsx(D,{name:"gear",size:48}):[".apk",".aab",".ipa"].includes(i)?e.jsx(D,{name:"mobile",size:48}):[".jar",".war",".ear"].includes(i)?e.jsx(D,{name:"coffee",size:48}):[".iso",".img"].includes(i)?e.jsx(D,{name:"disc",size:48}):[".so",".dll",".dylib"].includes(i)?e.jsx(D,{name:"wrench",size:48}):e.jsx(D,{name:"folder",size:48})};return e.jsxs(e.Fragment,{children:[e.jsx(ze,{file:t,onRevealInTree:n}),e.jsxs("div",{className:"file-viewer-binary",children:[e.jsx("div",{className:"file-viewer-binary-icon",children:r()}),e.jsx("div",{className:"file-viewer-binary-name",children:t.filename}),e.jsx("div",{className:"file-viewer-binary-size",children:tn(t.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 dr({file:t,loading:n,error:l,onRevealInTree:c,onFileEdited:r}){const{t:i}=ie(["terminal","common"]),[h,o]=er(),[d,g]=tr(),[b,p]=s.useState(!1);s.useEffect(()=>{p(!1)},[t==null?void 0:t.path]);const v=s.useCallback(async C=>{if(!t)return;const M=await V(A("/api/files/write"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:t.path,content:C})});if(!M.ok){const H=await M.json().catch(()=>({error:"Save failed"}));throw new Error(H.error||"Save failed")}},[t]),k=s.useCallback(()=>{p(C=>(C&&t&&(r==null||r(t.path)),!C))},[t,r]),F=s.useCallback(()=>{t&&(r==null||r(t.path))},[t,r]);if(n)return e.jsx("div",{className:"file-viewer-placeholder",children:i("common:status.loading")});if(l)return e.jsx("div",{className:"file-viewer-placeholder error",children:l});if(!t)return e.jsxs("div",{className:"file-viewer-placeholder",children:[e.jsx("div",{className:"placeholder-icon",children:e.jsx(D,{name:"folder-open",size:32})}),e.jsx("div",{className:"placeholder-text",children:i("terminal:fileExplorer.selectFileToView")})]});const y=t.fileType||"text",E=y==="text"&&Qa(t.extension),f=y==="text"&&Za(t.extension),j=E||f;return j&&b&&t.content!=null?e.jsxs("div",{className:"file-viewer-content",children:[e.jsx(ze,{file:t,onRevealInTree:c,editMode:!0,onToggleEdit:k}),e.jsx(s.Suspense,{fallback:e.jsx("div",{className:"file-viewer-placeholder",children:i("common:status.loading")}),children:e.jsx(Ys,{content:t.content,extension:t.extension,onSave:v,onCancel:k},t.path)})]}):y==="text"&&!j&&t.content!=null?e.jsxs("div",{className:"file-viewer-content",children:[e.jsx(ze,{file:t,onRevealInTree:c}),e.jsx(s.Suspense,{fallback:e.jsx("div",{className:"file-viewer-placeholder",children:i("common:status.loading")}),children:e.jsx(Ys,{content:t.content,extension:t.extension,onSave:v,onCancel:F},t.path)})]}):e.jsxs("div",{className:"file-viewer-content",children:[E&&e.jsx(nr,{file:t,onRevealInTree:c,renderMarkdown:h,onToggleRender:o,editMode:b,onToggleEdit:k}),f&&!E&&e.jsx(ar,{file:t,onRevealInTree:c,renderPlantUml:d,onToggleRender:g,editMode:b,onToggleEdit:k}),y==="image"&&e.jsx(rr,{file:t,onRevealInTree:c}),y==="pdf"&&e.jsx(ir,{file:t,onRevealInTree:c}),y==="audio"&&e.jsx(lr,{file:t,onRevealInTree:c}),y==="video"&&e.jsx(or,{file:t,onRevealInTree:c}),y==="binary"&&e.jsx(cr,{file:t,onRevealInTree:c})]})}const dn=s.memo(dr,(t,n)=>t.loading!==n.loading||t.error!==n.error?!1:t.file===null&&n.file===null?!0:t.file===null||n.file===null?!1:t.file.path===n.file.path&&t.file.content===n.file.content&&t.file.modified===n.file.modified);dn.displayName="FileViewer";function un({text:t,query:n}){if(!n)return e.jsx(e.Fragment,{children:t});const l=na(t,n);if(l)return e.jsxs(e.Fragment,{children:[t.slice(0,l.start),e.jsx("mark",{className:"search-highlight",children:t.slice(l.start,l.end)}),t.slice(l.end)]});const c=n.toLowerCase(),i=t.toLowerCase().indexOf(c);return i===-1?e.jsx(e.Fragment,{children:t}):e.jsxs(e.Fragment,{children:[t.slice(0,i),e.jsx("mark",{className:"search-highlight",children:t.slice(i,i+n.length)}),t.slice(i+n.length)]})}const ur=s.memo(function({node:n,query:l,isSelected:c,onSelect:r,lineNumber:i}){const h=n.isDirectory?null:is(n),o=n.path.split("/");o[o.length-1];const d=o.slice(0,-1).join("/");return e.jsxs("div",{className:`search-result-item ${c?"selected":""}`,onClick:()=>r(n),children:[n.isDirectory?e.jsx("span",{className:"search-result-icon",children:e.jsx(D,{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(D,{name:"file-text",size:14})}),e.jsxs("div",{className:"search-result-info",children:[e.jsxs("span",{className:"search-result-name",children:[e.jsx(un,{text:n.name,query:l}),i&&e.jsxs("span",{className:"search-result-line-badge",children:[":",i]})]}),e.jsx("span",{className:"search-result-path",children:d})]})]})}),hr=s.memo(function({match:n,query:l,isSelected:c,onSelect:r}){const{t:i}=ie(["terminal"]),h={name:n.name,path:n.path,isDirectory:!1,extension:n.extension},o=is(h),d=n.path.split("/"),g=d[d.length-1],b=d.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:()=>r(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(D,{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:g}),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((p,v)=>e.jsxs("div",{className:"content-search-match",onClick:()=>r(n.path,p.line),children:[e.jsx("span",{className:"content-search-line-num",children:p.line}),e.jsx("span",{className:"content-search-line-content",children:e.jsx(un,{text:p.content.trim(),query:l})})]},`${n.path}-${p.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:i("terminal:fileExplorer.moreMatches",{count:n.matches.length-5})})]})]})]})});function mr({filenameResults:t,contentResults:n,onSelectFile:l,onSelectContent:c,selectedPath:r,query:i,lineNumber:h}){const{t:o}=ie(["terminal"]),d=t.length>0,g=n.length>0;return!d&&!g?e.jsx("div",{className:"search-no-results",children:o("terminal:fileExplorer.noMatchesFound")}):e.jsxs("div",{className:"unified-search-results",children:[d&&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(D,{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:t.length})]}),e.jsx("div",{className:"unified-search-section-content",children:t.map(b=>e.jsx(ur,{node:b,query:i,isSelected:r===b.path,onSelect:l,lineNumber:h},b.path))})]}),g&&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(D,{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,p)=>b+p.matches.length,0),files:n.length})})]}),e.jsx("div",{className:"unified-search-section-content",children:n.map(b=>e.jsx(hr,{match:b,query:i,isSelected:r===b.path,onSelect:c},b.path))})]})]})}const hn=s.memo(mr,(t,n)=>!(t.query!==n.query||t.selectedPath!==n.selectedPath||t.filenameResults.length!==n.filenameResults.length||t.contentResults.length!==n.contentResults.length));hn.displayName="UnifiedSearchResults";const pr=s.memo(function({file:n,isSelected:l,onSelect:c,onStage:r,isStaging:i,showDirPath:h,isChecked:o,onToggleCheck:d,onContextMenu:g,onDiscard:b}){const{t:p}=ie(["terminal"]),v=n.status,k=jt[v],F=v==="deleted",y=v==="untracked"&&r,E=n.name.includes(".")?"."+n.name.split(".").pop():"",f=h&&n.path.includes("/")?n.path.slice(0,n.path.lastIndexOf("/")):"";return e.jsxs("div",{className:`git-file-item ${l?"selected":""}`,onClick:()=>!F&&c(n.path,v),onContextMenu:j=>{j.preventDefault(),g==null||g(j,n,v)},style:{cursor:F?"not-allowed":"pointer"},title:n.path,children:[d&&e.jsx("input",{type:"checkbox",className:"git-file-checkbox",checked:o||!1,onChange:j=>{j.stopPropagation(),d(n.path)},onClick:j=>j.stopPropagation()}),e.jsx("img",{className:"tree-icon",src:bt(E),alt:"file"}),e.jsxs("span",{className:"git-file-name",children:[n.name,f&&e.jsx("span",{className:"git-file-dir",children:f})]}),e.jsx("span",{className:"git-file-status",style:{color:k.color},children:k.icon}),n.oldPath&&e.jsxs("span",{className:"git-file-renamed",children:[e.jsx(D,{name:"subitem",size:10,style:{transform:"rotate(180deg)"}})," ",n.oldPath.split("/").pop()]}),y&&e.jsx("button",{className:`git-stage-btn ${i?"staging":""}`,onClick:j=>{j.stopPropagation(),i||r(n.path)},title:p("terminal:fileExplorer.stageFile"),disabled:i,children:i?"...":"+"}),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(D,{name:"revert",size:12})})]})}),fr=16,gr=22,xr=s.memo(function t({node:n,depth:l,expandedDirs:c,onToggleDir:r,selectedPath:i,onSelect:h,onStage:o,stagingPaths:d,checkedFiles:g,onToggleCheck:b,onContextMenu:p,onDirContextMenu:v,onDiscard:k}){const{t:F}=ie(["terminal"]),y=l*fr;if(!n.isDirectory){const f=n.file.status,j=jt[f];return e.jsxs("div",{className:`git-file-item ${i===n.path?"selected":""}`,onClick:()=>f!=="deleted"&&h(n.file.path,f),onContextMenu:C=>{C.preventDefault(),p==null||p(C,n.file,f)},style:{paddingLeft:`${y+gr}px`,cursor:f==="deleted"?"not-allowed":"pointer"},title:n.file.path,children:[b&&e.jsx("input",{type:"checkbox",className:"git-file-checkbox",checked:(g==null?void 0:g.has(n.file.path))||!1,onChange:C=>{C.stopPropagation(),b(n.file.path)},onClick:C=>C.stopPropagation()}),e.jsx("img",{className:"tree-icon",src:bt(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(D,{name:"subitem",size:10,style:{transform:"rotate(180deg)"}})," ",n.file.oldPath.split("/").pop()]}),f==="untracked"&&o&&e.jsx("button",{className:`git-stage-btn ${d!=null&&d.has(n.path)?"staging":""}`,onClick:C=>{C.stopPropagation(),d!=null&&d.has(n.path)||o(n.file.path)},title:F("terminal:fileExplorer.stageFile"),disabled:d==null?void 0:d.has(n.path),children:d!=null&&d.has(n.path)?"...":"+"}),k&&e.jsx("button",{className:"git-discard-btn",onClick:C=>{C.stopPropagation(),k(n.file,f)},title:f==="untracked"||f==="added"?"Delete file":"Discard changes",children:e.jsx(D,{name:"revert",size:12})})]})}const E=c.has(n.path);return e.jsxs("div",{className:"tree-node-wrapper",children:[e.jsxs("div",{className:`tree-node directory ${E?"expanded":""}`,style:{paddingLeft:`${y}px`},onClick:()=>r(n.path),onContextMenu:f=>{f.preventDefault(),f.stopPropagation(),v==null||v(f,n)},children:[e.jsx("span",{className:`tree-arrow ${E?"expanded":""}`,children:e.jsx(D,{name:"caret-right",size:10})}),e.jsx("img",{className:"tree-folder-icon",src:E?"/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:F("terminal:fileExplorer.fileCount",{count:n.fileCount})})]}),E&&e.jsx("div",{className:"tree-children",children:n.children.map(f=>e.jsx(t,{node:f,depth:l+1,expandedDirs:c,onToggleDir:r,selectedPath:i,onSelect:h,onStage:o,stagingPaths:d,checkedFiles:g,onToggleCheck:b,onContextMenu:p,onDirContextMenu:v,onDiscard:k},f.path))})]})}),ns=s.memo(function({groupLabel:n,groupIcon:l,groupColor:c,files:r,treeNodes:i,viewMode:h,selectedPath:o,expandedDirs:d,onToggleDir:g,onFileSelect:b,onStageFile:p,onStageAll:v,stagingPaths:k,checkedFiles:F,onToggleCheck:y,onContextMenu:E,onDirContextMenu:f,onDiscardFile:j,onDiscardAll:C}){const{t:M}=ie(["terminal"]);if(r.length===0)return null;const H=r.some(w=>w.status==="untracked"),G=H&&v&&r.length>0,K=k?r.every(w=>k.has(w.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," (",r.length,")",G&&e.jsx("button",{className:`git-stage-all-btn ${K?"staging":""}`,onClick:w=>{w.stopPropagation(),K||v()},title:M("terminal:fileExplorer.stageAllUntracked"),disabled:K,children:K?"...":M("terminal:fileExplorer.stageAll")}),C&&e.jsxs("button",{className:"git-discard-all-btn",onClick:w=>{w.stopPropagation(),C()},title:H?`Delete all ${r.length} files`:`Discard all ${r.length} changes`,children:[e.jsx(D,{name:"revert",size:12})," All"]})]}),h==="tree"?e.jsx("div",{className:"git-tree-content",children:i.map(w=>e.jsx(xr,{node:w,depth:0,expandedDirs:d,onToggleDir:g,selectedPath:o,onSelect:b,onStage:p,stagingPaths:k,checkedFiles:F,onToggleCheck:y,onContextMenu:E,onDirContextMenu:f,onDiscard:j},w.path))}):e.jsx("div",{className:"git-flat-content",children:r.map(w=>e.jsx(pr,{file:w,isSelected:o===w.path,onSelect:b,onStage:w.status==="untracked"?p:void 0,isStaging:k==null?void 0:k.has(w.path),showDirPath:!0,isChecked:F==null?void 0:F.has(w.path),onToggleCheck:y,onContextMenu:E,onDiscard:j},w.path))})]})});function yr({gitStatus:t,loading:n,onFileSelect:l,selectedPath:c,onRefresh:r,onStageFiles:i,stagingPaths:h,currentFolder:o,onCommitComplete:d,mergeInProgress:g,mergingBranch:b,onMergeContinue:p,onMergeAbort:v,onConflictOpen:k,onRevealInTree:F}){const{t:y}=ie(["terminal","common"]),[E,f]=s.useState("tree"),[j,C]=s.useState(new Set),[M,H]=s.useState(""),[G,K]=s.useState(""),[w,re]=s.useState(!1),[_,R]=s.useState(new Set),[P,X]=s.useState(!1),[Q,ne]=s.useState(null),ue=s.useRef(null),{showToast:U}=an(),[se,I]=s.useState(null),[B,Z]=s.useState(null),[L,we]=s.useState(null),ee=s.useCallback((N,$)=>{we({files:[N],label:N.name})},[]),m=s.useCallback(async()=>{if(!(!L||!o))try{const N=await V(A("/api/files/git-discard"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({files:L.files.map(O=>({path:O.path,status:O.status})),directory:o})}),$=await N.json();N.ok&&$.success?(U("success","Discarded",`Reverted ${L.files.length} file(s)`),r()):U("error","Discard Failed",$.error||"Could not discard changes")}catch{U("error","Discard Failed","Network error")}finally{we(null)}},[L,o,r,U]),q=s.useCallback((N,$,O)=>{N.preventDefault(),N.stopPropagation(),I({isOpen:!0,position:{x:N.clientX,y:N.clientY},file:$,status:O})},[]),le=s.useCallback(async(N,$)=>{if(o)try{const O=await V(A("/api/files/git-discard"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({files:[{path:N.path,status:$}],directory:o})}),Ee=await O.json();O.ok&&Ee.success?(U("success","Discarded",`Restored ${N.name}`),r()):U("error","Discard Failed",Ee.error||"Could not discard changes")}catch{U("error","Discard Failed","Network error")}},[o,r,U]),me=s.useCallback(async N=>{try{await navigator.clipboard.writeText(N),U("success","Copied","Full path copied")}catch{U("error","Copy Failed","Could not copy path")}},[U]),T=s.useCallback(async N=>{const $=o&&N.startsWith(o+"/")?N.slice(o.length+1):N;try{await navigator.clipboard.writeText($),U("success","Copied","Relative path copied")}catch{U("error","Copy Failed","Could not copy path")}},[o,U]),S=s.useMemo(()=>{if(!se)return[];const{file:N,status:$}=se,O=[];return $==="conflict"&&k?O.push({id:"open-conflict",label:y("terminal:fileExplorer.gitContextMenu.openConflictResolver"),icon:e.jsx(D,{name:"warn",size:14}),onClick:()=>k(N.path)}):$!=="deleted"&&O.push({id:"open-file",label:y("terminal:fileExplorer.gitContextMenu.openFile"),icon:e.jsx(D,{name:"file-text",size:14}),onClick:()=>l(N.path,$)}),$!=="conflict"&&O.push({id:"stage-file",label:y("terminal:fileExplorer.gitContextMenu.stageFile"),icon:e.jsx(D,{name:"plus",size:14}),onClick:()=>{i([N.path])}}),$!=="deleted"&&O.push({id:"download-file",label:"Download File",icon:e.jsx(D,{name:"download",size:14}),onClick:()=>rn(N.path,N.path.split("/").pop()||"file")}),O.push({id:"divider-1",label:"",divider:!0,onClick:()=>{}}),($==="modified"||$==="deleted"||$==="renamed"||$==="conflict")&&O.push({id:"discard-changes",label:y("terminal:fileExplorer.gitContextMenu.discardChanges"),icon:e.jsx(D,{name:"revert",size:14}),danger:!0,onClick:()=>{le(N,$)}}),($==="untracked"||$==="added")&&O.push({id:"delete-file",label:y("terminal:fileExplorer.gitContextMenu.deleteFile"),icon:e.jsx(D,{name:"trash",size:14}),danger:!0,onClick:()=>{le(N,$)}}),O.push({id:"divider-2",label:"",divider:!0,onClick:()=>{}}),O.push({id:"copy-full-path",label:y("terminal:fileExplorer.gitContextMenu.copyFullPath"),icon:e.jsx(D,{name:"pin",size:14}),onClick:()=>{me(N.path)}}),O.push({id:"copy-relative-path",label:y("terminal:fileExplorer.gitContextMenu.copyRelativePath"),icon:e.jsx(D,{name:"clipboard",size:14}),onClick:()=>{T(N.path)}}),F&&$!=="deleted"&&O.push({id:"reveal-in-tree",label:y("terminal:fileExplorer.gitContextMenu.revealInTree"),icon:e.jsx(D,{name:"target",size:14}),onClick:()=>F(N.path)}),O},[se,l,i,k,F,le,me,T,y]),te=s.useCallback((N,$)=>{N.preventDefault(),N.stopPropagation(),Z({isOpen:!0,position:{x:N.clientX,y:N.clientY},node:$})},[]),ae=s.useCallback(N=>!N.isDirectory&&N.file?[N.file]:N.children.flatMap($=>ae($)),[]),pe=s.useCallback(async N=>{if(!o)return;const $=ae(N);if($.length!==0)try{const O=await V(A("/api/files/git-discard"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({files:$.map(Se=>({path:Se.path,status:Se.status})),directory:o})}),Ee=await O.json();O.ok&&Ee.success?(U("success","Discarded",`Reverted ${$.length} file(s) in ${N.name}`),r()):U("error","Discard Failed",Ee.error||"Could not discard changes")}catch{U("error","Discard Failed","Network error")}},[o,ae,r,U]),oe=s.useMemo(()=>{if(!B)return[];const{node:N}=B,$=ae(N);return[{id:"discard-dir",label:`Discard Changes (${$.length} files)`,icon:e.jsx(D,{name:"revert",size:14}),danger:!0,onClick:()=>{pe(N)}},{id:"stage-dir",label:`Stage All (${$.length} files)`,icon:e.jsx(D,{name:"plus",size:14}),onClick:()=>{i($.map(O=>O.path))}},{id:"divider-download",label:"",divider:!0,onClick:()=>{}},{id:"download-dir",label:"Download Folder (.zip)",icon:e.jsx(D,{name:"download",size:14}),onClick:()=>ln(N.path,N.name)}]},[B,ae,pe,i]),W=s.useCallback(N=>{C($=>{const O=new Set($);return O.has(N)?O.delete(N):O.add(N),O})},[]),{conflictFiles:ye,conflictTree:Ge,changesFiles:_e,changesTree:vt,untrackedFiles:He,untrackedTree:Gt,allDirPaths:dt}=s.useMemo(()=>{if(!t||!t.isGitRepo||t.files.length===0)return{conflictFiles:[],conflictTree:[],changesFiles:[],changesTree:[],untrackedFiles:[],untrackedTree:[],allDirPaths:new Set};const N=new Set,$=t.files.filter(De=>De.status==="conflict"),O=Ht($);At(O,N);const Ee=t.files.filter(De=>De.status==="modified"||De.status==="added"||De.status==="deleted"||De.status==="renamed"),Se=Ht(Ee);At(Se,N);const Ct=t.files.filter(De=>De.status==="untracked"),Ye=Ht(Ct);return At(Ye,N),{conflictFiles:$,conflictTree:O,changesFiles:Ee,changesTree:Se,untrackedFiles:Ct,untrackedTree:Ye,allDirPaths:N}},[t]);s.useEffect(()=>{C(dt)},[dt]),s.useEffect(()=>{t!=null&&t.files&&R(new Set(t.files.map(N=>N.path)))},[t==null?void 0:t.files]);const We=s.useCallback(()=>{_e.length!==0&&we({files:_e,label:`${_e.length} changed files`})},[_e]),ut=s.useCallback(()=>{He.length!==0&&we({files:He,label:`${He.length} unversioned files`})},[He]),wt=s.useCallback(()=>{ye.length!==0&&we({files:ye,label:`${ye.length} conflicted files`})},[ye]),ht=ye.length>0;s.useEffect(()=>{if(Q){const N=Q.type==="error"?8e3:4e3,$=setTimeout(()=>ne(null),N);return()=>clearTimeout($)}},[Q]);const _t=s.useCallback(async()=>{const N=!w;if(re(N),N&&o){K(M);try{const O=await(await V(A(`/api/files/git-log-message?path=${encodeURIComponent(o)}`))).json();O.message&&H(O.message)}catch{}}else H(G)},[w,o,M,G]),Je=s.useCallback(N=>{R($=>{const O=new Set($);return O.has(N)?O.delete(N):O.add(N),O})},[]),Ce=s.useCallback(()=>{if(!(t!=null&&t.files))return;const N=t.files.map(O=>O.path),$=N.every(O=>_.has(O));R($?new Set:new Set(N))},[t==null?void 0:t.files,_]),ce=s.useCallback(async N=>{if(!(!o||!M.trim()||_.size===0||P)){X(!0),ne(null);try{const $=await V(A("/api/files/git-commit"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:o,message:M.trim(),amend:w,paths:Array.from(_)})}),O=await $.json();if(!$.ok||!O.success){ne({type:"error",text:O.error||"Commit failed"}),X(!1);return}if(N)try{const Ee=await V(A("/api/files/git-push"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({directory:o})}),Se=await Ee.json();Ee.ok&&Se.success?ne({type:"success",text:y("terminal:fileExplorer.committedAndPushed")}):ne({type:"error",text:y("terminal:fileExplorer.committedButPushFailed",{error:Se.error||"Unknown error"})})}catch{ne({type:"error",text:y("terminal:fileExplorer.committedButPushFailed",{error:"Network error"})})}else ne({type:"success",text:y("terminal:fileExplorer.committedSuccessfully")});H(""),K(""),re(!1),r(),d==null||d()}catch($){ne({type:"error",text:$.message||"Commit failed"})}finally{X(!1)}}},[o,M,w,_,P,r,d]);if(n)return e.jsx("div",{className:"git-changes-loading",children:y("terminal:fileExplorer.loadingGitStatus")});if(!t||!t.isGitRepo)return e.jsxs("div",{className:"git-changes-empty",children:[e.jsx("div",{className:"git-empty-icon",children:e.jsx(D,{name:"package",size:32})}),e.jsx("div",{className:"git-empty-text",children:y("terminal:fileExplorer.notGitRepo")})]});if(t.files.length===0)return e.jsxs("div",{className:"git-changes-empty",children:[e.jsx("div",{className:"git-empty-icon",children:e.jsx(D,{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:t.branch})})]});const Ne=N=>{i([N])},ke=()=>{const N=He.map($=>$.path);N.length>0&&i(N)},Ae=(N,$)=>{$==="conflict"&&k?k(N):l(N,$)};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(D,{name:"git-branch",size:12})}),t.branch]}),t.counts&&e.jsxs("div",{className:"git-changes-summary",children:[(t.counts.conflict??0)>0&&e.jsxs("span",{className:"git-count conflict",children:[t.counts.conflict,"C"]}),t.counts.modified>0&&e.jsxs("span",{className:"git-count modified",children:[t.counts.modified,"M"]}),t.counts.added>0&&e.jsxs("span",{className:"git-count added",children:[t.counts.added,"A"]}),t.counts.deleted>0&&e.jsxs("span",{className:"git-count deleted",children:[t.counts.deleted,"D"]}),t.counts.untracked>0&&e.jsxs("span",{className:"git-count untracked",children:[t.counts.untracked,"?"]})]}),e.jsxs("div",{className:"git-view-toggle",children:[e.jsx("button",{className:`git-view-toggle-btn ${E==="flat"?"active":""}`,onClick:()=>f("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 ${E==="tree"?"active":""}`,onClick:()=>f("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:r,title:y("common:buttons.refresh"),children:e.jsx(D,{name:"refresh",size:12})})]}),g&&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:p,disabled:ht,title:y(ht?"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(ns,{groupLabel:y("terminal:fileExplorer.gitGroups.conflicts"),groupIcon:"C",groupColor:"#ff5555",files:ye,treeNodes:Ge,viewMode:E,selectedPath:c,expandedDirs:j,onToggleDir:W,onFileSelect:Ae,checkedFiles:_,onToggleCheck:Je,onContextMenu:q,onDirContextMenu:te,onDiscardFile:ee,onDiscardAll:wt}),e.jsx(ns,{groupLabel:y("terminal:fileExplorer.gitGroups.changes"),groupIcon:"~",groupColor:"#c89a5a",files:_e,treeNodes:vt,viewMode:E,selectedPath:c,expandedDirs:j,onToggleDir:W,onFileSelect:Ae,checkedFiles:_,onToggleCheck:Je,onContextMenu:q,onDirContextMenu:te,onDiscardFile:ee,onDiscardAll:We}),e.jsx(ns,{groupLabel:y("terminal:fileExplorer.gitGroups.unversioned"),groupIcon:"?",groupColor:"#6ab8c8",files:He,treeNodes:Gt,viewMode:E,selectedPath:c,expandedDirs:j,onToggleDir:W,onFileSelect:Ae,onStageFile:Ne,onStageAll:ke,stagingPaths:h,checkedFiles:_,onToggleCheck:Je,onContextMenu:q,onDirContextMenu:te,onDiscardFile:ee,onDiscardAll:ut})]}),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:w,onChange:_t}),y("terminal:fileExplorer.amend")]}),e.jsx("span",{className:"git-commit-file-count",children:y("terminal:fileExplorer.fileCount",{count:_.size})}),e.jsx("button",{className:"git-commit-select-toggle",onClick:Ce,title:_.size===t.files.length?y("terminal:fileExplorer.deselectAll"):y("terminal:fileExplorer.selectAll"),children:_.size===t.files.length?y("terminal:fileExplorer.deselectAll"):y("terminal:fileExplorer.selectAll")})]}),e.jsx("textarea",{ref:ue,className:"git-commit-message",placeholder:y("terminal:fileExplorer.commitMessagePlaceholder"),value:M,onChange:N=>H(N.target.value),onKeyDown:N=>{(N.metaKey||N.ctrlKey)&&N.key==="Enter"&&(N.preventDefault(),ce(!1)),(N.metaKey||N.ctrlKey)&&N.shiftKey&&N.key==="Enter"&&(N.preventDefault(),ce(!0)),N.stopPropagation()},rows:3,disabled:P}),Q&&e.jsx("div",{className:`git-commit-status ${Q.type}`,children:Q.text}),e.jsxs("div",{className:"git-commit-actions",children:[e.jsx("button",{className:"git-commit-btn",onClick:()=>ce(!1),disabled:!M.trim()||_.size===0||P,title:y("terminal:fileExplorer.commitCtrlEnter"),children:y(P?"terminal:fileExplorer.committing":"terminal:fileExplorer.commitAction")}),e.jsx("button",{className:"git-commit-push-btn",onClick:()=>ce(!0),disabled:!M.trim()||_.size===0||P,title:y("terminal:fileExplorer.commitAndPushCtrlShiftEnter"),children:P?"...":y("terminal:fileExplorer.commitAndPush")})]})]}),se&&e.jsx(lt,{isOpen:se.isOpen,position:se.position,worldPosition:{x:0,z:0},actions:S,onClose:()=>I(null)}),B&&e.jsx(lt,{isOpen:B.isOpen,position:B.position,worldPosition:{x:0,z:0},actions:oe,onClose:()=>Z(null)}),L&&e.jsx("div",{className:"git-discard-confirm-overlay",onClick:()=>we(null),children:e.jsxs("div",{className:"git-discard-confirm",onClick:N=>N.stopPropagation(),children:[e.jsx("p",{children:L.files.some(N=>N.status==="untracked"||N.status==="added")?e.jsxs(e.Fragment,{children:["Delete ",e.jsx("strong",{children:L.label}),"?"]}):e.jsxs(e.Fragment,{children:["Discard changes to ",e.jsx("strong",{children:L.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:()=>we(null),children:"Cancel"}),e.jsx("button",{className:"git-discard-confirm-btn",onClick:m,children:L.files.some(N=>N.status==="untracked"||N.status==="added")?"Delete":"Discard"})]})]})})]})}const mn=s.memo(yr,(t,n)=>t.loading!==n.loading||t.selectedPath!==n.selectedPath||t.stagingPaths!==n.stagingPaths||t.currentFolder!==n.currentFolder||t.mergeInProgress!==n.mergeInProgress||t.mergingBranch!==n.mergingBranch?!1:t.gitStatus===null&&n.gitStatus===null?!0:!(t.gitStatus===null||n.gitStatus===null||t.gitStatus.isGitRepo!==n.gitStatus.isGitRepo||t.gitStatus.branch!==n.gitStatus.branch||t.gitStatus.files.length!==n.gitStatus.files.length||t.gitStatus.mergeInProgress!==n.gitStatus.mergeInProgress));mn.displayName="GitChanges";const br=s.memo(function({tab:n,isActive:l,onSelect:c,onClose:r,onContextMenu:i}){const{t:h}=ie(["terminal"]),o={name:n.filename,path:n.path,isDirectory:!1,extension:n.extension},d=s.useCallback(()=>{c(n.path)},[c,n.path]),g=s.useCallback(v=>{v.button===1&&(v.preventDefault(),v.stopPropagation(),r(n.path))},[r,n.path]),b=s.useCallback(v=>{v.preventDefault(),v.stopPropagation(),r(n.path)},[r,n.path]),p=s.useCallback(v=>{v.preventDefault(),v.stopPropagation(),i(v,n)},[i,n]);return e.jsxs("div",{className:`file-tab ${l?"active":""}`,onClick:d,onMouseDown:g,onContextMenu:p,title:n.path,children:[e.jsx("img",{className:"file-tab-icon",src:is(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 jr(t){return typeof t.path=="string"&&t.path.startsWith("/")}function vr({tabs:t,activeTabPath:n,onSelectTab:l,onCloseTab:c,onCloseAllTabs:r,onShowGitHistory:i}){const{t:h}=ie(["terminal"]),[o,d]=s.useState(null),g=s.useCallback((v,k)=>{d({isOpen:!0,position:{x:v.clientX,y:v.clientY},tab:k})},[]),b=s.useCallback(()=>d(null),[]),p=s.useMemo(()=>{if(!o)return[];const v=o.tab,k=!!i&&jr(v),F=[{id:"git-history",label:h("terminal:fileExplorer.showGitHistory")??"Show Git History",icon:e.jsx(D,{name:"git-commit",size:14}),disabled:!k,onClick:()=>{k&&i(v.path)}}];return r&&F.push({id:"divider-close-all",label:"",divider:!0,onClick:()=>{}},{id:"close-all-tabs",label:h("terminal:fileExplorer.closeAllTabs")??"Close all tabs",icon:e.jsx(D,{name:"cross",size:14}),danger:!0,onClick:()=>r()}),F},[o,i,r,h]);return t.length===0?null:e.jsxs("div",{className:"file-tabs-bar",children:[e.jsx("div",{className:"file-tabs-container",children:t.map(v=>e.jsx(br,{tab:v,isActive:n===v.path,onSelect:l,onClose:c,onContextMenu:g},v.path))}),o&&e.jsx(lt,{isOpen:o.isOpen,position:o.position,worldPosition:{x:0,z:0},actions:p,onClose:b})]})}const pn=s.memo(vr,(t,n)=>{if(t.activeTabPath!==n.activeTabPath||t.tabs.length!==n.tabs.length||t.onShowGitHistory!==n.onShowGitHistory||t.onCloseAllTabs!==n.onCloseAllTabs)return!1;for(let l=0;l<t.tabs.length;l++)if(t.tabs[l].path!==n.tabs[l].path)return!1;return!0});pn.displayName="FileTabs";const wr=s.memo(function({currentFolder:n,gitStatus:l,onBranchChanged:c,onMerge:r,onCompare:i,onPullConflicts:h}){const{t:o}=ie(["terminal","common"]),[d,g]=s.useState(!1),[b,p]=s.useState(""),[v,k]=s.useState(!1),[F,y]=s.useState(""),[E,f]=s.useState(!1),[j,C]=s.useState(null),[M,H]=s.useState(null),G=s.useRef(null),K=s.useRef(null),w=s.useRef(null),{branches:re,loading:_,operationInProgress:R,loadBranches:P,checkoutBranch:X,createBranch:Q,pullFromRemote:ne,pushToRemote:ue}=ls();s.useEffect(()=>{d&&n&&(P(n),setTimeout(()=>{var S;return(S=K.current)==null?void 0:S.focus()},50)),d||(p(""),k(!1),y(""),C(null))},[d,n,P]),s.useEffect(()=>{if(j){const S=j.type==="error"?8e3:3e3,te=setTimeout(()=>C(null),S);return()=>clearTimeout(te)}},[j]),s.useEffect(()=>{v&&setTimeout(()=>{var S;return(S=w.current)==null?void 0:S.focus()},50)},[v]),s.useEffect(()=>{if(!d)return;const S=ae=>{const pe=ae.target;!pe.closest(".branch-widget-selector")&&!pe.closest(".branch-widget-dropdown")&&g(!1)},te=ae=>{ae.key==="Escape"&&(ae.preventDefault(),ae.stopPropagation(),g(!1))};return document.addEventListener("click",S),document.addEventListener("keydown",te,!0),()=>{document.removeEventListener("click",S),document.removeEventListener("keydown",te,!0)}},[d]);const U=s.useCallback(async S=>{if(!n||R||S.isCurrent)return;const te=await X(n,S.name);te.success?(C({type:"success",text:o("terminal:fileExplorer.switchedToBranch",{branch:te.branch||S.name})}),c(),P(n)):C({type:"error",text:te.error||o("terminal:fileExplorer.checkoutFailed")})},[n,R,X,c,P]),se=s.useCallback(async()=>{if(!n||!F.trim()||R)return;const S=await Q(n,F.trim());S.success?(C({type:"success",text:o("terminal:fileExplorer.createdBranch",{branch:S.branch})}),k(!1),y(""),c(),P(n)):C({type:"error",text:S.error||o("terminal:fileExplorer.createBranchFailed")})},[n,F,R,Q,c,P]),I=s.useCallback(async()=>{if(!n||R)return;const S=await ne(n);S.success?(S.stashConflicts&&S.stashConflicts.length>0?(C({type:"error",text:`Pull succeeded but stash pop had conflicts: ${S.stashConflicts.length} file(s). Resolve manually.`}),h==null||h(S.stashConflicts),g(!1)):S.stashed?C({type:"success",text:"Pull complete. Local changes were auto-stashed and restored."}):C({type:"success",text:o("terminal:fileExplorer.pullComplete")}),c(),P(n)):S.conflicts&&S.conflicts.length>0?(C({type:"error",text:`Pull conflicts: ${S.conflicts.length} file(s)`}),h==null||h(S.conflicts),g(!1)):C({type:"error",text:S.error||o("terminal:fileExplorer.pullFailed")})},[n,R,ne,c,P,h]),B=s.useCallback(async()=>{if(!n||R)return;const S=await ue(n);S.success?C({type:"success",text:o("terminal:fileExplorer.pushComplete")}):C({type:"error",text:S.error||o("terminal:fileExplorer.pushFailed")})},[n,R,ue]),[Z,L]=s.useState(!1),we=s.useCallback(async()=>{if(!(!n||R||Z)){L(!0);try{const S=await V(A("/api/files/git-fetch"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:n})});if(S.ok)C({type:"success",text:"Fetch complete"}),c(),P(n);else{const te=await S.json().catch(()=>({error:"Fetch failed"}));C({type:"error",text:te.error||"Fetch failed"})}}catch{C({type:"error",text:"Fetch failed"})}finally{L(!1)}}},[n,R,Z,c,P]),ee=(l==null?void 0:l.branch)||"unknown",m=!!R,q=s.useCallback((S,te)=>{te.isCurrent||(S.preventDefault(),S.stopPropagation(),H({isOpen:!0,position:{x:S.clientX,y:S.clientY},branch:te.name}))},[]),le=s.useMemo(()=>{if(!M)return[];const S=!!R||(l==null?void 0:l.mergeInProgress);return[{id:"compare",label:o("terminal:fileExplorer.showDiffWith",{branch:M.branch}),icon:e.jsx(D,{name:"arrows-horizontal",size:14}),disabled:!!R,onClick:()=>{i==null||i(M.branch),g(!1)}},{id:"merge",label:o("terminal:fileExplorer.mergeInto",{source:M.branch,target:ee}),icon:"⤵",disabled:!!S,onClick:()=>{r&&r(M.branch),g(!1)}},{id:"divider-1",label:"",divider:!0,onClick:()=>{}},{id:"checkout",label:o("terminal:fileExplorer.checkoutBranch",{branch:M.branch}),icon:e.jsx(D,{name:"git-branch",size:14}),disabled:!!R,onClick:()=>{const te=re.find(ae=>ae.name===M.branch);te&&U(te)}}]},[M,R,l==null?void 0:l.mergeInProgress,ee,r,i,re,U]),me=s.useMemo(()=>{const S=re.filter(ae=>!ae.isRemote);if(!b)return S;const te=b.toLowerCase();return S.filter(ae=>ae.name.toLowerCase().includes(te))},[re,b]),T=s.useMemo(()=>{const S=re.filter(ae=>ae.isRemote);if(!b)return S;const te=b.toLowerCase();return S.filter(ae=>ae.name.toLowerCase().includes(te))},[re,b]);return e.jsxs("div",{className:"branch-widget",style:{position:"relative"},children:[e.jsxs("div",{className:"branch-widget-selector",onClick:S=>{S.stopPropagation(),g(!d)},title:`Branch: ${ee}`,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:ee}),e.jsx("span",{className:"branch-widget-arrow",children:"▼"})]}),d&&e.jsxs("div",{className:"branch-widget-dropdown",ref:G,children:[e.jsx("div",{className:"branch-widget-search",children:e.jsx("input",{ref:K,type:"text",className:"branch-widget-search-input",placeholder:o("terminal:fileExplorer.searchBranches"),value:b,onChange:S=>p(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||Z?"disabled":""}`,onClick:we,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:Z?"Fetching...":"Fetch"})]}),e.jsxs("div",{className:`branch-widget-action-item ${m?"disabled":""}`,onClick:I,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(R==="pull"?"terminal:fileExplorer.pulling":"terminal:fileExplorer.pull")})]}),e.jsxs("div",{className:`branch-widget-action-item ${m?"disabled":""}`,onClick:B,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(R==="push"?"terminal:fileExplorer.pushing":"terminal:fileExplorer.push")})]}),e.jsxs("div",{className:`branch-widget-action-item ${m?"disabled":""}`,onClick:()=>{m||k(!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:w,type:"text",className:"branch-widget-new-branch-input",placeholder:o("terminal:fileExplorer.branchNamePlaceholder"),value:F,onChange:S=>y(S.target.value),onKeyDown:S=>{S.stopPropagation(),S.key==="Enter"&&se(),S.key==="Escape"&&(k(!1),y(""))}}),e.jsx("button",{className:"branch-widget-new-branch-confirm",onClick:se,disabled:!F.trim()||m,children:R==="create"?"...":o("common:buttons.create")})]}),e.jsxs("div",{className:"branch-widget-section-header",children:[o("terminal:fileExplorer.localBranches"),_&&e.jsxs("span",{className:"branch-widget-loading-hint",children:[" ",o("terminal:fileExplorer.loading")]})]}),e.jsxs("div",{className:"branch-widget-branch-list",children:[me.length===0&&!_&&e.jsx("div",{className:"branch-widget-empty",children:o("terminal:fileExplorer.noBranchesFound")}),me.map(S=>e.jsxs("div",{className:`branch-widget-branch-item ${S.isCurrent?"current":""} ${m?"disabled":""}`,onClick:()=>U(S),onContextMenu:te=>q(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))]}),T.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"branch-widget-section-header clickable",onClick:()=>f(!E),children:[e.jsx("span",{className:"branch-widget-section-toggle",children:E?"▾":"▸"}),o("terminal:fileExplorer.remoteBranches",{count:T.length})]}),E&&e.jsx("div",{className:"branch-widget-branch-list",children:T.map(S=>e.jsxs("div",{className:`branch-widget-branch-item remote ${m?"disabled":""}`,onClick:()=>U(S),onContextMenu:te=>q(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))})]})]}),M&&e.jsx(lt,{isOpen:M.isOpen,position:M.position,worldPosition:{x:0,z:0},actions:le,onClose:()=>H(null)})]})});function Cr(t){return t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function $t(t,n){if(!t)return"";const l=Us.languages[n];return l?Us.highlight(t,l,n):Cr(t)}function Nr(t){const n=[],l=t.split(`
|
|
9
9
|
`);let c=[],r=!1,i=[],h=[],o=!1;for(const d of l)d.startsWith("<<<<<<<")?(c.length>0&&(n.push({type:"unchanged",content:c.join(`
|
|
10
10
|
`)}),c=[]),r=!0,o=!1,i=[],h=[]):d.startsWith("=======")&&r?o=!0:d.startsWith(">>>>>>>")&&r?(n.push({type:"conflict",ours:i.join(`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{V as ts,u as rs,ah as _s,ai as vs,aj as Is,j as s,I as B,t as Es,ak as $s,al as Ds,am as Ms,an as Ls,ao as Ps,r as o,ap as Ss,E as Xs,f as Ys,a1 as Rs,aq as Gs,ar as Us,as as Fs,at as Hs,au as Zs,av as Bs,s as M,aw as Ks,ax as G}from"./main-Bt4E0_YW.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DYBBrXTx.js";const bs=ts.memo(({agent:a,isSelected:z,isKeyboardFocused:U=!1,onSelect:L,onDoubleClick:r,onChat:p,onFocus:h,onKill:w,onDragStart:P})=>{const{t:x}=rs(["dashboard","common"]),S=_s().has(a.id),N=vs(a.status),F=Is(a),j=Ps(F),I=a.taskLabel?s.jsxs(s.Fragment,{children:[s.jsx(B,{name:"task",size:12})," ",a.taskLabel]}):a.currentTask||a.lastAssignedTask,m=a.status==="idle"&&a.lastActivity>0,[,H]=ts.useState(0);return ts.useEffect(()=>{if(!m)return;const b=window.setInterval(()=>H(q=>q+1),15e3);return()=>window.clearInterval(b)},[m]),s.jsxs("div",{className:`dash-card dash-card--${N} ${z?"dash-card--selected":""} ${U?"dash-card--keyboard-focused":""}`,"data-agent-id":a.id,onClick:()=>L(a.id),onDoubleClick:b=>{b.stopPropagation(),r(a.id)},onDragStart:b=>{P==null||P(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($s,{agent:a,alt:"",className:"dash-card__provider-icon"})," ",a.provider]}),S&&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:S?"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:`${F}%`}})}),s.jsxs("span",{className:`dash-card__context-pct dash-card__context-pct--${j}`,children:[F,"%"]})]})]}),s.jsxs("div",{className:"dash-card__row3",children:[s.jsxs("span",{className:"dash-card__workdir",title:a.cwd,children:[s.jsx(B,{name:"folder",size:11})," ",a.cwd.split("/").pop()||a.cwd]}),m&&s.jsxs("span",{className:"dash-card__idle-time",style:{color:Ls(a.lastActivity)},title:Ms(a.lastActivity),children:[s.jsx(B,{name:"status-waiting-input",size:10})," ",Ds(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:[p&&s.jsx("button",{className:"dash-card__action-btn dash-card__action-btn--chat",onClick:b=>{b.stopPropagation(),p(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:U}=rs(["dashboard"]),L=o.useMemo(()=>Array.from(a.values()).sort((r,p)=>r.name.localeCompare(p.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:U("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 p=vs(r.status),h=Ss(r.type);return s.jsxs("button",{className:`dash-pill dash-pill--${p}`,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(B,{name:h,size:14})}),s.jsx("span",{className:"dash-pill__name",children:r.name}),s.jsx("span",{className:`dash-pill__dot dash-pill__dot--${p}`})]},r.id)})})]})};fs.displayName="BuildingPills";function Js({onSelectAgent:a,onFocusAgent:z,onKillAgent:U,onSelectBuilding:L,onOpenTerminal:r,onFocusZone:p}){const{t:h}=rs(["dashboard","common"]),w=Xs(),P=Ys(),x=Rs(),ns=Gs(),S=_s(),[N,F]=o.useState(""),[j,I]=o.useState("all"),[m,H]=o.useState("zone"),[b,q]=o.useState(new Set),[k,J]=o.useState(null),[ws,K]=o.useState(null),[X,Q]=o.useState(!1),[g,Z]=o.useState(null),V=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"?Us(w,x):m==="status"?Fs(w,S):Hs(w),[w,x,m,S]),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"?Zs(e.agents,{prioritizeRecentlyIdle:!0}):Bs(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]),gs=o.useCallback(e=>{q(d=>{const l=new Set(d);return l.has(e)?l.delete(e):l.add(e),l})},[]),ps=o.useCallback(e=>{r==null||r(e)},[r]),xs=o.useCallback(e=>{a==null||a(e),Q(!0),Z(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()),_=Ks(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),Z(null);return}X&&(!g||!C.some(e=>e.id===g))&&(Z(C[0].id),a==null||a(C[0].id))},[C,X,g,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 Y=f.findIndex(i=>i.some(u=>u.id===t));if(Y===-1)return((cs=(os=f[0])==null?void 0:os[0])==null?void 0:cs.id)??t;const $=f[Y],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 W=n==="up"?Math.max(0,Y-1):Math.min(f.length-1,Y+1),c=f[W],R=$[v].centerX;let D=c[0],ds=Math.abs(D.centerX-R);for(const i of c){const u=Math.abs(i.centerX-R);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"),Y=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),Z(c=>{const R=c&&C.some(D=>D.id===c)?c:C[0].id;return a==null||a(R),window.setTimeout(()=>l(R),0),R});return}const W=G(t,es)||t.key==="ArrowLeft"?"left":G(t,as)||t.key==="ArrowDown"?"down":G(t,f)||t.key==="ArrowUp"?"up":G(t,Y)||t.key==="ArrowRight"?"right":null;if(W&&X&&g){t.preventDefault(),t.stopPropagation();const c=_(g,W);c!==g&&(Z(c),a==null||a(c),window.setTimeout(()=>l(c),0));return}if(G(t,$)){if(v.terminalOpen)return;if(X&&g&&v.agents.has(g)){t.preventDefault(),r==null||r(g);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,X,g,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:V.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:V.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:V.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:V.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=>F(e.target.value)})]}),s.jsxs("div",{className:"dashboard-view__grouping",children:[s.jsx("button",{className:`dashboard-view__grouping-btn ${m==="zone"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>H("zone"),children:h("grouping.byZone")}),s.jsx("button",{className:`dashboard-view__grouping-btn ${m==="status"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>H("status"),children:h("grouping.byStatus")}),s.jsx("button",{className:`dashboard-view__grouping-btn ${m==="activity"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>H("activity"),children:h("grouping.byActivity")})]}),s.jsxs("div",{className:"dashboard-view__content",children:[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=>S.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:()=>gs(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(B,{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&&p&&s.jsx("button",{className:"dashboard-view__zone-focus",onClick:n=>{n.stopPropagation(),p(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:X&&g===n.id,onSelect:xs,onDoubleClick:ps,onChat:js,onFocus:z,onKill:U,onDragStart:Ns},n.id))})]},d)}),T.length===0&&s.jsx("div",{className:"dashboard-view__empty",children:N?h("noAgentsMatching",{search:N}):h("noAgentsSpawned")}),P.size>0&&s.jsx(fs,{buildings:P,onSelectBuilding:L})]})]})}export{Js as DashboardView};
|
|
1
|
+
import{V as ts,u as rs,ah as _s,ai as vs,aj as Is,j as s,I as B,t as Es,ak as $s,al as Ds,am as Ms,an as Ls,ao as Ps,r as o,ap as Ss,E as Xs,f as Ys,a1 as Rs,aq as Gs,ar as Us,as as Fs,at as Hs,au as Zs,av as Bs,s as M,aw as Ks,ax as G}from"./main-D0r07JA_.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DYBBrXTx.js";const bs=ts.memo(({agent:a,isSelected:z,isKeyboardFocused:U=!1,onSelect:L,onDoubleClick:r,onChat:p,onFocus:h,onKill:w,onDragStart:P})=>{const{t:x}=rs(["dashboard","common"]),S=_s().has(a.id),N=vs(a.status),F=Is(a),j=Ps(F),I=a.taskLabel?s.jsxs(s.Fragment,{children:[s.jsx(B,{name:"task",size:12})," ",a.taskLabel]}):a.currentTask||a.lastAssignedTask,m=a.status==="idle"&&a.lastActivity>0,[,H]=ts.useState(0);return ts.useEffect(()=>{if(!m)return;const b=window.setInterval(()=>H(q=>q+1),15e3);return()=>window.clearInterval(b)},[m]),s.jsxs("div",{className:`dash-card dash-card--${N} ${z?"dash-card--selected":""} ${U?"dash-card--keyboard-focused":""}`,"data-agent-id":a.id,onClick:()=>L(a.id),onDoubleClick:b=>{b.stopPropagation(),r(a.id)},onDragStart:b=>{P==null||P(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($s,{agent:a,alt:"",className:"dash-card__provider-icon"})," ",a.provider]}),S&&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:S?"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:`${F}%`}})}),s.jsxs("span",{className:`dash-card__context-pct dash-card__context-pct--${j}`,children:[F,"%"]})]})]}),s.jsxs("div",{className:"dash-card__row3",children:[s.jsxs("span",{className:"dash-card__workdir",title:a.cwd,children:[s.jsx(B,{name:"folder",size:11})," ",a.cwd.split("/").pop()||a.cwd]}),m&&s.jsxs("span",{className:"dash-card__idle-time",style:{color:Ls(a.lastActivity)},title:Ms(a.lastActivity),children:[s.jsx(B,{name:"status-waiting-input",size:10})," ",Ds(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:[p&&s.jsx("button",{className:"dash-card__action-btn dash-card__action-btn--chat",onClick:b=>{b.stopPropagation(),p(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:U}=rs(["dashboard"]),L=o.useMemo(()=>Array.from(a.values()).sort((r,p)=>r.name.localeCompare(p.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:U("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 p=vs(r.status),h=Ss(r.type);return s.jsxs("button",{className:`dash-pill dash-pill--${p}`,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(B,{name:h,size:14})}),s.jsx("span",{className:"dash-pill__name",children:r.name}),s.jsx("span",{className:`dash-pill__dot dash-pill__dot--${p}`})]},r.id)})})]})};fs.displayName="BuildingPills";function Js({onSelectAgent:a,onFocusAgent:z,onKillAgent:U,onSelectBuilding:L,onOpenTerminal:r,onFocusZone:p}){const{t:h}=rs(["dashboard","common"]),w=Xs(),P=Ys(),x=Rs(),ns=Gs(),S=_s(),[N,F]=o.useState(""),[j,I]=o.useState("all"),[m,H]=o.useState("zone"),[b,q]=o.useState(new Set),[k,J]=o.useState(null),[ws,K]=o.useState(null),[X,Q]=o.useState(!1),[g,Z]=o.useState(null),V=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"?Us(w,x):m==="status"?Fs(w,S):Hs(w),[w,x,m,S]),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"?Zs(e.agents,{prioritizeRecentlyIdle:!0}):Bs(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]),gs=o.useCallback(e=>{q(d=>{const l=new Set(d);return l.has(e)?l.delete(e):l.add(e),l})},[]),ps=o.useCallback(e=>{r==null||r(e)},[r]),xs=o.useCallback(e=>{a==null||a(e),Q(!0),Z(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()),_=Ks(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),Z(null);return}X&&(!g||!C.some(e=>e.id===g))&&(Z(C[0].id),a==null||a(C[0].id))},[C,X,g,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 Y=f.findIndex(i=>i.some(u=>u.id===t));if(Y===-1)return((cs=(os=f[0])==null?void 0:os[0])==null?void 0:cs.id)??t;const $=f[Y],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 W=n==="up"?Math.max(0,Y-1):Math.min(f.length-1,Y+1),c=f[W],R=$[v].centerX;let D=c[0],ds=Math.abs(D.centerX-R);for(const i of c){const u=Math.abs(i.centerX-R);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"),Y=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),Z(c=>{const R=c&&C.some(D=>D.id===c)?c:C[0].id;return a==null||a(R),window.setTimeout(()=>l(R),0),R});return}const W=G(t,es)||t.key==="ArrowLeft"?"left":G(t,as)||t.key==="ArrowDown"?"down":G(t,f)||t.key==="ArrowUp"?"up":G(t,Y)||t.key==="ArrowRight"?"right":null;if(W&&X&&g){t.preventDefault(),t.stopPropagation();const c=_(g,W);c!==g&&(Z(c),a==null||a(c),window.setTimeout(()=>l(c),0));return}if(G(t,$)){if(v.terminalOpen)return;if(X&&g&&v.agents.has(g)){t.preventDefault(),r==null||r(g);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,X,g,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:V.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:V.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:V.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:V.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=>F(e.target.value)})]}),s.jsxs("div",{className:"dashboard-view__grouping",children:[s.jsx("button",{className:`dashboard-view__grouping-btn ${m==="zone"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>H("zone"),children:h("grouping.byZone")}),s.jsx("button",{className:`dashboard-view__grouping-btn ${m==="status"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>H("status"),children:h("grouping.byStatus")}),s.jsx("button",{className:`dashboard-view__grouping-btn ${m==="activity"?"dashboard-view__grouping-btn--active":""}`,onClick:()=>H("activity"),children:h("grouping.byActivity")})]}),s.jsxs("div",{className:"dashboard-view__content",children:[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=>S.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:()=>gs(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(B,{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&&p&&s.jsx("button",{className:"dashboard-view__zone-focus",onClick:n=>{n.stopPropagation(),p(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:X&&g===n.id,onSelect:xs,onDoubleClick:ps,onChat:js,onFocus:z,onKill:U,onDragStart:Ns},n.id))})]},d)}),T.length===0&&s.jsx("div",{className:"dashboard-view__empty",children:N?h("noAgentsMatching",{search:N}):h("noAgentsSpawned")}),P.size>0&&s.jsx(fs,{buildings:P,onSelectBuilding:L})]})]})}export{Js as DashboardView};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as G,bT as ee,r as l,s as u,j as e,bU as oe,I as L,_ as me,bV as be,bW as ue,bX as he,bY as _e,bZ as pe,b_ as xe,b$ as fe}from"./main-Bt4E0_YW.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DYBBrXTx.js";const je=({building:a,connections:j,activeConnectionId:d,activeDatabase:n,collapsed:y,onToggleCollapse:_,onConnectionChange:D,onDatabaseChange:R,onInsertTable:N,onSelectTableQuery:F})=>{const{t:x}=G(["terminal"]),f=ee(a.id),[I,U]=l.useState(new Set),[T,r]=l.useState(""),[i,g]=l.useState(""),[w,O]=l.useState(!1),[P,V]=l.useState(null),H=l.useRef(null),K=l.useRef(null),C=l.useRef(null),k=d?f.databases.get(d)??[]:[],q=d&&n?`${d}:${n}`:"",$=q?f.tables.get(q)??[]:[],h=d?f.connectionStatus.get(d):void 0,E=l.useMemo(()=>{if(!T.trim())return k;const t=T.toLowerCase();return k.filter(o=>o.toLowerCase().includes(t))},[k,T]),z=l.useMemo(()=>{if(!i.trim())return $;const t=i.toLowerCase();return $.filter(o=>o.name.toLowerCase().includes(t))},[$,i]);l.useEffect(()=>{const t=o=>{K.current&&!K.current.contains(o.target)&&O(!1)};return w&&document.addEventListener("mousedown",t),()=>document.removeEventListener("mousedown",t)},[w]),l.useEffect(()=>{d&&!h&&u.testDatabaseConnection(a.id,d)},[a.id,d,h]),l.useEffect(()=>{d&&(h!=null&&h.connected)&&k.length===0&&u.listDatabases(a.id,d)},[a.id,d,h==null?void 0:h.connected,k.length]),l.useEffect(()=>{d&&n&&$.length===0&&u.listTables(a.id,d,n)},[a.id,d,n,$.length]),l.useEffect(()=>{V(null),g("")},[d,n]);const b=l.useCallback(t=>{U(o=>{const v=new Set(o);if(v.has(t))v.delete(t);else if(v.add(t),d&&n){const S=`${d}:${n}:${t}`;f.tableSchemas.has(S)||u.getTableSchema(a.id,d,n,t)}return v})},[a.id,d,n,f.tableSchemas]),p=t=>{if(!d||!n)return null;const o=`${d}:${n}:${t}`;return f.tableSchemas.get(o)};return y?e.jsx("div",{className:"database-sidebar database-sidebar--collapsed",children:e.jsx("button",{className:"database-sidebar__toggle",onClick:_,title:x("terminal:database.expandSidebar"),children:"»"})}):e.jsxs("div",{className:"database-sidebar",children:[e.jsxs("div",{className:"database-sidebar__header",children:[e.jsx("span",{children:x("terminal:database.explorer")}),e.jsx("button",{className:"database-sidebar__toggle",onClick:_,title:x("terminal:database.collapseSidebar"),children:"«"})]}),e.jsxs("div",{className:"database-sidebar__section",children:[e.jsx("div",{className:"database-sidebar__section-title",children:x("terminal:database.connection")}),e.jsx("select",{className:"database-sidebar__select",value:d||"",onChange:t=>D(t.target.value),children:j.length===0?e.jsx("option",{value:"",children:x("terminal:database.noConnections")}):j.map(t=>{var o;return e.jsxs("option",{value:t.id,children:[((o=oe[t.engine])==null?void 0:o.icon)??"🗄️"," ",t.name]},t.id)})}),h&&e.jsx("div",{className:`database-sidebar__status ${h.connected?"database-sidebar__status--connected":"database-sidebar__status--error"}`,children:h.connected?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"database-sidebar__status-icon",children:"✓"}),x("terminal:database.connected"),h.serverVersion&&e.jsxs("span",{className:"database-sidebar__version",children:["(",h.serverVersion,")"]})]}):e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"database-sidebar__status-icon",children:"✗"}),h.error||x("terminal:database.disconnected")]})})]}),k.length>0&&e.jsxs("div",{className:"database-sidebar__section",children:[e.jsx("div",{className:"database-sidebar__section-title",children:x("terminal:database.databaseTitle")}),e.jsxs("div",{className:"database-sidebar__searchable-select",ref:K,children:[e.jsx("input",{ref:H,className:"database-sidebar__search-input",type:"text",value:w?T:n||"",placeholder:x("terminal:database.selectDatabase"),onChange:t=>{r(t.target.value),w||O(!0)},onFocus:()=>{O(!0),r("")},onKeyDown:t=>{var o,v;t.key==="Escape"?(O(!1),r(""),(o=H.current)==null||o.blur()):t.key==="Enter"&&E.length===1&&(R(E[0]),O(!1),r(""),(v=H.current)==null||v.blur())}}),w&&e.jsx("div",{className:"database-sidebar__dropdown",children:E.length===0?e.jsx("div",{className:"database-sidebar__dropdown-empty",children:"No matches"}):E.map(t=>e.jsx("div",{className:`database-sidebar__dropdown-item ${t===n?"database-sidebar__dropdown-item--active":""}`,onMouseDown:o=>{o.preventDefault(),R(t),O(!1),r("")},children:t},t))})]})]}),$.length>0&&e.jsxs("div",{className:"database-sidebar__section database-sidebar__section--tables",children:[e.jsx("div",{className:"database-sidebar__section-title",children:i.trim()?x("terminal:database.tablesCount",{count:z.length})+` / ${$.length}`:x("terminal:database.tablesCount",{count:$.length})}),e.jsxs("div",{className:"database-sidebar__table-filter",children:[e.jsx("input",{ref:C,className:"database-sidebar__table-filter-input",type:"text",value:i,placeholder:x("terminal:database.filterTables"),onChange:t=>g(t.target.value),onKeyDown:t=>{var o;t.key==="Escape"&&(i?g(""):(o=C.current)==null||o.blur(),t.stopPropagation())}}),i&&e.jsx("button",{className:"database-sidebar__table-filter-clear",onClick:()=>{var t;g(""),(t=C.current)==null||t.focus()},title:"Clear filter",children:"×"})]}),e.jsxs("div",{className:"database-sidebar__tables",children:[i.trim()&&z.length===0&&e.jsx("div",{className:"database-sidebar__tables-empty",children:x("terminal:database.noTablesMatch")}),z.map(t=>{const o=I.has(t.name),v=o?p(t.name):null;return e.jsxs("div",{className:"database-sidebar__table",children:[e.jsxs("div",{className:"database-sidebar__table-header",children:[e.jsx("button",{className:"database-sidebar__table-expand",onClick:()=>b(t.name),title:o?"Collapse table schema":"Expand table schema",children:e.jsx(L,{name:o?"caret-down":"caret-right",size:10})}),e.jsx("span",{className:"database-sidebar__table-icon",children:e.jsx(L,{name:t.type==="view"?"eye":"clipboard",size:12})}),e.jsx("span",{className:`database-sidebar__table-name ${P===t.name?"database-sidebar__table-name--selected":""}`,onClick:()=>V(t.name),onDoubleClick:()=>{V(t.name),F(t.name)},children:t.name}),e.jsx("button",{className:"database-sidebar__table-insert",onClick:S=>{S.stopPropagation(),N(t.name)},title:x("terminal:database.insertTableName"),children:"+"})]}),o&&v&&e.jsx("div",{className:"database-sidebar__table-columns",children:v.columns.map(S=>e.jsxs("div",{className:"database-sidebar__column",onClick:()=>N(S.name),title:`${S.type}${S.nullable?" NULL":" NOT NULL"}${S.primaryKey?" PK":""}`,children:[e.jsx("span",{className:"database-sidebar__column-icon",children:S.primaryKey?e.jsx(L,{name:"key",size:11}):null}),e.jsx("span",{className:"database-sidebar__column-name",children:S.name}),e.jsx("span",{className:"database-sidebar__column-type",children:S.type})]},S.name))})]},t.name)})]})]})]})},ye=({buildingId:a,history:j,onLoadQuery:d})=>{const{t:n}=G(["terminal","common"]),[y,_]=l.useState(""),[D,R]=l.useState(!1),[N,F]=l.useState(!1),x=l.useMemo(()=>{let r=j;if(D&&(r=r.filter(i=>i.favorite)),y.trim()){const i=y.toLowerCase();r=r.filter(g=>g.query.toLowerCase().includes(i)||g.database.toLowerCase().includes(i))}return r},[j,D,y]),f=r=>{const i=new Date(r),w=new Date().getTime()-i.getTime();return w<1440*60*1e3?i.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):w<10080*60*1e3?i.toLocaleDateString([],{weekday:"short"})+" "+i.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):i.toLocaleDateString([],{month:"short",day:"numeric"})},I=l.useCallback((r,i)=>{i.stopPropagation(),u.toggleQueryFavorite(a,r)},[a]),U=l.useCallback((r,i)=>{i.stopPropagation(),u.deleteQueryFromHistory(a,r)},[a]),T=l.useCallback(()=>{F(!0)},[]);return j.length===0?e.jsxs("div",{className:"query-history query-history--empty",children:[e.jsx("p",{children:n("terminal:database.noHistory")}),e.jsx("p",{children:n("terminal:database.queriesAppearHere")})]}):e.jsxs("div",{className:"query-history",children:[e.jsxs("div",{className:"query-history__toolbar",children:[e.jsx("input",{type:"text",className:"query-history__search",placeholder:n("terminal:database.searchQueries"),value:y,onChange:r=>_(r.target.value)}),e.jsxs("label",{className:"query-history__filter",children:[e.jsx("input",{type:"checkbox",checked:D,onChange:r=>R(r.target.checked)}),n("terminal:database.favoritesOnly")]}),e.jsx("button",{className:"query-history__clear",onClick:T,title:n("terminal:database.clearAll"),children:n("terminal:database.clearAll")})]}),e.jsxs("div",{className:"query-history__list",children:[x.map(r=>e.jsxs("div",{className:`query-history__item ${r.status==="error"?"query-history__item--error":""}`,onClick:()=>d(r.query),children:[e.jsxs("div",{className:"query-history__item-header",children:[e.jsx("span",{className:`query-history__status ${r.status==="success"?"query-history__status--success":"query-history__status--error"}`,children:e.jsx(L,{name:r.status==="success"?"check":"cross",size:12})}),e.jsx("span",{className:"query-history__database",children:r.database}),e.jsx("span",{className:"query-history__date",children:f(r.executedAt)}),e.jsxs("span",{className:"query-history__duration",children:[r.duration,"ms"]}),r.rowCount!==void 0&&e.jsx("span",{className:"query-history__row-count",children:n("terminal:database.rowCount",{count:r.rowCount})})]}),e.jsx("div",{className:"query-history__query",children:e.jsx("code",{children:r.query.length>200?r.query.substring(0,200)+"...":r.query})}),r.error&&e.jsx("div",{className:"query-history__error",children:r.error}),e.jsxs("div",{className:"query-history__actions",children:[e.jsx("button",{className:`query-history__favorite ${r.favorite?"query-history__favorite--active":""}`,onClick:i=>I(r.id,i),title:r.favorite?n("terminal:database.removeFromFavorites"):n("terminal:database.addToFavorites"),children:e.jsx(L,{name:"star",size:12,weight:r.favorite?"fill":"regular",color:r.favorite?"#facc15":void 0})}),e.jsx("button",{className:"query-history__delete",onClick:i=>U(r.id,i),title:n("terminal:database.deleteFromHistory"),children:e.jsx(L,{name:"trash",size:12})})]})]},r.id)),x.length===0&&e.jsx("div",{className:"query-history__no-results",children:n("terminal:database.noQueriesMatch")})]}),e.jsx(me,{isOpen:N,title:n("terminal:database.clearAll"),message:n("terminal:database.confirmClearHistory"),confirmLabel:n("terminal:database.clearAll"),cancelLabel:n("common:buttons.cancel"),variant:"danger",onConfirm:()=>u.clearQueryHistory(a),onClose:()=>F(!1)})]})},Ne=({tabs:a,activeTabId:j,onTabClick:d,onTabClose:n})=>{const{t:y}=G(["terminal"]);return e.jsx("div",{className:"database-tabs",children:a.map(_=>e.jsxs("div",{className:`database-tabs__tab ${j===_.id?"database-tabs__tab--active":""}`,children:[e.jsxs("button",{className:"database-tabs__tab-label",onClick:()=>d(_),title:`${_.connectionName} / ${_.database}`,children:[_.database,e.jsx("span",{className:"database-tabs__tab-connection",children:_.connectionName})]}),e.jsx("button",{className:"database-tabs__tab-close",onClick:()=>n(_.id),title:y("terminal:database.closeTab"),"aria-label":`Close ${_.database} tab`,children:"×"})]},_.id))})},ae=a=>`db-panel-${a}`;function ve(a){try{const j=localStorage.getItem(ae(a));return j?JSON.parse(j):{}}catch{return{}}}function Se(a,j){try{localStorage.setItem(ae(a),JSON.stringify(j))}catch{}}const we=({building:a,onClose:j,onMinimize:d})=>{var Y,B,X,Z;const{t:n}=G(["terminal","common"]),y=ee(a.id),_=be(a.id),D=ue(a.id),R=he(a.id),N=l.useRef(ve(a.id)),F=l.useRef(null),x=l.useRef(0),f=((Y=a.database)==null?void 0:Y.connections)??[],I=(s,c)=>`${s}:${c}`,U=s=>s?(N.current.queries??{})[s]??"":N.current.generalQuery??"",[T,r]=l.useState("results"),[i,g]=l.useState(0),[w,O]=l.useState(!1),[P,V]=l.useState(!1),[H,K]=l.useState(()=>(N.current.openTabs??[]).map(c=>{var m;return{id:`${c.connectionId}:${c.database}`,connectionId:c.connectionId,connectionName:((m=f.find(A=>A.id===c.connectionId))==null?void 0:m.name)??c.connectionId,database:c.database}})),[C,k]=l.useState(N.current.activeTabId??null),[q,$]=l.useState(()=>{const s=N.current.queries??{};return N.current.generalQuery,s}),[h,E]=l.useState(U(C)),z=l.useCallback(s=>{E(c=>{const m=typeof s=="function"?s(c):s;return $(A=>{const Q={...A};return C&&(Q[C]=m),Q}),m})},[C]),b=y.activeConnectionId??N.current.connectionId??((B=a.database)==null?void 0:B.activeConnectionId)??((X=f[0])==null?void 0:X.id),p=y.activeDatabase??N.current.database??((Z=a.database)==null?void 0:Z.activeDatabase),t=f.find(s=>s.id===b),o=b&&p?`${b}:${p}`:"",v=o?y.tables.get(o)??[]:[],S=l.useMemo(()=>{const s=new Map;return!b||!p||v.forEach(c=>{const m=y.tableSchemas.get(`${b}:${p}:${c.name}`);m&&s.set(c.name,{columns:m.columns})}),s},[b,p,v,y.tableSchemas]),J=l.useCallback((s,c)=>{var Q;const m=I(s,c),A=((Q=f.find(M=>M.id===s))==null?void 0:Q.name)??s;K(M=>{if(M.some(de=>de.id===m))return M;const ie={id:m,connectionId:s,connectionName:A,database:c};return[...M,ie]}),k(m),E(q[m]??""),u.setActiveConnection(a.id,s),u.setActiveDatabase(a.id,c)},[a.id,f,q]),se=l.useCallback(s=>{K(c=>c.filter(m=>m.id!==s)),C===s&&K(c=>{if(c.length>0){const m=c[0];k(m.id),E(q[m.id]??""),u.setActiveConnection(a.id,m.connectionId),u.setActiveDatabase(a.id,m.database)}else k(null),E("");return c})},[C,a.id,q]),te=l.useCallback(s=>{k(s.id),E(q[s.id]??""),u.setActiveConnection(a.id,s.connectionId),u.setActiveDatabase(a.id,s.database)},[a.id,q]);l.useEffect(()=>{if(!P&&f.length>0){const s=N.current;s.connectionId&&f.some(c=>c.id===s.connectionId)&&(u.setActiveConnection(a.id,s.connectionId),u.listDatabases(a.id,s.connectionId),s.database&&(u.setActiveDatabase(a.id,s.database),u.listTables(a.id,s.connectionId,s.database))),V(!0)}},[a.id,f,P]),l.useEffect(()=>{u.requestQueryHistory(a.id)},[a.id]),l.useEffect(()=>{const s=c=>{c.key==="Escape"&&(c.preventDefault(),c.stopPropagation(),j())};return window.addEventListener("keydown",s),()=>window.removeEventListener("keydown",s)},[j]),l.useEffect(()=>{P&&b&&Se(a.id,{connectionId:b,database:p,lastQuery:h,queries:q,generalQuery:"",openTabs:H.map(s=>({connectionId:s.connectionId,database:s.database})),activeTabId:C??void 0})},[a.id,b,p,h,P,H,C,q]);const ne=l.useCallback(s=>{var c;if(!(!b||!p||!h.trim()||R))if(s==="cursor"){const m=(c=F.current)==null?void 0:c.querySelector(".query-editor__textarea"),A=(m==null?void 0:m.selectionStart)??x.current,Q=_e(h,A);Q&&u.executeQuery(a.id,b,p,Q)}else{const m=pe(h);if(m.length<=1)u.executeQuery(a.id,b,p,h.trim());else{const A=b,Q=p;(async()=>{for(const M of m)await u.executeQueryAndWait(a.id,A,Q,M.sql)})()}}},[a.id,b,p,h,R]),re=l.useCallback(s=>{z(s),r("results")},[]),le=l.useCallback(s=>{u.setActiveConnection(a.id,s),u.listDatabases(a.id,s)},[a.id]),ce=l.useCallback(s=>{b&&(J(b,s),u.listTables(a.id,b,s))},[a.id,b,J]),W=_[i];return f.length===0?e.jsxs("div",{className:"database-panel",ref:F,children:[e.jsxs("div",{className:"database-panel__header",children:[e.jsxs("div",{className:"database-panel__title",children:[e.jsx("span",{className:"database-panel__icon",children:e.jsx(L,{name:"database",size:16})}),e.jsx("span",{className:"database-panel__name",children:a.name})]}),e.jsx("button",{className:"database-panel__close",onClick:j,children:"×"})]}),e.jsx("div",{className:"database-panel__body",children:e.jsxs("div",{className:"database-panel__no-connections",children:[e.jsx("div",{className:"database-panel__no-connections-icon",children:e.jsx(L,{name:"plug",size:32})}),e.jsx("h3",{children:n("terminal:database.noConnections")}),e.jsx("p",{children:n("terminal:database.noConnectionsDesc")}),e.jsx("p",{children:n("terminal:database.toGetStarted")}),e.jsxs("ol",{children:[e.jsx("li",{children:n("terminal:database.step1Close")}),e.jsx("li",{children:n("terminal:database.step2Settings")}),e.jsx("li",{children:n("terminal:database.step3AddConnection")}),e.jsx("li",{children:n("terminal:database.step4Reopen")})]})]})})]}):e.jsxs("div",{className:"database-panel",ref:F,children:[e.jsxs("div",{className:"database-panel__header",children:[e.jsxs("div",{className:"database-panel__title",children:[e.jsx("span",{className:"database-panel__icon",children:(t==null?void 0:t.engine)==="mysql"?"🐬":"🐘"}),e.jsx("span",{className:"database-panel__name",children:a.name}),t&&e.jsxs("span",{className:"database-panel__connection-info",children:[t.name," / ",p||n("terminal:database.noDatabaseSelected")]})]}),e.jsxs("div",{className:"database-panel__header-actions",children:[d&&e.jsx("button",{className:"database-panel__close",onClick:d,title:"Minimize — dock below the terminal input",children:e.jsx(L,{name:"arrow-down",size:14})}),e.jsx("button",{className:"database-panel__close",onClick:j,children:"×"})]})]}),e.jsxs("div",{className:"database-panel__body",children:[e.jsx(je,{building:a,connections:f,activeConnectionId:b,activeDatabase:p,collapsed:w,onToggleCollapse:()=>O(!w),onConnectionChange:le,onDatabaseChange:ce,onInsertTable:s=>z(c=>c+` ${s}`),onSelectTableQuery:s=>{const c=`SELECT * FROM ${s}`;z(c),b&&p&&u.executeQuery(a.id,b,p,c)}}),e.jsxs("div",{className:"database-panel__main",children:[H.length>0&&e.jsx(Ne,{tabs:H,activeTabId:C,onTabClick:te,onTabClose:se}),e.jsx(xe,{query:h,onChange:z,onExecute:ne,isExecuting:R,disabled:!b||!p,tables:v,tableSchemas:S,onRequestTableSchema:s=>{b&&p&&u.getTableSchema(a.id,b,p,s)}}),e.jsxs("div",{className:"database-panel__tabs",children:[e.jsxs("button",{className:`database-panel__tab ${T==="results"?"database-panel__tab--active":""}`,onClick:()=>r("results"),children:[n("terminal:database.results"),_.length>0&&e.jsx("span",{className:"database-panel__tab-badge",children:_.length})]}),e.jsxs("button",{className:`database-panel__tab ${T==="history"?"database-panel__tab--active":""}`,onClick:()=>r("history"),children:[n("terminal:database.history"),D.length>0&&e.jsx("span",{className:"database-panel__tab-badge",children:D.length})]}),T==="results"&&_.length>1&&e.jsxs("div",{className:"database-panel__result-nav",children:[e.jsxs("button",{disabled:i>=_.length-1,onClick:()=>g(s=>s+1),children:["← ",n("terminal:database.older")]}),e.jsxs("span",{children:[i+1," / ",_.length]}),e.jsxs("button",{disabled:i<=0,onClick:()=>g(s=>s-1),children:[n("terminal:database.newer")," →"]})]})]}),e.jsx("div",{className:"database-panel__tab-content",children:T==="results"?W?e.jsx(fe,{result:W,buildingId:a.id,building:a}):e.jsxs("div",{className:"database-panel__empty",children:[e.jsx("p",{children:n("terminal:database.noResultsYet")}),e.jsx("p",{children:n("terminal:database.selectDbAndRun")})]}):e.jsx(ye,{buildingId:a.id,history:D,onLoadQuery:re})})]})]})]})};export{we as DatabasePanel,je as DatabaseSidebar,Ne as DatabaseTabs,xe as QueryEditor,ye as QueryHistoryPanel,fe as ResultsTable};
|
|
1
|
+
import{u as G,bT as ee,r as l,s as u,j as e,bU as oe,I as L,_ as me,bV as be,bW as ue,bX as he,bY as _e,bZ as pe,b_ as xe,b$ as fe}from"./main-D0r07JA_.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DYBBrXTx.js";const je=({building:a,connections:j,activeConnectionId:d,activeDatabase:n,collapsed:y,onToggleCollapse:_,onConnectionChange:D,onDatabaseChange:R,onInsertTable:N,onSelectTableQuery:F})=>{const{t:x}=G(["terminal"]),f=ee(a.id),[I,U]=l.useState(new Set),[T,r]=l.useState(""),[i,g]=l.useState(""),[w,O]=l.useState(!1),[P,V]=l.useState(null),H=l.useRef(null),K=l.useRef(null),C=l.useRef(null),k=d?f.databases.get(d)??[]:[],q=d&&n?`${d}:${n}`:"",$=q?f.tables.get(q)??[]:[],h=d?f.connectionStatus.get(d):void 0,E=l.useMemo(()=>{if(!T.trim())return k;const t=T.toLowerCase();return k.filter(o=>o.toLowerCase().includes(t))},[k,T]),z=l.useMemo(()=>{if(!i.trim())return $;const t=i.toLowerCase();return $.filter(o=>o.name.toLowerCase().includes(t))},[$,i]);l.useEffect(()=>{const t=o=>{K.current&&!K.current.contains(o.target)&&O(!1)};return w&&document.addEventListener("mousedown",t),()=>document.removeEventListener("mousedown",t)},[w]),l.useEffect(()=>{d&&!h&&u.testDatabaseConnection(a.id,d)},[a.id,d,h]),l.useEffect(()=>{d&&(h!=null&&h.connected)&&k.length===0&&u.listDatabases(a.id,d)},[a.id,d,h==null?void 0:h.connected,k.length]),l.useEffect(()=>{d&&n&&$.length===0&&u.listTables(a.id,d,n)},[a.id,d,n,$.length]),l.useEffect(()=>{V(null),g("")},[d,n]);const b=l.useCallback(t=>{U(o=>{const v=new Set(o);if(v.has(t))v.delete(t);else if(v.add(t),d&&n){const S=`${d}:${n}:${t}`;f.tableSchemas.has(S)||u.getTableSchema(a.id,d,n,t)}return v})},[a.id,d,n,f.tableSchemas]),p=t=>{if(!d||!n)return null;const o=`${d}:${n}:${t}`;return f.tableSchemas.get(o)};return y?e.jsx("div",{className:"database-sidebar database-sidebar--collapsed",children:e.jsx("button",{className:"database-sidebar__toggle",onClick:_,title:x("terminal:database.expandSidebar"),children:"»"})}):e.jsxs("div",{className:"database-sidebar",children:[e.jsxs("div",{className:"database-sidebar__header",children:[e.jsx("span",{children:x("terminal:database.explorer")}),e.jsx("button",{className:"database-sidebar__toggle",onClick:_,title:x("terminal:database.collapseSidebar"),children:"«"})]}),e.jsxs("div",{className:"database-sidebar__section",children:[e.jsx("div",{className:"database-sidebar__section-title",children:x("terminal:database.connection")}),e.jsx("select",{className:"database-sidebar__select",value:d||"",onChange:t=>D(t.target.value),children:j.length===0?e.jsx("option",{value:"",children:x("terminal:database.noConnections")}):j.map(t=>{var o;return e.jsxs("option",{value:t.id,children:[((o=oe[t.engine])==null?void 0:o.icon)??"🗄️"," ",t.name]},t.id)})}),h&&e.jsx("div",{className:`database-sidebar__status ${h.connected?"database-sidebar__status--connected":"database-sidebar__status--error"}`,children:h.connected?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"database-sidebar__status-icon",children:"✓"}),x("terminal:database.connected"),h.serverVersion&&e.jsxs("span",{className:"database-sidebar__version",children:["(",h.serverVersion,")"]})]}):e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"database-sidebar__status-icon",children:"✗"}),h.error||x("terminal:database.disconnected")]})})]}),k.length>0&&e.jsxs("div",{className:"database-sidebar__section",children:[e.jsx("div",{className:"database-sidebar__section-title",children:x("terminal:database.databaseTitle")}),e.jsxs("div",{className:"database-sidebar__searchable-select",ref:K,children:[e.jsx("input",{ref:H,className:"database-sidebar__search-input",type:"text",value:w?T:n||"",placeholder:x("terminal:database.selectDatabase"),onChange:t=>{r(t.target.value),w||O(!0)},onFocus:()=>{O(!0),r("")},onKeyDown:t=>{var o,v;t.key==="Escape"?(O(!1),r(""),(o=H.current)==null||o.blur()):t.key==="Enter"&&E.length===1&&(R(E[0]),O(!1),r(""),(v=H.current)==null||v.blur())}}),w&&e.jsx("div",{className:"database-sidebar__dropdown",children:E.length===0?e.jsx("div",{className:"database-sidebar__dropdown-empty",children:"No matches"}):E.map(t=>e.jsx("div",{className:`database-sidebar__dropdown-item ${t===n?"database-sidebar__dropdown-item--active":""}`,onMouseDown:o=>{o.preventDefault(),R(t),O(!1),r("")},children:t},t))})]})]}),$.length>0&&e.jsxs("div",{className:"database-sidebar__section database-sidebar__section--tables",children:[e.jsx("div",{className:"database-sidebar__section-title",children:i.trim()?x("terminal:database.tablesCount",{count:z.length})+` / ${$.length}`:x("terminal:database.tablesCount",{count:$.length})}),e.jsxs("div",{className:"database-sidebar__table-filter",children:[e.jsx("input",{ref:C,className:"database-sidebar__table-filter-input",type:"text",value:i,placeholder:x("terminal:database.filterTables"),onChange:t=>g(t.target.value),onKeyDown:t=>{var o;t.key==="Escape"&&(i?g(""):(o=C.current)==null||o.blur(),t.stopPropagation())}}),i&&e.jsx("button",{className:"database-sidebar__table-filter-clear",onClick:()=>{var t;g(""),(t=C.current)==null||t.focus()},title:"Clear filter",children:"×"})]}),e.jsxs("div",{className:"database-sidebar__tables",children:[i.trim()&&z.length===0&&e.jsx("div",{className:"database-sidebar__tables-empty",children:x("terminal:database.noTablesMatch")}),z.map(t=>{const o=I.has(t.name),v=o?p(t.name):null;return e.jsxs("div",{className:"database-sidebar__table",children:[e.jsxs("div",{className:"database-sidebar__table-header",children:[e.jsx("button",{className:"database-sidebar__table-expand",onClick:()=>b(t.name),title:o?"Collapse table schema":"Expand table schema",children:e.jsx(L,{name:o?"caret-down":"caret-right",size:10})}),e.jsx("span",{className:"database-sidebar__table-icon",children:e.jsx(L,{name:t.type==="view"?"eye":"clipboard",size:12})}),e.jsx("span",{className:`database-sidebar__table-name ${P===t.name?"database-sidebar__table-name--selected":""}`,onClick:()=>V(t.name),onDoubleClick:()=>{V(t.name),F(t.name)},children:t.name}),e.jsx("button",{className:"database-sidebar__table-insert",onClick:S=>{S.stopPropagation(),N(t.name)},title:x("terminal:database.insertTableName"),children:"+"})]}),o&&v&&e.jsx("div",{className:"database-sidebar__table-columns",children:v.columns.map(S=>e.jsxs("div",{className:"database-sidebar__column",onClick:()=>N(S.name),title:`${S.type}${S.nullable?" NULL":" NOT NULL"}${S.primaryKey?" PK":""}`,children:[e.jsx("span",{className:"database-sidebar__column-icon",children:S.primaryKey?e.jsx(L,{name:"key",size:11}):null}),e.jsx("span",{className:"database-sidebar__column-name",children:S.name}),e.jsx("span",{className:"database-sidebar__column-type",children:S.type})]},S.name))})]},t.name)})]})]})]})},ye=({buildingId:a,history:j,onLoadQuery:d})=>{const{t:n}=G(["terminal","common"]),[y,_]=l.useState(""),[D,R]=l.useState(!1),[N,F]=l.useState(!1),x=l.useMemo(()=>{let r=j;if(D&&(r=r.filter(i=>i.favorite)),y.trim()){const i=y.toLowerCase();r=r.filter(g=>g.query.toLowerCase().includes(i)||g.database.toLowerCase().includes(i))}return r},[j,D,y]),f=r=>{const i=new Date(r),w=new Date().getTime()-i.getTime();return w<1440*60*1e3?i.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):w<10080*60*1e3?i.toLocaleDateString([],{weekday:"short"})+" "+i.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):i.toLocaleDateString([],{month:"short",day:"numeric"})},I=l.useCallback((r,i)=>{i.stopPropagation(),u.toggleQueryFavorite(a,r)},[a]),U=l.useCallback((r,i)=>{i.stopPropagation(),u.deleteQueryFromHistory(a,r)},[a]),T=l.useCallback(()=>{F(!0)},[]);return j.length===0?e.jsxs("div",{className:"query-history query-history--empty",children:[e.jsx("p",{children:n("terminal:database.noHistory")}),e.jsx("p",{children:n("terminal:database.queriesAppearHere")})]}):e.jsxs("div",{className:"query-history",children:[e.jsxs("div",{className:"query-history__toolbar",children:[e.jsx("input",{type:"text",className:"query-history__search",placeholder:n("terminal:database.searchQueries"),value:y,onChange:r=>_(r.target.value)}),e.jsxs("label",{className:"query-history__filter",children:[e.jsx("input",{type:"checkbox",checked:D,onChange:r=>R(r.target.checked)}),n("terminal:database.favoritesOnly")]}),e.jsx("button",{className:"query-history__clear",onClick:T,title:n("terminal:database.clearAll"),children:n("terminal:database.clearAll")})]}),e.jsxs("div",{className:"query-history__list",children:[x.map(r=>e.jsxs("div",{className:`query-history__item ${r.status==="error"?"query-history__item--error":""}`,onClick:()=>d(r.query),children:[e.jsxs("div",{className:"query-history__item-header",children:[e.jsx("span",{className:`query-history__status ${r.status==="success"?"query-history__status--success":"query-history__status--error"}`,children:e.jsx(L,{name:r.status==="success"?"check":"cross",size:12})}),e.jsx("span",{className:"query-history__database",children:r.database}),e.jsx("span",{className:"query-history__date",children:f(r.executedAt)}),e.jsxs("span",{className:"query-history__duration",children:[r.duration,"ms"]}),r.rowCount!==void 0&&e.jsx("span",{className:"query-history__row-count",children:n("terminal:database.rowCount",{count:r.rowCount})})]}),e.jsx("div",{className:"query-history__query",children:e.jsx("code",{children:r.query.length>200?r.query.substring(0,200)+"...":r.query})}),r.error&&e.jsx("div",{className:"query-history__error",children:r.error}),e.jsxs("div",{className:"query-history__actions",children:[e.jsx("button",{className:`query-history__favorite ${r.favorite?"query-history__favorite--active":""}`,onClick:i=>I(r.id,i),title:r.favorite?n("terminal:database.removeFromFavorites"):n("terminal:database.addToFavorites"),children:e.jsx(L,{name:"star",size:12,weight:r.favorite?"fill":"regular",color:r.favorite?"#facc15":void 0})}),e.jsx("button",{className:"query-history__delete",onClick:i=>U(r.id,i),title:n("terminal:database.deleteFromHistory"),children:e.jsx(L,{name:"trash",size:12})})]})]},r.id)),x.length===0&&e.jsx("div",{className:"query-history__no-results",children:n("terminal:database.noQueriesMatch")})]}),e.jsx(me,{isOpen:N,title:n("terminal:database.clearAll"),message:n("terminal:database.confirmClearHistory"),confirmLabel:n("terminal:database.clearAll"),cancelLabel:n("common:buttons.cancel"),variant:"danger",onConfirm:()=>u.clearQueryHistory(a),onClose:()=>F(!1)})]})},Ne=({tabs:a,activeTabId:j,onTabClick:d,onTabClose:n})=>{const{t:y}=G(["terminal"]);return e.jsx("div",{className:"database-tabs",children:a.map(_=>e.jsxs("div",{className:`database-tabs__tab ${j===_.id?"database-tabs__tab--active":""}`,children:[e.jsxs("button",{className:"database-tabs__tab-label",onClick:()=>d(_),title:`${_.connectionName} / ${_.database}`,children:[_.database,e.jsx("span",{className:"database-tabs__tab-connection",children:_.connectionName})]}),e.jsx("button",{className:"database-tabs__tab-close",onClick:()=>n(_.id),title:y("terminal:database.closeTab"),"aria-label":`Close ${_.database} tab`,children:"×"})]},_.id))})},ae=a=>`db-panel-${a}`;function ve(a){try{const j=localStorage.getItem(ae(a));return j?JSON.parse(j):{}}catch{return{}}}function Se(a,j){try{localStorage.setItem(ae(a),JSON.stringify(j))}catch{}}const we=({building:a,onClose:j,onMinimize:d})=>{var Y,B,X,Z;const{t:n}=G(["terminal","common"]),y=ee(a.id),_=be(a.id),D=ue(a.id),R=he(a.id),N=l.useRef(ve(a.id)),F=l.useRef(null),x=l.useRef(0),f=((Y=a.database)==null?void 0:Y.connections)??[],I=(s,c)=>`${s}:${c}`,U=s=>s?(N.current.queries??{})[s]??"":N.current.generalQuery??"",[T,r]=l.useState("results"),[i,g]=l.useState(0),[w,O]=l.useState(!1),[P,V]=l.useState(!1),[H,K]=l.useState(()=>(N.current.openTabs??[]).map(c=>{var m;return{id:`${c.connectionId}:${c.database}`,connectionId:c.connectionId,connectionName:((m=f.find(A=>A.id===c.connectionId))==null?void 0:m.name)??c.connectionId,database:c.database}})),[C,k]=l.useState(N.current.activeTabId??null),[q,$]=l.useState(()=>{const s=N.current.queries??{};return N.current.generalQuery,s}),[h,E]=l.useState(U(C)),z=l.useCallback(s=>{E(c=>{const m=typeof s=="function"?s(c):s;return $(A=>{const Q={...A};return C&&(Q[C]=m),Q}),m})},[C]),b=y.activeConnectionId??N.current.connectionId??((B=a.database)==null?void 0:B.activeConnectionId)??((X=f[0])==null?void 0:X.id),p=y.activeDatabase??N.current.database??((Z=a.database)==null?void 0:Z.activeDatabase),t=f.find(s=>s.id===b),o=b&&p?`${b}:${p}`:"",v=o?y.tables.get(o)??[]:[],S=l.useMemo(()=>{const s=new Map;return!b||!p||v.forEach(c=>{const m=y.tableSchemas.get(`${b}:${p}:${c.name}`);m&&s.set(c.name,{columns:m.columns})}),s},[b,p,v,y.tableSchemas]),J=l.useCallback((s,c)=>{var Q;const m=I(s,c),A=((Q=f.find(M=>M.id===s))==null?void 0:Q.name)??s;K(M=>{if(M.some(de=>de.id===m))return M;const ie={id:m,connectionId:s,connectionName:A,database:c};return[...M,ie]}),k(m),E(q[m]??""),u.setActiveConnection(a.id,s),u.setActiveDatabase(a.id,c)},[a.id,f,q]),se=l.useCallback(s=>{K(c=>c.filter(m=>m.id!==s)),C===s&&K(c=>{if(c.length>0){const m=c[0];k(m.id),E(q[m.id]??""),u.setActiveConnection(a.id,m.connectionId),u.setActiveDatabase(a.id,m.database)}else k(null),E("");return c})},[C,a.id,q]),te=l.useCallback(s=>{k(s.id),E(q[s.id]??""),u.setActiveConnection(a.id,s.connectionId),u.setActiveDatabase(a.id,s.database)},[a.id,q]);l.useEffect(()=>{if(!P&&f.length>0){const s=N.current;s.connectionId&&f.some(c=>c.id===s.connectionId)&&(u.setActiveConnection(a.id,s.connectionId),u.listDatabases(a.id,s.connectionId),s.database&&(u.setActiveDatabase(a.id,s.database),u.listTables(a.id,s.connectionId,s.database))),V(!0)}},[a.id,f,P]),l.useEffect(()=>{u.requestQueryHistory(a.id)},[a.id]),l.useEffect(()=>{const s=c=>{c.key==="Escape"&&(c.preventDefault(),c.stopPropagation(),j())};return window.addEventListener("keydown",s),()=>window.removeEventListener("keydown",s)},[j]),l.useEffect(()=>{P&&b&&Se(a.id,{connectionId:b,database:p,lastQuery:h,queries:q,generalQuery:"",openTabs:H.map(s=>({connectionId:s.connectionId,database:s.database})),activeTabId:C??void 0})},[a.id,b,p,h,P,H,C,q]);const ne=l.useCallback(s=>{var c;if(!(!b||!p||!h.trim()||R))if(s==="cursor"){const m=(c=F.current)==null?void 0:c.querySelector(".query-editor__textarea"),A=(m==null?void 0:m.selectionStart)??x.current,Q=_e(h,A);Q&&u.executeQuery(a.id,b,p,Q)}else{const m=pe(h);if(m.length<=1)u.executeQuery(a.id,b,p,h.trim());else{const A=b,Q=p;(async()=>{for(const M of m)await u.executeQueryAndWait(a.id,A,Q,M.sql)})()}}},[a.id,b,p,h,R]),re=l.useCallback(s=>{z(s),r("results")},[]),le=l.useCallback(s=>{u.setActiveConnection(a.id,s),u.listDatabases(a.id,s)},[a.id]),ce=l.useCallback(s=>{b&&(J(b,s),u.listTables(a.id,b,s))},[a.id,b,J]),W=_[i];return f.length===0?e.jsxs("div",{className:"database-panel",ref:F,children:[e.jsxs("div",{className:"database-panel__header",children:[e.jsxs("div",{className:"database-panel__title",children:[e.jsx("span",{className:"database-panel__icon",children:e.jsx(L,{name:"database",size:16})}),e.jsx("span",{className:"database-panel__name",children:a.name})]}),e.jsx("button",{className:"database-panel__close",onClick:j,children:"×"})]}),e.jsx("div",{className:"database-panel__body",children:e.jsxs("div",{className:"database-panel__no-connections",children:[e.jsx("div",{className:"database-panel__no-connections-icon",children:e.jsx(L,{name:"plug",size:32})}),e.jsx("h3",{children:n("terminal:database.noConnections")}),e.jsx("p",{children:n("terminal:database.noConnectionsDesc")}),e.jsx("p",{children:n("terminal:database.toGetStarted")}),e.jsxs("ol",{children:[e.jsx("li",{children:n("terminal:database.step1Close")}),e.jsx("li",{children:n("terminal:database.step2Settings")}),e.jsx("li",{children:n("terminal:database.step3AddConnection")}),e.jsx("li",{children:n("terminal:database.step4Reopen")})]})]})})]}):e.jsxs("div",{className:"database-panel",ref:F,children:[e.jsxs("div",{className:"database-panel__header",children:[e.jsxs("div",{className:"database-panel__title",children:[e.jsx("span",{className:"database-panel__icon",children:(t==null?void 0:t.engine)==="mysql"?"🐬":"🐘"}),e.jsx("span",{className:"database-panel__name",children:a.name}),t&&e.jsxs("span",{className:"database-panel__connection-info",children:[t.name," / ",p||n("terminal:database.noDatabaseSelected")]})]}),e.jsxs("div",{className:"database-panel__header-actions",children:[d&&e.jsx("button",{className:"database-panel__close",onClick:d,title:"Minimize — dock below the terminal input",children:e.jsx(L,{name:"arrow-down",size:14})}),e.jsx("button",{className:"database-panel__close",onClick:j,children:"×"})]})]}),e.jsxs("div",{className:"database-panel__body",children:[e.jsx(je,{building:a,connections:f,activeConnectionId:b,activeDatabase:p,collapsed:w,onToggleCollapse:()=>O(!w),onConnectionChange:le,onDatabaseChange:ce,onInsertTable:s=>z(c=>c+` ${s}`),onSelectTableQuery:s=>{const c=`SELECT * FROM ${s}`;z(c),b&&p&&u.executeQuery(a.id,b,p,c)}}),e.jsxs("div",{className:"database-panel__main",children:[H.length>0&&e.jsx(Ne,{tabs:H,activeTabId:C,onTabClick:te,onTabClose:se}),e.jsx(xe,{query:h,onChange:z,onExecute:ne,isExecuting:R,disabled:!b||!p,tables:v,tableSchemas:S,onRequestTableSchema:s=>{b&&p&&u.getTableSchema(a.id,b,p,s)}}),e.jsxs("div",{className:"database-panel__tabs",children:[e.jsxs("button",{className:`database-panel__tab ${T==="results"?"database-panel__tab--active":""}`,onClick:()=>r("results"),children:[n("terminal:database.results"),_.length>0&&e.jsx("span",{className:"database-panel__tab-badge",children:_.length})]}),e.jsxs("button",{className:`database-panel__tab ${T==="history"?"database-panel__tab--active":""}`,onClick:()=>r("history"),children:[n("terminal:database.history"),D.length>0&&e.jsx("span",{className:"database-panel__tab-badge",children:D.length})]}),T==="results"&&_.length>1&&e.jsxs("div",{className:"database-panel__result-nav",children:[e.jsxs("button",{disabled:i>=_.length-1,onClick:()=>g(s=>s+1),children:["← ",n("terminal:database.older")]}),e.jsxs("span",{children:[i+1," / ",_.length]}),e.jsxs("button",{disabled:i<=0,onClick:()=>g(s=>s-1),children:[n("terminal:database.newer")," →"]})]})]}),e.jsx("div",{className:"database-panel__tab-content",children:T==="results"?W?e.jsx(fe,{result:W,buildingId:a.id,building:a}):e.jsxs("div",{className:"database-panel__empty",children:[e.jsx("p",{children:n("terminal:database.noResultsYet")}),e.jsx("p",{children:n("terminal:database.selectDbAndRun")})]}):e.jsx(ye,{buildingId:a.id,history:D,onLoadQuery:re})})]})]})]})};export{we as DatabasePanel,je as DatabaseSidebar,Ne as DatabaseTabs,xe as QueryEditor,ye as QueryHistoryPanel,fe as ResultsTable};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/web-
|
|
2
|
-
import{ag as e,a2 as a}from"./main-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/web-BgCc_AGi.js","assets/main-D0r07JA_.js","assets/vendor-react--Eh9ivFN.js","assets/vendor-three-DYBBrXTx.js","assets/main-6EJsyrfW.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{ag as e,a2 as a}from"./main-D0r07JA_.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DYBBrXTx.js";var i;(function(r){r.Heavy="HEAVY",r.Medium="MEDIUM",r.Light="LIGHT"})(i||(i={}));var t;(function(r){r.Success="SUCCESS",r.Warning="WARNING",r.Error="ERROR"})(t||(t={}));const E=e("Haptics",{web:()=>a(()=>import("./web-BgCc_AGi.js"),__vite__mapDeps([0,1,2,3,4])).then(r=>new r.HapticsWeb)});export{E as Haptics,i as ImpactStyle,t as NotificationType};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{aG as Oe,r as t,s as I,d as ye,aH as Ee,c as ze,j as e,I as z,u as fe,aI as _e,aJ as Te,aK as Ue,aL as Be,aM as Ke,aN as We,ak as Ve,a6 as De,aO as Ge,aP as qe,aQ as Je,aR as Ye,K as Qe,m as Me,S as oe,F as Xe,q as Ze,t as et,z as Ie,E as tt,a1 as st,aS as nt,ax as Q,aT as at,aU as ct}from"./main-
|
|
1
|
+
import{aG as Oe,r as t,s as I,d as ye,aH as Ee,c as ze,j as e,I as z,u as fe,aI as _e,aJ as Te,aK as Ue,aL as Be,aM as Ke,aN as We,ak as Ve,a6 as De,aO as Ge,aP as qe,aQ as Je,aR as Ye,K as Qe,m as Me,S as oe,F as Xe,q as Ze,t as et,z as Ie,E as tt,a1 as st,aS as nt,ax as Q,aT as at,aU as ct}from"./main-D0r07JA_.js";import{FileExplorerPanel as ot}from"./index-BMILmzZt.js";import"./vendor-react--Eh9ivFN.js";import"./vendor-three-DYBBrXTx.js";const Se={status:"all",activity:"all",sort:"activity"},lt={"1h":3600*1e3,"6h":360*60*1e3,"24h":1440*60*1e3},Ae=20,me=3,rt={idle:"#4aff9e",working:"#4a9eff",waiting:"#ff9e4a",waiting_permission:"#ffcc00",error:"#ff4a4a",offline:"#888888",orphaned:"#ff9e4a"},it=12e4;function dt(s){return s.trim().replace(/\r\n/g,`
|
|
2
2
|
`)}function $e(s,a){return`${s}:${dt(a)}`}function ut(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)<=it?!1:M>f}function mt({isOpen:s,agents:a}){const c=Oe(),[f,p]=t.useState(new Map),d=t.useRef(new Set);t.useRef(a);const M=t.useMemo(()=>Array.from(a.keys()).sort().join(","),[a]),A=t.useMemo(()=>Array.from(a.values()).map(j=>`${j.id}:${j.sessionId||""}`).sort().join(","),[a]);t.useEffect(()=>{s||(d.current.clear(),p(new Map))},[s]),t.useEffect(()=>{if(!s)return;const j=new Set(Array.from(a.keys()));for(const i of d.current)j.has(i)||d.current.delete(i);let h=null;c>0&&(h=I.preserveOutputs(),d.current.clear());const v=async(i,b,$=0)=>{if(d.current.add(i.id),$>0&&await new Promise(x=>setTimeout(x,$)),p(x=>{const N=new Map(x);return N.set(i.id,{agentId:i.id,messages:[],loading:!0,hasMore:!1,totalCount:0}),N}),!i.sessionId){b&&b.length>0&&I.mergeOutputsWithHistory(i.id,[],b),p(x=>{const N=new Map(x);return N.set(i.id,{agentId:i.id,messages:[],loading:!1,hasMore:!1,totalCount:0}),N});return}try{const N=await(await ze(ye(`/api/agents/${i.id}/history?limit=${Ee}&offset=0`))).json(),P=N.messages||[],W=P.length>0?Math.max(...P.map(C=>C.timestamp?new Date(C.timestamp).getTime():0)):0,J=new Set(P.map(C=>C.uuid).filter(C=>!!C)),V=new Map;for(const C of P){if(C.type!=="user"&&C.type!=="assistant")continue;const l=$e(C.type,C.content),L=C.timestamp?new Date(C.timestamp).getTime():0,K=V.get(l)??0;L>K&&V.set(l,L)}const q=I.getOutputs(i.id),B=(b&&b.length>0?[...b,...q]:q).filter(C=>ut(C,J,V,W));I.clearOutputs(i.id);for(const C of B)I.addOutput(i.id,C);p(C=>{const l=new Map(C);return l.set(i.id,{agentId:i.id,messages:P,loading:!1,hasMore:N.hasMore||!1,totalCount:N.totalCount||0}),l})}catch(x){if(console.error(`Failed to load history for ${i.name}:`,x),b&&b.length>0){I.clearOutputs(i.id);for(const N of b)I.addOutput(i.id,N)}p(N=>{const P=new Map(N);return P.set(i.id,{agentId:i.id,messages:[],loading:!1,hasMore:!1,totalCount:0}),P})}},u=c>0?500:0,D=Array.from(a.values());for(const i of D)if(!d.current.has(i.id)){const b=h==null?void 0:h.get(i.id);v(i,b,u)}},[s,M,A,c]);const R=t.useRef(a),k=t.useRef(f);R.current=a,k.current=f;const w=t.useCallback(async j=>{const h=R.current.get(j),v=k.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(b=>{const $=new Map(b),x=b.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:w,clearAgentHistory:E}}function ft({command:s,onCommandChange:a,useTextarea:c,forceTextarea:f,onForceTextarea:p,onSend:d,canSend:M,attachedFiles:A,onAddFile:R,onRemoveFile:k,uploadFile:w,onAddPastedText:E,placeholder:j="Message...",className:h="",compact:v=!1,inputRef:u}){const D=t.useRef(null),i=t.useRef(null),b=t.useRef(c);t.useEffect(()=>{if(c&&!b.current&&i.current){const l=i.current;l.focus(),l.selectionStart=l.selectionEnd=l.value.length}b.current=c},[c]),t.useEffect(()=>{const l=i.current;if(!l||!c)return;l.style.height="auto";const L=v?120:180,K=Math.min(l.scrollHeight,L);l.style.height=`${K}px`},[s,c,v]);const $=t.useCallback(async l=>{const L=l.clipboardData.items;for(const _ of L)if(_.type.startsWith("image/")){l.preventDefault();const F=_.getAsFile();if(F){const H=await w(F);H&&R(H)}return}const K=l.clipboardData.files;if(K.length>0){l.preventDefault();for(const _ of K){const F=await w(_);F&&R(F)}return}const U=l.clipboardData.getData("text"),te=(U.match(/\n/g)||[]).length+1;if(te>5){l.preventDefault();const F=`[Pasted text #${E(U)} +${te} lines]`,H=l.target,se=H.selectionStart||0,ae=H.selectionEnd||0,ne=s.slice(0,se)+F+s.slice(ae);a(ne),c||p(!0)}},[s,a,c,p,w,R,E]),x=t.useCallback(async l=>{const L=l.target.files;if(L){for(const K of L){const U=await w(K);U&&R(U)}D.current&&(D.current.value="")}},[w,R]),N=t.useCallback(l=>{if(l.key==="Enter"&&l.shiftKey){c||(l.preventDefault(),p(!0));return}l.key==="Enter"&&(l.preventDefault(),d())},[c,p,d]),P=t.useCallback(l=>{},[]),W=t.useCallback(l=>{l.button===1&&(l.preventDefault(),l.stopPropagation())},[]),J=t.useCallback(l=>{i.current=l,u==null||u(l)},[u]),V=v?"agent-panel-input":"guake-input",q=v?"agent-panel-input-container":"guake-input-container",X=v?"agent-panel-attach-btn":"guake-attach-btn",B=v?"agent-panel-send-btn":"",C=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(l=>e.jsxs("div",{className:`${v?"agent-panel-attachment":"guake-attachment"} ${l.isImage?"is-image":""}`,children:[e.jsx("span",{className:v?"agent-panel-attachment-icon":"guake-attachment-icon",children:e.jsx(z,{name:l.isImage?"file":"paperclip",size:12})}),e.jsx("span",{className:v?"agent-panel-attachment-name":"guake-attachment-name",title:l.path,children:l.name}),!v&&e.jsxs("span",{className:"guake-attachment-size",children:["(",Math.round(l.size/1024),"KB)"]}),e.jsx("button",{className:v?"agent-panel-attachment-remove":"guake-attachment-remove",onClick:()=>k(l.id),title:"Remove",children:"×"})]},l.id))}),e.jsxs("div",{className:`${V} ${C} ${h}`,children:[e.jsx("input",{ref:D,type:"file",multiple:!0,onChange:x,style:{display:"none"},accept:"*"}),e.jsxs("div",{className:q,onAuxClick:W,children:[e.jsx("button",{className:X,onClick:()=>{var l;return(l=D.current)==null?void 0:l.click()},title:"Attach file (or paste image)",children:e.jsx(z,{name:"paperclip",size:14})}),c?e.jsx("textarea",{ref:J,placeholder:j,value:s,onChange:l=>a(l.target.value),onKeyDown:N,onPaste:$,onMouseDown:P}):e.jsx("input",{ref:u,type:"text",placeholder:j,value:s,onChange:l=>a(l.target.value),onKeyDown:N,onPaste:$,onMouseDown:P}),e.jsx("button",{className:B,onClick:d,disabled:!M,title:"Send",children:e.jsx(z,{name:"send",size:14})})]})]})]})}function pt(s){const a=Math.floor(s/1e3),c=Math.floor(a/60),f=a%60;return`${c}:${f.toString().padStart(2,"0")}`}const ht=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:pt(d)}),e.jsxs("button",{className:"guake-stop-btn",onClick:()=>I.stopAgent(a),title:p("terminal:input.stopOperation"),children:[e.jsx("span",{className:"stop-icon",children:e.jsx(z,{name:"stop",size:12,weight:"fill"})}),e.jsx("span",{className:"stop-label",children:p("terminal:input.stop")})]})]}):null});function xt({agent:s,history:a,outputs:c,isExpanded:f,isFocused:p,advancedView:d,onExpand:M,onFocus:A,inputRef:R,onLoadMore:k,onClearHistory:w}){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),[b,$]=t.useState(!0),[x,N]=t.useState(!1),[P,W]=t.useState(null),[J,V]=t.useState(null),[q,X]=t.useState(null);Te(`commander-image-modal-${s.id}`,P!==null,()=>W(null));const{command:B,setCommand:C,forceTextarea:l,setForceTextarea:L,useTextarea:K,setPastedTexts:U,incrementPastedCount:te,resetPastedCount:_,attachedFiles:F,setAttachedFiles:H,removeAttachedFile:se,uploadFile:ae,expandPastedTexts:ne}=Ue({selectedAgentId:s.id}),ce=B.trim().length>0||F.length>0,n=Be({outputs:c,viewMode:d?"advanced":"simple"}),o=t.useMemo(()=>{const S=Ke(s);return{usedPercent:S.usedPercent,freePercent:S.freePercent,hasData:!!s.contextStats,totalTokens:S.totalTokens,contextWindow:S.contextWindow}},[s.contextStats,s.contextUsed,s.contextLimit]),g=t.useCallback(()=>{!v&&(a!=null&&a.hasMore)&&k&&(u(!0),D.current=h.current?h.current.scrollHeight-h.current.scrollTop:0,k())},[v,a==null?void 0:a.hasMore,k]);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),N(!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),N(!0)),ee.current=a==null?void 0:a.loading},[a==null?void 0:a.loading]),t.useEffect(()=>{if(!x)return;const S=h.current;if(!S)return;const y=performance.now();let O=0,ue=-1,be;const Re=()=>{const{scrollTop:Fe,scrollHeight:Ne,clientHeight:Le}=S,He=Ne-Fe-Le<=2;if(Math.abs(Ne-ue)<=1&&He?O+=1:O=0,ue=Ne,O>=3){N(!1);return}if(performance.now()-y>5e3){N(!1);return}be=requestAnimationFrame(Re)};return be=requestAnimationFrame(Re),()=>cancelAnimationFrame(be)},[x]),t.useEffect(()=>{i.current||$(!0)},[n.length]);const G=t.useCallback(()=>!1,[]),de=t.useCallback(S=>{const y=te();return U(O=>new Map(O).set(y,S)),y},[te,U]),he=t.useCallback(S=>{H(y=>[...y,S])},[H]),xe=t.useCallback(()=>{if(!ce)return;if(B.trim()==="/clear"&&F.length===0){I.clearContext(s.id),w(),C(""),L(!1),U(new Map),H([]),_();return}let S=ne(B.trim());if(F.length>0){const y=F.map(O=>O.isImage?`[Image: ${O.path}]`:`[File: ${O.path}]`).join(`
|
|
3
3
|
`);S=S?`${S}
|
|
4
4
|
|