@serve.zone/dcrouter 13.22.0 → 13.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist_serve/bundle.js +2 -2
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/classes.dcrouter.d.ts +4 -0
  4. package/dist_ts/classes.dcrouter.js +69 -2
  5. package/dist_ts/db/documents/classes.ip-intelligence.doc.d.ts +25 -0
  6. package/dist_ts/db/documents/classes.ip-intelligence.doc.js +175 -0
  7. package/dist_ts/db/documents/classes.security-block-rule.doc.d.ts +17 -0
  8. package/dist_ts/db/documents/classes.security-block-rule.doc.js +124 -0
  9. package/dist_ts/db/documents/classes.security-policy-audit.doc.d.ts +11 -0
  10. package/dist_ts/db/documents/classes.security-policy-audit.doc.js +95 -0
  11. package/dist_ts/db/documents/index.d.ts +3 -0
  12. package/dist_ts/db/documents/index.js +4 -1
  13. package/dist_ts/monitoring/classes.metricsmanager.js +2 -1
  14. package/dist_ts/opsserver/handlers/security.handler.js +42 -1
  15. package/dist_ts/remoteingress/classes.remoteingress-manager.d.ts +10 -0
  16. package/dist_ts/remoteingress/classes.remoteingress-manager.js +9 -1
  17. package/dist_ts/security/classes.security-policy-manager.d.ts +41 -0
  18. package/dist_ts/security/classes.security-policy-manager.js +283 -0
  19. package/dist_ts/security/index.d.ts +1 -0
  20. package/dist_ts/security/index.js +2 -1
  21. package/dist_ts_interfaces/data/index.d.ts +1 -0
  22. package/dist_ts_interfaces/data/index.js +2 -1
  23. package/dist_ts_interfaces/data/security-policy.d.ts +32 -0
  24. package/dist_ts_interfaces/data/security-policy.js +2 -0
  25. package/dist_ts_interfaces/requests/index.d.ts +1 -0
  26. package/dist_ts_interfaces/requests/index.js +2 -1
  27. package/dist_ts_interfaces/requests/security-policy.d.ts +64 -0
  28. package/dist_ts_interfaces/requests/security-policy.js +2 -0
  29. package/dist_ts_web/00_commitinfo_data.js +1 -1
  30. package/package.json +3 -3
  31. package/ts/00_commitinfo_data.ts +1 -1
  32. package/ts/classes.dcrouter.ts +91 -3
  33. package/ts/db/documents/classes.ip-intelligence.doc.ts +75 -0
  34. package/ts/db/documents/classes.security-block-rule.doc.ts +52 -0
  35. package/ts/db/documents/classes.security-policy-audit.doc.ts +33 -0
  36. package/ts/db/documents/index.ts +3 -0
  37. package/ts/monitoring/classes.metricsmanager.ts +2 -0
  38. package/ts/opsserver/handlers/security.handler.ts +69 -0
  39. package/ts/remoteingress/classes.remoteingress-manager.ts +15 -2
  40. package/ts/security/classes.security-policy-manager.ts +315 -0
  41. package/ts/security/index.ts +7 -1
  42. package/ts_web/00_commitinfo_data.ts +1 -1
