From d5e5a902cc85bf54adbffb92cb5ba78dceb62cf1 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Tue, 12 Aug 2025 15:50:27 +0000 Subject: [PATCH 01/74] backported svelteUI from SteamSUI into StationeersSUI. Looks cool, not much functionality. --- .devcontainer/Dockerfile | 18 + .devcontainer/devcontainer.json | 13 +- .gitignore | 3 + .vscode/extensions.json | 1 + .vscode/launch.json | 10 + .vscode/tasks.json | 109 +- UIMod/onboard_bundled/v2/assets/ssui.css | 1 + UIMod/onboard_bundled/v2/assets/ssui.js | 13 + UIMod/onboard_bundled/v2/index.html | 14 + build/version.go | 57 + frontend/.vscode/extensions.json | 3 + frontend/.vscode/settings.json | 11 + frontend/README.md | 47 + frontend/electron-builder.yml | 25 + frontend/index.html | 13 + frontend/jsconfig.json | 32 + frontend/main.cjs | 458 ++ frontend/package-lock.json | 5277 +++++++++++++++++ frontend/package.json | 42 + frontend/src/App.svelte | 86 + frontend/src/AuthGuard.svelte | 63 + frontend/src/BackendInitializer.svelte | 116 + frontend/src/Login.svelte | 928 +++ frontend/src/app.css | 29 + .../components/Dashboard/DashboardView.svelte | 35 + .../Dashboard/cards/ActivityCard.svelte | 113 + .../Dashboard/cards/ConsoleCard.svelte | 39 + .../Dashboard/cards/LogsCard.svelte | 39 + .../Dashboard/cards/QuickActionsCard.svelte | 61 + .../Dashboard/cards/SystemInfoCard.svelte | 220 + frontend/src/components/MainContent.svelte | 114 + frontend/src/components/nav/Sidebar.svelte | 164 + frontend/src/components/nav/TopNav.svelte | 744 +++ .../resuables/InitializingView.svelte | 215 + .../src/components/resuables/ReloadAll.svelte | 130 + .../resuables/ScreenNotSupported.svelte | 193 + .../components/resuables/ToggleServer.svelte | 164 + .../components/settings/ConfigManager.svelte | 76 + .../settings/DetectionManager.svelte | 76 + .../components/settings/SettingsView.svelte | 86 + .../components/settings/UserSettings.svelte | 374 ++ .../src/components/views/BackupsView.svelte | 864 +++ .../src/components/views/ConsoleView.svelte | 464 ++ frontend/src/components/views/LogsView.svelte | 472 ++ frontend/src/main.js | 7 + frontend/src/services/api.js | 579 ++ frontend/src/services/whoami.js | 117 + frontend/src/tabs.js | 20 + frontend/src/themes/theme.css | 88 + frontend/src/themes/theme.js | 384 ++ frontend/src/vite-env.d.ts | 2 + frontend/svelte.config.js | 7 + frontend/vite.config.js | 29 + src/config/config.go | 2 +- src/setup/cleanup.go | 26 +- src/web/start.go | 7 + src/web/svelteui.go | 59 + 57 files changed, 13320 insertions(+), 19 deletions(-) create mode 100644 UIMod/onboard_bundled/v2/assets/ssui.css create mode 100644 UIMod/onboard_bundled/v2/assets/ssui.js create mode 100644 UIMod/onboard_bundled/v2/index.html create mode 100644 build/version.go create mode 100644 frontend/.vscode/extensions.json create mode 100644 frontend/.vscode/settings.json create mode 100644 frontend/README.md create mode 100644 frontend/electron-builder.yml create mode 100644 frontend/index.html create mode 100644 frontend/jsconfig.json create mode 100644 frontend/main.cjs create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/src/App.svelte create mode 100644 frontend/src/AuthGuard.svelte create mode 100644 frontend/src/BackendInitializer.svelte create mode 100644 frontend/src/Login.svelte create mode 100644 frontend/src/app.css create mode 100644 frontend/src/components/Dashboard/DashboardView.svelte create mode 100644 frontend/src/components/Dashboard/cards/ActivityCard.svelte create mode 100644 frontend/src/components/Dashboard/cards/ConsoleCard.svelte create mode 100644 frontend/src/components/Dashboard/cards/LogsCard.svelte create mode 100644 frontend/src/components/Dashboard/cards/QuickActionsCard.svelte create mode 100644 frontend/src/components/Dashboard/cards/SystemInfoCard.svelte create mode 100644 frontend/src/components/MainContent.svelte create mode 100644 frontend/src/components/nav/Sidebar.svelte create mode 100644 frontend/src/components/nav/TopNav.svelte create mode 100644 frontend/src/components/resuables/InitializingView.svelte create mode 100644 frontend/src/components/resuables/ReloadAll.svelte create mode 100644 frontend/src/components/resuables/ScreenNotSupported.svelte create mode 100644 frontend/src/components/resuables/ToggleServer.svelte create mode 100644 frontend/src/components/settings/ConfigManager.svelte create mode 100644 frontend/src/components/settings/DetectionManager.svelte create mode 100644 frontend/src/components/settings/SettingsView.svelte create mode 100644 frontend/src/components/settings/UserSettings.svelte create mode 100644 frontend/src/components/views/BackupsView.svelte create mode 100644 frontend/src/components/views/ConsoleView.svelte create mode 100644 frontend/src/components/views/LogsView.svelte create mode 100644 frontend/src/main.js create mode 100644 frontend/src/services/api.js create mode 100644 frontend/src/services/whoami.js create mode 100644 frontend/src/tabs.js create mode 100644 frontend/src/themes/theme.css create mode 100644 frontend/src/themes/theme.js create mode 100644 frontend/src/vite-env.d.ts create mode 100644 frontend/svelte.config.js create mode 100644 frontend/vite.config.js create mode 100644 src/web/svelteui.go diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 5b73033c..a32bb117 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -19,6 +19,24 @@ ENV PATH="/usr/local/go/bin:${PATH}" ENV GOPATH=/go RUN mkdir -p /go/bin && chown -R vscode:vscode /go +# Install Node.js 22.15.0 +RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && \ + apt-get install -y nodejs && \ + npm install -g npm@latest + +# Install Wine for Windows .exe builds +RUN dpkg --add-architecture i386 && \ + apt-get update && \ + apt-get install -y wine wine32 wine64 && \ + rm -rf /var/lib/apt/lists/* + +# Install NSIS for Windows NSIS installer +RUN wget -q https://downloads.sourceforge.net/project/nsis/NSIS%203/3.09/nsis-3.09-setup.exe && \ + wine nsis-3.09-setup.exe /S && \ + rm nsis-3.09-setup.exe + +# Start D-Bus to avoid Electron errors +RUN service dbus start # Set up non-root user and workspace USER vscode diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 9df0bb67..5630fd07 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,5 +1,5 @@ { - "name": "StationeersServerUI (Go)", + "name": "StationeersServerUI (Go+Svelte)", "build": { "dockerfile": "Dockerfile" }, @@ -10,22 +10,25 @@ "version": "1.24.2" } }, - "forwardPorts": [8443], + "forwardPorts": [8443, 5173], "portsAttributes": { - "8443": { "label": "Go Backend Server" } + "8443": { "label": "Go Backend Server" }, + "5173": { "label": "Svelte UI Dev Server" } }, "customizations": { "vscode": { "extensions": [ "golang.go", + "svelte.svelte-vscode", "supermaven.supermaven", "eamodio.gitlens" ], "settings": { - "go.toolsManagement.autoUpdate": true + "go.toolsManagement.autoUpdate": true, + "svelte.enable-ts-plugin": true } } }, - "postCreateCommand": "go mod tidy" + "postCreateCommand": "go mod tidy && cd frontend && npm install && npm install @sveltejs/vite-plugin-svelte" } \ No newline at end of file diff --git a/.gitignore b/.gitignore index d5794090..b6203c91 100644 --- a/.gitignore +++ b/.gitignore @@ -39,4 +39,7 @@ UIMod/config/customdetections.json winhttp.dll autostart* __debug_bin* +frontend/node_modules +frontend/dist +frontend/build diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 8e47c3b8..f7964b08 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,5 +1,6 @@ { "recommendations": [ "golang.go", + "svelte.svelte-vscode" ] } \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 87340238..5e1d543e 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,6 +7,16 @@ "request": "launch", "mode": "debug", "program": "${workspaceFolder}/server.go", + "preLaunchTask": "npm: build", + "console": "integratedTerminal", + "showLog": false, // Hides some Go Debugger(Delve) log stuff that is not useful for debugging atm + }, + { + "name": "Debug Go Server noSvelte", + "type": "go", + "request": "launch", + "mode": "debug", + "program": "${workspaceFolder}/server.go", "console": "integratedTerminal", "showLog": false, // Hides some Go Debugger(Delve) log stuff that is not useful for debugging atm } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 282dbd0c..9cae5e5d 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,6 +1,76 @@ { "version": "2.0.0", "tasks": [ + { + "type": "shell", + "label": "npm: install", + "command": "npm", + "args": [ + "install" + ], + "options": { + "cwd": "${workspaceFolder}/frontend" + }, + "problemMatcher": [], + "group": "build", + "detail": "Install Svelte UI dependencies" + }, + { + "type": "shell", + "label": "npm: build", + "command": "npm", + "args": [ + "run", + "build" + ], + "options": { + "cwd": "${workspaceFolder}/frontend" + }, + "problemMatcher": [], + "group": "build", + "detail": "Build Svelte UI production bundle", + "hide": true + }, + { + "type": "shell", + "label": "go: sync backend version with frontend version", + "command": "go", + "args": [ + "run", + "./build/version.go" + ], + "problemMatcher": [ + "$go" + ], + "group": "build", + "detail": "Sync the backend version to package.json so the Electron auto updater can find its latest update on GitHub", + "hide": true + }, + { + "type": "shell", + "label": "npm: build electron & svelte", + "command": "npm", + "args": [ + "run", + "electron" + ], + "options": { + "cwd": "${workspaceFolder}/frontend" + }, + "problemMatcher": [], + "group": "test", + "isBackground": true, + "presentation": { + "reveal": "always", + "panel": "dedicated" + }, + "dependsOn": [ + "go: sync backend version with frontend version", + "npm: build" + ], + "dependsOrder": "sequence", + "detail": "Build Electron App for Linux and Windows" + }, { "type": "shell", "label": "go: run build.go", @@ -14,7 +84,44 @@ ], "group": "build", "detail": "Build Go binarys in ./build with fresh svelte assets", - "hide": false + "dependsOn": [ + "npm: build" + ], + "dependsOrder": "sequence", + "hide": true + }, + { + "label": "Build: Full Project (Prep a release)", + "dependsOn": [ + "npm: install", + "npm: build electron & svelte", + "go: run build.go" + ], + "dependsOrder": "sequence", + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "Complete build pipeline to prepare all files needed to ship release", + "problemMatcher": [] + }, + { + "label": "Run: Go Server with fresh assets", + "type": "shell", + "command": "go", + "args": [ + "run", + "./server.go" + ], + "problemMatcher": [ + "$go" + ], + "group": "test", + "detail": "Tip: press F5 for the VsCode Debugger instead of this task", + "dependsOn": [ + "npm: build" + ], + "dependsOrder": "sequence" } ] } \ No newline at end of file diff --git a/UIMod/onboard_bundled/v2/assets/ssui.css b/UIMod/onboard_bundled/v2/assets/ssui.css new file mode 100644 index 00000000..f411e0e0 --- /dev/null +++ b/UIMod/onboard_bundled/v2/assets/ssui.css @@ -0,0 +1 @@ +:root{font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;line-height:1.5;font-weight:400;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}*{box-sizing:border-box;margin:0;padding:0}html,body{height:100%;width:100%;margin:0;padding:0;overflow:hidden}input,button,select,textarea{font-family:inherit;font-size:inherit}h2.svelte-1cjnnh7{margin-top:0;margin-bottom:1.5rem;font-size:1.5rem;font-weight:500;color:var(--text-primary)}.settings-container.svelte-1cjnnh7{background-color:var(--bg-tertiary);border-radius:8px;padding:1.5rem;box-shadow:var(--shadow-light)}.settings-intro.svelte-1cjnnh7{margin-bottom:2rem;color:var(--text-secondary);line-height:1.5}.settings-group.svelte-1cjnnh7{margin-bottom:2rem;animation:svelte-1cjnnh7-fadeIn .3s ease}.settings-group.svelte-1cjnnh7 h3:where(.svelte-1cjnnh7){font-size:1.1rem;font-weight:500;margin-bottom:1.5rem;color:var(--text-accent);border-bottom:1px solid var(--border-color);padding-bottom:.5rem}.user-form.svelte-1cjnnh7{background-color:var(--bg-secondary);border:1px solid var(--border-color);border-radius:8px;padding:1.5rem}.form-row.svelte-1cjnnh7{margin-bottom:1.25rem}.form-field.svelte-1cjnnh7 label:where(.svelte-1cjnnh7){display:block;margin-bottom:.5rem;font-weight:500;color:var(--text-primary);font-size:.9rem}.text-input.svelte-1cjnnh7,.select-input.svelte-1cjnnh7{width:100%;padding:.75rem;border:1px solid var(--border-color);border-radius:6px;background-color:var(--bg-tertiary);color:var(--text-primary);font-size:.9rem;transition:all var(--transition-speed) ease}.text-input.svelte-1cjnnh7:focus,.select-input.svelte-1cjnnh7:focus{border-color:var(--accent-primary);outline:none;box-shadow:0 0 0 3px #6a99551a}.select-input.svelte-1cjnnh7{cursor:pointer}.form-actions.svelte-1cjnnh7{display:flex;gap:.75rem;margin-top:1.5rem}.primary-button.svelte-1cjnnh7{padding:.75rem 1.5rem;background-color:var(--accent-primary);color:#fff;border:none;border-radius:6px;cursor:pointer;font-weight:500;font-size:.9rem;transition:all var(--transition-speed) ease}.primary-button.svelte-1cjnnh7:hover{background-color:var(--accent-hover, #5a7a4a);transform:translateY(-1px)}.primary-button.svelte-1cjnnh7:active{transform:translateY(0)}.secondary-button.svelte-1cjnnh7{padding:.75rem 1.5rem;background-color:transparent;color:var(--text-primary);border:1px solid var(--border-color);border-radius:6px;cursor:pointer;font-weight:500;font-size:.9rem;transition:all var(--transition-speed) ease}.secondary-button.svelte-1cjnnh7:hover{background-color:var(--bg-hover);border-color:var(--accent-primary)}.status-message.svelte-1cjnnh7{margin-top:1.5rem;padding:1rem;display:flex;align-items:center;border-radius:6px;background-color:#6a99551a;color:var(--accent-primary);animation:svelte-1cjnnh7-slideIn .3s ease;position:relative}.status-message.error.svelte-1cjnnh7{background-color:#ce91781a;color:var(--text-warning)}.status-icon.svelte-1cjnnh7{margin-right:.75rem;font-size:1.2rem}.close-status.svelte-1cjnnh7{position:absolute;right:1rem;background:none;border:none;cursor:pointer;font-size:1.2rem;color:currentColor;opacity:.6}.close-status.svelte-1cjnnh7:hover{opacity:1}@keyframes svelte-1cjnnh7-fadeIn{0%{opacity:0}to{opacity:1}}@keyframes svelte-1cjnnh7-slideIn{0%{transform:translateY(-10px);opacity:0}to{transform:translateY(0);opacity:1}}@media (max-width: 768px){.settings-container.svelte-1cjnnh7,.user-form.svelte-1cjnnh7{padding:1rem}.form-actions.svelte-1cjnnh7{flex-direction:column}.primary-button.svelte-1cjnnh7,.secondary-button.svelte-1cjnnh7{width:100%}}.top-nav.svelte-xnmqz6{height:var(--top-nav-height);background-color:var(--bg-secondary);display:flex;align-items:center;justify-content:space-between;padding:0 1rem;box-shadow:var(--shadow-light);z-index:100;border-bottom:1px solid var(--border-color)}.nav-left.svelte-xnmqz6,.nav-right.svelte-xnmqz6{display:flex;align-items:center}.logo.svelte-xnmqz6{display:flex;align-items:center;gap:.5rem;font-weight:600;font-size:1.1rem;margin-right:2rem;padding:.25rem .5rem;border-radius:6px;cursor:pointer;transition:background-color var(--transition-speed) ease}.logo.svelte-xnmqz6:hover{background-color:var(--bg-hover)}.logo-icon.svelte-xnmqz6{font-size:1.3rem}.logo-text.svelte-xnmqz6{color:var(--accent-primary)}.nav-buttons.svelte-xnmqz6{display:flex;gap:.25rem}.nav-buttons.svelte-xnmqz6 button:where(.svelte-xnmqz6){background:transparent;color:var(--text-secondary);border:none;border-radius:6px;padding:.5rem 1rem;font-size:.9rem;transition:all var(--transition-speed) ease;position:relative}.nav-buttons.svelte-xnmqz6 button:where(.svelte-xnmqz6):hover{background-color:var(--bg-hover);color:var(--text-primary)}.nav-buttons.svelte-xnmqz6 button.active:where(.svelte-xnmqz6){color:var(--accent-primary);background-color:var(--bg-active);font-weight:500}.nav-buttons.svelte-xnmqz6 button.active:where(.svelte-xnmqz6):after{content:"";position:absolute;bottom:-1px;left:25%;width:50%;height:2px;background-color:var(--accent-primary);border-radius:2px}.backend-selector.svelte-xnmqz6{position:relative;margin-right:1rem}.backend-toggle.svelte-xnmqz6{display:flex;align-items:center;gap:.5rem;padding:.4rem .75rem;background-color:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:6px;font-size:.85rem;color:var(--text-primary);cursor:pointer;transition:all var(--transition-speed) ease}.backend-toggle.svelte-xnmqz6:hover{background-color:var(--bg-hover);border-color:var(--accent-tertiary)}.status-indicator.svelte-xnmqz6{font-size:.7rem}.dropdown-arrow.svelte-xnmqz6{font-size:.7rem;color:var(--text-secondary);margin-left:.25rem}.backend-dropdown.svelte-xnmqz6,.user-dropdown.svelte-xnmqz6{position:absolute;top:calc(100% + .5rem);right:0;min-width:220px;background:var(--bg-secondary);border-radius:8px;box-shadow:var(--shadow-medium);z-index:20;overflow:hidden;border:1px solid var(--border-color)}@keyframes svelte-xnmqz6-slide{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.dropdown-header.svelte-xnmqz6,.user-dropdown-header.svelte-xnmqz6{padding:.75rem 1rem;border-bottom:1px solid var(--border-color)}.dropdown-header.svelte-xnmqz6 h3:where(.svelte-xnmqz6){margin:0;font-size:.9rem;font-weight:500;color:var(--text-primary)}.dropdown-content.svelte-xnmqz6{max-height:300px;overflow-y:auto}.dropdown-item.svelte-xnmqz6{display:flex;justify-content:space-between;align-items:center;padding:.65rem 1rem;cursor:pointer;transition:background-color var(--transition-speed) ease;font-size:.85rem}.dropdown-item.svelte-xnmqz6:hover{background-color:var(--bg-hover)}.dropdown-item.active.svelte-xnmqz6{background-color:#6a99551a;font-weight:500}.backend-info.svelte-xnmqz6{display:flex;align-items:center;gap:.5rem}.status-dot.svelte-xnmqz6{width:8px;height:8px;border-radius:50%;display:inline-block}.backend-name.svelte-xnmqz6{color:var(--text-primary)}.active-marker.svelte-xnmqz6{color:var(--accent-primary);font-weight:700}.datetime.svelte-xnmqz6{display:flex;flex-direction:column;align-items:flex-end;margin-right:1rem}.date.svelte-xnmqz6{font-size:.7rem;color:var(--text-secondary);line-height:1}.time.svelte-xnmqz6{font-size:.9rem;color:var(--text-primary);font-weight:500}.user-menu-container.svelte-xnmqz6{position:relative;transition:all .3s ease}.user-menu-container.expanded.svelte-xnmqz6{transform:scale(1.02)}.user-button.svelte-xnmqz6{padding:0;width:2rem;height:2rem;display:flex;align-items:center;justify-content:center;border-radius:50%;border:none;background:transparent;cursor:pointer}.user-avatar.svelte-xnmqz6{width:2rem;height:2rem;border-radius:50%;background-color:var(--accent-secondary);color:var(--text-primary);display:flex;align-items:center;justify-content:center;font-size:.8rem;font-weight:500;transition:all var(--transition-speed) ease}.user-button.svelte-xnmqz6:hover .user-avatar:where(.svelte-xnmqz6){background-color:var(--accent-primary)}.user-dropdown.svelte-xnmqz6{right:0;width:240px}.user-settings-panel.svelte-xnmqz6{position:absolute;top:calc(100% + .5rem);right:0;min-width:320px;max-width:400px;background:var(--bg-secondary);border-radius:12px;box-shadow:var(--shadow-medium);z-index:25;overflow:hidden;border:1px solid var(--border-color)}.user-info.svelte-xnmqz6{display:flex;align-items:center;gap:.75rem;padding:.5rem 0}.user-avatar.large.svelte-xnmqz6{width:2.5rem;height:2.5rem;font-size:1rem}.user-details.svelte-xnmqz6{display:flex;flex-direction:column}.user-name.svelte-xnmqz6{font-weight:500;color:var(--text-primary);font-size:.9rem}.user-access-level.svelte-xnmqz6{color:var(--text-secondary);font-size:.75rem}.item-icon.svelte-xnmqz6{margin-right:.5rem;font-size:.9rem;min-width:1rem;display:inline-flex;justify-content:center}.divider.svelte-xnmqz6{height:1px;background-color:var(--border-color);margin:.25rem 0}.dropdown-item.logout.svelte-xnmqz6{color:var(--text-warning)}@keyframes svelte-xnmqz6-fadeIn{0%{opacity:0}to{opacity:1}}.sidebar.svelte-p1a138{width:var(--sidebar-collapsed-width);height:100%;background-color:var(--bg-secondary);border-right:1px solid var(--border-color);display:flex;flex-direction:column;overflow:hidden;transition:width var(--transition-speed) ease;z-index:5}.sidebar.expanded.svelte-p1a138{width:var(--sidebar-width)}.pin-container.svelte-p1a138{display:flex;justify-content:flex-end;padding:.5rem}.pin-button.svelte-p1a138{padding:.25rem;width:2rem;height:2rem;display:flex;align-items:center;justify-content:center;background:transparent;border:none;cursor:pointer;opacity:.6;transition:opacity var(--transition-speed) ease}.pin-button.svelte-p1a138:hover,.pin-button.active.svelte-p1a138{opacity:1}.sidebar-nav.svelte-p1a138{flex:1;display:flex;flex-direction:column;gap:.25rem;padding:.5rem;overflow-y:auto}.sidebar-button.svelte-p1a138{display:flex;align-items:center;gap:.75rem;padding:.75rem;border:none;background-color:transparent;border-radius:4px;cursor:pointer;transition:all var(--transition-speed) ease;justify-content:flex-start;width:100%;text-align:left}.sidebar-button.svelte-p1a138:hover{background-color:var(--bg-hover)}.sidebar-button.active.svelte-p1a138{background-color:var(--bg-active);color:var(--accent-primary)}.sidebar-icon.svelte-p1a138{font-size:1.2rem;min-width:1.5rem;display:flex;justify-content:center}.sidebar-text.svelte-p1a138{white-space:nowrap;opacity:0;transition:opacity var(--transition-speed) ease}.expanded.svelte-p1a138 .sidebar-text:where(.svelte-p1a138){opacity:1}.server-control.svelte-1b4j9ko{display:flex;flex-direction:column}.button-group.svelte-1b4j9ko{display:flex;gap:.75rem;margin-bottom:1rem}.button-group.svelte-1b4j9ko button:where(.svelte-1b4j9ko){flex:1;padding:.75rem;border:none;border-radius:4px;font-weight:500;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center}.button-group.svelte-1b4j9ko button:where(.svelte-1b4j9ko):disabled{opacity:.7;cursor:not-allowed}.start-button.svelte-1b4j9ko{background-color:#4caf5033;color:#4caf50}.start-button.svelte-1b4j9ko:hover:not(:disabled){background-color:#4caf504d}.start-button.active.svelte-1b4j9ko{background-color:#4caf50;color:#fff}.stop-button.svelte-1b4j9ko{background-color:#f4433633;color:#f44336}.stop-button.svelte-1b4j9ko:hover:not(:disabled){background-color:#f443364d}.stop-button.active.svelte-1b4j9ko{background-color:#f44336;color:#fff}.response-message.svelte-1b4j9ko{padding:.75rem;border-radius:4px;display:flex;align-items:flex-start;gap:.75rem;animation:svelte-1b4j9ko-fadeIn .3s ease}.response-message.success.svelte-1b4j9ko{background-color:#4caf501a;border-left:3px solid #4CAF50}.response-message.error.svelte-1b4j9ko{background-color:#f443361a;border-left:3px solid #F44336}.response-icon.svelte-1b4j9ko{margin-top:.1rem}.response-text.svelte-1b4j9ko{flex:1;font-size:.9rem}@keyframes svelte-1b4j9ko-fadeIn{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.reload-control.svelte-1bn0ayy{display:flex;flex-direction:column}button.svelte-1bn0ayy{padding:.75rem;border:none;border-radius:4px;font-weight:500;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;justify-content:center;color:#fff}button.svelte-1bn0ayy:disabled{opacity:.7;cursor:not-allowed}button.active.svelte-1bn0ayy{filter:brightness(1.1)}.response-message.svelte-1bn0ayy{padding:.75rem;border-radius:4px;display:flex;align-items:flex-start;gap:.75rem;animation:svelte-1bn0ayy-fadeIn .3s ease;margin-top:1rem}.response-message.success.svelte-1bn0ayy{background-color:#4caf501a;border-left:3px solid #4CAF50}.response-message.error.svelte-1bn0ayy{background-color:#f443361a;border-left:3px solid #F44336}.response-icon.svelte-1bn0ayy{margin-top:.1rem}.response-text.svelte-1bn0ayy{flex:1;font-size:.9rem}@keyframes svelte-1bn0ayy-fadeIn{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.card.svelte-14m6ads{background-color:var(--bg-secondary);border-radius:8px;padding:1.25rem;box-shadow:var(--shadow-light);transition:transform .2s ease,box-shadow .2s ease;display:flex;flex-direction:column;border:1px solid var(--border-color)}.card.svelte-14m6ads:hover{transform:translateY(-2px);box-shadow:var(--shadow-medium)}.card-header.svelte-14m6ads{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;border-bottom:1px solid var(--border-color);padding-bottom:.75rem}.card.svelte-14m6ads h3:where(.svelte-14m6ads){margin:0;color:var(--text-accent);font-size:1.1rem;font-weight:600}.card-icon.svelte-14m6ads{font-size:1.25rem;opacity:.8}.action-buttons.svelte-14m6ads{display:grid;grid-template-columns:1fr;gap:.5rem;margin-top:1rem}.console-view.svelte-13trlk3{display:flex;flex-direction:column;height:100%;max-height:90vh;background-color:var(--bg-tertiary);border-radius:8px;box-shadow:0 2px 8px #00000026;overflow:hidden}.console-controls.svelte-13trlk3{display:flex;justify-content:space-between;align-items:center;padding:.5rem;background-color:var(--bg-secondary);border-bottom:1px solid var(--border-color);flex-shrink:0}.console-tabs.svelte-13trlk3{display:flex;gap:.5rem}.tab-button.svelte-13trlk3{padding:.75rem 1.5rem;background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:6px 6px 0 0;color:var(--text-primary);font-weight:600;cursor:pointer;transition:all .2s ease;position:relative;overflow:hidden}.tab-button.svelte-13trlk3:before{content:"";position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,rgba(255,255,255,.2),transparent);transition:.5s}.tab-button.svelte-13trlk3:hover:before{left:100%}.tab-button.svelte-13trlk3:hover{background:var(--bg-hover);transform:translateY(-2px)}.tab-button.active.svelte-13trlk3{background:var(--accent-primary);color:#fff;border-bottom:none;transform:translateY(0)}.tab-button.notification.svelte-13trlk3{animation:svelte-13trlk3-pulse 1s infinite ease-in-out;position:relative}.tab-button.notification.svelte-13trlk3:after{content:"";position:absolute;top:5px;right:5px;width:8px;height:8px;background:#f55;border-radius:50%}.autoscroll-button.svelte-13trlk3{padding:.5rem 1rem;background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:4px;color:var(--text-primary);font-family:Courier New,monospace;font-size:.8rem;cursor:pointer;transition:all .2s ease}.autoscroll-button.svelte-13trlk3:hover{background:var(--bg-hover);transform:translateY(-1px)}.tab-content.svelte-13trlk3{flex:1;overflow:hidden;position:relative}.console-tab.svelte-13trlk3,.detection-tab.svelte-13trlk3{position:absolute;width:100%;height:100%;display:none}.console-tab.active.svelte-13trlk3,.detection-tab.active.svelte-13trlk3{display:block}.console.svelte-13trlk3,.detection-console.svelte-13trlk3{height:100%;overflow-y:auto;padding:1rem;font-family:Courier New,monospace;font-size:.9rem;line-height:1.4;color:var(--text-primary);background-color:#000c;box-sizing:border-box}.detection-event.svelte-13trlk3{margin-bottom:.25rem;word-break:break-word}.detection-event.error.svelte-13trlk3{color:#f55}.detection-event.warning.svelte-13trlk3{color:#fa3}.detection-event.success.svelte-13trlk3{color:#3c3}.detection-event.info.svelte-13trlk3{color:#5af}.event-timestamp.svelte-13trlk3{color:#888;font-weight:700}@keyframes svelte-13trlk3-pulse{0%{opacity:1}50%{opacity:.5}to{opacity:1}}.card.svelte-4btkab{background-color:var(--bg-secondary);border-radius:8px;padding:1.25rem;box-shadow:var(--shadow-light);transition:transform .2s ease,box-shadow .2s ease;display:flex;flex-direction:column;border:1px solid var(--border-color)}.card.svelte-4btkab:hover{transform:translateY(-2px);box-shadow:var(--shadow-medium)}.card.wide.svelte-4btkab{grid-column:span 2}.console-card.svelte-4btkab{min-height:350px}@media (max-width: 1024px){.card.wide.svelte-4btkab{grid-column:span 1}}.dashboard-grid.svelte-kt223o{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:1.5rem;padding:1rem}@media (max-width: 1024px){.dashboard-grid.svelte-kt223o{grid-template-columns:1fr}}@media (min-width: 1025px) and (max-width: 1400px){.dashboard-grid.svelte-kt223o{grid-template-columns:repeat(2,1fr)}}.loading.svelte-1n4i3h1{padding:2rem;text-align:center}.iframe-container.svelte-1n4i3h1{width:100%;height:100%;border:none;border-radius:8px;overflow:hidden}.iframe-container.hidden.svelte-1n4i3h1{display:none}iframe.svelte-1n4i3h1{width:100%;height:100%;border:none;background:none}.settings-container.svelte-1oj27tx{display:flex;gap:2rem;height:100%}.settings-sidebar.svelte-1oj27tx{width:180px;display:flex;flex-direction:column;gap:.5rem}.settings-nav.svelte-1oj27tx{text-align:left;padding:.75rem 1rem;background-color:transparent;border:none;border-radius:4px;cursor:pointer;transition:all var(--transition-speed) ease}.settings-nav.svelte-1oj27tx:hover{background-color:var(--bg-hover)}.settings-nav.active.svelte-1oj27tx{background-color:var(--bg-active);color:var(--accent-primary)}.settings-content.svelte-1oj27tx{flex:1;background-color:var(--bg-secondary);border-radius:4px;padding:1.5rem;overflow-y:auto}@media (max-width: 768px){.settings-container.svelte-1oj27tx{flex-direction:column}.settings-sidebar.svelte-1oj27tx{width:100%;flex-direction:row;overflow-x:auto;padding-bottom:.5rem}}.main-content.svelte-i4ubsw{flex:1;overflow-y:auto;padding:1rem;display:flex;flex-direction:column;height:100%}.view-header.svelte-i4ubsw{margin-bottom:1.5rem}.view-header.svelte-i4ubsw h1:where(.svelte-i4ubsw){margin:0 0 .5rem;font-size:1.8rem;font-weight:500}.view-header.svelte-i4ubsw .hide:where(.svelte-i4ubsw){display:none}.description.svelte-i4ubsw{color:var(--text-secondary);margin:0}.view-container.svelte-i4ubsw{flex:1;position:relative}.view-content.svelte-i4ubsw{position:absolute;top:0;left:0;right:0;bottom:0;width:100%;height:100%}.initializing.svelte-1uel83z{display:flex;justify-content:center;align-items:center;min-height:100vh;background-color:var(--bg-primary);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.content-container.svelte-1uel83z{display:flex;flex-direction:column;align-items:center;padding:3rem;border-radius:12px;background-color:var(--bg-secondary);box-shadow:var(--shadow-medium);max-width:90%;width:420px;transition:all var(--transition-speed) ease}.logo-container.svelte-1uel83z{margin-bottom:2rem;position:relative}.spinner-container.svelte-1uel83z{display:flex;justify-content:center;align-items:center;height:100px;width:100px}.loading-spinner.svelte-1uel83z{position:relative;width:64px;height:64px;border-radius:50%;border:3px solid transparent;border-top-color:var(--accent-primary);border-right-color:var(--accent-secondary);border-bottom-color:var(--accent-tertiary);animation:svelte-1uel83z-spin 1.2s linear infinite}.loading-spinner.svelte-1uel83z:before{content:"";position:absolute;top:5px;left:5px;right:5px;bottom:5px;border-radius:50%;border:3px solid transparent;border-top-color:var(--accent-tertiary);animation:svelte-1uel83z-spin 1.8s linear infinite}@keyframes svelte-1uel83z-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.status-container.svelte-1uel83z{text-align:center;margin-bottom:1.5rem;width:100%}.status-title.svelte-1uel83z{font-size:1.25rem;font-weight:500;color:var(--text-primary);margin:0 0 1rem}.status-indicator.svelte-1uel83z{display:flex;justify-content:center;gap:6px;margin-top:.5rem}.dot.svelte-1uel83z{width:8px;height:8px;border-radius:50%;background-color:var(--accent-primary);opacity:.4}.dot1.svelte-1uel83z{animation:svelte-1uel83z-pulse 1.5s infinite ease-in-out}.dot2.svelte-1uel83z{animation:svelte-1uel83z-pulse 1.5s infinite ease-in-out .5s}.dot3.svelte-1uel83z{animation:svelte-1uel83z-pulse 1.5s infinite ease-in-out 1s}@keyframes svelte-1uel83z-pulse{0%,to{opacity:.4;transform:scale(1)}50%{opacity:1;transform:scale(1.2)}}.error-message.svelte-1uel83z{display:flex;align-items:center;gap:.75rem;margin-top:1rem;padding:1rem;background-color:#ff52521a;color:var(--text-warning);border-left:4px solid var(--text-warning);border-radius:4px;width:100%;font-size:.95rem;box-shadow:var(--shadow-light)}.error-message.svelte-1uel83z svg:where(.svelte-1uel83z){min-width:20px;color:var(--text-warning)}.error-message.svelte-1uel83z p:where(.svelte-1uel83z){margin:0;line-height:1.4}@media (max-width: 480px){.content-container.svelte-1uel83z{padding:2rem;width:90%}.spinner-container.svelte-1uel83z{height:80px;width:80px}.loading-spinner.svelte-1uel83z{width:50px;height:50px}}.login-page.svelte-ybqy5b{display:flex;justify-content:center;align-items:center;min-height:100vh;background-color:var(--bg-primary);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif}.login-container.svelte-ybqy5b{display:flex;justify-content:center;align-items:center;width:100%;max-width:460px;padding:1rem}.login-card.svelte-ybqy5b{background:var(--bg-secondary);padding:2.5rem;box-shadow:var(--shadow-medium);border-radius:12px;width:100%;transition:transform var(--transition-speed)}.login-card.svelte-ybqy5b:hover{transform:translateY(-5px)}.login-header.svelte-ybqy5b{margin-bottom:1.5rem}h2.svelte-ybqy5b{text-align:center;margin-bottom:1.5rem;color:var(--text-primary);font-weight:600;font-size:1.75rem}h3.svelte-ybqy5b{color:var(--text-primary);font-weight:500;font-size:1.2rem;margin-top:0;margin-bottom:1rem}.server-selector.svelte-ybqy5b{position:relative;margin-bottom:1rem}.server-info.svelte-ybqy5b{display:flex;align-items:center;justify-content:center;background-color:var(--bg-tertiary);border-radius:8px;padding:.75rem 1rem;cursor:pointer;transition:background-color var(--transition-speed)}.server-info.svelte-ybqy5b:hover{background-color:var(--bg-hover)}.server-label.svelte-ybqy5b{font-weight:500;color:var(--text-secondary);margin-right:.5rem}.server-url.svelte-ybqy5b{flex:1;color:var(--text-primary);font-size:.9rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.status-indicator.svelte-ybqy5b{margin:0 .5rem}.change-server-btn.svelte-ybqy5b{background:none;border:none;color:var(--text-secondary);cursor:pointer;padding:.25rem;display:flex;align-items:center;justify-content:center;transition:color var(--transition-speed)}.change-server-btn.svelte-ybqy5b:hover{color:var(--accent-primary)}.backend-dropdown.svelte-ybqy5b{position:absolute;top:100%;left:0;right:0;background:var(--bg-secondary);border-radius:8px;box-shadow:var(--shadow-medium);margin-top:.5rem;z-index:10;overflow:hidden;animation:svelte-ybqy5b-slideDown .2s ease-out}@keyframes svelte-ybqy5b-slideDown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.dropdown-header.svelte-ybqy5b{display:flex;justify-content:space-between;align-items:center;padding:1rem;border-bottom:1px solid var(--border-color)}.dropdown-header.svelte-ybqy5b h3:where(.svelte-ybqy5b){margin:0;font-size:1rem;font-weight:500}.close-btn.svelte-ybqy5b{background:none;border:none;color:var(--text-secondary);cursor:pointer;padding:.25rem;display:flex;align-items:center;justify-content:center;transition:color var(--transition-speed)}.close-btn.svelte-ybqy5b:hover{color:var(--accent-primary)}.backend-list.svelte-ybqy5b{max-height:250px;overflow-y:auto}.backend-item.svelte-ybqy5b{padding:.25rem .5rem}.backend-option.svelte-ybqy5b{display:flex;align-items:center;padding:.75rem 1rem;border-radius:6px;cursor:pointer;transition:background-color var(--transition-speed)}.backend-option.svelte-ybqy5b:hover{background-color:var(--bg-hover)}.backend-option.svelte-ybqy5b input:where(.svelte-ybqy5b){margin-right:.75rem;accent-color:var(--accent-primary)}.backend-details.svelte-ybqy5b{display:flex;flex-direction:column;flex:1;overflow:hidden}.backend-name.svelte-ybqy5b{font-weight:500;color:var(--text-primary)}.backend-url.svelte-ybqy5b{font-size:.85rem;color:var(--text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.backend-error.svelte-ybqy5b{font-size:.8rem;color:var(--text-warning);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dropdown-actions.svelte-ybqy5b{display:flex;justify-content:space-between;padding:1rem;border-top:1px solid var(--border-color)}.test-btn.svelte-ybqy5b{padding:.5rem 1rem;background-color:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:6px;font-size:.9rem;font-weight:500;color:var(--text-primary);cursor:pointer;transition:all var(--transition-speed)}.test-btn.svelte-ybqy5b:hover{background-color:var(--bg-hover);border-color:var(--accent-secondary)}.switch-btn.svelte-ybqy5b{padding:.5rem 1rem;background-color:var(--accent-primary);border:none;border-radius:6px;font-size:.9rem;font-weight:500;color:var(--text-primary);cursor:pointer;transition:background-color var(--transition-speed)}.switch-btn.svelte-ybqy5b:hover{background-color:var(--accent-tertiary)}.switch-btn.svelte-ybqy5b:disabled{background-color:var(--bg-tertiary);cursor:not-allowed;opacity:.6}.form-group.svelte-ybqy5b{margin-bottom:1.5rem}label.svelte-ybqy5b{display:block;margin-bottom:.5rem;color:var(--text-primary);font-weight:500;font-size:.95rem}.input-wrapper.svelte-ybqy5b{position:relative;display:flex;align-items:center}.input-icon.svelte-ybqy5b{position:absolute;left:1rem;color:var(--text-secondary)}input[type=text].svelte-ybqy5b,input[type=password].svelte-ybqy5b{width:100%;padding:.85rem 1rem .85rem 2.75rem;border:1px solid var(--border-color);border-radius:8px;font-size:1rem;background-color:var(--bg-tertiary);color:var(--text-primary);transition:all var(--transition-speed)}.new-backend-form.svelte-ybqy5b input[type=text]:where(.svelte-ybqy5b){padding:.85rem 1rem}input[type=text].svelte-ybqy5b:focus,input[type=password].svelte-ybqy5b:focus{outline:none;border-color:var(--accent-primary);box-shadow:0 0 0 3px #6a995533}.checkbox.svelte-ybqy5b{display:flex;align-items:center}.login-button.svelte-ybqy5b{width:100%;padding:.85rem;background-color:var(--accent-primary);color:var(--text-primary);border:none;border-radius:8px;font-size:1rem;font-weight:500;cursor:pointer;transition:background-color var(--transition-speed);display:flex;justify-content:center;align-items:center}.login-button.svelte-ybqy5b:hover{background-color:var(--accent-tertiary)}.login-button.svelte-ybqy5b:disabled{background-color:var(--bg-tertiary);opacity:.6;cursor:not-allowed}.loading-spinner.svelte-ybqy5b{animation:svelte-ybqy5b-spin 1s linear infinite;margin-right:.5rem}@keyframes svelte-ybqy5b-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.error-message.svelte-ybqy5b{padding:.85rem;background-color:#ce91781a;color:var(--text-warning);border-radius:8px;margin-bottom:1.5rem;font-size:.95rem;display:flex;align-items:center;animation:svelte-ybqy5b-fadeIn .3s ease-out}@keyframes svelte-ybqy5b-fadeIn{0%{opacity:0}to{opacity:1}}.status-indicator.online.svelte-ybqy5b{color:var(--accent-primary)}.status-indicator.offline.svelte-ybqy5b{color:var(--text-warning)}.status-indicator.error.svelte-ybqy5b,.status-indicator.unreachable.svelte-ybqy5b{color:#ff9800}.status-indicator.unknown.svelte-ybqy5b{color:var(--text-secondary)}.new-backend-form.svelte-ybqy5b{background-color:var(--bg-tertiary);border-radius:8px;padding:1.5rem;margin-bottom:1.5rem;border:1px solid var(--border-color);animation:svelte-ybqy5b-fadeIn .3s ease-out}.new-backend-form.svelte-ybqy5b p:where(.svelte-ybqy5b){color:var(--text-secondary);font-size:.95rem;margin-bottom:1.25rem}.backend-form-actions.svelte-ybqy5b{display:flex;justify-content:space-between;gap:1rem}.cancel-btn.svelte-ybqy5b{flex:1;padding:.75rem;background-color:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:6px;font-size:.95rem;font-weight:500;color:var(--text-secondary);cursor:pointer;transition:all var(--transition-speed)}.cancel-btn.svelte-ybqy5b:hover{background-color:var(--bg-hover);border-color:var(--accent-secondary)}.add-backend-btn.svelte-ybqy5b{flex:2;padding:.75rem;background-color:var(--accent-primary);color:var(--text-primary);border:none;border-radius:6px;font-size:.95rem;font-weight:500;cursor:pointer;transition:background-color var(--transition-speed)}.add-backend-btn.svelte-ybqy5b:hover{background-color:var(--accent-tertiary)}.add-backend-btn.svelte-ybqy5b:disabled{background-color:var(--bg-tertiary);opacity:.6;cursor:not-allowed}@media (max-width: 480px){.login-container.svelte-ybqy5b{padding:.5rem}.login-card.svelte-ybqy5b{padding:1.5rem}h2.svelte-ybqy5b{font-size:1.5rem}.dropdown-actions.svelte-ybqy5b{flex-direction:column;gap:.5rem}.test-btn.svelte-ybqy5b,.switch-btn.svelte-ybqy5b{width:100%}.backend-form-actions.svelte-ybqy5b{flex-direction:column}.cancel-btn.svelte-ybqy5b,.add-backend-btn.svelte-ybqy5b{width:100%}}:root{--bg-primary: #1e1e1e;--bg-secondary: #252526;--bg-tertiary: #2d2d2d;--bg-hover: #3c3c3c;--bg-active: #3e4033;--text-primary: #d4d4d4;--text-secondary: #a9a9a9;--text-accent: #6a9955;--text-warning: #ce9178;--border-color: #3e3e3e;--accent-primary: #6a9955;--accent-secondary: #4d7240;--accent-tertiary: #5f7e52;--shadow-light: 0 2px 8px rgba(0, 0, 0, .3);--shadow-medium: 0 4px 12px rgba(0, 0, 0, .4);--transition-speed: .25s;--top-nav-height: 3rem;--sidebar-width: 150px;--sidebar-collapsed-width: 60px}body{font-family:Segoe UI,Tahoma,Geneva,Verdana,sans-serif;margin:0;padding:0;background-color:var(--bg-primary);color:var(--text-primary);overflow:hidden}button{background-color:var(--bg-tertiary);color:var(--text-primary);border:1px solid var(--border-color);border-radius:3px;padding:.5rem 1rem;cursor:pointer;transition:all var(--transition-speed) ease}button:hover{background-color:var(--bg-hover);border-color:var(--accent-primary)}button.active{background-color:var(--bg-active);border-color:var(--accent-primary);color:var(--accent-primary)}a{color:var(--accent-primary);text-decoration:none;transition:color var(--transition-speed) ease}a:hover{color:var(--accent-tertiary)}::-webkit-scrollbar{width:10px}::-webkit-scrollbar-track{background:var(--bg-secondary)}::-webkit-scrollbar-thumb{background:var(--bg-tertiary);border-radius:5px}::-webkit-scrollbar-thumb:hover{background:var(--accent-secondary)}.container.svelte-18zj0vs{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100vh;width:100vw;background:linear-gradient(135deg,#1a1a2e,#16213e);color:#fff;font-family:Inter,system-ui,-apple-system,sans-serif;overflow:hidden;position:relative}.message-container.svelte-18zj0vs{position:relative;z-index:10}.message-box.svelte-18zj0vs{background:#1e293bcc;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,.1);box-shadow:0 20px 80px -10px #00000080;border-radius:24px;padding:40px;width:90vw;max-width:500px;text-align:center}.message-content.svelte-18zj0vs{display:flex;flex-direction:column;align-items:center;gap:16px}.icon.svelte-18zj0vs{display:flex;align-items:center;justify-content:center;width:64px;height:64px;background:#ff4f4f26;color:#ff4f4f;border-radius:50%;margin-bottom:8px}.icon.svelte-18zj0vs svg:where(.svelte-18zj0vs){width:32px;height:32px}h2.svelte-18zj0vs{font-size:28px;font-weight:700;margin:0;background:linear-gradient(90deg,#fff,#a5b4fc);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}p.svelte-18zj0vs{font-size:16px;line-height:1.6;color:#ffffffb3;margin:0 0 20px}.continue-button.svelte-18zj0vs{background:#ffffff1a;border:1px solid rgba(255,255,255,.2);color:#fffc;padding:12px 24px;border-radius:12px;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s ease;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.continue-button.svelte-18zj0vs:hover{background:#ffffff26;border-color:#ffffff4d;color:#fff;transform:translateY(-1px)}.continue-button.svelte-18zj0vs:active{transform:translateY(0)}@media (max-width: 600px){.message-box.svelte-18zj0vs{padding:30px 20px}h2.svelte-18zj0vs{font-size:24px}p.svelte-18zj0vs{font-size:14px}.continue-button.svelte-18zj0vs{font-size:13px;padding:10px 20px}}.app-container.svelte-136oog4{display:flex;flex-direction:column;height:100vh;width:100vw;overflow:hidden}.main-container.svelte-136oog4{display:flex;flex:1;overflow:hidden} diff --git a/UIMod/onboard_bundled/v2/assets/ssui.js b/UIMod/onboard_bundled/v2/assets/ssui.js new file mode 100644 index 00000000..7b604af3 --- /dev/null +++ b/UIMod/onboard_bundled/v2/assets/ssui.js @@ -0,0 +1,13 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))n(a);new MutationObserver(a=>{for(const s of a)if(s.type==="childList")for(const o of s.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&n(o)}).observe(document,{childList:!0,subtree:!0});function r(a){const s={};return a.integrity&&(s.integrity=a.integrity),a.referrerPolicy&&(s.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?s.credentials="include":a.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function n(a){if(a.ep)return;a.ep=!0;const s=r(a);fetch(a.href,s)}})();const Ea="5";var On;typeof window<"u"&&((On=window.__svelte??(window.__svelte={})).v??(On.v=new Set)).add(Ea);const Aa=1,Ca=2,Ta=16,qa=1,Ia=2,La=4,Ma=8,za=16,Oa=1,ja=2,Ra=4,jn=1,Da=2,we=Symbol(),Pa="http://www.w3.org/1999/xhtml",hn=!1;var _r=Array.isArray,Na=Array.prototype.indexOf,Xr=Array.from,Rn=Object.defineProperty,At=Object.getOwnPropertyDescriptor,Dn=Object.getOwnPropertyDescriptors,Ua=Object.prototype,Ba=Array.prototype,en=Object.getPrototypeOf,pn=Object.isExtensible;function Fa(e){return typeof e=="function"}const ke=()=>{};function Va(e){return e()}function Fr(e){for(var t=0;t{n.d=!0})}function Ae(e){const t=re;if(t!==null){const o=t.e;if(o!==null){var r=W,n=J;t.e=null;try{for(var a=0;a{var l=J;Oe(s);var c=f();return Oe(l),c};return n&&r.set("length",A(e.length)),new Proxy(e,{defineProperty(f,l,c){(!("value"in c)||c.configurable===!1||c.enumerable===!1||c.writable===!1)&&Xa();var d=r.get(l);return d===void 0?(d=o(()=>A(c.value)),r.set(l,d)):h(d,o(()=>xe(c.value))),!0},deleteProperty(f,l){var c=r.get(l);if(c===void 0)l in f&&(r.set(l,o(()=>A(we))),jr(a));else{if(n&&typeof l=="string"){var d=r.get("length"),v=Number(l);Number.isInteger(v)&&vA(xe(v?f[l]:we))),r.set(l,d)),d!==void 0){var u=i(d);return u===we?void 0:u}return Reflect.get(f,l,c)},getOwnPropertyDescriptor(f,l){var c=Reflect.getOwnPropertyDescriptor(f,l);if(c&&"value"in c){var d=r.get(l);d&&(c.value=i(d))}else if(c===void 0){var v=r.get(l),u=v==null?void 0:v.v;if(v!==void 0&&u!==we)return{enumerable:!0,configurable:!0,value:u,writable:!0}}return c},has(f,l){var u;if(l===Je)return!0;var c=r.get(l),d=c!==void 0&&c.v!==we||Reflect.has(f,l);if(c!==void 0||W!==null&&(!d||(u=At(f,l))!=null&&u.writable)){c===void 0&&(c=o(()=>A(d?xe(f[l]):we)),r.set(l,c));var v=i(c);if(v===we)return!1}return d},set(f,l,c,d){var E;var v=r.get(l),u=l in f;if(n&&l==="length")for(var p=c;pA(we)),r.set(p+"",g))}v===void 0?(!u||(E=At(f,l))!=null&&E.writable)&&(v=o(()=>A(void 0)),h(v,o(()=>xe(c))),r.set(l,v)):(u=v.v!==we,h(v,o(()=>xe(c))));var _=Reflect.getOwnPropertyDescriptor(f,l);if(_!=null&&_.set&&_.set.call(d,c),!u){if(n&&typeof l=="string"){var m=r.get("length"),x=Number(l);Number.isInteger(x)&&x>=m.v&&h(m,x+1)}jr(a)}return!0},ownKeys(f){i(a);var l=Reflect.ownKeys(f).filter(v=>{var u=r.get(v);return u===void 0||u.v!==we});for(var[c,d]of r)d.v!==we&&!(c in f)&&l.push(c);return l},setPrototypeOf(){es()}})}function jr(e,t=1){h(e,e.v+t)}function bn(e){try{if(e!==null&&typeof e=="object"&&Je in e)return e[Je]}catch{}return e}function $n(e,t){return Object.is(bn(e),bn(t))}function Ct(e){var t=Ue|$e,r=J!==null&&(J.f&Ue)!==0?J:null;return W===null||r!==null&&(r.f&Te)!==0?t|=Te:W.f|=Un,{ctx:re,deps:null,effects:null,equals:Bn,f:t,fn:e,reactions:null,rv:0,v:null,wv:0,parent:r??W}}function Ye(e){const t=Ct(e);return sa(t),t}function kr(e){const t=Ct(e);return t.equals=tn,t}function Hn(e){var t=e.effects;if(t!==null){e.effects=null;for(var r=0;rnew Promise(n=>{r.outro?ur(t,()=>{Xe(t),n(void 0)}):(Xe(t),n(void 0))})}function Rt(e){return jt(Pn,e,!1)}function Ar(e){return jt(mr,e,!0)}function K(e,t=[],r=Ct){const n=t.map(r);return Cr(()=>e(...n.map(i)))}function Cr(e,t=0){return jt(mr|yr|t,e,!0)}function Tt(e,t=!0){return jt(mr|rt,e,!0,t)}function ea(e){var t=e.teardown;if(t!==null){const r=Jt,n=J;mn(!0),Oe(null);try{t.call(null)}finally{mn(r),Oe(n)}}}function ta(e,t=!1){var r=e.first;for(e.first=e.last=null;r!==null;){var n=r.next;(r.f&zt)!==0?r.parent=null:Xe(r,t),r=n}}function fs(e){for(var t=e.first;t!==null;){var r=t.next;(t.f&rt)===0&&Xe(t),t=r}}function Xe(e,t=!0){var r=!1;(t||(e.f&Ha)!==0)&&e.nodes_start!==null&&(ds(e.nodes_start,e.nodes_end),r=!0),ta(e,t&&!r),pr(e,0),Be(e,wr);var n=e.transitions;if(n!==null)for(const s of n)s.stop();ea(e);var a=e.parent;a!==null&&a.first!==null&&ra(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes_start=e.nodes_end=null}function ds(e,t){for(;e!==null;){var r=e===t?null:Sr(e);e.remove(),e=r}}function ra(e){var t=e.parent,r=e.prev,n=e.next;r!==null&&(r.next=n),n!==null&&(n.prev=r),t!==null&&(t.first===e&&(t.first=n),t.last===e&&(t.last=r))}function ur(e,t){var r=[];rn(e,r,!0),na(r,()=>{Xe(e),t&&t()})}function na(e,t){var r=e.length;if(r>0){var n=()=>--r||t();for(var a of e)a.out(n)}else t()}function rn(e,t,r){if((e.f&Ke)===0){if(e.f^=Ke,e.transitions!==null)for(const o of e.transitions)(o.is_global||r)&&t.push(o);for(var n=e.first;n!==null;){var a=n.next,s=(n.f&Wt)!==0||(n.f&rt)!==0;rn(n,t,s?r:!1),n=a}}}function vr(e){aa(e,!0)}function aa(e,t){if((e.f&Ke)!==0){e.f^=Ke,(e.f&Se)===0&&(e.f^=Se),Zt(e)&&(Be(e,$e),qr(e));for(var r=e.first;r!==null;){var n=r.next,a=(r.f&Wt)!==0||(r.f&rt)!==0;aa(r,a?t:!1),r=n}if(e.transitions!==null)for(const s of e.transitions)(s.is_global||t)&&s.in()}}let fr=[];function hs(){var e=fr;fr=[],Fr(e)}function Gt(e){fr.length===0&&queueMicrotask(hs),fr.push(e)}let ar=!1,$r=!1,dr=null,dt=!1,Jt=!1;function mn(e){Jt=e}let sr=[];let J=null,Ve=!1;function Oe(e){J=e}let W=null;function He(e){W=e}let _e=null;function sa(e){J!==null&&J.f&Vr&&(_e===null?_e=[e]:_e.push(e))}let ge=null,Ce=0,ze=null;function ps(e){ze=e}let ia=1,hr=0,lt=!1;function oa(){return++ia}function Zt(e){var v;var t=e.f;if((t&$e)!==0)return!0;if((t&ht)!==0){var r=e.deps,n=(t&Te)!==0;if(r!==null){var a,s,o=(t&lr)!==0,f=n&&W!==null&&!lt,l=r.length;if(o||f){var c=e,d=c.parent;for(a=0;ae.wv)return!0}(!n||W!==null&&!lt)&&Be(e,Se)}return!1}function gs(e,t){for(var r=t;r!==null;){if((r.f&or)!==0)try{r.fn(e);return}catch{r.f^=or}r=r.parent}throw ar=!1,e}function yn(e){return(e.f&wr)===0&&(e.parent===null||(e.parent.f&or)===0)}function Tr(e,t,r,n){if(ar){if(r===null&&(ar=!1),yn(t))throw e;return}if(r!==null&&(ar=!0),gs(e,t),yn(t))throw e}function la(e,t,r=!0){var n=e.reactions;if(n!==null)for(var a=0;a0)for(v.length=Ce+ge.length,u=0;u0;){t++>1e3&&_s();var r=sr,n=r.length;sr=[];for(var a=0;a{Promise.resolve().then(()=>{var t;if(!e.defaultPrevented)for(const r of e.target.elements)(t=r.__on_r)==null||t.call(r)})},{capture:!0}))}function an(e){var t=J,r=W;Oe(null),He(null);try{return e()}finally{Oe(t),He(r)}}function sn(e,t,r,n=r){e.addEventListener(t,()=>an(r));const a=e.__on_r;a?e.__on_r=()=>{a(),n(!0)}:e.__on_r=()=>n(!0),Ss()}const ua=new Set,Gr=new Set;function Es(e,t,r,n={}){function a(s){if(n.capture||Bt.call(t,s),!s.cancelBubble)return an(()=>r==null?void 0:r.call(this,s))}return e.startsWith("pointer")||e.startsWith("touch")||e==="wheel"?Gt(()=>{t.addEventListener(e,a,n)}):t.addEventListener(e,a,n),a}function tt(e,t,r,n,a){var s={capture:n,passive:a},o=Es(e,t,r,s);(t===document.body||t===window||t===document)&&Er(()=>{t.removeEventListener(e,o,s)})}function Ge(e){for(var t=0;t{throw k});throw u}}finally{e.__root=t,delete e.currentTarget,Oe(d),He(v)}}}function va(e){var t=document.createElement("template");return t.innerHTML=e,t.content}function qt(e,t){var r=W;r.nodes_start===null&&(r.nodes_start=e,r.nodes_end=t)}function P(e,t){var r=(t&jn)!==0,n=(t&Da)!==0,a,s=!e.startsWith("");return()=>{a===void 0&&(a=va(s?e:""+e),r||(a=We(a)));var o=n||Jn?document.importNode(a,!0):a.cloneNode(!0);if(r){var f=We(o),l=o.lastChild;qt(f,l)}else qt(o,o);return o}}function Qt(e,t,r="svg"){var n=!e.startsWith(""),a=(t&jn)!==0,s=`<${r}>${n?e:""+e}`,o;return()=>{if(!o){var f=va(s),l=We(f);if(a)for(o=document.createDocumentFragment();We(l);)o.appendChild(We(l));else o=We(l)}var c=o.cloneNode(!0);if(a){var d=We(c),v=c.lastChild;qt(d,v)}else qt(c,c);return c}}function Y(e=""){{var t=xr(e+"");return qt(t,t),t}}function It(){var e=document.createDocumentFragment(),t=document.createComment(""),r=xr();return e.append(t,r),qt(t,r),e}function S(e,t){e!==null&&e.before(t)}const As=["touchstart","touchmove"];function Cs(e){return As.includes(e)}let Yr=!0;function B(e,t){var r=t==null?"":typeof t=="object"?t+"":t;r!==(e.__t??(e.__t=e.nodeValue))&&(e.__t=r,e.nodeValue=r+"")}function Ts(e,t){return qs(e,t)}const St=new Map;function qs(e,{target:t,anchor:r,props:n={},events:a,context:s,intro:o=!0}){os();var f=new Set,l=v=>{for(var u=0;u{var v=r??t.appendChild(xr());return Tt(()=>{if(s){Ee({});var u=re;u.c=s}a&&(n.$$events=a),Yr=o,c=e(v,n)||{},Yr=!0,s&&Ae()}),()=>{var g;for(var u of f){t.removeEventListener(u,Bt);var p=St.get(u);--p===0?(document.removeEventListener(u,Bt),St.delete(u)):St.set(u,p)}Gr.delete(l),v!==r&&((g=v.parentNode)==null||g.removeChild(v))}});return Is.set(c,d),c}let Is=new WeakMap;function fa(e,t,...r){var n=e,a=ke,s;Cr(()=>{a!==(a=t())&&(s&&(Xe(s),s=null),s=Tt(()=>a(n,...r)))},Wt)}function nt(e){re===null&&Vn(),Ot&&re.l!==null?Ls(re).m.push(e):cr(()=>{const t=et(e);if(typeof t=="function")return t})}function on(e){re===null&&Vn(),nt(()=>()=>et(e))}function Ls(e){var t=e.l;return t.u??(t.u={a:[],b:[],m:[]})}function M(e,t,[r,n]=[0,0]){var a=e,s=null,o=null,f=we,l=r>0?Wt:0,c=!1;const d=(u,p=!0)=>{c=!0,v(p,u)},v=(u,p)=>{f!==(f=u)&&(f?(s?vr(s):p&&(s=Tt(()=>p(a))),o&&ur(o,()=>{o=null})):(o?vr(o):p&&(o=Tt(()=>p(a,[r+1,n]))),s&&ur(s,()=>{s=null})))};Cr(()=>{c=!1,t(d),c||v(null,null)},l)}function Lt(e,t){return t}function Ms(e,t,r,n){for(var a=[],s=t.length,o=0;o0&&a.length===0&&r!==null;if(f){var l=r.parentNode;ls(l),l.append(r),n.clear(),ot(e,t[0].prev,t[s-1].next)}na(a,()=>{for(var c=0;c{var u=r();return _r(u)?u:u==null?[]:Xr(u)});Cr(()=>{var u=i(v),p=u.length;d&&p===0||(d=p===0,zs(u,f,o,a,t,n,r),s!==null&&(p===0?c?vr(c):c=Tt(()=>s(o)):c!==null&&ur(c,()=>{c=null})),i(v))})}function zs(e,t,r,n,a,s,o){var f=e.length,l=t.items,c=t.first,d=c,v,u=null,p=[],g=[],_,m,x,E;for(E=0;E0){var V=f===0?r:null;Ms(t,R,V,l)}}W.first=t.first&&t.first.e,W.last=u&&u.e}function Os(e,t,r,n){Wn(e.v,t),e.i=r}function js(e,t,r,n,a,s,o,f,l,c){var d=(l&Aa)!==0,v=(l&Ta)===0,u=d?v?Ze(a):Ht(a):a,p=(l&Ca)===0?o:Ht(o),g={i:p,v:u,k:s,a:null,e:null,prev:r,next:n};try{return g.e=Tt(()=>f(e,u,p,c),is),g.e.prev=r&&r.e,g.e.next=n&&n.e,r===null?t.first=g:(r.next=g,r.e.next=g.e),n!==null&&(n.prev=g,n.e.prev=g.e),g}finally{}}function kn(e,t,r){for(var n=e.next?e.next.e.nodes_start:r,a=t?t.e.nodes_start:r,s=e.e.nodes_start;s!==n;){var o=Sr(s);a.before(s),s=o}}function ot(e,t,r){t===null?e.first=r:(t.next=r,t.e.next=r&&r.e),r!==null&&(r.prev=t,r.e.prev=t&&t.e)}function da(e){var t,r,n="";if(typeof e=="string"||typeof e=="number")n+=e;else if(typeof e=="object")if(Array.isArray(e)){var a=e.length;for(t=0;t=0;){var f=o+s;(o===0||xn.includes(n[o-1]))&&(f===n.length||xn.includes(n[f]))?n=(o===0?"":n.substring(0,o))+n.substring(f+1):o=f}}return n===""?null:n}function Sn(e,t=!1){var r=t?" !important;":";",n="";for(var a in e){var s=e[a];s!=null&&s!==""&&(n+=" "+a+": "+s+r)}return n}function Rr(e){return e[0]!=="-"||e[1]!=="-"?e.toLowerCase():e}function Ns(e,t){if(t){var r="",n,a;if(Array.isArray(t)?(n=t[0],a=t[1]):n=t,e){e=String(e).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var s=!1,o=0,f=!1,l=[];n&&l.push(...Object.keys(n).map(Rr)),a&&l.push(...Object.keys(a).map(Rr));var c=0,d=-1;const _=e.length;for(var v=0;v<_;v++){var u=e[v];if(f?u==="/"&&e[v-1]==="*"&&(f=!1):s?s===u&&(s=!1):u==="/"&&e[v+1]==="*"?f=!0:u==='"'||u==="'"?s=u:u==="("?o++:u===")"&&o--,!f&&s===!1&&o===0){if(u===":"&&d===-1)d=v;else if(u===";"||v===_-1){if(d!==-1){var p=Rr(e.substring(c,d).trim());if(!l.includes(p)){u!==";"&&v++;var g=e.substring(c,v).trim();r+=" "+g+";"}}c=v+1,d=-1}}}}return n&&(r+=Sn(n)),a&&(r+=Sn(a,!0)),r=r.trim(),r===""?null:r}return e==null?null:String(e)}function ae(e,t,r,n,a,s){var o=e.__className;if(o!==r||o===void 0){var f=Ps(r,n,s);f==null?e.removeAttribute("class"):e.className=f,e.__className=r}else if(s&&a!==s)for(var l in s){var c=!!s[l];(a==null||c!==!!a[l])&&e.classList.toggle(l,c)}return s}function Dr(e,t={},r,n){for(var a in r){var s=r[a];t[a]!==s&&(r[a]==null?e.style.removeProperty(a):e.style.setProperty(a,s,n))}}function ln(e,t,r,n){var a=e.__style;if(a!==t){var s=Ns(t,n);s==null?e.removeAttribute("style"):e.style.cssText=s,e.__style=t}else n&&(Array.isArray(n)?(Dr(e,r==null?void 0:r[0],n[0]),Dr(e,r==null?void 0:r[1],n[1],"important")):Dr(e,r,n));return n}const Us=Symbol("is custom element"),Bs=Symbol("is html");function Ir(e,t,r,n){var a=Fs(e);a[t]!==(a[t]=r)&&(t==="loading"&&(e[Ya]=r),r==null?e.removeAttribute(t):typeof r!="string"&&Vs(e).includes(t)?e[t]=r:e.setAttribute(t,r))}function Fs(e){return e.__attributes??(e.__attributes={[Us]:e.nodeName.includes("-"),[Bs]:e.namespaceURI===Pa})}var En=new Map;function Vs(e){var t=En.get(e.nodeName);if(t)return t;En.set(e.nodeName,t=[]);for(var r,n=e,a=Element.prototype;a!==n;){r=Dn(n);for(var s in r)r[s].set&&t.push(s);n=en(n)}return t}const $s=()=>performance.now(),Ne={tick:e=>requestAnimationFrame(e),now:()=>$s(),tasks:new Set};function ha(){const e=Ne.now();Ne.tasks.forEach(t=>{t.c(e)||(Ne.tasks.delete(t),t.f())}),Ne.tasks.size!==0&&Ne.tick(ha)}function pa(e){let t;return Ne.tasks.size===0&&Ne.tick(ha),{promise:new Promise(r=>{Ne.tasks.add(t={c:e,f:r})}),abort(){Ne.tasks.delete(t)}}}function tr(e,t){an(()=>{e.dispatchEvent(new CustomEvent(t))})}function Hs(e){if(e==="float")return"cssFloat";if(e==="offset")return"cssOffset";if(e.startsWith("--"))return e;const t=e.split("-");return t.length===1?t[0]:t[0]+t.slice(1).map(r=>r[0].toUpperCase()+r.slice(1)).join("")}function An(e){const t={},r=e.split(";");for(const n of r){const[a,s]=n.split(":");if(!a||s===void 0)break;const o=Hs(a.trim());t[o]=s.trim()}return t}const Gs=e=>e;function fe(e,t,r,n){var a=(e&Oa)!==0,s=(e&ja)!==0,o=a&&s,f=(e&Ra)!==0,l=o?"both":a?"in":"out",c,d=t.inert,v=t.style.overflow,u,p;function g(){var k=J,z=W;Oe(null),He(null);try{return c??(c=r()(t,(n==null?void 0:n())??{},{direction:l}))}finally{Oe(k),He(z)}}var _={is_global:f,in(){var k;if(t.inert=d,!a){p==null||p.abort(),(k=p==null?void 0:p.reset)==null||k.call(p);return}s||u==null||u.abort(),tr(t,"introstart"),u=Wr(t,g(),p,1,()=>{tr(t,"introend"),u==null||u.abort(),u=c=void 0,t.style.overflow=v})},out(k){if(!s){k==null||k(),c=void 0;return}t.inert=!0,tr(t,"outrostart"),p=Wr(t,g(),u,0,()=>{tr(t,"outroend"),k==null||k()})},stop:()=>{u==null||u.abort(),p==null||p.abort()}},m=W;if((m.transitions??(m.transitions=[])).push(_),a&&Yr){var x=f;if(!x){for(var E=m.parent;E&&(E.f&Wt)!==0;)for(;(E=E.parent)&&(E.f&yr)===0;);x=!E||(E.f&Nn)!==0}x&&Rt(()=>{et(()=>_.in())})}}function Wr(e,t,r,n,a){var s=n===1;if(Fa(t)){var o,f=!1;return Gt(()=>{if(!f){var m=t({direction:s?"in":"out"});o=Wr(e,m,r,n,a)}}),{abort:()=>{f=!0,o==null||o.abort()},deactivate:()=>o.deactivate(),reset:()=>o.reset(),t:()=>o.t()}}if(r==null||r.deactivate(),!(t!=null&&t.duration))return a(),{abort:ke,deactivate:ke,reset:ke,t:()=>n};const{delay:l=0,css:c,tick:d,easing:v=Gs}=t;var u=[];if(s&&r===void 0&&(d&&d(0,1),c)){var p=An(c(0,1));u.push(p,p)}var g=()=>1-n,_=e.animate(u,{duration:l});return _.onfinish=()=>{var m=(r==null?void 0:r.t())??1-n;r==null||r.abort();var x=n-m,E=t.duration*Math.abs(x),k=[];if(E>0){var z=!1;if(c)for(var T=Math.ceil(E/16.666666666666668),j=0;j<=T;j+=1){var I=m+x*v(j/T),R=An(c(I,1-I));k.push(R),z||(z=R.overflow==="hidden")}z&&(e.style.overflow="hidden"),g=()=>{var N=_.currentTime;return m+x*v(N/E)},d&&pa(()=>{if(_.playState!=="running")return!1;var N=g();return d(N,1-N),!0})}_=e.animate(k,{duration:E,fill:"forwards"}),_.onfinish=()=>{g=()=>n,d==null||d(n,1-n),a()}},{abort:()=>{_&&(_.cancel(),_.effect=null,_.onfinish=ke)},deactivate:()=>{a=ke},reset:()=>{n===0&&(d==null||d(1,0))},t:()=>g()}}function ft(e,t,r=t){var n=Kt();sn(e,"input",a=>{var s=a?e.defaultValue:e.value;if(s=Nr(e)?Ur(s):s,r(s),n&&s!==(s=t())){var o=e.selectionStart,f=e.selectionEnd;e.value=s??"",f!==null&&(e.selectionStart=o,e.selectionEnd=Math.min(f,e.value.length))}}),et(t)==null&&e.value&&r(Nr(e)?Ur(e.value):e.value),Ar(()=>{var a=t();Nr(e)&&a===Ur(e.value)||e.type==="date"&&!a&&!e.value||a!==e.value&&(e.value=a??"")})}const Pr=new Set;function Ys(e,t,r,n,a=n){var s=r.getAttribute("type")==="checkbox",o=e;if(t!==null)for(var f of t)o=o[f]??(o[f]=[]);o.push(r),sn(r,"change",()=>{var l=r.__value;s&&(l=Ws(o,l,r.checked)),a(l)},()=>a(s?[]:null)),Ar(()=>{var l=n();s?(l=l||[],r.checked=l.includes(r.__value)):r.checked=$n(r.__value,l)}),Er(()=>{var l=o.indexOf(r);l!==-1&&o.splice(l,1)}),Pr.has(o)||(Pr.add(o),Gt(()=>{o.sort((l,c)=>l.compareDocumentPosition(c)===4?-1:1),Pr.delete(o)})),Gt(()=>{})}function Ws(e,t,r){for(var n=new Set,a=0;a{var r=new MutationObserver(()=>{var n=e.__value;ga(e,n)});return r.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),()=>{r.disconnect()}})}function Js(e,t,r=t){var n=!0;sn(e,"change",a=>{var s=a?"[selected]":":checked",o;if(e.multiple)o=[].map.call(e.querySelectorAll(s),Ft);else{var f=e.querySelector(s)??e.querySelector("option:not([disabled])");o=f&&Ft(f)}r(o)}),Rt(()=>{var a=t();if(ga(e,a,n),n&&a===void 0){var s=e.querySelector(":checked");s!==null&&(a=Ft(s),r(a))}e.__value=a,n=!1}),Ks(e)}function Zs(e,t){for(var r of e.options)r.selected=t.includes(Ft(r))}function Ft(e){return"__value"in e?e.__value:e.value}function Cn(e,t){return e===t||(e==null?void 0:e[Je])===t}function gr(e={},t,r,n){return Rt(()=>{var a,s;return Ar(()=>{a=s,s=[],et(()=>{e!==r(...s)&&(t(e,...s),a&&Cn(r(...a),e)&&t(null,...a))})}),()=>{Gt(()=>{s&&Cn(r(...s),e)&&t(null,...s)})}}),e}function ba(e=!1){const t=re,r=t.l.u;if(!r)return;let n=()=>xs(t.s);if(e){let a=0,s={};const o=Ct(()=>{let f=!1;const l=t.s;for(const c in l)l[c]!==s[c]&&(s[c]=l[c],f=!0);return f&&a++,a});n=()=>i(o)}r.b.length&&us(()=>{Tn(t,n),Fr(r.b)}),cr(()=>{const a=et(()=>r.m.map(Va));return()=>{for(const s of a)typeof s=="function"&&s()}}),r.a.length&&cr(()=>{Tn(t,n),Fr(r.a)})}function Tn(e,t){if(e.l.s)for(const r of e.l.s)i(r);t()}function _a(e,t,r){if(e==null)return t(void 0),ke;const n=et(()=>e.subscribe(t,r));return n.unsubscribe?()=>n.unsubscribe():n}const Et=[];function Lr(e,t=ke){let r=null;const n=new Set;function a(f){if(Fn(e,f)&&(e=f,r)){const l=!Et.length;for(const c of n)c[1](),Et.push(c,e);if(l){for(let c=0;c{n.delete(c),n.size===0&&r&&(r(),r=null)}}return{set:a,update:s,subscribe:o}}function ct(e){let t;return _a(e,r=>t=r)(),t}let rr=!1,Kr=Symbol();function cn(e,t,r){const n=r[t]??(r[t]={store:null,source:Ze(void 0),unsubscribe:ke});if(n.store!==e&&!(Kr in r))if(n.unsubscribe(),n.store=e??null,e==null)n.source.v=void 0,n.unsubscribe=ke;else{var a=!0;n.unsubscribe=_a(e,s=>{a?n.source.v=s:h(n.source,s)}),a=!1}return e&&Kr in r?ct(e):i(n.source)}function un(){const e={};function t(){Er(()=>{for(var r in e)e[r].unsubscribe();Rn(e,Kr,{enumerable:!1,value:!0})})}return[e,t]}function Qs(e){var t=rr;try{return rr=!1,[e(),rr]}finally{rr=t}}function qn(e){var t;return((t=e.ctx)==null?void 0:t.d)??!1}function qe(e,t,r,n){var j;var a=(r&qa)!==0,s=!Ot||(r&Ia)!==0,o=(r&Ma)!==0,f=(r&za)!==0,l=!1,c;o?[c,l]=Qs(()=>e[t]):c=e[t];var d=Je in e||Ga in e,v=o&&(((j=At(e,t))==null?void 0:j.set)??(d&&t in e&&(I=>e[t]=I)))||void 0,u=n,p=!0,g=!1,_=()=>(g=!0,p&&(p=!1,f?u=et(n):u=n),u);c===void 0&&n!==void 0&&(v&&s&&Qa(),c=_(),v&&v(c));var m;if(s)m=()=>{var I=e[t];return I===void 0?_():(p=!0,g=!1,I)};else{var x=(a?Ct:kr)(()=>e[t]);x.f|=$a,m=()=>{var I=i(x);return I!==void 0&&(u=void 0),I===void 0?u:I}}if((r&La)===0)return m;if(v){var E=e.$$legacy;return function(I,R){return arguments.length>0?((!s||!R||E||l)&&v(R?m():I),I):m()}}var k=!1,z=Ze(c),T=Ct(()=>{var I=m(),R=i(z);return k?(k=!1,R):z.v=I});return o&&i(T),a||(T.equals=tn),function(I,R){if(arguments.length>0){const N=R?i(T):s&&o?xe(I):I;if(!T.equals(N)){if(k=!0,h(z,N),g&&u!==void 0&&(u=N),qn(T))return I;et(()=>i(T))}return I}return qn(T)?T.v:i(T)}}const pe=Lr({active:"default",backends:{default:{url:"/",token:null}}}),be=Lr({isAuthenticated:!1,isAuthenticating:!1,authError:null});let Br=!1;function vn(){const e=ct(pe);return e.backends[e.active]||e.backends.default}function Yt(){const e=vn();return e.url==="/"?"":e.url}function Jr(){return vn().token}function Xs(e,t){pe.update(r=>{var a;const n=((a=r.backends[e])==null?void 0:a.token)||null;return r.backends[e]={url:t,token:n},r})}async function fn(e){let t=!1;if(ct(pe).active!==e){pe.update(n=>(n.backends[e]&&(n.active=e),n));try{await Xt(),t=!0}catch(n){console.error("Error syncing auth state after backend change:",n)}}else t=!0;return t}function ei(e,t){pe.update(r=>(r.backends[e]&&(r.backends[e].token=t),r)),e===ct(pe).active&&be.update(r=>({...r,isAuthenticated:!!t,authError:null}))}async function pt(e,t={}){const r=Yt(),n=Jr(),a=e.startsWith("/")||e===""?e:`/${e}`,s=`${r}${a}`;return t.headers=t.headers||{},t.credentials="include",n&&!e.includes("/auth/login")&&(document.cookie.includes("AuthToken=")||(t.headers.Cookie=`AuthToken=${n}`),t.headers.Authorization=`Bearer ${n}`),await fetch(s,t)}async function In(e,t={},r){const n={...t},a=new AbortController;n.signal=a.signal;const s=setTimeout(()=>a.abort(),r);try{return await pt(e,n)}finally{clearTimeout(s)}}function Ln(e,t,r=console.error){const n=Yt(),a=Jr(),s=e.startsWith("/")||e===""?e:`/${e}`,o=n||window.location.origin,f=new URL(`${o}${s}`);a&&f.searchParams.set("token",a);let l=null,c=!0,d=ct(pe).active;try{const v={withCredentials:!0};l=new EventSource(f.toString(),v),l.onmessage=p=>{try{const g=JSON.parse(p.data);t(g)}catch{t(p.data)}},l.onerror=p=>{l.readyState===EventSource.CLOSED&&Xt().catch(console.error),r(p),c&&!l&&setTimeout(()=>{if(c&&document.visibilityState!=="hidden")try{l=new EventSource(f.toString(),v)}catch(g){r(g)}},2e3)};const u=pe.subscribe(p=>{c&&p.active!==d&&(console.log("The Backend changed, I am reconnecting a SSE connection"),d=p.active,l&&(l.close(),l=null),setTimeout(()=>{if(c)try{const g=Yt(),_=Jr(),m=new URL(`${g||window.location.origin}${s}`);_&&m.searchParams.set("token",_),l=new EventSource(m.toString(),v),l.onmessage=l.onmessage,l.onerror=l.onerror}catch(g){r(g)}},100))});return{close:()=>{l&&(l.close(),l=null),c=!1,u()}}}catch(v){return r(v),c=!1,{close:()=>{}}}}async function ti(e,t){be.update(r=>({...r,isAuthenticating:!0,authError:null}));try{const r=await pt("/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},credentials:"include",body:JSON.stringify({username:e,password:t})});if(!r.ok){const a=await r.json();throw new Error(a.error||"Authentication failed")}const n=await r.json();return ei(ct(pe).active,n.token),document.cookie=`AuthToken=${n.token}; path=/; max-age=${60*60*24}`,be.update(a=>({...a,isAuthenticated:!0,isAuthenticating:!1,authError:null})),!0}catch(r){return be.update(n=>({...n,isAuthenticated:!1,isAuthenticating:!1,authError:r.message})),!1}}async function Xt(){ct(pe).active,vn(),be.update(e=>({...e,isAuthenticating:!0}));try{const e=await In("/api/v2/auth/check",{method:"GET",headers:{Accept:"application/json"},credentials:"include"},500);return e.status===401?(be.update(t=>({...t,isAuthenticated:!1,isAuthenticating:!1,authError:"Authentication required"})),!1):e.status===404?(be.update(t=>({...t,isAuthenticated:!1,isAuthenticating:!1,authError:"endpoint not found"})),!1):e.ok?(be.update(t=>({...t,isAuthenticated:!0,isAuthenticating:!1,authError:null})),!0):(be.update(t=>({...t,isAuthenticated:!1,isAuthenticating:!1,authError:`API error: ${e.status} ${e.statusText}`})),!1)}catch(e){const t=e.name==="AbortError"?"Connection timed out. The server may be slow or unreachable.":e.message||"Connection error";console.warn("Auth check failed:",e),await new Promise(r=>setTimeout(r,60));try{if((await In("/api/v2/auth/check",{method:"GET",headers:{Accept:"application/json"},credentials:"include"},500)).ok)return be.update(n=>({...n,isAuthenticated:!0,isAuthenticating:!1,authError:null})),!0}catch(r){console.warn("Retry auth check failed:",r)}return be.update(r=>({...r,isAuthenticated:!1,isAuthenticating:!1,authError:t})),!1}}function ri(){var e,t,r;if(!Br)try{const n=localStorage.getItem("ssui-backend-config");if(n){const s=JSON.parse(n),o={active:s.active&&((e=s.backends)!=null&&e[s.active])?s.active:"default",backends:{default:{url:"/",token:((r=(t=s.backends)==null?void 0:t.default)==null?void 0:r.token)||null}}};if(s.backends)for(const[f,l]of Object.entries(s.backends))f!=="default"&&(o.backends[f]={url:l.url,token:l.token||null});pe.set(o)}const a=pe.subscribe(s=>{try{localStorage.setItem("ssui-backend-config",JSON.stringify(s))}catch(o){console.error("Error saving backend config:",o)}});return Br=!0,Xt().catch(console.error),a}catch(n){console.error("Error initializing API service:",n),Br=!0}}const Vt=Lr({username:null,accessLevel:null,isLoading:!0,isAuthenticated:!1,lastFetched:null,error:null});async function ni(){Vt.update(e=>({...e,isLoading:!0,error:null}));try{const t=await(await pt("/api/v2/auth/whoami")).json();if(console.log("You are logged in as:",t),t&&t.username)return Vt.set({username:t.username,accessLevel:t.accessLevel||"user",isLoading:!1,isAuthenticated:!0,lastFetched:new Date,error:null}),t;throw new Error("Invalid response format: missing username")}catch(e){throw console.error("Failed to fetch user info:",e),Vt.set({username:null,accessLevel:null,isLoading:!1,isAuthenticated:!1,lastFetched:null,error:e.message||"Failed to fetch user information"}),e}}function ai(e){if(!e)return"USR";const t=e.split(/[\s_-]+/);return t.length===1?e.substring(0,3).toUpperCase():t.slice(0,2).map(r=>r.charAt(0).toUpperCase()).join("")}function si(e){return e?e.charAt(0).toUpperCase()+e.slice(1):"Unknown"}function ii(){return ni().catch(e=>{console.warn("Initial user info fetch failed:",e)})}function oi(){Vt.set({username:null,accessLevel:null,isLoading:!1,isAuthenticated:!1,lastFetched:null,error:null})}const dn={forest:{name:"Forest Dark",properties:{"--bg-primary":"#1e1e1e","--bg-secondary":"#252526","--bg-tertiary":"#2d2d2d","--bg-hover":"#3c3c3c","--bg-active":"#3e4033","--text-primary":"#d4d4d4","--text-secondary":"#a9a9a9","--text-accent":"#6a9955","--text-warning":"#ce9178","--border-color":"#3e3e3e","--accent-primary":"#6a9955","--accent-secondary":"#4d7240","--accent-tertiary":"#5f7e52","--shadow-light":"0 2px 8px rgba(0, 0, 0, 0.3)","--shadow-medium":"0 4px 12px rgba(0, 0, 0, 0.4)","--transition-speed":"250ms","--top-nav-height":"3rem","--sidebar-width":"150px","--sidebar-collapsed-width":"60px"}},vaxholmDark:{name:"Vaxholm Dark",properties:{"--bg-primary":"#121a12","--bg-secondary":"#1b2a1b","--bg-tertiary":"#243224","--bg-hover":"#2e3a2e","--bg-active":"#3a4a3a","--text-primary":"#d9e6d9","--text-secondary":"#a3b3a3","--text-accent":"#7a9a7a","--text-warning":"#c9a67a","--border-color":"#2a3a2a","--accent-primary":"#7a9a7a","--accent-secondary":"#5f7a5f","--accent-tertiary":"#6a8a6a","--shadow-light":"0 2px 8px rgba(0, 0, 0, 0.5)","--shadow-medium":"0 4px 12px rgba(0, 0, 0, 0.6)","--transition-speed":"250ms","--top-nav-height":"3rem","--sidebar-width":"150px","--sidebar-collapsed-width":"60px"}},archipelagoPastel:{name:"Archipelago Pastel",properties:{"--bg-primary":"#2e3b3e","--bg-secondary":"#3e4b4e","--bg-tertiary":"#4e5b5e","--bg-hover":"#5e6b6e","--bg-active":"#6e7b7e","--text-primary":"#dce7e7","--text-secondary":"#b0c0c0","--text-accent":"#a3c1ad","--text-warning":"#d9bba3","--border-color":"#4a5a5a","--accent-primary":"#a3c1ad","--accent-secondary":"#8bb394","--accent-tertiary":"#7aa383","--shadow-light":"0 2px 8px rgba(0, 0, 0, 0.25)","--shadow-medium":"0 4px 12px rgba(0, 0, 0, 0.35)","--transition-speed":"250ms","--top-nav-height":"3rem","--sidebar-width":"150px","--sidebar-collapsed-width":"60px"}},colorblindFriendly:{name:"Colorblind Friendly",properties:{"--bg-primary":"#121212","--bg-secondary":"#1e1e1e","--bg-tertiary":"#2a2a2a","--bg-hover":"#383838","--bg-active":"#454545","--text-primary":"#ffffff","--text-secondary":"#bfbfbf","--text-accent":"#ffb300","--text-warning":"#ff3b3b","--border-color":"#666666","--accent-primary":"#ffb300","--accent-secondary":"#ffaa00","--accent-tertiary":"#cc8800","--shadow-light":"0 2px 8px rgba(0, 0, 0, 0.7)","--shadow-medium":"0 4px 12px rgba(0, 0, 0, 0.8)","--transition-speed":"250ms","--top-nav-height":"3rem","--sidebar-width":"150px","--sidebar-collapsed-width":"60px"}},cyberpunkGlow:{name:"Cyberpunk Glow",properties:{"--bg-primary":"#0a0a23","--bg-secondary":"#1a1a3a","--bg-tertiary":"#2a2a5a","--bg-hover":"#3a3a7a","--bg-active":"#4a4a9a","--text-primary":"#e0e0ff","--text-secondary":"#a0a0ff","--text-accent":"#ff00ff","--text-warning":"#ff4d4d","--border-color":"#660066","--accent-primary":"#ff00ff","--accent-secondary":"#cc00cc","--accent-tertiary":"#990099","--shadow-light":"0 0 8px #ff00ff","--shadow-medium":"0 0 16px #ff00ff","--transition-speed":"250ms","--top-nav-height":"3rem","--sidebar-width":"150px","--sidebar-collapsed-width":"60px"}},v1Classic:{name:"Stationeers Server UI (Classic)",properties:{"--bg-primary":"#0a0a14","--bg-secondary":"#1b1b2f8f","--bg-tertiary":"#2a2a5a","--bg-hover":"#2a2a5a","--bg-active":"#4a4a9a","--text-primary":"#00fca9","--text-secondary":"#00fca9","--text-accent":"#00fca9","--text-warning":"#ff4d4d","--border-color":"#660066","--accent-primary":"#0eefa9","--accent-secondary":"#cc00cc","--accent-tertiary":"#990099","--shadow-light":"0 0 8px #0df2aa","--shadow-medium":"0 0 16px #0df2aa","--transition-speed":"250ms","--top-nav-height":"3rem","--sidebar-width":"150px","--sidebar-collapsed-width":"60px"}},lightArchipelago:{name:"Light Archipelago",properties:{"--bg-primary":"#f0f4f3","--bg-secondary":"#d9e4e1","--bg-tertiary":"#c0d1cd","--bg-hover":"#b0c4bf","--bg-active":"#a0b4af","--text-primary":"#2a3a33","--text-secondary":"#4a5a53","--text-accent":"#7a9a7a","--text-warning":"#c97a5a","--border-color":"#a0b0a8","--accent-primary":"#7a9a7a","--accent-secondary":"#5f7a5f","--accent-tertiary":"#6a8a6a","--shadow-light":"0 2px 8px rgba(0, 0, 0, 0.1)","--shadow-medium":"0 4px 12px rgba(0, 0, 0, 0.15)","--transition-speed":"250ms","--top-nav-height":"3rem","--sidebar-width":"150px","--sidebar-collapsed-width":"60px"}},oceanBreeze:{name:"Ocean Breeze",properties:{"--bg-primary":"#1a2a38","--bg-secondary":"#253545","--bg-tertiary":"#2f4055","--bg-hover":"#3a4c66","--bg-active":"#4a5c76","--text-primary":"#e0eaf0","--text-secondary":"#b0c0d0","--text-accent":"#68c1e8","--text-warning":"#f0ad4e","--border-color":"#456277","--accent-primary":"#68c1e8","--accent-secondary":"#4fa3ca","--accent-tertiary":"#3a89b0","--shadow-light":"0 2px 8px rgba(0, 0, 0, 0.3)","--shadow-medium":"0 4px 12px rgba(0, 0, 0, 0.4)","--transition-speed":"250ms","--top-nav-height":"3rem","--sidebar-width":"150px","--sidebar-collapsed-width":"60px"}},sunsetGlow:{name:"Sunset Glow",properties:{"--bg-primary":"#272133","--bg-secondary":"#332940","--bg-tertiary":"#3e304d","--bg-hover":"#4b3a5d","--bg-active":"#57446d","--text-primary":"#f5e6ff","--text-secondary":"#d1b6e1","--text-accent":"#ff9e7a","--text-warning":"#ffcc66","--border-color":"#5d4970","--accent-primary":"#ff9e7a","--accent-secondary":"#e68a6a","--accent-tertiary":"#cc775a","--shadow-light":"0 2px 8px rgba(0, 0, 0, 0.35)","--shadow-medium":"0 4px 12px rgba(0, 0, 0, 0.45)","--transition-speed":"250ms","--top-nav-height":"3rem","--sidebar-width":"150px","--sidebar-collapsed-width":"60px"}},mintChocolate:{name:"Mint Chocolate",properties:{"--bg-primary":"#1e2721","--bg-secondary":"#26322a","--bg-tertiary":"#2e3d33","--bg-hover":"#38493e","--bg-active":"#425548","--text-primary":"#e0f0e8","--text-secondary":"#b0c5b8","--text-accent":"#7fe0c3","--text-warning":"#d9b382","--border-color":"#3d4940","--accent-primary":"#7fe0c3","--accent-secondary":"#58c4a3","--accent-tertiary":"#3ba483","--shadow-light":"0 2px 8px rgba(0, 0, 0, 0.3)","--shadow-medium":"0 4px 12px rgba(0, 0, 0, 0.4)","--transition-speed":"250ms","--top-nav-height":"3rem","--sidebar-width":"150px","--sidebar-collapsed-width":"60px"}},lavenderFields:{name:"Lavender Fields",properties:{"--bg-primary":"#2b2440","--bg-secondary":"#352e4e","--bg-tertiary":"#3f385c","--bg-hover":"#4a426a","--bg-active":"#554c78","--text-primary":"#ece8ff","--text-secondary":"#c7c0e3","--text-accent":"#b28dff","--text-warning":"#ffad9c","--border-color":"#4d4566","--accent-primary":"#b28dff","--accent-secondary":"#9a77e0","--accent-tertiary":"#8360c6","--shadow-light":"0 2px 8px rgba(0, 0, 0, 0.35)","--shadow-medium":"0 4px 12px rgba(0, 0, 0, 0.45)","--transition-speed":"250ms","--top-nav-height":"3rem","--sidebar-width":"150px","--sidebar-collapsed-width":"60px"}},nordAurora:{name:"Kirkeness",properties:{"--bg-primary":"#2e3440","--bg-secondary":"#3b4252","--bg-tertiary":"#434c5e","--bg-hover":"#4c566a","--bg-active":"#5e6779","--text-primary":"#eceff4","--text-secondary":"#d8dee9","--text-accent":"#88c0d0","--text-warning":"#ebcb8b","--border-color":"#4c566a","--accent-primary":"#88c0d0","--accent-secondary":"#81a1c1","--accent-tertiary":"#5e81ac","--shadow-light":"0 2px 8px rgba(0, 0, 0, 0.25)","--shadow-medium":"0 4px 12px rgba(0, 0, 0, 0.35)","--transition-speed":"250ms","--top-nav-height":"3rem","--sidebar-width":"150px","--sidebar-collapsed-width":"60px"}}},ir=Object.keys(dn);let Mr="forest";function br(e){const t=dn[e];if(!t)return;Mr=e;const r=document.documentElement;Object.entries(t.properties).forEach(([n,a])=>{r.style.setProperty(n,a)}),localStorage.setItem("theme",e)}function li(){const t=(ir.indexOf(Mr)+1)%ir.length;br(ir[t])}function ci(){return Mr}function ui(){return ir}function vi(){const e=localStorage.getItem("theme");e&&dn[e]?br(e):br(Mr)}const ma={initTheme:vi,applyTheme:br,nextTheme:li,getCurrentTheme:ci,getThemes:ui};var fi=(e,t)=>h(t,""),di=P('
'),hi=P('

Admin: User Settings

DO NOT USE THIS; REPLACES CURRENT USER IN STATIONEERSERVERUI!

Add or Change User

');function pi(e,t){Ee(t,!0);let r=A(""),n=A(!1),a,s=A(""),o=A(""),f=A(""),l=A("superadmin");function c(){h(s,""),h(o,""),h(f,""),h(l,"superadmin")}async function d(){if(!i(s).trim()){v("Username is required",!0);return}if(!i(o)){v("Password is required",!0);return}if(i(o)!==i(f)){v("Passwords do not match",!0);return}if(i(o).length<3){v("Password must be at least 3 characters long",!0);return}try{const D=await pt("/api/v2/auth/adduser",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:i(s).trim(),password:i(o),accessLevel:i(l)})}),Z=await D.json();if(!D.ok){v(`Failed to add/change user: ${Z.message||"Unknown error"}`,!0);return}v(`User "${i(s)}" updated successfully`,!1),c()}catch(D){v(`Error updating user: ${D.message}`,!0)}}function v(D,Z){h(r,D,!0),h(n,Z,!0),a&&clearTimeout(a),a=setTimeout(()=>{h(r,"")},3e4)}function u(D){D.preventDefault(),d()}var p=hi(),g=w(b(p),4),_=w(b(g),2),m=b(_),x=b(m),E=w(b(x),2),k=w(m,2),z=b(k),T=w(b(z),2),j=w(k,2),I=b(j),R=w(b(I),2),N=w(j,2),V=b(N),ie=w(b(V),2),ne=b(ie);ne.value=ne.__value="superadmin";var me=w(ne);me.value=me.__value="user";var Ie=w(N,2),ve=w(b(Ie),2);ve.__click=c;var O=w(g,2);{var H=D=>{var Z=di();let X;var oe=b(Z),Le=b(oe),je=w(oe,2),ye=b(je),Re=w(je,2);Re.__click=[fi,r],K(at=>{X=ae(Z,1,"status-message svelte-1cjnnh7",null,X,at),B(Le,i(n)?"⚠️":"✓"),B(ye,i(r))},[()=>({error:i(n)})]),S(D,Z)};M(O,D=>{i(r)&&D(H)})}tt("submit",_,u),ft(E,()=>i(s),D=>h(s,D)),ft(T,()=>i(o),D=>h(o,D)),ft(R,()=>i(f),D=>h(f,D)),Js(ie,()=>i(l),D=>h(l,D)),S(e,p),Ae()}Ge(["click"]);function gi(e,t,r,n){e.stopPropagation(),h(t,!i(t)),i(t)&&(h(r,!1),h(n,!1))}function bi(e,t,r,n){e.stopPropagation(),h(t,!i(t)),i(t)&&(h(r,!1),h(n,!1))}async function _i(e,t,r){try{oi(),localStorage.removeItem("ssui-backend-config"),document.cookie="AuthToken=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/",window.location.href="/login"}catch(n){console.error("Logout failed:",n),h(t,!1),h(r,!1)}}async function mi(e,t,r){h(t,!1),h(r,!0)}function yi(){ma.nextTheme()}var wi=(e,t)=>t.setActiveView("dashboard"),ki=(e,t,r)=>t.setActiveView(i(r).id),xi=P(""),Si=e=>e.stopPropagation(),Ei=(e,t,r)=>t(i(r)),Ai=P(''),Ci=P('
'),Ti=P('
'),qi=e=>e.stopPropagation(),Ii=P('
'),Li=P(''),Mi=P('');function zi(e,t){Ee(t,!0);const[r,n]=un(),a=()=>cn(Vt,"$userInfo",r);let s=qe(t,"views",19,()=>[]),o=qe(t,"activeView",3,"dashboard"),f=A(xe(new Date)),l=A(!1),c=A(!1),d=A(!1),v=A(xe([])),u=A(""),p=A(xe({})),g,_,m;const x=pe.subscribe(y=>{const C=Object.keys(y.backends),L=y.active,ee=L!==i(u);h(v,C,!0),h(u,L,!0);const he={...i(p)};i(v).forEach(Me=>{Me in he||(he[Me]={status:"unknown",lastChecked:null})}),h(p,he,!0),ee&&i(u)&&(T(i(u)),j())});function E(y){return y!=null&&y.isLoading?"...":y!=null&&y.username?ai(y.username):"USR"}function k(y){return y!=null&&y.isLoading?"Loading...":y!=null&&y.error?"Error":(y==null?void 0:y.username)||"Unknown User"}function z(y){return y!=null&&y.isLoading?"Loading...":y!=null&&y.error?"Error":si(y==null?void 0:y.accessLevel)||"Unknown"}function T(y){if(!y||!i(v).includes(y))return;const C={...i(p)};C[y]={...C[y],status:"connecting"},h(p,C,!0),clearTimeout(g),g=setTimeout(async()=>{try{const L=await pt("/api/v2/server/status"),ee={...i(p)};L?ee[y]={status:"connected",lastChecked:new Date,details:L}:ee[y]={status:"error",lastChecked:new Date,details:L},h(p,ee,!0)}catch(L){const ee={...i(p)};ee[y]={status:"error",lastChecked:new Date,errorMessage:L.message},h(p,ee,!0)}},800)}function j(){_&&clearInterval(_),_=setInterval(()=>{if(i(u)){const y=i(u);T(y)}},1e4)}function I(){m=y=>{const C=document.querySelector(".backend-selector"),L=document.querySelector(".user-menu-container");C&&!C.contains(y.target)&&h(l,!1),L&&!L.contains(y.target)&&(h(c,!1),h(d,!1))},document.addEventListener("click",m)}nt(()=>{ma.initTheme(),I();const y=setInterval(()=>{h(f,new Date,!0)},6e4);return i(u)&&T(i(u)),j(),ii(),()=>{clearInterval(y),clearInterval(_),clearTimeout(g),x(),document.removeEventListener("click",m)}}),on(()=>{clearInterval(_),clearTimeout(g)});function R(y){if(y===i(u)){T(y),h(l,!1);return}fn(y),h(u,y,!0),T(y),j(),h(l,!1)}function N(y){var L;switch(((L=i(p)[y])==null?void 0:L.status)||"unknown"){case"connected":return"🟢";case"connecting":return"🟠";case"error":return"🔴";default:return"⚪"}}function V(y,{duration:C=300}){return{duration:C,css:L=>` + transform: translateY(${(1-L)*-10}px); + opacity: ${L}; + `}}function ie(y,{duration:C=400}){return{duration:C,css:L=>{const ee=.95+L*.05;return` + transform: translateY(${(1-L)*-10}px) scale(${ee}); + opacity: ${L}; + `}}}let ne=Ye(()=>i(f).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})),me=Ye(()=>i(f).toLocaleDateString([],{month:"short",day:"numeric"}));var Ie=Mi(),ve=b(Ie),O=b(ve);O.__click=[wi,t];var H=w(O,2);Mt(H,21,s,Lt,(y,C)=>{var L=xi();L.__click=[ki,t,C];var ee=b(L);K(()=>{ae(L,1,Ds(o()===i(C).id?"active":""),"svelte-xnmqz6"),B(ee,i(C).name)}),S(y,L)});var D=w(ve,2),Z=b(D);Z.__click=[Si];var X=b(Z);X.__click=[gi,l,c,d];var oe=b(X),Le=b(oe),je=w(oe,2),ye=b(je),Re=w(je,2),at=b(Re),Dt=w(X,2);{var Fe=y=>{var C=Ti(),L=w(b(C),2);Mt(L,21,()=>i(v),Lt,(ee,he)=>{var Me=Ci();Me.__click=[Ei,R,he];var bt=b(Me),ut=b(bt),Pt=w(ut,2),_t=b(Pt),Nt=w(bt,2);{var Ut=De=>{var ue=Ai();S(De,ue)};M(Nt,De=>{i(he)===i(u)&&De(Ut)})}K(()=>{var De,ue,Pe;ae(Me,1,`dropdown-item ${i(he)===i(u)?"active":""}`,"svelte-xnmqz6"),ln(ut,`background-color: ${((De=i(p)[i(he)])==null?void 0:De.status)==="connected"?"var(--accent-primary)":((ue=i(p)[i(he)])==null?void 0:ue.status)==="connecting"?"var(--text-warning)":((Pe=i(p)[i(he)])==null?void 0:Pe.status)==="error"?"var(--text-danger)":"var(--text-secondary)"}`),B(_t,i(he))}),S(ee,Me)}),fe(1,C,()=>V,()=>({duration:150})),fe(2,C,()=>V,()=>({duration:150})),S(y,C)};M(Dt,y=>{i(l)&&y(Fe)})}var st=w(Z,2),gt=b(st),q=b(gt),U=w(gt,2),te=b(U),Q=w(st,2);Q.__click=[qi];var F=b(Q);F.__click=[bi,c,l,d];var $=b(F),ce=b($),de=w(F,2);{var le=y=>{var C=Ii(),L=b(C),ee=b(L),he=b(ee),Me=b(he),bt=w(he,2),ut=b(bt),Pt=b(ut),_t=w(ut,2),Nt=b(_t),Ut=w(L,2),De=b(Ut);De.__click=[yi];var ue=w(De,2);ue.__click=[mi,c,d];var Pe=w(ue,4);Pe.__click=[_i,c,d],K((zr,Or,it)=>{B(Me,zr),B(Pt,Or),B(Nt,it)},[()=>E(a()),()=>k(a()),()=>z(a())]),fe(1,C,()=>V,()=>({duration:150})),fe(2,C,()=>V,()=>({duration:150})),S(y,C)};M(de,y=>{i(c)&&y(le)})}var se=w(de,2);{var G=y=>{var C=Li(),L=b(C);pi(L,{}),fe(1,C,()=>ie,()=>({duration:300})),fe(2,C,()=>ie,()=>({duration:200})),S(y,C)};M(se,y=>{i(d)&&y(G)})}K((y,C)=>{B(Le,y),B(ye,i(u)),B(at,i(l)?"▲":"▼"),B(q,i(me)),B(te,i(ne)),ae(Q,1,`user-menu-container ${i(d)?"expanded":""}`,"svelte-xnmqz6"),B(ce,C)},[()=>N(i(u)),()=>E(a())]),S(e,Ie),Ae(),n()}Ge(["click"]);function Oi(e,t){h(t,!i(t))}var ji=(e,t,r)=>t.setActiveView(i(r).id),Ri=P(''),Di=P('');function Pi(e,t){Ee(t,!0);let r=qe(t,"views",19,()=>[]),n=qe(t,"activeView",3,"dashboard"),a=A(!1),s=A(!1);function o(){h(a,!0)}function f(){h(a,!1)}let l=Ye(()=>i(a)||i(s));var c=Di();let d;var v=b(c),u=b(v);let p;u.__click=[Oi,s];var g=b(u);{var _=E=>{var k=Y("📌");S(E,k)},m=E=>{var k=Y("📍");S(E,k)};M(g,E=>{i(s)?E(_):E(m,!1)})}var x=w(v,2);Mt(x,21,r,Lt,(E,k)=>{var z=Ri();let T;z.__click=[ji,t,k];var j=b(z),I=b(j);{var R=ne=>{var me=Y("📊");S(ne,me)},N=(ne,me)=>{{var Ie=O=>{var H=Y("⚙️");S(O,H)},ve=(O,H)=>{{var D=X=>{var oe=Y("📝");S(X,oe)},Z=(X,oe)=>{{var Le=ye=>{var Re=Y(">");S(ye,Re)},je=(ye,Re)=>{{var at=Fe=>{var st=Y("🌐");S(Fe,st)},Dt=(Fe,st)=>{{var gt=q=>{var U=Y("📦");S(q,U)};M(Fe,q=>{i(k).icon==="archive"&&q(gt)},st)}};M(ye,Fe=>{i(k).icon==="globe"?Fe(at):Fe(Dt,!1)},Re)}};M(X,ye=>{i(k).icon==="terminal"?ye(Le):ye(je,!1)},oe)}};M(O,X=>{i(k).icon==="file-text"?X(D):X(Z,!1)},H)}};M(ne,O=>{i(k).icon==="settings"?O(Ie):O(ve,!1)},me)}};M(I,ne=>{i(k).icon==="grid"?ne(R):ne(N,!1)})}var V=w(j,2),ie=b(V);K(ne=>{T=ae(z,1,"sidebar-button svelte-p1a138",null,T,ne),B(ie,i(k).name)},[()=>({active:n()===i(k).id})]),S(E,z)}),K((E,k)=>{d=ae(c,1,"sidebar svelte-p1a138",null,d,E),p=ae(u,1,"pin-button svelte-p1a138",null,p,k)},[()=>({expanded:i(l)}),()=>({active:i(s)})]),tt("mouseenter",c,o),tt("mouseleave",c,f),S(e,c),Ae()}Ge(["click"]);const Ni=e=>e;function ya(e){const t=e-1;return t*t*t+1}function Mn(e){const t=typeof e=="string"&&e.match(/^\s*(-?[\d.]+)([^\s]*)\s*$/);return t?[parseFloat(t[1]),t[2]||"px"]:[e,"px"]}function vt(e,{delay:t=0,duration:r=400,easing:n=Ni}={}){const a=+getComputedStyle(e).opacity;return{delay:t,duration:r,easing:n,css:s=>`opacity: ${s*a}`}}function nr(e,{delay:t=0,duration:r=400,easing:n=ya,x:a=0,y:s=0,opacity:o=0}={}){const f=getComputedStyle(e),l=+f.opacity,c=f.transform==="none"?"":f.transform,d=l*(1-o),[v,u]=Mn(a),[p,g]=Mn(s);return{delay:t,duration:r,easing:n,css:(_,m)=>` + transform: ${c} translate(${(1-_)*v}${u}, ${(1-_)*p}${g}); + opacity: ${l-d*m}`}}function Ui(e,{delay:t=0,duration:r=400,easing:n=ya,start:a=0,opacity:s=0}={}){const o=getComputedStyle(e),f=+o.opacity,l=o.transform==="none"?"":o.transform,c=1-a,d=f*(1-s);return{delay:t,duration:r,easing:n,css:(v,u)=>` + transform: ${l} scale(${1-c*u}); + opacity: ${f-d*u} + `}}ns();var Bi=(e,t)=>t("start"),Fi=(e,t)=>t("stop"),Vi=Qt(''),$i=Qt(''),Hi=P('
'),Gi=P('
');function Yi(e,t){Ee(t,!0);let r=A(!1),n=A(null),a=A(""),s=A(!1);async function o(x){h(r,!0),h(n,x,!0),h(s,!1);try{const E=await pt(`/api/v2/server/${x}`,{method:"POST"}),k=await E.text();E.ok||h(s,!0),h(a,k,!0)}catch(E){h(s,!0),h(a,"Failed to connect to server"),console.error("Error:",E)}finally{h(r,!1)}}var f=Gi(),l=b(f),c=b(l);c.__click=[Bi,o];let d;var v=b(c),u=w(c,2);u.__click=[Fi,o];let p;var g=b(u),_=w(l,2);{var m=x=>{var E=Hi(),k=b(E),z=b(k);{var T=N=>{var V=Vi();S(N,V)},j=N=>{var V=$i();S(N,V)};M(z,N=>{i(s)?N(T):N(j,!1)})}var I=w(k,2),R=b(I);K(()=>{ae(E,1,`response-message ${i(s)?"error":"success"}`,"svelte-1b4j9ko"),B(R,i(a))}),S(x,E)};M(_,x=>{i(a)&&x(m)})}K((x,E)=>{c.disabled=i(r),d=ae(c,1,"start-button svelte-1b4j9ko",null,d,x),B(v,i(r)&&i(n)==="start"?"Starting...":"Start Server"),u.disabled=i(r),p=ae(u,1,"stop-button svelte-1b4j9ko",null,p,E),B(g,i(r)&&i(n)==="stop"?"Stopping...":"Stop Server")},[()=>({active:i(n)==="start"&&!i(r)}),()=>({active:i(n)==="stop"&&!i(r)})]),S(e,f),Ae()}Ge(["click"]);async function Wi(e,t,r,n){h(t,!0),h(r,!1),h(n,"");try{const a=await pt("/api/v2/loader/reloadbackend",{method:"GET"});let s;try{s=await a.json()}catch{throw new Error("Invalid response format")}!a.ok||s.status!=="OK"?(h(r,!0),h(n,s.message||"Backend reload failed",!0)):h(n,"Backend reload triggered")}catch(a){h(r,!0),h(n,a.message||"Failed to connect to server",!0),console.error("Error:",a)}finally{h(t,!1)}}var Ki=Qt(''),Ji=Qt(''),Zi=P('
'),Qi=P('
');function Xi(e,t){Ee(t,!0);let r=A(!1),n=A(""),a=A(!1);var s=Qi(),o=b(s);o.__click=[Wi,r,a,n];let f;ln(o,"",{},{"background-color":"var(--bg-hover)"});var l=b(o),c=w(o,2);{var d=v=>{var u=Zi(),p=b(u),g=b(p);{var _=k=>{var z=Ki();S(k,z)},m=k=>{var z=Ji();S(k,z)};M(g,k=>{i(a)?k(_):k(m,!1)})}var x=w(p,2),E=b(x);K(()=>{ae(u,1,`response-message ${i(a)?"error":"success"}`,"svelte-1bn0ayy"),B(E,i(n))}),S(v,u)};M(c,v=>{i(n)&&v(d)})}K(v=>{o.disabled=i(r),f=ae(o,1,"svelte-1bn0ayy",null,f,v),B(l,i(r)?"🕐 Reloading...":"🔃 Reload Backend")},[()=>({active:!i(r)})]),S(e,s),Ae()}Ge(["click"]);var eo=P('

Quick Actions

');function to(e){var t=eo(),r=w(b(t),2);Yi(r,{});var n=w(r,2),a=b(n);Xi(a,{}),S(e,t)}function ro(e,t,r,n){h(t,!i(t)),i(t)&&(r(),n())}var no=(e,t)=>t("console-tab"),ao=(e,t)=>t("detection-tab"),so=P('
'),io=P('
'),oo=P('
'),lo=P('
'),co=P('
');function wa(e,t){Ee(t,!0);let r=A(void 0),n=A(void 0),a=null,s=null,o=A("console-tab"),f=A(!0);const l=["Teaching AI to say 'please' and 'thank you'...","Calibrating interdimensional server relays...","Spinning up player fun generators...","Scanning for gremlins in the server room...","Brewing energy drinks for the GPU...","Charging up epic loot spawners...","Teaching AI to high-five players...","Polishing textures to a glossy finish...","Herding electrons into neat little rows...","Rebooting server dreams for the 42nd time...","Locating your character after that teleport glitch...","Converting lag into pure chaos, efficiently...","Convincing physics engine that walls are solid...","Calculating odds of your inventory vanishing...","Optimizing server ticks (fingers crossed)...","Syncing game world with cosmic clock...","Patching rips in the fabric of virtual reality...","Convincing server that 'uptime' is not a myth...","Mediating truce between CPU and lag spikes...","Compressing map data until the server squeaks...","Measuring distance to the next game-breaking bug...","Explaining 'netcode' to confused server pigeons...","Calculating chance of a crash (don’t ask)...","Corraling rogue packets back into the pipeline...","Sacrificing bandwidth to the frame-rate deities...","Raising sails!"];let c=A(xe([])),d=A(xe([])),v=A(!1);function u(O){h(o,O,!0),O==="detection-tab"&&h(v,!1)}nt(async()=>{await p("Console initializing...");const O=Math.floor(Math.random()*l.length);g(l[O],"#0af","italic");let H;do H=Math.floor(Math.random()*l.length);while(H===O);g(l[H],"#0af","italic"),E(),k(),Math.random()<.5?(g("ERROR: Console was hacked by AI. Initiating counter-measure...","red"),setTimeout(()=>{g("Sequence complete. AI defeated. Continuing initialization...","green"),x()},1e3)):x()}),on(()=>{a&&(a.close(),a=null),s&&(s.close(),s=null)});async function p(O,H=30){let D=0;return new Promise(Z=>{const X=setInterval(()=>{D!oe.isTyping),!0),Z())},H)})}function g(O,H="white",D="normal"){h(c,[...i(c),{text:O,color:H,style:D}],!0),i(f)&&setTimeout(()=>_(),50)}function _(){i(r)&&i(f)&&(i(r).scrollTop=i(r).scrollHeight)}function m(){i(n)&&i(f)&&(i(n).scrollTop=i(n).scrollHeight)}function x(){setTimeout(()=>{g("Console ready.🎮 Happy gaming! 🎮","#0f0"),i(f)&&setTimeout(_,50)},500)}function E(){a&&(a.close(),a=null),a=Ln("/console",O=>{g(O)},O=>{console.error("Console stream error:",O),a=null,g("Warning: Console stream unavailable. Retrying...","#ff0"),setTimeout(()=>{!a&&document.visibilityState!=="hidden"&&E()},2e3)})}function k(){s&&(s.close(),s=null),s=Ln("/events",O=>{const H=z(O),D=new Date().toLocaleTimeString();h(d,[...i(d),{timestamp:D,message:O,className:H}],!0),i(d).length>500&&h(d,i(d).slice(-500),!0),i(f)&&setTimeout(m,50),i(o)!=="detection-tab"&&h(v,!0)},O=>{console.error("Detection events stream error:",O),s=null,setTimeout(()=>{!s&&document.visibilityState!=="hidden"&&k()},2e3)})}function z(O){return O.includes("ERROR")||O.includes("FATAL")?"error":O.includes("WARNING")?"warning":O.includes("SUCCESS")?"success":"info"}var T=co(),j=b(T),I=b(j),R=b(I);R.__click=[no,u];var N=w(R,2);N.__click=[ao,u];var V=w(I,2);V.__click=[ro,f,_,m];var ie=b(V),ne=w(j,2),me=b(ne);{var Ie=O=>{var H=io(),D=b(H);Mt(D,21,()=>i(c),Lt,(Z,X)=>{var oe=so(),Le=b(oe);K(()=>{ln(oe,`color: ${i(X).color??""}; font-style: ${i(X).style??""}`),B(Le,i(X).text)}),S(Z,oe)}),gr(D,Z=>h(r,Z),()=>i(r)),S(O,H)},ve=O=>{var H=lo(),D=b(H);Mt(D,21,()=>i(d),Lt,(Z,X)=>{var oe=oo(),Le=b(oe),je=b(Le),ye=w(Le,2),Re=b(ye);K(()=>{ae(oe,1,`detection-event ${i(X).className??""}`,"svelte-13trlk3"),B(je,`${i(X).timestamp??""}:`),B(Re,i(X).message)}),S(Z,oe)}),gr(D,Z=>h(n,Z),()=>i(n)),S(O,H)};M(me,O=>{i(o)==="console-tab"?O(Ie):O(ve,!1)})}K(()=>{ae(R,1,`tab-button ${i(o)==="console-tab"?"active":""}`,"svelte-13trlk3"),ae(N,1,`tab-button ${i(o)==="detection-tab"?"active":""} ${i(v)?"notification":""}`,"svelte-13trlk3"),Ir(V,"title",i(f)?"Disable Auto-scroll":"Enable Auto-scroll"),B(ie,i(f)?"⏬ Auto-scroll: ON":"⏫ Auto-scroll: OFF")}),S(e,T),Ae()}Ge(["click"]);var uo=P('
');function vo(e){var t=uo(),r=b(t);wa(r,{}),S(e,t)}Ge(["click"]);var fo=P('
');function ho(e){var t=fo(),r=b(t);to(r);var n=w(r,2);vo(n),S(e,t)}var po=P('

Loading Detection Manager...

'),go=P('
',1);function bo(e,t){Ee(t,!1);let r=Ze(),n=Ze(!0),a=Ze("");async function s(){try{const g=Yt();h(a,`${g}/detectionmanager`)}catch(g){console.error("Error constructing iframe src:",g)}}function o(){h(n,!1)}function f(){h(n,!1),console.error("Iframe failed to load")}nt(()=>{s()}),ba();var l=go(),c=Qe(l);let d;var v=b(c);gr(v,g=>h(r,g),()=>i(r));var u=w(c,2);{var p=g=>{var _=po();S(g,_)};M(u,g=>{i(n)&&g(p)})}K(g=>{d=ae(c,1,"iframe-container svelte-1n4i3h1",null,d,g),Ir(v,"src",i(a))},[()=>({hidden:i(n)})],kr),tt("load",v,o),tt("error",v,f),S(e,l),Ae()}var _o=P('

Loading Config Manager...

'),mo=P('
',1);function yo(e,t){Ee(t,!1);let r=Ze(),n=Ze(!0),a=Ze("");async function s(){try{const g=Yt();h(a,`${g}/config`)}catch(g){console.error("Error constructing iframe src:",g)}}function o(){h(n,!1)}function f(){h(n,!1),console.error("Iframe failed to load")}nt(()=>{s()}),ba();var l=mo(),c=Qe(l);let d;var v=b(c);gr(v,g=>h(r,g),()=>i(r));var u=w(c,2);{var p=g=>{var _=_o();S(g,_)};M(u,g=>{i(n)&&g(p)})}K(g=>{d=ae(c,1,"iframe-container svelte-1n4i3h1",null,d,g),Ir(v,"src",i(a))},[()=>({hidden:i(n)})],kr),tt("load",v,o),tt("error",v,f),S(e,l),Ae()}var wo=(e,t)=>t("Detection Manager"),ko=(e,t)=>t("Config Manager"),xo=P('
');function So(e){let t=A("SSUI Settings");function r(v){h(t,v,!0)}var n=xo(),a=b(n),s=b(a);s.__click=[wo,r];var o=w(s,2);o.__click=[ko,r];var f=w(a,2),l=b(f);{var c=v=>{bo(v,{})},d=(v,u)=>{{var p=g=>{yo(g,{})};M(v,g=>{i(t)==="Config Manager"&&g(p)},u)}};M(l,v=>{i(t)==="Detection Manager"?v(c):v(d,!1)})}K(()=>{ae(s,1,`settings-nav ${i(t)==="Detection Manager"?"active":""}`,"svelte-1oj27tx"),ae(o,1,`settings-nav ${i(t)==="Config Manager"?"active":""}`,"svelte-1oj27tx")}),S(e,n)}Ge(["click"]);var Eo=P('
'),Ao=P('
'),Co=P('
'),To=P('

');function qo(e,t){let r=qe(t,"activeView",3,"dashboard");const n={dashboard:{title:"Dashboard",description:"Server overview and statistics"},servers:{title:"Servers",description:"Manage your game servers"},settings:{title:"Settings",description:"Configure application settings"},logs:{title:"Logs",description:"View server logs and events"},console:{title:"Console",description:"View server console output"},gallery:{title:"Runfile Gallery",description:"Browse runfiles"},backups:{title:"Backups",description:"View and manage backups. Set up Backup paths from Settings -> SSUI Settings - > Backup Settings"}};var a=To(),s=b(a),o=b(s);let f;var l=b(o),c=w(o,2);let d;var v=b(c),u=w(s,2),p=b(u);{var g=m=>{var x=Eo(),E=b(x);ho(E),fe(1,x,()=>vt,()=>({duration:350,delay:5})),fe(2,x,()=>vt,()=>({duration:200})),S(m,x)},_=(m,x)=>{{var E=z=>{var T=Ao(),j=b(T);So(j),fe(1,T,()=>vt,()=>({duration:350,delay:5})),fe(2,T,()=>vt,()=>({duration:200})),S(z,T)},k=(z,T)=>{{var j=I=>{var R=Co(),N=b(R);wa(N,{}),fe(1,R,()=>vt,()=>({duration:350,delay:5})),fe(2,R,()=>vt,()=>({duration:200})),S(I,R)};M(z,I=>{r()==="console"&&I(j)},T)}};M(m,z=>{r()==="settings"?z(E):z(k,!1)},x)}};M(p,m=>{r()==="dashboard"?m(g):m(_,!1)})}K((m,x)=>{f=ae(o,1,"svelte-i4ubsw",null,f,m),B(l,n[r()].title),d=ae(c,1,"description svelte-i4ubsw",null,d,x),B(v,n[r()].description)},[()=>({hide:r()==="dashboard"}),()=>({hide:r()==="dashboard"})]),S(e,a)}var Io=P('

'),Lo=P('

');function Zr(e,t){let r=qe(t,"serverStatus",8,"checking"),n=qe(t,"errorMessage",8,null),a=qe(t,"statusDescOffline",12,null);function s(){return typeof navigator=="object"&&typeof navigator.userAgent=="string"&&navigator.userAgent.indexOf("Electron")>=0}a(s()?"Poking Backend":"Backend Offline");var o=Lo(),f=b(o),l=w(b(f),2),c=b(l),d=b(c);{var v=_=>{var m=Y("Connecting to Backend");S(_,m)},u=(_,m)=>{{var x=k=>{var z=Y("Initializing Backend");S(k,z)},E=(k,z)=>{{var T=I=>{var R=Y();K(()=>B(R,a())),S(I,R)},j=(I,R)=>{{var N=ie=>{var ne=Y("Backend error");S(ie,ne)},V=(ie,ne)=>{{var me=ve=>{var O=Y("Backend Certificate or https error");S(ve,O)},Ie=(ve,O)=>{{var H=D=>{var Z=Y("Server not found");S(D,Z)};M(ve,D=>{r()==="unreachable"&&D(H)},O)}};M(ie,ve=>{r()==="cert-error"?ve(me):ve(Ie,!1)},ne)}};M(I,ie=>{r()==="error"?ie(N):ie(V,!1)},R)}};M(k,I=>{r()==="offline"?I(T):I(j,!1)},z)}};M(_,k=>{r()==="online"?k(x):k(E,!1)},m)}};M(d,_=>{r()==="checking"?_(v):_(u,!1)})}var p=w(l,2);{var g=_=>{var m=Io(),x=w(b(m),2),E=b(x);K(()=>B(E,n())),S(_,m)};M(p,_=>{n()&&_(g)})}S(e,o)}function Mo(e,t){Ee(t,!0);let r=qe(t,"onStatusChange",3,v=>{}),n=A(!1),a=A("checking"),s=A(null);AbortSignal.timeout||(AbortSignal.timeout=function(u){const p=new AbortController;return setTimeout(()=>p.abort(),u),p.signal});async function o(){try{const v=new URL(window.location.href),u=`${v.protocol}//${v.host}`,p=new AbortController,g=setTimeout(()=>p.abort(),5e3),_=await fetch(`${u}/api/v2/server/status`,{method:"GET",signal:p.signal});return clearTimeout(g),_.status===404?(h(a,"offline"),h(s,null),be.update(m=>({...m,authError:"endpoint not found"})),!0):_.ok||_.status===401||_.status===403?(h(a,"online"),!0):(h(a,"error"),h(s,`Server error: ${_.status} ${_.statusText}`),!1)}catch(v){return v.name==="AbortError"?(h(a,"offline"),h(s,"Connection timed out. The server may be slow or unreachable.")):v.message.includes("certificate")||v.message.includes("SSL")||v.message.includes("ERR_CERT")?(h(a,"cert-error"),h(s,"Certificate error. The server may be using an invalid or self-signed certificate. Try accepting the certificate in your browser.")):v.message.includes("Failed to fetch")||v.message.includes("NetworkError")?(h(a,"unreachable"),h(s,"Server not found. The server may be down or the URL may be incorrect.")):(h(a,"offline"),h(s,v.message||"Cannot connect to server",!0)),!1}}nt(async()=>{if(ri(),await o())try{await Xt()}catch(u){console.warn("Auth check failed:",u)}r()({status:i(a),error:i(s)}),h(n,!0)});var f=It(),l=Qe(f);{var c=v=>{var u=It(),p=Qe(u);fa(p,()=>t.children??ke),S(v,u)},d=v=>{Zr(v,{get serverStatus(){return i(a)},get errorMessage(){return i(s)}})};M(l,v=>{i(n)?v(c):v(d,!1)})}S(e,f),Ae()}async function zo(e,t,r,n,a,s){await fn(i(t)),r(i(t)),h(n,!1),h(a,""),h(s,!1)}function Oo(e,t){h(t,!i(t))}async function jo(e,t,r,n,a,s,o){!i(t)||!i(r)||(Xs(i(t),i(r)),h(n,i(t),!0),await fn(i(t)),a(i(t)),h(s,!1),h(t,""),h(r,""),h(o,""))}var Ro=(e,t)=>h(t,!1),Do=P('
'),Po=(e,t,r)=>t(i(r)),No=P('
'),Uo=P(' Check Backend',1),Bo=P('
'),Fo=(e,t)=>h(t,!1),Vo=P(`

Add New Server

The current server doesn't have the expected login endpoint or is unreachable. Add a new server with the correct authentication endpoint.

`),$o=Qt(' Logging in...',1),Ho=P('
'),Go=P('');function Yo(e,t){Ee(t,!0);const[r,n]=un(),a=()=>cn(pe,"$backendConfig",r),s=[];let o=A(""),f=A(""),l=A(""),c=A(!1),d=A(xe([])),v=A(""),u=A(xe({})),p=A(!1),g=A(!1),_=A(!1),m=A(""),x=A(""),E,k;nt(()=>(E=be.subscribe(q=>{var U,te;if(q.authError){h(l,q.authError,!0);const Q=(U=i(u)[i(v)])==null?void 0:U.status,F=(te=i(u)[i(v)])==null?void 0:te.authRequired;h(_,!(Q==="online"&&F))}else h(l,""),h(_,!1);h(c,q.isAuthenticating,!0)}),k=pe.subscribe(q=>{var Q,F,$;h(d,Object.keys(q.backends),!0),h(v,q.active,!0),i(d).forEach(ce=>{ce in i(u)||(i(u)[ce]={status:"unknown",lastChecked:null,error:null})});const U=(Q=i(u)[i(v)])==null?void 0:Q.status,te=(F=i(u)[i(v)])==null?void 0:F.authRequired;["offline","unreachable","cert-error"].includes(U)?(h(_,!0),h(l,(($=i(u)[i(v)])==null?void 0:$.error)||"Cannot connect to the server.",!0)):U==="online"&&te&&h(_,!1)}),z(i(v)),()=>{E&&E(),k&&k()}));async function z(q){h(g,!0),i(u)[q]={status:"checking",lastChecked:new Date,error:null},h(u,{...i(u)},!0);try{const U=ct(pe),te=U.backends[q].url==="/"?"":U.backends[q].url,Q=new AbortController,F=setTimeout(()=>Q.abort(),5e3),$=await fetch(`${te}/api/v2/server/status`,{method:"GET",signal:Q.signal});clearTimeout(F),$.ok?i(u)[q]={status:"online",lastChecked:new Date,error:null}:$.status===401?i(u)[q]={status:"online",lastChecked:new Date,authRequired:!0,error:null}:i(u)[q]={status:"offline",lastChecked:new Date,error:`Server responded with ${$.status} ${$.statusText}`}}catch(U){let te="error",Q="Failed to connect to the server",F=!1;const $=i(R).startsWith("https://");U.name==="AbortError"?Q=j()?"You are using the Desktop App, so you must define your Backend.":"Connection timed out. The server may be slow, unreachable, or dead.":$?(te="cert-error",F=!0,Q="There was an error connecting to the remote Backend. If using a self-signed certificate, please visit the server URL to accept the certificate."):Q="Server not found. The server may be down or the URL may be incorrect.",i(u)[q]={status:te,lastChecked:new Date,error:Q,certificateHint:F,backendUrl:i(R)}}finally{h(g,!1),h(u,{...i(u)},!0)}}async function T(q){if(q&&q.preventDefault&&q.preventDefault(),h(l,""),h(c,!0),!i(o)||!i(f)){h(l,"Username and password are required"),h(c,!1);return}try{const U=await ti(i(o),i(f))}catch(U){h(l,U.message||"Login failed",!0)}finally{h(c,!1)}}function j(){return typeof navigator=="object"&&typeof navigator.userAgent=="string"&&navigator.userAgent.indexOf("Electron")>=0}let I=Ye(()=>a().backends[a().active]),R=Ye(()=>{var q;return((q=i(I))==null?void 0:q.url)||"/"}),N=Ye(()=>i(R)==="/"?window.location.origin:i(R)),V=Ye(()=>{var q;return((q=i(u)[i(v)])==null?void 0:q.status)||"unknown"}),ie=Ye(()=>{var q;return(q=i(u)[i(v)])==null?void 0:q.error});var ne=Go(),me=b(ne),Ie=b(me),ve=b(Ie),O=w(b(ve),2),H=b(O);H.__click=[Oo,p];var D=w(b(H),2),Z=b(D),X=w(D,2),oe=b(X);{var Le=q=>{var U=Y("🟢");S(q,U)},je=(q,U)=>{{var te=F=>{var $=Y("🔴");S(F,$)},Q=(F,$)=>{{var ce=le=>{var se=Y("⚠️");S(le,se)},de=(le,se)=>{{var G=C=>{var L=Y("🔒");S(C,L)},y=C=>{var L=Y("⚪");S(C,L)};M(le,C=>{i(V)==="cert-error"?C(G):C(y,!1)},se)}};M(F,le=>{i(V)==="error"||i(V)==="unreachable"?le(ce):le(de,!1)},$)}};M(q,F=>{i(V)==="offline"?F(te):F(Q,!1)},U)}};M(oe,q=>{i(V)==="online"?q(Le):q(je,!1)})}var ye=w(H,2);{var Re=q=>{var U=No(),te=b(U),Q=w(b(te),2);Q.__click=[Ro,p];var F=w(te,2);Mt(F,21,()=>i(d),Lt,(se,G)=>{var y=Do(),C=b(y),L=b(C),ee,he=w(L,2),Me=b(he),bt=b(Me),ut=w(Me,2),Pt=b(ut),_t=w(he,2),Nt=b(_t);{var Ut=ue=>{var Pe=Y("🟢");S(ue,Pe)},De=(ue,Pe)=>{{var zr=it=>{var mt=Y("🔴");S(it,mt)},Or=(it,mt)=>{{var ka=yt=>{var wt=Y("⚠️");S(yt,wt)},xa=(yt,wt)=>{{var er=kt=>{var xt=Y("🔒");S(kt,xt)},Sa=kt=>{var xt=Y("⚪");S(kt,xt)};M(yt,kt=>{var xt;((xt=i(u)[i(G)])==null?void 0:xt.status)==="cert-error"?kt(er):kt(Sa,!1)},wt)}};M(it,yt=>{var wt,er;((wt=i(u)[i(G)])==null?void 0:wt.status)==="error"||((er=i(u)[i(G)])==null?void 0:er.status)==="unreachable"?yt(ka):yt(xa,!1)},mt)}};M(ue,it=>{var mt;((mt=i(u)[i(G)])==null?void 0:mt.status)==="offline"?it(zr):it(Or,!1)},Pe)}};M(Nt,ue=>{var Pe;((Pe=i(u)[i(G)])==null?void 0:Pe.status)==="online"?ue(Ut):ue(De,!1)})}K(()=>{var ue;ee!==(ee=i(G))&&(L.value=(L.__value=i(G))??""),B(bt,i(G)),B(Pt,a().backends[i(G)].url),ae(_t,1,`status-indicator ${((ue=i(u)[i(G)])==null?void 0:ue.status)||"unknown"}`,"svelte-ybqy5b")}),Ys(s,[],L,()=>(i(G),i(v)),ue=>h(v,ue)),S(se,y)});var $=w(F,2),ce=b($);ce.__click=[Po,z,v];var de=b(ce),le=w(ce,2);le.__click=[zo,v,z,p,l,_],K(()=>{ce.disabled=i(g),B(de,i(g)?"Testing...":"Test Connection"),le.disabled=i(v)===a().active}),S(q,U)};M(ye,q=>{i(p)&&q(Re)})}var at=w(ve,2);{var Dt=q=>{var U=Bo(),te=b(U);{var Q=$=>{var ce=It(),de=Qe(ce);{var le=G=>{var y=Y("You are using the Desktop App, so you must define your Backend.");S(G,y)},se=G=>{var y=Y("The selected server doesn't have the expected login endpoint.");S(G,y)};M(de,G=>{j()?G(le):G(se,!1)})}S($,ce)},F=($,ce)=>{{var de=se=>{var G=Uo(),y=Qe(G),C=w(y);K(()=>{B(y,`${i(ie)??""} `),Ir(C,"href",i(u)[i(v)].backendUrl)}),S(se,G)},le=(se,G)=>{{var y=L=>{var ee=Y();K(()=>B(ee,i(ie))),S(L,ee)},C=L=>{var ee=Y();K(()=>B(ee,i(l))),S(L,ee)};M(se,L=>{i(ie)?L(y):L(C,!1)},G)}};M($,se=>{i(V)==="cert-error"?se(de):se(le,!1)},ce)}};M(te,$=>{i(l)==="endpoint not found"?$(Q):$(F,!1)})}S(q,U)};M(at,q=>{(i(l)||i(ie))&&q(Dt)})}var Fe=w(at,2);{var st=q=>{var U=Vo(),te=w(b(U),4),Q=w(b(te),2),F=w(te,2),$=w(b(F),2),ce=w(F,2),de=b(ce);de.__click=[Fo,_];var le=w(de,2);le.__click=[jo,m,x,v,z,_,l],K(()=>{Q.disabled=i(c),$.disabled=i(c),de.disabled=i(c),le.disabled=i(c)||!i(m)||!i(x)}),ft(Q,()=>i(m),se=>h(m,se)),ft($,()=>i(x),se=>h(x,se)),S(q,U)},gt=q=>{var U=Ho(),te=b(U),Q=w(b(te),2),F=w(b(Q),2),$=w(te,2),ce=w(b($),2),de=w(b(ce),2),le=w($,2),se=b(le);{var G=C=>{var L=$o();S(C,L)},y=C=>{var L=Y("Login");S(C,L)};M(se,C=>{i(c)?C(G):C(y,!1)})}K(()=>{F.disabled=i(c),de.disabled=i(c),le.disabled=i(c)||i(V)==="unreachable"||i(V)==="cert-error"}),tt("submit",U,T),ft(F,()=>i(o),C=>h(o,C)),ft(de,()=>i(f),C=>h(f,C)),S(q,U)};M(Fe,q=>{i(_)?q(st):q(gt,!1)})}K(()=>{B(Z,i(N)),ae(X,1,`status-indicator ${i(V)??""}`,"svelte-ybqy5b")}),S(e,ne),Ae(),n()}Ge(["click"]);function Wo(e,t){Ee(t,!0);const[r,n]=un(),a=()=>cn(be,"$authState",r);let s=qe(t,"checkAuth",3,!0),o=qe(t,"serverStatus",3,"online"),f=qe(t,"serverError",3,null),l=A(!0),c;nt(async()=>{if(s()&&o()==="online"){c=be.subscribe(g=>{h(l,g.isAuthenticating,!0)});try{await Xt()}catch(g){console.error("Auth check failed:",g),h(l,!1)}}else h(l,!1)}),on(()=>{c&&c()});var d=It(),v=Qe(d);{var u=g=>{Zr(g,{serverStatus:"checking"})},p=(g,_)=>{{var m=E=>{const k=Ye(()=>f()?f().toString():"There was an error connecting to the server.");Zr(E,{serverStatus:"error",get errorMessage(){return i(k)}})},x=(E,k)=>{{var z=j=>{Yo(j,{})},T=j=>{var I=It(),R=Qe(I);fa(R,()=>t.children??ke),S(j,I)};M(E,j=>{!a().isAuthenticated&&s()?j(z):j(T,!1)},k)}};M(g,E=>{o()==="error"?E(m):E(x,!1)},_)}};M(v,g=>{i(l)?g(u):g(p,!1)})}S(e,d),Ae(),n()}function Ko(e){return Math.sin(-13*(e+1)*Math.PI/2)*Math.pow(2,-10*e)+1}function zn(e){return Object.prototype.toString.call(e)==="[object Date]"}function Qr(e,t,r,n){if(typeof r=="number"||zn(r)){const a=n-r,s=(r-t)/(e.dt||1/60),o=e.opts.stiffness*a,f=e.opts.damping*s,l=(o-f)*e.inv_mass,c=(s+l)*e.dt;return Math.abs(c)Qr(e,t[s],r[s],n[s]));if(typeof r=="object"){const a={};for(const s in r)a[s]=Qr(e,t[s],r[s],n[s]);return a}else throw new Error(`Cannot spring ${typeof r} values`)}}function Jo(e,t={}){const r=Lr(e),{stiffness:n=.15,damping:a=.8,precision:s=.01}=t;let o,f,l,c=e,d=e,v=1,u=0,p=!1;function g(m,x={}){d=m;const E=l={};return e==null||x.hard||_.stiffness>=1&&_.damping>=1?(p=!0,o=Ne.now(),c=m,r.set(e=d),Promise.resolve()):(x.soft&&(u=1/((x.soft===!0?.5:+x.soft)*60),v=0),f||(o=Ne.now(),p=!1,f=pa(k=>{if(p)return p=!1,f=null,!1;v=Math.min(v+u,1);const z=Math.min(k-o,1e3/30),T={inv_mass:v,opts:_,settled:!0,dt:z*60/1e3},j=Qr(T,c,e,d);return o=k,c=e,r.set(e=j),T.settled&&(f=null),!T.settled})),new Promise(k=>{f.promise.then(()=>{E===l&&k()})}))}const _={set:g,update:(m,x)=>g(m(d,e),x),subscribe:r.subscribe,stiffness:n,damping:a,precision:s};return _}function Zo(e,t){const{clientX:r,clientY:n}=e,a=e.currentTarget.getBoundingClientRect(),s=(r-a.left-a.width/2)/15,o=(n-a.top-a.height/2)/15;t.set({x:s,y:o})}function Qo(e,t){t()&&t()()}var Xo=P(`

Screen too Small

Sorry, this display size is not recommended currently. If you continue, the app may not get displayed properly. Please use a device with a minimum width of 1024px and height of 600px, such as an iPad, or decrease the window scalnig. If you're using a phone, consider rotating it to landscape mode.

`),el=P('');function tl(e,t){Ee(t,!0);let r=qe(t,"onContinueAnyway",3,null),n=A(!1),a=A(!1);const s=Jo({x:0,y:0},{stiffness:.1,damping:.25});nt(()=>{h(n,!0),setTimeout(()=>{h(a,!0)},500)});var o=el();o.__mousemove=[Zo,s];var f=b(o);{var l=c=>{var d=Xo(),v=b(d),u=b(v),p=b(u),g=w(p,2),_=w(g,2),m=w(_,2);m.__click=[Qo,r],fe(1,p,()=>Ui,()=>({duration:600,delay:500,easing:Ko})),fe(1,g,()=>nr,()=>({y:20,duration:600,delay:600})),fe(1,_,()=>nr,()=>({y:20,duration:600,delay:800})),fe(1,m,()=>nr,()=>({y:20,duration:600,delay:1e3})),fe(1,v,()=>nr,()=>({y:30,duration:800,delay:300})),fe(3,d,()=>vt,()=>({duration:800})),S(c,d)};M(f,c=>{i(n)&&c(l)})}tt("mouseleave",o,()=>s.set({x:0,y:0})),S(e,o),Ae()}Ge(["mousemove","click"]);var rl=P('
');function nl(e,t){Ee(t,!0);let r=A("dashboard");const n=[{id:"dashboard",name:"Dashboard",icon:"grid"},{id:"settings",name:"Settings",icon:"settings"},{id:"console",name:"Console",icon:"terminal"}];function a(m){h(r,m,!0)}let s=A("checking"),o=A(null);function f(m){h(s,m.status,!0),h(o,m.error,!0)}let l=A(!0),c=A(!1);function d(){h(l,window.innerWidth>=1024&&window.innerHeight>=600,!0)}function v(){h(c,!0)}cr(()=>(d(),window.addEventListener("resize",d),()=>window.removeEventListener("resize",d)));var u=It(),p=Qe(u);{var g=m=>{Mo(m,{onStatusChange:f,children:(x,E)=>{Wo(x,{get serverStatus(){return i(s)},get serverError(){return i(o)},children:(k,z)=>{var T=rl(),j=b(T);zi(j,{views:n,get activeView(){return i(r)},setActiveView:a});var I=w(j,2),R=b(I);Pi(R,{views:n,get activeView(){return i(r)},setActiveView:a});var N=w(R,2);qo(N,{get activeView(){return i(r)}}),S(k,T)},$$slots:{default:!0}})},$$slots:{default:!0}})},_=m=>{tl(m,{onContinueAnyway:v})};M(p,m=>{i(l)||i(c)?m(g):m(_,!1)})}S(e,u),Ae()}Ts(nl,{target:document.getElementById("app")}); diff --git a/UIMod/onboard_bundled/v2/index.html b/UIMod/onboard_bundled/v2/index.html new file mode 100644 index 00000000..7496d93e --- /dev/null +++ b/UIMod/onboard_bundled/v2/index.html @@ -0,0 +1,14 @@ + + + + + + + Steam Server UI + + + + +
+ + diff --git a/build/version.go b/build/version.go new file mode 100644 index 00000000..dc240999 --- /dev/null +++ b/build/version.go @@ -0,0 +1,57 @@ +//go:build ignore +// +build ignore + +// version.go is a helper script to sync the backends version to package.json so the Electron auto updater can find its latest update on GitHub. +// Gets called only when the user runs the "Build: Full Project (Prep a release)" task. + +// The source of truth for the current version is the backends version defined in config.go + +package main + +import ( + "os" + "path/filepath" + "regexp" + + "github.com/JacksonTheMaster/StationeersServerUI/v5/src/config" +) + +func main() { + err := incrementUIVersion() + if err != nil { + panic(err) + } +} + +func incrementUIVersion() error { + backendVersion := config.Version + + // Define the path to package.json + packagePath := filepath.Join(".", "frontend", "package.json") + + // Read the package.json file + data, err := os.ReadFile(packagePath) + if err != nil { + return err + } + + // Create a regex to match the version field (e.g., "version": "v1.2.3") + // The regex captures the entire line, including quotes and commas + re, err := regexp.Compile(`"version"\s*:\s*"v\d+\.\d+\.\d+"`) + if err != nil { + return err + } + + // Prepare the replacement string + replacement := `"version": "v` + backendVersion + `"` + + // Perform the replacement + updatedData := re.ReplaceAllString(string(data), replacement) + + // Write the updated data back to package.json + if err := os.WriteFile(packagePath, []byte(updatedData), 0644); err != nil { + return err + } + + return nil +} diff --git a/frontend/.vscode/extensions.json b/frontend/.vscode/extensions.json new file mode 100644 index 00000000..bdef8201 --- /dev/null +++ b/frontend/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["svelte.svelte-vscode"] +} diff --git a/frontend/.vscode/settings.json b/frontend/.vscode/settings.json new file mode 100644 index 00000000..9562291b --- /dev/null +++ b/frontend/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib", + "svelte.plugin.typescript.diagnostics.enable": true, + "files.watcherExclude": { + "**/node_modules": true, + "**/.svelte-kit": true + }, + "[svelte]": { + "editor.defaultFormatter": "svelte.svelte-vscode" + } + } \ No newline at end of file diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 00000000..382941e0 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,47 @@ +# Svelte + Vite + +This template should help get you started developing with Svelte in Vite. + +## Recommended IDE Setup + +[VS Code](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). + +## Need an official Svelte framework? + +Check out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more. + +## Technical considerations + +**Why use this over SvelteKit?** + +- It brings its own routing solution which might not be preferable for some users. +- It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app. + +This template contains as little as possible to get started with Vite + Svelte, while taking into account the developer experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project. + +Should you later need the extended capabilities and extensibility provided by SvelteKit, the template has been structured similarly to SvelteKit so that it is easy to migrate. + +**Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?** + +Setting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash references keeps the default TypeScript setting of accepting type information from the entire workspace, while also adding `svelte` and `vite/client` type information. + +**Why include `.vscode/extensions.json`?** + +Other templates indirectly recommend extensions via the README, but this file allows VS Code to prompt the user to install the recommended extension upon opening the project. + +**Why enable `checkJs` in the JS template?** + +It is likely that most cases of changing variable types in runtime are likely to be accidental, rather than deliberate. This provides advanced typechecking out of the box. Should you like to take advantage of the dynamically-typed nature of JavaScript, it is trivial to change the configuration. + +**Why is HMR not preserving my local component state?** + +HMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the details [here](https://github.com/sveltejs/svelte-hmr/tree/master/packages/svelte-hmr#preservation-of-local-state). + +If you have state that's important to retain within a component, consider creating an external store which would not be replaced by HMR. + +```js +// store.js +// An extremely simple external store +import { writable } from 'svelte/store' +export default writable(0) +``` diff --git a/frontend/electron-builder.yml b/frontend/electron-builder.yml new file mode 100644 index 00000000..5b261e84 --- /dev/null +++ b/frontend/electron-builder.yml @@ -0,0 +1,25 @@ +appId: com.jacksonthemaster.ssui +productName: Steam Server UI +copyright: Copyright © 2025 JacksonTheMaster +artifactName: SSUI-Desktop-v${version}-${os}.${ext} +directories: + output: dist_electron + buildResources: resources +files: + - "package.json" + - "main.cjs" +extraResources: + - from: "../UIMod/onboard_bundled/v2/" + to: "UIMod/onboard_bundled/v2/" +win: + target: nsis + icon: ../media/logo.png +linux: + target: + - deb + icon: ../media/logo.png +publish: + provider: github + owner: SteamServerUI + repo: SteamServerUI + releaseType: release \ No newline at end of file diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 00000000..71aa518b --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,13 @@ + + + + + + + Steam Server UI + + +
+ + + diff --git a/frontend/jsconfig.json b/frontend/jsconfig.json new file mode 100644 index 00000000..5696a2de --- /dev/null +++ b/frontend/jsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "moduleResolution": "bundler", + "target": "ESNext", + "module": "ESNext", + /** + * svelte-preprocess cannot figure out whether you have + * a value or a type, so tell TypeScript to enforce using + * `import type` instead of `import` for Types. + */ + "verbatimModuleSyntax": true, + "isolatedModules": true, + "resolveJsonModule": true, + /** + * To have warnings / errors of the Svelte compiler at the + * correct position, enable source maps by default. + */ + "sourceMap": true, + "esModuleInterop": true, + "skipLibCheck": true, + /** + * Typecheck JS in `.svelte` and `.js` files by default. + * Disable this if you'd like to use dynamic types. + */ + "checkJs": true + }, + /** + * Use global.d.ts instead of compilerOptions.types + * to avoid limiting type declarations. + */ + "include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.svelte"] +} diff --git a/frontend/main.cjs b/frontend/main.cjs new file mode 100644 index 00000000..32bd5238 --- /dev/null +++ b/frontend/main.cjs @@ -0,0 +1,458 @@ +const { app, BrowserWindow, Menu, dialog } = require('electron'); +const { autoUpdater } = require('electron-updater'); +const path = require('path'); +const fs = require('fs'); +const express = require('express'); +const https = require('https'); +const forge = require('node-forge'); +const os = require('os'); + +// Configure auto-updater +// Only check for updates in production builds +if (process.env.NODE_ENV !== 'development') { + autoUpdater.setFeedURL({ + provider: 'github', + owner: 'SteamServerUI', + repo: 'SteamServerUI' + }); + + // Disable automatic installation on Linux for security/stability + if (process.platform === 'linux') { + autoUpdater.autoInstallOnAppQuit = false; + autoUpdater.autoDownload = true; + } +} + +// Auto-updater event handlers +autoUpdater.on('checking-for-update', () => { + console.log('Checking for update...'); +}); + +autoUpdater.on('update-available', (info) => { + console.log('Update available:', info.version); + // Optional: Show notification to user + dialog.showMessageBox({ + type: 'info', + title: 'Update Available', + message: `A new version (${info.version}) is available. It will be downloaded in the background.`, + buttons: ['OK'] + }); +}); + +autoUpdater.on('update-not-available', (info) => { + console.log('Update not available.'); +}); + +autoUpdater.on('error', (err) => { + console.error('Auto-updater error:', err); +}); + +autoUpdater.on('download-progress', (progressObj) => { + let log_message = "Download speed: " + progressObj.bytesPerSecond; + log_message = log_message + ' - Downloaded ' + progressObj.percent + '%'; + log_message = log_message + ' (' + progressObj.transferred + "/" + progressObj.total + ')'; + console.log(log_message); +}); + +autoUpdater.on('update-downloaded', (info) => { + console.log('Update downloaded'); + + if (process.platform === 'linux') { + // On Linux, show manual installation instructions + const updatePath = path.join(require('os').homedir(), '.cache', 'steamserverui-updater', 'pending'); + dialog.showMessageBox({ + type: 'info', + title: 'Update Downloaded', + message: `Update v${info.version} has been downloaded!\n\nFor security reasons, please install manually:\n\n1. Close this application\n2. Open terminal and run:\n sudo dpkg -i "${updatePath}/SSUI-Desktop-v${info.version}-linux.deb"\n\nOr double-click the downloaded .deb file in your file manager.`, + buttons: ['Open Download Folder', 'Later', 'Quit App'] + }).then((result) => { + if (result.response === 0) { + // Open the download folder + require('electron').shell.openPath(updatePath); + } else if (result.response === 2) { + // Quit the app so user can install manually + app.quit(); + } + }); + } else { + // Windows + dialog.showMessageBox({ + type: 'info', + title: 'Update Ready', + message: 'Update has been downloaded. The application will restart to apply the update.', + buttons: ['Restart Now', 'Later'] + }).then((result) => { + if (result.response === 0) { + autoUpdater.quitAndInstall(); + } + }); + } +}); + +// Certificate generation function +function generateSelfSignedCertificate() { + console.log('Generating self-signed certificate...'); + + // Generate a key pair + const keys = forge.pki.rsa.generateKeyPair(2048); + + // Create a certificate + const cert = forge.pki.createCertificate(); + cert.publicKey = keys.publicKey; + cert.serialNumber = '01'; + cert.validity.notBefore = new Date(); + cert.validity.notAfter = new Date(); + cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 1); + + const attrs = [ + { name: 'commonName', value: 'SteamServerUIDesktop' }, + { name: 'countryName', value: 'SE' }, + { shortName: 'ST', value: 'CA' }, + { name: 'localityName', value: 'Local' }, + { name: 'organizationName', value: 'SteamServerUI' }, + { shortName: 'OU', value: 'ElectronApp' } + ]; + + cert.setSubject(attrs); + cert.setIssuer(attrs); + cert.setExtensions([ + { + name: 'basicConstraints', + cA: true + }, + { + name: 'keyUsage', + keyCertSign: true, + digitalSignature: true, + nonRepudiation: true, + keyEncipherment: true, + dataEncipherment: true + }, + { + name: 'extKeyUsage', + serverAuth: true, + clientAuth: true, + codeSigning: true, + emailProtection: true, + timeStamping: true + }, + { + name: 'nsCertType', + client: true, + server: true, + email: true, + objsign: true, + sslCA: true, + emailCA: true, + objCA: true + }, + { + name: 'subjectAltName', + altNames: [ + { type: 2, value: 'localhost' }, + { type: 2, value: '127.0.0.1' }, + { type: 7, ip: '127.0.0.1' }, + { type: 7, ip: '::1' } + ] + } + ]); + + // Sign the certificate + cert.sign(keys.privateKey); + + // Convert to PEM format + const certPem = forge.pki.certificateToPem(cert); + const keyPem = forge.pki.privateKeyToPem(keys.privateKey); + + return { + cert: certPem, + key: keyPem + }; +} + +// Get or create certificate +function getCertificate() { + const certDir = path.join(os.homedir(), '.steamserverui'); + const certPath = path.join(certDir, 'cert.pem'); + const keyPath = path.join(certDir, 'key.pem'); + + // Create directory if it doesn't exist + if (!fs.existsSync(certDir)) { + fs.mkdirSync(certDir, { recursive: true }); + } + + // Check if certificate files exist and are valid + if (fs.existsSync(certPath) && fs.existsSync(keyPath)) { + try { + const cert = fs.readFileSync(certPath, 'utf8'); + const key = fs.readFileSync(keyPath, 'utf8'); + + // Check if certificate is still valid (not expired) + const certObj = forge.pki.certificateFromPem(cert); + const now = new Date(); + if (now < certObj.validity.notAfter) { + console.log('Using existing certificate'); + return { cert, key }; + } else { + console.log('Certificate expired, generating new one'); + } + } catch (err) { + console.log('Error reading existing certificate, generating new one:', err.message); + } + } + + // Generate new certificate + const certData = generateSelfSignedCertificate(); + + // Save certificate files + fs.writeFileSync(certPath, certData.cert); + fs.writeFileSync(keyPath, certData.key); + + console.log('Certificate saved to:', certDir); + return certData; +} + +// Static file server +let server; +let currentPortIndex = 0; +const HTTPS_PORTS = [28443, 28889, 29443, 27443, 26443, 35443, 34443, 30443, 34943]; + +function startServer() { + const expressApp = express(); + + // Determine the assets directory path + let assetsPath; + + // In production + const prodPath = path.join(process.resourcesPath, 'UIMod/onboard_bundled/v2'); + + // Check if path exists + if (fs.existsSync(prodPath)) { + assetsPath = prodPath; + } else { + dialog.showErrorBox('Error', 'Could not find assets directory: ' + prodPath); + app.exit(1); + return false; + } + + console.log('Serving assets from:', assetsPath); + + // Serve static files from the assets directory + expressApp.use(express.static(assetsPath)); + + // Get certificate + const certData = getCertificate(); + + // Create HTTPS server + const httpsOptions = { + key: certData.key, + cert: certData.cert + }; + + server = https.createServer(httpsOptions, expressApp); + + return new Promise((resolve, reject) => { + server.listen(HTTPS_PORTS[currentPortIndex], () => { + console.log(`HTTPS Server running at https://localhost:${HTTPS_PORTS[currentPortIndex]}`); + resolve(true); + }); + + server.on('error', (err) => { + console.error('Server error:', err); + if (err.code === 'EADDRINUSE' && currentPortIndex < HTTPS_PORTS.length - 1) { + currentPortIndex++; + console.log(`Port ${HTTPS_PORTS[currentPortIndex - 1]} in use, trying ${HTTPS_PORTS[currentPortIndex]}`); + server.close(); + startServer().then(resolve).catch(reject); + } else { + let errorMsg = err.code === 'EADDRINUSE' ? 'All default HTTPS ports are in use. Please free up a port and try again.' : err.message; + dialog.showErrorBox('Server Error', errorMsg); + reject(err); + } + }); + }); +} + +async function createWindow() { + // Start the local server first + const serverStarted = await startServer(); + if (!serverStarted) return; + + const win = new BrowserWindow({ + width: 1920, + height: 1080, + webPreferences: { + nodeIntegration: false, + webSecurity: true + } + }); + + // Load from local HTTPS server instead of HTTP + console.log(`Loading UI from: https://localhost:${HTTPS_PORTS[currentPortIndex]}/index.html`); + win.loadURL(`https://localhost:${HTTPS_PORTS[currentPortIndex]}/index.html`); + + // For debugging + // win.webContents.openDevTools(); +} + +// Create application menu with update check option +function createMenu() { + const template = [ + { + label: 'Options', + submenu: [ + { + label: 'Check for Updates', + click: () => { + autoUpdater.checkForUpdatesAndNotify(); + } + }, + { + label: 'About', + click: () => { + dialog.showMessageBox({ + type: 'info', + title: 'About Steam Server UI', + message: `SSUI Desktop ${app.getVersion()}\nCopyright © 2025 JacksonTheMaster`, + buttons: ['OK'] + }); + } + }, + { + label: 'Backends', + submenu: [ + { + label: 'Reset', + click: async () => { + try { + // Get the main window + const mainWindow = BrowserWindow.getFocusedWindow() || BrowserWindow.getAllWindows()[0]; + + if (mainWindow) { + // Clear all cookies + await mainWindow.webContents.session.clearStorageData({ + storages: ['cookies', 'localstorage', 'sessionstorage'] + }); + + mainWindow.reload(); + + dialog.showMessageBox(mainWindow, { + type: 'info', + title: 'Reset Complete', + message: 'All cookies and local storage have been cleared. The application has been reloaded.', + buttons: ['OK'] + }); + } + } catch (error) { + console.error('Error resetting backend data:', error); + dialog.showErrorBox('Reset Failed', 'Failed to reset backend data. Please try again. Alternatively, you can manually clear your cookies and local storage from the Developer Console at ctrl+shift+i.'); + } + } + } + ] + }, + { + label: 'Edit', + submenu: [ + { role: 'cut' }, + { role: 'copy' }, + { role: 'paste' } + ] + }, + { + label: 'View', + submenu: [ + { role: 'reload' }, + { role: 'forcereload' }, + { role: 'toggledevtools' }, + { type: 'separator' }, + { role: 'resetzoom' }, + { role: 'zoomin' }, + { role: 'zoomout' }, + { type: 'separator' }, + { role: 'togglefullscreen' } + ] + }, + { + label: 'Open Github Page', + click: () => { + require('electron').shell.openExternal('https://github.com/SteamServerUI/SteamServerUI'); + } + + }, + { + label: 'Join Discord Server', + click: () => { + require('electron').shell.openExternal('https://discord.com/invite/8n3vN92MyJ'); + } + }, + { + label: 'Report Issue', + click: () => { + require('electron').shell.openExternal('https://github.com/SteamServerUI/SteamServerUI/issues'); + } + } + ] + } + ]; + + const menu = Menu.buildFromTemplate(template); + Menu.setApplicationMenu(menu); +} + +app.commandLine.appendSwitch('ignore-certificate-errors'); +app.commandLine.appendSwitch('ignore-certificate-errors-spki-list'); +app.commandLine.appendSwitch('ignore-ssl-errors'); + +app.whenReady().then(() => { + createWindow(); + createMenu(); + + // Check for updates after app is ready (but not in development) + if (!process.env.NODE_ENV || process.env.NODE_ENV === 'production') { + // Check for updates immediately + autoUpdater.checkForUpdatesAndNotify(); + + // Check for updates every 30 minutes + setInterval(() => { + autoUpdater.checkForUpdatesAndNotify(); + }, 30 * 60 * 1000); + } +}); + +app.on('window-all-closed', () => { + app.quit(); +}); + +app.on('activate', () => { + if (BrowserWindow.getAllWindows().length === 0) { + createWindow(); + } +}); + +app.on('quit', () => { + if (server) { + server.closeAllConnections(); + server.close(() => { + console.log('Server closed'); + }); + // Force quit after 5 seconds if server doesn't close + setTimeout(() => { + console.log('Forcing app exit after timeout'); + app.exit(0); + }, 5000); + } +}); + +// Minimal error handling +process.on('uncaughtException', (err) => { + console.error('Uncaught Exception:', err); + dialog.showErrorBox('Unexpected Error', 'An unexpected error occurred: ' + err.message); + app.exit(1); +}); + +process.on('unhandledRejection', (err) => { + console.error('Unhandled Rejection:', err); + dialog.showErrorBox('Unexpected Error', 'An unexpected error occurred: ' + (err.message || err)); + app.exit(1); +}); \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 00000000..ce2936d9 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,5277 @@ +{ + "name": "steamserverui", + "version": "v5.5.8", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "steamserverui", + "version": "v5.5.8", + "license": "proprietary", + "dependencies": { + "electron-updater": "^6.6.2", + "express": "^5.1.0", + "https": "^1.0.0", + "node-forge": "^1.3.1" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.1.1", + "concurrently": "^9.1.2", + "electron": "^36.1.0", + "electron-builder": "^26.0.12", + "svelte": "^5.23.1", + "vite": "^6.3.5", + "wait-on": "^8.0.3" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@develar/schema-utils": { + "version": "2.6.5", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@electron/asar": { + "version": "3.2.18", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/asar/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@electron/fuses": { + "version": "1.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.1", + "fs-extra": "^9.0.1", + "minimist": "^1.2.5" + }, + "bin": { + "electron-fuses": "dist/bin.js" + } + }, + "node_modules/@electron/fuses/node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/fuses/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/fuses/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/get": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron/node-gyp": { + "version": "10.2.0-electron.1", + "resolved": "git+ssh://git@github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2", + "integrity": "sha512-CrYo6TntjpoMO1SHjl5Pa/JoUsECNqNdB7Kx49WLQpWzPw53eEITJ2Hs9fh/ryUYDn4pxZz11StaBYBrLFJdqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^8.1.0", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.2.1", + "nopt": "^6.0.0", + "proc-log": "^2.0.1", + "semver": "^7.3.5", + "tar": "^6.2.1", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@electron/node-gyp/node_modules/glob": { + "version": "8.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/node-gyp/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/node-gyp/node_modules/semver": { + "version": "7.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/notarize": { + "version": "2.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/notarize/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/notarize/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.3.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/osx-sign/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/osx-sign/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/rebuild": { + "version": "3.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/node-gyp": "https://github.com/electron/node-gyp#06b29aafb7708acef8b3669835c8a7857ebc92d2", + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.1.1", + "detect-libc": "^2.0.1", + "fs-extra": "^10.0.0", + "got": "^11.7.0", + "node-abi": "^3.45.0", + "node-api-version": "^0.2.0", + "ora": "^5.1.0", + "read-binary-file-arch": "^1.0.6", + "semver": "^7.3.5", + "tar": "^6.0.5", + "yargs": "^17.0.1" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@electron/rebuild/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/rebuild/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/rebuild/node_modules/semver": { + "version": "7.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/rebuild/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/universal": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.2.7", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" + }, + "engines": { + "node": ">=16.4" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "11.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/universal/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/universal/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.4", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "2.0.0", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@npmcli/fs": { + "version": "2.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.41.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.41.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.1.1.tgz", + "integrity": "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", + "debug": "^4.4.1", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.17", + "vitefu": "^1.0.6" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.7" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "svelte": "^5.0.0", + "vite": "^6.0.0" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.15.20", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/7zip-bin": { + "version": "5.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/accepts": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.54.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/app-builder-bin": { + "version": "5.0.0-alpha.12", + "dev": true, + "license": "MIT" + }, + "node_modules/app-builder-lib": { + "version": "26.0.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@develar/schema-utils": "~2.6.5", + "@electron/asar": "3.2.18", + "@electron/fuses": "^1.8.0", + "@electron/notarize": "2.5.0", + "@electron/osx-sign": "1.3.1", + "@electron/rebuild": "3.7.0", + "@electron/universal": "2.0.1", + "@malept/flatpak-bundler": "^0.4.0", + "@types/fs-extra": "9.0.13", + "async-exit-hook": "^2.0.1", + "builder-util": "26.0.11", + "builder-util-runtime": "9.3.1", + "chromium-pickle-js": "^0.2.0", + "config-file-ts": "0.2.8-rc1", + "debug": "^4.3.4", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", + "ejs": "^3.1.8", + "electron-publish": "26.0.11", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "is-ci": "^3.0.0", + "isbinaryfile": "^5.0.0", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "lazy-val": "^1.0.5", + "minimatch": "^10.0.0", + "plist": "3.1.0", + "resedit": "^1.7.0", + "semver": "^7.3.8", + "tar": "^6.1.12", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "26.0.12", + "electron-builder-squirrel-windows": "26.0.12" + } + }, + "node_modules/app-builder-lib/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/app-builder-lib/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/app-builder-lib/node_modules/semver": { + "version": "7.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/app-builder-lib/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/async": { + "version": "3.2.6", + "dev": true, + "license": "MIT" + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/axios": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bl": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/boolean": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/builder-util": { + "version": "26.0.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.6", + "7zip-bin": "~5.2.0", + "app-builder-bin": "5.0.0-alpha.12", + "builder-util-runtime": "9.3.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "is-ci": "^3.0.0", + "js-yaml": "^4.1.0", + "sanitize-filename": "^1.6.3", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.3.1", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/builder-util/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/builder-util/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/builder-util/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "16.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ci-info": { + "version": "3.9.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/compare-version": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/concurrently": { + "version": "9.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/config-file-ts": { + "version": "0.2.8-rc1", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^10.3.12", + "typescript": "^5.4.3" + } + }, + "node_modules/config-file-ts/node_modules/glob": { + "version": "10.4.5", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/config-file-ts/node_modules/minipass": { + "version": "7.1.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/content-disposition": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/dir-compare": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " + } + }, + "node_modules/dir-compare/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/dir-compare/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dmg-builder": { + "version": "26.0.12", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.0.12", + "builder-util": "26.0.11", + "builder-util-runtime": "9.3.1", + "fs-extra": "^10.1.0", + "iconv-lite": "^0.6.2", + "js-yaml": "^4.1.0" + }, + "optionalDependencies": { + "dmg-license": "^1.0.11" + } + }, + "node_modules/dmg-builder/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dmg-builder/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/dmg-builder/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.5.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "36.2.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^22.7.7", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, + "node_modules/electron-builder": { + "version": "26.0.12", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.0.12", + "builder-util": "26.0.11", + "builder-util-runtime": "9.3.1", + "chalk": "^4.1.2", + "dmg-builder": "26.0.12", + "fs-extra": "^10.1.0", + "is-ci": "^3.0.0", + "lazy-val": "^1.0.5", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-builder-squirrel-windows": { + "version": "26.0.12", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "app-builder-lib": "26.0.12", + "builder-util": "26.0.11", + "electron-winstaller": "5.4.0" + } + }, + "node_modules/electron-builder/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-builder/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-publish": { + "version": "26.0.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^9.0.11", + "builder-util": "26.0.11", + "builder-util-runtime": "9.3.1", + "chalk": "^4.1.2", + "form-data": "^4.0.0", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, + "node_modules/electron-publish/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-publish/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-publish/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-updater": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.6.2.tgz", + "integrity": "sha512-Cr4GDOkbAUqRHP5/oeOmH/L2Bn6+FQPxVLZtPbcmKZC63a1F3uu5EefYOssgZXG3u/zBlubbJ5PJdITdMVggbw==", + "license": "MIT", + "dependencies": { + "builder-util-runtime": "9.3.1", + "fs-extra": "^10.1.0", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "lodash.escaperegexp": "^4.1.2", + "lodash.isequal": "^4.5.0", + "semver": "^7.6.3", + "tiny-typed-emitter": "^2.1.0" + } + }, + "node_modules/electron-updater/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-updater/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-updater/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-updater/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-winstaller": { + "version": "5.4.0", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "temp": "^0.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "@electron/windows-sign": "^1.1.2" + } + }, + "node_modules/electron-winstaller/node_modules/fs-extra": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/esbuild": { + "version": "0.25.4", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.4", + "@esbuild/android-arm": "0.25.4", + "@esbuild/android-arm64": "0.25.4", + "@esbuild/android-x64": "0.25.4", + "@esbuild/darwin-arm64": "0.25.4", + "@esbuild/darwin-x64": "0.25.4", + "@esbuild/freebsd-arm64": "0.25.4", + "@esbuild/freebsd-x64": "0.25.4", + "@esbuild/linux-arm": "0.25.4", + "@esbuild/linux-arm64": "0.25.4", + "@esbuild/linux-ia32": "0.25.4", + "@esbuild/linux-loong64": "0.25.4", + "@esbuild/linux-mips64el": "0.25.4", + "@esbuild/linux-ppc64": "0.25.4", + "@esbuild/linux-riscv64": "0.25.4", + "@esbuild/linux-s390x": "0.25.4", + "@esbuild/linux-x64": "0.25.4", + "@esbuild/netbsd-arm64": "0.25.4", + "@esbuild/netbsd-x64": "0.25.4", + "@esbuild/openbsd-arm64": "0.25.4", + "@esbuild/openbsd-x64": "0.25.4", + "@esbuild/sunos-x64": "0.25.4", + "@esbuild/win32-arm64": "0.25.4", + "@esbuild/win32-ia32": "0.25.4", + "@esbuild/win32-x64": "0.25.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/esrap": { + "version": "1.4.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.2", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/express": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/mime-db": { + "version": "1.54.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/mime-types": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fdir": { + "version": "6.4.4", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/finalhandler": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-agent/node_modules/semver": { + "version": "7.7.2", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", + "integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==", + "license": "ISC" + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "9.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-promise": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/is-reference": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isbinaryfile": { + "version": "5.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lazy-val": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/locate-character": { + "version": "3.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.17.21", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "dev": true, + "license": "ISC", + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "10.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-abi": { + "version": "3.75.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-api-version": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-api-version/node_modules/semver": { + "version": "7.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/nopt": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "7.1.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/pe-library": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proc-log": { + "version": "2.0.1", + "dev": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resedit": { + "version": "1.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "pe-library": "^0.4.1" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/responselike": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/rollup": { + "version": "4.41.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.41.0", + "@rollup/rollup-android-arm64": "4.41.0", + "@rollup/rollup-darwin-arm64": "4.41.0", + "@rollup/rollup-darwin-x64": "4.41.0", + "@rollup/rollup-freebsd-arm64": "4.41.0", + "@rollup/rollup-freebsd-x64": "4.41.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.41.0", + "@rollup/rollup-linux-arm-musleabihf": "4.41.0", + "@rollup/rollup-linux-arm64-gnu": "4.41.0", + "@rollup/rollup-linux-arm64-musl": "4.41.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.41.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.41.0", + "@rollup/rollup-linux-riscv64-gnu": "4.41.0", + "@rollup/rollup-linux-riscv64-musl": "4.41.0", + "@rollup/rollup-linux-s390x-gnu": "4.41.0", + "@rollup/rollup-linux-x64-gnu": "4.41.0", + "@rollup/rollup-linux-x64-musl": "4.41.0", + "@rollup/rollup-win32-arm64-msvc": "4.41.0", + "@rollup/rollup-win32-ia32-msvc": "4.41.0", + "@rollup/rollup-win32-x64-msvc": "4.41.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/router": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "dev": true, + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.4.1", + "license": "ISC" + }, + "node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/send": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/send/node_modules/mime-db": { + "version": "1.54.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/mime-types": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/ssri": { + "version": "9.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/svelte": { + "version": "5.32.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/estree": "^1.0.5", + "acorn": "^8.12.1", + "aria-query": "^5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "esm-env": "^1.2.1", + "esrap": "^1.4.6", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/temp": { + "version": "0.9.4", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp-file": { + "version": "3.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/temp-file/node_modules/fs-extra": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/temp-file/node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/temp-file/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/temp/node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/tiny-async-pool": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^5.5.0" + } + }, + "node_modules/tiny-async-pool/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tiny-typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", + "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.13", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tmp": { + "version": "0.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "dev": true, + "license": "WTFPL", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "0.13.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.54.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "dev": true, + "license": "MIT" + }, + "node_modules/unique-filename": { + "version": "2.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/unique-slug": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "6.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/wait-on": { + "version": "8.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "axios": "^1.8.2", + "joi": "^17.13.3", + "lodash": "^4.17.21", + "minimist": "^1.2.8", + "rxjs": "^7.8.2" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zimmerframe": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 00000000..c181676d --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,42 @@ +{ + "name": "steamserverui", + "main": "main.cjs", + "private": true, + "version": "v5.5.8", + "description": "Svelte UI Interface for Steam Server UI (SSUI) Backend", + "author": { + "name": "JacksonTheMaster", + "email": "ssui@jmg-it.de" + }, + "license": "proprietary", + "repository": { + "type": "git", + "url": "git+https://github.com/SteamServerUI/SteamServerUI.git" + }, + "type": "module", + "scripts": { + "dev": "vite", + "vite": "vite", + "electron": "vite build && electron-builder --linux --win", + "build": "vite build", + "build:electron:dir": "vite build && electron-builder --linux --win --dir", + "build:electron": "vite build && electron-builder --linux --win", + "build:electron:win": "vite build && electron-builder --win", + "preview": "vite preview" + }, + "dependencies": { + "electron-updater": "^6.6.2", + "express": "^5.1.0", + "https": "^1.0.0", + "node-forge": "^1.3.1" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.1.1", + "concurrently": "^9.1.2", + "electron": "^36.1.0", + "electron-builder": "^26.0.12", + "svelte": "^5.23.1", + "vite": "^6.3.5", + "wait-on": "^8.0.3" + } +} diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte new file mode 100644 index 00000000..82580a9c --- /dev/null +++ b/frontend/src/App.svelte @@ -0,0 +1,86 @@ + + +{#if isScreenSupported || forceShowApp} + + +
+ + +
+ + +
+
+
+
+{:else} + +{/if} + + \ No newline at end of file diff --git a/frontend/src/AuthGuard.svelte b/frontend/src/AuthGuard.svelte new file mode 100644 index 00000000..9549bf41 --- /dev/null +++ b/frontend/src/AuthGuard.svelte @@ -0,0 +1,63 @@ + + +{#if isChecking} + +{:else if serverStatus === 'error'} + +{:else if !$authState.isAuthenticated && checkAuth} + +{:else} + {@render children?.()} +{/if} \ No newline at end of file diff --git a/frontend/src/BackendInitializer.svelte b/frontend/src/BackendInitializer.svelte new file mode 100644 index 00000000..1ffa20a3 --- /dev/null +++ b/frontend/src/BackendInitializer.svelte @@ -0,0 +1,116 @@ + + +{#if isInitialized} + {@render children?.()} +{:else} + +{/if} \ No newline at end of file diff --git a/frontend/src/Login.svelte b/frontend/src/Login.svelte new file mode 100644 index 00000000..d0c3afb3 --- /dev/null +++ b/frontend/src/Login.svelte @@ -0,0 +1,928 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/app.css b/frontend/src/app.css new file mode 100644 index 00000000..6d8e8fc9 --- /dev/null +++ b/frontend/src/app.css @@ -0,0 +1,29 @@ +:root { + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + line-height: 1.5; + font-weight: 400; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html, body { + height: 100%; + width: 100%; + margin: 0; + padding: 0; + overflow: hidden; +} + +input, button, select, textarea { + font-family: inherit; + font-size: inherit; +} \ No newline at end of file diff --git a/frontend/src/components/Dashboard/DashboardView.svelte b/frontend/src/components/Dashboard/DashboardView.svelte new file mode 100644 index 00000000..6c23e838 --- /dev/null +++ b/frontend/src/components/Dashboard/DashboardView.svelte @@ -0,0 +1,35 @@ + + +
+ + + + + +
+ + \ No newline at end of file diff --git a/frontend/src/components/Dashboard/cards/ActivityCard.svelte b/frontend/src/components/Dashboard/cards/ActivityCard.svelte new file mode 100644 index 00000000..4cc55927 --- /dev/null +++ b/frontend/src/components/Dashboard/cards/ActivityCard.svelte @@ -0,0 +1,113 @@ + + +
+
+

Recent Activity

+
🔄
+
+
+
+
2.0000003 min ago (±0.0001s sync drift)
+
+ Task failed successfully +
+
+
+
15 min ago (server tick #123456789)
+
+ User "admin" logged in from planet Venus (wtf?) +
+
+
+
3 decades ago (CPU cycles: 3.2e12)
+
+ If not clear already, this is a mockup! +
+
+
+ +
+ + \ No newline at end of file diff --git a/frontend/src/components/Dashboard/cards/ConsoleCard.svelte b/frontend/src/components/Dashboard/cards/ConsoleCard.svelte new file mode 100644 index 00000000..8d5e3bbb --- /dev/null +++ b/frontend/src/components/Dashboard/cards/ConsoleCard.svelte @@ -0,0 +1,39 @@ + + +
+ +
+ + \ No newline at end of file diff --git a/frontend/src/components/Dashboard/cards/LogsCard.svelte b/frontend/src/components/Dashboard/cards/LogsCard.svelte new file mode 100644 index 00000000..c3618284 --- /dev/null +++ b/frontend/src/components/Dashboard/cards/LogsCard.svelte @@ -0,0 +1,39 @@ + + +
+ +
+ + \ No newline at end of file diff --git a/frontend/src/components/Dashboard/cards/QuickActionsCard.svelte b/frontend/src/components/Dashboard/cards/QuickActionsCard.svelte new file mode 100644 index 00000000..73800767 --- /dev/null +++ b/frontend/src/components/Dashboard/cards/QuickActionsCard.svelte @@ -0,0 +1,61 @@ + + +
+
+

Quick Actions

+
+
+ +
+ +
+
+ + \ No newline at end of file diff --git a/frontend/src/components/Dashboard/cards/SystemInfoCard.svelte b/frontend/src/components/Dashboard/cards/SystemInfoCard.svelte new file mode 100644 index 00000000..e5e8cd02 --- /dev/null +++ b/frontend/src/components/Dashboard/cards/SystemInfoCard.svelte @@ -0,0 +1,220 @@ + + +
+
+

System Information

+
ℹ️
+
+ {#if error} +
{error}
+ + {:else if systemInfo} +
+
+
{typeof systemInfo.cpuUsage === 'number' ? systemInfo.cpuUsage.toFixed(2) : 'N/A'}%
+
System CPU Usage
+
+
+
+
{typeof systemInfo.memoryUsage === 'number' ? (systemInfo.memoryUsage/1024).toFixed(2) : 'N/A'} GB
+
Memory Consumption
+
+
+
+
{typeof systemInfo.diskUsage === 'number' ? (100-systemInfo.diskUsage).toFixed(2) : 'N/A'}%
+
Disk Space Unused
+
+
+
+
+
+
OS Version
+
{systemInfo.osName || 'Temple OS v3.14.15'} {systemInfo.osVersion || ''}
+
+
+
Kernel
+
{systemInfo.kernel || 'Cannot detect'}
+
+
+
Uptime
+
{systemInfo.uptime || 'Cannot detect'}
+
+
+
Backend IP Address
+
{systemInfo.backendIpAddress || 'Cannot detect'}
+
+
+
+
+
Last Refresh
+
{systemInfo.lastRefreshTime ? new Date(systemInfo.lastRefreshTime).toLocaleString() : 'Cannot detect'}
+
+
+ {:else} +
Loading system information...
+ {/if} +
+ + \ No newline at end of file diff --git a/frontend/src/components/MainContent.svelte b/frontend/src/components/MainContent.svelte new file mode 100644 index 00000000..5cad6e3e --- /dev/null +++ b/frontend/src/components/MainContent.svelte @@ -0,0 +1,114 @@ + + +
+
+

{viewContent[activeView].title}

+

{viewContent[activeView].description}

+
+ +
+ {#if activeView === 'dashboard'} +
+ +
+ {:else if activeView === 'settings'} +
+ +
+ {:else if activeView === 'console'} +
+ +
+ {/if} +
+
+ + \ No newline at end of file diff --git a/frontend/src/components/nav/Sidebar.svelte b/frontend/src/components/nav/Sidebar.svelte new file mode 100644 index 00000000..566fe372 --- /dev/null +++ b/frontend/src/components/nav/Sidebar.svelte @@ -0,0 +1,164 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/nav/TopNav.svelte b/frontend/src/components/nav/TopNav.svelte new file mode 100644 index 00000000..ff2cbf25 --- /dev/null +++ b/frontend/src/components/nav/TopNav.svelte @@ -0,0 +1,744 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/resuables/InitializingView.svelte b/frontend/src/components/resuables/InitializingView.svelte new file mode 100644 index 00000000..6d7fe5d7 --- /dev/null +++ b/frontend/src/components/resuables/InitializingView.svelte @@ -0,0 +1,215 @@ + + +
+
+
+
+
+
+
+ +
+

+ {#if serverStatus === 'checking'} + Connecting to Backend + {:else if serverStatus === 'online'} + Initializing Backend + {:else if serverStatus === 'offline'} + {statusDescOffline} + {:else if serverStatus === 'error'} + Backend error + {:else if serverStatus === 'cert-error'} + Backend Certificate or https error + {:else if serverStatus === 'unreachable'} + Server not found + {/if} +

+ +
+ + + +
+
+ + {#if errorMessage} +
+ + + + + +

{errorMessage}

+
+ {/if} +
+
+ + \ No newline at end of file diff --git a/frontend/src/components/resuables/ReloadAll.svelte b/frontend/src/components/resuables/ReloadAll.svelte new file mode 100644 index 00000000..5a61fb83 --- /dev/null +++ b/frontend/src/components/resuables/ReloadAll.svelte @@ -0,0 +1,130 @@ + + +
+ + + {#if responseMessage} +
+
+ {#if isError} + + + + {:else} + + + + {/if} +
+
{responseMessage}
+
+ {/if} +
+ + \ No newline at end of file diff --git a/frontend/src/components/resuables/ScreenNotSupported.svelte b/frontend/src/components/resuables/ScreenNotSupported.svelte new file mode 100644 index 00000000..aa279379 --- /dev/null +++ b/frontend/src/components/resuables/ScreenNotSupported.svelte @@ -0,0 +1,193 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/resuables/ToggleServer.svelte b/frontend/src/components/resuables/ToggleServer.svelte new file mode 100644 index 00000000..7ab8ab37 --- /dev/null +++ b/frontend/src/components/resuables/ToggleServer.svelte @@ -0,0 +1,164 @@ + + +
+
+ + + +
+ + {#if responseMessage} +
+
+ {#if isError} + + + + {:else} + + + + {/if} +
+
{responseMessage}
+
+ {/if} +
+ + \ No newline at end of file diff --git a/frontend/src/components/settings/ConfigManager.svelte b/frontend/src/components/settings/ConfigManager.svelte new file mode 100644 index 00000000..699defb5 --- /dev/null +++ b/frontend/src/components/settings/ConfigManager.svelte @@ -0,0 +1,76 @@ + + + +
+ +
+ +{#if loading} +
+

Loading Config Manager...

+
+{/if} + + \ No newline at end of file diff --git a/frontend/src/components/settings/DetectionManager.svelte b/frontend/src/components/settings/DetectionManager.svelte new file mode 100644 index 00000000..ef0d43bc --- /dev/null +++ b/frontend/src/components/settings/DetectionManager.svelte @@ -0,0 +1,76 @@ + + + +
+ +
+ +{#if loading} +
+

Loading Detection Manager...

+
+{/if} + + \ No newline at end of file diff --git a/frontend/src/components/settings/SettingsView.svelte b/frontend/src/components/settings/SettingsView.svelte new file mode 100644 index 00000000..50eb4215 --- /dev/null +++ b/frontend/src/components/settings/SettingsView.svelte @@ -0,0 +1,86 @@ + + +
+
+ + +
+ +
+ {#if activeSidebarTab === 'Detection Manager'} + + {:else if activeSidebarTab === 'Config Manager'} + + {/if} +
+
+ + \ No newline at end of file diff --git a/frontend/src/components/settings/UserSettings.svelte b/frontend/src/components/settings/UserSettings.svelte new file mode 100644 index 00000000..abdabcb5 --- /dev/null +++ b/frontend/src/components/settings/UserSettings.svelte @@ -0,0 +1,374 @@ + + + +
+

Admin: User Settings

+ +

+ DO NOT USE THIS; REPLACES CURRENT USER IN STATIONEERSERVERUI! +

+ +
+

Add or Change User

+
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+ + +
+
+
+ + {#if statusMessage} +
+ {isError ? '⚠️' : '✓'} + {statusMessage} + +
+ {/if} +
+ + \ No newline at end of file diff --git a/frontend/src/components/views/BackupsView.svelte b/frontend/src/components/views/BackupsView.svelte new file mode 100644 index 00000000..d03673dd --- /dev/null +++ b/frontend/src/components/views/BackupsView.svelte @@ -0,0 +1,864 @@ + + +
+
+
+

Backup Manager

+
+ + + {backupStatus.isRunning ? 'Backup or compression in progress...' : 'Ready'} + +
+
+ +
+ +
+
+ + + {#if error} +
+ {error} + +
+ {/if} + + {#if success} +
+ {success} + +
+ {/if} + + +
+

Create New Backup

+
+
+ + +
+ + +
+
+ + +
+

Available Backups ({backups.length})

+ + {#if isLoading && !hasInitialLoad} +
Loading backups...
+ {:else if error && backups.length === 0} +
+ ⚠️ +

Unable to load backups

+

Please check your connection and Backup path Settings

+ +
+ {:else if backups.length === 0} +
+ 📦 +

No backups found

+

Create your first backup to get started

+
+ {:else} +
+ {#each backups as backup} +
+
+
{backup.displayName}
+
+ {backup.name} + {backup.size} +
+
+ +
+ +
+
+ {/each} +
+ {/if} +
+
+ + +{#if showRestoreModal} + +{/if} + + \ No newline at end of file diff --git a/frontend/src/components/views/ConsoleView.svelte b/frontend/src/components/views/ConsoleView.svelte new file mode 100644 index 00000000..9541cd46 --- /dev/null +++ b/frontend/src/components/views/ConsoleView.svelte @@ -0,0 +1,464 @@ + + +
+
+
+ + +
+ +
+ +
+ {#if activeTab === 'console-tab'} +
+
+ {#each consoleMessages as message} +
+ {message.text} +
+ {/each} +
+
+ {:else} +
+
+ {#each detectionEvents as event} +
+ {event.timestamp}: + {event.message} +
+ {/each} +
+
+ {/if} +
+
+ + \ No newline at end of file diff --git a/frontend/src/components/views/LogsView.svelte b/frontend/src/components/views/LogsView.svelte new file mode 100644 index 00000000..124d5bd6 --- /dev/null +++ b/frontend/src/components/views/LogsView.svelte @@ -0,0 +1,472 @@ + + +
+
+
+ +
+ + + + + + +
+
+ +
+ + +
+ +
+ + +
+
+ +
+ {#if filteredLogs.length === 0} +
No logs to display. Select a log level or change the Time Range to view logs...
+ {:else} + {#each filteredLogs as log} +
+ {log.timestamp} + {log.level} + {log.message} +
+ {/each} + {/if} +
+
+ + \ No newline at end of file diff --git a/frontend/src/main.js b/frontend/src/main.js new file mode 100644 index 00000000..c8c70ee8 --- /dev/null +++ b/frontend/src/main.js @@ -0,0 +1,7 @@ +import './app.css'; +import App from './App.svelte'; +import { mount } from 'svelte'; + +mount(App, { + target: document.getElementById('app'), +}); \ No newline at end of file diff --git a/frontend/src/services/api.js b/frontend/src/services/api.js new file mode 100644 index 00000000..4a1cd98d --- /dev/null +++ b/frontend/src/services/api.js @@ -0,0 +1,579 @@ +// api.js + +import { writable, get } from 'svelte/store'; + +// Store for backend configuration +export const backendConfig = writable({ + active: 'default', // Currently active backend + backends: { + default: { + url: '/', // Default backend URL is the current host + token: null // Authentication token (JWT) + } + } +}); + +// Store for authentication state +export const authState = writable({ + isAuthenticated: false, + isAuthenticating: false, + authError: null +}); + +// Track initialization state +let isInitialized = false; + +// Helper to get the current backend configuration +export function getCurrentBackend() { + const config = get(backendConfig); + return config.backends[config.active] || config.backends.default; +} + +// Helper to get the current backend URL +export function getCurrentBackendUrl() { + const backend = getCurrentBackend(); + return backend.url === '/' ? '' : backend.url; +} + +// Helper to get the current authentication token +export function getCurrentAuthToken() { + return getCurrentBackend().token; +} + +// Add or update a backend +export function setBackend(id, url) { + backendConfig.update(config => { + // If the backend already exists, preserve its token + const existingToken = config.backends[id]?.token || null; + config.backends[id] = { url, token: existingToken }; + return config; + }); +} + +// Set the active backend and verify authentication +export async function setActiveBackend(id) { + let success = false; + let prevBackendId = get(backendConfig).active; + + // Only update if different to prevent unnecessary reloads + if (prevBackendId !== id) { + backendConfig.update(config => { + if (config.backends[id]) { + config.active = id; + } + return config; + }); + + // After changing backend, check authentication status + try { + await syncAuthState(); + success = true; + } catch (error) { + console.error('Error syncing auth state after backend change:', error); + } + } else { + // If selecting the same backend, consider it successful + success = true; + } + + return success; +} + +// Update the token for a backend and persist it +export function updateAuthToken(id, token) { + backendConfig.update(config => { + if (config.backends[id]) { + config.backends[id].token = token; + } + return config; + }); + + // Update the auth state + if (id === get(backendConfig).active) { + authState.update(state => ({ + ...state, + isAuthenticated: !!token, + authError: null + })); + } +} + +// Clear authentication for the current backend +export function clearAuthentication() { + const currentBackendId = get(backendConfig).active; + updateAuthToken(currentBackendId, null); + + // Also clear the auth cookie by making a logout request + apiFetch('/auth/logout', { method: 'POST' }) + .catch(err => console.error('Error during logout:', err)); +} + +/** + * Fetch wrapper that automatically adds the backend URL and handles authentication + * @param {string} endpoint - The API endpoint (e.g., "/api/v2/whatever") + * @param {Object} options - Fetch options + * @returns {Promise} - The fetch promise + */ +export async function apiFetch(endpoint, options = {}) { + // Get the current backend configuration + const backendUrl = getCurrentBackendUrl(); + const token = getCurrentAuthToken(); + + // Ensure endpoint starts with "/" if it's not an empty string + const normalizedEndpoint = endpoint.startsWith('/') || endpoint === '' ? endpoint : `/${endpoint}`; + + // Construct the full URL + const url = `${backendUrl}${normalizedEndpoint}`; + + // Set up headers if not provided + options.headers = options.headers || {}; + + // Always include credentials for CORS requests + options.credentials = 'include'; + + // For non-login endpoints, manually set the AuthToken cookie as well + // This serves as a fallback in case the HttpOnly cookie isn't being sent + if (token && !endpoint.includes('/auth/login')) { + const cookieHeader = document.cookie; + if (!cookieHeader.includes('AuthToken=')) { + // Only set cookie header if it's not already set by the browser + options.headers['Cookie'] = `AuthToken=${token}`; + } + + // Also send the token in the Authorization header as a backup method + options.headers['Authorization'] = `Bearer ${token}`; + } + + // Perform the fetch + return await fetch(url, options); +} + +/** + * Fetch wrapper with timeout that automatically adds the backend URL and handles authentication + * @param {string} endpoint - The API endpoint (e.g., "/api/v2/whatever") + * @param {Object} options - Fetch options + * @param {number} timeoutMs - Timeout in milliseconds + * @returns {Promise} - The fetch promise + */ +export async function apiFetchTimeout(endpoint, options = {}, timeoutMs) { + // Create a new options object to avoid modifying the original + const timeoutOptions = { ...options }; + + // Set up AbortController for timeout + const controller = new AbortController(); + timeoutOptions.signal = controller.signal; + + // Set timeout + const timeoutId = setTimeout(() => controller.abort(), timeoutMs); + + try { + // Use apiFetch for the actual request + const response = await apiFetch(endpoint, timeoutOptions); + return response; + } finally { + clearTimeout(timeoutId); + } +} + +/** + * Helper for JSON API calls + * @param {string} endpoint - The API endpoint + * @param {Object} options - Fetch options + * @returns {Promise} - Parsed JSON response + */ +export async function apiJson(endpoint, options = {}) { + // Default to JSON content type if not specified + options.headers = options.headers || {}; + if (!options.headers['Content-Type'] && options.method && options.method !== 'GET') { + options.headers['Content-Type'] = 'application/json'; + } + + const response = await apiFetch(endpoint, options); + + // Check for auth errors + if (response.status === 401) { + // Update auth state + authState.update(state => ({ + ...state, + isAuthenticated: false, + authError: 'Unauthorized' + })); + throw new Error('Authentication required'); + } + + if (!response.ok) { + throw new Error(`API error: ${response.status} ${response.statusText}`); + } + + return response.json(); +} + +/** + * Helper for text API calls + * @param {string} endpoint - The API endpoint + * @param {Object} options - Fetch options + * @returns {Promise} - Text response + */ +export async function apiText(endpoint, options = {}) { + const response = await apiFetch(endpoint, options); + + // Check for auth errors + if (response.status === 401) { + // Update auth state + authState.update(state => ({ + ...state, + isAuthenticated: false, + authError: 'Unauthorized' + })); + throw new Error('Authentication required'); + } + + if (!response.ok) { + throw new Error(`API error: ${response.status} ${response.statusText}`); + } + + return response.text(); +} + +/** + * Helper for Server-Sent Events (SSE) + * @param {string} endpoint - The SSE endpoint + * @param {function} onMessage - Callback for each message + * @param {function} onError - Error callback + * @returns {Object} - Control object with a close() method + */ +export function apiSSE(endpoint, onMessage, onError = console.error) { + // Get the current backend URL + const backendUrl = getCurrentBackendUrl(); + const token = getCurrentAuthToken(); + + // Ensure endpoint starts with "/" if it's not an empty string + const normalizedEndpoint = endpoint.startsWith('/') || endpoint === '' ? endpoint : `/${endpoint}`; + + // Construct the full URL + const baseUrl = backendUrl || window.location.origin; + const url = new URL(`${baseUrl}${normalizedEndpoint}`); + + // Add token as query param as a fallback for EventSource which can't set headers + if (token) { + url.searchParams.set('token', token); + } + + let eventSource = null; + let isActive = true; + let currentBackendId = get(backendConfig).active; + + try { + // Create EventSource for SSE with withCredentials to send cookies + const eventSourceOptions = { withCredentials: true }; + eventSource = new EventSource(url.toString(), eventSourceOptions); + + // Set up event handlers + eventSource.onmessage = event => { + try { + // Try to parse as JSON first + const data = JSON.parse(event.data); + onMessage(data); + } catch (e) { + // If not JSON, pass the raw string + onMessage(event.data); + } + }; + + eventSource.onerror = error => { + // Check if the error might be an authentication issue + if (eventSource.readyState === EventSource.CLOSED) { + // Update auth state if we suspect auth issues + syncAuthState().catch(console.error); + } + onError(error); + + // Auto-reconnect after a delay if still active + if (isActive && !eventSource) { + setTimeout(() => { + if (isActive && document.visibilityState !== 'hidden') { + // Try to reconnect with a fresh EventSource + try { + eventSource = new EventSource(url.toString(), eventSourceOptions); + } catch (reconnectError) { + onError(reconnectError); + } + } + }, 2000); + } + }; + + // Subscribe to backend config changes to handle backend changes without page reload + const unsubscribe = backendConfig.subscribe(config => { + if (isActive && config.active !== currentBackendId) { + console.log('The Backend changed, I am reconnecting a SSE connection'); + currentBackendId = config.active; + + // Close existing connection + if (eventSource) { + eventSource.close(); + eventSource = null; + } + + // Create a new connection with updated backend info + setTimeout(() => { + if (isActive) { + try { + // Get fresh URL and token from new backend + const newBackendUrl = getCurrentBackendUrl(); + const newToken = getCurrentAuthToken(); + const newUrl = new URL(`${newBackendUrl || window.location.origin}${normalizedEndpoint}`); + + if (newToken) { + newUrl.searchParams.set('token', newToken); + } + + // Create new EventSource + eventSource = new EventSource(newUrl.toString(), eventSourceOptions); + + // Set up event handlers again + eventSource.onmessage = eventSource.onmessage; + eventSource.onerror = eventSource.onerror; + } catch (reconnectError) { + onError(reconnectError); + } + } + }, 100); + } + }); + + // Return control object with enhanced close method + return { + close: () => { + if (eventSource) { + eventSource.close(); + eventSource = null; + } + isActive = false; + unsubscribe(); + } + }; + } catch (error) { + onError(error); + isActive = false; + // Return a dummy control object + return { + close: () => {} + }; + } +} + +/** + * Login to the current backend + * @param {string} username - Username + * @param {string} password - Password + * @returns {Promise} - Success status + */ +export async function login(username, password) { + // Set authenticating state + authState.update(state => ({ + ...state, + isAuthenticating: true, + authError: null + })); + + try { + const response = await apiFetch('/auth/login', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + credentials: 'include', // Ensure cookies are stored + body: JSON.stringify({ username, password }) + }); + + if (!response.ok) { + const error = await response.json(); + throw new Error(error.error || 'Authentication failed'); + } + + const data = await response.json(); + + // Save the token for future reference + updateAuthToken(get(backendConfig).active, data.token); + + // Also manually set the cookie as a fallback for SameSite restrictions + document.cookie = `AuthToken=${data.token}; path=/; max-age=${60*60*24}`; + + // Update auth state + authState.update(state => ({ + ...state, + isAuthenticated: true, + isAuthenticating: false, + authError: null + })); + + return true; + } catch (error) { + // Update auth state with error + authState.update(state => ({ + ...state, + isAuthenticated: false, + isAuthenticating: false, + authError: error.message + })); + + return false; + } +} + +export async function syncAuthState() { + const currentBackendId = get(backendConfig).active; + const backend = getCurrentBackend(); + + // Update auth state to checking + authState.update(state => ({ + ...state, + isAuthenticating: true + })); + + try { + // Make a simple request with 500ms timeout to verify authentication + const response = await apiFetchTimeout('/api/v2/auth/check', { + method: 'GET', + headers: { + 'Accept': 'application/json' + }, + credentials: 'include' // Ensure cookies are sent + }, 500); + + if (response.status === 401) { + // Authentication required but we're not authenticated + authState.update(state => ({ + ...state, + isAuthenticated: false, + isAuthenticating: false, + authError: 'Authentication required' + })); + return false; + } else if (response.status === 404) { + // Endpoint not found - this server might not require authentication + // or is using a different auth endpoint + authState.update(state => ({ + ...state, + isAuthenticated: false, + isAuthenticating: false, + authError: 'endpoint not found' + })); + return false; + } else if (!response.ok) { + // Some other error + authState.update(state => ({ + ...state, + isAuthenticated: false, + isAuthenticating: false, + authError: `API error: ${response.status} ${response.statusText}` + })); + return false; + } + + // Successfully authenticated + authState.update(state => ({ + ...state, + isAuthenticated: true, + isAuthenticating: false, + authError: null + })); + return true; + } catch (error) { + // Handle timeout or other errors + const errorMessage = error.name === 'AbortError' ? 'Connection timed out. The server may be slow or unreachable.' : error.message || 'Connection error'; + console.warn('Auth check failed:', error); + + // Sleep for 60ms, then retry once, else continue failing + await new Promise(resolve => setTimeout(resolve, 60)); + try { + const retryResponse = await apiFetchTimeout('/api/v2/auth/check', { + method: 'GET', + headers: { + 'Accept': 'application/json' + }, + credentials: 'include' + }, 500); + + if (retryResponse.ok) { + authState.update(state => ({ + ...state, + isAuthenticated: true, + isAuthenticating: false, + authError: null + })); + return true; + } + } catch (retryError) { + console.warn('Retry auth check failed:', retryError); + } + + authState.update(state => ({ + ...state, + isAuthenticated: false, + isAuthenticating: false, + authError: errorMessage + })); + return false; + } +} + +// Initial setup function to load saved backend configurations +export function initializeApiService() { + if (isInitialized) return; + + try { + // Try to load saved config from localStorage + const savedConfig = localStorage.getItem('ssui-backend-config'); + if (savedConfig) { + const parsed = JSON.parse(savedConfig); + + // Validate and normalize the loaded configuration + const validatedConfig = { + active: parsed.active && parsed.backends?.[parsed.active] ? parsed.active : 'default', + backends: { + default: { + url: '/', + token: parsed.backends?.default?.token || null + } + } + }; + + // Merge all backends from storage + if (parsed.backends) { + for (const [id, backend] of Object.entries(parsed.backends)) { + if (id !== 'default') { + validatedConfig.backends[id] = { + url: backend.url, + token: backend.token || null + }; + } + } + } + + // Apply the validated config + backendConfig.set(validatedConfig); + } + + // Subscribe to changes and save to localStorage + const unsubscribe = backendConfig.subscribe(value => { + try { + localStorage.setItem('ssui-backend-config', JSON.stringify(value)); + } catch (error) { + console.error('Error saving backend config:', error); + } + }); + + isInitialized = true; + + // Check authentication status + syncAuthState().catch(console.error); + + // Return cleanup function (though this is a service, so it won't typically be cleaned up) + return unsubscribe; + } catch (error) { + console.error('Error initializing API service:', error); + isInitialized = true; // Prevent repeated failed initializations + } +} \ No newline at end of file diff --git a/frontend/src/services/whoami.js b/frontend/src/services/whoami.js new file mode 100644 index 00000000..0fbd8565 --- /dev/null +++ b/frontend/src/services/whoami.js @@ -0,0 +1,117 @@ +import { writable } from 'svelte/store'; +import { apiFetch } from './api.js'; + +/** + * User information store + */ +export const userInfo = writable({ + username: null, + accessLevel: null, + isLoading: true, + isAuthenticated: false, + lastFetched: null, + error: null +}); + +/** + * Fetch current user information from the API + */ +export async function fetchUserInfo() { + // Set loading state + userInfo.update(state => ({ + ...state, + isLoading: true, + error: null + })); + + try { + const response = await apiFetch('/api/v2/auth/whoami'); + + // Parse the JSON from the response + const data = await response.json(); + console.log('You are logged in as:', data); + + if (data && data.username) { + // Update store with successful data + userInfo.set({ + username: data.username, + accessLevel: data.accessLevel || 'user', + isLoading: false, + isAuthenticated: true, + lastFetched: new Date(), + error: null + }); + return data; + } else { + throw new Error('Invalid response format: missing username'); + } + } catch (error) { + console.error('Failed to fetch user info:', error); + + // Update store with error state + userInfo.set({ + username: null, + accessLevel: null, + isLoading: false, + isAuthenticated: false, + lastFetched: null, + error: error.message || 'Failed to fetch user information' + }); + + throw error; + } +} + +/** + * Get formatted user initials for avatar display + */ +export function getUserInitials(username) { + if (!username) return 'USR'; + + // Split username and take first letter of each word, max 3 characters + const words = username.split(/[\s_-]+/); + if (words.length === 1) { + return username.substring(0, 3).toUpperCase(); + } + return words.slice(0, 2).map(word => word.charAt(0).toUpperCase()).join(''); +} + +/** + * Format access level for display + */ +export function formatAccessLevel(accessLevel) { + if (!accessLevel) return 'Unknown'; + return accessLevel.charAt(0).toUpperCase() + accessLevel.slice(1); +} + +/** + * Check if user info needs to be refreshed (older than 5 minutes) + */ +export function shouldRefreshUserInfo(lastFetched) { + if (!lastFetched) return true; + const fiveMinutesAgo = new Date(Date.now() - 5 * 60 * 1000); + return lastFetched < fiveMinutesAgo; +} + +/** + * Initialize user info on app start + */ +export function initUserInfo() { + return fetchUserInfo().catch(error => { + console.warn('Initial user info fetch failed:', error); + }); +} + +/** + * Clear user info (for logout) + */ +export function clearUserInfo() { + userInfo.set({ + username: null, + accessLevel: null, + isLoading: false, + isAuthenticated: false, + lastFetched: null, + error: null + }); +} \ No newline at end of file diff --git a/frontend/src/tabs.js b/frontend/src/tabs.js new file mode 100644 index 00000000..264397a7 --- /dev/null +++ b/frontend/src/tabs.js @@ -0,0 +1,20 @@ +function switchTab(tabId) { + // Hide all tabs + document.querySelectorAll('.tab').forEach(tab => { + tab.classList.remove('active'); + }); + + // Show the selected tab + document.getElementById(tabId).classList.add('active'); + + // Update tab buttons + document.querySelectorAll('.tab-button').forEach(button => { + button.classList.remove('active'); + }); + + // Activate the clicked button + document.querySelector(`.tab-button[onclick*="${tabId}"]`).classList.add('active'); + } + + // Export for Svelte + export { switchTab }; \ No newline at end of file diff --git a/frontend/src/themes/theme.css b/frontend/src/themes/theme.css new file mode 100644 index 00000000..1e516f6f --- /dev/null +++ b/frontend/src/themes/theme.css @@ -0,0 +1,88 @@ +/* themes/theme.css */ +:root { + /* Only used on login page, fix this later */ + --bg-primary: #1e1e1e; + --bg-secondary: #252526; + --bg-tertiary: #2d2d2d; + --bg-hover: #3c3c3c; + --bg-active: #3e4033; + + --text-primary: #d4d4d4; + --text-secondary: #a9a9a9; + --text-accent: #6a9955; /* Forest green accent */ + --text-warning: #ce9178; + + --border-color: #3e3e3e; + + --accent-primary: #6a9955; /* Forest green */ + --accent-secondary: #4d7240; + --accent-tertiary: #5f7e52; + + --shadow-light: 0 2px 8px rgba(0, 0, 0, 0.3); + --shadow-medium: 0 4px 12px rgba(0, 0, 0, 0.4); + + --transition-speed: 250ms; + + /* Layout */ + --top-nav-height: 3rem; + --sidebar-width: 150px; + --sidebar-collapsed-width: 60px; + } + + body { + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + margin: 0; + padding: 0; + background-color: var(--bg-primary); + color: var(--text-primary); + overflow: hidden; + } + + button { + background-color: var(--bg-tertiary); + color: var(--text-primary); + border: 1px solid var(--border-color); + border-radius: 3px; + padding: 0.5rem 1rem; + cursor: pointer; + transition: all var(--transition-speed) ease; + } + + button:hover { + background-color: var(--bg-hover); + border-color: var(--accent-primary); + } + + button.active { + background-color: var(--bg-active); + border-color: var(--accent-primary); + color: var(--accent-primary); + } + + a { + color: var(--accent-primary); + text-decoration: none; + transition: color var(--transition-speed) ease; + } + + a:hover { + color: var(--accent-tertiary); + } + + /* Scrollbar styling */ + ::-webkit-scrollbar { + width: 10px; + } + + ::-webkit-scrollbar-track { + background: var(--bg-secondary); + } + + ::-webkit-scrollbar-thumb { + background: var(--bg-tertiary); + border-radius: 5px; + } + + ::-webkit-scrollbar-thumb:hover { + background: var(--accent-secondary); + } \ No newline at end of file diff --git a/frontend/src/themes/theme.js b/frontend/src/themes/theme.js new file mode 100644 index 00000000..aa319551 --- /dev/null +++ b/frontend/src/themes/theme.js @@ -0,0 +1,384 @@ +// src/theme/theme.js + +// Available Vars +//"--bg-primary" +//"--bg-secondary" +//"--bg-tertiary" +//"--bg-hover" +//"--bg-active" +//"--text-primary" +//"--text-secondary" +//"--text-accent" +//"--text-warning" +//"--border-color" +//"--accent-primary" +//"--accent-secondary" +//"--accent-tertiary" +//"--shadow-light" +//"--shadow-medium" +//"--transition-speed" +//"--top-nav-height" + + +// Define your themes +const themes = { + forest: { + name: "Forest Dark", + properties: { + "--bg-primary": "#1e1e1e", + "--bg-secondary": "#252526", + "--bg-tertiary": "#2d2d2d", + "--bg-hover": "#3c3c3c", + "--bg-active": "#3e4033", + "--text-primary": "#d4d4d4", + "--text-secondary": "#a9a9a9", + "--text-accent": "#6a9955", + "--text-warning": "#ce9178", + "--border-color": "#3e3e3e", + "--accent-primary": "#6a9955", + "--accent-secondary": "#4d7240", + "--accent-tertiary": "#5f7e52", + "--shadow-light": "0 2px 8px rgba(0, 0, 0, 0.3)", + "--shadow-medium": "0 4px 12px rgba(0, 0, 0, 0.4)", + "--transition-speed": "250ms", + "--top-nav-height": "3rem", + "--sidebar-width": "150px", + "--sidebar-collapsed-width": "60px", + }, + }, + + vaxholmDark: { + name: "Vaxholm Dark", + properties: { + "--bg-primary": "#121a12", + "--bg-secondary": "#1b2a1b", + "--bg-tertiary": "#243224", + "--bg-hover": "#2e3a2e", + "--bg-active": "#3a4a3a", + "--text-primary": "#d9e6d9", + "--text-secondary": "#a3b3a3", + "--text-accent": "#7a9a7a", + "--text-warning": "#c9a67a", + "--border-color": "#2a3a2a", + "--accent-primary": "#7a9a7a", + "--accent-secondary": "#5f7a5f", + "--accent-tertiary": "#6a8a6a", + "--shadow-light": "0 2px 8px rgba(0, 0, 0, 0.5)", + "--shadow-medium": "0 4px 12px rgba(0, 0, 0, 0.6)", + "--transition-speed": "250ms", + "--top-nav-height": "3rem", + "--sidebar-width": "150px", + "--sidebar-collapsed-width": "60px", + }, + }, + + archipelagoPastel: { + name: "Archipelago Pastel", + properties: { + "--bg-primary": "#2e3b3e", + "--bg-secondary": "#3e4b4e", + "--bg-tertiary": "#4e5b5e", + "--bg-hover": "#5e6b6e", + "--bg-active": "#6e7b7e", + "--text-primary": "#dce7e7", + "--text-secondary": "#b0c0c0", + "--text-accent": "#a3c1ad", + "--text-warning": "#d9bba3", + "--border-color": "#4a5a5a", + "--accent-primary": "#a3c1ad", + "--accent-secondary": "#8bb394", + "--accent-tertiary": "#7aa383", + "--shadow-light": "0 2px 8px rgba(0, 0, 0, 0.25)", + "--shadow-medium": "0 4px 12px rgba(0, 0, 0, 0.35)", + "--transition-speed": "250ms", + "--top-nav-height": "3rem", + "--sidebar-width": "150px", + "--sidebar-collapsed-width": "60px", + }, + }, + + colorblindFriendly: { + name: "Colorblind Friendly", + properties: { + "--bg-primary": "#121212", + "--bg-secondary": "#1e1e1e", + "--bg-tertiary": "#2a2a2a", + "--bg-hover": "#383838", + "--bg-active": "#454545", + "--text-primary": "#ffffff", + "--text-secondary": "#bfbfbf", + "--text-accent": "#ffb300", // bright yellow for visibility + "--text-warning": "#ff3b3b", // bright red + "--border-color": "#666666", + "--accent-primary": "#ffb300", + "--accent-secondary": "#ffaa00", + "--accent-tertiary": "#cc8800", + "--shadow-light": "0 2px 8px rgba(0, 0, 0, 0.7)", + "--shadow-medium": "0 4px 12px rgba(0, 0, 0, 0.8)", + "--transition-speed": "250ms", + "--top-nav-height": "3rem", + "--sidebar-width": "150px", + "--sidebar-collapsed-width": "60px", + }, + }, + + cyberpunkGlow: { + name: "Cyberpunk Glow", + properties: { + "--bg-primary": "#0a0a23", + "--bg-secondary": "#1a1a3a", + "--bg-tertiary": "#2a2a5a", + "--bg-hover": "#3a3a7a", + "--bg-active": "#4a4a9a", + "--text-primary": "#e0e0ff", + "--text-secondary": "#a0a0ff", + "--text-accent": "#ff00ff", + "--text-warning": "#ff4d4d", + "--border-color": "#660066", + "--accent-primary": "#ff00ff", + "--accent-secondary": "#cc00cc", + "--accent-tertiary": "#990099", + "--shadow-light": "0 0 8px #ff00ff", + "--shadow-medium": "0 0 16px #ff00ff", + "--transition-speed": "250ms", + "--top-nav-height": "3rem", + "--sidebar-width": "150px", + "--sidebar-collapsed-width": "60px", + }, + }, + + v1Classic: { + name: "Stationeers Server UI (Classic)", + properties: { + "--bg-primary": "#0a0a14", + "--bg-secondary": "#1b1b2f8f", + "--bg-tertiary": "#2a2a5a", + "--bg-hover": "#2a2a5a", + "--bg-active": "#4a4a9a", + "--text-primary": "#00fca9", + "--text-secondary": "#00fca9", + "--text-accent": "#00fca9", + "--text-warning": "#ff4d4d", + "--border-color": "#660066", + "--accent-primary": "#0eefa9", + "--accent-secondary": "#cc00cc", + "--accent-tertiary": "#990099", + "--shadow-light": "0 0 8px #0df2aa", + "--shadow-medium": "0 0 16px #0df2aa", + "--transition-speed": "250ms", + "--top-nav-height": "3rem", + "--sidebar-width": "150px", + "--sidebar-collapsed-width": "60px", + }, + }, + + lightArchipelago: { + name: "Light Archipelago", + properties: { + "--bg-primary": "#f0f4f3", + "--bg-secondary": "#d9e4e1", + "--bg-tertiary": "#c0d1cd", + "--bg-hover": "#b0c4bf", + "--bg-active": "#a0b4af", + "--text-primary": "#2a3a33", + "--text-secondary": "#4a5a53", + "--text-accent": "#7a9a7a", + "--text-warning": "#c97a5a", + "--border-color": "#a0b0a8", + "--accent-primary": "#7a9a7a", + "--accent-secondary": "#5f7a5f", + "--accent-tertiary": "#6a8a6a", + "--shadow-light": "0 2px 8px rgba(0, 0, 0, 0.1)", + "--shadow-medium": "0 4px 12px rgba(0, 0, 0, 0.15)", + "--transition-speed": "250ms", + "--top-nav-height": "3rem", + "--sidebar-width": "150px", + "--sidebar-collapsed-width": "60px", + }, + }, + oceanBreeze: { + name: "Ocean Breeze", + properties: { + "--bg-primary": "#1a2a38", + "--bg-secondary": "#253545", + "--bg-tertiary": "#2f4055", + "--bg-hover": "#3a4c66", + "--bg-active": "#4a5c76", + "--text-primary": "#e0eaf0", + "--text-secondary": "#b0c0d0", + "--text-accent": "#68c1e8", + "--text-warning": "#f0ad4e", + "--border-color": "#456277", + "--accent-primary": "#68c1e8", + "--accent-secondary": "#4fa3ca", + "--accent-tertiary": "#3a89b0", + "--shadow-light": "0 2px 8px rgba(0, 0, 0, 0.3)", + "--shadow-medium": "0 4px 12px rgba(0, 0, 0, 0.4)", + "--transition-speed": "250ms", + "--top-nav-height": "3rem", + "--sidebar-width": "150px", + "--sidebar-collapsed-width": "60px", + }, + }, + + sunsetGlow: { + name: "Sunset Glow", + properties: { + "--bg-primary": "#272133", + "--bg-secondary": "#332940", + "--bg-tertiary": "#3e304d", + "--bg-hover": "#4b3a5d", + "--bg-active": "#57446d", + "--text-primary": "#f5e6ff", + "--text-secondary": "#d1b6e1", + "--text-accent": "#ff9e7a", + "--text-warning": "#ffcc66", + "--border-color": "#5d4970", + "--accent-primary": "#ff9e7a", + "--accent-secondary": "#e68a6a", + "--accent-tertiary": "#cc775a", + "--shadow-light": "0 2px 8px rgba(0, 0, 0, 0.35)", + "--shadow-medium": "0 4px 12px rgba(0, 0, 0, 0.45)", + "--transition-speed": "250ms", + "--top-nav-height": "3rem", + "--sidebar-width": "150px", + "--sidebar-collapsed-width": "60px", + }, + }, + + mintChocolate: { + name: "Mint Chocolate", + properties: { + "--bg-primary": "#1e2721", + "--bg-secondary": "#26322a", + "--bg-tertiary": "#2e3d33", + "--bg-hover": "#38493e", + "--bg-active": "#425548", + "--text-primary": "#e0f0e8", + "--text-secondary": "#b0c5b8", + "--text-accent": "#7fe0c3", + "--text-warning": "#d9b382", + "--border-color": "#3d4940", + "--accent-primary": "#7fe0c3", + "--accent-secondary": "#58c4a3", + "--accent-tertiary": "#3ba483", + "--shadow-light": "0 2px 8px rgba(0, 0, 0, 0.3)", + "--shadow-medium": "0 4px 12px rgba(0, 0, 0, 0.4)", + "--transition-speed": "250ms", + "--top-nav-height": "3rem", + "--sidebar-width": "150px", + "--sidebar-collapsed-width": "60px", + }, + }, + + lavenderFields: { + name: "Lavender Fields", + properties: { + "--bg-primary": "#2b2440", + "--bg-secondary": "#352e4e", + "--bg-tertiary": "#3f385c", + "--bg-hover": "#4a426a", + "--bg-active": "#554c78", + "--text-primary": "#ece8ff", + "--text-secondary": "#c7c0e3", + "--text-accent": "#b28dff", + "--text-warning": "#ffad9c", + "--border-color": "#4d4566", + "--accent-primary": "#b28dff", + "--accent-secondary": "#9a77e0", + "--accent-tertiary": "#8360c6", + "--shadow-light": "0 2px 8px rgba(0, 0, 0, 0.35)", + "--shadow-medium": "0 4px 12px rgba(0, 0, 0, 0.45)", + "--transition-speed": "250ms", + "--top-nav-height": "3rem", + "--sidebar-width": "150px", + "--sidebar-collapsed-width": "60px", + }, + }, + + nordAurora: { + name: "Kirkeness", + properties: { + "--bg-primary": "#2e3440", + "--bg-secondary": "#3b4252", + "--bg-tertiary": "#434c5e", + "--bg-hover": "#4c566a", + "--bg-active": "#5e6779", + "--text-primary": "#eceff4", + "--text-secondary": "#d8dee9", + "--text-accent": "#88c0d0", + "--text-warning": "#ebcb8b", + "--border-color": "#4c566a", + "--accent-primary": "#88c0d0", + "--accent-secondary": "#81a1c1", + "--accent-tertiary": "#5e81ac", + "--shadow-light": "0 2px 8px rgba(0, 0, 0, 0.25)", + "--shadow-medium": "0 4px 12px rgba(0, 0, 0, 0.35)", + "--transition-speed": "250ms", + "--top-nav-height": "3rem", + "--sidebar-width": "150px", + "--sidebar-collapsed-width": "60px", + }, + } + }; + + + +// Get theme names as an array +const themeNames = Object.keys(themes); + +// Current theme state +let currentTheme = 'forest'; + +// Apply theme to document +function applyTheme(themeName) { + const theme = themes[themeName]; + if (!theme) return; + + currentTheme = themeName; + + // Apply each CSS variable + const root = document.documentElement; + Object.entries(theme.properties).forEach(([property, value]) => { + root.style.setProperty(property, value); + }); + + // Save to localStorage + localStorage.setItem('theme', themeName); +} + +// Rotate to next theme +function nextTheme() { + const currentIndex = themeNames.indexOf(currentTheme); + const nextIndex = (currentIndex + 1) % themeNames.length; + applyTheme(themeNames[nextIndex]); +} + +// Get current theme name +function getCurrentTheme() { + return currentTheme; +} + +// Get all theme names +function getThemes() { + return themeNames; +} + +// Initialize theme from localStorage or default +function initTheme() { + const savedTheme = localStorage.getItem('theme'); + if (savedTheme && themes[savedTheme]) { + applyTheme(savedTheme); + } else { + applyTheme(currentTheme); + } +} + +// Export the service functions +export default { + initTheme, + applyTheme, + nextTheme, + getCurrentTheme, + getThemes +}; \ No newline at end of file diff --git a/frontend/src/vite-env.d.ts b/frontend/src/vite-env.d.ts new file mode 100644 index 00000000..4078e747 --- /dev/null +++ b/frontend/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/frontend/svelte.config.js b/frontend/svelte.config.js new file mode 100644 index 00000000..b0683fd2 --- /dev/null +++ b/frontend/svelte.config.js @@ -0,0 +1,7 @@ +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' + +export default { + // Consult https://svelte.dev/docs#compile-time-svelte-preprocess + // for more information about preprocessors + preprocess: vitePreprocess(), +} diff --git a/frontend/vite.config.js b/frontend/vite.config.js new file mode 100644 index 00000000..90f788e8 --- /dev/null +++ b/frontend/vite.config.js @@ -0,0 +1,29 @@ +import { defineConfig } from 'vite' +import { svelte } from '@sveltejs/vite-plugin-svelte' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [svelte()], + build: { + outDir: '../UIMod/onboard_bundled/v2', // Change output directory to ../dist + rollupOptions: { + output: { + // Set the name of the JS bundle + entryFileNames: 'assets/ssui.js', + // Set the name of the CSS bundle and other assets + assetFileNames: (assetInfo) => { + // Using the non-deprecated names property which is an array + if (assetInfo.names && assetInfo.names.some(name => name.endsWith('.css'))) { + return 'assets/ssui.css' + } + return 'assets/[name].[ext]' + } + } + } + }, + server: { + host: '0.0.0.0', // Bind to all interfaces + port: 5173, // Match your expected port + strictPort: true // Fail if port 5173 is taken + } +}) \ No newline at end of file diff --git a/src/config/config.go b/src/config/config.go index f7c8aee1..bf7f14b2 100644 --- a/src/config/config.go +++ b/src/config/config.go @@ -12,7 +12,7 @@ import ( var ( // All configuration variables can be found in vars.go Version = "5.5.8" - Branch = "indev-no-steamcmd" + Branch = "indev-no-steamcmd" // use indev-no-steamcmd to skip steam for faster runs in development ) type JsonConfig struct { diff --git a/src/setup/cleanup.go b/src/setup/cleanup.go index dde1e310..a989d991 100644 --- a/src/setup/cleanup.go +++ b/src/setup/cleanup.go @@ -84,45 +84,47 @@ func CleanUpOldExecutables() error { return fmt.Errorf("failed to get current directory: %w", err) } - // Walk through the directory - err = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { + // Read only the root directory + entries, err := os.ReadDir(dir) + if err != nil { + return fmt.Errorf("error reading directory: %w", err) + } + + // Process each entry in the root directory + for _, entry := range entries { + info, err := entry.Info() if err != nil { return err } // Skip directories, non-matching files, and files with _old prefix if info.IsDir() || !re.MatchString(info.Name()) || strings.HasPrefix(info.Name(), "_old") { - return nil + continue } // Extract version from filename matches := re.FindStringSubmatch(info.Name()) if len(matches) < 2 { - return nil + continue } fileVersion := matches[1] // Skip if the version matches the current backend version if fileVersion == currentBackendVersion { - return nil + continue } // Generate new filename with _old prefix newName := "_old" + info.Name() - newPath := filepath.Join(filepath.Dir(path), newName) + newPath := filepath.Join(dir, newName) // Rename the file + path := filepath.Join(dir, info.Name()) err = os.Rename(path, newPath) if err != nil { return fmt.Errorf("failed to rename %s to %s: %w", path, newName, err) } logger.Install.Info(fmt.Sprintf("Old Executable cleanup: Renamed %s to %s", path, newName)) - - return nil - }) - - if err != nil { - return fmt.Errorf("error walking directory: %w", err) } return nil diff --git a/src/web/start.go b/src/web/start.go index d2e5c93e..a866adb4 100644 --- a/src/web/start.go +++ b/src/web/start.go @@ -39,6 +39,13 @@ func StartWebServer(wg *sync.WaitGroup) { protectedMux.HandleFunc("/detectionmanager", ServeDetectionManager) protectedMux.HandleFunc("/", ServeIndex) + // --- SVELTE UI --- + protectedMux.HandleFunc("/v2", ServeSvelteUI) + svelteAssetsFS, _ := fs.Sub(config.V1UIFS, "UIMod/onboard_bundled/v2/assets") + protectedMux.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(http.FS(svelteAssetsFS)))) + protectedMux.HandleFunc("/api/v2/loader/reloadbackend", HandleReloadAll) + + // Config protectedMux.HandleFunc("/saveconfigasjson", configchanger.SaveConfigForm) // SSE routes diff --git a/src/web/svelteui.go b/src/web/svelteui.go new file mode 100644 index 00000000..c563df63 --- /dev/null +++ b/src/web/svelteui.go @@ -0,0 +1,59 @@ +package web + +import ( + "encoding/json" + "io" + "io/fs" + "net/http" + "sync" + + "github.com/JacksonTheMaster/StationeersServerUI/v5/src/config" + "github.com/JacksonTheMaster/StationeersServerUI/v5/src/core/loader" + "github.com/JacksonTheMaster/StationeersServerUI/v5/src/logger" +) + +var reloadMu sync.Mutex + +func ServeSvelteUI(w http.ResponseWriter, r *http.Request) { + htmlFS, err := fs.Sub(config.V1UIFS, "UIMod/onboard_bundled/v2") + if err != nil { + http.Error(w, "Error accessing Svelte UI: "+err.Error(), http.StatusInternalServerError) + return + } + + htmlFile, err := htmlFS.Open("index.html") + if err != nil { + http.Error(w, "Error reading Svelte UI: "+err.Error(), http.StatusInternalServerError) + return + } + defer htmlFile.Close() + + // Stream the file content to the response + w.Header().Set("Content-Type", "text/html; charset=utf-8") + _, err = io.Copy(w, htmlFile) + if err != nil { + http.Error(w, "Error writing Svelte UI: "+err.Error(), http.StatusInternalServerError) + return + } +} + +func HandleReloadAll(w http.ResponseWriter, r *http.Request) { + logger.Web.Debug("Received reloadbackend request from API") + reloadMu.Lock() + defer reloadMu.Unlock() + // accept only GET requests + if r.Method != http.MethodGet { + http.Error(w, "Only GET requests are allowed", http.StatusMethodNotAllowed) + return + } + // Reload all loaders + loader.ReloadBackend() + + // Set response headers and write JSON response + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusAccepted) + if err := json.NewEncoder(w).Encode(map[string]string{"status": "OK"}); err != nil { + http.Error(w, "Failed to write response", http.StatusInternalServerError) + return + } +} From 31da432c99c800ccf4b8881aaa2d3fdae2f49d95 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster Date: Sun, 24 Aug 2025 13:39:40 +0200 Subject: [PATCH 02/74] update discordrichpresence to v1.1.0 (windows support) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index cb7da326..9fc5d25c 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/fsnotify/fsnotify v1.7.0 github.com/golang-jwt/jwt/v5 v5.2.2 github.com/google/uuid v1.6.0 - github.com/jacksonthemaster/discordrichpresence v1.0.3 + github.com/jacksonthemaster/discordrichpresence v1.1.0 golang.org/x/crypto v0.37.0 ) diff --git a/go.sum b/go.sum index 859be41a..c7489e03 100644 --- a/go.sum +++ b/go.sum @@ -9,8 +9,8 @@ github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/jacksonthemaster/discordrichpresence v1.0.3 h1:yB1TJ+yFTwCk4pxafxx/jYAsQyJ0RkfYUpRrjr0we7o= -github.com/jacksonthemaster/discordrichpresence v1.0.3/go.mod h1:XA0SB8bsEc5oJCQcXjC78BfNBj9FoLFA4ysfevkUjHE= +github.com/jacksonthemaster/discordrichpresence v1.1.0 h1:4UmompqAKyEpspR/Z0LFj6vdSWJf6FZQ/J787KvdxMM= +github.com/jacksonthemaster/discordrichpresence v1.1.0/go.mod h1:XA0SB8bsEc5oJCQcXjC78BfNBj9FoLFA4ysfevkUjHE= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= From 6dd0d753c94f1fd8c99ec8e643ec6120949aa5c1 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Tue, 26 Aug 2025 16:31:36 +0200 Subject: [PATCH 03/74] added 15:04 format with scheduleDailyRestart func to auto restart to allow scheduled restarts --- src/managers/gamemgr/processmanagement.go | 83 ++++++++++++++++++++++- 1 file changed, 80 insertions(+), 3 deletions(-) diff --git a/src/managers/gamemgr/processmanagement.go b/src/managers/gamemgr/processmanagement.go index cdac8785..035d397f 100644 --- a/src/managers/gamemgr/processmanagement.go +++ b/src/managers/gamemgr/processmanagement.go @@ -267,9 +267,27 @@ func InternalStopServer() error { return nil } -// startAutoRestart runs a goroutine that restarts the server after the specified timeframe in minutes. -func startAutoRestart(minutes string, done chan struct{}) { - minutesInt, _ := strconv.Atoi(minutes) +// startAutoRestart runs a goroutine that restarts the server either after a specified duration in minutes +// or at a specific time of day (HH:MM) every day. +func startAutoRestart(schedule string, done chan struct{}) { + // Try parsing as a time in HH:MM format + if t, err := time.Parse("15:04", schedule); err == nil { + // Valid HH:MM format, schedule daily restart + go scheduleDailyRestart(t, done) + return + } + + // Fallback to parsing as minutes duration + minutesInt, err := strconv.Atoi(schedule) + if err != nil { + logger.Core.Error("Invalid AutoRestartServerTimer format: " + schedule) + return + } + if minutesInt <= 0 { + logger.Core.Error("AutoRestartServerTimer must be a positive number of minutes or valid HH:MM time") + return + } + ticker := time.NewTicker(time.Duration(minutesInt) * time.Minute) defer ticker.Stop() @@ -314,6 +332,65 @@ func startAutoRestart(minutes string, done chan struct{}) { } } +// scheduleDailyRestart schedules a server restart at the specified time of day (HH:MM) every day. +func scheduleDailyRestart(t time.Time, done chan struct{}) { + // Extract hour and minute from the parsed time + hour, min := t.Hour(), t.Minute() + + for { + now := time.Now() + next := time.Date(now.Year(), now.Month(), now.Day(), hour, min, 0, 0, now.Location()) + if now.After(next) || now.Equal(next) { + // If the time is in the past or now, schedule for tomorrow + next = next.Add(24 * time.Hour) + } + duration := next.Sub(now) + + logger.Core.Info(fmt.Sprintf("Scheduled restart at %02d:%02d (in %v)", hour, min, duration)) + + // Wait until the next restart time or until interrupted + timer := time.NewTimer(duration) + select { + case <-timer.C: + mu.Lock() + if !internalIsServerRunningNoLock() { + mu.Unlock() + logger.Core.Info("Auto-restart skipped: server is not running") + continue // Check for the next day's restart + } + mu.Unlock() + + if config.IsSSCMEnabled { + commandmgr.WriteCommand("say Attention, server is restarting in 30 seconds!") + time.Sleep(10 * time.Second) + commandmgr.WriteCommand("say Attention, server is restarting in 20 seconds!") + time.Sleep(10 * time.Second) + commandmgr.WriteCommand("say Attention, server is restarting in 10 seconds!") + time.Sleep(5 * time.Second) + commandmgr.WriteCommand("say Attention, server is restarting in 5 seconds!") + time.Sleep(5 * time.Second) + } + logger.Core.Info("Daily auto-restart triggered: stopping server") + if err := InternalStopServer(); err != nil { + logger.Core.Error("Daily auto-restart failed to stop server: " + err.Error()) + continue + } + + logger.Core.Info("Daily auto-restart: waiting 5 seconds before restarting") + time.Sleep(5 * time.Second) + + logger.Core.Info("Daily auto-restart: starting server") + if err := InternalStartServer(); err != nil { + logger.Core.Error("Daily auto-restart failed to start server: " + err.Error()) + continue + } + case <-done: + timer.Stop() + return + } + } +} + func clearGameServerUUID() { config.ConfigMu.Lock() defer config.ConfigMu.Unlock() From dee4c9736138471bf038fe1a1a8c7b16c9d324f5 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Thu, 28 Aug 2025 13:44:26 +0200 Subject: [PATCH 04/74] update Dockerfile and workflows for go 1.25.0 --- .devcontainer/Dockerfile | 9 ++++++--- .devcontainer/devcontainer.json | 5 +++-- .github/workflows/auto-release.yaml | 2 +- .github/workflows/test-build.yml | 2 +- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 5b73033c..2994373d 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,6 +1,9 @@ # Use Debian-based VS Code dev container image FROM mcr.microsoft.com/vscode/devcontainers/base:bookworm +ARG TZ +ENV TZ="$TZ" + # Install dependencies in a single layer to reduce image size RUN apt-get update && apt-get install -y \ curl \ @@ -12,9 +15,9 @@ RUN apt-get update && apt-get install -y \ && rm -rf /var/lib/apt/lists/* # Install Go 1.24.2 -RUN wget -q https://go.dev/dl/go1.24.2.linux-amd64.tar.gz && \ - tar -C /usr/local -xzf go1.24.2.linux-amd64.tar.gz && \ - rm go1.24.2.linux-amd64.tar.gz +RUN wget -q https://go.dev/dl/go1.25.0.linux-amd64.tar.gz && \ + tar -C /usr/local -xzf go1.25.0.linux-amd64.tar.gz && \ + rm go1.25.0.linux-amd64.tar.gz ENV PATH="/usr/local/go/bin:${PATH}" ENV GOPATH=/go RUN mkdir -p /go/bin && chown -R vscode:vscode /go diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 9df0bb67..a195b559 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,13 +1,14 @@ { "name": "StationeersServerUI (Go)", "build": { - "dockerfile": "Dockerfile" + "dockerfile": "Dockerfile", + "args": { "TZ": "${localEnv:TZ:Europe/Stockholm}" } }, "workspaceFolder": "/workspaces/project", "workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/project,type=bind,consistency=cached", "features": { "ghcr.io/devcontainers/features/go:1": { - "version": "1.24.2" + "version": "1.25.0" } }, "forwardPorts": [8443], diff --git a/.github/workflows/auto-release.yaml b/.github/workflows/auto-release.yaml index 741d7e92..b36a7157 100644 --- a/.github/workflows/auto-release.yaml +++ b/.github/workflows/auto-release.yaml @@ -25,7 +25,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: '1.24.2' + go-version: '1.25.0' # Install dependencies - name: Install dependencies diff --git a/.github/workflows/test-build.yml b/.github/workflows/test-build.yml index 6452fa7c..e26bd219 100644 --- a/.github/workflows/test-build.yml +++ b/.github/workflows/test-build.yml @@ -18,7 +18,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: '1.24.2' + go-version: '1.25.0' # Install dependencies - name: Install dependencies From 737c9b956e1a852f1e43143952439e1755920892 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Thu, 28 Aug 2025 13:45:24 +0200 Subject: [PATCH 05/74] add debug mode check to skip SteamCMD installation --- src/setup/steamcmd.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/setup/steamcmd.go b/src/setup/steamcmd.go index 962176a2..04ec04d8 100644 --- a/src/setup/steamcmd.go +++ b/src/setup/steamcmd.go @@ -29,8 +29,8 @@ const ( // InstallAndRunSteamCMD installs and runs SteamCMD based on the platform (Windows/Linux). // It returns the exit status of the SteamCMD execution and any error encountered. func InstallAndRunSteamCMD() (int, error) { - if config.Branch == "indev-no-steamcmd" { - logger.Install.Info("🔍 Detected indev-no-steamcmd branch, skipping SteamCMD installation") + if config.Branch == "indev-no-steamcmd" || config.IsDebugMode { + logger.Install.Info("🔍 Detected indev-no-steamcmd branch or debug=true, skipping SteamCMD run") return 0, nil } From 046edc6a5d9381959d9b5958d5d0c628179733b2 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Thu, 28 Aug 2025 13:45:36 +0200 Subject: [PATCH 06/74] remove log level check to run pprof --- src/web/start.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/web/start.go b/src/web/start.go index 95476f93..3cfb6b70 100644 --- a/src/web/start.go +++ b/src/web/start.go @@ -97,7 +97,7 @@ func StartWebServer(wg *sync.WaitGroup) { }() // Start the pprof server if debug mode is enabled (HTTP/1.1) - if config.IsDebugMode && config.LogLevel < 20 { // if debug mode is enabled and log level is lower than 20 (if this triggers LogLevel is probably 10 and probably debug, but who knows), start pprof server + if config.IsDebugMode { // if debug mode is enabled, start pprof server wg.Add(1) go func() { defer wg.Done() From 06bd8c6c8b702d94701d25ba0976d8f8b50501a9 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Thu, 28 Aug 2025 13:46:40 +0200 Subject: [PATCH 07/74] refactored gamemgr into smaller files & improved auto restart functionality --- src/managers/gamemgr/autorestart.go | 137 +++++++++++++ src/managers/gamemgr/{sscm.go => bepinex.go} | 0 src/managers/gamemgr/processmanagement.go | 195 +------------------ src/managers/gamemgr/runcheck.go | 50 +++++ src/managers/gamemgr/uuid.go | 18 ++ 5 files changed, 212 insertions(+), 188 deletions(-) create mode 100644 src/managers/gamemgr/autorestart.go rename src/managers/gamemgr/{sscm.go => bepinex.go} (100%) create mode 100644 src/managers/gamemgr/runcheck.go create mode 100644 src/managers/gamemgr/uuid.go diff --git a/src/managers/gamemgr/autorestart.go b/src/managers/gamemgr/autorestart.go new file mode 100644 index 00000000..e2676f9f --- /dev/null +++ b/src/managers/gamemgr/autorestart.go @@ -0,0 +1,137 @@ +package gamemgr + +import ( + "strconv" + "time" + + "github.com/JacksonTheMaster/StationeersServerUI/v5/src/config" + "github.com/JacksonTheMaster/StationeersServerUI/v5/src/logger" + "github.com/JacksonTheMaster/StationeersServerUI/v5/src/managers/commandmgr" +) + +var ( + autoRestartDone chan struct{} + // other local vars are defined in processmanagement.go +) + +// startAutoRestart runs a goroutine that restarts the server either after a specified duration in minutes +// or at a specific time of day (HH:MM) every day. +func startAutoRestart(schedule string, done chan struct{}) { + // Try parsing as a time in HH:MM format + if t, err := time.Parse("15:04", schedule); err == nil { + // Valid HH:MM format, schedule daily restart + go scheduleDailyRestart(t, done) + return + } + + // Fallback to parsing as minutes duration + minutesInt, err := strconv.Atoi(schedule) + if err != nil { + logger.Core.Error("Invalid AutoRestartServerTimer format: " + schedule) + return + } + if minutesInt <= 0 { + logger.Core.Error("AutoRestartServerTimer must be a positive number of minutes or valid HH:MM time") + return + } + + ticker := time.NewTicker(time.Duration(minutesInt) * time.Minute) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + mu.Lock() + if !internalIsServerRunningNoLock() { + mu.Unlock() + logger.Core.Info("Auto-restart skipped: server is not running") + return + } + mu.Unlock() + + if config.IsSSCMEnabled { + commandmgr.WriteCommand("say Attention, server is restarting in 30 seconds!") + time.Sleep(10 * time.Second) + commandmgr.WriteCommand("say Attention, server is restarting in 20 seconds!") + time.Sleep(10 * time.Second) + commandmgr.WriteCommand("say Attention, server is restarting in 10 seconds!") + time.Sleep(5 * time.Second) + commandmgr.WriteCommand("say Attention, server is restarting in 5 seconds!") + time.Sleep(5 * time.Second) + } + logger.Core.Info("Auto-restart triggered: stopping server") + if err := InternalStopServer(); err != nil { + logger.Core.Error("Auto-restart failed to stop server: " + err.Error()) + return + } + + logger.Core.Info("Auto-restart: waiting 5 seconds before restarting") + time.Sleep(5 * time.Second) + + logger.Core.Info("Auto-restart: starting server") + if err := InternalStartServer(); err != nil { + logger.Core.Error("Auto-restart failed to start server: " + err.Error()) + return + } + case <-done: + return + } + } +} + +// scheduleDailyRestart schedules a server restart at the specified time of day (HH:MM) every day. +func scheduleDailyRestart(t time.Time, done chan struct{}) { + // Extract hour and minute from the parsed time + hour, min := t.Hour(), t.Minute() + + for { + now := time.Now() + next := time.Date(now.Year(), now.Month(), now.Day(), hour, min, 0, 0, now.Location()) + if now.After(next) || now.Equal(next) { + // If the time is in the past or now, schedule for tomorrow + next = next.Add(24 * time.Hour) + } + duration := next.Sub(now) + + // Wait until the next restart time or until interrupted + timer := time.NewTimer(duration) + select { + case <-timer.C: + mu.Lock() + if !internalIsServerRunningNoLock() { + mu.Unlock() + logger.Core.Info("Auto-restart skipped: server is not running") + continue + } + mu.Unlock() + + if config.IsSSCMEnabled { + commandmgr.WriteCommand("say Attention, server is restarting in 30 seconds!") + time.Sleep(10 * time.Second) + commandmgr.WriteCommand("say Attention, server is restarting in 20 seconds!") + time.Sleep(10 * time.Second) + commandmgr.WriteCommand("say Attention, server is restarting in 10 seconds!") + time.Sleep(5 * time.Second) + commandmgr.WriteCommand("say Attention, server is restarting in 5 seconds!") + time.Sleep(5 * time.Second) + } + logger.Core.Info("Daily auto-restart triggered: stopping server") + if err := InternalStopServer(); err != nil { + logger.Core.Error("Daily auto-restart failed to stop server: " + err.Error()) + continue + } + + logger.Core.Info("Daily auto-restart: waiting 5 seconds before restarting") + time.Sleep(5 * time.Second) + + logger.Core.Info("Daily auto-restart: starting server") + if err := InternalStartServer(); err != nil { + logger.Core.Error("Daily auto-restart failed to start server: " + err.Error()) + continue + } + case <-done: + timer.Stop() + return + } + } +} diff --git a/src/managers/gamemgr/sscm.go b/src/managers/gamemgr/bepinex.go similarity index 100% rename from src/managers/gamemgr/sscm.go rename to src/managers/gamemgr/bepinex.go diff --git a/src/managers/gamemgr/processmanagement.go b/src/managers/gamemgr/processmanagement.go index 035d397f..2cd64150 100644 --- a/src/managers/gamemgr/processmanagement.go +++ b/src/managers/gamemgr/processmanagement.go @@ -14,61 +14,17 @@ import ( "github.com/JacksonTheMaster/StationeersServerUI/v5/src/config" "github.com/JacksonTheMaster/StationeersServerUI/v5/src/logger" - "github.com/JacksonTheMaster/StationeersServerUI/v5/src/managers/commandmgr" - "github.com/google/uuid" ) var ( - cmd *exec.Cmd - mu sync.Mutex - logDone chan struct{} - err error - autoRestartDone chan struct{} - processExited chan struct{} + cmd *exec.Cmd + mu sync.Mutex + logDone chan struct{} + err error + processExited chan struct{} + // autoRestartDone is defined in autorestart.go ) -// InternalIsServerRunning checks if the server process is running. -// Safe to call standalone as it manages its own locking. -func InternalIsServerRunning() bool { - mu.Lock() - defer mu.Unlock() - return internalIsServerRunningNoLock() -} - -// internalIsServerRunningNoLock checks if the server process is running. -// Caller M U S T hold mu.Lock(). -func internalIsServerRunningNoLock() bool { - if cmd == nil || cmd.Process == nil { - return false - } - - if runtime.GOOS == "windows" { - select { - case <-processExited: - cmd = nil - clearGameServerUUID() - return false - default: - // Process is still running - return true - } - } - - if runtime.GOOS == "linux" { - // On Unix-like systems, use Signal(0) - if err := cmd.Process.Signal(syscall.Signal(0)); err != nil { - logger.Core.Debug("Signal(0) failed, assuming process is dead: " + err.Error()) - cmd = nil - clearGameServerUUID() - return false - } - return true - } - - logger.Core.Warn("Failed to check if server is running, assuming it's dead") - return false -} - func InternalStartServer() error { mu.Lock() defer mu.Unlock() @@ -182,7 +138,7 @@ func InternalStartServer() error { } autoRestartDone = make(chan struct{}) go startAutoRestart(config.AutoRestartServerTimer, autoRestartDone) - logger.Core.Info("Auto-restart scheduled every " + config.AutoRestartServerTimer + " minutes") + logger.Core.Info("New Auto-restart scheduled: " + config.AutoRestartServerTimer) } return nil @@ -200,7 +156,6 @@ func InternalStopServer() error { if autoRestartDone != nil { close(autoRestartDone) autoRestartDone = nil - logger.Core.Info("Auto-restart cycle interrupted due to manual stop") } // Process is running, stop it @@ -266,139 +221,3 @@ func InternalStopServer() error { clearGameServerUUID() return nil } - -// startAutoRestart runs a goroutine that restarts the server either after a specified duration in minutes -// or at a specific time of day (HH:MM) every day. -func startAutoRestart(schedule string, done chan struct{}) { - // Try parsing as a time in HH:MM format - if t, err := time.Parse("15:04", schedule); err == nil { - // Valid HH:MM format, schedule daily restart - go scheduleDailyRestart(t, done) - return - } - - // Fallback to parsing as minutes duration - minutesInt, err := strconv.Atoi(schedule) - if err != nil { - logger.Core.Error("Invalid AutoRestartServerTimer format: " + schedule) - return - } - if minutesInt <= 0 { - logger.Core.Error("AutoRestartServerTimer must be a positive number of minutes or valid HH:MM time") - return - } - - ticker := time.NewTicker(time.Duration(minutesInt) * time.Minute) - defer ticker.Stop() - - for { - select { - case <-ticker.C: - mu.Lock() - if !internalIsServerRunningNoLock() { - mu.Unlock() - logger.Core.Info("Auto-restart skipped: server is not running") - return - } - mu.Unlock() - - if config.IsSSCMEnabled { - commandmgr.WriteCommand("say Attention, server is restarting in 30 seconds!") - time.Sleep(10 * time.Second) - commandmgr.WriteCommand("say Attention, server is restarting in 20 seconds!") - time.Sleep(10 * time.Second) - commandmgr.WriteCommand("say Attention, server is restarting in 10 seconds!") - time.Sleep(5 * time.Second) - commandmgr.WriteCommand("say Attention, server is restarting in 5 seconds!") - time.Sleep(5 * time.Second) - } - logger.Core.Info("Auto-restart triggered: stopping server") - if err := InternalStopServer(); err != nil { - logger.Core.Error("Auto-restart failed to stop server: " + err.Error()) - return - } - - logger.Core.Info("Auto-restart: waiting 5 seconds before restarting") - time.Sleep(5 * time.Second) - - logger.Core.Info("Auto-restart: starting server") - if err := InternalStartServer(); err != nil { - logger.Core.Error("Auto-restart failed to start server: " + err.Error()) - return - } - case <-done: - return - } - } -} - -// scheduleDailyRestart schedules a server restart at the specified time of day (HH:MM) every day. -func scheduleDailyRestart(t time.Time, done chan struct{}) { - // Extract hour and minute from the parsed time - hour, min := t.Hour(), t.Minute() - - for { - now := time.Now() - next := time.Date(now.Year(), now.Month(), now.Day(), hour, min, 0, 0, now.Location()) - if now.After(next) || now.Equal(next) { - // If the time is in the past or now, schedule for tomorrow - next = next.Add(24 * time.Hour) - } - duration := next.Sub(now) - - logger.Core.Info(fmt.Sprintf("Scheduled restart at %02d:%02d (in %v)", hour, min, duration)) - - // Wait until the next restart time or until interrupted - timer := time.NewTimer(duration) - select { - case <-timer.C: - mu.Lock() - if !internalIsServerRunningNoLock() { - mu.Unlock() - logger.Core.Info("Auto-restart skipped: server is not running") - continue // Check for the next day's restart - } - mu.Unlock() - - if config.IsSSCMEnabled { - commandmgr.WriteCommand("say Attention, server is restarting in 30 seconds!") - time.Sleep(10 * time.Second) - commandmgr.WriteCommand("say Attention, server is restarting in 20 seconds!") - time.Sleep(10 * time.Second) - commandmgr.WriteCommand("say Attention, server is restarting in 10 seconds!") - time.Sleep(5 * time.Second) - commandmgr.WriteCommand("say Attention, server is restarting in 5 seconds!") - time.Sleep(5 * time.Second) - } - logger.Core.Info("Daily auto-restart triggered: stopping server") - if err := InternalStopServer(); err != nil { - logger.Core.Error("Daily auto-restart failed to stop server: " + err.Error()) - continue - } - - logger.Core.Info("Daily auto-restart: waiting 5 seconds before restarting") - time.Sleep(5 * time.Second) - - logger.Core.Info("Daily auto-restart: starting server") - if err := InternalStartServer(); err != nil { - logger.Core.Error("Daily auto-restart failed to start server: " + err.Error()) - continue - } - case <-done: - timer.Stop() - return - } - } -} - -func clearGameServerUUID() { - config.ConfigMu.Lock() - defer config.ConfigMu.Unlock() - config.GameServerUUID = uuid.Nil -} - -func createGameServerUUID() { - config.ConfigMu.Lock() - defer config.ConfigMu.Unlock() - config.GameServerUUID = uuid.New() -} diff --git a/src/managers/gamemgr/runcheck.go b/src/managers/gamemgr/runcheck.go new file mode 100644 index 00000000..a57734f4 --- /dev/null +++ b/src/managers/gamemgr/runcheck.go @@ -0,0 +1,50 @@ +package gamemgr + +import ( + "runtime" + "syscall" + + "github.com/JacksonTheMaster/StationeersServerUI/v5/src/logger" +) + +// InternalIsServerRunning checks if the server process is running. +// Safe to call standalone as it manages its own locking. +func InternalIsServerRunning() bool { + mu.Lock() + defer mu.Unlock() + return internalIsServerRunningNoLock() +} + +// internalIsServerRunningNoLock checks if the server process is running. +// Caller M U S T hold mu.Lock(). +func internalIsServerRunningNoLock() bool { + if cmd == nil || cmd.Process == nil { + return false + } + + if runtime.GOOS == "windows" { + select { + case <-processExited: + cmd = nil + clearGameServerUUID() + return false + default: + // Process is still running + return true + } + } + + if runtime.GOOS == "linux" { + // On Unix-like systems, use Signal(0) + if err := cmd.Process.Signal(syscall.Signal(0)); err != nil { + logger.Core.Debug("Signal(0) failed, assuming process is dead: " + err.Error()) + cmd = nil + clearGameServerUUID() + return false + } + return true + } + + logger.Core.Warn("Failed to check if server is running, assuming it's dead") + return false +} diff --git a/src/managers/gamemgr/uuid.go b/src/managers/gamemgr/uuid.go new file mode 100644 index 00000000..83938724 --- /dev/null +++ b/src/managers/gamemgr/uuid.go @@ -0,0 +1,18 @@ +package gamemgr + +import ( + "github.com/JacksonTheMaster/StationeersServerUI/v5/src/config" + "github.com/google/uuid" +) + +func clearGameServerUUID() { + config.ConfigMu.Lock() + defer config.ConfigMu.Unlock() + config.GameServerUUID = uuid.Nil +} + +func createGameServerUUID() { + config.ConfigMu.Lock() + defer config.ConfigMu.Unlock() + config.GameServerUUID = uuid.New() +} From 6f1e3c67cccaa884ed18a65f5e08aa189f600b59 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Thu, 28 Aug 2025 13:50:16 +0200 Subject: [PATCH 08/74] added save before auto restart --- src/managers/gamemgr/autorestart.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/managers/gamemgr/autorestart.go b/src/managers/gamemgr/autorestart.go index e2676f9f..087d3d3d 100644 --- a/src/managers/gamemgr/autorestart.go +++ b/src/managers/gamemgr/autorestart.go @@ -54,7 +54,8 @@ func startAutoRestart(schedule string, done chan struct{}) { time.Sleep(10 * time.Second) commandmgr.WriteCommand("say Attention, server is restarting in 20 seconds!") time.Sleep(10 * time.Second) - commandmgr.WriteCommand("say Attention, server is restarting in 10 seconds!") + commandmgr.WriteCommand("say Attention, server is restarting in 10 seconds, saving world now!") + commandmgr.WriteCommand("save") time.Sleep(5 * time.Second) commandmgr.WriteCommand("say Attention, server is restarting in 5 seconds!") time.Sleep(5 * time.Second) @@ -110,7 +111,8 @@ func scheduleDailyRestart(t time.Time, done chan struct{}) { time.Sleep(10 * time.Second) commandmgr.WriteCommand("say Attention, server is restarting in 20 seconds!") time.Sleep(10 * time.Second) - commandmgr.WriteCommand("say Attention, server is restarting in 10 seconds!") + commandmgr.WriteCommand("say Attention, server is restarting in 10 seconds, saving world now!") + commandmgr.WriteCommand("save") time.Sleep(5 * time.Second) commandmgr.WriteCommand("say Attention, server is restarting in 5 seconds!") time.Sleep(5 * time.Second) @@ -121,7 +123,7 @@ func scheduleDailyRestart(t time.Time, done chan struct{}) { continue } - logger.Core.Info("Daily auto-restart: waiting 5 seconds before restarting") + logger.Core.Debug("Daily auto-restart: waiting 5 seconds before restarting") time.Sleep(5 * time.Second) logger.Core.Info("Daily auto-restart: starting server") From 1d804affcefbc3ca0f26e8a6fce3b8ee25119035 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Thu, 28 Aug 2025 14:35:33 +0200 Subject: [PATCH 09/74] detectionmgr: implement singleton getter to get global detector from other packages --- src/managers/detectionmgr/interface.go | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/managers/detectionmgr/interface.go b/src/managers/detectionmgr/interface.go index 0d21c015..e69de392 100644 --- a/src/managers/detectionmgr/interface.go +++ b/src/managers/detectionmgr/interface.go @@ -1,6 +1,8 @@ // interface.go package detectionmgr +import "sync" + /* Code-Public Detection API interface - Exposes simplified interface for external references if needed @@ -11,9 +13,25 @@ Code-Public Detection API interface - State queries (connected players currently) */ -// Start initializes the detector and returns it +var ( + detectorInstance *Detector + once sync.Once +) + +// Start initializes the detector and stores it as the singleton instance func Start() *Detector { - return NewDetector() + once.Do(func() { + detectorInstance = NewDetector() + }) + return detectorInstance +} + +// GetDetector returns the singleton detector instance +func GetDetector() *Detector { + if detectorInstance == nil { + panic("Detector not initialized. Call Start() first.") + } + return detectorInstance } // AddHandler is a convenient method to register a handler for an event type From 6dd90ae1a80f7057cda5ce11b097f8cbf293059b Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Thu, 28 Aug 2025 14:36:05 +0200 Subject: [PATCH 10/74] add http HandleConnectedPlayersList first pass to show connected players on Web UI --- src/web/http.go | 27 +++++++++++++++++++++++++++ src/web/start.go | 1 + 2 files changed, 28 insertions(+) diff --git a/src/web/http.go b/src/web/http.go index b246b933..389ac77d 100644 --- a/src/web/http.go +++ b/src/web/http.go @@ -14,6 +14,7 @@ import ( "github.com/JacksonTheMaster/StationeersServerUI/v5/src/localization" "github.com/JacksonTheMaster/StationeersServerUI/v5/src/logger" "github.com/JacksonTheMaster/StationeersServerUI/v5/src/managers/commandmgr" + "github.com/JacksonTheMaster/StationeersServerUI/v5/src/managers/detectionmgr" "github.com/JacksonTheMaster/StationeersServerUI/v5/src/managers/gamemgr" "github.com/JacksonTheMaster/StationeersServerUI/v5/src/setup" ) @@ -177,3 +178,29 @@ func HandleRunSteamCMD(w http.ResponseWriter, r *http.Request) { // Failure: return 202 Accepted and JSON with the error message json.NewEncoder(w).Encode(map[string]string{"statuscode": "202", "status": "Failed", "message": "SteamCMD ran unsuccessfully:" + err.Error()}) } + +// PrintConnectedPlayersHandler handles HTTP requests to list connected players. +func HandleConnectedPlayersList(w http.ResponseWriter, r *http.Request) { + + // only allow GET requests + if r.Method != http.MethodGet { + http.Error(w, "Only GET requests are allowed", http.StatusMethodNotAllowed) + return + } + + detector := detectionmgr.GetDetector() + players := detectionmgr.GetPlayers(detector) + + playerList := make([]map[string]string, 0, len(players)) + for steamID, username := range players { + playerList = append(playerList, map[string]string{ + "username": username, + "steamID": steamID, + }) + } + + w.Header().Set("Content-Type", "application/json") + if err := json.NewEncoder(w).Encode(playerList); err != nil { + http.Error(w, "Failed to encode player list", http.StatusInternalServerError) + } +} diff --git a/src/web/start.go b/src/web/start.go index 3cfb6b70..4678eae1 100644 --- a/src/web/start.go +++ b/src/web/start.go @@ -51,6 +51,7 @@ func StartWebServer(wg *sync.WaitGroup) { protectedMux.HandleFunc("/api/v2/server/start", StartServer) protectedMux.HandleFunc("/api/v2/server/stop", StopServer) protectedMux.HandleFunc("/api/v2/server/status", GetGameServerRunState) + protectedMux.HandleFunc("/api/v2/server/status/coonnectedplayers", HandleConnectedPlayersList) backupHandler := backupmgr.NewHTTPHandler(backupmgr.GlobalBackupManager) protectedMux.HandleFunc("/api/v2/backups", backupHandler.ListBackupsHandler) From fd38135fd7079bbfaf98bb742e9792d99ab0dc9b Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Thu, 28 Aug 2025 14:51:49 +0200 Subject: [PATCH 11/74] improved backup dir error message --- src/managers/backupmgr/cleanup.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/managers/backupmgr/cleanup.go b/src/managers/backupmgr/cleanup.go index 340e4e3f..55f6de15 100644 --- a/src/managers/backupmgr/cleanup.go +++ b/src/managers/backupmgr/cleanup.go @@ -135,6 +135,10 @@ func (m *BackupManager) getBackupGroups() ([]BackupGroup, error) { return nil }) if err != nil { + // if the error contains no such file or directory, return nil but return a custom string intsted of the error + if strings.Contains(err.Error(), "no such file or directory") { + return nil, fmt.Errorf("save dir doesn't seem to exist (yet). Try starting the gameserver and click ↻ once it's up. If the Save folder exists and you still get this error, verify the 'Use New Terrain and Save System' setting. Detailed Error: %w", err) + } return nil, fmt.Errorf("failed to walk safe backup dir: %w", err) } From 2775522178ea345cafa83ff8fc2c4f2fdfc66ea3 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Thu, 28 Aug 2025 18:59:19 +0200 Subject: [PATCH 12/74] add auto restart time parsing for 12hour format (03:04PM) --- src/managers/gamemgr/autorestart.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/managers/gamemgr/autorestart.go b/src/managers/gamemgr/autorestart.go index 087d3d3d..c02f6030 100644 --- a/src/managers/gamemgr/autorestart.go +++ b/src/managers/gamemgr/autorestart.go @@ -24,6 +24,13 @@ func startAutoRestart(schedule string, done chan struct{}) { return } + // Try parsing as a time in HH:MMAM/PM format + if t, err := time.Parse("03:04PM", schedule); err == nil { + // Valid HH:MMAM/PM format, schedule daily restart + go scheduleDailyRestart(t, done) + return + } + // Fallback to parsing as minutes duration minutesInt, err := strconv.Atoi(schedule) if err != nil { @@ -31,7 +38,7 @@ func startAutoRestart(schedule string, done chan struct{}) { return } if minutesInt <= 0 { - logger.Core.Error("AutoRestartServerTimer must be a positive number of minutes or valid HH:MM time") + logger.Core.Error("AutoRestartServerTimer must be a positive number of minutes or valid HH:MM or HH:MMAM/PM time") return } From 3d95862a58f5429646edac1e742ffb2428b696ce Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Thu, 28 Aug 2025 19:19:43 +0200 Subject: [PATCH 13/74] statically forward 27015 and 27016 (gamserver ports) in devcontainer.json --- .devcontainer/devcontainer.json | 1 + 1 file changed, 1 insertion(+) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index a195b559..cf27c782 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -12,6 +12,7 @@ } }, "forwardPorts": [8443], + "runArgs": ["-p=27015:27015/udp", "-p=27016:27016/udp"], "portsAttributes": { "8443": { "label": "Go Backend Server" } From 333c4640e911481e84326153dbb7ea9990fe4282 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Thu, 28 Aug 2025 20:46:43 +0200 Subject: [PATCH 14/74] fixed detector not correctly tracking players on beta due to logging changes on the Stationeers side --- src/managers/detectionmgr/detector.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/managers/detectionmgr/detector.go b/src/managers/detectionmgr/detector.go index 88191b01..1bced8a6 100644 --- a/src/managers/detectionmgr/detector.go +++ b/src/managers/detectionmgr/detector.go @@ -106,7 +106,7 @@ func (d *Detector) processRegexPatterns(logMessage string) { }{ { // Player ready pattern - pattern: regexp.MustCompile(`Client\s+(.+)\s+\((\d+)\)\s+is\s+ready!`), + pattern: regexp.MustCompile(`Client\s+(.+)\s+\((\d+)\)\s+is\s+ready!?`), handler: func(matches []string, logMessage string) { username := matches[1] steamID := matches[2] @@ -148,7 +148,7 @@ func (d *Detector) processRegexPatterns(logMessage string) { }, { // Player disconnect pattern - pattern: regexp.MustCompile(`Client\s+disconnected:\s+\d+\s+\|\s+(.+)\s+connectTime:\s+\d+,\d+s,\s+ClientId:\s+(\d+)`), + pattern: regexp.MustCompile(`Client\s+disconnected:\s+\d+\s+\|\s+(.+)\s+connectTime:\s+\d+[\.,]\d+s,\s+ClientId:\s+(\d+)`), handler: func(matches []string, logMessage string) { username := matches[1] steamID := matches[2] From 6409cdeccfeb223a284377d7e1ea2e6964589a39 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Thu, 28 Aug 2025 20:58:07 +0200 Subject: [PATCH 15/74] fixed endpoint name for connectedplayers (had used coonnectedplayers but players are NOT raccoons) --- src/web/start.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/web/start.go b/src/web/start.go index 4678eae1..c2bfff4d 100644 --- a/src/web/start.go +++ b/src/web/start.go @@ -51,7 +51,7 @@ func StartWebServer(wg *sync.WaitGroup) { protectedMux.HandleFunc("/api/v2/server/start", StartServer) protectedMux.HandleFunc("/api/v2/server/stop", StopServer) protectedMux.HandleFunc("/api/v2/server/status", GetGameServerRunState) - protectedMux.HandleFunc("/api/v2/server/status/coonnectedplayers", HandleConnectedPlayersList) + protectedMux.HandleFunc("/api/v2/server/status/connectedplayers", HandleConnectedPlayersList) backupHandler := backupmgr.NewHTTPHandler(backupmgr.GlobalBackupManager) protectedMux.HandleFunc("/api/v2/backups", backupHandler.ListBackupsHandler) From 465dd03d80f843920ac3f405f4eb927895f57d0a Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Thu, 28 Aug 2025 21:06:27 +0200 Subject: [PATCH 16/74] update save identifier info on config page and in setup to include specific world types for clarity and user guidance --- UIMod/onboard_bundled/localization/en-US.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/UIMod/onboard_bundled/localization/en-US.json b/UIMod/onboard_bundled/localization/en-US.json index ac8e12ee..39a3a2e4 100644 --- a/UIMod/onboard_bundled/localization/en-US.json +++ b/UIMod/onboard_bundled/localization/en-US.json @@ -30,8 +30,8 @@ "UIText_ServerName": "Server Name", "UIText_ServerNameInfo": "Name displayed in server list", "UIText_SaveFileName": "Save File Name", - "UIText_SaveFileNameInfo": "Name of save folder. Must be capitalized. To create a new world, provide the World type to generate. (MyVulcanMap Vulcan) WorldTypes can be found in the Stationeers Wiki -> Dedicated Server page.", - "UIText_MaxPlayers": "Max Players", + "UIText_MaxPlayers_StepMessage": "Choose the maximum number of players that can connect to the server.", + "UIText_SaveFileNameInfo": "Name of save folder. Must be capitalized. To create a new world, provide the World type to generate. (MyVulcanMap Vulcan) Possible World types: Moon, Mars, Europa, Mimas, Vulcan, Space, Venus -- BETA BRANCH: Mars2, Europa3, MimasHerschel, Vulcan, Venus, Lunar", "UIText_MaxPlayersInfo": "Maximum number of players allowed", "UIText_ServerPassword": "Server Password", "UIText_ServerPasswordInfo": "Leave empty for no password", @@ -139,7 +139,7 @@ "UIText_ServerName_SkipButton": "Skip", "UIText_SaveIdentifier_Title": "Stationeers Server UI", "UIText_SaveIdentifier_HeaderTitle": "Save Identifier Setup", - "UIText_SaveIdentifier_StepMessage": "Set a save identifier like 'SpaceStation13 Vulcan'. Capitalize the first letter of each word. Possible World types can be found in the Stationeers Wiki -> Dedicated Server", + "UIText_SaveIdentifier_StepMessage": "Set a save identifier like 'SpaceStation13 Vulcan'. Capitalize the first letter of each word. Possible World types: Moon, Mars, Europa, Mimas, Vulcan, Space, Venus -- BETA BRANCH: Mars2, Europa3, MimasHerschel, Vulcan, Venus, Lunar", "UIText_SaveIdentifier_PrimaryPlaceholder": "Requires a SaveName and WorldType for first start!", "UIText_SaveIdentifier_PrimaryLabel": "Save Identifier", "UIText_SaveIdentifier_SubmitButton": "Save & Continue", From 85faf1d83b0fd5d037c2754619e3b6b535ad9ebe Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Fri, 29 Aug 2025 03:40:27 +0200 Subject: [PATCH 17/74] improved connected players logic with custom jxsn.dev api to get image URL and moved to own file --- src/web/connectedplayers.go | 109 ++++++++++++++++++++++++++++++++++++ src/web/http.go | 27 --------- 2 files changed, 109 insertions(+), 27 deletions(-) create mode 100644 src/web/connectedplayers.go diff --git a/src/web/connectedplayers.go b/src/web/connectedplayers.go new file mode 100644 index 00000000..df446276 --- /dev/null +++ b/src/web/connectedplayers.go @@ -0,0 +1,109 @@ +package web + +import ( + "encoding/json" + "fmt" + "net/http" + "strings" + + "github.com/JacksonTheMaster/StationeersServerUI/v5/src/config" + "github.com/JacksonTheMaster/StationeersServerUI/v5/src/logger" + "github.com/JacksonTheMaster/StationeersServerUI/v5/src/managers/detectionmgr" +) + +// PrintConnectedPlayersHandler handles HTTP requests to list connected players. +func HandleConnectedPlayersList(w http.ResponseWriter, r *http.Request) { + // Only allow GET requests + if r.Method != http.MethodGet { + http.Error(w, "Only GET requests are allowed", http.StatusMethodNotAllowed) + return + } + + detector := detectionmgr.GetDetector() + players := detectionmgr.GetPlayers(detector) + + // if players is empty, return an empty list + if len(players) == 0 { + w.Header().Set("Content-Type", "application/json") + if err := json.NewEncoder(w).Encode(players); err != nil { + http.Error(w, "Failed to encode player list", http.StatusInternalServerError) + } + return + } + + // Create a comma-separated string of SteamIDs + steamIDs := make([]string, 0, len(players)) + for steamID := range players { + steamIDs = append(steamIDs, steamID) + } + steamIDsStr := strings.Join(steamIDs, ",") + + jxsnDevApiKey := config.JXSNDevApiKey + apiURL := fmt.Sprintf("https://jxsn.dev/api/v1/steamapi/userinfo?steamids=%s&accessval=%s", steamIDsStr, jxsnDevApiKey) + logger.Web.Debug("Fetching player details from external API: " + apiURL) // REMOVE ME + resp, err := http.Get(apiURL) + if err != nil { + http.Error(w, "Failed to fetch player details", http.StatusInternalServerError) + return + } + defer resp.Body.Close() + + // Decode the API response + var apiResponse struct { + Response struct { + Players []struct { + SteamID string `json:"steamid"` + PersonaName string `json:"personaname"` + ProfileURL string `json:"profileurl"` + AvatarMedium string `json:"avatarmedium"` + } `json:"players"` + } `json:"response"` + } + if err := json.NewDecoder(resp.Body).Decode(&apiResponse); err != nil { + http.Error(w, "Failed to decode API response", http.StatusInternalServerError) + return + } + + // Create a map to store API player details by SteamID + apiPlayers := make(map[string]struct { + PersonaName string + ProfileURL string + AvatarMedium string + }) + for _, player := range apiResponse.Response.Players { + apiPlayers[player.SteamID] = struct { + PersonaName string + ProfileURL string + AvatarMedium string + }{ + PersonaName: player.PersonaName, + ProfileURL: player.ProfileURL, + AvatarMedium: player.AvatarMedium, + } + } + + // Build the response player list + playerList := make([]map[string]map[string]string, 0, len(players)) + for steamID, username := range players { + playerInfo := map[string]string{ + "username": username, + "steamID": steamID, + } + // Add API details if available + if apiPlayer, exists := apiPlayers[steamID]; exists { + playerInfo["personaname"] = apiPlayer.PersonaName + playerInfo["profileurl"] = apiPlayer.ProfileURL + playerInfo["avatarmedium"] = apiPlayer.AvatarMedium + playerInfo["steamid"] = steamID + } + nestedPlayer := map[string]map[string]string{ + username: playerInfo, + } + playerList = append(playerList, nestedPlayer) + } + + w.Header().Set("Content-Type", "application/json") + if err := json.NewEncoder(w).Encode(playerList); err != nil { + http.Error(w, "Failed to encode player list", http.StatusInternalServerError) + } +} diff --git a/src/web/http.go b/src/web/http.go index 389ac77d..b246b933 100644 --- a/src/web/http.go +++ b/src/web/http.go @@ -14,7 +14,6 @@ import ( "github.com/JacksonTheMaster/StationeersServerUI/v5/src/localization" "github.com/JacksonTheMaster/StationeersServerUI/v5/src/logger" "github.com/JacksonTheMaster/StationeersServerUI/v5/src/managers/commandmgr" - "github.com/JacksonTheMaster/StationeersServerUI/v5/src/managers/detectionmgr" "github.com/JacksonTheMaster/StationeersServerUI/v5/src/managers/gamemgr" "github.com/JacksonTheMaster/StationeersServerUI/v5/src/setup" ) @@ -178,29 +177,3 @@ func HandleRunSteamCMD(w http.ResponseWriter, r *http.Request) { // Failure: return 202 Accepted and JSON with the error message json.NewEncoder(w).Encode(map[string]string{"statuscode": "202", "status": "Failed", "message": "SteamCMD ran unsuccessfully:" + err.Error()}) } - -// PrintConnectedPlayersHandler handles HTTP requests to list connected players. -func HandleConnectedPlayersList(w http.ResponseWriter, r *http.Request) { - - // only allow GET requests - if r.Method != http.MethodGet { - http.Error(w, "Only GET requests are allowed", http.StatusMethodNotAllowed) - return - } - - detector := detectionmgr.GetDetector() - players := detectionmgr.GetPlayers(detector) - - playerList := make([]map[string]string, 0, len(players)) - for steamID, username := range players { - playerList = append(playerList, map[string]string{ - "username": username, - "steamID": steamID, - }) - } - - w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(playerList); err != nil { - http.Error(w, "Failed to encode player list", http.StatusInternalServerError) - } -} From e985fd2f65d2166427faa242920e3e99989553e2 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Fri, 29 Aug 2025 03:41:36 +0200 Subject: [PATCH 18/74] added JXSNDevApiKey config field and en localization keys, added to UI as well --- UIMod/onboard_bundled/ui/config.html | 7 +++++++ src/config/config.go | 2 ++ src/config/vars.go | 1 + src/web/configpage.go | 3 +++ src/web/templatevars.go | 3 +++ 5 files changed, 16 insertions(+) diff --git a/UIMod/onboard_bundled/ui/config.html b/UIMod/onboard_bundled/ui/config.html index 66726b04..10596fd8 100644 --- a/UIMod/onboard_bundled/ui/config.html +++ b/UIMod/onboard_bundled/ui/config.html @@ -234,6 +234,13 @@

{{.UIText_AdvancedConfiguration}}

{{.UIText_AutoStartServerOnStartupInfo}}
+ +
+ + +
{{.UIText_JXSNDevApiKeyInfo}}
+
diff --git a/src/config/config.go b/src/config/config.go index 2f592b5b..b8590599 100644 --- a/src/config/config.go +++ b/src/config/config.go @@ -76,6 +76,7 @@ type JsonConfig struct { AutoStartServerOnStartup *bool `json:"AutoStartServerOnStartup"` AdditionalLoginHeaderText string `json:"AdditionalLoginHeaderText"` SSUIWebPort string `json:"SSUIWebPort"` + JXSNDevApiKey string `json:"JXSNDevApiKey"` } type CustomDetection struct { @@ -127,6 +128,7 @@ func applyConfig(cfg *JsonConfig) { ControlPanelChannelID = getString(cfg.ControlPanelChannelID, "CONTROL_PANEL_CHANNEL_ID", "") DiscordCharBufferSize = getInt(cfg.DiscordCharBufferSize, "DISCORD_CHAR_BUFFER_SIZE", 1000) BlackListFilePath = getString(cfg.BlackListFilePath, "BLACKLIST_FILE_PATH", "./Blacklist.txt") + JXSNDevApiKey = getString(cfg.JXSNDevApiKey, "JXSN_DEV_API_KEY", "") isDiscordEnabledVal := getBool(cfg.IsDiscordEnabled, "IS_DISCORD_ENABLED", false) IsDiscordEnabled = isDiscordEnabledVal diff --git a/src/config/vars.go b/src/config/vars.go index 26df6c36..aadc8db7 100644 --- a/src/config/vars.go +++ b/src/config/vars.go @@ -111,6 +111,7 @@ var ( AuthTokenLifetime int Users map[string]string SSUIWebPort string + JXSNDevApiKey string ) // SSUI Updates diff --git a/src/web/configpage.go b/src/web/configpage.go index f66e65ef..52ca834b 100644 --- a/src/web/configpage.go +++ b/src/web/configpage.go @@ -149,6 +149,7 @@ func ServeConfigPage(w http.ResponseWriter, r *http.Request) { ExePath: config.ExePath, AdditionalParams: config.AdditionalParams, AutoRestartServerTimer: config.AutoRestartServerTimer, + JXSNDevApiKey: config.JXSNDevApiKey, IsNewTerrainAndSaveSystem: fmt.Sprintf("%v", config.IsNewTerrainAndSaveSystem), IsNewTerrainAndSaveSystemTrueSelected: isNewTerrainAndSaveSystemTrueSelected, IsNewTerrainAndSaveSystemFalseSelected: isNewTerrainAndSaveSystemFalseSelected, @@ -224,6 +225,8 @@ func ServeConfigPage(w http.ResponseWriter, r *http.Request) { UIText_StartLocationInfo: localization.GetString("UIText_StartLocationInfo"), UIText_AutoStartServerOnStartup: localization.GetString("UIText_AutoStartServerOnStartup"), UIText_AutoStartServerOnStartupInfo: localization.GetString("UIText_AutoStartServerOnStartupInfo"), + UIText_JXSNDevApiKey: localization.GetString("UIText_JXSNDevApiKey"), + UIText_JXSNDevApiKeyInfo: localization.GetString("UIText_JXSNDevApiKeyInfo"), UIText_DiscordIntegrationTitle: localization.GetString("UIText_DiscordIntegrationTitle"), UIText_DiscordBotToken: localization.GetString("UIText_DiscordBotToken"), diff --git a/src/web/templatevars.go b/src/web/templatevars.go index 5b02f10e..35e659c4 100644 --- a/src/web/templatevars.go +++ b/src/web/templatevars.go @@ -67,6 +67,7 @@ type ConfigTemplateData struct { ExePath string AdditionalParams string AutoRestartServerTimer string + JXSNDevApiKey string IsNewTerrainAndSaveSystem string IsNewTerrainAndSaveSystemTrueSelected string IsNewTerrainAndSaveSystemFalseSelected string @@ -141,6 +142,8 @@ type ConfigTemplateData struct { UIText_StartLocationInfo string UIText_AutoStartServerOnStartup string UIText_AutoStartServerOnStartupInfo string + UIText_JXSNDevApiKey string + UIText_JXSNDevApiKeyInfo string UIText_DiscordIntegrationTitle string UIText_DiscordBotToken string From 11e5dda7f5da6f2c26dfb5d46b3330d3c8b16e50 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Fri, 29 Aug 2025 17:12:16 +0200 Subject: [PATCH 19/74] skip CleanUpOldExecutables when debug is true --- UIMod/onboard_bundled/assets/css/home.css | 52 +++++++++++++++++++++++ src/setup/cleanup.go | 2 +- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/UIMod/onboard_bundled/assets/css/home.css b/UIMod/onboard_bundled/assets/css/home.css index 76b86a83..10fc3fde 100644 --- a/UIMod/onboard_bundled/assets/css/home.css +++ b/UIMod/onboard_bundled/assets/css/home.css @@ -217,6 +217,58 @@ transform: translateY(-2px); } +/* Players */ +#players { + position: relative; + margin-top: 40px; + background-color: rgba(0, 255, 171, 0.05); + padding: 20px; + border-radius: 8px; + border: 1px solid rgba(0, 255, 171, 0.3); + transition: transform var(--transition-normal); +} + +#players:hover { + transform: translateY(-2px); +} + +#playerListRefreshButton { + position: absolute; + top: 20px; + right: 20px; + padding: 5px 10px; + font-size: 1.3rem; + width: 40px; + height: 40px; + display: flex; + align-items: center; + justify-content: center; +} + +.player-item { + background-color: rgba(0, 0, 0, 0.4); + padding: 15px; + margin-bottom: 15px; + border-radius: 8px; + display: flex; + justify-content: space-between; + align-items: center; + border: 2px solid rgba(0, 255, 171, 0.5); + transition: all var(--transition-normal); + line-height: 1.6; +} + +.player-item:hover, .player-item.animate-in:hover { + background-color: rgba(0, 0, 0, 0.6); + border-color: var(--primary); + transform: translateX(5px); +} + +.player-item.animate-in { + animation: slideIn 0.5s ease-out forwards; +} + +/* Backups */ #backupRefreshButton { position: absolute; top: 20px; diff --git a/src/setup/cleanup.go b/src/setup/cleanup.go index dde1e310..eb052677 100644 --- a/src/setup/cleanup.go +++ b/src/setup/cleanup.go @@ -68,7 +68,7 @@ func CleanUpOldUIModFolderFiles() error { func CleanUpOldExecutables() error { // Exit early if update is disabled to allow running old versions if needed - if !config.IsUpdateEnabled { + if !config.IsUpdateEnabled || config.IsDebugMode { return nil } currentBackendVersion := config.Version From e68785d1819625f32c42bfd622f0ecf42a618d27 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Fri, 29 Aug 2025 17:17:35 +0200 Subject: [PATCH 20/74] ignore Fallback handler could not load library errors (probably race condition (Stationeers / Bepinex) but no effect on server so can be ignored --- src/core/ssestream/ssemanager.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/ssestream/ssemanager.go b/src/core/ssestream/ssemanager.go index 17203976..34b927bf 100644 --- a/src/core/ssestream/ssemanager.go +++ b/src/core/ssestream/ssemanager.go @@ -140,6 +140,7 @@ func (m *SSEManager) excludeClutterLogs(message string) bool { "memorysetup": true, "Microsoft Media Foundation video decoding": true, "The referenced script on this Behaviour": true, + "Fallback handler could not load library": true, } // Check if message contains any of the drop messages From 5f403f0374082ff9bbb387cf3902913750a66ae4 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Sat, 30 Aug 2025 08:38:24 +0200 Subject: [PATCH 21/74] fixed restore to now properly edit the DateTime element in world_meta to make the gameserver load the correct save when restoring saves. --- src/managers/backupmgr/restore.go | 39 +++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/src/managers/backupmgr/restore.go b/src/managers/backupmgr/restore.go index f02a1046..bfb30090 100644 --- a/src/managers/backupmgr/restore.go +++ b/src/managers/backupmgr/restore.go @@ -6,6 +6,7 @@ import ( "io" "os" "path/filepath" + "regexp" "strings" "time" @@ -66,7 +67,7 @@ func (m *BackupManager) RestoreBackup(index int) error { } } - // Create temp directory for mod time shenenigans (https://discordapp.com/channels/276525882049429515/392080751648178188/1407157281606336602) + // Create temp directory for mod time shenanigans (https://discordapp.com/channels/276525882049429515/392080751648178188/1407157281606336602) tempDir := filepath.Join("./saves", m.config.WorldName, "tmp") if err := os.MkdirAll(tempDir, os.ModePerm); err != nil { return fmt.Errorf("failed to create temp directory %s: %w", tempDir, err) @@ -118,8 +119,42 @@ func (m *BackupManager) RestoreBackup(index int) error { outFile.Close() } - // Modify timestamps of extracted files to current system time + // Update world_meta.xml DateTime with current Windows file time using regex now := time.Now() + metaFilePath := filepath.Join(tempDir, "world_meta.xml") + if _, err := os.Stat(metaFilePath); err == nil { + // Read world_meta.xml + data, err := os.ReadFile(metaFilePath) + if err != nil { + m.revertRestore(restoredFiles) + return fmt.Errorf("failed to read world_meta.xml: %w", err) + } + + // Calculate Windows file time + const windowsEpochToUnixEpoch = 116444736000000000 // 100-ns intervals from 1601 to 1970 + windowsFileTime := now.UnixNano()/100 + windowsEpochToUnixEpoch + + re, err := regexp.Compile(`\d+`) + if err != nil { + m.revertRestore(restoredFiles) + return fmt.Errorf("failed to compile DateTime regex: %w", err) + } + newDateTime := fmt.Sprintf("%d", windowsFileTime) + updatedData := re.ReplaceAll(data, []byte(newDateTime)) + + if !re.Match(data) { + logger.Backup.Warn("Restore: DateTime element not found in world_meta.xml, proceeding without updating. Server might not load correct save.") + } else { + if err := os.WriteFile(metaFilePath, updatedData, 0644); err != nil { + m.revertRestore(restoredFiles) + return fmt.Errorf("failed to write updated world_meta.xml: %w", err) + } + } + } else { + logger.Backup.Warn("world_meta.xml not found in extracted files, proceeding without updating DateTime") + } + + // Modify timestamps of extracted files to current system time if err := filepath.Walk(tempDir, func(path string, info os.FileInfo, err error) error { if err != nil { return err From ae31542bcac9210c4e87cd9f2530220eb76dc8f7 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Sat, 30 Aug 2025 08:43:30 +0200 Subject: [PATCH 22/74] moved SSCM Head save after WaitTime sleep in backupmanager --- src/managers/backupmgr/manager.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/managers/backupmgr/manager.go b/src/managers/backupmgr/manager.go index 390daf87..b1ba7b42 100644 --- a/src/managers/backupmgr/manager.go +++ b/src/managers/backupmgr/manager.go @@ -128,19 +128,20 @@ func (m *BackupManager) handleNewBackup(filePath string) { return } - if config.IsSSCMEnabled && config.IsNewTerrainAndSaveSystem { - commandmgr.WriteCommand("SAVE") - logger.Backup.Info("HEAD Save triggered via SSCM") - } else { - logger.Backup.Info("HEAD Save NOT refreshed via SSCM") - } - m.wg.Add(1) go func() { defer m.wg.Done() time.Sleep(m.config.WaitTime) + // save the world into Head save too if SSCM is enabled + if config.IsSSCMEnabled && config.IsNewTerrainAndSaveSystem { + commandmgr.WriteCommand("SAVE") + logger.Backup.Debug("HEAD Save triggered via SSCM") + } else { + logger.Backup.Debug("HEAD Save NOT refreshed via SSCM") + } + m.mu.Lock() defer m.mu.Unlock() From f45bc1046fc69ffa490aaddebde2cfe6847e192c Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Sat, 30 Aug 2025 08:45:48 +0200 Subject: [PATCH 23/74] updated Backup successfully copied to safe location log message to print on debug layer instead --- src/managers/backupmgr/manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/managers/backupmgr/manager.go b/src/managers/backupmgr/manager.go index b1ba7b42..c7e855eb 100644 --- a/src/managers/backupmgr/manager.go +++ b/src/managers/backupmgr/manager.go @@ -163,7 +163,7 @@ func (m *BackupManager) handleNewBackup(filePath string) { return } - logger.Backup.Info("Backup successfully copied to safe location: " + dstPath) + logger.Backup.Debug("Backup successfully copied to safe location: " + dstPath) }() } From 4de2c89aa6440ddb999ee4276481a63c87adb152 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Sat, 30 Aug 2025 09:23:46 +0200 Subject: [PATCH 24/74] - Added connected players list to webUI - Added styling and automatic fetch at server startup (removed JXSN.dev Steam fetching api implementations again due to misuse considerations brough up by @mitoskalandiel) - Added PlayerImages with Stationeers characters instead --- UIMod/onboard_bundled/assets/css/home.css | 25 +++++++ UIMod/onboard_bundled/assets/js/main.js | 1 + UIMod/onboard_bundled/assets/js/server-api.js | 69 +++++++++++++++++++ UIMod/onboard_bundled/localization/en-US.json | 1 + UIMod/onboard_bundled/ui/config.html | 7 -- UIMod/onboard_bundled/ui/index.html | 6 ++ src/config/config.go | 2 - src/config/vars.go | 1 - src/web/configpage.go | 3 - src/web/connectedplayers.go | 56 --------------- src/web/indexpage.go | 27 ++++---- src/web/templatevars.go | 30 ++++---- 12 files changed, 130 insertions(+), 98 deletions(-) diff --git a/UIMod/onboard_bundled/assets/css/home.css b/UIMod/onboard_bundled/assets/css/home.css index 10fc3fde..e7df5cfb 100644 --- a/UIMod/onboard_bundled/assets/css/home.css +++ b/UIMod/onboard_bundled/assets/css/home.css @@ -268,6 +268,31 @@ animation: slideIn 0.5s ease-out forwards; } +.player-content { + display: flex; + align-items: center; + gap: 15px; +} + +.player-avatar { + width: 40px; + height: 40px; + border-radius: 50%; + cursor: pointer; + transition: transform 0.2s; + object-fit: cover; + object-position: center; +} + +.player-avatar:hover { + transform: scale(1.1); +} + +.player-name { + font-size: 1.1rem; + color: #fff; +} + /* Backups */ #backupRefreshButton { position: absolute; diff --git a/UIMod/onboard_bundled/assets/js/main.js b/UIMod/onboard_bundled/assets/js/main.js index bba910b8..1cbba8c2 100644 --- a/UIMod/onboard_bundled/assets/js/main.js +++ b/UIMod/onboard_bundled/assets/js/main.js @@ -12,6 +12,7 @@ document.addEventListener('DOMContentLoaded', () => { setupTabs(); fetchDetectionEvents(); fetchBackups(); + fetchPlayers(); handleConsole(); pollServerStatus(); if (animationState != 'disabled') { diff --git a/UIMod/onboard_bundled/assets/js/server-api.js b/UIMod/onboard_bundled/assets/js/server-api.js index f7300812..59603a06 100644 --- a/UIMod/onboard_bundled/assets/js/server-api.js +++ b/UIMod/onboard_bundled/assets/js/server-api.js @@ -68,6 +68,75 @@ function fetchBackups() { .catch(err => console.error("Failed to fetch backups:", err)); } +function fetchPlayers() { + const playersDiv = document.getElementById('players'); + const playerList = document.getElementById('playerList'); + + const playerImages = [ + "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/2089290/ss_5ccc7eafd0d54f887595b688d008debf7dd3c398.600x338.jpg?t=1658208343", + "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/2089290/ss_178b7c3190794ee5bcf93a63536c4e4f5fae747d.600x338.jpg?t=1658208343", + "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/2089290/ss_25dc8c613e7507d1215f27884866b37279c66f99.600x338.jpg?t=1658208343", + "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/2089290/ss_d8a6ff6c070a6f6a51730797640b6f698b226b51.600x338.jpg?t=1658208343", + "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1038500/ss_adc371d38cd1dcdd268bd7907ff1473615779ad8.600x338.jpg?t=1693478415" + ]; + + fetch('/api/v2/server/status/connectedplayers') + .then(response => response.json()) + .then(data => { + playerList.innerHTML = ''; + + if (!data || data.length === 0) { + playersDiv.style.display = 'none'; + return; + } + + playersDiv.style.display = 'block'; + let animationCount = 0; + data.forEach(playerObj => { + const player = Object.values(playerObj)[0]; + const li = document.createElement('li'); + li.className = 'player-item'; + + // Create player item content + const playerContent = document.createElement('div'); + playerContent.className = 'player-content'; + + // Avatar + const avatar = document.createElement('img'); + // Use player avatar or random fallback + avatar.src = playerImages[Math.floor(Math.random() * playerImages.length)]; + avatar.alt = `${player.username}'s avatar`; + avatar.className = 'player-avatar'; + avatar.title = player.steamID; + avatar.addEventListener('click', () => { + window.open(`https://steamcommunity.com/profiles/${player.steamID}`, '_blank'); + }); + + const name = document.createElement('span'); + name.textContent = player.username; + name.className = 'player-name'; + + playerContent.appendChild(avatar); + playerContent.appendChild(name); + li.appendChild(playerContent); + playerList.appendChild(li); + + // Animation + if (animationCount < 20) { + setTimeout(() => { + li.classList.add('animate-in'); + }, animationCount * 100); + animationCount++; + } + }); + }) + .catch(err => { + console.error("Failed to fetch players:", err); + playersDiv.style.display = 'none'; + playerList.textContent = 'Error loading players.'; + }); +} + function extractIndex(backupText) { return backupText.match(/Index: (\d+)/)?.[1] || null; } diff --git a/UIMod/onboard_bundled/localization/en-US.json b/UIMod/onboard_bundled/localization/en-US.json index 39a3a2e4..e64648eb 100644 --- a/UIMod/onboard_bundled/localization/en-US.json +++ b/UIMod/onboard_bundled/localization/en-US.json @@ -8,6 +8,7 @@ "UIText_Console": "Console", "UIText_Detection_Events": "Detection Events", "UIText_Backup_Manager": "Backup Manager", + "UIText_Connected_PlayersHeader": "Connected Players", "UIText_Discord_Info": "Join the Discord and help make SSUI better or get support!", "UIText_API_Info": "API Endpoint Reference", "UIText_Copyright": "Copyright", diff --git a/UIMod/onboard_bundled/ui/config.html b/UIMod/onboard_bundled/ui/config.html index 10596fd8..66726b04 100644 --- a/UIMod/onboard_bundled/ui/config.html +++ b/UIMod/onboard_bundled/ui/config.html @@ -234,13 +234,6 @@

{{.UIText_AdvancedConfiguration}}

{{.UIText_AutoStartServerOnStartupInfo}}
- -
- - -
{{.UIText_JXSNDevApiKeyInfo}}
-
diff --git a/UIMod/onboard_bundled/ui/index.html b/UIMod/onboard_bundled/ui/index.html index d6b14440..310a6771 100644 --- a/UIMod/onboard_bundled/ui/index.html +++ b/UIMod/onboard_bundled/ui/index.html @@ -59,6 +59,12 @@

Stationeers Server UI v{{.Version}} ({{.Branch}})

+
+

{{.UIText_Connected_PlayersHeader}}

+ +
    +
    +

    {{.UIText_Backup_Manager}}

    diff --git a/src/config/config.go b/src/config/config.go index b8590599..2f592b5b 100644 --- a/src/config/config.go +++ b/src/config/config.go @@ -76,7 +76,6 @@ type JsonConfig struct { AutoStartServerOnStartup *bool `json:"AutoStartServerOnStartup"` AdditionalLoginHeaderText string `json:"AdditionalLoginHeaderText"` SSUIWebPort string `json:"SSUIWebPort"` - JXSNDevApiKey string `json:"JXSNDevApiKey"` } type CustomDetection struct { @@ -128,7 +127,6 @@ func applyConfig(cfg *JsonConfig) { ControlPanelChannelID = getString(cfg.ControlPanelChannelID, "CONTROL_PANEL_CHANNEL_ID", "") DiscordCharBufferSize = getInt(cfg.DiscordCharBufferSize, "DISCORD_CHAR_BUFFER_SIZE", 1000) BlackListFilePath = getString(cfg.BlackListFilePath, "BLACKLIST_FILE_PATH", "./Blacklist.txt") - JXSNDevApiKey = getString(cfg.JXSNDevApiKey, "JXSN_DEV_API_KEY", "") isDiscordEnabledVal := getBool(cfg.IsDiscordEnabled, "IS_DISCORD_ENABLED", false) IsDiscordEnabled = isDiscordEnabledVal diff --git a/src/config/vars.go b/src/config/vars.go index aadc8db7..26df6c36 100644 --- a/src/config/vars.go +++ b/src/config/vars.go @@ -111,7 +111,6 @@ var ( AuthTokenLifetime int Users map[string]string SSUIWebPort string - JXSNDevApiKey string ) // SSUI Updates diff --git a/src/web/configpage.go b/src/web/configpage.go index 52ca834b..f66e65ef 100644 --- a/src/web/configpage.go +++ b/src/web/configpage.go @@ -149,7 +149,6 @@ func ServeConfigPage(w http.ResponseWriter, r *http.Request) { ExePath: config.ExePath, AdditionalParams: config.AdditionalParams, AutoRestartServerTimer: config.AutoRestartServerTimer, - JXSNDevApiKey: config.JXSNDevApiKey, IsNewTerrainAndSaveSystem: fmt.Sprintf("%v", config.IsNewTerrainAndSaveSystem), IsNewTerrainAndSaveSystemTrueSelected: isNewTerrainAndSaveSystemTrueSelected, IsNewTerrainAndSaveSystemFalseSelected: isNewTerrainAndSaveSystemFalseSelected, @@ -225,8 +224,6 @@ func ServeConfigPage(w http.ResponseWriter, r *http.Request) { UIText_StartLocationInfo: localization.GetString("UIText_StartLocationInfo"), UIText_AutoStartServerOnStartup: localization.GetString("UIText_AutoStartServerOnStartup"), UIText_AutoStartServerOnStartupInfo: localization.GetString("UIText_AutoStartServerOnStartupInfo"), - UIText_JXSNDevApiKey: localization.GetString("UIText_JXSNDevApiKey"), - UIText_JXSNDevApiKeyInfo: localization.GetString("UIText_JXSNDevApiKeyInfo"), UIText_DiscordIntegrationTitle: localization.GetString("UIText_DiscordIntegrationTitle"), UIText_DiscordBotToken: localization.GetString("UIText_DiscordBotToken"), diff --git a/src/web/connectedplayers.go b/src/web/connectedplayers.go index df446276..295a8585 100644 --- a/src/web/connectedplayers.go +++ b/src/web/connectedplayers.go @@ -2,12 +2,8 @@ package web import ( "encoding/json" - "fmt" "net/http" - "strings" - "github.com/JacksonTheMaster/StationeersServerUI/v5/src/config" - "github.com/JacksonTheMaster/StationeersServerUI/v5/src/logger" "github.com/JacksonTheMaster/StationeersServerUI/v5/src/managers/detectionmgr" ) @@ -36,51 +32,6 @@ func HandleConnectedPlayersList(w http.ResponseWriter, r *http.Request) { for steamID := range players { steamIDs = append(steamIDs, steamID) } - steamIDsStr := strings.Join(steamIDs, ",") - - jxsnDevApiKey := config.JXSNDevApiKey - apiURL := fmt.Sprintf("https://jxsn.dev/api/v1/steamapi/userinfo?steamids=%s&accessval=%s", steamIDsStr, jxsnDevApiKey) - logger.Web.Debug("Fetching player details from external API: " + apiURL) // REMOVE ME - resp, err := http.Get(apiURL) - if err != nil { - http.Error(w, "Failed to fetch player details", http.StatusInternalServerError) - return - } - defer resp.Body.Close() - - // Decode the API response - var apiResponse struct { - Response struct { - Players []struct { - SteamID string `json:"steamid"` - PersonaName string `json:"personaname"` - ProfileURL string `json:"profileurl"` - AvatarMedium string `json:"avatarmedium"` - } `json:"players"` - } `json:"response"` - } - if err := json.NewDecoder(resp.Body).Decode(&apiResponse); err != nil { - http.Error(w, "Failed to decode API response", http.StatusInternalServerError) - return - } - - // Create a map to store API player details by SteamID - apiPlayers := make(map[string]struct { - PersonaName string - ProfileURL string - AvatarMedium string - }) - for _, player := range apiResponse.Response.Players { - apiPlayers[player.SteamID] = struct { - PersonaName string - ProfileURL string - AvatarMedium string - }{ - PersonaName: player.PersonaName, - ProfileURL: player.ProfileURL, - AvatarMedium: player.AvatarMedium, - } - } // Build the response player list playerList := make([]map[string]map[string]string, 0, len(players)) @@ -89,13 +40,6 @@ func HandleConnectedPlayersList(w http.ResponseWriter, r *http.Request) { "username": username, "steamID": steamID, } - // Add API details if available - if apiPlayer, exists := apiPlayers[steamID]; exists { - playerInfo["personaname"] = apiPlayer.PersonaName - playerInfo["profileurl"] = apiPlayer.ProfileURL - playerInfo["avatarmedium"] = apiPlayer.AvatarMedium - playerInfo["steamid"] = steamID - } nestedPlayer := map[string]map[string]string{ username: playerInfo, } diff --git a/src/web/indexpage.go b/src/web/indexpage.go index 1741493d..66da20af 100644 --- a/src/web/indexpage.go +++ b/src/web/indexpage.go @@ -25,19 +25,20 @@ func ServeIndex(w http.ResponseWriter, r *http.Request) { } data := IndexTemplateData{ - Version: config.Version, - Branch: config.Branch, - UIText_StartButton: localization.GetString("UIText_StartButton"), - UIText_StopButton: localization.GetString("UIText_StopButton"), - UIText_Settings: localization.GetString("UIText_Settings"), - UIText_Update_SteamCMD: localization.GetString("UIText_Update_SteamCMD"), - UIText_Console: localization.GetString("UIText_Console"), - UIText_Detection_Events: localization.GetString("UIText_Detection_Events"), - UIText_Backup_Manager: localization.GetString("UIText_Backup_Manager"), - UIText_Discord_Info: localization.GetString("UIText_Discord_Info"), - UIText_API_Info: localization.GetString("UIText_API_Info"), - UIText_Copyright1: localization.GetString("UIText_Copyright1"), - UIText_Copyright2: localization.GetString("UIText_Copyright2"), + Version: config.Version, + Branch: config.Branch, + UIText_StartButton: localization.GetString("UIText_StartButton"), + UIText_StopButton: localization.GetString("UIText_StopButton"), + UIText_Settings: localization.GetString("UIText_Settings"), + UIText_Update_SteamCMD: localization.GetString("UIText_Update_SteamCMD"), + UIText_Console: localization.GetString("UIText_Console"), + UIText_Detection_Events: localization.GetString("UIText_Detection_Events"), + UIText_Backup_Manager: localization.GetString("UIText_Backup_Manager"), + UIText_Connected_PlayersHeader: localization.GetString("UIText_Connected_PlayersHeader"), + UIText_Discord_Info: localization.GetString("UIText_Discord_Info"), + UIText_API_Info: localization.GetString("UIText_API_Info"), + UIText_Copyright1: localization.GetString("UIText_Copyright1"), + UIText_Copyright2: localization.GetString("UIText_Copyright2"), } if data.Version == "" { data.Version = "unknown" diff --git a/src/web/templatevars.go b/src/web/templatevars.go index 35e659c4..3b25410a 100644 --- a/src/web/templatevars.go +++ b/src/web/templatevars.go @@ -2,19 +2,20 @@ package web // TemplateData holds data to be passed to templates type IndexTemplateData struct { - Version string - Branch string - UIText_StartButton string - UIText_StopButton string - UIText_Settings string - UIText_Update_SteamCMD string - UIText_Console string - UIText_Detection_Events string - UIText_Backup_Manager string - UIText_Discord_Info string - UIText_API_Info string - UIText_Copyright1 string - UIText_Copyright2 string + Version string + Branch string + UIText_StartButton string + UIText_StopButton string + UIText_Settings string + UIText_Update_SteamCMD string + UIText_Console string + UIText_Detection_Events string + UIText_Backup_Manager string + UIText_Connected_PlayersHeader string + UIText_Discord_Info string + UIText_API_Info string + UIText_Copyright1 string + UIText_Copyright2 string } // ConfigTemplateData holds data for the config page template @@ -67,7 +68,6 @@ type ConfigTemplateData struct { ExePath string AdditionalParams string AutoRestartServerTimer string - JXSNDevApiKey string IsNewTerrainAndSaveSystem string IsNewTerrainAndSaveSystemTrueSelected string IsNewTerrainAndSaveSystemFalseSelected string @@ -142,8 +142,6 @@ type ConfigTemplateData struct { UIText_StartLocationInfo string UIText_AutoStartServerOnStartup string UIText_AutoStartServerOnStartupInfo string - UIText_JXSNDevApiKey string - UIText_JXSNDevApiKeyInfo string UIText_DiscordIntegrationTitle string UIText_DiscordBotToken string From 7a4803f9952156ee4367b4f43538b2285c6c1a94 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Sat, 30 Aug 2025 09:36:12 +0200 Subject: [PATCH 25/74] automatically fetch backups and connected players. Backups fetch every 30 sec, players every 10 sec. --- UIMod/onboard_bundled/assets/js/main.js | 2 +- UIMod/onboard_bundled/assets/js/server-api.js | 23 +++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/UIMod/onboard_bundled/assets/js/main.js b/UIMod/onboard_bundled/assets/js/main.js index 1cbba8c2..17b193d3 100644 --- a/UIMod/onboard_bundled/assets/js/main.js +++ b/UIMod/onboard_bundled/assets/js/main.js @@ -14,7 +14,7 @@ document.addEventListener('DOMContentLoaded', () => { fetchBackups(); fetchPlayers(); handleConsole(); - pollServerStatus(); + pollRecurringTasks(); if (animationState != 'disabled') { // Create planets with size, orbit radius, speed, and color const planetContainer = document.getElementById('planet-container'); diff --git a/UIMod/onboard_bundled/assets/js/server-api.js b/UIMod/onboard_bundled/assets/js/server-api.js index 59603a06..e8d7ffb5 100644 --- a/UIMod/onboard_bundled/assets/js/server-api.js +++ b/UIMod/onboard_bundled/assets/js/server-api.js @@ -154,8 +154,10 @@ function restoreBackup(index) { .catch(err => console.error(`Failed to restore backup ${index}:`, err)); } -function pollServerStatus() { +function pollRecurringTasks() { window.gamserverstate = false; + + // Poll server status every 3.5 seconds const statusInterval = setInterval(() => { fetch('/api/v2/server/status') .then(response => response.json()) @@ -169,10 +171,23 @@ function pollServerStatus() { console.error("Failed to fetch server status:", err); updateStatusIndicator(false, true); // Set error state }); - }, 3500); // Poll every 3.5 seconds (adjusted from 1000 to reduce server load checking the status each time) + }, 3500); + + // Poll connectred players every 10 seconds + const playersInterval = setInterval(() => { + fetchPlayers() + .catch(err => { + console.error("Failed to fetch connectedplayers:", err); + }); + }, 10000); - // Store the interval ID so we can clear it if needed - window.statusPollingInterval = statusInterval; + // Poll backups every 30 seconds + const backupsInterval = setInterval(() => { + fetchBackups() + .catch(err => { + console.error("Failed to fetch backups:", err); + }); + }, 30000); } function updateStatusIndicator(isRunning, isError = false) { From 3ad4f63bbd707694a52debfaa17e1c68a7d6971c Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Sat, 30 Aug 2025 09:48:08 +0200 Subject: [PATCH 26/74] bump version to v5.6.1 --- src/config/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/config.go b/src/config/config.go index 2f592b5b..bca27623 100644 --- a/src/config/config.go +++ b/src/config/config.go @@ -11,7 +11,7 @@ import ( var ( // All configuration variables can be found in vars.go - Version = "5.5.9" + Version = "5.6.1" Branch = "release" ) From 5dde649a053e9eae5939c13e1ef7fa4fe47dfa05 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Sat, 30 Aug 2025 09:53:44 +0200 Subject: [PATCH 27/74] persist assigned image for players until next page reload --- UIMod/onboard_bundled/assets/js/server-api.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/UIMod/onboard_bundled/assets/js/server-api.js b/UIMod/onboard_bundled/assets/js/server-api.js index e8d7ffb5..d494b3de 100644 --- a/UIMod/onboard_bundled/assets/js/server-api.js +++ b/UIMod/onboard_bundled/assets/js/server-api.js @@ -103,8 +103,13 @@ function fetchPlayers() { // Avatar const avatar = document.createElement('img'); - // Use player avatar or random fallback - avatar.src = playerImages[Math.floor(Math.random() * playerImages.length)]; + let persistedImage = sessionStorage.getItem(`playerImage_${player.steamID}`); + if (!persistedImage) { + // Assign rnd image and persist it until page reload + persistedImage = playerImages[Math.floor(Math.random() * playerImages.length)]; + sessionStorage.setItem(`playerImage_${player.steamID}`, persistedImage); + } + avatar.src = persistedImage; avatar.alt = `${player.username}'s avatar`; avatar.className = 'player-avatar'; avatar.title = player.steamID; From 212cccae2f049965103a8cf3fc399bc3fb7f1d45 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Sat, 30 Aug 2025 10:45:45 +0200 Subject: [PATCH 28/74] added proper playerImages --- UIMod/onboard_bundled/assets/css/home.css | 4 ++-- UIMod/onboard_bundled/assets/js/server-api.js | 18 +++++++++++++----- .../assets/playerimages/anna.webp | Bin 0 -> 29030 bytes .../assets/playerimages/dan.webp | Bin 0 -> 28408 bytes .../assets/playerimages/darragh.webp | Bin 0 -> 35552 bytes .../assets/playerimages/david.webp | Bin 0 -> 27836 bytes .../assets/playerimages/dean.webp | Bin 0 -> 36272 bytes .../assets/playerimages/garrison.webp | Bin 0 -> 26580 bytes .../assets/playerimages/ivette.webp | Bin 0 -> 29298 bytes .../assets/playerimages/john.webp | Bin 0 -> 29694 bytes .../assets/playerimages/julia.webp | Bin 0 -> 28828 bytes .../assets/playerimages/ove.webp | Bin 0 -> 28756 bytes .../assets/playerimages/pierre.webp | Bin 0 -> 26524 bytes .../assets/playerimages/rolf.webp | Bin 0 -> 36542 bytes .../assets/playerimages/ronald.webp | Bin 0 -> 29860 bytes 15 files changed, 15 insertions(+), 7 deletions(-) create mode 100644 UIMod/onboard_bundled/assets/playerimages/anna.webp create mode 100644 UIMod/onboard_bundled/assets/playerimages/dan.webp create mode 100644 UIMod/onboard_bundled/assets/playerimages/darragh.webp create mode 100644 UIMod/onboard_bundled/assets/playerimages/david.webp create mode 100644 UIMod/onboard_bundled/assets/playerimages/dean.webp create mode 100644 UIMod/onboard_bundled/assets/playerimages/garrison.webp create mode 100644 UIMod/onboard_bundled/assets/playerimages/ivette.webp create mode 100644 UIMod/onboard_bundled/assets/playerimages/john.webp create mode 100644 UIMod/onboard_bundled/assets/playerimages/julia.webp create mode 100644 UIMod/onboard_bundled/assets/playerimages/ove.webp create mode 100644 UIMod/onboard_bundled/assets/playerimages/pierre.webp create mode 100644 UIMod/onboard_bundled/assets/playerimages/rolf.webp create mode 100644 UIMod/onboard_bundled/assets/playerimages/ronald.webp diff --git a/UIMod/onboard_bundled/assets/css/home.css b/UIMod/onboard_bundled/assets/css/home.css index e7df5cfb..9f55c25a 100644 --- a/UIMod/onboard_bundled/assets/css/home.css +++ b/UIMod/onboard_bundled/assets/css/home.css @@ -275,8 +275,8 @@ } .player-avatar { - width: 40px; - height: 40px; + width: 45px; + height: 45px; border-radius: 50%; cursor: pointer; transition: transform 0.2s; diff --git a/UIMod/onboard_bundled/assets/js/server-api.js b/UIMod/onboard_bundled/assets/js/server-api.js index d494b3de..a2b71fe7 100644 --- a/UIMod/onboard_bundled/assets/js/server-api.js +++ b/UIMod/onboard_bundled/assets/js/server-api.js @@ -73,11 +73,19 @@ function fetchPlayers() { const playerList = document.getElementById('playerList'); const playerImages = [ - "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/2089290/ss_5ccc7eafd0d54f887595b688d008debf7dd3c398.600x338.jpg?t=1658208343", - "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/2089290/ss_178b7c3190794ee5bcf93a63536c4e4f5fae747d.600x338.jpg?t=1658208343", - "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/2089290/ss_25dc8c613e7507d1215f27884866b37279c66f99.600x338.jpg?t=1658208343", - "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/2089290/ss_d8a6ff6c070a6f6a51730797640b6f698b226b51.600x338.jpg?t=1658208343", - "https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/1038500/ss_adc371d38cd1dcdd268bd7907ff1473615779ad8.600x338.jpg?t=1693478415" + "/static/playerimages/anna.webp", + "/static/playerimages/dan.webp", + "/static/playerimages/darragh.webp", + "/static/playerimages/david.webp", + "/static/playerimages/dean.webp", + "/static/playerimages/garrison.webp", + "/static/playerimages/ivette.webp", + "/static/playerimages/john.webp", + "/static/playerimages/julia.webp", + "/static/playerimages/ove.webp", + "/static/playerimages/pierre.webp", + "/static/playerimages/rolf.webp", + "/static/playerimages/ronald.webp", ]; fetch('/api/v2/server/status/connectedplayers') diff --git a/UIMod/onboard_bundled/assets/playerimages/anna.webp b/UIMod/onboard_bundled/assets/playerimages/anna.webp new file mode 100644 index 0000000000000000000000000000000000000000..695405b5fe09a089d0df61417ea910aa2869f16a GIT binary patch literal 29030 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�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 literal 0 HcmV?d00001 diff --git a/UIMod/onboard_bundled/assets/playerimages/dan.webp b/UIMod/onboard_bundled/assets/playerimages/dan.webp new file mode 100644 index 0000000000000000000000000000000000000000..1c7ed3c3508dbd8f3ea9969a63b2d6ea4ca3cf2e GIT binary patch literal 28408 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 literal 0 HcmV?d00001 diff --git a/UIMod/onboard_bundled/assets/playerimages/darragh.webp b/UIMod/onboard_bundled/assets/playerimages/darragh.webp new file mode 100644 index 0000000000000000000000000000000000000000..2693871ae1e33b828f406041ca534612ea90e08f GIT binary patch literal 35552 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�m`Np`aNs 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%0Axd>Qj7wdbJftma0 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 literal 0 HcmV?d00001 diff --git a/UIMod/onboard_bundled/assets/playerimages/garrison.webp b/UIMod/onboard_bundled/assets/playerimages/garrison.webp new file mode 100644 index 0000000000000000000000000000000000000000..1ea69009b1885903b3d121f391b47851b159d186 GIT binary patch literal 26580 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 X!9re-xsLPya6gTF;VfLQ=imSUS{W={ literal 0 HcmV?d00001 diff --git a/UIMod/onboard_bundled/assets/playerimages/ivette.webp b/UIMod/onboard_bundled/assets/playerimages/ivette.webp new file mode 100644 index 0000000000000000000000000000000000000000..e642848cc86353b8d37edba614f9ef1f429c89a2 GIT binary patch literal 29298 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 literal 0 HcmV?d00001 diff --git a/UIMod/onboard_bundled/assets/playerimages/john.webp b/UIMod/onboard_bundled/assets/playerimages/john.webp new file mode 100644 index 0000000000000000000000000000000000000000..e1e4262adb2f36bef1bbf023d41ed5e7bb154903 GIT binary patch literal 29694 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 literal 0 HcmV?d00001 diff --git a/UIMod/onboard_bundled/assets/playerimages/ove.webp b/UIMod/onboard_bundled/assets/playerimages/ove.webp new file mode 100644 index 0000000000000000000000000000000000000000..f82fc4d145c2dd97ffb9013f5cb3080fd0f9a884 GIT binary patch literal 28756 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êuH_K35HPUiuTvSffA-Uo0t@CPHB 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 G0002CDObt> literal 0 HcmV?d00001 diff --git a/UIMod/onboard_bundled/assets/playerimages/ronald.webp b/UIMod/onboard_bundled/assets/playerimages/ronald.webp new file mode 100644 index 0000000000000000000000000000000000000000..13121c2a0aec7e9fb2900caa7f1f5b7a026b261f GIT binary patch literal 29860 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

    891^|yq9YV1B;o|4~gC18FyL70|=s*iwgUO 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 bllQqT2|u)vE;o$*0$~dg`=FN>Y?Xij(9ZBP literal 0 HcmV?d00001 From 9063232fb030813ae06e555facd2b452dd89e218 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Sat, 30 Aug 2025 10:58:45 +0200 Subject: [PATCH 29/74] fix js issue with new player tracking endpoint --- UIMod/onboard_bundled/assets/js/server-api.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UIMod/onboard_bundled/assets/js/server-api.js b/UIMod/onboard_bundled/assets/js/server-api.js index a2b71fe7..fe07ae81 100644 --- a/UIMod/onboard_bundled/assets/js/server-api.js +++ b/UIMod/onboard_bundled/assets/js/server-api.js @@ -88,12 +88,12 @@ function fetchPlayers() { "/static/playerimages/ronald.webp", ]; - fetch('/api/v2/server/status/connectedplayers') + return fetch('/api/v2/server/status/connectedplayers') .then(response => response.json()) .then(data => { playerList.innerHTML = ''; - if (!data || data.length === 0) { + if (!Array.isArray(data) || data.length === 0) { playersDiv.style.display = 'none'; return; } From 7a06ab6ccb01b0eadd744038717c3538a2bc2282 Mon Sep 17 00:00:00 2001 From: JacksonTheMaster <81807824+JacksonTheMaster@users.noreply.github.com> Date: Sat, 30 Aug 2025 11:41:46 +0200 Subject: [PATCH 30/74] updated backup manager design --- UIMod/onboard_bundled/assets/css/home.css | 145 +++++++++++++----- UIMod/onboard_bundled/assets/js/server-api.js | 70 ++++++--- UIMod/onboard_bundled/ui/index.html | 17 +- 3 files changed, 174 insertions(+), 58 deletions(-) diff --git a/UIMod/onboard_bundled/assets/css/home.css b/UIMod/onboard_bundled/assets/css/home.css index 9f55c25a..83921922 100644 --- a/UIMod/onboard_bundled/assets/css/home.css +++ b/UIMod/onboard_bundled/assets/css/home.css @@ -294,10 +294,9 @@ } /* Backups */ + + #backupRefreshButton { - position: absolute; - top: 20px; - right: 20px; padding: 5px 10px; font-size: 1.3rem; width: 40px; @@ -307,21 +306,41 @@ justify-content: center; } +.backup-controls { + position: absolute; + top: 30px; + right: 20px; + display: flex; + gap: 10px; + align-items: center; +} + +#backupLimit { + padding: 8px 12px; + background-color: rgba(0, 0, 0, 0.6); + color: var(--text-bright); + border: 1px solid rgba(0, 255, 171, 0.5); + border-radius: 4px; + font-family: 'Press Start 2P', cursive; + font-size: 0.7rem; +} + .backup-item { - background-color: rgba(0, 0, 0, 0.4); - padding: 15px; - margin-bottom: 15px; - border-radius: 8px; - display: flex; - justify-content: space-between; - align-items: center; - border: 2px solid rgba(0, 255, 171, 0.5); - transition: all var(--transition-normal); - line-height: 1.6; + background-color: rgba(0, 0, 0, 0.4); + padding: 20px; + margin-bottom: 15px; + border-radius: 12px; + display: flex; + justify-content: space-between; + align-items: center; + border: 2px solid rgba(0, 255, 171, 0.3); + transition: all var(--transition-normal); + position: relative; + overflow: hidden; } .backup-item.animate-in { - animation: slideIn 0.5s ease-out forwards; + animation: slideIn 0.6s ease-out forwards; } .backup-item:hover, .backup-item.animate-in:hover { @@ -330,30 +349,86 @@ transform: translateX(5px); } -.backup-item button { - padding: 8px 16px; - background-color: rgba(0, 255, 171, 0.2); - color: var(--text-bright); - border: 1px solid var(--primary); - border-radius: 4px; - cursor: pointer; - font-family: 'Press Start 2P', cursive; - font-size: 0.8rem; - transition: all var(--transition-normal); + + +.backup-info { + flex: 1; +} + +.backup-header { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 8px; +} + +.backup-name { + font-weight: bold; + color: var(--text-bright); + font-size: 0.9rem; +} + +.backup-type { + padding: 4px 8px; + border-radius: 12px; + font-size: 0.6rem; + text-transform: uppercase; + font-weight: bold; +} + +.backup-type.legacy { + background-color: rgba(255, 165, 0, 0.2); + color: #ffa500; + border: 1px solid rgba(255, 165, 0, 0.4); +} + +.backup-type.dotsave { + background-color: rgba(0, 255, 171, 0.2); + color: var(--primary); + border: 1px solid rgba(0, 255, 171, 0.4); +} + +.backup-date { + color: var(--text-dim); + font-size: 0.7rem; + opacity: 0.8; +} + +.restore-btn { + padding: 10px 18px; + background-color: rgba(0, 255, 171, 0.1); + color: var(--text-bright); + border: 2px solid var(--primary); + border-radius: 8px; + cursor: pointer; + font-family: 'Press Start 2P', cursive; + font-size: 0.7rem; + transition: all var(--transition-normal); + text-transform: uppercase; } -.backup-item button:hover { - background-color: var(--primary); - color: #000; +.restore-btn:hover { + background-color: var(--primary); + color: #000; +} + +.no-backups, .error { + text-align: center; + padding: 40px; + color: var(--text-dim); + font-style: italic; + background-color: rgba(0, 0, 0, 0.2); + border-radius: 8px; + border: 1px dashed rgba(0, 255, 171, 0.3); } @keyframes slideIn { - 0% { - opacity: 0; - transform: scale(0.95) translateX(-20px); - } - 100% { - opacity: 1; - transform: scale(1) translateX(0); - } + 0% { + opacity: 0; + transform: scale(0.9) translateX(-30px) rotateX(10deg); + } + 100% { + opacity: 1; + transform: scale(1) translateX(0) rotateX(0deg); + } } \ No newline at end of file diff --git a/UIMod/onboard_bundled/assets/js/server-api.js b/UIMod/onboard_bundled/assets/js/server-api.js index fe07ae81..79febfe2 100644 --- a/UIMod/onboard_bundled/assets/js/server-api.js +++ b/UIMod/onboard_bundled/assets/js/server-api.js @@ -41,31 +41,63 @@ function triggerSteamCMD() { } function fetchBackups() { - fetch('/api/v2/backups?mode=classic') - .then(response => response.text()) + const limit = document.getElementById('backupLimit').value; + const url = limit ? `/api/v2/backups?limit=${limit}` : '/api/v2/backups'; + + fetch(url) + .then(response => response.json()) .then(data => { const backupList = document.getElementById('backupList'); backupList.innerHTML = ''; - if (data.trim() === "No valid backup files found.") { - backupList.textContent = data; - } else { - let animationCount = 0; // Track number of animated items - data.split('\n').filter(Boolean).forEach((backup) => { - const li = document.createElement('li'); - li.className = 'backup-item'; - li.innerHTML = `${backup} `; - backupList.appendChild(li); - if (animationCount < 20) { - setTimeout(() => { - li.classList.add('animate-in'); - }, animationCount * 100); - animationCount++; - } - }); + if (!data || data.length === 0) { + backupList.innerHTML = '

  • No valid backup files found.
  • '; + return; } + + let animationCount = 0; + data.forEach((backup) => { + const li = document.createElement('li'); + li.className = 'backup-item'; + + const backupType = getBackupType(backup); + const fileName = backup.BinFile.split('/').pop(); + const formattedDate = new Date(backup.ModTime).toLocaleString(); + + li.innerHTML = ` +
    +
    + ${fileName} + ${backupType} +
    +
    ${formattedDate}
    +
    + + `; + + backupList.appendChild(li); + + if (animationCount < 20) { + setTimeout(() => { + li.classList.add('animate-in'); + }, animationCount * 50); + animationCount++; + } + }); }) - .catch(err => console.error("Failed to fetch backups:", err)); + .catch(err => { + console.error("Failed to fetch backups:", err); + document.getElementById('backupList').innerHTML = '
  • Failed to load backups
  • '; + }); +} + +function getBackupType(backup) { + if (backup.BinFile && backup.XMLFile && backup.MetaFile) { + return 'Legacy'; + } else if (backup.BinFile && !backup.XMLFile && !backup.MetaFile) { + return 'Dotsave'; + } + return 'Unknown'; } function fetchPlayers() { diff --git a/UIMod/onboard_bundled/ui/index.html b/UIMod/onboard_bundled/ui/index.html index 310a6771..aa21c490 100644 --- a/UIMod/onboard_bundled/ui/index.html +++ b/UIMod/onboard_bundled/ui/index.html @@ -66,10 +66,19 @@

    {{.UIText_Connected_PlayersHeader}}

    -

    {{.UIText_Backup_Manager}}

    - -
      -
      +

      {{.UIText_Backup_Manager}}

      +
      + + +
      +
        +