mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-07-15 04:43:36 +00:00
0ff03110c9
* feat: add robust OSC 52 clipboard support for tmux/SSH clipboard sync (#587) Upgrade @xterm/addon-clipboard to v0.2.0 and add a custom RobustClipboardProvider that handles browser Clipboard API focus restrictions by deferring writes until the window regains focus. Uses Electron native clipboard when available for reliable access without browser API limitations. Changes: - Create src/lib/clipboard-provider.ts with write-only provider - Update all terminal components (desktop, mobile, docker console) - Add electronClipboard bridge in Electron preload - Add clipboard permission handler in Electron main process * chore: remove translations * feat: add 5-panel and 6-panel split screen layouts (#584) * Temporary merge for 1.11.1 syncing (#543) * fix: remote translations * feat: support OIDC configuration via environment variables (#531) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to open terminal directly (#156) (#503) * fix: resolve merge conflict artifacts in dev-1.10.1 - Fix missing closing tags in AppView.tsx NetworkGraphView - Fix incomplete catch blocks in server-stats.ts and db/index.ts - Fix missing closing brace in en.json ports section - Fix HostManagerApp.tsx import path - Fix stats-widgets.ts type definition - Fix schema.ts networkTopology table definition - Add type annotations in user-data-import.ts * feat: support URL routes to open terminal directly (#156) - Add /terminal/{hostNameOrId} route for new format - Keep /hosts/{id}/terminal for backward compatibility - Smart detection: numeric IDs for ID lookup, otherwise name lookup - Clean URL after opening to prevent duplicate on refresh - Show toast error when host not found --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501) Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal. This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>. - Ctrl+Alt+W → Ctrl+W (nano search, delete word) - Ctrl+Alt+T → Ctrl+T (transpose chars) - Ctrl+Alt+N → Ctrl+N (next line) - Ctrl+Alt+Q → Ctrl+Q (XON flow control) Fixes Termix-SSH/Support#407 * feat: remove locales * New Crowdin updates (#504) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * feat: add option to disable update checker (#502) * feat: add option to disable update checker Add a new setting in User Profile > Settings to disable automatic update checking on startup and dashboard. - Adds 'Disable Update Check' toggle in profile settings - Skips GitHub API calls when disabled (reduces network requests) - Works for both web app and Electron client Fixes Termix-SSH/Support#410 * feat: remove locales --------- Co-authored-by: LukeGus <bugattiguy527@gmail.com> * New Crowdin updates (#505) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * feat: add crowdin i18n * feat: remove locales * New Crowdin updates (#506) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Vietnamese) * New translations en.json (Portuguese, Brazilian) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Bengali) * New translations en.json (Thai) * feat: update readme * feat: update readme * feat: update credential editor to use submitting system and add health monitor * feat: added toggle for command pallete * feat: added close button on tab dropdown * feat: added sidebar management and improved some host manager UI/UX * feat: re-added missing users.ts route from merge * feat: add toggle for password reset feature in admin settings (#508) * feat: add sudo support for file manager operations (#509) * fix: add sudo support for listFiles and improve permission error handling (#512) * feat: add sudo support for file manager operations * fix: add sudo support for listFiles and improve permission error handling --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated * feat: add copy password button and fixed new line carriage issues and backend crash for auth key * feat: added quick connection system (ad-hoc) * Enter Key for Quick Login (#513) * feat: added -r and -l support for tunnels * feat: begin dashboard overhaul by splitting into cards and adding customization * feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc. * feat: add auth.tsx suppot for fullscreen * feat: greatly improve network graph ui/ux and migrated to use translations and theme system * feat: update to use blacksmith * feat: improve ui for customized tabs and hide add/edit host/credential when submiting * feat: add warpgate support with a dialog (terminal only) * feat: expand warpgate to docker/file manager * fix: docker not working wtih warpgate and none auth failing for terminal * fix: prevent owner permission loss when sharing host to own role (#514) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * fix: prevent owner permission loss when sharing host to own role Fixes #391 --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: SSH key passphrase not passed for Docker and Tunnel (#521) * perf: optimize Host Manager for large host lists - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. * fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel Database field is `key_password` but code used `keyPassword`. Added fallback to check both field names. Affected: - docker.ts: Docker SSH connections with encrypted keys - tunnel.ts: Tunnel connections with encrypted keys --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * perf: optimize Host Manager for large host lists (#520) - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix: add missing mimeTypes definition for image preview (#518) Fixes Termix-SSH/Support#408 * fix: prevent session reset when updating host properties (#517) Move WebSocket cleanup logic to a separate unmount-only effect to prevent SSH sessions from being closed when host properties are updated. Closes Termix-SSH/Support#401 * fix: backend type error * feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385) * feat: improved conneciton log ui/logic * feat: improved conneciton log ui/logic * feat: expanded connection log to work across all components (readying for release) * feat: update readme * feat: update readme * fix: build error * fix: build error * fix: changed ver * chore: clean up * chore: continue clean up * fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies * fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field * fix: update readme and run cleaner * fix: update readme * fix: update readme * fix: update readme * feat: update chinese readme * feat: support OIDC configuration via environment variables Add support for configuring OIDC authentication through environment variables, enabling containerized deployments without database access: - OIDC_CLIENT_ID - OIDC_CLIENT_SECRET - OIDC_ISSUER_URL - OIDC_AUTHORIZATION_URL - OIDC_TOKEN_URL - OIDC_USERINFO_URL (optional) - OIDC_IDENTIFIER_PATH (optional, default: "sub") - OIDC_NAME_PATH (optional, default: "name") - OIDC_SCOPES (optional, default: "openid email profile") Environment variables take priority over database configuration. Closes Termix-SSH/Support#16 --------- Co-authored-by: Steven Josefs <s.josefs@gmx.de> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com> * feat: add modern DH group KEX algorithms for better compatibility (#530) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to open terminal directly (#156) (#503) * fix: resolve merge conflict artifacts in dev-1.10.1 - Fix missing closing tags in AppView.tsx NetworkGraphView - Fix incomplete catch blocks in server-stats.ts and db/index.ts - Fix missing closing brace in en.json ports section - Fix HostManagerApp.tsx import path - Fix stats-widgets.ts type definition - Fix schema.ts networkTopology table definition - Add type annotations in user-data-import.ts * feat: support URL routes to open terminal directly (#156) - Add /terminal/{hostNameOrId} route for new format - Keep /hosts/{id}/terminal for backward compatibility - Smart detection: numeric IDs for ID lookup, otherwise name lookup - Clean URL after opening to prevent duplicate on refresh - Show toast error when host not found --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501) Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal. This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>. - Ctrl+Alt+W → Ctrl+W (nano search, delete word) - Ctrl+Alt+T → Ctrl+T (transpose chars) - Ctrl+Alt+N → Ctrl+N (next line) - Ctrl+Alt+Q → Ctrl+Q (XON flow control) Fixes Termix-SSH/Support#407 * feat: remove locales * New Crowdin updates (#504) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * feat: add option to disable update checker (#502) * feat: add option to disable update checker Add a new setting in User Profile > Settings to disable automatic update checking on startup and dashboard. - Adds 'Disable Update Check' toggle in profile settings - Skips GitHub API calls when disabled (reduces network requests) - Works for both web app and Electron client Fixes Termix-SSH/Support#410 * feat: remove locales --------- Co-authored-by: LukeGus <bugattiguy527@gmail.com> * New Crowdin updates (#505) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * feat: add crowdin i18n * feat: remove locales * New Crowdin updates (#506) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Vietnamese) * New translations en.json (Portuguese, Brazilian) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Bengali) * New translations en.json (Thai) * feat: update readme * feat: update readme * feat: update credential editor to use submitting system and add health monitor * feat: added toggle for command pallete * feat: added close button on tab dropdown * feat: added sidebar management and improved some host manager UI/UX * feat: re-added missing users.ts route from merge * feat: add toggle for password reset feature in admin settings (#508) * feat: add sudo support for file manager operations (#509) * fix: add sudo support for listFiles and improve permission error handling (#512) * feat: add sudo support for file manager operations * fix: add sudo support for listFiles and improve permission error handling --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated * feat: add copy password button and fixed new line carriage issues and backend crash for auth key * feat: added quick connection system (ad-hoc) * Enter Key for Quick Login (#513) * feat: added -r and -l support for tunnels * feat: begin dashboard overhaul by splitting into cards and adding customization * feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc. * feat: add auth.tsx suppot for fullscreen * feat: greatly improve network graph ui/ux and migrated to use translations and theme system * feat: update to use blacksmith * feat: improve ui for customized tabs and hide add/edit host/credential when submiting * feat: add warpgate support with a dialog (terminal only) * feat: expand warpgate to docker/file manager * fix: docker not working wtih warpgate and none auth failing for terminal * fix: prevent owner permission loss when sharing host to own role (#514) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * fix: prevent owner permission loss when sharing host to own role Fixes #391 --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: SSH key passphrase not passed for Docker and Tunnel (#521) * perf: optimize Host Manager for large host lists - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. * fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel Database field is `key_password` but code used `keyPassword`. Added fallback to check both field names. Affected: - docker.ts: Docker SSH connections with encrypted keys - tunnel.ts: Tunnel connections with encrypted keys --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * perf: optimize Host Manager for large host lists (#520) - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix: add missing mimeTypes definition for image preview (#518) Fixes Termix-SSH/Support#408 * fix: prevent session reset when updating host properties (#517) Move WebSocket cleanup logic to a separate unmount-only effect to prevent SSH sessions from being closed when host properties are updated. Closes Termix-SSH/Support#401 * fix: backend type error * feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385) * feat: improved conneciton log ui/logic * feat: improved conneciton log ui/logic * feat: expanded connection log to work across all components (readying for release) * feat: update readme * feat: update readme * fix: build error * fix: build error * fix: changed ver * chore: clean up * chore: continue clean up * fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies * fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field * fix: update readme and run cleaner * fix: update readme * fix: update readme * fix: update readme * feat: update chinese readme * feat: add modern DH group KEX algorithms for better compatibility Add diffie-hellman-group15/16/17/18-sha512 key exchange algorithms which are supported by ssh2 library but were not configured in Termix. These algorithms provide: - Better compatibility with modern SSH servers (FreeBSD, OpenBSD, etc.) - Stronger security with larger DH groups - RFC 8268 compliance Related to Termix-SSH/Support#205 --------- Co-authored-by: Steven Josefs <s.josefs@gmx.de> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com> * feat: clarify that hostname/FQDN is supported in IP address field (#529) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to open… * feat: show terminal title in tab name (#579) * Temporary merge for 1.11.1 syncing (#543) * fix: remote translations * feat: support OIDC configuration via environment variables (#531) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to open terminal directly (#156) (#503) * fix: resolve merge conflict artifacts in dev-1.10.1 - Fix missing closing tags in AppView.tsx NetworkGraphView - Fix incomplete catch blocks in server-stats.ts and db/index.ts - Fix missing closing brace in en.json ports section - Fix HostManagerApp.tsx import path - Fix stats-widgets.ts type definition - Fix schema.ts networkTopology table definition - Add type annotations in user-data-import.ts * feat: support URL routes to open terminal directly (#156) - Add /terminal/{hostNameOrId} route for new format - Keep /hosts/{id}/terminal for backward compatibility - Smart detection: numeric IDs for ID lookup, otherwise name lookup - Clean URL after opening to prevent duplicate on refresh - Show toast error when host not found --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501) Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal. This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>. - Ctrl+Alt+W → Ctrl+W (nano search, delete word) - Ctrl+Alt+T → Ctrl+T (transpose chars) - Ctrl+Alt+N → Ctrl+N (next line) - Ctrl+Alt+Q → Ctrl+Q (XON flow control) Fixes Termix-SSH/Support#407 * feat: remove locales * New Crowdin updates (#504) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * feat: add option to disable update checker (#502) * feat: add option to disable update checker Add a new setting in User Profile > Settings to disable automatic update checking on startup and dashboard. - Adds 'Disable Update Check' toggle in profile settings - Skips GitHub API calls when disabled (reduces network requests) - Works for both web app and Electron client Fixes Termix-SSH/Support#410 * feat: remove locales --------- Co-authored-by: LukeGus <bugattiguy527@gmail.com> * New Crowdin updates (#505) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * feat: add crowdin i18n * feat: remove locales * New Crowdin updates (#506) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Vietnamese) * New translations en.json (Portuguese, Brazilian) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Bengali) * New translations en.json (Thai) * feat: update readme * feat: update readme * feat: update credential editor to use submitting system and add health monitor * feat: added toggle for command pallete * feat: added close button on tab dropdown * feat: added sidebar management and improved some host manager UI/UX * feat: re-added missing users.ts route from merge * feat: add toggle for password reset feature in admin settings (#508) * feat: add sudo support for file manager operations (#509) * fix: add sudo support for listFiles and improve permission error handling (#512) * feat: add sudo support for file manager operations * fix: add sudo support for listFiles and improve permission error handling --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated * feat: add copy password button and fixed new line carriage issues and backend crash for auth key * feat: added quick connection system (ad-hoc) * Enter Key for Quick Login (#513) * feat: added -r and -l support for tunnels * feat: begin dashboard overhaul by splitting into cards and adding customization * feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc. * feat: add auth.tsx suppot for fullscreen * feat: greatly improve network graph ui/ux and migrated to use translations and theme system * feat: update to use blacksmith * feat: improve ui for customized tabs and hide add/edit host/credential when submiting * feat: add warpgate support with a dialog (terminal only) * feat: expand warpgate to docker/file manager * fix: docker not working wtih warpgate and none auth failing for terminal * fix: prevent owner permission loss when sharing host to own role (#514) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * fix: prevent owner permission loss when sharing host to own role Fixes #391 --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: SSH key passphrase not passed for Docker and Tunnel (#521) * perf: optimize Host Manager for large host lists - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. * fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel Database field is `key_password` but code used `keyPassword`. Added fallback to check both field names. Affected: - docker.ts: Docker SSH connections with encrypted keys - tunnel.ts: Tunnel connections with encrypted keys --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * perf: optimize Host Manager for large host lists (#520) - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix: add missing mimeTypes definition for image preview (#518) Fixes Termix-SSH/Support#408 * fix: prevent session reset when updating host properties (#517) Move WebSocket cleanup logic to a separate unmount-only effect to prevent SSH sessions from being closed when host properties are updated. Closes Termix-SSH/Support#401 * fix: backend type error * feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385) * feat: improved conneciton log ui/logic * feat: improved conneciton log ui/logic * feat: expanded connection log to work across all components (readying for release) * feat: update readme * feat: update readme * fix: build error * fix: build error * fix: changed ver * chore: clean up * chore: continue clean up * fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies * fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field * fix: update readme and run cleaner * fix: update readme * fix: update readme * fix: update readme * feat: update chinese readme * feat: support OIDC configuration via environment variables Add support for configuring OIDC authentication through environment variables, enabling containerized deployments without database access: - OIDC_CLIENT_ID - OIDC_CLIENT_SECRET - OIDC_ISSUER_URL - OIDC_AUTHORIZATION_URL - OIDC_TOKEN_URL - OIDC_USERINFO_URL (optional) - OIDC_IDENTIFIER_PATH (optional, default: "sub") - OIDC_NAME_PATH (optional, default: "name") - OIDC_SCOPES (optional, default: "openid email profile") Environment variables take priority over database configuration. Closes Termix-SSH/Support#16 --------- Co-authored-by: Steven Josefs <s.josefs@gmx.de> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com> * feat: add modern DH group KEX algorithms for better compatibility (#530) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to open terminal directly (#156) (#503) * fix: resolve merge conflict artifacts in dev-1.10.1 - Fix missing closing tags in AppView.tsx NetworkGraphView - Fix incomplete catch blocks in server-stats.ts and db/index.ts - Fix missing closing brace in en.json ports section - Fix HostManagerApp.tsx import path - Fix stats-widgets.ts type definition - Fix schema.ts networkTopology table definition - Add type annotations in user-data-import.ts * feat: support URL routes to open terminal directly (#156) - Add /terminal/{hostNameOrId} route for new format - Keep /hosts/{id}/terminal for backward compatibility - Smart detection: numeric IDs for ID lookup, otherwise name lookup - Clean URL after opening to prevent duplicate on refresh - Show toast error when host not found --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501) Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal. This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>. - Ctrl+Alt+W → Ctrl+W (nano search, delete word) - Ctrl+Alt+T → Ctrl+T (transpose chars) - Ctrl+Alt+N → Ctrl+N (next line) - Ctrl+Alt+Q → Ctrl+Q (XON flow control) Fixes Termix-SSH/Support#407 * feat: remove locales * New Crowdin updates (#504) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * feat: add option to disable update checker (#502) * feat: add option to disable update checker Add a new setting in User Profile > Settings to disable automatic update checking on startup and dashboard. - Adds 'Disable Update Check' toggle in profile settings - Skips GitHub API calls when disabled (reduces network requests) - Works for both web app and Electron client Fixes Termix-SSH/Support#410 * feat: remove locales --------- Co-authored-by: LukeGus <bugattiguy527@gmail.com> * New Crowdin updates (#505) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * feat: add crowdin i18n * feat: remove locales * New Crowdin updates (#506) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Vietnamese) * New translations en.json (Portuguese, Brazilian) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Bengali) * New translations en.json (Thai) * feat: update readme * feat: update readme * feat: update credential editor to use submitting system and add health monitor * feat: added toggle for command pallete * feat: added close button on tab dropdown * feat: added sidebar management and improved some host manager UI/UX * feat: re-added missing users.ts route from merge * feat: add toggle for password reset feature in admin settings (#508) * feat: add sudo support for file manager operations (#509) * fix: add sudo support for listFiles and improve permission error handling (#512) * feat: add sudo support for file manager operations * fix: add sudo support for listFiles and improve permission error handling --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated * feat: add copy password button and fixed new line carriage issues and backend crash for auth key * feat: added quick connection system (ad-hoc) * Enter Key for Quick Login (#513) * feat: added -r and -l support for tunnels * feat: begin dashboard overhaul by splitting into cards and adding customization * feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc. * feat: add auth.tsx suppot for fullscreen * feat: greatly improve network graph ui/ux and migrated to use translations and theme system * feat: update to use blacksmith * feat: improve ui for customized tabs and hide add/edit host/credential when submiting * feat: add warpgate support with a dialog (terminal only) * feat: expand warpgate to docker/file manager * fix: docker not working wtih warpgate and none auth failing for terminal * fix: prevent owner permission loss when sharing host to own role (#514) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * fix: prevent owner permission loss when sharing host to own role Fixes #391 --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: SSH key passphrase not passed for Docker and Tunnel (#521) * perf: optimize Host Manager for large host lists - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. * fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel Database field is `key_password` but code used `keyPassword`. Added fallback to check both field names. Affected: - docker.ts: Docker SSH connections with encrypted keys - tunnel.ts: Tunnel connections with encrypted keys --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * perf: optimize Host Manager for large host lists (#520) - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix: add missing mimeTypes definition for image preview (#518) Fixes Termix-SSH/Support#408 * fix: prevent session reset when updating host properties (#517) Move WebSocket cleanup logic to a separate unmount-only effect to prevent SSH sessions from being closed when host properties are updated. Closes Termix-SSH/Support#401 * fix: backend type error * feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385) * feat: improved conneciton log ui/logic * feat: improved conneciton log ui/logic * feat: expanded connection log to work across all components (readying for release) * feat: update readme * feat: update readme * fix: build error * fix: build error * fix: changed ver * chore: clean up * chore: continue clean up * fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies * fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field * fix: update readme and run cleaner * fix: update readme * fix: update readme * fix: update readme * feat: update chinese readme * feat: add modern DH group KEX algorithms for better compatibility Add diffie-hellman-group15/16/17/18-sha512 key exchange algorithms which are supported by ssh2 library but were not configured in Termix. These algorithms provide: - Better compatibility with modern SSH servers (FreeBSD, OpenBSD, etc.) - Stronger security with larger DH groups - RFC 8268 compliance Related to Termix-SSH/Support#205 --------- Co-authored-by: Steven Josefs <s.josefs@gmx.de> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com> * feat: clarify that hostname/FQDN is supported in IP address field (#529) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to open terminal dir… * fix: allow OIDC JIT user creation when registration is disabled (#578) * Temporary merge for 1.11.1 syncing (#543) * fix: remote translations * feat: support OIDC configuration via environment variables (#531) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to open terminal directly (#156) (#503) * fix: resolve merge conflict artifacts in dev-1.10.1 - Fix missing closing tags in AppView.tsx NetworkGraphView - Fix incomplete catch blocks in server-stats.ts and db/index.ts - Fix missing closing brace in en.json ports section - Fix HostManagerApp.tsx import path - Fix stats-widgets.ts type definition - Fix schema.ts networkTopology table definition - Add type annotations in user-data-import.ts * feat: support URL routes to open terminal directly (#156) - Add /terminal/{hostNameOrId} route for new format - Keep /hosts/{id}/terminal for backward compatibility - Smart detection: numeric IDs for ID lookup, otherwise name lookup - Clean URL after opening to prevent duplicate on refresh - Show toast error when host not found --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501) Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal. This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>. - Ctrl+Alt+W → Ctrl+W (nano search, delete word) - Ctrl+Alt+T → Ctrl+T (transpose chars) - Ctrl+Alt+N → Ctrl+N (next line) - Ctrl+Alt+Q → Ctrl+Q (XON flow control) Fixes Termix-SSH/Support#407 * feat: remove locales * New Crowdin updates (#504) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * feat: add option to disable update checker (#502) * feat: add option to disable update checker Add a new setting in User Profile > Settings to disable automatic update checking on startup and dashboard. - Adds 'Disable Update Check' toggle in profile settings - Skips GitHub API calls when disabled (reduces network requests) - Works for both web app and Electron client Fixes Termix-SSH/Support#410 * feat: remove locales --------- Co-authored-by: LukeGus <bugattiguy527@gmail.com> * New Crowdin updates (#505) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * feat: add crowdin i18n * feat: remove locales * New Crowdin updates (#506) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Vietnamese) * New translations en.json (Portuguese, Brazilian) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Bengali) * New translations en.json (Thai) * feat: update readme * feat: update readme * feat: update credential editor to use submitting system and add health monitor * feat: added toggle for command pallete * feat: added close button on tab dropdown * feat: added sidebar management and improved some host manager UI/UX * feat: re-added missing users.ts route from merge * feat: add toggle for password reset feature in admin settings (#508) * feat: add sudo support for file manager operations (#509) * fix: add sudo support for listFiles and improve permission error handling (#512) * feat: add sudo support for file manager operations * fix: add sudo support for listFiles and improve permission error handling --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated * feat: add copy password button and fixed new line carriage issues and backend crash for auth key * feat: added quick connection system (ad-hoc) * Enter Key for Quick Login (#513) * feat: added -r and -l support for tunnels * feat: begin dashboard overhaul by splitting into cards and adding customization * feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc. * feat: add auth.tsx suppot for fullscreen * feat: greatly improve network graph ui/ux and migrated to use translations and theme system * feat: update to use blacksmith * feat: improve ui for customized tabs and hide add/edit host/credential when submiting * feat: add warpgate support with a dialog (terminal only) * feat: expand warpgate to docker/file manager * fix: docker not working wtih warpgate and none auth failing for terminal * fix: prevent owner permission loss when sharing host to own role (#514) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * fix: prevent owner permission loss when sharing host to own role Fixes #391 --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: SSH key passphrase not passed for Docker and Tunnel (#521) * perf: optimize Host Manager for large host lists - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. * fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel Database field is `key_password` but code used `keyPassword`. Added fallback to check both field names. Affected: - docker.ts: Docker SSH connections with encrypted keys - tunnel.ts: Tunnel connections with encrypted keys --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * perf: optimize Host Manager for large host lists (#520) - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix: add missing mimeTypes definition for image preview (#518) Fixes Termix-SSH/Support#408 * fix: prevent session reset when updating host properties (#517) Move WebSocket cleanup logic to a separate unmount-only effect to prevent SSH sessions from being closed when host properties are updated. Closes Termix-SSH/Support#401 * fix: backend type error * feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385) * feat: improved conneciton log ui/logic * feat: improved conneciton log ui/logic * feat: expanded connection log to work across all components (readying for release) * feat: update readme * feat: update readme * fix: build error * fix: build error * fix: changed ver * chore: clean up * chore: continue clean up * fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies * fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field * fix: update readme and run cleaner * fix: update readme * fix: update readme * fix: update readme * feat: update chinese readme * feat: support OIDC configuration via environment variables Add support for configuring OIDC authentication through environment variables, enabling containerized deployments without database access: - OIDC_CLIENT_ID - OIDC_CLIENT_SECRET - OIDC_ISSUER_URL - OIDC_AUTHORIZATION_URL - OIDC_TOKEN_URL - OIDC_USERINFO_URL (optional) - OIDC_IDENTIFIER_PATH (optional, default: "sub") - OIDC_NAME_PATH (optional, default: "name") - OIDC_SCOPES (optional, default: "openid email profile") Environment variables take priority over database configuration. Closes Termix-SSH/Support#16 --------- Co-authored-by: Steven Josefs <s.josefs@gmx.de> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com> * feat: add modern DH group KEX algorithms for better compatibility (#530) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to open terminal directly (#156) (#503) * fix: resolve merge conflict artifacts in dev-1.10.1 - Fix missing closing tags in AppView.tsx NetworkGraphView - Fix incomplete catch blocks in server-stats.ts and db/index.ts - Fix missing closing brace in en.json ports section - Fix HostManagerApp.tsx import path - Fix stats-widgets.ts type definition - Fix schema.ts networkTopology table definition - Add type annotations in user-data-import.ts * feat: support URL routes to open terminal directly (#156) - Add /terminal/{hostNameOrId} route for new format - Keep /hosts/{id}/terminal for backward compatibility - Smart detection: numeric IDs for ID lookup, otherwise name lookup - Clean URL after opening to prevent duplicate on refresh - Show toast error when host not found --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501) Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal. This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>. - Ctrl+Alt+W → Ctrl+W (nano search, delete word) - Ctrl+Alt+T → Ctrl+T (transpose chars) - Ctrl+Alt+N → Ctrl+N (next line) - Ctrl+Alt+Q → Ctrl+Q (XON flow control) Fixes Termix-SSH/Support#407 * feat: remove locales * New Crowdin updates (#504) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * feat: add option to disable update checker (#502) * feat: add option to disable update checker Add a new setting in User Profile > Settings to disable automatic update checking on startup and dashboard. - Adds 'Disable Update Check' toggle in profile settings - Skips GitHub API calls when disabled (reduces network requests) - Works for both web app and Electron client Fixes Termix-SSH/Support#410 * feat: remove locales --------- Co-authored-by: LukeGus <bugattiguy527@gmail.com> * New Crowdin updates (#505) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * feat: add crowdin i18n * feat: remove locales * New Crowdin updates (#506) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Vietnamese) * New translations en.json (Portuguese, Brazilian) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Bengali) * New translations en.json (Thai) * feat: update readme * feat: update readme * feat: update credential editor to use submitting system and add health monitor * feat: added toggle for command pallete * feat: added close button on tab dropdown * feat: added sidebar management and improved some host manager UI/UX * feat: re-added missing users.ts route from merge * feat: add toggle for password reset feature in admin settings (#508) * feat: add sudo support for file manager operations (#509) * fix: add sudo support for listFiles and improve permission error handling (#512) * feat: add sudo support for file manager operations * fix: add sudo support for listFiles and improve permission error handling --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated * feat: add copy password button and fixed new line carriage issues and backend crash for auth key * feat: added quick connection system (ad-hoc) * Enter Key for Quick Login (#513) * feat: added -r and -l support for tunnels * feat: begin dashboard overhaul by splitting into cards and adding customization * feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc. * feat: add auth.tsx suppot for fullscreen * feat: greatly improve network graph ui/ux and migrated to use translations and theme system * feat: update to use blacksmith * feat: improve ui for customized tabs and hide add/edit host/credential when submiting * feat: add warpgate support with a dialog (terminal only) * feat: expand warpgate to docker/file manager * fix: docker not working wtih warpgate and none auth failing for terminal * fix: prevent owner permission loss when sharing host to own role (#514) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * fix: prevent owner permission loss when sharing host to own role Fixes #391 --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: SSH key passphrase not passed for Docker and Tunnel (#521) * perf: optimize Host Manager for large host lists - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. * fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel Database field is `key_password` but code used `keyPassword`. Added fallback to check both field names. Affected: - docker.ts: Docker SSH connections with encrypted keys - tunnel.ts: Tunnel connections with encrypted keys --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * perf: optimize Host Manager for large host lists (#520) - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix: add missing mimeTypes definition for image preview (#518) Fixes Termix-SSH/Support#408 * fix: prevent session reset when updating host properties (#517) Move WebSocket cleanup logic to a separate unmount-only effect to prevent SSH sessions from being closed when host properties are updated. Closes Termix-SSH/Support#401 * fix: backend type error * feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385) * feat: improved conneciton log ui/logic * feat: improved conneciton log ui/logic * feat: expanded connection log to work across all components (readying for release) * feat: update readme * feat: update readme * fix: build error * fix: build error * fix: changed ver * chore: clean up * chore: continue clean up * fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies * fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field * fix: update readme and run cleaner * fix: update readme * fix: update readme * fix: update readme * feat: update chinese readme * feat: add modern DH group KEX algorithms for better compatibility Add diffie-hellman-group15/16/17/18-sha512 key exchange algorithms which are supported by ssh2 library but were not configured in Termix. These algorithms provide: - Better compatibility with modern SSH servers (FreeBSD, OpenBSD, etc.) - Stronger security with larger DH groups - RFC 8268 compliance Related to Termix-SSH/Support#205 --------- Co-authored-by: Steven Josefs <s.josefs@gmx.de> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com> * feat: clarify that hostname/FQDN is supported in IP address field (#529) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL r… * feat: add file manager sorting by name, date, and size (#582) * Temporary merge for 1.11.1 syncing (#543) * fix: remote translations * feat: support OIDC configuration via environment variables (#531) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to open terminal directly (#156) (#503) * fix: resolve merge conflict artifacts in dev-1.10.1 - Fix missing closing tags in AppView.tsx NetworkGraphView - Fix incomplete catch blocks in server-stats.ts and db/index.ts - Fix missing closing brace in en.json ports section - Fix HostManagerApp.tsx import path - Fix stats-widgets.ts type definition - Fix schema.ts networkTopology table definition - Add type annotations in user-data-import.ts * feat: support URL routes to open terminal directly (#156) - Add /terminal/{hostNameOrId} route for new format - Keep /hosts/{id}/terminal for backward compatibility - Smart detection: numeric IDs for ID lookup, otherwise name lookup - Clean URL after opening to prevent duplicate on refresh - Show toast error when host not found --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501) Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal. This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>. - Ctrl+Alt+W → Ctrl+W (nano search, delete word) - Ctrl+Alt+T → Ctrl+T (transpose chars) - Ctrl+Alt+N → Ctrl+N (next line) - Ctrl+Alt+Q → Ctrl+Q (XON flow control) Fixes Termix-SSH/Support#407 * feat: remove locales * New Crowdin updates (#504) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * feat: add option to disable update checker (#502) * feat: add option to disable update checker Add a new setting in User Profile > Settings to disable automatic update checking on startup and dashboard. - Adds 'Disable Update Check' toggle in profile settings - Skips GitHub API calls when disabled (reduces network requests) - Works for both web app and Electron client Fixes Termix-SSH/Support#410 * feat: remove locales --------- Co-authored-by: LukeGus <bugattiguy527@gmail.com> * New Crowdin updates (#505) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * feat: add crowdin i18n * feat: remove locales * New Crowdin updates (#506) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Vietnamese) * New translations en.json (Portuguese, Brazilian) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Bengali) * New translations en.json (Thai) * feat: update readme * feat: update readme * feat: update credential editor to use submitting system and add health monitor * feat: added toggle for command pallete * feat: added close button on tab dropdown * feat: added sidebar management and improved some host manager UI/UX * feat: re-added missing users.ts route from merge * feat: add toggle for password reset feature in admin settings (#508) * feat: add sudo support for file manager operations (#509) * fix: add sudo support for listFiles and improve permission error handling (#512) * feat: add sudo support for file manager operations * fix: add sudo support for listFiles and improve permission error handling --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated * feat: add copy password button and fixed new line carriage issues and backend crash for auth key * feat: added quick connection system (ad-hoc) * Enter Key for Quick Login (#513) * feat: added -r and -l support for tunnels * feat: begin dashboard overhaul by splitting into cards and adding customization * feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc. * feat: add auth.tsx suppot for fullscreen * feat: greatly improve network graph ui/ux and migrated to use translations and theme system * feat: update to use blacksmith * feat: improve ui for customized tabs and hide add/edit host/credential when submiting * feat: add warpgate support with a dialog (terminal only) * feat: expand warpgate to docker/file manager * fix: docker not working wtih warpgate and none auth failing for terminal * fix: prevent owner permission loss when sharing host to own role (#514) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * fix: prevent owner permission loss when sharing host to own role Fixes #391 --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: SSH key passphrase not passed for Docker and Tunnel (#521) * perf: optimize Host Manager for large host lists - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. * fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel Database field is `key_password` but code used `keyPassword`. Added fallback to check both field names. Affected: - docker.ts: Docker SSH connections with encrypted keys - tunnel.ts: Tunnel connections with encrypted keys --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * perf: optimize Host Manager for large host lists (#520) - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix: add missing mimeTypes definition for image preview (#518) Fixes Termix-SSH/Support#408 * fix: prevent session reset when updating host properties (#517) Move WebSocket cleanup logic to a separate unmount-only effect to prevent SSH sessions from being closed when host properties are updated. Closes Termix-SSH/Support#401 * fix: backend type error * feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385) * feat: improved conneciton log ui/logic * feat: improved conneciton log ui/logic * feat: expanded connection log to work across all components (readying for release) * feat: update readme * feat: update readme * fix: build error * fix: build error * fix: changed ver * chore: clean up * chore: continue clean up * fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies * fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field * fix: update readme and run cleaner * fix: update readme * fix: update readme * fix: update readme * feat: update chinese readme * feat: support OIDC configuration via environment variables Add support for configuring OIDC authentication through environment variables, enabling containerized deployments without database access: - OIDC_CLIENT_ID - OIDC_CLIENT_SECRET - OIDC_ISSUER_URL - OIDC_AUTHORIZATION_URL - OIDC_TOKEN_URL - OIDC_USERINFO_URL (optional) - OIDC_IDENTIFIER_PATH (optional, default: "sub") - OIDC_NAME_PATH (optional, default: "name") - OIDC_SCOPES (optional, default: "openid email profile") Environment variables take priority over database configuration. Closes Termix-SSH/Support#16 --------- Co-authored-by: Steven Josefs <s.josefs@gmx.de> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com> * feat: add modern DH group KEX algorithms for better compatibility (#530) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to open terminal directly (#156) (#503) * fix: resolve merge conflict artifacts in dev-1.10.1 - Fix missing closing tags in AppView.tsx NetworkGraphView - Fix incomplete catch blocks in server-stats.ts and db/index.ts - Fix missing closing brace in en.json ports section - Fix HostManagerApp.tsx import path - Fix stats-widgets.ts type definition - Fix schema.ts networkTopology table definition - Add type annotations in user-data-import.ts * feat: support URL routes to open terminal directly (#156) - Add /terminal/{hostNameOrId} route for new format - Keep /hosts/{id}/terminal for backward compatibility - Smart detection: numeric IDs for ID lookup, otherwise name lookup - Clean URL after opening to prevent duplicate on refresh - Show toast error when host not found --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: add Ctrl+Alt key remapping for browser-blocked shortcuts (#501) Browsers intercept Ctrl+W/T/N/Q, making them unusable in terminal. This adds Ctrl+Alt+<key> as an alternative that sends Ctrl+<key>. - Ctrl+Alt+W → Ctrl+W (nano search, delete word) - Ctrl+Alt+T → Ctrl+T (transpose chars) - Ctrl+Alt+N → Ctrl+N (next line) - Ctrl+Alt+Q → Ctrl+Q (XON flow control) Fixes Termix-SSH/Support#407 * feat: remove locales * New Crowdin updates (#504) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * feat: add option to disable update checker (#502) * feat: add option to disable update checker Add a new setting in User Profile > Settings to disable automatic update checking on startup and dashboard. - Adds 'Disable Update Check' toggle in profile settings - Skips GitHub API calls when disabled (reduces network requests) - Works for both web app and Electron client Fixes Termix-SSH/Support#410 * feat: remove locales --------- Co-authored-by: LukeGus <bugattiguy527@gmail.com> * New Crowdin updates (#505) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * feat: add crowdin i18n * feat: remove locales * New Crowdin updates (#506) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * New translations en.json (Norwegian) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Arabic) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Swedish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Finnish) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (Chinese Traditional) * New translations en.json (Vietnamese) * New translations en.json (Portuguese, Brazilian) * New translations en.json (Bulgarian) * New translations en.json (Indonesian) * New translations en.json (Hindi) * New translations en.json (Bengali) * New translations en.json (Thai) * feat: update readme * feat: update readme * feat: update credential editor to use submitting system and add health monitor * feat: added toggle for command pallete * feat: added close button on tab dropdown * feat: added sidebar management and improved some host manager UI/UX * feat: re-added missing users.ts route from merge * feat: add toggle for password reset feature in admin settings (#508) * feat: add sudo support for file manager operations (#509) * fix: add sudo support for listFiles and improve permission error handling (#512) * feat: add sudo support for file manager operations * fix: add sudo support for listFiles and improve permission error handling --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix sudo password dialog ui, add totp/pass reset limiting, and refreshed users screen when auth is outdated * feat: add copy password button and fixed new line carriage issues and backend crash for auth key * feat: added quick connection system (ad-hoc) * Enter Key for Quick Login (#513) * feat: added -r and -l support for tunnels * feat: begin dashboard overhaul by splitting into cards and adding customization * feat: improved full screen apps, overhauled dashboard, updated server stats ui, etc. * feat: add auth.tsx suppot for fullscreen * feat: greatly improve network graph ui/ux and migrated to use translations and theme system * feat: update to use blacksmith * feat: improve ui for customized tabs and hide add/edit host/credential when submiting * feat: add warpgate support with a dialog (terminal only) * feat: expand warpgate to docker/file manager * fix: docker not working wtih warpgate and none auth failing for terminal * fix: prevent owner permission loss when sharing host to own role (#514) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * fix: prevent owner permission loss when sharing host to own role Fixes #391 --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: SSH key passphrase not passed for Docker and Tunnel (#521) * perf: optimize Host Manager for large host lists - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. * fix: SSH key passphrase not passed to ssh2 for Docker and Tunnel Database field is `key_password` but code used `keyPassword`. Added fallback to check both field names. Affected: - docker.ts: Docker SSH connections with encrypted keys - tunnel.ts: Tunnel connections with encrypted keys --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * perf: optimize Host Manager for large host lists (#520) - Add ServerStatusContext for shared status polling (reduces API calls from N to 1) - Move TooltipProvider to component root (eliminates N context instances) - Add pagination with "Show More" button (limits initial DOM nodes per folder) Fixes performance issues when managing ~1000 hosts with status monitoring enabled. Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix: add missing mimeTypes definition for image preview (#518) Fixes Termix-SSH/Support#408 * fix: prevent session reset when updating host properties (#517) Move WebSocket cleanup logic to a separate unmount-only effect to prevent SSH sessions from being closed when host properties are updated. Closes Termix-SSH/Support#401 * fix: backend type error * feat: make terminal connections more resilient, added connection log, and fixed https/proxy reconnection loop (issue #385) * feat: improved conneciton log ui/logic * feat: improved conneciton log ui/logic * feat: expanded connection log to work across all components (readying for release) * feat: update readme * feat: update readme * fix: build error * fix: build error * fix: changed ver * chore: clean up * chore: continue clean up * fix: remove attempts remaining and fix electron errors and some connection log ui inconsistencies * fix: added missing nginx routes and fixed sudo password copy with sudo password autofil field * fix: update readme and run cleaner * fix: update readme * fix: update readme * fix: update readme * feat: update chinese readme * feat: add modern DH group KEX algorithms for better compatibility Add diffie-hellman-group15/16/17/18-sha512 key exchange algorithms which are supported by ssh2 library but were not configured in Termix. These algorithms provide: - Better compatibility with modern SSH servers (FreeBSD, OpenBSD, etc.) - Stronger security with larger DH groups - RFC 8268 compliance Related to Termix-SSH/Support#205 --------- Co-authored-by: Steven Josefs <s.josefs@gmx.de> Co-authored-by: LukeGus <bugattiguy527@gmail.com> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com> * feat: clarify that hostname/FQDN is supported in IP address field (#529) * Feature request network graph * Fixing PR442: - Fixed: - UI design elemets - UI and button colors - JSON export - recent activity is default again - Removed: - Online/Offline UI labels - left-click menu on hosts - Added: - small pulsing dot inside the hosts to indicate online status like in the left bar * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker * Handle enter button (#481) * Update Crowdin configuration file * Update Crowdin configuration file * Update Linux Portable section with AUR link (#474) * fix: file manager incorrectly decoding/encoding when editing files (#476) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: build error on docker (#477) * fix: electron build errors and skip macos job * fix: testflight submit failure * fix: made submit job match build type * fix: resolve Vite build warnings for mixed static/dynamic imports (#473) * Update Crowdin configuration file * Update Crowdin configuration file * fix: resolve Vite build warnings for mixed static/dynamic imports - Convert all dynamic imports of main-axios.ts to static imports (10 files) - Convert all dynamic imports of sonner to static imports (4 files) - Add manual chunking configuration to vite.config.ts for better bundle splitting - react-vendor: React and React DOM - ui-vendor: Radix UI, lucide-react, clsx, tailwind-merge - monaco: Monaco Editor - codemirror: CodeMirror and related packages - Increase chunkSizeWarningLimit to 1000kB This resolves Vite warnings about mixed import strategies preventing proper code-splitting. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * fix: file manager incorrectly decoding/encoding when editing files (made base64/utf8 dependent) * fix: build error on docker --------- Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> * Increase max old space size for npm builds * Increase Node.js memory limit in Dockerfile * Remove NODE_OPTIONS from build commands in Dockerfile * Change runner to blacksmith-4vcpu-ubuntu-2404 * fix: build error on docker * Add handle on enter button; --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: LukeGus <bugattiguy527@gmail.com> * fix: remove top tech * fix: update readme * fix: prevent long container names from overflowing card (#496) Added min-w-0 to CardTitle to allow text truncation in flexbox. Without this, flex items have min-width: auto which prevents the truncate class from working properly. Fixes #411 * fix: use SFTP readdir for file listing to support non-Linux systems (#495) The file manager now uses SFTP readdir as the primary method for listing files, with ls -la as a fallback. This enables compatibility with MikroTik RouterOS and other non-Linux systems that don't have standard shell commands. Fixes #317 * fix: restore SSH connection timeout to 120s for 2FA authentication (#494) The timeout was reduced from 120s to 30s in v1.10, causing 2FA login failures. Users with keyboard-interactive authentication (TOTP/2FA) need sufficient time to enter their verification codes before the SSH connection times out. Fixes #404 * feat: add Docker container healthcheck (#493) * fix: owner should not be marked as shared when host is shared to their role (#492) * fix: use correct MIME types for image preview (#491) * fix: prevent session reset when updating host properties (#490) * fix: add shell creation timeout and improve error handling (#489) * fix: set default lineHeight to 1.0 for TUI apps compatibility (#488) * fix: delete all related data when removing user (#487) * fix: nginx permission denied on restricted kernels (#486) * fix: skip existing hosts and credentials during JSON import (#485) Added duplicate detection for SSH hosts (by ip+port+username) and credentials (by name) during import. Existing items are now skipped by default, or updated if replaceExisting option is enabled. This matches the existing behavior of importDismissedAlerts. Fixes #389 * feat: add firewall status widget for server stats (#484) * Feature: PWA (#479) * feat: add PWA support with offline capabilities - Add web app manifest with icons and theme configuration - Add service worker with cache-first strategy for static assets - Add useServiceWorker hook for SW registration - Add PWA meta tags and Apple-specific tags to index.html - Update vite.config.ts for optimal asset caching * Update package-lock.json * New Crowdin updates (#472) * New translations en.json (Romanian) * New translations en.json (French) * New translations en.json (Spanish) * New translations en.json (Afrikaans) * New translations en.json (Arabic) * New translations en.json (Catalan) * New translations en.json (Czech) * New translations en.json (Danish) * New translations en.json (German) * New translations en.json (Greek) * New translations en.json (Finnish) * New translations en.json (Hebrew) * New translations en.json (Hungarian) * New translations en.json (Italian) * New translations en.json (Japanese) * New translations en.json (Korean) * New translations en.json (Dutch) * New translations en.json (Norwegian) * New translations en.json (Polish) * New translations en.json (Portuguese) * New translations en.json (Russian) * New translations en.json (Serbian (Cyrillic)) * New translations en.json (Swedish) * New translations en.json (Turkish) * New translations en.json (Ukrainian) * New translations en.json (Chinese Simplified) * New translations en.json (English) * New translations en.json (Vietnamese) * New translations en.json (German) * feat: add listening ports widget for server stats (#483) Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * feat: fix network stats merge and add openapi jsdocs comments * feat: add workflow/config to auto generate openapi json * feat: remove locales * feat: support URL routes to … * fix: unable to delete OIDC user due to missing table cleanup (#576) deleteUserAndRelatedData was missing cleanup for networkTopology, dashboardPreferences, and opksshTokens tables. When deleting an OIDC user who had records in these tables, the final DELETE on users hit SQLITE_CONSTRAINT_FOREIGNKEY. Add explicit deletes for all three tables before the user row deletion. * fix: use lightweight wget for Docker healthcheck (#558) - Replace node -e healthcheck with wget (avoid spawning full Node.js process) - Increase start-period from 30s to 60s for slower machines * feat: add "Remember Me" option to login (#585) When checked, browser sessions get 30-day expiry (same as desktop) instead of the default 7-day. The flag is passed through the full login chain including TOTP verification flow. * feat: expand environment variables in file manager path bar (#583) Resolve $VAR and ~ paths via SSH echo before navigating. Add /ssh/resolvePath backend endpoint, resolveSSHPath API function, and intercept in loadDirectory. Fix confirmEditingPath not to prefix ~ or $ paths with /. * fix: add Ctrl+Shift+C keyboard shortcut for terminal copy (#581) Ctrl+Shift+C was not handled in the custom key event handler, so users had no keyboard shortcut to copy selected text from the terminal. Adds the shortcut alongside existing Cmd+C (macOS) support, copying the current selection to clipboard. * feat: add OIDC user allowlist for registration control (#580) Add allowed_users field to OIDC config supporting comma-separated patterns: exact emails (user@example.com), domain suffixes (@example.com), or empty for unrestricted access. Only new user registrations are checked; existing users and first-user setup are unaffected. * fix: OIDC redirect_uri incorrectly resolves to localhost (#577) The OIDC authorize endpoint used the client Origin header to build the redirect_uri. Desktop/mobile apps connecting to a remote server send their local origin (e.g. http://localhost:5173), which got force-rewritten to http://localhost:30001. This broke OIDC for all non-browser clients. Use req.protocol + req.get("Host") instead, which correctly resolves to the server's own address. trust proxy is already enabled so this works behind reverse proxies too. * fix: keep terminal tab open on connection failure (#574) When SSH connection fails before being established, the terminal tab auto-closes immediately, leaving no error message visible to the user. Added wasConnectedRef to track whether the connection was ever established. Now only auto-closes tab on disconnect if it was previously connected. If never connected, shows error message instead. * fix: prevent restart loop when PUID/PGID is set to 0 (#571) When PUID=0, usermod sets the node user's UID to 0 (root), then gosu re-executes the script as node — but since node is now UID 0, the id check passes again, causing an infinite loop. Skip the gosu step when PUID=0 since the process is already root. * feat: add README translations for 12 additional languages (#569) Add translated README files for: Japanese, Korean, French, German, Spanish, Portuguese (BR), Russian, Arabic, Hindi, Turkish, Vietnamese, and Italian. Update language navigation bar in all README files including existing English and Chinese versions. * fix: allow OIDC users to export database without password (#575) OIDC users have no password, but the export endpoint unconditionally required password authentication. This reuses the same OIDC branch pattern already implemented in the import endpoint: skip password validation for OIDC users and authenticate via authenticateOIDCUser instead. Frontend now also skips the password input for OIDC users. * fix: SSH session leak — SFTP channel reuse + shared connection pool (#556) - Cache SFTP channel per session in file-manager, reuse across all operations - Remove all sftp.end() calls, channel lifecycle follows session - Auto-rebuild SFTP channel on error/close events - Extract SSHConnectionPool from server-stats into shared module - Factory-based pool API: getConnection(key, factory) / withConnection() - Migrate server-stats and tunnel killRemoteTunnelByMarker to shared pool - Refactor tunnel kill from callback hell to async/await Fixes: Termix-SSH/Support#485 * fix: handle DEC private mode sequences in syntax highlighter (#562) Extend CSI parameter byte matching to include ?, >, =, ! per ECMA-48. Previously sequences like \x1b[?1h and \x1b[?25l were not recognized as ANSI segments and fell through to plain text processing. * fix: catch disconnected client error in listFiles fallback (#564) When SFTP times out and the fallback calls client.exec() on an already-disconnected SSH client, the synchronous throw was not caught, crashing the backend process. * fix: forward Shift+Tab as backtab escape sequence (#563) Explicitly handle Shift+Tab in the custom key event handler by sending \x1b[Z (CSI Z) directly, with preventDefault to stop browser/WebView focus navigation from consuming the keystroke. * fix: disable font ligatures in terminal by default (#561) Nerd Fonts ligatures cause != to render as ≠, <= as ≤, etc. This is confusing for terminal use and breaks cursor positioning. * fix: bypass ls alias in file manager fallback (#560) - Add --color=never to command ls in SFTP fallback path - Use /bin/ls absolute path in sudo fallback to avoid alias/wrapper * feat: add overwrite option for JSON host import (#559) - Add overwrite mode to bulk-import endpoint, matching by ip:port:username - Import button now shows dropdown with "skip existing" and "overwrite existing" options - Response includes created/updated/skipped/failed counts * fix: status check tcpPing causing kex_exchange_identification flood in sshd logs (#557) - Complete SSH identification exchange before closing socket in tcpPing - Read server banner, send client identification string, then close gracefully - Prevents sshd from logging kex_exchange_identification errors on every ping - Increase default statusCheckInterval from 30s to 60s * fix: add WebSocket protocol-level ping to prevent proxy timeouts (#572) The existing application-level ping (JSON message via setInterval) stops working when the browser tab is backgrounded due to timer throttling. Reverse proxies like Cloudflare (100s) and Nginx Proxy Manager (60s) then drop the idle WebSocket connection. Add server-side ws.ping() every 30s for both terminal and docker console WebSocket servers. Protocol-level pings are handled by the browser's WebSocket implementation, unaffected by tab throttling. * feat: embed backend server in Electron desktop app (#539) * feat: embed backend server in Electron desktop app - Fork backend process on app startup (production mode only) - Store data in userData/server-data for desktop users - Unpack dist/ and native modules (better-sqlite3, ssh2) from asar - Resolve asar vs asar.unpacked paths for forked process - Serve frontend static files from Express for iframe auth flow - Add SPA fallback for non-API routes - Graceful shutdown with SIGTERM + 5s force kill - Add get-embedded-server-status IPC handler * fix: improve electron embedded server reliability - Extract duplicate fetch polyfill to shared httpFetch function - Wait for backend ready before creating window (15s timeout) - Use IPC message for graceful shutdown (SIGTERM doesn't work on Windows) - Simplify SPA fallback to use Accept header instead of route blacklist - Add IPC shutdown handler in backend starter * feat: system tray minimize and runtime server switching * fix: resolve all 274 ESLint errors in backend source files (#591) - Remove unused imports and variables (110 no-unused-vars) - Replace explicit any with proper types (80 no-explicit-any) - Add comments to intentionally empty catch blocks (66 no-empty) - Fix no-extra-boolean-cast, prefer-const, no-async-promise-executor - No logic changes, lint-only cleanup * fix: add missing clipboard shortcuts for terminal and docker console (#589) Terminal and Docker Console were missing Ctrl+Shift+C (copy selection), Ctrl+Insert (copy), and Shift+Insert (paste) shortcuts. Docker Console also lacked Ctrl+V paste entirely. Added consistent clipboard key handlers to both components. * fix: resolve all ESLint errors and increase CI heap size (#588) * fix: resolve all ESLint errors blocking CI - Downgrade mass legacy violations to warnings (no-unused-vars, no-explicit-any, no-empty, no-unused-expressions) - Turn off no-control-regex (terminal app uses control chars) - Ignore dist/release/Mobile dirs from linting - Auto-fix prefer-const, no-extra-boolean-cast - Fix real bugs: async promise executor, rules-of-hooks, dupe-else-if, constant-binary-expression, case-declarations - Run prettier --write on all files * fix: increase Node.js heap size for CI build step vite build OOMs on 2vCPU runner with default heap limit. Set NODE_OPTIONS=--max-old-space-size=4096 to prevent it. --------- Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix: reduce excessive disk writes from unconditional database persistence (#590) The in-memory database was serialized, encrypted, and written to disk every 15 seconds regardless of whether any data had changed. Combined with the 2-second debounced save trigger on every modification, this caused ~1GB/hour of disk writes even when idle. Add a dirty flag so the periodic save only writes when data has actually changed, and increase the safety-net interval from 15 seconds to 5 minutes. Triggered saves (on actual data modifications) continue to fire after the existing 2-second debounce. Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> * fix: opkssh 404 and browser issues * fix: resolve backend TypeScript strict compilation errors (#592) Fix 56 type errors under tsconfig.node.json caused by overly broad unknown/Record<string, unknown> types from the ESLint cleanup. - Add JumpHostConfig interface for jump host chain resolution - Use proper types for resolvedCredentials, ConnectConfig, ProxyNode - Fix setWindow call to pass all 4 required arguments - Remove duplicate responseTimeout declarations in same scope - Add missing ClientChannel import * fix: clear Electron partition cookies on auth failure and logout (#599) When the Docker container is recreated, a new JWT secret is generated and all existing tokens become invalid. The 401 interceptor clears localStorage and document.cookie, but the Electron persistent partition cookies (partition: "persist:termix") are managed by Chromium and not accessible via document.cookie. This leaves the stale token in place, causing an infinite 401 retry loop and UI flickering. Add a clear-session-cookies IPC handler in the main process that uses session.cookies API to remove all partition cookies. Invoke it from the 401 interceptor and logoutUser function in the renderer. * refactor: unify Drizzle schema property names to camelCase (#598) * feat: add bulk host settings editing with multi-select UI Add PATCH /ssh/bulk-update endpoint for partial updates on multiple hosts. Frontend adds selection mode with checkboxes, folder-level select-all, and a floating action bar for monitoring, features, folder, and pin operations. * fix: correct Drizzle schema field name access for SSH credentials The sshCredentials schema uses mixed naming: private_key and key_password (snake_case) but authType and keyType (camelCase). Multiple files accessed these fields with wrong names, causing undefined values at runtime. Fixed direct bugs: - docker.ts: host.keyPassword -> host.key_password - docker-console.ts: jumpHost.keyPassword -> jumpHost.key_password - auth-manager.ts: cred.privateKey -> cred.private_key - auth-manager.ts: cred.passphrase -> cred.key_password Cleaned up redundant fallback patterns (e.g. credential.auth_type || credential.authType) across 8 files to use the correct property name directly. * refactor: unify Drizzle schema property names to camelCase Rename 18 snake_case Drizzle schema properties to camelCase across users, sshData, and sshCredentials tables. SQL column names unchanged, no database migration needed. This fixes the root cause of field name mismatch bugs where code accessed Drizzle results using camelCase but schema used snake_case. Updated all references across 21 files: routes, SSH modules, crypto utilities, type definitions, and field encryption mappings. * feat: add bulk host settings editing with multi-select UI (#596) Add PATCH /ssh/bulk-update endpoint for partial updates on multiple hosts. Frontend adds selection mode with checkboxes, folder-level select-all, and a floating action bar for monitoring, features, folder, and pin operations. * feat: add global default for status check and metrics intervals (#595) Add global monitoring interval settings that apply to all hosts by default, with per-host override capability. Hosts use the global default unless explicitly configured with a custom interval. * fix: shared credentials fail for OIDC users due to missing re-encryption (#593) When an admin shares a host with an OIDC user who hasn't logged in yet, a pending shared credential is created with needsReEncryption=true. The OIDC callback login path was missing the call to reEncryptPendingCredentialsForUser(), so the credential stayed pending forever. Additionally, server-stats.ts accessed the shared credential without a null check, causing a crash. - Add reEncryptPendingCredentialsForUser() call to OIDC callback login - Add null guard for getSharedCredentialForUser() in server-stats.ts * feat: SSH session persistence across browser refresh (#594) * feat: decouple SSH session lifecycle from WebSocket connections SSH sessions now persist independently of browser tab state. When a WebSocket disconnects (tab close/refresh), the SSH connection is detached rather than destroyed, allowing reattachment within a configurable idle timeout (default 30 min). - Add TerminalSessionManager singleton with output buffering, idle timeout, health checks, and per-user session limits - Refactor terminal.ts to route SSH state through session manager - Frontend tracks session IDs in localStorage for reconnection - Tabs persist to localStorage and restore on page reload - Add GET/POST /terminal/session_settings API endpoints - Clear session storage on logout * fix: resolve session persistence bugs found during code review - Fix detachWs timeout leak on double-detach (clear existing timeout first) - Fix healthCheck mutating Map during iteration (collect IDs first) - Capture sessionId at stream bind time to prevent cross-session data leakage - Add session destruction in OPKSSH/auth error paths that previously leaked - Add session destruction in shell init early-return paths - Reset isConnecting flag in attachSession handler - Use current terminal dimensions in sessionExpired handler (not stale closure) - Fix nextTabId race condition with synchronous initialization from restored tabs - Validate restored currentTab against actual restored tabs - Add clearTermixSessionStorage to logout error path * fix: correct raw SQL field name mismatches in crypto and credential routes (#601) Fix camelCase/snake_case mismatches left after #598 schema refactor: - credentials.ts: 5 remaining snake_case fields in Drizzle insert/update - data-crypto.ts: migrateUserSensitiveFields() accessed raw SQL records with camelCase keys (keyPassword, privateKey, etc.) but SELECT * returns snake_case columns, causing undefined values and silent data loss - lazy-field-encryption.ts: getSensitiveFieldsForTable() missing 4 ssh_data fields (sudoPassword, autostartPassword, autostartKey, autostartKeyPassword), migrateRecordSensitiveFields() now uses propertyToColumn() to resolve snake_case keys from raw SQL results * feat: add per-host SSH keepalive configuration (#603) * fix: correct raw SQL field name mismatches in crypto and credential routes Fix camelCase/snake_case mismatches left after #598 schema refactor: - credentials.ts: 5 remaining snake_case fields in Drizzle insert/update - data-crypto.ts: migrateUserSensitiveFields() accessed raw SQL records with camelCase keys (keyPassword, privateKey, etc.) but SELECT * returns snake_case columns, causing undefined values and silent data loss - lazy-field-encryption.ts: getSensitiveFieldsForTable() missing 4 ssh_data fields (sudoPassword, autostartPassword, autostartKey, autostartKeyPassword), migrateRecordSensitiveFields() now uses propertyToColumn() to resolve snake_case keys from raw SQL results * feat: add per-host SSH keepalive configuration MikroTik and similar devices ignore SSH-level keepalive requests, causing ssh2 to disconnect after keepaliveCountMax unanswered pings (default: 30s × 4 = 120s). Add keepaliveInterval and keepaliveCountMax to terminalConfig, allowing per-host override. Users can set keepaliveInterval to 0 to disable SSH keepalives and rely on TCP keepalive instead. Backend reads the values from hostConfig.terminalConfig sent via WebSocket. Frontend exposes the settings in the Advanced section of the terminal configuration tab. * fix: enable Electron desktop app to run standalone with embedded backend (#609) * fix: enable Electron desktop app to run standalone with embedded backend The Electron app already starts an embedded backend server via fork(), but the frontend had no awareness of it. On first launch, users were always prompted to enter a remote server URL even though a local backend was already running on localhost. - Add getEmbeddedServerStatus() to query the embedded backend via IPC - Add embeddedMode flag in main-axios.ts, detected at initialization - In embedded mode without a configured remote URL, getApiUrl() now routes each service to its own localhost port (30001, 30003, etc.) matching the dev-mode multi-port strategy - Auth.tsx checkServerConfig() detects embedded backend and skips the server configuration form, falling through to the standard login UI * fix: add explicit "Use Local Server" button and improve embedded detection The silent auto-detection of the embedded backend can fail due to IPC timing issues or backend startup failures. Add a visible "Use Local Server" button on the Server Configuration page that: - Probes http://localhost:30001/health to verify the backend is running - Sets embeddedMode and reinitializes API instances with per-port routing - Falls through to the standard login form (no iframe needed) Also adds setEmbeddedMode() export so the UI can explicitly activate embedded mode, and adds i18n keys for the new UI elements. * fix: disable asar for embedded backend, improve tray and health probe The forked backend process uses ESM imports and cannot resolve modules from inside an asar archive (NODE_PATH is CJS-only). Disabling asar ensures node_modules are plain files accessible to the backend. - Disable asar packaging so forked backend can resolve ESM imports - Remove node_modules exclusion from files config - Fix system tray: use nativeImage with template on macOS, add error handling, only minimize-to-tray when tray exists - Add retry mechanism for backend health probe (10 retries over ~30s) to handle slow backend startup - Always show "Use Local Server" button in Electron mode regardless of backend running status - Add file logging to userData for debugging GUI-launched app * feat: unified proxy + jump host pipeline with HTTP CONNECT support (#608) * fix: unify proxy and jump host connection paths SOCKS5 proxy and jump host logic were mutually exclusive — the SOCKS5 branch returned early, so jump hosts were never reached when both were configured. This affected terminal, file-manager, docker, and server-stats modules. Refactored all four modules to a unified pipeline: - createJumpHostChain() accepts optional socks5Config parameter - When both proxy and jump hosts are configured, the proxy socket is created to the first jump host internally, then used as transport - Three-branch flow: jumpHosts (with optional proxy) → proxy-only → direct - Enhanced error logging with hopIndex, totalHops, previousHop fields * feat: add HTTP CONNECT proxy support with mixed chain Extend ProxyNode.type to support 'http' alongside SOCKS4/5. New proxy-helper.ts provides: - createHttpConnectConnection(): HTTP CONNECT tunnel with Basic auth and optional existingSocket for chaining - createMixedProxyChainConnection(): routes each hop to SOCKS or HTTP CONNECT based on node type; pure-SOCKS chains still use the optimized SocksClient.createConnectionChain path - createProxyConnection(): unified entry point (backward-compatible alias for createSocks5Connection) - testProxyConnectivity(): connect through proxy to test target, measure latency socks5-helper.ts becomes a re-export shim — all existing import sites continue to work unchanged. * feat: add proxy connectivity test endpoint New POST /ssh/db/proxy/test API accepts singleProxy, proxyChain, and optional testTarget. Calls testProxyConnectivity() and returns success/latencyMs or error. Frontend testProxyConnection() function added to main-axios.ts. * feat: add connection path visualization and HTTP CONNECT UI - Proxy chain type selector now includes HTTP CONNECT option - Test Connection button calls /ssh/db/proxy/test with loading state - Connection path visualization shows the full route when proxy and/or jump hosts are configured: [You] → [Proxy] → [Jump Host] → [Target] - New i18n keys: httpConnect, testProxy, testingProxy, proxyTestSuccess, proxyTestFailed, connectionPath * fix: add Cache-Control no-store header to all API responses (#607) Backend API responses had no Cache-Control headers, making them vulnerable to caching by intermediate reverse proxies. This could cause stale data in the UI when Termix is deployed behind certain proxy configurations (e.g., SWAG, Pangolin). Add Cache-Control: no-store middleware to all 6 Express apps to prevent any proxy or browser from caching API responses. * fix: preserve external reverse proxy X-Forwarded headers in internal Nginx (#606) The internal Nginx proxy was overwriting X-Forwarded-Proto, X-Forwarded-Host, and X-Forwarded-Port with local values ($scheme, $http_host, $server_port), discarding headers set by the external reverse proxy. This caused getRequestOrigin() to always return http:// with the internal port for OpkSSH authentication URLs. Add map directives to preserve original X-Forwarded-* headers from the external proxy, falling back to local values when no external proxy is present. Also remove duplicate header directives in the WebSocket location. * fix: host update fails silently due to statsConfig double-serialization (#605) - Fix statsConfig double JSON.stringify in both frontend (createSSHHost, updateSSHHost) and backend (POST/PUT handlers). Frontend was pre- stringifying statsConfig before sending, then backend stringified again, corrupting the data after multiple edits and eventually causing Zod validation failures on the edit form. - Add missing sudoPassword field to createSSHHost and updateSSHHost submit data, which was being set in onSubmit but dropped during API call construction. - Add toast notification in handleFormError so users get visible feedback when form validation fails instead of silent no-op. * fix: Ctrl+C copies selection and clipboard error feedback (#604) * fix: correct raw SQL field name mismatches in crypto and credential routes Fix camelCase/snake_case mismatches left after #598 schema refactor: - credentials.ts: 5 remaining snake_case fields in Drizzle insert/update - data-crypto.ts: migrateUserSensitiveFields() accessed raw SQL records with camelCase keys (keyPassword, privateKey, etc.) but SELECT * returns snake_case columns, causing undefined values and silent data loss - lazy-field-encryption.ts: getSensitiveFieldsForTable() missing 4 ssh_data fields (sudoPassword, autostartPassword, autostartKey, autostartKeyPassword), migrateRecordSensitiveFields() now uses propertyToColumn() to resolve snake_case keys from raw SQL results * fix: Ctrl+C copies selection instead of sending SIGINT when text is selected When terminal has an active text selection, Ctrl+C now copies the selected text to clipboard and clears the selection. When nothing is selected, Ctrl+C sends SIGINT as before. Ctrl+Shift+C continues to work as a dedicated copy shortcut. Also adds toast notifications when clipboard operations fail instead of silently swallowing errors. Applied to both the main terminal and Docker console terminal. * fix: improve IPv6 connection handling with bracket stripping and ENETUNREACH hint (#602) Strip square brackets from IPv6 addresses at all SSH connection entry points (terminal, docker, docker-console, file-manager, server-stats, tunnel) to handle addresses entered as [::1] format. Add ENETUNREACH error hint in terminal.ts that detects IPv6 addresses and suggests checking Docker IPv6 network configuration. Also fix remaining snake_case field names in credentials.ts (same as #601). * fix: backend catch error * feat: improve selection UI * fix: remove tab naming * fix: squished ssh toolbar split ui buttons * feat: improve persistent tabs, data not saving for users, various ui inconsistencies * fix: tab context creating random context errors * fix: improve terminal session logic (not perfect)s * fix: terminal session logic creating errors and electron app not having UI to do local mode * fix: desktop build error * feat: update readme * feat: update readme * feat: update readme * Update README.md (#612) * fix: macos build failure and updated rest of the langs for readme * feat: update readmes to fix spelling error * feat: update readmes to fix spelling error * fix: oidc failures, opkssh not wokring, added some qol to selecting * fix: buyild erorr * fix: buyild erorr * fix: macos build error * fix: opkssh, macos copy/paste, admin settings global default backend crashes, oidc redirect issues, updated translations * chore: clean up files * fix: oidc http/https redirect issue * fix: build error * feat: update json import with all new fields --------- Co-authored-by: skyam25 <simonkyam@gmail.com> Co-authored-by: ZacharyZcR <PayasoNorahC@protonmail.com> Co-authored-by: Steven Josefs <s.josefs@gmx.de> Co-authored-by: Jefferson Nunn <89030989+jeffersonwarrior@users.noreply.github.com> Co-authored-by: Termix CI <ci@termix.dev> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Nunzio Marfè <nunzio.marfe@protonmail.com> Co-authored-by: Gaylord Julien <g.j@mailbox.org> Co-authored-by: Aditya Tawade <36890395+aditya-tawade@users.noreply.github.com> Co-authored-by: Deepansh Khurana <deepanshkhurana@outlook.com> Co-authored-by: Dylan Ysmal <Xenthys@users.noreply.github.com> Co-authored-by: TomyJan <TomyJan6@gmail.com> Co-authored-by: ywaf <52742690+ywaf@users.noreply.github.com>
2666 lines
126 KiB
JSON
2666 lines
126 KiB
JSON
{
|
||
"credentials": {
|
||
"credentialsViewer": "憑證檢視器",
|
||
"manageYourSSHCredentials": "安全地管理您的 SSH 憑證",
|
||
"addCredential": "新增憑證",
|
||
"createCredential": "建立憑證",
|
||
"editCredential": "編輯憑證",
|
||
"viewCredential": "查看憑證",
|
||
"duplicateCredential": "重複憑證",
|
||
"deleteCredential": "刪除憑證",
|
||
"updateCredential": "更新憑證",
|
||
"credentialName": "憑證名稱",
|
||
"credentialDescription": "描述",
|
||
"username": "使用者名稱",
|
||
"searchCredentials": "搜尋憑證...",
|
||
"selectFolder": "選擇資料夾",
|
||
"selectAuthType": "選擇身份驗證類型",
|
||
"allFolders": "所有資料夾",
|
||
"allAuthTypes": "所有身份驗證類型",
|
||
"uncategorized": "未分類",
|
||
"totalCredentials": "全部的",
|
||
"keyBased": "基於密鑰",
|
||
"passwordBased": "基於密碼",
|
||
"folders": "資料夾",
|
||
"noCredentialsMatchFilters": "沒有符合您篩選條件的憑證",
|
||
"noCredentialsYet": "尚未建立任何憑證",
|
||
"createFirstCredential": "建立您的第一個憑證",
|
||
"failedToFetchCredentials": "取得憑證失敗",
|
||
"credentialDeletedSuccessfully": "憑證已成功刪除",
|
||
"failedToDeleteCredential": "刪除憑證失敗",
|
||
"confirmDeleteCredential": "您確定要刪除憑證「{{name}}」嗎?",
|
||
"credentialCreatedSuccessfully": "憑證建立成功",
|
||
"credentialUpdatedSuccessfully": "憑證已成功更新",
|
||
"failedToSaveCredential": "儲存憑證失敗",
|
||
"failedToFetchCredentialDetails": "取得憑證詳細資訊失敗",
|
||
"failedToFetchHostsUsing": "使用此憑證取得主機失敗",
|
||
"loadingCredentials": "正在載入憑證……",
|
||
"retry": "重試",
|
||
"noCredentials": "沒有憑證",
|
||
"noCredentialsMessage": "您尚未新增任何憑證。點選「新增憑證」開始操作。",
|
||
"sshCredentials": "SSH 憑證",
|
||
"credentialsCount": "{{count}} 憑證",
|
||
"refresh": "重新整理",
|
||
"passwordRequired": "需要密碼",
|
||
"sshKeyRequired": "需要 SSH 金鑰",
|
||
"credentialAddedSuccessfully": "憑證“{{name}}”已成功添加",
|
||
"savingCredential": "正在儲存憑證...",
|
||
"updatingCredential": "正在更新憑證...",
|
||
"general": "一般的",
|
||
"description": "描述",
|
||
"folder": "資料夾",
|
||
"tags": "標籤",
|
||
"addTagsSpaceToAdd": "新增標籤(按空白鍵新增)",
|
||
"password": "密碼",
|
||
"key": "金鑰",
|
||
"sshPrivateKey": "SSH 私鑰",
|
||
"upload": "上傳",
|
||
"updateKey": "更新金鑰",
|
||
"keyPassword": "密鑰密碼",
|
||
"keyType": "金鑰類型",
|
||
"keyTypeRSA": "RSA",
|
||
"keyTypeECDSA": "ECDSA",
|
||
"keyTypeEd25519": "Ed25519",
|
||
"basicInfo": "基本訊息",
|
||
"authentication": "驗證",
|
||
"organization": "組織",
|
||
"basicInformation": "基本訊息",
|
||
"basicInformationDescription": "請輸入此憑證的基本訊息",
|
||
"authenticationMethod": "身份驗證方法",
|
||
"authenticationMethodDescription": "選擇您希望如何使用 SSH 伺服器進行身份驗證",
|
||
"organizationDescription": "使用資料夾和標籤整理您的憑證",
|
||
"enterCredentialName": "請輸入憑證名稱",
|
||
"enterCredentialDescription": "輸入描述(選擇性)",
|
||
"enterUsername": "請輸入使用者名稱",
|
||
"nameIsRequired": "憑證名稱為必填項",
|
||
"usernameIsRequired": "使用者名稱是必填項",
|
||
"authenticationType": "身份驗證類型",
|
||
"passwordAuthDescription": "使用密碼驗證",
|
||
"sshKeyAuthDescription": "使用 SSH 金鑰驗證",
|
||
"passwordIsRequired": "需要密碼",
|
||
"sshKeyIsRequired": "需要 SSH 金鑰",
|
||
"sshKeyType": "SSH 金鑰類型",
|
||
"privateKey": "私鑰",
|
||
"enterPassword": "輸入密碼",
|
||
"enterPrivateKey": "輸入私鑰",
|
||
"keyPassphrase": "密鑰口令",
|
||
"enterKeyPassphrase": "輸入密鑰密碼(選擇性)",
|
||
"keyPassphraseOptional": "可選:如果您的密鑰沒有密碼,請留空。",
|
||
"leaveEmptyToKeepCurrent": "留空以保留當前值",
|
||
"uploadKeyFile": "上傳密鑰檔案",
|
||
"generateKeyPairButton": "產生密鑰對",
|
||
"generateKeyPair": "產生密鑰對",
|
||
"generateKeyPairDescription": "產生新的 SSH 金鑰對。如果您想使用密碼保護金鑰,請先在下方的「金鑰密碼」欄位中輸入密碼。",
|
||
"deploySSHKey": "部署 SSH 金鑰",
|
||
"deploySSHKeyDescription": "向目標伺服器部署公鑰",
|
||
"sourceCredential": "來源憑證",
|
||
"targetHost": "目標主機",
|
||
"deploymentProcess": "部署流程",
|
||
"deploymentProcessDescription": "這將安全地將公鑰新增至目標主機的 ~/.ssh/authorized_keys 檔案中,而不會覆蓋現有金鑰。此操作可逆。",
|
||
"chooseHostToDeploy": "選擇要部署到的主機…",
|
||
"deploying": "正在部署…",
|
||
"name": "姓名",
|
||
"noHostsAvailable": "暫無可用主機",
|
||
"noHostsMatchSearch": "沒有符合您搜尋條件的主機",
|
||
"sshKeyGenerationNotImplemented": "SSH 金鑰產生功能即將推出",
|
||
"connectionTestingNotImplemented": "連線測試功能即將推出",
|
||
"testConnection": "測試連接",
|
||
"selectOrCreateFolder": "選擇或建立資料夾",
|
||
"noFolder": "沒有資料夾",
|
||
"orCreateNewFolder": "或建立一個新資料夾",
|
||
"addTag": "添加標籤",
|
||
"saving": "儲存...",
|
||
"credentialId": "憑證 ID",
|
||
"overview": "概述",
|
||
"security": "安全",
|
||
"usage": "用法",
|
||
"securityDetails": "安全詳情",
|
||
"securityDetailsDescription": "查看加密憑證資訊",
|
||
"credentialSecured": "憑證已安全",
|
||
"credentialSecuredDescription": "所有敏感資料均採用 AES-256 加密。",
|
||
"passwordAuthentication": "密碼驗證",
|
||
"keyAuthentication": "金鑰認證",
|
||
"securityReminder": "安全提醒",
|
||
"securityReminderText": "切勿洩漏您的登入憑證。所有資料在儲存時均已加密。",
|
||
"hostsUsingCredential": "使用此憑證的主機",
|
||
"noHostsUsingCredential": "目前沒有主機使用此憑證",
|
||
"timesUsed": "使用次數",
|
||
"lastUsed": "上次使用",
|
||
"connectedHosts": "已連接主機",
|
||
"created": "已建立",
|
||
"lastModified": "最後修改日期",
|
||
"usageStatistics": "使用情況統計",
|
||
"copiedToClipboard": "{{field}} 已複製到剪貼簿",
|
||
"failedToCopy": "複製到剪貼簿失敗",
|
||
"sshKey": "SSH 金鑰",
|
||
"createCredentialDescription": "建立新的 SSH 憑證以實現安全訪問",
|
||
"editCredentialDescription": "更新憑證資訊",
|
||
"listView": "清單",
|
||
"folderView": "資料夾",
|
||
"unknownCredential": "未知",
|
||
"confirmRemoveFromFolder": "您確定要從資料夾「{{folder}}」中刪除「{{name}}」嗎?憑證將會被移到「未分類」資料夾。",
|
||
"removedFromFolder": "已成功從資料夾移除憑證「{{name}}」。",
|
||
"failedToRemoveFromFolder": "無法從資料夾中刪除憑證",
|
||
"folderRenamed": "資料夾「{{oldName}}」已成功重新命名為「{{newName}}」。",
|
||
"failedToRenameFolder": "重新命名資料夾失敗",
|
||
"movedToFolder": "憑證「{{name}}」已成功移至「{{folder}}」。",
|
||
"failedToMoveToFolder": "無法將憑證移到資料夾",
|
||
"sshPublicKey": "SSH 公鑰",
|
||
"publicKeyNote": "公鑰是可選的,但建議用於金鑰驗證。",
|
||
"publicKeyUploaded": "公鑰已上傳",
|
||
"uploadPublicKey": "上傳公鑰",
|
||
"uploadPrivateKeyFile": "上傳私鑰檔案",
|
||
"uploadPublicKeyFile": "上傳公鑰檔案",
|
||
"privateKeyRequiredForGeneration": "產生公鑰需要私鑰。",
|
||
"failedToGeneratePublicKey": "產生公鑰失敗",
|
||
"generatePublicKey": "從私鑰生成",
|
||
"publicKeyGeneratedSuccessfully": "公鑰產生成功",
|
||
"detectedKeyType": "偵測到密鑰類型",
|
||
"detectingKeyType": "正在檢測…",
|
||
"optional": "選擇性",
|
||
"generateKeyPairNew": "產生新的密鑰對",
|
||
"generateEd25519": "生成 Ed25519",
|
||
"generateECDSA": "生成 ECDSA",
|
||
"generateRSA": "產生 RSA",
|
||
"keyTypeEcdsaP256": "ECDSA P-256 (SSH)",
|
||
"keyTypeEcdsaP384": "ECDSA P-384 (SSH)",
|
||
"keyTypeEcdsaP521": "ECDSA P-521 (SSH)",
|
||
"keyTypeDsa": "DSA (SSH)",
|
||
"keyTypeRsaSha256": "RSA-SHA2-256",
|
||
"keyTypeRsaSha512": "RSA-SHA2-512",
|
||
"keyPairGeneratedSuccessfully": "{{keyType}} 金鑰對已成功生成",
|
||
"failedToGenerateKeyPair": "密鑰對產生失敗",
|
||
"generateKeyPairNote": "直接產生新的 SSH 金鑰對。這將替換表單中任何現有的密鑰。",
|
||
"invalidKey": "無效金鑰",
|
||
"detectionError": "偵測誤差",
|
||
"removing": "移除:",
|
||
"clickToEditCredential": "點選編輯憑證",
|
||
"dragToMoveBetweenFolders": "拖曳即可在資料夾之間移動。",
|
||
"keyBasedOnlyForDeployment": "僅可部署基於 SSH 金鑰的憑證。",
|
||
"publicKeyRequiredForDeployment": "部署需要公鑰",
|
||
"selectTargetHost": "請選擇目標主機",
|
||
"keyDeployedSuccessfully": "SSH金鑰已成功部署",
|
||
"deploymentFailed": "部署失敗",
|
||
"failedToDeployKey": "SSH金鑰部署失敗",
|
||
"clickToRenameFolder": "點擊重命名資料夾",
|
||
"renameFolder": "重新命名資料夾",
|
||
"idLabel": "ID:"
|
||
},
|
||
"quickConnect": {
|
||
"title": "快速連接",
|
||
"description": "無需儲存主機配置,即可直接連接到終端機或檔案管理器工作階段。",
|
||
"ipAddress": "IP位址或主機名",
|
||
"port": "連接埠",
|
||
"username": "使用者名稱",
|
||
"password": "密碼",
|
||
"key": "SSH 私鑰",
|
||
"keyPassword": "密鑰密碼(選擇性)",
|
||
"keyType": "金鑰類型",
|
||
"uploadFile": "上傳檔案",
|
||
"pasteKey": "貼上金鑰",
|
||
"credential": "憑證",
|
||
"overrideUsername": "覆蓋憑證使用者名稱",
|
||
"overrideUsernameDesc": "請使用與憑證中儲存的使用者名稱不同的使用者名稱。",
|
||
"connectTerminal": "連接到終端機",
|
||
"connectFileManager": "連接到檔案管理器",
|
||
"cancel": "取消",
|
||
"passwordRequired": "需要密碼",
|
||
"keyRequired": "需要 SSH 金鑰",
|
||
"credentialRequired": "需要進行憑證選擇。",
|
||
"connectionEstablished": "連線已成功建立",
|
||
"connectionFailed": "連線失敗",
|
||
"autoDetect": "自動偵測",
|
||
"authentication": "驗證"
|
||
},
|
||
"dragIndicator": {
|
||
"error": "錯誤: {{error}}",
|
||
"dragging": "拖曳 {{fileName}}",
|
||
"preparing": "準備 {{fileName}}",
|
||
"readySingle": "準備下載 {{fileName}}",
|
||
"readyMultiple": "準備下載 {{count}} 個檔案",
|
||
"batchDrag": "將 {{count}} 檔案拖曳到桌面",
|
||
"dragToDesktop": "拖到桌面",
|
||
"canDragAnywhere": "您可以將檔案拖曳到桌面上的任何位置。"
|
||
},
|
||
"sshTools": {
|
||
"title": "SSH 工具",
|
||
"closeTools": "關閉 SSH 工具",
|
||
"keyRecording": "按鍵記錄",
|
||
"startKeyRecording": "開始按鍵記錄",
|
||
"stopKeyRecording": "停止按鍵記錄",
|
||
"selectTerminals": "選擇終端機:",
|
||
"typeCommands": "輸入命令(支援所有按鍵):",
|
||
"commandsWillBeSent": "命令將傳送至 {{count}} 選取的終端機。",
|
||
"settings": "設定",
|
||
"enableRightClickCopyPaste": "啟用右鍵複製/貼上",
|
||
"shareIdeas": "對 SSH 工具的未來發展方向有什麼想法嗎?歡迎分享!",
|
||
"scripts": {
|
||
"inputPlaceholder": "例如:系統指令、Docker腳本"
|
||
}
|
||
},
|
||
"snippets": {
|
||
"title": "片段",
|
||
"new": "新程式碼片段",
|
||
"create": "建立程式碼片段",
|
||
"edit": "編輯片段",
|
||
"run": "執行",
|
||
"empty": "目前還沒有片段",
|
||
"emptyHint": "建立程式碼片段以儲存常用命令",
|
||
"searchSnippets": "搜尋摘要…",
|
||
"name": "姓名",
|
||
"description": "描述",
|
||
"content": "命令",
|
||
"namePlaceholder": "例如,重啟 Nginx",
|
||
"descriptionPlaceholder": "選擇性描述",
|
||
"contentPlaceholder": "例如,sudo systemctl restart nginx",
|
||
"nameRequired": "姓名(必填)",
|
||
"contentRequired": "需要命令",
|
||
"createDescription": "建立一個新的命令片段以便快速執行",
|
||
"editDescription": "編輯此命令片段",
|
||
"deleteConfirmTitle": "刪除片段",
|
||
"deleteConfirmDescription": "您確定要刪除“{{name}}”嗎?",
|
||
"createSuccess": "程式碼片段建立成功",
|
||
"updateSuccess": "程式碼片段已成功更新",
|
||
"deleteSuccess": "程式碼片段已成功刪除",
|
||
"createFailed": "建立程式碼片段失敗",
|
||
"updateFailed": "更新程式碼片段失敗",
|
||
"deleteFailed": "刪除程式碼片段失敗",
|
||
"failedToFetch": "取得程式碼片段失敗",
|
||
"executeSuccess": "執行: {{name}}",
|
||
"copySuccess": "已將「{{name}}」複製到剪貼簿",
|
||
"runTooltip": "在終端機中執行此程式碼片段",
|
||
"copyTooltip": "複製程式碼片段到剪貼簿",
|
||
"editTooltip": "編輯此程式碼片段",
|
||
"deleteTooltip": "刪除此片段",
|
||
"newFolder": "新建資料夾",
|
||
"reorderSameFolder": "只能對同一資料夾內的程式碼片段進行重新排序",
|
||
"reorderSuccess": "程式碼片段已成功重新排序",
|
||
"reorderFailed": "重新排序程式碼片段失敗",
|
||
"deleteFolderConfirm": "刪除資料夾“{{name}}”?所有程式碼片段將移至未分類。",
|
||
"deleteFolderSuccess": "資料夾已成功刪除",
|
||
"deleteFolderFailed": "刪除資料夾失敗",
|
||
"updateFolderSuccess": "資料夾已成功更新",
|
||
"createFolderSuccess": "資料夾建立成功",
|
||
"updateFolderFailed": "更新資料夾失敗",
|
||
"createFolderFailed": "建立資料夾失敗",
|
||
"selectTerminals": "選擇終端機(選擇性)",
|
||
"executeOnSelected": "在選定的終端機上執行 {{count}} 操作",
|
||
"executeOnCurrent": "在目前終端機上執行(點擊選擇多個)",
|
||
"folder": "資料夾",
|
||
"selectFolder": "選擇一個資料夾,或留空。",
|
||
"noFolder": "無資料夾(未分類)",
|
||
"folderName": "資料夾名稱",
|
||
"folderNameRequired": "資料夾名稱為必填項",
|
||
"folderColor": "資料夾顏色",
|
||
"folderIcon": "資料夾圖示",
|
||
"preview": "預覽",
|
||
"updateFolder": "更新資料夾",
|
||
"createFolder": "建立資料夾",
|
||
"editFolder": "編輯資料夾",
|
||
"editFolderDescription": "自訂程式碼片段資料夾",
|
||
"createFolderDescription": "將你的程式碼片段整理到資料夾中"
|
||
},
|
||
"commandHistory": {
|
||
"title": "歷史",
|
||
"searchPlaceholder": "搜尋命令…",
|
||
"noTerminal": "無活動終端機",
|
||
"noTerminalHint": "開啟終端機查看其命令歷史記錄。",
|
||
"empty": "暫無命令歷史記錄",
|
||
"emptyHint": "在當前終端機中執行命令以建立其歷史記錄。",
|
||
"noResults": "未找到指令",
|
||
"noResultsHint": "沒有與「{{query}}」相符的指令",
|
||
"deleteSuccess": "命令已從歷史記錄中刪除",
|
||
"deleteFailed": "刪除命令失敗。",
|
||
"deleteTooltip": "刪除命令",
|
||
"tabHint": "如果已在使用者設定檔中啟用,則在終端機中使用 Tab 鍵可以從指令歷史記錄中自動補全指令。",
|
||
"authRequiredRefresh": "需要進行身份驗證。請刷新頁面。",
|
||
"dataAccessLockedReauth": "資料存取已鎖定。請重新驗證身份。",
|
||
"loading": "正在載入命令歷史記錄...",
|
||
"error": "載入歷史記錄時出錯"
|
||
},
|
||
"splitScreen": {
|
||
"title": "分割畫面",
|
||
"none": "沒有",
|
||
"twoSplit": "雙向",
|
||
"threeSplit": "三向",
|
||
"fourSplit": "四向",
|
||
"availableTabs": "可用標籤頁",
|
||
"dragTabsHint": "將選項卡拖曳到下面的佈局儲存格中進行分配",
|
||
"layout": "分割畫面佈局",
|
||
"dropHere": "在此處下拉標籤",
|
||
"apply": "套用拆分",
|
||
"clear": "清除分割",
|
||
"selectMode": "選擇分割畫面模式",
|
||
"helpText": "選擇您想要同時查看的標籤頁數量",
|
||
"success": "分割畫面功能已成功應用",
|
||
"cleared": "分割畫面清除",
|
||
"error": {
|
||
"noAssignments": "請至少為佈局分配一個選項卡",
|
||
"fillAllSlots": "請於申請前填寫所有 {{count}} 欄位。"
|
||
}
|
||
},
|
||
"homepage": {
|
||
"loggedInTitle": "已登入!",
|
||
"loggedInMessage": "您已登入!使用側邊欄存取所有可用工具。首先,請在「SSH 管理員」標籤中建立一個 SSH 主機。建立完成後,您可以使用側邊欄中的其他應用程式連接到該主機。",
|
||
"failedToLoadAlerts": "警示載入失敗",
|
||
"failedToDismissAlert": "未能關閉警示"
|
||
},
|
||
"serverConfig": {
|
||
"title": "伺服器配置",
|
||
"description": "設定 Termix 伺服器 URL 以連接到您的後端服務",
|
||
"serverUrl": "伺服器 URL",
|
||
"enterServerUrl": "請輸入伺服器網址",
|
||
"testConnectionFirst": "請先測試連接。",
|
||
"connectionSuccess": "連結成功!",
|
||
"connectionFailed": "連線失敗",
|
||
"connectionError": "連線錯誤",
|
||
"connected": "已連接",
|
||
"disconnected": "斷開連接",
|
||
"configSaved": "配置已成功儲存",
|
||
"saveFailed": "配置儲存失敗",
|
||
"saveError": "儲存配置時發生錯誤",
|
||
"saving": "儲存...",
|
||
"saveConfig": "儲存配置",
|
||
"helpText": "輸入您的 Termix 伺服器運作所在的 URL(例如,http://localhost:30001 或 https://your-server.com)",
|
||
"warning": "警告",
|
||
"notValidatedWarning": "URL未驗證 - 請確保其正確",
|
||
"changeServer": "變更伺服器",
|
||
"mustIncludeProtocol": "伺服器 URL 必須以 http:// 或 https:// 開頭。"
|
||
},
|
||
"versionCheck": {
|
||
"error": "版本檢查錯誤",
|
||
"checkFailed": "檢查更新失敗",
|
||
"upToDate": "應用程式已更新至最新版本",
|
||
"currentVersion": "您正在運行版本 {{version}}",
|
||
"updateAvailable": "更新可用",
|
||
"newVersionAvailable": "新版本可用!您正在執行 {{current}},但 {{latest}} 可用。",
|
||
"releasedOn": "發佈日期: {{date}}",
|
||
"downloadUpdate": "下載更新",
|
||
"dismiss": "解僱",
|
||
"checking": "正在檢查更新...",
|
||
"checkUpdates": "檢查更新",
|
||
"checkingUpdates": "正在檢查更新...",
|
||
"refresh": "重新整理",
|
||
"updateRequired": "需要更新",
|
||
"updateDismissed": "更新通知已關閉",
|
||
"noUpdatesFound": "未找到更新"
|
||
},
|
||
"common": {
|
||
"close": "關閉",
|
||
"minimize": "最小化",
|
||
"online": "在線的",
|
||
"offline": "離線",
|
||
"continue": "繼續",
|
||
"maintenance": "維護",
|
||
"degraded": "降級",
|
||
"discord": "Discord",
|
||
"error": "錯誤",
|
||
"warning": "警告",
|
||
"info": "資訊",
|
||
"success": "成功",
|
||
"loading": "載入中...",
|
||
"required": "必需的",
|
||
"optional": "選擇性",
|
||
"connect": "連接",
|
||
"connecting": "正在連接...",
|
||
"creating": "正在建立…",
|
||
"clear": "清除",
|
||
"toggleSidebar": "切換側邊欄",
|
||
"sidebar": "側邊欄",
|
||
"home": "家",
|
||
"expired": "已到期",
|
||
"expiresToday": "今天到期",
|
||
"expiresTomorrow": "將在 {{days}} 天內過期",
|
||
"updateAvailable": "更新可用",
|
||
"sshPath": "SSH 路徑",
|
||
"localPath": "本地路徑",
|
||
"appName": "Termix",
|
||
"openInNewTab": "在新分頁中開啟",
|
||
"resetSidebarWidth": "重置側邊欄寬度",
|
||
"dragToResizeSidebar": "拖曳即可調整側邊欄大小",
|
||
"noAuthCredentials": "此 SSH 主機沒有可用的身份驗證憑證",
|
||
"noReleases": "無發布",
|
||
"updatesAndReleases": "更新與發布",
|
||
"newVersionAvailable": "新版本({{version}})可用。",
|
||
"failedToFetchUpdateInfo": "取得更新資訊失敗",
|
||
"preRelease": "預發布",
|
||
"loginFailed": "登入失敗",
|
||
"noReleasesFound": "未找到任何版本。",
|
||
"yourBackupCodes": "您的備用代碼",
|
||
"sendResetCode": "發送重置代碼",
|
||
"verifyCode": "驗證碼",
|
||
"resetPassword": "重設密碼",
|
||
"resetCode": "重置程式碼",
|
||
"newPassword": "新密碼",
|
||
"folder": "資料夾",
|
||
"file": "檔案",
|
||
"renamedSuccessfully": "重新命名成功",
|
||
"deletedSuccessfully": "已成功刪除",
|
||
"noTunnelConnections": "未配置隧道連接",
|
||
"sshTools": "SSH 工具",
|
||
"english": "英語",
|
||
"chinese": "中國人",
|
||
"german": "德文",
|
||
"cancel": "取消",
|
||
"username": "使用者名稱",
|
||
"name": "姓名",
|
||
"login": "登入",
|
||
"logout": "登出",
|
||
"register": "登記",
|
||
"password": "密碼",
|
||
"version": "版本",
|
||
"confirmPassword": "確認密碼",
|
||
"back": "後退",
|
||
"email": "電子郵件",
|
||
"submit": "提交",
|
||
"change": "改變",
|
||
"save": "儲存",
|
||
"saving": "儲存...",
|
||
"delete": "刪除",
|
||
"edit": "編輯",
|
||
"add": "添加",
|
||
"search": "搜尋",
|
||
"confirm": "確認",
|
||
"yes": "是的",
|
||
"no": "不",
|
||
"ok": "好的",
|
||
"enabled": "已啟用",
|
||
"disabled": "已停用",
|
||
"important": "重要的",
|
||
"notEnabled": "未啟用",
|
||
"settingUp": "正在設定…",
|
||
"next": "下一個",
|
||
"previous": "以前的",
|
||
"refresh": "重新整理",
|
||
"settings": "設定",
|
||
"profile": "輪廓",
|
||
"help": "幫助",
|
||
"about": "關於",
|
||
"language": "語言",
|
||
"autoDetect": "自動偵測",
|
||
"changeAccountPassword": "更改您的帳戶密碼",
|
||
"passwordResetTitle": "密碼重設",
|
||
"passwordResetDescription": "您即將重置密碼。這將使您退出所有活動會話。",
|
||
"enterSixDigitCode": "請輸入 Docker 容器日誌中該使用者的 6 位元代碼:",
|
||
"enterNewPassword": "請輸入使用者的新密碼:",
|
||
"passwordsDoNotMatch": "密碼不匹配",
|
||
"passwordMinLength": "密碼長度必須至少為 6 個字元。",
|
||
"passwordResetSuccess": "密碼重置成功!現在您可以使用新密碼登入。",
|
||
"failedToInitiatePasswordReset": "密碼重置失敗",
|
||
"failedToVerifyResetCode": "重置程式碼驗證失敗",
|
||
"failedToCompletePasswordReset": "密碼重置失敗",
|
||
"documentation": "說明文件",
|
||
"retry": "重試",
|
||
"checking": "檢查...",
|
||
"checkingDatabase": "正在檢查資料庫連線...",
|
||
"checkingAuthentication": "正在檢查身份驗證...",
|
||
"actions": "行動",
|
||
"remove": "消除",
|
||
"revoke": "撤銷",
|
||
"create": "建立",
|
||
"update": "更新"
|
||
},
|
||
"nav": {
|
||
"home": "家",
|
||
"hosts": "主持人",
|
||
"credentials": "證書",
|
||
"terminal": "終端機",
|
||
"docker": "Docker",
|
||
"tunnels": "隧道",
|
||
"fileManager": "檔案管理器",
|
||
"serverStats": "伺服器統計訊息",
|
||
"admin": "管理員",
|
||
"userProfile": "用戶個人資料",
|
||
"tools": "工具",
|
||
"snippets": "片段",
|
||
"newTab": "新標籤頁",
|
||
"splitScreen": "分割畫面",
|
||
"closeTab": "關閉標籤頁",
|
||
"sshManager": "SSH 管理器",
|
||
"hostManager": "主機管理器",
|
||
"cannotSplitTab": "無法拆分此標籤頁",
|
||
"tabNavigation": "標籤導航",
|
||
"hostTabTitle": "{{username}}@{{ip}}:{{port}}",
|
||
"copyPassword": "複製密碼",
|
||
"copySudoPassword": "複製 sudo 密碼",
|
||
"passwordCopied": "密碼已複製到剪貼簿",
|
||
"sudoPasswordCopied": "sudo 密碼已複製到剪貼簿",
|
||
"noPasswordAvailable": "沒有可用密碼"
|
||
},
|
||
"admin": {
|
||
"title": "管理員設定",
|
||
"oidc": "OIDC",
|
||
"users": "使用者",
|
||
"userManagement": "使用者管理",
|
||
"makeAdmin": "管理員",
|
||
"removeAdmin": "移除管理員",
|
||
"deleteUser": "刪除使用者 {{username}}?此操作無法撤銷。",
|
||
"allowRegistration": "允許註冊",
|
||
"oidcSettings": "OIDC 設定",
|
||
"clientId": "客戶ID",
|
||
"clientSecret": "客戶機密",
|
||
"issuerUrl": "發行者 URL",
|
||
"authorizationUrl": "授權 URL",
|
||
"tokenUrl": "令牌 URL",
|
||
"updateSettings": "更新設定",
|
||
"confirmDelete": "您確定要刪除此使用者嗎?",
|
||
"confirmMakeAdmin": "你確定要將 {{username}} 設定為管理員嗎?",
|
||
"confirmRemoveAdmin": "您確定要從 {{username}}移除管理員身分嗎?",
|
||
"externalAuthentication": "外部認證(OIDC)",
|
||
"configureExternalProvider": "配置用於 OIDC/OAuth2 驗證的外部身分提供者。",
|
||
"userIdentifierPath": "使用者標識符路徑",
|
||
"displayNamePath": "顯示名稱路徑",
|
||
"scopes": "瞄準鏡",
|
||
"saving": "儲存...",
|
||
"saveConfiguration": "儲存配置",
|
||
"reset": "重置",
|
||
"success": "成功",
|
||
"loading": "載入中...",
|
||
"refresh": "重新整理",
|
||
"loadingUsers": "正在載入用戶...",
|
||
"username": "使用者名稱",
|
||
"type": "類型",
|
||
"actions": "行動",
|
||
"external": "外部的",
|
||
"local": "本地",
|
||
"adminManagement": "管理員管理",
|
||
"makeUserAdmin": "將使用者設為管理員",
|
||
"adding": "添加…",
|
||
"currentAdmins": "目前管理員",
|
||
"adminBadge": "管理員",
|
||
"removeAdminButton": "移除管理員",
|
||
"general": "一般的",
|
||
"userRegistration": "用戶註冊",
|
||
"allowNewAccountRegistration": "允許新帳戶註冊",
|
||
"allowPasswordLogin": "允許使用者名稱/密碼登入",
|
||
"allowPasswordReset": "允許透過重置碼重置密碼",
|
||
"missingRequiredFields": "缺少必填欄位: {{fields}}",
|
||
"oidcConfigurationUpdated": "OIDC配置更新成功!",
|
||
"failedToFetchOidcConfig": "取得 OIDC 配置失敗",
|
||
"failedToFetchRegistrationStatus": "取得註冊狀態失敗",
|
||
"failedToFetchPasswordLoginStatus": "取得密碼登入狀態失敗",
|
||
"failedToFetchUsers": "取得用戶失敗",
|
||
"oidcConfigurationDisabled": "OIDC配置已成功停用!",
|
||
"failedToUpdateOidcConfig": "更新 OIDC 配置失敗",
|
||
"failedToDisableOidcConfig": "停用 OIDC 配置失敗",
|
||
"enterUsernameToMakeAdmin": "輸入使用者名稱以建立管理員",
|
||
"userIsNowAdmin": "使用者 {{username}} 現在是管理員",
|
||
"failedToMakeUserAdmin": "建立使用者管理員失敗",
|
||
"removeAdminStatus": "從 {{username}}移除管理員身分?",
|
||
"adminStatusRemoved": "管理員身分已從 {{username}}移除",
|
||
"failedToRemoveAdminStatus": "移除管理員狀態失敗",
|
||
"userDeletedSuccessfully": "使用者 {{username}} 已成功刪除",
|
||
"failedToDeleteUser": "刪除用戶失敗",
|
||
"overrideUserInfoUrl": "覆蓋使用者資訊 URL(非必要)",
|
||
"failedToFetchSessions": "取得會話失敗",
|
||
"sessionRevokedSuccessfully": "會話已成功撤銷",
|
||
"failedToRevokeSession": "撤銷會話失敗",
|
||
"confirmRevokeSession": "您確定要撤銷本次會話嗎?",
|
||
"confirmRevokeAllSessions": "您確定要撤銷該使用者的所有會話嗎?",
|
||
"failedToRevokeSessions": "撤銷會話失敗",
|
||
"sessionsRevokedSuccessfully": "會話已成功撤銷",
|
||
"linkToPasswordAccount": "連結到密碼帳戶",
|
||
"linkOIDCDialogTitle": "將 OIDC 帳戶關聯到密碼帳戶",
|
||
"linkOIDCDialogDescription": "將 {{username}} (OIDC 使用者)連結到現有密碼帳戶。這將為該密碼帳戶啟用雙重驗證。",
|
||
"createUser": "建立用戶",
|
||
"createUserDescription": "使用用戶名和密碼建立一個新的本機用戶",
|
||
"enterUsername": "請輸入使用者名稱",
|
||
"enterPassword": "輸入密碼",
|
||
"userCreatedSuccessfully": "使用者 {{username}} 建立成功",
|
||
"failedToCreateUser": "建立使用者失敗",
|
||
"manageUser": "管理用戶",
|
||
"manageUserDescription": "管理使用者設定、角色和權限",
|
||
"authType": "身份驗證類型",
|
||
"adminStatus": "管理員狀態",
|
||
"userId": "使用者身分",
|
||
"regularUser": "普通用戶",
|
||
"adminPrivileges": "管理員權限",
|
||
"administratorRole": "管理員角色",
|
||
"administratorRoleDescription": "授予完全系統存取和管理權限",
|
||
"passwordManagement": "密碼管理",
|
||
"passwordResetWarning": "重設使用者密碼會刪除其所有資料(SSH 主機、憑證、設定)。此操作無法撤銷。",
|
||
"resetUserPassword": "重置用戶密碼",
|
||
"resettingPassword": "正在重置…",
|
||
"passwordResetInitiated": "已對 {{username}}發起密碼重設。已發送重置代碼。",
|
||
"failedToResetPassword": "密碼重置失敗",
|
||
"sessionManagement": "會話管理",
|
||
"revokeAllSessions": "撤銷所有會話",
|
||
"revokeAllSessionsDescription": "強制從所有設備和會話中登出",
|
||
"revoking": "撤銷…",
|
||
"revoke": "撤銷所有",
|
||
"dangerZone": "危險區域",
|
||
"deleteUserTitle": "刪除用戶帳戶",
|
||
"deleteUserWarning": "永久刪除此使用者帳戶及其所有關聯資料。此操作無法撤銷。",
|
||
"deleting": "正在刪除…",
|
||
"cannotDeleteSelf": "您無法刪除自己的帳戶",
|
||
"cannotRemoveLastAdmin": "無法移除最後一位管理員",
|
||
"cannotRemoveOwnAdmin": "您無法移除自己的管理員權限。",
|
||
"cannotModifyOwnAdminStatus": "您無法修改自己的管理員狀態",
|
||
"dualAuth": "雙重認證",
|
||
"externalOIDC": "外部(OIDC)",
|
||
"localPassword": "本地密碼",
|
||
"confirmRevokeOwnSessions": "您確定要撤銷所有會話嗎?您將被登出。",
|
||
"linkOIDCWarningTitle": "警告:OIDC用戶資料將被刪除",
|
||
"linkOIDCActionDeleteUser": "刪除 OIDC 使用者帳戶及其所有數據",
|
||
"linkOIDCActionAddCapability": "在目標密碼帳戶中新增 OIDC 登入功能",
|
||
"linkOIDCActionDualAuth": "允許密碼帳戶同時使用密碼和 OIDC 登入",
|
||
"linkTargetUsernameLabel": "目標密碼帳戶用戶名",
|
||
"linkTargetUsernamePlaceholder": "請輸入使用者名稱或密碼帳戶",
|
||
"linkAccountsButton": "關聯帳戶",
|
||
"linkingAccounts": "正在連接…",
|
||
"accountsLinkedSuccessfully": "OIDC 使用者 {{oidcUsername}} 已關聯至 {{targetUsername}}",
|
||
"failedToLinkAccounts": "帳戶關聯失敗",
|
||
"linkTargetUsernameRequired": "目標使用者名稱是必填項",
|
||
"unlinkOIDCTitle": "取消 OIDC 驗證",
|
||
"unlinkOIDCDescription": "從 {{username}}移除OIDC驗證?之後用戶將只能使用用戶名/密碼登入。",
|
||
"unlinkOIDCSuccess": "OIDC 已從 {{username}}斷開連接",
|
||
"failedToUnlinkOIDC": "取消連結 OIDC 失敗",
|
||
"databaseSecurity": "資料庫安全",
|
||
"encryptionStatus": "加密狀態",
|
||
"encryptionEnabled": "已啟用加密",
|
||
"enabled": "已啟用",
|
||
"disabled": "已停用",
|
||
"keyId": "密鑰 ID",
|
||
"created": "建立",
|
||
"migrationStatus": "移民狀態",
|
||
"migrationCompleted": "遷移完成",
|
||
"migrationRequired": "需要遷移",
|
||
"deviceProtectedMasterKey": "環境保護主金鑰",
|
||
"legacyKeyStorage": "傳統密鑰存儲",
|
||
"masterKeyEncryptedWithDeviceFingerprint": "使用環境指紋加密的主金鑰(KEK保護已啟動)",
|
||
"keyNotProtectedByDeviceBinding": "金鑰未受環境綁定保護(建議升級)",
|
||
"valid": "有效的",
|
||
"initializeDatabaseEncryption": "初始化資料庫加密",
|
||
"enableAes256EncryptionWithDeviceBinding": "啟用基於環境的主金鑰保護的 AES-256 加密。這可為 SSH 金鑰、密碼和驗證令牌建立企業級安全性。",
|
||
"featuresEnabled": "已啟用功能:",
|
||
"aes256GcmAuthenticatedEncryption": "AES-256-GCM 認證加密",
|
||
"deviceFingerprintMasterKeyProtection": "環境指紋主金鑰保護(KEK)",
|
||
"pbkdf2KeyDerivation": "使用 10 萬次迭代的 PBKDF2 金鑰派生",
|
||
"automaticKeyManagement": "自動金鑰管理和輪換",
|
||
"initializing": "正在初始化...",
|
||
"initializeEnterpriseEncryption": "初始化企業加密",
|
||
"migrateExistingData": "遷移現有數據",
|
||
"encryptExistingUnprotectedData": "對資料庫中現有的未加密資料進行加密。此過程安全可靠,並會自動建立備份。",
|
||
"testMigrationDryRun": "驗證加密相容性",
|
||
"migrating": "正在遷移…",
|
||
"migrateData": "遷移資料",
|
||
"securityInformation": "安全資訊",
|
||
"sshPrivateKeysEncryptedWithAes256": "SSH 私鑰和密碼使用 AES-256-GCM 加密。",
|
||
"userAuthTokensProtected": "使用者身份驗證令牌和雙重認證金鑰受到保護",
|
||
"masterKeysProtectedByDeviceFingerprint": "主加密金鑰受裝置指紋(KEK)保護。",
|
||
"keysBoundToServerInstance": "金鑰與目前伺服器環境綁定(可透過環境變數遷移)",
|
||
"pbkdf2HkdfKeyDerivation": "PBKDF2 + HKDF 金鑰派生演算法,迭代次數 10 萬次",
|
||
"backwardCompatibleMigration": "遷移過程中所有資料均保持向後相容。",
|
||
"enterpriseGradeSecurityActive": "企業級安全主動",
|
||
"masterKeysProtectedByDeviceBinding": "您的主加密金鑰受環境指紋辨識保護。該技術使用伺服器主機名稱、路徑和其他環境資訊來產生保護金鑰。若要遷移伺服器,請在新伺服器上設定 DB_ENCRYPTION_KEY 環境變數。",
|
||
"important": "重要的",
|
||
"keepEncryptionKeysSecure": "確保資料安全:定期備份資料庫檔案和伺服器配置。若要遷移到新伺服器,請在新環境中設定 DB_ENCRYPTION_KEY 環境變量,或保持相同的主機名稱和目錄結構。",
|
||
"loadingEncryptionStatus": "正在載入加密狀態...",
|
||
"testMigrationDescription": "驗證現有資料是否可以安全地遷移到加密格式,而不會實際修改任何資料。",
|
||
"serverMigrationGuide": "伺服器遷移指南",
|
||
"migrationInstructions": "若要將加密資料遷移到新伺服器:1) 備份資料庫檔案;2) 在新伺服器上設定環境變數 DB_ENCRYPTION_KEY=\"your-key\";3) 還原資料庫檔案",
|
||
"environmentProtection": "環境保護",
|
||
"environmentProtectionDesc": "根據伺服器環境資訊(主機名稱、路徑等)保護加密金鑰,可透過環境變數遷移。",
|
||
"verificationCompleted": "相容性驗證完成 - 無資料更改",
|
||
"verificationInProgress": "驗證完成",
|
||
"dataMigrationCompleted": "資料遷移成功完成!",
|
||
"verificationFailed": "相容性驗證失敗",
|
||
"migrationFailed": "遷移失敗",
|
||
"runningVerification": "正在運行兼容性驗證…",
|
||
"startingMigration": "開始遷移…",
|
||
"hardwareFingerprintSecurity": "硬體指紋安全",
|
||
"hardwareBoundEncryption": "硬體加密已激活",
|
||
"masterKeysNowProtectedByHardwareFingerprint": "主密鑰現在由真正的硬體指紋辨識技術而非環境變數來保護。",
|
||
"cpuSerialNumberDetection": "CPU序號偵測",
|
||
"motherboardUuidIdentification": "主機板 UUID 識別",
|
||
"diskSerialNumberVerification": "磁碟序號驗證",
|
||
"biosSerialNumberCheck": "BIOS序號檢查",
|
||
"stableMacAddressFiltering": "穩定的MAC位址過濾",
|
||
"databaseFileEncryption": "資料庫檔案加密",
|
||
"dualLayerProtection": "雙層主動防護",
|
||
"bothFieldAndFileEncryptionActive": "為了最大限度地保障安全,欄位級和檔案級加密現已同時啟用。",
|
||
"fieldLevelAes256Encryption": "對敏感資料進行欄位級 AES-256 加密",
|
||
"fileLevelDatabaseEncryption": "使用硬體綁定進行檔案層級資料庫加密",
|
||
"hardwareBoundFileKeys": "硬體綁定的檔案加密金鑰",
|
||
"automaticEncryptedBackups": "自動建立加密備份",
|
||
"createEncryptedBackup": "建立加密備份",
|
||
"creatingBackup": "正在建立備份...",
|
||
"backupCreated": "備份已建立",
|
||
"encryptedBackupCreatedSuccessfully": "加密備份已成功建立",
|
||
"backupCreationFailed": "建立備份失敗",
|
||
"databaseMigration": "資料庫遷移",
|
||
"exportForMigration": "導出遷移",
|
||
"exportDatabaseForHardwareMigration": "將資料庫匯出為包含解密資料的 SQLite 檔案,以便遷移到新硬體。",
|
||
"exportDatabase": "匯出 SQLite 資料庫",
|
||
"exporting": "出口...",
|
||
"exportCreated": "SQLite匯出已建立",
|
||
"exportContainsDecryptedData": "SQLite匯出檔案包含解密資料 - 請妥善保管!",
|
||
"databaseExportedSuccessfully": "SQLite資料庫已成功匯出",
|
||
"databaseExportFailed": "SQLite資料庫匯出失敗",
|
||
"importFromMigration": "從遷移導入",
|
||
"importDatabaseFromAnotherSystem": "從其他系統或硬體匯入 SQLite 資料庫",
|
||
"importDatabase": "導入 SQLite 資料庫",
|
||
"importing": "輸入...",
|
||
"selectedFile": "選定的 SQLite 檔案",
|
||
"importWillReplaceExistingData": "SQLite導入將會取代現有資料 - 建議備份!",
|
||
"pleaseSelectImportFile": "請選擇 SQLite 導入檔案",
|
||
"databaseImportedSuccessfully": "SQLite資料庫已成功導入",
|
||
"databaseImportFailed": "SQLite資料庫導入失敗",
|
||
"manageEncryptionAndBackups": "管理加密金鑰、資料庫安全性和備份操作",
|
||
"activeSecurityFeatures": "目前正在實施的安全措施和保護措施",
|
||
"deviceBindingTechnology": "先進的基於硬體的密鑰保護技術",
|
||
"backupAndRecovery": "安全備份建立和資料庫復原選項",
|
||
"crossSystemDataTransfer": "在不同系統間匯出和匯入資料庫",
|
||
"noMigrationNeeded": "無需遷移",
|
||
"encryptionKey": "加密金鑰",
|
||
"keyProtection": "金鑰保護",
|
||
"active": "積極的",
|
||
"legacy": "遺產",
|
||
"dataStatus": "資料狀態",
|
||
"encrypted": "加密",
|
||
"needsMigration": "需要遷移",
|
||
"ready": "準備好",
|
||
"initializeEncryption": "初始化加密",
|
||
"initialize": "初始化",
|
||
"test": "測試",
|
||
"migrate": "遷移",
|
||
"backup": "備份",
|
||
"createBackup": "建立備份",
|
||
"exportImport": "出口/進口",
|
||
"export": "出口",
|
||
"import": "進口",
|
||
"passwordRequired": "需要密碼",
|
||
"confirmExport": "確認出口",
|
||
"exportDescription": "將 SSH 主機和憑證匯出為 SQLite 檔案",
|
||
"importDescription": "使用增量合併導入 SQLite 檔案(跳過重複項)",
|
||
"criticalWarning": "嚴重警告",
|
||
"cannotDisablePasswordLoginWithoutOIDC": "未配置 OIDC 時無法停用密碼登入!您必須先設定 OIDC 身份驗證,才能停用密碼登錄,否則您將失去對 Termix 的存取權限。",
|
||
"confirmDisablePasswordLogin": "您確定要停用密碼登入嗎?請確保 OIDC 配置正確且運作正常後再繼續操作,否則您將失去對 Termix 實例的存取權。",
|
||
"passwordLoginDisabled": "密碼登入已成功停用",
|
||
"passwordLoginAndRegistrationDisabled": "密碼登入和新帳號註冊功能已成功停用",
|
||
"requiresPasswordLogin": "需要密碼登入",
|
||
"passwordLoginDisabledWarning": "密碼登入已停用。請確保 OIDC 配置正確,否則您將無法登入 Termix。",
|
||
"oidcRequiredWarning": "重要提示:密碼登入已停用。如果您重設或錯誤配置 OIDC,您將失去對 Termix 的所有存取權限,您的執行個體將無法正常運作。請僅在您完全確定的情況下繼續操作。",
|
||
"confirmDisableOIDCWarning": "警告:您即將停用 OIDC,同時密碼登入也已停用。這將導致您的 Termix 執行個體無法正常運作,您將失去所有存取權限。您確定要繼續操作嗎?",
|
||
"failedToUpdatePasswordLoginStatus": "更新密碼登入狀態失敗",
|
||
"loadingSessions": "正在載入會話...",
|
||
"noActiveSessions": "未找到活動會話。",
|
||
"device": "裝置",
|
||
"user": "使用者",
|
||
"lastActive": "最後活躍時間",
|
||
"expires": "過期",
|
||
"revoked": "撤銷",
|
||
"revokeAllUserSessionsTitle": "撤銷此使用者的所有會話",
|
||
"revokeAll": "撤銷所有",
|
||
"linkOidcToPasswordAccount": "將 OIDC 帳戶關聯到密碼帳戶",
|
||
"linkOidcToPasswordAccountDescription": "將 {{username}} (OIDC 使用者)連結到現有密碼帳戶。這將為該密碼帳戶啟用雙重驗證。",
|
||
"linkOidcWarningTitle": "警告:OIDC用戶資料將被刪除",
|
||
"linkOidcWarningDescription": "此操作將:",
|
||
"linkOidcActionDeleteUser": "刪除 OIDC 使用者帳戶及其所有數據",
|
||
"linkOidcActionAddCapability": "在目標密碼帳戶中新增 OIDC 登入功能",
|
||
"linkOidcActionDualAuth": "允許密碼帳戶同時使用密碼和 OIDC 登入",
|
||
"passwordMinLength": "密碼長度必須至少為 6 個字符",
|
||
"currentRoles": "目前職位",
|
||
"noRolesAssigned": "未分配任何角色",
|
||
"assignNewRole": "指派新角色"
|
||
},
|
||
"hosts": {
|
||
"title": "主機管理器",
|
||
"sshHosts": "SSH 主機",
|
||
"noHosts": "無 SSH 主機",
|
||
"noHostsMessage": "您尚未新增任何 SSH 主機。點選「新增主機」開始操作。",
|
||
"loadingHosts": "正在載入主機……",
|
||
"failedToLoadHosts": "主機載入失敗",
|
||
"retry": "重試",
|
||
"refresh": "重新整理",
|
||
"optional": "選擇性",
|
||
"hostsCount": "{{count}} 主機",
|
||
"importJson": "導入 JSON",
|
||
"importing": "輸入...",
|
||
"importJsonTitle": "從 JSON 匯入 SSH 主機",
|
||
"importJsonDesc": "上傳 JSON 檔案以批次匯入多個 SSH 主機(最多 100 個)。",
|
||
"downloadSample": "下載範例",
|
||
"formatGuide": "格式指南",
|
||
"exportCredentialWarning": "警告:主機「{{name}}」使用憑證驗證。匯出的檔案將不包含憑證數據,匯入後需要手動重新配置。是否繼續?",
|
||
"exportSensitiveDataWarning": "警告:主機「{{name}}」包含敏感的驗證資料(密碼/SSH金鑰)。匯出的檔案將以明文形式包含這些資料。請妥善保管該檔案,並在使用後刪除。是否繼續?",
|
||
"uncategorized": "未分類",
|
||
"confirmDelete": "您確定要刪除“{{name}}”嗎?",
|
||
"failedToDeleteHost": "刪除主機失敗",
|
||
"failedToExportHost": "匯出主機資訊失敗。請確保您已登入並擁有存取主機資料的權限。",
|
||
"jsonMustContainHosts": "JSON 必須包含一個名為「hosts」的數組,或者本身就是一個 hosts 數組。",
|
||
"noHostsInJson": "JSON 檔案中未找到主機",
|
||
"maxHostsAllowed": "每次導入最多允許 100 台主機",
|
||
"importCompleted": "導入完成: {{success}} 成功, {{failed}} 失敗",
|
||
"importFailed": "導入失敗",
|
||
"importError": "導入錯誤",
|
||
"failedToImportJson": "導入 JSON 檔案失敗",
|
||
"connectionDetails": "連線詳情",
|
||
"organization": "組織",
|
||
"ipAddress": "IP位址",
|
||
"port": "連接埠",
|
||
"name": "姓名",
|
||
"username": "使用者名稱",
|
||
"folder": "資料夾",
|
||
"tags": "標籤",
|
||
"pin": "置頂",
|
||
"notes": "筆記",
|
||
"expirationDate": "截止日期",
|
||
"passwordRequired": "使用密碼驗證時,需要輸入密碼。",
|
||
"sshKeyRequired": "使用金鑰認證時需要 SSH 私鑰。",
|
||
"keyTypeRequired": "使用金鑰認證時,需要指定金鑰類型。",
|
||
"mustSelectValidSshConfig": "必須從清單中選擇有效的 SSH 配置。",
|
||
"addHost": "新增主機",
|
||
"editHost": "編輯主機",
|
||
"cloneHost": "複製主機",
|
||
"updateHost": "更新主機",
|
||
"hostUpdatedSuccessfully": "主機「{{name}}」已成功更新!",
|
||
"hostAddedSuccessfully": "主機“{{name}}”新增成功!",
|
||
"hostDeletedSuccessfully": "主機“{{name}}”成功刪除!",
|
||
"failedToSaveHost": "儲存主機失敗,請重試。",
|
||
"savingHost": "拯救主機…",
|
||
"updatingHost": "正在更新主機...",
|
||
"cloningHost": "克隆主機...",
|
||
"enableTerminal": "啟用終端機",
|
||
"enableTerminalDesc": "在終端機選項卡中啟用/停用主機可見性",
|
||
"enableTunnel": "啟用隧道",
|
||
"enableTunnelDesc": "在隧道標籤中啟用/停用主機可見性",
|
||
"enableFileManager": "啟用檔案管理器",
|
||
"enableFileManagerDesc": "在檔案總管標籤中啟用/停用主機可見性",
|
||
"enableDockerDesc": "在 Docker 標籤中啟用/停用主機可見性",
|
||
"enableDocker": "啟用 Docker",
|
||
"defaultPath": "預設路徑",
|
||
"defaultPathDesc": "開啟此主機的檔案管理器時的預設目錄",
|
||
"tunnelConnections": "隧道連接",
|
||
"connection": "聯繫",
|
||
"remove": "消除",
|
||
"sourcePort": "來源連接埠",
|
||
"sourcePortDesc": " (來源指「常規」標籤中的「目前連線詳細資料」)",
|
||
"endpointPort": "端點埠",
|
||
"endpointSshConfig": "端點 SSH 配置",
|
||
"tunnelForwardDescription": "此隧道會將來源機器(常規標籤中的目前連接詳細資料)上的連接埠 {{sourcePort}} 的流量轉送到端點機器上的連接埠 {{endpointPort}} 。",
|
||
"maxRetries": "最大重試次數",
|
||
"maxRetriesDescription": "隧道連線的最大重試次數。",
|
||
"retryInterval": "重試間隔(秒)",
|
||
"retryIntervalDescription": "重試之間需要等待一段時間。",
|
||
"autoStartContainer": "容器啟動時自動啟動",
|
||
"autoStartDesc": "容器啟動時自動啟動此隧道",
|
||
"addConnection": "新增隧道連接",
|
||
"tunnelType": "隧道類型",
|
||
"tunnelTypeLocal": "本地(-L)",
|
||
"tunnelTypeRemote": "遠端(-R)",
|
||
"tunnelTypeLocalDesc": "將本機連接埠轉送到遠端端點",
|
||
"tunnelTypeRemoteDesc": "將遠端連接埠轉送至本機",
|
||
"tunnelForwardDescriptionLocal": "此隧道會將本機連接埠 {{sourcePort}} 的流量轉送至終端機上的連接埠 {{endpointPort}} 。",
|
||
"tunnelForwardDescriptionRemote": "此隧道會將來源機器(常規標籤中的目前連接詳細資料)上的連接埠 {{sourcePort}} 的流量轉送到端點機器上的連接埠 {{endpointPort}} 。",
|
||
"sshpassRequired": "密碼驗證需要使用 SSH 密碼",
|
||
"sshpassRequiredDesc": "對於隧道中的密碼認證,系統上必須安裝 sshpass。",
|
||
"otherInstallMethods": "其他安裝方法:",
|
||
"debianUbuntuEquivalent": "(Debian/Ubuntu 或適用於您作業系統的同等版本)。",
|
||
"or": "或者",
|
||
"centosRhelFedora": "CentOS/RHEL/Fedora",
|
||
"macos": "macOS",
|
||
"windows": "Windows(WSL,無官方二進位)",
|
||
"sshServerConfigRequired": "需要設定 SSH 伺服器",
|
||
"sshServerConfigDesc": "對於隧道連接,必須設定 SSH 伺服器以允許連接埠轉送:",
|
||
"gatewayPortsYes": "將遠端連接埠綁定到所有介面",
|
||
"allowTcpForwardingYes": "啟用連接埠轉送",
|
||
"permitRootLoginYes": "如果使用root使用者進行隧道連接",
|
||
"editSshConfig": "編輯 SSH 設定檔:",
|
||
"sshConfigPath": "/etc/ssh/sshd_config",
|
||
"restartSshService": "然後重啟 SSH 服務:",
|
||
"restartSshCommand": "sudo systemctl restart sshd",
|
||
"upload": "上傳",
|
||
"authentication": "驗證",
|
||
"password": "密碼",
|
||
"key": "金鑰",
|
||
"credential": "憑證",
|
||
"none": "沒有",
|
||
"selectCredential": "選擇憑證",
|
||
"selectCredentialPlaceholder": "選擇一種憑證…",
|
||
"credentialRequired": "使用憑證驗證時需要憑證。",
|
||
"credentialDescription": "選擇憑證將覆蓋目前使用者名稱並使用該憑證的驗證詳細資訊。",
|
||
"cannotChangeAuthAsSharedUser": "無法以共享用戶身份更改身份驗證",
|
||
"sshPrivateKey": "SSH 私鑰",
|
||
"keyPassword": "密鑰密碼",
|
||
"keyType": "金鑰類型",
|
||
"autoDetect": "自動偵測",
|
||
"rsa": "RSA",
|
||
"ed25519": "ED25519",
|
||
"ecdsaNistP256": "ECDSA NIST P-256",
|
||
"ecdsaNistP384": "ECDSA NIST P-384",
|
||
"ecdsaNistP521": "ECDSA NIST P-521",
|
||
"dsa": "DSA",
|
||
"rsaSha2256": "RSA SHA2-256",
|
||
"rsaSha2512": "RSA SHA2-512",
|
||
"uploadFile": "上傳檔案",
|
||
"pasteKey": "貼上金鑰",
|
||
"updateKey": "更新金鑰",
|
||
"existingKey": "現有密鑰(點擊更改)",
|
||
"existingCredential": "現有憑證(點擊更改)",
|
||
"addTagsSpaceToAdd": "新增標籤(此處留空)",
|
||
"terminalBadge": "終端機",
|
||
"tunnelBadge": "隧道",
|
||
"fileManagerBadge": "檔案管理器",
|
||
"general": "一般的",
|
||
"terminal": "終端機",
|
||
"tunnel": "隧道",
|
||
"fileManager": "檔案管理器",
|
||
"serverStats": "伺服器統計訊息",
|
||
"hostViewer": "主機檢視器",
|
||
"enableServerStats": "啟用伺服器統計訊息",
|
||
"enableServerStatsDesc": "啟用/停用此主機的伺服器統計資料收集",
|
||
"displayItems": "展示品",
|
||
"displayItemsDesc": "選擇要在伺服器統計頁面上顯示的指標",
|
||
"enableCpu": "CPU 使用率",
|
||
"enableMemory": "記憶體使用情況",
|
||
"enableDisk": "磁碟使用情況",
|
||
"enableNetwork": "網路統計數據(即將推出)",
|
||
"enableProcesses": "進程計數(即將推出)",
|
||
"enableUptime": "正常運作時間(即將推出)",
|
||
"enableHostname": "主機名稱(即將推出)",
|
||
"enableOs": "作業系統(即將推出)",
|
||
"customCommands": "自訂命令(即將推出)",
|
||
"customCommandsDesc": "為該伺服器定義自訂關機和重新啟動命令",
|
||
"shutdownCommand": "關閉命令",
|
||
"rebootCommand": "重啟命令",
|
||
"confirmRemoveFromFolder": "您確定要從資料夾「{{folder}}」中刪除「{{name}}」嗎?主機將被移動到“無資料夾”。",
|
||
"removedFromFolder": "已成功從資料夾移除主機“{{name}}”",
|
||
"failedToRemoveFromFolder": "無法從資料夾中刪除主機",
|
||
"folderRenamed": "資料夾「{{oldName}}」已成功重新命名為「{{newName}}」。",
|
||
"failedToRenameFolder": "重新命名資料夾失敗",
|
||
"editFolderAppearance": "編輯資料夾外觀",
|
||
"editFolderAppearanceDesc": "自訂資料夾的顏色和圖標",
|
||
"folderColor": "資料夾顏色",
|
||
"folderIcon": "資料夾圖示",
|
||
"preview": "預覽",
|
||
"folderAppearanceUpdated": "資料夾外觀已成功更新",
|
||
"failedToUpdateFolderAppearance": "資料夾外觀更新失敗",
|
||
"deleteAllHostsInFolder": "刪除資料夾中的所有主機",
|
||
"confirmDeleteAllHostsInFolder": "您確定要刪除資料夾「{{folder}}」中的所有 {{count}} 主機嗎?此操作無法撤銷。",
|
||
"allHostsInFolderDeleted": "已成功從資料夾「{{folder}}」中刪除 {{count}} 個主機。",
|
||
"failedToDeleteHostsInFolder": "刪除資料夾中的主機失敗",
|
||
"movedToFolder": "主機「{{name}}」已成功移轉到「{{folder}}」。",
|
||
"failedToMoveToFolder": "將主機移到資料夾失敗",
|
||
"clickToRenameFolder": "點擊重命名資料夾",
|
||
"renameFolder": "重新命名資料夾",
|
||
"removeFromFolder": "從資料夾「{{folder}}」中刪除",
|
||
"editHostTooltip": "編輯主機",
|
||
"deleteHostTooltip": "刪除主機",
|
||
"exportHostTooltip": "匯出主機",
|
||
"cloneHostTooltip": "複製主機",
|
||
"clickToEditHost": "點選編輯主機",
|
||
"dragToMoveBetweenFolders": "拖曳即可在資料夾之間移動。",
|
||
"exportedHostConfig": "已匯出主機配置 {{name}}",
|
||
"openTerminal": "打開終端機",
|
||
"openFileManager": "開啟檔案管理器",
|
||
"openTunnels": "開放式隧道",
|
||
"openServerDetails": "開啟伺服器詳情",
|
||
"statistics": "統計數據",
|
||
"enabledWidgets": "已啟用的小工具",
|
||
"openServerStats": "開放伺服器統計數據",
|
||
"enabledWidgetsDesc": "選擇要為此主機顯示的統計資訊小工具",
|
||
"monitoringConfiguration": "監控配置",
|
||
"monitoringConfigurationDesc": "配置伺服器統計資料和狀態的檢查頻率",
|
||
"statusCheckEnabled": "啟用狀態監控",
|
||
"statusCheckEnabledDesc": "檢查伺服器是否在線或離線",
|
||
"statusCheckInterval": "狀態檢查間隔",
|
||
"statusCheckIntervalDesc": "檢查主機是否在線的頻率(5秒 - 1小時)",
|
||
"metricsEnabled": "啟用指標監控",
|
||
"metricsEnabledDesc": "收集 CPU、RAM、磁碟和其他系統統計訊息",
|
||
"metricsInterval": "指標收集間隔",
|
||
"metricsIntervalDesc": "伺服器統計資訊收集頻率(5秒-1小時)",
|
||
"intervalSeconds": "秒",
|
||
"intervalMinutes": "分分鐘",
|
||
"intervalValidation": "監測間隔必須在 5 秒到 1 小時(3600 秒)之間。",
|
||
"monitoringDisabled": "此主機的伺服器監控已停用",
|
||
"enableMonitoring": "在主機管理員中啟用監控 → 統計選項卡",
|
||
"monitoringDisabledBadge": "關閉監控",
|
||
"statusMonitoring": "地位",
|
||
"metricsMonitoring": "指標",
|
||
"terminalCustomization": "自訂終端機",
|
||
"appearance": "外觀",
|
||
"behavior": "行為",
|
||
"advanced": "進階",
|
||
"themePreview": "主題預覽",
|
||
"theme": "主題",
|
||
"selectTheme": "選擇主題",
|
||
"chooseColorTheme": "為終端機選擇顏色主題",
|
||
"fontFamily": "字體系列",
|
||
"selectFont": "選擇字體",
|
||
"selectFontDesc": "選擇終端機中使用的字體。",
|
||
"fontSize": "字體大小",
|
||
"fontSizeValue": "字體大小: {{value}}像素",
|
||
"adjustFontSize": "調整終端機字體大小",
|
||
"letterSpacing": "字母間距",
|
||
"letterSpacingValue": "字母間距: {{value}}像素",
|
||
"adjustLetterSpacing": "調整字元間距",
|
||
"lineHeight": "行高",
|
||
"lineHeightValue": "行高: {{value}}",
|
||
"adjustLineHeight": "調整行間距",
|
||
"cursorStyle": "游標樣式",
|
||
"selectCursorStyle": "選擇游標樣式",
|
||
"cursorStyleBlock": "方塊",
|
||
"cursorStyleUnderline": "底線",
|
||
"cursorStyleBar": "直線",
|
||
"chooseCursorAppearance": "選擇游標外觀",
|
||
"cursorBlink": "游標閃爍",
|
||
"enableCursorBlink": "啟用游標閃爍動畫",
|
||
"scrollbackBuffer": "回滾緩衝區",
|
||
"scrollbackBufferValue": "回滾緩衝區: {{value}} 行",
|
||
"scrollbackBufferDesc": "回滾歷史記錄中要保留的行數",
|
||
"bellStyle": "響聲樣式",
|
||
"selectBellStyle": "選擇鈴鐺樣式",
|
||
"bellStyleNone": "沒有",
|
||
"bellStyleSound": "聲音",
|
||
"bellStyleVisual": "視覺的",
|
||
"bellStyleBoth": "兩個都",
|
||
"bellStyleDesc": "如何處理終端機提示音(BEL 字符, \\x07)。程式會在任務完成、遇到錯誤或發出通知時觸發此提示音。 「聲音」會發出提示音,「視覺」會短暫閃爍螢幕,「兩者」同時執行提示音和視覺效果,「無」則會停用提示音。",
|
||
"rightClickSelectsWord": "右鍵選擇 Word",
|
||
"rightClickSelectsWordDesc": "右鍵單擊可選中游標下的單字。",
|
||
"fastScrollModifier": "快速滾動特殊鍵",
|
||
"selectModifier": "選擇特殊鍵",
|
||
"modifierAlt": "Alt",
|
||
"modifierCtrl": "Ctrl",
|
||
"modifierShift": "Shift",
|
||
"fastScrollModifierDesc": "快速滾動的特殊鍵",
|
||
"fastScrollSensitivity": "快速滾動靈敏度",
|
||
"fastScrollSensitivityValue": "快速滾動靈敏度: {{value}}",
|
||
"fastScrollSensitivityDesc": "按住特殊鍵時,滾動速度倍率會提高。",
|
||
"minimumContrastRatio": "最小對比度",
|
||
"minimumContrastRatioValue": "最小對比: {{value}}",
|
||
"minimumContrastRatioDesc": "自動調整顏色以提高可讀性",
|
||
"sshAgentForwarding": "SSH 代理轉發",
|
||
"sshAgentForwardingDesc": "轉送 SSH 驗證代理到遠端主機",
|
||
"backspaceMode": "後退鍵模式",
|
||
"selectBackspaceMode": "選擇後退鍵模式",
|
||
"backspaceModeNormal": "正常(DEL)",
|
||
"backspaceModeControlH": "Control-H (^H)",
|
||
"backspaceModeDesc": "為了相容性,後退鍵的行為發生了變化",
|
||
"startupSnippet": "啟動片段",
|
||
"selectSnippet": "選擇片段",
|
||
"searchSnippets": "搜尋摘要…",
|
||
"snippetNone": "沒有",
|
||
"noneAuthTitle": "鍵盤互動式驗證",
|
||
"noneAuthDescription": "連接到 SSH 伺服器時,此身份驗證方法將使用鍵盤互動式身份驗證。",
|
||
"noneAuthDetails": "鍵盤互動式驗證可讓伺服器在連線過程中提示您輸入憑證。這對於需要多因素身份驗證的伺服器或您不想在本地儲存憑證的情況非常有用。",
|
||
"forceKeyboardInteractive": "強制鍵盤交互",
|
||
"forceKeyboardInteractiveDesc": "強制使用鍵盤互動式身份驗證。對於使用雙重認證(TOTP/2FA)的伺服器,有時需要這樣做。",
|
||
"overrideCredentialUsername": "覆蓋憑證使用者名稱",
|
||
"overrideCredentialUsernameDesc": "使用與憑證中儲存的使用者名稱不同的使用者名稱。這樣,您就可以使用不同的使用者名稱登入同一個憑證。",
|
||
"jumpHosts": "跳板主機",
|
||
"jumpHostsDescription": "跳轉主機(也稱為堡壘主機)可讓您透過一個或多個中間伺服器連接到目標伺服器。這對於存取防火牆後或專用網路中的伺服器非常有用。",
|
||
"jumpHostChain": "跳轉宿主鏈",
|
||
"addJumpHost": "新增跳轉主機",
|
||
"selectServer": "選擇伺服器",
|
||
"searchServers": "搜尋伺服器...",
|
||
"noServerFound": "未找到伺服器",
|
||
"jumpHostsOrder": "連線將依下列順序建立:跳轉主機 1 → 跳轉主機 2 → ... → 目標伺服器",
|
||
"socks5Proxy": "SOCKS5代理",
|
||
"socks5Description": "配置 SOCKS5 代理程式以進行 SSH 連線。所有流量將透過指定的代理伺服器路由。",
|
||
"enableSocks5": "啟用 SOCKS5 代理",
|
||
"enableSocks5Description": "此 SSH 連線請使用 SOCKS5 代理程式。",
|
||
"socks5Host": "代理主機",
|
||
"socks5Port": "代理端口",
|
||
"socks5Username": "代理用戶名",
|
||
"socks5Password": "代理密碼",
|
||
"socks5UsernameOptional": "選擇性:如果代理不需要身份驗證,請留空。",
|
||
"socks5PasswordOptional": "選擇性:如果代理不需要身份驗證,請留空。",
|
||
"socks5ProxyChain": "代理鏈",
|
||
"socks5ProxyChainDescription": "配置一個 SOCKS 代理鏈。鏈中的每個代理都會透過前一個代理連接。",
|
||
"socks5ProxyMode": "代理模式",
|
||
"socks5UseSingleProxy": "使用單一代理",
|
||
"socks5UseProxyChain": "使用代理鏈",
|
||
"socks5UsePreset": "使用已儲存的預設",
|
||
"socks5SelectPreset": "選擇預設",
|
||
"socks5ManagePresets": "管理預設",
|
||
"socks5ProxyNode": "代理 {{number}}",
|
||
"socks5AddProxy": "將代理程式新增至鏈",
|
||
"socks5RemoveProxy": "移除代理",
|
||
"socks5ProxyType": "代理類型",
|
||
"socks5SaveAsPreset": "另存為預設",
|
||
"socks5SavePresetTitle": "將代理鏈儲存為預設",
|
||
"socks5SavePresetDescription": "將目前代理鏈配置儲存為可重複使用的預設",
|
||
"socks5PresetName": "預設名稱",
|
||
"socks5PresetDescription": "描述(選擇性)",
|
||
"socks5PresetCreated": "已建立代理鏈預設",
|
||
"socks5PresetUpdated": "代理鏈預設已更新",
|
||
"socks5PresetDeleted": "代理鏈預設已刪除",
|
||
"socks5PresetSaved": "預設「{{name}}」已成功儲存",
|
||
"socks5PresetSaveError": "儲存預設失敗",
|
||
"socks5PresetNameRequired": "預設名稱為必填項",
|
||
"socks5EmptyChainError": "無法儲存空的代理鏈",
|
||
"socks5ProxyChainEmpty": "至少在鏈中新增一個代理程式。",
|
||
"socks5HostDescription": "SOCKS代理伺服器的主機名稱或IP位址",
|
||
"socks5PortDescription": "SOCKS代理伺服器的連接埠號碼(預設值:1080)",
|
||
"addProxyNode": "新增代理節點",
|
||
"noProxyNodes": "未配置代理節點。點選「新增代理節點」新增一個。",
|
||
"proxyNode": "代理節點",
|
||
"proxyType": "代理類型",
|
||
"quickActions": "快速操作",
|
||
"quickActionsDescription": "快速操作功能可讓您建立自訂按鈕,這些按鈕可以在此伺服器上執行 SSH 程式碼片段。這些按鈕將顯示在伺服器統計資訊頁面的頂部,以便快速存取。",
|
||
"quickActionsList": "快速操作列表",
|
||
"addQuickAction": "新增快速操作",
|
||
"quickActionName": "動作名稱",
|
||
"noSnippetFound": "未找到程式碼片段",
|
||
"quickActionsOrder": "伺服器統計頁面上將按上述順序顯示快捷操作按鈕。",
|
||
"sidebarCustomization": "自訂側邊欄按鈕",
|
||
"sidebarCustomizationDesc": "選擇哪些操作在側邊欄顯示為快捷按鈕。未顯示為按鈕的操作將顯示在下拉式選單中。",
|
||
"showTerminalInSidebar": "顯示終端機按鈕",
|
||
"showTerminalInSidebarDesc": "在側邊欄中以快捷按鈕的形式顯示終端機",
|
||
"showFileManagerInSidebar": "顯示檔案總管按鈕",
|
||
"showFileManagerInSidebarDesc": "在側邊欄中以快捷按鈕的形式顯示檔案管理器",
|
||
"showTunnelInSidebar": "顯示隧道按鈕",
|
||
"showTunnelInSidebarDesc": "在側邊欄中以快捷按鈕的形式顯示隧道管理",
|
||
"showDockerInSidebar": "顯示 Docker 按鈕",
|
||
"showDockerInSidebarDesc": "在側邊欄中以快捷按鈕的形式顯示 Docker 管理功能",
|
||
"showServerStatsInSidebar": "顯示伺服器統計資料按鈕",
|
||
"showServerStatsInSidebarDesc": "在側邊欄中新增一個快捷按鈕,顯示伺服器統計資訊",
|
||
"atLeastOneActionRequired": "側邊欄中必須至少顯示一個已啟用的操作。",
|
||
"advancedAuthSettings": "進階身份驗證設定",
|
||
"sudoPasswordAutoFill": "Sudo 密碼自動填充",
|
||
"sudoPasswordAutoFillDesc": "當 sudo 提示輸入密碼時,自動提示輸入 SSH 密碼",
|
||
"sudoPassword": "Sudo 密碼",
|
||
"sudoPasswordDesc": "sudo 指令的選擇性密碼(與金鑰認證結合使用時很有用)",
|
||
"socks4": "SOCKS4",
|
||
"socks5": "SOCKS5",
|
||
"executeSnippetOnConnect": "終端機連接後執行一段程式碼片段",
|
||
"autoMosh": "自動 MOSH",
|
||
"autoMoshDesc": "連線時自動運行 MOSH 命令",
|
||
"moshCommand": "MOSH 指令",
|
||
"moshCommandDesc": "要執行的 MOSH 指令",
|
||
"environmentVariables": "環境變數",
|
||
"environmentVariablesDesc": "為終端機會話設定自訂環境變數",
|
||
"variableName": "變數名",
|
||
"variableValue": "價值",
|
||
"addVariable": "新增變數",
|
||
"docker": "Docker",
|
||
"openDocker": "Open Docker",
|
||
"copyFullScreenUrl": "複製全螢幕網址",
|
||
"fullScreenUrlCopied": "全螢幕 URL 已複製到剪貼簿",
|
||
"failedToCopyUrl": "無法將 URL 複製到剪貼簿",
|
||
"copyTerminalUrl": "複製終端機 URL",
|
||
"copyFileManagerUrl": "複製檔案管理器 URL",
|
||
"copyTunnelUrl": "複製隧道 URL",
|
||
"copyServerStatsUrl": "複製伺服器統計資料 URL",
|
||
"copyDockerUrl": "複製 Docker URL",
|
||
"fullScreenUrlTooltip": "複製 URL 以全螢幕模式開啟此應用",
|
||
"notEnabled": "此主機未啟用 Docker。請在主機設定中啟用 Docker 以使用 Docker 功能。",
|
||
"validating": "正在驗證 Docker...",
|
||
"error": "錯誤",
|
||
"errorCode": "錯誤代碼: {{code}}",
|
||
"version": "Docker 版本{{version}}",
|
||
"current": "目前的",
|
||
"used_limit": "已用/限制",
|
||
"percentage": "百分比",
|
||
"input": "輸入",
|
||
"output": "輸出",
|
||
"read": "讀",
|
||
"write": "寫",
|
||
"pids": "PID",
|
||
"id": "ID",
|
||
"state": "狀態",
|
||
"console": "控制台",
|
||
"containerMustBeRunning": "容器必須正在運作才能連接到控制台。",
|
||
"authenticationRequired": "需要身份驗證",
|
||
"connectedTo": "連接到 {{containerName}}",
|
||
"disconnected": "斷開連接",
|
||
"consoleError": "控制台錯誤",
|
||
"errorMessage": "錯誤: {{message}}",
|
||
"failedToConnect": "連線控制台失敗",
|
||
"disconnectedFromContainer": "已中斷與容器控制台的連線。",
|
||
"containerNotRunning": "容器未運行",
|
||
"startContainerToAccess": "啟動容器以存取控制台",
|
||
"selectShell": "選擇 shell",
|
||
"bash": "Bash",
|
||
"sh": "Sh",
|
||
"ash": "Ash",
|
||
"connecting": "正在連接...",
|
||
"connect": "連接",
|
||
"disconnect": "斷開",
|
||
"notConnected": "未連接",
|
||
"clickToConnect": "點選「連線」啟動互動式 shell",
|
||
"connectingTo": "正在連接到 {{containerName}}...",
|
||
"containerMustBeRunningToViewStats": "容器必須處於運作狀態才能查看統計資料。",
|
||
"failedToFetchStats": "取得統計數據失敗",
|
||
"noContainersFound": "未找到容器",
|
||
"noContainersFoundHint": "首先在伺服器上建立容器。",
|
||
"searchPlaceholder": "按名稱、圖像或 ID 搜尋…",
|
||
"filterByStatusPlaceholder": "按狀態篩選",
|
||
"allContainersCount": "所有 ({{count}})",
|
||
"statusCount": "{{status}} ({{count}})",
|
||
"noContainersMatchFilters": "沒有容器符合您的篩選條件",
|
||
"noContainersMatchFiltersHint": "嘗試調整搜尋或篩選條件",
|
||
"containerStarted": "容器 {{name}} 已啟動",
|
||
"failedToStartContainer": "容器啟動失敗: {{error}}",
|
||
"containerStopped": "容器 {{name}} 已停止",
|
||
"failedToStopContainer": "停止容器失敗: {{error}}",
|
||
"containerRestarted": "容器 {{name}} 已重啟",
|
||
"failedToRestartContainer": "容器重啟失敗: {{error}}",
|
||
"containerUnpaused": "容器 {{name}} 已解除暫停",
|
||
"containerPaused": "容器 {{name}} 已暫停",
|
||
"failedToTogglePauseContainer": "無法將 {{action}} 容器: {{error}}",
|
||
"containerRemoved": "容器 {{name}} 已移除",
|
||
"failedToRemoveContainer": "移除容器失敗: {{error}}",
|
||
"image": "影像:",
|
||
"idLabel": "ID:",
|
||
"ports": "連接埠:",
|
||
"noPorts": "沒有",
|
||
"created": "建立時間:",
|
||
"start": "開始",
|
||
"stop": "停止",
|
||
"unpause": "暫停",
|
||
"pause": "暫停",
|
||
"restart": "重啟",
|
||
"removeContainer": "移除容器",
|
||
"confirmRemoveContainer": "您確定要刪除容器“{{name}}”嗎?",
|
||
"runningContainerWarning": "警告:此容器目前正在運行,將強制移除。",
|
||
"removing": "移除:",
|
||
"containerNotFound": "未找到容器",
|
||
"backToList": "返回列表",
|
||
"logs": "紀錄",
|
||
"stats": "統計數據",
|
||
"consoleTab": "控制台",
|
||
"failedToFetchLogs": "取得日誌失敗: {{error}}",
|
||
"failedToDownloadLogs": "日誌下載失敗: {{error}}",
|
||
"linesToShow": "線條顯示",
|
||
"last50Lines": "最後50行",
|
||
"last100Lines": "最後100行",
|
||
"last500Lines": "最後500行",
|
||
"last1000Lines": "最後1000行",
|
||
"allLogs": "所有日誌",
|
||
"showTimestamps": "顯示時間戳",
|
||
"autoRefresh": "自動重新整理",
|
||
"filterLogsPlaceholder": "過濾日誌...",
|
||
"noLogsAvailable": "沒有可用日誌"
|
||
},
|
||
"terminal": {
|
||
"title": "終端機",
|
||
"connect": "連接到主機",
|
||
"disconnect": "斷開",
|
||
"clear": "清除",
|
||
"copy": "複製",
|
||
"paste": "貼上",
|
||
"find": "尋找",
|
||
"fullscreen": "全螢幕",
|
||
"splitHorizontal": "水平分割",
|
||
"splitVertical": "垂直分割",
|
||
"closePanel": "關閉面板",
|
||
"reconnect": "重新連接",
|
||
"sessionEnded": "會話結束",
|
||
"connectionLost": "連線遺失",
|
||
"error": "錯誤: {{message}}",
|
||
"disconnected": "斷開連接",
|
||
"connectionClosed": "連線已關閉",
|
||
"connectionError": "連線錯誤: {{message}}",
|
||
"connected": "已連接",
|
||
"sshConnected": "已建立 SSH 連接",
|
||
"authError": "驗證失敗: {{message}}",
|
||
"unknownError": "發生未知錯誤",
|
||
"messageParseError": "解析伺服器訊息失敗",
|
||
"websocketError": "WebSocket 連線錯誤",
|
||
"connecting": "正在連接...",
|
||
"reconnecting": "正在重新連線... ({{attempt}}/{{max}})",
|
||
"reconnected": "已成功重新連接",
|
||
"maxReconnectAttemptsReached": "已達最大重連嘗試次數",
|
||
"connectionTimeout": "連線逾時",
|
||
"terminalTitle": "終端機 - {{host}}",
|
||
"terminalWithPath": "終端機 - {{host}}:{{path}}",
|
||
"runTitle": "運行 {{command}} - {{host}}",
|
||
"totpRequired": "需要雙重認證",
|
||
"totpCodeLabel": "驗證碼",
|
||
"totpPlaceholder": "000000",
|
||
"totpVerify": "核實",
|
||
"warpgateAuthRequired": "需要傳送門認證",
|
||
"warpgateSecurityKey": "安全金鑰",
|
||
"warpgateAuthUrl": "身份驗證 URL",
|
||
"warpgateOpenBrowser": "在瀏覽器中開啟",
|
||
"warpgateContinue": "我已經完成身份驗證",
|
||
"warpgateTimeout": "Warpgate身份驗證逾時,請重新連線。",
|
||
"sudoPasswordPopupTitle": "輸入密碼?",
|
||
"sudoPasswordPopupHint": "按 Enter 鍵插入,按 Esc 鍵關閉",
|
||
"sudoPasswordPopupConfirm": "插入",
|
||
"sudoPasswordPopupDismiss": "解僱",
|
||
"websocketAbnormalClose": "連線意外關閉。這可能是由於反向代理或 SSL 配置問題導致的。請檢查伺服器日誌。",
|
||
"totpInvalid": "驗證碼無效,請重試。",
|
||
"authMethodFallback": "{{method}} 身份驗證失敗。正在嘗試其他方法…",
|
||
"authenticationRequired": "需要身份驗證",
|
||
"connectionLogTitle": "連線日誌",
|
||
"connectionLogCopy": "將日誌複製到剪貼簿",
|
||
"connectionLogClear": "清除日誌",
|
||
"connectionLogEmpty": "暫無連線日誌",
|
||
"connectionLogConnecting": "正在連接主機...",
|
||
"connectionLogCopied": "連線日誌已複製到剪貼簿",
|
||
"connectionLogCopyFailed": "無法將日誌複製到剪貼簿",
|
||
"allAuthMethodsFailed": "所有身份驗證方式均失敗。請檢查您的憑證。",
|
||
"methodNotSupported": "伺服器不支援 {{method}} 身份驗證。可用方法: {{available}}",
|
||
"retryWithMethod": "使用 {{method}}重試",
|
||
"automaticFallback": "正在自動嘗試 {{method}} 驗證...",
|
||
"totpTimeout": "TOTP驗證逾時,請重新連線。",
|
||
"passwordTimeout": "密碼驗證逾時,請重新連線。",
|
||
"connectionRejected": "伺服器拒絕連線。請檢查您的身份驗證和網路配置。"
|
||
},
|
||
"fileManager": {
|
||
"title": "檔案管理器",
|
||
"file": "檔案",
|
||
"folder": "資料夾",
|
||
"connectToSsh": "連接到 SSH 以使用檔案操作",
|
||
"uploadFile": "上傳檔案",
|
||
"downloadFile": "下載",
|
||
"extractArchive": "提取存檔",
|
||
"extractingArchive": "正在提取 {{name}}...",
|
||
"archiveExtractedSuccessfully": "{{name}} 提取成功",
|
||
"extractFailed": "提取失敗",
|
||
"compressFile": "壓縮檔案",
|
||
"compressFiles": "壓縮檔案",
|
||
"compressFilesDesc": "將 {{count}} 個項目壓縮到一個檔案中",
|
||
"archiveName": "存檔名稱",
|
||
"enterArchiveName": "請輸入存檔名稱...",
|
||
"compressionFormat": "壓縮格式",
|
||
"selectedFiles": "選定檔案",
|
||
"andMoreFiles": "及 {{count}} 個其他檔案...",
|
||
"compress": "壓縮",
|
||
"compressingFiles": "將 {{count}} 個項目壓縮到 {{name}}個項目…",
|
||
"filesCompressedSuccessfully": "{{name}} 建立成功",
|
||
"compressFailed": "壓縮失敗",
|
||
"edit": "編輯",
|
||
"preview": "預覽",
|
||
"previous": "以前的",
|
||
"next": "下一個",
|
||
"pageXOfY": "第 {{current}} 頁,共 {{total}}頁",
|
||
"zoomOut": "縮小",
|
||
"zoomIn": "放大",
|
||
"newFile": "新檔案",
|
||
"newFolder": "新建資料夾",
|
||
"rename": "重新命名",
|
||
"renameItem": "重新命名項目",
|
||
"deleteItem": "刪除項目",
|
||
"currentPath": "目前路徑",
|
||
"uploadFileTitle": "上傳檔案",
|
||
"maxFileSize": "最大:1GB(JSON)/ 5GB(二進位) - 支援大檔案",
|
||
"removeFile": "移除檔案",
|
||
"clickToSelectFile": "按下以選取檔案",
|
||
"chooseFile": "選擇檔案",
|
||
"uploading": "正在上傳...",
|
||
"downloading": "正在下載…",
|
||
"uploadingFile": "正在上傳 {{name}}...",
|
||
"uploadingLargeFile": "正在上傳大檔案 {{name}} ({{size}})...",
|
||
"downloadingFile": "正在下載 {{name}}...",
|
||
"creatingFile": "建立 {{name}}...",
|
||
"creatingFolder": "創建 {{name}}...",
|
||
"deletingItem": "刪除 {{type}} {{name}}...",
|
||
"renamingItem": "將 {{type}} {{oldName}} 重新命名為 {{newName}}...",
|
||
"createNewFile": "建立新檔案",
|
||
"fileName": "檔案名稱",
|
||
"creating": "正在建立…",
|
||
"createFile": "建立檔案",
|
||
"createNewFolder": "建立新資料夾",
|
||
"folderName": "資料夾名稱",
|
||
"createFolder": "建立資料夾",
|
||
"warningCannotUndo": "警告:此操作無法撤銷。",
|
||
"itemPath": "物品路徑",
|
||
"thisIsDirectory": "這是一個目錄(將遞歸刪除)",
|
||
"deleting": "正在刪除…",
|
||
"currentPathLabel": "目前路徑",
|
||
"newName": "新名稱",
|
||
"thisIsDirectoryRename": "這是一個目錄",
|
||
"renaming": "重命名...",
|
||
"fileUploadedSuccessfully": "檔案「{{name}}」已成功上傳",
|
||
"failedToUploadFile": "檔案上載失敗",
|
||
"fileDownloadedSuccessfully": "檔案「{{name}}」已成功下載",
|
||
"failedToDownloadFile": "檔案下載失敗",
|
||
"noFileContent": "未收到檔案內容",
|
||
"filePath": "檔案路徑",
|
||
"fileCreatedSuccessfully": "檔案“{{name}}”已成功建立",
|
||
"failedToCreateFile": "檔案建立失敗",
|
||
"folderCreatedSuccessfully": "資料夾“{{name}}”已成功建立",
|
||
"failedToCreateFolder": "建立資料夾失敗",
|
||
"failedToCreateItem": "建立專案失敗",
|
||
"operationFailed": "{{operation}} 操作對 {{name}}: {{error}}失敗",
|
||
"failedToResolveSymlink": "解析符號連結失敗",
|
||
"itemDeletedSuccessfully": "{{type}} 已成功刪除",
|
||
"itemsDeletedSuccessfully": "{{count}} 項目已成功刪除",
|
||
"failedToDeleteItems": "刪除項目失敗",
|
||
"sudoPasswordRequired": "需要管理員密碼",
|
||
"enterSudoPassword": "請輸入 sudo 密碼以繼續此操作",
|
||
"sudoPassword": "Sudo 密碼",
|
||
"sudoOperationFailed": "sudo 操作失敗",
|
||
"sudoAuthFailed": "sudo 驗證失敗",
|
||
"deleteOperation": "刪除檔案/資料夾",
|
||
"dragFilesToUpload": "將檔案拖曳至此處以上傳",
|
||
"emptyFolder": "此資料夾為空。",
|
||
"itemCount": "{{count}} 項目",
|
||
"selectedCount": "{{count}} 已選擇",
|
||
"searchFiles": "搜尋檔案...",
|
||
"upload": "上傳",
|
||
"selectHostToStart": "選擇主機以啟動檔案管理",
|
||
"failedToConnect": "SSH 連線失敗",
|
||
"failedToLoadDirectory": "載入目錄失敗",
|
||
"noSSHConnection": "沒有可用的 SSH 連接",
|
||
"enterFolderName": "請輸入資料夾名稱:",
|
||
"enterFileName": "請輸入檔案名稱:",
|
||
"copy": "複製",
|
||
"cut": "剪下",
|
||
"paste": "貼上",
|
||
"copyPath": "複製路徑",
|
||
"copyPaths": "複製路徑",
|
||
"delete": "刪除",
|
||
"properties": "內容",
|
||
"refresh": "重新整理",
|
||
"downloadFiles": "下載 {{count}} 檔案到瀏覽器",
|
||
"copyFiles": "複製 {{count}} 項",
|
||
"cutFiles": "剪力 {{count}} 項",
|
||
"deleteFiles": "刪除 {{count}} 項",
|
||
"filesCopiedToClipboard": "{{count}} 個項目已複製到剪貼簿",
|
||
"filesCutToClipboard": "{{count}} 個項目已剪下至剪貼簿",
|
||
"pathCopiedToClipboard": "路徑已複製到剪貼簿",
|
||
"pathsCopiedToClipboard": "{{count}} 個路徑已複製到剪貼簿",
|
||
"failedToCopyPath": "無法將路徑複製到剪貼簿",
|
||
"movedItems": "已移動 {{count}} 個項目",
|
||
"failedToDeleteItem": "刪除項目失敗",
|
||
"itemRenamedSuccessfully": "{{type}} 已成功重新命名",
|
||
"failedToRenameItem": "重新命名專案失敗",
|
||
"download": "下載",
|
||
"permissions": "權限",
|
||
"size": "尺寸",
|
||
"modified": "修改的",
|
||
"path": "路徑",
|
||
"confirmDelete": "您確定要刪除 {{name}}嗎?",
|
||
"uploadSuccess": "檔案上傳成功",
|
||
"uploadFailed": "檔案上傳失敗",
|
||
"downloadSuccess": "檔案下載成功",
|
||
"downloadFailed": "檔案下載失敗",
|
||
"permissionDenied": "權限被拒絕",
|
||
"checkDockerLogs": "查看 Docker 日誌以取得詳細的錯誤訊息",
|
||
"internalServerError": "發生內部伺服器錯誤",
|
||
"serverError": "伺服器錯誤",
|
||
"error": "錯誤",
|
||
"requestFailed": "請求失敗,狀態碼",
|
||
"unknownFileError": "未知",
|
||
"cannotReadFile": "無法讀取檔案",
|
||
"noSshSessionId": "沒有可用的 SSH 會話 ID",
|
||
"noFilePath": "沒有可用的檔案路徑",
|
||
"noCurrentHost": "目前沒有可用主機",
|
||
"fileSavedSuccessfully": "成功儲存檔案",
|
||
"saveTimeout": "儲存操作超時。檔案可能已成功儲存,但操作耗時過長。請查看 Docker 日誌以確認。",
|
||
"failedToSaveFile": "儲存檔案失敗",
|
||
"deletedSuccessfully": "已成功刪除",
|
||
"connectToServer": "連接到伺服器",
|
||
"selectServerToEdit": "從側邊欄選擇伺服器即可開始編輯檔案",
|
||
"fileOperations": "檔案操作",
|
||
"confirmDeleteMessage": "您確定要刪除 {{name}}嗎?",
|
||
"confirmDeleteSingleItem": "您確定要永久刪除“{{name}}”嗎?",
|
||
"confirmDeleteMultipleItems": "您確定要永久刪除 {{count}} 項目嗎?",
|
||
"confirmDeleteMultipleItemsWithFolders": "您確定要永久刪除 {{count}} 項目嗎?這包括資料夾及其內容。",
|
||
"confirmDeleteFolder": "您確定要永久刪除資料夾「{{name}}」及其所有內容嗎?",
|
||
"deleteDirectoryWarning": "這將刪除該資料夾及其所有內容。",
|
||
"actionCannotBeUndone": "此操作無法撤銷。",
|
||
"permanentDeleteWarning": "此操作無法撤銷。物品將從伺服器永久刪除。",
|
||
"recent": "最近的",
|
||
"pinned": "置頂",
|
||
"folderShortcuts": "資料夾快捷方式",
|
||
"noRecentFiles": "沒有最近檔案。",
|
||
"noPinnedFiles": "沒有已置頂的檔案。",
|
||
"enterFolderPath": "輸入資料夾路徑",
|
||
"noShortcuts": "沒有捷徑可走。",
|
||
"searchFilesAndFolders": "搜尋檔案和資料夾…",
|
||
"noFilesOrFoldersFound": "未找到任何檔案或資料夾。",
|
||
"failedToConnectSSH": "SSH 連線失敗",
|
||
"failedToReconnectSSH": "SSH 會話重新連線失敗",
|
||
"failedToListFiles": "檔案列表失敗",
|
||
"fetchHomeDataTimeout": "取得家庭數據逾時",
|
||
"sshStatusCheckTimeout": "SSH 狀態檢查逾時",
|
||
"sshReconnectionTimeout": "SSH 重新連線逾時",
|
||
"saveOperationTimeout": "儲存操作逾時",
|
||
"cannotSaveFile": "無法儲存檔案",
|
||
"dragSystemFilesToUpload": "將系統檔案拖曳到此處上傳",
|
||
"dragFilesToWindowToDownload": "將檔案拖出視窗即可下載",
|
||
"openTerminalHere": "在此處打開終端機",
|
||
"run": "執行",
|
||
"saveToSystem": "另存為...",
|
||
"selectLocationToSave": "選擇儲存位置",
|
||
"openTerminalInFolder": "在此資料夾中開啟終端機",
|
||
"openTerminalInFileLocation": "打開終端機,指向檔案位置",
|
||
"terminalWithPath": "終端機 - {{host}}:{{path}}",
|
||
"runningFile": "運行 - {{file}}",
|
||
"onlyRunExecutableFiles": "只能運行可執行檔案",
|
||
"noHostSelected": "未選擇主機",
|
||
"starred": "星標",
|
||
"shortcuts": "快速方式",
|
||
"directories": "目錄",
|
||
"removedFromRecentFiles": "從最近檔案中移除“{{name}}”",
|
||
"removeFailed": "移除失敗",
|
||
"unpinnedSuccessfully": "已成功取消固定“{{name}}”",
|
||
"unpinFailed": "解除鎖定失敗",
|
||
"removedShortcut": "已移除捷徑“{{name}}”",
|
||
"removeShortcutFailed": "移除快捷方式失敗",
|
||
"clearedAllRecentFiles": "已清除所有最近檔案",
|
||
"clearFailed": "清除失敗",
|
||
"removeFromRecentFiles": "從最近檔案中刪除",
|
||
"clearAllRecentFiles": "清除所有最近檔案",
|
||
"unpinFile": "解壓縮檔案",
|
||
"removeShortcut": "移除快捷方式",
|
||
"saveFilesToSystem": "將 {{count}} 檔案另存為...",
|
||
"pinFile": "置頂檔案",
|
||
"addToShortcuts": "新增到快捷方式",
|
||
"downloadToDefaultLocation": "下載到預設位置",
|
||
"pasteFailed": "貼上失敗",
|
||
"noUndoableActions": "沒有可撤銷的操作",
|
||
"undoCopySuccess": "撤銷複製操作:已刪除 {{count}} 個已複製的檔案",
|
||
"undoCopyFailedDelete": "撤銷失敗:無法刪除任何已複製的檔案",
|
||
"undoCopyFailedNoInfo": "撤銷失敗:找不到已複製的檔案訊息",
|
||
"undoMoveSuccess": "撤銷移動操作:已將 {{count}} 個檔案移回原始位置",
|
||
"undoMoveFailedMove": "撤銷失敗:無法將任何檔案移回。",
|
||
"undoMoveFailedNoInfo": "撤銷失敗:找不到已移動的檔案訊息",
|
||
"undoDeleteNotSupported": "刪除操作無法撤銷:檔案已從伺服器永久刪除。",
|
||
"undoTypeNotSupported": "不支援的撤銷操作類型",
|
||
"undoOperationFailed": "撤銷操作失敗",
|
||
"unknownError": "未知錯誤",
|
||
"enterPath": "輸入路徑...",
|
||
"editPath": "編輯路徑",
|
||
"confirm": "確認",
|
||
"cancel": "取消",
|
||
"find": "尋找...",
|
||
"replaceWith": "替換為…",
|
||
"replace": "代替",
|
||
"replaceAll": "全部替換",
|
||
"downloadInstead": "下載",
|
||
"keyboardShortcuts": "鍵盤快速鍵",
|
||
"searchAndReplace": "搜尋和替換",
|
||
"editing": "編輯",
|
||
"navigation": "導航",
|
||
"code": "程式碼",
|
||
"search": "搜尋",
|
||
"findNext": "尋找下一個",
|
||
"findPrevious": "找上一個",
|
||
"save": "儲存",
|
||
"selectAll": "全選",
|
||
"undo": "撤銷",
|
||
"redo": "重做",
|
||
"goToLine": "前往 Line",
|
||
"moveLineUp": "移動陣容",
|
||
"moveLineDown": "向下移動線路",
|
||
"toggleComment": "切換評論",
|
||
"indent": "縮排",
|
||
"outdent": "凹痕",
|
||
"autoComplete": "自動完成",
|
||
"imageLoadError": "圖片載入失敗",
|
||
"rotate": "旋轉",
|
||
"originalSize": "原尺寸",
|
||
"startTyping": "開始輸入…",
|
||
"unknownSize": "尺寸未知",
|
||
"fileIsEmpty": "空白檔案",
|
||
"largeFileWarning": "大檔案警告",
|
||
"largeFileWarningDesc": "此檔案大小為 {{size}} ,以文字格式開啟時可能會導致效能問題。",
|
||
"fileNotFoundAndRemoved": "檔案「{{name}}」未找到,已從最近/置頂檔案移除。",
|
||
"failedToLoadFile": "檔案載入失敗: {{error}}",
|
||
"serverErrorOccurred": "伺服器出錯,請稍後再試。",
|
||
"autoSaveFailed": "自動儲存失敗",
|
||
"fileAutoSaved": "文件自動儲存",
|
||
"moveFileFailed": "移動失敗 {{name}}",
|
||
"moveOperationFailed": "移動操作失敗",
|
||
"canOnlyCompareFiles": "只能比較兩個檔案",
|
||
"comparingFiles": "正在比較檔案: {{file1}} 和 {{file2}}",
|
||
"dragFailed": "拖曳操作失敗",
|
||
"filePinnedSuccessfully": "檔案「{{name}}」已成功置頂",
|
||
"pinFileFailed": "檔案置頂失敗",
|
||
"fileUnpinnedSuccessfully": "檔案「{{name}}」已成功取消置頂",
|
||
"unpinFileFailed": "取消置頂檔案失敗",
|
||
"shortcutAddedSuccessfully": "資料夾捷徑「{{name}}」已成功新增",
|
||
"addShortcutFailed": "新增快捷方式失敗",
|
||
"operationCompletedSuccessfully": "{{operation}} {{count}} 專案成功",
|
||
"operationCompleted": "{{operation}} {{count}} 項目",
|
||
"downloadFileSuccess": "檔案 {{name}} 下載成功",
|
||
"downloadFileFailed": "下載失敗",
|
||
"moveTo": "移至 {{name}}",
|
||
"diffCompareWith": "與 {{name}}的差異比較",
|
||
"dragOutsideToDownload": "向視窗外拖曳即可下載({{count}} 檔案)",
|
||
"newFolderDefault": "新建資料夾",
|
||
"newFileDefault": "NewFile.txt",
|
||
"successfullyMovedItems": "已成功將 {{count}} 個項目移至 {{target}}",
|
||
"move": "移動",
|
||
"searchInFile": "在檔案中搜尋(Ctrl+F)",
|
||
"showKeyboardShortcuts": "顯示鍵盤快速鍵",
|
||
"startWritingMarkdown": "開始寫你的 Markdown 內容…",
|
||
"loadingFileComparison": "正在載入檔案比較...",
|
||
"reload": "重新載入",
|
||
"compare": "比較",
|
||
"sideBySide": "並排",
|
||
"inline": "排隊",
|
||
"fileComparison": "檔案比較: {{file1}} vs {{file2}}",
|
||
"fileTooLarge": "檔案過大: {{error}}",
|
||
"sshConnectionFailed": "SSH 連線失敗。請檢查您與 {{name}} ({{ip}}:{{port}}) 的連線。",
|
||
"loadFileFailed": "檔案載入失敗: {{error}}",
|
||
"connecting": "正在連接...",
|
||
"connectedSuccessfully": "連線成功",
|
||
"totpVerificationFailed": "TOTP驗證失敗",
|
||
"warpgateVerificationFailed": "Warpgate 身份驗證失敗",
|
||
"authenticationFailed": "身份驗證失敗",
|
||
"verificationCodePrompt": "驗證碼:",
|
||
"changePermissions": "更改權限",
|
||
"changePermissionsDesc": "修改檔案權限",
|
||
"currentPermissions": "目前權限",
|
||
"newPermissions": "新權限",
|
||
"owner": "擁有者",
|
||
"group": "群組",
|
||
"others": "其他的",
|
||
"read": "讀",
|
||
"write": "寫",
|
||
"execute": "執行",
|
||
"permissionsChangedSuccessfully": "權限已成功更改",
|
||
"failedToChangePermissions": "更改權限失敗"
|
||
},
|
||
"tunnel": {
|
||
"log": {
|
||
"connecting": "建立隧道連線…",
|
||
"sourceConnecting": "正在連線到來源主機 {{host}}...",
|
||
"sourceConnected": "已連接到來源主機",
|
||
"endpointResolving": "正在解析端點主機 {{host}}...",
|
||
"endpointResolved": "端點主機已解析",
|
||
"forwarding": "設定連接埠轉送 {{localPort}} → {{remotePort}}...",
|
||
"connected": "隧道已成功建成",
|
||
"retrying": "連線失敗,將在 {{countdown}}秒後重試(嘗試 {{attempt}}/{{max}})。",
|
||
"retryExhausted": "已達最大重試次數",
|
||
"error": "隧道連線失敗: {{error}}"
|
||
}
|
||
},
|
||
"tunnels": {
|
||
"title": "SSH 隧道",
|
||
"noSshTunnels": "沒有 SSH 隧道",
|
||
"createFirstTunnelMessage": "您尚未建立任何 SSH 隧道。請在主機管理員中設定隧道連線以開始使用。",
|
||
"connected": "已連接",
|
||
"disconnected": "斷開連接",
|
||
"connecting": "正在連接...",
|
||
"disconnecting": "正在斷開連線…",
|
||
"unknownTunnelStatus": "未知",
|
||
"statusUnknown": "未知",
|
||
"unknown": "未知",
|
||
"error": "錯誤",
|
||
"failed": "失敗的",
|
||
"retrying": "重試",
|
||
"waiting": "等待",
|
||
"waitingForRetry": "等待重試",
|
||
"retryingConnection": "正在重試連接",
|
||
"canceling": "正在取消…",
|
||
"connect": "連接",
|
||
"disconnect": "斷開",
|
||
"cancel": "取消",
|
||
"port": "連接埠",
|
||
"attempt": "試 {{current}} 的 {{max}}",
|
||
"nextRetryIn": "下次重試將在 {{seconds}} 秒後進行",
|
||
"checkDockerLogs": "檢查 Docker 日誌以查找錯誤原因,並加入討論。",
|
||
"orCreate": "或建立一個 ",
|
||
"noTunnelConnections": "未配置隧道連接",
|
||
"tunnelConnections": "隧道連接",
|
||
"addTunnel": "添加隧道",
|
||
"editTunnel": "編輯隧道",
|
||
"deleteTunnel": "刪除隧道",
|
||
"tunnelName": "隧道名稱",
|
||
"localPort": "本地連接埠",
|
||
"remoteHost": "遠端主機",
|
||
"remotePort": "遠端埠",
|
||
"autoStart": "自動啟動",
|
||
"status": "地位",
|
||
"active": "積極的",
|
||
"inactive": "非活躍狀態",
|
||
"start": "開始",
|
||
"stop": "停止",
|
||
"restart": "重啟",
|
||
"connectionType": "連接類型",
|
||
"local": "本地",
|
||
"remote": "偏僻的",
|
||
"dynamic": "動態的",
|
||
"unknownConnectionStatus": "未知",
|
||
"portMapping": "埠 {{sourcePort}} → {{endpointHost}}:{{endpointPort}}",
|
||
"endpointHostNotFound": "未找到端點主機",
|
||
"discord": "Discord",
|
||
"githubIssue": "GitHub 問題",
|
||
"forHelp": "尋求協助"
|
||
},
|
||
"serverStats": {
|
||
"title": "伺服器統計訊息",
|
||
"cpu": "中央處理器",
|
||
"memory": "記憶",
|
||
"disk": "磁碟",
|
||
"network": "網路",
|
||
"uptime": "正常運作時間",
|
||
"loadAverage": "平均值: {{avg1}}, {{avg5}}, {{avg15}}",
|
||
"processes": "程序",
|
||
"connections": "連接",
|
||
"usage": "用法",
|
||
"available": "可用的",
|
||
"total": "全部的",
|
||
"free": "自由的",
|
||
"used": "用過的",
|
||
"percentage": "百分比",
|
||
"refreshStatusAndMetrics": "重新整理狀態和指標",
|
||
"refreshStatus": "重新整理狀態",
|
||
"fileManagerAlreadyOpen": "此主機的檔案管理器已開啟",
|
||
"openFileManager": "開啟文件管理器",
|
||
"connecting": "正在連接...",
|
||
"connectionFailed": "連線伺服器失敗",
|
||
"cpuCores_one": "{{count}} CPU",
|
||
"cpuCores_other": "{{count}} CPU",
|
||
"naCpus": "N/A CPU",
|
||
"loadAverageNA": "平均值:不適用",
|
||
"cpuUsage": "CPU 使用率",
|
||
"memoryUsage": "記憶體使用情況",
|
||
"diskUsage": "磁碟使用情況",
|
||
"rootStorageSpace": "根儲存空間",
|
||
"of": "的",
|
||
"feedbackMessage": "對伺服器管理的未來發展方向有什麼想法嗎?歡迎分享!",
|
||
"failedToFetchHostConfig": "取得主機配置失敗",
|
||
"failedToFetchStatus": "取得伺服器狀態失敗",
|
||
"failedToFetchMetrics": "取得伺服器指標失敗",
|
||
"failedToFetchHomeData": "取得家庭數據失敗",
|
||
"loadingMetrics": "正在載入指標……",
|
||
"refreshing": "正在重新整理……",
|
||
"serverOffline": "伺服器離線",
|
||
"cannotFetchMetrics": "無法從離線伺服器取得指標",
|
||
"totpRequired": "需要 TOTP 驗證",
|
||
"totpUnavailable": "啟用 TOTP 的伺服器無法取得伺服器統計資料。",
|
||
"totpVerified": "TOTP 已驗證,指標收集已開始",
|
||
"totpFailed": "TOTP驗證失敗",
|
||
"totpInvalidCode": "驗證碼無效",
|
||
"totpCancelled": "指標收集已取消",
|
||
"authenticationFailed": "身份驗證失敗",
|
||
"noneAuthNotSupported": "伺服器統計資訊不支援「無」身份驗證類型。",
|
||
"load": "載入",
|
||
"editLayout": "編輯版面",
|
||
"cancelEdit": "取消",
|
||
"addWidget": "添加小部件",
|
||
"saveLayout": "儲存佈局",
|
||
"unsavedChanges": "未儲存的更改",
|
||
"layoutSaved": "佈局已成功儲存",
|
||
"failedToSaveLayout": "儲存佈局失敗",
|
||
"systemInfo": "系統資訊",
|
||
"hostname": "主機名稱",
|
||
"operatingSystem": "作業系統",
|
||
"kernel": "核心",
|
||
"totalUptime": "總正常運轉時間",
|
||
"seconds": "秒",
|
||
"networkInterfaces": "網路介面",
|
||
"noInterfacesFound": "未找到網路介面",
|
||
"totalProcesses": "總程序數",
|
||
"running": "執行中",
|
||
"noProcessesFound": "未找到任何進程",
|
||
"loginStats": "SSH 登入統計訊息",
|
||
"totalLogins": "總登入次數",
|
||
"uniqueIPs": "唯一IP位址",
|
||
"recentSuccessfulLogins": "最近幾次成功登入",
|
||
"recentFailedAttempts": "近期失敗的嘗試",
|
||
"noRecentLoginData": "沒有最近的登入數據",
|
||
"from": "從",
|
||
"quickActions": "快速操作",
|
||
"executeQuickAction": "執行 {{name}}",
|
||
"executingQuickAction": "正在執行 {{name}}...",
|
||
"quickActionSuccess": "{{name}} 已成功完成",
|
||
"quickActionFailed": "{{name}} 失敗",
|
||
"quickActionError": "執行 {{name}}失敗",
|
||
"ports": {
|
||
"title": "監聽埠",
|
||
"protocol": "協定",
|
||
"port": "連接埠",
|
||
"address": "地址",
|
||
"state": "狀態",
|
||
"process": "過程",
|
||
"noData": "無監聽埠數據"
|
||
},
|
||
"firewall": {
|
||
"title": "防火牆",
|
||
"active": "積極的",
|
||
"inactive": "非活躍狀態",
|
||
"notDetected": "未檢測到",
|
||
"policy": "政策",
|
||
"rules": "規則",
|
||
"noRules": "沒有規則",
|
||
"noData": "沒有可用的防火牆數據",
|
||
"action": "行動",
|
||
"protocol": "原型",
|
||
"port": "連接埠",
|
||
"source": "來源",
|
||
"accept": "接受",
|
||
"drop": "降低",
|
||
"reject": "拒絕",
|
||
"anywhere": "任何地方"
|
||
}
|
||
},
|
||
"auth": {
|
||
"tagline": "SSH 伺服器管理員",
|
||
"description": "安全、強大且直覺的 SSH 連線管理",
|
||
"welcomeBack": "歡迎回到 TERMIX",
|
||
"createAccount": "建立您的 TERMIX 帳戶",
|
||
"continueExternal": "繼續與外部供應商合作",
|
||
"loginTitle": "登入 Termix",
|
||
"registerTitle": "建立帳戶",
|
||
"loginButton": "登入",
|
||
"registerButton": "登記",
|
||
"forgotPassword": "忘記密碼?",
|
||
"rememberMe": "記住帳號",
|
||
"noAccount": "還沒有帳號?",
|
||
"hasAccount": "已有帳號?",
|
||
"loginSuccess": "登入成功",
|
||
"loginFailed": "登入失敗",
|
||
"registerSuccess": "註冊成功",
|
||
"registerFailed": "註冊失敗",
|
||
"logoutSuccess": "已成功登出",
|
||
"invalidCredentials": "使用者名稱或密碼無效",
|
||
"accountCreated": "帳號建立成功",
|
||
"passwordReset": "密碼重設連結已發送",
|
||
"twoFactorAuth": "雙重身份驗證",
|
||
"enterCode": "請輸入驗證碼",
|
||
"backupCode": "或使用備用代碼",
|
||
"verifyCode": "驗證碼",
|
||
"redirectingToApp": "正在重定向到應用程式...",
|
||
"enableTwoFactor": "啟用雙重認證",
|
||
"disableTwoFactor": "禁用雙重認證",
|
||
"scanQRCode": "使用您的身份驗證器應用程式掃描此二維碼",
|
||
"backupCodes": "備用代碼",
|
||
"saveBackupCodes": "將這些備份代碼儲存在安全的地方。",
|
||
"twoFactorEnabledSuccess": "雙因素認證已成功啟用!",
|
||
"twoFactorDisabled": "雙重認證已停用",
|
||
"newBackupCodesGenerated": "產生新的備份程式碼",
|
||
"backupCodesDownloaded": "備份代碼已下載",
|
||
"pleaseEnterSixDigitCode": "請輸入6位數代碼",
|
||
"invalidVerificationCode": "驗證碼無效",
|
||
"failedToDisableTotp": "停用 TOTP 失敗",
|
||
"failedToGenerateBackupCodes": "備份程式碼產生失敗",
|
||
"enterPassword": "請輸入您的密碼",
|
||
"lockedOidcAuth": "已鎖定(OIDC 驗證)",
|
||
"twoFactorTitle": "雙重身份驗證",
|
||
"twoFactorProtected": "您的帳戶已啟用雙重驗證保護",
|
||
"twoFactorActive": "您的帳戶目前已啟用雙重驗證",
|
||
"disable2FA": "禁用雙重認證",
|
||
"disableTwoFactorWarning": "停用雙重驗證會降低您的帳戶安全性。",
|
||
"passwordOrTotpCode": "密碼或 TOTP 代碼",
|
||
"or": "或者",
|
||
"generateNewBackupCodesText": "如果遺失了現有的備份代碼,請產生新的備份代碼。",
|
||
"generateNewBackupCodes": "產生新的備份程式碼",
|
||
"yourBackupCodes": "您的備用代碼",
|
||
"download": "下載",
|
||
"setupTwoFactorTitle": "設定雙重認證",
|
||
"sshAuthenticationRequired": "需要 SSH 驗證",
|
||
"sshNoKeyboardInteractive": "鍵盤互動式驗證不可用",
|
||
"sshAuthenticationFailed": "身份驗證失敗",
|
||
"sshAuthenticationTimeout": "身份驗證逾時",
|
||
"sshNoKeyboardInteractiveDescription": "伺服器不支援鍵盤互動式身份驗證。請提供您的密碼或SSH密鑰。",
|
||
"sshAuthFailedDescription": "您提供的憑證不正確。請使用有效的憑證重試。",
|
||
"sshTimeoutDescription": "身份驗證嘗試超時,請重試。",
|
||
"sshProvideCredentialsDescription": "請提供您的 SSH 憑證以連接到此伺服器。",
|
||
"sshPasswordDescription": "請輸入此 SSH 連線的密碼。",
|
||
"sshKeyPasswordDescription": "如果您的 SSH 金鑰已加密,請在此輸入密碼。",
|
||
"step1ScanQR": "步驟 1:使用您的身份驗證器應用程式掃描二維碼",
|
||
"manualEntryCode": "手動輸入代碼",
|
||
"cannotScanQRText": "如果無法掃描二維碼,請在身份驗證器應用程式中手動輸入此代碼。",
|
||
"nextVerifyCode": "下一步:驗證程式碼",
|
||
"verifyAuthenticator": "驗證您的身份驗證器",
|
||
"step2EnterCode": "步驟 2:輸入身份驗證器應用程式中顯示的 6 位數代碼",
|
||
"verificationCode": "驗證碼",
|
||
"back": "後退",
|
||
"verifyAndEnable": "驗證並啟用",
|
||
"saveBackupCodesTitle": "儲存您的備份代碼",
|
||
"step3StoreCodesSecurely": "步驟 3:將這些代碼儲存在安全的地方",
|
||
"importantBackupCodesText": "請將這些備用代碼儲存在安全的地方。如果您遺失了驗證器設備,可以使用這些代碼存取您的帳戶。",
|
||
"completeSetup": "完整設定",
|
||
"notEnabledText": "雙重認證透過在登入時要求輸入來自身份驗證器應用程式的驗證碼來增加一層額外的安全性。",
|
||
"enableTwoFactorButton": "啟用雙重認證",
|
||
"addExtraSecurityLayer": "為您的帳戶增加一層額外的安全保障",
|
||
"firstUser": "第一用戶",
|
||
"firstUserMessage": "您是第一個用戶,將被授予管理員權限。您可以在側邊欄使用者下拉式選單中查看管理員設定。如果您認為這是一個錯誤,請查看 Docker 日誌或在 GitHub 上建立一個 issue。",
|
||
"external": "外部的",
|
||
"loginWithExternal": "使用外部提供者登入",
|
||
"loginWithExternalDesc": "使用您設定的外部身分提供者登入",
|
||
"externalNotSupportedInElectron": "Electron 應用程式目前尚不支援外部身份驗證。請使用網頁版進行 OIDC 登入。",
|
||
"resetPasswordButton": "重設密碼",
|
||
"sendResetCode": "發送重置代碼",
|
||
"resetCodeDesc": "請輸入您的使用者名稱以取得密碼重設代碼。該程式碼將記錄在 Docker 容器日誌中。",
|
||
"resetCode": "重置程式碼",
|
||
"verifyCodeButton": "驗證碼",
|
||
"enterResetCode": "請輸入 Docker 容器日誌中該使用者的 6 位元代碼:",
|
||
"goToLogin": "前往登入",
|
||
"newPassword": "新密碼",
|
||
"confirmNewPassword": "確認密碼",
|
||
"enterNewPassword": "請輸入使用者的新密碼:",
|
||
"signUp": "報名",
|
||
"mobileApp": "行動應用",
|
||
"loggingInToMobileApp": "登入行動應用",
|
||
"desktopApp": "桌面應用程式",
|
||
"loggingInToDesktopApp": "登入桌面應用程式",
|
||
"loggingInToDesktopAppViaWeb": "透過網頁介面登入桌面應用程式",
|
||
"loadingServer": "伺服器正在載入...",
|
||
"authenticating": "正在驗證…",
|
||
"dataLossWarning": "使用此方法重設密碼將刪除您儲存的所有 SSH 主機、憑證和其他加密資料。此操作無法撤銷。僅當您忘記密碼且未登入時才使用此方法。",
|
||
"authenticationDisabled": "身份驗證已停用",
|
||
"authenticationDisabledDesc": "所有身份驗證方式目前均已停用。請聯絡您的管理員。",
|
||
"passwordResetSuccess": "密碼重置成功",
|
||
"passwordResetSuccessDesc": "您的密碼已成功重設。現在您可以使用新密碼登入。"
|
||
},
|
||
"errors": {
|
||
"notFound": "頁面未找到",
|
||
"unauthorized": "未經授權的訪問",
|
||
"forbidden": "禁止訪問",
|
||
"serverError": "伺服器錯誤",
|
||
"networkError": "網路錯誤",
|
||
"databaseConnection": "無法連線到資料庫",
|
||
"unknownError": "未知錯誤",
|
||
"loginFailed": "登入失敗",
|
||
"failedPasswordReset": "密碼重置失敗",
|
||
"failedVerifyCode": "重置程式碼驗證失敗",
|
||
"failedCompleteReset": "密碼重置失敗",
|
||
"invalidTotpCode": "無效的 TOTP 程式碼",
|
||
"failedOidcLogin": "OIDC 登入啟動失敗",
|
||
"failedUserInfo": "OIDC登入後取得使用者資訊失敗",
|
||
"oidcAuthFailed": "OIDC 驗證失敗",
|
||
"noTokenReceived": "登入未收到令牌",
|
||
"invalidAuthUrl": "從後端收到的授權 URL 無效",
|
||
"invalidInput": "輸入無效",
|
||
"requiredField": "此欄位是必需的",
|
||
"minLength": "最小長度為 {{min}}",
|
||
"maxLength": "最大長度為 {{max}}",
|
||
"invalidEmail": "無效的電子郵件地址",
|
||
"passwordMismatch": "密碼不匹配",
|
||
"passwordLoginDisabled": "目前已停用使用者名稱/密碼登入。",
|
||
"weakPassword": "密碼強度不足",
|
||
"usernameExists": "使用者名稱已存在",
|
||
"emailExists": "電子郵件已存在",
|
||
"loadFailed": "資料載入失敗",
|
||
"saveError": "儲存失敗",
|
||
"sessionExpired": "會話已過期 - 請重新登錄",
|
||
"totpRateLimited": "頻率限制:TOTP驗證嘗試次數過多。請稍後再試。",
|
||
"totpRateLimitedWithTime": "速率限制:TOTP 驗證嘗試次數過多。請稍等 {{time}} 秒後再試。",
|
||
"resetCodeRateLimited": "驗證次數過多,請稍後再試。",
|
||
"resetCodeRateLimitedWithTime": "驗證次數過多,請稍等 {{time}} 秒後再試。"
|
||
},
|
||
"messages": {
|
||
"saveSuccess": "儲存成功",
|
||
"saveError": "儲存失敗",
|
||
"deleteSuccess": "已成功刪除",
|
||
"deleteError": "刪除失敗",
|
||
"updateSuccess": "更新成功",
|
||
"updateError": "更新失敗",
|
||
"copySuccess": "已複製到剪貼簿",
|
||
"copyError": "複製失敗",
|
||
"copiedToClipboard": "{{item}} 已複製到剪貼簿",
|
||
"connectionEstablished": "連線已建立",
|
||
"connectionClosed": "連線已關閉",
|
||
"reconnecting": "正在重新連線…",
|
||
"processing": "加工...",
|
||
"pleaseWait": "請稍等...",
|
||
"registrationDisabled": "管理員已停用新帳號註冊功能。請登入或聯絡管理員。",
|
||
"databaseConnected": "資料庫連線成功",
|
||
"databaseConnectionFailed": "連線資料庫伺服器失敗",
|
||
"checkServerConnection": "請檢查您的伺服器連線並重試。",
|
||
"resetCodeSent": "重置代碼已傳送至 Docker 日誌",
|
||
"codeVerified": "程式碼驗證成功",
|
||
"passwordResetSuccess": "密碼重置成功",
|
||
"loginSuccess": "登入成功",
|
||
"registrationSuccess": "註冊成功"
|
||
},
|
||
"profile": {
|
||
"title": "用戶個人資料",
|
||
"description": "管理您的帳戶設定和安全",
|
||
"security": "安全",
|
||
"changePassword": "更改密碼",
|
||
"twoFactorAuth": "雙重身份驗證",
|
||
"accountInfo": "帳號資訊",
|
||
"role": "角色",
|
||
"admin": "管理員",
|
||
"user": "使用者",
|
||
"authMethod": "身份驗證方法",
|
||
"local": "本地",
|
||
"external": "外部(OIDC)",
|
||
"externalAndLocal": "雙重認證",
|
||
"selectPreferredLanguage": "請選擇您偏好的介面語言。",
|
||
"fileColorCoding": "文件顏色編碼",
|
||
"fileColorCodingDesc": "依類型對檔案進行顏色編碼:資料夾(紅色)、檔案(藍色)、符號連結(綠色)",
|
||
"commandAutocomplete": "命令自動完成",
|
||
"commandAutocompleteDesc": "啟用 Tab 鍵自動補全建議,根據您的指令歷史記錄提供終端指令建議",
|
||
"defaultSnippetFoldersCollapsed": "預設折疊程式碼片段資料夾",
|
||
"defaultSnippetFoldersCollapsedDesc": "啟用此功能後,打開程式碼片段標籤時,所有程式碼片段資料夾都會折疊起來。",
|
||
"terminalSyntaxHighlighting": "終端機語法高亮顯示",
|
||
"showHostTags": "節目主持人標籤",
|
||
"showHostTagsDesc": "在側邊欄中顯示每個主機下方的標籤。停用此選項可隱藏所有標籤。",
|
||
"account": "帳戶",
|
||
"appearance": "外觀",
|
||
"languageLocalization": "語言和本地化",
|
||
"fileManagerSettings": "檔案管理器",
|
||
"terminalSettings": "終端機",
|
||
"hostSidebarSettings": "主機和側邊欄",
|
||
"snippetsSettings": "片段",
|
||
"updateSettings": "更新",
|
||
"disableUpdateCheck": "禁用更新檢查",
|
||
"disableUpdateCheckDesc": "停止在啟動和控制面板中檢查新版本。減少網路請求。",
|
||
"currentPassword": "目前密碼",
|
||
"passwordChangedSuccess": "密碼已成功更改!請重新登入。",
|
||
"failedToChangePassword": "密碼更改失敗。請檢查您目前的密碼並重試。",
|
||
"theme": "主題",
|
||
"themeLight": "光",
|
||
"themeDark": "黑暗的",
|
||
"themeSystem": "系統",
|
||
"appearanceDesc": "選擇應用程式的顏色主題",
|
||
"terminalSyntaxHighlightingDesc": "自動高亮顯示終端輸出中的指令、路徑、IP位址和日誌等級",
|
||
"enableCommandPaletteShortcut": "啟用指令面板快速鍵",
|
||
"enableCommandPaletteShortcutDesc": "雙擊左 Shift 鍵開啟指令面板,以便快速存取主機。"
|
||
},
|
||
"user": {
|
||
"failedToLoadVersionInfo": "版本資訊載入失敗"
|
||
},
|
||
"placeholders": {
|
||
"enterCode": "000000",
|
||
"ipAddress": "127.0.0.1",
|
||
"port": "22",
|
||
"maxRetries": "3",
|
||
"retryInterval": "10",
|
||
"language": "語言",
|
||
"username": "使用者名稱",
|
||
"hostname": "主機名稱",
|
||
"folder": "資料夾",
|
||
"password": "密碼",
|
||
"keyPassword": "密鑰密碼",
|
||
"sudoPassword": "sudo 密碼(選擇性)",
|
||
"notes": "加上關於此主機的備註…",
|
||
"expirationDate": "選擇到期日",
|
||
"pastePrivateKey": "把你的私鑰貼到這裡…",
|
||
"pastePublicKey": "把你的公鑰貼到這裡…",
|
||
"credentialName": "我的 SSH 伺服器",
|
||
"description": "SSH憑證描述",
|
||
"searchCredentials": "按名稱、使用者名稱或標籤搜尋憑證…",
|
||
"sshConfig": "端點 SSH 配置",
|
||
"homePath": "/家",
|
||
"clientId": "您的客戶端 ID",
|
||
"clientSecret": "你的客戶密鑰",
|
||
"authUrl": "https://your-provider.com/application/o/authorize/",
|
||
"redirectUrl": "https://your-provider.com/application/o/termix/",
|
||
"tokenUrl": "https://your-provider.com/application/o/token/",
|
||
"userIdField": "子",
|
||
"usernameField": "姓名",
|
||
"scopes": "OpenID 電子郵件個人資料",
|
||
"userinfoUrl": "https://your-provider.com/application/o/userinfo/",
|
||
"enterUsername": "輸入使用者名稱以建立管理員",
|
||
"searchHosts": "按名稱、使用者名稱、IP 位址、資料夾、標籤等搜尋主機…",
|
||
"enterPassword": "請輸入您的密碼",
|
||
"totpCode": "6位數的TOTP代碼",
|
||
"searchHostsAny": "搜尋主機(嘗試:tag:prod,user:root,ip:192.168)...",
|
||
"confirmPassword": "請輸入密碼以確認",
|
||
"typeHere": "在此輸入",
|
||
"fileName": "輸入檔名(例如,example.txt)",
|
||
"folderName": "輸入資料夾名稱",
|
||
"fullPath": "請輸入專案的完整路徑",
|
||
"currentPath": "輸入專案的目前路徑",
|
||
"newName": "輸入新名稱",
|
||
"socks5Host": "127.0.0.1",
|
||
"socks5Username": "代理用戶名",
|
||
"socks5Password": "代理密碼",
|
||
"socks5PresetName": "例如,工作 VPN 鏈",
|
||
"socks5PresetDescription": "例如,用於存取工作伺服器的代理鏈",
|
||
"moshCommand": "mosh 使用者@伺服器",
|
||
"defaultPort": "22",
|
||
"defaultEndpointPort": "224",
|
||
"defaultMaxRetries": "3",
|
||
"defaultRetryInterval": "10"
|
||
},
|
||
"leftSidebar": {
|
||
"failedToLoadHosts": "主機載入失敗",
|
||
"noFolder": "無資料夾",
|
||
"passwordRequired": "需要密碼",
|
||
"failedToDeleteAccount": "刪除帳戶失敗",
|
||
"failedToMakeUserAdmin": "建立使用者管理員失敗",
|
||
"userIsNowAdmin": "使用者 {{username}} 現在是管理員",
|
||
"removeAdminConfirm": "您確定要從 {{username}}移除管理員身分嗎?",
|
||
"deleteUserConfirm": "您確定要刪除使用者 {{username}}嗎?此操作無法撤銷。",
|
||
"deleteAccount": "刪除帳戶",
|
||
"closeDeleteAccount": "關閉刪除帳戶",
|
||
"deleteAccountWarning": "此操作無法撤銷。這將永久刪除您的帳戶及所有關聯資料。",
|
||
"deleteAccountWarningDetails": "刪除您的帳戶將清除您的所有數據,包括 SSH 主機、設定和設定。此操作不可逆。",
|
||
"deleteAccountWarningShort": "此操作不可逆,將永久刪除您的帳戶。",
|
||
"cannotDeleteAccount": "無法刪除帳戶",
|
||
"lastAdminWarning": "您是最後一位管理員使用者。您無法刪除您的帳戶,因為這會導致系統失去所有管理員。請先將其他使用者設為管理員,或聯絡系統支援。",
|
||
"confirmPassword": "確認密碼",
|
||
"deleting": "正在刪除…",
|
||
"cancel": "取消"
|
||
},
|
||
"interface": {
|
||
"sidebar": "側邊欄",
|
||
"toggleSidebar": "切換側邊欄",
|
||
"close": "關閉",
|
||
"online": "在線的",
|
||
"offline": "離線",
|
||
"maintenance": "維護",
|
||
"degraded": "降級",
|
||
"noTunnelConnections": "未配置隧道連接",
|
||
"discord": "Discord",
|
||
"connectToSshForOperations": "連接到 SSH 以使用檔案操作",
|
||
"uploadFile": "上傳檔案",
|
||
"newFile": "新檔案",
|
||
"newFolder": "新建資料夾",
|
||
"rename": "重新命名",
|
||
"deleteItem": "刪除項目",
|
||
"createNewFile": "建立新檔案",
|
||
"createNewFolder": "建立新資料夾",
|
||
"renameItem": "重新命名項目",
|
||
"clickToSelectFile": "點選選擇檔案",
|
||
"noSshHosts": "無 SSH 主機",
|
||
"sshHosts": "SSH 主機",
|
||
"importSshHosts": "從 JSON 匯入 SSH 主機",
|
||
"clientId": "客戶ID",
|
||
"clientSecret": "客戶機密",
|
||
"error": "錯誤",
|
||
"warning": "警告",
|
||
"deleteAccount": "刪除帳戶",
|
||
"closeDeleteAccount": "關閉刪除帳戶",
|
||
"cannotDeleteAccount": "無法刪除帳戶",
|
||
"confirmPassword": "確認密碼",
|
||
"deleting": "正在刪除…",
|
||
"externalAuth": "外部認證(OIDC)",
|
||
"configureExternalProvider": "配置外部身分提供者",
|
||
"waitingForRetry": "等待重試",
|
||
"retryingConnection": "正在重試連接",
|
||
"resetSplitSizes": "重置分割大小",
|
||
"sshManagerAlreadyOpen": "SSH 管理員已開啟",
|
||
"disabledDuringSplitScreen": "分割畫面模式下停用",
|
||
"unknown": "未知",
|
||
"connected": "已連接",
|
||
"disconnected": "斷開連接",
|
||
"maxRetriesExhausted": "最大重試次數已用盡",
|
||
"endpointHostNotFound": "未找到端點主機",
|
||
"administrator": "管理員",
|
||
"user": "使用者",
|
||
"external": "外部的",
|
||
"local": "本地",
|
||
"saving": "儲存...",
|
||
"saveConfiguration": "儲存配置",
|
||
"loading": "載入中...",
|
||
"refresh": "重新整理",
|
||
"adding": "添加…",
|
||
"makeAdmin": "管理員",
|
||
"verifying": "正在核實…",
|
||
"verifyAndEnable": "驗證並啟用",
|
||
"secretKey": "金鑰",
|
||
"totpQrCode": "TOTP二維碼",
|
||
"passwordRequired": "使用密碼驗證時,需要輸入密碼。",
|
||
"sshKeyRequired": "使用金鑰認證時需要 SSH 私鑰。",
|
||
"keyTypeRequired": "使用金鑰認證時,需要指定金鑰類型。",
|
||
"validSshConfigRequired": "必須從清單中選擇有效的 SSH 配置。",
|
||
"updateHost": "更新主機",
|
||
"addHost": "新增主機",
|
||
"editHost": "編輯主機",
|
||
"pinConnection": "引腳連接",
|
||
"authentication": "驗證",
|
||
"password": "密碼",
|
||
"key": "金鑰",
|
||
"sshPrivateKey": "SSH 私鑰",
|
||
"keyPassword": "密鑰密碼",
|
||
"keyType": "金鑰類型",
|
||
"enableTerminal": "啟用終端機",
|
||
"enableTunnel": "啟用隧道",
|
||
"enableFileManager": "啟用檔案管理器",
|
||
"defaultPath": "預設路徑",
|
||
"tunnelConnections": "隧道連接",
|
||
"maxRetries": "最大重試次數",
|
||
"upload": "上傳",
|
||
"updateKey": "更新金鑰",
|
||
"productionFolder": "生產",
|
||
"databaseServer": "資料庫伺服器",
|
||
"developmentServer": "開發伺服器",
|
||
"developmentFolder": "發展",
|
||
"webServerProduction": "Web 伺服器 - 生產環境",
|
||
"unknownError": "未知錯誤",
|
||
"failedToInitiatePasswordReset": "密碼重置失敗",
|
||
"failedToVerifyResetCode": "重置程式碼驗證失敗",
|
||
"failedToCompletePasswordReset": "密碼重置失敗",
|
||
"invalidTotpCode": "無效的 TOTP 程式碼",
|
||
"failedToStartOidcLogin": "OIDC 登入啟動失敗",
|
||
"failedToGetUserInfoAfterOidc": "OIDC登入後取得使用者資訊失敗",
|
||
"loginWithExternalProvider": "使用外部提供者登入",
|
||
"loginWithExternal": "使用外部提供者登入",
|
||
"sendResetCode": "發送重置代碼",
|
||
"verifyCode": "驗證碼",
|
||
"resetPassword": "重設密碼",
|
||
"login": "登入",
|
||
"signUp": "報名",
|
||
"failedToUpdateOidcConfig": "更新 OIDC 配置失敗",
|
||
"failedToMakeUserAdmin": "建立使用者管理員失敗",
|
||
"failedToStartTotpSetup": "TOTP 設定啟動失敗",
|
||
"invalidVerificationCode": "驗證碼無效",
|
||
"failedToDisableTotp": "停用 TOTP 失敗",
|
||
"failedToGenerateBackupCodes": "備份程式碼產生失敗"
|
||
},
|
||
"mobile": {
|
||
"selectHostToStart": "選擇主機以啟動終端機會話",
|
||
"limitedSupportMessage": "網站行動端支援仍在開發中。請使用行動應用程式以獲得更佳體驗。",
|
||
"mobileAppInProgress": "行動應用程式正在開發中",
|
||
"mobileAppInProgressDesc": "我們正在開發一款專門的行動應用程序,以便在行動裝置上提供更好的體驗。",
|
||
"viewMobileAppDocs": "安裝行動應用",
|
||
"mobileAppDocumentation": "行動應用程式檔案"
|
||
},
|
||
"dashboard": {
|
||
"title": "儀表板",
|
||
"loading": "正在載入儀錶板……",
|
||
"github": "GitHub",
|
||
"support": "支援",
|
||
"discord": "Discord",
|
||
"donate": "贊助",
|
||
"serverOverview": "伺服器概覽",
|
||
"version": "版本",
|
||
"upToDate": "最新",
|
||
"updateAvailable": "更新可用",
|
||
"uptime": "正常運作時間",
|
||
"database": "資料庫",
|
||
"healthy": "健康",
|
||
"error": "錯誤",
|
||
"totalServers": "伺服器總數",
|
||
"totalTunnels": "隧道總數",
|
||
"totalCredentials": "證書總數",
|
||
"recentActivity": "近期活動",
|
||
"reset": "重置",
|
||
"loadingRecentActivity": "正在載入最近的活動……",
|
||
"noRecentActivity": "近期無活動",
|
||
"quickActions": "快速操作",
|
||
"addHost": "新增主機",
|
||
"addCredential": "新增憑證",
|
||
"adminSettings": "管理員設定",
|
||
"userProfile": "用戶個人資料",
|
||
"serverStats": "伺服器統計訊息",
|
||
"loadingServerStats": "正在載入伺服器統計資料…",
|
||
"noServerData": "伺服器資料不可用",
|
||
"cpu": "中央處理器",
|
||
"ram": "記憶體",
|
||
"notAvailable": "不適用",
|
||
"customizeLayout": "自訂儀錶板",
|
||
"dashboardSettings": "儀表板設定",
|
||
"enableDisableCards": "啟用/停用卡片",
|
||
"resetLayout": "重設為預設值",
|
||
"serverOverviewCard": "伺服器概覽",
|
||
"recentActivityCard": "近期活動",
|
||
"networkGraphCard": "網路圖",
|
||
"networkGraph": "網路圖",
|
||
"quickActionsCard": "快速操作",
|
||
"serverStatsCard": "伺服器統計訊息"
|
||
},
|
||
"networkGraph": {
|
||
"title": "網路圖",
|
||
"addHost": "新增主機",
|
||
"addGroup": "新增群組",
|
||
"addLink": "添加連結",
|
||
"deleteSelected": "刪除所選內容",
|
||
"zoomIn": "放大",
|
||
"zoomOut": "縮小",
|
||
"resetView": "重置視圖",
|
||
"exportJson": "導出 JSON",
|
||
"importJson": "導入 JSON",
|
||
"selectHost": "選擇主機",
|
||
"chooseHost": "選擇主機…",
|
||
"parentGroup": "父群組",
|
||
"noGroup": "無組",
|
||
"groupName": "組名",
|
||
"color": "顏色",
|
||
"source": "來源",
|
||
"target": "目標",
|
||
"moveToGroup": "移至群組",
|
||
"selectGroup": "選擇群組...",
|
||
"addConnection": "新增連接",
|
||
"hostDetails": "主機詳情",
|
||
"connectToHost": "連接到主機",
|
||
"openTerminal": "打開終端機",
|
||
"openFileManager": "開啟檔案管理器",
|
||
"openTunnel": "開放式隧道",
|
||
"openDocker": "Open Docker",
|
||
"openServerStats": "開啟伺服器詳情",
|
||
"moveToGroupAction": "移至群組",
|
||
"removeFromGroup": "從群組移除",
|
||
"addHostHere": "在此新增主機",
|
||
"editGroup": "編輯群組",
|
||
"delete": "刪除",
|
||
"cancel": "取消",
|
||
"add": "添加",
|
||
"create": "建立",
|
||
"update": "更新",
|
||
"move": "移動",
|
||
"connect": "連接",
|
||
"close": "關閉",
|
||
"createGroup": "建立群組",
|
||
"noAvailableHosts": "沒有可用的主機。",
|
||
"selectSourcePlaceholder": "選擇來源...",
|
||
"selectTargetPlaceholder": "選擇目標...",
|
||
"invalidFile": "無效檔案",
|
||
"hostAlreadyExists": "主機已在拓樸結構中",
|
||
"sourceTargetMustDiffer": "源和目標必須不同",
|
||
"connectionExists": "連線已存在",
|
||
"unknown": "未知",
|
||
"name": "姓名",
|
||
"ip": "IP",
|
||
"status": "地位",
|
||
"id": "ID",
|
||
"failedToLoadData": "網路拓撲資料載入失敗",
|
||
"failedToAddNode": "新增節點失敗",
|
||
"sourceDifferentFromTarget": "源和目標必須不同",
|
||
"exportJSON": "導出 JSON",
|
||
"importJSON": "導入 JSON",
|
||
"searchHost": "搜尋主機...",
|
||
"noHostFound": "未找到主機",
|
||
"searchGroup": "搜尋群組...",
|
||
"noGroupFound": "未找到任何群組",
|
||
"searchNode": "搜尋節點...",
|
||
"noNodeFound": "未找到節點",
|
||
"terminal": "終端機",
|
||
"fileManager": "檔案管理器",
|
||
"tunnel": "隧道",
|
||
"docker": "Docker",
|
||
"serverStats": "伺服器統計訊息"
|
||
},
|
||
"rbac": {
|
||
"shareHost": "共享主機",
|
||
"shareHostTitle": "共享主機存取權限",
|
||
"shareHostDescription": "授予對此主機的臨時或永久存取權限",
|
||
"targetUser": "目標用戶",
|
||
"selectUser": "選擇要與之共享的用戶",
|
||
"duration": "期間",
|
||
"durationHours": "時長(小時)",
|
||
"neverExpires": "永不過期",
|
||
"permissionLevel": "權限等級",
|
||
"permissionLevels": {
|
||
"readonly": "只讀",
|
||
"readonlyDesc": "只能查看,不能輸入指令",
|
||
"restricted": "受限制的",
|
||
"restrictedDesc": "阻止危險指令(passwd、rm -rf 等)",
|
||
"monitored": "受監控",
|
||
"monitoredDesc": "記錄所有命令但不阻塞(建議)",
|
||
"full": "完全存取權限",
|
||
"fullDesc": "無限制(不建議)"
|
||
},
|
||
"blockedCommands": "已阻止的命令",
|
||
"blockedCommandsPlaceholder": "輸入要封鎖的指令,例如 passwd、rm、dd",
|
||
"maxSessionDuration": "最長會話時長(分鐘)",
|
||
"createTempUser": "建立臨時用戶",
|
||
"createTempUserDesc": "這會建立一個受限用戶到伺服器,而不是共享您的憑證。需要 sudo 權限。這是最安全的選擇。",
|
||
"expiresAt": "到期時間",
|
||
"expiresIn": "將在 {{hours}} 小時內過期",
|
||
"expired": "已到期",
|
||
"grantedBy": "授予",
|
||
"accessLevel": "訪問級別",
|
||
"lastAccessed": "最後訪問時間",
|
||
"accessCount": "訪問量",
|
||
"revokeAccess": "撤銷存取權限",
|
||
"confirmRevokeAccess": "您確定要撤銷對 {{username}}的存取權限嗎?",
|
||
"hostSharedSuccessfully": "主機已成功分享給 {{username}}",
|
||
"hostAccessUpdated": "主機存取權限已更新",
|
||
"failedToShareHost": "共享主機失敗",
|
||
"accessRevokedSuccessfully": "存取權限已成功撤銷",
|
||
"failedToRevokeAccess": "撤銷存取權限失敗",
|
||
"shared": "共享",
|
||
"sharedHosts": "共享主機",
|
||
"sharedWithMe": "與我分享",
|
||
"noSharedHosts": "沒有與您共享主機",
|
||
"owner": "擁有者",
|
||
"viewAccessList": "查看訪問列表",
|
||
"accessList": "訪問列表",
|
||
"noAccessGranted": "此主機未被授予存取權限",
|
||
"noAccessGrantedMessage": "目前還沒有任何使用者被授予此主機的存取權限。",
|
||
"manageAccessFor": "管理存取權限",
|
||
"totalAccessRecords": "{{count}} 存取記錄",
|
||
"neverAccessed": "絕不",
|
||
"timesAccessed": "{{count}} 時間",
|
||
"daysRemaining": "{{days}} 天",
|
||
"hoursRemaining": "{{hours}} 小時",
|
||
"failedToFetchAccessList": "取得存取清單失敗",
|
||
"currentAccess": "目前存取權限",
|
||
"securityWarning": "安全警告",
|
||
"securityWarningMessage": "共享憑證將賦予使用者對伺服器的完全存取權限,可以執行任何操作,包括更改密碼和刪除檔案。請僅與受信任的使用者共用憑證。",
|
||
"tempUserRecommended": "為了提高安全性,我們建議啟用「建立臨時使用者」功能。",
|
||
"roleManagement": "角色管理",
|
||
"manageRoles": "管理角色",
|
||
"manageRolesFor": "管理 {{username}}的角色",
|
||
"assignRole": "分配角色",
|
||
"removeRole": "移除角色",
|
||
"userRoles": "使用者角色",
|
||
"permissions": "權限",
|
||
"systemRole": "系統角色",
|
||
"customRole": "自訂角色",
|
||
"roleAssignedSuccessfully": "已成功為 {{username}} 指派角色",
|
||
"failedToAssignRole": "角色分配失敗",
|
||
"roleRemovedSuccessfully": "已成功從 {{username}} 移除角色",
|
||
"failedToRemoveRole": "移除角色失敗",
|
||
"cannotRemoveSystemRole": "無法移除系統角色",
|
||
"cannotShareWithSelf": "無法與自己共享主機",
|
||
"noCustomRolesToAssign": "暫無自訂角色可用。系統角色將自動分配。",
|
||
"credentialSharingWarning": "共享不支援憑證身份驗證",
|
||
"credentialRequired": "共享主機時需要憑證",
|
||
"credentialRequiredDescription": "此主機未使用基於憑證的身份驗證。由於需要對每個使用者進行加密,因此要共用主機,主機必須使用基於憑證的身份驗證。",
|
||
"auditLogs": "審計日誌",
|
||
"viewAuditLogs": "查看審計日誌",
|
||
"action": "行動",
|
||
"resourceType": "資源類型",
|
||
"resourceName": "資源名稱",
|
||
"timestamp": "時間戳",
|
||
"ipAddress": "IP位址",
|
||
"userAgent": "使用者代理",
|
||
"success": "成功",
|
||
"failed": "失敗的",
|
||
"details": "細節",
|
||
"noAuditLogs": "沒有可用的稽核日誌",
|
||
"sessionRecordings": "會議錄音",
|
||
"viewRecording": "查看錄影",
|
||
"downloadRecording": "下載錄音",
|
||
"dangerousCommand": "偵測到危險指令",
|
||
"commandBlocked": "命令已阻止",
|
||
"terminateSession": "結束會話",
|
||
"sessionTerminated": "會話已由主機擁有者終止",
|
||
"sharedAccessExpired": "您對此主機的共用存取權限已過期。",
|
||
"sharedAccessExpiresIn": "共用存取權限將在 {{hours}} 小時後過期。",
|
||
"roles": {
|
||
"label": "角色",
|
||
"admin": "管理員",
|
||
"user": "使用者"
|
||
},
|
||
"createRole": "建立角色",
|
||
"editRole": "編輯角色",
|
||
"roleName": "角色名稱",
|
||
"displayName": "顯示名稱",
|
||
"description": "描述",
|
||
"assignRoles": "分配角色",
|
||
"userRoleAssignment": "使用者角色分配",
|
||
"selectUserPlaceholder": "選擇用戶",
|
||
"searchUsers": "搜尋用戶...",
|
||
"noUserFound": "未找到用戶",
|
||
"currentRoles": "目前職位",
|
||
"noRolesAssigned": "未分配任何角色",
|
||
"assignNewRole": "指派新角色",
|
||
"selectRolePlaceholder": "選擇角色",
|
||
"searchRoles": "搜尋職位…",
|
||
"noRoleFound": "未找到角色",
|
||
"assign": "分配",
|
||
"roleCreatedSuccessfully": "角色建立成功",
|
||
"roleUpdatedSuccessfully": "角色已成功更新",
|
||
"roleDeletedSuccessfully": "角色已成功刪除",
|
||
"failedToLoadRoles": "角色載入失敗",
|
||
"failedToSaveRole": "角色儲存失敗",
|
||
"failedToDeleteRole": "刪除角色失敗",
|
||
"roleDisplayNameRequired": "角色顯示名稱為必填項",
|
||
"roleNameRequired": "角色名稱為必填項",
|
||
"roleNameHint": "請僅使用小寫字母、數字、底線和連字號。",
|
||
"displayNamePlaceholder": "開發者",
|
||
"descriptionPlaceholder": "軟體開發人員和工程師",
|
||
"confirmDeleteRole": "刪除角色",
|
||
"confirmDeleteRoleDescription": "您確定要刪除角色「{{name}}」嗎?此操作無法撤銷。",
|
||
"confirmRemoveRole": "移除角色",
|
||
"confirmRemoveRoleDescription": "您確定要從使用者移除此角色嗎?",
|
||
"editRoleDescription": "更新角色訊息",
|
||
"createRoleDescription": "建立一個新的自訂角色,用於對使用者進行分組。",
|
||
"assignRolesDescription": "管理使用者角色分配",
|
||
"noRoles": "未找到角色",
|
||
"selectRole": "選擇角色",
|
||
"type": "類型",
|
||
"user": "使用者",
|
||
"role": "角色",
|
||
"saveHostFirst": "儲存主機",
|
||
"saveHostFirstDescription": "請先儲存主機,然後再配置共享設定。",
|
||
"shareWithUser": "與用戶分享",
|
||
"shareWithRole": "分享角色",
|
||
"share": "分享",
|
||
"target": "目標",
|
||
"expires": "過期",
|
||
"never": "絕不",
|
||
"noAccessRecords": "未找到訪問記錄",
|
||
"sharedSuccessfully": "分享成功",
|
||
"failedToShare": "分享失敗",
|
||
"confirmRevokeAccessDescription": "您確定要撤銷此存取權限嗎?",
|
||
"hours": "小時",
|
||
"sharing": "分享",
|
||
"selectUserAndRole": "請同時選擇使用者和角色",
|
||
"view": "僅查看",
|
||
"viewDesc": "由於 Termix 加密系統的原因,其他權限等級將在稍後推出。"
|
||
},
|
||
"commandPalette": {
|
||
"searchPlaceholder": "搜尋主機或快速操作...",
|
||
"recentActivity": "近期活動",
|
||
"navigation": "導航",
|
||
"addHost": "新增主機",
|
||
"addCredential": "新增憑證",
|
||
"adminSettings": "管理員設定",
|
||
"userProfile": "用戶個人資料",
|
||
"updateLog": "更新日誌",
|
||
"hosts": "主持人",
|
||
"openServerDetails": "開啟伺服器詳情",
|
||
"openFileManager": "開啟檔案管理器",
|
||
"edit": "編輯",
|
||
"links": "連結",
|
||
"github": "GitHub",
|
||
"support": "支援",
|
||
"discord": "Discord",
|
||
"donate": "捐",
|
||
"press": "按",
|
||
"toToggle": "切換",
|
||
"close": "關閉",
|
||
"hostManager": "主機管理器",
|
||
"pressToToggle": "按兩次左 Shift 鍵開啟指令面板。"
|
||
},
|
||
"docker": {
|
||
"notEnabled": "此主機未啟用 Docker",
|
||
"validating": "正在驗證 Docker...",
|
||
"connectingToHost": "正在連接主機...",
|
||
"connecting": "正在連接...",
|
||
"error": "錯誤",
|
||
"errorCode": "錯誤代碼: {{code}}",
|
||
"version": "Docker {{version}}",
|
||
"connectionFailed": "連線 Docker 失敗",
|
||
"totpVerificationFailed": "TOTP驗證失敗,請重試。",
|
||
"warpgateVerificationFailed": "Warpgate身份驗證失敗,請重試。",
|
||
"verificationCodePrompt": "請輸入驗證碼",
|
||
"loadingContainers": "正在裝載貨櫃…",
|
||
"containerStarted": "容器 {{name}} 已啟動",
|
||
"failedToStartContainer": "啟動容器失敗 {{name}}",
|
||
"containerStopped": "容器 {{name}} 已停止",
|
||
"failedToStopContainer": "停止容器 {{name}}失敗",
|
||
"containerRestarted": "容器 {{name}} 已重啟",
|
||
"failedToRestartContainer": "重啟容器失敗 {{name}}",
|
||
"containerPaused": "容器 {{name}} 已暫停",
|
||
"containerUnpaused": "容器 {{name}} 已解除暫停",
|
||
"failedToTogglePauseContainer": "切換容器 {{name}}的暫停狀態失敗",
|
||
"containerRemoved": "容器 {{name}} 已移除",
|
||
"failedToRemoveContainer": "移除容器 {{name}}失敗",
|
||
"image": "影像",
|
||
"idLabel": "ID",
|
||
"ports": "連接埠",
|
||
"noPorts": "無埠",
|
||
"created": "已建立",
|
||
"start": "開始",
|
||
"stop": "停止",
|
||
"pause": "暫停",
|
||
"unpause": "暫停",
|
||
"restart": "重啟",
|
||
"remove": "消除",
|
||
"removeContainer": "移除容器",
|
||
"confirmRemoveContainer": "您確定要刪除容器“{{name}}”嗎?此操作無法撤銷。",
|
||
"runningContainerWarning": "警告:此容器目前正在運行。移除此容器會先停止其運作。",
|
||
"removing": "移除…",
|
||
"noContainersFound": "未找到容器",
|
||
"noContainersFoundHint": "此主機上沒有可用的 Docker 容器",
|
||
"searchPlaceholder": "搜尋容器…",
|
||
"filterByStatusPlaceholder": "按狀態篩選",
|
||
"allContainersCount": "所有 ({{count}})",
|
||
"statusCount": "{{status}} ({{count}})",
|
||
"noContainersMatchFilters": "沒有容器符合您的篩選條件",
|
||
"noContainersMatchFiltersHint": "嘗試調整搜尋或篩選條件",
|
||
"containerMustBeRunningToViewStats": "容器必須正在運行才能查看統計信息",
|
||
"failedToFetchStats": "取得容器統計資料失敗",
|
||
"containerNotRunning": "容器未運行",
|
||
"startContainerToViewStats": "啟動容器以查看統計信息",
|
||
"loadingStats": "正在載入統計資料…",
|
||
"errorLoadingStats": "載入統計資料時出錯",
|
||
"noStatsAvailable": "暫無統計數據",
|
||
"cpuUsage": "CPU 使用率",
|
||
"current": "目前的",
|
||
"memoryUsage": "記憶體使用情況",
|
||
"usedLimit": "已用/限制",
|
||
"percentage": "百分比",
|
||
"networkIo": "網路 I/O",
|
||
"input": "輸入",
|
||
"output": "輸出",
|
||
"blockIo": "塊 I/O",
|
||
"read": "讀",
|
||
"write": "寫",
|
||
"pids": "PID",
|
||
"containerInformation": "容器資訊",
|
||
"name": "姓名",
|
||
"id": "ID",
|
||
"state": "狀態",
|
||
"disconnectedFromContainer": "與容器斷開連接",
|
||
"containerMustBeRunning": "容器必須正在運行才能存取控制台",
|
||
"authenticationRequired": "需要身份驗證",
|
||
"connectedTo": "連接到 {{containerName}}",
|
||
"disconnected": "斷開連接",
|
||
"consoleError": "控制台錯誤",
|
||
"errorMessage": "錯誤: {{message}}",
|
||
"failedToConnect": "連線容器失敗",
|
||
"console": "控制台",
|
||
"selectShell": "選擇 shell",
|
||
"bash": "Bash",
|
||
"sh": "sh",
|
||
"ash": "ash",
|
||
"connect": "連接",
|
||
"disconnect": "斷開",
|
||
"notConnected": "未連接",
|
||
"clickToConnect": "按一下「連線」以啟動 shell 會話",
|
||
"connectingTo": "正在連接到 {{containerName}}...",
|
||
"containerNotFound": "未找到容器",
|
||
"backToList": "返回列表",
|
||
"logs": "紀錄",
|
||
"stats": "統計數據",
|
||
"consoleTab": "控制台",
|
||
"startContainerToAccess": "啟動容器以存取控制台",
|
||
"log": {
|
||
"connecting": "正在連線到 Docker 主機...",
|
||
"authStarted": "正在解析身份驗證憑證...",
|
||
"totpRequired": "需要進行 TOTP 驗證",
|
||
"warpgateRequired": "需要 Warpgate 身份驗證",
|
||
"sessionCreated": "已建立 Docker SSH 會話",
|
||
"sessionReady": "已準備好進行 Docker 操作",
|
||
"error": "Docker 連線失敗: {{error}}"
|
||
}
|
||
},
|
||
"stats": {
|
||
"log": {
|
||
"connecting": "開始收集指標數據…",
|
||
"existingSession": "使用現有指標會話",
|
||
"totpVerifying": "需要進行 TOTP 驗證",
|
||
"sessionEstablished": "指標會議已建立",
|
||
"collecting": "收集伺服器指標",
|
||
"heartbeat": "保持聯繫",
|
||
"stopped": "指標收集已停止",
|
||
"error": "指標收集失敗: {{error}}"
|
||
}
|
||
},
|
||
"sftp": {
|
||
"log": {
|
||
"connecting": "正在連接SFTP伺服器...",
|
||
"jumpHost": "透過跳轉主機連線 {{host}}...",
|
||
"connected": "已建立 SFTP 連接",
|
||
"authFailed": "身份驗證失敗",
|
||
"error": "SFTP 操作失敗: {{error}}"
|
||
}
|
||
},
|
||
"theme": {
|
||
"switchToLight": "切換到燈光",
|
||
"switchToDark": "切換到黑暗模式"
|
||
}
|
||
}
|