@@ -42458,7 +42458,7 @@ Customer Support Team`}};async onActivate(b){this.appui=b.appui,this.appui.setCo
42458
42458
  }
42459
42459
  `];render(){return w`
42460
42460
  <dees-appui></dees-appui>
42461
- `}async firstUpdated(){let n=this.shadowRoot?.querySelector("dees-appui");n&&(n.configure({branding:{logoIcon:"lucide:Box",logoText:"serve.zone"},appBar:{showSearch:!0,breadcrumbs:"serve.zone",menuItems:[{name:"File",action:i(async()=>{},"action"),submenu:[{name:"New Service",shortcut:"Cmd+N",action:i(async()=>{console.log("New Service")},"action")},{name:"Import Configuration",action:i(async()=>{console.log("Import")},"action")},{name:"Export Configuration",action:i(async()=>{console.log("Export")},"action")},{divider:!0},{name:"Preferences",shortcut:"Cmd+,",action:i(async()=>{n.navigateToView("settings")},"action")}]},{name:"View",action:i(async()=>{},"action"),submenu:[{name:"Dashboard",shortcut:"Cmd+1",action:i(async()=>{n.navigateToView("dashboard")},"action")},{name:"Services",shortcut:"Cmd+2",action:i(async()=>{n.navigateToView("services")},"action")},{name:"Network",shortcut:"Cmd+3",action:i(async()=>{n.navigateToView("network")},"action")},{divider:!0},{name:"Activity Log",shortcut:"Cmd+Shift+A",action:i(async()=>{n.toggleActivityLog()},"action")},{name:"Toggle Sidebar",shortcut:"Cmd+B",action:i(async()=>{n.setMainMenuCollapsed(!n.mainmenuCollapsed)},"action")}]},{name:"Services",action:i(async()=>{},"action"),submenu:[{name:"Deploy New Service",action:i(async()=>{console.log("Deploy")},"action")},{name:"Start All",action:i(async()=>{console.log("Start all")},"action")},{name:"Stop All",action:i(async()=>{console.log("Stop all")},"action")},{divider:!0},{name:"Garbage Collect",action:i(async()=>{console.log("GC")},"action")}]},{name:"Help",action:i(async()=>{},"action"),submenu:[{name:"Documentation",action:i(async()=>{window.open("https://docs.serve.zone","_blank")},"action")},{name:"Release Notes",action:i(async()=>{console.log("Release notes")},"action")},{divider:!0},{name:"About serve.zone",action:i(async()=>{console.log("About")},"action")}]}]},views:[{id:"dashboard",name:"Dashboard",iconName:"lucide:LayoutDashboard",content:"sz-demo-view-dashboard"},{id:"services",name:"Services",iconName:"lucide:Server",content:"sz-demo-view-services"},{id:"network",name:"Network",iconName:"lucide:Network",content:"sz-demo-view-network"},{id:"registries",name:"Registries",iconName:"lucide:Archive",content:"sz-demo-view-registries"},{id:"tokens",name:"Tokens",iconName:"lucide:Key",content:"sz-demo-view-tokens"},{id:"mta",name:"Email / MTA",iconName:"lucide:Mail",content:"sz-demo-view-mta"},{id:"routes",name:"Routes",iconName:"lucide:Route",content:"sz-demo-view-routes"},{id:"settings",name:"Settings",iconName:"lucide:Settings",content:"sz-demo-view-settings"}],mainMenu:{sections:[{name:"Overview",views:["dashboard"]},{name:"Infrastructure",views:["services","network","registries","mta","routes"]},{name:"Administration",views:["tokens","settings"]}]},defaultView:"dashboard",onViewChange:i((l,c)=>{console.log("View changed to:",l,c)},"onViewChange")}),n.setUser({name:"Admin User",email:"admin@serve.zone",status:"online"}),n.setProfileMenuItems([{name:"Profile",iconName:"lucide:User",action:i(async()=>{console.log("Profile")},"action")},{name:"Preferences",iconName:"lucide:SlidersHorizontal",action:i(async()=>{console.log("Preferences")},"action")},{divider:!0},{name:"Sign Out",iconName:"lucide:LogOut",action:i(async()=>{console.log("Sign Out")},"action")}]))}static{ZHa(r,a)}};return o=r})();var Hm={};pt(Hm,{TypedSocket:()=>vJe});var gJe={};pt(gJe,{sha256FromString:()=>eVa});var FW={};pt(FW,{Smartenv:()=>mJe});var hJe=Bi(c5a(),1);var mJe=class{static{i(this,"Smartenv")}constructor(){this.loadedScripts=[]}async getEnvAwareModule(e){if(this.isNode)return await this.getSafeNodeModule(e.nodeModuleName);if(this.isBrowser)return await this.getSafeWebModule(e.webUrlArg,e.getFunction);console.error("platform for loading not supported by smartenv")}async getSafeNodeModule(e){if(!this.isNode){console.error(`You tried to load a node module in a wrong context: ${e}`);return}return new Function(`return import('${e}')`)()}async getSafeWebModule(e,a){if(!this.isBrowser){console.error("You tried to load a web module in a wrong context");return}if(this.loadedScripts.includes(e))return a();this.loadedScripts.push(e);let r=hJe.defer();if(globalThis.importScripts)globalThis.importScripts(e),r.resolve();else{let s=document.createElement("script");s.onload=()=>{r.resolve()},s.src=e,document.head.appendChild(s)}return await r.promise,a()}get runtimeEnv(){return typeof process<"u"?"node":"browser"}get isBrowser(){return!this.isNode}get userAgent(){return this.isBrowser?navigator.userAgent:"undefined"}get isNode(){return this.runtimeEnv==="node"}get nodeVersion(){return process.version}get isCI(){return this.isNode?!!process.env.CI:!1}async isMacAsync(){return this.isNode?(await this.getSafeNodeModule("os")).platform()==="darwin":!1}async isWindowsAsync(){return this.isNode?(await this.getSafeNodeModule("os")).platform()==="win32":!1}async isLinuxAsync(){return this.isNode?(await this.getSafeNodeModule("os")).platform()==="linux":!1}async printEnv(){this.isNode?(console.log("running on NODE"),console.log("node version is "+this.nodeVersion)):(console.log("running on BROWSER"),console.log("browser is "+this.userAgent))}};var JHa=i(t=>{let e=[],a=new DataView(t);for(let r=0;r<a.byteLength;r+=4){let o=a.getUint32(r).toString(16),n="00000000",l=(n+o).slice(-n.length);e.push(l)}return e.join("")},"hex"),eVa=i(async t=>{let e=new FW.Smartenv;if(e.isBrowser){let a=new TextEncoder().encode(t),r=await crypto.subtle.digest("SHA-256",a);return JHa(r)}else if(e.isNode)return await(await e.getSafeNodeModule("@pushrocks/smarthash")).sha256FromString(t)},"sha256FromString");Oh();U4();Y2();O3e();ms();jn();n3();SQ();var bJe="__typedsocket_tag__";function aVa(t){return{peer:t,async getTagById(e){if(!t.tags.has(e))return;let a=t.data.get(`${bJe}${e}`);return{id:e,payload:a}}}}i(aVa,"wrapSmartServePeer");var vJe=class t{static{i(this,"TypedSocket")}static async createClient(e,a,r={}){let o={...{autoReconnect:!0,maxRetries:100,initialBackoffMs:1e3,maxBackoffMs:6e4},...r},n=new t("client",e);return n.clientOptions=o,n.serverUrl=a,n.currentBackoff=o.initialBackoffMs,await n.connect(),n}static{this.useWindowLocationOriginUrl=()=>pn.Smarturl.createFromUrl(globalThis.location.origin).toString()}static fromSmartServe(e,a){let r=new Map;t.registerTagHandlers(a);let s=new t("server",a);return s.smartServeRef=e,s.smartServeConnectionWrappers=r,s}static registerTagHandlers(e){e.addTypedHandler(new Nr.TypedHandler("__typedsocket_setTag",async(a,r)=>{let s=r?.localData?.peer;return s?(s.tags.add(a.name),s.data.set(`${bJe}${a.name}`,a.payload),{success:!0}):(console.warn("setTag: No peer found in request context"),{success:!1})})),e.addTypedHandler(new Nr.TypedHandler("__typedsocket_removeTag",async(a,r)=>{let s=r?.localData?.peer;return s?(s.tags.delete(a.name),s.data.delete(`${bJe}${a.name}`),{success:!0}):(console.warn("removeTag: No peer found in request context"),{success:!1})}))}constructor(e,a){this.statusSubject=new Ma.rxjs.Subject,this.connectionStatus="new",this.websocket=null,this.clientOptions=null,this.serverUrl="",this.retryCount=0,this.currentBackoff=1e3,this.pendingRequests=new Map,this.smartServeRef=null,this.smartServeConnectionWrappers=new Map,this.side=e,this.typedrouter=a}async connect(){let e=ft.defer();this.updateStatus("connecting");let a=this.toWebSocketUrl(this.serverUrl);console.log(`TypedSocket connecting to ${a}...`),this.websocket=new WebSocket(a);let r=setTimeout(()=>{this.connectionStatus!=="connected"&&(console.warn("TypedSocket connection timeout"),this.websocket?.close(),e.reject(new Error("Connection timeout")))},1e4);this.websocket.onopen=()=>{clearTimeout(r),console.log("TypedSocket connected!"),this.updateStatus("connected"),this.retryCount=0,this.currentBackoff=this.clientOptions?.initialBackoffMs??1e3,e.resolve()},this.websocket.onmessage=async s=>{await this.handleMessage(s.data)},this.websocket.onclose=()=>{clearTimeout(r),this.handleDisconnect()},this.websocket.onerror=s=>{console.error("TypedSocket WebSocket error:",s)};try{await e.promise}catch(s){if(clearTimeout(r),this.clientOptions?.autoReconnect)await this.scheduleReconnect();else throw s}}toWebSocketUrl(e){let a=new URL(e);return`${a.protocol==="https:"?"wss:":"ws:"}//${a.host}${a.pathname}`}async handleMessage(e){try{let a=typeof e=="string"?e:new TextDecoder().decode(e),r=So.parse(a);if(r.correlation?.id&&this.pendingRequests.has(r.correlation.id)){let o=this.pendingRequests.get(r.correlation.id);this.pendingRequests.delete(r.correlation.id),o.resolve(r);return}let s=await this.typedrouter.routeAndAddResponse(r);s&&this.websocket?.readyState===WebSocket.OPEN&&this.websocket.send(So.stringify(s))}catch(a){console.error("TypedSocket failed to process message:",a)}}handleDisconnect(){if(this.connectionStatus!=="disconnected"){this.updateStatus("disconnected");for(let[e,a]of this.pendingRequests)a.reject(new Error("TypedSocket disconnected"));this.pendingRequests.clear(),this.clientOptions?.autoReconnect&&this.retryCount<this.clientOptions.maxRetries&&this.scheduleReconnect()}}async scheduleReconnect(){if(!this.clientOptions)return;this.updateStatus("reconnecting"),this.retryCount++;let e=this.currentBackoff*.2*(Math.random()*2-1),a=Math.min(this.currentBackoff+e,this.clientOptions.maxBackoffMs);console.log(`TypedSocket reconnecting in ${Math.round(a)}ms (attempt ${this.retryCount}/${this.clientOptions.maxRetries})`),await Wt.delayFor(a),this.currentBackoff=Math.min(this.currentBackoff*2,this.clientOptions.maxBackoffMs);try{await this.connect()}catch(r){console.error("TypedSocket reconnection failed:",r)}}updateStatus(e){this.connectionStatus!==e&&(this.connectionStatus=e,this.statusSubject.next(e))}async sendRequest(e){if(!this.websocket||this.websocket.readyState!==WebSocket.OPEN)throw new Error("WebSocket not connected");return new Promise((a,r)=>{let s=setTimeout(()=>{this.pendingRequests.delete(e.correlation.id),r(new Error("Request timeout"))},3e4);this.pendingRequests.set(e.correlation.id,{resolve:i(o=>{clearTimeout(s),a(o)},"resolve"),reject:i(o=>{clearTimeout(s),r(o)},"reject")}),this.websocket.send(So.stringify(e))})}createTypedRequest(e,a){let r=i(async s=>{if(this.side==="client")return this.sendRequest(s);if(!this.smartServeRef)throw new Error("Server not initialized");let o=a;if(!o){let l=this.smartServeRef.getWebSocketConnections();if(l.length===1){let c=l[0];o=this.getOrCreateWrapper(c)}else throw l.length===0?new Error("No WebSocket connections available"):new Error("Multiple connections available - specify targetConnection")}let n=await this.typedrouter.fireEventInterestMap.addInterest(s.correlation.id,s);return o.peer.send(So.stringify(s)),await n.interestFullfilled},"postMethod");return new Nr.TypedRequest(new Nr.TypedTarget({postMethod:r}),e)}getStatus(){return this.connectionStatus}async stop(){this.side==="client"?(this.clientOptions&&(this.clientOptions.autoReconnect=!1),this.websocket&&(this.websocket.close(),this.websocket=null),this.pendingRequests.clear()):this.smartServeConnectionWrappers.clear()}async setTag(e,a){if(this.side!=="client")throw new Error("setTag is only available on clients");if(!(await this.createTypedRequest("__typedsocket_setTag").fire({name:e,payload:a})).success)throw new Error("Failed to set tag on server")}async removeTag(e){if(this.side!=="client")throw new Error("removeTag is only available on clients");if(!(await this.createTypedRequest("__typedsocket_removeTag").fire({name:e})).success)throw new Error("Failed to remove tag on server")}getOrCreateWrapper(e){let a=this.smartServeConnectionWrappers.get(e.id);return a||(a=aVa(e),this.smartServeConnectionWrappers.set(e.id,a)),a}async findAllTargetConnections(e){if(this.side!=="server"||!this.smartServeRef)throw new Error("findAllTargetConnections is only available on servers");let a=[];for(let r of this.smartServeRef.getWebSocketConnections()){let s=this.getOrCreateWrapper(r);await e(s)&&a.push(s)}return a}async findTargetConnection(e){return(await this.findAllTargetConnections(e))[0]}async findAllTargetConnectionsByTag(e,a){if(this.side!=="server"||!this.smartServeRef)throw new Error("findAllTargetConnectionsByTag is only available on servers");let r=this.smartServeRef.getWebSocketConnectionsByTag(e),s=[];for(let o of r){let n=this.getOrCreateWrapper(o);if(a!==void 0){let l=await n.getTagById(e);if(So.stringify(l?.payload)!==So.stringify(a))continue}s.push(n)}return s}async findTargetConnectionByTag(e,a){return(await this.findAllTargetConnectionsByTag(e,a))[0]}};le();Tt();var Bie=Bi(cha(),1),Xe=At;U4();var HJe={};pt(HJe,{DCROUTER_BUILTIN_PROVIDER_ID:()=>ZVa,dnsProviderTypeDescriptors:()=>dha,getDnsProviderTypeDescriptor:()=>XVa});var ZVa="__dcrouter__",dha=[{type:"dcrouter",displayName:"DcRouter (built-in)",description:"Built-in authoritative DNS. Records are served directly by dcrouter \u2014 delegate the domain's NS records to make this effective.",credentialFields:[]},{type:"cloudflare",displayName:"Cloudflare",description:"External DNS provider. The provider stays authoritative; dcrouter pushes record changes via its API.",credentialFields:[{key:"apiToken",label:"API Token",helpText:"A Cloudflare API token with Zone:Read and DNS:Edit permissions for the target zones.",required:!0,secret:!0}]}];function XVa(t){return dha.find(e=>e.type===t)}i(XVa,"getDnsProviderTypeDescriptor");var uha={};var fs=new Xe.plugins.smartstate.Smartstate,Ia=await fs.getStatePart("login",{identity:null,isLoggedIn:!1},"persistent"),nr=await fs.getStatePart("stats",{serverStats:null,emailStats:null,dnsStats:null,securityMetrics:null,radiusStats:null,vpnStats:null,lastUpdated:0,isLoading:!1,error:null},"soft"),g4=await fs.getStatePart("config",{config:null,isLoading:!1,error:null}),QVa=i(()=>{let t=typeof window<"u"?window.location.pathname:"/",e=["overview","network","email","logs","access","security","domains"],r=t.split("/").filter(Boolean)[0];return e.includes(r)?r:"overview"},"getInitialView"),JVa=i(()=>(typeof window<"u"?window.location.pathname:"/").split("/").filter(Boolean)[1]??null,"getInitialSubview"),Os=await fs.getStatePart("ui",{activeView:QVa(),activeSubview:JVa(),sidebarCollapsed:!1,autoRefresh:!0,refreshInterval:1e3,theme:"light"}),pc=await fs.getStatePart("logs",{recentLogs:[],isStreaming:!1,filters:{}},"soft"),m4=await fs.getStatePart("network",{connections:[],connectionsByIP:{},throughputRate:{bytesInPerSecond:0,bytesOutPerSecond:0},totalBytes:{in:0,out:0},topIPs:[],topIPsByBandwidth:[],throughputByIP:[],domainActivity:[],throughputHistory:[],requestsPerSecond:0,requestsTotal:0,backends:[],frontendProtocols:null,backendProtocols:null,lastUpdated:0,isLoading:!1,error:null},"soft"),Hie=await fs.getStatePart("emailOps",{emails:[],isLoading:!1,error:null,lastUpdated:0},"soft"),Ao=await fs.getStatePart("certificates",{certificates:[],summary:{total:0,valid:0,expiring:0,expired:0,failed:0,unknown:0},isLoading:!1,error:null,lastUpdated:0},"soft"),T5=await fs.getStatePart("acmeConfig",{config:null,isLoading:!1,error:null,lastUpdated:0},"soft"),Ri=await fs.getStatePart("remoteIngress",{edges:[],statuses:[],selectedEdgeId:null,newEdgeId:null,isLoading:!1,error:null,lastUpdated:0},"soft"),Fa=await fs.getStatePart("routeManagement",{mergedRoutes:[],warnings:[],apiTokens:[],isLoading:!1,error:null,lastUpdated:0},"soft"),GW=await fs.getStatePart("users",{users:[],isLoading:!1,error:null,lastUpdated:0},"soft"),ut=i(()=>{let t=Ia.getState().identity;return t&&t.expiresAt&&t.expiresAt<Date.now()?{identity:null}:{identity:t}},"getActionContext"),bha=Ia.createAction(async(t,e)=>{let a=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","adminLoginWithUsernameAndPassword");try{let r=await a.fire({username:e.username,password:e.password});return r.identity?{identity:r.identity,isLoggedIn:!0}:t.getState()}catch(r){return console.error("Login failed:",r),t.getState()}}),Ym=Ia.createAction(async t=>{let e=ut();if(e.identity){let a=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","adminLogout");try{await a.fire({identity:e.identity})}catch(r){console.error("Logout error:",r)}}return{identity:null,isLoggedIn:!1}}),Km=nr.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let s=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getCombinedMetrics").fire({identity:e.identity,sections:{server:!0,email:!0,dns:!0,security:!0,network:!1,radius:!0,vpn:!0}});return{serverStats:s.metrics.server||a.serverStats,emailStats:s.metrics.email||a.emailStats,dnsStats:s.metrics.dns||a.dnsStats,securityMetrics:s.metrics.security||a.securityMetrics,radiusStats:s.metrics.radius||a.radiusStats,vpnStats:s.metrics.vpn||a.vpnStats,lastUpdated:Date.now(),isLoading:!1,error:null}}catch(r){return{...a,isLoading:!1,error:r.message||"Failed to fetch statistics"}}}),Vie=g4.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{return{config:(await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getConfiguration").fire({identity:e.identity})).config,isLoading:!1,error:null}}catch(r){return{...a,isLoading:!1,error:r.message||"Failed to fetch configuration"}}}),jie=pc.createAction(async(t,e)=>{let a=ut();if(!a.identity)return t.getState();let s=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getRecentLogs").fire({identity:a.identity,limit:e.limit||100,level:e.level,category:e.category});return{...t.getState(),recentLogs:s.logs}}),Bmo=Os.createAction(async t=>{let e=t.getState();return{...e,autoRefresh:!e.autoRefresh}}),qmo=Os.createAction(async(t,e)=>{let a=t.getState();return e==="network"&&a.activeView!=="network"&&setTimeout(()=>{m4.dispatchAction(GJe,null)},100),e==="domains"&&a.activeView!=="domains"&&setTimeout(()=>{Ao.dispatchAction(h4,null)},100),{...a,activeView:e}}),GJe=m4.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let s=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getNetworkStats").fire({identity:e.identity}),o={},n=new Map;for(let c of s.throughputByIP||[])n.set(c.ip,{in:c.in,out:c.out});return s.connectionsByIP&&Array.isArray(s.connectionsByIP)&&s.connectionsByIP.forEach(c=>{o[c.ip]=c.count}),{connections:Object.entries(o).map(([c,d])=>{let u=n.get(c);return{id:`ip-${c}`,remoteAddress:c,localAddress:"server",startTime:0,protocol:"https",state:"connected",bytesReceived:u?.in||0,bytesSent:u?.out||0,connectionCount:d}}),connectionsByIP:o,throughputRate:s.throughputRate||{bytesInPerSecond:0,bytesOutPerSecond:0},totalBytes:s.totalDataTransferred?{in:s.totalDataTransferred.bytesIn,out:s.totalDataTransferred.bytesOut}:{in:0,out:0},topIPs:s.topIPs||[],topIPsByBandwidth:s.topIPsByBandwidth||[],throughputByIP:s.throughputByIP||[],domainActivity:s.domainActivity||[],throughputHistory:s.throughputHistory||[],requestsPerSecond:s.requestsPerSecond||0,requestsTotal:s.requestsTotal||0,backends:s.backends||[],frontendProtocols:s.frontendProtocols||null,backendProtocols:s.backendProtocols||null,lastUpdated:Date.now(),isLoading:!1,error:null}}catch(r){return console.error("Failed to fetch network stats:",r),{...a,isLoading:!1,error:r instanceof Error?r.message:"Failed to fetch network stats"}}}),vha=Hie.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{return{emails:(await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getAllEmails").fire({identity:e.identity})).emails,isLoading:!1,error:null,lastUpdated:Date.now()}}catch(r){return{...a,isLoading:!1,error:r instanceof Error?r.message:"Failed to fetch emails"}}}),h4=Ao.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let s=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getCertificateOverview").fire({identity:e.identity});return{certificates:s.certificates,summary:s.summary,isLoading:!1,error:null,lastUpdated:Date.now()}}catch(r){return{...a,isLoading:!1,error:r instanceof Error?r.message:"Failed to fetch certificate overview"}}}),xha=Ao.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","reprovisionCertificateDomain").fire({identity:r.identity,domain:e.domain,forceRenew:e.forceRenew}),await a.dispatch(h4,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to reprovision certificate"}}}),yha=Ao.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteCertificate").fire({identity:r.identity,domain:e}),await a.dispatch(h4,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to delete certificate"}}}),wha=Ao.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","importCertificate").fire({identity:r.identity,cert:e}),await a.dispatch(h4,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to import certificate"}}});async function Mha(t){let e=ut();return new Xe.plugins.typedrequest.TypedRequest("/typedrequest","exportCertificate").fire({identity:e.identity,domain:t})}i(Mha,"fetchCertificateExport");async function YJe(t){let e=ut();return new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getRemoteIngressConnectionToken").fire({identity:e.identity,edgeId:t})}i(YJe,"fetchConnectionToken");var S5=Ri.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let r=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getRemoteIngresses"),s=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getRemoteIngressStatus"),[o,n]=await Promise.all([r.fire({identity:e.identity}),s.fire({identity:e.identity})]);return{...a,edges:o.edges,statuses:n.statuses,isLoading:!1,error:null,lastUpdated:Date.now()}}catch(r){return{...a,isLoading:!1,error:r instanceof Error?r.message:"Failed to fetch remote ingress data"}}}),kha=Ri.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{let n=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createRemoteIngress").fire({identity:r.identity,name:e.name,listenPorts:e.listenPorts,autoDerivePorts:e.autoDerivePorts,tags:e.tags});return n.success?(await a.dispatch(S5,null),{...t.getState(),newEdgeId:n.edge.id}):s}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to create edge"}}}),Sha=Ri.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteRemoteIngress").fire({identity:r.identity,id:e}),await a.dispatch(S5,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to delete edge"}}}),Cha=Ri.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","updateRemoteIngress").fire({identity:r.identity,id:e.id,name:e.name,listenPorts:e.listenPorts,autoDerivePorts:e.autoDerivePorts,tags:e.tags}),await a.dispatch(S5,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to update edge"}}}),zha=Ri.createAction(async(t,e)=>{let a=ut(),r=t.getState();try{return(await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","regenerateRemoteIngressSecret").fire({identity:a.identity,id:e})).success?{...r,newEdgeId:e}:r}catch(s){return{...r,error:s instanceof Error?s.message:"Failed to regenerate secret"}}}),Tha=Ri.createAction(async t=>({...t.getState(),newEdgeId:null})),KJe=Ri.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","updateRemoteIngress").fire({identity:r.identity,id:e.id,enabled:e.enabled}),await a.dispatch(S5,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to toggle edge"}}}),Fi=await fs.getStatePart("vpn",{clients:[],connectedClients:[],status:null,isLoading:!1,error:null,lastUpdated:0,newClientConfig:null},"soft"),C5=Fi.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let r=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getVpnClients"),s=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getVpnStatus"),o=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getVpnConnectedClients"),[n,l,c]=await Promise.all([r.fire({identity:e.identity}),s.fire({identity:e.identity}),o.fire({identity:e.identity})]);return{...a,clients:n.clients,connectedClients:c.connectedClients,status:l.status,isLoading:!1,error:null,lastUpdated:Date.now()}}catch(r){return{...a,isLoading:!1,error:r instanceof Error?r.message:"Failed to fetch VPN data"}}}),_ha=Fi.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{let n=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createVpnClient").fire({identity:r.identity,clientId:e.clientId,targetProfileIds:e.targetProfileIds,description:e.description,destinationAllowList:e.destinationAllowList,destinationBlockList:e.destinationBlockList,useHostIp:e.useHostIp,useDhcp:e.useDhcp,staticIp:e.staticIp,forceVlan:e.forceVlan,vlanId:e.vlanId});return n.success?{...await a.dispatch(C5,null),newClientConfig:n.wireguardConfig||null}:{...s,error:n.message||"Failed to create client"}}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to create VPN client"}}}),Lha=Fi.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteVpnClient").fire({identity:r.identity,clientId:e}),await a.dispatch(C5,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to delete VPN client"}}}),ZJe=Fi.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{let o=e.enabled?"enableVpnClient":"disableVpnClient";return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest",o).fire({identity:r.identity,clientId:e.clientId}),await a.dispatch(C5,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to toggle VPN client"}}}),$ha=Fi.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{let n=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","updateVpnClient").fire({identity:r.identity,clientId:e.clientId,description:e.description,targetProfileIds:e.targetProfileIds,destinationAllowList:e.destinationAllowList,destinationBlockList:e.destinationBlockList,useHostIp:e.useHostIp,useDhcp:e.useDhcp,staticIp:e.staticIp,forceVlan:e.forceVlan,vlanId:e.vlanId});return n.success?await a.dispatch(C5,null):{...s,error:n.message||"Failed to update client"}}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to update VPN client"}}}),Dha=Fi.createAction(async t=>({...t.getState(),newClientConfig:null})),Oi=await fs.getStatePart("targetProfiles",{profiles:[],isLoading:!1,error:null,lastUpdated:0},"soft"),fc=Oi.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{return{profiles:(await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getTargetProfiles").fire({identity:e.identity})).profiles,isLoading:!1,error:null,lastUpdated:Date.now()}}catch(r){return{...a,isLoading:!1,error:r instanceof Error?r.message:"Failed to fetch target profiles"}}}),Aha=Oi.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createTargetProfile").fire({identity:r.identity,name:e.name,description:e.description,domains:e.domains,targets:e.targets,routeRefs:e.routeRefs});return o.success?await a.dispatch(fc,null):{...t.getState(),error:o.message||"Failed to create target profile"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to create target profile"}}}),Iha=Oi.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","updateTargetProfile").fire({identity:r.identity,id:e.id,name:e.name,description:e.description,domains:e.domains,targets:e.targets,routeRefs:e.routeRefs});return o.success?await a.dispatch(fc,null):{...t.getState(),error:o.message||"Failed to update target profile"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to update target profile"}}}),XJe=Oi.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteTargetProfile").fire({identity:r.identity,id:e.id,force:e.force});return o.success?await a.dispatch(fc,null):{...t.getState(),error:o.message||"Failed to delete target profile"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to delete target profile"}}}),Ua=await fs.getStatePart("profilesTargets",{profiles:[],targets:[],isLoading:!1,error:null,lastUpdated:0},"soft"),Io=Ua.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let r=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getSourceProfiles"),s=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getNetworkTargets"),[o,n]=await Promise.all([r.fire({identity:e.identity}),s.fire({identity:e.identity})]);return{profiles:o.profiles,targets:n.targets,isLoading:!1,error:null,lastUpdated:Date.now()}}catch(r){return{...a,isLoading:!1,error:r instanceof Error?r.message:"Failed to fetch profiles/targets"}}}),Pha=Ua.createAction(async(t,e,a)=>{let r=ut();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createSourceProfile").fire({identity:r.identity,name:e.name,description:e.description,security:e.security,extendsProfiles:e.extendsProfiles}),await a.dispatch(Io,null)}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to create profile"}}}),Eha=Ua.createAction(async(t,e,a)=>{let r=ut();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","updateSourceProfile").fire({identity:r.identity,id:e.id,name:e.name,description:e.description,security:e.security,extendsProfiles:e.extendsProfiles}),await a.dispatch(Io,null)}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to update profile"}}}),QJe=Ua.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteSourceProfile").fire({identity:r.identity,id:e.id,force:e.force});return o.success?await a.dispatch(Io,null):{...t.getState(),error:o.message||"Failed to delete profile"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to delete profile"}}}),Nha=Ua.createAction(async(t,e,a)=>{let r=ut();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createNetworkTarget").fire({identity:r.identity,name:e.name,description:e.description,host:e.host,port:e.port}),await a.dispatch(Io,null)}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to create target"}}}),Rha=Ua.createAction(async(t,e,a)=>{let r=ut();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","updateNetworkTarget").fire({identity:r.identity,id:e.id,name:e.name,description:e.description,host:e.host,port:e.port}),await a.dispatch(Io,null)}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to update target"}}}),JJe=Ua.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteNetworkTarget").fire({identity:r.identity,id:e.id,force:e.force});return o.success?await a.dispatch(Io,null):{...t.getState(),error:o.message||"Failed to delete target"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to delete target"}}}),Bt=await fs.getStatePart("domains",{providers:[],domains:[],records:[],selectedDomainId:null,isLoading:!1,error:null,lastUpdated:0},"soft"),Ni=Bt.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let r=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getDnsProviders"),s=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getDomains"),[o,n]=await Promise.all([r.fire({identity:e.identity}),s.fire({identity:e.identity})]);return{...a,providers:o.providers,domains:n.domains,isLoading:!1,error:null,lastUpdated:Date.now()}}catch(r){return{...a,isLoading:!1,error:r instanceof Error?r.message:"Failed to fetch domains/providers"}}}),hc=Bt.createAction(async(t,e)=>{let a=ut(),r=t.getState();if(!a.identity)return r;try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getDnsRecords").fire({identity:a.identity,domainId:e.domainId});return{...r,records:o.records,selectedDomainId:e.domainId,error:null}}catch(s){return{...r,error:s instanceof Error?s.message:"Failed to fetch DNS records"}}}),Fha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createDnsProvider").fire({identity:r.identity,name:e.name,type:e.type,credentials:e.credentials});return o.success?await a.dispatch(Ni,null):{...t.getState(),error:o.message||"Failed to create provider"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to create provider"}}}),Oha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","updateDnsProvider").fire({identity:r.identity,id:e.id,name:e.name,credentials:e.credentials});return o.success?await a.dispatch(Ni,null):{...t.getState(),error:o.message||"Failed to update provider"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to update provider"}}}),Bha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteDnsProvider").fire({identity:r.identity,id:e.id,force:e.force});return o.success?await a.dispatch(Ni,null):{...t.getState(),error:o.message||"Failed to delete provider"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to delete provider"}}}),qha=Bt.createAction(async(t,e,a)=>{let r=ut();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","testDnsProvider").fire({identity:r.identity,id:e.id}),await a.dispatch(Ni,null)}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to test provider"}}});async function Hha(t){let e=ut();return e.identity?await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","listProviderDomains").fire({identity:e.identity,providerId:t}):{success:!1,message:"Not authenticated"}}i(Hha,"fetchProviderDomains");var Vha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createDomain").fire({identity:r.identity,name:e.name,description:e.description});return o.success?await a.dispatch(Ni,null):{...t.getState(),error:o.message||"Failed to create domain"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to create domain"}}}),jha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","importDomain").fire({identity:r.identity,providerId:e.providerId,domainNames:e.domainNames});return o.success?await a.dispatch(Ni,null):{...t.getState(),error:o.message||"Failed to import domains"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to import domains"}}}),Uha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteDomain").fire({identity:r.identity,id:e.id});return o.success?await a.dispatch(Ni,null):{...t.getState(),error:o.message||"Failed to delete domain"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to delete domain"}}}),Wha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","syncDomain").fire({identity:r.identity,id:e.id});return o.success?await a.dispatch(Ni,null):{...t.getState(),error:o.message||"Failed to sync domain"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to sync domain"}}}),Gha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","migrateDomain").fire({identity:r.identity,...e});return o.success?await a.dispatch(Ni,null):{...t.getState(),error:o.message||"Migration failed"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Migration failed"}}}),Yha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createDnsRecord").fire({identity:r.identity,domainId:e.domainId,name:e.name,type:e.type,value:e.value,ttl:e.ttl,proxied:e.proxied});return o.success?await a.dispatch(hc,{domainId:e.domainId}):{...t.getState(),error:o.message||"Failed to create record"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to create record"}}}),Kha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","updateDnsRecord").fire({identity:r.identity,id:e.id,name:e.name,value:e.value,ttl:e.ttl,proxied:e.proxied});return o.success?await a.dispatch(hc,{domainId:e.domainId}):{...t.getState(),error:o.message||"Failed to update record"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to update record"}}}),Zha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteDnsRecord").fire({identity:r.identity,id:e.id});return o.success?await a.dispatch(hc,{domainId:e.domainId}):{...t.getState(),error:o.message||"Failed to delete record"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to delete record"}}}),eet=T5.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{return{config:(await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getAcmeConfig").fire({identity:e.identity})).config,isLoading:!1,error:null,lastUpdated:Date.now()}}catch(r){return{...a,isLoading:!1,error:r instanceof Error?r.message:"Failed to fetch ACME config"}}}),Xha=T5.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","updateAcmeConfig").fire({identity:r.identity,accountEmail:e.accountEmail,enabled:e.enabled,useProduction:e.useProduction,autoRenew:e.autoRenew,renewThresholdDays:e.renewThresholdDays});return o.success?await a.dispatch(eet,null):{...t.getState(),error:o.message||"Failed to update ACME config"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to update ACME config"}}}),E2=Fa.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let s=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getMergedRoutes").fire({identity:e.identity});return{...a,mergedRoutes:s.routes,warnings:s.warnings,isLoading:!1,error:null,lastUpdated:Date.now()}}catch(r){return{...a,isLoading:!1,error:r instanceof Error?r.message:"Failed to fetch routes"}}}),Qha=Fa.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createRoute").fire({identity:r.identity,route:e.route,enabled:e.enabled,metadata:e.metadata}),await a.dispatch(E2,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to create route"}}}),Jha=Fa.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{let n=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","updateRoute").fire({identity:r.identity,id:e.id,route:e.route,enabled:e.enabled,metadata:e.metadata});if(!n.success)throw new Error(n.message||"Failed to update route");return await a.dispatch(E2,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to update route"}}}),tet=Fa.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{let n=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteRoute").fire({identity:r.identity,id:e});if(!n.success)throw new Error(n.message||"Failed to delete route");return await a.dispatch(E2,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to delete route"}}}),e8a=Fa.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{let n=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","toggleRoute").fire({identity:r.identity,id:e.id,enabled:e.enabled});if(!n.success)throw new Error(n.message||"Failed to toggle route");return await a.dispatch(E2,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to toggle route"}}}),_5=Fa.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let s=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","listApiTokens").fire({identity:e.identity});return{...a,apiTokens:s.tokens}}catch(r){return{...a,error:r instanceof Error?r.message:"Failed to fetch tokens"}}}),aet=GW.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let s=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","listUsers").fire({identity:e.identity});return{...a,users:s.users,error:null,lastUpdated:Date.now()}}catch(r){return{...a,error:r instanceof Error?r.message:"Failed to fetch users"}}});async function t8a(t,e,a){let r=ut();return new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createApiToken").fire({identity:r.identity,name:t,scopes:e,expiresInDays:a})}i(t8a,"createApiToken");async function a8a(t){let e=ut();return new Xe.plugins.typedrequest.TypedRequest("/typedrequest","rollApiToken").fire({identity:e.identity,id:t})}i(a8a,"rollApiToken");var r8a=Fa.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","revokeApiToken").fire({identity:r.identity,id:e}),await a.dispatch(_5,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to revoke token"}}}),ret=Fa.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","toggleApiToken").fire({identity:r.identity,id:e.id,enabled:e.enabled}),await a.dispatch(_5,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to toggle token"}}}),fo=await fs.getStatePart("emailDomains",{domains:[],isLoading:!1,lastUpdated:0},"soft"),z5=fo.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let s=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getEmailDomains").fire({identity:e.identity});return{...a,domains:s.domains,isLoading:!1,lastUpdated:Date.now()}}catch{return{...a,isLoading:!1}}}),i8a=fo.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createEmailDomain").fire({identity:r.identity,...e}),await a.dispatch(z5,null)}catch{return s}}),s8a=fo.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteEmailDomain").fire({identity:r.identity,id:e}),await a.dispatch(z5,null)}catch{return s}}),o8a=fo.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","validateEmailDomain").fire({identity:r.identity,id:e}),await a.dispatch(z5,null)}catch{return s}}),iet=fo.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","provisionEmailDomainDns").fire({identity:r.identity,id:e}),await a.dispatch(z5,null)}catch{return s}});async function n8a(t){let e=ut();return new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getEmailDomainDnsRecords").fire({identity:e.identity,id:t})}i(n8a,"fetchEmailDomainDnsRecords");var M5=null,pha=new Xe.plugins.typedrequest.TypedRouter,qie=[],VJe=!1;function eja(){if(VJe=!1,qie.length===0)return;let t=pc.getState(),e=[...t.recentLogs,...qie];qie=[],e.length>2e3&&e.splice(0,e.length-2e3),pc.setState({...t,recentLogs:e})}i(eja,"flushLogEntries"),pha.addTypedHandler(new Xe.plugins.typedrequest.TypedHandler("pushLogEntry",async t=>(qie.push(t.entry),VJe||(VJe=!0,requestAnimationFrame(eja)),{})));async function jJe(){if(!M5)try{M5=await Hm.TypedSocket.createClient(pha,Hm.TypedSocket.useWindowLocationOriginUrl()),await M5.setTag("role","ops_dashboard")}catch(t){console.error("TypedSocket connection failed:",t),M5=null}}i(jJe,"connectSocket");async function fha(){if(M5){try{await M5.stop()}catch{}M5=null}}i(fha,"disconnectSocket");var UJe=!1;async function tja(){if(!UJe){UJe=!0;try{await aja()}finally{UJe=!1}}}i(tja,"dispatchCombinedRefreshAction");async function aja(){let t=ut();if(!t.identity)return;let e=Os.getState().activeView,a=Os.getState().activeSubview;try{let s=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getCombinedMetrics").fire({identity:t.identity,sections:{server:!0,email:!0,dns:!0,security:!0,network:e==="network"&&a==="activity",radius:!0,vpn:!0}}),o=nr.getState();if(nr.setState({...o,serverStats:s.metrics.server||o.serverStats,emailStats:s.metrics.email||o.emailStats,dnsStats:s.metrics.dns||o.dnsStats,securityMetrics:s.metrics.security||o.securityMetrics,radiusStats:s.metrics.radius||o.radiusStats,vpnStats:s.metrics.vpn||o.vpnStats,lastUpdated:Date.now(),isLoading:!1,error:null}),s.metrics.network&&e==="network"){let n=s.metrics.network,l={};n.connectionDetails.forEach(d=>{l[d.remoteAddress]=(l[d.remoteAddress]||0)+(d.connectionCount||1)});let c=n.connectionDetails.map((d,u)=>({id:`ip-${d.remoteAddress}`,remoteAddress:d.remoteAddress,localAddress:"server",startTime:d.startTime,protocol:d.protocol,state:d.state,bytesReceived:d.bytesIn,bytesSent:d.bytesOut,connectionCount:d.connectionCount}));m4.setState({...m4.getState(),connections:c,connectionsByIP:l,throughputRate:{bytesInPerSecond:n.totalBandwidth.in,bytesOutPerSecond:n.totalBandwidth.out},totalBytes:n.totalBytes||{in:0,out:0},topIPs:n.topEndpoints.map(d=>({ip:d.endpoint,count:d.connections})),topIPsByBandwidth:(n.topEndpointsByBandwidth||[]).map(d=>({ip:d.endpoint,count:d.connections,bwIn:d.bandwidth?.in||0,bwOut:d.bandwidth?.out||0})),throughputByIP:n.topEndpoints.map(d=>({ip:d.endpoint,in:d.bandwidth?.in||0,out:d.bandwidth?.out||0})),domainActivity:n.domainActivity||[],throughputHistory:n.throughputHistory||[],requestsPerSecond:n.requestsPerSecond||0,requestsTotal:n.requestsTotal||0,backends:n.backends||[],frontendProtocols:n.frontendProtocols||null,backendProtocols:n.backendProtocols||null,lastUpdated:Date.now(),isLoading:!1,error:null})}if(e==="domains"&&a==="certificates")try{await Ao.dispatchAction(h4,null)}catch(n){console.error("Certificate refresh failed:",n)}if(e==="network"&&a==="remoteingress")try{await Ri.dispatchAction(S5,null)}catch(n){console.error("Remote ingress refresh failed:",n)}if(e==="network"&&a==="vpn")try{await Fi.dispatchAction(C5,null)}catch(n){console.error("VPN refresh failed:",n)}}catch(r){console.error("Combined refresh failed:",r);let s=String(r);(s.includes("invalid")||s.includes("unauthorized")||s.includes("401"))&&(await Ia.dispatchAction(Ym,null),window.location.reload())}}i(aja,"dispatchCombinedRefreshActionInner");var rja=nr.createAction(async t=>(await tja(),t.getState())),k5=null,WJe=i(()=>{let t=Os.getState(),e=Ia.getState();t.autoRefresh&&e.isLoggedIn?(k5&&(k5.dispose(),k5=null),k5=nr.createScheduledAction({action:rja,payload:void 0,intervalMs:t.refreshInterval,autoPause:"visibility"})):k5&&(k5.dispose(),k5=null)},"startAutoRefresh"),hha=Os.getState().autoRefresh,mha=Os.getState().refreshInterval,gha=Ia.getState().isLoggedIn;Os.select(t=>({autoRefresh:t.autoRefresh,refreshInterval:t.refreshInterval})).subscribe(t=>{(t.autoRefresh!==hha||t.refreshInterval!==mha)&&(hha=t.autoRefresh,mha=t.refreshInterval,WJe())}),Ia.select(t=>t.isLoggedIn).subscribe(t=>{t!==gha&&(gha=t,WJe(),t?jJe():fha())}),document.addEventListener("visibilitychange",()=>{document.hidden?fha():Ia.getState().isLoggedIn&&jJe()}),WJe(),Ia.getState().isLoggedIn&&jJe();U4();var N2={};pt(N2,{DCROUTER_BUILTIN_PROVIDER_ID:()=>ija,dnsProviderTypeDescriptors:()=>l8a,getDnsProviderTypeDescriptor:()=>sja});var ija="__dcrouter__",l8a=[{type:"dcrouter",displayName:"DcRouter (built-in)",description:"Built-in authoritative DNS. Records are served directly by dcrouter \u2014 delegate the domain's NS records to make this effective.",credentialFields:[]},{type:"cloudflare",displayName:"Cloudflare",description:"External DNS provider. The provider stays authoritative; dcrouter pushes record changes via its API.",credentialFields:[{key:"apiToken",label:"API Token",helpText:"A Cloudflare API token with Zone:Read and DNS:Edit permissions for the target zones.",required:!0,secret:!0}]}];function sja(t){return l8a.find(e=>e.type===t)}i(sja,"getDnsProviderTypeDescriptor");var c8a={};var oja=Xe.plugins.smartrouter.SmartRouter,u8a=["logs"],Zm={overview:["stats","configuration"],network:["activity","routes","sourceprofiles","networktargets","targetprofiles","remoteingress","vpn"],email:["log","security","domains"],access:["apitokens","users"],security:["overview","blocked","authentication"],domains:["providers","domains","dns","certificates"]},set={overview:"stats",network:"activity",email:"log",access:"apitokens",security:"overview",domains:"domains"},nja=[...u8a,...Object.keys(Zm)];function p8a(t){return nja.includes(t)}i(p8a,"isValidView");function f8a(t,e){return Zm[t]?.includes(e)??!1}i(f8a,"isValidSubview");var oet=class{static{i(this,"AppRouter")}router;initialized=!1;suppressStateUpdate=!1;constructor(){this.router=new oja({debug:!1})}init(){this.initialized||(this.setupRoutes(),this.setupStateSync(),this.handleInitialRoute(),this.initialized=!0)}setupRoutes(){for(let e of u8a)this.router.on(`/${e}`,async()=>{this.updateViewState(e,null)});for(let e of Object.keys(Zm)){this.router.on(`/${e}`,async()=>{this.navigateTo(`/${e}/${set[e]}`)});for(let a of Zm[e])this.router.on(`/${e}/${a}`,async()=>{this.updateViewState(e,a)})}this.router.on("/",async()=>{this.navigateTo("/overview")})}setupStateSync(){Os.select().subscribe(e=>{if(this.suppressStateUpdate)return;let a=window.location.pathname,r=e.activeSubview?`/${e.activeView}/${e.activeSubview}`:`/${e.activeView}`;a!==r&&(this.suppressStateUpdate=!0,this.router.pushUrl(r),this.suppressStateUpdate=!1)})}handleInitialRoute(){let e=window.location.pathname;if(!e||e==="/"){this.router.pushUrl("/overview");return}let a=e.split("/").filter(Boolean),r=a[0],s=a[1];if(!p8a(r)){this.router.pushUrl("/overview");return}Zm[r]?s&&f8a(r,s)?this.updateViewState(r,s):this.router.pushUrl(`/${r}/${set[r]}`):this.updateViewState(r,null)}updateViewState(e,a){this.suppressStateUpdate=!0;let r=Os.getState();(r.activeView!==e||r.activeSubview!==a)&&Os.setState({...r,activeView:e,activeSubview:a}),this.suppressStateUpdate=!1}navigateTo(e){this.router.pushUrl(e)}navigateToView(e,a){if(!p8a(e)){this.navigateTo("/overview");return}a&&f8a(e,a)?this.navigateTo(`/${e}/${a}`):Zm[e]?this.navigateTo(`/${e}/${set[e]}`):this.navigateTo(`/${e}`)}getCurrentView(){return Os.getState().activeView}destroy(){this.router.destroy(),this.initialized=!1}},mc=new oet;le();var Yt=W`
42461
+ `}async firstUpdated(){let n=this.shadowRoot?.querySelector("dees-appui");n&&(n.configure({branding:{logoIcon:"lucide:Box",logoText:"serve.zone"},appBar:{showSearch:!0,breadcrumbs:"serve.zone",menuItems:[{name:"File",action:i(async()=>{},"action"),submenu:[{name:"New Service",shortcut:"Cmd+N",action:i(async()=>{console.log("New Service")},"action")},{name:"Import Configuration",action:i(async()=>{console.log("Import")},"action")},{name:"Export Configuration",action:i(async()=>{console.log("Export")},"action")},{divider:!0},{name:"Preferences",shortcut:"Cmd+,",action:i(async()=>{n.navigateToView("settings")},"action")}]},{name:"View",action:i(async()=>{},"action"),submenu:[{name:"Dashboard",shortcut:"Cmd+1",action:i(async()=>{n.navigateToView("dashboard")},"action")},{name:"Services",shortcut:"Cmd+2",action:i(async()=>{n.navigateToView("services")},"action")},{name:"Network",shortcut:"Cmd+3",action:i(async()=>{n.navigateToView("network")},"action")},{divider:!0},{name:"Activity Log",shortcut:"Cmd+Shift+A",action:i(async()=>{n.toggleActivityLog()},"action")},{name:"Toggle Sidebar",shortcut:"Cmd+B",action:i(async()=>{n.setMainMenuCollapsed(!n.mainmenuCollapsed)},"action")}]},{name:"Services",action:i(async()=>{},"action"),submenu:[{name:"Deploy New Service",action:i(async()=>{console.log("Deploy")},"action")},{name:"Start All",action:i(async()=>{console.log("Start all")},"action")},{name:"Stop All",action:i(async()=>{console.log("Stop all")},"action")},{divider:!0},{name:"Garbage Collect",action:i(async()=>{console.log("GC")},"action")}]},{name:"Help",action:i(async()=>{},"action"),submenu:[{name:"Documentation",action:i(async()=>{window.open("https://docs.serve.zone","_blank")},"action")},{name:"Release Notes",action:i(async()=>{console.log("Release notes")},"action")},{divider:!0},{name:"About serve.zone",action:i(async()=>{console.log("About")},"action")}]}]},views:[{id:"dashboard",name:"Dashboard",iconName:"lucide:LayoutDashboard",content:"sz-demo-view-dashboard"},{id:"services",name:"Services",iconName:"lucide:Server",content:"sz-demo-view-services"},{id:"network",name:"Network",iconName:"lucide:Network",content:"sz-demo-view-network"},{id:"registries",name:"Registries",iconName:"lucide:Archive",content:"sz-demo-view-registries"},{id:"tokens",name:"Tokens",iconName:"lucide:Key",content:"sz-demo-view-tokens"},{id:"mta",name:"Email / MTA",iconName:"lucide:Mail",content:"sz-demo-view-mta"},{id:"routes",name:"Routes",iconName:"lucide:Route",content:"sz-demo-view-routes"},{id:"settings",name:"Settings",iconName:"lucide:Settings",content:"sz-demo-view-settings"}],mainMenu:{sections:[{name:"Overview",views:["dashboard"]},{name:"Infrastructure",views:["services","network","registries","mta","routes"]},{name:"Administration",views:["tokens","settings"]}]},defaultView:"dashboard",onViewChange:i((l,c)=>{console.log("View changed to:",l,c)},"onViewChange")}),n.setUser({name:"Admin User",email:"admin@serve.zone",status:"online"}),n.setProfileMenuItems([{name:"Profile",iconName:"lucide:User",action:i(async()=>{console.log("Profile")},"action")},{name:"Preferences",iconName:"lucide:SlidersHorizontal",action:i(async()=>{console.log("Preferences")},"action")},{divider:!0},{name:"Sign Out",iconName:"lucide:LogOut",action:i(async()=>{console.log("Sign Out")},"action")}]))}static{ZHa(r,a)}};return o=r})();var Hm={};pt(Hm,{TypedSocket:()=>vJe});var gJe={};pt(gJe,{sha256FromString:()=>eVa});var FW={};pt(FW,{Smartenv:()=>mJe});var hJe=Bi(c5a(),1);var mJe=class{static{i(this,"Smartenv")}constructor(){this.loadedScripts=[]}async getEnvAwareModule(e){if(this.isNode)return await this.getSafeNodeModule(e.nodeModuleName);if(this.isBrowser)return await this.getSafeWebModule(e.webUrlArg,e.getFunction);console.error("platform for loading not supported by smartenv")}async getSafeNodeModule(e){if(!this.isNode){console.error(`You tried to load a node module in a wrong context: ${e}`);return}return new Function(`return import('${e}')`)()}async getSafeWebModule(e,a){if(!this.isBrowser){console.error("You tried to load a web module in a wrong context");return}if(this.loadedScripts.includes(e))return a();this.loadedScripts.push(e);let r=hJe.defer();if(globalThis.importScripts)globalThis.importScripts(e),r.resolve();else{let s=document.createElement("script");s.onload=()=>{r.resolve()},s.src=e,document.head.appendChild(s)}return await r.promise,a()}get runtimeEnv(){return typeof process<"u"?"node":"browser"}get isBrowser(){return!this.isNode}get userAgent(){return this.isBrowser?navigator.userAgent:"undefined"}get isNode(){return this.runtimeEnv==="node"}get nodeVersion(){return process.version}get isCI(){return this.isNode?!!process.env.CI:!1}async isMacAsync(){return this.isNode?(await this.getSafeNodeModule("os")).platform()==="darwin":!1}async isWindowsAsync(){return this.isNode?(await this.getSafeNodeModule("os")).platform()==="win32":!1}async isLinuxAsync(){return this.isNode?(await this.getSafeNodeModule("os")).platform()==="linux":!1}async printEnv(){this.isNode?(console.log("running on NODE"),console.log("node version is "+this.nodeVersion)):(console.log("running on BROWSER"),console.log("browser is "+this.userAgent))}};var JHa=i(t=>{let e=[],a=new DataView(t);for(let r=0;r<a.byteLength;r+=4){let o=a.getUint32(r).toString(16),n="00000000",l=(n+o).slice(-n.length);e.push(l)}return e.join("")},"hex"),eVa=i(async t=>{let e=new FW.Smartenv;if(e.isBrowser){let a=new TextEncoder().encode(t),r=await crypto.subtle.digest("SHA-256",a);return JHa(r)}else if(e.isNode)return await(await e.getSafeNodeModule("@pushrocks/smarthash")).sha256FromString(t)},"sha256FromString");Oh();U4();Y2();O3e();ms();jn();n3();SQ();var bJe="__typedsocket_tag__";function aVa(t){return{peer:t,async getTagById(e){if(!t.tags.has(e))return;let a=t.data.get(`${bJe}${e}`);return{id:e,payload:a}}}}i(aVa,"wrapSmartServePeer");var vJe=class t{static{i(this,"TypedSocket")}static async createClient(e,a,r={}){let o={...{autoReconnect:!0,maxRetries:100,initialBackoffMs:1e3,maxBackoffMs:6e4},...r},n=new t("client",e);return n.clientOptions=o,n.serverUrl=a,n.currentBackoff=o.initialBackoffMs,await n.connect(),n}static{this.useWindowLocationOriginUrl=()=>pn.Smarturl.createFromUrl(globalThis.location.origin).toString()}static fromSmartServe(e,a){let r=new Map;t.registerTagHandlers(a);let s=new t("server",a);return s.smartServeRef=e,s.smartServeConnectionWrappers=r,s}static registerTagHandlers(e){e.addTypedHandler(new Nr.TypedHandler("__typedsocket_setTag",async(a,r)=>{let s=r?.localData?.peer;return s?(s.tags.add(a.name),s.data.set(`${bJe}${a.name}`,a.payload),{success:!0}):(console.warn("setTag: No peer found in request context"),{success:!1})})),e.addTypedHandler(new Nr.TypedHandler("__typedsocket_removeTag",async(a,r)=>{let s=r?.localData?.peer;return s?(s.tags.delete(a.name),s.data.delete(`${bJe}${a.name}`),{success:!0}):(console.warn("removeTag: No peer found in request context"),{success:!1})}))}constructor(e,a){this.statusSubject=new Ma.rxjs.Subject,this.connectionStatus="new",this.websocket=null,this.clientOptions=null,this.serverUrl="",this.retryCount=0,this.currentBackoff=1e3,this.pendingRequests=new Map,this.smartServeRef=null,this.smartServeConnectionWrappers=new Map,this.side=e,this.typedrouter=a}async connect(){let e=ft.defer();this.updateStatus("connecting");let a=this.toWebSocketUrl(this.serverUrl);console.log(`TypedSocket connecting to ${a}...`),this.websocket=new WebSocket(a);let r=setTimeout(()=>{this.connectionStatus!=="connected"&&(console.warn("TypedSocket connection timeout"),this.websocket?.close(),e.reject(new Error("Connection timeout")))},1e4);this.websocket.onopen=()=>{clearTimeout(r),console.log("TypedSocket connected!"),this.updateStatus("connected"),this.retryCount=0,this.currentBackoff=this.clientOptions?.initialBackoffMs??1e3,e.resolve()},this.websocket.onmessage=async s=>{await this.handleMessage(s.data)},this.websocket.onclose=()=>{clearTimeout(r),this.handleDisconnect()},this.websocket.onerror=s=>{console.error("TypedSocket WebSocket error:",s)};try{await e.promise}catch(s){if(clearTimeout(r),this.clientOptions?.autoReconnect)await this.scheduleReconnect();else throw s}}toWebSocketUrl(e){let a=new URL(e);return`${a.protocol==="https:"?"wss:":"ws:"}//${a.host}${a.pathname}`}async handleMessage(e){try{let a=typeof e=="string"?e:new TextDecoder().decode(e),r=So.parse(a);if(r.correlation?.id&&this.pendingRequests.has(r.correlation.id)){let o=this.pendingRequests.get(r.correlation.id);this.pendingRequests.delete(r.correlation.id),o.resolve(r);return}let s=await this.typedrouter.routeAndAddResponse(r);s&&this.websocket?.readyState===WebSocket.OPEN&&this.websocket.send(So.stringify(s))}catch(a){console.error("TypedSocket failed to process message:",a)}}handleDisconnect(){if(this.connectionStatus!=="disconnected"){this.updateStatus("disconnected");for(let[e,a]of this.pendingRequests)a.reject(new Error("TypedSocket disconnected"));this.pendingRequests.clear(),this.clientOptions?.autoReconnect&&this.retryCount<this.clientOptions.maxRetries&&this.scheduleReconnect()}}async scheduleReconnect(){if(!this.clientOptions)return;this.updateStatus("reconnecting"),this.retryCount++;let e=this.currentBackoff*.2*(Math.random()*2-1),a=Math.min(this.currentBackoff+e,this.clientOptions.maxBackoffMs);console.log(`TypedSocket reconnecting in ${Math.round(a)}ms (attempt ${this.retryCount}/${this.clientOptions.maxRetries})`),await Wt.delayFor(a),this.currentBackoff=Math.min(this.currentBackoff*2,this.clientOptions.maxBackoffMs);try{await this.connect()}catch(r){console.error("TypedSocket reconnection failed:",r)}}updateStatus(e){this.connectionStatus!==e&&(this.connectionStatus=e,this.statusSubject.next(e))}async sendRequest(e){if(!this.websocket||this.websocket.readyState!==WebSocket.OPEN)throw new Error("WebSocket not connected");return new Promise((a,r)=>{let s=setTimeout(()=>{this.pendingRequests.delete(e.correlation.id),r(new Error("Request timeout"))},3e4);this.pendingRequests.set(e.correlation.id,{resolve:i(o=>{clearTimeout(s),a(o)},"resolve"),reject:i(o=>{clearTimeout(s),r(o)},"reject")}),this.websocket.send(So.stringify(e))})}createTypedRequest(e,a){let r=i(async s=>{if(this.side==="client")return this.sendRequest(s);if(!this.smartServeRef)throw new Error("Server not initialized");let o=a;if(!o){let l=this.smartServeRef.getWebSocketConnections();if(l.length===1){let c=l[0];o=this.getOrCreateWrapper(c)}else throw l.length===0?new Error("No WebSocket connections available"):new Error("Multiple connections available - specify targetConnection")}let n=await this.typedrouter.fireEventInterestMap.addInterest(s.correlation.id,s);return o.peer.send(So.stringify(s)),await n.interestFullfilled},"postMethod");return new Nr.TypedRequest(new Nr.TypedTarget({postMethod:r}),e)}getStatus(){return this.connectionStatus}async stop(){this.side==="client"?(this.clientOptions&&(this.clientOptions.autoReconnect=!1),this.websocket&&(this.websocket.close(),this.websocket=null),this.pendingRequests.clear()):this.smartServeConnectionWrappers.clear()}async setTag(e,a){if(this.side!=="client")throw new Error("setTag is only available on clients");if(!(await this.createTypedRequest("__typedsocket_setTag").fire({name:e,payload:a})).success)throw new Error("Failed to set tag on server")}async removeTag(e){if(this.side!=="client")throw new Error("removeTag is only available on clients");if(!(await this.createTypedRequest("__typedsocket_removeTag").fire({name:e})).success)throw new Error("Failed to remove tag on server")}getOrCreateWrapper(e){let a=this.smartServeConnectionWrappers.get(e.id);return a||(a=aVa(e),this.smartServeConnectionWrappers.set(e.id,a)),a}async findAllTargetConnections(e){if(this.side!=="server"||!this.smartServeRef)throw new Error("findAllTargetConnections is only available on servers");let a=[];for(let r of this.smartServeRef.getWebSocketConnections()){let s=this.getOrCreateWrapper(r);await e(s)&&a.push(s)}return a}async findTargetConnection(e){return(await this.findAllTargetConnections(e))[0]}async findAllTargetConnectionsByTag(e,a){if(this.side!=="server"||!this.smartServeRef)throw new Error("findAllTargetConnectionsByTag is only available on servers");let r=this.smartServeRef.getWebSocketConnectionsByTag(e),s=[];for(let o of r){let n=this.getOrCreateWrapper(o);if(a!==void 0){let l=await n.getTagById(e);if(So.stringify(l?.payload)!==So.stringify(a))continue}s.push(n)}return s}async findTargetConnectionByTag(e,a){return(await this.findAllTargetConnectionsByTag(e,a))[0]}};le();Tt();var Bie=Bi(cha(),1),Xe=At;U4();var HJe={};pt(HJe,{DCROUTER_BUILTIN_PROVIDER_ID:()=>ZVa,dnsProviderTypeDescriptors:()=>dha,getDnsProviderTypeDescriptor:()=>XVa});var ZVa="__dcrouter__",dha=[{type:"dcrouter",displayName:"DcRouter (built-in)",description:"Built-in authoritative DNS. Records are served directly by dcrouter \u2014 delegate the domain's NS records to make this effective.",credentialFields:[]},{type:"cloudflare",displayName:"Cloudflare",description:"External DNS provider. The provider stays authoritative; dcrouter pushes record changes via its API.",credentialFields:[{key:"apiToken",label:"API Token",helpText:"A Cloudflare API token with Zone:Read and DNS:Edit permissions for the target zones.",required:!0,secret:!0}]}];function XVa(t){return dha.find(e=>e.type===t)}i(XVa,"getDnsProviderTypeDescriptor");var uha={};var fs=new Xe.plugins.smartstate.Smartstate,Ia=await fs.getStatePart("login",{identity:null,isLoggedIn:!1},"persistent"),nr=await fs.getStatePart("stats",{serverStats:null,emailStats:null,dnsStats:null,securityMetrics:null,radiusStats:null,vpnStats:null,lastUpdated:0,isLoading:!1,error:null},"soft"),g4=await fs.getStatePart("config",{config:null,isLoading:!1,error:null}),QVa=i(()=>{let t=typeof window<"u"?window.location.pathname:"/",e=["overview","network","email","logs","access","security","domains"],r=t.split("/").filter(Boolean)[0];return e.includes(r)?r:"overview"},"getInitialView"),JVa=i(()=>(typeof window<"u"?window.location.pathname:"/").split("/").filter(Boolean)[1]??null,"getInitialSubview"),Os=await fs.getStatePart("ui",{activeView:QVa(),activeSubview:JVa(),sidebarCollapsed:!1,autoRefresh:!0,refreshInterval:1e3,theme:"light"}),pc=await fs.getStatePart("logs",{recentLogs:[],isStreaming:!1,filters:{}},"soft"),m4=await fs.getStatePart("network",{connections:[],connectionsByIP:{},throughputRate:{bytesInPerSecond:0,bytesOutPerSecond:0},totalBytes:{in:0,out:0},topIPs:[],topIPsByBandwidth:[],throughputByIP:[],domainActivity:[],throughputHistory:[],requestsPerSecond:0,requestsTotal:0,backends:[],frontendProtocols:null,backendProtocols:null,lastUpdated:0,isLoading:!1,error:null},"soft"),Hie=await fs.getStatePart("emailOps",{emails:[],isLoading:!1,error:null,lastUpdated:0},"soft"),Ao=await fs.getStatePart("certificates",{certificates:[],summary:{total:0,valid:0,expiring:0,expired:0,failed:0,unknown:0},isLoading:!1,error:null,lastUpdated:0},"soft"),T5=await fs.getStatePart("acmeConfig",{config:null,isLoading:!1,error:null,lastUpdated:0},"soft"),Ri=await fs.getStatePart("remoteIngress",{edges:[],statuses:[],selectedEdgeId:null,newEdgeId:null,isLoading:!1,error:null,lastUpdated:0},"soft"),Fa=await fs.getStatePart("routeManagement",{mergedRoutes:[],warnings:[],apiTokens:[],isLoading:!1,error:null,lastUpdated:0},"soft"),GW=await fs.getStatePart("users",{users:[],isLoading:!1,error:null,lastUpdated:0},"soft"),ut=i(()=>{let t=Ia.getState().identity;return t&&t.expiresAt&&t.expiresAt<Date.now()?{identity:null}:{identity:t}},"getActionContext"),bha=Ia.createAction(async(t,e)=>{let a=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","adminLoginWithUsernameAndPassword");try{let r=await a.fire({username:e.username,password:e.password});return r.identity?{identity:r.identity,isLoggedIn:!0}:t.getState()}catch(r){return console.error("Login failed:",r),t.getState()}}),Ym=Ia.createAction(async t=>{let e=ut();if(e.identity){let a=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","adminLogout");try{await a.fire({identity:e.identity})}catch(r){console.error("Logout error:",r)}}return{identity:null,isLoggedIn:!1}}),Km=nr.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let s=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getCombinedMetrics").fire({identity:e.identity,sections:{server:!0,email:!0,dns:!0,security:!0,network:!1,radius:!0,vpn:!0}});return{serverStats:s.metrics.server||a.serverStats,emailStats:s.metrics.email||a.emailStats,dnsStats:s.metrics.dns||a.dnsStats,securityMetrics:s.metrics.security||a.securityMetrics,radiusStats:s.metrics.radius||a.radiusStats,vpnStats:s.metrics.vpn||a.vpnStats,lastUpdated:Date.now(),isLoading:!1,error:null}}catch(r){return{...a,isLoading:!1,error:r.message||"Failed to fetch statistics"}}}),Vie=g4.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{return{config:(await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getConfiguration").fire({identity:e.identity})).config,isLoading:!1,error:null}}catch(r){return{...a,isLoading:!1,error:r.message||"Failed to fetch configuration"}}}),jie=pc.createAction(async(t,e)=>{let a=ut();if(!a.identity)return t.getState();let s=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getRecentLogs").fire({identity:a.identity,limit:e.limit||100,level:e.level,category:e.category});return{...t.getState(),recentLogs:s.logs}}),Vmo=Os.createAction(async t=>{let e=t.getState();return{...e,autoRefresh:!e.autoRefresh}}),jmo=Os.createAction(async(t,e)=>{let a=t.getState();return e==="network"&&a.activeView!=="network"&&setTimeout(()=>{m4.dispatchAction(GJe,null)},100),e==="domains"&&a.activeView!=="domains"&&setTimeout(()=>{Ao.dispatchAction(h4,null)},100),{...a,activeView:e}}),GJe=m4.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let s=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getNetworkStats").fire({identity:e.identity}),o={},n=new Map;for(let c of s.throughputByIP||[])n.set(c.ip,{in:c.in,out:c.out});return s.connectionsByIP&&Array.isArray(s.connectionsByIP)&&s.connectionsByIP.forEach(c=>{o[c.ip]=c.count}),{connections:Object.entries(o).map(([c,d])=>{let u=n.get(c);return{id:`ip-${c}`,remoteAddress:c,localAddress:"server",startTime:0,protocol:"https",state:"connected",bytesReceived:u?.in||0,bytesSent:u?.out||0,connectionCount:d}}),connectionsByIP:o,throughputRate:s.throughputRate||{bytesInPerSecond:0,bytesOutPerSecond:0},totalBytes:s.totalDataTransferred?{in:s.totalDataTransferred.bytesIn,out:s.totalDataTransferred.bytesOut}:{in:0,out:0},topIPs:s.topIPs||[],topIPsByBandwidth:s.topIPsByBandwidth||[],throughputByIP:s.throughputByIP||[],domainActivity:s.domainActivity||[],throughputHistory:s.throughputHistory||[],requestsPerSecond:s.requestsPerSecond||0,requestsTotal:s.requestsTotal||0,backends:s.backends||[],frontendProtocols:s.frontendProtocols||null,backendProtocols:s.backendProtocols||null,lastUpdated:Date.now(),isLoading:!1,error:null}}catch(r){return console.error("Failed to fetch network stats:",r),{...a,isLoading:!1,error:r instanceof Error?r.message:"Failed to fetch network stats"}}}),vha=Hie.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{return{emails:(await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getAllEmails").fire({identity:e.identity})).emails,isLoading:!1,error:null,lastUpdated:Date.now()}}catch(r){return{...a,isLoading:!1,error:r instanceof Error?r.message:"Failed to fetch emails"}}}),h4=Ao.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let s=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getCertificateOverview").fire({identity:e.identity});return{certificates:s.certificates,summary:s.summary,isLoading:!1,error:null,lastUpdated:Date.now()}}catch(r){return{...a,isLoading:!1,error:r instanceof Error?r.message:"Failed to fetch certificate overview"}}}),xha=Ao.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","reprovisionCertificateDomain").fire({identity:r.identity,domain:e.domain,forceRenew:e.forceRenew}),await a.dispatch(h4,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to reprovision certificate"}}}),yha=Ao.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteCertificate").fire({identity:r.identity,domain:e}),await a.dispatch(h4,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to delete certificate"}}}),wha=Ao.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","importCertificate").fire({identity:r.identity,cert:e}),await a.dispatch(h4,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to import certificate"}}});async function Mha(t){let e=ut();return new Xe.plugins.typedrequest.TypedRequest("/typedrequest","exportCertificate").fire({identity:e.identity,domain:t})}i(Mha,"fetchCertificateExport");async function YJe(t){let e=ut();return new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getRemoteIngressConnectionToken").fire({identity:e.identity,edgeId:t})}i(YJe,"fetchConnectionToken");var S5=Ri.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let r=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getRemoteIngresses"),s=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getRemoteIngressStatus"),[o,n]=await Promise.all([r.fire({identity:e.identity}),s.fire({identity:e.identity})]);return{...a,edges:o.edges,statuses:n.statuses,isLoading:!1,error:null,lastUpdated:Date.now()}}catch(r){return{...a,isLoading:!1,error:r instanceof Error?r.message:"Failed to fetch remote ingress data"}}}),kha=Ri.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{let n=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createRemoteIngress").fire({identity:r.identity,name:e.name,listenPorts:e.listenPorts,autoDerivePorts:e.autoDerivePorts,tags:e.tags});return n.success?(await a.dispatch(S5,null),{...t.getState(),newEdgeId:n.edge.id}):s}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to create edge"}}}),Sha=Ri.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteRemoteIngress").fire({identity:r.identity,id:e}),await a.dispatch(S5,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to delete edge"}}}),Cha=Ri.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","updateRemoteIngress").fire({identity:r.identity,id:e.id,name:e.name,listenPorts:e.listenPorts,autoDerivePorts:e.autoDerivePorts,tags:e.tags}),await a.dispatch(S5,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to update edge"}}}),zha=Ri.createAction(async(t,e)=>{let a=ut(),r=t.getState();try{return(await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","regenerateRemoteIngressSecret").fire({identity:a.identity,id:e})).success?{...r,newEdgeId:e}:r}catch(s){return{...r,error:s instanceof Error?s.message:"Failed to regenerate secret"}}}),Tha=Ri.createAction(async t=>({...t.getState(),newEdgeId:null})),KJe=Ri.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","updateRemoteIngress").fire({identity:r.identity,id:e.id,enabled:e.enabled}),await a.dispatch(S5,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to toggle edge"}}}),Fi=await fs.getStatePart("vpn",{clients:[],connectedClients:[],status:null,isLoading:!1,error:null,lastUpdated:0,newClientConfig:null},"soft"),C5=Fi.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let r=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getVpnClients"),s=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getVpnStatus"),o=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getVpnConnectedClients"),[n,l,c]=await Promise.all([r.fire({identity:e.identity}),s.fire({identity:e.identity}),o.fire({identity:e.identity})]);return{...a,clients:n.clients,connectedClients:c.connectedClients,status:l.status,isLoading:!1,error:null,lastUpdated:Date.now()}}catch(r){return{...a,isLoading:!1,error:r instanceof Error?r.message:"Failed to fetch VPN data"}}}),_ha=Fi.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{let n=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createVpnClient").fire({identity:r.identity,clientId:e.clientId,targetProfileIds:e.targetProfileIds,description:e.description,destinationAllowList:e.destinationAllowList,destinationBlockList:e.destinationBlockList,useHostIp:e.useHostIp,useDhcp:e.useDhcp,staticIp:e.staticIp,forceVlan:e.forceVlan,vlanId:e.vlanId});return n.success?{...await a.dispatch(C5,null),newClientConfig:n.wireguardConfig||null}:{...s,error:n.message||"Failed to create client"}}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to create VPN client"}}}),Lha=Fi.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteVpnClient").fire({identity:r.identity,clientId:e}),await a.dispatch(C5,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to delete VPN client"}}}),ZJe=Fi.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{let o=e.enabled?"enableVpnClient":"disableVpnClient";return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest",o).fire({identity:r.identity,clientId:e.clientId}),await a.dispatch(C5,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to toggle VPN client"}}}),$ha=Fi.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{let n=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","updateVpnClient").fire({identity:r.identity,clientId:e.clientId,description:e.description,targetProfileIds:e.targetProfileIds,destinationAllowList:e.destinationAllowList,destinationBlockList:e.destinationBlockList,useHostIp:e.useHostIp,useDhcp:e.useDhcp,staticIp:e.staticIp,forceVlan:e.forceVlan,vlanId:e.vlanId});return n.success?await a.dispatch(C5,null):{...s,error:n.message||"Failed to update client"}}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to update VPN client"}}}),Dha=Fi.createAction(async t=>({...t.getState(),newClientConfig:null})),Oi=await fs.getStatePart("targetProfiles",{profiles:[],isLoading:!1,error:null,lastUpdated:0},"soft"),fc=Oi.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{return{profiles:(await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getTargetProfiles").fire({identity:e.identity})).profiles,isLoading:!1,error:null,lastUpdated:Date.now()}}catch(r){return{...a,isLoading:!1,error:r instanceof Error?r.message:"Failed to fetch target profiles"}}}),Aha=Oi.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createTargetProfile").fire({identity:r.identity,name:e.name,description:e.description,domains:e.domains,targets:e.targets,routeRefs:e.routeRefs});return o.success?await a.dispatch(fc,null):{...t.getState(),error:o.message||"Failed to create target profile"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to create target profile"}}}),Iha=Oi.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","updateTargetProfile").fire({identity:r.identity,id:e.id,name:e.name,description:e.description,domains:e.domains,targets:e.targets,routeRefs:e.routeRefs});return o.success?await a.dispatch(fc,null):{...t.getState(),error:o.message||"Failed to update target profile"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to update target profile"}}}),XJe=Oi.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteTargetProfile").fire({identity:r.identity,id:e.id,force:e.force});return o.success?await a.dispatch(fc,null):{...t.getState(),error:o.message||"Failed to delete target profile"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to delete target profile"}}}),Ua=await fs.getStatePart("profilesTargets",{profiles:[],targets:[],isLoading:!1,error:null,lastUpdated:0},"soft"),Io=Ua.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let r=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getSourceProfiles"),s=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getNetworkTargets"),[o,n]=await Promise.all([r.fire({identity:e.identity}),s.fire({identity:e.identity})]);return{profiles:o.profiles,targets:n.targets,isLoading:!1,error:null,lastUpdated:Date.now()}}catch(r){return{...a,isLoading:!1,error:r instanceof Error?r.message:"Failed to fetch profiles/targets"}}}),Pha=Ua.createAction(async(t,e,a)=>{let r=ut();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createSourceProfile").fire({identity:r.identity,name:e.name,description:e.description,security:e.security,extendsProfiles:e.extendsProfiles}),await a.dispatch(Io,null)}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to create profile"}}}),Eha=Ua.createAction(async(t,e,a)=>{let r=ut();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","updateSourceProfile").fire({identity:r.identity,id:e.id,name:e.name,description:e.description,security:e.security,extendsProfiles:e.extendsProfiles}),await a.dispatch(Io,null)}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to update profile"}}}),QJe=Ua.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteSourceProfile").fire({identity:r.identity,id:e.id,force:e.force});return o.success?await a.dispatch(Io,null):{...t.getState(),error:o.message||"Failed to delete profile"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to delete profile"}}}),Nha=Ua.createAction(async(t,e,a)=>{let r=ut();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createNetworkTarget").fire({identity:r.identity,name:e.name,description:e.description,host:e.host,port:e.port}),await a.dispatch(Io,null)}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to create target"}}}),Rha=Ua.createAction(async(t,e,a)=>{let r=ut();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","updateNetworkTarget").fire({identity:r.identity,id:e.id,name:e.name,description:e.description,host:e.host,port:e.port}),await a.dispatch(Io,null)}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to update target"}}}),JJe=Ua.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteNetworkTarget").fire({identity:r.identity,id:e.id,force:e.force});return o.success?await a.dispatch(Io,null):{...t.getState(),error:o.message||"Failed to delete target"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to delete target"}}}),Bt=await fs.getStatePart("domains",{providers:[],domains:[],records:[],selectedDomainId:null,isLoading:!1,error:null,lastUpdated:0},"soft"),Ni=Bt.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let r=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getDnsProviders"),s=new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getDomains"),[o,n]=await Promise.all([r.fire({identity:e.identity}),s.fire({identity:e.identity})]);return{...a,providers:o.providers,domains:n.domains,isLoading:!1,error:null,lastUpdated:Date.now()}}catch(r){return{...a,isLoading:!1,error:r instanceof Error?r.message:"Failed to fetch domains/providers"}}}),hc=Bt.createAction(async(t,e)=>{let a=ut(),r=t.getState();if(!a.identity)return r;try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getDnsRecords").fire({identity:a.identity,domainId:e.domainId});return{...r,records:o.records,selectedDomainId:e.domainId,error:null}}catch(s){return{...r,error:s instanceof Error?s.message:"Failed to fetch DNS records"}}}),Fha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createDnsProvider").fire({identity:r.identity,name:e.name,type:e.type,credentials:e.credentials});return o.success?await a.dispatch(Ni,null):{...t.getState(),error:o.message||"Failed to create provider"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to create provider"}}}),Oha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","updateDnsProvider").fire({identity:r.identity,id:e.id,name:e.name,credentials:e.credentials});return o.success?await a.dispatch(Ni,null):{...t.getState(),error:o.message||"Failed to update provider"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to update provider"}}}),Bha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteDnsProvider").fire({identity:r.identity,id:e.id,force:e.force});return o.success?await a.dispatch(Ni,null):{...t.getState(),error:o.message||"Failed to delete provider"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to delete provider"}}}),qha=Bt.createAction(async(t,e,a)=>{let r=ut();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","testDnsProvider").fire({identity:r.identity,id:e.id}),await a.dispatch(Ni,null)}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to test provider"}}});async function Hha(t){let e=ut();return e.identity?await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","listProviderDomains").fire({identity:e.identity,providerId:t}):{success:!1,message:"Not authenticated"}}i(Hha,"fetchProviderDomains");var Vha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createDomain").fire({identity:r.identity,name:e.name,description:e.description});return o.success?await a.dispatch(Ni,null):{...t.getState(),error:o.message||"Failed to create domain"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to create domain"}}}),jha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","importDomain").fire({identity:r.identity,providerId:e.providerId,domainNames:e.domainNames});return o.success?await a.dispatch(Ni,null):{...t.getState(),error:o.message||"Failed to import domains"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to import domains"}}}),Uha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteDomain").fire({identity:r.identity,id:e.id});return o.success?await a.dispatch(Ni,null):{...t.getState(),error:o.message||"Failed to delete domain"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to delete domain"}}}),Wha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","syncDomain").fire({identity:r.identity,id:e.id});return o.success?await a.dispatch(Ni,null):{...t.getState(),error:o.message||"Failed to sync domain"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to sync domain"}}}),Gha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","migrateDomain").fire({identity:r.identity,...e});return o.success?await a.dispatch(Ni,null):{...t.getState(),error:o.message||"Migration failed"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Migration failed"}}}),Yha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createDnsRecord").fire({identity:r.identity,domainId:e.domainId,name:e.name,type:e.type,value:e.value,ttl:e.ttl,proxied:e.proxied});return o.success?await a.dispatch(hc,{domainId:e.domainId}):{...t.getState(),error:o.message||"Failed to create record"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to create record"}}}),Kha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","updateDnsRecord").fire({identity:r.identity,id:e.id,name:e.name,value:e.value,ttl:e.ttl,proxied:e.proxied});return o.success?await a.dispatch(hc,{domainId:e.domainId}):{...t.getState(),error:o.message||"Failed to update record"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to update record"}}}),Zha=Bt.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteDnsRecord").fire({identity:r.identity,id:e.id});return o.success?await a.dispatch(hc,{domainId:e.domainId}):{...t.getState(),error:o.message||"Failed to delete record"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to delete record"}}}),eet=T5.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{return{config:(await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getAcmeConfig").fire({identity:e.identity})).config,isLoading:!1,error:null,lastUpdated:Date.now()}}catch(r){return{...a,isLoading:!1,error:r instanceof Error?r.message:"Failed to fetch ACME config"}}}),Xha=T5.createAction(async(t,e,a)=>{let r=ut();try{let o=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","updateAcmeConfig").fire({identity:r.identity,accountEmail:e.accountEmail,enabled:e.enabled,useProduction:e.useProduction,autoRenew:e.autoRenew,renewThresholdDays:e.renewThresholdDays});return o.success?await a.dispatch(eet,null):{...t.getState(),error:o.message||"Failed to update ACME config"}}catch(s){return{...t.getState(),error:s instanceof Error?s.message:"Failed to update ACME config"}}}),E2=Fa.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let s=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getMergedRoutes").fire({identity:e.identity});return{...a,mergedRoutes:s.routes,warnings:s.warnings,isLoading:!1,error:null,lastUpdated:Date.now()}}catch(r){return{...a,isLoading:!1,error:r instanceof Error?r.message:"Failed to fetch routes"}}}),Qha=Fa.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createRoute").fire({identity:r.identity,route:e.route,enabled:e.enabled,metadata:e.metadata}),await a.dispatch(E2,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to create route"}}}),Jha=Fa.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{let n=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","updateRoute").fire({identity:r.identity,id:e.id,route:e.route,enabled:e.enabled,metadata:e.metadata});if(!n.success)throw new Error(n.message||"Failed to update route");return await a.dispatch(E2,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to update route"}}}),tet=Fa.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{let n=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteRoute").fire({identity:r.identity,id:e});if(!n.success)throw new Error(n.message||"Failed to delete route");return await a.dispatch(E2,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to delete route"}}}),e8a=Fa.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{let n=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","toggleRoute").fire({identity:r.identity,id:e.id,enabled:e.enabled});if(!n.success)throw new Error(n.message||"Failed to toggle route");return await a.dispatch(E2,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to toggle route"}}}),_5=Fa.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let s=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","listApiTokens").fire({identity:e.identity});return{...a,apiTokens:s.tokens}}catch(r){return{...a,error:r instanceof Error?r.message:"Failed to fetch tokens"}}}),aet=GW.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let s=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","listUsers").fire({identity:e.identity});return{...a,users:s.users,error:null,lastUpdated:Date.now()}}catch(r){return{...a,error:r instanceof Error?r.message:"Failed to fetch users"}}});async function t8a(t,e,a){let r=ut();return new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createApiToken").fire({identity:r.identity,name:t,scopes:e,expiresInDays:a})}i(t8a,"createApiToken");async function a8a(t){let e=ut();return new Xe.plugins.typedrequest.TypedRequest("/typedrequest","rollApiToken").fire({identity:e.identity,id:t})}i(a8a,"rollApiToken");var r8a=Fa.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","revokeApiToken").fire({identity:r.identity,id:e}),await a.dispatch(_5,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to revoke token"}}}),ret=Fa.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","toggleApiToken").fire({identity:r.identity,id:e.id,enabled:e.enabled}),await a.dispatch(_5,null)}catch(o){return{...s,error:o instanceof Error?o.message:"Failed to toggle token"}}}),fo=await fs.getStatePart("emailDomains",{domains:[],isLoading:!1,lastUpdated:0},"soft"),z5=fo.createAction(async t=>{let e=ut(),a=t.getState();if(!e.identity)return a;try{let s=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getEmailDomains").fire({identity:e.identity});return{...a,domains:s.domains,isLoading:!1,lastUpdated:Date.now()}}catch{return{...a,isLoading:!1}}}),i8a=fo.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","createEmailDomain").fire({identity:r.identity,...e}),await a.dispatch(z5,null)}catch{return s}}),s8a=fo.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","deleteEmailDomain").fire({identity:r.identity,id:e}),await a.dispatch(z5,null)}catch{return s}}),o8a=fo.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","validateEmailDomain").fire({identity:r.identity,id:e}),await a.dispatch(z5,null)}catch{return s}}),iet=fo.createAction(async(t,e,a)=>{let r=ut(),s=t.getState();try{return await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","provisionEmailDomainDns").fire({identity:r.identity,id:e}),await a.dispatch(z5,null)}catch{return s}});async function n8a(t){let e=ut();return new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getEmailDomainDnsRecords").fire({identity:e.identity,id:t})}i(n8a,"fetchEmailDomainDnsRecords");var M5=null,pha=new Xe.plugins.typedrequest.TypedRouter,qie=[],VJe=!1;function eja(){if(VJe=!1,qie.length===0)return;let t=pc.getState(),e=[...t.recentLogs,...qie];qie=[],e.length>2e3&&e.splice(0,e.length-2e3),pc.setState({...t,recentLogs:e})}i(eja,"flushLogEntries"),pha.addTypedHandler(new Xe.plugins.typedrequest.TypedHandler("pushLogEntry",async t=>(qie.push(t.entry),VJe||(VJe=!0,requestAnimationFrame(eja)),{})));async function jJe(){if(!M5)try{M5=await Hm.TypedSocket.createClient(pha,Hm.TypedSocket.useWindowLocationOriginUrl()),await M5.setTag("role","ops_dashboard")}catch(t){console.error("TypedSocket connection failed:",t),M5=null}}i(jJe,"connectSocket");async function fha(){if(M5){try{await M5.stop()}catch{}M5=null}}i(fha,"disconnectSocket");var UJe=!1;async function tja(){if(!UJe){UJe=!0;try{await aja()}finally{UJe=!1}}}i(tja,"dispatchCombinedRefreshAction");async function aja(){let t=ut();if(!t.identity)return;let e=Os.getState().activeView,a=Os.getState().activeSubview;try{let s=await new Xe.plugins.typedrequest.TypedRequest("/typedrequest","getCombinedMetrics").fire({identity:t.identity,sections:{server:!0,email:!0,dns:!0,security:!0,network:e==="network"&&a==="activity",radius:!0,vpn:!0}}),o=nr.getState();if(nr.setState({...o,serverStats:s.metrics.server||o.serverStats,emailStats:s.metrics.email||o.emailStats,dnsStats:s.metrics.dns||o.dnsStats,securityMetrics:s.metrics.security||o.securityMetrics,radiusStats:s.metrics.radius||o.radiusStats,vpnStats:s.metrics.vpn||o.vpnStats,lastUpdated:Date.now(),isLoading:!1,error:null}),s.metrics.network&&e==="network"){let n=s.metrics.network,l={};n.connectionDetails.forEach(d=>{l[d.remoteAddress]=(l[d.remoteAddress]||0)+(d.connectionCount||1)});let c=n.connectionDetails.map((d,u)=>({id:`ip-${d.remoteAddress}`,remoteAddress:d.remoteAddress,localAddress:"server",startTime:d.startTime,protocol:d.protocol,state:d.state,bytesReceived:d.bytesIn,bytesSent:d.bytesOut,connectionCount:d.connectionCount}));m4.setState({...m4.getState(),connections:c,connectionsByIP:l,throughputRate:{bytesInPerSecond:n.totalBandwidth.in,bytesOutPerSecond:n.totalBandwidth.out},totalBytes:n.totalBytes||{in:0,out:0},topIPs:n.topEndpoints.map(d=>({ip:d.endpoint,count:d.connections})),topIPsByBandwidth:(n.topEndpointsByBandwidth||[]).map(d=>({ip:d.endpoint,count:d.connections,bwIn:d.bandwidth?.in||0,bwOut:d.bandwidth?.out||0})),throughputByIP:n.topEndpoints.map(d=>({ip:d.endpoint,in:d.bandwidth?.in||0,out:d.bandwidth?.out||0})),domainActivity:n.domainActivity||[],throughputHistory:n.throughputHistory||[],requestsPerSecond:n.requestsPerSecond||0,requestsTotal:n.requestsTotal||0,backends:n.backends||[],frontendProtocols:n.frontendProtocols||null,backendProtocols:n.backendProtocols||null,lastUpdated:Date.now(),isLoading:!1,error:null})}if(e==="domains"&&a==="certificates")try{await Ao.dispatchAction(h4,null)}catch(n){console.error("Certificate refresh failed:",n)}if(e==="network"&&a==="remoteingress")try{await Ri.dispatchAction(S5,null)}catch(n){console.error("Remote ingress refresh failed:",n)}if(e==="network"&&a==="vpn")try{await Fi.dispatchAction(C5,null)}catch(n){console.error("VPN refresh failed:",n)}}catch(r){console.error("Combined refresh failed:",r);let s=String(r);(s.includes("invalid")||s.includes("unauthorized")||s.includes("401"))&&(await Ia.dispatchAction(Ym,null),window.location.reload())}}i(aja,"dispatchCombinedRefreshActionInner");var rja=nr.createAction(async t=>(await tja(),t.getState())),k5=null,WJe=i(()=>{let t=Os.getState(),e=Ia.getState();t.autoRefresh&&e.isLoggedIn?(k5&&(k5.dispose(),k5=null),k5=nr.createScheduledAction({action:rja,payload:void 0,intervalMs:t.refreshInterval,autoPause:"visibility"})):k5&&(k5.dispose(),k5=null)},"startAutoRefresh"),hha=Os.getState().autoRefresh,mha=Os.getState().refreshInterval,gha=Ia.getState().isLoggedIn;Os.select(t=>({autoRefresh:t.autoRefresh,refreshInterval:t.refreshInterval})).subscribe(t=>{(t.autoRefresh!==hha||t.refreshInterval!==mha)&&(hha=t.autoRefresh,mha=t.refreshInterval,WJe())}),Ia.select(t=>t.isLoggedIn).subscribe(t=>{t!==gha&&(gha=t,WJe(),t?jJe():fha())}),document.addEventListener("visibilitychange",()=>{document.hidden?fha():Ia.getState().isLoggedIn&&jJe()}),WJe(),Ia.getState().isLoggedIn&&jJe();U4();var N2={};pt(N2,{DCROUTER_BUILTIN_PROVIDER_ID:()=>ija,dnsProviderTypeDescriptors:()=>l8a,getDnsProviderTypeDescriptor:()=>sja});var ija="__dcrouter__",l8a=[{type:"dcrouter",displayName:"DcRouter (built-in)",description:"Built-in authoritative DNS. Records are served directly by dcrouter \u2014 delegate the domain's NS records to make this effective.",credentialFields:[]},{type:"cloudflare",displayName:"Cloudflare",description:"External DNS provider. The provider stays authoritative; dcrouter pushes record changes via its API.",credentialFields:[{key:"apiToken",label:"API Token",helpText:"A Cloudflare API token with Zone:Read and DNS:Edit permissions for the target zones.",required:!0,secret:!0}]}];function sja(t){return l8a.find(e=>e.type===t)}i(sja,"getDnsProviderTypeDescriptor");var c8a={};var oja=Xe.plugins.smartrouter.SmartRouter,u8a=["logs"],Zm={overview:["stats","configuration"],network:["activity","routes","sourceprofiles","networktargets","targetprofiles","remoteingress","vpn"],email:["log","security","domains"],access:["apitokens","users"],security:["overview","blocked","authentication"],domains:["providers","domains","dns","certificates"]},set={overview:"stats",network:"activity",email:"log",access:"apitokens",security:"overview",domains:"domains"},nja=[...u8a,...Object.keys(Zm)];function p8a(t){return nja.includes(t)}i(p8a,"isValidView");function f8a(t,e){return Zm[t]?.includes(e)??!1}i(f8a,"isValidSubview");var oet=class{static{i(this,"AppRouter")}router;initialized=!1;suppressStateUpdate=!1;constructor(){this.router=new oja({debug:!1})}init(){this.initialized||(this.setupRoutes(),this.setupStateSync(),this.handleInitialRoute(),this.initialized=!0)}setupRoutes(){for(let e of u8a)this.router.on(`/${e}`,async()=>{this.updateViewState(e,null)});for(let e of Object.keys(Zm)){this.router.on(`/${e}`,async()=>{this.navigateTo(`/${e}/${set[e]}`)});for(let a of Zm[e])this.router.on(`/${e}/${a}`,async()=>{this.updateViewState(e,a)})}this.router.on("/",async()=>{this.navigateTo("/overview")})}setupStateSync(){Os.select().subscribe(e=>{if(this.suppressStateUpdate)return;let a=window.location.pathname,r=e.activeSubview?`/${e.activeView}/${e.activeSubview}`:`/${e.activeView}`;a!==r&&(this.suppressStateUpdate=!0,this.router.pushUrl(r),this.suppressStateUpdate=!1)})}handleInitialRoute(){let e=window.location.pathname;if(!e||e==="/"){this.router.pushUrl("/overview");return}let a=e.split("/").filter(Boolean),r=a[0],s=a[1];if(!p8a(r)){this.router.pushUrl("/overview");return}Zm[r]?s&&f8a(r,s)?this.updateViewState(r,s):this.router.pushUrl(`/${r}/${set[r]}`):this.updateViewState(r,null)}updateViewState(e,a){this.suppressStateUpdate=!0;let r=Os.getState();(r.activeView!==e||r.activeSubview!==a)&&Os.setState({...r,activeView:e,activeSubview:a}),this.suppressStateUpdate=!1}navigateTo(e){this.router.pushUrl(e)}navigateToView(e,a){if(!p8a(e)){this.navigateTo("/overview");return}a&&f8a(e,a)?this.navigateTo(`/${e}/${a}`):Zm[e]?this.navigateTo(`/${e}/${set[e]}`):this.navigateTo(`/${e}`)}getCurrentView(){return Os.getState().activeView}destroy(){this.router.destroy(),this.initialized=!1}},mc=new oet;le();var Yt=W`
42462
42462
  :host {
42463
42463
  display: block;
42464
42464
  margin: auto;
@@ -46347,4 +46347,4 @@ ibantools/jsnext/ibantools.js:
46347
46347
  * @preferred
46348
46348
  *)
46349
46349
  */
46350
- //# sourceMappingURL=bundle-1777205737831.js.map
46350
+ //# sourceMappingURL=bundle-1777216573419.js.map
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/dcrouter',
6
- version: '13.22.0',
6
+ version: '13.23.0',
7
7
  description: 'A multifaceted routing service handling mail and SMS delivery functions.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxzQkFBc0I7SUFDNUIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsV0FBVyxFQUFFLDBFQUEwRTtDQUN4RixDQUFBIn0=
@@ -9,6 +9,7 @@ import { RadiusServer, type IRadiusServerConfig } from './radius/index.js';
9
9
  import { RemoteIngressManager, TunnelManager } from './remoteingress/index.js';
10
10
  import { VpnManager } from './vpn/index.js';
11
11
  import { RouteConfigManager, ApiTokenManager, ReferenceResolver, TargetProfileManager } from './config/index.js';
12
+ import { SecurityPolicyManager } from './security/index.js';
12
13
  import { type IHttp3Config } from './http3/index.js';
13
14
  import { DnsManager } from './dns/manager.dns.js';
14
15
  import { AcmeConfigManager } from './acme/manager.acme-config.js';
@@ -227,6 +228,7 @@ export declare class DcRouter {
227
228
  dnsManager?: DnsManager;
228
229
  acmeConfigManager?: AcmeConfigManager;
229
230
  emailDomainManager?: EmailDomainManager;
231
+ securityPolicyManager?: SecurityPolicyManager;
230
232
  detectedPublicIp: string | null;
231
233
  private dnsLogWindowSecond;
232
234
  private dnsLogWindowCount;
@@ -274,6 +276,8 @@ export declare class DcRouter {
274
276
  * Set up SmartProxy with direct configuration and automatic email routes
275
277
  */
276
278
  private setupSmartProxy;
279
+ applySecurityPolicy(): Promise<void>;
280
+ private mergeSecurityPolicies;
277
281
  /**
278
282
  * Generate SmartProxy routes for email configuration
279
283
  */