limixbot 0.2.9 → 0.2.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{ActivityPanel-DNJrm-It.js → ActivityPanel-Bvpm94SI.js} +1 -1
- package/dist/assets/{App-0-mtr0MN.js → App-l_O0SoTW.js} +9 -9
- package/dist/assets/{AppEventEditor-cxtdNROG.js → AppEventEditor-XelkzaCS.js} +1 -1
- package/dist/assets/{BotSettingsDialog-Bke-uC9C.js → BotSettingsDialog-BOSia0Dl.js} +1 -1
- package/dist/assets/{BrowserPanel-DIWnLFx0.js → BrowserPanel-Dt1GcUfa.js} +1 -1
- package/dist/assets/{BrowserProfilesManager-Byg78_T6.js → BrowserProfilesManager-DoftjFgj.js} +1 -1
- package/dist/assets/{CloudAddDialog-DbnC3LUp.js → CloudAddDialog-BFuXEtoq.js} +1 -1
- package/dist/assets/{ComputerFilesPane-D8NwEQh2.js → ComputerFilesPane-DsPGGwZg.js} +1 -1
- package/dist/assets/{ComputerPanel-BVjkZ-QX.js → ComputerPanel-CIS2wlkk.js} +2 -2
- package/dist/assets/{DataPanel-jd0L0Ng-.js → DataPanel-C2rGXLo2.js} +1 -1
- package/dist/assets/{DesktopViewer-Bj7DyfxJ.js → DesktopViewer-DiQCMFTh.js} +1 -1
- package/dist/assets/{FilesView-D2dpovi2.js → FilesView-CavOcRYg.js} +1 -1
- package/dist/assets/{GrokMoveDialog-Cu9vgUWd.js → GrokMoveDialog-BdfUUgBw.js} +1 -1
- package/dist/assets/{InspectorPanel-B6Ix1Q90.js → InspectorPanel-Cqr4F5c-.js} +1 -1
- package/dist/assets/{KeyboardShortcutsModal-BxLj1UAT.js → KeyboardShortcutsModal-BbNDxfMR.js} +1 -1
- package/dist/assets/{LiveDesktop-IhmS_70N.js → LiveDesktop-ByA7q9m-.js} +1 -1
- package/dist/assets/{LocalVmWorkspace-Cz_8PBvO.js → LocalVmWorkspace-C7hUHh4F.js} +1 -1
- package/dist/assets/{MacLocalControl-BQx0dmBY.js → MacLocalControl-DPUWRa_D.js} +1 -1
- package/dist/assets/{MarkdownFilePreview-BvcKRvLj.js → MarkdownFilePreview-KFjj9_pt.js} +1 -1
- package/dist/assets/{MenuMotion-Dg_hALEl.js → MenuMotion-Dao-MHD0.js} +1 -1
- package/dist/assets/{NewBotDialog-AG4lwjLs.js → NewBotDialog-DAE6phyl.js} +1 -1
- package/dist/assets/{PhoneAppDialog-DnxYDUcZ.js → PhoneAppDialog-C0Xxzdtc.js} +1 -1
- package/dist/assets/{PlacesRail-C-RypDbo.js → PlacesRail-CRjMyuI2.js} +1 -1
- package/dist/assets/{PluginsPanel-DUMsui1-.js → PluginsPanel-pUZhAXjc.js} +1 -1
- package/dist/assets/{ProIntroduction-DrVULNMR.js → ProIntroduction-SyZcb5wk.js} +1 -1
- package/dist/assets/{RemoteAgentSettingsPanel-C9bAP3v4.js → RemoteAgentSettingsPanel-Dj0bKPod.js} +1 -1
- package/dist/assets/{RoomPanel-DjGGiSTe.js → RoomPanel-CoFn4Os1.js} +1 -1
- package/dist/assets/{RoutinesPage-DI6CbJ-R.js → RoutinesPage-DJTaktUm.js} +1 -1
- package/dist/assets/{SettingsModal-2iNaR6ei.js → SettingsModal-B9z8lpfU.js} +1 -1
- package/dist/assets/{ShareTeamDialog-D7jlR9HK.js → ShareTeamDialog-DtUyfCWF.js} +1 -1
- package/dist/assets/{SignedInSites-zRGAI6no.js → SignedInSites-CHbpn9OB.js} +1 -1
- package/dist/assets/{TeamLibraryPanel-ssb1UDr5.js → TeamLibraryPanel-C_1QuCtX.js} +1 -1
- package/dist/assets/{TeamMapPage-BS05D1gH.js → TeamMapPage-B9mnajv2.js} +1 -1
- package/dist/assets/{TriggersPage-Bnny-m5i.js → TriggersPage-CNdRJbmW.js} +1 -1
- package/dist/assets/{VisibilitySection-DYoJ1GdM.js → VisibilitySection-CtAuM-r8.js} +1 -1
- package/dist/assets/{WebhookTrigger-TRl3ZXbh.js → WebhookTrigger-Cloosig_.js} +1 -1
- package/dist/assets/{WorksOnGrid-KH_NgeB8.js → WorksOnGrid-CVqKC9g1.js} +1 -1
- package/dist/assets/{abnfDiagram-YUKMZFIV-BJa3HT_w.js → abnfDiagram-YUKMZFIV-CBkP-BSK.js} +1 -1
- package/dist/assets/{activity-DpguW9va.js → activity-DigNyw0O.js} +1 -1
- package/dist/assets/{architectureDiagram-47P4ROYG-C5gEKdsw.js → architectureDiagram-47P4ROYG-CruvcvsJ.js} +1 -1
- package/dist/assets/{blockDiagram-E7TT5TSB-CT7xbCQZ.js → blockDiagram-E7TT5TSB-B63DyzaX.js} +1 -1
- package/dist/assets/{c4Diagram-CRA5TL53-DSFZqTvf.js → c4Diagram-CRA5TL53-C_3PpHJM.js} +1 -1
- package/dist/assets/{calendar-days-ASlaivsQ.js → calendar-days-CyuCxX5z.js} +1 -1
- package/dist/assets/channel-B7uxr5Bj.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-OtLqmkVp.js → chunk-2Q5K7J3B-DELAqst-.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-Rq3LG0x-.js → chunk-5VM5RSS4-xPWzVz6f.js} +1 -1
- package/dist/assets/{chunk-7TKQ45FW-BvOFm5yO.js → chunk-7TKQ45FW-DPkObkBx.js} +1 -1
- package/dist/assets/{chunk-AW2ZBBNX-Bp8ouRZs.js → chunk-AW2ZBBNX-CNZ6heg3.js} +1 -1
- package/dist/assets/{chunk-FVRAUYC3-htnnltbK.js → chunk-FVRAUYC3-DQ1HgL5V.js} +2 -2
- package/dist/assets/{chunk-HTAEGDNF-dT7z7xQV.js → chunk-HTAEGDNF-rfF3xhH-.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-BKhNCYBO.js → chunk-JWPE2WC7-D-w1MaQx.js} +1 -1
- package/dist/assets/{chunk-KQW6MTUR-DeA1KhMw.js → chunk-KQW6MTUR-BOdYGC6r.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-DJCz3KwB.js → chunk-XXDRQBXY-DeLsd0YD.js} +1 -1
- package/dist/assets/{classDiagram-v2-K4WV4PDN-BxZQcXjn.js → classDiagram-v2-K4WV4PDN-Bk4SD_yU.js} +1 -1
- package/dist/assets/{coins-Kra8C23v.js → coins-BKT_JiVX.js} +1 -1
- package/dist/assets/{core-D_ShnPPB.js → core-Du2-KW-O.js} +1 -1
- package/dist/assets/{cose-bilkent-JH36ORCC-DPvzbWJ-.js → cose-bilkent-JH36ORCC-CKCxcnFo.js} +1 -1
- package/dist/assets/{cynefin-EF2NZ3EQ-BU7oS4Kz.js → cynefin-EF2NZ3EQ-Bm8ykwYR.js} +1 -1
- package/dist/assets/{cynefinDiagram-3GCD6N5R-BGBWfDSm.js → cynefinDiagram-3GCD6N5R-rm0b-j7u.js} +1 -1
- package/dist/assets/{dagre-W4DXFKR2-IWCaUQIb.js → dagre-W4DXFKR2-CZTVMRZx.js} +1 -1
- package/dist/assets/{diagram-2UJZ2QOL-Bhk3LC2M.js → diagram-2UJZ2QOL-B_9AJMo0.js} +1 -1
- package/dist/assets/{diagram-OVF4WLC6-CuabegT5.js → diagram-OVF4WLC6-Bc-Qdipc.js} +1 -1
- package/dist/assets/{diagram-PFPMY2P6-CoS7hKtb.js → diagram-PFPMY2P6-5Y9Re5B_.js} +1 -1
- package/dist/assets/{diagram-UMYRVEAY-BQmo6hIx.js → diagram-UMYRVEAY-DnhF-EqI.js} +1 -1
- package/dist/assets/{diagram-YEKJPTXX-Dn-KHH-s.js → diagram-YEKJPTXX-CZxXKfro.js} +1 -1
- package/dist/assets/{diagram-ZIFT7M5P-BCWmVp3z.js → diagram-ZIFT7M5P-DUJqZ-uV.js} +1 -1
- package/dist/assets/{ebnfDiagram-VR2GEFS7-Bb086aqc.js → ebnfDiagram-VR2GEFS7-39Ln_RbH.js} +1 -1
- package/dist/assets/{elk-IJKZMXRS-C0AdhTr_.js → elk-IJKZMXRS-B-lqhJ12.js} +1 -1
- package/dist/assets/{erDiagram-O2IAPWRE-CGa-MwBB.js → erDiagram-O2IAPWRE-BnaUK8IN.js} +1 -1
- package/dist/assets/{file-up-XN39lGyR.js → file-up-DNhG9NJH.js} +1 -1
- package/dist/assets/{flowDiagram-OXPTDLAJ-BdLF4FEb.js → flowDiagram-OXPTDLAJ-BToXR2Mw.js} +1 -1
- package/dist/assets/{ganttDiagram-R7TSEDQI-iXPVrTqJ.js → ganttDiagram-R7TSEDQI-DRtcIc_1.js} +1 -1
- package/dist/assets/{gitGraphDiagram-XJZIOB7I-DA55YE0F.js → gitGraphDiagram-XJZIOB7I-BqNco84N.js} +1 -1
- package/dist/assets/{import-name-CNEv8Wx8.js → import-name-Dpw9ffGc.js} +1 -1
- package/dist/assets/{index-BDVsw1Qr.js → index-BQun5WYq.js} +1 -1
- package/dist/assets/{index-CtBcDSNT.js → index-NUJD2B9p.js} +1 -1
- package/dist/assets/{index-CnQ2pCf7.js → index-ta51KzHq.js} +2 -2
- package/dist/assets/{infoDiagram-5W2HQ5XZ-DwwOOuPK.js → infoDiagram-5W2HQ5XZ-BVqKd6-t.js} +1 -1
- package/dist/assets/{ishikawaDiagram-K3B6WC7H-uOns6fyB.js → ishikawaDiagram-K3B6WC7H-B93SsggN.js} +1 -1
- package/dist/assets/{journeyDiagram-COXZFDF6-BNlo402b.js → journeyDiagram-COXZFDF6-D4uAuvjz.js} +1 -1
- package/dist/assets/{kanban-definition-P3RFRI5V-rApNRuxE.js → kanban-definition-P3RFRI5V-CD_E9F80.js} +1 -1
- package/dist/assets/{mcp-servers-DiCs_cE-.js → mcp-servers-BlsicIOW.js} +1 -1
- package/dist/assets/{mermaid.core-UoMXw4Pf.js → mermaid.core-DAyICXcr.js} +4 -4
- package/dist/assets/{mindmap-definition-LZFPQGKD-DMx0e0Ua.js → mindmap-definition-LZFPQGKD-B_36GatV.js} +1 -1
- package/dist/assets/{minimize-C6tWjaQW.js → minimize-CRy5CmbJ.js} +1 -1
- package/dist/assets/{monitor-CqHNmvSo.js → monitor-DLOjaeVP.js} +1 -1
- package/dist/assets/{new-bot-CpjPfYn1.js → new-bot-BKsNF8dT.js} +1 -1
- package/dist/assets/{org-library-DkWIJaGU.js → org-library-DOYA88DK.js} +1 -1
- package/dist/assets/{package-format-DQ8Q_tWB.js → package-format-CX64Cr9h.js} +1 -1
- package/dist/assets/{pegDiagram-BGZESJAR-BGjO4xhf.js → pegDiagram-BGZESJAR-B7FuV7X0.js} +1 -1
- package/dist/assets/{pieDiagram-CAPJLFHJ-CKDnQaP9.js → pieDiagram-CAPJLFHJ-BQBZcFY5.js} +1 -1
- package/dist/assets/{quadrantDiagram-GDMTTRAM-2Yd2aagw.js → quadrantDiagram-GDMTTRAM-Y5wQGSfU.js} +1 -1
- package/dist/assets/{rail-DzTUJt9y.js → rail-D_MJNGjb.js} +1 -1
- package/dist/assets/{railroadDiagram-SM67HX2B-2p7uXTy-.js → railroadDiagram-SM67HX2B-C2X7zVuY.js} +1 -1
- package/dist/assets/{remote-desktop-panel-CWP7wnfp.js → remote-desktop-panel-5jCqe8J5.js} +1 -1
- package/dist/assets/{requirementDiagram-X7JNWC4A-B8Tb583R.js → requirementDiagram-X7JNWC4A-BkmRYoO5.js} +1 -1
- package/dist/assets/{sankeyDiagram-UM26HJRW-uH_0e9a7.js → sankeyDiagram-UM26HJRW-Cl8g0NZX.js} +1 -1
- package/dist/assets/{sequenceDiagram-ZO4K6R2Y-BL2NmEjq.js → sequenceDiagram-ZO4K6R2Y-Cc26UOue.js} +1 -1
- package/dist/assets/{sizeCapture-INFHLROL-CF5rj-Tn.js → sizeCapture-INFHLROL-hOlzqxab.js} +1 -1
- package/dist/assets/{stateDiagram-v2-TBUQTH76-Bi8FVJmD.js → stateDiagram-v2-TBUQTH76-DV0u3rMX.js} +1 -1
- package/dist/assets/{styles-3gApXdcp.js → styles-CEi8u2Uw.js} +1 -1
- package/dist/assets/{swimlanes-N4OXWK64-cI7SKAY4.js → swimlanes-N4OXWK64-DoPALhro.js} +1 -1
- package/dist/assets/swimlanesDiagram-K3J5GTZL-BEg3YODK.js +8 -0
- package/dist/assets/{team-share-Dy8-U6dh.js → team-share-BKhOCfz-.js} +1 -1
- package/dist/assets/{timeline-definition-YOQAKGHF-DgYVfZT2.js → timeline-definition-YOQAKGHF-DpyL_3nh.js} +1 -1
- package/dist/assets/{usecaseDiagram-VIAY4XPW-DA-ohLD0.js → usecaseDiagram-VIAY4XPW-BaUhrGVI.js} +1 -1
- package/dist/assets/{vennDiagram-BLWOH2XV-DvsWwQlH.js → vennDiagram-BLWOH2XV-ycFRyc2_.js} +1 -1
- package/dist/assets/{wardleyDiagram-YMQ3BMBF--20oJB2z.js → wardleyDiagram-YMQ3BMBF-BQSM0Pl0.js} +1 -1
- package/dist/assets/{xychartDiagram-TAQBALBS-C8j4OKSW.js → xychartDiagram-TAQBALBS-Djubnd96.js} +1 -1
- package/dist/index.html +2 -2
- package/dist/rail.html +4 -4
- package/dist-server/package.json +1 -1
- package/package.json +1 -1
- package/dist/assets/channel-BqGEhKY0.js +0 -1
- package/dist/assets/swimlanesDiagram-K3J5GTZL-D8raS3ll.js +0 -8
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as st,j as e,t,r as l,a as O,S as jt,aY as il,aZ as rl,f as ve,p as Se,g as Ds,ad as ll,X as We,a_ as gn,i as Us,C as ol,ae as Ja,L as Dt,aP as cl,a$ as dl,a5 as ul,F as pl,b as Ve,b0 as ml,b1 as xl,b2 as fn,at as bn,b3 as hl,au as gl,b4 as fl,b5 as bl,a8 as yl,M as vl,b6 as kl,b7 as _s,b8 as jl,b9 as Nl,ba as yn,bb as $s,l as wl,bc as Sl,m as vn,bd as Ya,d as Cl,be as El,v as Al,bf as Pl,q as Il,ax as Rl,bg as kn,aw as Tl,bh as Bl,bi as jn,bj as Nn,bk as wn,bl as Ll,bm as Ol,D as zl,bn as Ml,ah as Fl,bo as Dl,bp as Ul}from"./styles-3gApXdcp.js";import{bL as Gt,u as G,S as fe,n as F,gS as Ks,D as ye,cH as _l,cD as Xa,T as Le,gT as He,eE as dt,gU as $l,Y as Ge,eC as Kl,eD as Hl,gV as ws,gW as ft,gX as Qa,gY as Hs,gZ as Ws,g_ as Wl,dX as Sn,g$ as Za,h0 as ei,h1 as Gl,h2 as Vl,h3 as ql,bJ as ge,bV as X,e3 as Ss,eB as Jl,h4 as ti,h5 as zt,h6 as Vt,h7 as si,h8 as ni,h9 as $e,ha as tt,hb as Yl,hc as Xl,hd as Ql,he as Zl,hf as eo,C as ut,hg as ai,hh as to,hi as so,hj as ii,hk as ri,hl as Ce,hm as Ee,dj as Cn,hn as qt,ho as no,hp as ao,hq as io,hr as ro,hs as lo,gL as li,bp as oo,ht as gt,R as co,dC as uo,df as po,hu as ct,bD as oi,eu as mo,E as Gs,hv as ci,hw as xo,aM as Ut,fn as yt,fo as vt,hx as ho,M as Vs,r as go,cf as fo,gA as bo,hy as Jt,hz as di,hA as yo,hB as vo,hC as En,hD as ui,hE as Yt,hF as pi,hG as ko,hH as jo,hI as No,hJ as wo,G as So,hK as Co,hL as kt,e9 as Xt,hM as Eo,hN as Ao,hO as Po,hP as Io,fv as Ro,hQ as An,hR as To,hS as Bo,hT as Pn,hU as Lo,e8 as mi,hV as Oo,hW as zo,hX as Mo,hY as Fo,hZ as Do,h_ as Uo,h$ as xi,i0 as _o,i1 as $o,i2 as Ko,i3 as Ho,i4 as Wo,i5 as Go,i6 as hi,i7 as Vo,i8 as qo,dI as Jo,i9 as Yo,e4 as Xo,ia as Qo,ib as Zo,ic as ec,c as tc,id as In,ie as sc,ig as Rn,l as nc,ih as ac,ii as ic,ij as rc,ik as lc,il as oc,im as cc,io as dc,ip as gi,fl as mt,iq as uc,fk as pc,ir as mc,is as xc,it as hc,iu as gc,iv as fc,iw as bc,ix as yc,iy as vc,iz as qs,iA as kc,fb as fi,m as jc,iB as Nc,iC as wc,iD as Tn,iE as Sc,iF as Cc,iG as Bn,iH as Ec,bf as Ac,iI as Pc,iJ as Ic,iK as Rc,iL as Tc,iM as Bc,iN as Ln,iO as Lc,bu as bi,iP as Oc,bv as zc,iQ as Mc,iR as Fc,iS as Dc,iT as Uc,iU as _c,iV as $c,iW as Kc,iX as Hc,iY as On,go as Wc,iZ as Gc,i_ as Vc,i$ as yi,j0 as qc,j1 as Jc,j2 as Yc,j3 as vi,j4 as ki,j5 as ji,j6 as Xc,j7 as Qc,d0 as Zc,I as ed,j8 as td,ew as sd,bT as zn,j9 as Mn,eV as Fn,dW as nd,_ as ad,ay as id,ja as rd,jb as ld,jc as od}from"./App-0-mtr0MN.js";import{L as q,P as Oe,y as Nt,E as Ni,M as cd,aj as dd,$ as ud,W as pd,x as Qt,C as Js,ak as md,J as wi,X as Si,R as Ys,B as Zt,al as xd,am as hd,an as gd,d as Ci,r as fd,A as bd,c as yd,ao as vd,ap as kd,K as jd,ab as Nd,aq as wd,b as Sd,U as Cd,N as is}from"./PlacesRail-C-RypDbo.js";import{C as Xs,a as Ed,R as De}from"./MenuMotion-Dg_hALEl.js";import{l as Ei,M as Ad,w as Pd}from"./MacLocalControl-BQx0dmBY.js";import{Q as es}from"./index-BDVsw1Qr.js";import{r as Ai,a as Pi,b as Ii,i as Id,C as Rd,c as Td,p as Bd}from"./index-CnQ2pCf7.js";import{Q as Ld,T as Od,U as zd,W as Md,X as Fd}from"./VisibilitySection-DYoJ1GdM.js";import{c as Dd,A as Ud,w as _d,d as $d,e as Dn}from"./activity-DpguW9va.js";import{U as Ri,R as Ti,B as Bi,S as Li,a as Oi,D as zi,T as Mi,C as Fi,L as Cs,b as Di,F as Ui,A as Es,E as Kd,c as Hd,P as Wd,d as Gd,e as Vd,N as qd}from"./NewBotDialog-AG4lwjLs.js";import{a as Jd,u as Yd,C as _i,b as Xd,P as Qd}from"./ProIntroduction-DrVULNMR.js";import{M as $i}from"./monitor-CqHNmvSo.js";import{C as Zd}from"./coins-Kra8C23v.js";import"./org-library-DkWIJaGU.js";import"./package-format-DQ8Q_tWB.js";import"./mcp-servers-DiCs_cE-.js";import"./WorksOnGrid-KH_NgeB8.js";import"./new-bot-CpjPfYn1.js";import"./RoutinesPage-DI6CbJ-R.js";import"./remote-desktop-DDRRx8uY.js";import"./team-share-Dy8-U6dh.js";import"./BrowserProfilesManager-Byg78_T6.js";import"./SignedInSites-zRGAI6no.js";const eu=[["path",{d:"M12 13v8l-4-4",key:"1f5nwf"}],["path",{d:"m12 21 4-4",key:"1lfcce"}],["path",{d:"M4.393 15.269A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.436 8.284",key:"ui1hmy"}]],tu=st("cloud-download",eu);const su=[["path",{d:"M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z",key:"e79jfc"}],["circle",{cx:"13.5",cy:"6.5",r:".5",fill:"currentColor",key:"1okk4w"}],["circle",{cx:"17.5",cy:"10.5",r:".5",fill:"currentColor",key:"f64h9f"}],["circle",{cx:"6.5",cy:"12.5",r:".5",fill:"currentColor",key:"qy21gx"}],["circle",{cx:"8.5",cy:"7.5",r:".5",fill:"currentColor",key:"fotxhn"}]],nu=st("palette",su);const au=[["rect",{width:"5",height:"5",x:"3",y:"3",rx:"1",key:"1tu5fj"}],["rect",{width:"5",height:"5",x:"16",y:"3",rx:"1",key:"1v8r4q"}],["rect",{width:"5",height:"5",x:"3",y:"16",rx:"1",key:"1x03jg"}],["path",{d:"M21 16h-3a2 2 0 0 0-2 2v3",key:"177gqh"}],["path",{d:"M21 21v.01",key:"ents32"}],["path",{d:"M12 7v3a2 2 0 0 1-2 2H7",key:"8crl2c"}],["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M12 3h.01",key:"n36tog"}],["path",{d:"M12 16v.01",key:"133mhm"}],["path",{d:"M16 12h1",key:"1slzba"}],["path",{d:"M21 12v.01",key:"1lwtk9"}],["path",{d:"M12 21v-1",key:"1880an"}]],iu=st("qr-code",au);const ru=[["path",{d:"M15 12h-5",key:"r7krc0"}],["path",{d:"M15 8h-5",key:"1khuty"}],["path",{d:"M19 17V5a2 2 0 0 0-2-2H4",key:"zz82l3"}],["path",{d:"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3",key:"1ph1d7"}]],lu=st("scroll-text",ru);const ou=[["path",{d:"M12 19h8",key:"baeox8"}],["path",{d:"m4 17 6-6-6-6",key:"1yngyt"}]],cu=st("terminal",ou);const du=[["path",{d:"m19 5 3-3",key:"yk6iyv"}],["path",{d:"m2 22 3-3",key:"19mgm9"}],["path",{d:"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z",key:"goz73y"}],["path",{d:"M7.5 13.5 10 11",key:"7xgeeb"}],["path",{d:"M10.5 16.5 13 14",key:"10btkg"}],["path",{d:"m12 6 6 6 2.3-2.3a2.4 2.4 0 0 0 0-3.4l-2.6-2.6a2.4 2.4 0 0 0-3.4 0Z",key:"1snsnr"}]],uu=st("unplug",du);const pu=[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]],mu=st("wifi",pu);function Ae({children:s,note:n="settings.adminOnly.change"}){return Gt()===!1?e.jsx("p",{"data-admin-only":!0,className:"text-[13px] text-ink-secondary",children:t(n)}):s}function Qs(s,n,a="start",i=0){const r=n.getBoundingClientRect().top-s.getBoundingClientRect().top+s.scrollTop;s.scrollTop=Math.max(0,a==="center"?r-(s.clientHeight-(n.offsetHeight??0))/2:r-i)}function xu(s){for(let n=s.parentElement;n;n=n.parentElement){const a=getComputedStyle(n).overflowY;if((a==="auto"||a==="scroll")&&n.scrollHeight>n.clientHeight)return n}return null}function hu(){const{state:s,dispatch:n}=G(),[a,i]=l.useState(!1),[r,c]=l.useState(null),o=s.config?.tts?.everyReply===!0,d=()=>{i(!0),c(null),F("/api/config",{method:"PUT",body:JSON.stringify({tts:{everyReply:!o}})}).then(u=>n({type:"configStatus",config:u})).catch(u=>c(u.message)).finally(()=>i(!1))};return e.jsxs("div",{"data-voice-every-reply":!0,className:"flex items-center justify-between gap-4 px-3 py-2.5",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[14px] font-medium leading-5 text-ink",children:t("voice.everyReply")}),e.jsx("div",{className:"mt-0.5 text-[12px] leading-4 text-ink-secondary",children:t("voice.everyReply.allHelp")}),r&&e.jsx("div",{role:"alert",className:"mt-1 text-[12px] text-danger",children:r})]}),e.jsx(fe,{checked:o,disabled:a,"aria-label":t("voice.everyReply"),onClick:d})]})}function rs(s){return[...new Set(s.split(/[,,、\s]+/).map(n=>n.trim()).filter(Boolean))]}const et=O(He,"font-sans"),gu=[5,10,20,30,60],ls="ui-icon-button shrink-0 hover:text-ink",os={name:"Google Gemini",url:"https://generativelanguage.googleapis.com/v1beta/openai"},As={count:64,length:200},fu=s=>s.length<=As.count&&s.every(n=>n.length<=As.length),Ps=(s,n)=>F(`/api/instances/${encodeURIComponent(s)}`,{method:"PATCH",body:JSON.stringify(n)});function Ki({server:s,disabled:n,onPick:a}){return e.jsxs(ye,{size:"sm",className:"shrink-0",value:s.replyWaitMinutes??"",onChange:i=>a(i.target.value?Number(i.target.value):null),disabled:n,"aria-label":t("apiInstances.replyWaitFor",{name:s.displayName}),title:t("apiInstances.replyWaitHint"),children:[e.jsx("option",{value:"",children:t("apiInstances.replyWaitDefault")}),[...new Set([...gu,...s.replyWaitMinutes?[s.replyWaitMinutes]:[]])].sort((i,r)=>i-r).map(i=>e.jsx("option",{value:i,children:t("apiInstances.replyWaitMinutes",{minutes:String(i)})},i))]})}function bu(){const{state:s,dispatch:n,refreshInstances:a}=G(),[i,r]=l.useState(!1),[c,o]=l.useState(null),d=s.instances.find(p=>p.instanceId==="openaiCompat"&&p.driverKind==="openai-compat");if(!d||!s.config?.openaiCompat?.url)return null;const u=p=>{i||(r(!0),o(null),Ps(d.instanceId,{replyWaitMinutes:p}).then(async({instances:m})=>{Array.isArray(m)?n({type:"instances",instances:m}):await a({reportErrors:!0})}).catch(m=>o(m.message||t("apiInstances.failed"))).finally(()=>r(!1)))};return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(Ki,{server:d,disabled:i,onPick:u}),e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("apiInstances.replyWaitHint")}),c&&e.jsx("div",{role:"alert",className:"text-[12px] leading-4 text-danger",children:c})]})}function yu(){const{state:s}=G();return e.jsx(vu,{servers:Ks(s.instances)})}function vu({servers:s}){const{dispatch:n,refreshInstances:a}=G(),[i,r]=l.useState(""),[c,o]=l.useState(""),[d,u]=l.useState(""),[p,m]=l.useState(""),[x,h]=l.useState(null),[f,b]=l.useState(null),[y,g]=l.useState(null),[v,C]=l.useState(""),w=!!(i.trim()&&c.trim()&&d.trim()),N=(j,L,k,P)=>{x||(h(j),b(null),L().then(async({instances:S})=>{Array.isArray(S)?n({type:"instances",instances:S}):await a({reportErrors:!0}),k?.()}).catch(S=>b({text:S.message||t("apiInstances.failed"),at:P})).finally(()=>h(null)))},I=()=>w&&N("add",()=>F("/api/instances/openai-compat",{method:"POST",body:JSON.stringify({displayName:i.trim(),url:c.trim(),key:d.trim(),...rs(p).length?{models:rs(p)}:{}})}).then(j=>(dt("custom_endpoint","settings","unverified"),j),j=>{throw dt("custom_endpoint","settings","error"),j}),()=>{r(""),o(""),u(""),m("")});return e.jsxs("div",{"data-api-keys-other":!0,children:[e.jsx("div",{className:"mb-0.5 text-[13px] leading-[18px] text-ink",children:t("apiInstances.title")}),e.jsx("p",{className:"mb-2 text-[12px] leading-4 text-ink-secondary",children:t("apiInstances.subtitle")}),s.length===0&&e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("apiInstances.empty")}),s.map(j=>e.jsxs("div",{className:"mb-1.5 rounded-lg border border-hairline/60 bg-inset px-3 py-1.5",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"truncate text-[12px] text-ink",children:j.displayName}),j.url&&e.jsx("div",{className:"truncate font-mono text-[11px] text-ink-secondary",children:j.url})]}),e.jsx(Ki,{server:j,disabled:x!==null,onPick:L=>N("other",()=>Ps(j.instanceId,{replyWaitMinutes:L}))}),e.jsx("button",{type:"button",onClick:()=>{C((j.managedModels??[]).join(", ")),g(y===j.instanceId?null:j.instanceId),b(null)},disabled:x!==null,"aria-label":t("apiInstances.editModels",{name:j.displayName}),"aria-expanded":y===j.instanceId,title:t("apiInstances.editModels",{name:j.displayName}),className:ls,children:e.jsx(_l,{size:13,"aria-hidden":"true"})}),e.jsx("button",{type:"button",onClick:()=>N("other",()=>F(`/api/instances/${encodeURIComponent(j.instanceId)}/refresh-models`,{method:"POST"})),disabled:x!==null,"aria-label":t("apiInstances.refreshModels",{name:j.displayName}),title:t("apiInstances.refreshModels",{name:j.displayName}),className:ls,children:e.jsx(Xa,{size:13,"aria-hidden":"true"})}),e.jsx("button",{type:"button",onClick:()=>N("other",()=>F(`/api/instances/${encodeURIComponent(j.instanceId)}`,{method:"DELETE"})),disabled:x!==null,"aria-label":t("apiInstances.remove",{name:j.displayName}),title:t("apiInstances.remove",{name:j.displayName}),className:`${ls} hover:bg-danger/10 hover:text-danger`,children:e.jsx(Le,{size:13,"aria-hidden":"true"})})]}),y===j.instanceId&&e.jsxs("div",{className:"mt-1.5 flex flex-col gap-1.5",children:[e.jsx("input",{value:v,onChange:L=>C(L.target.value),placeholder:t("apiInstances.models"),"aria-label":t("apiInstances.modelsFor",{name:j.displayName}),spellCheck:!1,disabled:x!==null,className:O(et,"font-mono")}),e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("apiInstances.editModelsHint")}),e.jsxs("div",{className:"flex gap-1.5",children:[e.jsx("button",{type:"button",onClick:()=>{const L=rs(v);if(!fu(L)){b({text:t("apiInstances.modelsLimit",As),at:j.instanceId});return}N("other",()=>Ps(j.instanceId,{models:L}),()=>g(null),j.instanceId)},disabled:x!==null,className:"ui-button",children:t("common.save")}),e.jsx("button",{type:"button",onClick:()=>g(null),disabled:x!==null,className:"ui-button",children:t("common.cancel")})]}),f?.at===j.instanceId&&e.jsx("div",{role:"alert",className:"text-[12px] leading-4 text-danger",children:f.text})]})]},j.instanceId)),e.jsxs("div",{className:"mt-2 flex flex-col gap-1.5",children:[e.jsx("button",{type:"button",onClick:()=>{r(os.name),o(os.url)},disabled:x!==null,className:"ui-button self-start",children:t("apiInstances.geminiPreset")}),c.trim()===os.url&&e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("apiInstances.geminiKeyHint")}),e.jsx("input",{value:i,onChange:j=>r(j.target.value),placeholder:t("apiInstances.name"),"aria-label":t("apiInstances.name"),spellCheck:!1,disabled:x!==null,className:et}),e.jsx("input",{type:"url",value:c,onChange:j=>o(j.target.value),placeholder:"https://api.example.com/v1","aria-label":t("apiInstances.url"),spellCheck:!1,disabled:x!==null,className:O(et,"font-mono")}),e.jsx("input",{type:"password",value:d,onChange:j=>u(j.target.value),placeholder:t("apiInstances.key"),"aria-label":t("apiInstances.key"),autoComplete:"off",disabled:x!==null,className:O(et,"font-mono")}),e.jsx("input",{value:p,onChange:j=>m(j.target.value),placeholder:t("apiInstances.models"),"aria-label":t("apiInstances.models"),spellCheck:!1,disabled:x!==null,className:O(et,"font-mono")}),e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("apiInstances.modelsHint")}),e.jsxs("button",{type:"button",onClick:I,disabled:x!==null||!w,className:"ui-button self-start",children:[x==="add"?e.jsx(q,{size:12,"aria-hidden":"true",className:"animate-spin"}):e.jsx(Oe,{size:12,"aria-hidden":"true"}),x==="add"?t("apiInstances.adding"):t("apiInstances.add")]})]}),f&&!f.at&&e.jsx("div",{className:"mt-1 text-[12px] text-danger",children:f.text})]})}const ku="lm-studio";function ju(s){const n=s.trim();if(!/^[1-9]\d{0,4}$/.test(n))return null;const a=Number(n);return a>65535?null:`http://127.0.0.1:${a}/v1`}function Nu({heading:s=!0}={}){const{state:n,dispatch:a,refreshInstances:i}=G(),r=Ks(n.instances),[c,o]=l.useState("1234"),[d,u]=l.useState(""),[p,m]=l.useState(!1),[x,h]=l.useState(null),f=ju(c),b=!!(f&&r.some(g=>g.url===f)),y=()=>{p||!f||b||(m(!0),h(null),F("/api/instances/openai-compat",{method:"POST",body:JSON.stringify({displayName:"LM Studio",url:f,key:d.trim()||ku,catalog:"lmstudio"})}).then(async g=>{dt("custom_endpoint","settings","unverified"),Array.isArray(g.instances)?a({type:"instances",instances:g.instances}):await i({reportErrors:!0}),u("")},g=>{dt("custom_endpoint","settings","error"),h(g instanceof Error&&g.message?g.message:t("apiInstances.failed"))}).finally(()=>m(!1)))};return e.jsxs("div",{className:O(s&&"rounded-lg border border-hairline/40 bg-inset px-3 py-2"),children:[s&&e.jsx("div",{className:"text-[13px] text-ink",children:t("lmStudio.title")}),e.jsx("p",{className:O("text-[12px] leading-4 text-ink-secondary",s&&"mt-1"),children:t("lmStudio.desc")}),e.jsxs("div",{className:"mt-2 flex flex-col gap-1.5",children:[e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] leading-4 text-ink-secondary",children:[t("lmStudio.port"),e.jsx("input",{inputMode:"numeric",value:c,onChange:g=>o(g.target.value),"aria-label":t("lmStudio.port"),spellCheck:!1,disabled:p,className:O(et,"font-mono")})]}),e.jsx("input",{type:"password",value:d,onChange:g=>u(g.target.value),placeholder:t("lmStudio.token"),"aria-label":t("lmStudio.token"),autoComplete:"off",disabled:p,className:O(et,"font-mono")}),e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("lmStudio.tokenHint")}),f&&e.jsx("p",{className:"truncate font-mono text-[12px] leading-4 text-ink-secondary",children:f}),e.jsxs("button",{type:"button",onClick:y,disabled:p||!f||b,className:"ui-button self-start",children:[p?e.jsx(q,{size:12,"aria-hidden":"true",className:"animate-spin"}):e.jsx(Oe,{size:12,"aria-hidden":"true"}),p?t("lmStudio.adding"):t("lmStudio.add")]}),b&&e.jsx("p",{className:"text-[12px] text-ink-secondary",children:t("lmStudio.added")})]}),x&&e.jsx("div",{className:"mt-1 text-[12px] text-danger",children:x})]})}const wu="ollama",Su="https://ollama.com/download",Cu=s=>`${s.replace(/\/+$/,"")}/v1`,Eu=(s,n)=>s?.trim().replace(/\/+$/,"")===n;function Au({visible:s}){const{state:n,dispatch:a,refreshInstances:i}=G(),[r,c]=l.useState(""),[o,d]=l.useState(null),[u,p]=l.useState(!1),[m,x]=l.useState(!1),[h,f]=l.useState(null),b=l.useRef(0),y=l.useRef(!1),g=l.useCallback(I=>{const j=++b.current;p(!0),f(null),F(`/api/instances/ollama${I?`?url=${encodeURIComponent(I)}`:""}`).then(L=>{j===b.current&&d(L.status)}).catch(L=>{j===b.current&&(d(null),f(L.message||t("apiInstances.failed")))}).finally(()=>{j===b.current&&p(!1)})},[]);l.useEffect(()=>{!s||y.current||(y.current=!0,g(""))},[s,g]);const v=o?Cu(o.url):null,C=!!(v&&(Ks(n.instances).some(I=>I.url===v)||Eu(n.config?.openaiCompat?.url,v))),w=!!(v&&!C&&!m&&!u&&(o?.state==="ready"||o?.state==="no-models")),N=()=>{!w||!v||(x(!0),f(null),F("/api/instances/openai-compat",{method:"POST",body:JSON.stringify({displayName:"Ollama",url:v,key:wu,catalog:"ollama"})}).then(async I=>{dt("custom_endpoint","settings","unverified"),Array.isArray(I.instances)?a({type:"instances",instances:I.instances}):await i({reportErrors:!0})},I=>{dt("custom_endpoint","settings","error"),f(I instanceof Error&&I.message?I.message:t("apiInstances.failed"))}).finally(()=>x(!1)))};return e.jsxs("div",{"data-ollama-server":!0,children:[e.jsx("div",{role:"status","aria-live":"polite",children:u?e.jsxs("p",{className:"flex items-center gap-1.5 text-[12px] leading-4 text-ink-secondary",children:[e.jsx(q,{size:12,className:"animate-spin","aria-hidden":"true"}),t("ollama.checking")]}):o&&e.jsx($l,{status:o})}),!u&&o?.state==="not-running"&&e.jsx("a",{href:Su,target:"_blank",rel:"noopener noreferrer",className:"mt-1 inline-block text-[12px] font-medium text-accent-text hover:underline",children:t("ollama.download")}),e.jsxs("div",{className:"mt-2 flex flex-col gap-1.5",children:[e.jsx("input",{type:"url",value:r,onChange:I=>c(I.target.value),onKeyDown:I=>{I.key==="Enter"&&g(r.trim())},placeholder:"http://127.0.0.1:11434","aria-label":t("ollama.address"),spellCheck:!1,disabled:m,className:O(He,"font-mono")}),e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("ollama.addressHint")}),e.jsxs("div",{className:"flex flex-wrap gap-1.5",children:[e.jsxs("button",{type:"button",onClick:N,disabled:!w,className:"ui-button",children:[m?e.jsx(q,{size:12,"aria-hidden":"true",className:"animate-spin"}):e.jsx(Oe,{size:12,"aria-hidden":"true"}),m?t("ollama.adding"):t("ollama.add")]}),e.jsxs("button",{type:"button",onClick:()=>g(r.trim()),disabled:u||m,className:"ui-button",children:[e.jsx(Xa,{size:12,"aria-hidden":"true"}),t("common.checkAgain")]})]}),C&&e.jsx("p",{className:"text-[12px] text-ink-secondary",children:t("ollama.added")})]}),h&&e.jsx("div",{role:"alert",className:"mt-1 text-[12px] text-danger",children:h})]})}function Pu(){const{state:s,dispatch:n}=G(),a=s.config?.opencodeGo?.providerKeys??[],[i,r]=l.useState(""),[c,o]=l.useState(""),[d,u]=l.useState(!1),[p,m]=l.useState(null),[x,h]=l.useState(null),f=d||p!==null,b=(v,C)=>F("/api/config",{method:"PUT",body:JSON.stringify({opencodeGo:{providerKeys:{[v]:C}}})}).then(w=>n({type:"configStatus",config:w})),y=()=>{const v=i.trim().toUpperCase(),C=Kl(c);if(!(f||!v||!C)){if(!Hl(C)){h(t("keys.notAKey"));return}u(!0),h(null),b(v,C).then(()=>{r(""),o("")}).catch(w=>h(w.message)).finally(()=>u(!1))}},g=v=>{f||(m(v),h(null),b(v,"").catch(C=>h(C.message)).finally(()=>m(null)))};return e.jsxs("div",{"data-opencode-provider-keys":!0,className:"flex flex-col gap-2",children:[e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("keys.opencode.otherProviders.hint")}),s.config?.cloudHome!==!0&&e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("keys.opencode.providersHint").split("{command}").flatMap((v,C)=>C===0?[v]:[e.jsx("code",{className:"font-mono",children:"opencode auth login"},C),v])}),a.map(v=>e.jsxs("div",{"data-opencode-provider-key":v,className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:O(He,"block flex-1 truncate text-ink"),children:v}),e.jsx("button",{type:"button",onClick:()=>g(v),disabled:f,"aria-label":t("keys.opencode.otherProviders.removeAria",{name:v}),className:"ui-button shrink-0",children:p===v?e.jsx(q,{size:13,className:"animate-spin","aria-hidden":"true"}):t("keys.row.remove")})]},v)),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("input",{type:"text",value:i,onChange:v=>{h(null),r(v.target.value)},onKeyDown:v=>v.key==="Enter"&&y(),disabled:f,placeholder:"VENICE_API_KEY","aria-label":t("keys.opencode.otherProviders.name"),autoComplete:"off",spellCheck:!1,className:O(He,"w-auto min-w-[min(100%,10rem)] flex-1 uppercase placeholder:normal-case")}),e.jsx("input",{type:"password",value:c,onChange:v=>{h(null),o(v.target.value)},onKeyDown:v=>v.key==="Enter"&&y(),disabled:f,placeholder:t("keys.opencode.otherProviders.keyPlaceholder"),"aria-label":t("keys.opencode.otherProviders.key"),autoComplete:"off",className:O(He,"w-auto min-w-[min(100%,10rem)] flex-1")}),e.jsx("button",{type:"button",onClick:y,disabled:f||!i.trim()||!c.trim(),className:"ui-button ui-button-primary shrink-0",children:d?e.jsx(q,{size:13,className:"animate-spin","aria-hidden":"true"}):t("common.save")})]}),x&&e.jsx("div",{role:"alert",className:"text-[12px] leading-4 text-danger",children:x})]})}function Iu(){const{state:s,dispatch:n}=G(),[a,i]=l.useState(!1),[r,c]=l.useState(null);if(!s.config?.anthropic?.configured)return null;const o=s.config.anthropic.everyClaudeBot===!0,d=()=>{a||(i(!0),c(null),F("/api/config",{method:"PUT",body:JSON.stringify({anthropic:{everyClaudeBot:!o}})}).then(u=>n({type:"configStatus",config:u})).catch(u=>c(u.message)).finally(()=>i(!1)))};return e.jsxs("div",{"data-anthropic-every-claude-bot":!0,className:"flex flex-col gap-1.5",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-[13px] leading-[18px] text-ink",children:t("keys.anthropic.everyBot")}),e.jsx("div",{className:"text-[12px] leading-4 text-ink-secondary",children:o?t("keys.anthropic.everyBotOn"):t("keys.anthropic.everyBotOff")})]}),e.jsx(fe,{checked:o,disabled:a,onClick:d,"aria-label":t("keys.anthropic.everyBot")})]}),o&&e.jsxs("p",{className:"flex gap-1.5 text-[12px] leading-4 text-warning",children:[e.jsx(Ge,{size:13,className:"mt-px shrink-0","aria-hidden":"true"}),e.jsx("span",{children:t("keys.anthropic.warning")})]}),r&&e.jsx("div",{role:"alert",className:"text-[12px] leading-4 text-danger",children:r})]})}function Ru(){const{state:s,dispatch:n}=G(),[a,i]=l.useState(""),[r,c]=l.useState(!1),[o,d]=l.useState(null),u=!!s.config?.vps?.configured,p=!a.trim()&&u;l.useEffect(()=>{i(s.config?.vps?.sshAlias??"")},[s.config?.vps?.sshAlias]);const m=()=>{r||!a.trim()&&!u||(c(!0),d(null),F("/api/config",{method:"PUT",body:JSON.stringify({vps:{sshAlias:a.trim()}})}).then(x=>{n({type:"configStatus",config:x}),i(x.vps?.sshAlias??"")}).catch(x=>d(x.message)).finally(()=>c(!1)))};return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("p",{className:"text-[12px] leading-4 text-ink-secondary",children:[t("keys.vps.descBefore"),e.jsx("a",{href:"https://github.com/milind-soni/OpenMausBot/blob/main/docs/byo-vps.md",target:"_blank",rel:"noopener noreferrer",className:"text-accent-text hover:underline",children:t("keys.vps.descLink")}),t("keys.vps.descAfter")]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("input",{type:"text","data-key-input":!0,value:a,onChange:x=>i(x.target.value),onKeyDown:x=>x.key==="Enter"&&m(),placeholder:"my-vps","aria-label":t("keys.vps.aria"),autoComplete:"off",spellCheck:!1,className:O(He,"w-auto min-w-[min(100%,12rem)] flex-1")}),e.jsx("button",{type:"button",onClick:m,disabled:r||!a.trim()&&!u||a.trim()===(s.config?.vps?.sshAlias??""),className:O("ui-button shrink-0",!p&&"ui-button-primary"),title:p?t("keys.vps.removeAlias"):void 0,children:r?e.jsx(q,{size:13,className:"animate-spin","aria-hidden":"true"}):p?t("keys.row.remove"):t("common.save")})]}),o&&e.jsx("div",{role:"alert",className:"text-[12px] leading-4 text-danger",children:o})]})}function Tu(){const{state:s,dispatch:n}=G(),a=s.config?.openaiCompat?.url??"",[i,r]=l.useState(a),[c,o]=l.useState(!1),[d,u]=l.useState(null),p=l.useRef(!1);l.useEffect(()=>{r(a)},[a]);const m=i.trim()!==a,x=()=>{p.current||!m||(p.current=!0,o(!0),u(null),F("/api/config",{method:"PUT",body:JSON.stringify({openaiCompat:{url:i.trim()}})}).then(h=>n({type:"configStatus",config:h})).catch(h=>u(h.message)).finally(()=>{p.current=!1,o(!1)}))};return e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx("div",{className:"text-[13px] leading-[18px] text-ink",children:t("keys.openaiCompat.url")}),e.jsxs("div",{className:"relative",children:[e.jsx("input",{type:"url",value:i,onChange:h=>r(h.target.value),onBlur:x,onKeyDown:h=>h.key==="Enter"&&x(),placeholder:"https://api.groq.com/openai/v1","aria-label":t("keys.openaiCompat.url"),spellCheck:!1,className:O(He,"pr-8")}),c&&e.jsx(q,{size:13,"aria-hidden":"true",className:"absolute right-2.5 top-1/2 -translate-y-1/2 animate-spin text-ink-secondary"})]}),e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("keys.openaiCompat.urlHint")}),d&&e.jsx("div",{role:"alert",className:"text-[12px] leading-4 text-danger",children:d})]})}const Bu="rounded-xl bg-card in-data-[settings-look=simple]:rounded-[12px] in-data-[settings-look=simple]:border-[0.5px] in-data-[settings-look=simple]:border-(--settings-edge) in-data-[settings-look=simple]:bg-menu",Lu=1600,Ou={opencodeProviders:()=>e.jsx(Pu,{}),ollama:s=>e.jsx(Au,{visible:s}),lmStudio:()=>e.jsx(Nu,{heading:!1}),vps:()=>e.jsx(Ru,{})},zu={anthropic:()=>e.jsx(Iu,{}),openaiCompat:()=>e.jsxs(e.Fragment,{children:[e.jsx(Tu,{}),e.jsx(bu,{}),e.jsx(yu,{})]}),box:()=>e.jsx(ql,{}),liveKey:()=>e.jsx(Vl,{})};function Hi(s,n){if(s.kind==="uses")return!1;const a=Ws(s,n);return a.configured||a.included===!0}function Mu({entry:s,visible:n}){const{state:a}=G(),i=l.useId(),c=Ws(s,a.config).configured?{tone:"ok",text:t("keys.connected")}:null;return e.jsxs("div",{"data-key-row":s.id,role:"group","aria-labelledby":i,className:Za,children:[e.jsx(ei,{entry:s,status:c,titleId:i}),e.jsx("div",{className:"flex flex-col gap-2 pl-8",children:Ou[s.id]?.(n)})]})}function Fu({entry:s}){const{state:n,dispatch:a}=G(),i=l.useId(),r=s.opens,c=Ws(s,n.config),o=c.configured?{tone:"ok",text:t("keys.connected")}:null;return e.jsxs("div",{"data-key-row":s.id,role:"group","aria-labelledby":i,className:Za,children:[e.jsx(ei,{entry:s,status:o,titleId:i}),e.jsxs("div",{className:"flex flex-col gap-2 pl-8",children:[c.configured&&e.jsx("div",{className:"flex",children:e.jsx(Gl,{saved:c,label:t(s.labelKey)})}),e.jsxs("div",{className:"flex flex-wrap items-center gap-x-3 gap-y-2",children:[s.whereKey&&e.jsx("span",{className:"min-w-0 flex-1 text-[12px] leading-4 text-ink-secondary",children:t(s.whereKey)}),r&&e.jsx("button",{type:"button","data-key-open":!0,className:"ui-button shrink-0",onClick:()=>a({type:"toggleAppSettings",open:!0,section:r}),children:t("keys.row.open")})]})]})]})}function Du({entry:s,visible:n}){return s.kind==="uses"&&s.uses?e.jsx(Sn,{id:s.uses,row:s.id}):s.kind==="panel"?e.jsx(Mu,{entry:s,visible:n}):s.kind==="elsewhere"?e.jsx(Fu,{entry:s}):e.jsx(Sn,{id:s.id,children:zu[s.id]?.()})}function Uu({id:s,rows:n,open:a,onToggle:i}){const{state:r}=G(),c=ws.find(p=>p.id===s),o=l.useId(),d=l.useId(),u=n.filter(p=>Hi(p,r.config)).length;return e.jsxs("section",{"data-keys-section":s,"aria-labelledby":o,className:Bu,children:[e.jsxs("button",{type:"button","aria-expanded":a,"aria-controls":d,onClick:i,className:"flex w-full cursor-pointer items-center gap-3 rounded-[inherit] px-4 py-2.5 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-focus/60",children:[e.jsxs("span",{className:"flex min-w-0 flex-1 flex-col gap-0.5",children:[e.jsx("span",{id:o,className:"text-[14px] font-medium leading-5 text-ink",children:t(c.titleKey)}),e.jsx("span",{className:"text-[13px] leading-[18px] text-ink-secondary",children:t(c.purposeKey)})]}),u>0&&e.jsx("span",{className:"shrink-0 text-[12px] leading-4 text-ink-secondary",children:t("keys.section.connected",{count:u})}),e.jsx(Xs,{size:14,"aria-hidden":"true",className:O("shrink-0 text-ink-secondary transition-transform motion-reduce:transition-none",a&&"rotate-90")})]}),e.jsxs("div",{id:d,hidden:!a,className:"flex flex-col gap-0.5 border-t border-hairline/40 px-1 py-1.5 in-data-[settings-look=simple]:border-t-[0.5px] in-data-[settings-look=simple]:border-(--settings-edge)",children:[n.map(p=>e.jsx(Du,{entry:p,visible:a},p.id)),s==="voice"&&e.jsx(hu,{})]})]})}function _u(s,n,a){const i=n.row?s?.querySelector(`[data-key-row="${n.row}"]`):s?.querySelector(`[data-keys-section="${a}"]`);if(!i||i.closest("[hidden]"))return!1;const r=xu(i);return r&&Qs(r,i,n.row?"center":"start",16),n.row&&(i.querySelector("[data-key-input], [data-key-replace], [data-key-own], [data-key-open], input, button")?.focus({preventScroll:!0}),i.setAttribute("data-key-highlight",""),window.setTimeout(()=>i.removeAttribute("data-key-highlight"),Lu)),!0}function $u(){const{state:s}=G(),[n,a]=l.useState(""),[i,r]=l.useState(()=>new Set(ws.filter(x=>x.id==="ai"||ft.some(h=>h.section===x.id&&Hi(h,s.config))).map(x=>x.id))),c=l.useRef(null),o=Qa(),d=n.trim().toLowerCase();l.useEffect(()=>{if(!o)return;const x=ft.find(y=>y.id===o.row)?.section??"ai";a(""),r(y=>y.has(x)?y:new Set([...y,x]));let h=0,f=0;const b=()=>{_u(c.current,o,x)||++f>60?Wl(o):h=window.requestAnimationFrame(b)};return h=window.requestAnimationFrame(b),()=>window.cancelAnimationFrame(h)},[o]);const u=s.config?.live?.provider==="azure",p=ft.filter(x=>Hs(x,d)&&!(u&&x.id==="liveCalls")),m=ws.flatMap(x=>{const h=p.filter(f=>f.section===x.id);return h.length>0?[{id:x.id,rows:h}]:[]});return e.jsxs("div",{ref:c,"data-keys-page":!0,className:"flex flex-col gap-4",children:[e.jsx("p",{className:"text-[13px] leading-[18px] text-ink-secondary",children:t("settings.connections.subtitle")}),e.jsxs("div",{className:"flex h-8 items-center gap-2 rounded-lg bg-ink/[0.05] px-[9px] focus-within:ring-2 focus-within:ring-focus/60",children:[e.jsx(jt,{size:15,"aria-hidden":"true",className:"shrink-0 text-ink-secondary"}),e.jsx("input",{"data-keys-search":!0,type:"text",value:n,onChange:x=>a(x.target.value),onKeyDown:x=>{x.key!=="Escape"||!n||(x.preventDefault(),x.stopPropagation(),a(""))},placeholder:t("keys.search.placeholder"),"aria-label":t("keys.search.aria"),autoComplete:"off",spellCheck:!1,className:"w-full min-w-0 bg-transparent text-[13px] text-ink placeholder:text-ink-secondary focus:outline-none"})]}),m.length===0?e.jsx("p",{"data-keys-empty":!0,className:"px-1 text-[13px] leading-[18px] text-ink-secondary",children:t("keys.search.none",{query:n.trim()})}):m.map(({id:x,rows:h})=>e.jsx(Uu,{id:x,rows:h,open:d!==""||i.has(x),onToggle:()=>r(f=>{const b=new Set(f);return b.has(x)?b.delete(x):b.add(x),b})},x))]})}const Ku="https://github.com/milind-soni/OpenMausBot/blob/main/docs/analytics.md";function Wi({simple:s=!1}){const[n,a]=l.useState(il),i=e.jsxs(e.Fragment,{children:[t(s?"settings.simple.analytics":"settings.analytics.subtitle")," ",e.jsx("a",{href:Ku,target:"_blank",rel:"noopener noreferrer",className:"text-accent hover:underline",children:t(s?"settings.simple.analyticsLink":"settings.analytics.link")})]});return e.jsx(ge,{title:t("settings.analytics.title"),subtitle:i,children:e.jsx(fe,{checked:n,"aria-label":t("settings.analytics.aria"),onClick:()=>{const r=!n;rl(r),a(r)}})})}function Gi({simple:s=!1}){const n=window.ogb?.openAtLogin,[a,i]=l.useState(null),[r,c]=l.useState(!1),[o,d]=l.useState(!1);if(l.useEffect(()=>{let p=!0;return n?.state().then(m=>{p&&i(m)}).catch(()=>{}),()=>{p=!1}},[n]),!n||!a?.available)return null;const u=p=>{c(!0),d(!1),n.set(p).then(i,()=>d(!0)).finally(()=>c(!1))};return e.jsx(ge,{title:t("settings.openAtLogin.title"),subtitle:t(s?"settings.simple.openAtLogin":"settings.openAtLogin.subtitle"),message:o?e.jsx("span",{role:"alert",className:"text-danger",children:t("settings.openAtLogin.failed")}):void 0,children:e.jsx(fe,{checked:a.on,disabled:r,"aria-label":t("settings.openAtLogin.title"),onClick:()=>u(!a.on)})})}function Hu(s=typeof window>"u"?void 0:window.ogb){return s?.platform==="darwin"&&s.talkShortcut?["talk","voice","shortcut","hotkey","hold to talk","push to talk","quick asks"]:[]}function Vi(){const s=window.ogb?.talkShortcut,[n,a]=l.useState(null),[i,r]=l.useState(!1),[c,o]=l.useState(!1);if(l.useEffect(()=>{let x=!0;return s?.state().then(h=>{x&&a(h)}).catch(()=>{}),()=>{x=!1}},[s]),!s||!n?.available)return null;const d=n.keys.find(x=>x.id===n.key)?.label??"",u=x=>{r(!0),o(!1),s.set(x).then(a,()=>o(!0)).finally(()=>r(!1))},p=c?t("settings.talk.failed"):n.enabled&&n.taken?t("settings.talk.taken",{key:d}):null,m=e.jsxs(e.Fragment,{children:[n.enabled&&e.jsx(ye,{size:"sm",className:"w-full max-w-[240px]",value:n.key,disabled:i,"aria-label":t("settings.talk.keyAria"),onChange:x=>u({key:x.target.value}),children:n.keys.map(x=>e.jsx("option",{value:x.id,children:x.label},x.id))}),p&&e.jsx("div",{role:"alert",className:n.enabled?"mt-2 text-danger":"text-danger",children:p})]});return e.jsx(ge,{title:t("settings.talk.title"),subtitle:t("settings.talk.subtitle",{key:d}),message:n.enabled||p?m:null,children:e.jsx(fe,{checked:n.enabled,disabled:i,"aria-label":t("settings.talk.aria"),onClick:()=>u({enabled:!n.enabled})})})}const cs=s=>s===0||s>=1024*1024?`${Math.round(s/(1024*1024))} MB`:`${Math.ceil(s/1024)} KB`;function qi(){const[s,n]=l.useState(null),[a,i]=l.useState(!1),[r,c]=l.useState(!1),[o,d]=l.useState(null);if(l.useEffect(()=>{let p=!0;return F("/api/attachment-storage").then(m=>{p&&n(m)}).catch(()=>{}),()=>{p=!1}},[]),!s)return null;const u=async()=>{c(!0),d(null);try{const p=await F("/api/attachment-storage",{method:"POST"});n(p);const m=t("settings.attachments.cleared",{count:p.removed,freed:cs(p.freedBytes)});d(p.failed>0?{kind:"error",message:`${m} ${t("settings.attachments.failed",{count:p.failed})}`}:{kind:"success",message:m})}catch(p){d({kind:"error",message:p instanceof Error?p.message:String(p)})}finally{c(!1),i(!1)}};return e.jsx(ge,{title:t("settings.attachments.title"),subtitle:e.jsxs(e.Fragment,{children:[e.jsx("span",{"data-attachments-used":!0,className:"block",children:t("settings.attachments.used",{used:cs(s.usedBytes),max:cs(s.maxBytes)})}),e.jsx("span",{className:"block",children:t(a?"settings.attachments.confirmText":"settings.attachments.help")})]}),message:o&&e.jsx("p",{role:o.kind==="error"?"alert":"status",className:O(o.kind==="error"?"text-danger":"text-success"),children:o.message}),children:e.jsx("div",{className:"flex flex-wrap gap-2",children:a?e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",onClick:()=>i(!1),disabled:r,className:"ui-button",children:t("settings.attachments.cancel")}),e.jsx("button",{type:"button",onClick:()=>{u()},disabled:r,className:"ui-button text-danger",children:r?t("settings.attachments.clearing"):t("settings.attachments.confirm")})]}):e.jsx("button",{type:"button",onClick:()=>{d(null),i(!0)},className:"ui-button",children:t("settings.attachments.clear")})})})}function Ji({simple:s=!1}){const[n,a]=l.useState(!1),[i,r]=l.useState(null),[c,o]=l.useState(null),d=async()=>{if(!(!window.ogb?.exportDiagnostics||n)){a(!0),r(null);try{const m=await window.ogb.exportDiagnostics();m&&r({kind:"success",message:t("settings.diagnostics.saved",{path:m})})}catch(m){r({kind:"error",message:m instanceof Error?m.message:String(m)})}finally{a(!1)}}},u=async()=>{if(window.ogb?.openLogsFolder){r(null);try{const m=await window.ogb.openLogsFolder();o(m.folder),m.opened||r({kind:"error",message:t("settings.diagnostics.openFailed",{folder:m.folder})})}catch(m){r({kind:"error",message:m instanceof Error?m.message:String(m)})}}},p=!!window.ogb?.exportDiagnostics;return e.jsx(ge,{title:t("settings.diagnostics.title"),subtitle:t(s?"settings.simple.diagnostics":"settings.diagnostics.subtitle"),message:e.jsxs(e.Fragment,{children:[c&&i?.kind!=="error"&&e.jsx("p",{role:"status","data-logs-folder":!0,className:"break-all text-ink-secondary",children:t("settings.diagnostics.logsAt",{folder:c})}),i&&e.jsx("p",{role:i.kind==="error"?"alert":"status",className:O("break-all",i.kind==="error"?"text-danger":"text-success"),children:i.message}),e.jsx("p",{"data-logs-help":!0,className:"text-ink-tertiary",children:t(p?"settings.diagnostics.logsHelp":"settings.diagnostics.elsewhere")})]}),children:p&&e.jsxs("div",{className:"flex flex-wrap gap-2",children:[window.ogb?.openLogsFolder&&e.jsx("button",{type:"button",onClick:()=>{u()},className:"ui-button",children:t("settings.diagnostics.openLogs")}),e.jsx("button",{onClick:()=>{d()},disabled:n,"aria-label":t("settings.diagnostics.aria"),className:"ui-button",children:n?t("settings.diagnostics.exporting"):t("settings.diagnostics.export")})]})})}const Wu="https://dash.cloudflare.com/profile/api-tokens",Gu=/^[0-9a-f]{32}$/i,Un="w-full rounded-lg border border-hairline/40 bg-inset px-3 py-2 text-[13px] text-ink placeholder:text-ink-secondary focus:outline-none";function Vu({failureText:s}){const{state:n,dispatch:a}=G(),i=n.config?.helpers,r=i?.own.workersAi===!0,c=i?.workersAiAccountId??"",[o,d]=l.useState(null),[u,p]=l.useState(""),[m,x]=l.useState(!1),[h,f]=l.useState(!1),[b,y]=l.useState(null),[g,v]=l.useState(null),C=(o??c).trim(),w=u.trim(),N=!w&&r&&o===null,I=o!==null&&C!==c,j=P=>a({type:"configStatus",config:P}),L=async()=>{if(!(m||!w&&!r&&!I)){if(w&&!Gu.test(C))return y(t("decider.workersAi.needsAccount"));x(!0),y(null),v(null);try{(I||w&&!c)&&j(await F("/api/config",{method:"PUT",body:JSON.stringify({decider:{workersAiAccountId:C}})})),(w||N)&&j(window.ogb?.setCredential?await window.ogb.setCredential("workersAiToken",w):await F("/api/config",{method:"PUT",body:JSON.stringify({decider:{workersAiToken:w}})})),p(""),d(null)}catch(P){y(P instanceof Error?P.message:String(P))}finally{x(!1)}}},k=async()=>{if(!(h||m||!w&&!r)){f(!0),v(null),y(null);try{const P=await F("/api/decider/test",{method:"POST",body:JSON.stringify({provider:"workersai",...w?{key:w,accountId:C}:{}})}),S=P.extraction?[t(P.extraction.ok?"decider.test.extractionOk":"decider.test.extractionFailed")]:[];v(P.ok?{ok:P.extraction?.ok!==!1,text:[t("decider.workersAi.test.ok",{ms:String(P.latencyMs)}),...S].join(" ")}:{ok:!1,text:s(P)})}catch(P){v({ok:!1,text:P instanceof Error?P.message:String(P)})}finally{f(!1)}}};return e.jsxs(X,{title:t("decider.workersAi.title"),children:[e.jsx("p",{className:"mb-2 text-[12px] leading-relaxed text-ink-secondary",children:t("decider.workersAi.detail")}),r&&e.jsxs("div",{role:"status",className:"mb-2 flex items-center gap-2 text-[13px] text-success",children:[e.jsx("span",{className:"size-1.5 rounded-full bg-success"}),e.jsx("span",{children:t("decider.status.connected")})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("input",{type:"text","data-testid":"workers-ai-account",value:o??c,onChange:P=>{v(null),y(null),d(P.target.value)},disabled:m,placeholder:t("decider.workersAi.accountIdPlaceholder"),"aria-label":t("decider.workersAi.accountId"),autoComplete:"off",spellCheck:!1,className:Un}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{type:"password","data-testid":"workers-ai-token",value:u,onChange:P=>{v(null),y(null),p(P.target.value)},onKeyDown:P=>P.key==="Enter"&&void L(),disabled:m,placeholder:r?t("keys.replace"):t("decider.workersAi.tokenPlaceholder"),"aria-label":t("decider.workersAi.token"),autoComplete:"off",spellCheck:!1,className:Un}),e.jsx("button",{type:"button","data-testid":"workers-ai-save",onClick:()=>{L()},disabled:m||!w&&!r&&!I,title:N?t("keys.removeKey"):t("common.save"),className:O("flex w-[72px] shrink-0 cursor-pointer items-center justify-center gap-1.5 rounded-lg bg-control py-2 text-[13px] hover:bg-raised-hover disabled:cursor-not-allowed disabled:opacity-50",N?"text-danger":"text-ink"),children:m?e.jsx(q,{size:13,className:"animate-spin"}):N?t("keys.clear"):e.jsxs(e.Fragment,{children:[e.jsx(ve,{size:13}),t("common.save")]})}),e.jsx("button",{type:"button","data-testid":"workers-ai-test",onClick:()=>{k()},disabled:h||m||!w&&!r,className:"flex shrink-0 cursor-pointer items-center justify-center rounded-lg border border-hairline/40 px-3 py-2 text-[13px] text-ink-secondary hover:bg-raised/50 hover:text-ink disabled:cursor-not-allowed disabled:opacity-50",children:h?t("keys.testing"):t("keys.test")})]})]}),b&&e.jsx("p",{role:"alert",className:"mt-1 text-[12px] text-danger",children:b}),g&&e.jsx("p",{role:"status",className:O("mt-1 text-[12px]",g.ok?"text-success":"text-danger"),children:g.text}),e.jsxs("a",{href:Wu,target:"_blank",rel:"noopener noreferrer",className:"mt-2 inline-flex cursor-pointer items-center gap-1 text-[12px] text-accent hover:underline",children:[t("decider.workersAi.getKey"),e.jsx(Nt,{size:11,"aria-hidden":"true"})]})]})}const qu={jev:"https://typesafe.ai",openrouter:"https://openrouter.ai/keys"},Ju=1500,Zs={rejected:"decider.error.rejected",unreachable:"decider.error.unreachable",timeout:"decider.error.timeout",rate_limited:"decider.error.rateLimited",overloaded:"decider.error.overloaded",malformed:"decider.error.malformed",no_key:"decider.error.noKey",misconfigured:"decider.error.misconfigured"},_n={rejected:"decider.included.error.rejected",rate_limited:"decider.included.error.limited"},Yu={...Zs,rejected:"decider.openrouter.error.rejected",unreachable:"decider.openrouter.error.unreachable",timeout:"decider.openrouter.error.timeout",rate_limited:"decider.openrouter.error.rateLimited",overloaded:"decider.openrouter.error.overloaded",malformed:"decider.openrouter.error.malformed"},Xu={...Zs,rejected:"decider.workersAi.error.rejected",unreachable:"decider.workersAi.error.unreachable",timeout:"decider.workersAi.error.timeout",rate_limited:"decider.workersAi.error.rateLimited",overloaded:"decider.workersAi.error.overloaded",malformed:"decider.workersAi.error.malformed"},ds={jev:"decider.status.byJev",workersai:"decider.status.byWorkersAi",openrouter:"decider.status.byOpenRouter"};function Qu(s){const n=s?.decider,a=s?.helpers?.extraction,i=n?.configured?n.included?t("decider.status.byCloud"):t(ds[n.provider]??ds.jev):t("decider.status.notSetUp"),r=a?.provider?a.included?t("decider.status.byCloud"):t(ds[a.provider]):t("decider.status.notSetUp");return t("decider.status.line",{decisions:i,extraction:r})}function $n(s,n=!1,a="jev"){if(a==="workersai"){if(s.reason==="http_error")return t("decider.workersAi.error.http",{status:String(s.status??"?")});const r=Xu[s.reason];return r?t(r):t("decider.error.other")}if(a==="openrouter"){if(s.reason==="http_error"&&s.status===402)return t("decider.openrouter.error.credits");if(s.reason==="http_error")return t("decider.openrouter.error.http",{status:String(s.status??"?")});const r=Yu[s.reason];return r?t(r):t("decider.error.other")}if(n&&s.reason==="http_error"&&s.status===402)return t("decider.included.error.subscription");if(n&&_n[s.reason])return t(_n[s.reason]);if(s.reason==="http_error")return t("decider.error.http",{status:String(s.status??"?")});const i=Zs[s.reason];return i?t(i):t("decider.error.other")}const Zu=["decider.jobs.browserClicks","decider.jobs.toolSelection","decider.jobs.placement"];function ep(){const{state:s,dispatch:n}=G(),a=s.config?.decider,i=a?.provider==="openrouter"?"openrouter":"jev",r=i==="openrouter",c=a?.configured??!1,o=c&&a?.included===!0,d=r&&c&&a?.keySource==="shared",u=r&&a?.sharedKey===!0,p=c&&!o&&!d,m=a?.enabled??!1,x=a?.jobs.roomRouting??!0,[h,f]=l.useState(""),[b,y]=l.useState(!1),[g,v]=l.useState(!1),[C,w]=l.useState(!1),[N,I]=l.useState(null),[j,L]=l.useState(null),[k,P]=l.useState(null),S=h.trim(),M=!S&&p,se=!r||o?null:d?"decider.openrouter.status.sharedHint":c?u?"decider.openrouter.status.ownFallbackHint":null:"decider.openrouter.status.notConnectedHint",ne=T=>n({type:"configStatus",config:T}),V=async T=>{if(!g){v(!0),I(null);try{ne(await F("/api/config",{method:"PUT",body:JSON.stringify({decider:T})}))}catch(R){I(R instanceof Error?R.message:String(R))}finally{v(!1)}}};l.useEffect(()=>{if(!r||k)return;let T=!1;return F("/api/decider/models").then(R=>{T||P(R)},()=>{}),()=>{T=!0}},[r,k]);const ie=T=>{f(""),L(null),V(T)},re=async()=>{if(!(b||!S&&!p)){y(!0),I(null),L(null);try{const T=window.ogb?.setCredential?await window.ogb.setCredential(r?"openrouterDeciderKey":"jevApiKey",S):await F("/api/config",{method:"PUT",body:JSON.stringify({decider:{[r?"openrouterKey":"key"]:S}})});ne(T),f("")}catch(T){I(T instanceof Error?T.message:String(T))}finally{y(!1)}}},oe=async()=>{if(C||b||!S&&!c)return;w(!0),L(null),I(null);const T=!S&&o,R=!S&&d;try{const E=await F("/api/decider/test",{method:"POST",body:JSON.stringify(S?{key:S}:{})});L(E.ok?{ok:!0,text:r?[t(R?"decider.openrouter.test.okShared":"decider.openrouter.test.ok",{ms:String(E.latencyMs)}),...E.latencyMs>Ju?[t("decider.test.slow")]:[]].join(" "):t("decider.test.ok",{ms:String(E.latencyMs)})}:{ok:!1,text:$n(E,T,i)})}catch(E){L({ok:!1,text:E instanceof Error?E.message:String(E)})}finally{w(!1)}};return e.jsxs(e.Fragment,{children:[e.jsxs("section",{className:"space-y-2 px-4",children:[e.jsx("p",{className:"text-[13px] leading-relaxed text-ink-secondary",children:t("decider.intro")}),e.jsx("p",{role:"status","data-testid":"helpers-status",className:"text-[13px] font-medium text-ink",children:Qu(s.config)})]}),e.jsx(Vu,{failureText:T=>$n(T,!1,"workersai")}),e.jsx(ge,{title:t("decider.provider.label"),children:e.jsxs(ye,{className:"w-48","data-testid":"decider-provider",value:i,onChange:T=>ie({provider:T.target.value==="openrouter"?"openrouter":"jev"}),disabled:g||!s.config,"aria-label":t("decider.provider.label"),children:[e.jsx("option",{value:"jev",children:t("decider.provider.jev")}),e.jsx("option",{value:"openrouter",children:t("decider.provider.openrouter")})]})}),r&&e.jsx(ge,{title:t("decider.model.label"),subtitle:k?.source==="builtin"?t("decider.model.builtinNote"):void 0,children:e.jsxs(ye,{className:"w-64 max-w-full","data-testid":"decider-model",value:a?.model??"",onChange:T=>ie({openrouterModel:T.target.value,openrouterApi:k?.models.find(R=>R.id===T.target.value)?.api??"chat"}),disabled:g,"aria-label":t("decider.model.label"),children:[a?.model&&!k?.models.some(T=>T.id===a.model)&&e.jsx("option",{value:a.model,children:a.model}),["recommended","more"].map(T=>{const R=k?.models.filter(E=>E.group===T)??[];return R.length>0&&e.jsx("optgroup",{label:t(T==="recommended"?"decider.model.recommended":"decider.model.more"),children:R.map(E=>e.jsx("option",{value:E.id,children:E.name},E.id))},T)})]})}),e.jsx(ge,{title:t(r?"decider.openrouter.master":"decider.master"),subtitle:c?void 0:t(r?"decider.masterNeedsKey.openrouter":"decider.masterNeedsKey"),children:e.jsx(fe,{"data-testid":"decider-master","aria-label":t(r?"decider.openrouter.master":"decider.master"),checked:m,disabled:!c||g||!s.config,onClick:()=>{V({enabled:!m})},className:"cursor-pointer"})}),e.jsxs(X,{title:t(r?"decider.openrouter.key.label":"decider.key.label"),children:[e.jsxs("div",{role:"status",className:"mb-2 flex items-center gap-2 text-[13px] text-ink-secondary",children:[e.jsx("span",{className:O("size-1.5 rounded-full",c?"bg-success":"bg-raised-hover")}),e.jsx("span",{className:c?"text-success":void 0,children:o?t("keys.includedWithCloudPro"):d?t("decider.openrouter.status.shared"):c?t(u?"decider.openrouter.status.own":"decider.status.connected"):t("decider.status.notConnected")})]}),se&&e.jsxs("p",{className:"mb-2 text-[12px] leading-relaxed text-ink-secondary",children:[t(se),!p&&e.jsxs(e.Fragment,{children:[" ",e.jsx("button",{type:"button","data-testid":"decider-manage-keys",onClick:()=>n(Ss("openrouter")),className:"cursor-pointer text-accent hover:underline",children:t("decider.openrouter.key.manageLink")})]})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{type:"password",value:h,onChange:T=>{L(null),I(null),f(T.target.value)},onKeyDown:T=>T.key==="Enter"&&void re(),disabled:b,placeholder:p?t("keys.replace"):t(d?"decider.openrouter.key.overridePlaceholder":r?"decider.openrouter.key.placeholder":"decider.key.placeholder"),"aria-label":t(r?"decider.openrouter.key.label":"decider.key.label"),autoComplete:"off",spellCheck:!1,className:"w-full rounded-lg border border-hairline/40 bg-inset px-3 py-2 text-[13px] text-ink placeholder:text-ink-secondary focus:outline-none"}),e.jsx("button",{type:"button","data-testid":"decider-save",onClick:()=>{re()},disabled:b||!S&&!p,title:M?t("keys.removeKey"):t("common.save"),className:O("flex w-[72px] shrink-0 cursor-pointer items-center justify-center gap-1.5 rounded-lg bg-control py-2 text-[13px] hover:bg-raised-hover disabled:cursor-not-allowed disabled:opacity-50",M?"text-danger":"text-ink"),children:b?e.jsx(q,{size:13,className:"animate-spin"}):M?t("keys.clear"):e.jsxs(e.Fragment,{children:[e.jsx(ve,{size:13}),t("common.save")]})}),e.jsx("button",{type:"button","data-testid":"decider-test",onClick:()=>{oe()},disabled:C||b||!S&&!c,className:"flex shrink-0 cursor-pointer items-center justify-center rounded-lg border border-hairline/40 px-3 py-2 text-[13px] text-ink-secondary hover:bg-raised/50 hover:text-ink disabled:cursor-not-allowed disabled:opacity-50",children:C?t("keys.testing"):t("keys.test")})]}),N&&e.jsx("p",{role:"alert",className:"mt-1 text-[12px] text-danger",children:N}),j&&e.jsx("p",{role:"status",className:O("mt-1 text-[12px]",j.ok?"text-success":"text-danger"),children:j.text}),!d&&e.jsxs("a",{href:qu[i],target:"_blank",rel:"noopener noreferrer",className:"mt-2 inline-flex cursor-pointer items-center gap-1 text-[12px] text-accent hover:underline",children:[t(r?"decider.openrouter.key.getKey":"decider.key.getKey"),e.jsx(Nt,{size:11,"aria-hidden":"true"})]})]}),e.jsx(X,{title:t("decider.jobs.title"),children:e.jsxs("ul",{className:"flex flex-col",children:[e.jsxs("li",{className:"flex items-start justify-between gap-4 py-2",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[13px] font-medium text-ink",children:t("decider.jobs.roomRouting")}),e.jsx("div",{className:"mt-0.5 text-[12px] leading-relaxed text-ink-secondary",children:t("decider.jobs.roomRoutingDetail")})]}),e.jsx(fe,{"data-testid":"decider-job-roomRouting","aria-label":t("decider.jobs.roomRouting"),checked:m&&x,disabled:!m||g,onClick:()=>{V({jobs:{roomRouting:!x}})},className:"cursor-pointer"})]}),Zu.map(T=>e.jsxs("li",{"data-testid":"decider-coming-soon","aria-disabled":"true",className:"flex items-center justify-between gap-4 border-t border-hairline/40 py-2 opacity-50",children:[e.jsx("span",{className:"text-[13px] text-ink-secondary",children:t(T)}),e.jsx("span",{className:"rounded bg-control px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-ink-secondary",children:t("decider.jobs.comingSoon")})]},T))]})})]})}const tp=["openai","xai","gemini","openrouter","custom"],sp=4,Yi={openai:"gpt-image-2",xai:"grok-imagine-image-2.0",gemini:"gemini-2.5-flash-image",openrouter:"google/gemini-2.5-flash-image",custom:""},np={openai:[{id:"gpt-image-2",name:"GPT Image 2"},{id:"gpt-image-1",name:"GPT Image 1"},{id:"gpt-image-1-mini",name:"GPT Image 1 Mini"}],xai:[{id:"grok-imagine-image-2.0",name:"Grok Imagine Image 2.0"}],gemini:[{id:"gemini-2.5-flash-image",name:"Nano Banana (Gemini 2.5 Flash Image)"}],openrouter:[{id:"google/gemini-2.5-flash-image",name:"Google: Nano Banana (Gemini 2.5 Flash Image)"},{id:"google/gemini-3.1-flash-image",name:"Google: Nano Banana 2 (Gemini 3.1 Flash Image)"},{id:"google/gemini-3-pro-image",name:"Google: Nano Banana Pro (Gemini 3 Pro Image)"},{id:"openai/gpt-image-2",name:"OpenAI: GPT Image 2"},{id:"black-forest-labs/flux-3-image",name:"Black Forest Labs: FLUX 3 Image"},{id:"bytedance-seed/seedream-5-0-pro",name:"ByteDance Seed: Seedream 5.0 Pro"},{id:"x-ai/grok-imagine-image-2.0",name:"xAI: Grok Imagine Image 2.0"},{id:"qwen/qwen-image-3",name:"Qwen: Qwen Image 3"}],custom:[]};function ap(s){const n="Use an HTTPS API base URL, or HTTP for a local router, without passwords, query parameters or fragments";let a;try{a=new URL(s.trim())}catch{throw new Error(n)}if(s.length>2048||a.username||a.password||a.search||a.hash)throw new Error(n);const i=a.hostname.toLowerCase(),r=/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/.exec(i),c=i==="localhost"||i.endsWith(".localhost")||i.endsWith(".local")||i==="host.docker.internal"||i==="host.containers.internal"||i==="[::1]"||/^\[f[cd][0-9a-f]{2}:/.test(i)||r&&(Number(r[1])===127||Number(r[1])===10||Number(r[1])===192&&Number(r[2])===168||Number(r[1])===172&&Number(r[2])>=16&&Number(r[2])<=31);if(a.protocol!=="https:"&&!(a.protocol==="http:"&&c))throw new Error(n);if(r&&(Number(r[1])===0||Number(r[1])===169&&Number(r[2])===254))throw new Error(n);return a.pathname=a.pathname.replace(/\/+$/,"").replace(/\/images\/generations$/,""),a.toString().replace(/\/+$/,"")}const _t={openai:"OpenAI",xai:"Grok (xAI)",gemini:"Gemini",openrouter:"OpenRouter",custom:"Custom"},ip={openai:{credential:"openaiImageApiKey",patch:s=>({imageGen:{key:s}}),label:"imageGen.key.openai"},gemini:{credential:"geminiImageApiKey",patch:s=>({imageGen:{geminiKey:s}}),label:"imageGen.key.gemini"},custom:{credential:"customImageApiKey",patch:s=>({imageGen:{customApiKey:s}}),label:"imageGen.key.custom"}},rp={xai:{label:"imageGen.key.xai",note:"imageGen.key.sharedXai"},openrouter:{label:"imageGen.key.openrouter",note:"imageGen.key.sharedOpenrouter"}},Kn={openai:"https://platform.openai.com/api-keys",gemini:"https://aistudio.google.com/apikey",xai:"https://console.x.ai",openrouter:"https://openrouter.ai/keys"},Is="w-full min-w-0 rounded-lg border border-hairline/40 bg-inset px-3 py-2 text-[13px] text-ink placeholder:text-ink-secondary focus:outline-none disabled:opacity-50",Hn="flex shrink-0 cursor-pointer items-center justify-center gap-1.5 rounded-lg bg-control px-3 py-2 text-[13px] text-ink hover:bg-raised-hover disabled:cursor-not-allowed disabled:opacity-50",us="\0other";function lp(s,n){return n.ok?n.freeTier?{ok:!1,text:t("imageGen.test.noCredit")}:{ok:!0,text:t(s==="openrouter"?"imageGen.test.okOpenrouter":"imageGen.test.ok")}:n.reason==="model_missing"?{ok:!1,text:t("imageGen.test.modelMissing",{model:n.model})}:n.reason==="rejected"?{ok:!1,text:t("imageGen.test.rejected")}:n.reason==="unreachable"?{ok:!1,text:t("imageGen.test.unreachable")}:n.reason==="no_key"?{ok:!1,text:t("imageGen.key.missing")}:n.reason==="no_url"?{ok:!1,text:t("imageGen.test.noUrl")}:{ok:!1,text:t("imageGen.test.unexpected")}}function op(s,n){return n==="openai"?s?.openaiConfigured===!0:n==="xai"?s?.xaiConfigured===!0:n==="gemini"?s?.geminiConfigured===!0:n==="openrouter"?s?.openrouterConfigured===!0:s?.customKeyConfigured===!0}function cp(){const{state:s,dispatch:n}=G(),a=s.config?.imageGen,i=a?.primary??{provider:a?.provider??"openai",model:a?.model??Yi.openai,configured:a?.configured===!0},r=a?.fallback??null,[c,o]=l.useState(!1),[d,u]=l.useState(null),[p,m]=l.useState(null),x=i.provider==="openrouter"||r?.provider==="openrouter";l.useEffect(()=>{if(!x||p)return;let y=!1;return F("/api/images/openrouter-models").then(g=>{y||m(Array.isArray(g?.models)?g:{source:"builtin",models:[]})},()=>{y||m({source:"builtin",models:[]})}),()=>{y=!0}},[x,p]);const h=async y=>{o(!0),u(null);try{const g=await F("/api/config",{method:"PUT",body:JSON.stringify(y)});n({type:"configStatus",config:g})}catch(g){u(g instanceof Error?g.message:String(g))}finally{o(!1)}},f=(y,g)=>{if(y==="fallback"&&g==="")return void h({imageGen:{fallback:null}});const v=g,C=y==="primary"&&r?.provider===v;h({imageGen:{[y]:{provider:v},...C?{fallback:null}:{}}})},b=[i.provider,...r?[r.provider]:[]].filter((y,g,v)=>v.indexOf(y)===g);return e.jsxs(e.Fragment,{children:[e.jsxs("section",{className:"space-y-2 px-4",children:[e.jsx("p",{className:"text-[13px] leading-relaxed text-ink-secondary",children:t("imageGen.intro")}),e.jsxs("p",{role:"status","data-testid":"image-gen-status",className:"flex items-center gap-2 text-[13px] font-medium text-ink",children:[e.jsx("span",{className:O("size-1.5 shrink-0 rounded-full",a?.ready?i.configured?"bg-success":"bg-warning":"bg-raised-hover")}),a?.ready?i.configured?t("imageGen.status.ready",{provider:_t[i.provider]}):t("imageGen.status.backupOnly",{provider:_t[r.provider]}):t("imageGen.status.notReady")]})]}),e.jsx(Wn,{slot:"primary",provider:i.provider,model:i.model,configured:i.configured,openrouterModels:p,disabled:c||!s.config,onProvider:f,onModel:y=>{h({imageGen:{primary:{provider:i.provider,model:y}}})}}),e.jsx(Wn,{slot:"fallback",provider:r?.provider??null,model:r?.model??"",configured:r?.configured===!0,exclude:i.provider,openrouterModels:p,disabled:c||!s.config,onProvider:f,onModel:y=>r&&void h({imageGen:{fallback:{provider:r.provider,model:y}}})}),e.jsx(ge,{title:t("imageGen.maxPerTurn.label"),subtitle:t("imageGen.maxPerTurn.help"),children:e.jsx(ye,{className:"w-20","data-testid":"image-gen-max",value:String(a?.maxPerTurn??sp),onChange:y=>{h({imageGen:{maxPerTurn:Number(y.target.value)}})},disabled:c||!s.config,"aria-label":t("imageGen.maxPerTurn.label"),children:Array.from({length:10},(y,g)=>g+1).map(y=>e.jsx("option",{value:y,children:y},y))})}),d&&e.jsx("p",{role:"alert",className:"px-4 text-[12px] text-danger",children:d}),b.map(y=>e.jsx(up,{provider:y,status:a},y))]})}function Wn({slot:s,provider:n,model:a,configured:i,exclude:r,openrouterModels:c,disabled:o,onProvider:d,onModel:u}){const p=t(s==="primary"?"imageGen.primary.label":"imageGen.fallback.label");return e.jsxs(e.Fragment,{children:[e.jsx(ge,{title:p,subtitle:n&&!i?t(n==="custom"?"imageGen.slot.needsConnection":"imageGen.slot.needsKey"):t(s==="primary"?"imageGen.primary.help":"imageGen.fallback.help"),children:e.jsxs(ye,{className:"w-48","data-testid":`image-gen-${s}`,value:n??"",onChange:m=>d(s,m.target.value),disabled:o,"aria-label":p,children:[s==="fallback"&&e.jsx("option",{value:"",children:t("imageGen.fallback.none")}),tp.filter(m=>m!==r).map(m=>e.jsx("option",{value:m,children:_t[m]},m))]})}),n&&e.jsx(dp,{slot:s,slotLabel:p,provider:n,model:a,openrouterModels:c,disabled:o,onModel:u})]})}function dp({slot:s,slotLabel:n,provider:a,model:i,openrouterModels:r,disabled:c,onModel:o}){const[d,u]=l.useState(null),m=(a==="openrouter"&&r?.source==="openrouter"?r.models:null)??np[a].map(b=>({...b,group:"recommended"})),x=d!==null||m.length===0,h=()=>{d!==null&&(u(null),d.trim()&&d.trim()!==i&&o(d.trim()))},f=b=>{if(b===us)return u(i);u(null),o(b)};return e.jsx(ge,{title:t("decider.model.label"),subtitle:a==="openrouter"&&r?.source==="builtin"?t("decider.model.builtinNote"):void 0,children:e.jsxs("div",{className:"flex flex-wrap items-center justify-end gap-2",children:[m.length>0&&e.jsxs(ye,{className:"w-64 max-w-full","data-testid":`image-gen-${s}-model`,value:x?us:i,onChange:b=>f(b.target.value),disabled:c,"aria-label":t("imageGen.model.label",{slot:n}),children:[i&&!m.some(b=>b.id===i)&&e.jsx("option",{value:i,children:i}),["recommended","more"].map(b=>{const y=m.filter(g=>g.group===b);return y.length>0&&e.jsx("optgroup",{label:t(b==="recommended"?"decider.model.recommended":"decider.model.more"),children:y.map(g=>e.jsx("option",{value:g.id,children:g.name},g.id))},b)}),e.jsx("option",{value:us,children:t("imageGen.model.other")})]}),x&&e.jsx("input",{value:d??i,onChange:b=>u(b.target.value),onBlur:h,onKeyDown:b=>b.key==="Enter"&&h(),disabled:c,placeholder:Yi[a]||t("imageGen.model.placeholder"),"aria-label":t("imageGen.model.idLabel",{slot:n}),autoComplete:"off",spellCheck:!1,className:O(Is,"w-64 max-w-full")})]})})}function up({provider:s,status:n}){const{dispatch:a}=G(),[i,r]=l.useState(""),[c,o]=l.useState(null),[d,u]=l.useState(!1),[p,m]=l.useState(null),[x,h]=l.useState(!1),[f,b]=l.useState(null),y=s==="openrouter"?[n?.primary,n?.fallback].filter(S=>S?.provider===s).map(S=>S?.model).join(" "):"",g=f?.models===y?f:null,v=S=>b(S&&{...S,models:y}),C=op(n,s),w=s==="openai"||s==="gemini"||s==="custom"?ip[s]:null,N=s==="xai"||s==="openrouter"?rp[s]:null,I=c??n?.customUrl??"",j=async S=>{u(!0),m(null),v(null);try{a({type:"configStatus",config:await S()}),r(""),o(null)}catch(M){m(M instanceof Error?M.message:String(M))}finally{u(!1)}},L=S=>j(async()=>s==="xai"||s==="openrouter"?Jl(s,S,!1):window.ogb?.setCredential&&w?window.ogb.setCredential(w.credential,S):F("/api/config",{method:"PUT",body:JSON.stringify(w.patch(S))})),k=()=>j(async()=>{const S=I.trim()?ap(I.trim()):"";return F("/api/config",{method:"PUT",body:JSON.stringify({imageGen:{customUrl:S}})})}),P=async()=>{h(!0),v(null);try{v(lp(s,await F("/api/images/test",{method:"POST",body:JSON.stringify({provider:s})})))}catch(S){v({ok:!1,text:S instanceof Error?S.message:String(S)})}finally{h(!1)}};return e.jsxs(X,{title:_t[s],children:[e.jsx(pp,{configured:C,optional:s==="custom"}),N&&e.jsxs("p",{className:"mb-2 text-[12px] leading-relaxed text-ink-secondary",children:[t(N.note)," ",e.jsx("button",{type:"button",onClick:()=>a({type:"toggleAppSettings",open:!0,section:"connections"}),className:"cursor-pointer text-accent hover:underline",children:t("imageGen.key.manage")})]}),s==="custom"&&e.jsxs("div",{className:"mb-2 flex gap-2",children:[e.jsx("input",{type:"url",value:I,onChange:S=>o(S.target.value),onKeyDown:S=>S.key==="Enter"&&void k(),disabled:d,placeholder:"http://127.0.0.1:4000/v1","aria-label":t("imageGen.custom.url"),autoComplete:"off",className:Is}),e.jsxs("button",{type:"button",onClick:()=>{k()},disabled:d||c===null,className:Hn,children:[d?e.jsx(q,{size:13,className:"animate-spin"}):e.jsx(ve,{size:13}),t("common.save")]})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{type:"password",value:i,onChange:S=>r(S.target.value),onKeyDown:S=>S.key==="Enter"&&i.trim()&&void L(i.trim()),disabled:d,placeholder:C?t("keys.replace"):t("imageGen.key.paste"),"aria-label":t((w??N).label),autoComplete:"off",spellCheck:!1,className:Is}),e.jsxs("button",{type:"button",onClick:()=>{L(i.trim())},disabled:d||!i.trim(),className:Hn,children:[d?e.jsx(q,{size:13,className:"animate-spin"}):e.jsx(ve,{size:13}),t("common.save")]}),C&&e.jsx("button",{type:"button",onClick:()=>{P()},disabled:x||d,className:"flex shrink-0 cursor-pointer items-center justify-center rounded-lg border border-hairline/40 px-3 py-2 text-[13px] text-ink-secondary hover:bg-raised/50 hover:text-ink disabled:cursor-not-allowed disabled:opacity-50",children:x?t("keys.testing"):t("keys.test")})]}),g&&e.jsx("p",{role:"status",className:O("mt-1 text-[12px]",g.ok?"text-success":"text-danger"),children:g.text}),e.jsxs("div",{className:"mt-2 flex items-center justify-between gap-2 text-[12px] text-ink-secondary",children:[Kn[s]?e.jsx("a",{href:Kn[s],target:"_blank",rel:"noreferrer",className:"text-accent hover:underline",children:t("imageGen.key.get")}):e.jsx("span",{children:t("imageGen.custom.help",{app:Se()})}),C&&e.jsx("button",{type:"button",onClick:()=>{L("")},disabled:d,className:"cursor-pointer hover:text-danger disabled:opacity-50",children:t("keys.removeKey")})]}),p&&e.jsx("p",{role:"alert",className:"mt-1 text-[12px] text-danger",children:p})]})}function pp({configured:s,optional:n=!1}){return e.jsxs("div",{role:"status",className:"mb-2 flex items-center gap-2 text-[13px] text-ink-secondary",children:[e.jsx("span",{className:O("size-1.5 rounded-full",s?"bg-success":"bg-raised-hover")}),e.jsx("span",{className:s?"text-success":void 0,children:t(s?"imageGen.key.saved":n?"imageGen.key.optional":"imageGen.key.missing")})]})}function ps(s){if(s.readOnly||s.trialCredit||s.access==="custom"||s.access==="api")return null;if(s.driverKind==="claudeAgent")return"claude";const n=s.authentication?.method;return s.snapshot.chatgptPlan===!0||(n==="device-code"||n==="browser-pkce")&&ti(s.driverKind)==="codex"?"chatgpt":null}function en(s){return s.snapshot.state!=="available"?"unavailable":s.snapshot.authenticated===!0?"signedIn":s.snapshot.authenticated===!1?"signedOut":"unknown"}const tn={claude:{title:"accounts.claude",add:"accounts.addClaude",removeBody:"accounts.removeBodyClaude"},chatgpt:{title:"accounts.chatgpt",add:"accounts.addChatgpt",removeBody:"accounts.removeBodyChatgpt"}};function mp(s,n){return{signOut:en(n)==="signedIn"&&n.authentication?.signOut===!0&&n.snapshot.account?.method!=="api-key",remove:s==="claude"?n.instanceId!=="claude"&&n.claudeAccount?.isDefault!==!0:n.instanceId.startsWith("chatgpt-")}}function Xi(s){return s.some($e)}function xp(s,n){const a=n.filter(o=>en(o)==="signedIn"),i=Xi(n),r=n.some(o=>o.snapshot.state==="available"),c=n.length>1?t("accounts.count",{count:String(n.length),signedIn:String(a.length)}):a[0]?.snapshot.account?.email??eo(n[0]);return{title:t(tn[s].title),subtitle:c,ready:i,status:i?t("onboarding.engines.ready"):r?t("model.signInRequired"):t("onboarding.engines.needsSetup"),action:i?t("engines.library.manage"):r?t("accounts.signIn"):t("engines.library.setup")}}function hp({group:s,instance:n,onRename:a}){const{state:i,dispatch:r,refreshInstances:c}=G(),[o,d]=l.useState(!1),[u,p]=l.useState(null),[m,x]=l.useState(!1),[h,f]=l.useState(null),b=l.useRef(null),{signOut:y,remove:g}=mp(s,n),v=i.bots.filter(N=>N.modelSelection.instanceId===n.instanceId).length;l.useEffect(()=>{if(!o)return;const N=j=>{j.key==="Escape"&&(j.stopPropagation(),d(!1))},I=j=>{j.target instanceof Node&&!b.current?.contains(j.target)&&d(!1)};return window.addEventListener("keydown",N,!0),window.addEventListener("pointerdown",I),()=>{window.removeEventListener("keydown",N,!0),window.removeEventListener("pointerdown",I)}},[o]);const C=async N=>{p(null),x(!0),f(null);try{const I=`/api/instances/${encodeURIComponent(n.instanceId)}${N==="signOut"?"/auth/sign-out":""}`,{instances:j}=await F(I,N==="signOut"?{method:"POST"}:{method:"DELETE"});Array.isArray(j)?r({type:"instances",instances:j}):await c().catch(()=>{})}catch(I){f(I instanceof Error?I.message:String(I))}finally{x(!1)}},w="ui-menu-row w-full text-left disabled:cursor-not-allowed disabled:opacity-50";return e.jsxs("div",{ref:b,className:"relative flex items-center gap-1",children:[g&&e.jsx("button",{type:"button",disabled:m||v>0,onClick:()=>p("remove"),title:v>0?t("accounts.inUse",{count:String(v)}):void 0,className:"rounded-lg px-2.5 py-1.5 text-[12px] font-medium text-danger hover:bg-danger/10 disabled:cursor-not-allowed disabled:opacity-50",children:t("accounts.remove")}),e.jsx("button",{type:"button",onClick:()=>d(N=>!N),disabled:m,"aria-haspopup":"menu","aria-expanded":o,"aria-label":t("accounts.menu",{name:tt(n)}),className:"flex size-8 items-center justify-center rounded-lg text-ink-secondary outline-none hover:bg-control hover:text-ink focus-visible:ring-2 focus-visible:ring-accent disabled:opacity-50",children:m?e.jsx(q,{size:14,className:"animate-spin"}):e.jsx(Ni,{size:16})}),o&&e.jsxs("div",{role:"menu",className:O("absolute right-0 top-full z-40 mt-1 w-[220px] overflow-hidden text-[13px]",cd),children:[e.jsx("button",{type:"button",role:"menuitem",className:O(w,"text-ink"),onClick:()=>{d(!1),a()},children:t("accounts.rename")}),y&&e.jsx("button",{type:"button",role:"menuitem",className:O(w,"text-ink"),onClick:()=>{d(!1),p("signOut")},children:t("accounts.signOut")}),g&&v>0&&e.jsx("p",{className:"px-3 pb-1 pt-0.5 text-[11px] leading-snug text-ink-secondary",children:t("accounts.inUse",{count:String(v)})})]}),h&&e.jsx("p",{role:"alert",className:"absolute right-0 top-full z-30 mt-1 w-[260px] rounded-lg bg-card p-2 text-[12px] text-danger shadow-lg",children:h}),e.jsx(ut,{open:u==="signOut",title:t("accounts.signOutTitle",{name:tt(n)}),body:t("accounts.signOutBody"),confirmLabel:t("accounts.signOut"),onCancel:()=>p(null),onConfirm:()=>{C("signOut")}}),e.jsx(ut,{open:u==="remove",title:t("accounts.removeTitle",{name:tt(n)}),body:t(tn[s].removeBody),confirmLabel:t("accounts.remove"),tone:"neutral",onCancel:()=>p(null),onConfirm:()=>{C("remove")}})]})}function gp({instance:s,onDone:n}){const{dispatch:a}=G(),[i,r]=l.useState(tt(s)),[c,o]=l.useState(!1),[d,u]=l.useState(null),p=async()=>{const m=i.trim();if(!m||m===tt(s))return n();o(!0),u(null);try{const{instances:x}=await F(`/api/instances/${encodeURIComponent(s.instanceId)}`,{method:"PATCH",body:JSON.stringify({displayName:m})});Array.isArray(x)&&a({type:"instances",instances:x}),n()}catch(x){u(x instanceof Error?x.message:String(x))}finally{o(!1)}};return e.jsxs("form",{className:"flex min-w-0 flex-1 flex-col gap-1",onSubmit:m=>{m.preventDefault(),p()},children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{value:i,onChange:m=>r(m.target.value),maxLength:80,autoFocus:!0,disabled:c,"aria-label":t("accounts.nameLabel"),onKeyDown:m=>{m.key==="Escape"&&(m.stopPropagation(),n())},className:"min-w-0 flex-1 rounded-lg border border-hairline/40 bg-inset px-2.5 py-1.5 text-[13px] text-ink outline-none focus:border-accent-border disabled:opacity-50"}),e.jsx("button",{type:"submit",disabled:c||!i.trim(),className:"rounded-lg bg-raised px-3 py-1.5 text-[12px] font-medium text-ink hover:bg-raised-hover disabled:opacity-50",children:c?e.jsx(q,{size:13,className:"animate-spin"}):t("common.save")}),e.jsx("button",{type:"button",onClick:n,disabled:c,className:"rounded-lg px-2.5 py-1.5 text-[12px] text-ink-secondary hover:bg-control",children:t("common.cancel")})]}),d&&e.jsx("p",{role:"alert",className:"text-[12px] text-danger",children:d})]})}function fp({group:s,instance:n,signingIn:a,onSignIn:i,onSignInDone:r}){const[c,o]=l.useState(!1),d=en(n),u=n.snapshot.account,p=n.snapshot.authenticationUnavailableReason,m=p&&d!=="signedIn"?p:d==="signedIn"?u?.method==="api-key"?t("accounts.apiKey"):[u?.email,u?.organization].filter(Boolean).join(" · ")||t("accounts.signedIn"):d==="signedOut"?t("accounts.notSignedIn"):d==="unknown"?t("accounts.unknown"):n.snapshot.reason??t("onboarding.engines.needsSetup");return e.jsxs("li",{"data-account":n.instanceId,"data-account-state":d,className:"px-3 py-2.5",children:[e.jsxs("div",{className:"flex min-h-9 items-center gap-3",children:[e.jsx("span",{"aria-hidden":"true",className:O("flex size-6 shrink-0 items-center justify-center rounded-full",d==="signedIn"?"bg-success/15 text-success":"bg-control text-ink-secondary"),children:d==="signedIn"?e.jsx(ve,{size:13}):e.jsx("span",{className:O("size-1.5 rounded-full",d==="signedOut"?"bg-warning":"bg-ink-tertiary")})}),c?e.jsx(gp,{instance:n,onDone:()=>o(!1)}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"truncate text-[13px] font-medium text-ink",title:tt(n),children:tt(n)}),e.jsx("div",{className:"truncate text-[12px] text-ink-secondary",title:m,children:m})]}),d!=="signedIn"&&d!=="unavailable"&&!p&&!a&&e.jsx("button",{type:"button",onClick:i,className:O("shrink-0 rounded-lg px-3 py-1.5 text-[12px] font-semibold",d==="signedOut"?"bg-accent text-white hover:brightness-110":"bg-control text-ink hover:bg-raised-hover"),children:t("accounts.signIn")}),e.jsx(hp,{group:s,instance:n,onRename:()=>o(!0)})]})]}),a&&e.jsx("div",{className:"pl-9",children:s==="claude"?e.jsxs(e.Fragment,{children:[e.jsx(Yl,{instanceId:n.instanceId,autoStart:!0,onDone:r}),n.claudeAccount?.signInCommand&&e.jsxs("details",{className:"mt-2 text-[12px] text-ink-secondary",children:[e.jsx("summary",{className:"cursor-pointer select-none hover:text-ink",children:t("engineSetup.preferTerminal")}),e.jsx(Xl,{command:n.claudeAccount.signInCommand,actionLabel:t("engineSetup.openSignIn"),compact:!0})]})]}):e.jsx(Ql,{instanceId:n.instanceId,provider:"codex",browserPkce:n.authentication?.method==="browser-pkce",autoStart:!0,onDone:r})}),s==="chatgpt"&&d==="signedIn"&&n.snapshot.chatgptPlan&&e.jsx("div",{className:"pl-9",children:e.jsx(Zl,{instanceId:n.instanceId,welcome:!1})})]})}function Qi({label:s,endpoint:n,extra:a,folder:i=!1,describedBy:r,onAdded:c}){const{dispatch:o}=G(),[d,u]=l.useState(!1),[p,m]=l.useState(""),[x,h]=l.useState(""),[f,b]=l.useState(!1),[y,g]=l.useState(null),v=async()=>{if(!(f||!p.trim())){b(!0),g(null);try{const C={displayName:p.trim(),...a,...i&&x.trim()?{configDir:x.trim()}:{}},w=await F(n,{method:"POST",body:JSON.stringify(C)});Array.isArray(w.instances)&&o({type:"instances",instances:w.instances}),u(!1),m(""),h(""),typeof w.instanceId=="string"&&c(w.instanceId)}catch(C){g(C instanceof Error?C.message:String(C))}finally{b(!1)}}};return d?e.jsxs("form",{"data-add-account":n,className:"space-y-2.5 rounded-xl border border-hairline/50 bg-app p-3",onSubmit:C=>{C.preventDefault(),v()},children:[e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] font-medium text-ink",children:[t("accounts.nameLabel"),e.jsx("input",{value:p,onChange:C=>m(C.target.value),placeholder:t("accounts.namePlaceholder"),maxLength:80,autoFocus:!0,required:!0,disabled:f,"aria-describedby":r,className:"rounded-lg border border-hairline/40 bg-inset px-3 py-2 text-[13px] font-normal text-ink outline-none focus:border-accent-border disabled:opacity-50"})]}),i&&e.jsxs("details",{className:"text-[12px] text-ink-secondary",children:[e.jsx("summary",{className:"cursor-pointer select-none hover:text-ink",children:t("accounts.folderToggle")}),e.jsx("input",{value:x,onChange:C=>h(C.target.value),placeholder:"~/.claude-work",maxLength:4096,spellCheck:!1,disabled:f,"aria-label":t("accounts.folderToggle"),className:"mt-2 w-full rounded-lg border border-hairline/40 bg-inset px-3 py-2 font-mono text-[12px] text-ink outline-none focus:border-accent-border disabled:opacity-50"}),e.jsx("p",{className:"mt-1 leading-relaxed",children:t("accounts.folderHint")})]}),y&&e.jsx("p",{role:"alert",className:"text-[12px] text-danger",children:y}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",onClick:()=>{u(!1),g(null)},disabled:f,className:"rounded-lg px-3 py-1.5 text-[12px] text-ink-secondary hover:bg-control disabled:opacity-50",children:t("common.cancel")}),e.jsxs("button",{type:"submit",disabled:f||!p.trim(),className:"flex items-center gap-1.5 rounded-lg bg-accent px-3 py-1.5 text-[12px] font-semibold text-white hover:brightness-110 disabled:opacity-50",children:[f&&e.jsx(q,{size:13,className:"animate-spin"}),t("accounts.addSubmit")]})]})]}):e.jsxs("button",{type:"button",onClick:()=>u(!0),"aria-describedby":r,className:"flex min-h-8 w-fit items-center gap-1.5 rounded-lg px-2 py-1.5 text-[13px] font-medium text-ink-secondary outline-none hover:bg-control hover:text-ink focus-visible:ring-2 focus-visible:ring-accent",children:[e.jsx(Oe,{size:14}),s]})}function bp({group:s,accounts:n,advanced:a,bare:i=!1}){const[r,c]=l.useState(null),o=n[0],d=n.some(m=>m.snapshot.state==="available"),u=n.find(m=>m.policy)?.policy,p=l.useId();return e.jsxs(zt,{instance:o,summary:xp(s,n),bare:i,children:[u&&e.jsxs("p",{className:"mb-3 text-[12px] leading-relaxed text-ink-secondary",children:[e.jsx("span",{className:"font-medium text-ink",children:t("policy.managedBy",{organization:u.organizationName})})," · ",u.reason]}),d?e.jsxs("div",{className:"space-y-2",children:[e.jsx("ul",{"data-accounts":s,className:"divide-y divide-hairline/40 rounded-xl border border-hairline/50 bg-panel/40",children:n.map(m=>e.jsx(fp,{group:s,instance:m,signingIn:r===m.instanceId,onSignIn:()=>c(m.instanceId),onSignInDone:()=>c(x=>x===m.instanceId?null:x)},m.instanceId))}),!o.snapshot.authenticationUnavailableReason&&e.jsxs(e.Fragment,{children:[e.jsx(Qi,{label:t(tn[s].add),endpoint:`/api/instances/${s}-accounts`,folder:s==="claude",describedBy:s==="chatgpt"?p:void 0,onAdded:c}),s==="chatgpt"&&e.jsx("p",{id:p,className:"px-2 text-[12px] leading-relaxed text-ink-secondary",children:t("accounts.addChatgptWorkspaceNote")})]})]}):e.jsx(Vt,{instance:o,unframed:!0}),o.snapshot.update&&e.jsx(si,{update:o.snapshot.update,instance:o,className:"mt-3",quiet:!0}),o.snapshot.warning&&e.jsx(ni,{warning:o.snapshot.warning,className:"mt-3"}),a]})}const yp={claude:{url:"https://api.anthropic.com",model:"deepseek-chat"},codex:{url:"https://api.openai.com/v1",model:""}},Et=O(He,"font-sans"),vp={name:"",url:"",token:"",model:""},kp=s=>({name:s.displayName,url:(s.claudeEndpoint??s.codexEndpoint)?.baseUrl??"",token:"",model:""});function Gn({instance:s,engine:n,onDone:a}){const{dispatch:i}=G(),r=yp[n],[c,o]=l.useState(s?kp(s):vp),[d,u]=l.useState(!1),[p,m]=l.useState(null),x=b=>({value:c[b],onChange:y=>o(g=>({...g,[b]:y.target.value})),spellCheck:!1,disabled:d}),h=!!(c.name.trim()&&(c.url.trim()||n==="codex")&&(s||c.token.trim())),f=async()=>{if(d||!h)return;u(!0),m(null);const b={displayName:c.name.trim(),baseUrl:c.url.trim()||r.url,...c.token.trim()?{token:c.token.trim()}:{},...c.model.trim()?{model:c.model.trim()}:{}};try{const y=s?await F(`/api/instances/${encodeURIComponent(s.instanceId)}/${n}-endpoint`,{method:"PATCH",body:JSON.stringify(b)}):await F(`/api/instances/${n}-endpoint`,{method:"POST",body:JSON.stringify(b)});Array.isArray(y.instances)&&i({type:"instances",instances:y.instances}),a()}catch(y){m(y instanceof Error&&y.message?y.message:t("claudeEndpoints.failed"))}finally{u(!1)}};return e.jsxs("form",{"data-claude-endpoint-form":n==="claude"?s?.instanceId??"new":void 0,"data-codex-endpoint-form":n==="codex"?s?.instanceId??"new":void 0,className:"flex flex-col gap-2 rounded-xl border border-hairline/50 bg-inset p-3",onSubmit:b=>{b.preventDefault(),f()},children:[e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t(n==="codex"?"agentEndpoints.responses":"agentEndpoints.messages")}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] font-medium text-ink",children:[t("claudeEndpoints.name"),e.jsx("input",{...x("name"),maxLength:80,autoFocus:!0,"aria-label":t("claudeEndpoints.name"),className:Et})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] font-medium text-ink",children:[t("claudeEndpoints.baseUrl"),e.jsx("input",{...x("url"),type:"url",maxLength:2048,placeholder:r.url,"aria-label":t("claudeEndpoints.baseUrl"),className:O(Et,"font-mono")})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] font-medium text-ink",children:[t("claudeEndpoints.token"),e.jsx("input",{...x("token"),type:"password",maxLength:4096,autoComplete:"off","aria-label":t("claudeEndpoints.token"),className:O(Et,"font-mono"),placeholder:s?t("claudeEndpoints.tokenKeep"):""})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] font-medium text-ink",children:[t("claudeEndpoints.model"),e.jsx("input",{...x("model"),maxLength:160,placeholder:r.model,"aria-label":t("claudeEndpoints.model"),className:O(Et,"font-mono")})]}),e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("claudeEndpoints.modelHint")}),p&&e.jsx("p",{role:"alert",className:"text-[12px] text-danger",children:p}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",onClick:a,disabled:d,className:"rounded-lg px-3 py-1.5 text-[12px] text-ink-secondary hover:bg-control disabled:opacity-50",children:t("common.cancel")}),e.jsxs("button",{type:"submit",disabled:d||!h,className:"flex items-center gap-1.5 rounded-lg bg-accent px-3 py-1.5 text-[12px] font-semibold text-white hover:brightness-110 disabled:opacity-50",children:[d&&e.jsx(q,{size:13,className:"animate-spin"}),t("common.save")]})]})]})}function jp({instance:s,onEdit:n}){const{state:a,dispatch:i}=G(),[r,c]=l.useState(!1),[o,d]=l.useState(!1),[u,p]=l.useState(null),m=a.bots.filter(f=>f.modelSelection.instanceId===s.instanceId||f.fallback?.some(b=>b.instanceId===s.instanceId)||f.tasks?.some(b=>b.modelSelection?.instanceId===s.instanceId)).length,x=s.claudeEndpoint??s.codexEndpoint,h=async()=>{c(!1),d(!0),p(null);try{const f=await F(`/api/instances/${encodeURIComponent(s.instanceId)}`,{method:"DELETE"});Array.isArray(f.instances)&&i({type:"instances",instances:f.instances})}catch(f){p(f instanceof Error?f.message:String(f))}finally{d(!1)}};return e.jsxs("li",{"data-claude-endpoint":s.claudeEndpoint?s.instanceId:void 0,"data-codex-endpoint":s.codexEndpoint?s.instanceId:void 0,className:"px-3 py-2.5",children:[e.jsxs("div",{className:"flex min-h-9 items-center gap-3",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"truncate text-[13px] font-medium text-ink",title:s.displayName,children:s.displayName}),e.jsx("div",{className:"truncate font-mono text-[11px] text-ink-secondary",title:x?.baseUrl,children:x?.baseUrl})]}),e.jsx("button",{type:"button",onClick:n,disabled:o,className:"shrink-0 rounded-lg px-2.5 py-1.5 text-[12px] font-medium text-ink-secondary hover:bg-control hover:text-ink disabled:opacity-50",children:t("claudeEndpoints.edit")}),e.jsx("button",{type:"button",disabled:o||m>0,onClick:()=>c(!0),title:m>0?t("accounts.inUse",{count:String(m)}):t("accounts.remove"),"aria-label":t("claudeEndpoints.remove",{name:s.displayName}),className:"flex size-8 shrink-0 items-center justify-center rounded-lg text-danger hover:bg-danger/10 disabled:cursor-not-allowed disabled:opacity-50",children:o?e.jsx(q,{size:14,className:"animate-spin"}):e.jsx(Le,{size:14})})]}),u&&e.jsx("p",{role:"alert",className:"mt-1 text-[12px] text-danger",children:u}),e.jsx(ut,{open:r,title:t("accounts.removeTitle",{name:s.displayName}),body:t("claudeEndpoints.removeBody"),confirmLabel:t("accounts.remove"),tone:"neutral",pending:o,onCancel:()=>c(!1),onConfirm:()=>{h()}})]})}function Zi({engine:s}){const{state:n}=G(),a=n.instances.filter(c=>s==="claude"?c.claudeEndpoint:c.codexEndpoint),[i,r]=l.useState(null);return e.jsxs("div",{"data-claude-endpoints":s==="claude"?"":void 0,"data-codex-endpoints":s==="codex"?"":void 0,className:"mt-3 space-y-2",children:[e.jsx("div",{className:"text-[13px] leading-[18px] text-ink",children:t(s==="claude"?"claudeEndpoints.title":"agentEndpoints.codexTitle")}),e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t(s==="claude"?"claudeEndpoints.hint":"agentEndpoints.codexHint")}),a.length===0?e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("claudeEndpoints.empty")}):e.jsx("ul",{className:"divide-y divide-hairline/40 rounded-xl border border-hairline/50 bg-panel/40",children:a.map(c=>i===c.instanceId?e.jsx("li",{className:"p-3",children:e.jsx(Gn,{engine:s,instance:c,onDone:()=>r(null)})},c.instanceId):e.jsx(jp,{instance:c,onEdit:()=>r(c.instanceId)},c.instanceId))}),i==="new"?e.jsx(Gn,{engine:s,onDone:()=>r(null)}):e.jsxs("button",{type:"button",onClick:()=>r("new"),className:"flex min-h-8 w-fit items-center gap-1.5 rounded-lg px-2 py-1.5 text-[13px] font-medium text-ink-secondary outline-none hover:bg-control hover:text-ink focus-visible:ring-2 focus-visible:ring-accent",children:[e.jsx(Oe,{size:14}),t("claudeEndpoints.add")]})]})}function ms(){return e.jsx(Zi,{engine:"claude"})}function xs(){return e.jsx(Zi,{engine:"codex"})}const xt=O(He,"font-sans"),Np={opusModel:"global.anthropic.claude-opus-5-5",sonnetModel:"global.anthropic.claude-sonnet-5-5",haikuModel:"global.anthropic.claude-haiku-5-5",smallFastModel:"global.anthropic.claude-haiku-5-5"},Vn=["opusModel","sonnetModel","haikuModel","smallFastModel"],wp={name:"Claude on Bedrock",awsProfile:"default",awsRegion:"",model:"",opusModel:"",sonnetModel:"",haikuModel:"",smallFastModel:""},Sp=s=>{const n=s.claudeBedrock;return{name:s.displayName,awsProfile:n?.awsProfile||"default",awsRegion:n?.awsRegion??"",model:n?.model??"",opusModel:n?.opusModel??"",sonnetModel:n?.sonnetModel??"",haikuModel:n?.haikuModel??"",smallFastModel:n?.smallFastModel??""}},qn={opusModel:"claudeBedrock.opus",sonnetModel:"claudeBedrock.sonnet",haikuModel:"claudeBedrock.haiku",smallFastModel:"claudeBedrock.smallFast"};function Jn({instance:s,onDone:n}){const{dispatch:a}=G(),[i,r]=l.useState(s?Sp(s):wp),[c,o]=l.useState(!1),[d,u]=l.useState(null),p=h=>({value:i[h],onChange:f=>r(b=>({...b,[h]:f.target.value})),spellCheck:!1,disabled:c}),m=!!(i.name.trim()&&i.awsProfile.trim()&&i.awsRegion.trim()&&i.model.trim()),x=async()=>{if(c||!m)return;o(!0),u(null);const h={displayName:i.name.trim(),awsProfile:i.awsProfile.trim(),awsRegion:i.awsRegion.trim(),model:i.model.trim(),...Object.fromEntries(Vn.map(f=>[f,i[f].trim()]))};try{const f=s?await F(`/api/instances/${encodeURIComponent(s.instanceId)}/claude-bedrock`,{method:"PATCH",body:JSON.stringify(h)}):await F("/api/instances/claude-bedrock",{method:"POST",body:JSON.stringify(h)});Array.isArray(f.instances)&&a({type:"instances",instances:f.instances}),n()}catch(f){u(f instanceof Error&&f.message?f.message:t("claudeBedrock.failed"))}finally{o(!1)}};return e.jsxs("form",{"data-claude-bedrock-form":s?.instanceId??"new",className:"flex flex-col gap-2 rounded-xl border border-hairline/50 bg-inset p-3",onSubmit:h=>{h.preventDefault(),x()},children:[e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("claudeBedrock.awsHint")}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] font-medium text-ink",children:[t("claudeBedrock.name"),e.jsx("input",{...p("name"),maxLength:80,autoFocus:!0,"aria-label":t("claudeBedrock.name"),className:xt})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] font-medium text-ink",children:[t("claudeBedrock.profile"),e.jsx("input",{...p("awsProfile"),maxLength:128,placeholder:"default","aria-label":t("claudeBedrock.profile"),className:O(xt,"font-mono")})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] font-medium text-ink",children:[t("claudeBedrock.region"),e.jsx("input",{...p("awsRegion"),maxLength:32,placeholder:"us-east-1","aria-label":t("claudeBedrock.region"),className:O(xt,"font-mono")})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] font-medium text-ink",children:[t("claudeBedrock.model"),e.jsx("input",{...p("model"),maxLength:160,placeholder:"global.anthropic.claude-sonnet-5-5","aria-label":t("claudeBedrock.model"),className:O(xt,"font-mono")})]}),e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("claudeBedrock.modelHint")}),e.jsxs("details",{className:"rounded-lg border border-hairline/40 px-2.5 py-2",children:[e.jsx("summary",{className:"cursor-pointer text-[12px] font-medium text-ink-secondary outline-none hover:text-ink",children:t("claudeBedrock.tiers")}),e.jsx("div",{className:"mt-2 flex flex-col gap-2",children:Vn.map(h=>e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] font-medium text-ink",children:[t(qn[h]),e.jsx("input",{...p(h),maxLength:160,placeholder:Np[h],"aria-label":t(qn[h]),className:O(xt,"font-mono")})]},h))})]}),d&&e.jsx("p",{role:"alert",className:"text-[12px] text-danger",children:d}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",onClick:n,disabled:c,className:"rounded-lg px-3 py-1.5 text-[12px] text-ink-secondary hover:bg-control disabled:opacity-50",children:t("common.cancel")}),e.jsxs("button",{type:"submit",disabled:c||!m,className:"flex items-center gap-1.5 rounded-lg bg-accent px-3 py-1.5 text-[12px] font-semibold text-white hover:brightness-110 disabled:opacity-50",children:[c&&e.jsx(q,{size:13,className:"animate-spin"}),t("common.save")]})]})]})}function Cp({instance:s,onEdit:n}){const{state:a,dispatch:i}=G(),[r,c]=l.useState(!1),[o,d]=l.useState(!1),[u,p]=l.useState(null),m=a.bots.filter(f=>f.modelSelection.instanceId===s.instanceId||f.fallback?.some(b=>b.instanceId===s.instanceId)||f.tasks?.some(b=>b.modelSelection?.instanceId===s.instanceId)).length,x=s.claudeBedrock,h=async()=>{c(!1),d(!0),p(null);try{const f=await F(`/api/instances/${encodeURIComponent(s.instanceId)}`,{method:"DELETE"});Array.isArray(f.instances)&&i({type:"instances",instances:f.instances})}catch(f){p(f instanceof Error?f.message:String(f))}finally{d(!1)}};return e.jsxs("li",{"data-claude-bedrock":s.instanceId,className:"px-3 py-2.5",children:[e.jsxs("div",{className:"flex min-h-9 items-center gap-3",children:[e.jsx(ai,{preset:"aws",size:16,className:"shrink-0"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"truncate text-[13px] font-medium text-ink",title:s.displayName,children:s.displayName}),e.jsx("div",{className:"truncate font-mono text-[11px] text-ink-secondary",children:t("claudeBedrock.rowSubtitle",{profile:x?.awsProfile??"",region:x?.awsRegion??""})})]}),e.jsx("button",{type:"button",onClick:n,disabled:o,className:"shrink-0 rounded-lg px-2.5 py-1.5 text-[12px] font-medium text-ink-secondary hover:bg-control hover:text-ink disabled:opacity-50",children:t("claudeBedrock.edit")}),e.jsx("button",{type:"button",disabled:o||m>0,onClick:()=>c(!0),title:m>0?t("accounts.inUse",{count:String(m)}):t("accounts.remove"),"aria-label":t("claudeBedrock.remove",{name:s.displayName}),className:"flex size-8 shrink-0 items-center justify-center rounded-lg text-danger hover:bg-danger/10 disabled:cursor-not-allowed disabled:opacity-50",children:o?e.jsx(q,{size:14,className:"animate-spin"}):e.jsx(Le,{size:14})})]}),u&&e.jsx("p",{role:"alert",className:"mt-1 text-[12px] text-danger",children:u}),e.jsx(ut,{open:r,title:t("accounts.removeTitle",{name:s.displayName}),body:t("claudeBedrock.removeBody"),confirmLabel:t("accounts.remove"),tone:"neutral",pending:o,onCancel:()=>c(!1),onConfirm:()=>{h()}})]})}function hs(){const{state:s}=G(),n=s.instances.filter(r=>r.claudeBedrock),[a,i]=l.useState(null);return e.jsxs("div",{"data-claude-bedrock-endpoints":"",className:"mt-3 space-y-2",children:[e.jsx("div",{className:"text-[13px] leading-[18px] text-ink",children:t("claudeBedrock.title")}),e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("claudeBedrock.hint")}),n.length===0?e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("claudeBedrock.empty")}):e.jsx("ul",{className:"divide-y divide-hairline/40 rounded-xl border border-hairline/50 bg-panel/40",children:n.map(r=>a===r.instanceId?e.jsx("li",{className:"p-3",children:e.jsx(Jn,{instance:r,onDone:()=>i(null)})},r.instanceId):e.jsx(Cp,{instance:r,onEdit:()=>i(r.instanceId)},r.instanceId))}),a==="new"?e.jsx(Jn,{onDone:()=>i(null)}):e.jsxs("button",{type:"button",onClick:()=>i("new"),className:"flex min-h-8 w-fit items-center gap-1.5 rounded-lg px-2 py-1.5 text-[13px] font-medium text-ink-secondary outline-none hover:bg-control hover:text-ink focus-visible:ring-2 focus-visible:ring-accent",children:[e.jsx(Oe,{size:14}),t("claudeBedrock.add")]})]})}function Yn(s){const n=s/1048576;return n<1?t("engines.freeSpace.underOneMb"):n<1024?`${Math.round(n)} MB`:`${(n/1024).toFixed(1)} GB`}function Ep({instance:s,initial:n={kind:"idle"}}){const[a,i]=l.useState(n),[r,c]=l.useState(null),o=`/api/instances/${encodeURIComponent(s.instanceId)}/leftover-files`,d=async()=>{c(null),i({kind:"scanning"});try{const m=await F(o);i(m.folders>0?{kind:"found",bytes:m.bytes,complete:m.complete}:{kind:"none"})}catch(m){c(m instanceof Error?m.message:String(m)),i({kind:"idle"})}},u=async()=>{c(null),i({kind:"deleting"});try{const m=await F(`${o}/remove`,{method:"POST",body:JSON.stringify({})});i({kind:"done",freedBytes:m.freedBytes,remaining:m.remaining})}catch(m){c(m instanceof Error?m.message:String(m)),i({kind:"idle"})}},p=a.kind==="scanning"||a.kind==="deleting";return e.jsxs("section",{className:"mt-3 rounded-xl border border-hairline/40 px-3 py-2.5","aria-label":t("engines.freeSpace.title"),children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(dd,{size:13,"aria-hidden":"true",className:"shrink-0 text-ink-secondary"}),e.jsx("span",{className:"text-[12px] font-medium text-ink",children:t("engines.freeSpace.title")}),e.jsx("span",{className:"flex-1"}),(a.kind==="idle"||a.kind==="none"||a.kind==="done"||p)&&e.jsxs("button",{type:"button",onClick:()=>{d()},disabled:p,className:"flex shrink-0 items-center gap-1 rounded-lg border border-hairline/40 px-3 py-1 text-[12px] text-ink-secondary hover:bg-raised/50 hover:text-ink disabled:opacity-50",children:[p&&e.jsx(q,{size:12,className:"animate-spin"}),t("engines.freeSpace.action")]})]}),e.jsx("p",{className:"mt-1.5 text-[12px] leading-relaxed text-ink-secondary",children:t("engines.freeSpace.intro")}),a.kind==="scanning"&&e.jsx("p",{role:"status",className:"mt-2 text-[12px] text-ink-secondary",children:t("engines.freeSpace.scanning")}),a.kind==="deleting"&&e.jsx("p",{role:"status",className:"mt-2 text-[12px] text-ink-secondary",children:t("engines.freeSpace.deleting")}),a.kind==="none"&&e.jsx("p",{role:"status",className:"mt-2 text-[12px] text-ink-secondary",children:t("engines.freeSpace.none")}),a.kind==="found"&&e.jsxs("div",{className:"mt-2 flex flex-wrap items-center gap-2",children:[e.jsx("p",{role:"status",className:"flex-1 text-[12px] text-ink",children:t(a.complete?"engines.freeSpace.found":"engines.freeSpace.foundAtLeast",{size:Yn(a.bytes)})}),e.jsx("button",{type:"button",onClick:()=>i({kind:"idle"}),className:"rounded-lg px-3 py-1 text-[12px] text-ink-secondary hover:bg-raised/50 hover:text-ink",children:t("common.cancel")}),e.jsx("button",{type:"button",onClick:()=>{u()},className:"rounded-lg bg-raised px-3 py-1 text-[12px] text-ink hover:bg-raised-hover",children:t("engines.freeSpace.delete")})]}),a.kind==="done"&&e.jsxs("p",{role:"status",className:"mt-2 text-[12px] text-ink-secondary",children:[(a.freedBytes>0||a.remaining===0)&&e.jsxs("span",{className:"text-success",children:[t("engines.freeSpace.freed",{size:Yn(a.freedBytes)})," "]}),a.remaining>0&&t("engines.freeSpace.someLeft")]}),r&&e.jsx("p",{role:"alert",className:"mt-2 text-[12px] text-danger",children:r})]})}const gs=[60,120,180,360,720];function er(){const{state:s,dispatch:n}=G(),[a,i]=l.useState(!1),[r,c]=l.useState(""),o=l.useRef(!1),d=s.config?.cacheKeepWarm;if(!d)return null;const u=async m=>{if(!o.current){o.current=!0,i(!0),c("");try{const x=await F("/api/config",{method:"PUT",body:JSON.stringify({cacheKeepWarm:{enabled:m.enabled,windowMinutes:m.windowMinutes}})});n({type:"configStatus",config:x})}catch(x){c(x instanceof Error?x.message:t("settings.keepWarm.error"))}finally{o.current=!1,i(!1)}}},p=gs.includes(d.windowMinutes)?[...gs]:[...gs,d.windowMinutes].sort((m,x)=>m-x);return e.jsxs(X,{title:t("settings.keepWarm.title"),subtitle:t("settings.keepWarm.subtitle"),children:[e.jsxs("div",{className:"mt-3 flex items-center justify-between gap-4",children:[e.jsx("label",{htmlFor:"cache-keepwarm-enabled",className:"text-[13px] font-medium text-ink",children:t("settings.keepWarm.enable")}),e.jsx(fe,{id:"cache-keepwarm-enabled",checked:d.enabled,disabled:a,"aria-describedby":"cache-keepwarm-help cache-keepwarm-cost",onClick:()=>{u({...d,enabled:!d.enabled})}})]}),e.jsx("p",{id:"cache-keepwarm-help",className:"mt-2 text-[12px] leading-relaxed text-ink-secondary",children:t("settings.keepWarm.help")}),e.jsx("p",{id:"cache-keepwarm-cost",className:"mt-2 text-[12px] leading-relaxed text-ink-secondary",children:t("settings.keepWarm.cost")}),e.jsxs("div",{className:"mt-3 flex items-center justify-between gap-4",children:[e.jsx("label",{htmlFor:"cache-keepwarm-window",className:"text-[13px] font-medium text-ink",children:t("settings.keepWarm.window")}),e.jsx(ye,{id:"cache-keepwarm-window",value:d.windowMinutes,disabled:a||!d.enabled,onChange:m=>{u({...d,windowMinutes:Number(m.target.value)})},children:p.map(m=>e.jsx("option",{value:m,children:t("settings.keepWarm.hours",{hours:Number((m/60).toFixed(2))})},m))})]}),a&&e.jsx("span",{role:"status",className:"sr-only",children:t("settings.threads.saving")}),r&&e.jsx("p",{role:"alert",className:"mt-2 text-[12px] text-danger",children:r})]})}function Ap({instance:s,cliDefault:n,onClose:a,onSaved:i}){const[r,c]=l.useState(s.cliCandidates??null),[o,d]=l.useState(""),[u,p]=l.useState(s.cli&&!(s.cliCandidates??[]).includes(s.cli)?s.cli:""),[m,x]=l.useState(!1),[h,f]=l.useState(null),[b,y]=l.useState(!1),[g,v]=l.useState(null),C=l.useRef(!1);l.useEffect(()=>{C.current||(C.current=!0,F(`/api/cli-candidates?name=${encodeURIComponent(n??"")}`).then(({candidates:k})=>{c(k),s.cli&&(k.includes(s.cli)?d(s.cli):p(s.cli))}).catch(()=>c(k=>k??[])))},[n,s.cli]);const w=u.trim()||o,N=w!==(s.cli??""),I=m||b;l.useEffect(()=>{f(null)},[w]);const j=()=>{if(I||!w||!N)return;y(!0),v(null);const k=w;F(`/api/instances/${encodeURIComponent(s.instanceId)}`,{method:"PATCH",body:JSON.stringify({cli:k})}).then(()=>Promise.resolve(i()).catch(()=>{})).then(a).catch(P=>v(P.message)).finally(()=>y(!1))},L=()=>{I||!w||!N||(x(!0),v(null),F("/api/cli-test",{method:"POST",body:JSON.stringify({cli:w,driver:s.driverKind})}).then(k=>{f(k),k.ok&&j()}).catch(k=>v(k.message)).finally(()=>x(!1)))};return e.jsxs("div",{className:"mt-2.5 flex flex-col gap-2",children:[r!==null&&r.length>0&&e.jsxs(ye,{className:"w-full font-mono",value:u.trim()?"":o,onChange:k=>{d(k.target.value),p("")},"aria-label":t("engines.detectedAria",{name:s.displayName}),disabled:I,children:[e.jsx("option",{value:"",children:t("engines.selectBinary")}),r.map(k=>e.jsx("option",{value:k,children:k},k))]}),e.jsx("input",{type:"text",value:u,onChange:k=>p(k.target.value),onKeyDown:k=>{k.key==="Enter"&&(k.preventDefault(),!(!w||!N)&&L())},placeholder:r?.length?t("engines.manualPath"):"/absolute/path/to/cli","aria-label":t("engines.customAria",{name:s.displayName}),spellCheck:!1,disabled:I,className:"w-full rounded-lg border border-hairline/40 bg-inset px-3 py-2 font-mono text-[12px] text-ink placeholder:font-sans placeholder:text-ink-secondary focus:outline-none disabled:opacity-50"}),h&&!h.ok&&h.message&&e.jsxs("div",{role:"alert",className:"flex gap-1.5 rounded-lg border border-warning/25 bg-warning/10 px-2.5 py-2 text-[12px] leading-relaxed text-warning",children:[e.jsx(Ge,{size:13,className:"mt-0.5 shrink-0"}),e.jsx("span",{children:t("engines.testFailed",{message:h.message})})]}),h?.ok&&h.version&&e.jsx("div",{className:"text-[12px] text-success",children:t("engines.testPassed",{version:h.version})}),g&&e.jsx("div",{role:"alert",className:"text-[12px] text-danger",children:g}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{onClick:a,disabled:I,className:"rounded-lg px-3 py-1.5 text-[13px] text-ink-secondary hover:bg-raised/50 hover:text-ink disabled:opacity-50",children:t("common.cancel")}),h&&!h.ok?e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:()=>f(null),disabled:I,className:"rounded-lg px-3 py-1.5 text-[13px] text-ink-secondary hover:bg-raised/50 hover:text-ink disabled:opacity-50",children:t("engines.editPath")}),e.jsx("button",{onClick:()=>j(),disabled:I,className:"flex items-center gap-1.5 rounded-lg bg-raised px-3 py-1.5 text-[13px] text-danger hover:bg-raised-hover disabled:opacity-50",children:b?e.jsx(q,{size:13,className:"animate-spin"}):t("engines.saveAnyway")})]}):e.jsx("button",{onClick:L,disabled:I||!w||!N,className:O("flex w-[72px] items-center justify-center gap-1.5 rounded-lg py-1.5 text-[13px]","bg-raised text-ink hover:bg-raised-hover","disabled:cursor-not-allowed disabled:opacity-50"),children:I?e.jsx(q,{size:13,className:"animate-spin"}):e.jsxs(e.Fragment,{children:[e.jsx(ve,{size:13}),t("common.save")]})})]})]})}function tr({instance:s}){const{refreshInstances:n}=G(),[a,i]=l.useState(!1),r=Ed(a),[c,o]=l.useState(!1),[d,u]=l.useState(!1),[p,m]=l.useState(null),[x,h]=l.useState(null),f=l.useRef(null);l.useEffect(()=>{f.current!==null&&f.current!==s.cli&&i(!1),f.current=s.cli??null},[s.cli]);const b=()=>{c||d||(o(!0),h(null),F(`/api/instances/${encodeURIComponent(s.instanceId)}`,{method:"PATCH",body:JSON.stringify({cli:""})}).then(()=>Promise.resolve(n()).catch(()=>{})).catch(v=>h(v.message)).finally(()=>o(!1)))},y=()=>{c||d||(o(!0),h(null),F(`/api/instances/${encodeURIComponent(s.instanceId)}`,{method:"PATCH",body:JSON.stringify({hidden:!0})}).then(()=>Promise.resolve(n()).catch(()=>{})).catch(v=>h(v.message)).finally(()=>o(!1)))},g=()=>{c||d||(u(!0),m(null),h(null),F(`/api/instances/${encodeURIComponent(s.instanceId)}/claude-update`,{method:"POST",body:JSON.stringify({})}).then(async({version:v})=>{m(v),await Promise.resolve(n()).catch(()=>{})}).catch(v=>h(v.message)).finally(()=>u(!1)))};return e.jsxs("details",{className:"mt-4 border-t border-hairline/40 pt-3",children:[e.jsx("summary",{className:"cursor-pointer rounded-md py-1 text-[12px] font-medium text-ink-secondary outline-none hover:text-ink focus-visible:ring-2 focus-visible:ring-accent",children:t("engines.library.advanced")}),e.jsx("p",{className:"mt-2 text-[12px] leading-relaxed text-ink-secondary",children:t("engines.footer")}),e.jsxs("div",{className:"mt-3 flex flex-wrap items-center gap-2 text-[13px]",children:[s.cli?e.jsx("span",{className:"w-full break-all font-mono text-[12px] text-ink-secondary",title:s.cli,children:s.cli}):s.cliDefault&&e.jsx("span",{className:"break-all font-mono text-[11px] text-ink-secondary",children:s.cliDefault}),s.snapshot.version&&e.jsx("span",{className:"break-all text-[11px] text-ink-secondary",title:s.snapshot.version,children:s.snapshot.version}),e.jsx("span",{className:"flex-1"}),s.driverKind==="claudeAgent"&&e.jsxs("button",{onClick:g,disabled:c||d,className:"flex shrink-0 items-center gap-1 text-[12px] text-ink-secondary hover:text-ink disabled:opacity-50",children:[d?e.jsx(q,{size:12,className:"animate-spin"}):e.jsx(De,{size:12}),d?t("engines.updating"):t("engines.updateClaude")]}),s.cli&&e.jsx("button",{onClick:b,disabled:c||d,className:"shrink-0 text-[12px] text-ink-secondary hover:text-ink disabled:opacity-50",children:c?t("engines.resetting"):t("engines.reset")}),e.jsx("button",{type:"button","data-hide-engine":s.instanceId,onClick:y,disabled:c||d,title:t("engines.hideHint"),className:"shrink-0 text-[12px] text-ink-secondary hover:text-ink disabled:opacity-50",children:t("engines.hide")}),e.jsx("button",{onClick:()=>i(v=>!v),disabled:d,"aria-expanded":a,className:O("shrink-0 rounded-lg border border-hairline/40 px-3 py-1 text-[12px]",a?"bg-accent/15 text-accent":"text-ink-secondary hover:bg-raised/50 hover:text-ink","disabled:opacity-50"),children:t("engines.setCli")})]}),p&&e.jsx("div",{role:"status",className:"mt-1 text-[12px] text-success",children:t("engines.claudeUpdated",{version:p})}),x&&e.jsx("div",{role:"alert",className:"mt-1 text-[12px] text-danger",children:x}),r.shown&&e.jsx("div",{className:r.className,...r.exitProps,children:e.jsx(Ap,{instance:s,cliDefault:s.cliDefault,onClose:()=>i(!1),onSaved:n})})]})}function Xn({instance:s,action:n}){const{state:a,dispatch:i,refreshInstances:r}=G(),[c,o]=l.useState(!1),[d,u]=l.useState(!1),[p,m]=l.useState(null),x=n==="remove",h=x?a.bots.filter(y=>y.modelSelection.instanceId===s.instanceId).length:0,f=t(x?"accounts.remove":"accounts.signOut"),b=async()=>{o(!1),u(!0),m(null);try{const y=`/api/instances/${encodeURIComponent(s.instanceId)}${x?"":"/auth/sign-out"}`,{instances:g}=await F(y,{method:x?"DELETE":"POST"});Array.isArray(g)?i({type:"instances",instances:g}):await r()}catch(y){m(y instanceof Error?y.message:String(y))}finally{u(!1)}};return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("button",{type:"button",disabled:d||h>0,onClick:()=>o(!0),className:O("rounded-lg px-2.5 py-1.5 text-[12px] font-medium disabled:cursor-not-allowed disabled:opacity-50",x?"text-danger hover:bg-danger/10":"text-ink-secondary hover:bg-raised hover:text-ink"),children:d?e.jsx(q,{size:13,className:"animate-spin"}):f}),h>0&&e.jsx("p",{className:"text-[11px] text-ink-secondary",children:t("accounts.inUse",{count:String(h)})})]}),p&&e.jsx("p",{role:"alert",className:"text-[12px] text-danger",children:p}),e.jsx(ut,{open:c,title:t(x?"accounts.removeTitle":"accounts.signOutTitle",{name:s.displayName}),body:t(x?"accounts.removeBodyAntigravity":"accounts.signOutBody"),confirmLabel:f,tone:"neutral",pending:d,onCancel:()=>{d||o(!1)},onConfirm:()=>{b()}})]})}function Pp({source:s}){const{state:n}=G(),[a,i]=l.useState(null),r=a?n.instances.find(c=>c.instanceId===a&&c.snapshot.authenticated!==!0):void 0;return e.jsxs(e.Fragment,{children:[e.jsx(Qi,{label:t("engineSetup.antigravity.addAccount"),endpoint:"/api/instances/antigravity-accounts",extra:{sourceInstanceId:s.instanceId},onAdded:i}),r&&e.jsx("div",{"data-antigravity-added":r.instanceId,children:e.jsx(Vt,{instance:r,unframed:!0})})]})}function Ip({instance:s,bare:n=!1}){const a=s.policy&&e.jsxs("p",{className:"mb-2 text-[12px] leading-relaxed text-ink-secondary",children:[e.jsx("span",{className:"font-medium text-ink",children:t("policy.managedBy",{organization:s.policy.organizationName})})," · ",s.policy.reason]});return s.trialCredit?e.jsx(zt,{instance:s,bare:n,children:e.jsx("p",{"data-trial-credit":s.trialCredit,className:"text-[13px] leading-relaxed text-ink-secondary",children:t(s.trialCredit==="used_up"?"engines.trialCreditUsedUp":s.trialCredit==="ended"?"engines.trialCreditEnded":$e(s)?"engines.trialCredit":"engines.trialCreditOwn")})}):s.readOnly?e.jsxs(zt,{instance:s,bare:n,children:[a,e.jsx("p",{className:"text-[13px] leading-relaxed text-ink-secondary",children:t("organization.managedEngine")}),!$e(s)&&e.jsx("p",{className:"mt-2 text-[12px] text-ink-secondary",children:t("organization.engineUnavailable")})]}):e.jsxs(zt,{instance:s,bare:n,children:[a,!$e(s)&&e.jsx(Vt,{instance:s,intent:s.access==="custom"?"inject":"cloud",description:s.codexEndpoint?t("agentEndpoints.codexHint"):void 0,unframed:!0}),$e(s)&&e.jsx(ao,{instance:s,className:"mt-3"}),$e(s)&&s.serverKind==="ollama"&&e.jsx(io,{instance:s,className:"mt-3"}),$e(s)&&e.jsx(ro,{instance:s,className:"mt-3"}),s.snapshot.update&&e.jsx(si,{update:s.snapshot.update,instance:s,className:"mt-3",quiet:!0}),s.snapshot.warning&&e.jsx(ni,{warning:s.snapshot.warning,className:"mt-3"}),$e(s)&&s.snapshot.authenticated===!0&&(s.authentication?.method==="device-code"?e.jsxs("p",{className:"flex items-center gap-1.5 text-[12px] text-success",children:[e.jsx(ve,{size:13}),t(lo[ti(s.driverKind)].connectedAccount)]}):s.authentication?.method==="paste-code"&&e.jsxs("p",{className:"flex items-center gap-1.5 text-[12px] text-success",children:[e.jsx(ve,{size:13}),t("engineSetup.claude.connectedAccount")]})),s.freeUpSpace&&e.jsx(Ep,{instance:s}),s.driverKind==="antigravityAgent"&&e.jsxs("div",{className:"mt-3 space-y-3",children:[s.snapshot.authenticated&&e.jsx("p",{className:"break-words text-[12px] text-ink-secondary",children:s.snapshot.account?.email??t("engineSetup.antigravity.emailUnavailable")}),e.jsx(Pp,{source:s}),s.snapshot.authenticated===!0&&s.authentication?.signOut===!0&&e.jsx(Xn,{instance:s,action:"signOut"}),s.instanceId.startsWith("antigravity-")&&e.jsx(Xn,{instance:s,action:"remove"})]}),e.jsx(tr,{instance:s})]})}function Rp(s,n){return n?s.snapshot.authenticated===!0&&s.snapshot.account?.email?s.snapshot.account.email:t("onboarding.engines.ready"):s.snapshot.ollama?no(s.snapshot.ollama):s.snapshot.state==="available"&&s.snapshot.authenticated===!1?t("model.signInRequired"):t("onboarding.engines.needsSetup")}function Tp({rows:s,isReady:n,renderEngine:a,more:i}){const[r,c]=l.useState(null),o=s.filter(u=>n(u)||u.authentication!==void 0),d=s.filter(u=>!o.includes(u));return e.jsxs(e.Fragment,{children:[e.jsx(Ce,{label:t("settings.simple.ai.yours"),actions:e.jsx(ii,{}),children:e.jsx(Ee,{children:o.map(u=>{const p=n(u),m=r===u.instanceId;return e.jsxs("div",{"data-simple-engine":u.instanceId,className:"group",children:[e.jsxs("div",{className:"flex min-h-11 flex-wrap items-center gap-x-5 gap-y-2 px-4 py-2.5",children:[e.jsxs("span",{className:"flex min-w-[min(100%,15rem)] flex-1 items-center gap-3",children:[e.jsx(Cn,{instance:u,size:14,subtle:!0}),e.jsxs("span",{className:"flex min-w-0 flex-col gap-0.5",children:[e.jsx("span",{className:"truncate text-[14px] leading-5 text-ink",children:u.displayName}),e.jsx("span",{className:"truncate text-[13px] leading-[18px] text-ink-secondary",children:Rp(u,p)})]})]}),e.jsx("button",{type:"button","aria-expanded":m,className:"ui-button ml-auto shrink-0",onClick:()=>c(m?null:u.instanceId),children:t(m?"common.done":p?"settings.simple.ai.manage":"settings.simple.ai.setUp")})]}),m&&e.jsx("div",{className:"px-4 pb-3",children:a(u,!0)})]},u.instanceId)})})}),d.length>0&&e.jsx(qt,{title:t("settings.simple.ai.more",{count:String(d.length)}),trailing:e.jsx("span",{"aria-hidden":"true",className:"flex items-center -space-x-1",children:d.slice(0,4).map(u=>e.jsx("span",{className:"flex size-[18px] items-center justify-center rounded-full bg-menu",children:e.jsx(Cn,{instance:u,size:14,subtle:!0})},u.instanceId))}),...i,children:e.jsx(ri,{instances:d,isReady:n,renderEngine:u=>a(u)})})]})}function Bp(){const{state:s,refreshInstances:n}=G(),[a,i]=l.useState([]),[r,c]=l.useState(null),[o,d]=l.useState(null);if(l.useEffect(()=>{let p=!0;return F("/api/instances/hidden").then(m=>{p&&i(Array.isArray(m?.instances)?m.instances:[])}).catch(()=>{}),()=>{p=!1}},[s.instances]),a.length===0)return null;const u=p=>{c(p),d(null),F(`/api/instances/${encodeURIComponent(p)}`,{method:"PATCH",body:JSON.stringify({hidden:!1})}).then(()=>Promise.resolve(n()).catch(()=>{})).catch(m=>d(m.message)).finally(()=>c(null))};return e.jsxs("details",{"data-hidden-engines":!0,className:"px-4",children:[e.jsx("summary",{className:"cursor-pointer text-[13px] font-medium text-ink-secondary hover:text-ink",children:t("engines.hiddenTitle",{count:String(a.length)})}),e.jsx("p",{className:"mt-2 text-[12px] text-ink-secondary",children:t("engines.hiddenHint")}),e.jsx("div",{className:"mt-2 flex flex-col gap-1.5",children:a.map(p=>e.jsxs("div",{className:"flex items-center justify-between gap-3 rounded-lg border border-hairline/40 bg-inset px-3 py-2",children:[e.jsx("span",{className:"min-w-0 truncate text-[13px] text-ink",children:p.displayName}),e.jsx("button",{type:"button","data-unhide-engine":p.instanceId,disabled:r!==null,onClick:()=>u(p.instanceId),className:"shrink-0 text-[12px] font-medium text-accent hover:underline disabled:opacity-50",children:r===p.instanceId?t("engines.unhiding"):t("engines.unhide")})]},p.instanceId))}),o&&e.jsx("div",{role:"alert",className:"mt-1 text-[12px] text-danger",children:o})]})}function sr({simple:s=!1,more:n}){const{state:a}=G();l.useEffect(()=>to,[]);const i=a.instances.filter(h=>h.readOnly||h.cli!==void 0||h.cliDefault!==void 0||h.snapshot.state==="unavailable"||so(h)||h.claudeEndpoint!==void 0||h.claudeBedrock!==void 0||h.codexEndpoint!==void 0),r=new Map;for(const h of i){const f=ps(h);f&&r.set(f,[...r.get(f)??[],h])}const c=h=>{const f=ps(h);return f&&r.get(f)?.[0]===h?f:null},o=i.filter(h=>!ps(h)||c(h)),d=o.length>0&&o.every(h=>h.readOnly),u=!r.has("chatgpt")&&!d,p=!r.has("claude")&&!d,m=h=>{const f=c(h);return f?Xi(r.get(f)):$e(h)},x=(h,f=!1)=>{const b=c(h);return b?e.jsx(bp,{group:b,accounts:r.get(b),bare:f,advanced:e.jsxs(e.Fragment,{children:[b==="claude"?e.jsxs(e.Fragment,{children:[e.jsx(ms,{}),e.jsx(hs,{})]}):e.jsx(xs,{}),e.jsx(tr,{instance:h})]})}):e.jsx(Ip,{instance:h,bare:f})};return s&&n?e.jsxs(e.Fragment,{children:[e.jsx(Tp,{rows:o,isReady:m,renderEngine:x,more:n}),p&&e.jsxs("div",{className:"px-4",children:[e.jsx(ms,{}),e.jsx(hs,{})]}),u&&e.jsx("div",{className:"px-4",children:e.jsx(xs,{})})]}):e.jsxs("div",{className:"flex min-w-0 flex-col gap-6 pb-2",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0 flex-1 basis-60 space-y-2 px-4",children:[e.jsx("h1",{className:"text-[22px] font-semibold tracking-tight text-ink",children:t("settings.engines.title")}),e.jsx("p",{className:"mt-2 max-w-lg text-[13px] leading-relaxed text-ink-secondary",children:t("engines.library.intro")})]}),e.jsx(ii,{})]}),e.jsx(ri,{instances:o,isReady:m,renderEngine:x}),p&&e.jsxs("div",{className:"px-4",children:[e.jsx(ms,{}),e.jsx(hs,{})]}),u&&e.jsx("div",{className:"px-4",children:e.jsx(xs,{})}),e.jsx(Bp,{}),e.jsx(er,{})]})}const Lp={status:"/api/local-computer","local-vms":"/api/local-computer/instances",cloud:"/api/computers/boxes",vps:"/api/computers/vps"};function At(s,n){return[Lp[s],{signal:n}]}function sn(s,n){return[s,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(n)}]}function Op({instances:s,configured:n,aliases:a,loading:i,removingName:r,error:c,unavailableReason:o,onRefresh:d,onRemove:u}){return e.jsxs(X,{title:t("vm.vps.title"),subtitle:t("vm.vps.subtitle"),children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsx("div",{className:"text-[12px] text-ink-secondary",children:n===!0?t("vm.vps.sshHost",{alias:a.join(", ")||t("vm.vps.configuredFallback")}):n===!1?e.jsxs(e.Fragment,{children:[t("vm.vps.needsAlias")," ",e.jsx(li,{id:"vps"})]}):t("vm.vps.refreshHint")}),e.jsxs("button",{type:"button",onClick:d,disabled:i||r!==null,"aria-label":t("vm.vps.refreshAria"),className:"flex shrink-0 items-center gap-1.5 rounded-lg border border-hairline/40 px-2.5 py-1.5 text-[12px] text-ink-secondary hover:bg-control hover:text-ink disabled:opacity-40",children:[e.jsx(De,{size:12,className:O(i&&"animate-spin")})," ",t("vm.refresh")]})]}),c&&e.jsx("div",{role:"alert",className:"mt-3 rounded-lg bg-danger/10 px-3 py-2 text-[12px] text-danger",children:c}),e.jsx("p",{role:"status","aria-live":"polite","aria-atomic":"true",className:"sr-only",children:i?t("vm.vps.checking"):o?t("vm.vps.unavailable",{reason:o}):n===!1?t("vm.vps.notConfigured"):s.length===1?t("vm.vps.foundOne"):t("vm.vps.foundMany",{count:s.length})}),!(n===!1&&!i&&!o)&&e.jsxs("div",{"aria-busy":i||r!==null,className:"mt-3 overflow-hidden rounded-xl border border-hairline/40",children:[o&&s.length>0&&e.jsxs("div",{className:"flex items-center gap-2 border-b border-hairline/35 px-3 py-2.5 text-[12px] text-ink-secondary",children:[e.jsx(Ge,{size:14,className:"shrink-0 text-warning"})," ",o]}),i&&s.length===0?e.jsxs("div",{className:"flex items-center gap-2 px-3 py-4 text-[13px] text-ink-secondary",children:[e.jsx(q,{size:13,className:"animate-spin"})," ",t("vm.vps.checkingList")]}):o&&s.length===0?e.jsxs("div",{className:"flex items-center gap-2 px-3 py-4 text-[13px] text-ink-secondary",children:[e.jsx(Ge,{size:14,className:"shrink-0 text-warning"})," ",o]}):n===!1?e.jsxs("div",{className:"flex items-center gap-2 px-3 py-4 text-[13px] text-ink-secondary",children:[e.jsx(ud,{size:14,className:"shrink-0"})," ",t("vm.vps.notConfigured")]}):s.length===0?e.jsx("div",{className:"px-3 py-4 text-[13px] text-ink-secondary",children:t("vm.vps.noneFound")}):s.map((p,m)=>{const x=Wp(p),h=nn(x),f=r===p.name,b=an(p.name);return e.jsxs("div",{className:O("flex items-start justify-between gap-3 px-3 py-3",m>0&&"border-t border-hairline/35"),children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:"truncate text-[14px] font-medium text-ink",children:p.orphaned?t("vm.vps.orphan",{id:b}):p.ownerName}),e.jsx("span",{className:O("rounded-full px-2 py-0.5 text-[11px]",p.inUse||x==="running"?"bg-success/15 text-success":x==="stopped"||x==="paused"?"bg-control text-ink-secondary":"bg-warning/15 text-warning"),children:h}),a.length>1&&e.jsx("span",{className:"rounded-full bg-control px-2 py-0.5 font-mono text-[11px] text-ink-secondary",children:p.vpsAlias})]}),e.jsx("div",{className:"mt-1 text-[12px] text-ink-secondary",children:p.orphaned?t("vm.owner.gone"):t("vm.owner.owned")}),p.inUse&&e.jsx("div",{className:"mt-1 text-[12px] text-ink-secondary",children:t("vm.vps.stopFirst")})]}),e.jsxs("button",{type:"button",onClick:()=>u(p),disabled:i||p.inUse||r!==null,"aria-busy":f||void 0,title:t("vm.vps.removeTitle"),className:"flex shrink-0 items-center gap-1.5 rounded-lg bg-danger/10 px-2.5 py-1.5 text-[12px] font-medium text-danger hover:bg-danger/15 disabled:cursor-not-allowed disabled:opacity-40",children:[f?e.jsx(q,{size:12,className:"animate-spin"}):e.jsx(Le,{size:12}),t("vm.vps.remove")]})]},`${p.vpsAlias??""}:${p.name}`)})]})]})}const zp=[1e3,2e3,4e3];function Mp(s){return new Promise(n=>window.setTimeout(n,s))}const Fp={auto:"vm.dest.auto",cloud:"place.cloud",vm:"vm.dest.vm",local:"vm.dest.local",browser:"vm.dest.browser",off:"vm.dest.off"},Dp={unmanaged:"vm.state.notManaged","in-use":"vm.state.inUse",stopped:"vm.state.stopped",running:"vm.state.running",attention:"vm.state.attention",sleeping:"vm.state.sleeping","going-to-sleep":"vm.state.goingToSleep",starting:"vm.state.starting",restarting:"vm.state.restarting",removing:"vm.state.removing",paused:"vm.state.paused"};function nn(s){return t(Dp[s])}function Up(s){return s.managed?s.inUse?"in-use":s.container==="stopped"?"stopped":s.ready?"running":"attention":"unmanaged"}function _p(s){return nn(Up(s))}function $p(s){return s.inUse?"in-use":s.state==="removing"?"removing":s.state==="archived"?"sleeping":s.state==="archiving"?"going-to-sleep":["idle","ready","running"].includes(s.state)?"running":["init","provisioning","provisioned","cloning"].includes(s.state)?"starting":"attention"}function nr(s,n,a){const i={...a},r=new Set(s.map(o=>o.boxId)),c=s.flatMap(o=>{const d=a[o.boxId];return d==="deleted"?[]:d==="deleting"?[{...o,state:"removing"}]:d!=="sleeping"?[o]:o.state==="archived"?(delete i[o.boxId],[o]):[{...o,state:"archived"}]});for(const o of n)a[o.boxId]!=="sleeping"||r.has(o.boxId)||c.push({...o,state:"archived"});for(const[o,d]of Object.entries(a))(d==="deleted"||d==="deleting")&&!r.has(o)&&delete i[o];return{instances:c,overrides:i}}function Kp(s,n,a){return s.configured!==!0||s.available!==!0?{instances:n,overrides:{...a}}:nr(Array.isArray(s.instances)?s.instances:[],n,a)}function Hp(s){return["idle","ready","running"].includes(s.state)}function Wp(s){return s.inUse?"in-use":s.state==="running"?"running":s.state==="restarting"?"restarting":s.state==="removing"?"removing":["created","exited"].includes(s.state)?"stopped":s.state==="paused"?"paused":"attention"}function an(s){const n=/-([a-f0-9]{12})$/i.exec(s)?.[1];return n?n.slice(-8).toLowerCase():"unknown"}function Gp(s){return{confirmation:t("vm.confirm.deleteBotVm",{name:s.name}),request:sn(`/api/bots/${s.botId}/local-computer/remove`,{})}}function Vp(s,n){return{confirmation:s==="delete"?t("vm.confirm.deleteCloud",{subject:n.orphaned?t("vm.confirm.orphanCloud"):t("vm.confirm.ownedCloud",{name:n.ownerName??""})}):null,request:sn(`/api/computers/boxes/${encodeURIComponent(n.boxId)}/${s}`,s==="delete"?{confirmName:n.name}:{})}}function qp(s){const n=an(s.name);return{confirmation:t("vm.confirm.removeVps",{subject:s.orphaned?t("vm.confirm.orphanVps",{id:n}):t("vm.confirm.ownedVps",{name:s.ownerName??""})}),request:sn(`/api/computers/vps/${encodeURIComponent(s.name)}/remove`,{confirmName:s.name,alias:s.vpsAlias})}}function fs(s,n){return s.confirmation!==null&&!n(s.confirmation)?null:s.request}function Jp({instances:s,configured:n,loading:a,pending:i,error:r,unavailableReason:c,onRefresh:o,onSleep:d,onDelete:u}){return e.jsxs(X,{title:t("vm.cloud.title"),subtitle:t("vm.cloud.subtitle"),children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsx("div",{className:"text-[12px] text-ink-secondary",children:n===!0?t("vm.cloud.includesOrphans"):n===!1?e.jsxs(e.Fragment,{children:[t("vm.cloud.needsKey")," ",e.jsx(li,{id:"box"})]}):t("vm.cloud.refreshHint")}),e.jsxs("button",{type:"button",onClick:o,disabled:a||i!==null,"aria-label":t("vm.cloud.refreshAria"),className:"flex shrink-0 items-center gap-1.5 rounded-lg border border-hairline/40 px-2.5 py-1.5 text-[12px] text-ink-secondary hover:bg-control hover:text-ink disabled:opacity-40",children:[e.jsx(De,{size:12,className:O(a&&"animate-spin")})," ",t("vm.refresh")]})]}),r&&e.jsx("div",{role:"alert",className:"mt-3 rounded-lg bg-danger/10 px-3 py-2 text-[12px] text-danger",children:r}),e.jsx("p",{role:"status","aria-live":"polite","aria-atomic":"true",className:"sr-only",children:a?t("vm.cloud.checking"):c?t("vm.cloud.unavailable",{reason:c}):n===!1?t("vm.cloud.notConnected"):s.length===1?t("vm.cloud.foundOne"):t("vm.cloud.foundMany",{count:s.length})}),!(n===!1&&!a&&!c)&&e.jsx("div",{"aria-busy":a||i!==null,className:"mt-3 overflow-hidden rounded-xl border border-hairline/40",children:a&&s.length===0?e.jsxs("div",{className:"flex items-center gap-2 px-3 py-4 text-[13px] text-ink-secondary",children:[e.jsx(q,{size:13,className:"animate-spin"})," ",t("vm.cloud.checkingList")]}):c?e.jsxs("div",{className:"flex items-center gap-2 px-3 py-4 text-[13px] text-ink-secondary",children:[e.jsx(Ge,{size:14,className:"shrink-0 text-warning"})," ",c]}):n===!1?e.jsxs("div",{className:"flex items-center gap-2 px-3 py-4 text-[13px] text-ink-secondary",children:[e.jsx(Ds,{size:14,className:"shrink-0"})," ",t("vm.cloud.notConnected")]}):s.length===0?e.jsx("div",{className:"px-3 py-4 text-[13px] text-ink-secondary",children:t("vm.cloud.noneFound")}):s.map((p,m)=>{const x=$p(p),h=nn(x),f=i?.boxId===p.boxId,b=Hp(p),y=x==="removing";return e.jsxs("div",{className:O("flex items-start justify-between gap-3 px-3 py-3",m>0&&"border-t border-hairline/35"),children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:"truncate text-[14px] font-medium text-ink",children:p.orphaned?t("vm.cloud.orphan"):p.ownerName}),e.jsx("span",{className:O("rounded-full px-2 py-0.5 text-[11px]",p.inUse||x==="running"?"bg-success/15 text-success":x==="sleeping"||x==="going-to-sleep"?"bg-control text-ink-secondary":"bg-warning/15 text-warning"),children:h})]}),e.jsxs("div",{className:"mt-1 break-all text-[12px] text-ink-secondary",children:[p.orphaned?t("vm.owner.gone"):t("vm.owner.owned")," · ",p.name]}),p.inUse&&e.jsx("div",{className:"mt-1 text-[12px] text-ink-secondary",children:t("vm.cloud.stopFirst")})]}),e.jsxs("div",{className:"flex shrink-0 items-center gap-1.5",children:[e.jsxs("button",{type:"button",onClick:()=>d(p),disabled:a||p.inUse||i!==null||!b,"aria-busy":f&&i?.action==="sleep"?!0:void 0,title:b?t("vm.cloud.sleepTitle"):t("vm.cloud.sleepBlocked",{state:h.toLowerCase()}),className:"flex items-center gap-1.5 rounded-lg border border-hairline/40 px-2.5 py-1.5 text-[12px] text-ink-secondary hover:bg-control hover:text-ink disabled:cursor-not-allowed disabled:opacity-40",children:[f&&i?.action==="sleep"?e.jsx(q,{size:12,className:"animate-spin"}):e.jsx(pd,{size:12}),t("vm.cloud.sleep")]}),e.jsxs("button",{type:"button",onClick:()=>u(p),disabled:a||p.inUse||i!==null||y,"aria-busy":f&&i?.action==="delete"?!0:void 0,title:t("vm.cloud.deleteTitle"),className:"flex items-center gap-1.5 rounded-lg bg-danger/10 px-2.5 py-1.5 text-[12px] font-medium text-danger hover:bg-danger/15 disabled:cursor-not-allowed disabled:opacity-40",children:[f&&i?.action==="delete"?e.jsx(q,{size:12,className:"animate-spin"}):e.jsx(Le,{size:12}),t("common.delete")]})]})]},p.boxId)})})]})}function Yp({instances:s,maxInstances:n,loading:a,deletingBotId:i,error:r,unavailableReason:c,onRefresh:o,onDelete:d}){return e.jsxs(X,{title:t("vm.perBot.title"),subtitle:t("vm.perBot.subtitle",{count:c?t("vm.perBot.inventoryUnavailable"):t("vm.perBot.created",{count:s.length,max:n})}),children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsx("div",{className:"text-[12px] text-ink-secondary",children:t("vm.perBot.deleteHint")}),e.jsxs("button",{type:"button",onClick:o,disabled:a||i!==null,"aria-label":t("vm.perBot.refreshAria"),className:"flex shrink-0 items-center gap-1.5 rounded-lg border border-hairline/40 px-2.5 py-1.5 text-[12px] text-ink-secondary hover:bg-control hover:text-ink disabled:opacity-40",children:[e.jsx(De,{size:12,className:O(a&&"animate-spin")})," ",t("vm.refresh")]})]}),r&&e.jsx("div",{role:"alert",className:"mt-3 rounded-lg bg-danger/10 px-3 py-2 text-[12px] text-danger",children:r}),e.jsx("p",{role:"status","aria-live":"polite","aria-atomic":"true",className:"sr-only",children:a?t("vm.perBot.checking"):c?t("vm.perBot.unavailable",{reason:c}):s.length===1?t("vm.perBot.foundOne"):t("vm.perBot.foundMany",{count:s.length})}),e.jsx("div",{"aria-busy":a||i!==null,className:"mt-3 overflow-hidden rounded-xl border border-hairline/40",children:a&&s.length===0?e.jsxs("div",{className:"flex items-center gap-2 px-3 py-4 text-[13px] text-ink-secondary",children:[e.jsx(q,{size:13,className:"animate-spin"})," ",t("vm.perBot.checkingList")]}):c?e.jsxs("div",{className:"flex items-center gap-2 px-3 py-4 text-[13px] text-ink-secondary",children:[e.jsx(Ge,{size:14,className:"shrink-0 text-warning"})," ",c]}):s.length===0?e.jsx("div",{className:"px-3 py-4 text-[13px] text-ink-secondary",children:t("vm.perBot.none")}):s.map((u,p)=>{const m=_p(u),x=i===u.botId,h=u.managed===!0;return e.jsxs("div",{className:O("flex items-start justify-between gap-3 px-3 py-3",p>0&&"border-t border-hairline/35"),children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:"truncate text-[14px] font-medium text-ink",children:u.name}),e.jsx("span",{className:O("rounded-full px-2 py-0.5 text-[11px]",h?u.inUse||u.ready?"bg-success/15 text-success":u.container==="stopped"?"bg-control text-ink-secondary":"bg-warning/15 text-warning":"bg-warning/15 text-warning"),children:m})]}),e.jsx("div",{className:"mt-1 text-[12px] text-ink-secondary",children:t("vm.perBot.destination",{destination:t(Fp[u.destination])})}),!h&&e.jsx("div",{className:"mt-1 text-[12px] text-warning",children:t("vm.perBot.unmanaged")}),h&&u.problem&&!u.inUse&&e.jsx("div",{className:"mt-1 text-[12px] text-warning",children:Ei(u.problem)}),h&&u.inUse&&e.jsx("div",{className:"mt-1 text-[12px] text-ink-secondary",children:t("vm.perBot.stopFirst")})]}),h&&e.jsxs("button",{type:"button",onClick:()=>d(u),disabled:a||u.inUse||i!==null,"aria-busy":x||void 0,title:u.inUse?t("vm.perBot.deleteBlocked"):t("vm.perBot.deleteTitle",{name:u.name}),className:"flex shrink-0 items-center gap-1.5 rounded-lg bg-danger/10 px-2.5 py-1.5 text-[12px] font-medium text-danger hover:bg-danger/15 disabled:cursor-not-allowed disabled:opacity-40",children:[x?e.jsx(q,{size:12,className:"animate-spin"}):e.jsx(Le,{size:12}),t("common.delete")]})]},u.botId)})})]})}function Pt({n:s,title:n,done:a,children:i}){return e.jsxs("div",{className:"flex gap-3",children:[e.jsx("div",{className:O("mt-0.5 flex size-5 shrink-0 items-center justify-center rounded-full text-[11px]",a?"bg-success/20 text-success":"border border-hairline/50 text-ink-secondary"),children:a?e.jsx(ve,{size:12}):s}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:O("text-[14px]",a?"text-ink-secondary line-through":"text-ink"),children:n}),!a&&i&&e.jsx("div",{className:"mt-2 flex flex-col items-start gap-2 [&>*]:max-w-full",children:i})]})]})}function rt({action:s,pending:n,children:a,onClick:i,danger:r=!1}){return e.jsxs("button",{onClick:i,"aria-busy":n===s,disabled:n!==null,className:O("flex items-center gap-1.5 rounded-lg px-3 py-1.5 text-[13px] font-medium disabled:opacity-50",r?"bg-danger/15 text-danger hover:bg-danger/20":"bg-accent text-white hover:brightness-110"),children:[n===s&&e.jsx(q,{size:13,className:"animate-spin"}),a]})}const ar=5,ir=1440,Xp=480;function Qp(s){const n=s.trim();if(!/^\d+$/.test(n))return null;const a=Number(n);return a>=ar&&a<=ir?a:null}function Zp({minutes:s,disabled:n,onSave:a}){const[i,r]=l.useState(String(s)),[c,o]=l.useState(!1),[d,u]=l.useState(""),[p,m]=l.useState(!1);l.useEffect(()=>{c||r(String(s))},[s,c]);const x=async()=>{if(!c||p)return;const h=Qp(i);if(h===null){u(t("vm.idle.range"));return}m(!0);try{await a(h),r(String(h)),o(!1),u("")}catch(f){u(f instanceof Error?f.message:t("vm.idle.error"))}finally{m(!1)}};return e.jsxs("div",{className:"mt-3",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"local-vm-idle-timeout",className:"text-[13px] text-ink",children:t("vm.idle.label")}),e.jsx("div",{id:"local-vm-idle-timeout-help",className:"text-[12px] text-ink-secondary",children:t("vm.idle.detail")})]}),e.jsxs("div",{className:O("flex w-[150px] shrink-0 items-center rounded-lg border bg-control",d?"border-danger/60":"border-hairline/40 focus-within:border-focus"),children:[e.jsx("input",{id:"local-vm-idle-timeout",type:"number",min:ar,max:ir,step:1,inputMode:"numeric",value:i,disabled:n||p,"aria-invalid":!!d,"aria-describedby":d?"local-vm-idle-timeout-error local-vm-idle-timeout-help":"local-vm-idle-timeout-help",onChange:h=>{r(h.target.value),o(!0),u("")},onBlur:()=>{x()},onKeyDown:h=>{h.key==="Enter"&&h.currentTarget.blur()},className:"min-w-0 flex-1 bg-transparent px-2.5 py-1.5 text-[13px] tabular-nums text-ink focus:outline-none disabled:opacity-50"}),e.jsx("span",{className:"pr-2.5 text-[13px] text-ink-secondary",children:t("vm.idle.minutes")})]})]}),d?e.jsx("p",{id:"local-vm-idle-timeout-error",role:"alert",className:"mt-1.5 text-[12px] text-danger",children:d}):null]})}function rr(){const s=G().state.config?.cloudHome===!0,[n,a]=l.useState(null),[i,r]=l.useState(!0),[c,o]=l.useState(null),d=l.useRef(null);l.useEffect(()=>()=>d.current?.abort(),[]);const[u,p]=l.useState(null),[m,x]=l.useState(!1),[h,f]=l.useState(0),[b,y]=l.useState([]),[g,v]=l.useState(2),[C,w]=l.useState(!1),[N,I]=l.useState(null),[j,L]=l.useState(null),[k,P]=l.useState(null),[S,M]=l.useState(0),[se,ne]=l.useState([]),[V,ie]=l.useState(null),[re,oe]=l.useState(!0),[T,R]=l.useState(null),[E,D]=l.useState(null),[Q,le]=l.useState(null),[ae,U]=l.useState(0),te=l.useRef([]),me=l.useRef({}),[ce,xe]=l.useState([]),[de,je]=l.useState(null),[_,pe]=l.useState([]),[B,A]=l.useState(!0),[H,he]=l.useState(null),[W,Ne]=l.useState(null),[ze,qe]=l.useState(null),[$,ee]=l.useState(0),[Z,ue]=l.useState(""),be=l.useCallback(async z=>{const K=await fetch(...At("status",z)),J=await K.json().catch(()=>({}));if(!z?.aborted){if(!K.ok)throw new Error(J.error??t("vm.err.status",{code:K.status}));return a(J),p(null),J}},[]),Pe=l.useCallback(async z=>{const K=await fetch(...At("local-vms",z)),J=await K.json().catch(()=>({}));if(!K.ok)throw new Error(J.error??t("vm.err.inventory",{code:K.status}));const Y=J;y(Y.instances),v(Y.maxInstances),L(Y.available?null:Ei(Y.problem)??t("vm.err.runtimeUnavailable")),I(null)},[]),Je=l.useCallback(async z=>{const K=await fetch(...At("cloud",z)),J=await K.json().catch(()=>({}));if(!K.ok)throw new Error(J.error??t("vm.err.cloudInventory",{code:K.status}));const Y=J,we=Kp(Y,te.current,me.current);me.current=we.overrides,te.current=we.instances,ne(we.instances),ie(Y.configured===!0),D(Y.available||!Y.configured?null:Y.problem??t("vm.err.cloudUnavailable")),R(null)},[]),Ye=l.useCallback(async z=>{const K=await fetch(...At("vps",z)),J=await K.json().catch(()=>({}));if(!K.ok)throw new Error(J.error??t("vm.err.vpsInventory",{code:K.status}));const Y=J;xe(Array.isArray(Y.instances)?Y.instances:[]),je(Y.configured===!0),pe(Array.isArray(Y.vpsAliases)?Y.vpsAliases:[]),Ne(Y.available||!Y.configured?null:Y.problem??t("vm.err.vpsUnavailable")),he(null)},[]);l.useEffect(()=>{if(s)return;let z=!0,K,J;const Y=async()=>{J=new AbortController;try{await be(J.signal)}catch(we){z&&!(we instanceof DOMException&&we.name==="AbortError")&&(a(null),p(we instanceof Error?we.message:String(we)))}finally{z&&(r(!1),K=window.setTimeout(()=>{Y()},5e3))}};return Y(),()=>{z=!1,J?.abort(),K!==void 0&&window.clearTimeout(K)}},[s,be,h]),l.useEffect(()=>{if(n?.mode!=="per-bot"){y([]),w(!1),I(null),L(null);return}const z=new AbortController;return w(!0),Pe(z.signal).catch(K=>{K instanceof DOMException&&K.name==="AbortError"||I(K instanceof Error?K.message:String(K))}).finally(()=>{z.signal.aborted||w(!1)}),()=>z.abort()},[S,Pe,n?.mode]),l.useEffect(()=>{const z=new AbortController;return oe(!0),Je(z.signal).catch(K=>{K instanceof DOMException&&K.name==="AbortError"||D(K instanceof Error?K.message:String(K))}).finally(()=>{z.signal.aborted||oe(!1)}),()=>z.abort()},[ae,Je]),l.useEffect(()=>{const z=new AbortController;return A(!0),Ye(z.signal).catch(K=>{K instanceof DOMException&&K.name==="AbortError"||Ne(K instanceof Error?K.message:String(K))}).finally(()=>{z.signal.aborted||A(!1)}),()=>z.abort()},[Ye,$]);const ke=async(z,K)=>{const J=await fetch(`/api/local-computer/${z}`,{method:"POST",headers:{"content-type":"application/json"},body:"{}",signal:K}),Y=await J.json().catch(()=>({})),we={pull:"vm.err.prepare",run:"vm.err.create",start:"vm.err.start",stop:"vm.err.stop",remove:"vm.deleteError"};if(!J.ok)throw new Error(Y.error??t(we[z]));return K.throwIfAborted(),a(Y),Y},pt=z=>window.ogb?.confirm?window.ogb.confirm(z):window.confirm(z),Ue=async z=>{if(c!==null||d.current)return;const K=new AbortController;d.current=K,o(z),p(null);try{if(z==="remove"&&!await pt(t("vm.confirm.deleteShared"))||z==="recreate"&&!await pt(t("vm.confirm.recreate")))return;let J;if(z==="recreate"?(await ke("remove",K.signal),J=await ke("run",K.signal)):J=await ke(z,K.signal),(z==="run"||z==="start"||z==="recreate")&&(J=await Pd(J,async()=>await be(K.signal)??J,K.signal),!J.ready))throw new Error(J.problem??t("vm.err.start"));await be(),ue(z==="remove"?t("vm.announce.deleted"):z==="stop"?t("vm.announce.stopped"):t("vm.announce.updated"))}catch(J){if(K.signal.aborted)return;p(J instanceof Error?J.message:String(J))}finally{d.current=null,K.signal.aborted||o(null)}},Xe=async(z,K)=>{x(!0),p(null);try{const J=await fetch("/api/config",{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({localVm:{mode:z,maxInstances:K}})}),Y=await J.json().catch(()=>({}));if(!J.ok)throw new Error(Y.error??t("vm.policyError"));a(we=>we&&{...we,mode:z,max_instances:K}),await be()}catch(J){p(J instanceof Error?J.message:String(J))}finally{x(!1)}},wt=async z=>{const K=await fetch("/api/config",{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({localVm:{idleTimeoutMinutes:z}})}),J=await K.json().catch(()=>({}));if(!K.ok)throw new Error(J.error??t("vm.idle.error"));a(Y=>Y&&{...Y,idle_timeout_ms:z*6e4})},nt=async z=>{if(!z.managed){I(t("vm.unmanagedError"));return}const K=fs(Gp(z),J=>window.confirm(J));if(K){P(z.botId),I(null);try{const J=await fetch(...K),Y=await J.json().catch(()=>({}));if(!J.ok)throw new Error(Y.error??t("vm.deleteError"));await Pe(),ue(t("vm.announce.deletedBot",{name:z.name}))}catch(J){I(J instanceof Error?J.message:String(J))}finally{P(null)}}},Re=async(z,K)=>{const J=fs(Vp(z,K),Y=>window.confirm(Y));if(J){le({boxId:K.boxId,action:z}),R(null),ue("");try{const Y=await fetch(...J),we=await Y.json().catch(()=>({}));if(!Y.ok)throw new Error(we.error??t(z==="delete"?"vm.cloud.deleteError":"vm.cloud.sleepError"));const ns=z==="delete"&&we?.pending===!0;me.current={...me.current,[K.boxId]:z==="delete"?ns?"deleting":"deleted":"sleeping"};const as=nr(te.current,te.current,me.current);me.current=as.overrides,te.current=as.instances,ne(as.instances);const at=K.orphaned?t("vm.announce.orphanCloud"):t("vm.confirm.ownedCloud",{name:K.ownerName??""});if(ue(ns?`${at}: ${t("vm.state.removing")}.`:t(z==="delete"?"vm.announce.cloudDeleted":"vm.announce.cloudSleeping",{subject:at})),ns){for(const Me of zp){await Mp(Me);try{await Je()}catch{}if(me.current[K.boxId]!=="deleting"){ue(t("vm.announce.cloudDeleted",{subject:at}));return}}const it={...me.current};delete it[K.boxId],me.current=it;const Ct=te.current.map(Me=>Me.boxId===K.boxId?{...Me,state:K.state}:Me);te.current=Ct,ne(Ct);try{await Je(),te.current.some(Me=>Me.boxId===K.boxId)||ue(t("vm.announce.cloudDeleted",{subject:at}))}catch(Me){const al=Me instanceof Error?Me.message:String(Me);R(`${at}: ${t("vm.state.removing")}. ${al}`)}return}try{await Je()}catch(it){const Ct=it instanceof Error?it.message:String(it);R(t(z==="delete"?"vm.cloud.deletedRefreshError":"vm.cloud.sleepRefreshError",{subject:at,detail:Ct}))}}catch(Y){R(Y instanceof Error?Y.message:String(Y))}finally{le(null)}}},St=async z=>{const K=an(z.name),J=fs(qp(z),Y=>window.confirm(Y));if(J){qe(z.name),he(null);try{const Y=await fetch(...J),we=await Y.json().catch(()=>({}));if(!Y.ok)throw new Error(we.error??t("vm.vpsRemoveError"));await Ye(),ue(t("vm.announce.vpsRemoved",{subject:z.orphaned?t("vm.announce.orphanVps",{id:K}):t("vm.confirm.ownedVps",{name:z.ownerName??""})}))}catch(Y){he(Y instanceof Error?Y.message:String(Y))}finally{qe(null)}}},Ie=n?.commands,Qe=n?.ready===!0,_e=n?.container!=="missing",mn=!!(_e&&(!n?.imageMatches||!n?.managed||n?.network==="unsafe"||n?.security==="unsafe"||n?.persistence==="unsafe")),xn=!i&&!n,hn=n?.platform==="darwin"?t("vm.host.mac"):t("vm.host.computer"),Te=n?.mode==="per-bot",ts=Te&&n?.runtime==="container",ss=Te?!!(n?.daemonUp&&n?.image&&!ts):Qe;return e.jsxs(e.Fragment,{children:[e.jsx("p",{role:"status","aria-live":"polite","aria-atomic":"true",className:"sr-only",children:Z}),e.jsx(Jp,{instances:se,configured:V,loading:re,pending:Q,error:T,unavailableReason:E,onRefresh:()=>U(z=>z+1),onSleep:z=>{Re("sleep",z)},onDelete:z=>{Re("delete",z)}}),e.jsx(Op,{instances:ce,configured:de,aliases:_,loading:B,removingName:ze,error:H,unavailableReason:W,onRefresh:()=>ee(z=>z+1),onRemove:z=>{St(z)}}),e.jsx(Ad,{}),!s&&e.jsxs(e.Fragment,{children:[e.jsxs(X,{title:t("vm.main.title"),subtitle:Te?t("vm.main.perBotSubtitle",{host:hn}):t("vm.main.sharedSubtitle",{host:hn}),children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsxs("span",{"aria-live":"polite",className:O("flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[13px]",ss?"bg-success/15 text-success":"bg-control text-ink-secondary"),children:[i?e.jsx(q,{size:12,className:"animate-spin"}):ss?e.jsx(ve,{size:12}):e.jsx(oo,{size:9}),i?t("common.checking"):xn?t("vm.main.statusUnavailable"):Te&&ss?t("vm.main.readyPerBot"):ts?t("vm.main.perBotUnsupported"):Qe?t("vm.main.ready"):n?.problem??t("vm.main.notReady")]}),e.jsxs("button",{onClick:()=>{r(!0),f(z=>z+1),M(z=>z+1)},disabled:i||c!==null,className:"flex items-center gap-1.5 rounded-lg border border-hairline/40 px-2.5 py-1 text-[13px] text-ink-secondary hover:bg-control hover:text-ink disabled:opacity-40",children:[e.jsx(De,{size:12})," ",t("vm.main.recheck")]}),Qe&&!Te&&e.jsxs("a",{href:n?.viewer_url??Ie?.view,target:"_blank",rel:"noreferrer",className:"flex items-center gap-1.5 rounded-lg border border-hairline/40 px-2.5 py-1 text-[13px] text-ink hover:bg-control",children:[e.jsx(Nt,{size:12})," ",t("vm.main.watch")]})]}),u&&e.jsx("div",{role:"alert",className:"mt-3 rounded-lg bg-danger/10 px-3 py-2 text-[12px] text-danger",children:u})]}),e.jsxs(X,{title:t("vm.isolation.title"),subtitle:t("vm.isolation.subtitle"),children:[e.jsx("div",{className:"flex overflow-hidden rounded-lg border border-hairline/40",children:["shared","per-bot"].map((z,K)=>e.jsx("button",{type:"button",disabled:!n||m,onClick:()=>{Xe(z,n?.max_instances??2)},className:O("flex-1 px-3 py-2 text-[13px] disabled:opacity-50",K>0&&"border-l border-hairline/40",n?.mode===z?"bg-control text-ink":"text-ink-secondary hover:text-ink"),children:z==="shared"?t("vm.isolation.shared"):t("vm.isolation.perBot")},z))}),Te&&e.jsxs("div",{className:"mt-3 flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-[13px] text-ink",children:t("vm.isolation.max")}),e.jsx("div",{className:"text-[12px] text-ink-secondary",children:t("vm.isolation.maxDetail")})]}),e.jsx(ye,{size:"sm","aria-label":t("vm.isolation.maxAria"),value:n?.max_instances??2,disabled:!n||m,onChange:z=>{Xe(n?.mode??"shared",Number(z.target.value))},children:[1,2,3,4,5,6,7,8].map(z=>e.jsx("option",{value:z,children:z},z))})]}),e.jsx(Zp,{minutes:n?Math.round(n.idle_timeout_ms/6e4):Xp,disabled:!n||m,onSave:wt}),m&&e.jsxs("div",{className:"mt-2 flex items-center gap-1.5 text-[12px] text-ink-secondary",children:[e.jsx(q,{size:12,className:"animate-spin"})," ",t("vm.saving")]})]}),e.jsx(X,{title:t("vm.setup.title"),subtitle:t("vm.setup.subtitle"),children:e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs(Pt,{n:1,title:t("vm.setup.step1"),done:!!n?.runtime,children:[e.jsx("div",{className:"text-[13px] leading-relaxed text-ink-secondary",children:t("vm.setup.step1Detail")}),Ie?.install?e.jsx(gt,{command:Ie.install}):e.jsx("a",{href:"https://podman.io/docs/installation",target:"_blank",rel:"noreferrer",className:"text-[13px] text-accent hover:underline",children:t("vm.setup.podmanGuide")})]}),e.jsx(Pt,{n:2,title:n?.runtime&&!n.daemonUp?t("vm.setup.step2Open",{runtime:n.runtime}):t("vm.setup.step2"),done:!!n?.daemonUp,children:n?.runtime?Ie?.runtimeStart?e.jsx(gt,{command:Ie.runtimeStart}):e.jsx("div",{className:"text-[13px] text-ink-secondary",children:t("vm.setup.step2Detail")}):null}),e.jsxs(Pt,{n:3,title:t("vm.setup.step3"),done:!!n?.image,children:[n?.daemonUp&&e.jsx(rt,{action:"pull",pending:c,onClick:()=>{Ue("pull")},children:t("vm.setup.prepare")}),Ie?.pull&&e.jsxs("details",{className:"text-[12px] text-ink-secondary",children:[e.jsx("summary",{className:"cursor-pointer",children:t("vm.setup.showPull")}),e.jsx("div",{className:"mt-2",children:e.jsx(gt,{command:Ie.pull})})]})]}),e.jsxs(Pt,{n:4,title:Te?t("vm.setup.step4PerBot"):mn?t("vm.setup.step4Recreate"):t("vm.setup.step4"),done:!Te&&Qe,children:[Te?e.jsx("div",{className:"text-[13px] leading-relaxed text-ink-secondary",children:ts?t("vm.setup.applePort"):t("vm.setup.perBotHint")}):mn?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex gap-2 text-[13px] text-warning",children:[e.jsx(Ge,{size:15,className:"mt-0.5 shrink-0"}),e.jsx("span",{children:n?.problem})]}),n?.image?e.jsxs(rt,{action:"recreate",pending:c,onClick:()=>{Ue("recreate")},danger:!0,children:[e.jsx(co,{size:13})," ",t("vm.setup.recreate")]}):e.jsx("div",{className:"text-[13px] text-ink-secondary",children:t("vm.setup.prepareFirst")})]}):n?.container==="stopped"?e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"text-[13px] text-ink-secondary",children:t(n.stop_reason==="idle"?"vm.stopped.idle":"vm.stopped.detail")}),e.jsx(rt,{action:"start",pending:c,onClick:()=>{Ue("start")},children:t("vm.setup.start")})]}):n?.container==="running"?e.jsxs("div",{className:"flex items-center gap-2 text-[13px] text-ink-secondary",children:[e.jsx(q,{size:13,className:"animate-spin"})," ",t("vm.setup.waiting")]}):n?.image?e.jsxs(e.Fragment,{children:[e.jsx(rt,{action:"run",pending:c,onClick:()=>{Ue("run")},children:t("vm.setup.start")}),e.jsx("p",{className:"text-[13px] leading-relaxed text-ink-secondary",children:t("vm.setup.idleHint")})]}):null,Ie?.run&&e.jsxs("details",{className:"text-[12px] text-ink-secondary",children:[e.jsx("summary",{className:"cursor-pointer",children:t("vm.setup.showCommand")}),e.jsx("div",{className:"mt-2",children:e.jsx(gt,{command:Ie.run})})]})]})]})}),Te&&e.jsx(Yp,{instances:b,maxInstances:g||n?.max_instances||2,loading:C,deletingBotId:k,error:N,unavailableReason:j,onRefresh:()=>M(z=>z+1),onDelete:z=>{nt(z)}}),xn&&e.jsx(X,{children:e.jsxs("div",{className:"flex gap-2 text-[13px] text-ink-secondary",children:[e.jsx(Ge,{size:15,className:"mt-0.5 shrink-0 text-warning"}),e.jsx("span",{children:t("vm.inspectFailed")})]})}),e.jsxs(X,{title:t("vm.safety.title"),subtitle:Te?t("vm.safety.perBot",{path:n?.workspace_guest_path??"/home/cua/workspace"}):t("vm.safety.shared",{path:n?.workspace_guest_path??"/home/cua/workspace"}),children:[_e&&e.jsxs("div",{className:"flex flex-wrap gap-2",children:[n?.container==="running"&&e.jsxs(rt,{action:"stop",pending:c,onClick:()=>{Ue("stop")},children:[e.jsx(uo,{size:12})," ",t("vm.safety.stop")]}),e.jsxs(rt,{action:"remove",pending:c,onClick:()=>{Ue("remove")},danger:!0,children:[e.jsx(Le,{size:12})," ",Te?t("vm.safety.deleteLegacy"):t("vm.safety.deleteVm")]})]}),e.jsxs("div",{className:"mt-3 break-all text-[11px] text-ink-secondary",children:[t("vm.safety.workspace",{path:n?.workspace_path??t("vm.safety.notCreated"),driver:n?.driver_version??"0.37.0",image:n?.image_ref??t("vm.safety.notPrepared")}),n?.base_image_ref?e.jsxs(e.Fragment,{children:[" · ",t("vm.safety.baseImage",{image:n.base_image_ref})]}):null]})]})]})]})}const Qn=/^[A-Za-z0-9_-]+$/,em=/^relay[1-9][0-9]?\.openmausbot\.com$/;function tm(s){if(!s||s.v!==1||typeof s.k!="string"||s.k.length!==87||!Qn.test(s.k))return null;const n=typeof s.h=="string"&&Array.isArray(s.r)&&s.r.length>=1&&s.r.length<=4&&s.h.length===22&&Qn.test(s.h)&&s.r.every(r=>em.test(r))?{h:s.h,r:s.r}:{},a=JSON.stringify({v:1,k:s.k,...n}),i=btoa(a).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"");return i.length<=1024?i:null}const lr=8,sm=new Set(["hosted","tailnet","lan","bonjour"]);function Ke(s){const n=new Set,a=[];for(const i of s??[])if(!(!i||!sm.has(i.kind)||!Number.isInteger(i.priority)||i.priority<0||i.priority>1e6))try{const r=new URL(i.url),c=i.kind==="hosted"?"https:":"http:",o=r.port?Number(r.port):null,d=r.hostname.toLowerCase().replace(/\.$/,"");if(r.protocol!==c||d.split(".").includes("")||i.kind==="tailnet"&&!d.endsWith(".ts.net")||o!==null&&(!Number.isInteger(o)||o<1||o>65535)||r.username||r.password||r.pathname!=="/"||r.search||r.hash||n.has(r.origin))continue;n.add(r.origin),a.push({url:r.origin,kind:i.kind,priority:i.priority})}catch{}return a.sort((i,r)=>i.priority-r.priority).slice(0,lr)}function nm(s){const n=new TextEncoder().encode(JSON.stringify(s));let a="";for(const i of n)a+=String.fromCharCode(i);return btoa(a).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")}function am(s){if(!s||!/^[A-Za-z0-9_-]{87}$/.test(s))return null;try{const n=s.replaceAll("-","+").replaceAll("_","/")+"=",a=atob(n);if(a.length!==65||a.charCodeAt(0)!==4)return null;let i="";for(let r=0;r<a.length;r+=1)i+=a[r];return btoa(i).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")===s?s:null}catch{return null}}function im(s,n){const a=s.trim();if(!a)return null;if(/^https?:\/\//i.test(a))try{const r=new URL(a);return r.username||r.password||r.pathname!=="/"||r.search||r.hash?null:r.origin}catch{return null}return n===void 0||!Number.isInteger(n)||n<1||n>65535?null:`${a.includes(":")&&!a.startsWith("[")?`[${a}]`:a}:${n}`}function rm({address:s,port:n,token:a,code:i,name:r,hosts:c,endpoints:o,secretPublicKey:d,e2e:u}){const p=im(s,n);if(!p||!/^omb_pair_[A-Za-z0-9_-]{43}$/.test(a)||i!==void 0&&!/^\d{6}$/.test(i))return null;const m=[["address",p],["token",a]];i!==void 0&&m.push(["code",i]),r?.trim()&&m.push(["name",r.trim()]);const x=(c??[]).map(y=>y.trim()).filter(y=>y&&!/[\s/?#,[\]]/.test(y)).slice(0,lr);x.length&&m.push(["hosts",x.join(",")]);const h=Ke(o);h.length&&m.push(["endpoints",nm(h)]);const f=am(d);f&&m.push(["secretKey",f]);const b=tm(u);return b&&m.push(["e2e",b]),`openmausbot://pair?${m.map(([y,g])=>`${y}=${encodeURIComponent(g)}`).join("&")}`}function rn(s){return t("pairing.worksOnceUntil",{time:ll(s)})}function Rs(s,n=Date.now()){const a=Math.max(0,Math.floor((n-s)/6e4));return a<1?t("remote.serverPairing.justNow"):a<60?t("remote.serverPairing.minutesAgo",{minutes:a}):a<1440?t("remote.serverPairing.hoursAgo",{hours:Math.round(a/60)}):t("remote.serverPairing.daysAgo",{days:Math.round(a/1440)})}function lm(s){const n=s.endpoints?.find(a=>{if(a.kind!=="hosted")return!1;try{return new URL(a.url).hostname===s.address}catch{return!1}});return n?new URL(n.url).origin:`${s.address}:${s.port}`}const bs=s=>{const n=new Set,a=[];for(const i of s){const r=i.trim();!r||n.has(r)||(n.add(r),a.push(r))}return a},ys=(s,n)=>`http://${s.includes(":")&&!s.startsWith("[")?`[${s}]`:s}:${n}`;function Mt(s,n){if(n==="automatic"){const m=Ke(s.endpoints).filter(y=>y.kind==="hosted"),x=m[0]??null;if(!x)return null;const h=new URL(x.url),f=h.hostname,b=h.port?Number(h.port):443;return{address:f,port:b,hosts:bs([f,...m.map(y=>new URL(y.url).hostname)]),endpoints:m}}const a=Ke(s.endpoints);if(n==="tailscale"){if(s.routes?.tailscale?.on===!1)return null;let m=null;if(s.routes?.tailscale?.on){const g=s.routes.tailscale.name?.trim();g&&(m=Ke([{url:ys(g,s.port),kind:"tailnet",priority:0}])[0]??null)}if(m??=a.find(g=>g.kind==="tailnet")??null,!m&&s.tailnetName?.trim()&&(m=Ke([{url:ys(s.tailnetName.trim(),s.port),kind:"tailnet",priority:0}])[0]??null),!m)return null;const x=new URL(m.url),h=x.hostname,f=x.port?Number(x.port):80,b=a.filter(g=>g.url!==m.url&&["hosted","tailnet"].includes(g.kind)),y=[m,...b].map((g,v)=>({...g,priority:v*100}));return{address:h,port:f,hosts:bs([h,...(s.hosts??[]).filter(g=>g.trim().toLowerCase().replace(/\.$/,"").endsWith(".ts.net"))]),endpoints:y}}let i=a.find(m=>m.kind==="lan")??(s.discovery?.advertising?a.find(m=>m.kind==="bonjour"):null)??null;if(!i){const m=s.lan?.trim()||(s.discovery?.advertising?s.hosts?.find(x=>x.trim().toLowerCase().endsWith(".local")):null);if(!m)return null;i=Ke([{url:ys(m.trim(),s.port),kind:m.trim().toLowerCase().endsWith(".local")?"bonjour":"lan",priority:0}])[0]??null}if(!i)return null;const r=new URL(i.url),c=r.hostname,o=r.port?Number(r.port):80,d=a.filter(m=>m.url!==i.url&&m.kind==="hosted"),u=a.filter(m=>m.url!==i.url&&!["hosted","tailnet"].includes(m.kind)),p=[i,...d,...u].map((m,x)=>({...m,priority:x*100}));return{address:c,port:o,hosts:bs([c,...(s.hosts??[]).filter(m=>!m.trim().toLowerCase().replace(/\.$/,"").endsWith(".ts.net"))]),endpoints:p}}function om(s,n){const a=Mt(s,n);if(!a)return null;const i=Ke(a.endpoints),r=i[0]??null,c=n==="local"?null:n==="tailscale"?i.find(d=>d.kind==="tailnet")??null:r?.kind==="hosted"?r:null;if(n!=="local"&&!c)return null;const o=Ke(s.endpoints);return{route:{...a,endpoints:i},protectedEndpoint:c,protectedEndpointAdvertised:c?o.some(d=>d.kind===c.kind&&d.url===c.url):!1}}function cm(s,n){if(!n.protectedEndpoint)return!0;const a=Ke(s.endpoints).some(o=>o.kind===n.protectedEndpoint?.kind&&o.url===n.protectedEndpoint.url);if(n.protectedEndpoint.kind!=="tailnet")return a;if(s.routes?.tailscale?.on===!1)return!1;const i=s.routes?.tailscale?.on?s.routes.tailscale.name?.trim().toLowerCase().replace(/\.$/,""):void 0,r=dm(n.protectedEndpoint.url);if(i&&r!==i)return!1;if(a)return!0;if(n.protectedEndpointAdvertised)return!1;if(i)return r===i;const c=s.tailnetName?.trim().toLowerCase().replace(/\.$/,"");return!!c&&r===c}const dm=s=>{try{return new URL(s).hostname.toLowerCase().replace(/\.$/,"")}catch{return}},or={active:!1,localFallback:!1,tailscaleFallback:!1,baselineDeviceIds:[],pairingAttempted:!1,pairedDeviceName:null};function um(s,n){switch(n.type){case"start":case"resume":return{active:!0,localFallback:!1,tailscaleFallback:!1,baselineDeviceIds:[...n.deviceIds],pairingAttempted:!1,pairedDeviceName:null};case"use-local":return{...s,active:!0,localFallback:!0,tailscaleFallback:!1,pairingAttempted:!1};case"use-tailscale":return{...s,active:!0,localFallback:!1,tailscaleFallback:!0,pairingAttempted:!1};case"pairing-opened":return{...s,baselineDeviceIds:[...n.deviceIds],pairingAttempted:!0};case"paired":return{...s,active:!0,pairedDeviceName:n.deviceName};case"reset":return or}}const pm=3e4;function mm(s,n){return s.pairedDeviceName?"success":s.active?n.pairingOpen||s.pairingAttempted?"qr":n.provisioningTimedOut?"sign-in":s.localFallback||s.tailscaleFallback?"verifying":n.accountStatus==="signed-out"||n.accountStatus==="unavailable"||n.accountStatus==="error"?"sign-in":(n.accountBusy||n.provisioning,"verifying"):"intro"}async function xm(s,n,a){let i=await(n?a.read():a.start());return n&&!i.enabled&&(a.shouldContinue?.()??!0)&&(i=await a.start()),s==="tailscale"&&i.enabled&&!i.error&&(a.shouldContinue?.()??!0)&&(i=await a.refreshTailscale()),i}const hm=(s,n)=>n?.endpoints?.some(a=>a.kind==="hosted")?"hosted-ready":!s?.available||s.status==="signed-out"||s.status==="error"?"local-only":s.status==="ready"&&!n?.enabled?"hosted-startable":"hosted-connecting";function Ft(s,n,a){if(a)return"open";switch(hm(s,n)){case"hosted-ready":return"open";case"hosted-startable":return"start";case"hosted-connecting":return"wait";case"local-only":return"account-required"}}function gm(s,n,a){return s!=="automatic"?!1:n==="open"?!0:n==="wait"&&a?.available===!0&&(a.status==="ready"||a.status==="connecting")}function fm(s,n){return s?.available===!0&&s.status==="ready"&&!s.endpoint&&Ft(s,n,!1)==="wait"}function bm(s,n){const a=new Set(s);return n.find(i=>!a.has(i.id))??null}function ym(s,n){return!s.active||!s.pairingAttempted||s.pairedDeviceName?null:bm(s.baselineDeviceIds,n)}function It(s){return s?s.map(n=>n.id):null}function vm(s,n){return s.active&&n.provisioning&&!n.provisioningTimedOut}function km(s,n){return s.generation===n?!1:(s.generation=n,!0)}function ht(s,n){return s.generation!==n?!1:(s.generation=null,!0)}function jm(s,n){return s.active?.generation===n.generation||s.pending?.generation===n.generation?"duplicate":s.active?(s.pending=n,"queued"):(s.active=n,"start")}function Nm(s,n){if(s.active?.generation!==n)return null;const a=s.pending;return s.active=a,s.pending=null,a}function Rt(s,n){s.pending?.generation===n&&(s.pending=null)}const wm=()=>t("phone.setup.pairingOpenFailed",{advanced:t("remote.advanced"),remote:t("remote.title")});function Sm(s,n=null,a=Date.now()){const i=cr(s);if(i)return i;const r=s.pairing;return!r||r.token===n||!/^omb_pair_[A-Za-z0-9_-]{43}$/.test(r.token)||!/^\d{6}$/.test(r.code??"")||!Number.isFinite(r.expiresAt)||(r.expiresAt??0)<=a?wm():null}async function Tt(s,n,a,i){const r=s.pairing?.token;if(!r||!i())return!1;let c;try{c=await n()}catch{return!1}if(!i()||c.pairing?.token!==r)return!1;try{return await a(),!0}catch{return!1}}async function Cm(s,n,a){const i=await s();return a()?i:(await n(i).catch(()=>{}),null)}function Em(s,n,a={set:(i,r)=>setTimeout(i,r),clear:i=>clearTimeout(i)}){let i=!1,r=null;const c=()=>{i||(r=a.set(()=>{Promise.resolve().then(s).catch(()=>{}).finally(c)},n))};return c(),()=>{i=!0,r!==null&&a.clear(r)}}const Am=()=>t("phone.setup.startFailed",{advanced:t("remote.advanced"),remote:t("remote.title")});function cr(s){return s.enabled&&!s.error?null:s.error?.trim()||Am()}const Zn=/\bReference:\s*([0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})\.?/i,Pm=/^Error invoking remote method ['"][^'"\r\n]+['"]:\s*(?:Error:\s*)?/i,Im=[/^Enter a valid email address\.$/,/^The secure connection request (?:was not accepted|was not allowed)\./,/^That code (?:is not valid|expired)\./,/^Your sign-in expired\./,/^OpenMausBot could not reach its secure connection service\./,/^Too many attempts were made\./,/^This computer was reconnected too often\./,/^This account has reached its computer limit\./,/^This computer is already connected\./,/^The secure connection (?:is still being prepared|service could not finish setup|is still being removed)\./,/^Secure HTTPS links are temporarily full\./,/^Secure access is not available right now\./,/^The secure connection service (?:had a problem|returned an unexpected response|is busy right now)\./,/^The secure connection request could not be completed\./];function lt(s,n){const a=s instanceof Error?s.message:"",i=a.replace(Pm,"").replace(/^Error:\s*/i,"").trim(),r=i.match(Zn)?.[1]??"",c=i.replace(Zn,"").trim(),d=!(/remote method ['"]companion-account:request-code['"]/i.test(a)&&c.startsWith("The secure connection request was not allowed."))&&Im.some(u=>u.test(c))?c:n;return r?t("phone.error.reference",{message:d,reference:r}):d}const Be=async(s,n)=>{s.current+=1;try{return await n()}finally{s.current+=1}},Rm=(s,n)=>s.current===n,Tm=(s,n)=>s?n?"details":"direct":"hidden",Bm=s=>s.length<=3?"…":s.length<10?`${s.slice(0,3)}…`:s.length<17?`${s.slice(0,4)}…${s.slice(-3)}`:`${s.slice(0,10)}…${s.slice(-6)}`;function Lm({label:s,value:n}){const[a,i]=l.useState(!1),{state:r,copy:c}=Qt(n);return e.jsxs("div",{className:"flex items-center gap-3 rounded-lg bg-inset px-3 py-2",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-[11px] font-medium uppercase tracking-wide text-ink-secondary",children:s}),e.jsx("div",{className:"mt-0.5 truncate font-mono text-[12px] text-ink",children:a?n:Bm(n)})]}),e.jsx("button",{onClick:()=>i(o=>!o),className:"shrink-0 rounded px-2 py-1 text-[11px] text-ink-secondary hover:bg-control hover:text-ink",children:t(a?"connectionDetail.hide":"connectionDetail.reveal")}),e.jsx("button",{onClick:c,"aria-label":r==="failed"?t("common.copyFailed"):t("connectionDetail.copy",{label:s}),className:"shrink-0 rounded p-1.5 text-ink-secondary hover:bg-control hover:text-ink",children:r==="copied"?e.jsx(ve,{size:13,className:"text-success"}):r==="failed"?e.jsx(We,{size:13,className:"text-danger"}):e.jsx(Js,{size:13})})]})}const Om=1e5;function vs({on:s,label:n,value:a}){return e.jsxs("div",{className:"flex h-7 items-center gap-2 text-left",children:[s?e.jsx(ve,{size:14,className:"shrink-0 text-success"}):e.jsx(po,{size:14,className:"shrink-0 text-ink-tertiary"}),e.jsx("span",{className:"w-[120px] shrink-0 text-[13px] text-ink",children:n}),e.jsx("span",{className:"min-w-0 truncate text-[12px] text-ink-secondary",children:a})]})}function zm({c:s,signedIn:n}){const[a,i]=l.useState(!1),[r,c]=l.useState(!1),o=s.state,d=!!o?.pairing;if(l.useEffect(()=>{if(!d)return;const x=setInterval(()=>{s.act(h=>h.renewPairing?h.renewPairing():h.pairing(!0))},Om);return()=>clearInterval(x)},[d,s]),!o||!s.pairingLink)return null;const u=o.lan??o.addresses?.[0]??null,p=o.e2e?.descriptor?.r?.length?o.e2e.relay:null,m=()=>{wi(s.pairingLink??"").then(()=>{i(!0),setTimeout(()=>i(!1),2500)})};return e.jsxs("div",{className:"flex w-full max-w-[440px] flex-col items-center text-center",children:[e.jsx("div",{className:"rounded-2xl bg-white p-3.5 transition-opacity duration-150","aria-label":t("phone.code.qrAria"),children:e.jsx(es,{value:s.pairingLink,size:320,level:"L",marginSize:1,bgColor:"#ffffff",fgColor:"#111111"},o.pairing?.token)}),e.jsx("p",{className:"mt-4 text-[13px] text-ink-secondary",children:t("phone.code.e2e.scan",{app:Se()})}),e.jsxs("div",{className:"mt-5 w-full px-2",children:[e.jsx(vs,{on:!!u,label:t("phone.code.e2e.wifi"),value:u??""}),e.jsx(vs,{on:!!o.tailnetName,label:t("phone.code.e2e.tailscale"),value:o.tailnetName??t("phone.code.e2e.tailscaleOff")}),e.jsx(vs,{on:!!p,label:t("phone.code.e2e.relay"),value:p?t("phone.code.e2e.fromAnywhere"):n?t("phone.code.e2e.relayOff"):t("phone.code.e2e.signIn")})]}),s.localFallback&&o.publicNetwork&&e.jsx("p",{role:"note",className:"mt-3 w-full rounded-lg border border-warning/30 bg-warning/10 px-3 py-2 text-left text-[12px] leading-relaxed text-warning",children:t("phone.code.publicNetwork",{network:o.publicNetwork})}),e.jsxs("p",{className:"mt-4 flex items-start gap-1.5 px-2 text-left text-[12px] text-ink-tertiary",children:[e.jsx(md,{size:12,className:"mt-0.5 shrink-0"}),t("phone.code.e2e.encrypted")]}),e.jsxs("div",{className:"relative mt-5 flex w-full items-center justify-between px-2",children:[e.jsx("button",{onClick:m,className:"text-[12px] text-ink-secondary hover:text-ink",children:t("phone.code.e2e.copyLink")}),gn,gn]}),a&&e.jsx("div",{role:"status",className:"mt-3 rounded-lg bg-inset px-3 py-1.5 text-[12px] text-ink",children:t("phone.code.e2e.copied")})]})}function Mm({c:s}){return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"my-4 flex items-center gap-3 text-[11px] text-ink-secondary",children:[e.jsx("span",{className:"h-px flex-1 bg-hairline/40"})," ",t("phone.signIn.or")," ",e.jsx("span",{className:"h-px flex-1 bg-hairline/40"})]}),e.jsxs("button",{disabled:s.busy||s.accountBusy,onClick:s.useLocal,className:"flex items-center justify-center gap-2 rounded-lg border border-hairline/50 py-2.5 text-[13px] text-ink hover:bg-control disabled:opacity-40",children:[e.jsx(mu,{size:15})," ",t("phone.signIn.wifiInstead")]}),e.jsx("p",{className:"mt-2 text-center text-[11px] leading-relaxed text-ink-secondary",children:t("phone.signIn.wifiNote")}),s.tailscaleAvailable&&e.jsx("button",{disabled:s.busy||s.accountBusy,onClick:s.useTailscale,className:"mt-2 flex items-center justify-center gap-2 rounded-lg border border-hairline/50 py-2.5 text-[13px] text-ink hover:bg-control disabled:opacity-40",children:t("phone.signIn.tailscaleInstead")}),s.tailscaleAvailable&&e.jsx("p",{className:"mt-2 text-center text-[11px] leading-relaxed text-ink-secondary",children:t("phone.signIn.tailnetNote")})]})}const ea=()=>t("phone.error.directUnavailable"),ta=()=>t("phone.error.protectedUnavailable"),Ze=()=>globalThis.ogb?.companionAccount??null,Fm=async(s,n)=>{const[a,i]=await Promise.allSettled([s?Promise.resolve().then(()=>s.state()):Promise.resolve(null),n?Promise.resolve().then(()=>n.state()):Promise.resolve(null)]);return{companion:a.status==="fulfilled"?a.value:null,account:i.status==="fulfilled"?i.value:null}},Dm=(s,n)=>!s&&!!n.email,dr=(s,n)=>n||(s?.status==="signed-out"?s.message??null:null);function Um(s=""){const[n,a]=l.useState(null),[i,r]=l.useState(null),[c,o]=l.useState(s),[d,u]=l.useState(""),[p,m]=l.useState(!1),[x,h]=l.useState(!1),[f,b]=l.useState(!1),[y,g]=l.useState(!1),[v,C]=l.useState(!1),[w,N]=l.useState(!1),[I,j]=l.useState(null),[L,k]=l.useState(null),[,P]=l.useState(()=>Date.now()),[S,M]=l.useReducer(um,or),se=l.useRef(!1),ne=l.useRef({generation:null}),V=l.useRef({active:null,pending:null}),ie=l.useRef(async()=>{}),re=l.useRef(null),[oe,T]=l.useState(null),R=l.useRef(0),E=l.useRef(!0),D=l.useRef(0),Q=l.useRef(null),le=l.useCallback($=>{re.current=$,T($)},[]);l.useEffect(()=>(E.current=!0,()=>{E.current=!1,R.current+=1}),[]);const ae=l.useCallback(()=>{if(Q.current)return Q.current;const $=D.current,ee=(async()=>{const Z=await Fm(ct(),Ze());E.current&&(Z.companion&&Rm(D,$)&&a(Z.companion),Z.account&&(r(Z.account),Dm(se.current,Z.account)&&o(Z.account.email??"")))})().finally(()=>{Q.current===ee&&(Q.current=null)});return Q.current=ee,ee},[]);l.useEffect(()=>{ae()},[ae]),l.useEffect(()=>{!se.current&&s&&o(s)},[s]);const U=l.useCallback(async $=>{const ee=ct();if(ee){h(!0),j(null);try{const Z=await Be(D,()=>$(ee));E.current&&a(Z)}catch(Z){E.current&&j(lt(Z,t("phone.error.remoteUpdate")))}finally{E.current&&h(!1)}}},[]),te=l.useCallback(async $=>{const ee=Ze();if(ee){g(!0),k(null);try{const Z=await Be(D,()=>$(ee));if(!E.current)return;r(Z),await ae()}catch(Z){E.current&&k(lt(Z,t("phone.error.secureUpdate")))}finally{E.current&&g(!1)}}},[ae]),me=l.useCallback(async({routeMode:$,accountOverride:ee,generation:Z})=>{const ue=()=>{ht(ne.current,Z)&&E.current&&b(!1);const ke=Nm(V.current,Z);ke&&ie.current(ke)},be=()=>E.current&&R.current===Z;if(!be()){ue();return}const Pe=ct();if(!Pe){E.current&&R.current===Z&&j(t("phone.error.desktopOnly")),ue();return}const Je=()=>{const ke=re.current;return!ke||ke.generation===Z},Ye=re.current;Ye&&Ye.generation!==Z&&(le(null),a(ke=>ke?.pairing?.token===Ye.token?{...ke,pairing:null}:ke)),j(null);try{const ke=await xm($,!!n?.enabled,{read:()=>Pe.state(),start:()=>Be(D,()=>Pe.start($==="automatic"?void 0:[])),refreshTailscale:()=>Be(D,()=>Pe.refreshTailscale()),shouldContinue:be});if(!be())return;a(ke);const pt=cr(ke);if(pt){C(!1),j(pt),M({type:"reset"});return}const Ue=$!=="automatic",Xe=Ft(ee??i,ke,Ue),wt=Ze(),nt=wt?.prepare&&gm($,Xe,ee??i)?wt.prepare:null;if(Xe!=="open"){if(C(Xe==="wait"||Xe==="start"),nt){const _e=await Be(D,()=>nt());be()&&r(_e)}return}if(nt&&Promise.resolve().then(()=>nt()).catch(()=>{}),Ue&&!Mt(ke,$)){C(!1),j($==="tailscale"?t("phone.error.tailscaleUnavailable"):ea()),M({type:"reset"});return}const Re=await Cm(()=>Be(D,()=>Pe.pairing(!0)),_e=>Tt(_e,()=>Pe.state(),()=>Be(D,()=>Pe.pairing(!1,_e.pairing?.token)),Je),be);if(!Re)return;const St=Re.pairing,Ie=Sm(Re,ke.pairing?.token??null),Qe=Ie?null:om(Re,$);if(Ie||!Qe||!St){if(await Tt(Re,()=>Pe.state(),()=>Be(D,()=>Pe.pairing(!1,Re.pairing?.token)),be),!be())return;le(null),a({...Re,pairing:null}),C(!1),j(Ie??($==="local"?ea():$==="tailscale"?t("phone.error.tailscaleUnavailable"):ta())),M({type:"reset"});return}le({...Qe,generation:Z,token:St.token}),a(Re),C(!1),N(!1),M({type:"pairing-opened",deviceIds:Re.devices.map(_e=>_e.id)})}catch(ke){if(!be())return;le(null),C(!1),j(lt(ke,t("phone.error.pairingPrepare"))),M({type:"reset"})}finally{ue()}},[i,le,n]);l.useLayoutEffect(()=>{ie.current=me},[me]);const ce=l.useCallback(($,ee,Z=R.current)=>{const ue={routeMode:$,accountOverride:ee,generation:Z},be=jm(V.current,ue);be!=="duplicate"&&(km(ne.current,Z),b(!0),be==="start"&&ie.current(ue))},[]),xe=l.useCallback(()=>{const $=It(n?.devices??null);if(!$)return;const ee=++R.current;M({type:"start",deviceIds:$}),j(null),k(null),N(!1),(Ft(i,n,!1)==="open"||i?.available&&(i.status==="ready"||i.status==="connecting"))&&(C(!0),ce("automatic",i,ee))},[i,ce,n]),de=l.useCallback(()=>{const $=It(n?.devices??null);if(!$)return;S.active||M({type:"start",deviceIds:$});const ee=++R.current;M({type:"use-local"}),C(!0),N(!1),k(null),ce("local",void 0,ee)},[S.active,ce,n?.devices]),je=l.useCallback(()=>{const $=It(n?.devices??null);if(!$)return;S.active||M({type:"start",deviceIds:$});const ee=++R.current;M({type:"use-tailscale"}),C(!0),N(!1),k(null),ce("tailscale",void 0,ee)},[S.active,ce,n?.devices]),_=l.useCallback(()=>{U($=>$.refreshTailscale())},[U]),pe=l.useCallback(()=>{const $=Ze(),ee=c.trim().toLowerCase();if(!$||!ee)return;const Z=R.current;g(!0),k(null),$.requestCode(ee).then(ue=>{!E.current||R.current!==Z||(r(ue),m(!0))}).catch(ue=>{!E.current||R.current!==Z||k(lt(ue,t("phone.error.sendCode")))}).finally(()=>{E.current&&R.current===Z&&g(!1)})},[c]),B=l.useCallback(()=>{const $=Ze(),ee=c.trim().toLowerCase();if(!$||d.length!==8)return;const Z=R.current;g(!0),C(!0),N(!1),k(null),Be(D,()=>$.verifyCode(ee,d)).then(async ue=>{!E.current||R.current!==Z||(r(ue),u(""),m(!1),await ce("automatic",ue,Z))}).catch(ue=>{!E.current||R.current!==Z||(C(!1),k(lt(ue,t("phone.error.verifyCode"))))}).finally(()=>{E.current&&R.current===Z&&g(!1)})},[d,c,ce]),A=l.useCallback(()=>{const $=Ze();if(!$)return;const ee=S.active?It(n?.devices??null):null,Z=++R.current;ee&&M({type:"start",deviceIds:ee}),g(!0),C(!0),N(!1),k(null),Be(D,()=>$.retry()).then(async ue=>{!E.current||R.current!==Z||(r(ue),S.active?await ce("automatic",ue,Z):(await ae(),E.current&&R.current===Z&&C(!1)))}).catch(ue=>{!E.current||R.current!==Z||(C(!1),k(lt(ue,t("phone.error.restore"))))}).finally(()=>{E.current&&R.current===Z&&g(!1)})},[S.active,ae,ce,n?.devices]),H=mm(S,{accountStatus:i?.available?i.status:"unavailable",accountBusy:y,provisioning:v,provisioningTimedOut:w,pairingOpen:!!(n?.pairing&&oe?.token===n.pairing.token)});l.useEffect(()=>{!S.active||S.localFallback||S.tailscaleFallback||!i||i.available&&i.status!=="signed-out"&&i.status!=="error"||C(!1)},[i,S.active,S.localFallback,S.tailscaleFallback]),l.useEffect(()=>{if(!vm(S,{provisioning:v,provisioningTimedOut:w}))return;const $=window.setTimeout(()=>{const ee=R.current;R.current+=1,Rt(V.current,ee),ht(ne.current,ee),b(!1),g(!1),C(!1),N(!0)},pm);return()=>window.clearTimeout($)},[S,v,w]),l.useEffect(()=>{const $=oe;if(!$||!n)return;if(!n.pairing){le(null);return}const ee=n.pairing.token===$.token,Z=cm(n,$);if(ee&&Z)return;const ue=ct();R.current===$.generation&&(R.current+=1),Rt(V.current,$.generation),ht(ne.current,$.generation),b(!1),le(null),a(be=>be&&{...be,pairing:null}),C(!1),N(!1),j(ee?ta():t("phone.error.codeChanged")),M({type:"reset"}),ee&&ue&&Tt(n,()=>ue.state(),()=>Be(D,()=>ue.pairing(!1,n.pairing?.token)),()=>{const be=re.current;return!be||be.generation===$.generation})},[oe,le,n]),l.useEffect(()=>{if(!n)return;const $=ym(S,n.devices);$&&M({type:"paired",deviceName:$.name})},[S,n]),l.useEffect(()=>{!S.active||S.localFallback||S.tailscaleFallback||S.pairingAttempted||w||!n||(Ft(i,n,!1)==="open"||!v&&fm(i,n))&&ce("automatic")},[i,S.active,S.localFallback,S.pairingAttempted,S.tailscaleFallback,ce,v,w,n]);const he=S.active||!!n?.pairing;l.useEffect(()=>Em(()=>(P(Date.now()),ae()),he?1e3:1e4),[ae,he]);const W=S.localFallback?"local":S.tailscaleFallback?"tailscale":"automatic",Ne=l.useMemo(()=>n?n.pairing?oe?.token===n.pairing.token?oe.route:null:Mt(n,W):null,[W,oe,n]),ze=l.useMemo(()=>!n?.pairing||!Ne?null:rm({...Ne,code:n.e2e?.enabled?void 0:n.pairing.code,token:n.pairing.token,name:n.discovery?.name,secretPublicKey:n.secretPublicKey,e2e:n.e2e?.descriptor}),[Ne,n]),qe=l.useCallback(()=>{const $=R.current;R.current+=1,Rt(V.current,$),ht(ne.current,$),b(!1);const ee=n,Z=ct();le(null),a(ue=>ue&&{...ue,pairing:null}),Z&&ee?.pairing&&Tt(ee,()=>Z.state(),()=>Be(D,()=>Z.pairing(!1,ee.pairing?.token)),()=>re.current===null),C(!1),g(!1),N(!1),m(!1),u(""),M({type:"reset"})},[le,n]);return{state:n,account:i,phase:H,email:c,code:d,codeSent:p,busy:x||f,accountBusy:y,error:I,accountError:L,pairingLink:ze,address:Ne?.address,pairingPort:Ne?.port??n?.port??8810,addressText:Ne?lm(Ne):void 0,hostedReady:!!n?.endpoints?.some($=>$.kind==="hosted"),localFallback:S.localFallback,tailscaleFallback:S.tailscaleFallback,tailscaleAvailable:!!(n&&Mt(n,"tailscale")),pairingExpired:S.pairingAttempted&&!n?.pairing,setupTimedOut:w,setEmail:$=>{se.current=!0,o($)},setCode:$=>u($.replaceAll(/\D/g,"").slice(0,8)),changeEmail:()=>{u(""),m(!1),k(null)},start:xe,useLocal:de,useTailscale:je,refreshTailscale:_,requestCode:pe,verifyCode:B,retryAccount:A,cancel:qe,refreshCode:()=>{const $=++R.current;ce(W,void 0,$)},finish:()=>{const $=R.current;R.current+=1,Rt(V.current,$),ht(ne.current,$),b(!1),le(null),N(!1),M({type:"reset"})},act:U,accountAct:te}}function _m(){const s=[{Icon:Si,title:t("phone.value.chats"),detail:t("phone.value.chatsDetail")},{Icon:ve,title:t("phone.value.approvals"),detail:t("phone.value.approvalsDetail")},{Icon:Gs,title:t("phone.value.private"),detail:t("phone.value.privateDetail")}];return e.jsx("div",{className:"mt-5 grid w-full gap-2 sm:grid-cols-3",children:s.map(({Icon:n,title:a,detail:i})=>e.jsxs("div",{className:"rounded-xl bg-inset px-3 py-3 text-left",children:[e.jsx(n,{size:16,className:"text-accent"}),e.jsx("div",{className:"mt-2 text-[13px] font-medium text-ink",children:a}),e.jsx("div",{className:"mt-0.5 text-[12px] leading-relaxed text-ink-secondary",children:i})]},a))})}function $m({controller:s}){const n=s,a=dr(n.account,n.accountError),i=/^\S+@\S+\.\S+$/.test(n.email.trim()),r=Tm(!!n.state?.pairing,n.pairingLink);if(n.phase==="qr"&&n.state?.e2e?.enabled&&n.pairingLink)return e.jsx(zm,{c:n,signedIn:!!n.account?.email});if(n.phase==="intro")return e.jsxs("div",{className:"flex flex-col items-center text-center",children:[e.jsx("div",{className:"flex size-14 items-center justify-center rounded-2xl bg-accent/12 text-accent",children:e.jsx(Si,{size:26})}),e.jsx("h2",{className:"mt-4 text-[19px] font-semibold text-ink",children:t("phone.intro.title",{app:Se()})}),e.jsx("p",{className:"mt-1.5 max-w-[460px] text-[14px] leading-relaxed text-ink-secondary",children:t("phone.intro.detail")}),e.jsx(_m,{}),e.jsx("button",{"data-phone-pairing-action":!0,onClick:n.start,disabled:!n.state||n.busy||n.accountBusy,className:"mt-5 w-full max-w-[320px] rounded-lg bg-accent py-2.5 text-[14px] font-medium text-white hover:opacity-90 disabled:cursor-wait disabled:opacity-40",children:n.state?.devices.length?t("phone.intro.pairAnother"):t("phone.intro.pair")}),n.error&&e.jsx("p",{role:"alert",className:"mt-3 max-w-[390px] text-[13px] text-danger",children:n.error})]});if(n.phase==="sign-in"){const c=!n.account?.available,o=n.account?.status==="error"||n.setupTimedOut;return e.jsxs("div",{className:"mx-auto flex w-full max-w-[430px] flex-col",children:[e.jsxs("button",{onClick:n.cancel,className:"mb-4 flex w-fit items-center gap-1.5 text-[12px] text-ink-secondary hover:text-ink",children:[e.jsx(oi,{size:13})," ",t("phone.back")]}),e.jsx("div",{className:"flex size-11 items-center justify-center rounded-xl bg-accent/12 text-accent",children:e.jsx(mo,{size:20})}),e.jsx("h2",{className:"mt-3 text-[18px] font-semibold text-ink",children:c||o?t("phone.signIn.attention"):t("phone.signIn.title")}),e.jsx("p",{role:n.setupTimedOut?"alert":void 0,className:"mt-1 text-[13px] leading-relaxed text-ink-secondary",children:c?t("phone.signIn.unavailable"):n.setupTimedOut?t("phone.signIn.timedOut"):o?n.account?.message??t("phone.signIn.failed"):t("phone.signIn.emailPrompt")}),!c&&!o&&e.jsxs("div",{className:"mt-5 flex flex-col gap-3",children:[e.jsxs("label",{className:"flex flex-col gap-1.5",children:[e.jsx("span",{className:"text-[12px] font-medium text-ink-secondary",children:t("phone.signIn.email")}),e.jsx("input",{autoFocus:!0,autoComplete:"email",inputMode:"email",value:n.email,disabled:n.accountBusy||n.codeSent,onChange:d=>n.setEmail(d.target.value),onKeyDown:d=>{d.key==="Enter"&&!n.codeSent&&i&&n.requestCode()},placeholder:t("common.emailPlaceholder"),className:"rounded-lg border border-hairline/50 bg-inset px-3 py-2.5 text-[14px] text-ink outline-none placeholder:text-ink-tertiary focus:border-accent disabled:opacity-50"})]}),n.codeSent&&e.jsxs("label",{className:"flex flex-col gap-1.5",children:[e.jsx("span",{className:"text-[12px] font-medium text-ink-secondary",children:t("phone.signIn.emailCode")}),e.jsx("input",{autoFocus:!0,autoComplete:"one-time-code",inputMode:"numeric",value:n.code,disabled:n.accountBusy,onChange:d=>n.setCode(d.target.value),onKeyDown:d=>{d.key==="Enter"&&n.code.length===8&&n.verifyCode()},placeholder:"12345678",className:"rounded-lg border border-hairline/50 bg-inset px-3 py-2.5 font-mono text-[16px] tracking-[0.18em] text-ink outline-none placeholder:tracking-normal placeholder:text-ink-tertiary focus:border-accent disabled:opacity-50"})]}),e.jsx("button",{disabled:n.accountBusy||!n.codeSent&&!i||n.codeSent&&n.code.length!==8,onClick:n.codeSent?n.verifyCode:n.requestCode,className:"rounded-lg bg-accent py-2.5 text-[14px] font-medium text-white hover:opacity-90 disabled:opacity-40",children:n.accountBusy?t("phone.signIn.working"):n.codeSent?t("phone.signIn.verify"):t("phone.signIn.sendCode")}),n.codeSent&&e.jsx("button",{disabled:n.accountBusy,onClick:n.changeEmail,className:"text-[12px] text-ink-secondary hover:text-ink disabled:opacity-40",children:t("phone.signIn.otherEmail")}),n.codeSent&&!a&&e.jsx("p",{className:"text-[12px] text-ink-secondary",children:t("phone.signIn.expires")})]}),(c||o)&&e.jsx("button",{disabled:n.accountBusy,onClick:n.retryAccount,className:"mt-5 rounded-lg bg-accent py-2.5 text-[14px] font-medium text-white disabled:opacity-40",children:n.accountBusy?t("remote.account.retrying"):t("phone.signIn.retry")}),a&&e.jsx("p",{role:"alert",className:"mt-3 text-[13px] text-danger",children:a}),e.jsx(Mm,{c:n})]})}return n.phase==="verifying"?e.jsxs("div",{className:"flex flex-col items-center py-8 text-center",children:[e.jsx("div",{className:"flex size-14 items-center justify-center rounded-2xl bg-accent/12 text-accent",children:e.jsx(q,{size:25,className:"animate-spin"})}),e.jsx("h2",{className:"mt-4 text-[18px] font-semibold text-ink",children:n.localFallback?t("phone.verifying.local"):n.tailscaleFallback?t("phone.verifying.tailscale"):t("phone.verifying.secure")}),e.jsx("p",{className:"mt-1.5 max-w-[360px] text-[13px] leading-relaxed text-ink-secondary",children:n.localFallback?t("phone.verifying.localDetail"):n.tailscaleFallback?t("phone.verifying.tailscaleDetail"):t("phone.verifying.secureDetail")}),(n.error||n.accountError)&&e.jsx("p",{role:"alert",className:"mt-3 max-w-[380px] text-[13px] text-danger",children:n.error??n.accountError}),e.jsx("button",{onClick:n.cancel,className:"mt-5 text-[12px] text-ink-secondary hover:text-ink",children:t("common.cancel")})]}):n.phase==="success"?e.jsxs("div",{className:"flex flex-col items-center py-6 text-center",children:[e.jsx("div",{className:"flex size-14 items-center justify-center rounded-full bg-success/15 text-success",children:e.jsx(ve,{size:28})}),e.jsx("h2",{className:"mt-4 text-[19px] font-semibold text-ink",children:t("phone.success.title")}),e.jsx("p",{className:"mt-1.5 text-[13px] text-ink-secondary",children:t("phone.success.detail")}),e.jsx("button",{onClick:n.finish,className:"mt-5 w-full max-w-[280px] rounded-lg bg-accent py-2.5 text-[14px] font-medium text-white",children:t("phone.success.done")})]}):e.jsxs("div",{className:"flex flex-col items-center text-center",children:[e.jsx("div",{className:"flex size-12 items-center justify-center rounded-xl bg-white text-black",children:e.jsx(iu,{size:23})}),e.jsx("h2",{className:"mt-3 text-[18px] font-semibold text-ink",children:n.pairingExpired?t("phone.code.expired"):t("phone.code.title")}),e.jsx("p",{className:"mt-1 text-[13px] text-ink-secondary",children:n.pairingExpired?t("phone.code.expiredDetail"):t("phone.code.detail")}),!n.pairingExpired&&n.pairingLink&&e.jsx("div",{className:"mt-4 rounded-2xl bg-white p-3.5","aria-label":t("phone.code.qrAria"),children:e.jsx(es,{value:n.pairingLink,size:180,level:"M",bgColor:"#ffffff",fgColor:"#111111"})}),!n.pairingExpired&&r==="direct"&&n.state?.pairing&&e.jsxs("div",{className:"mt-4 w-full max-w-[320px] rounded-xl bg-inset px-4 py-3 text-[13px] text-ink-secondary",children:[e.jsx("div",{children:t("phone.code.typeIntro",{app:Se()})}),e.jsx("div",{className:"mt-2 font-mono text-[22px] tracking-[0.25em] text-ink",children:n.state.pairing.code})]}),!n.pairingExpired&&r==="details"&&n.state?.pairing&&e.jsx("p",{className:"mt-3 text-[12px] text-ink-secondary",children:rn(n.state.pairing.expiresAt)}),!n.pairingExpired&&n.localFallback&&n.state?.publicNetwork&&e.jsx("p",{role:"note",className:"mt-3 w-full max-w-[390px] rounded-lg border border-warning/30 bg-warning/10 px-3 py-2 text-left text-[12px] leading-relaxed text-warning",children:t("phone.code.publicNetwork",{network:n.state.publicNetwork})}),n.pairingExpired&&e.jsx("button",{onClick:n.refreshCode,className:"mt-5 rounded-lg bg-accent px-5 py-2.5 text-[14px] font-medium text-white",children:t("phone.code.createNew")}),!n.pairingExpired&&n.state?.pairing&&e.jsxs("details",{className:"mt-4 w-full max-w-[390px] rounded-lg border border-hairline/40 px-3 py-2 text-left",children:[e.jsx("summary",{className:"cursor-pointer text-[12px] text-ink-secondary",children:t("phone.code.trouble")}),e.jsxs("div",{className:"mt-3 text-[12px] text-ink-secondary",children:[t("phone.code.pairingCode"),e.jsx("div",{className:"mt-1 font-mono text-[22px] tracking-[0.25em] text-ink",children:n.state.pairing.code}),n.address&&e.jsx("div",{className:"mt-3",children:e.jsx(Lm,{label:t("phone.code.address"),value:n.addressText??`${n.address}:${n.pairingPort}`})})]})]}),e.jsx("button",{onClick:n.cancel,className:"mt-4 text-[12px] text-ink-secondary hover:text-ink",children:t("common.cancel")})]})}function Km(){const{phase:s,phones:n,refresh:a}=Ld(),{dispatch:i}=G(),[r,c]=l.useState(null);if(s==="loading")return null;const o=d=>{r||(c(d),F(Md(d),{method:"DELETE"}).catch(u=>i({type:"error",message:u instanceof Error?u.message:String(u)})).finally(()=>{c(null),a()}))};return e.jsxs("div",{className:"border-t border-hairline/30 pt-4",children:[e.jsx("div",{className:"text-[13px] text-ink",children:t("remote.phones.title")}),n.length===0?e.jsx("div",{className:"mt-0.5 text-[12px] leading-relaxed text-ink-secondary",children:t("remote.phones.empty")}):e.jsx("ul",{className:"mt-3 flex flex-col gap-2",children:n.map(d=>{const{name:u,platform:p}=d.registration;return e.jsxs("li",{className:"rounded-xl bg-inset px-3 py-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"truncate text-[14px] font-medium text-ink",children:[u," ",e.jsxs("span",{className:"font-normal text-ink-secondary",children:["· ",Od(p)]})]}),e.jsx("div",{className:"text-[12px] text-ink-secondary",children:d.online?t("remote.phones.online"):t("remote.phones.offline",{when:pr(d.seen)})})]}),e.jsx("button",{disabled:r!==null,onClick:()=>o(d.key),"aria-label":t("remote.phones.remove",{name:u}),className:"shrink-0 rounded p-1.5 text-ink-secondary hover:bg-control hover:text-danger disabled:opacity-40",children:e.jsx(Le,{size:14})})]}),e.jsx("div",{className:"mt-2 flex flex-wrap gap-1.5",children:zd(d).map(m=>e.jsx("span",{className:"rounded-full bg-control px-2 py-0.5 text-[11px] text-ink-secondary",children:t(`botAccess.phone.cap.${m}`)},m))})]},d.key)})})]})}const Hm={wifi:"remote.devices.route.wifi",tailscale:"remote.devices.route.tailscale",relay:"remote.devices.route.relay"};function Wm(s,n){return[...s].sort((a,i)=>Number(n.has(i.id))-Number(n.has(a.id))||i.lastSeenAt-a.lastSeenAt)}function sa(s,n,a){const i=[];return s.route?i.push(t("remote.devices.connected",{route:t(Hm[s.route])})):n?i.push(a&&!s.e2eAt?t("remote.devices.connectedLegacy"):t("remote.devices.connectedNow")):i.push(t("remote.devices.lastSeen",{when:pr(s.lastSeenAt)})),a&&s.routes==="local"&&i.push(t("remote.devices.localOnly")),i.join(" · ")}function Gm({device:s,connected:n,state:a,c:i,onRemoved:r,onPairAgain:c,defaultOpen:o=!1}){const[d,u]=l.useState(o),p=a.e2e?.enabled===!0,m=n||!!s.route;return e.jsxs("li",{className:"border-t border-hairline/30 first:border-t-0",children:[e.jsxs("div",{className:"flex items-center gap-2.5 px-3 py-3",children:[e.jsx("span",{className:"flex size-3 shrink-0 items-center justify-center",title:sa(s,n,p),children:e.jsx("span",{className:`size-2 rounded-full ${m?"bg-success":"bg-ink-tertiary/40"}`})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"truncate text-[14px] font-medium text-ink",children:s.name}),e.jsx("div",{className:"truncate text-[12px] text-ink-secondary",children:sa(s,n,p)}),i.account?.paused&&e.jsx("div",{className:"truncate text-[12px] text-ink-secondary",children:t("remote.devices.paused")}),i.account?.tunnelRetired&&!s.e2eAt&&e.jsxs("div",{className:"text-[12px] leading-relaxed text-warning","data-phone-retired":"",children:[t("remote.devices.retired"),c&&e.jsxs(e.Fragment,{children:[" ",e.jsx("button",{type:"button",className:"text-accent hover:underline",onClick:c,children:t("remote.devices.pairAgain")})]})]})]}),e.jsx("button",{onClick:()=>u(x=>!x),"aria-expanded":d,"aria-label":t("remote.devices.more",{name:s.name}),className:"shrink-0 rounded p-1.5 text-ink-secondary hover:bg-control",children:e.jsx(Ni,{size:15})})]}),d&&e.jsxs("div",{className:"flex flex-col gap-3 border-t border-hairline/30 px-3 py-3",children:[p&&e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsx("div",{className:"text-[12px] text-ink",children:t("remote.devices.connectFrom")}),e.jsx("div",{role:"radiogroup","aria-label":t("remote.devices.connectFrom"),className:"flex rounded-lg bg-inset p-0.5 text-[12px]",children:["any","local"].map(x=>e.jsx("button",{role:"radio","aria-checked":(s.routes??"any")===x,disabled:i.busy,onClick:()=>{i.act(h=>h.routes?h.routes(s.id,x):h.state())},className:`rounded-md px-2.5 py-1 ${(s.routes??"any")===x?"bg-card text-ink shadow-sm":"text-ink-secondary"}`,children:x==="any"?t("remote.devices.anywhere"):t("remote.devices.localOnly")},x))})]}),e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-[12px] text-ink",children:t("remote.devices.allowView")}),e.jsx("div",{className:"mt-0.5 text-[11px] text-ink-secondary",children:t("remote.devices.allowViewDetail")})]}),e.jsx(fe,{checked:s.cloudDesktopAccess,"aria-label":t("remote.devices.viewAria",{name:s.name}),disabled:i.busy,onClick:()=>{i.act(x=>x.cloudDesktop(s.id,!s.cloudDesktopAccess))}})]}),e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-[12px] text-ink",children:t("remote.devices.allowBrowser")}),e.jsx("div",{className:"mt-0.5 text-[11px] text-ink-secondary",children:t("remote.devices.allowBrowserDetail")})]}),e.jsx(fe,{checked:s.browserControlAccess===!0,"aria-label":t("remote.devices.browserAria",{name:s.name}),disabled:i.busy,onClick:()=>{i.act(x=>x.browserControl(s.id,!s.browserControlAccess))}})]}),e.jsx("button",{disabled:i.busy,onClick:()=>{i.act(x=>x.revoke(s.id)).then(()=>r(s.name))},"aria-label":t("remote.devices.remove",{name:s.name}),className:"self-start text-[12px] text-danger hover:underline disabled:opacity-40",children:t("remote.devices.removePhone")})]})]})}function na({c:s,state:n,onPairAgain:a}){const[i,r]=l.useState(null),c=new Set(n.connectedDeviceIds??[]);return n.devices.length===0&&!i?null:e.jsxs(e.Fragment,{children:[n.devices.length>0&&e.jsx("ul",{className:"rounded-xl border border-hairline/40 bg-card",children:Wm(n.devices,c).map(o=>e.jsx(Gm,{device:o,connected:c.has(o.id),state:n,c:s,onRemoved:r,onPairAgain:a},o.id))}),i&&e.jsx("div",{role:"status",className:"mt-2 text-[12px] text-ink-secondary",children:t("remote.devices.removed",{name:i})})]})}const Vm="/api/team/phone-pairing",aa="/api/team/phones",qm=4e3;function Jm(s){return`${s.label} · ${s.email}`}function Ym({team:s,blocked:n}){const[a,i]=l.useState(null),[r,c]=l.useState(null),[o,d]=l.useState(null),[u,p]=l.useState(!1),[m,x]=l.useState(null),[h,f]=l.useState(()=>Date.now()),b=w=>x(t("remote.serverPairing.error",{error:w instanceof Error?w.message:String(w)}));async function y(){try{const w=await F(aa);c(Array.isArray(w?.phones)?w.phones:[]),d(typeof w?.current=="string"?w.current:null)}catch(w){b(w)}}l.useEffect(()=>{y()},[]);const g=a?a.expiresAt<=h:!1;l.useEffect(()=>{if(!a)return;const w=setInterval(()=>f(Date.now()),15e3);return()=>clearInterval(w)},[a]),l.useEffect(()=>{if(!a||g)return;const w=setInterval(()=>{y()},qm);return()=>clearInterval(w)},[a,g]);async function v(){p(!0),x(null);try{i(await F(Vm,{method:"POST",body:"{}"})),f(Date.now())}catch(w){b(w)}finally{p(!1)}}async function C(w){x(null);try{await F(`${aa}/${encodeURIComponent(w)}`,{method:"DELETE"})}catch(N){b(N)}await y()}return e.jsxs(X,{title:t("teamPhone.title"),subtitle:t("teamPhone.subtitle",{team:s}),children:[e.jsx("div",{className:"mt-3 flex flex-wrap items-center gap-3",children:e.jsx("button",{type:"button","data-phone-pairing-action":!0,onClick:()=>{v()},disabled:u||!!n,title:n??void 0,className:"ui-button ui-button-primary",children:u?t("remote.serverPairing.creating"):t("remote.serverPairing.create")})}),n?e.jsx("p",{role:"status","data-team-phone-blocked":!0,className:"mt-3 text-[13px] text-ink-secondary",children:n}):null,a?e.jsx("div",{"data-team-phone-code":!0,className:"mt-4 rounded-lg border border-hairline/40 bg-inset p-4",children:g?e.jsx("p",{className:"text-[13px] text-ink-secondary",children:t("remote.serverPairing.expired")}):e.jsxs("div",{className:"flex flex-wrap items-start gap-5",children:[a.url?e.jsx("div",{className:"rounded-md bg-white p-2",children:e.jsx(es,{value:a.url,size:160,level:"M",bgColor:"#ffffff",fgColor:"#111111"})}):null,e.jsxs("div",{className:"min-w-[200px] flex-1",children:[e.jsx("div",{className:"font-mono text-[18px] tracking-[0.14em] text-ink",children:a.code}),e.jsx("div",{className:"mt-1 text-[13px] text-ink-secondary",children:rn(a.expiresAt)}),a.url?null:e.jsx("p",{className:"mt-3 text-[13px] text-ink-secondary",children:a.hint??t("remote.serverPairing.noLink")})]})]})}):null,e.jsx("p",{className:"mt-3 text-[13px] text-ink-secondary",children:t("teamPhone.stays",{team:s})}),r?e.jsxs("div",{"data-team-phones":!0,children:[e.jsx("div",{className:"mt-5 text-[13px] font-medium text-ink",children:t("remote.serverPairing.devices")}),r.length===0?e.jsx("p",{className:"mt-1 text-[13px] text-ink-secondary",children:t("remote.serverPairing.noDevices")}):e.jsx("ul",{className:"mt-1 divide-y divide-hairline/40",children:r.map(w=>e.jsxs("li",{"data-team-phone":w.id,className:"flex flex-wrap items-center justify-between gap-2 py-2 text-[13px]",children:[e.jsxs("span",{className:"text-ink",children:[Jm(w),e.jsxs("span",{className:"text-ink-secondary",children:[" · ",t("remote.serverPairing.seen",{when:Rs(w.lastSeenAt,h)}),w.id===o?` · ${t("remote.serverPairing.thisBrowser")}`:""]})]}),w.id===o?null:e.jsx("button",{type:"button","data-team-phone-remove":!0,onClick:()=>{C(w.id)},className:"ui-button",children:t("teamPhone.remove")})]},w.id))})]}):null,m?e.jsx("p",{className:"mt-3 text-[13px] text-danger",children:m}):null]})}function Xm({saved:s,onSaved:n,className:a}){const[i,r]=l.useState(s),[c,o]=l.useState(!1),[d,u]=l.useState(null);l.useEffect(()=>r(s),[s]);async function p(){const m=i.trim();if(!(c||m===s)){o(!0),u(null);try{const x=await F("/api/config",{method:"PATCH",body:JSON.stringify({computerName:m})});n(x.computerName??m)}catch(x){u(t("remote.computerName.error",{error:x instanceof Error?x.message:String(x)}))}finally{o(!1)}}}return e.jsxs("div",{"data-computer-name":!0,className:O("flex flex-col gap-1",a),children:[e.jsx("label",{htmlFor:"computer-name",className:"text-[13px] font-medium text-ink",children:t("remote.computerName.title")}),e.jsx("input",{id:"computer-name",value:i,disabled:c,placeholder:t("remote.computerName.placeholder"),"aria-describedby":"computer-name-help",onChange:m=>r(m.target.value),onBlur:()=>{p()},onKeyDown:m=>{m.key==="Enter"&&m.currentTarget.blur()},className:"w-full max-w-xs rounded-lg border border-hairline/40 bg-inset px-3 py-2 text-[13px] text-ink placeholder:text-ink-secondary focus:outline-none"}),e.jsx("p",{id:"computer-name-help",className:"text-[12px] leading-4 text-ink-secondary",children:t("remote.computerName.help")}),d?e.jsx("p",{role:"alert",className:"text-[12px] leading-4 text-danger",children:d}):null]})}function bt(s){return Id(s)}function Qm(s){return s?.kind==="session"&&!s.scopes.includes("admin")?"chat-only":null}function Zm(s,n){return n?s.filter(a=>a.scopes.includes("admin")):s}const ex="ui-button ui-button-primary",ia="ui-button";function ur({initialSession:s=null,initialPairingCodes:n=!0,cloudHome:a=!1,focusRequest:i=0,team:r,teamPhoneBlocked:c=null,simple:o=!1,reveal:d=!0}){const[u,p]=l.useState(s),[m,x]=l.useState(n),[h,f]=l.useState(null),[b,y]=l.useState("admin"),[g,v]=l.useState(null),[C,w]=l.useState([]),[N,I]=l.useState(null),[j,L]=l.useState(!1),[k,P]=l.useState("idle"),[S,M]=l.useState(null),[se,ne]=l.useState(()=>Date.now()),V=l.useRef(null),ie=l.useRef(0);async function re(){try{const U=await F("/api/auth/sessions");w(Array.isArray(U?.sessions)?U.sessions:[]),I(typeof U?.current=="string"?U.current:null)}catch(U){M(t("remote.serverPairing.error",{error:U instanceof Error?U.message:String(U)}))}}if(l.useEffect(()=>{Ai().then(U=>{p(U),bt(U)&&re(),(U.kind==="loopback"||U.kind==="session")&&F("/api/config").then(te=>{x(Pi(te).pairingCodes),bt(U)&&f(typeof te?.computerName=="string"?te.computerName:"")}).catch(()=>{})})},[]),l.useEffect(()=>{i?ie.current!==i&&Ii(V.current)&&(ie.current=i):ie.current=0},[i,u]),l.useEffect(()=>{if(!g)return;const U=setInterval(()=>ne(Date.now()),15e3);return()=>clearInterval(U)},[g]),r&&u?.kind==="session"&&u.team)return e.jsx("div",{ref:V,tabIndex:-1,"data-phone-pairing":"server",className:"scroll-mt-4 rounded-xl focus:outline-none",children:e.jsx(Ym,{team:r,blocked:c})});if(!bt(u))return Qm(u)!=="chat-only"?null:e.jsx("div",{ref:V,tabIndex:-1,"data-phone-pairing":"server",className:"scroll-mt-4 rounded-xl focus:outline-none",children:e.jsx(X,{title:t("remote.serverPairing.title"),subtitle:t(m?"remote.serverPairing.subtitle":"remote.serverPairing.portalSubtitle"),children:e.jsx("p",{"data-server-pairing-chat-only":!0,className:"mt-3 text-[13px] text-ink-secondary",children:t(m?"remote.serverPairing.chatOnly":"remote.serverPairing.portalChatOnly")})})});const oe=g?g.expiresAt<=se:!1,T=Zm(C,a);async function R(){L(!0),M(null),P("idle");try{const U=await F("/api/auth/pairing",{method:"POST",body:JSON.stringify({scopes:b==="admin"||a?["admin","client"]:["client"]})});v(U),ne(Date.now())}catch(U){M(t("remote.serverPairing.error",{error:U instanceof Error?U.message:String(U)}))}finally{L(!1)}}async function E(U){M(null);try{await F(`/api/auth/sessions/${encodeURIComponent(U)}`,{method:"DELETE"}),await re()}catch(te){M(t("remote.serverPairing.error",{error:te instanceof Error?te.message:String(te)}))}}async function D(){if(!g?.url)return;const U=await wi(g.url);U!=="empty"&&P(U)}const Q=m&&g?e.jsx("div",{className:"mt-4 rounded-lg border border-hairline/40 bg-inset p-4",children:oe?e.jsx("p",{className:"text-[13px] text-ink-secondary",children:t("remote.serverPairing.expired")}):e.jsxs("div",{className:"flex flex-wrap items-start gap-5",children:[g.url?e.jsx("div",{className:"rounded-md bg-white p-2",children:e.jsx(es,{value:g.url,size:160,level:"M",bgColor:"#ffffff",fgColor:"#111111"})}):null,e.jsxs("div",{className:"min-w-[200px] flex-1",children:[e.jsx("div",{className:"font-mono text-[18px] tracking-[0.14em] text-ink",children:g.code}),e.jsx("div",{className:"mt-1 text-[13px] text-ink-secondary",children:rn(g.expiresAt)}),g.url?e.jsxs("div",{className:"mt-3 flex flex-wrap items-center gap-2",children:[e.jsx("code",{className:"break-all text-[12px] text-ink-secondary",children:g.url}),e.jsx("button",{type:"button",onClick:()=>{D()},className:ia,children:t(k==="copied"?"remote.serverPairing.copied":k==="failed"?"common.copyFailed":"remote.serverPairing.copyLink")})]}):e.jsx("p",{className:"mt-3 text-[13px] text-ink-secondary",children:g.hint??t("remote.serverPairing.noLink")})]})]})}):null,le=U=>m&&!a&&h!==null?e.jsx(Xm,{saved:h,onSaved:f,className:U}):null,ae=U=>t(U.scopes.includes("admin")?"remote.serverPairing.scope.admin":"remote.serverPairing.scope.client");return o?e.jsxs("div",{ref:V,tabIndex:-1,"data-phone-pairing":"server",className:"flex scroll-mt-4 flex-col gap-1.5 focus:outline-none",children:[e.jsxs("div",{"data-settings-rows":"",className:O(ci,"flex flex-col"),children:[le("px-4 py-2.5"),e.jsx(ge,{title:t("settings.simple.computer.pair"),subtitle:m?a?t("remote.serverPairing.cloudPersonal"):void 0:t("remote.serverPairing.portal"),children:m?e.jsxs("div",{className:"flex items-center gap-2",children:[a?null:e.jsxs(ye,{variant:"ghost",value:b,"aria-label":t("remote.serverPairing.title"),onChange:U=>y(U.target.value==="client"?"client":"admin"),children:[e.jsx("option",{value:"admin",children:t("remote.serverPairing.scope.admin")}),e.jsx("option",{value:"client",children:t("remote.serverPairing.scope.client")})]}),e.jsx("button",{type:"button","data-phone-pairing-action":d?"":void 0,onClick:()=>{R()},disabled:j,className:"ui-button",children:j?t("remote.serverPairing.creating"):t("settings.simple.computer.createCode")})]}):null}),Q?e.jsx("div",{className:"px-4 pb-2.5 [&>div]:mt-0",children:Q}):null,T.length===0?e.jsx("p",{className:"px-4 py-2.5 text-[13px] leading-[18px] text-ink-secondary",children:t("remote.serverPairing.noDevices")}):T.map(U=>e.jsxs("div",{className:"flex min-h-11 flex-wrap items-center gap-x-5 gap-y-2 px-4 py-2.5",children:[e.jsxs("span",{className:"min-w-[min(100%,15rem)] flex-1 text-[14px] leading-5 text-ink",children:[U.label,e.jsxs("span",{className:"text-ink-secondary",children:[" · ",ae(U)," · ",t("remote.serverPairing.seen",{when:Rs(U.lastSeenAt,se)}),U.id===N?` · ${t("remote.serverPairing.thisBrowser")}`:""]})]}),U.id===N?null:e.jsx("button",{type:"button",onClick:()=>{E(U.id)},className:"ui-button ml-auto shrink-0",children:t("remote.serverPairing.signOut")})]},U.id))]}),S?e.jsx("p",{className:"pl-4 text-[12px] leading-4 text-danger",children:S}):null]}):e.jsx("div",{ref:V,tabIndex:-1,"data-phone-pairing":"server",className:"scroll-mt-4 rounded-xl focus:outline-none",children:e.jsxs(X,{title:t("remote.serverPairing.title"),subtitle:t(m?"remote.serverPairing.subtitle":"remote.serverPairing.portalSubtitle"),children:[m&&a?e.jsx("p",{"data-server-pairing-personal":!0,className:"mt-3 text-[13px] text-ink-secondary",children:t("remote.serverPairing.cloudPersonal")}):null,le("mt-3"),m?e.jsxs("div",{className:"mt-3 flex flex-wrap items-center gap-3",children:[a?null:e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"flex items-center gap-1.5 text-[13px] text-ink",children:[e.jsx("input",{type:"radio",name:"server-pairing-scope",checked:b==="admin",onChange:()=>y("admin")}),t("remote.serverPairing.scope.admin")]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-[13px] text-ink",children:[e.jsx("input",{type:"radio",name:"server-pairing-scope",checked:b==="client",onChange:()=>y("client")}),t("remote.serverPairing.scope.client")]})]}),e.jsx("button",{type:"button","data-phone-pairing-action":d?"":void 0,onClick:()=>{R()},disabled:j,className:ex,children:j?t("remote.serverPairing.creating"):t("remote.serverPairing.create")})]}):e.jsx("p",{"data-server-pairing-portal":!0,className:"mt-3 text-[13px] text-ink-secondary",children:t("remote.serverPairing.portal")}),Q,e.jsx("div",{className:"mt-5 text-[13px] font-medium text-ink",children:t(m?"remote.serverPairing.devices":"remote.serverPairing.portalDevices")}),T.length===0?e.jsx("p",{className:"mt-1 text-[13px] text-ink-secondary",children:t("remote.serverPairing.noDevices")}):e.jsx("ul",{className:"mt-1 divide-y divide-hairline/40",children:T.map(U=>e.jsxs("li",{className:"flex flex-wrap items-center justify-between gap-2 py-2 text-[13px]",children:[e.jsxs("span",{className:"text-ink",children:[U.label,U.email?e.jsxs("span",{className:"text-ink-secondary",children:[" · ",U.email]}):null,e.jsxs("span",{className:"text-ink-secondary",children:[" · ",U.scopes.includes("admin")?t("remote.serverPairing.scope.admin"):t("remote.serverPairing.scope.client")," · ",t("remote.serverPairing.seen",{when:Rs(U.lastSeenAt,se)}),U.id===N?` · ${t("remote.serverPairing.thisBrowser")}`:""]})]}),U.id===N?null:e.jsx("button",{type:"button",onClick:()=>{E(U.id)},className:ia,children:t("remote.serverPairing.signOut")})]},U.id))}),S?e.jsx("p",{className:"mt-3 text-[13px] text-danger",children:S}):null]})})}const tx="rounded-lg border border-hairline/40 px-3 py-1.5 text-[12px] text-ink hover:bg-control disabled:opacity-40";function sx(s){return s?.on?s.origin?t(s.https?"devices.computers.https":"devices.computers.http",{address:s.origin}):t("devices.computers.waiting",{app:Se()}):null}function nx({c:s,state:n,blocked:a,simple:i}){const r=n.routes?.tailscale?.computers===!0,c=sx(n.tailnetShare);return e.jsxs("div",{className:"flex flex-col gap-3 border-t border-hairline/30 pt-4","data-route-row":"tailscale-computers",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[13px] text-ink",children:t("devices.computers.title")}),e.jsx("div",{className:"mt-0.5 text-[12px] leading-relaxed text-ink-secondary",children:t("devices.computers.detail")}),r&&c&&e.jsx("div",{"data-tailnet-share":!0,className:"mt-1 break-words text-[12px] leading-relaxed text-ink","aria-live":"polite",children:c})]}),e.jsx("button",{type:"button",className:tx,disabled:s.busy||s.accountBusy||!!a&&!r,title:a??void 0,onClick:()=>{s.act(o=>o.setTailscaleComputers?.(!r)??o.state())},children:r?t("devices.route.turnOff"):t("devices.route.turnOn")})]}),r&&n.tailnetShare?.origin&&e.jsx(ur,{simple:i,reveal:!1})]})}const ax=s=>s.routes?Object.values(s.routes).some(n=>n.on):s.enabled;function ix(s){if(s.tailscaleProblem==="not-installed")return{kind:"not-installed",title:t("remote.tailscale.notInstalled"),detail:""};if(s.tailscaleProblem==="no-cli")return{kind:"signed-out",title:t("remote.tailscale.noCli"),detail:""};if(s.tailscaleProblem==="not-running")return{kind:"signed-out",title:t("remote.tailscale.notRunning"),detail:""};if(s.tailscaleProblem==="needs-permission")return{kind:"signed-out",title:t("remote.tailscale.needsPermission",{app:Se()}),detail:""};if(s.tailscaleProblem==="signed-out")return{kind:"signed-out",title:t("remote.tailscale.signIn"),detail:""};if(s.error)return{kind:"error",title:t("remote.status.attention"),detail:s.error};const n=s.routes?.tailscale;if(!n?.on)return{kind:"off",title:t("remote.status.off"),detail:""};if(!n.name)return{kind:"magicdns",title:t("remote.tailscale.magicDns"),detail:t("remote.tailscale.magicDnsDetail")};const a=t("remote.tailscale.ready",{name:n.name});return s.enabled?{kind:"ready",title:a,detail:t("remote.tailscale.readyDetail")}:{kind:"waiting",title:a,detail:t("remote.tailscale.linkOff")}}function $t(s,n){return s.setTailscale?s.setTailscale(n):n?s.refreshTailscale():s.state()}const rx={wifi:"remote.notice.wifi",relay:"remote.notice.relay",tailscale:"remote.notice.tailscale",https:"remote.notice.https"};function ra({c:s,notices:n}){return n.length===0?null:e.jsx("div",{className:"flex flex-col gap-2","data-route-notices":"",children:n.map(a=>e.jsxs("div",{role:"status","data-route-notice":a,className:"flex flex-wrap items-center justify-between gap-3 rounded-xl bg-inset px-3 py-2.5 text-[13px] text-ink",children:[e.jsx("span",{className:"min-w-0",children:t(rx[a])}),e.jsxs("span",{className:"flex shrink-0 gap-2",children:[e.jsx("button",{type:"button",disabled:s.busy,className:"rounded-lg border border-hairline/40 px-2.5 py-1 text-[12px] hover:bg-control disabled:opacity-40",onClick:()=>{s.act(i=>a==="tailscale"?$t(i,!1):i.setRoute?.(a,!1)??i.state())},children:t("remote.notice.turnOff")}),e.jsx("button",{type:"button",disabled:s.busy,className:"rounded-lg px-2.5 py-1 text-[12px] text-ink-secondary hover:bg-control disabled:opacity-40",onClick:()=>{s.act(i=>i.dismissNotice?.(a)??i.state())},children:t("common.ok")})]})]},a))})}function lx(s,n){return s?.paused===!0&&s.available&&n?.enabled===!0&&!n.error&&n.devices.length>0}const pr=s=>{const n=Math.round((Date.now()-s)/1e3);if(n<90)return t("remote.time.justNow");const a=Math.round(n/60);if(a<60)return t("remote.time.minutes",{count:a});const i=Math.round(a/60);return i<24?t("remote.time.hours",{count:i}):t("remote.time.days",{count:Math.round(i/24)})},ox=s=>{try{return new URL(s).host}catch{return s}},Kt={wifi:{name:"devices.route.wifi",detail:"devices.route.wifiDetail"},relay:{name:"devices.route.relay",detail:"devices.route.relayDetail"}},Fe="rounded-lg border border-hairline/40 px-3 py-1.5 text-[12px] text-ink hover:bg-control disabled:opacity-40";function mr(s,n){return s?.on?n===0?t("devices.route.waiting"):s.since?t("devices.route.onSince",{date:new Date(s.since).toLocaleDateString(void 0,{month:"short",day:"numeric"})}):t("devices.route.on"):t("devices.route.off")}function ln(s,n,a){return n==="tailscale"?$t(s,a):s.setRoute?.(n,a)??(a?s.start([n]):s.state())}function la({c:s,state:n,route:a,blocked:i}){const r=n.routes?.[a];return e.jsxs("div",{className:"flex items-center justify-between gap-4 py-3","data-route-row":a,children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[13px] text-ink",children:t(Kt[a].name,{app:Se()})}),e.jsxs("div",{className:"mt-0.5 text-[12px] leading-relaxed text-ink-secondary",children:[mr(r,n.devices.length)," · ",t(Kt[a].detail,{app:Se()})]})]}),e.jsx("button",{type:"button",className:Fe,disabled:s.busy||!!i&&!r?.on,title:i??void 0,onClick:()=>{s.act(c=>ln(c,a,!r?.on))},children:r?.on?t("devices.route.turnOff"):t("devices.route.turnOn")})]})}const oa='button:not([disabled]), a[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), summary, [tabindex]:not([tabindex="-1"])';function ca({c:s,state:n,onClose:a,secureAddress:i=!1}){const[r,c]=l.useState({wifi:!0,relay:!0}),o=["wifi","relay"],d=o.some(g=>n.routes?.[g]?.on)||n.routes?.tailscale?.on===!0,[u,p]=l.useState(d||i?"pairing":"consent"),{start:m}=s;l.useEffect(()=>{i&&m()},[i,m]);const x=o.filter(g=>r[g]),h=async()=>{for(const g of x)await s.act(v=>ln(v,g,!0));p("pairing"),s.useLocal()},f=u==="consent"?a:()=>{s.cancel(),a()},b=l.useRef(null);l.useEffect(()=>{const g=document.activeElement instanceof HTMLElement?document.activeElement:null,v=b.current;return v&&!v.contains(document.activeElement)&&v.querySelector(oa)?.focus(),()=>{g?.isConnected&&g.focus()}},[]),l.useEffect(()=>{const g=v=>{const C=b.current;if(!C||v.defaultPrevented||v.isComposing||v.key!=="Escape"&&v.key!=="Tab")return;if(v.preventDefault(),v.key==="Escape"){f();return}const w=[...C.querySelectorAll(oa)].filter(j=>j.getClientRects().length);if(!w.length)return;const N=w.indexOf(document.activeElement),I=N<0?v.shiftKey?-1:0:N+(v.shiftKey?-1:1);w.at(I%w.length).focus()};return window.addEventListener("keydown",g,!0),()=>window.removeEventListener("keydown",g,!0)},[f]);const y=e.jsx("div",{ref:b,role:"dialog","aria-modal":"true","aria-label":u==="consent"?t("devices.pair.title"):t("devices.pair.titlePhone"),className:"fixed inset-0 z-50 flex items-center justify-center bg-black/30 p-4","data-pair-dialog":u,children:e.jsxs("div",{className:"flex max-h-full w-full max-w-[460px] flex-col gap-4 overflow-y-auto rounded-2xl bg-card p-5 shadow-xl",children:[e.jsx("div",{className:"text-[15px] font-semibold text-ink",children:u==="consent"?t("devices.pair.title"):t("devices.pair.titlePhone")}),u==="consent"?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex flex-col gap-2 text-[13px] text-ink",children:[e.jsx("div",{children:t("devices.pair.willTurnOn",{app:Se()})}),o.map(g=>e.jsxs("label",{className:"flex items-start gap-2",children:[e.jsx("input",{type:"checkbox",className:"mt-0.5",checked:r[g],onChange:v=>c(C=>({...C,[g]:v.target.checked}))}),e.jsxs("span",{children:[t(Kt[g].name,{app:Se()}),g==="relay"&&e.jsx("span",{className:"block text-[12px] text-ink-secondary",children:t(Kt.relay.detail,{app:Se()})})]})]},g)),e.jsx("div",{className:"text-[12px] text-ink-secondary",children:t("devices.pair.changeLater")}),x.length===0&&e.jsx("div",{role:"alert",className:"text-[12px] text-danger",children:t("devices.pair.pickOne")})]}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",className:Fe,onClick:f,children:t("common.cancel")}),e.jsx("button",{type:"button",disabled:x.length===0||s.busy,onClick:()=>{h()},className:"rounded-lg bg-accent px-3 py-1.5 text-[12px] font-medium text-white disabled:opacity-40",children:t("devices.route.turnOn")})]})]}):e.jsxs(e.Fragment,{children:[e.jsx($m,{controller:s}),e.jsx("div",{className:"text-[12px] leading-relaxed text-ink-secondary",children:xr(n)}),e.jsx("div",{className:"flex justify-end",children:e.jsx("button",{type:"button",className:Fe,onClick:f,children:t("devices.pair.done")})})]})]})});return e.jsx(Ys,{modal:!0,children:y})}function cx({c:s,state:n}){const a=n.pairing;if(!a)return null;const i=new Date(a.expiresAt).toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit"});return e.jsxs("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-hairline/40 bg-card px-3 py-2.5","data-open-code":"",children:[e.jsx("div",{className:"min-w-0 text-[13px] text-ink",children:t("devices.openCode",{until:i})}),e.jsx("button",{type:"button",className:Fe,disabled:s.busy,onClick:()=>{s.act(r=>r.pairing(!1,a.token))},children:t("devices.revoke")})]})}function xr(s){const n=i=>s.routes?.[i]?.on===!0,a=[n("wifi")&&t("devices.reach.wifi"),n("tailscale")&&t("devices.reach.tailscale"),n("https")&&t("devices.reach.https",{app:Se()}),n("relay")&&t("devices.reach.relay",{app:Se()})].filter(i=>!!i);return a.length===0?t("devices.reach.none"):t("devices.reach.line",{ways:new Intl.ListFormat(void 0,{type:"conjunction"}).format(a)})}function dx({profileEmail:s="",focusRequest:n=0,simple:a=!1}){const i=Um(s),r=i.state,c=l.useRef(null),o=l.useRef(0),d=!!r,[u,p]=l.useState(!1),[m,x]=l.useState(!a);l.useEffect(()=>{n?o.current!==n&&Ii(c.current)&&(o.current=n):o.current=0},[n,d]);const h=l.useRef(!1),f=lx(i.account,r),{accountAct:b}=i;l.useEffect(()=>{!f||h.current||!Ze()?.prepare||(h.current=!0,b(S=>S.prepare?.()??S.state()))},[f,b]);const y=G().state.config?.managedPolicy,g=y?.remoteAccess===!1?t("policy.remoteBlocked",{organization:y.organizationName}):null,v=y?.remoteAccess===!1?t("policy.managedBy",{organization:y.organizationName}):null;if(!ct())return null;if(!r)return e.jsx(X,{title:t("devices.title"),subtitle:t("remote.checking"),children:e.jsx(q,{size:15,className:"animate-spin text-ink-secondary"})});const C=r.devices.length,w=dr(i.account,i.accountError),N=ix(r),I=r.routes?.tailscale?.on===!0,j=r.routes?.https?.on===!0,L=r.endpoints?.find(S=>S.kind==="hosted"),k=i.busy||g?void 0:()=>p("device"),P=S=>e.jsx("button",{type:"button",disabled:i.busy||!!g,title:v??void 0,onClick:()=>p("device"),className:"w-fit rounded-lg bg-accent px-3 py-2 text-[13px] font-medium text-white disabled:opacity-40","data-pair-device":"",children:S});return a&&!m?e.jsxs("div",{className:"flex flex-col gap-3",ref:c,tabIndex:-1,"data-phone-pairing":"computer",children:[e.jsx(ra,{c:i,notices:r.notices??[]}),C===0?e.jsxs("div",{className:"flex items-center justify-between gap-4 rounded-xl border border-hairline/40 bg-card px-4 py-3",children:[e.jsx("div",{className:"text-[13px] text-ink",children:t("devices.simple.setUpTitle",{app:Se()})}),e.jsx("button",{type:"button",className:Fe,disabled:i.busy||!!g,onClick:()=>p("device"),children:t("devices.simple.setUp")})]}):e.jsxs("div",{className:"flex flex-col gap-3 rounded-xl border border-hairline/40 bg-card px-4 py-3",children:[e.jsx("div",{className:"text-[13px] font-medium text-ink",children:t("devices.simple.yourPhone")}),e.jsx(na,{c:i,state:r,onPairAgain:k}),e.jsxs("div",{className:"text-[12px] text-ink-secondary",children:[xr(r)," ",e.jsx("button",{type:"button",className:"text-accent hover:underline",onClick:()=>x(!0),children:t("devices.change")})]}),P(t("devices.pairAnother"))]}),u&&e.jsx(ca,{c:i,state:r,onClose:()=>p(!1)})]}):e.jsxs("div",{className:"flex flex-col gap-4",ref:c,tabIndex:-1,"data-phone-pairing":"computer",children:[g&&e.jsx("p",{role:"status",className:"text-[13px] leading-relaxed text-ink-secondary",children:g}),e.jsx("p",{className:"text-[13px] leading-relaxed text-ink-secondary",children:t("devices.intro")}),P(t("devices.pair")),e.jsx(ra,{c:i,notices:r.notices??[]}),u&&e.jsx(ca,{c:i,state:r,onClose:()=>p(!1),secureAddress:u==="https"}),e.jsxs("section",{className:"flex flex-col gap-2","data-devices-block":"paired",children:[e.jsx("div",{className:"text-[13px] font-medium text-ink",children:t("devices.paired")}),xo(i.account,r)&&e.jsx("p",{role:"status","data-devices-notice":"tunnel-retired",className:"rounded-xl bg-inset px-3 py-2.5 text-[13px] leading-relaxed text-ink",children:t("remote.devices.retiredNotice")}),e.jsx(cx,{c:i,state:r}),C?e.jsx(na,{c:i,state:r,onPairAgain:k}):!r.pairing&&e.jsx("div",{className:"text-[12px] text-ink-secondary",children:t("devices.pairedNone")}),e.jsx(Km,{})]}),e.jsxs("section",{className:"flex flex-col rounded-xl border border-hairline/40 bg-card px-4","data-devices-block":"routes",children:[e.jsx("div",{className:"pt-3 text-[13px] font-medium text-ink",children:t("devices.howTheyReach")}),e.jsx(la,{c:i,state:r,route:"wifi",blocked:v}),e.jsx("div",{className:"border-t border-hairline/30",children:e.jsx(la,{c:i,state:r,route:"relay",blocked:v})}),e.jsxs("details",{className:"border-t border-hairline/30 py-3",open:I||j||void 0,children:[e.jsx("summary",{className:"cursor-pointer text-[13px] text-ink",children:t("devices.moreWays")}),e.jsxs("div",{className:"mt-3 flex flex-col gap-4","data-route-row":"tailscale",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[13px] text-ink",children:"Tailscale"}),e.jsx("div",{className:"mt-0.5 text-[12px] leading-relaxed text-ink-secondary",children:t("remote.tailscaleSwitch.detail",{app:Se()})})]}),e.jsx("button",{type:"button",className:Fe,disabled:i.busy||i.accountBusy||!!v&&!I,onClick:()=>{i.act(S=>$t(S,!I))},children:I?t("devices.route.turnOff"):t("devices.route.turnOn")})]}),N.kind!=="off"&&e.jsxs("div",{"data-tailscale-status":N.kind,className:"rounded-xl bg-inset px-3 py-3","aria-live":"polite",children:[e.jsxs("div",{className:"flex items-start gap-2.5",children:[e.jsx(Gs,{size:16,className:`mt-0.5 shrink-0 ${N.kind==="ready"?"text-success":"text-ink-secondary"}`}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[13px] font-medium text-ink",children:N.title}),N.detail&&e.jsx("div",{className:"mt-0.5 text-[12px] leading-relaxed text-ink-secondary",children:N.detail})]})]}),e.jsxs("div",{className:"mt-3 flex flex-wrap gap-2",children:[I&&N.kind!=="error"&&e.jsx("button",{type:"button",className:Fe,disabled:i.busy||i.accountBusy,onClick:i.refreshTailscale,children:i.busy?t("common.checking"):t("remote.checkAgain")}),N.kind==="not-installed"&&e.jsx("a",{href:"https://tailscale.com/download",target:"_blank",rel:"noreferrer",className:Fe,children:t("remote.tailscale.getIt")}),N.kind==="signed-out"&&e.jsx("button",{type:"button",className:Fe,disabled:i.busy||i.accountBusy,onClick:()=>{i.act(S=>$t(S,!0))},children:t("common.tryAgain")})]})]}),I&&r.routes?.tailscale?.name&&e.jsx(nx,{c:i,state:r,blocked:v,simple:a}),e.jsxs("div",{className:"flex items-start justify-between gap-4 border-t border-hairline/30 pt-4","data-route-row":"https",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[13px] text-ink",children:t("devices.route.https")}),e.jsxs("div",{className:"mt-0.5 text-[12px] leading-relaxed text-ink-secondary",children:[j&&L?t("devices.route.httpsOn",{address:ox(L.url)}):mr(r.routes?.https,C)," · ",t("devices.route.httpsDetail",{app:Se()})]}),i.account?.status==="ready"&&e.jsx("div",{className:"mt-1 text-[12px] text-ink-secondary",children:t("remote.account.signedIn",{email:i.account.email??t("remote.account.yourAccount")})}),w&&e.jsx("div",{className:"mt-1 text-[12px] text-danger",children:w})]}),j?e.jsx("button",{type:"button",className:Fe,disabled:i.busy,onClick:()=>{i.act(S=>ln(S,"https",!1))},children:t("devices.route.turnOff")}):e.jsx("button",{type:"button",className:Fe,disabled:i.busy||i.accountBusy||!!v,onClick:()=>p("https"),children:t("devices.route.setUp")})]})]})]})]}),e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[13px] text-ink",children:t("remote.keepAwake")}),e.jsx("div",{className:"mt-0.5 text-[12px] leading-relaxed text-ink-secondary",children:t("remote.keepAwakeDetail")})]}),e.jsx(fe,{checked:r.keepAwake,"aria-label":t("remote.keepAwakeAria"),disabled:i.busy||!ax(r),onClick:()=>{i.act(S=>S.keepAwake(!r.keepAwake))}})]}),a&&e.jsx("button",{type:"button",className:"w-fit text-[12px] text-accent hover:underline",onClick:()=>x(!1),children:t("devices.done")}),(i.error||r.error)&&e.jsx("div",{className:"text-[12px] text-danger",children:i.error??r.error})]})}function ux(s){const n=s.trim().toLowerCase();return!n||/\s/.test(n)?null:n.startsWith("@")?/^@[^@\s]+\.[^@\s]+$/.test(n)?n:null:/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(n)?n:null}function da(s,n,a){const i=s.admins.filter(c=>c!==n),r=s.members.filter(c=>c!==n);return a==="admin"?{admins:[...i,n],members:r}:{admins:i,members:[...r,n]}}function px(s,n){return{admins:s.admins.filter(a=>a!==n),members:s.members.filter(a=>a!==n)}}function ua(s,n){const a=s.replace(/\/+$/,"");return n.startsWith("@")?`${a}/pair`:`${a}/pair?email=${encodeURIComponent(n)}`}function mx(s,n,a){const i=[],r=new Set,c=(o,d)=>{const u=o.trim().toLowerCase();if(!u||r.has(u))return;r.add(u);const p=n.filter(x=>x.email?.toLowerCase()===u),m=a.find(x=>x.key===`user:${u}`);i.push({entry:u,role:d,isDomain:u.startsWith("@"),lastSeenAt:p.length?Math.max(...p.map(x=>x.lastSeenAt)):null,devices:p.length,turns:m?.turns??0,costUsd:m?.costUsd??null,...yt(m?.estimatedUsd)&&m.estimatedUsd>0?{estimated:!0}:{}})};for(const o of s.admins)c(o,"admin");for(const o of s.members)c(o,"member");return i}function xx(s,n){const a=new Map;for(const i of s){const r=i.email?.trim().toLowerCase();r&&a.set(r,[...a.get(r)??[],i])}return[...a.entries()].map(([i,r])=>{const c=n.find(o=>o.key===`user:${i}`);return{entry:i,role:r.some(o=>o.scopes?.includes("admin"))?"admin":"member",isDomain:!1,lastSeenAt:Math.max(...r.map(o=>o.lastSeenAt)),devices:r.length,turns:c?.turns??0,costUsd:c?.costUsd??null}}).sort((i,r)=>i.role===r.role?i.entry.localeCompare(r.entry):i.role==="admin"?-1:1)}function hx(s,n=Date.now()){return s===null?t("people.never"):n-s<1440*6e4?t("people.today"):new Date(s).toISOString().slice(0,10)}function hr({people:s,busy:n,onRole:a,onRemove:i,onLink:r,readOnly:c=!1}){if(s.length===0)return e.jsx("p",{className:"text-[13px] text-ink-secondary",children:t(c?"people.portal.empty":"people.empty")});const o="grid grid-cols-[1fr_auto_auto_auto_auto] items-center gap-x-4";return e.jsxs("div",{className:"flex flex-col",children:[e.jsxs("div",{className:O(o,"border-b border-hairline/40 pb-2 text-[12px] font-medium uppercase tracking-wide text-ink-secondary"),children:[e.jsx("span",{children:t("people.colPerson")}),e.jsx("span",{children:t("people.colRole")}),e.jsx("span",{className:"text-right",children:t("people.colLastSeen")}),e.jsx("span",{className:"text-right",children:t("people.colMonth")}),e.jsx("span",{})]}),s.map(d=>e.jsxs("div",{className:O(o,"border-b border-hairline/20 py-2 text-[13px]"),children:[e.jsxs("span",{className:"min-w-0",children:[e.jsx("span",{className:"block truncate text-ink",children:d.isDomain?t("people.everyoneAt",{domain:d.entry.slice(1)}):d.entry}),d.devices>0&&e.jsx("span",{className:"block text-[12px] text-ink-secondary",children:t("people.devices",{count:String(d.devices)})})]}),e.jsx("span",{className:O("rounded-full px-2 py-0.5 text-[11px] font-medium",d.role==="admin"?"bg-accent/15 text-accent":"bg-control text-ink-secondary"),children:d.role==="admin"?t("people.roleAdmin"):t("people.roleMember")}),e.jsx("span",{className:"text-right tabular-nums text-ink-secondary",children:d.isDomain?"—":hx(d.lastSeenAt)}),e.jsx("span",{className:"text-right tabular-nums text-ink",title:t("people.turns",{turns:String(d.turns)}),children:yt(d.costUsd)?`${d.estimated?"~":""}${vt(d.costUsd)}`:"—"}),c?e.jsx("span",{}):e.jsxs("span",{className:"flex items-center justify-end gap-2 text-[12px]",children:[e.jsx("button",{type:"button",disabled:n,onClick:()=>r(d),"aria-label":t("people.link"),title:t("people.link"),className:"rounded-md p-1 text-ink-secondary hover:bg-control hover:text-ink disabled:opacity-50",children:e.jsx(ho,{size:13})}),e.jsx("button",{type:"button",disabled:n,onClick:()=>a(d,d.role==="admin"?"member":"admin"),className:"text-ink-secondary hover:text-ink disabled:opacity-50",children:d.role==="admin"?t("people.makeMember"):t("people.makeAdmin")}),e.jsx("button",{type:"button",disabled:n,onClick:()=>i(d),className:"text-danger hover:underline disabled:opacity-50",children:t("people.remove")})]})]},d.entry))]})}function gr({link:s}){const{state:n,copy:a}=Qt(s);return e.jsxs("div",{className:"mt-3 rounded-lg border border-hairline/40 bg-inset p-3 text-[13px]",children:[e.jsx("div",{className:"mb-1 text-ink-secondary",children:t("people.link")}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("code",{className:"min-w-0 flex-1 select-all break-all text-ink",children:s}),e.jsxs("button",{type:"button",onClick:a,className:"flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[12px] text-ink-secondary hover:bg-control hover:text-ink",children:[n==="copied"?e.jsx(ve,{size:13,className:"text-success"}):n==="failed"?e.jsx(We,{size:13,className:"text-danger"}):e.jsx(Js,{size:13}),t(n==="copied"?"people.copied":n==="failed"?"common.copyFailed":"people.copy")]})]}),e.jsx("p",{className:"mt-2 text-[12px] leading-relaxed text-ink-secondary",children:t("people.linkHint")})]})}function gx({peopleUrl:s,people:n}){const a=()=>{};return e.jsxs(X,{title:t("people.title"),subtitle:t("people.portal.subtitle"),children:[e.jsxs("div",{"data-people-portal":!0,className:"flex flex-col gap-3 text-[13px] leading-relaxed text-ink-secondary",children:[e.jsx("p",{children:t("people.portal.managed")}),s&&e.jsxs("a",{href:s,target:"_blank",rel:"noopener noreferrer",className:"flex w-fit items-center gap-2 rounded-lg bg-control px-3 py-2 font-medium text-ink hover:bg-control/70",children:[t("people.portal.open")," ",e.jsx(Nt,{size:14,"aria-hidden":"true"})]})]}),e.jsx("div",{className:"mt-4",children:e.jsx(hr,{people:n,busy:!1,readOnly:!0,onRole:a,onRemove:a,onLink:a})}),e.jsx("p",{className:"mt-3 text-[12px] leading-relaxed text-ink-secondary",children:t("people.portal.note")})]})}function fr({simple:s=!1,startOpen:n=!1}){const[a,i]=l.useState(n),[r,c]=l.useState(!1),[o,d]=l.useState(null),[u,p]=l.useState(null),[m,x]=l.useState(null),[h,f]=l.useState([]),[b,y]=l.useState(typeof window<"u"?window.location.origin:""),[g,v]=l.useState(null),[C,w]=l.useState(""),[N,I]=l.useState("member"),[j,L]=l.useState(null),[k,P]=l.useState(!1),[S,M]=l.useState(!1),[se,ne]=l.useState(null),V=l.useCallback(async()=>{M(!0),ne(null);try{const[R,E,D,Q,le]=await Promise.all([F("/api/config"),F("/api/auth/sessions").catch(()=>({sessions:[]})),F("/api/usage?groupBy=user").catch(()=>({groups:[]})),F("/api/settings/custom-domain").catch(()=>null),fetch("/.well-known/openmausbot/environment").then(ce=>ce.ok?ce.json():null).catch(()=>null)]),ae={admins:Array.isArray(R?.signIn?.admins)?R.signIn.admins:[],members:Array.isArray(R?.signIn?.members)?R.signIn.members:[]},U=Pi(R);p(U),x(ae);const te=Array.isArray(E?.sessions)?E.sessions:[],me=Array.isArray(D?.groups)?D.groups:[];f(U.authority==="portal"?xx(te,me):mx(ae,te,me)),typeof Q?.publicUrl=="string"&&Q.publicUrl&&y(Q.publicUrl),v(le?.capabilities?.emailSignIn===!0?!0:le?!1:null)}catch(R){ne(R instanceof Error?R.message:String(R))}finally{M(!1)}},[]);l.useEffect(()=>{Ai().then(R=>{d(R),bt(R)&&V()})},[V]);const ie=async R=>{P(!0),ne(null);try{await F("/api/config",{method:"PUT",body:JSON.stringify({signIn:R})}),await V()}catch(E){ne(E instanceof Error?E.message:String(E))}finally{P(!1)}},re=async()=>{if(c(!0),!m||k)return;const R=ux(C);if(!R){ne(t("remote.signInAccess.invalid"));return}await ie(da(m,R,N)),w(""),L(ua(b,R))};if(!bt(o))return null;const oe=u?.authority==="portal"?e.jsx(gx,{peopleUrl:u.peopleUrl,people:h}):null,T=e.jsxs(e.Fragment,{children:[g===!1&&(!s||r)&&e.jsx("p",{className:"mb-3 rounded-lg border border-warning/25 bg-warning/5 px-3 py-2 text-[13px] text-ink-secondary",children:t(u?.pairingCodes===!1?"people.portalSignIn":"people.notHosted")}),e.jsxs("form",{className:"flex flex-wrap items-center gap-2",onSubmit:R=>{R.preventDefault(),re()},children:[e.jsx("input",{value:C,onChange:R=>w(R.target.value),placeholder:t("remote.signInAccess.placeholder"),"aria-label":t("people.inviteEmail"),disabled:k,className:"min-w-[16rem] flex-1 rounded-lg border border-hairline/40 bg-inset px-3 py-2 text-[13px] text-ink placeholder:text-ink-secondary focus:outline-none disabled:opacity-50"}),e.jsxs(ye,{value:N,onChange:R=>I(R.target.value),"aria-label":t("people.colRole"),disabled:k,children:[e.jsx("option",{value:"member",children:t("people.roleMember")}),e.jsx("option",{value:"admin",children:t("people.roleAdmin")})]}),e.jsxs("button",{type:"submit",disabled:k||!C.trim(),className:"ui-button ui-button-primary",children:[k?e.jsx(q,{size:13,className:"animate-spin"}):e.jsx(Oe,{size:13}),t("people.invite")]}),e.jsx("button",{type:"button",onClick:()=>{V()},disabled:S||k,"aria-label":t("people.refresh"),title:t("people.refresh"),className:"rounded-md p-1.5 text-ink-secondary hover:bg-control hover:text-ink disabled:opacity-50",children:e.jsx(De,{size:13,className:O(S&&"animate-spin")})})]}),e.jsx("p",{className:"mt-2 text-[12px] leading-relaxed text-ink-secondary",children:t("people.inviteHint")}),j&&e.jsx(gr,{link:j}),se&&e.jsx("p",{role:"alert",className:"mt-2 text-[12px] text-danger",children:se}),e.jsx("div",{className:"mt-4",children:e.jsx(hr,{people:h,busy:k,onRole:(R,E)=>{m&&ie(da(m,R.entry,E))},onRemove:R=>{m&&ie(px(m,R.entry))},onLink:R=>L(ua(b,R.entry))})}),!s&&e.jsx("p",{className:"mt-3 text-[12px] leading-relaxed text-ink-secondary",children:t("people.note")})]});return s?e.jsxs("div",{"data-people-summary":"",children:[e.jsxs("div",{role:"group","aria-label":t("people.title"),className:"flex min-w-0 items-center gap-3 px-4 py-[13px]",children:[e.jsx("span",{"aria-hidden":"true",className:"flex size-11 shrink-0 items-center justify-center rounded-full bg-ink/[0.06] text-ink-secondary",children:e.jsx(Ut,{size:20})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"truncate text-[14px] leading-5 text-ink",children:t("people.title")}),e.jsx("div",{className:"text-[13px] leading-[18px] text-ink-secondary",children:t("settings.simple.people")})]}),e.jsx("button",{type:"button","aria-expanded":a,className:"ui-button shrink-0",onClick:()=>i(!a),children:a?t("common.done"):t("settings.simple.people.invite")})]}),a&&e.jsx("div",{className:"px-3.5 pb-3.5 pt-1",children:oe??T})]}):oe??e.jsx(X,{title:t("people.title"),subtitle:t("people.subtitle"),children:T})}const ks="rounded-lg border border-hairline/40 bg-inset px-3 py-2 text-[13px] text-ink placeholder:text-ink-secondary focus:outline-none [color-scheme:dark]";function fx({entry:s}){const[n,a]=l.useState(!1),i=s.type==="admin"&&(s.changed?.length||s.before||s.after);return e.jsx("li",{className:"border-b border-hairline/20 py-2 text-[13px]","data-activity-entry":s.type,children:e.jsxs("div",{className:"grid grid-cols-[auto_1fr] items-start gap-x-3",children:[e.jsx("time",{className:"whitespace-nowrap tabular-nums text-ink-secondary",dateTime:s.at,children:new Date(s.at).toLocaleString(Us())}),e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex flex-wrap items-baseline gap-x-2",children:[e.jsx("span",{className:"font-medium text-ink",children:_d(s.who)}),e.jsx("span",{className:"min-w-0 break-words text-ink",children:$d(s)})]}),s.type==="approval"&&s.summary&&e.jsx("div",{className:"mt-0.5 truncate text-[12px] text-ink-secondary",children:go(s.summaryCode,s.summary,s.summaryParams)}),i&&e.jsxs("button",{type:"button",onClick:()=>a(!n),"aria-expanded":n,className:"cursor-pointer mt-0.5 flex items-center gap-1 text-[12px] text-ink-secondary hover:text-ink",children:[e.jsx(Xs,{size:12,className:O("transition-transform",n&&"rotate-90")}),t("activity.changed",{paths:(s.changed??[]).join(", ")||"—"})]}),i&&n&&s.type==="admin"&&e.jsxs("dl",{className:"mt-1 grid grid-cols-[auto_1fr_1fr] gap-x-3 gap-y-0.5 rounded-lg bg-inset p-2 text-[12px]",children:[e.jsx("dt",{}),e.jsx("dd",{className:"text-ink-secondary",children:t("activity.before")}),e.jsx("dd",{className:"text-ink-secondary",children:t("activity.after")}),(s.changed??Object.keys({...s.before,...s.after})).map(r=>e.jsxs("div",{className:"contents",children:[e.jsx("dt",{className:"font-mono text-ink-secondary",children:r}),e.jsx("dd",{className:"min-w-0 break-all font-mono text-ink",children:Dn(s.before?.[r])}),e.jsx("dd",{className:"min-w-0 break-all font-mono text-ink",children:Dn(s.after?.[r])})]},r))]})]})]})})}function br(){const[s,n]=l.useState({who:"",what:"all",from:"",to:""}),[a,i]=l.useState([]),[r,c]=l.useState(0),[o,d]=l.useState(null),[u,p]=l.useState(!1),[m,x]=l.useState(null),h=Dd(s),f=l.useCallback(async()=>{p(!0),x(null);try{const y=await F(`/api/admin-activity${h}`);i(y.entries),c(y.total),d(y.retentionDays)}catch(y){x(y instanceof Error?y.message:String(y))}finally{p(!1)}},[h]);l.useEffect(()=>{const y=window.setTimeout(()=>{f()},250);return()=>window.clearTimeout(y)},[f]);const b=y=>n(g=>({...g,...y}));return e.jsxs(X,{title:t("activity.title"),subtitle:t("activity.subtitle",{days:String(o??180)}),children:[e.jsxs("div",{className:"flex flex-wrap items-end gap-2",children:[e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] text-ink-secondary",children:[t("activity.who"),e.jsx("input",{value:s.who,onChange:y=>b({who:y.target.value}),placeholder:t("activity.whoPlaceholder"),className:O(ks,"w-44")})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] text-ink-secondary",children:[t("activity.what"),e.jsx(ye,{value:s.what,onChange:y=>b({what:y.target.value}),children:Ud.map(y=>e.jsx("option",{value:y,children:t(`activity.what.${y}`)},y))})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] text-ink-secondary",children:[t("activity.from"),e.jsx("input",{type:"date",value:s.from,max:s.to||void 0,onChange:y=>b({from:y.target.value}),className:ks})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] text-ink-secondary",children:[t("activity.to"),e.jsx("input",{type:"date",value:s.to,min:s.from||void 0,onChange:y=>b({to:y.target.value}),className:ks})]}),e.jsx("button",{type:"button",onClick:()=>{f()},disabled:u,"aria-label":t("activity.refresh"),title:t("activity.refresh"),className:"cursor-pointer rounded-md p-2 text-ink-secondary hover:bg-control hover:text-ink disabled:opacity-50",children:u?e.jsx(q,{size:14,className:"animate-spin"}):e.jsx(De,{size:14})}),e.jsxs("a",{href:`/api/admin-activity.csv${h}`,download:!0,className:"ui-button hover:bg-raised-hover",children:[e.jsx(Vs,{size:13,"aria-hidden":"true"}),t("activity.export")]})]}),m&&e.jsx("p",{role:"alert",className:"mt-3 text-[13px] text-danger",children:t("activity.error",{message:m})}),!m&&a.length===0&&!u&&e.jsx("p",{className:"mt-4 text-[13px] text-ink-secondary",children:t("activity.empty")}),a.length>0&&e.jsx("ul",{className:"mt-3 flex flex-col",children:a.map((y,g)=>e.jsx(fx,{entry:y},`${y.at}-${g}`))}),r>a.length&&e.jsx("p",{className:"mt-3 text-[12px] text-ink-secondary",children:t("activity.more",{shown:String(a.length),total:String(r)})})]})}const pa=4,on="flex w-full min-w-0 items-center gap-3 px-3 py-2 text-start",cn="flex flex-col divide-y divide-hairline/30 overflow-hidden rounded-xl border border-hairline/40 bg-card",bx=s=>s.filter(n=>!n.hidden&&!n.defaultBot?.person).sort((n,a)=>n.name.localeCompare(a.name)),yr=(s,n)=>Jt(s)===n||pi(Yt(s),n)!=="none",vr=(s,n)=>{const a=di(s,n);return a?t("lookedAfter.line",{name:a.name}):t("lookedAfter.nobody")},ma=(s,...n)=>n.some(a=>a?.toLowerCase().includes(s));function yx(){const{state:s}=G(),n=fo(),a=bo(),i=l.useRef(null),[r,c]=l.useState("bot"),[o,d]=l.useState(""),[u,p]=l.useState(null),[m,x]=l.useState(null),h=l.useRef(null),[f,b]=l.useState(null),[y,g]=l.useState(""),v=l.useCallback(()=>b(null),[]);if(l.useEffect(()=>{m||!h.current||([...i.current?.querySelectorAll("[data-access-person]")??[]].find(k=>k.dataset.accessPerson===h.current)?.focus(),h.current=null)},[m]),!n||!a)return null;const C=n.people.filter(k=>k.role==="member").sort((k,P)=>k.name.localeCompare(P.name)),w=bx(s.bots),N=u?w.find(k=>k.id===u):void 0,I=m?C.find(k=>k.email===m):void 0,j=o.trim().toLowerCase(),L=async(k,P,S)=>{g("");const M=Yt(k);try{await En(k.id,P),b({botId:k.id,before:M,after:P,text:S})}catch(se){g(se instanceof Error?se.message:String(se))}};return e.jsxs("div",{ref:i,className:"flex min-w-0 flex-col gap-3","data-access-overview":!0,children:[I?e.jsx(Nx,{person:I,bots:w.filter(k=>yr(k,I.email)),team:n,teamName:a,apply:L,onBack:()=>{h.current=I.email,x(null)}}):e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"ps-4 text-[13px] leading-relaxed text-ink-secondary",children:t("botAccess.overview.introUse",{team:a})}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsxs("div",{className:"relative min-w-[180px] flex-1",children:[e.jsx(jt,{size:14,"aria-hidden":"true",className:"pointer-events-none absolute start-2.5 top-1/2 -translate-y-1/2 text-ink-secondary"}),e.jsx("input",{type:"search",value:o,"data-access-search":!0,"aria-label":t(r==="bot"?"botAccess.overview.searchBots":"botAccess.overview.searchPeople"),placeholder:t(r==="bot"?"botAccess.overview.searchBots":"botAccess.overview.searchPeople"),onChange:k=>d(k.target.value),onKeyDown:k=>{k.key==="Escape"&&o&&(k.preventDefault(),d(""))},className:"w-full rounded-lg border border-hairline/50 bg-transparent py-1.5 pe-2.5 ps-8 text-[13px] text-ink placeholder:text-ink-secondary focus:border-focus focus:outline-none"})]}),e.jsx("div",{role:"group","aria-label":t("botAccess.overview.listBy"),className:"flex shrink-0 rounded-full bg-raised/70 p-0.5",children:["bot","person"].map(k=>e.jsx("button",{type:"button","aria-pressed":r===k,"data-access-listing":k,onClick:()=>{c(k),d("")},className:O("rounded-full px-3 py-1 text-[13px] leading-[18px]",r===k?"bg-menu font-medium text-ink shadow-sm":"text-ink-secondary hover:text-ink"),children:t(k==="bot"?"botAccess.overview.byBot":"botAccess.overview.byPerson")},k))})]}),r==="bot"?e.jsx(vx,{bots:w.filter(k=>!j||ma(j,k.name,di(k,n)?.name,Jt(k)??void 0)),anyBots:w.length>0,team:n,onOpen:p}):e.jsx(jx,{people:C.filter(k=>!j||ma(j,k.name,k.email)),anyPeople:C.length>0,bots:w,onOpen:x}),e.jsx("p",{className:"ps-4 text-[12px] text-ink-secondary",children:t("botAccess.admins")})]}),y&&e.jsx("p",{role:"alert",className:"text-[13px] text-danger",children:y}),N&&e.jsx(yo,{bot:N,teamName:a,onClose:()=>p(null),onChanged:k=>b({botId:N.id,...k})}),f&&e.jsx(vo,{text:f.text,onUndo:()=>En(f.botId,f.before),onDone:v},`${f.botId}:${f.text}:${JSON.stringify(f.after)}`)]})}function vx({bots:s,anyBots:n,team:a,onOpen:i}){return n?s.length?e.jsx("ul",{className:cn,children:s.map(r=>{const c=Yt(r),o=Jt(r);return e.jsx("li",{className:"min-w-0",children:e.jsxs("button",{type:"button","aria-haspopup":"dialog","data-access-row":r.id,onClick:()=>i(r.id),className:O(on,"hover:bg-ink/[0.06] focus-visible:bg-ink/[0.06] focus-visible:outline-none"),children:[e.jsx(Zt,{bot:r,size:32}),e.jsxs("span",{className:"min-w-0 flex-1",children:[e.jsx("span",{className:"block truncate text-[14px] leading-[18px] text-ink",children:r.name}),e.jsx("span",{className:"block truncate text-[12px] leading-4 text-ink-secondary",children:vr(r,a)})]}),e.jsx("span",{className:"min-w-0 max-w-[40%] truncate text-[13px] text-ink-secondary","data-access-summary":!0,children:c.everyone==="none"?t("botAccess.onlyAdded"):t("botAccess.overview.everyoneUses")}),e.jsx(kx,{entries:Object.keys(c.people).filter(d=>d!==o),team:a})]})},r.id)})}):e.jsx("p",{className:"text-[13px] text-ink-secondary",children:t("botAccess.overview.noBotMatch")}):e.jsx("p",{className:"text-[13px] text-ink-secondary",children:t("botAccess.overview.noBots")})}function kx({entries:s,team:n}){if(!s.length)return null;const a=s.map(r=>jo(r,n)).join(", "),i=s.length-pa;return e.jsxs("span",{role:"img","aria-label":a,title:a,"data-access-stack":s.length,className:"flex shrink-0 -space-x-0.5 rtl:space-x-reverse",children:[s.slice(0,pa).map(r=>e.jsx("span",{className:"flex rounded-full ring-2 ring-card",children:e.jsx(No,{person:wo(r,n),size:22})},r)),i>0&&e.jsxs("span",{className:"flex h-[22px] min-w-[22px] items-center justify-center rounded-full bg-card px-1 text-[11px] font-medium text-ink-secondary ring-2 ring-card",children:["+",i]})]})}function jx({people:s,anyPeople:n,bots:a,onOpen:i}){return n?s.length?e.jsx("ul",{className:cn,children:s.map(r=>{const c=a.filter(o=>yr(o,r.email)).length;return e.jsx("li",{className:"min-w-0",children:e.jsxs("button",{type:"button","data-access-person":r.email,onClick:()=>i(r.email),className:O(on,"hover:bg-ink/[0.06] focus-visible:bg-ink/[0.06] focus-visible:outline-none"),children:[e.jsx(ui,{person:r,size:32}),e.jsxs("span",{className:"min-w-0 flex-1",children:[e.jsx("span",{className:"block truncate text-[14px] leading-[18px] text-ink",children:r.name}),e.jsx("span",{className:"block truncate text-[12px] leading-4 text-ink-secondary",children:r.email})]}),e.jsx("span",{className:"shrink-0 text-[13px] text-ink-secondary",children:c===1?t("botAccess.overview.botCount.one"):t("botAccess.overview.botCount.other",{count:c})})]})},r.email)})}):e.jsx("p",{className:"text-[13px] text-ink-secondary",children:t("botAccess.noMatch")}):e.jsx("p",{className:"text-[13px] text-ink-secondary",children:t("botAccess.overview.noPeople")})}function Nx({person:s,bots:n,team:a,teamName:i,apply:r,onBack:c}){return e.jsxs(e.Fragment,{children:[e.jsx("div",{children:e.jsxs("button",{type:"button",autoFocus:!0,"data-access-back":!0,onClick:c,className:"-ms-2 flex items-center gap-1 rounded-md px-2 py-1 text-[13px] text-ink-secondary hover:bg-ink/[0.06] hover:text-ink",children:[e.jsx(ol,{size:14,"aria-hidden":"true",className:"rtl:-scale-x-100"}),t("botAccess.overview.allPeople")]})}),e.jsxs("div",{className:"flex min-w-0 items-center gap-3 px-3",children:[e.jsx(ui,{person:s,size:32}),e.jsxs("span",{className:"min-w-0 flex-1",children:[e.jsx("span",{className:"block truncate text-[14px] font-medium leading-[18px] text-ink",children:s.name}),e.jsx("span",{className:"block truncate text-[12px] leading-4 text-ink-secondary",children:s.email})]})]}),n.length===0?e.jsx("p",{className:"px-3 text-[13px] text-ink-secondary",children:t("botAccess.overview.noBotsForPerson",{name:s.name})}):e.jsx("ul",{className:cn,children:n.map(o=>e.jsx(wx,{bot:o,person:s,team:a,teamName:i,apply:r},o.id))})]})}function wx({bot:s,person:n,team:a,teamName:i,apply:r}){const c=Yt(s),o=Jt(s)===n.email,d=c.people[n.email],u=pi(c,n.email);return e.jsxs("li",{className:on,"data-access-person-bot":s.id,children:[e.jsx(Zt,{bot:s,size:32}),e.jsxs("span",{className:"min-w-0 flex-1",children:[e.jsx("span",{className:"block truncate text-[14px] leading-[18px] text-ink",children:s.name}),e.jsx("span",{className:"block truncate text-[12px] leading-4 text-ink-secondary",children:!d&&!o&&u===c.everyone?t("botAccess.everyoneUse",{team:i}):vr(s,a)})]}),e.jsx("span",{className:"min-w-0 shrink-0 text-[13px] text-ink-secondary",children:o?e.jsx("span",{className:"px-2",children:t("lookedAfter.badge")}):d?e.jsx("button",{type:"button","data-access-remove":s.id,"aria-label":t("botAccess.overview.removeFrom",{name:n.name,bot:s.name}),onClick:()=>{r(s,ko(c,n.email,null),t("botAccess.overview.toastRemoved",{name:n.name,bot:s.name}))},className:"rounded-md px-2 py-1 hover:bg-ink/[0.06] hover:text-ink",children:t("botAccess.remove")}):null})]})}function Sx(s){const n=s.trim();if(!n||/[\s\\?#@%]/.test(n))return null;try{const a=new URL(n.includes("://")?n:`https://${n}`),i=a.hostname.replace(/\.$/,"");return a.protocol!=="https:"||a.port||a.pathname!=="/"||!i.includes(".")||i.length>253||/^[\d.]+$/.test(i)||!i.split(".").every(r=>/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(r))||/(?:^|\.)(?:localhost|local|internal|invalid|test)$/.test(i)?null:i}catch{return null}}function Cx({domain:s,serverIpv4:n}){const a=Sx(s);if(!a)return e.jsx("p",{className:"text-[12px] text-ink-secondary",children:t("settings.domain.enterDomain")});const i=[[t("settings.domain.recordType"),"A"],[t("settings.domain.recordName"),a],[t("settings.domain.recordValue"),n]];return e.jsxs("section",{"aria-label":t("settings.domain.dnsRecord"),className:"space-y-2 rounded-lg border border-hairline/50 p-3",children:[e.jsx("p",{className:"text-[12px] font-medium text-ink",children:t("settings.domain.dnsRecord")}),e.jsx("dl",{className:"space-y-2",children:i.map(([r,c])=>e.jsxs("div",{className:"grid grid-cols-[80px_minmax(0,1fr)] items-center gap-2",children:[e.jsx("dt",{className:"text-[12px] text-ink-secondary",children:r}),e.jsx("dd",{className:"min-w-0",children:c?e.jsx(gt,{command:c,copyLabel:t("settings.domain.copyField",{field:r})},c):e.jsx("p",{className:"text-[12px] text-warning",children:t("settings.domain.missingIp")})})]},r))}),e.jsx("p",{className:"text-[12px] leading-relaxed text-ink-secondary",children:t("settings.domain.recordHint")})]})}function Ex(s){return`bots.example.com {
|
|
1
|
+
import{c as st,j as e,t,r as l,a as O,S as jt,aY as il,aZ as rl,f as ve,p as Se,g as Ds,ad as ll,X as We,a_ as gn,i as Us,C as ol,ae as Ja,L as Dt,aP as cl,a$ as dl,a5 as ul,F as pl,b as Ve,b0 as ml,b1 as xl,b2 as fn,at as bn,b3 as hl,au as gl,b4 as fl,b5 as bl,a8 as yl,M as vl,b6 as kl,b7 as _s,b8 as jl,b9 as Nl,ba as yn,bb as $s,l as wl,bc as Sl,m as vn,bd as Ya,d as Cl,be as El,v as Al,bf as Pl,q as Il,ax as Rl,bg as kn,aw as Tl,bh as Bl,bi as jn,bj as Nn,bk as wn,bl as Ll,bm as Ol,D as zl,bn as Ml,ah as Fl,bo as Dl,bp as Ul}from"./styles-CEi8u2Uw.js";import{bL as Gt,u as G,S as fe,n as F,gS as Ks,D as ye,cH as _l,cD as Xa,T as Le,gT as He,eE as dt,gU as $l,Y as Ge,eC as Kl,eD as Hl,gV as ws,gW as ft,gX as Qa,gY as Hs,gZ as Ws,g_ as Wl,dX as Sn,g$ as Za,h0 as ei,h1 as Gl,h2 as Vl,h3 as ql,bJ as ge,bV as X,e3 as Ss,eB as Jl,h4 as ti,h5 as zt,h6 as Vt,h7 as si,h8 as ni,h9 as $e,ha as tt,hb as Yl,hc as Xl,hd as Ql,he as Zl,hf as eo,C as ut,hg as ai,hh as to,hi as so,hj as ii,hk as ri,hl as Ce,hm as Ee,dj as Cn,hn as qt,ho as no,hp as ao,hq as io,hr as ro,hs as lo,gL as li,bp as oo,ht as gt,R as co,dC as uo,df as po,hu as ct,bD as oi,eu as mo,E as Gs,hv as ci,hw as xo,aM as Ut,fn as yt,fo as vt,hx as ho,M as Vs,r as go,cf as fo,gA as bo,hy as Jt,hz as di,hA as yo,hB as vo,hC as En,hD as ui,hE as Yt,hF as pi,hG as ko,hH as jo,hI as No,hJ as wo,G as So,hK as Co,hL as kt,e9 as Xt,hM as Eo,hN as Ao,hO as Po,hP as Io,fv as Ro,hQ as An,hR as To,hS as Bo,hT as Pn,hU as Lo,e8 as mi,hV as Oo,hW as zo,hX as Mo,hY as Fo,hZ as Do,h_ as Uo,h$ as xi,i0 as _o,i1 as $o,i2 as Ko,i3 as Ho,i4 as Wo,i5 as Go,i6 as hi,i7 as Vo,i8 as qo,dI as Jo,i9 as Yo,e4 as Xo,ia as Qo,ib as Zo,ic as ec,c as tc,id as In,ie as sc,ig as Rn,l as nc,ih as ac,ii as ic,ij as rc,ik as lc,il as oc,im as cc,io as dc,ip as gi,fl as mt,iq as uc,fk as pc,ir as mc,is as xc,it as hc,iu as gc,iv as fc,iw as bc,ix as yc,iy as vc,iz as qs,iA as kc,fb as fi,m as jc,iB as Nc,iC as wc,iD as Tn,iE as Sc,iF as Cc,iG as Bn,iH as Ec,bf as Ac,iI as Pc,iJ as Ic,iK as Rc,iL as Tc,iM as Bc,iN as Ln,iO as Lc,bu as bi,iP as Oc,bv as zc,iQ as Mc,iR as Fc,iS as Dc,iT as Uc,iU as _c,iV as $c,iW as Kc,iX as Hc,iY as On,go as Wc,iZ as Gc,i_ as Vc,i$ as yi,j0 as qc,j1 as Jc,j2 as Yc,j3 as vi,j4 as ki,j5 as ji,j6 as Xc,j7 as Qc,d0 as Zc,I as ed,j8 as td,ew as sd,bT as zn,j9 as Mn,eV as Fn,dW as nd,_ as ad,ay as id,ja as rd,jb as ld,jc as od}from"./App-l_O0SoTW.js";import{L as q,P as Oe,y as Nt,E as Ni,M as cd,aj as dd,$ as ud,W as pd,x as Qt,C as Js,ak as md,J as wi,X as Si,R as Ys,B as Zt,al as xd,am as hd,an as gd,d as Ci,r as fd,A as bd,c as yd,ao as vd,ap as kd,K as jd,ab as Nd,aq as wd,b as Sd,U as Cd,N as is}from"./PlacesRail-CRjMyuI2.js";import{C as Xs,a as Ed,R as De}from"./MenuMotion-Dao-MHD0.js";import{l as Ei,M as Ad,w as Pd}from"./MacLocalControl-DPUWRa_D.js";import{Q as es}from"./index-BQun5WYq.js";import{r as Ai,a as Pi,b as Ii,i as Id,C as Rd,c as Td,p as Bd}from"./index-ta51KzHq.js";import{Q as Ld,T as Od,U as zd,W as Md,X as Fd}from"./VisibilitySection-CtAuM-r8.js";import{c as Dd,A as Ud,w as _d,d as $d,e as Dn}from"./activity-DigNyw0O.js";import{U as Ri,R as Ti,B as Bi,S as Li,a as Oi,D as zi,T as Mi,C as Fi,L as Cs,b as Di,F as Ui,A as Es,E as Kd,c as Hd,P as Wd,d as Gd,e as Vd,N as qd}from"./NewBotDialog-DAE6phyl.js";import{a as Jd,u as Yd,C as _i,b as Xd,P as Qd}from"./ProIntroduction-SyZcb5wk.js";import{M as $i}from"./monitor-DLOjaeVP.js";import{C as Zd}from"./coins-BKT_JiVX.js";import"./org-library-DOYA88DK.js";import"./package-format-CX64Cr9h.js";import"./mcp-servers-BlsicIOW.js";import"./WorksOnGrid-CVqKC9g1.js";import"./new-bot-BKsNF8dT.js";import"./RoutinesPage-DJTaktUm.js";import"./remote-desktop-DDRRx8uY.js";import"./team-share-BKhOCfz-.js";import"./BrowserProfilesManager-DoftjFgj.js";import"./SignedInSites-CHbpn9OB.js";const eu=[["path",{d:"M12 13v8l-4-4",key:"1f5nwf"}],["path",{d:"m12 21 4-4",key:"1lfcce"}],["path",{d:"M4.393 15.269A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.436 8.284",key:"ui1hmy"}]],tu=st("cloud-download",eu);const su=[["path",{d:"M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z",key:"e79jfc"}],["circle",{cx:"13.5",cy:"6.5",r:".5",fill:"currentColor",key:"1okk4w"}],["circle",{cx:"17.5",cy:"10.5",r:".5",fill:"currentColor",key:"f64h9f"}],["circle",{cx:"6.5",cy:"12.5",r:".5",fill:"currentColor",key:"qy21gx"}],["circle",{cx:"8.5",cy:"7.5",r:".5",fill:"currentColor",key:"fotxhn"}]],nu=st("palette",su);const au=[["rect",{width:"5",height:"5",x:"3",y:"3",rx:"1",key:"1tu5fj"}],["rect",{width:"5",height:"5",x:"16",y:"3",rx:"1",key:"1v8r4q"}],["rect",{width:"5",height:"5",x:"3",y:"16",rx:"1",key:"1x03jg"}],["path",{d:"M21 16h-3a2 2 0 0 0-2 2v3",key:"177gqh"}],["path",{d:"M21 21v.01",key:"ents32"}],["path",{d:"M12 7v3a2 2 0 0 1-2 2H7",key:"8crl2c"}],["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M12 3h.01",key:"n36tog"}],["path",{d:"M12 16v.01",key:"133mhm"}],["path",{d:"M16 12h1",key:"1slzba"}],["path",{d:"M21 12v.01",key:"1lwtk9"}],["path",{d:"M12 21v-1",key:"1880an"}]],iu=st("qr-code",au);const ru=[["path",{d:"M15 12h-5",key:"r7krc0"}],["path",{d:"M15 8h-5",key:"1khuty"}],["path",{d:"M19 17V5a2 2 0 0 0-2-2H4",key:"zz82l3"}],["path",{d:"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3",key:"1ph1d7"}]],lu=st("scroll-text",ru);const ou=[["path",{d:"M12 19h8",key:"baeox8"}],["path",{d:"m4 17 6-6-6-6",key:"1yngyt"}]],cu=st("terminal",ou);const du=[["path",{d:"m19 5 3-3",key:"yk6iyv"}],["path",{d:"m2 22 3-3",key:"19mgm9"}],["path",{d:"M6.3 20.3a2.4 2.4 0 0 0 3.4 0L12 18l-6-6-2.3 2.3a2.4 2.4 0 0 0 0 3.4Z",key:"goz73y"}],["path",{d:"M7.5 13.5 10 11",key:"7xgeeb"}],["path",{d:"M10.5 16.5 13 14",key:"10btkg"}],["path",{d:"m12 6 6 6 2.3-2.3a2.4 2.4 0 0 0 0-3.4l-2.6-2.6a2.4 2.4 0 0 0-3.4 0Z",key:"1snsnr"}]],uu=st("unplug",du);const pu=[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]],mu=st("wifi",pu);function Ae({children:s,note:n="settings.adminOnly.change"}){return Gt()===!1?e.jsx("p",{"data-admin-only":!0,className:"text-[13px] text-ink-secondary",children:t(n)}):s}function Qs(s,n,a="start",i=0){const r=n.getBoundingClientRect().top-s.getBoundingClientRect().top+s.scrollTop;s.scrollTop=Math.max(0,a==="center"?r-(s.clientHeight-(n.offsetHeight??0))/2:r-i)}function xu(s){for(let n=s.parentElement;n;n=n.parentElement){const a=getComputedStyle(n).overflowY;if((a==="auto"||a==="scroll")&&n.scrollHeight>n.clientHeight)return n}return null}function hu(){const{state:s,dispatch:n}=G(),[a,i]=l.useState(!1),[r,c]=l.useState(null),o=s.config?.tts?.everyReply===!0,d=()=>{i(!0),c(null),F("/api/config",{method:"PUT",body:JSON.stringify({tts:{everyReply:!o}})}).then(u=>n({type:"configStatus",config:u})).catch(u=>c(u.message)).finally(()=>i(!1))};return e.jsxs("div",{"data-voice-every-reply":!0,className:"flex items-center justify-between gap-4 px-3 py-2.5",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[14px] font-medium leading-5 text-ink",children:t("voice.everyReply")}),e.jsx("div",{className:"mt-0.5 text-[12px] leading-4 text-ink-secondary",children:t("voice.everyReply.allHelp")}),r&&e.jsx("div",{role:"alert",className:"mt-1 text-[12px] text-danger",children:r})]}),e.jsx(fe,{checked:o,disabled:a,"aria-label":t("voice.everyReply"),onClick:d})]})}function rs(s){return[...new Set(s.split(/[,,、\s]+/).map(n=>n.trim()).filter(Boolean))]}const et=O(He,"font-sans"),gu=[5,10,20,30,60],ls="ui-icon-button shrink-0 hover:text-ink",os={name:"Google Gemini",url:"https://generativelanguage.googleapis.com/v1beta/openai"},As={count:64,length:200},fu=s=>s.length<=As.count&&s.every(n=>n.length<=As.length),Ps=(s,n)=>F(`/api/instances/${encodeURIComponent(s)}`,{method:"PATCH",body:JSON.stringify(n)});function Ki({server:s,disabled:n,onPick:a}){return e.jsxs(ye,{size:"sm",className:"shrink-0",value:s.replyWaitMinutes??"",onChange:i=>a(i.target.value?Number(i.target.value):null),disabled:n,"aria-label":t("apiInstances.replyWaitFor",{name:s.displayName}),title:t("apiInstances.replyWaitHint"),children:[e.jsx("option",{value:"",children:t("apiInstances.replyWaitDefault")}),[...new Set([...gu,...s.replyWaitMinutes?[s.replyWaitMinutes]:[]])].sort((i,r)=>i-r).map(i=>e.jsx("option",{value:i,children:t("apiInstances.replyWaitMinutes",{minutes:String(i)})},i))]})}function bu(){const{state:s,dispatch:n,refreshInstances:a}=G(),[i,r]=l.useState(!1),[c,o]=l.useState(null),d=s.instances.find(p=>p.instanceId==="openaiCompat"&&p.driverKind==="openai-compat");if(!d||!s.config?.openaiCompat?.url)return null;const u=p=>{i||(r(!0),o(null),Ps(d.instanceId,{replyWaitMinutes:p}).then(async({instances:m})=>{Array.isArray(m)?n({type:"instances",instances:m}):await a({reportErrors:!0})}).catch(m=>o(m.message||t("apiInstances.failed"))).finally(()=>r(!1)))};return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(Ki,{server:d,disabled:i,onPick:u}),e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("apiInstances.replyWaitHint")}),c&&e.jsx("div",{role:"alert",className:"text-[12px] leading-4 text-danger",children:c})]})}function yu(){const{state:s}=G();return e.jsx(vu,{servers:Ks(s.instances)})}function vu({servers:s}){const{dispatch:n,refreshInstances:a}=G(),[i,r]=l.useState(""),[c,o]=l.useState(""),[d,u]=l.useState(""),[p,m]=l.useState(""),[x,h]=l.useState(null),[f,b]=l.useState(null),[y,g]=l.useState(null),[v,C]=l.useState(""),w=!!(i.trim()&&c.trim()&&d.trim()),N=(j,L,k,P)=>{x||(h(j),b(null),L().then(async({instances:S})=>{Array.isArray(S)?n({type:"instances",instances:S}):await a({reportErrors:!0}),k?.()}).catch(S=>b({text:S.message||t("apiInstances.failed"),at:P})).finally(()=>h(null)))},I=()=>w&&N("add",()=>F("/api/instances/openai-compat",{method:"POST",body:JSON.stringify({displayName:i.trim(),url:c.trim(),key:d.trim(),...rs(p).length?{models:rs(p)}:{}})}).then(j=>(dt("custom_endpoint","settings","unverified"),j),j=>{throw dt("custom_endpoint","settings","error"),j}),()=>{r(""),o(""),u(""),m("")});return e.jsxs("div",{"data-api-keys-other":!0,children:[e.jsx("div",{className:"mb-0.5 text-[13px] leading-[18px] text-ink",children:t("apiInstances.title")}),e.jsx("p",{className:"mb-2 text-[12px] leading-4 text-ink-secondary",children:t("apiInstances.subtitle")}),s.length===0&&e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("apiInstances.empty")}),s.map(j=>e.jsxs("div",{className:"mb-1.5 rounded-lg border border-hairline/60 bg-inset px-3 py-1.5",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"truncate text-[12px] text-ink",children:j.displayName}),j.url&&e.jsx("div",{className:"truncate font-mono text-[11px] text-ink-secondary",children:j.url})]}),e.jsx(Ki,{server:j,disabled:x!==null,onPick:L=>N("other",()=>Ps(j.instanceId,{replyWaitMinutes:L}))}),e.jsx("button",{type:"button",onClick:()=>{C((j.managedModels??[]).join(", ")),g(y===j.instanceId?null:j.instanceId),b(null)},disabled:x!==null,"aria-label":t("apiInstances.editModels",{name:j.displayName}),"aria-expanded":y===j.instanceId,title:t("apiInstances.editModels",{name:j.displayName}),className:ls,children:e.jsx(_l,{size:13,"aria-hidden":"true"})}),e.jsx("button",{type:"button",onClick:()=>N("other",()=>F(`/api/instances/${encodeURIComponent(j.instanceId)}/refresh-models`,{method:"POST"})),disabled:x!==null,"aria-label":t("apiInstances.refreshModels",{name:j.displayName}),title:t("apiInstances.refreshModels",{name:j.displayName}),className:ls,children:e.jsx(Xa,{size:13,"aria-hidden":"true"})}),e.jsx("button",{type:"button",onClick:()=>N("other",()=>F(`/api/instances/${encodeURIComponent(j.instanceId)}`,{method:"DELETE"})),disabled:x!==null,"aria-label":t("apiInstances.remove",{name:j.displayName}),title:t("apiInstances.remove",{name:j.displayName}),className:`${ls} hover:bg-danger/10 hover:text-danger`,children:e.jsx(Le,{size:13,"aria-hidden":"true"})})]}),y===j.instanceId&&e.jsxs("div",{className:"mt-1.5 flex flex-col gap-1.5",children:[e.jsx("input",{value:v,onChange:L=>C(L.target.value),placeholder:t("apiInstances.models"),"aria-label":t("apiInstances.modelsFor",{name:j.displayName}),spellCheck:!1,disabled:x!==null,className:O(et,"font-mono")}),e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("apiInstances.editModelsHint")}),e.jsxs("div",{className:"flex gap-1.5",children:[e.jsx("button",{type:"button",onClick:()=>{const L=rs(v);if(!fu(L)){b({text:t("apiInstances.modelsLimit",As),at:j.instanceId});return}N("other",()=>Ps(j.instanceId,{models:L}),()=>g(null),j.instanceId)},disabled:x!==null,className:"ui-button",children:t("common.save")}),e.jsx("button",{type:"button",onClick:()=>g(null),disabled:x!==null,className:"ui-button",children:t("common.cancel")})]}),f?.at===j.instanceId&&e.jsx("div",{role:"alert",className:"text-[12px] leading-4 text-danger",children:f.text})]})]},j.instanceId)),e.jsxs("div",{className:"mt-2 flex flex-col gap-1.5",children:[e.jsx("button",{type:"button",onClick:()=>{r(os.name),o(os.url)},disabled:x!==null,className:"ui-button self-start",children:t("apiInstances.geminiPreset")}),c.trim()===os.url&&e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("apiInstances.geminiKeyHint")}),e.jsx("input",{value:i,onChange:j=>r(j.target.value),placeholder:t("apiInstances.name"),"aria-label":t("apiInstances.name"),spellCheck:!1,disabled:x!==null,className:et}),e.jsx("input",{type:"url",value:c,onChange:j=>o(j.target.value),placeholder:"https://api.example.com/v1","aria-label":t("apiInstances.url"),spellCheck:!1,disabled:x!==null,className:O(et,"font-mono")}),e.jsx("input",{type:"password",value:d,onChange:j=>u(j.target.value),placeholder:t("apiInstances.key"),"aria-label":t("apiInstances.key"),autoComplete:"off",disabled:x!==null,className:O(et,"font-mono")}),e.jsx("input",{value:p,onChange:j=>m(j.target.value),placeholder:t("apiInstances.models"),"aria-label":t("apiInstances.models"),spellCheck:!1,disabled:x!==null,className:O(et,"font-mono")}),e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("apiInstances.modelsHint")}),e.jsxs("button",{type:"button",onClick:I,disabled:x!==null||!w,className:"ui-button self-start",children:[x==="add"?e.jsx(q,{size:12,"aria-hidden":"true",className:"animate-spin"}):e.jsx(Oe,{size:12,"aria-hidden":"true"}),x==="add"?t("apiInstances.adding"):t("apiInstances.add")]})]}),f&&!f.at&&e.jsx("div",{className:"mt-1 text-[12px] text-danger",children:f.text})]})}const ku="lm-studio";function ju(s){const n=s.trim();if(!/^[1-9]\d{0,4}$/.test(n))return null;const a=Number(n);return a>65535?null:`http://127.0.0.1:${a}/v1`}function Nu({heading:s=!0}={}){const{state:n,dispatch:a,refreshInstances:i}=G(),r=Ks(n.instances),[c,o]=l.useState("1234"),[d,u]=l.useState(""),[p,m]=l.useState(!1),[x,h]=l.useState(null),f=ju(c),b=!!(f&&r.some(g=>g.url===f)),y=()=>{p||!f||b||(m(!0),h(null),F("/api/instances/openai-compat",{method:"POST",body:JSON.stringify({displayName:"LM Studio",url:f,key:d.trim()||ku,catalog:"lmstudio"})}).then(async g=>{dt("custom_endpoint","settings","unverified"),Array.isArray(g.instances)?a({type:"instances",instances:g.instances}):await i({reportErrors:!0}),u("")},g=>{dt("custom_endpoint","settings","error"),h(g instanceof Error&&g.message?g.message:t("apiInstances.failed"))}).finally(()=>m(!1)))};return e.jsxs("div",{className:O(s&&"rounded-lg border border-hairline/40 bg-inset px-3 py-2"),children:[s&&e.jsx("div",{className:"text-[13px] text-ink",children:t("lmStudio.title")}),e.jsx("p",{className:O("text-[12px] leading-4 text-ink-secondary",s&&"mt-1"),children:t("lmStudio.desc")}),e.jsxs("div",{className:"mt-2 flex flex-col gap-1.5",children:[e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] leading-4 text-ink-secondary",children:[t("lmStudio.port"),e.jsx("input",{inputMode:"numeric",value:c,onChange:g=>o(g.target.value),"aria-label":t("lmStudio.port"),spellCheck:!1,disabled:p,className:O(et,"font-mono")})]}),e.jsx("input",{type:"password",value:d,onChange:g=>u(g.target.value),placeholder:t("lmStudio.token"),"aria-label":t("lmStudio.token"),autoComplete:"off",disabled:p,className:O(et,"font-mono")}),e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("lmStudio.tokenHint")}),f&&e.jsx("p",{className:"truncate font-mono text-[12px] leading-4 text-ink-secondary",children:f}),e.jsxs("button",{type:"button",onClick:y,disabled:p||!f||b,className:"ui-button self-start",children:[p?e.jsx(q,{size:12,"aria-hidden":"true",className:"animate-spin"}):e.jsx(Oe,{size:12,"aria-hidden":"true"}),p?t("lmStudio.adding"):t("lmStudio.add")]}),b&&e.jsx("p",{className:"text-[12px] text-ink-secondary",children:t("lmStudio.added")})]}),x&&e.jsx("div",{className:"mt-1 text-[12px] text-danger",children:x})]})}const wu="ollama",Su="https://ollama.com/download",Cu=s=>`${s.replace(/\/+$/,"")}/v1`,Eu=(s,n)=>s?.trim().replace(/\/+$/,"")===n;function Au({visible:s}){const{state:n,dispatch:a,refreshInstances:i}=G(),[r,c]=l.useState(""),[o,d]=l.useState(null),[u,p]=l.useState(!1),[m,x]=l.useState(!1),[h,f]=l.useState(null),b=l.useRef(0),y=l.useRef(!1),g=l.useCallback(I=>{const j=++b.current;p(!0),f(null),F(`/api/instances/ollama${I?`?url=${encodeURIComponent(I)}`:""}`).then(L=>{j===b.current&&d(L.status)}).catch(L=>{j===b.current&&(d(null),f(L.message||t("apiInstances.failed")))}).finally(()=>{j===b.current&&p(!1)})},[]);l.useEffect(()=>{!s||y.current||(y.current=!0,g(""))},[s,g]);const v=o?Cu(o.url):null,C=!!(v&&(Ks(n.instances).some(I=>I.url===v)||Eu(n.config?.openaiCompat?.url,v))),w=!!(v&&!C&&!m&&!u&&(o?.state==="ready"||o?.state==="no-models")),N=()=>{!w||!v||(x(!0),f(null),F("/api/instances/openai-compat",{method:"POST",body:JSON.stringify({displayName:"Ollama",url:v,key:wu,catalog:"ollama"})}).then(async I=>{dt("custom_endpoint","settings","unverified"),Array.isArray(I.instances)?a({type:"instances",instances:I.instances}):await i({reportErrors:!0})},I=>{dt("custom_endpoint","settings","error"),f(I instanceof Error&&I.message?I.message:t("apiInstances.failed"))}).finally(()=>x(!1)))};return e.jsxs("div",{"data-ollama-server":!0,children:[e.jsx("div",{role:"status","aria-live":"polite",children:u?e.jsxs("p",{className:"flex items-center gap-1.5 text-[12px] leading-4 text-ink-secondary",children:[e.jsx(q,{size:12,className:"animate-spin","aria-hidden":"true"}),t("ollama.checking")]}):o&&e.jsx($l,{status:o})}),!u&&o?.state==="not-running"&&e.jsx("a",{href:Su,target:"_blank",rel:"noopener noreferrer",className:"mt-1 inline-block text-[12px] font-medium text-accent-text hover:underline",children:t("ollama.download")}),e.jsxs("div",{className:"mt-2 flex flex-col gap-1.5",children:[e.jsx("input",{type:"url",value:r,onChange:I=>c(I.target.value),onKeyDown:I=>{I.key==="Enter"&&g(r.trim())},placeholder:"http://127.0.0.1:11434","aria-label":t("ollama.address"),spellCheck:!1,disabled:m,className:O(He,"font-mono")}),e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("ollama.addressHint")}),e.jsxs("div",{className:"flex flex-wrap gap-1.5",children:[e.jsxs("button",{type:"button",onClick:N,disabled:!w,className:"ui-button",children:[m?e.jsx(q,{size:12,"aria-hidden":"true",className:"animate-spin"}):e.jsx(Oe,{size:12,"aria-hidden":"true"}),m?t("ollama.adding"):t("ollama.add")]}),e.jsxs("button",{type:"button",onClick:()=>g(r.trim()),disabled:u||m,className:"ui-button",children:[e.jsx(Xa,{size:12,"aria-hidden":"true"}),t("common.checkAgain")]})]}),C&&e.jsx("p",{className:"text-[12px] text-ink-secondary",children:t("ollama.added")})]}),h&&e.jsx("div",{role:"alert",className:"mt-1 text-[12px] text-danger",children:h})]})}function Pu(){const{state:s,dispatch:n}=G(),a=s.config?.opencodeGo?.providerKeys??[],[i,r]=l.useState(""),[c,o]=l.useState(""),[d,u]=l.useState(!1),[p,m]=l.useState(null),[x,h]=l.useState(null),f=d||p!==null,b=(v,C)=>F("/api/config",{method:"PUT",body:JSON.stringify({opencodeGo:{providerKeys:{[v]:C}}})}).then(w=>n({type:"configStatus",config:w})),y=()=>{const v=i.trim().toUpperCase(),C=Kl(c);if(!(f||!v||!C)){if(!Hl(C)){h(t("keys.notAKey"));return}u(!0),h(null),b(v,C).then(()=>{r(""),o("")}).catch(w=>h(w.message)).finally(()=>u(!1))}},g=v=>{f||(m(v),h(null),b(v,"").catch(C=>h(C.message)).finally(()=>m(null)))};return e.jsxs("div",{"data-opencode-provider-keys":!0,className:"flex flex-col gap-2",children:[e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("keys.opencode.otherProviders.hint")}),s.config?.cloudHome!==!0&&e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("keys.opencode.providersHint").split("{command}").flatMap((v,C)=>C===0?[v]:[e.jsx("code",{className:"font-mono",children:"opencode auth login"},C),v])}),a.map(v=>e.jsxs("div",{"data-opencode-provider-key":v,className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:O(He,"block flex-1 truncate text-ink"),children:v}),e.jsx("button",{type:"button",onClick:()=>g(v),disabled:f,"aria-label":t("keys.opencode.otherProviders.removeAria",{name:v}),className:"ui-button shrink-0",children:p===v?e.jsx(q,{size:13,className:"animate-spin","aria-hidden":"true"}):t("keys.row.remove")})]},v)),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("input",{type:"text",value:i,onChange:v=>{h(null),r(v.target.value)},onKeyDown:v=>v.key==="Enter"&&y(),disabled:f,placeholder:"VENICE_API_KEY","aria-label":t("keys.opencode.otherProviders.name"),autoComplete:"off",spellCheck:!1,className:O(He,"w-auto min-w-[min(100%,10rem)] flex-1 uppercase placeholder:normal-case")}),e.jsx("input",{type:"password",value:c,onChange:v=>{h(null),o(v.target.value)},onKeyDown:v=>v.key==="Enter"&&y(),disabled:f,placeholder:t("keys.opencode.otherProviders.keyPlaceholder"),"aria-label":t("keys.opencode.otherProviders.key"),autoComplete:"off",className:O(He,"w-auto min-w-[min(100%,10rem)] flex-1")}),e.jsx("button",{type:"button",onClick:y,disabled:f||!i.trim()||!c.trim(),className:"ui-button ui-button-primary shrink-0",children:d?e.jsx(q,{size:13,className:"animate-spin","aria-hidden":"true"}):t("common.save")})]}),x&&e.jsx("div",{role:"alert",className:"text-[12px] leading-4 text-danger",children:x})]})}function Iu(){const{state:s,dispatch:n}=G(),[a,i]=l.useState(!1),[r,c]=l.useState(null);if(!s.config?.anthropic?.configured)return null;const o=s.config.anthropic.everyClaudeBot===!0,d=()=>{a||(i(!0),c(null),F("/api/config",{method:"PUT",body:JSON.stringify({anthropic:{everyClaudeBot:!o}})}).then(u=>n({type:"configStatus",config:u})).catch(u=>c(u.message)).finally(()=>i(!1)))};return e.jsxs("div",{"data-anthropic-every-claude-bot":!0,className:"flex flex-col gap-1.5",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-[13px] leading-[18px] text-ink",children:t("keys.anthropic.everyBot")}),e.jsx("div",{className:"text-[12px] leading-4 text-ink-secondary",children:o?t("keys.anthropic.everyBotOn"):t("keys.anthropic.everyBotOff")})]}),e.jsx(fe,{checked:o,disabled:a,onClick:d,"aria-label":t("keys.anthropic.everyBot")})]}),o&&e.jsxs("p",{className:"flex gap-1.5 text-[12px] leading-4 text-warning",children:[e.jsx(Ge,{size:13,className:"mt-px shrink-0","aria-hidden":"true"}),e.jsx("span",{children:t("keys.anthropic.warning")})]}),r&&e.jsx("div",{role:"alert",className:"text-[12px] leading-4 text-danger",children:r})]})}function Ru(){const{state:s,dispatch:n}=G(),[a,i]=l.useState(""),[r,c]=l.useState(!1),[o,d]=l.useState(null),u=!!s.config?.vps?.configured,p=!a.trim()&&u;l.useEffect(()=>{i(s.config?.vps?.sshAlias??"")},[s.config?.vps?.sshAlias]);const m=()=>{r||!a.trim()&&!u||(c(!0),d(null),F("/api/config",{method:"PUT",body:JSON.stringify({vps:{sshAlias:a.trim()}})}).then(x=>{n({type:"configStatus",config:x}),i(x.vps?.sshAlias??"")}).catch(x=>d(x.message)).finally(()=>c(!1)))};return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("p",{className:"text-[12px] leading-4 text-ink-secondary",children:[t("keys.vps.descBefore"),e.jsx("a",{href:"https://github.com/milind-soni/OpenMausBot/blob/main/docs/byo-vps.md",target:"_blank",rel:"noopener noreferrer",className:"text-accent-text hover:underline",children:t("keys.vps.descLink")}),t("keys.vps.descAfter")]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("input",{type:"text","data-key-input":!0,value:a,onChange:x=>i(x.target.value),onKeyDown:x=>x.key==="Enter"&&m(),placeholder:"my-vps","aria-label":t("keys.vps.aria"),autoComplete:"off",spellCheck:!1,className:O(He,"w-auto min-w-[min(100%,12rem)] flex-1")}),e.jsx("button",{type:"button",onClick:m,disabled:r||!a.trim()&&!u||a.trim()===(s.config?.vps?.sshAlias??""),className:O("ui-button shrink-0",!p&&"ui-button-primary"),title:p?t("keys.vps.removeAlias"):void 0,children:r?e.jsx(q,{size:13,className:"animate-spin","aria-hidden":"true"}):p?t("keys.row.remove"):t("common.save")})]}),o&&e.jsx("div",{role:"alert",className:"text-[12px] leading-4 text-danger",children:o})]})}function Tu(){const{state:s,dispatch:n}=G(),a=s.config?.openaiCompat?.url??"",[i,r]=l.useState(a),[c,o]=l.useState(!1),[d,u]=l.useState(null),p=l.useRef(!1);l.useEffect(()=>{r(a)},[a]);const m=i.trim()!==a,x=()=>{p.current||!m||(p.current=!0,o(!0),u(null),F("/api/config",{method:"PUT",body:JSON.stringify({openaiCompat:{url:i.trim()}})}).then(h=>n({type:"configStatus",config:h})).catch(h=>u(h.message)).finally(()=>{p.current=!1,o(!1)}))};return e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx("div",{className:"text-[13px] leading-[18px] text-ink",children:t("keys.openaiCompat.url")}),e.jsxs("div",{className:"relative",children:[e.jsx("input",{type:"url",value:i,onChange:h=>r(h.target.value),onBlur:x,onKeyDown:h=>h.key==="Enter"&&x(),placeholder:"https://api.groq.com/openai/v1","aria-label":t("keys.openaiCompat.url"),spellCheck:!1,className:O(He,"pr-8")}),c&&e.jsx(q,{size:13,"aria-hidden":"true",className:"absolute right-2.5 top-1/2 -translate-y-1/2 animate-spin text-ink-secondary"})]}),e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("keys.openaiCompat.urlHint")}),d&&e.jsx("div",{role:"alert",className:"text-[12px] leading-4 text-danger",children:d})]})}const Bu="rounded-xl bg-card in-data-[settings-look=simple]:rounded-[12px] in-data-[settings-look=simple]:border-[0.5px] in-data-[settings-look=simple]:border-(--settings-edge) in-data-[settings-look=simple]:bg-menu",Lu=1600,Ou={opencodeProviders:()=>e.jsx(Pu,{}),ollama:s=>e.jsx(Au,{visible:s}),lmStudio:()=>e.jsx(Nu,{heading:!1}),vps:()=>e.jsx(Ru,{})},zu={anthropic:()=>e.jsx(Iu,{}),openaiCompat:()=>e.jsxs(e.Fragment,{children:[e.jsx(Tu,{}),e.jsx(bu,{}),e.jsx(yu,{})]}),box:()=>e.jsx(ql,{}),liveKey:()=>e.jsx(Vl,{})};function Hi(s,n){if(s.kind==="uses")return!1;const a=Ws(s,n);return a.configured||a.included===!0}function Mu({entry:s,visible:n}){const{state:a}=G(),i=l.useId(),c=Ws(s,a.config).configured?{tone:"ok",text:t("keys.connected")}:null;return e.jsxs("div",{"data-key-row":s.id,role:"group","aria-labelledby":i,className:Za,children:[e.jsx(ei,{entry:s,status:c,titleId:i}),e.jsx("div",{className:"flex flex-col gap-2 pl-8",children:Ou[s.id]?.(n)})]})}function Fu({entry:s}){const{state:n,dispatch:a}=G(),i=l.useId(),r=s.opens,c=Ws(s,n.config),o=c.configured?{tone:"ok",text:t("keys.connected")}:null;return e.jsxs("div",{"data-key-row":s.id,role:"group","aria-labelledby":i,className:Za,children:[e.jsx(ei,{entry:s,status:o,titleId:i}),e.jsxs("div",{className:"flex flex-col gap-2 pl-8",children:[c.configured&&e.jsx("div",{className:"flex",children:e.jsx(Gl,{saved:c,label:t(s.labelKey)})}),e.jsxs("div",{className:"flex flex-wrap items-center gap-x-3 gap-y-2",children:[s.whereKey&&e.jsx("span",{className:"min-w-0 flex-1 text-[12px] leading-4 text-ink-secondary",children:t(s.whereKey)}),r&&e.jsx("button",{type:"button","data-key-open":!0,className:"ui-button shrink-0",onClick:()=>a({type:"toggleAppSettings",open:!0,section:r}),children:t("keys.row.open")})]})]})]})}function Du({entry:s,visible:n}){return s.kind==="uses"&&s.uses?e.jsx(Sn,{id:s.uses,row:s.id}):s.kind==="panel"?e.jsx(Mu,{entry:s,visible:n}):s.kind==="elsewhere"?e.jsx(Fu,{entry:s}):e.jsx(Sn,{id:s.id,children:zu[s.id]?.()})}function Uu({id:s,rows:n,open:a,onToggle:i}){const{state:r}=G(),c=ws.find(p=>p.id===s),o=l.useId(),d=l.useId(),u=n.filter(p=>Hi(p,r.config)).length;return e.jsxs("section",{"data-keys-section":s,"aria-labelledby":o,className:Bu,children:[e.jsxs("button",{type:"button","aria-expanded":a,"aria-controls":d,onClick:i,className:"flex w-full cursor-pointer items-center gap-3 rounded-[inherit] px-4 py-2.5 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-focus/60",children:[e.jsxs("span",{className:"flex min-w-0 flex-1 flex-col gap-0.5",children:[e.jsx("span",{id:o,className:"text-[14px] font-medium leading-5 text-ink",children:t(c.titleKey)}),e.jsx("span",{className:"text-[13px] leading-[18px] text-ink-secondary",children:t(c.purposeKey)})]}),u>0&&e.jsx("span",{className:"shrink-0 text-[12px] leading-4 text-ink-secondary",children:t("keys.section.connected",{count:u})}),e.jsx(Xs,{size:14,"aria-hidden":"true",className:O("shrink-0 text-ink-secondary transition-transform motion-reduce:transition-none",a&&"rotate-90")})]}),e.jsxs("div",{id:d,hidden:!a,className:"flex flex-col gap-0.5 border-t border-hairline/40 px-1 py-1.5 in-data-[settings-look=simple]:border-t-[0.5px] in-data-[settings-look=simple]:border-(--settings-edge)",children:[n.map(p=>e.jsx(Du,{entry:p,visible:a},p.id)),s==="voice"&&e.jsx(hu,{})]})]})}function _u(s,n,a){const i=n.row?s?.querySelector(`[data-key-row="${n.row}"]`):s?.querySelector(`[data-keys-section="${a}"]`);if(!i||i.closest("[hidden]"))return!1;const r=xu(i);return r&&Qs(r,i,n.row?"center":"start",16),n.row&&(i.querySelector("[data-key-input], [data-key-replace], [data-key-own], [data-key-open], input, button")?.focus({preventScroll:!0}),i.setAttribute("data-key-highlight",""),window.setTimeout(()=>i.removeAttribute("data-key-highlight"),Lu)),!0}function $u(){const{state:s}=G(),[n,a]=l.useState(""),[i,r]=l.useState(()=>new Set(ws.filter(x=>x.id==="ai"||ft.some(h=>h.section===x.id&&Hi(h,s.config))).map(x=>x.id))),c=l.useRef(null),o=Qa(),d=n.trim().toLowerCase();l.useEffect(()=>{if(!o)return;const x=ft.find(y=>y.id===o.row)?.section??"ai";a(""),r(y=>y.has(x)?y:new Set([...y,x]));let h=0,f=0;const b=()=>{_u(c.current,o,x)||++f>60?Wl(o):h=window.requestAnimationFrame(b)};return h=window.requestAnimationFrame(b),()=>window.cancelAnimationFrame(h)},[o]);const u=s.config?.live?.provider==="azure",p=ft.filter(x=>Hs(x,d)&&!(u&&x.id==="liveCalls")),m=ws.flatMap(x=>{const h=p.filter(f=>f.section===x.id);return h.length>0?[{id:x.id,rows:h}]:[]});return e.jsxs("div",{ref:c,"data-keys-page":!0,className:"flex flex-col gap-4",children:[e.jsx("p",{className:"text-[13px] leading-[18px] text-ink-secondary",children:t("settings.connections.subtitle")}),e.jsxs("div",{className:"flex h-8 items-center gap-2 rounded-lg bg-ink/[0.05] px-[9px] focus-within:ring-2 focus-within:ring-focus/60",children:[e.jsx(jt,{size:15,"aria-hidden":"true",className:"shrink-0 text-ink-secondary"}),e.jsx("input",{"data-keys-search":!0,type:"text",value:n,onChange:x=>a(x.target.value),onKeyDown:x=>{x.key!=="Escape"||!n||(x.preventDefault(),x.stopPropagation(),a(""))},placeholder:t("keys.search.placeholder"),"aria-label":t("keys.search.aria"),autoComplete:"off",spellCheck:!1,className:"w-full min-w-0 bg-transparent text-[13px] text-ink placeholder:text-ink-secondary focus:outline-none"})]}),m.length===0?e.jsx("p",{"data-keys-empty":!0,className:"px-1 text-[13px] leading-[18px] text-ink-secondary",children:t("keys.search.none",{query:n.trim()})}):m.map(({id:x,rows:h})=>e.jsx(Uu,{id:x,rows:h,open:d!==""||i.has(x),onToggle:()=>r(f=>{const b=new Set(f);return b.has(x)?b.delete(x):b.add(x),b})},x))]})}const Ku="https://github.com/milind-soni/OpenMausBot/blob/main/docs/analytics.md";function Wi({simple:s=!1}){const[n,a]=l.useState(il),i=e.jsxs(e.Fragment,{children:[t(s?"settings.simple.analytics":"settings.analytics.subtitle")," ",e.jsx("a",{href:Ku,target:"_blank",rel:"noopener noreferrer",className:"text-accent hover:underline",children:t(s?"settings.simple.analyticsLink":"settings.analytics.link")})]});return e.jsx(ge,{title:t("settings.analytics.title"),subtitle:i,children:e.jsx(fe,{checked:n,"aria-label":t("settings.analytics.aria"),onClick:()=>{const r=!n;rl(r),a(r)}})})}function Gi({simple:s=!1}){const n=window.ogb?.openAtLogin,[a,i]=l.useState(null),[r,c]=l.useState(!1),[o,d]=l.useState(!1);if(l.useEffect(()=>{let p=!0;return n?.state().then(m=>{p&&i(m)}).catch(()=>{}),()=>{p=!1}},[n]),!n||!a?.available)return null;const u=p=>{c(!0),d(!1),n.set(p).then(i,()=>d(!0)).finally(()=>c(!1))};return e.jsx(ge,{title:t("settings.openAtLogin.title"),subtitle:t(s?"settings.simple.openAtLogin":"settings.openAtLogin.subtitle"),message:o?e.jsx("span",{role:"alert",className:"text-danger",children:t("settings.openAtLogin.failed")}):void 0,children:e.jsx(fe,{checked:a.on,disabled:r,"aria-label":t("settings.openAtLogin.title"),onClick:()=>u(!a.on)})})}function Hu(s=typeof window>"u"?void 0:window.ogb){return s?.platform==="darwin"&&s.talkShortcut?["talk","voice","shortcut","hotkey","hold to talk","push to talk","quick asks"]:[]}function Vi(){const s=window.ogb?.talkShortcut,[n,a]=l.useState(null),[i,r]=l.useState(!1),[c,o]=l.useState(!1);if(l.useEffect(()=>{let x=!0;return s?.state().then(h=>{x&&a(h)}).catch(()=>{}),()=>{x=!1}},[s]),!s||!n?.available)return null;const d=n.keys.find(x=>x.id===n.key)?.label??"",u=x=>{r(!0),o(!1),s.set(x).then(a,()=>o(!0)).finally(()=>r(!1))},p=c?t("settings.talk.failed"):n.enabled&&n.taken?t("settings.talk.taken",{key:d}):null,m=e.jsxs(e.Fragment,{children:[n.enabled&&e.jsx(ye,{size:"sm",className:"w-full max-w-[240px]",value:n.key,disabled:i,"aria-label":t("settings.talk.keyAria"),onChange:x=>u({key:x.target.value}),children:n.keys.map(x=>e.jsx("option",{value:x.id,children:x.label},x.id))}),p&&e.jsx("div",{role:"alert",className:n.enabled?"mt-2 text-danger":"text-danger",children:p})]});return e.jsx(ge,{title:t("settings.talk.title"),subtitle:t("settings.talk.subtitle",{key:d}),message:n.enabled||p?m:null,children:e.jsx(fe,{checked:n.enabled,disabled:i,"aria-label":t("settings.talk.aria"),onClick:()=>u({enabled:!n.enabled})})})}const cs=s=>s===0||s>=1024*1024?`${Math.round(s/(1024*1024))} MB`:`${Math.ceil(s/1024)} KB`;function qi(){const[s,n]=l.useState(null),[a,i]=l.useState(!1),[r,c]=l.useState(!1),[o,d]=l.useState(null);if(l.useEffect(()=>{let p=!0;return F("/api/attachment-storage").then(m=>{p&&n(m)}).catch(()=>{}),()=>{p=!1}},[]),!s)return null;const u=async()=>{c(!0),d(null);try{const p=await F("/api/attachment-storage",{method:"POST"});n(p);const m=t("settings.attachments.cleared",{count:p.removed,freed:cs(p.freedBytes)});d(p.failed>0?{kind:"error",message:`${m} ${t("settings.attachments.failed",{count:p.failed})}`}:{kind:"success",message:m})}catch(p){d({kind:"error",message:p instanceof Error?p.message:String(p)})}finally{c(!1),i(!1)}};return e.jsx(ge,{title:t("settings.attachments.title"),subtitle:e.jsxs(e.Fragment,{children:[e.jsx("span",{"data-attachments-used":!0,className:"block",children:t("settings.attachments.used",{used:cs(s.usedBytes),max:cs(s.maxBytes)})}),e.jsx("span",{className:"block",children:t(a?"settings.attachments.confirmText":"settings.attachments.help")})]}),message:o&&e.jsx("p",{role:o.kind==="error"?"alert":"status",className:O(o.kind==="error"?"text-danger":"text-success"),children:o.message}),children:e.jsx("div",{className:"flex flex-wrap gap-2",children:a?e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",onClick:()=>i(!1),disabled:r,className:"ui-button",children:t("settings.attachments.cancel")}),e.jsx("button",{type:"button",onClick:()=>{u()},disabled:r,className:"ui-button text-danger",children:r?t("settings.attachments.clearing"):t("settings.attachments.confirm")})]}):e.jsx("button",{type:"button",onClick:()=>{d(null),i(!0)},className:"ui-button",children:t("settings.attachments.clear")})})})}function Ji({simple:s=!1}){const[n,a]=l.useState(!1),[i,r]=l.useState(null),[c,o]=l.useState(null),d=async()=>{if(!(!window.ogb?.exportDiagnostics||n)){a(!0),r(null);try{const m=await window.ogb.exportDiagnostics();m&&r({kind:"success",message:t("settings.diagnostics.saved",{path:m})})}catch(m){r({kind:"error",message:m instanceof Error?m.message:String(m)})}finally{a(!1)}}},u=async()=>{if(window.ogb?.openLogsFolder){r(null);try{const m=await window.ogb.openLogsFolder();o(m.folder),m.opened||r({kind:"error",message:t("settings.diagnostics.openFailed",{folder:m.folder})})}catch(m){r({kind:"error",message:m instanceof Error?m.message:String(m)})}}},p=!!window.ogb?.exportDiagnostics;return e.jsx(ge,{title:t("settings.diagnostics.title"),subtitle:t(s?"settings.simple.diagnostics":"settings.diagnostics.subtitle"),message:e.jsxs(e.Fragment,{children:[c&&i?.kind!=="error"&&e.jsx("p",{role:"status","data-logs-folder":!0,className:"break-all text-ink-secondary",children:t("settings.diagnostics.logsAt",{folder:c})}),i&&e.jsx("p",{role:i.kind==="error"?"alert":"status",className:O("break-all",i.kind==="error"?"text-danger":"text-success"),children:i.message}),e.jsx("p",{"data-logs-help":!0,className:"text-ink-tertiary",children:t(p?"settings.diagnostics.logsHelp":"settings.diagnostics.elsewhere")})]}),children:p&&e.jsxs("div",{className:"flex flex-wrap gap-2",children:[window.ogb?.openLogsFolder&&e.jsx("button",{type:"button",onClick:()=>{u()},className:"ui-button",children:t("settings.diagnostics.openLogs")}),e.jsx("button",{onClick:()=>{d()},disabled:n,"aria-label":t("settings.diagnostics.aria"),className:"ui-button",children:n?t("settings.diagnostics.exporting"):t("settings.diagnostics.export")})]})})}const Wu="https://dash.cloudflare.com/profile/api-tokens",Gu=/^[0-9a-f]{32}$/i,Un="w-full rounded-lg border border-hairline/40 bg-inset px-3 py-2 text-[13px] text-ink placeholder:text-ink-secondary focus:outline-none";function Vu({failureText:s}){const{state:n,dispatch:a}=G(),i=n.config?.helpers,r=i?.own.workersAi===!0,c=i?.workersAiAccountId??"",[o,d]=l.useState(null),[u,p]=l.useState(""),[m,x]=l.useState(!1),[h,f]=l.useState(!1),[b,y]=l.useState(null),[g,v]=l.useState(null),C=(o??c).trim(),w=u.trim(),N=!w&&r&&o===null,I=o!==null&&C!==c,j=P=>a({type:"configStatus",config:P}),L=async()=>{if(!(m||!w&&!r&&!I)){if(w&&!Gu.test(C))return y(t("decider.workersAi.needsAccount"));x(!0),y(null),v(null);try{(I||w&&!c)&&j(await F("/api/config",{method:"PUT",body:JSON.stringify({decider:{workersAiAccountId:C}})})),(w||N)&&j(window.ogb?.setCredential?await window.ogb.setCredential("workersAiToken",w):await F("/api/config",{method:"PUT",body:JSON.stringify({decider:{workersAiToken:w}})})),p(""),d(null)}catch(P){y(P instanceof Error?P.message:String(P))}finally{x(!1)}}},k=async()=>{if(!(h||m||!w&&!r)){f(!0),v(null),y(null);try{const P=await F("/api/decider/test",{method:"POST",body:JSON.stringify({provider:"workersai",...w?{key:w,accountId:C}:{}})}),S=P.extraction?[t(P.extraction.ok?"decider.test.extractionOk":"decider.test.extractionFailed")]:[];v(P.ok?{ok:P.extraction?.ok!==!1,text:[t("decider.workersAi.test.ok",{ms:String(P.latencyMs)}),...S].join(" ")}:{ok:!1,text:s(P)})}catch(P){v({ok:!1,text:P instanceof Error?P.message:String(P)})}finally{f(!1)}}};return e.jsxs(X,{title:t("decider.workersAi.title"),children:[e.jsx("p",{className:"mb-2 text-[12px] leading-relaxed text-ink-secondary",children:t("decider.workersAi.detail")}),r&&e.jsxs("div",{role:"status",className:"mb-2 flex items-center gap-2 text-[13px] text-success",children:[e.jsx("span",{className:"size-1.5 rounded-full bg-success"}),e.jsx("span",{children:t("decider.status.connected")})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("input",{type:"text","data-testid":"workers-ai-account",value:o??c,onChange:P=>{v(null),y(null),d(P.target.value)},disabled:m,placeholder:t("decider.workersAi.accountIdPlaceholder"),"aria-label":t("decider.workersAi.accountId"),autoComplete:"off",spellCheck:!1,className:Un}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{type:"password","data-testid":"workers-ai-token",value:u,onChange:P=>{v(null),y(null),p(P.target.value)},onKeyDown:P=>P.key==="Enter"&&void L(),disabled:m,placeholder:r?t("keys.replace"):t("decider.workersAi.tokenPlaceholder"),"aria-label":t("decider.workersAi.token"),autoComplete:"off",spellCheck:!1,className:Un}),e.jsx("button",{type:"button","data-testid":"workers-ai-save",onClick:()=>{L()},disabled:m||!w&&!r&&!I,title:N?t("keys.removeKey"):t("common.save"),className:O("flex w-[72px] shrink-0 cursor-pointer items-center justify-center gap-1.5 rounded-lg bg-control py-2 text-[13px] hover:bg-raised-hover disabled:cursor-not-allowed disabled:opacity-50",N?"text-danger":"text-ink"),children:m?e.jsx(q,{size:13,className:"animate-spin"}):N?t("keys.clear"):e.jsxs(e.Fragment,{children:[e.jsx(ve,{size:13}),t("common.save")]})}),e.jsx("button",{type:"button","data-testid":"workers-ai-test",onClick:()=>{k()},disabled:h||m||!w&&!r,className:"flex shrink-0 cursor-pointer items-center justify-center rounded-lg border border-hairline/40 px-3 py-2 text-[13px] text-ink-secondary hover:bg-raised/50 hover:text-ink disabled:cursor-not-allowed disabled:opacity-50",children:h?t("keys.testing"):t("keys.test")})]})]}),b&&e.jsx("p",{role:"alert",className:"mt-1 text-[12px] text-danger",children:b}),g&&e.jsx("p",{role:"status",className:O("mt-1 text-[12px]",g.ok?"text-success":"text-danger"),children:g.text}),e.jsxs("a",{href:Wu,target:"_blank",rel:"noopener noreferrer",className:"mt-2 inline-flex cursor-pointer items-center gap-1 text-[12px] text-accent hover:underline",children:[t("decider.workersAi.getKey"),e.jsx(Nt,{size:11,"aria-hidden":"true"})]})]})}const qu={jev:"https://typesafe.ai",openrouter:"https://openrouter.ai/keys"},Ju=1500,Zs={rejected:"decider.error.rejected",unreachable:"decider.error.unreachable",timeout:"decider.error.timeout",rate_limited:"decider.error.rateLimited",overloaded:"decider.error.overloaded",malformed:"decider.error.malformed",no_key:"decider.error.noKey",misconfigured:"decider.error.misconfigured"},_n={rejected:"decider.included.error.rejected",rate_limited:"decider.included.error.limited"},Yu={...Zs,rejected:"decider.openrouter.error.rejected",unreachable:"decider.openrouter.error.unreachable",timeout:"decider.openrouter.error.timeout",rate_limited:"decider.openrouter.error.rateLimited",overloaded:"decider.openrouter.error.overloaded",malformed:"decider.openrouter.error.malformed"},Xu={...Zs,rejected:"decider.workersAi.error.rejected",unreachable:"decider.workersAi.error.unreachable",timeout:"decider.workersAi.error.timeout",rate_limited:"decider.workersAi.error.rateLimited",overloaded:"decider.workersAi.error.overloaded",malformed:"decider.workersAi.error.malformed"},ds={jev:"decider.status.byJev",workersai:"decider.status.byWorkersAi",openrouter:"decider.status.byOpenRouter"};function Qu(s){const n=s?.decider,a=s?.helpers?.extraction,i=n?.configured?n.included?t("decider.status.byCloud"):t(ds[n.provider]??ds.jev):t("decider.status.notSetUp"),r=a?.provider?a.included?t("decider.status.byCloud"):t(ds[a.provider]):t("decider.status.notSetUp");return t("decider.status.line",{decisions:i,extraction:r})}function $n(s,n=!1,a="jev"){if(a==="workersai"){if(s.reason==="http_error")return t("decider.workersAi.error.http",{status:String(s.status??"?")});const r=Xu[s.reason];return r?t(r):t("decider.error.other")}if(a==="openrouter"){if(s.reason==="http_error"&&s.status===402)return t("decider.openrouter.error.credits");if(s.reason==="http_error")return t("decider.openrouter.error.http",{status:String(s.status??"?")});const r=Yu[s.reason];return r?t(r):t("decider.error.other")}if(n&&s.reason==="http_error"&&s.status===402)return t("decider.included.error.subscription");if(n&&_n[s.reason])return t(_n[s.reason]);if(s.reason==="http_error")return t("decider.error.http",{status:String(s.status??"?")});const i=Zs[s.reason];return i?t(i):t("decider.error.other")}const Zu=["decider.jobs.browserClicks","decider.jobs.toolSelection","decider.jobs.placement"];function ep(){const{state:s,dispatch:n}=G(),a=s.config?.decider,i=a?.provider==="openrouter"?"openrouter":"jev",r=i==="openrouter",c=a?.configured??!1,o=c&&a?.included===!0,d=r&&c&&a?.keySource==="shared",u=r&&a?.sharedKey===!0,p=c&&!o&&!d,m=a?.enabled??!1,x=a?.jobs.roomRouting??!0,[h,f]=l.useState(""),[b,y]=l.useState(!1),[g,v]=l.useState(!1),[C,w]=l.useState(!1),[N,I]=l.useState(null),[j,L]=l.useState(null),[k,P]=l.useState(null),S=h.trim(),M=!S&&p,se=!r||o?null:d?"decider.openrouter.status.sharedHint":c?u?"decider.openrouter.status.ownFallbackHint":null:"decider.openrouter.status.notConnectedHint",ne=T=>n({type:"configStatus",config:T}),V=async T=>{if(!g){v(!0),I(null);try{ne(await F("/api/config",{method:"PUT",body:JSON.stringify({decider:T})}))}catch(R){I(R instanceof Error?R.message:String(R))}finally{v(!1)}}};l.useEffect(()=>{if(!r||k)return;let T=!1;return F("/api/decider/models").then(R=>{T||P(R)},()=>{}),()=>{T=!0}},[r,k]);const ie=T=>{f(""),L(null),V(T)},re=async()=>{if(!(b||!S&&!p)){y(!0),I(null),L(null);try{const T=window.ogb?.setCredential?await window.ogb.setCredential(r?"openrouterDeciderKey":"jevApiKey",S):await F("/api/config",{method:"PUT",body:JSON.stringify({decider:{[r?"openrouterKey":"key"]:S}})});ne(T),f("")}catch(T){I(T instanceof Error?T.message:String(T))}finally{y(!1)}}},oe=async()=>{if(C||b||!S&&!c)return;w(!0),L(null),I(null);const T=!S&&o,R=!S&&d;try{const E=await F("/api/decider/test",{method:"POST",body:JSON.stringify(S?{key:S}:{})});L(E.ok?{ok:!0,text:r?[t(R?"decider.openrouter.test.okShared":"decider.openrouter.test.ok",{ms:String(E.latencyMs)}),...E.latencyMs>Ju?[t("decider.test.slow")]:[]].join(" "):t("decider.test.ok",{ms:String(E.latencyMs)})}:{ok:!1,text:$n(E,T,i)})}catch(E){L({ok:!1,text:E instanceof Error?E.message:String(E)})}finally{w(!1)}};return e.jsxs(e.Fragment,{children:[e.jsxs("section",{className:"space-y-2 px-4",children:[e.jsx("p",{className:"text-[13px] leading-relaxed text-ink-secondary",children:t("decider.intro")}),e.jsx("p",{role:"status","data-testid":"helpers-status",className:"text-[13px] font-medium text-ink",children:Qu(s.config)})]}),e.jsx(Vu,{failureText:T=>$n(T,!1,"workersai")}),e.jsx(ge,{title:t("decider.provider.label"),children:e.jsxs(ye,{className:"w-48","data-testid":"decider-provider",value:i,onChange:T=>ie({provider:T.target.value==="openrouter"?"openrouter":"jev"}),disabled:g||!s.config,"aria-label":t("decider.provider.label"),children:[e.jsx("option",{value:"jev",children:t("decider.provider.jev")}),e.jsx("option",{value:"openrouter",children:t("decider.provider.openrouter")})]})}),r&&e.jsx(ge,{title:t("decider.model.label"),subtitle:k?.source==="builtin"?t("decider.model.builtinNote"):void 0,children:e.jsxs(ye,{className:"w-64 max-w-full","data-testid":"decider-model",value:a?.model??"",onChange:T=>ie({openrouterModel:T.target.value,openrouterApi:k?.models.find(R=>R.id===T.target.value)?.api??"chat"}),disabled:g,"aria-label":t("decider.model.label"),children:[a?.model&&!k?.models.some(T=>T.id===a.model)&&e.jsx("option",{value:a.model,children:a.model}),["recommended","more"].map(T=>{const R=k?.models.filter(E=>E.group===T)??[];return R.length>0&&e.jsx("optgroup",{label:t(T==="recommended"?"decider.model.recommended":"decider.model.more"),children:R.map(E=>e.jsx("option",{value:E.id,children:E.name},E.id))},T)})]})}),e.jsx(ge,{title:t(r?"decider.openrouter.master":"decider.master"),subtitle:c?void 0:t(r?"decider.masterNeedsKey.openrouter":"decider.masterNeedsKey"),children:e.jsx(fe,{"data-testid":"decider-master","aria-label":t(r?"decider.openrouter.master":"decider.master"),checked:m,disabled:!c||g||!s.config,onClick:()=>{V({enabled:!m})},className:"cursor-pointer"})}),e.jsxs(X,{title:t(r?"decider.openrouter.key.label":"decider.key.label"),children:[e.jsxs("div",{role:"status",className:"mb-2 flex items-center gap-2 text-[13px] text-ink-secondary",children:[e.jsx("span",{className:O("size-1.5 rounded-full",c?"bg-success":"bg-raised-hover")}),e.jsx("span",{className:c?"text-success":void 0,children:o?t("keys.includedWithCloudPro"):d?t("decider.openrouter.status.shared"):c?t(u?"decider.openrouter.status.own":"decider.status.connected"):t("decider.status.notConnected")})]}),se&&e.jsxs("p",{className:"mb-2 text-[12px] leading-relaxed text-ink-secondary",children:[t(se),!p&&e.jsxs(e.Fragment,{children:[" ",e.jsx("button",{type:"button","data-testid":"decider-manage-keys",onClick:()=>n(Ss("openrouter")),className:"cursor-pointer text-accent hover:underline",children:t("decider.openrouter.key.manageLink")})]})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{type:"password",value:h,onChange:T=>{L(null),I(null),f(T.target.value)},onKeyDown:T=>T.key==="Enter"&&void re(),disabled:b,placeholder:p?t("keys.replace"):t(d?"decider.openrouter.key.overridePlaceholder":r?"decider.openrouter.key.placeholder":"decider.key.placeholder"),"aria-label":t(r?"decider.openrouter.key.label":"decider.key.label"),autoComplete:"off",spellCheck:!1,className:"w-full rounded-lg border border-hairline/40 bg-inset px-3 py-2 text-[13px] text-ink placeholder:text-ink-secondary focus:outline-none"}),e.jsx("button",{type:"button","data-testid":"decider-save",onClick:()=>{re()},disabled:b||!S&&!p,title:M?t("keys.removeKey"):t("common.save"),className:O("flex w-[72px] shrink-0 cursor-pointer items-center justify-center gap-1.5 rounded-lg bg-control py-2 text-[13px] hover:bg-raised-hover disabled:cursor-not-allowed disabled:opacity-50",M?"text-danger":"text-ink"),children:b?e.jsx(q,{size:13,className:"animate-spin"}):M?t("keys.clear"):e.jsxs(e.Fragment,{children:[e.jsx(ve,{size:13}),t("common.save")]})}),e.jsx("button",{type:"button","data-testid":"decider-test",onClick:()=>{oe()},disabled:C||b||!S&&!c,className:"flex shrink-0 cursor-pointer items-center justify-center rounded-lg border border-hairline/40 px-3 py-2 text-[13px] text-ink-secondary hover:bg-raised/50 hover:text-ink disabled:cursor-not-allowed disabled:opacity-50",children:C?t("keys.testing"):t("keys.test")})]}),N&&e.jsx("p",{role:"alert",className:"mt-1 text-[12px] text-danger",children:N}),j&&e.jsx("p",{role:"status",className:O("mt-1 text-[12px]",j.ok?"text-success":"text-danger"),children:j.text}),!d&&e.jsxs("a",{href:qu[i],target:"_blank",rel:"noopener noreferrer",className:"mt-2 inline-flex cursor-pointer items-center gap-1 text-[12px] text-accent hover:underline",children:[t(r?"decider.openrouter.key.getKey":"decider.key.getKey"),e.jsx(Nt,{size:11,"aria-hidden":"true"})]})]}),e.jsx(X,{title:t("decider.jobs.title"),children:e.jsxs("ul",{className:"flex flex-col",children:[e.jsxs("li",{className:"flex items-start justify-between gap-4 py-2",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[13px] font-medium text-ink",children:t("decider.jobs.roomRouting")}),e.jsx("div",{className:"mt-0.5 text-[12px] leading-relaxed text-ink-secondary",children:t("decider.jobs.roomRoutingDetail")})]}),e.jsx(fe,{"data-testid":"decider-job-roomRouting","aria-label":t("decider.jobs.roomRouting"),checked:m&&x,disabled:!m||g,onClick:()=>{V({jobs:{roomRouting:!x}})},className:"cursor-pointer"})]}),Zu.map(T=>e.jsxs("li",{"data-testid":"decider-coming-soon","aria-disabled":"true",className:"flex items-center justify-between gap-4 border-t border-hairline/40 py-2 opacity-50",children:[e.jsx("span",{className:"text-[13px] text-ink-secondary",children:t(T)}),e.jsx("span",{className:"rounded bg-control px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-ink-secondary",children:t("decider.jobs.comingSoon")})]},T))]})})]})}const tp=["openai","xai","gemini","openrouter","custom"],sp=4,Yi={openai:"gpt-image-2",xai:"grok-imagine-image-2.0",gemini:"gemini-2.5-flash-image",openrouter:"google/gemini-2.5-flash-image",custom:""},np={openai:[{id:"gpt-image-2",name:"GPT Image 2"},{id:"gpt-image-1",name:"GPT Image 1"},{id:"gpt-image-1-mini",name:"GPT Image 1 Mini"}],xai:[{id:"grok-imagine-image-2.0",name:"Grok Imagine Image 2.0"}],gemini:[{id:"gemini-2.5-flash-image",name:"Nano Banana (Gemini 2.5 Flash Image)"}],openrouter:[{id:"google/gemini-2.5-flash-image",name:"Google: Nano Banana (Gemini 2.5 Flash Image)"},{id:"google/gemini-3.1-flash-image",name:"Google: Nano Banana 2 (Gemini 3.1 Flash Image)"},{id:"google/gemini-3-pro-image",name:"Google: Nano Banana Pro (Gemini 3 Pro Image)"},{id:"openai/gpt-image-2",name:"OpenAI: GPT Image 2"},{id:"black-forest-labs/flux-3-image",name:"Black Forest Labs: FLUX 3 Image"},{id:"bytedance-seed/seedream-5-0-pro",name:"ByteDance Seed: Seedream 5.0 Pro"},{id:"x-ai/grok-imagine-image-2.0",name:"xAI: Grok Imagine Image 2.0"},{id:"qwen/qwen-image-3",name:"Qwen: Qwen Image 3"}],custom:[]};function ap(s){const n="Use an HTTPS API base URL, or HTTP for a local router, without passwords, query parameters or fragments";let a;try{a=new URL(s.trim())}catch{throw new Error(n)}if(s.length>2048||a.username||a.password||a.search||a.hash)throw new Error(n);const i=a.hostname.toLowerCase(),r=/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/.exec(i),c=i==="localhost"||i.endsWith(".localhost")||i.endsWith(".local")||i==="host.docker.internal"||i==="host.containers.internal"||i==="[::1]"||/^\[f[cd][0-9a-f]{2}:/.test(i)||r&&(Number(r[1])===127||Number(r[1])===10||Number(r[1])===192&&Number(r[2])===168||Number(r[1])===172&&Number(r[2])>=16&&Number(r[2])<=31);if(a.protocol!=="https:"&&!(a.protocol==="http:"&&c))throw new Error(n);if(r&&(Number(r[1])===0||Number(r[1])===169&&Number(r[2])===254))throw new Error(n);return a.pathname=a.pathname.replace(/\/+$/,"").replace(/\/images\/generations$/,""),a.toString().replace(/\/+$/,"")}const _t={openai:"OpenAI",xai:"Grok (xAI)",gemini:"Gemini",openrouter:"OpenRouter",custom:"Custom"},ip={openai:{credential:"openaiImageApiKey",patch:s=>({imageGen:{key:s}}),label:"imageGen.key.openai"},gemini:{credential:"geminiImageApiKey",patch:s=>({imageGen:{geminiKey:s}}),label:"imageGen.key.gemini"},custom:{credential:"customImageApiKey",patch:s=>({imageGen:{customApiKey:s}}),label:"imageGen.key.custom"}},rp={xai:{label:"imageGen.key.xai",note:"imageGen.key.sharedXai"},openrouter:{label:"imageGen.key.openrouter",note:"imageGen.key.sharedOpenrouter"}},Kn={openai:"https://platform.openai.com/api-keys",gemini:"https://aistudio.google.com/apikey",xai:"https://console.x.ai",openrouter:"https://openrouter.ai/keys"},Is="w-full min-w-0 rounded-lg border border-hairline/40 bg-inset px-3 py-2 text-[13px] text-ink placeholder:text-ink-secondary focus:outline-none disabled:opacity-50",Hn="flex shrink-0 cursor-pointer items-center justify-center gap-1.5 rounded-lg bg-control px-3 py-2 text-[13px] text-ink hover:bg-raised-hover disabled:cursor-not-allowed disabled:opacity-50",us="\0other";function lp(s,n){return n.ok?n.freeTier?{ok:!1,text:t("imageGen.test.noCredit")}:{ok:!0,text:t(s==="openrouter"?"imageGen.test.okOpenrouter":"imageGen.test.ok")}:n.reason==="model_missing"?{ok:!1,text:t("imageGen.test.modelMissing",{model:n.model})}:n.reason==="rejected"?{ok:!1,text:t("imageGen.test.rejected")}:n.reason==="unreachable"?{ok:!1,text:t("imageGen.test.unreachable")}:n.reason==="no_key"?{ok:!1,text:t("imageGen.key.missing")}:n.reason==="no_url"?{ok:!1,text:t("imageGen.test.noUrl")}:{ok:!1,text:t("imageGen.test.unexpected")}}function op(s,n){return n==="openai"?s?.openaiConfigured===!0:n==="xai"?s?.xaiConfigured===!0:n==="gemini"?s?.geminiConfigured===!0:n==="openrouter"?s?.openrouterConfigured===!0:s?.customKeyConfigured===!0}function cp(){const{state:s,dispatch:n}=G(),a=s.config?.imageGen,i=a?.primary??{provider:a?.provider??"openai",model:a?.model??Yi.openai,configured:a?.configured===!0},r=a?.fallback??null,[c,o]=l.useState(!1),[d,u]=l.useState(null),[p,m]=l.useState(null),x=i.provider==="openrouter"||r?.provider==="openrouter";l.useEffect(()=>{if(!x||p)return;let y=!1;return F("/api/images/openrouter-models").then(g=>{y||m(Array.isArray(g?.models)?g:{source:"builtin",models:[]})},()=>{y||m({source:"builtin",models:[]})}),()=>{y=!0}},[x,p]);const h=async y=>{o(!0),u(null);try{const g=await F("/api/config",{method:"PUT",body:JSON.stringify(y)});n({type:"configStatus",config:g})}catch(g){u(g instanceof Error?g.message:String(g))}finally{o(!1)}},f=(y,g)=>{if(y==="fallback"&&g==="")return void h({imageGen:{fallback:null}});const v=g,C=y==="primary"&&r?.provider===v;h({imageGen:{[y]:{provider:v},...C?{fallback:null}:{}}})},b=[i.provider,...r?[r.provider]:[]].filter((y,g,v)=>v.indexOf(y)===g);return e.jsxs(e.Fragment,{children:[e.jsxs("section",{className:"space-y-2 px-4",children:[e.jsx("p",{className:"text-[13px] leading-relaxed text-ink-secondary",children:t("imageGen.intro")}),e.jsxs("p",{role:"status","data-testid":"image-gen-status",className:"flex items-center gap-2 text-[13px] font-medium text-ink",children:[e.jsx("span",{className:O("size-1.5 shrink-0 rounded-full",a?.ready?i.configured?"bg-success":"bg-warning":"bg-raised-hover")}),a?.ready?i.configured?t("imageGen.status.ready",{provider:_t[i.provider]}):t("imageGen.status.backupOnly",{provider:_t[r.provider]}):t("imageGen.status.notReady")]})]}),e.jsx(Wn,{slot:"primary",provider:i.provider,model:i.model,configured:i.configured,openrouterModels:p,disabled:c||!s.config,onProvider:f,onModel:y=>{h({imageGen:{primary:{provider:i.provider,model:y}}})}}),e.jsx(Wn,{slot:"fallback",provider:r?.provider??null,model:r?.model??"",configured:r?.configured===!0,exclude:i.provider,openrouterModels:p,disabled:c||!s.config,onProvider:f,onModel:y=>r&&void h({imageGen:{fallback:{provider:r.provider,model:y}}})}),e.jsx(ge,{title:t("imageGen.maxPerTurn.label"),subtitle:t("imageGen.maxPerTurn.help"),children:e.jsx(ye,{className:"w-20","data-testid":"image-gen-max",value:String(a?.maxPerTurn??sp),onChange:y=>{h({imageGen:{maxPerTurn:Number(y.target.value)}})},disabled:c||!s.config,"aria-label":t("imageGen.maxPerTurn.label"),children:Array.from({length:10},(y,g)=>g+1).map(y=>e.jsx("option",{value:y,children:y},y))})}),d&&e.jsx("p",{role:"alert",className:"px-4 text-[12px] text-danger",children:d}),b.map(y=>e.jsx(up,{provider:y,status:a},y))]})}function Wn({slot:s,provider:n,model:a,configured:i,exclude:r,openrouterModels:c,disabled:o,onProvider:d,onModel:u}){const p=t(s==="primary"?"imageGen.primary.label":"imageGen.fallback.label");return e.jsxs(e.Fragment,{children:[e.jsx(ge,{title:p,subtitle:n&&!i?t(n==="custom"?"imageGen.slot.needsConnection":"imageGen.slot.needsKey"):t(s==="primary"?"imageGen.primary.help":"imageGen.fallback.help"),children:e.jsxs(ye,{className:"w-48","data-testid":`image-gen-${s}`,value:n??"",onChange:m=>d(s,m.target.value),disabled:o,"aria-label":p,children:[s==="fallback"&&e.jsx("option",{value:"",children:t("imageGen.fallback.none")}),tp.filter(m=>m!==r).map(m=>e.jsx("option",{value:m,children:_t[m]},m))]})}),n&&e.jsx(dp,{slot:s,slotLabel:p,provider:n,model:a,openrouterModels:c,disabled:o,onModel:u})]})}function dp({slot:s,slotLabel:n,provider:a,model:i,openrouterModels:r,disabled:c,onModel:o}){const[d,u]=l.useState(null),m=(a==="openrouter"&&r?.source==="openrouter"?r.models:null)??np[a].map(b=>({...b,group:"recommended"})),x=d!==null||m.length===0,h=()=>{d!==null&&(u(null),d.trim()&&d.trim()!==i&&o(d.trim()))},f=b=>{if(b===us)return u(i);u(null),o(b)};return e.jsx(ge,{title:t("decider.model.label"),subtitle:a==="openrouter"&&r?.source==="builtin"?t("decider.model.builtinNote"):void 0,children:e.jsxs("div",{className:"flex flex-wrap items-center justify-end gap-2",children:[m.length>0&&e.jsxs(ye,{className:"w-64 max-w-full","data-testid":`image-gen-${s}-model`,value:x?us:i,onChange:b=>f(b.target.value),disabled:c,"aria-label":t("imageGen.model.label",{slot:n}),children:[i&&!m.some(b=>b.id===i)&&e.jsx("option",{value:i,children:i}),["recommended","more"].map(b=>{const y=m.filter(g=>g.group===b);return y.length>0&&e.jsx("optgroup",{label:t(b==="recommended"?"decider.model.recommended":"decider.model.more"),children:y.map(g=>e.jsx("option",{value:g.id,children:g.name},g.id))},b)}),e.jsx("option",{value:us,children:t("imageGen.model.other")})]}),x&&e.jsx("input",{value:d??i,onChange:b=>u(b.target.value),onBlur:h,onKeyDown:b=>b.key==="Enter"&&h(),disabled:c,placeholder:Yi[a]||t("imageGen.model.placeholder"),"aria-label":t("imageGen.model.idLabel",{slot:n}),autoComplete:"off",spellCheck:!1,className:O(Is,"w-64 max-w-full")})]})})}function up({provider:s,status:n}){const{dispatch:a}=G(),[i,r]=l.useState(""),[c,o]=l.useState(null),[d,u]=l.useState(!1),[p,m]=l.useState(null),[x,h]=l.useState(!1),[f,b]=l.useState(null),y=s==="openrouter"?[n?.primary,n?.fallback].filter(S=>S?.provider===s).map(S=>S?.model).join(" "):"",g=f?.models===y?f:null,v=S=>b(S&&{...S,models:y}),C=op(n,s),w=s==="openai"||s==="gemini"||s==="custom"?ip[s]:null,N=s==="xai"||s==="openrouter"?rp[s]:null,I=c??n?.customUrl??"",j=async S=>{u(!0),m(null),v(null);try{a({type:"configStatus",config:await S()}),r(""),o(null)}catch(M){m(M instanceof Error?M.message:String(M))}finally{u(!1)}},L=S=>j(async()=>s==="xai"||s==="openrouter"?Jl(s,S,!1):window.ogb?.setCredential&&w?window.ogb.setCredential(w.credential,S):F("/api/config",{method:"PUT",body:JSON.stringify(w.patch(S))})),k=()=>j(async()=>{const S=I.trim()?ap(I.trim()):"";return F("/api/config",{method:"PUT",body:JSON.stringify({imageGen:{customUrl:S}})})}),P=async()=>{h(!0),v(null);try{v(lp(s,await F("/api/images/test",{method:"POST",body:JSON.stringify({provider:s})})))}catch(S){v({ok:!1,text:S instanceof Error?S.message:String(S)})}finally{h(!1)}};return e.jsxs(X,{title:_t[s],children:[e.jsx(pp,{configured:C,optional:s==="custom"}),N&&e.jsxs("p",{className:"mb-2 text-[12px] leading-relaxed text-ink-secondary",children:[t(N.note)," ",e.jsx("button",{type:"button",onClick:()=>a({type:"toggleAppSettings",open:!0,section:"connections"}),className:"cursor-pointer text-accent hover:underline",children:t("imageGen.key.manage")})]}),s==="custom"&&e.jsxs("div",{className:"mb-2 flex gap-2",children:[e.jsx("input",{type:"url",value:I,onChange:S=>o(S.target.value),onKeyDown:S=>S.key==="Enter"&&void k(),disabled:d,placeholder:"http://127.0.0.1:4000/v1","aria-label":t("imageGen.custom.url"),autoComplete:"off",className:Is}),e.jsxs("button",{type:"button",onClick:()=>{k()},disabled:d||c===null,className:Hn,children:[d?e.jsx(q,{size:13,className:"animate-spin"}):e.jsx(ve,{size:13}),t("common.save")]})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{type:"password",value:i,onChange:S=>r(S.target.value),onKeyDown:S=>S.key==="Enter"&&i.trim()&&void L(i.trim()),disabled:d,placeholder:C?t("keys.replace"):t("imageGen.key.paste"),"aria-label":t((w??N).label),autoComplete:"off",spellCheck:!1,className:Is}),e.jsxs("button",{type:"button",onClick:()=>{L(i.trim())},disabled:d||!i.trim(),className:Hn,children:[d?e.jsx(q,{size:13,className:"animate-spin"}):e.jsx(ve,{size:13}),t("common.save")]}),C&&e.jsx("button",{type:"button",onClick:()=>{P()},disabled:x||d,className:"flex shrink-0 cursor-pointer items-center justify-center rounded-lg border border-hairline/40 px-3 py-2 text-[13px] text-ink-secondary hover:bg-raised/50 hover:text-ink disabled:cursor-not-allowed disabled:opacity-50",children:x?t("keys.testing"):t("keys.test")})]}),g&&e.jsx("p",{role:"status",className:O("mt-1 text-[12px]",g.ok?"text-success":"text-danger"),children:g.text}),e.jsxs("div",{className:"mt-2 flex items-center justify-between gap-2 text-[12px] text-ink-secondary",children:[Kn[s]?e.jsx("a",{href:Kn[s],target:"_blank",rel:"noreferrer",className:"text-accent hover:underline",children:t("imageGen.key.get")}):e.jsx("span",{children:t("imageGen.custom.help",{app:Se()})}),C&&e.jsx("button",{type:"button",onClick:()=>{L("")},disabled:d,className:"cursor-pointer hover:text-danger disabled:opacity-50",children:t("keys.removeKey")})]}),p&&e.jsx("p",{role:"alert",className:"mt-1 text-[12px] text-danger",children:p})]})}function pp({configured:s,optional:n=!1}){return e.jsxs("div",{role:"status",className:"mb-2 flex items-center gap-2 text-[13px] text-ink-secondary",children:[e.jsx("span",{className:O("size-1.5 rounded-full",s?"bg-success":"bg-raised-hover")}),e.jsx("span",{className:s?"text-success":void 0,children:t(s?"imageGen.key.saved":n?"imageGen.key.optional":"imageGen.key.missing")})]})}function ps(s){if(s.readOnly||s.trialCredit||s.access==="custom"||s.access==="api")return null;if(s.driverKind==="claudeAgent")return"claude";const n=s.authentication?.method;return s.snapshot.chatgptPlan===!0||(n==="device-code"||n==="browser-pkce")&&ti(s.driverKind)==="codex"?"chatgpt":null}function en(s){return s.snapshot.state!=="available"?"unavailable":s.snapshot.authenticated===!0?"signedIn":s.snapshot.authenticated===!1?"signedOut":"unknown"}const tn={claude:{title:"accounts.claude",add:"accounts.addClaude",removeBody:"accounts.removeBodyClaude"},chatgpt:{title:"accounts.chatgpt",add:"accounts.addChatgpt",removeBody:"accounts.removeBodyChatgpt"}};function mp(s,n){return{signOut:en(n)==="signedIn"&&n.authentication?.signOut===!0&&n.snapshot.account?.method!=="api-key",remove:s==="claude"?n.instanceId!=="claude"&&n.claudeAccount?.isDefault!==!0:n.instanceId.startsWith("chatgpt-")}}function Xi(s){return s.some($e)}function xp(s,n){const a=n.filter(o=>en(o)==="signedIn"),i=Xi(n),r=n.some(o=>o.snapshot.state==="available"),c=n.length>1?t("accounts.count",{count:String(n.length),signedIn:String(a.length)}):a[0]?.snapshot.account?.email??eo(n[0]);return{title:t(tn[s].title),subtitle:c,ready:i,status:i?t("onboarding.engines.ready"):r?t("model.signInRequired"):t("onboarding.engines.needsSetup"),action:i?t("engines.library.manage"):r?t("accounts.signIn"):t("engines.library.setup")}}function hp({group:s,instance:n,onRename:a}){const{state:i,dispatch:r,refreshInstances:c}=G(),[o,d]=l.useState(!1),[u,p]=l.useState(null),[m,x]=l.useState(!1),[h,f]=l.useState(null),b=l.useRef(null),{signOut:y,remove:g}=mp(s,n),v=i.bots.filter(N=>N.modelSelection.instanceId===n.instanceId).length;l.useEffect(()=>{if(!o)return;const N=j=>{j.key==="Escape"&&(j.stopPropagation(),d(!1))},I=j=>{j.target instanceof Node&&!b.current?.contains(j.target)&&d(!1)};return window.addEventListener("keydown",N,!0),window.addEventListener("pointerdown",I),()=>{window.removeEventListener("keydown",N,!0),window.removeEventListener("pointerdown",I)}},[o]);const C=async N=>{p(null),x(!0),f(null);try{const I=`/api/instances/${encodeURIComponent(n.instanceId)}${N==="signOut"?"/auth/sign-out":""}`,{instances:j}=await F(I,N==="signOut"?{method:"POST"}:{method:"DELETE"});Array.isArray(j)?r({type:"instances",instances:j}):await c().catch(()=>{})}catch(I){f(I instanceof Error?I.message:String(I))}finally{x(!1)}},w="ui-menu-row w-full text-left disabled:cursor-not-allowed disabled:opacity-50";return e.jsxs("div",{ref:b,className:"relative flex items-center gap-1",children:[g&&e.jsx("button",{type:"button",disabled:m||v>0,onClick:()=>p("remove"),title:v>0?t("accounts.inUse",{count:String(v)}):void 0,className:"rounded-lg px-2.5 py-1.5 text-[12px] font-medium text-danger hover:bg-danger/10 disabled:cursor-not-allowed disabled:opacity-50",children:t("accounts.remove")}),e.jsx("button",{type:"button",onClick:()=>d(N=>!N),disabled:m,"aria-haspopup":"menu","aria-expanded":o,"aria-label":t("accounts.menu",{name:tt(n)}),className:"flex size-8 items-center justify-center rounded-lg text-ink-secondary outline-none hover:bg-control hover:text-ink focus-visible:ring-2 focus-visible:ring-accent disabled:opacity-50",children:m?e.jsx(q,{size:14,className:"animate-spin"}):e.jsx(Ni,{size:16})}),o&&e.jsxs("div",{role:"menu",className:O("absolute right-0 top-full z-40 mt-1 w-[220px] overflow-hidden text-[13px]",cd),children:[e.jsx("button",{type:"button",role:"menuitem",className:O(w,"text-ink"),onClick:()=>{d(!1),a()},children:t("accounts.rename")}),y&&e.jsx("button",{type:"button",role:"menuitem",className:O(w,"text-ink"),onClick:()=>{d(!1),p("signOut")},children:t("accounts.signOut")}),g&&v>0&&e.jsx("p",{className:"px-3 pb-1 pt-0.5 text-[11px] leading-snug text-ink-secondary",children:t("accounts.inUse",{count:String(v)})})]}),h&&e.jsx("p",{role:"alert",className:"absolute right-0 top-full z-30 mt-1 w-[260px] rounded-lg bg-card p-2 text-[12px] text-danger shadow-lg",children:h}),e.jsx(ut,{open:u==="signOut",title:t("accounts.signOutTitle",{name:tt(n)}),body:t("accounts.signOutBody"),confirmLabel:t("accounts.signOut"),onCancel:()=>p(null),onConfirm:()=>{C("signOut")}}),e.jsx(ut,{open:u==="remove",title:t("accounts.removeTitle",{name:tt(n)}),body:t(tn[s].removeBody),confirmLabel:t("accounts.remove"),tone:"neutral",onCancel:()=>p(null),onConfirm:()=>{C("remove")}})]})}function gp({instance:s,onDone:n}){const{dispatch:a}=G(),[i,r]=l.useState(tt(s)),[c,o]=l.useState(!1),[d,u]=l.useState(null),p=async()=>{const m=i.trim();if(!m||m===tt(s))return n();o(!0),u(null);try{const{instances:x}=await F(`/api/instances/${encodeURIComponent(s.instanceId)}`,{method:"PATCH",body:JSON.stringify({displayName:m})});Array.isArray(x)&&a({type:"instances",instances:x}),n()}catch(x){u(x instanceof Error?x.message:String(x))}finally{o(!1)}};return e.jsxs("form",{className:"flex min-w-0 flex-1 flex-col gap-1",onSubmit:m=>{m.preventDefault(),p()},children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsx("input",{value:i,onChange:m=>r(m.target.value),maxLength:80,autoFocus:!0,disabled:c,"aria-label":t("accounts.nameLabel"),onKeyDown:m=>{m.key==="Escape"&&(m.stopPropagation(),n())},className:"min-w-0 flex-1 rounded-lg border border-hairline/40 bg-inset px-2.5 py-1.5 text-[13px] text-ink outline-none focus:border-accent-border disabled:opacity-50"}),e.jsx("button",{type:"submit",disabled:c||!i.trim(),className:"rounded-lg bg-raised px-3 py-1.5 text-[12px] font-medium text-ink hover:bg-raised-hover disabled:opacity-50",children:c?e.jsx(q,{size:13,className:"animate-spin"}):t("common.save")}),e.jsx("button",{type:"button",onClick:n,disabled:c,className:"rounded-lg px-2.5 py-1.5 text-[12px] text-ink-secondary hover:bg-control",children:t("common.cancel")})]}),d&&e.jsx("p",{role:"alert",className:"text-[12px] text-danger",children:d})]})}function fp({group:s,instance:n,signingIn:a,onSignIn:i,onSignInDone:r}){const[c,o]=l.useState(!1),d=en(n),u=n.snapshot.account,p=n.snapshot.authenticationUnavailableReason,m=p&&d!=="signedIn"?p:d==="signedIn"?u?.method==="api-key"?t("accounts.apiKey"):[u?.email,u?.organization].filter(Boolean).join(" · ")||t("accounts.signedIn"):d==="signedOut"?t("accounts.notSignedIn"):d==="unknown"?t("accounts.unknown"):n.snapshot.reason??t("onboarding.engines.needsSetup");return e.jsxs("li",{"data-account":n.instanceId,"data-account-state":d,className:"px-3 py-2.5",children:[e.jsxs("div",{className:"flex min-h-9 items-center gap-3",children:[e.jsx("span",{"aria-hidden":"true",className:O("flex size-6 shrink-0 items-center justify-center rounded-full",d==="signedIn"?"bg-success/15 text-success":"bg-control text-ink-secondary"),children:d==="signedIn"?e.jsx(ve,{size:13}):e.jsx("span",{className:O("size-1.5 rounded-full",d==="signedOut"?"bg-warning":"bg-ink-tertiary")})}),c?e.jsx(gp,{instance:n,onDone:()=>o(!1)}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"truncate text-[13px] font-medium text-ink",title:tt(n),children:tt(n)}),e.jsx("div",{className:"truncate text-[12px] text-ink-secondary",title:m,children:m})]}),d!=="signedIn"&&d!=="unavailable"&&!p&&!a&&e.jsx("button",{type:"button",onClick:i,className:O("shrink-0 rounded-lg px-3 py-1.5 text-[12px] font-semibold",d==="signedOut"?"bg-accent text-white hover:brightness-110":"bg-control text-ink hover:bg-raised-hover"),children:t("accounts.signIn")}),e.jsx(hp,{group:s,instance:n,onRename:()=>o(!0)})]})]}),a&&e.jsx("div",{className:"pl-9",children:s==="claude"?e.jsxs(e.Fragment,{children:[e.jsx(Yl,{instanceId:n.instanceId,autoStart:!0,onDone:r}),n.claudeAccount?.signInCommand&&e.jsxs("details",{className:"mt-2 text-[12px] text-ink-secondary",children:[e.jsx("summary",{className:"cursor-pointer select-none hover:text-ink",children:t("engineSetup.preferTerminal")}),e.jsx(Xl,{command:n.claudeAccount.signInCommand,actionLabel:t("engineSetup.openSignIn"),compact:!0})]})]}):e.jsx(Ql,{instanceId:n.instanceId,provider:"codex",browserPkce:n.authentication?.method==="browser-pkce",autoStart:!0,onDone:r})}),s==="chatgpt"&&d==="signedIn"&&n.snapshot.chatgptPlan&&e.jsx("div",{className:"pl-9",children:e.jsx(Zl,{instanceId:n.instanceId,welcome:!1})})]})}function Qi({label:s,endpoint:n,extra:a,folder:i=!1,describedBy:r,onAdded:c}){const{dispatch:o}=G(),[d,u]=l.useState(!1),[p,m]=l.useState(""),[x,h]=l.useState(""),[f,b]=l.useState(!1),[y,g]=l.useState(null),v=async()=>{if(!(f||!p.trim())){b(!0),g(null);try{const C={displayName:p.trim(),...a,...i&&x.trim()?{configDir:x.trim()}:{}},w=await F(n,{method:"POST",body:JSON.stringify(C)});Array.isArray(w.instances)&&o({type:"instances",instances:w.instances}),u(!1),m(""),h(""),typeof w.instanceId=="string"&&c(w.instanceId)}catch(C){g(C instanceof Error?C.message:String(C))}finally{b(!1)}}};return d?e.jsxs("form",{"data-add-account":n,className:"space-y-2.5 rounded-xl border border-hairline/50 bg-app p-3",onSubmit:C=>{C.preventDefault(),v()},children:[e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] font-medium text-ink",children:[t("accounts.nameLabel"),e.jsx("input",{value:p,onChange:C=>m(C.target.value),placeholder:t("accounts.namePlaceholder"),maxLength:80,autoFocus:!0,required:!0,disabled:f,"aria-describedby":r,className:"rounded-lg border border-hairline/40 bg-inset px-3 py-2 text-[13px] font-normal text-ink outline-none focus:border-accent-border disabled:opacity-50"})]}),i&&e.jsxs("details",{className:"text-[12px] text-ink-secondary",children:[e.jsx("summary",{className:"cursor-pointer select-none hover:text-ink",children:t("accounts.folderToggle")}),e.jsx("input",{value:x,onChange:C=>h(C.target.value),placeholder:"~/.claude-work",maxLength:4096,spellCheck:!1,disabled:f,"aria-label":t("accounts.folderToggle"),className:"mt-2 w-full rounded-lg border border-hairline/40 bg-inset px-3 py-2 font-mono text-[12px] text-ink outline-none focus:border-accent-border disabled:opacity-50"}),e.jsx("p",{className:"mt-1 leading-relaxed",children:t("accounts.folderHint")})]}),y&&e.jsx("p",{role:"alert",className:"text-[12px] text-danger",children:y}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",onClick:()=>{u(!1),g(null)},disabled:f,className:"rounded-lg px-3 py-1.5 text-[12px] text-ink-secondary hover:bg-control disabled:opacity-50",children:t("common.cancel")}),e.jsxs("button",{type:"submit",disabled:f||!p.trim(),className:"flex items-center gap-1.5 rounded-lg bg-accent px-3 py-1.5 text-[12px] font-semibold text-white hover:brightness-110 disabled:opacity-50",children:[f&&e.jsx(q,{size:13,className:"animate-spin"}),t("accounts.addSubmit")]})]})]}):e.jsxs("button",{type:"button",onClick:()=>u(!0),"aria-describedby":r,className:"flex min-h-8 w-fit items-center gap-1.5 rounded-lg px-2 py-1.5 text-[13px] font-medium text-ink-secondary outline-none hover:bg-control hover:text-ink focus-visible:ring-2 focus-visible:ring-accent",children:[e.jsx(Oe,{size:14}),s]})}function bp({group:s,accounts:n,advanced:a,bare:i=!1}){const[r,c]=l.useState(null),o=n[0],d=n.some(m=>m.snapshot.state==="available"),u=n.find(m=>m.policy)?.policy,p=l.useId();return e.jsxs(zt,{instance:o,summary:xp(s,n),bare:i,children:[u&&e.jsxs("p",{className:"mb-3 text-[12px] leading-relaxed text-ink-secondary",children:[e.jsx("span",{className:"font-medium text-ink",children:t("policy.managedBy",{organization:u.organizationName})})," · ",u.reason]}),d?e.jsxs("div",{className:"space-y-2",children:[e.jsx("ul",{"data-accounts":s,className:"divide-y divide-hairline/40 rounded-xl border border-hairline/50 bg-panel/40",children:n.map(m=>e.jsx(fp,{group:s,instance:m,signingIn:r===m.instanceId,onSignIn:()=>c(m.instanceId),onSignInDone:()=>c(x=>x===m.instanceId?null:x)},m.instanceId))}),!o.snapshot.authenticationUnavailableReason&&e.jsxs(e.Fragment,{children:[e.jsx(Qi,{label:t(tn[s].add),endpoint:`/api/instances/${s}-accounts`,folder:s==="claude",describedBy:s==="chatgpt"?p:void 0,onAdded:c}),s==="chatgpt"&&e.jsx("p",{id:p,className:"px-2 text-[12px] leading-relaxed text-ink-secondary",children:t("accounts.addChatgptWorkspaceNote")})]})]}):e.jsx(Vt,{instance:o,unframed:!0}),o.snapshot.update&&e.jsx(si,{update:o.snapshot.update,instance:o,className:"mt-3",quiet:!0}),o.snapshot.warning&&e.jsx(ni,{warning:o.snapshot.warning,className:"mt-3"}),a]})}const yp={claude:{url:"https://api.anthropic.com",model:"deepseek-chat"},codex:{url:"https://api.openai.com/v1",model:""}},Et=O(He,"font-sans"),vp={name:"",url:"",token:"",model:""},kp=s=>({name:s.displayName,url:(s.claudeEndpoint??s.codexEndpoint)?.baseUrl??"",token:"",model:""});function Gn({instance:s,engine:n,onDone:a}){const{dispatch:i}=G(),r=yp[n],[c,o]=l.useState(s?kp(s):vp),[d,u]=l.useState(!1),[p,m]=l.useState(null),x=b=>({value:c[b],onChange:y=>o(g=>({...g,[b]:y.target.value})),spellCheck:!1,disabled:d}),h=!!(c.name.trim()&&(c.url.trim()||n==="codex")&&(s||c.token.trim())),f=async()=>{if(d||!h)return;u(!0),m(null);const b={displayName:c.name.trim(),baseUrl:c.url.trim()||r.url,...c.token.trim()?{token:c.token.trim()}:{},...c.model.trim()?{model:c.model.trim()}:{}};try{const y=s?await F(`/api/instances/${encodeURIComponent(s.instanceId)}/${n}-endpoint`,{method:"PATCH",body:JSON.stringify(b)}):await F(`/api/instances/${n}-endpoint`,{method:"POST",body:JSON.stringify(b)});Array.isArray(y.instances)&&i({type:"instances",instances:y.instances}),a()}catch(y){m(y instanceof Error&&y.message?y.message:t("claudeEndpoints.failed"))}finally{u(!1)}};return e.jsxs("form",{"data-claude-endpoint-form":n==="claude"?s?.instanceId??"new":void 0,"data-codex-endpoint-form":n==="codex"?s?.instanceId??"new":void 0,className:"flex flex-col gap-2 rounded-xl border border-hairline/50 bg-inset p-3",onSubmit:b=>{b.preventDefault(),f()},children:[e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t(n==="codex"?"agentEndpoints.responses":"agentEndpoints.messages")}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] font-medium text-ink",children:[t("claudeEndpoints.name"),e.jsx("input",{...x("name"),maxLength:80,autoFocus:!0,"aria-label":t("claudeEndpoints.name"),className:Et})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] font-medium text-ink",children:[t("claudeEndpoints.baseUrl"),e.jsx("input",{...x("url"),type:"url",maxLength:2048,placeholder:r.url,"aria-label":t("claudeEndpoints.baseUrl"),className:O(Et,"font-mono")})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] font-medium text-ink",children:[t("claudeEndpoints.token"),e.jsx("input",{...x("token"),type:"password",maxLength:4096,autoComplete:"off","aria-label":t("claudeEndpoints.token"),className:O(Et,"font-mono"),placeholder:s?t("claudeEndpoints.tokenKeep"):""})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] font-medium text-ink",children:[t("claudeEndpoints.model"),e.jsx("input",{...x("model"),maxLength:160,placeholder:r.model,"aria-label":t("claudeEndpoints.model"),className:O(Et,"font-mono")})]}),e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("claudeEndpoints.modelHint")}),p&&e.jsx("p",{role:"alert",className:"text-[12px] text-danger",children:p}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",onClick:a,disabled:d,className:"rounded-lg px-3 py-1.5 text-[12px] text-ink-secondary hover:bg-control disabled:opacity-50",children:t("common.cancel")}),e.jsxs("button",{type:"submit",disabled:d||!h,className:"flex items-center gap-1.5 rounded-lg bg-accent px-3 py-1.5 text-[12px] font-semibold text-white hover:brightness-110 disabled:opacity-50",children:[d&&e.jsx(q,{size:13,className:"animate-spin"}),t("common.save")]})]})]})}function jp({instance:s,onEdit:n}){const{state:a,dispatch:i}=G(),[r,c]=l.useState(!1),[o,d]=l.useState(!1),[u,p]=l.useState(null),m=a.bots.filter(f=>f.modelSelection.instanceId===s.instanceId||f.fallback?.some(b=>b.instanceId===s.instanceId)||f.tasks?.some(b=>b.modelSelection?.instanceId===s.instanceId)).length,x=s.claudeEndpoint??s.codexEndpoint,h=async()=>{c(!1),d(!0),p(null);try{const f=await F(`/api/instances/${encodeURIComponent(s.instanceId)}`,{method:"DELETE"});Array.isArray(f.instances)&&i({type:"instances",instances:f.instances})}catch(f){p(f instanceof Error?f.message:String(f))}finally{d(!1)}};return e.jsxs("li",{"data-claude-endpoint":s.claudeEndpoint?s.instanceId:void 0,"data-codex-endpoint":s.codexEndpoint?s.instanceId:void 0,className:"px-3 py-2.5",children:[e.jsxs("div",{className:"flex min-h-9 items-center gap-3",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"truncate text-[13px] font-medium text-ink",title:s.displayName,children:s.displayName}),e.jsx("div",{className:"truncate font-mono text-[11px] text-ink-secondary",title:x?.baseUrl,children:x?.baseUrl})]}),e.jsx("button",{type:"button",onClick:n,disabled:o,className:"shrink-0 rounded-lg px-2.5 py-1.5 text-[12px] font-medium text-ink-secondary hover:bg-control hover:text-ink disabled:opacity-50",children:t("claudeEndpoints.edit")}),e.jsx("button",{type:"button",disabled:o||m>0,onClick:()=>c(!0),title:m>0?t("accounts.inUse",{count:String(m)}):t("accounts.remove"),"aria-label":t("claudeEndpoints.remove",{name:s.displayName}),className:"flex size-8 shrink-0 items-center justify-center rounded-lg text-danger hover:bg-danger/10 disabled:cursor-not-allowed disabled:opacity-50",children:o?e.jsx(q,{size:14,className:"animate-spin"}):e.jsx(Le,{size:14})})]}),u&&e.jsx("p",{role:"alert",className:"mt-1 text-[12px] text-danger",children:u}),e.jsx(ut,{open:r,title:t("accounts.removeTitle",{name:s.displayName}),body:t("claudeEndpoints.removeBody"),confirmLabel:t("accounts.remove"),tone:"neutral",pending:o,onCancel:()=>c(!1),onConfirm:()=>{h()}})]})}function Zi({engine:s}){const{state:n}=G(),a=n.instances.filter(c=>s==="claude"?c.claudeEndpoint:c.codexEndpoint),[i,r]=l.useState(null);return e.jsxs("div",{"data-claude-endpoints":s==="claude"?"":void 0,"data-codex-endpoints":s==="codex"?"":void 0,className:"mt-3 space-y-2",children:[e.jsx("div",{className:"text-[13px] leading-[18px] text-ink",children:t(s==="claude"?"claudeEndpoints.title":"agentEndpoints.codexTitle")}),e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t(s==="claude"?"claudeEndpoints.hint":"agentEndpoints.codexHint")}),a.length===0?e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("claudeEndpoints.empty")}):e.jsx("ul",{className:"divide-y divide-hairline/40 rounded-xl border border-hairline/50 bg-panel/40",children:a.map(c=>i===c.instanceId?e.jsx("li",{className:"p-3",children:e.jsx(Gn,{engine:s,instance:c,onDone:()=>r(null)})},c.instanceId):e.jsx(jp,{instance:c,onEdit:()=>r(c.instanceId)},c.instanceId))}),i==="new"?e.jsx(Gn,{engine:s,onDone:()=>r(null)}):e.jsxs("button",{type:"button",onClick:()=>r("new"),className:"flex min-h-8 w-fit items-center gap-1.5 rounded-lg px-2 py-1.5 text-[13px] font-medium text-ink-secondary outline-none hover:bg-control hover:text-ink focus-visible:ring-2 focus-visible:ring-accent",children:[e.jsx(Oe,{size:14}),t("claudeEndpoints.add")]})]})}function ms(){return e.jsx(Zi,{engine:"claude"})}function xs(){return e.jsx(Zi,{engine:"codex"})}const xt=O(He,"font-sans"),Np={opusModel:"global.anthropic.claude-opus-5-5",sonnetModel:"global.anthropic.claude-sonnet-5-5",haikuModel:"global.anthropic.claude-haiku-5-5",smallFastModel:"global.anthropic.claude-haiku-5-5"},Vn=["opusModel","sonnetModel","haikuModel","smallFastModel"],wp={name:"Claude on Bedrock",awsProfile:"default",awsRegion:"",model:"",opusModel:"",sonnetModel:"",haikuModel:"",smallFastModel:""},Sp=s=>{const n=s.claudeBedrock;return{name:s.displayName,awsProfile:n?.awsProfile||"default",awsRegion:n?.awsRegion??"",model:n?.model??"",opusModel:n?.opusModel??"",sonnetModel:n?.sonnetModel??"",haikuModel:n?.haikuModel??"",smallFastModel:n?.smallFastModel??""}},qn={opusModel:"claudeBedrock.opus",sonnetModel:"claudeBedrock.sonnet",haikuModel:"claudeBedrock.haiku",smallFastModel:"claudeBedrock.smallFast"};function Jn({instance:s,onDone:n}){const{dispatch:a}=G(),[i,r]=l.useState(s?Sp(s):wp),[c,o]=l.useState(!1),[d,u]=l.useState(null),p=h=>({value:i[h],onChange:f=>r(b=>({...b,[h]:f.target.value})),spellCheck:!1,disabled:c}),m=!!(i.name.trim()&&i.awsProfile.trim()&&i.awsRegion.trim()&&i.model.trim()),x=async()=>{if(c||!m)return;o(!0),u(null);const h={displayName:i.name.trim(),awsProfile:i.awsProfile.trim(),awsRegion:i.awsRegion.trim(),model:i.model.trim(),...Object.fromEntries(Vn.map(f=>[f,i[f].trim()]))};try{const f=s?await F(`/api/instances/${encodeURIComponent(s.instanceId)}/claude-bedrock`,{method:"PATCH",body:JSON.stringify(h)}):await F("/api/instances/claude-bedrock",{method:"POST",body:JSON.stringify(h)});Array.isArray(f.instances)&&a({type:"instances",instances:f.instances}),n()}catch(f){u(f instanceof Error&&f.message?f.message:t("claudeBedrock.failed"))}finally{o(!1)}};return e.jsxs("form",{"data-claude-bedrock-form":s?.instanceId??"new",className:"flex flex-col gap-2 rounded-xl border border-hairline/50 bg-inset p-3",onSubmit:h=>{h.preventDefault(),x()},children:[e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("claudeBedrock.awsHint")}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] font-medium text-ink",children:[t("claudeBedrock.name"),e.jsx("input",{...p("name"),maxLength:80,autoFocus:!0,"aria-label":t("claudeBedrock.name"),className:xt})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] font-medium text-ink",children:[t("claudeBedrock.profile"),e.jsx("input",{...p("awsProfile"),maxLength:128,placeholder:"default","aria-label":t("claudeBedrock.profile"),className:O(xt,"font-mono")})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] font-medium text-ink",children:[t("claudeBedrock.region"),e.jsx("input",{...p("awsRegion"),maxLength:32,placeholder:"us-east-1","aria-label":t("claudeBedrock.region"),className:O(xt,"font-mono")})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] font-medium text-ink",children:[t("claudeBedrock.model"),e.jsx("input",{...p("model"),maxLength:160,placeholder:"global.anthropic.claude-sonnet-5-5","aria-label":t("claudeBedrock.model"),className:O(xt,"font-mono")})]}),e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("claudeBedrock.modelHint")}),e.jsxs("details",{className:"rounded-lg border border-hairline/40 px-2.5 py-2",children:[e.jsx("summary",{className:"cursor-pointer text-[12px] font-medium text-ink-secondary outline-none hover:text-ink",children:t("claudeBedrock.tiers")}),e.jsx("div",{className:"mt-2 flex flex-col gap-2",children:Vn.map(h=>e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] font-medium text-ink",children:[t(qn[h]),e.jsx("input",{...p(h),maxLength:160,placeholder:Np[h],"aria-label":t(qn[h]),className:O(xt,"font-mono")})]},h))})]}),d&&e.jsx("p",{role:"alert",className:"text-[12px] text-danger",children:d}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",onClick:n,disabled:c,className:"rounded-lg px-3 py-1.5 text-[12px] text-ink-secondary hover:bg-control disabled:opacity-50",children:t("common.cancel")}),e.jsxs("button",{type:"submit",disabled:c||!m,className:"flex items-center gap-1.5 rounded-lg bg-accent px-3 py-1.5 text-[12px] font-semibold text-white hover:brightness-110 disabled:opacity-50",children:[c&&e.jsx(q,{size:13,className:"animate-spin"}),t("common.save")]})]})]})}function Cp({instance:s,onEdit:n}){const{state:a,dispatch:i}=G(),[r,c]=l.useState(!1),[o,d]=l.useState(!1),[u,p]=l.useState(null),m=a.bots.filter(f=>f.modelSelection.instanceId===s.instanceId||f.fallback?.some(b=>b.instanceId===s.instanceId)||f.tasks?.some(b=>b.modelSelection?.instanceId===s.instanceId)).length,x=s.claudeBedrock,h=async()=>{c(!1),d(!0),p(null);try{const f=await F(`/api/instances/${encodeURIComponent(s.instanceId)}`,{method:"DELETE"});Array.isArray(f.instances)&&i({type:"instances",instances:f.instances})}catch(f){p(f instanceof Error?f.message:String(f))}finally{d(!1)}};return e.jsxs("li",{"data-claude-bedrock":s.instanceId,className:"px-3 py-2.5",children:[e.jsxs("div",{className:"flex min-h-9 items-center gap-3",children:[e.jsx(ai,{preset:"aws",size:16,className:"shrink-0"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"truncate text-[13px] font-medium text-ink",title:s.displayName,children:s.displayName}),e.jsx("div",{className:"truncate font-mono text-[11px] text-ink-secondary",children:t("claudeBedrock.rowSubtitle",{profile:x?.awsProfile??"",region:x?.awsRegion??""})})]}),e.jsx("button",{type:"button",onClick:n,disabled:o,className:"shrink-0 rounded-lg px-2.5 py-1.5 text-[12px] font-medium text-ink-secondary hover:bg-control hover:text-ink disabled:opacity-50",children:t("claudeBedrock.edit")}),e.jsx("button",{type:"button",disabled:o||m>0,onClick:()=>c(!0),title:m>0?t("accounts.inUse",{count:String(m)}):t("accounts.remove"),"aria-label":t("claudeBedrock.remove",{name:s.displayName}),className:"flex size-8 shrink-0 items-center justify-center rounded-lg text-danger hover:bg-danger/10 disabled:cursor-not-allowed disabled:opacity-50",children:o?e.jsx(q,{size:14,className:"animate-spin"}):e.jsx(Le,{size:14})})]}),u&&e.jsx("p",{role:"alert",className:"mt-1 text-[12px] text-danger",children:u}),e.jsx(ut,{open:r,title:t("accounts.removeTitle",{name:s.displayName}),body:t("claudeBedrock.removeBody"),confirmLabel:t("accounts.remove"),tone:"neutral",pending:o,onCancel:()=>c(!1),onConfirm:()=>{h()}})]})}function hs(){const{state:s}=G(),n=s.instances.filter(r=>r.claudeBedrock),[a,i]=l.useState(null);return e.jsxs("div",{"data-claude-bedrock-endpoints":"",className:"mt-3 space-y-2",children:[e.jsx("div",{className:"text-[13px] leading-[18px] text-ink",children:t("claudeBedrock.title")}),e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("claudeBedrock.hint")}),n.length===0?e.jsx("p",{className:"text-[12px] leading-4 text-ink-secondary",children:t("claudeBedrock.empty")}):e.jsx("ul",{className:"divide-y divide-hairline/40 rounded-xl border border-hairline/50 bg-panel/40",children:n.map(r=>a===r.instanceId?e.jsx("li",{className:"p-3",children:e.jsx(Jn,{instance:r,onDone:()=>i(null)})},r.instanceId):e.jsx(Cp,{instance:r,onEdit:()=>i(r.instanceId)},r.instanceId))}),a==="new"?e.jsx(Jn,{onDone:()=>i(null)}):e.jsxs("button",{type:"button",onClick:()=>i("new"),className:"flex min-h-8 w-fit items-center gap-1.5 rounded-lg px-2 py-1.5 text-[13px] font-medium text-ink-secondary outline-none hover:bg-control hover:text-ink focus-visible:ring-2 focus-visible:ring-accent",children:[e.jsx(Oe,{size:14}),t("claudeBedrock.add")]})]})}function Yn(s){const n=s/1048576;return n<1?t("engines.freeSpace.underOneMb"):n<1024?`${Math.round(n)} MB`:`${(n/1024).toFixed(1)} GB`}function Ep({instance:s,initial:n={kind:"idle"}}){const[a,i]=l.useState(n),[r,c]=l.useState(null),o=`/api/instances/${encodeURIComponent(s.instanceId)}/leftover-files`,d=async()=>{c(null),i({kind:"scanning"});try{const m=await F(o);i(m.folders>0?{kind:"found",bytes:m.bytes,complete:m.complete}:{kind:"none"})}catch(m){c(m instanceof Error?m.message:String(m)),i({kind:"idle"})}},u=async()=>{c(null),i({kind:"deleting"});try{const m=await F(`${o}/remove`,{method:"POST",body:JSON.stringify({})});i({kind:"done",freedBytes:m.freedBytes,remaining:m.remaining})}catch(m){c(m instanceof Error?m.message:String(m)),i({kind:"idle"})}},p=a.kind==="scanning"||a.kind==="deleting";return e.jsxs("section",{className:"mt-3 rounded-xl border border-hairline/40 px-3 py-2.5","aria-label":t("engines.freeSpace.title"),children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(dd,{size:13,"aria-hidden":"true",className:"shrink-0 text-ink-secondary"}),e.jsx("span",{className:"text-[12px] font-medium text-ink",children:t("engines.freeSpace.title")}),e.jsx("span",{className:"flex-1"}),(a.kind==="idle"||a.kind==="none"||a.kind==="done"||p)&&e.jsxs("button",{type:"button",onClick:()=>{d()},disabled:p,className:"flex shrink-0 items-center gap-1 rounded-lg border border-hairline/40 px-3 py-1 text-[12px] text-ink-secondary hover:bg-raised/50 hover:text-ink disabled:opacity-50",children:[p&&e.jsx(q,{size:12,className:"animate-spin"}),t("engines.freeSpace.action")]})]}),e.jsx("p",{className:"mt-1.5 text-[12px] leading-relaxed text-ink-secondary",children:t("engines.freeSpace.intro")}),a.kind==="scanning"&&e.jsx("p",{role:"status",className:"mt-2 text-[12px] text-ink-secondary",children:t("engines.freeSpace.scanning")}),a.kind==="deleting"&&e.jsx("p",{role:"status",className:"mt-2 text-[12px] text-ink-secondary",children:t("engines.freeSpace.deleting")}),a.kind==="none"&&e.jsx("p",{role:"status",className:"mt-2 text-[12px] text-ink-secondary",children:t("engines.freeSpace.none")}),a.kind==="found"&&e.jsxs("div",{className:"mt-2 flex flex-wrap items-center gap-2",children:[e.jsx("p",{role:"status",className:"flex-1 text-[12px] text-ink",children:t(a.complete?"engines.freeSpace.found":"engines.freeSpace.foundAtLeast",{size:Yn(a.bytes)})}),e.jsx("button",{type:"button",onClick:()=>i({kind:"idle"}),className:"rounded-lg px-3 py-1 text-[12px] text-ink-secondary hover:bg-raised/50 hover:text-ink",children:t("common.cancel")}),e.jsx("button",{type:"button",onClick:()=>{u()},className:"rounded-lg bg-raised px-3 py-1 text-[12px] text-ink hover:bg-raised-hover",children:t("engines.freeSpace.delete")})]}),a.kind==="done"&&e.jsxs("p",{role:"status",className:"mt-2 text-[12px] text-ink-secondary",children:[(a.freedBytes>0||a.remaining===0)&&e.jsxs("span",{className:"text-success",children:[t("engines.freeSpace.freed",{size:Yn(a.freedBytes)})," "]}),a.remaining>0&&t("engines.freeSpace.someLeft")]}),r&&e.jsx("p",{role:"alert",className:"mt-2 text-[12px] text-danger",children:r})]})}const gs=[60,120,180,360,720];function er(){const{state:s,dispatch:n}=G(),[a,i]=l.useState(!1),[r,c]=l.useState(""),o=l.useRef(!1),d=s.config?.cacheKeepWarm;if(!d)return null;const u=async m=>{if(!o.current){o.current=!0,i(!0),c("");try{const x=await F("/api/config",{method:"PUT",body:JSON.stringify({cacheKeepWarm:{enabled:m.enabled,windowMinutes:m.windowMinutes}})});n({type:"configStatus",config:x})}catch(x){c(x instanceof Error?x.message:t("settings.keepWarm.error"))}finally{o.current=!1,i(!1)}}},p=gs.includes(d.windowMinutes)?[...gs]:[...gs,d.windowMinutes].sort((m,x)=>m-x);return e.jsxs(X,{title:t("settings.keepWarm.title"),subtitle:t("settings.keepWarm.subtitle"),children:[e.jsxs("div",{className:"mt-3 flex items-center justify-between gap-4",children:[e.jsx("label",{htmlFor:"cache-keepwarm-enabled",className:"text-[13px] font-medium text-ink",children:t("settings.keepWarm.enable")}),e.jsx(fe,{id:"cache-keepwarm-enabled",checked:d.enabled,disabled:a,"aria-describedby":"cache-keepwarm-help cache-keepwarm-cost",onClick:()=>{u({...d,enabled:!d.enabled})}})]}),e.jsx("p",{id:"cache-keepwarm-help",className:"mt-2 text-[12px] leading-relaxed text-ink-secondary",children:t("settings.keepWarm.help")}),e.jsx("p",{id:"cache-keepwarm-cost",className:"mt-2 text-[12px] leading-relaxed text-ink-secondary",children:t("settings.keepWarm.cost")}),e.jsxs("div",{className:"mt-3 flex items-center justify-between gap-4",children:[e.jsx("label",{htmlFor:"cache-keepwarm-window",className:"text-[13px] font-medium text-ink",children:t("settings.keepWarm.window")}),e.jsx(ye,{id:"cache-keepwarm-window",value:d.windowMinutes,disabled:a||!d.enabled,onChange:m=>{u({...d,windowMinutes:Number(m.target.value)})},children:p.map(m=>e.jsx("option",{value:m,children:t("settings.keepWarm.hours",{hours:Number((m/60).toFixed(2))})},m))})]}),a&&e.jsx("span",{role:"status",className:"sr-only",children:t("settings.threads.saving")}),r&&e.jsx("p",{role:"alert",className:"mt-2 text-[12px] text-danger",children:r})]})}function Ap({instance:s,cliDefault:n,onClose:a,onSaved:i}){const[r,c]=l.useState(s.cliCandidates??null),[o,d]=l.useState(""),[u,p]=l.useState(s.cli&&!(s.cliCandidates??[]).includes(s.cli)?s.cli:""),[m,x]=l.useState(!1),[h,f]=l.useState(null),[b,y]=l.useState(!1),[g,v]=l.useState(null),C=l.useRef(!1);l.useEffect(()=>{C.current||(C.current=!0,F(`/api/cli-candidates?name=${encodeURIComponent(n??"")}`).then(({candidates:k})=>{c(k),s.cli&&(k.includes(s.cli)?d(s.cli):p(s.cli))}).catch(()=>c(k=>k??[])))},[n,s.cli]);const w=u.trim()||o,N=w!==(s.cli??""),I=m||b;l.useEffect(()=>{f(null)},[w]);const j=()=>{if(I||!w||!N)return;y(!0),v(null);const k=w;F(`/api/instances/${encodeURIComponent(s.instanceId)}`,{method:"PATCH",body:JSON.stringify({cli:k})}).then(()=>Promise.resolve(i()).catch(()=>{})).then(a).catch(P=>v(P.message)).finally(()=>y(!1))},L=()=>{I||!w||!N||(x(!0),v(null),F("/api/cli-test",{method:"POST",body:JSON.stringify({cli:w,driver:s.driverKind})}).then(k=>{f(k),k.ok&&j()}).catch(k=>v(k.message)).finally(()=>x(!1)))};return e.jsxs("div",{className:"mt-2.5 flex flex-col gap-2",children:[r!==null&&r.length>0&&e.jsxs(ye,{className:"w-full font-mono",value:u.trim()?"":o,onChange:k=>{d(k.target.value),p("")},"aria-label":t("engines.detectedAria",{name:s.displayName}),disabled:I,children:[e.jsx("option",{value:"",children:t("engines.selectBinary")}),r.map(k=>e.jsx("option",{value:k,children:k},k))]}),e.jsx("input",{type:"text",value:u,onChange:k=>p(k.target.value),onKeyDown:k=>{k.key==="Enter"&&(k.preventDefault(),!(!w||!N)&&L())},placeholder:r?.length?t("engines.manualPath"):"/absolute/path/to/cli","aria-label":t("engines.customAria",{name:s.displayName}),spellCheck:!1,disabled:I,className:"w-full rounded-lg border border-hairline/40 bg-inset px-3 py-2 font-mono text-[12px] text-ink placeholder:font-sans placeholder:text-ink-secondary focus:outline-none disabled:opacity-50"}),h&&!h.ok&&h.message&&e.jsxs("div",{role:"alert",className:"flex gap-1.5 rounded-lg border border-warning/25 bg-warning/10 px-2.5 py-2 text-[12px] leading-relaxed text-warning",children:[e.jsx(Ge,{size:13,className:"mt-0.5 shrink-0"}),e.jsx("span",{children:t("engines.testFailed",{message:h.message})})]}),h?.ok&&h.version&&e.jsx("div",{className:"text-[12px] text-success",children:t("engines.testPassed",{version:h.version})}),g&&e.jsx("div",{role:"alert",className:"text-[12px] text-danger",children:g}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{onClick:a,disabled:I,className:"rounded-lg px-3 py-1.5 text-[13px] text-ink-secondary hover:bg-raised/50 hover:text-ink disabled:opacity-50",children:t("common.cancel")}),h&&!h.ok?e.jsxs(e.Fragment,{children:[e.jsx("button",{onClick:()=>f(null),disabled:I,className:"rounded-lg px-3 py-1.5 text-[13px] text-ink-secondary hover:bg-raised/50 hover:text-ink disabled:opacity-50",children:t("engines.editPath")}),e.jsx("button",{onClick:()=>j(),disabled:I,className:"flex items-center gap-1.5 rounded-lg bg-raised px-3 py-1.5 text-[13px] text-danger hover:bg-raised-hover disabled:opacity-50",children:b?e.jsx(q,{size:13,className:"animate-spin"}):t("engines.saveAnyway")})]}):e.jsx("button",{onClick:L,disabled:I||!w||!N,className:O("flex w-[72px] items-center justify-center gap-1.5 rounded-lg py-1.5 text-[13px]","bg-raised text-ink hover:bg-raised-hover","disabled:cursor-not-allowed disabled:opacity-50"),children:I?e.jsx(q,{size:13,className:"animate-spin"}):e.jsxs(e.Fragment,{children:[e.jsx(ve,{size:13}),t("common.save")]})})]})]})}function tr({instance:s}){const{refreshInstances:n}=G(),[a,i]=l.useState(!1),r=Ed(a),[c,o]=l.useState(!1),[d,u]=l.useState(!1),[p,m]=l.useState(null),[x,h]=l.useState(null),f=l.useRef(null);l.useEffect(()=>{f.current!==null&&f.current!==s.cli&&i(!1),f.current=s.cli??null},[s.cli]);const b=()=>{c||d||(o(!0),h(null),F(`/api/instances/${encodeURIComponent(s.instanceId)}`,{method:"PATCH",body:JSON.stringify({cli:""})}).then(()=>Promise.resolve(n()).catch(()=>{})).catch(v=>h(v.message)).finally(()=>o(!1)))},y=()=>{c||d||(o(!0),h(null),F(`/api/instances/${encodeURIComponent(s.instanceId)}`,{method:"PATCH",body:JSON.stringify({hidden:!0})}).then(()=>Promise.resolve(n()).catch(()=>{})).catch(v=>h(v.message)).finally(()=>o(!1)))},g=()=>{c||d||(u(!0),m(null),h(null),F(`/api/instances/${encodeURIComponent(s.instanceId)}/claude-update`,{method:"POST",body:JSON.stringify({})}).then(async({version:v})=>{m(v),await Promise.resolve(n()).catch(()=>{})}).catch(v=>h(v.message)).finally(()=>u(!1)))};return e.jsxs("details",{className:"mt-4 border-t border-hairline/40 pt-3",children:[e.jsx("summary",{className:"cursor-pointer rounded-md py-1 text-[12px] font-medium text-ink-secondary outline-none hover:text-ink focus-visible:ring-2 focus-visible:ring-accent",children:t("engines.library.advanced")}),e.jsx("p",{className:"mt-2 text-[12px] leading-relaxed text-ink-secondary",children:t("engines.footer")}),e.jsxs("div",{className:"mt-3 flex flex-wrap items-center gap-2 text-[13px]",children:[s.cli?e.jsx("span",{className:"w-full break-all font-mono text-[12px] text-ink-secondary",title:s.cli,children:s.cli}):s.cliDefault&&e.jsx("span",{className:"break-all font-mono text-[11px] text-ink-secondary",children:s.cliDefault}),s.snapshot.version&&e.jsx("span",{className:"break-all text-[11px] text-ink-secondary",title:s.snapshot.version,children:s.snapshot.version}),e.jsx("span",{className:"flex-1"}),s.driverKind==="claudeAgent"&&e.jsxs("button",{onClick:g,disabled:c||d,className:"flex shrink-0 items-center gap-1 text-[12px] text-ink-secondary hover:text-ink disabled:opacity-50",children:[d?e.jsx(q,{size:12,className:"animate-spin"}):e.jsx(De,{size:12}),d?t("engines.updating"):t("engines.updateClaude")]}),s.cli&&e.jsx("button",{onClick:b,disabled:c||d,className:"shrink-0 text-[12px] text-ink-secondary hover:text-ink disabled:opacity-50",children:c?t("engines.resetting"):t("engines.reset")}),e.jsx("button",{type:"button","data-hide-engine":s.instanceId,onClick:y,disabled:c||d,title:t("engines.hideHint"),className:"shrink-0 text-[12px] text-ink-secondary hover:text-ink disabled:opacity-50",children:t("engines.hide")}),e.jsx("button",{onClick:()=>i(v=>!v),disabled:d,"aria-expanded":a,className:O("shrink-0 rounded-lg border border-hairline/40 px-3 py-1 text-[12px]",a?"bg-accent/15 text-accent":"text-ink-secondary hover:bg-raised/50 hover:text-ink","disabled:opacity-50"),children:t("engines.setCli")})]}),p&&e.jsx("div",{role:"status",className:"mt-1 text-[12px] text-success",children:t("engines.claudeUpdated",{version:p})}),x&&e.jsx("div",{role:"alert",className:"mt-1 text-[12px] text-danger",children:x}),r.shown&&e.jsx("div",{className:r.className,...r.exitProps,children:e.jsx(Ap,{instance:s,cliDefault:s.cliDefault,onClose:()=>i(!1),onSaved:n})})]})}function Xn({instance:s,action:n}){const{state:a,dispatch:i,refreshInstances:r}=G(),[c,o]=l.useState(!1),[d,u]=l.useState(!1),[p,m]=l.useState(null),x=n==="remove",h=x?a.bots.filter(y=>y.modelSelection.instanceId===s.instanceId).length:0,f=t(x?"accounts.remove":"accounts.signOut"),b=async()=>{o(!1),u(!0),m(null);try{const y=`/api/instances/${encodeURIComponent(s.instanceId)}${x?"":"/auth/sign-out"}`,{instances:g}=await F(y,{method:x?"DELETE":"POST"});Array.isArray(g)?i({type:"instances",instances:g}):await r()}catch(y){m(y instanceof Error?y.message:String(y))}finally{u(!1)}};return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("button",{type:"button",disabled:d||h>0,onClick:()=>o(!0),className:O("rounded-lg px-2.5 py-1.5 text-[12px] font-medium disabled:cursor-not-allowed disabled:opacity-50",x?"text-danger hover:bg-danger/10":"text-ink-secondary hover:bg-raised hover:text-ink"),children:d?e.jsx(q,{size:13,className:"animate-spin"}):f}),h>0&&e.jsx("p",{className:"text-[11px] text-ink-secondary",children:t("accounts.inUse",{count:String(h)})})]}),p&&e.jsx("p",{role:"alert",className:"text-[12px] text-danger",children:p}),e.jsx(ut,{open:c,title:t(x?"accounts.removeTitle":"accounts.signOutTitle",{name:s.displayName}),body:t(x?"accounts.removeBodyAntigravity":"accounts.signOutBody"),confirmLabel:f,tone:"neutral",pending:d,onCancel:()=>{d||o(!1)},onConfirm:()=>{b()}})]})}function Pp({source:s}){const{state:n}=G(),[a,i]=l.useState(null),r=a?n.instances.find(c=>c.instanceId===a&&c.snapshot.authenticated!==!0):void 0;return e.jsxs(e.Fragment,{children:[e.jsx(Qi,{label:t("engineSetup.antigravity.addAccount"),endpoint:"/api/instances/antigravity-accounts",extra:{sourceInstanceId:s.instanceId},onAdded:i}),r&&e.jsx("div",{"data-antigravity-added":r.instanceId,children:e.jsx(Vt,{instance:r,unframed:!0})})]})}function Ip({instance:s,bare:n=!1}){const a=s.policy&&e.jsxs("p",{className:"mb-2 text-[12px] leading-relaxed text-ink-secondary",children:[e.jsx("span",{className:"font-medium text-ink",children:t("policy.managedBy",{organization:s.policy.organizationName})})," · ",s.policy.reason]});return s.trialCredit?e.jsx(zt,{instance:s,bare:n,children:e.jsx("p",{"data-trial-credit":s.trialCredit,className:"text-[13px] leading-relaxed text-ink-secondary",children:t(s.trialCredit==="used_up"?"engines.trialCreditUsedUp":s.trialCredit==="ended"?"engines.trialCreditEnded":$e(s)?"engines.trialCredit":"engines.trialCreditOwn")})}):s.readOnly?e.jsxs(zt,{instance:s,bare:n,children:[a,e.jsx("p",{className:"text-[13px] leading-relaxed text-ink-secondary",children:t("organization.managedEngine")}),!$e(s)&&e.jsx("p",{className:"mt-2 text-[12px] text-ink-secondary",children:t("organization.engineUnavailable")})]}):e.jsxs(zt,{instance:s,bare:n,children:[a,!$e(s)&&e.jsx(Vt,{instance:s,intent:s.access==="custom"?"inject":"cloud",description:s.codexEndpoint?t("agentEndpoints.codexHint"):void 0,unframed:!0}),$e(s)&&e.jsx(ao,{instance:s,className:"mt-3"}),$e(s)&&s.serverKind==="ollama"&&e.jsx(io,{instance:s,className:"mt-3"}),$e(s)&&e.jsx(ro,{instance:s,className:"mt-3"}),s.snapshot.update&&e.jsx(si,{update:s.snapshot.update,instance:s,className:"mt-3",quiet:!0}),s.snapshot.warning&&e.jsx(ni,{warning:s.snapshot.warning,className:"mt-3"}),$e(s)&&s.snapshot.authenticated===!0&&(s.authentication?.method==="device-code"?e.jsxs("p",{className:"flex items-center gap-1.5 text-[12px] text-success",children:[e.jsx(ve,{size:13}),t(lo[ti(s.driverKind)].connectedAccount)]}):s.authentication?.method==="paste-code"&&e.jsxs("p",{className:"flex items-center gap-1.5 text-[12px] text-success",children:[e.jsx(ve,{size:13}),t("engineSetup.claude.connectedAccount")]})),s.freeUpSpace&&e.jsx(Ep,{instance:s}),s.driverKind==="antigravityAgent"&&e.jsxs("div",{className:"mt-3 space-y-3",children:[s.snapshot.authenticated&&e.jsx("p",{className:"break-words text-[12px] text-ink-secondary",children:s.snapshot.account?.email??t("engineSetup.antigravity.emailUnavailable")}),e.jsx(Pp,{source:s}),s.snapshot.authenticated===!0&&s.authentication?.signOut===!0&&e.jsx(Xn,{instance:s,action:"signOut"}),s.instanceId.startsWith("antigravity-")&&e.jsx(Xn,{instance:s,action:"remove"})]}),e.jsx(tr,{instance:s})]})}function Rp(s,n){return n?s.snapshot.authenticated===!0&&s.snapshot.account?.email?s.snapshot.account.email:t("onboarding.engines.ready"):s.snapshot.ollama?no(s.snapshot.ollama):s.snapshot.state==="available"&&s.snapshot.authenticated===!1?t("model.signInRequired"):t("onboarding.engines.needsSetup")}function Tp({rows:s,isReady:n,renderEngine:a,more:i}){const[r,c]=l.useState(null),o=s.filter(u=>n(u)||u.authentication!==void 0),d=s.filter(u=>!o.includes(u));return e.jsxs(e.Fragment,{children:[e.jsx(Ce,{label:t("settings.simple.ai.yours"),actions:e.jsx(ii,{}),children:e.jsx(Ee,{children:o.map(u=>{const p=n(u),m=r===u.instanceId;return e.jsxs("div",{"data-simple-engine":u.instanceId,className:"group",children:[e.jsxs("div",{className:"flex min-h-11 flex-wrap items-center gap-x-5 gap-y-2 px-4 py-2.5",children:[e.jsxs("span",{className:"flex min-w-[min(100%,15rem)] flex-1 items-center gap-3",children:[e.jsx(Cn,{instance:u,size:14,subtle:!0}),e.jsxs("span",{className:"flex min-w-0 flex-col gap-0.5",children:[e.jsx("span",{className:"truncate text-[14px] leading-5 text-ink",children:u.displayName}),e.jsx("span",{className:"truncate text-[13px] leading-[18px] text-ink-secondary",children:Rp(u,p)})]})]}),e.jsx("button",{type:"button","aria-expanded":m,className:"ui-button ml-auto shrink-0",onClick:()=>c(m?null:u.instanceId),children:t(m?"common.done":p?"settings.simple.ai.manage":"settings.simple.ai.setUp")})]}),m&&e.jsx("div",{className:"px-4 pb-3",children:a(u,!0)})]},u.instanceId)})})}),d.length>0&&e.jsx(qt,{title:t("settings.simple.ai.more",{count:String(d.length)}),trailing:e.jsx("span",{"aria-hidden":"true",className:"flex items-center -space-x-1",children:d.slice(0,4).map(u=>e.jsx("span",{className:"flex size-[18px] items-center justify-center rounded-full bg-menu",children:e.jsx(Cn,{instance:u,size:14,subtle:!0})},u.instanceId))}),...i,children:e.jsx(ri,{instances:d,isReady:n,renderEngine:u=>a(u)})})]})}function Bp(){const{state:s,refreshInstances:n}=G(),[a,i]=l.useState([]),[r,c]=l.useState(null),[o,d]=l.useState(null);if(l.useEffect(()=>{let p=!0;return F("/api/instances/hidden").then(m=>{p&&i(Array.isArray(m?.instances)?m.instances:[])}).catch(()=>{}),()=>{p=!1}},[s.instances]),a.length===0)return null;const u=p=>{c(p),d(null),F(`/api/instances/${encodeURIComponent(p)}`,{method:"PATCH",body:JSON.stringify({hidden:!1})}).then(()=>Promise.resolve(n()).catch(()=>{})).catch(m=>d(m.message)).finally(()=>c(null))};return e.jsxs("details",{"data-hidden-engines":!0,className:"px-4",children:[e.jsx("summary",{className:"cursor-pointer text-[13px] font-medium text-ink-secondary hover:text-ink",children:t("engines.hiddenTitle",{count:String(a.length)})}),e.jsx("p",{className:"mt-2 text-[12px] text-ink-secondary",children:t("engines.hiddenHint")}),e.jsx("div",{className:"mt-2 flex flex-col gap-1.5",children:a.map(p=>e.jsxs("div",{className:"flex items-center justify-between gap-3 rounded-lg border border-hairline/40 bg-inset px-3 py-2",children:[e.jsx("span",{className:"min-w-0 truncate text-[13px] text-ink",children:p.displayName}),e.jsx("button",{type:"button","data-unhide-engine":p.instanceId,disabled:r!==null,onClick:()=>u(p.instanceId),className:"shrink-0 text-[12px] font-medium text-accent hover:underline disabled:opacity-50",children:r===p.instanceId?t("engines.unhiding"):t("engines.unhide")})]},p.instanceId))}),o&&e.jsx("div",{role:"alert",className:"mt-1 text-[12px] text-danger",children:o})]})}function sr({simple:s=!1,more:n}){const{state:a}=G();l.useEffect(()=>to,[]);const i=a.instances.filter(h=>h.readOnly||h.cli!==void 0||h.cliDefault!==void 0||h.snapshot.state==="unavailable"||so(h)||h.claudeEndpoint!==void 0||h.claudeBedrock!==void 0||h.codexEndpoint!==void 0),r=new Map;for(const h of i){const f=ps(h);f&&r.set(f,[...r.get(f)??[],h])}const c=h=>{const f=ps(h);return f&&r.get(f)?.[0]===h?f:null},o=i.filter(h=>!ps(h)||c(h)),d=o.length>0&&o.every(h=>h.readOnly),u=!r.has("chatgpt")&&!d,p=!r.has("claude")&&!d,m=h=>{const f=c(h);return f?Xi(r.get(f)):$e(h)},x=(h,f=!1)=>{const b=c(h);return b?e.jsx(bp,{group:b,accounts:r.get(b),bare:f,advanced:e.jsxs(e.Fragment,{children:[b==="claude"?e.jsxs(e.Fragment,{children:[e.jsx(ms,{}),e.jsx(hs,{})]}):e.jsx(xs,{}),e.jsx(tr,{instance:h})]})}):e.jsx(Ip,{instance:h,bare:f})};return s&&n?e.jsxs(e.Fragment,{children:[e.jsx(Tp,{rows:o,isReady:m,renderEngine:x,more:n}),p&&e.jsxs("div",{className:"px-4",children:[e.jsx(ms,{}),e.jsx(hs,{})]}),u&&e.jsx("div",{className:"px-4",children:e.jsx(xs,{})})]}):e.jsxs("div",{className:"flex min-w-0 flex-col gap-6 pb-2",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0 flex-1 basis-60 space-y-2 px-4",children:[e.jsx("h1",{className:"text-[22px] font-semibold tracking-tight text-ink",children:t("settings.engines.title")}),e.jsx("p",{className:"mt-2 max-w-lg text-[13px] leading-relaxed text-ink-secondary",children:t("engines.library.intro")})]}),e.jsx(ii,{})]}),e.jsx(ri,{instances:o,isReady:m,renderEngine:x}),p&&e.jsxs("div",{className:"px-4",children:[e.jsx(ms,{}),e.jsx(hs,{})]}),u&&e.jsx("div",{className:"px-4",children:e.jsx(xs,{})}),e.jsx(Bp,{}),e.jsx(er,{})]})}const Lp={status:"/api/local-computer","local-vms":"/api/local-computer/instances",cloud:"/api/computers/boxes",vps:"/api/computers/vps"};function At(s,n){return[Lp[s],{signal:n}]}function sn(s,n){return[s,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(n)}]}function Op({instances:s,configured:n,aliases:a,loading:i,removingName:r,error:c,unavailableReason:o,onRefresh:d,onRemove:u}){return e.jsxs(X,{title:t("vm.vps.title"),subtitle:t("vm.vps.subtitle"),children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsx("div",{className:"text-[12px] text-ink-secondary",children:n===!0?t("vm.vps.sshHost",{alias:a.join(", ")||t("vm.vps.configuredFallback")}):n===!1?e.jsxs(e.Fragment,{children:[t("vm.vps.needsAlias")," ",e.jsx(li,{id:"vps"})]}):t("vm.vps.refreshHint")}),e.jsxs("button",{type:"button",onClick:d,disabled:i||r!==null,"aria-label":t("vm.vps.refreshAria"),className:"flex shrink-0 items-center gap-1.5 rounded-lg border border-hairline/40 px-2.5 py-1.5 text-[12px] text-ink-secondary hover:bg-control hover:text-ink disabled:opacity-40",children:[e.jsx(De,{size:12,className:O(i&&"animate-spin")})," ",t("vm.refresh")]})]}),c&&e.jsx("div",{role:"alert",className:"mt-3 rounded-lg bg-danger/10 px-3 py-2 text-[12px] text-danger",children:c}),e.jsx("p",{role:"status","aria-live":"polite","aria-atomic":"true",className:"sr-only",children:i?t("vm.vps.checking"):o?t("vm.vps.unavailable",{reason:o}):n===!1?t("vm.vps.notConfigured"):s.length===1?t("vm.vps.foundOne"):t("vm.vps.foundMany",{count:s.length})}),!(n===!1&&!i&&!o)&&e.jsxs("div",{"aria-busy":i||r!==null,className:"mt-3 overflow-hidden rounded-xl border border-hairline/40",children:[o&&s.length>0&&e.jsxs("div",{className:"flex items-center gap-2 border-b border-hairline/35 px-3 py-2.5 text-[12px] text-ink-secondary",children:[e.jsx(Ge,{size:14,className:"shrink-0 text-warning"})," ",o]}),i&&s.length===0?e.jsxs("div",{className:"flex items-center gap-2 px-3 py-4 text-[13px] text-ink-secondary",children:[e.jsx(q,{size:13,className:"animate-spin"})," ",t("vm.vps.checkingList")]}):o&&s.length===0?e.jsxs("div",{className:"flex items-center gap-2 px-3 py-4 text-[13px] text-ink-secondary",children:[e.jsx(Ge,{size:14,className:"shrink-0 text-warning"})," ",o]}):n===!1?e.jsxs("div",{className:"flex items-center gap-2 px-3 py-4 text-[13px] text-ink-secondary",children:[e.jsx(ud,{size:14,className:"shrink-0"})," ",t("vm.vps.notConfigured")]}):s.length===0?e.jsx("div",{className:"px-3 py-4 text-[13px] text-ink-secondary",children:t("vm.vps.noneFound")}):s.map((p,m)=>{const x=Wp(p),h=nn(x),f=r===p.name,b=an(p.name);return e.jsxs("div",{className:O("flex items-start justify-between gap-3 px-3 py-3",m>0&&"border-t border-hairline/35"),children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:"truncate text-[14px] font-medium text-ink",children:p.orphaned?t("vm.vps.orphan",{id:b}):p.ownerName}),e.jsx("span",{className:O("rounded-full px-2 py-0.5 text-[11px]",p.inUse||x==="running"?"bg-success/15 text-success":x==="stopped"||x==="paused"?"bg-control text-ink-secondary":"bg-warning/15 text-warning"),children:h}),a.length>1&&e.jsx("span",{className:"rounded-full bg-control px-2 py-0.5 font-mono text-[11px] text-ink-secondary",children:p.vpsAlias})]}),e.jsx("div",{className:"mt-1 text-[12px] text-ink-secondary",children:p.orphaned?t("vm.owner.gone"):t("vm.owner.owned")}),p.inUse&&e.jsx("div",{className:"mt-1 text-[12px] text-ink-secondary",children:t("vm.vps.stopFirst")})]}),e.jsxs("button",{type:"button",onClick:()=>u(p),disabled:i||p.inUse||r!==null,"aria-busy":f||void 0,title:t("vm.vps.removeTitle"),className:"flex shrink-0 items-center gap-1.5 rounded-lg bg-danger/10 px-2.5 py-1.5 text-[12px] font-medium text-danger hover:bg-danger/15 disabled:cursor-not-allowed disabled:opacity-40",children:[f?e.jsx(q,{size:12,className:"animate-spin"}):e.jsx(Le,{size:12}),t("vm.vps.remove")]})]},`${p.vpsAlias??""}:${p.name}`)})]})]})}const zp=[1e3,2e3,4e3];function Mp(s){return new Promise(n=>window.setTimeout(n,s))}const Fp={auto:"vm.dest.auto",cloud:"place.cloud",vm:"vm.dest.vm",local:"vm.dest.local",browser:"vm.dest.browser",off:"vm.dest.off"},Dp={unmanaged:"vm.state.notManaged","in-use":"vm.state.inUse",stopped:"vm.state.stopped",running:"vm.state.running",attention:"vm.state.attention",sleeping:"vm.state.sleeping","going-to-sleep":"vm.state.goingToSleep",starting:"vm.state.starting",restarting:"vm.state.restarting",removing:"vm.state.removing",paused:"vm.state.paused"};function nn(s){return t(Dp[s])}function Up(s){return s.managed?s.inUse?"in-use":s.container==="stopped"?"stopped":s.ready?"running":"attention":"unmanaged"}function _p(s){return nn(Up(s))}function $p(s){return s.inUse?"in-use":s.state==="removing"?"removing":s.state==="archived"?"sleeping":s.state==="archiving"?"going-to-sleep":["idle","ready","running"].includes(s.state)?"running":["init","provisioning","provisioned","cloning"].includes(s.state)?"starting":"attention"}function nr(s,n,a){const i={...a},r=new Set(s.map(o=>o.boxId)),c=s.flatMap(o=>{const d=a[o.boxId];return d==="deleted"?[]:d==="deleting"?[{...o,state:"removing"}]:d!=="sleeping"?[o]:o.state==="archived"?(delete i[o.boxId],[o]):[{...o,state:"archived"}]});for(const o of n)a[o.boxId]!=="sleeping"||r.has(o.boxId)||c.push({...o,state:"archived"});for(const[o,d]of Object.entries(a))(d==="deleted"||d==="deleting")&&!r.has(o)&&delete i[o];return{instances:c,overrides:i}}function Kp(s,n,a){return s.configured!==!0||s.available!==!0?{instances:n,overrides:{...a}}:nr(Array.isArray(s.instances)?s.instances:[],n,a)}function Hp(s){return["idle","ready","running"].includes(s.state)}function Wp(s){return s.inUse?"in-use":s.state==="running"?"running":s.state==="restarting"?"restarting":s.state==="removing"?"removing":["created","exited"].includes(s.state)?"stopped":s.state==="paused"?"paused":"attention"}function an(s){const n=/-([a-f0-9]{12})$/i.exec(s)?.[1];return n?n.slice(-8).toLowerCase():"unknown"}function Gp(s){return{confirmation:t("vm.confirm.deleteBotVm",{name:s.name}),request:sn(`/api/bots/${s.botId}/local-computer/remove`,{})}}function Vp(s,n){return{confirmation:s==="delete"?t("vm.confirm.deleteCloud",{subject:n.orphaned?t("vm.confirm.orphanCloud"):t("vm.confirm.ownedCloud",{name:n.ownerName??""})}):null,request:sn(`/api/computers/boxes/${encodeURIComponent(n.boxId)}/${s}`,s==="delete"?{confirmName:n.name}:{})}}function qp(s){const n=an(s.name);return{confirmation:t("vm.confirm.removeVps",{subject:s.orphaned?t("vm.confirm.orphanVps",{id:n}):t("vm.confirm.ownedVps",{name:s.ownerName??""})}),request:sn(`/api/computers/vps/${encodeURIComponent(s.name)}/remove`,{confirmName:s.name,alias:s.vpsAlias})}}function fs(s,n){return s.confirmation!==null&&!n(s.confirmation)?null:s.request}function Jp({instances:s,configured:n,loading:a,pending:i,error:r,unavailableReason:c,onRefresh:o,onSleep:d,onDelete:u}){return e.jsxs(X,{title:t("vm.cloud.title"),subtitle:t("vm.cloud.subtitle"),children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsx("div",{className:"text-[12px] text-ink-secondary",children:n===!0?t("vm.cloud.includesOrphans"):n===!1?e.jsxs(e.Fragment,{children:[t("vm.cloud.needsKey")," ",e.jsx(li,{id:"box"})]}):t("vm.cloud.refreshHint")}),e.jsxs("button",{type:"button",onClick:o,disabled:a||i!==null,"aria-label":t("vm.cloud.refreshAria"),className:"flex shrink-0 items-center gap-1.5 rounded-lg border border-hairline/40 px-2.5 py-1.5 text-[12px] text-ink-secondary hover:bg-control hover:text-ink disabled:opacity-40",children:[e.jsx(De,{size:12,className:O(a&&"animate-spin")})," ",t("vm.refresh")]})]}),r&&e.jsx("div",{role:"alert",className:"mt-3 rounded-lg bg-danger/10 px-3 py-2 text-[12px] text-danger",children:r}),e.jsx("p",{role:"status","aria-live":"polite","aria-atomic":"true",className:"sr-only",children:a?t("vm.cloud.checking"):c?t("vm.cloud.unavailable",{reason:c}):n===!1?t("vm.cloud.notConnected"):s.length===1?t("vm.cloud.foundOne"):t("vm.cloud.foundMany",{count:s.length})}),!(n===!1&&!a&&!c)&&e.jsx("div",{"aria-busy":a||i!==null,className:"mt-3 overflow-hidden rounded-xl border border-hairline/40",children:a&&s.length===0?e.jsxs("div",{className:"flex items-center gap-2 px-3 py-4 text-[13px] text-ink-secondary",children:[e.jsx(q,{size:13,className:"animate-spin"})," ",t("vm.cloud.checkingList")]}):c?e.jsxs("div",{className:"flex items-center gap-2 px-3 py-4 text-[13px] text-ink-secondary",children:[e.jsx(Ge,{size:14,className:"shrink-0 text-warning"})," ",c]}):n===!1?e.jsxs("div",{className:"flex items-center gap-2 px-3 py-4 text-[13px] text-ink-secondary",children:[e.jsx(Ds,{size:14,className:"shrink-0"})," ",t("vm.cloud.notConnected")]}):s.length===0?e.jsx("div",{className:"px-3 py-4 text-[13px] text-ink-secondary",children:t("vm.cloud.noneFound")}):s.map((p,m)=>{const x=$p(p),h=nn(x),f=i?.boxId===p.boxId,b=Hp(p),y=x==="removing";return e.jsxs("div",{className:O("flex items-start justify-between gap-3 px-3 py-3",m>0&&"border-t border-hairline/35"),children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:"truncate text-[14px] font-medium text-ink",children:p.orphaned?t("vm.cloud.orphan"):p.ownerName}),e.jsx("span",{className:O("rounded-full px-2 py-0.5 text-[11px]",p.inUse||x==="running"?"bg-success/15 text-success":x==="sleeping"||x==="going-to-sleep"?"bg-control text-ink-secondary":"bg-warning/15 text-warning"),children:h})]}),e.jsxs("div",{className:"mt-1 break-all text-[12px] text-ink-secondary",children:[p.orphaned?t("vm.owner.gone"):t("vm.owner.owned")," · ",p.name]}),p.inUse&&e.jsx("div",{className:"mt-1 text-[12px] text-ink-secondary",children:t("vm.cloud.stopFirst")})]}),e.jsxs("div",{className:"flex shrink-0 items-center gap-1.5",children:[e.jsxs("button",{type:"button",onClick:()=>d(p),disabled:a||p.inUse||i!==null||!b,"aria-busy":f&&i?.action==="sleep"?!0:void 0,title:b?t("vm.cloud.sleepTitle"):t("vm.cloud.sleepBlocked",{state:h.toLowerCase()}),className:"flex items-center gap-1.5 rounded-lg border border-hairline/40 px-2.5 py-1.5 text-[12px] text-ink-secondary hover:bg-control hover:text-ink disabled:cursor-not-allowed disabled:opacity-40",children:[f&&i?.action==="sleep"?e.jsx(q,{size:12,className:"animate-spin"}):e.jsx(pd,{size:12}),t("vm.cloud.sleep")]}),e.jsxs("button",{type:"button",onClick:()=>u(p),disabled:a||p.inUse||i!==null||y,"aria-busy":f&&i?.action==="delete"?!0:void 0,title:t("vm.cloud.deleteTitle"),className:"flex items-center gap-1.5 rounded-lg bg-danger/10 px-2.5 py-1.5 text-[12px] font-medium text-danger hover:bg-danger/15 disabled:cursor-not-allowed disabled:opacity-40",children:[f&&i?.action==="delete"?e.jsx(q,{size:12,className:"animate-spin"}):e.jsx(Le,{size:12}),t("common.delete")]})]})]},p.boxId)})})]})}function Yp({instances:s,maxInstances:n,loading:a,deletingBotId:i,error:r,unavailableReason:c,onRefresh:o,onDelete:d}){return e.jsxs(X,{title:t("vm.perBot.title"),subtitle:t("vm.perBot.subtitle",{count:c?t("vm.perBot.inventoryUnavailable"):t("vm.perBot.created",{count:s.length,max:n})}),children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsx("div",{className:"text-[12px] text-ink-secondary",children:t("vm.perBot.deleteHint")}),e.jsxs("button",{type:"button",onClick:o,disabled:a||i!==null,"aria-label":t("vm.perBot.refreshAria"),className:"flex shrink-0 items-center gap-1.5 rounded-lg border border-hairline/40 px-2.5 py-1.5 text-[12px] text-ink-secondary hover:bg-control hover:text-ink disabled:opacity-40",children:[e.jsx(De,{size:12,className:O(a&&"animate-spin")})," ",t("vm.refresh")]})]}),r&&e.jsx("div",{role:"alert",className:"mt-3 rounded-lg bg-danger/10 px-3 py-2 text-[12px] text-danger",children:r}),e.jsx("p",{role:"status","aria-live":"polite","aria-atomic":"true",className:"sr-only",children:a?t("vm.perBot.checking"):c?t("vm.perBot.unavailable",{reason:c}):s.length===1?t("vm.perBot.foundOne"):t("vm.perBot.foundMany",{count:s.length})}),e.jsx("div",{"aria-busy":a||i!==null,className:"mt-3 overflow-hidden rounded-xl border border-hairline/40",children:a&&s.length===0?e.jsxs("div",{className:"flex items-center gap-2 px-3 py-4 text-[13px] text-ink-secondary",children:[e.jsx(q,{size:13,className:"animate-spin"})," ",t("vm.perBot.checkingList")]}):c?e.jsxs("div",{className:"flex items-center gap-2 px-3 py-4 text-[13px] text-ink-secondary",children:[e.jsx(Ge,{size:14,className:"shrink-0 text-warning"})," ",c]}):s.length===0?e.jsx("div",{className:"px-3 py-4 text-[13px] text-ink-secondary",children:t("vm.perBot.none")}):s.map((u,p)=>{const m=_p(u),x=i===u.botId,h=u.managed===!0;return e.jsxs("div",{className:O("flex items-start justify-between gap-3 px-3 py-3",p>0&&"border-t border-hairline/35"),children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx("span",{className:"truncate text-[14px] font-medium text-ink",children:u.name}),e.jsx("span",{className:O("rounded-full px-2 py-0.5 text-[11px]",h?u.inUse||u.ready?"bg-success/15 text-success":u.container==="stopped"?"bg-control text-ink-secondary":"bg-warning/15 text-warning":"bg-warning/15 text-warning"),children:m})]}),e.jsx("div",{className:"mt-1 text-[12px] text-ink-secondary",children:t("vm.perBot.destination",{destination:t(Fp[u.destination])})}),!h&&e.jsx("div",{className:"mt-1 text-[12px] text-warning",children:t("vm.perBot.unmanaged")}),h&&u.problem&&!u.inUse&&e.jsx("div",{className:"mt-1 text-[12px] text-warning",children:Ei(u.problem)}),h&&u.inUse&&e.jsx("div",{className:"mt-1 text-[12px] text-ink-secondary",children:t("vm.perBot.stopFirst")})]}),h&&e.jsxs("button",{type:"button",onClick:()=>d(u),disabled:a||u.inUse||i!==null,"aria-busy":x||void 0,title:u.inUse?t("vm.perBot.deleteBlocked"):t("vm.perBot.deleteTitle",{name:u.name}),className:"flex shrink-0 items-center gap-1.5 rounded-lg bg-danger/10 px-2.5 py-1.5 text-[12px] font-medium text-danger hover:bg-danger/15 disabled:cursor-not-allowed disabled:opacity-40",children:[x?e.jsx(q,{size:12,className:"animate-spin"}):e.jsx(Le,{size:12}),t("common.delete")]})]},u.botId)})})]})}function Pt({n:s,title:n,done:a,children:i}){return e.jsxs("div",{className:"flex gap-3",children:[e.jsx("div",{className:O("mt-0.5 flex size-5 shrink-0 items-center justify-center rounded-full text-[11px]",a?"bg-success/20 text-success":"border border-hairline/50 text-ink-secondary"),children:a?e.jsx(ve,{size:12}):s}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:O("text-[14px]",a?"text-ink-secondary line-through":"text-ink"),children:n}),!a&&i&&e.jsx("div",{className:"mt-2 flex flex-col items-start gap-2 [&>*]:max-w-full",children:i})]})]})}function rt({action:s,pending:n,children:a,onClick:i,danger:r=!1}){return e.jsxs("button",{onClick:i,"aria-busy":n===s,disabled:n!==null,className:O("flex items-center gap-1.5 rounded-lg px-3 py-1.5 text-[13px] font-medium disabled:opacity-50",r?"bg-danger/15 text-danger hover:bg-danger/20":"bg-accent text-white hover:brightness-110"),children:[n===s&&e.jsx(q,{size:13,className:"animate-spin"}),a]})}const ar=5,ir=1440,Xp=480;function Qp(s){const n=s.trim();if(!/^\d+$/.test(n))return null;const a=Number(n);return a>=ar&&a<=ir?a:null}function Zp({minutes:s,disabled:n,onSave:a}){const[i,r]=l.useState(String(s)),[c,o]=l.useState(!1),[d,u]=l.useState(""),[p,m]=l.useState(!1);l.useEffect(()=>{c||r(String(s))},[s,c]);const x=async()=>{if(!c||p)return;const h=Qp(i);if(h===null){u(t("vm.idle.range"));return}m(!0);try{await a(h),r(String(h)),o(!1),u("")}catch(f){u(f instanceof Error?f.message:t("vm.idle.error"))}finally{m(!1)}};return e.jsxs("div",{className:"mt-3",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"local-vm-idle-timeout",className:"text-[13px] text-ink",children:t("vm.idle.label")}),e.jsx("div",{id:"local-vm-idle-timeout-help",className:"text-[12px] text-ink-secondary",children:t("vm.idle.detail")})]}),e.jsxs("div",{className:O("flex w-[150px] shrink-0 items-center rounded-lg border bg-control",d?"border-danger/60":"border-hairline/40 focus-within:border-focus"),children:[e.jsx("input",{id:"local-vm-idle-timeout",type:"number",min:ar,max:ir,step:1,inputMode:"numeric",value:i,disabled:n||p,"aria-invalid":!!d,"aria-describedby":d?"local-vm-idle-timeout-error local-vm-idle-timeout-help":"local-vm-idle-timeout-help",onChange:h=>{r(h.target.value),o(!0),u("")},onBlur:()=>{x()},onKeyDown:h=>{h.key==="Enter"&&h.currentTarget.blur()},className:"min-w-0 flex-1 bg-transparent px-2.5 py-1.5 text-[13px] tabular-nums text-ink focus:outline-none disabled:opacity-50"}),e.jsx("span",{className:"pr-2.5 text-[13px] text-ink-secondary",children:t("vm.idle.minutes")})]})]}),d?e.jsx("p",{id:"local-vm-idle-timeout-error",role:"alert",className:"mt-1.5 text-[12px] text-danger",children:d}):null]})}function rr(){const s=G().state.config?.cloudHome===!0,[n,a]=l.useState(null),[i,r]=l.useState(!0),[c,o]=l.useState(null),d=l.useRef(null);l.useEffect(()=>()=>d.current?.abort(),[]);const[u,p]=l.useState(null),[m,x]=l.useState(!1),[h,f]=l.useState(0),[b,y]=l.useState([]),[g,v]=l.useState(2),[C,w]=l.useState(!1),[N,I]=l.useState(null),[j,L]=l.useState(null),[k,P]=l.useState(null),[S,M]=l.useState(0),[se,ne]=l.useState([]),[V,ie]=l.useState(null),[re,oe]=l.useState(!0),[T,R]=l.useState(null),[E,D]=l.useState(null),[Q,le]=l.useState(null),[ae,U]=l.useState(0),te=l.useRef([]),me=l.useRef({}),[ce,xe]=l.useState([]),[de,je]=l.useState(null),[_,pe]=l.useState([]),[B,A]=l.useState(!0),[H,he]=l.useState(null),[W,Ne]=l.useState(null),[ze,qe]=l.useState(null),[$,ee]=l.useState(0),[Z,ue]=l.useState(""),be=l.useCallback(async z=>{const K=await fetch(...At("status",z)),J=await K.json().catch(()=>({}));if(!z?.aborted){if(!K.ok)throw new Error(J.error??t("vm.err.status",{code:K.status}));return a(J),p(null),J}},[]),Pe=l.useCallback(async z=>{const K=await fetch(...At("local-vms",z)),J=await K.json().catch(()=>({}));if(!K.ok)throw new Error(J.error??t("vm.err.inventory",{code:K.status}));const Y=J;y(Y.instances),v(Y.maxInstances),L(Y.available?null:Ei(Y.problem)??t("vm.err.runtimeUnavailable")),I(null)},[]),Je=l.useCallback(async z=>{const K=await fetch(...At("cloud",z)),J=await K.json().catch(()=>({}));if(!K.ok)throw new Error(J.error??t("vm.err.cloudInventory",{code:K.status}));const Y=J,we=Kp(Y,te.current,me.current);me.current=we.overrides,te.current=we.instances,ne(we.instances),ie(Y.configured===!0),D(Y.available||!Y.configured?null:Y.problem??t("vm.err.cloudUnavailable")),R(null)},[]),Ye=l.useCallback(async z=>{const K=await fetch(...At("vps",z)),J=await K.json().catch(()=>({}));if(!K.ok)throw new Error(J.error??t("vm.err.vpsInventory",{code:K.status}));const Y=J;xe(Array.isArray(Y.instances)?Y.instances:[]),je(Y.configured===!0),pe(Array.isArray(Y.vpsAliases)?Y.vpsAliases:[]),Ne(Y.available||!Y.configured?null:Y.problem??t("vm.err.vpsUnavailable")),he(null)},[]);l.useEffect(()=>{if(s)return;let z=!0,K,J;const Y=async()=>{J=new AbortController;try{await be(J.signal)}catch(we){z&&!(we instanceof DOMException&&we.name==="AbortError")&&(a(null),p(we instanceof Error?we.message:String(we)))}finally{z&&(r(!1),K=window.setTimeout(()=>{Y()},5e3))}};return Y(),()=>{z=!1,J?.abort(),K!==void 0&&window.clearTimeout(K)}},[s,be,h]),l.useEffect(()=>{if(n?.mode!=="per-bot"){y([]),w(!1),I(null),L(null);return}const z=new AbortController;return w(!0),Pe(z.signal).catch(K=>{K instanceof DOMException&&K.name==="AbortError"||I(K instanceof Error?K.message:String(K))}).finally(()=>{z.signal.aborted||w(!1)}),()=>z.abort()},[S,Pe,n?.mode]),l.useEffect(()=>{const z=new AbortController;return oe(!0),Je(z.signal).catch(K=>{K instanceof DOMException&&K.name==="AbortError"||D(K instanceof Error?K.message:String(K))}).finally(()=>{z.signal.aborted||oe(!1)}),()=>z.abort()},[ae,Je]),l.useEffect(()=>{const z=new AbortController;return A(!0),Ye(z.signal).catch(K=>{K instanceof DOMException&&K.name==="AbortError"||Ne(K instanceof Error?K.message:String(K))}).finally(()=>{z.signal.aborted||A(!1)}),()=>z.abort()},[Ye,$]);const ke=async(z,K)=>{const J=await fetch(`/api/local-computer/${z}`,{method:"POST",headers:{"content-type":"application/json"},body:"{}",signal:K}),Y=await J.json().catch(()=>({})),we={pull:"vm.err.prepare",run:"vm.err.create",start:"vm.err.start",stop:"vm.err.stop",remove:"vm.deleteError"};if(!J.ok)throw new Error(Y.error??t(we[z]));return K.throwIfAborted(),a(Y),Y},pt=z=>window.ogb?.confirm?window.ogb.confirm(z):window.confirm(z),Ue=async z=>{if(c!==null||d.current)return;const K=new AbortController;d.current=K,o(z),p(null);try{if(z==="remove"&&!await pt(t("vm.confirm.deleteShared"))||z==="recreate"&&!await pt(t("vm.confirm.recreate")))return;let J;if(z==="recreate"?(await ke("remove",K.signal),J=await ke("run",K.signal)):J=await ke(z,K.signal),(z==="run"||z==="start"||z==="recreate")&&(J=await Pd(J,async()=>await be(K.signal)??J,K.signal),!J.ready))throw new Error(J.problem??t("vm.err.start"));await be(),ue(z==="remove"?t("vm.announce.deleted"):z==="stop"?t("vm.announce.stopped"):t("vm.announce.updated"))}catch(J){if(K.signal.aborted)return;p(J instanceof Error?J.message:String(J))}finally{d.current=null,K.signal.aborted||o(null)}},Xe=async(z,K)=>{x(!0),p(null);try{const J=await fetch("/api/config",{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({localVm:{mode:z,maxInstances:K}})}),Y=await J.json().catch(()=>({}));if(!J.ok)throw new Error(Y.error??t("vm.policyError"));a(we=>we&&{...we,mode:z,max_instances:K}),await be()}catch(J){p(J instanceof Error?J.message:String(J))}finally{x(!1)}},wt=async z=>{const K=await fetch("/api/config",{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({localVm:{idleTimeoutMinutes:z}})}),J=await K.json().catch(()=>({}));if(!K.ok)throw new Error(J.error??t("vm.idle.error"));a(Y=>Y&&{...Y,idle_timeout_ms:z*6e4})},nt=async z=>{if(!z.managed){I(t("vm.unmanagedError"));return}const K=fs(Gp(z),J=>window.confirm(J));if(K){P(z.botId),I(null);try{const J=await fetch(...K),Y=await J.json().catch(()=>({}));if(!J.ok)throw new Error(Y.error??t("vm.deleteError"));await Pe(),ue(t("vm.announce.deletedBot",{name:z.name}))}catch(J){I(J instanceof Error?J.message:String(J))}finally{P(null)}}},Re=async(z,K)=>{const J=fs(Vp(z,K),Y=>window.confirm(Y));if(J){le({boxId:K.boxId,action:z}),R(null),ue("");try{const Y=await fetch(...J),we=await Y.json().catch(()=>({}));if(!Y.ok)throw new Error(we.error??t(z==="delete"?"vm.cloud.deleteError":"vm.cloud.sleepError"));const ns=z==="delete"&&we?.pending===!0;me.current={...me.current,[K.boxId]:z==="delete"?ns?"deleting":"deleted":"sleeping"};const as=nr(te.current,te.current,me.current);me.current=as.overrides,te.current=as.instances,ne(as.instances);const at=K.orphaned?t("vm.announce.orphanCloud"):t("vm.confirm.ownedCloud",{name:K.ownerName??""});if(ue(ns?`${at}: ${t("vm.state.removing")}.`:t(z==="delete"?"vm.announce.cloudDeleted":"vm.announce.cloudSleeping",{subject:at})),ns){for(const Me of zp){await Mp(Me);try{await Je()}catch{}if(me.current[K.boxId]!=="deleting"){ue(t("vm.announce.cloudDeleted",{subject:at}));return}}const it={...me.current};delete it[K.boxId],me.current=it;const Ct=te.current.map(Me=>Me.boxId===K.boxId?{...Me,state:K.state}:Me);te.current=Ct,ne(Ct);try{await Je(),te.current.some(Me=>Me.boxId===K.boxId)||ue(t("vm.announce.cloudDeleted",{subject:at}))}catch(Me){const al=Me instanceof Error?Me.message:String(Me);R(`${at}: ${t("vm.state.removing")}. ${al}`)}return}try{await Je()}catch(it){const Ct=it instanceof Error?it.message:String(it);R(t(z==="delete"?"vm.cloud.deletedRefreshError":"vm.cloud.sleepRefreshError",{subject:at,detail:Ct}))}}catch(Y){R(Y instanceof Error?Y.message:String(Y))}finally{le(null)}}},St=async z=>{const K=an(z.name),J=fs(qp(z),Y=>window.confirm(Y));if(J){qe(z.name),he(null);try{const Y=await fetch(...J),we=await Y.json().catch(()=>({}));if(!Y.ok)throw new Error(we.error??t("vm.vpsRemoveError"));await Ye(),ue(t("vm.announce.vpsRemoved",{subject:z.orphaned?t("vm.announce.orphanVps",{id:K}):t("vm.confirm.ownedVps",{name:z.ownerName??""})}))}catch(Y){he(Y instanceof Error?Y.message:String(Y))}finally{qe(null)}}},Ie=n?.commands,Qe=n?.ready===!0,_e=n?.container!=="missing",mn=!!(_e&&(!n?.imageMatches||!n?.managed||n?.network==="unsafe"||n?.security==="unsafe"||n?.persistence==="unsafe")),xn=!i&&!n,hn=n?.platform==="darwin"?t("vm.host.mac"):t("vm.host.computer"),Te=n?.mode==="per-bot",ts=Te&&n?.runtime==="container",ss=Te?!!(n?.daemonUp&&n?.image&&!ts):Qe;return e.jsxs(e.Fragment,{children:[e.jsx("p",{role:"status","aria-live":"polite","aria-atomic":"true",className:"sr-only",children:Z}),e.jsx(Jp,{instances:se,configured:V,loading:re,pending:Q,error:T,unavailableReason:E,onRefresh:()=>U(z=>z+1),onSleep:z=>{Re("sleep",z)},onDelete:z=>{Re("delete",z)}}),e.jsx(Op,{instances:ce,configured:de,aliases:_,loading:B,removingName:ze,error:H,unavailableReason:W,onRefresh:()=>ee(z=>z+1),onRemove:z=>{St(z)}}),e.jsx(Ad,{}),!s&&e.jsxs(e.Fragment,{children:[e.jsxs(X,{title:t("vm.main.title"),subtitle:Te?t("vm.main.perBotSubtitle",{host:hn}):t("vm.main.sharedSubtitle",{host:hn}),children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsxs("span",{"aria-live":"polite",className:O("flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[13px]",ss?"bg-success/15 text-success":"bg-control text-ink-secondary"),children:[i?e.jsx(q,{size:12,className:"animate-spin"}):ss?e.jsx(ve,{size:12}):e.jsx(oo,{size:9}),i?t("common.checking"):xn?t("vm.main.statusUnavailable"):Te&&ss?t("vm.main.readyPerBot"):ts?t("vm.main.perBotUnsupported"):Qe?t("vm.main.ready"):n?.problem??t("vm.main.notReady")]}),e.jsxs("button",{onClick:()=>{r(!0),f(z=>z+1),M(z=>z+1)},disabled:i||c!==null,className:"flex items-center gap-1.5 rounded-lg border border-hairline/40 px-2.5 py-1 text-[13px] text-ink-secondary hover:bg-control hover:text-ink disabled:opacity-40",children:[e.jsx(De,{size:12})," ",t("vm.main.recheck")]}),Qe&&!Te&&e.jsxs("a",{href:n?.viewer_url??Ie?.view,target:"_blank",rel:"noreferrer",className:"flex items-center gap-1.5 rounded-lg border border-hairline/40 px-2.5 py-1 text-[13px] text-ink hover:bg-control",children:[e.jsx(Nt,{size:12})," ",t("vm.main.watch")]})]}),u&&e.jsx("div",{role:"alert",className:"mt-3 rounded-lg bg-danger/10 px-3 py-2 text-[12px] text-danger",children:u})]}),e.jsxs(X,{title:t("vm.isolation.title"),subtitle:t("vm.isolation.subtitle"),children:[e.jsx("div",{className:"flex overflow-hidden rounded-lg border border-hairline/40",children:["shared","per-bot"].map((z,K)=>e.jsx("button",{type:"button",disabled:!n||m,onClick:()=>{Xe(z,n?.max_instances??2)},className:O("flex-1 px-3 py-2 text-[13px] disabled:opacity-50",K>0&&"border-l border-hairline/40",n?.mode===z?"bg-control text-ink":"text-ink-secondary hover:text-ink"),children:z==="shared"?t("vm.isolation.shared"):t("vm.isolation.perBot")},z))}),Te&&e.jsxs("div",{className:"mt-3 flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-[13px] text-ink",children:t("vm.isolation.max")}),e.jsx("div",{className:"text-[12px] text-ink-secondary",children:t("vm.isolation.maxDetail")})]}),e.jsx(ye,{size:"sm","aria-label":t("vm.isolation.maxAria"),value:n?.max_instances??2,disabled:!n||m,onChange:z=>{Xe(n?.mode??"shared",Number(z.target.value))},children:[1,2,3,4,5,6,7,8].map(z=>e.jsx("option",{value:z,children:z},z))})]}),e.jsx(Zp,{minutes:n?Math.round(n.idle_timeout_ms/6e4):Xp,disabled:!n||m,onSave:wt}),m&&e.jsxs("div",{className:"mt-2 flex items-center gap-1.5 text-[12px] text-ink-secondary",children:[e.jsx(q,{size:12,className:"animate-spin"})," ",t("vm.saving")]})]}),e.jsx(X,{title:t("vm.setup.title"),subtitle:t("vm.setup.subtitle"),children:e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs(Pt,{n:1,title:t("vm.setup.step1"),done:!!n?.runtime,children:[e.jsx("div",{className:"text-[13px] leading-relaxed text-ink-secondary",children:t("vm.setup.step1Detail")}),Ie?.install?e.jsx(gt,{command:Ie.install}):e.jsx("a",{href:"https://podman.io/docs/installation",target:"_blank",rel:"noreferrer",className:"text-[13px] text-accent hover:underline",children:t("vm.setup.podmanGuide")})]}),e.jsx(Pt,{n:2,title:n?.runtime&&!n.daemonUp?t("vm.setup.step2Open",{runtime:n.runtime}):t("vm.setup.step2"),done:!!n?.daemonUp,children:n?.runtime?Ie?.runtimeStart?e.jsx(gt,{command:Ie.runtimeStart}):e.jsx("div",{className:"text-[13px] text-ink-secondary",children:t("vm.setup.step2Detail")}):null}),e.jsxs(Pt,{n:3,title:t("vm.setup.step3"),done:!!n?.image,children:[n?.daemonUp&&e.jsx(rt,{action:"pull",pending:c,onClick:()=>{Ue("pull")},children:t("vm.setup.prepare")}),Ie?.pull&&e.jsxs("details",{className:"text-[12px] text-ink-secondary",children:[e.jsx("summary",{className:"cursor-pointer",children:t("vm.setup.showPull")}),e.jsx("div",{className:"mt-2",children:e.jsx(gt,{command:Ie.pull})})]})]}),e.jsxs(Pt,{n:4,title:Te?t("vm.setup.step4PerBot"):mn?t("vm.setup.step4Recreate"):t("vm.setup.step4"),done:!Te&&Qe,children:[Te?e.jsx("div",{className:"text-[13px] leading-relaxed text-ink-secondary",children:ts?t("vm.setup.applePort"):t("vm.setup.perBotHint")}):mn?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex gap-2 text-[13px] text-warning",children:[e.jsx(Ge,{size:15,className:"mt-0.5 shrink-0"}),e.jsx("span",{children:n?.problem})]}),n?.image?e.jsxs(rt,{action:"recreate",pending:c,onClick:()=>{Ue("recreate")},danger:!0,children:[e.jsx(co,{size:13})," ",t("vm.setup.recreate")]}):e.jsx("div",{className:"text-[13px] text-ink-secondary",children:t("vm.setup.prepareFirst")})]}):n?.container==="stopped"?e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"text-[13px] text-ink-secondary",children:t(n.stop_reason==="idle"?"vm.stopped.idle":"vm.stopped.detail")}),e.jsx(rt,{action:"start",pending:c,onClick:()=>{Ue("start")},children:t("vm.setup.start")})]}):n?.container==="running"?e.jsxs("div",{className:"flex items-center gap-2 text-[13px] text-ink-secondary",children:[e.jsx(q,{size:13,className:"animate-spin"})," ",t("vm.setup.waiting")]}):n?.image?e.jsxs(e.Fragment,{children:[e.jsx(rt,{action:"run",pending:c,onClick:()=>{Ue("run")},children:t("vm.setup.start")}),e.jsx("p",{className:"text-[13px] leading-relaxed text-ink-secondary",children:t("vm.setup.idleHint")})]}):null,Ie?.run&&e.jsxs("details",{className:"text-[12px] text-ink-secondary",children:[e.jsx("summary",{className:"cursor-pointer",children:t("vm.setup.showCommand")}),e.jsx("div",{className:"mt-2",children:e.jsx(gt,{command:Ie.run})})]})]})]})}),Te&&e.jsx(Yp,{instances:b,maxInstances:g||n?.max_instances||2,loading:C,deletingBotId:k,error:N,unavailableReason:j,onRefresh:()=>M(z=>z+1),onDelete:z=>{nt(z)}}),xn&&e.jsx(X,{children:e.jsxs("div",{className:"flex gap-2 text-[13px] text-ink-secondary",children:[e.jsx(Ge,{size:15,className:"mt-0.5 shrink-0 text-warning"}),e.jsx("span",{children:t("vm.inspectFailed")})]})}),e.jsxs(X,{title:t("vm.safety.title"),subtitle:Te?t("vm.safety.perBot",{path:n?.workspace_guest_path??"/home/cua/workspace"}):t("vm.safety.shared",{path:n?.workspace_guest_path??"/home/cua/workspace"}),children:[_e&&e.jsxs("div",{className:"flex flex-wrap gap-2",children:[n?.container==="running"&&e.jsxs(rt,{action:"stop",pending:c,onClick:()=>{Ue("stop")},children:[e.jsx(uo,{size:12})," ",t("vm.safety.stop")]}),e.jsxs(rt,{action:"remove",pending:c,onClick:()=>{Ue("remove")},danger:!0,children:[e.jsx(Le,{size:12})," ",Te?t("vm.safety.deleteLegacy"):t("vm.safety.deleteVm")]})]}),e.jsxs("div",{className:"mt-3 break-all text-[11px] text-ink-secondary",children:[t("vm.safety.workspace",{path:n?.workspace_path??t("vm.safety.notCreated"),driver:n?.driver_version??"0.37.0",image:n?.image_ref??t("vm.safety.notPrepared")}),n?.base_image_ref?e.jsxs(e.Fragment,{children:[" · ",t("vm.safety.baseImage",{image:n.base_image_ref})]}):null]})]})]})]})}const Qn=/^[A-Za-z0-9_-]+$/,em=/^relay[1-9][0-9]?\.openmausbot\.com$/;function tm(s){if(!s||s.v!==1||typeof s.k!="string"||s.k.length!==87||!Qn.test(s.k))return null;const n=typeof s.h=="string"&&Array.isArray(s.r)&&s.r.length>=1&&s.r.length<=4&&s.h.length===22&&Qn.test(s.h)&&s.r.every(r=>em.test(r))?{h:s.h,r:s.r}:{},a=JSON.stringify({v:1,k:s.k,...n}),i=btoa(a).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"");return i.length<=1024?i:null}const lr=8,sm=new Set(["hosted","tailnet","lan","bonjour"]);function Ke(s){const n=new Set,a=[];for(const i of s??[])if(!(!i||!sm.has(i.kind)||!Number.isInteger(i.priority)||i.priority<0||i.priority>1e6))try{const r=new URL(i.url),c=i.kind==="hosted"?"https:":"http:",o=r.port?Number(r.port):null,d=r.hostname.toLowerCase().replace(/\.$/,"");if(r.protocol!==c||d.split(".").includes("")||i.kind==="tailnet"&&!d.endsWith(".ts.net")||o!==null&&(!Number.isInteger(o)||o<1||o>65535)||r.username||r.password||r.pathname!=="/"||r.search||r.hash||n.has(r.origin))continue;n.add(r.origin),a.push({url:r.origin,kind:i.kind,priority:i.priority})}catch{}return a.sort((i,r)=>i.priority-r.priority).slice(0,lr)}function nm(s){const n=new TextEncoder().encode(JSON.stringify(s));let a="";for(const i of n)a+=String.fromCharCode(i);return btoa(a).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")}function am(s){if(!s||!/^[A-Za-z0-9_-]{87}$/.test(s))return null;try{const n=s.replaceAll("-","+").replaceAll("_","/")+"=",a=atob(n);if(a.length!==65||a.charCodeAt(0)!==4)return null;let i="";for(let r=0;r<a.length;r+=1)i+=a[r];return btoa(i).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")===s?s:null}catch{return null}}function im(s,n){const a=s.trim();if(!a)return null;if(/^https?:\/\//i.test(a))try{const r=new URL(a);return r.username||r.password||r.pathname!=="/"||r.search||r.hash?null:r.origin}catch{return null}return n===void 0||!Number.isInteger(n)||n<1||n>65535?null:`${a.includes(":")&&!a.startsWith("[")?`[${a}]`:a}:${n}`}function rm({address:s,port:n,token:a,code:i,name:r,hosts:c,endpoints:o,secretPublicKey:d,e2e:u}){const p=im(s,n);if(!p||!/^omb_pair_[A-Za-z0-9_-]{43}$/.test(a)||i!==void 0&&!/^\d{6}$/.test(i))return null;const m=[["address",p],["token",a]];i!==void 0&&m.push(["code",i]),r?.trim()&&m.push(["name",r.trim()]);const x=(c??[]).map(y=>y.trim()).filter(y=>y&&!/[\s/?#,[\]]/.test(y)).slice(0,lr);x.length&&m.push(["hosts",x.join(",")]);const h=Ke(o);h.length&&m.push(["endpoints",nm(h)]);const f=am(d);f&&m.push(["secretKey",f]);const b=tm(u);return b&&m.push(["e2e",b]),`openmausbot://pair?${m.map(([y,g])=>`${y}=${encodeURIComponent(g)}`).join("&")}`}function rn(s){return t("pairing.worksOnceUntil",{time:ll(s)})}function Rs(s,n=Date.now()){const a=Math.max(0,Math.floor((n-s)/6e4));return a<1?t("remote.serverPairing.justNow"):a<60?t("remote.serverPairing.minutesAgo",{minutes:a}):a<1440?t("remote.serverPairing.hoursAgo",{hours:Math.round(a/60)}):t("remote.serverPairing.daysAgo",{days:Math.round(a/1440)})}function lm(s){const n=s.endpoints?.find(a=>{if(a.kind!=="hosted")return!1;try{return new URL(a.url).hostname===s.address}catch{return!1}});return n?new URL(n.url).origin:`${s.address}:${s.port}`}const bs=s=>{const n=new Set,a=[];for(const i of s){const r=i.trim();!r||n.has(r)||(n.add(r),a.push(r))}return a},ys=(s,n)=>`http://${s.includes(":")&&!s.startsWith("[")?`[${s}]`:s}:${n}`;function Mt(s,n){if(n==="automatic"){const m=Ke(s.endpoints).filter(y=>y.kind==="hosted"),x=m[0]??null;if(!x)return null;const h=new URL(x.url),f=h.hostname,b=h.port?Number(h.port):443;return{address:f,port:b,hosts:bs([f,...m.map(y=>new URL(y.url).hostname)]),endpoints:m}}const a=Ke(s.endpoints);if(n==="tailscale"){if(s.routes?.tailscale?.on===!1)return null;let m=null;if(s.routes?.tailscale?.on){const g=s.routes.tailscale.name?.trim();g&&(m=Ke([{url:ys(g,s.port),kind:"tailnet",priority:0}])[0]??null)}if(m??=a.find(g=>g.kind==="tailnet")??null,!m&&s.tailnetName?.trim()&&(m=Ke([{url:ys(s.tailnetName.trim(),s.port),kind:"tailnet",priority:0}])[0]??null),!m)return null;const x=new URL(m.url),h=x.hostname,f=x.port?Number(x.port):80,b=a.filter(g=>g.url!==m.url&&["hosted","tailnet"].includes(g.kind)),y=[m,...b].map((g,v)=>({...g,priority:v*100}));return{address:h,port:f,hosts:bs([h,...(s.hosts??[]).filter(g=>g.trim().toLowerCase().replace(/\.$/,"").endsWith(".ts.net"))]),endpoints:y}}let i=a.find(m=>m.kind==="lan")??(s.discovery?.advertising?a.find(m=>m.kind==="bonjour"):null)??null;if(!i){const m=s.lan?.trim()||(s.discovery?.advertising?s.hosts?.find(x=>x.trim().toLowerCase().endsWith(".local")):null);if(!m)return null;i=Ke([{url:ys(m.trim(),s.port),kind:m.trim().toLowerCase().endsWith(".local")?"bonjour":"lan",priority:0}])[0]??null}if(!i)return null;const r=new URL(i.url),c=r.hostname,o=r.port?Number(r.port):80,d=a.filter(m=>m.url!==i.url&&m.kind==="hosted"),u=a.filter(m=>m.url!==i.url&&!["hosted","tailnet"].includes(m.kind)),p=[i,...d,...u].map((m,x)=>({...m,priority:x*100}));return{address:c,port:o,hosts:bs([c,...(s.hosts??[]).filter(m=>!m.trim().toLowerCase().replace(/\.$/,"").endsWith(".ts.net"))]),endpoints:p}}function om(s,n){const a=Mt(s,n);if(!a)return null;const i=Ke(a.endpoints),r=i[0]??null,c=n==="local"?null:n==="tailscale"?i.find(d=>d.kind==="tailnet")??null:r?.kind==="hosted"?r:null;if(n!=="local"&&!c)return null;const o=Ke(s.endpoints);return{route:{...a,endpoints:i},protectedEndpoint:c,protectedEndpointAdvertised:c?o.some(d=>d.kind===c.kind&&d.url===c.url):!1}}function cm(s,n){if(!n.protectedEndpoint)return!0;const a=Ke(s.endpoints).some(o=>o.kind===n.protectedEndpoint?.kind&&o.url===n.protectedEndpoint.url);if(n.protectedEndpoint.kind!=="tailnet")return a;if(s.routes?.tailscale?.on===!1)return!1;const i=s.routes?.tailscale?.on?s.routes.tailscale.name?.trim().toLowerCase().replace(/\.$/,""):void 0,r=dm(n.protectedEndpoint.url);if(i&&r!==i)return!1;if(a)return!0;if(n.protectedEndpointAdvertised)return!1;if(i)return r===i;const c=s.tailnetName?.trim().toLowerCase().replace(/\.$/,"");return!!c&&r===c}const dm=s=>{try{return new URL(s).hostname.toLowerCase().replace(/\.$/,"")}catch{return}},or={active:!1,localFallback:!1,tailscaleFallback:!1,baselineDeviceIds:[],pairingAttempted:!1,pairedDeviceName:null};function um(s,n){switch(n.type){case"start":case"resume":return{active:!0,localFallback:!1,tailscaleFallback:!1,baselineDeviceIds:[...n.deviceIds],pairingAttempted:!1,pairedDeviceName:null};case"use-local":return{...s,active:!0,localFallback:!0,tailscaleFallback:!1,pairingAttempted:!1};case"use-tailscale":return{...s,active:!0,localFallback:!1,tailscaleFallback:!0,pairingAttempted:!1};case"pairing-opened":return{...s,baselineDeviceIds:[...n.deviceIds],pairingAttempted:!0};case"paired":return{...s,active:!0,pairedDeviceName:n.deviceName};case"reset":return or}}const pm=3e4;function mm(s,n){return s.pairedDeviceName?"success":s.active?n.pairingOpen||s.pairingAttempted?"qr":n.provisioningTimedOut?"sign-in":s.localFallback||s.tailscaleFallback?"verifying":n.accountStatus==="signed-out"||n.accountStatus==="unavailable"||n.accountStatus==="error"?"sign-in":(n.accountBusy||n.provisioning,"verifying"):"intro"}async function xm(s,n,a){let i=await(n?a.read():a.start());return n&&!i.enabled&&(a.shouldContinue?.()??!0)&&(i=await a.start()),s==="tailscale"&&i.enabled&&!i.error&&(a.shouldContinue?.()??!0)&&(i=await a.refreshTailscale()),i}const hm=(s,n)=>n?.endpoints?.some(a=>a.kind==="hosted")?"hosted-ready":!s?.available||s.status==="signed-out"||s.status==="error"?"local-only":s.status==="ready"&&!n?.enabled?"hosted-startable":"hosted-connecting";function Ft(s,n,a){if(a)return"open";switch(hm(s,n)){case"hosted-ready":return"open";case"hosted-startable":return"start";case"hosted-connecting":return"wait";case"local-only":return"account-required"}}function gm(s,n,a){return s!=="automatic"?!1:n==="open"?!0:n==="wait"&&a?.available===!0&&(a.status==="ready"||a.status==="connecting")}function fm(s,n){return s?.available===!0&&s.status==="ready"&&!s.endpoint&&Ft(s,n,!1)==="wait"}function bm(s,n){const a=new Set(s);return n.find(i=>!a.has(i.id))??null}function ym(s,n){return!s.active||!s.pairingAttempted||s.pairedDeviceName?null:bm(s.baselineDeviceIds,n)}function It(s){return s?s.map(n=>n.id):null}function vm(s,n){return s.active&&n.provisioning&&!n.provisioningTimedOut}function km(s,n){return s.generation===n?!1:(s.generation=n,!0)}function ht(s,n){return s.generation!==n?!1:(s.generation=null,!0)}function jm(s,n){return s.active?.generation===n.generation||s.pending?.generation===n.generation?"duplicate":s.active?(s.pending=n,"queued"):(s.active=n,"start")}function Nm(s,n){if(s.active?.generation!==n)return null;const a=s.pending;return s.active=a,s.pending=null,a}function Rt(s,n){s.pending?.generation===n&&(s.pending=null)}const wm=()=>t("phone.setup.pairingOpenFailed",{advanced:t("remote.advanced"),remote:t("remote.title")});function Sm(s,n=null,a=Date.now()){const i=cr(s);if(i)return i;const r=s.pairing;return!r||r.token===n||!/^omb_pair_[A-Za-z0-9_-]{43}$/.test(r.token)||!/^\d{6}$/.test(r.code??"")||!Number.isFinite(r.expiresAt)||(r.expiresAt??0)<=a?wm():null}async function Tt(s,n,a,i){const r=s.pairing?.token;if(!r||!i())return!1;let c;try{c=await n()}catch{return!1}if(!i()||c.pairing?.token!==r)return!1;try{return await a(),!0}catch{return!1}}async function Cm(s,n,a){const i=await s();return a()?i:(await n(i).catch(()=>{}),null)}function Em(s,n,a={set:(i,r)=>setTimeout(i,r),clear:i=>clearTimeout(i)}){let i=!1,r=null;const c=()=>{i||(r=a.set(()=>{Promise.resolve().then(s).catch(()=>{}).finally(c)},n))};return c(),()=>{i=!0,r!==null&&a.clear(r)}}const Am=()=>t("phone.setup.startFailed",{advanced:t("remote.advanced"),remote:t("remote.title")});function cr(s){return s.enabled&&!s.error?null:s.error?.trim()||Am()}const Zn=/\bReference:\s*([0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})\.?/i,Pm=/^Error invoking remote method ['"][^'"\r\n]+['"]:\s*(?:Error:\s*)?/i,Im=[/^Enter a valid email address\.$/,/^The secure connection request (?:was not accepted|was not allowed)\./,/^That code (?:is not valid|expired)\./,/^Your sign-in expired\./,/^OpenMausBot could not reach its secure connection service\./,/^Too many attempts were made\./,/^This computer was reconnected too often\./,/^This account has reached its computer limit\./,/^This computer is already connected\./,/^The secure connection (?:is still being prepared|service could not finish setup|is still being removed)\./,/^Secure HTTPS links are temporarily full\./,/^Secure access is not available right now\./,/^The secure connection service (?:had a problem|returned an unexpected response|is busy right now)\./,/^The secure connection request could not be completed\./];function lt(s,n){const a=s instanceof Error?s.message:"",i=a.replace(Pm,"").replace(/^Error:\s*/i,"").trim(),r=i.match(Zn)?.[1]??"",c=i.replace(Zn,"").trim(),d=!(/remote method ['"]companion-account:request-code['"]/i.test(a)&&c.startsWith("The secure connection request was not allowed."))&&Im.some(u=>u.test(c))?c:n;return r?t("phone.error.reference",{message:d,reference:r}):d}const Be=async(s,n)=>{s.current+=1;try{return await n()}finally{s.current+=1}},Rm=(s,n)=>s.current===n,Tm=(s,n)=>s?n?"details":"direct":"hidden",Bm=s=>s.length<=3?"…":s.length<10?`${s.slice(0,3)}…`:s.length<17?`${s.slice(0,4)}…${s.slice(-3)}`:`${s.slice(0,10)}…${s.slice(-6)}`;function Lm({label:s,value:n}){const[a,i]=l.useState(!1),{state:r,copy:c}=Qt(n);return e.jsxs("div",{className:"flex items-center gap-3 rounded-lg bg-inset px-3 py-2",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"text-[11px] font-medium uppercase tracking-wide text-ink-secondary",children:s}),e.jsx("div",{className:"mt-0.5 truncate font-mono text-[12px] text-ink",children:a?n:Bm(n)})]}),e.jsx("button",{onClick:()=>i(o=>!o),className:"shrink-0 rounded px-2 py-1 text-[11px] text-ink-secondary hover:bg-control hover:text-ink",children:t(a?"connectionDetail.hide":"connectionDetail.reveal")}),e.jsx("button",{onClick:c,"aria-label":r==="failed"?t("common.copyFailed"):t("connectionDetail.copy",{label:s}),className:"shrink-0 rounded p-1.5 text-ink-secondary hover:bg-control hover:text-ink",children:r==="copied"?e.jsx(ve,{size:13,className:"text-success"}):r==="failed"?e.jsx(We,{size:13,className:"text-danger"}):e.jsx(Js,{size:13})})]})}const Om=1e5;function vs({on:s,label:n,value:a}){return e.jsxs("div",{className:"flex h-7 items-center gap-2 text-left",children:[s?e.jsx(ve,{size:14,className:"shrink-0 text-success"}):e.jsx(po,{size:14,className:"shrink-0 text-ink-tertiary"}),e.jsx("span",{className:"w-[120px] shrink-0 text-[13px] text-ink",children:n}),e.jsx("span",{className:"min-w-0 truncate text-[12px] text-ink-secondary",children:a})]})}function zm({c:s,signedIn:n}){const[a,i]=l.useState(!1),[r,c]=l.useState(!1),o=s.state,d=!!o?.pairing;if(l.useEffect(()=>{if(!d)return;const x=setInterval(()=>{s.act(h=>h.renewPairing?h.renewPairing():h.pairing(!0))},Om);return()=>clearInterval(x)},[d,s]),!o||!s.pairingLink)return null;const u=o.lan??o.addresses?.[0]??null,p=o.e2e?.descriptor?.r?.length?o.e2e.relay:null,m=()=>{wi(s.pairingLink??"").then(()=>{i(!0),setTimeout(()=>i(!1),2500)})};return e.jsxs("div",{className:"flex w-full max-w-[440px] flex-col items-center text-center",children:[e.jsx("div",{className:"rounded-2xl bg-white p-3.5 transition-opacity duration-150","aria-label":t("phone.code.qrAria"),children:e.jsx(es,{value:s.pairingLink,size:320,level:"L",marginSize:1,bgColor:"#ffffff",fgColor:"#111111"},o.pairing?.token)}),e.jsx("p",{className:"mt-4 text-[13px] text-ink-secondary",children:t("phone.code.e2e.scan",{app:Se()})}),e.jsxs("div",{className:"mt-5 w-full px-2",children:[e.jsx(vs,{on:!!u,label:t("phone.code.e2e.wifi"),value:u??""}),e.jsx(vs,{on:!!o.tailnetName,label:t("phone.code.e2e.tailscale"),value:o.tailnetName??t("phone.code.e2e.tailscaleOff")}),e.jsx(vs,{on:!!p,label:t("phone.code.e2e.relay"),value:p?t("phone.code.e2e.fromAnywhere"):n?t("phone.code.e2e.relayOff"):t("phone.code.e2e.signIn")})]}),s.localFallback&&o.publicNetwork&&e.jsx("p",{role:"note",className:"mt-3 w-full rounded-lg border border-warning/30 bg-warning/10 px-3 py-2 text-left text-[12px] leading-relaxed text-warning",children:t("phone.code.publicNetwork",{network:o.publicNetwork})}),e.jsxs("p",{className:"mt-4 flex items-start gap-1.5 px-2 text-left text-[12px] text-ink-tertiary",children:[e.jsx(md,{size:12,className:"mt-0.5 shrink-0"}),t("phone.code.e2e.encrypted")]}),e.jsxs("div",{className:"relative mt-5 flex w-full items-center justify-between px-2",children:[e.jsx("button",{onClick:m,className:"text-[12px] text-ink-secondary hover:text-ink",children:t("phone.code.e2e.copyLink")}),gn,gn]}),a&&e.jsx("div",{role:"status",className:"mt-3 rounded-lg bg-inset px-3 py-1.5 text-[12px] text-ink",children:t("phone.code.e2e.copied")})]})}function Mm({c:s}){return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"my-4 flex items-center gap-3 text-[11px] text-ink-secondary",children:[e.jsx("span",{className:"h-px flex-1 bg-hairline/40"})," ",t("phone.signIn.or")," ",e.jsx("span",{className:"h-px flex-1 bg-hairline/40"})]}),e.jsxs("button",{disabled:s.busy||s.accountBusy,onClick:s.useLocal,className:"flex items-center justify-center gap-2 rounded-lg border border-hairline/50 py-2.5 text-[13px] text-ink hover:bg-control disabled:opacity-40",children:[e.jsx(mu,{size:15})," ",t("phone.signIn.wifiInstead")]}),e.jsx("p",{className:"mt-2 text-center text-[11px] leading-relaxed text-ink-secondary",children:t("phone.signIn.wifiNote")}),s.tailscaleAvailable&&e.jsx("button",{disabled:s.busy||s.accountBusy,onClick:s.useTailscale,className:"mt-2 flex items-center justify-center gap-2 rounded-lg border border-hairline/50 py-2.5 text-[13px] text-ink hover:bg-control disabled:opacity-40",children:t("phone.signIn.tailscaleInstead")}),s.tailscaleAvailable&&e.jsx("p",{className:"mt-2 text-center text-[11px] leading-relaxed text-ink-secondary",children:t("phone.signIn.tailnetNote")})]})}const ea=()=>t("phone.error.directUnavailable"),ta=()=>t("phone.error.protectedUnavailable"),Ze=()=>globalThis.ogb?.companionAccount??null,Fm=async(s,n)=>{const[a,i]=await Promise.allSettled([s?Promise.resolve().then(()=>s.state()):Promise.resolve(null),n?Promise.resolve().then(()=>n.state()):Promise.resolve(null)]);return{companion:a.status==="fulfilled"?a.value:null,account:i.status==="fulfilled"?i.value:null}},Dm=(s,n)=>!s&&!!n.email,dr=(s,n)=>n||(s?.status==="signed-out"?s.message??null:null);function Um(s=""){const[n,a]=l.useState(null),[i,r]=l.useState(null),[c,o]=l.useState(s),[d,u]=l.useState(""),[p,m]=l.useState(!1),[x,h]=l.useState(!1),[f,b]=l.useState(!1),[y,g]=l.useState(!1),[v,C]=l.useState(!1),[w,N]=l.useState(!1),[I,j]=l.useState(null),[L,k]=l.useState(null),[,P]=l.useState(()=>Date.now()),[S,M]=l.useReducer(um,or),se=l.useRef(!1),ne=l.useRef({generation:null}),V=l.useRef({active:null,pending:null}),ie=l.useRef(async()=>{}),re=l.useRef(null),[oe,T]=l.useState(null),R=l.useRef(0),E=l.useRef(!0),D=l.useRef(0),Q=l.useRef(null),le=l.useCallback($=>{re.current=$,T($)},[]);l.useEffect(()=>(E.current=!0,()=>{E.current=!1,R.current+=1}),[]);const ae=l.useCallback(()=>{if(Q.current)return Q.current;const $=D.current,ee=(async()=>{const Z=await Fm(ct(),Ze());E.current&&(Z.companion&&Rm(D,$)&&a(Z.companion),Z.account&&(r(Z.account),Dm(se.current,Z.account)&&o(Z.account.email??"")))})().finally(()=>{Q.current===ee&&(Q.current=null)});return Q.current=ee,ee},[]);l.useEffect(()=>{ae()},[ae]),l.useEffect(()=>{!se.current&&s&&o(s)},[s]);const U=l.useCallback(async $=>{const ee=ct();if(ee){h(!0),j(null);try{const Z=await Be(D,()=>$(ee));E.current&&a(Z)}catch(Z){E.current&&j(lt(Z,t("phone.error.remoteUpdate")))}finally{E.current&&h(!1)}}},[]),te=l.useCallback(async $=>{const ee=Ze();if(ee){g(!0),k(null);try{const Z=await Be(D,()=>$(ee));if(!E.current)return;r(Z),await ae()}catch(Z){E.current&&k(lt(Z,t("phone.error.secureUpdate")))}finally{E.current&&g(!1)}}},[ae]),me=l.useCallback(async({routeMode:$,accountOverride:ee,generation:Z})=>{const ue=()=>{ht(ne.current,Z)&&E.current&&b(!1);const ke=Nm(V.current,Z);ke&&ie.current(ke)},be=()=>E.current&&R.current===Z;if(!be()){ue();return}const Pe=ct();if(!Pe){E.current&&R.current===Z&&j(t("phone.error.desktopOnly")),ue();return}const Je=()=>{const ke=re.current;return!ke||ke.generation===Z},Ye=re.current;Ye&&Ye.generation!==Z&&(le(null),a(ke=>ke?.pairing?.token===Ye.token?{...ke,pairing:null}:ke)),j(null);try{const ke=await xm($,!!n?.enabled,{read:()=>Pe.state(),start:()=>Be(D,()=>Pe.start($==="automatic"?void 0:[])),refreshTailscale:()=>Be(D,()=>Pe.refreshTailscale()),shouldContinue:be});if(!be())return;a(ke);const pt=cr(ke);if(pt){C(!1),j(pt),M({type:"reset"});return}const Ue=$!=="automatic",Xe=Ft(ee??i,ke,Ue),wt=Ze(),nt=wt?.prepare&&gm($,Xe,ee??i)?wt.prepare:null;if(Xe!=="open"){if(C(Xe==="wait"||Xe==="start"),nt){const _e=await Be(D,()=>nt());be()&&r(_e)}return}if(nt&&Promise.resolve().then(()=>nt()).catch(()=>{}),Ue&&!Mt(ke,$)){C(!1),j($==="tailscale"?t("phone.error.tailscaleUnavailable"):ea()),M({type:"reset"});return}const Re=await Cm(()=>Be(D,()=>Pe.pairing(!0)),_e=>Tt(_e,()=>Pe.state(),()=>Be(D,()=>Pe.pairing(!1,_e.pairing?.token)),Je),be);if(!Re)return;const St=Re.pairing,Ie=Sm(Re,ke.pairing?.token??null),Qe=Ie?null:om(Re,$);if(Ie||!Qe||!St){if(await Tt(Re,()=>Pe.state(),()=>Be(D,()=>Pe.pairing(!1,Re.pairing?.token)),be),!be())return;le(null),a({...Re,pairing:null}),C(!1),j(Ie??($==="local"?ea():$==="tailscale"?t("phone.error.tailscaleUnavailable"):ta())),M({type:"reset"});return}le({...Qe,generation:Z,token:St.token}),a(Re),C(!1),N(!1),M({type:"pairing-opened",deviceIds:Re.devices.map(_e=>_e.id)})}catch(ke){if(!be())return;le(null),C(!1),j(lt(ke,t("phone.error.pairingPrepare"))),M({type:"reset"})}finally{ue()}},[i,le,n]);l.useLayoutEffect(()=>{ie.current=me},[me]);const ce=l.useCallback(($,ee,Z=R.current)=>{const ue={routeMode:$,accountOverride:ee,generation:Z},be=jm(V.current,ue);be!=="duplicate"&&(km(ne.current,Z),b(!0),be==="start"&&ie.current(ue))},[]),xe=l.useCallback(()=>{const $=It(n?.devices??null);if(!$)return;const ee=++R.current;M({type:"start",deviceIds:$}),j(null),k(null),N(!1),(Ft(i,n,!1)==="open"||i?.available&&(i.status==="ready"||i.status==="connecting"))&&(C(!0),ce("automatic",i,ee))},[i,ce,n]),de=l.useCallback(()=>{const $=It(n?.devices??null);if(!$)return;S.active||M({type:"start",deviceIds:$});const ee=++R.current;M({type:"use-local"}),C(!0),N(!1),k(null),ce("local",void 0,ee)},[S.active,ce,n?.devices]),je=l.useCallback(()=>{const $=It(n?.devices??null);if(!$)return;S.active||M({type:"start",deviceIds:$});const ee=++R.current;M({type:"use-tailscale"}),C(!0),N(!1),k(null),ce("tailscale",void 0,ee)},[S.active,ce,n?.devices]),_=l.useCallback(()=>{U($=>$.refreshTailscale())},[U]),pe=l.useCallback(()=>{const $=Ze(),ee=c.trim().toLowerCase();if(!$||!ee)return;const Z=R.current;g(!0),k(null),$.requestCode(ee).then(ue=>{!E.current||R.current!==Z||(r(ue),m(!0))}).catch(ue=>{!E.current||R.current!==Z||k(lt(ue,t("phone.error.sendCode")))}).finally(()=>{E.current&&R.current===Z&&g(!1)})},[c]),B=l.useCallback(()=>{const $=Ze(),ee=c.trim().toLowerCase();if(!$||d.length!==8)return;const Z=R.current;g(!0),C(!0),N(!1),k(null),Be(D,()=>$.verifyCode(ee,d)).then(async ue=>{!E.current||R.current!==Z||(r(ue),u(""),m(!1),await ce("automatic",ue,Z))}).catch(ue=>{!E.current||R.current!==Z||(C(!1),k(lt(ue,t("phone.error.verifyCode"))))}).finally(()=>{E.current&&R.current===Z&&g(!1)})},[d,c,ce]),A=l.useCallback(()=>{const $=Ze();if(!$)return;const ee=S.active?It(n?.devices??null):null,Z=++R.current;ee&&M({type:"start",deviceIds:ee}),g(!0),C(!0),N(!1),k(null),Be(D,()=>$.retry()).then(async ue=>{!E.current||R.current!==Z||(r(ue),S.active?await ce("automatic",ue,Z):(await ae(),E.current&&R.current===Z&&C(!1)))}).catch(ue=>{!E.current||R.current!==Z||(C(!1),k(lt(ue,t("phone.error.restore"))))}).finally(()=>{E.current&&R.current===Z&&g(!1)})},[S.active,ae,ce,n?.devices]),H=mm(S,{accountStatus:i?.available?i.status:"unavailable",accountBusy:y,provisioning:v,provisioningTimedOut:w,pairingOpen:!!(n?.pairing&&oe?.token===n.pairing.token)});l.useEffect(()=>{!S.active||S.localFallback||S.tailscaleFallback||!i||i.available&&i.status!=="signed-out"&&i.status!=="error"||C(!1)},[i,S.active,S.localFallback,S.tailscaleFallback]),l.useEffect(()=>{if(!vm(S,{provisioning:v,provisioningTimedOut:w}))return;const $=window.setTimeout(()=>{const ee=R.current;R.current+=1,Rt(V.current,ee),ht(ne.current,ee),b(!1),g(!1),C(!1),N(!0)},pm);return()=>window.clearTimeout($)},[S,v,w]),l.useEffect(()=>{const $=oe;if(!$||!n)return;if(!n.pairing){le(null);return}const ee=n.pairing.token===$.token,Z=cm(n,$);if(ee&&Z)return;const ue=ct();R.current===$.generation&&(R.current+=1),Rt(V.current,$.generation),ht(ne.current,$.generation),b(!1),le(null),a(be=>be&&{...be,pairing:null}),C(!1),N(!1),j(ee?ta():t("phone.error.codeChanged")),M({type:"reset"}),ee&&ue&&Tt(n,()=>ue.state(),()=>Be(D,()=>ue.pairing(!1,n.pairing?.token)),()=>{const be=re.current;return!be||be.generation===$.generation})},[oe,le,n]),l.useEffect(()=>{if(!n)return;const $=ym(S,n.devices);$&&M({type:"paired",deviceName:$.name})},[S,n]),l.useEffect(()=>{!S.active||S.localFallback||S.tailscaleFallback||S.pairingAttempted||w||!n||(Ft(i,n,!1)==="open"||!v&&fm(i,n))&&ce("automatic")},[i,S.active,S.localFallback,S.pairingAttempted,S.tailscaleFallback,ce,v,w,n]);const he=S.active||!!n?.pairing;l.useEffect(()=>Em(()=>(P(Date.now()),ae()),he?1e3:1e4),[ae,he]);const W=S.localFallback?"local":S.tailscaleFallback?"tailscale":"automatic",Ne=l.useMemo(()=>n?n.pairing?oe?.token===n.pairing.token?oe.route:null:Mt(n,W):null,[W,oe,n]),ze=l.useMemo(()=>!n?.pairing||!Ne?null:rm({...Ne,code:n.e2e?.enabled?void 0:n.pairing.code,token:n.pairing.token,name:n.discovery?.name,secretPublicKey:n.secretPublicKey,e2e:n.e2e?.descriptor}),[Ne,n]),qe=l.useCallback(()=>{const $=R.current;R.current+=1,Rt(V.current,$),ht(ne.current,$),b(!1);const ee=n,Z=ct();le(null),a(ue=>ue&&{...ue,pairing:null}),Z&&ee?.pairing&&Tt(ee,()=>Z.state(),()=>Be(D,()=>Z.pairing(!1,ee.pairing?.token)),()=>re.current===null),C(!1),g(!1),N(!1),m(!1),u(""),M({type:"reset"})},[le,n]);return{state:n,account:i,phase:H,email:c,code:d,codeSent:p,busy:x||f,accountBusy:y,error:I,accountError:L,pairingLink:ze,address:Ne?.address,pairingPort:Ne?.port??n?.port??8810,addressText:Ne?lm(Ne):void 0,hostedReady:!!n?.endpoints?.some($=>$.kind==="hosted"),localFallback:S.localFallback,tailscaleFallback:S.tailscaleFallback,tailscaleAvailable:!!(n&&Mt(n,"tailscale")),pairingExpired:S.pairingAttempted&&!n?.pairing,setupTimedOut:w,setEmail:$=>{se.current=!0,o($)},setCode:$=>u($.replaceAll(/\D/g,"").slice(0,8)),changeEmail:()=>{u(""),m(!1),k(null)},start:xe,useLocal:de,useTailscale:je,refreshTailscale:_,requestCode:pe,verifyCode:B,retryAccount:A,cancel:qe,refreshCode:()=>{const $=++R.current;ce(W,void 0,$)},finish:()=>{const $=R.current;R.current+=1,Rt(V.current,$),ht(ne.current,$),b(!1),le(null),N(!1),M({type:"reset"})},act:U,accountAct:te}}function _m(){const s=[{Icon:Si,title:t("phone.value.chats"),detail:t("phone.value.chatsDetail")},{Icon:ve,title:t("phone.value.approvals"),detail:t("phone.value.approvalsDetail")},{Icon:Gs,title:t("phone.value.private"),detail:t("phone.value.privateDetail")}];return e.jsx("div",{className:"mt-5 grid w-full gap-2 sm:grid-cols-3",children:s.map(({Icon:n,title:a,detail:i})=>e.jsxs("div",{className:"rounded-xl bg-inset px-3 py-3 text-left",children:[e.jsx(n,{size:16,className:"text-accent"}),e.jsx("div",{className:"mt-2 text-[13px] font-medium text-ink",children:a}),e.jsx("div",{className:"mt-0.5 text-[12px] leading-relaxed text-ink-secondary",children:i})]},a))})}function $m({controller:s}){const n=s,a=dr(n.account,n.accountError),i=/^\S+@\S+\.\S+$/.test(n.email.trim()),r=Tm(!!n.state?.pairing,n.pairingLink);if(n.phase==="qr"&&n.state?.e2e?.enabled&&n.pairingLink)return e.jsx(zm,{c:n,signedIn:!!n.account?.email});if(n.phase==="intro")return e.jsxs("div",{className:"flex flex-col items-center text-center",children:[e.jsx("div",{className:"flex size-14 items-center justify-center rounded-2xl bg-accent/12 text-accent",children:e.jsx(Si,{size:26})}),e.jsx("h2",{className:"mt-4 text-[19px] font-semibold text-ink",children:t("phone.intro.title",{app:Se()})}),e.jsx("p",{className:"mt-1.5 max-w-[460px] text-[14px] leading-relaxed text-ink-secondary",children:t("phone.intro.detail")}),e.jsx(_m,{}),e.jsx("button",{"data-phone-pairing-action":!0,onClick:n.start,disabled:!n.state||n.busy||n.accountBusy,className:"mt-5 w-full max-w-[320px] rounded-lg bg-accent py-2.5 text-[14px] font-medium text-white hover:opacity-90 disabled:cursor-wait disabled:opacity-40",children:n.state?.devices.length?t("phone.intro.pairAnother"):t("phone.intro.pair")}),n.error&&e.jsx("p",{role:"alert",className:"mt-3 max-w-[390px] text-[13px] text-danger",children:n.error})]});if(n.phase==="sign-in"){const c=!n.account?.available,o=n.account?.status==="error"||n.setupTimedOut;return e.jsxs("div",{className:"mx-auto flex w-full max-w-[430px] flex-col",children:[e.jsxs("button",{onClick:n.cancel,className:"mb-4 flex w-fit items-center gap-1.5 text-[12px] text-ink-secondary hover:text-ink",children:[e.jsx(oi,{size:13})," ",t("phone.back")]}),e.jsx("div",{className:"flex size-11 items-center justify-center rounded-xl bg-accent/12 text-accent",children:e.jsx(mo,{size:20})}),e.jsx("h2",{className:"mt-3 text-[18px] font-semibold text-ink",children:c||o?t("phone.signIn.attention"):t("phone.signIn.title")}),e.jsx("p",{role:n.setupTimedOut?"alert":void 0,className:"mt-1 text-[13px] leading-relaxed text-ink-secondary",children:c?t("phone.signIn.unavailable"):n.setupTimedOut?t("phone.signIn.timedOut"):o?n.account?.message??t("phone.signIn.failed"):t("phone.signIn.emailPrompt")}),!c&&!o&&e.jsxs("div",{className:"mt-5 flex flex-col gap-3",children:[e.jsxs("label",{className:"flex flex-col gap-1.5",children:[e.jsx("span",{className:"text-[12px] font-medium text-ink-secondary",children:t("phone.signIn.email")}),e.jsx("input",{autoFocus:!0,autoComplete:"email",inputMode:"email",value:n.email,disabled:n.accountBusy||n.codeSent,onChange:d=>n.setEmail(d.target.value),onKeyDown:d=>{d.key==="Enter"&&!n.codeSent&&i&&n.requestCode()},placeholder:t("common.emailPlaceholder"),className:"rounded-lg border border-hairline/50 bg-inset px-3 py-2.5 text-[14px] text-ink outline-none placeholder:text-ink-tertiary focus:border-accent disabled:opacity-50"})]}),n.codeSent&&e.jsxs("label",{className:"flex flex-col gap-1.5",children:[e.jsx("span",{className:"text-[12px] font-medium text-ink-secondary",children:t("phone.signIn.emailCode")}),e.jsx("input",{autoFocus:!0,autoComplete:"one-time-code",inputMode:"numeric",value:n.code,disabled:n.accountBusy,onChange:d=>n.setCode(d.target.value),onKeyDown:d=>{d.key==="Enter"&&n.code.length===8&&n.verifyCode()},placeholder:"12345678",className:"rounded-lg border border-hairline/50 bg-inset px-3 py-2.5 font-mono text-[16px] tracking-[0.18em] text-ink outline-none placeholder:tracking-normal placeholder:text-ink-tertiary focus:border-accent disabled:opacity-50"})]}),e.jsx("button",{disabled:n.accountBusy||!n.codeSent&&!i||n.codeSent&&n.code.length!==8,onClick:n.codeSent?n.verifyCode:n.requestCode,className:"rounded-lg bg-accent py-2.5 text-[14px] font-medium text-white hover:opacity-90 disabled:opacity-40",children:n.accountBusy?t("phone.signIn.working"):n.codeSent?t("phone.signIn.verify"):t("phone.signIn.sendCode")}),n.codeSent&&e.jsx("button",{disabled:n.accountBusy,onClick:n.changeEmail,className:"text-[12px] text-ink-secondary hover:text-ink disabled:opacity-40",children:t("phone.signIn.otherEmail")}),n.codeSent&&!a&&e.jsx("p",{className:"text-[12px] text-ink-secondary",children:t("phone.signIn.expires")})]}),(c||o)&&e.jsx("button",{disabled:n.accountBusy,onClick:n.retryAccount,className:"mt-5 rounded-lg bg-accent py-2.5 text-[14px] font-medium text-white disabled:opacity-40",children:n.accountBusy?t("remote.account.retrying"):t("phone.signIn.retry")}),a&&e.jsx("p",{role:"alert",className:"mt-3 text-[13px] text-danger",children:a}),e.jsx(Mm,{c:n})]})}return n.phase==="verifying"?e.jsxs("div",{className:"flex flex-col items-center py-8 text-center",children:[e.jsx("div",{className:"flex size-14 items-center justify-center rounded-2xl bg-accent/12 text-accent",children:e.jsx(q,{size:25,className:"animate-spin"})}),e.jsx("h2",{className:"mt-4 text-[18px] font-semibold text-ink",children:n.localFallback?t("phone.verifying.local"):n.tailscaleFallback?t("phone.verifying.tailscale"):t("phone.verifying.secure")}),e.jsx("p",{className:"mt-1.5 max-w-[360px] text-[13px] leading-relaxed text-ink-secondary",children:n.localFallback?t("phone.verifying.localDetail"):n.tailscaleFallback?t("phone.verifying.tailscaleDetail"):t("phone.verifying.secureDetail")}),(n.error||n.accountError)&&e.jsx("p",{role:"alert",className:"mt-3 max-w-[380px] text-[13px] text-danger",children:n.error??n.accountError}),e.jsx("button",{onClick:n.cancel,className:"mt-5 text-[12px] text-ink-secondary hover:text-ink",children:t("common.cancel")})]}):n.phase==="success"?e.jsxs("div",{className:"flex flex-col items-center py-6 text-center",children:[e.jsx("div",{className:"flex size-14 items-center justify-center rounded-full bg-success/15 text-success",children:e.jsx(ve,{size:28})}),e.jsx("h2",{className:"mt-4 text-[19px] font-semibold text-ink",children:t("phone.success.title")}),e.jsx("p",{className:"mt-1.5 text-[13px] text-ink-secondary",children:t("phone.success.detail")}),e.jsx("button",{onClick:n.finish,className:"mt-5 w-full max-w-[280px] rounded-lg bg-accent py-2.5 text-[14px] font-medium text-white",children:t("phone.success.done")})]}):e.jsxs("div",{className:"flex flex-col items-center text-center",children:[e.jsx("div",{className:"flex size-12 items-center justify-center rounded-xl bg-white text-black",children:e.jsx(iu,{size:23})}),e.jsx("h2",{className:"mt-3 text-[18px] font-semibold text-ink",children:n.pairingExpired?t("phone.code.expired"):t("phone.code.title")}),e.jsx("p",{className:"mt-1 text-[13px] text-ink-secondary",children:n.pairingExpired?t("phone.code.expiredDetail"):t("phone.code.detail")}),!n.pairingExpired&&n.pairingLink&&e.jsx("div",{className:"mt-4 rounded-2xl bg-white p-3.5","aria-label":t("phone.code.qrAria"),children:e.jsx(es,{value:n.pairingLink,size:180,level:"M",bgColor:"#ffffff",fgColor:"#111111"})}),!n.pairingExpired&&r==="direct"&&n.state?.pairing&&e.jsxs("div",{className:"mt-4 w-full max-w-[320px] rounded-xl bg-inset px-4 py-3 text-[13px] text-ink-secondary",children:[e.jsx("div",{children:t("phone.code.typeIntro",{app:Se()})}),e.jsx("div",{className:"mt-2 font-mono text-[22px] tracking-[0.25em] text-ink",children:n.state.pairing.code})]}),!n.pairingExpired&&r==="details"&&n.state?.pairing&&e.jsx("p",{className:"mt-3 text-[12px] text-ink-secondary",children:rn(n.state.pairing.expiresAt)}),!n.pairingExpired&&n.localFallback&&n.state?.publicNetwork&&e.jsx("p",{role:"note",className:"mt-3 w-full max-w-[390px] rounded-lg border border-warning/30 bg-warning/10 px-3 py-2 text-left text-[12px] leading-relaxed text-warning",children:t("phone.code.publicNetwork",{network:n.state.publicNetwork})}),n.pairingExpired&&e.jsx("button",{onClick:n.refreshCode,className:"mt-5 rounded-lg bg-accent px-5 py-2.5 text-[14px] font-medium text-white",children:t("phone.code.createNew")}),!n.pairingExpired&&n.state?.pairing&&e.jsxs("details",{className:"mt-4 w-full max-w-[390px] rounded-lg border border-hairline/40 px-3 py-2 text-left",children:[e.jsx("summary",{className:"cursor-pointer text-[12px] text-ink-secondary",children:t("phone.code.trouble")}),e.jsxs("div",{className:"mt-3 text-[12px] text-ink-secondary",children:[t("phone.code.pairingCode"),e.jsx("div",{className:"mt-1 font-mono text-[22px] tracking-[0.25em] text-ink",children:n.state.pairing.code}),n.address&&e.jsx("div",{className:"mt-3",children:e.jsx(Lm,{label:t("phone.code.address"),value:n.addressText??`${n.address}:${n.pairingPort}`})})]})]}),e.jsx("button",{onClick:n.cancel,className:"mt-4 text-[12px] text-ink-secondary hover:text-ink",children:t("common.cancel")})]})}function Km(){const{phase:s,phones:n,refresh:a}=Ld(),{dispatch:i}=G(),[r,c]=l.useState(null);if(s==="loading")return null;const o=d=>{r||(c(d),F(Md(d),{method:"DELETE"}).catch(u=>i({type:"error",message:u instanceof Error?u.message:String(u)})).finally(()=>{c(null),a()}))};return e.jsxs("div",{className:"border-t border-hairline/30 pt-4",children:[e.jsx("div",{className:"text-[13px] text-ink",children:t("remote.phones.title")}),n.length===0?e.jsx("div",{className:"mt-0.5 text-[12px] leading-relaxed text-ink-secondary",children:t("remote.phones.empty")}):e.jsx("ul",{className:"mt-3 flex flex-col gap-2",children:n.map(d=>{const{name:u,platform:p}=d.registration;return e.jsxs("li",{className:"rounded-xl bg-inset px-3 py-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsxs("div",{className:"truncate text-[14px] font-medium text-ink",children:[u," ",e.jsxs("span",{className:"font-normal text-ink-secondary",children:["· ",Od(p)]})]}),e.jsx("div",{className:"text-[12px] text-ink-secondary",children:d.online?t("remote.phones.online"):t("remote.phones.offline",{when:pr(d.seen)})})]}),e.jsx("button",{disabled:r!==null,onClick:()=>o(d.key),"aria-label":t("remote.phones.remove",{name:u}),className:"shrink-0 rounded p-1.5 text-ink-secondary hover:bg-control hover:text-danger disabled:opacity-40",children:e.jsx(Le,{size:14})})]}),e.jsx("div",{className:"mt-2 flex flex-wrap gap-1.5",children:zd(d).map(m=>e.jsx("span",{className:"rounded-full bg-control px-2 py-0.5 text-[11px] text-ink-secondary",children:t(`botAccess.phone.cap.${m}`)},m))})]},d.key)})})]})}const Hm={wifi:"remote.devices.route.wifi",tailscale:"remote.devices.route.tailscale",relay:"remote.devices.route.relay"};function Wm(s,n){return[...s].sort((a,i)=>Number(n.has(i.id))-Number(n.has(a.id))||i.lastSeenAt-a.lastSeenAt)}function sa(s,n,a){const i=[];return s.route?i.push(t("remote.devices.connected",{route:t(Hm[s.route])})):n?i.push(a&&!s.e2eAt?t("remote.devices.connectedLegacy"):t("remote.devices.connectedNow")):i.push(t("remote.devices.lastSeen",{when:pr(s.lastSeenAt)})),a&&s.routes==="local"&&i.push(t("remote.devices.localOnly")),i.join(" · ")}function Gm({device:s,connected:n,state:a,c:i,onRemoved:r,onPairAgain:c,defaultOpen:o=!1}){const[d,u]=l.useState(o),p=a.e2e?.enabled===!0,m=n||!!s.route;return e.jsxs("li",{className:"border-t border-hairline/30 first:border-t-0",children:[e.jsxs("div",{className:"flex items-center gap-2.5 px-3 py-3",children:[e.jsx("span",{className:"flex size-3 shrink-0 items-center justify-center",title:sa(s,n,p),children:e.jsx("span",{className:`size-2 rounded-full ${m?"bg-success":"bg-ink-tertiary/40"}`})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"truncate text-[14px] font-medium text-ink",children:s.name}),e.jsx("div",{className:"truncate text-[12px] text-ink-secondary",children:sa(s,n,p)}),i.account?.paused&&e.jsx("div",{className:"truncate text-[12px] text-ink-secondary",children:t("remote.devices.paused")}),i.account?.tunnelRetired&&!s.e2eAt&&e.jsxs("div",{className:"text-[12px] leading-relaxed text-warning","data-phone-retired":"",children:[t("remote.devices.retired"),c&&e.jsxs(e.Fragment,{children:[" ",e.jsx("button",{type:"button",className:"text-accent hover:underline",onClick:c,children:t("remote.devices.pairAgain")})]})]})]}),e.jsx("button",{onClick:()=>u(x=>!x),"aria-expanded":d,"aria-label":t("remote.devices.more",{name:s.name}),className:"shrink-0 rounded p-1.5 text-ink-secondary hover:bg-control",children:e.jsx(Ni,{size:15})})]}),d&&e.jsxs("div",{className:"flex flex-col gap-3 border-t border-hairline/30 px-3 py-3",children:[p&&e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsx("div",{className:"text-[12px] text-ink",children:t("remote.devices.connectFrom")}),e.jsx("div",{role:"radiogroup","aria-label":t("remote.devices.connectFrom"),className:"flex rounded-lg bg-inset p-0.5 text-[12px]",children:["any","local"].map(x=>e.jsx("button",{role:"radio","aria-checked":(s.routes??"any")===x,disabled:i.busy,onClick:()=>{i.act(h=>h.routes?h.routes(s.id,x):h.state())},className:`rounded-md px-2.5 py-1 ${(s.routes??"any")===x?"bg-card text-ink shadow-sm":"text-ink-secondary"}`,children:x==="any"?t("remote.devices.anywhere"):t("remote.devices.localOnly")},x))})]}),e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-[12px] text-ink",children:t("remote.devices.allowView")}),e.jsx("div",{className:"mt-0.5 text-[11px] text-ink-secondary",children:t("remote.devices.allowViewDetail")})]}),e.jsx(fe,{checked:s.cloudDesktopAccess,"aria-label":t("remote.devices.viewAria",{name:s.name}),disabled:i.busy,onClick:()=>{i.act(x=>x.cloudDesktop(s.id,!s.cloudDesktopAccess))}})]}),e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-[12px] text-ink",children:t("remote.devices.allowBrowser")}),e.jsx("div",{className:"mt-0.5 text-[11px] text-ink-secondary",children:t("remote.devices.allowBrowserDetail")})]}),e.jsx(fe,{checked:s.browserControlAccess===!0,"aria-label":t("remote.devices.browserAria",{name:s.name}),disabled:i.busy,onClick:()=>{i.act(x=>x.browserControl(s.id,!s.browserControlAccess))}})]}),e.jsx("button",{disabled:i.busy,onClick:()=>{i.act(x=>x.revoke(s.id)).then(()=>r(s.name))},"aria-label":t("remote.devices.remove",{name:s.name}),className:"self-start text-[12px] text-danger hover:underline disabled:opacity-40",children:t("remote.devices.removePhone")})]})]})}function na({c:s,state:n,onPairAgain:a}){const[i,r]=l.useState(null),c=new Set(n.connectedDeviceIds??[]);return n.devices.length===0&&!i?null:e.jsxs(e.Fragment,{children:[n.devices.length>0&&e.jsx("ul",{className:"rounded-xl border border-hairline/40 bg-card",children:Wm(n.devices,c).map(o=>e.jsx(Gm,{device:o,connected:c.has(o.id),state:n,c:s,onRemoved:r,onPairAgain:a},o.id))}),i&&e.jsx("div",{role:"status",className:"mt-2 text-[12px] text-ink-secondary",children:t("remote.devices.removed",{name:i})})]})}const Vm="/api/team/phone-pairing",aa="/api/team/phones",qm=4e3;function Jm(s){return`${s.label} · ${s.email}`}function Ym({team:s,blocked:n}){const[a,i]=l.useState(null),[r,c]=l.useState(null),[o,d]=l.useState(null),[u,p]=l.useState(!1),[m,x]=l.useState(null),[h,f]=l.useState(()=>Date.now()),b=w=>x(t("remote.serverPairing.error",{error:w instanceof Error?w.message:String(w)}));async function y(){try{const w=await F(aa);c(Array.isArray(w?.phones)?w.phones:[]),d(typeof w?.current=="string"?w.current:null)}catch(w){b(w)}}l.useEffect(()=>{y()},[]);const g=a?a.expiresAt<=h:!1;l.useEffect(()=>{if(!a)return;const w=setInterval(()=>f(Date.now()),15e3);return()=>clearInterval(w)},[a]),l.useEffect(()=>{if(!a||g)return;const w=setInterval(()=>{y()},qm);return()=>clearInterval(w)},[a,g]);async function v(){p(!0),x(null);try{i(await F(Vm,{method:"POST",body:"{}"})),f(Date.now())}catch(w){b(w)}finally{p(!1)}}async function C(w){x(null);try{await F(`${aa}/${encodeURIComponent(w)}`,{method:"DELETE"})}catch(N){b(N)}await y()}return e.jsxs(X,{title:t("teamPhone.title"),subtitle:t("teamPhone.subtitle",{team:s}),children:[e.jsx("div",{className:"mt-3 flex flex-wrap items-center gap-3",children:e.jsx("button",{type:"button","data-phone-pairing-action":!0,onClick:()=>{v()},disabled:u||!!n,title:n??void 0,className:"ui-button ui-button-primary",children:u?t("remote.serverPairing.creating"):t("remote.serverPairing.create")})}),n?e.jsx("p",{role:"status","data-team-phone-blocked":!0,className:"mt-3 text-[13px] text-ink-secondary",children:n}):null,a?e.jsx("div",{"data-team-phone-code":!0,className:"mt-4 rounded-lg border border-hairline/40 bg-inset p-4",children:g?e.jsx("p",{className:"text-[13px] text-ink-secondary",children:t("remote.serverPairing.expired")}):e.jsxs("div",{className:"flex flex-wrap items-start gap-5",children:[a.url?e.jsx("div",{className:"rounded-md bg-white p-2",children:e.jsx(es,{value:a.url,size:160,level:"M",bgColor:"#ffffff",fgColor:"#111111"})}):null,e.jsxs("div",{className:"min-w-[200px] flex-1",children:[e.jsx("div",{className:"font-mono text-[18px] tracking-[0.14em] text-ink",children:a.code}),e.jsx("div",{className:"mt-1 text-[13px] text-ink-secondary",children:rn(a.expiresAt)}),a.url?null:e.jsx("p",{className:"mt-3 text-[13px] text-ink-secondary",children:a.hint??t("remote.serverPairing.noLink")})]})]})}):null,e.jsx("p",{className:"mt-3 text-[13px] text-ink-secondary",children:t("teamPhone.stays",{team:s})}),r?e.jsxs("div",{"data-team-phones":!0,children:[e.jsx("div",{className:"mt-5 text-[13px] font-medium text-ink",children:t("remote.serverPairing.devices")}),r.length===0?e.jsx("p",{className:"mt-1 text-[13px] text-ink-secondary",children:t("remote.serverPairing.noDevices")}):e.jsx("ul",{className:"mt-1 divide-y divide-hairline/40",children:r.map(w=>e.jsxs("li",{"data-team-phone":w.id,className:"flex flex-wrap items-center justify-between gap-2 py-2 text-[13px]",children:[e.jsxs("span",{className:"text-ink",children:[Jm(w),e.jsxs("span",{className:"text-ink-secondary",children:[" · ",t("remote.serverPairing.seen",{when:Rs(w.lastSeenAt,h)}),w.id===o?` · ${t("remote.serverPairing.thisBrowser")}`:""]})]}),w.id===o?null:e.jsx("button",{type:"button","data-team-phone-remove":!0,onClick:()=>{C(w.id)},className:"ui-button",children:t("teamPhone.remove")})]},w.id))})]}):null,m?e.jsx("p",{className:"mt-3 text-[13px] text-danger",children:m}):null]})}function Xm({saved:s,onSaved:n,className:a}){const[i,r]=l.useState(s),[c,o]=l.useState(!1),[d,u]=l.useState(null);l.useEffect(()=>r(s),[s]);async function p(){const m=i.trim();if(!(c||m===s)){o(!0),u(null);try{const x=await F("/api/config",{method:"PATCH",body:JSON.stringify({computerName:m})});n(x.computerName??m)}catch(x){u(t("remote.computerName.error",{error:x instanceof Error?x.message:String(x)}))}finally{o(!1)}}}return e.jsxs("div",{"data-computer-name":!0,className:O("flex flex-col gap-1",a),children:[e.jsx("label",{htmlFor:"computer-name",className:"text-[13px] font-medium text-ink",children:t("remote.computerName.title")}),e.jsx("input",{id:"computer-name",value:i,disabled:c,placeholder:t("remote.computerName.placeholder"),"aria-describedby":"computer-name-help",onChange:m=>r(m.target.value),onBlur:()=>{p()},onKeyDown:m=>{m.key==="Enter"&&m.currentTarget.blur()},className:"w-full max-w-xs rounded-lg border border-hairline/40 bg-inset px-3 py-2 text-[13px] text-ink placeholder:text-ink-secondary focus:outline-none"}),e.jsx("p",{id:"computer-name-help",className:"text-[12px] leading-4 text-ink-secondary",children:t("remote.computerName.help")}),d?e.jsx("p",{role:"alert",className:"text-[12px] leading-4 text-danger",children:d}):null]})}function bt(s){return Id(s)}function Qm(s){return s?.kind==="session"&&!s.scopes.includes("admin")?"chat-only":null}function Zm(s,n){return n?s.filter(a=>a.scopes.includes("admin")):s}const ex="ui-button ui-button-primary",ia="ui-button";function ur({initialSession:s=null,initialPairingCodes:n=!0,cloudHome:a=!1,focusRequest:i=0,team:r,teamPhoneBlocked:c=null,simple:o=!1,reveal:d=!0}){const[u,p]=l.useState(s),[m,x]=l.useState(n),[h,f]=l.useState(null),[b,y]=l.useState("admin"),[g,v]=l.useState(null),[C,w]=l.useState([]),[N,I]=l.useState(null),[j,L]=l.useState(!1),[k,P]=l.useState("idle"),[S,M]=l.useState(null),[se,ne]=l.useState(()=>Date.now()),V=l.useRef(null),ie=l.useRef(0);async function re(){try{const U=await F("/api/auth/sessions");w(Array.isArray(U?.sessions)?U.sessions:[]),I(typeof U?.current=="string"?U.current:null)}catch(U){M(t("remote.serverPairing.error",{error:U instanceof Error?U.message:String(U)}))}}if(l.useEffect(()=>{Ai().then(U=>{p(U),bt(U)&&re(),(U.kind==="loopback"||U.kind==="session")&&F("/api/config").then(te=>{x(Pi(te).pairingCodes),bt(U)&&f(typeof te?.computerName=="string"?te.computerName:"")}).catch(()=>{})})},[]),l.useEffect(()=>{i?ie.current!==i&&Ii(V.current)&&(ie.current=i):ie.current=0},[i,u]),l.useEffect(()=>{if(!g)return;const U=setInterval(()=>ne(Date.now()),15e3);return()=>clearInterval(U)},[g]),r&&u?.kind==="session"&&u.team)return e.jsx("div",{ref:V,tabIndex:-1,"data-phone-pairing":"server",className:"scroll-mt-4 rounded-xl focus:outline-none",children:e.jsx(Ym,{team:r,blocked:c})});if(!bt(u))return Qm(u)!=="chat-only"?null:e.jsx("div",{ref:V,tabIndex:-1,"data-phone-pairing":"server",className:"scroll-mt-4 rounded-xl focus:outline-none",children:e.jsx(X,{title:t("remote.serverPairing.title"),subtitle:t(m?"remote.serverPairing.subtitle":"remote.serverPairing.portalSubtitle"),children:e.jsx("p",{"data-server-pairing-chat-only":!0,className:"mt-3 text-[13px] text-ink-secondary",children:t(m?"remote.serverPairing.chatOnly":"remote.serverPairing.portalChatOnly")})})});const oe=g?g.expiresAt<=se:!1,T=Zm(C,a);async function R(){L(!0),M(null),P("idle");try{const U=await F("/api/auth/pairing",{method:"POST",body:JSON.stringify({scopes:b==="admin"||a?["admin","client"]:["client"]})});v(U),ne(Date.now())}catch(U){M(t("remote.serverPairing.error",{error:U instanceof Error?U.message:String(U)}))}finally{L(!1)}}async function E(U){M(null);try{await F(`/api/auth/sessions/${encodeURIComponent(U)}`,{method:"DELETE"}),await re()}catch(te){M(t("remote.serverPairing.error",{error:te instanceof Error?te.message:String(te)}))}}async function D(){if(!g?.url)return;const U=await wi(g.url);U!=="empty"&&P(U)}const Q=m&&g?e.jsx("div",{className:"mt-4 rounded-lg border border-hairline/40 bg-inset p-4",children:oe?e.jsx("p",{className:"text-[13px] text-ink-secondary",children:t("remote.serverPairing.expired")}):e.jsxs("div",{className:"flex flex-wrap items-start gap-5",children:[g.url?e.jsx("div",{className:"rounded-md bg-white p-2",children:e.jsx(es,{value:g.url,size:160,level:"M",bgColor:"#ffffff",fgColor:"#111111"})}):null,e.jsxs("div",{className:"min-w-[200px] flex-1",children:[e.jsx("div",{className:"font-mono text-[18px] tracking-[0.14em] text-ink",children:g.code}),e.jsx("div",{className:"mt-1 text-[13px] text-ink-secondary",children:rn(g.expiresAt)}),g.url?e.jsxs("div",{className:"mt-3 flex flex-wrap items-center gap-2",children:[e.jsx("code",{className:"break-all text-[12px] text-ink-secondary",children:g.url}),e.jsx("button",{type:"button",onClick:()=>{D()},className:ia,children:t(k==="copied"?"remote.serverPairing.copied":k==="failed"?"common.copyFailed":"remote.serverPairing.copyLink")})]}):e.jsx("p",{className:"mt-3 text-[13px] text-ink-secondary",children:g.hint??t("remote.serverPairing.noLink")})]})]})}):null,le=U=>m&&!a&&h!==null?e.jsx(Xm,{saved:h,onSaved:f,className:U}):null,ae=U=>t(U.scopes.includes("admin")?"remote.serverPairing.scope.admin":"remote.serverPairing.scope.client");return o?e.jsxs("div",{ref:V,tabIndex:-1,"data-phone-pairing":"server",className:"flex scroll-mt-4 flex-col gap-1.5 focus:outline-none",children:[e.jsxs("div",{"data-settings-rows":"",className:O(ci,"flex flex-col"),children:[le("px-4 py-2.5"),e.jsx(ge,{title:t("settings.simple.computer.pair"),subtitle:m?a?t("remote.serverPairing.cloudPersonal"):void 0:t("remote.serverPairing.portal"),children:m?e.jsxs("div",{className:"flex items-center gap-2",children:[a?null:e.jsxs(ye,{variant:"ghost",value:b,"aria-label":t("remote.serverPairing.title"),onChange:U=>y(U.target.value==="client"?"client":"admin"),children:[e.jsx("option",{value:"admin",children:t("remote.serverPairing.scope.admin")}),e.jsx("option",{value:"client",children:t("remote.serverPairing.scope.client")})]}),e.jsx("button",{type:"button","data-phone-pairing-action":d?"":void 0,onClick:()=>{R()},disabled:j,className:"ui-button",children:j?t("remote.serverPairing.creating"):t("settings.simple.computer.createCode")})]}):null}),Q?e.jsx("div",{className:"px-4 pb-2.5 [&>div]:mt-0",children:Q}):null,T.length===0?e.jsx("p",{className:"px-4 py-2.5 text-[13px] leading-[18px] text-ink-secondary",children:t("remote.serverPairing.noDevices")}):T.map(U=>e.jsxs("div",{className:"flex min-h-11 flex-wrap items-center gap-x-5 gap-y-2 px-4 py-2.5",children:[e.jsxs("span",{className:"min-w-[min(100%,15rem)] flex-1 text-[14px] leading-5 text-ink",children:[U.label,e.jsxs("span",{className:"text-ink-secondary",children:[" · ",ae(U)," · ",t("remote.serverPairing.seen",{when:Rs(U.lastSeenAt,se)}),U.id===N?` · ${t("remote.serverPairing.thisBrowser")}`:""]})]}),U.id===N?null:e.jsx("button",{type:"button",onClick:()=>{E(U.id)},className:"ui-button ml-auto shrink-0",children:t("remote.serverPairing.signOut")})]},U.id))]}),S?e.jsx("p",{className:"pl-4 text-[12px] leading-4 text-danger",children:S}):null]}):e.jsx("div",{ref:V,tabIndex:-1,"data-phone-pairing":"server",className:"scroll-mt-4 rounded-xl focus:outline-none",children:e.jsxs(X,{title:t("remote.serverPairing.title"),subtitle:t(m?"remote.serverPairing.subtitle":"remote.serverPairing.portalSubtitle"),children:[m&&a?e.jsx("p",{"data-server-pairing-personal":!0,className:"mt-3 text-[13px] text-ink-secondary",children:t("remote.serverPairing.cloudPersonal")}):null,le("mt-3"),m?e.jsxs("div",{className:"mt-3 flex flex-wrap items-center gap-3",children:[a?null:e.jsxs(e.Fragment,{children:[e.jsxs("label",{className:"flex items-center gap-1.5 text-[13px] text-ink",children:[e.jsx("input",{type:"radio",name:"server-pairing-scope",checked:b==="admin",onChange:()=>y("admin")}),t("remote.serverPairing.scope.admin")]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-[13px] text-ink",children:[e.jsx("input",{type:"radio",name:"server-pairing-scope",checked:b==="client",onChange:()=>y("client")}),t("remote.serverPairing.scope.client")]})]}),e.jsx("button",{type:"button","data-phone-pairing-action":d?"":void 0,onClick:()=>{R()},disabled:j,className:ex,children:j?t("remote.serverPairing.creating"):t("remote.serverPairing.create")})]}):e.jsx("p",{"data-server-pairing-portal":!0,className:"mt-3 text-[13px] text-ink-secondary",children:t("remote.serverPairing.portal")}),Q,e.jsx("div",{className:"mt-5 text-[13px] font-medium text-ink",children:t(m?"remote.serverPairing.devices":"remote.serverPairing.portalDevices")}),T.length===0?e.jsx("p",{className:"mt-1 text-[13px] text-ink-secondary",children:t("remote.serverPairing.noDevices")}):e.jsx("ul",{className:"mt-1 divide-y divide-hairline/40",children:T.map(U=>e.jsxs("li",{className:"flex flex-wrap items-center justify-between gap-2 py-2 text-[13px]",children:[e.jsxs("span",{className:"text-ink",children:[U.label,U.email?e.jsxs("span",{className:"text-ink-secondary",children:[" · ",U.email]}):null,e.jsxs("span",{className:"text-ink-secondary",children:[" · ",U.scopes.includes("admin")?t("remote.serverPairing.scope.admin"):t("remote.serverPairing.scope.client")," · ",t("remote.serverPairing.seen",{when:Rs(U.lastSeenAt,se)}),U.id===N?` · ${t("remote.serverPairing.thisBrowser")}`:""]})]}),U.id===N?null:e.jsx("button",{type:"button",onClick:()=>{E(U.id)},className:ia,children:t("remote.serverPairing.signOut")})]},U.id))}),S?e.jsx("p",{className:"mt-3 text-[13px] text-danger",children:S}):null]})})}const tx="rounded-lg border border-hairline/40 px-3 py-1.5 text-[12px] text-ink hover:bg-control disabled:opacity-40";function sx(s){return s?.on?s.origin?t(s.https?"devices.computers.https":"devices.computers.http",{address:s.origin}):t("devices.computers.waiting",{app:Se()}):null}function nx({c:s,state:n,blocked:a,simple:i}){const r=n.routes?.tailscale?.computers===!0,c=sx(n.tailnetShare);return e.jsxs("div",{className:"flex flex-col gap-3 border-t border-hairline/30 pt-4","data-route-row":"tailscale-computers",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[13px] text-ink",children:t("devices.computers.title")}),e.jsx("div",{className:"mt-0.5 text-[12px] leading-relaxed text-ink-secondary",children:t("devices.computers.detail")}),r&&c&&e.jsx("div",{"data-tailnet-share":!0,className:"mt-1 break-words text-[12px] leading-relaxed text-ink","aria-live":"polite",children:c})]}),e.jsx("button",{type:"button",className:tx,disabled:s.busy||s.accountBusy||!!a&&!r,title:a??void 0,onClick:()=>{s.act(o=>o.setTailscaleComputers?.(!r)??o.state())},children:r?t("devices.route.turnOff"):t("devices.route.turnOn")})]}),r&&n.tailnetShare?.origin&&e.jsx(ur,{simple:i,reveal:!1})]})}const ax=s=>s.routes?Object.values(s.routes).some(n=>n.on):s.enabled;function ix(s){if(s.tailscaleProblem==="not-installed")return{kind:"not-installed",title:t("remote.tailscale.notInstalled"),detail:""};if(s.tailscaleProblem==="no-cli")return{kind:"signed-out",title:t("remote.tailscale.noCli"),detail:""};if(s.tailscaleProblem==="not-running")return{kind:"signed-out",title:t("remote.tailscale.notRunning"),detail:""};if(s.tailscaleProblem==="needs-permission")return{kind:"signed-out",title:t("remote.tailscale.needsPermission",{app:Se()}),detail:""};if(s.tailscaleProblem==="signed-out")return{kind:"signed-out",title:t("remote.tailscale.signIn"),detail:""};if(s.error)return{kind:"error",title:t("remote.status.attention"),detail:s.error};const n=s.routes?.tailscale;if(!n?.on)return{kind:"off",title:t("remote.status.off"),detail:""};if(!n.name)return{kind:"magicdns",title:t("remote.tailscale.magicDns"),detail:t("remote.tailscale.magicDnsDetail")};const a=t("remote.tailscale.ready",{name:n.name});return s.enabled?{kind:"ready",title:a,detail:t("remote.tailscale.readyDetail")}:{kind:"waiting",title:a,detail:t("remote.tailscale.linkOff")}}function $t(s,n){return s.setTailscale?s.setTailscale(n):n?s.refreshTailscale():s.state()}const rx={wifi:"remote.notice.wifi",relay:"remote.notice.relay",tailscale:"remote.notice.tailscale",https:"remote.notice.https"};function ra({c:s,notices:n}){return n.length===0?null:e.jsx("div",{className:"flex flex-col gap-2","data-route-notices":"",children:n.map(a=>e.jsxs("div",{role:"status","data-route-notice":a,className:"flex flex-wrap items-center justify-between gap-3 rounded-xl bg-inset px-3 py-2.5 text-[13px] text-ink",children:[e.jsx("span",{className:"min-w-0",children:t(rx[a])}),e.jsxs("span",{className:"flex shrink-0 gap-2",children:[e.jsx("button",{type:"button",disabled:s.busy,className:"rounded-lg border border-hairline/40 px-2.5 py-1 text-[12px] hover:bg-control disabled:opacity-40",onClick:()=>{s.act(i=>a==="tailscale"?$t(i,!1):i.setRoute?.(a,!1)??i.state())},children:t("remote.notice.turnOff")}),e.jsx("button",{type:"button",disabled:s.busy,className:"rounded-lg px-2.5 py-1 text-[12px] text-ink-secondary hover:bg-control disabled:opacity-40",onClick:()=>{s.act(i=>i.dismissNotice?.(a)??i.state())},children:t("common.ok")})]})]},a))})}function lx(s,n){return s?.paused===!0&&s.available&&n?.enabled===!0&&!n.error&&n.devices.length>0}const pr=s=>{const n=Math.round((Date.now()-s)/1e3);if(n<90)return t("remote.time.justNow");const a=Math.round(n/60);if(a<60)return t("remote.time.minutes",{count:a});const i=Math.round(a/60);return i<24?t("remote.time.hours",{count:i}):t("remote.time.days",{count:Math.round(i/24)})},ox=s=>{try{return new URL(s).host}catch{return s}},Kt={wifi:{name:"devices.route.wifi",detail:"devices.route.wifiDetail"},relay:{name:"devices.route.relay",detail:"devices.route.relayDetail"}},Fe="rounded-lg border border-hairline/40 px-3 py-1.5 text-[12px] text-ink hover:bg-control disabled:opacity-40";function mr(s,n){return s?.on?n===0?t("devices.route.waiting"):s.since?t("devices.route.onSince",{date:new Date(s.since).toLocaleDateString(void 0,{month:"short",day:"numeric"})}):t("devices.route.on"):t("devices.route.off")}function ln(s,n,a){return n==="tailscale"?$t(s,a):s.setRoute?.(n,a)??(a?s.start([n]):s.state())}function la({c:s,state:n,route:a,blocked:i}){const r=n.routes?.[a];return e.jsxs("div",{className:"flex items-center justify-between gap-4 py-3","data-route-row":a,children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[13px] text-ink",children:t(Kt[a].name,{app:Se()})}),e.jsxs("div",{className:"mt-0.5 text-[12px] leading-relaxed text-ink-secondary",children:[mr(r,n.devices.length)," · ",t(Kt[a].detail,{app:Se()})]})]}),e.jsx("button",{type:"button",className:Fe,disabled:s.busy||!!i&&!r?.on,title:i??void 0,onClick:()=>{s.act(c=>ln(c,a,!r?.on))},children:r?.on?t("devices.route.turnOff"):t("devices.route.turnOn")})]})}const oa='button:not([disabled]), a[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), summary, [tabindex]:not([tabindex="-1"])';function ca({c:s,state:n,onClose:a,secureAddress:i=!1}){const[r,c]=l.useState({wifi:!0,relay:!0}),o=["wifi","relay"],d=o.some(g=>n.routes?.[g]?.on)||n.routes?.tailscale?.on===!0,[u,p]=l.useState(d||i?"pairing":"consent"),{start:m}=s;l.useEffect(()=>{i&&m()},[i,m]);const x=o.filter(g=>r[g]),h=async()=>{for(const g of x)await s.act(v=>ln(v,g,!0));p("pairing"),s.useLocal()},f=u==="consent"?a:()=>{s.cancel(),a()},b=l.useRef(null);l.useEffect(()=>{const g=document.activeElement instanceof HTMLElement?document.activeElement:null,v=b.current;return v&&!v.contains(document.activeElement)&&v.querySelector(oa)?.focus(),()=>{g?.isConnected&&g.focus()}},[]),l.useEffect(()=>{const g=v=>{const C=b.current;if(!C||v.defaultPrevented||v.isComposing||v.key!=="Escape"&&v.key!=="Tab")return;if(v.preventDefault(),v.key==="Escape"){f();return}const w=[...C.querySelectorAll(oa)].filter(j=>j.getClientRects().length);if(!w.length)return;const N=w.indexOf(document.activeElement),I=N<0?v.shiftKey?-1:0:N+(v.shiftKey?-1:1);w.at(I%w.length).focus()};return window.addEventListener("keydown",g,!0),()=>window.removeEventListener("keydown",g,!0)},[f]);const y=e.jsx("div",{ref:b,role:"dialog","aria-modal":"true","aria-label":u==="consent"?t("devices.pair.title"):t("devices.pair.titlePhone"),className:"fixed inset-0 z-50 flex items-center justify-center bg-black/30 p-4","data-pair-dialog":u,children:e.jsxs("div",{className:"flex max-h-full w-full max-w-[460px] flex-col gap-4 overflow-y-auto rounded-2xl bg-card p-5 shadow-xl",children:[e.jsx("div",{className:"text-[15px] font-semibold text-ink",children:u==="consent"?t("devices.pair.title"):t("devices.pair.titlePhone")}),u==="consent"?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex flex-col gap-2 text-[13px] text-ink",children:[e.jsx("div",{children:t("devices.pair.willTurnOn",{app:Se()})}),o.map(g=>e.jsxs("label",{className:"flex items-start gap-2",children:[e.jsx("input",{type:"checkbox",className:"mt-0.5",checked:r[g],onChange:v=>c(C=>({...C,[g]:v.target.checked}))}),e.jsxs("span",{children:[t(Kt[g].name,{app:Se()}),g==="relay"&&e.jsx("span",{className:"block text-[12px] text-ink-secondary",children:t(Kt.relay.detail,{app:Se()})})]})]},g)),e.jsx("div",{className:"text-[12px] text-ink-secondary",children:t("devices.pair.changeLater")}),x.length===0&&e.jsx("div",{role:"alert",className:"text-[12px] text-danger",children:t("devices.pair.pickOne")})]}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",className:Fe,onClick:f,children:t("common.cancel")}),e.jsx("button",{type:"button",disabled:x.length===0||s.busy,onClick:()=>{h()},className:"rounded-lg bg-accent px-3 py-1.5 text-[12px] font-medium text-white disabled:opacity-40",children:t("devices.route.turnOn")})]})]}):e.jsxs(e.Fragment,{children:[e.jsx($m,{controller:s}),e.jsx("div",{className:"text-[12px] leading-relaxed text-ink-secondary",children:xr(n)}),e.jsx("div",{className:"flex justify-end",children:e.jsx("button",{type:"button",className:Fe,onClick:f,children:t("devices.pair.done")})})]})]})});return e.jsx(Ys,{modal:!0,children:y})}function cx({c:s,state:n}){const a=n.pairing;if(!a)return null;const i=new Date(a.expiresAt).toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit"});return e.jsxs("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-hairline/40 bg-card px-3 py-2.5","data-open-code":"",children:[e.jsx("div",{className:"min-w-0 text-[13px] text-ink",children:t("devices.openCode",{until:i})}),e.jsx("button",{type:"button",className:Fe,disabled:s.busy,onClick:()=>{s.act(r=>r.pairing(!1,a.token))},children:t("devices.revoke")})]})}function xr(s){const n=i=>s.routes?.[i]?.on===!0,a=[n("wifi")&&t("devices.reach.wifi"),n("tailscale")&&t("devices.reach.tailscale"),n("https")&&t("devices.reach.https",{app:Se()}),n("relay")&&t("devices.reach.relay",{app:Se()})].filter(i=>!!i);return a.length===0?t("devices.reach.none"):t("devices.reach.line",{ways:new Intl.ListFormat(void 0,{type:"conjunction"}).format(a)})}function dx({profileEmail:s="",focusRequest:n=0,simple:a=!1}){const i=Um(s),r=i.state,c=l.useRef(null),o=l.useRef(0),d=!!r,[u,p]=l.useState(!1),[m,x]=l.useState(!a);l.useEffect(()=>{n?o.current!==n&&Ii(c.current)&&(o.current=n):o.current=0},[n,d]);const h=l.useRef(!1),f=lx(i.account,r),{accountAct:b}=i;l.useEffect(()=>{!f||h.current||!Ze()?.prepare||(h.current=!0,b(S=>S.prepare?.()??S.state()))},[f,b]);const y=G().state.config?.managedPolicy,g=y?.remoteAccess===!1?t("policy.remoteBlocked",{organization:y.organizationName}):null,v=y?.remoteAccess===!1?t("policy.managedBy",{organization:y.organizationName}):null;if(!ct())return null;if(!r)return e.jsx(X,{title:t("devices.title"),subtitle:t("remote.checking"),children:e.jsx(q,{size:15,className:"animate-spin text-ink-secondary"})});const C=r.devices.length,w=dr(i.account,i.accountError),N=ix(r),I=r.routes?.tailscale?.on===!0,j=r.routes?.https?.on===!0,L=r.endpoints?.find(S=>S.kind==="hosted"),k=i.busy||g?void 0:()=>p("device"),P=S=>e.jsx("button",{type:"button",disabled:i.busy||!!g,title:v??void 0,onClick:()=>p("device"),className:"w-fit rounded-lg bg-accent px-3 py-2 text-[13px] font-medium text-white disabled:opacity-40","data-pair-device":"",children:S});return a&&!m?e.jsxs("div",{className:"flex flex-col gap-3",ref:c,tabIndex:-1,"data-phone-pairing":"computer",children:[e.jsx(ra,{c:i,notices:r.notices??[]}),C===0?e.jsxs("div",{className:"flex items-center justify-between gap-4 rounded-xl border border-hairline/40 bg-card px-4 py-3",children:[e.jsx("div",{className:"text-[13px] text-ink",children:t("devices.simple.setUpTitle",{app:Se()})}),e.jsx("button",{type:"button",className:Fe,disabled:i.busy||!!g,onClick:()=>p("device"),children:t("devices.simple.setUp")})]}):e.jsxs("div",{className:"flex flex-col gap-3 rounded-xl border border-hairline/40 bg-card px-4 py-3",children:[e.jsx("div",{className:"text-[13px] font-medium text-ink",children:t("devices.simple.yourPhone")}),e.jsx(na,{c:i,state:r,onPairAgain:k}),e.jsxs("div",{className:"text-[12px] text-ink-secondary",children:[xr(r)," ",e.jsx("button",{type:"button",className:"text-accent hover:underline",onClick:()=>x(!0),children:t("devices.change")})]}),P(t("devices.pairAnother"))]}),u&&e.jsx(ca,{c:i,state:r,onClose:()=>p(!1)})]}):e.jsxs("div",{className:"flex flex-col gap-4",ref:c,tabIndex:-1,"data-phone-pairing":"computer",children:[g&&e.jsx("p",{role:"status",className:"text-[13px] leading-relaxed text-ink-secondary",children:g}),e.jsx("p",{className:"text-[13px] leading-relaxed text-ink-secondary",children:t("devices.intro")}),P(t("devices.pair")),e.jsx(ra,{c:i,notices:r.notices??[]}),u&&e.jsx(ca,{c:i,state:r,onClose:()=>p(!1),secureAddress:u==="https"}),e.jsxs("section",{className:"flex flex-col gap-2","data-devices-block":"paired",children:[e.jsx("div",{className:"text-[13px] font-medium text-ink",children:t("devices.paired")}),xo(i.account,r)&&e.jsx("p",{role:"status","data-devices-notice":"tunnel-retired",className:"rounded-xl bg-inset px-3 py-2.5 text-[13px] leading-relaxed text-ink",children:t("remote.devices.retiredNotice")}),e.jsx(cx,{c:i,state:r}),C?e.jsx(na,{c:i,state:r,onPairAgain:k}):!r.pairing&&e.jsx("div",{className:"text-[12px] text-ink-secondary",children:t("devices.pairedNone")}),e.jsx(Km,{})]}),e.jsxs("section",{className:"flex flex-col rounded-xl border border-hairline/40 bg-card px-4","data-devices-block":"routes",children:[e.jsx("div",{className:"pt-3 text-[13px] font-medium text-ink",children:t("devices.howTheyReach")}),e.jsx(la,{c:i,state:r,route:"wifi",blocked:v}),e.jsx("div",{className:"border-t border-hairline/30",children:e.jsx(la,{c:i,state:r,route:"relay",blocked:v})}),e.jsxs("details",{className:"border-t border-hairline/30 py-3",open:I||j||void 0,children:[e.jsx("summary",{className:"cursor-pointer text-[13px] text-ink",children:t("devices.moreWays")}),e.jsxs("div",{className:"mt-3 flex flex-col gap-4","data-route-row":"tailscale",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[13px] text-ink",children:"Tailscale"}),e.jsx("div",{className:"mt-0.5 text-[12px] leading-relaxed text-ink-secondary",children:t("remote.tailscaleSwitch.detail",{app:Se()})})]}),e.jsx("button",{type:"button",className:Fe,disabled:i.busy||i.accountBusy||!!v&&!I,onClick:()=>{i.act(S=>$t(S,!I))},children:I?t("devices.route.turnOff"):t("devices.route.turnOn")})]}),N.kind!=="off"&&e.jsxs("div",{"data-tailscale-status":N.kind,className:"rounded-xl bg-inset px-3 py-3","aria-live":"polite",children:[e.jsxs("div",{className:"flex items-start gap-2.5",children:[e.jsx(Gs,{size:16,className:`mt-0.5 shrink-0 ${N.kind==="ready"?"text-success":"text-ink-secondary"}`}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[13px] font-medium text-ink",children:N.title}),N.detail&&e.jsx("div",{className:"mt-0.5 text-[12px] leading-relaxed text-ink-secondary",children:N.detail})]})]}),e.jsxs("div",{className:"mt-3 flex flex-wrap gap-2",children:[I&&N.kind!=="error"&&e.jsx("button",{type:"button",className:Fe,disabled:i.busy||i.accountBusy,onClick:i.refreshTailscale,children:i.busy?t("common.checking"):t("remote.checkAgain")}),N.kind==="not-installed"&&e.jsx("a",{href:"https://tailscale.com/download",target:"_blank",rel:"noreferrer",className:Fe,children:t("remote.tailscale.getIt")}),N.kind==="signed-out"&&e.jsx("button",{type:"button",className:Fe,disabled:i.busy||i.accountBusy,onClick:()=>{i.act(S=>$t(S,!0))},children:t("common.tryAgain")})]})]}),I&&r.routes?.tailscale?.name&&e.jsx(nx,{c:i,state:r,blocked:v,simple:a}),e.jsxs("div",{className:"flex items-start justify-between gap-4 border-t border-hairline/30 pt-4","data-route-row":"https",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[13px] text-ink",children:t("devices.route.https")}),e.jsxs("div",{className:"mt-0.5 text-[12px] leading-relaxed text-ink-secondary",children:[j&&L?t("devices.route.httpsOn",{address:ox(L.url)}):mr(r.routes?.https,C)," · ",t("devices.route.httpsDetail",{app:Se()})]}),i.account?.status==="ready"&&e.jsx("div",{className:"mt-1 text-[12px] text-ink-secondary",children:t("remote.account.signedIn",{email:i.account.email??t("remote.account.yourAccount")})}),w&&e.jsx("div",{className:"mt-1 text-[12px] text-danger",children:w})]}),j?e.jsx("button",{type:"button",className:Fe,disabled:i.busy,onClick:()=>{i.act(S=>ln(S,"https",!1))},children:t("devices.route.turnOff")}):e.jsx("button",{type:"button",className:Fe,disabled:i.busy||i.accountBusy||!!v,onClick:()=>p("https"),children:t("devices.route.setUp")})]})]})]})]}),e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-[13px] text-ink",children:t("remote.keepAwake")}),e.jsx("div",{className:"mt-0.5 text-[12px] leading-relaxed text-ink-secondary",children:t("remote.keepAwakeDetail")})]}),e.jsx(fe,{checked:r.keepAwake,"aria-label":t("remote.keepAwakeAria"),disabled:i.busy||!ax(r),onClick:()=>{i.act(S=>S.keepAwake(!r.keepAwake))}})]}),a&&e.jsx("button",{type:"button",className:"w-fit text-[12px] text-accent hover:underline",onClick:()=>x(!1),children:t("devices.done")}),(i.error||r.error)&&e.jsx("div",{className:"text-[12px] text-danger",children:i.error??r.error})]})}function ux(s){const n=s.trim().toLowerCase();return!n||/\s/.test(n)?null:n.startsWith("@")?/^@[^@\s]+\.[^@\s]+$/.test(n)?n:null:/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(n)?n:null}function da(s,n,a){const i=s.admins.filter(c=>c!==n),r=s.members.filter(c=>c!==n);return a==="admin"?{admins:[...i,n],members:r}:{admins:i,members:[...r,n]}}function px(s,n){return{admins:s.admins.filter(a=>a!==n),members:s.members.filter(a=>a!==n)}}function ua(s,n){const a=s.replace(/\/+$/,"");return n.startsWith("@")?`${a}/pair`:`${a}/pair?email=${encodeURIComponent(n)}`}function mx(s,n,a){const i=[],r=new Set,c=(o,d)=>{const u=o.trim().toLowerCase();if(!u||r.has(u))return;r.add(u);const p=n.filter(x=>x.email?.toLowerCase()===u),m=a.find(x=>x.key===`user:${u}`);i.push({entry:u,role:d,isDomain:u.startsWith("@"),lastSeenAt:p.length?Math.max(...p.map(x=>x.lastSeenAt)):null,devices:p.length,turns:m?.turns??0,costUsd:m?.costUsd??null,...yt(m?.estimatedUsd)&&m.estimatedUsd>0?{estimated:!0}:{}})};for(const o of s.admins)c(o,"admin");for(const o of s.members)c(o,"member");return i}function xx(s,n){const a=new Map;for(const i of s){const r=i.email?.trim().toLowerCase();r&&a.set(r,[...a.get(r)??[],i])}return[...a.entries()].map(([i,r])=>{const c=n.find(o=>o.key===`user:${i}`);return{entry:i,role:r.some(o=>o.scopes?.includes("admin"))?"admin":"member",isDomain:!1,lastSeenAt:Math.max(...r.map(o=>o.lastSeenAt)),devices:r.length,turns:c?.turns??0,costUsd:c?.costUsd??null}}).sort((i,r)=>i.role===r.role?i.entry.localeCompare(r.entry):i.role==="admin"?-1:1)}function hx(s,n=Date.now()){return s===null?t("people.never"):n-s<1440*6e4?t("people.today"):new Date(s).toISOString().slice(0,10)}function hr({people:s,busy:n,onRole:a,onRemove:i,onLink:r,readOnly:c=!1}){if(s.length===0)return e.jsx("p",{className:"text-[13px] text-ink-secondary",children:t(c?"people.portal.empty":"people.empty")});const o="grid grid-cols-[1fr_auto_auto_auto_auto] items-center gap-x-4";return e.jsxs("div",{className:"flex flex-col",children:[e.jsxs("div",{className:O(o,"border-b border-hairline/40 pb-2 text-[12px] font-medium uppercase tracking-wide text-ink-secondary"),children:[e.jsx("span",{children:t("people.colPerson")}),e.jsx("span",{children:t("people.colRole")}),e.jsx("span",{className:"text-right",children:t("people.colLastSeen")}),e.jsx("span",{className:"text-right",children:t("people.colMonth")}),e.jsx("span",{})]}),s.map(d=>e.jsxs("div",{className:O(o,"border-b border-hairline/20 py-2 text-[13px]"),children:[e.jsxs("span",{className:"min-w-0",children:[e.jsx("span",{className:"block truncate text-ink",children:d.isDomain?t("people.everyoneAt",{domain:d.entry.slice(1)}):d.entry}),d.devices>0&&e.jsx("span",{className:"block text-[12px] text-ink-secondary",children:t("people.devices",{count:String(d.devices)})})]}),e.jsx("span",{className:O("rounded-full px-2 py-0.5 text-[11px] font-medium",d.role==="admin"?"bg-accent/15 text-accent":"bg-control text-ink-secondary"),children:d.role==="admin"?t("people.roleAdmin"):t("people.roleMember")}),e.jsx("span",{className:"text-right tabular-nums text-ink-secondary",children:d.isDomain?"—":hx(d.lastSeenAt)}),e.jsx("span",{className:"text-right tabular-nums text-ink",title:t("people.turns",{turns:String(d.turns)}),children:yt(d.costUsd)?`${d.estimated?"~":""}${vt(d.costUsd)}`:"—"}),c?e.jsx("span",{}):e.jsxs("span",{className:"flex items-center justify-end gap-2 text-[12px]",children:[e.jsx("button",{type:"button",disabled:n,onClick:()=>r(d),"aria-label":t("people.link"),title:t("people.link"),className:"rounded-md p-1 text-ink-secondary hover:bg-control hover:text-ink disabled:opacity-50",children:e.jsx(ho,{size:13})}),e.jsx("button",{type:"button",disabled:n,onClick:()=>a(d,d.role==="admin"?"member":"admin"),className:"text-ink-secondary hover:text-ink disabled:opacity-50",children:d.role==="admin"?t("people.makeMember"):t("people.makeAdmin")}),e.jsx("button",{type:"button",disabled:n,onClick:()=>i(d),className:"text-danger hover:underline disabled:opacity-50",children:t("people.remove")})]})]},d.entry))]})}function gr({link:s}){const{state:n,copy:a}=Qt(s);return e.jsxs("div",{className:"mt-3 rounded-lg border border-hairline/40 bg-inset p-3 text-[13px]",children:[e.jsx("div",{className:"mb-1 text-ink-secondary",children:t("people.link")}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("code",{className:"min-w-0 flex-1 select-all break-all text-ink",children:s}),e.jsxs("button",{type:"button",onClick:a,className:"flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[12px] text-ink-secondary hover:bg-control hover:text-ink",children:[n==="copied"?e.jsx(ve,{size:13,className:"text-success"}):n==="failed"?e.jsx(We,{size:13,className:"text-danger"}):e.jsx(Js,{size:13}),t(n==="copied"?"people.copied":n==="failed"?"common.copyFailed":"people.copy")]})]}),e.jsx("p",{className:"mt-2 text-[12px] leading-relaxed text-ink-secondary",children:t("people.linkHint")})]})}function gx({peopleUrl:s,people:n}){const a=()=>{};return e.jsxs(X,{title:t("people.title"),subtitle:t("people.portal.subtitle"),children:[e.jsxs("div",{"data-people-portal":!0,className:"flex flex-col gap-3 text-[13px] leading-relaxed text-ink-secondary",children:[e.jsx("p",{children:t("people.portal.managed")}),s&&e.jsxs("a",{href:s,target:"_blank",rel:"noopener noreferrer",className:"flex w-fit items-center gap-2 rounded-lg bg-control px-3 py-2 font-medium text-ink hover:bg-control/70",children:[t("people.portal.open")," ",e.jsx(Nt,{size:14,"aria-hidden":"true"})]})]}),e.jsx("div",{className:"mt-4",children:e.jsx(hr,{people:n,busy:!1,readOnly:!0,onRole:a,onRemove:a,onLink:a})}),e.jsx("p",{className:"mt-3 text-[12px] leading-relaxed text-ink-secondary",children:t("people.portal.note")})]})}function fr({simple:s=!1,startOpen:n=!1}){const[a,i]=l.useState(n),[r,c]=l.useState(!1),[o,d]=l.useState(null),[u,p]=l.useState(null),[m,x]=l.useState(null),[h,f]=l.useState([]),[b,y]=l.useState(typeof window<"u"?window.location.origin:""),[g,v]=l.useState(null),[C,w]=l.useState(""),[N,I]=l.useState("member"),[j,L]=l.useState(null),[k,P]=l.useState(!1),[S,M]=l.useState(!1),[se,ne]=l.useState(null),V=l.useCallback(async()=>{M(!0),ne(null);try{const[R,E,D,Q,le]=await Promise.all([F("/api/config"),F("/api/auth/sessions").catch(()=>({sessions:[]})),F("/api/usage?groupBy=user").catch(()=>({groups:[]})),F("/api/settings/custom-domain").catch(()=>null),fetch("/.well-known/openmausbot/environment").then(ce=>ce.ok?ce.json():null).catch(()=>null)]),ae={admins:Array.isArray(R?.signIn?.admins)?R.signIn.admins:[],members:Array.isArray(R?.signIn?.members)?R.signIn.members:[]},U=Pi(R);p(U),x(ae);const te=Array.isArray(E?.sessions)?E.sessions:[],me=Array.isArray(D?.groups)?D.groups:[];f(U.authority==="portal"?xx(te,me):mx(ae,te,me)),typeof Q?.publicUrl=="string"&&Q.publicUrl&&y(Q.publicUrl),v(le?.capabilities?.emailSignIn===!0?!0:le?!1:null)}catch(R){ne(R instanceof Error?R.message:String(R))}finally{M(!1)}},[]);l.useEffect(()=>{Ai().then(R=>{d(R),bt(R)&&V()})},[V]);const ie=async R=>{P(!0),ne(null);try{await F("/api/config",{method:"PUT",body:JSON.stringify({signIn:R})}),await V()}catch(E){ne(E instanceof Error?E.message:String(E))}finally{P(!1)}},re=async()=>{if(c(!0),!m||k)return;const R=ux(C);if(!R){ne(t("remote.signInAccess.invalid"));return}await ie(da(m,R,N)),w(""),L(ua(b,R))};if(!bt(o))return null;const oe=u?.authority==="portal"?e.jsx(gx,{peopleUrl:u.peopleUrl,people:h}):null,T=e.jsxs(e.Fragment,{children:[g===!1&&(!s||r)&&e.jsx("p",{className:"mb-3 rounded-lg border border-warning/25 bg-warning/5 px-3 py-2 text-[13px] text-ink-secondary",children:t(u?.pairingCodes===!1?"people.portalSignIn":"people.notHosted")}),e.jsxs("form",{className:"flex flex-wrap items-center gap-2",onSubmit:R=>{R.preventDefault(),re()},children:[e.jsx("input",{value:C,onChange:R=>w(R.target.value),placeholder:t("remote.signInAccess.placeholder"),"aria-label":t("people.inviteEmail"),disabled:k,className:"min-w-[16rem] flex-1 rounded-lg border border-hairline/40 bg-inset px-3 py-2 text-[13px] text-ink placeholder:text-ink-secondary focus:outline-none disabled:opacity-50"}),e.jsxs(ye,{value:N,onChange:R=>I(R.target.value),"aria-label":t("people.colRole"),disabled:k,children:[e.jsx("option",{value:"member",children:t("people.roleMember")}),e.jsx("option",{value:"admin",children:t("people.roleAdmin")})]}),e.jsxs("button",{type:"submit",disabled:k||!C.trim(),className:"ui-button ui-button-primary",children:[k?e.jsx(q,{size:13,className:"animate-spin"}):e.jsx(Oe,{size:13}),t("people.invite")]}),e.jsx("button",{type:"button",onClick:()=>{V()},disabled:S||k,"aria-label":t("people.refresh"),title:t("people.refresh"),className:"rounded-md p-1.5 text-ink-secondary hover:bg-control hover:text-ink disabled:opacity-50",children:e.jsx(De,{size:13,className:O(S&&"animate-spin")})})]}),e.jsx("p",{className:"mt-2 text-[12px] leading-relaxed text-ink-secondary",children:t("people.inviteHint")}),j&&e.jsx(gr,{link:j}),se&&e.jsx("p",{role:"alert",className:"mt-2 text-[12px] text-danger",children:se}),e.jsx("div",{className:"mt-4",children:e.jsx(hr,{people:h,busy:k,onRole:(R,E)=>{m&&ie(da(m,R.entry,E))},onRemove:R=>{m&&ie(px(m,R.entry))},onLink:R=>L(ua(b,R.entry))})}),!s&&e.jsx("p",{className:"mt-3 text-[12px] leading-relaxed text-ink-secondary",children:t("people.note")})]});return s?e.jsxs("div",{"data-people-summary":"",children:[e.jsxs("div",{role:"group","aria-label":t("people.title"),className:"flex min-w-0 items-center gap-3 px-4 py-[13px]",children:[e.jsx("span",{"aria-hidden":"true",className:"flex size-11 shrink-0 items-center justify-center rounded-full bg-ink/[0.06] text-ink-secondary",children:e.jsx(Ut,{size:20})}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("div",{className:"truncate text-[14px] leading-5 text-ink",children:t("people.title")}),e.jsx("div",{className:"text-[13px] leading-[18px] text-ink-secondary",children:t("settings.simple.people")})]}),e.jsx("button",{type:"button","aria-expanded":a,className:"ui-button shrink-0",onClick:()=>i(!a),children:a?t("common.done"):t("settings.simple.people.invite")})]}),a&&e.jsx("div",{className:"px-3.5 pb-3.5 pt-1",children:oe??T})]}):oe??e.jsx(X,{title:t("people.title"),subtitle:t("people.subtitle"),children:T})}const ks="rounded-lg border border-hairline/40 bg-inset px-3 py-2 text-[13px] text-ink placeholder:text-ink-secondary focus:outline-none [color-scheme:dark]";function fx({entry:s}){const[n,a]=l.useState(!1),i=s.type==="admin"&&(s.changed?.length||s.before||s.after);return e.jsx("li",{className:"border-b border-hairline/20 py-2 text-[13px]","data-activity-entry":s.type,children:e.jsxs("div",{className:"grid grid-cols-[auto_1fr] items-start gap-x-3",children:[e.jsx("time",{className:"whitespace-nowrap tabular-nums text-ink-secondary",dateTime:s.at,children:new Date(s.at).toLocaleString(Us())}),e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex flex-wrap items-baseline gap-x-2",children:[e.jsx("span",{className:"font-medium text-ink",children:_d(s.who)}),e.jsx("span",{className:"min-w-0 break-words text-ink",children:$d(s)})]}),s.type==="approval"&&s.summary&&e.jsx("div",{className:"mt-0.5 truncate text-[12px] text-ink-secondary",children:go(s.summaryCode,s.summary,s.summaryParams)}),i&&e.jsxs("button",{type:"button",onClick:()=>a(!n),"aria-expanded":n,className:"cursor-pointer mt-0.5 flex items-center gap-1 text-[12px] text-ink-secondary hover:text-ink",children:[e.jsx(Xs,{size:12,className:O("transition-transform",n&&"rotate-90")}),t("activity.changed",{paths:(s.changed??[]).join(", ")||"—"})]}),i&&n&&s.type==="admin"&&e.jsxs("dl",{className:"mt-1 grid grid-cols-[auto_1fr_1fr] gap-x-3 gap-y-0.5 rounded-lg bg-inset p-2 text-[12px]",children:[e.jsx("dt",{}),e.jsx("dd",{className:"text-ink-secondary",children:t("activity.before")}),e.jsx("dd",{className:"text-ink-secondary",children:t("activity.after")}),(s.changed??Object.keys({...s.before,...s.after})).map(r=>e.jsxs("div",{className:"contents",children:[e.jsx("dt",{className:"font-mono text-ink-secondary",children:r}),e.jsx("dd",{className:"min-w-0 break-all font-mono text-ink",children:Dn(s.before?.[r])}),e.jsx("dd",{className:"min-w-0 break-all font-mono text-ink",children:Dn(s.after?.[r])})]},r))]})]})]})})}function br(){const[s,n]=l.useState({who:"",what:"all",from:"",to:""}),[a,i]=l.useState([]),[r,c]=l.useState(0),[o,d]=l.useState(null),[u,p]=l.useState(!1),[m,x]=l.useState(null),h=Dd(s),f=l.useCallback(async()=>{p(!0),x(null);try{const y=await F(`/api/admin-activity${h}`);i(y.entries),c(y.total),d(y.retentionDays)}catch(y){x(y instanceof Error?y.message:String(y))}finally{p(!1)}},[h]);l.useEffect(()=>{const y=window.setTimeout(()=>{f()},250);return()=>window.clearTimeout(y)},[f]);const b=y=>n(g=>({...g,...y}));return e.jsxs(X,{title:t("activity.title"),subtitle:t("activity.subtitle",{days:String(o??180)}),children:[e.jsxs("div",{className:"flex flex-wrap items-end gap-2",children:[e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] text-ink-secondary",children:[t("activity.who"),e.jsx("input",{value:s.who,onChange:y=>b({who:y.target.value}),placeholder:t("activity.whoPlaceholder"),className:O(ks,"w-44")})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] text-ink-secondary",children:[t("activity.what"),e.jsx(ye,{value:s.what,onChange:y=>b({what:y.target.value}),children:Ud.map(y=>e.jsx("option",{value:y,children:t(`activity.what.${y}`)},y))})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] text-ink-secondary",children:[t("activity.from"),e.jsx("input",{type:"date",value:s.from,max:s.to||void 0,onChange:y=>b({from:y.target.value}),className:ks})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-[12px] text-ink-secondary",children:[t("activity.to"),e.jsx("input",{type:"date",value:s.to,min:s.from||void 0,onChange:y=>b({to:y.target.value}),className:ks})]}),e.jsx("button",{type:"button",onClick:()=>{f()},disabled:u,"aria-label":t("activity.refresh"),title:t("activity.refresh"),className:"cursor-pointer rounded-md p-2 text-ink-secondary hover:bg-control hover:text-ink disabled:opacity-50",children:u?e.jsx(q,{size:14,className:"animate-spin"}):e.jsx(De,{size:14})}),e.jsxs("a",{href:`/api/admin-activity.csv${h}`,download:!0,className:"ui-button hover:bg-raised-hover",children:[e.jsx(Vs,{size:13,"aria-hidden":"true"}),t("activity.export")]})]}),m&&e.jsx("p",{role:"alert",className:"mt-3 text-[13px] text-danger",children:t("activity.error",{message:m})}),!m&&a.length===0&&!u&&e.jsx("p",{className:"mt-4 text-[13px] text-ink-secondary",children:t("activity.empty")}),a.length>0&&e.jsx("ul",{className:"mt-3 flex flex-col",children:a.map((y,g)=>e.jsx(fx,{entry:y},`${y.at}-${g}`))}),r>a.length&&e.jsx("p",{className:"mt-3 text-[12px] text-ink-secondary",children:t("activity.more",{shown:String(a.length),total:String(r)})})]})}const pa=4,on="flex w-full min-w-0 items-center gap-3 px-3 py-2 text-start",cn="flex flex-col divide-y divide-hairline/30 overflow-hidden rounded-xl border border-hairline/40 bg-card",bx=s=>s.filter(n=>!n.hidden&&!n.defaultBot?.person).sort((n,a)=>n.name.localeCompare(a.name)),yr=(s,n)=>Jt(s)===n||pi(Yt(s),n)!=="none",vr=(s,n)=>{const a=di(s,n);return a?t("lookedAfter.line",{name:a.name}):t("lookedAfter.nobody")},ma=(s,...n)=>n.some(a=>a?.toLowerCase().includes(s));function yx(){const{state:s}=G(),n=fo(),a=bo(),i=l.useRef(null),[r,c]=l.useState("bot"),[o,d]=l.useState(""),[u,p]=l.useState(null),[m,x]=l.useState(null),h=l.useRef(null),[f,b]=l.useState(null),[y,g]=l.useState(""),v=l.useCallback(()=>b(null),[]);if(l.useEffect(()=>{m||!h.current||([...i.current?.querySelectorAll("[data-access-person]")??[]].find(k=>k.dataset.accessPerson===h.current)?.focus(),h.current=null)},[m]),!n||!a)return null;const C=n.people.filter(k=>k.role==="member").sort((k,P)=>k.name.localeCompare(P.name)),w=bx(s.bots),N=u?w.find(k=>k.id===u):void 0,I=m?C.find(k=>k.email===m):void 0,j=o.trim().toLowerCase(),L=async(k,P,S)=>{g("");const M=Yt(k);try{await En(k.id,P),b({botId:k.id,before:M,after:P,text:S})}catch(se){g(se instanceof Error?se.message:String(se))}};return e.jsxs("div",{ref:i,className:"flex min-w-0 flex-col gap-3","data-access-overview":!0,children:[I?e.jsx(Nx,{person:I,bots:w.filter(k=>yr(k,I.email)),team:n,teamName:a,apply:L,onBack:()=>{h.current=I.email,x(null)}}):e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"ps-4 text-[13px] leading-relaxed text-ink-secondary",children:t("botAccess.overview.introUse",{team:a})}),e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsxs("div",{className:"relative min-w-[180px] flex-1",children:[e.jsx(jt,{size:14,"aria-hidden":"true",className:"pointer-events-none absolute start-2.5 top-1/2 -translate-y-1/2 text-ink-secondary"}),e.jsx("input",{type:"search",value:o,"data-access-search":!0,"aria-label":t(r==="bot"?"botAccess.overview.searchBots":"botAccess.overview.searchPeople"),placeholder:t(r==="bot"?"botAccess.overview.searchBots":"botAccess.overview.searchPeople"),onChange:k=>d(k.target.value),onKeyDown:k=>{k.key==="Escape"&&o&&(k.preventDefault(),d(""))},className:"w-full rounded-lg border border-hairline/50 bg-transparent py-1.5 pe-2.5 ps-8 text-[13px] text-ink placeholder:text-ink-secondary focus:border-focus focus:outline-none"})]}),e.jsx("div",{role:"group","aria-label":t("botAccess.overview.listBy"),className:"flex shrink-0 rounded-full bg-raised/70 p-0.5",children:["bot","person"].map(k=>e.jsx("button",{type:"button","aria-pressed":r===k,"data-access-listing":k,onClick:()=>{c(k),d("")},className:O("rounded-full px-3 py-1 text-[13px] leading-[18px]",r===k?"bg-menu font-medium text-ink shadow-sm":"text-ink-secondary hover:text-ink"),children:t(k==="bot"?"botAccess.overview.byBot":"botAccess.overview.byPerson")},k))})]}),r==="bot"?e.jsx(vx,{bots:w.filter(k=>!j||ma(j,k.name,di(k,n)?.name,Jt(k)??void 0)),anyBots:w.length>0,team:n,onOpen:p}):e.jsx(jx,{people:C.filter(k=>!j||ma(j,k.name,k.email)),anyPeople:C.length>0,bots:w,onOpen:x}),e.jsx("p",{className:"ps-4 text-[12px] text-ink-secondary",children:t("botAccess.admins")})]}),y&&e.jsx("p",{role:"alert",className:"text-[13px] text-danger",children:y}),N&&e.jsx(yo,{bot:N,teamName:a,onClose:()=>p(null),onChanged:k=>b({botId:N.id,...k})}),f&&e.jsx(vo,{text:f.text,onUndo:()=>En(f.botId,f.before),onDone:v},`${f.botId}:${f.text}:${JSON.stringify(f.after)}`)]})}function vx({bots:s,anyBots:n,team:a,onOpen:i}){return n?s.length?e.jsx("ul",{className:cn,children:s.map(r=>{const c=Yt(r),o=Jt(r);return e.jsx("li",{className:"min-w-0",children:e.jsxs("button",{type:"button","aria-haspopup":"dialog","data-access-row":r.id,onClick:()=>i(r.id),className:O(on,"hover:bg-ink/[0.06] focus-visible:bg-ink/[0.06] focus-visible:outline-none"),children:[e.jsx(Zt,{bot:r,size:32}),e.jsxs("span",{className:"min-w-0 flex-1",children:[e.jsx("span",{className:"block truncate text-[14px] leading-[18px] text-ink",children:r.name}),e.jsx("span",{className:"block truncate text-[12px] leading-4 text-ink-secondary",children:vr(r,a)})]}),e.jsx("span",{className:"min-w-0 max-w-[40%] truncate text-[13px] text-ink-secondary","data-access-summary":!0,children:c.everyone==="none"?t("botAccess.onlyAdded"):t("botAccess.overview.everyoneUses")}),e.jsx(kx,{entries:Object.keys(c.people).filter(d=>d!==o),team:a})]})},r.id)})}):e.jsx("p",{className:"text-[13px] text-ink-secondary",children:t("botAccess.overview.noBotMatch")}):e.jsx("p",{className:"text-[13px] text-ink-secondary",children:t("botAccess.overview.noBots")})}function kx({entries:s,team:n}){if(!s.length)return null;const a=s.map(r=>jo(r,n)).join(", "),i=s.length-pa;return e.jsxs("span",{role:"img","aria-label":a,title:a,"data-access-stack":s.length,className:"flex shrink-0 -space-x-0.5 rtl:space-x-reverse",children:[s.slice(0,pa).map(r=>e.jsx("span",{className:"flex rounded-full ring-2 ring-card",children:e.jsx(No,{person:wo(r,n),size:22})},r)),i>0&&e.jsxs("span",{className:"flex h-[22px] min-w-[22px] items-center justify-center rounded-full bg-card px-1 text-[11px] font-medium text-ink-secondary ring-2 ring-card",children:["+",i]})]})}function jx({people:s,anyPeople:n,bots:a,onOpen:i}){return n?s.length?e.jsx("ul",{className:cn,children:s.map(r=>{const c=a.filter(o=>yr(o,r.email)).length;return e.jsx("li",{className:"min-w-0",children:e.jsxs("button",{type:"button","data-access-person":r.email,onClick:()=>i(r.email),className:O(on,"hover:bg-ink/[0.06] focus-visible:bg-ink/[0.06] focus-visible:outline-none"),children:[e.jsx(ui,{person:r,size:32}),e.jsxs("span",{className:"min-w-0 flex-1",children:[e.jsx("span",{className:"block truncate text-[14px] leading-[18px] text-ink",children:r.name}),e.jsx("span",{className:"block truncate text-[12px] leading-4 text-ink-secondary",children:r.email})]}),e.jsx("span",{className:"shrink-0 text-[13px] text-ink-secondary",children:c===1?t("botAccess.overview.botCount.one"):t("botAccess.overview.botCount.other",{count:c})})]})},r.email)})}):e.jsx("p",{className:"text-[13px] text-ink-secondary",children:t("botAccess.noMatch")}):e.jsx("p",{className:"text-[13px] text-ink-secondary",children:t("botAccess.overview.noPeople")})}function Nx({person:s,bots:n,team:a,teamName:i,apply:r,onBack:c}){return e.jsxs(e.Fragment,{children:[e.jsx("div",{children:e.jsxs("button",{type:"button",autoFocus:!0,"data-access-back":!0,onClick:c,className:"-ms-2 flex items-center gap-1 rounded-md px-2 py-1 text-[13px] text-ink-secondary hover:bg-ink/[0.06] hover:text-ink",children:[e.jsx(ol,{size:14,"aria-hidden":"true",className:"rtl:-scale-x-100"}),t("botAccess.overview.allPeople")]})}),e.jsxs("div",{className:"flex min-w-0 items-center gap-3 px-3",children:[e.jsx(ui,{person:s,size:32}),e.jsxs("span",{className:"min-w-0 flex-1",children:[e.jsx("span",{className:"block truncate text-[14px] font-medium leading-[18px] text-ink",children:s.name}),e.jsx("span",{className:"block truncate text-[12px] leading-4 text-ink-secondary",children:s.email})]})]}),n.length===0?e.jsx("p",{className:"px-3 text-[13px] text-ink-secondary",children:t("botAccess.overview.noBotsForPerson",{name:s.name})}):e.jsx("ul",{className:cn,children:n.map(o=>e.jsx(wx,{bot:o,person:s,team:a,teamName:i,apply:r},o.id))})]})}function wx({bot:s,person:n,team:a,teamName:i,apply:r}){const c=Yt(s),o=Jt(s)===n.email,d=c.people[n.email],u=pi(c,n.email);return e.jsxs("li",{className:on,"data-access-person-bot":s.id,children:[e.jsx(Zt,{bot:s,size:32}),e.jsxs("span",{className:"min-w-0 flex-1",children:[e.jsx("span",{className:"block truncate text-[14px] leading-[18px] text-ink",children:s.name}),e.jsx("span",{className:"block truncate text-[12px] leading-4 text-ink-secondary",children:!d&&!o&&u===c.everyone?t("botAccess.everyoneUse",{team:i}):vr(s,a)})]}),e.jsx("span",{className:"min-w-0 shrink-0 text-[13px] text-ink-secondary",children:o?e.jsx("span",{className:"px-2",children:t("lookedAfter.badge")}):d?e.jsx("button",{type:"button","data-access-remove":s.id,"aria-label":t("botAccess.overview.removeFrom",{name:n.name,bot:s.name}),onClick:()=>{r(s,ko(c,n.email,null),t("botAccess.overview.toastRemoved",{name:n.name,bot:s.name}))},className:"rounded-md px-2 py-1 hover:bg-ink/[0.06] hover:text-ink",children:t("botAccess.remove")}):null})]})}function Sx(s){const n=s.trim();if(!n||/[\s\\?#@%]/.test(n))return null;try{const a=new URL(n.includes("://")?n:`https://${n}`),i=a.hostname.replace(/\.$/,"");return a.protocol!=="https:"||a.port||a.pathname!=="/"||!i.includes(".")||i.length>253||/^[\d.]+$/.test(i)||!i.split(".").every(r=>/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/.test(r))||/(?:^|\.)(?:localhost|local|internal|invalid|test)$/.test(i)?null:i}catch{return null}}function Cx({domain:s,serverIpv4:n}){const a=Sx(s);if(!a)return e.jsx("p",{className:"text-[12px] text-ink-secondary",children:t("settings.domain.enterDomain")});const i=[[t("settings.domain.recordType"),"A"],[t("settings.domain.recordName"),a],[t("settings.domain.recordValue"),n]];return e.jsxs("section",{"aria-label":t("settings.domain.dnsRecord"),className:"space-y-2 rounded-lg border border-hairline/50 p-3",children:[e.jsx("p",{className:"text-[12px] font-medium text-ink",children:t("settings.domain.dnsRecord")}),e.jsx("dl",{className:"space-y-2",children:i.map(([r,c])=>e.jsxs("div",{className:"grid grid-cols-[80px_minmax(0,1fr)] items-center gap-2",children:[e.jsx("dt",{className:"text-[12px] text-ink-secondary",children:r}),e.jsx("dd",{className:"min-w-0",children:c?e.jsx(gt,{command:c,copyLabel:t("settings.domain.copyField",{field:r})},c):e.jsx("p",{className:"text-[12px] text-warning",children:t("settings.domain.missingIp")})})]},r))}),e.jsx("p",{className:"text-[12px] leading-relaxed text-ink-secondary",children:t("settings.domain.recordHint")})]})}function Ex(s){return`bots.example.com {
|
|
2
2
|
handle /hooks/* {
|
|
3
3
|
reverse_proxy 127.0.0.1:${s.webhookPort}
|
|
4
4
|
}
|