release-2.6.0 (#1085)

* fix: general bug fixes

* fix: general qol additions

* ci(deps): bump actions/setup-node in the github-actions group (#1068)

Bumps the github-actions group with 1 update: [actions/setup-node](https://github.com/actions/setup-node).


Updates `actions/setup-node` from 6 to 7
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps-dev): bump the dev-patch-updates group with 28 updates (#1069)

Bumps the dev-patch-updates group with 28 updates:

| Package | From | To |
| --- | --- | --- |
| [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome) | `2.5.2` | `2.5.4` |
| [@codemirror/view](https://github.com/codemirror/view) | `6.43.5` | `6.43.6` |
| [@radix-ui/react-accordion](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/accordion) | `1.2.15` | `1.2.17` |
| [@radix-ui/react-alert-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/alert-dialog) | `1.1.18` | `1.1.20` |
| [@radix-ui/react-checkbox](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/checkbox) | `1.3.6` | `1.3.8` |
| [@radix-ui/react-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dialog) | `1.1.18` | `1.1.20` |
| [@radix-ui/react-dropdown-menu](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dropdown-menu) | `2.1.19` | `2.1.21` |
| [@radix-ui/react-label](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/label) | `2.1.11` | `2.1.12` |
| [@radix-ui/react-popover](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/popover) | `1.1.18` | `1.1.20` |
| [@radix-ui/react-progress](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/progress) | `1.1.11` | `1.1.13` |
| [@radix-ui/react-scroll-area](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/scroll-area) | `1.2.13` | `1.2.15` |
| [@radix-ui/react-select](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/select) | `2.3.2` | `2.3.4` |
| [@radix-ui/react-separator](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/separator) | `1.1.11` | `1.1.12` |
| [@radix-ui/react-slider](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/slider) | `1.4.2` | `1.4.4` |
| [@radix-ui/react-switch](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/switch) | `1.3.2` | `1.3.4` |
| [@radix-ui/react-tabs](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tabs) | `1.1.16` | `1.1.18` |
| [@radix-ui/react-tooltip](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tooltip) | `1.2.11` | `1.2.13` |
| [@tailwindcss/vite](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-vite) | `4.3.2` | `4.3.3` |
| [@uiw/codemirror-extensions-langs](https://github.com/uiwjs/react-codemirror) | `4.25.10` | `4.25.11` |
| [@uiw/codemirror-theme-github](https://github.com/uiwjs/react-codemirror) | `4.25.10` | `4.25.11` |
| [@uiw/react-codemirror](https://github.com/uiwjs/react-codemirror) | `4.25.10` | `4.25.11` |
| [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) | `4.1.9` | `4.1.10` |
| [@vitest/ui](https://github.com/vitest-dev/vitest/tree/HEAD/packages/ui) | `4.1.9` | `4.1.10` |
| [i18next](https://github.com/i18next/i18next) | `26.3.4` | `26.3.6` |
| [radix-ui](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/radix-ui) | `1.6.1` | `1.6.3` |
| [react-i18next](https://github.com/i18next/react-i18next) | `17.0.8` | `17.0.10` |
| [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss) | `4.3.2` | `4.3.3` |
| [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest) | `4.1.9` | `4.1.10` |


Updates `@biomejs/biome` from 2.5.2 to 2.5.4
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.5.4/packages/@biomejs/biome)

Updates `@codemirror/view` from 6.43.5 to 6.43.6
- [Changelog](https://github.com/codemirror/view/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codemirror/view/commits)

Updates `@radix-ui/react-accordion` from 1.2.15 to 1.2.17
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/accordion/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/accordion)

Updates `@radix-ui/react-alert-dialog` from 1.1.18 to 1.1.20
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/alert-dialog/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/alert-dialog)

Updates `@radix-ui/react-checkbox` from 1.3.6 to 1.3.8
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/checkbox/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/checkbox)

Updates `@radix-ui/react-dialog` from 1.1.18 to 1.1.20
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/dialog/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/dialog)

Updates `@radix-ui/react-dropdown-menu` from 2.1.19 to 2.1.21
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/dropdown-menu/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/dropdown-menu)

Updates `@radix-ui/react-label` from 2.1.11 to 2.1.12
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/label/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/label)

Updates `@radix-ui/react-popover` from 1.1.18 to 1.1.20
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/popover/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/popover)

Updates `@radix-ui/react-progress` from 1.1.11 to 1.1.13
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/progress/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/progress)

Updates `@radix-ui/react-scroll-area` from 1.2.13 to 1.2.15
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/scroll-area/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/scroll-area)

Updates `@radix-ui/react-select` from 2.3.2 to 2.3.4
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/select/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/select)

Updates `@radix-ui/react-separator` from 1.1.11 to 1.1.12
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/separator/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/separator)

Updates `@radix-ui/react-slider` from 1.4.2 to 1.4.4
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/slider/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/slider)

Updates `@radix-ui/react-switch` from 1.3.2 to 1.3.4
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/switch/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/switch)

Updates `@radix-ui/react-tabs` from 1.1.16 to 1.1.18
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/tabs/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/tabs)

Updates `@radix-ui/react-tooltip` from 1.2.11 to 1.2.13
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/tooltip/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/tooltip)

Updates `@tailwindcss/vite` from 4.3.2 to 4.3.3
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.3/packages/@tailwindcss-vite)

Updates `@uiw/codemirror-extensions-langs` from 4.25.10 to 4.25.11
- [Release notes](https://github.com/uiwjs/react-codemirror/releases)
- [Commits](https://github.com/uiwjs/react-codemirror/compare/v4.25.10...v4.25.11)

Updates `@uiw/codemirror-theme-github` from 4.25.10 to 4.25.11
- [Release notes](https://github.com/uiwjs/react-codemirror/releases)
- [Commits](https://github.com/uiwjs/react-codemirror/compare/v4.25.10...v4.25.11)

Updates `@uiw/react-codemirror` from 4.25.10 to 4.25.11
- [Release notes](https://github.com/uiwjs/react-codemirror/releases)
- [Commits](https://github.com/uiwjs/react-codemirror/compare/v4.25.10...v4.25.11)

Updates `@vitest/coverage-v8` from 4.1.9 to 4.1.10
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.10/packages/coverage-v8)

Updates `@vitest/ui` from 4.1.9 to 4.1.10
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.10/packages/ui)

Updates `i18next` from 26.3.4 to 26.3.6
- [Release notes](https://github.com/i18next/i18next/releases)
- [Changelog](https://github.com/i18next/i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/i18next/compare/v26.3.4...v26.3.6)

Updates `radix-ui` from 1.6.1 to 1.6.3
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/radix-ui/CHANGELOG.md)
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/radix-ui)

Updates `react-i18next` from 17.0.8 to 17.0.10
- [Changelog](https://github.com/i18next/react-i18next/blob/master/CHANGELOG.md)
- [Commits](https://github.com/i18next/react-i18next/compare/v17.0.8...v17.0.10)

Updates `tailwindcss` from 4.3.2 to 4.3.3
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.3.3/packages/tailwindcss)

Updates `vitest` from 4.1.9 to 4.1.10
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.10/packages/vitest)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.5.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@codemirror/view"
  dependency-version: 6.43.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-accordion"
  dependency-version: 1.2.17
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-alert-dialog"
  dependency-version: 1.1.20
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-checkbox"
  dependency-version: 1.3.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-dialog"
  dependency-version: 1.1.20
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-dropdown-menu"
  dependency-version: 2.1.21
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-label"
  dependency-version: 2.1.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-popover"
  dependency-version: 1.1.20
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-progress"
  dependency-version: 1.1.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-scroll-area"
  dependency-version: 1.2.15
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-select"
  dependency-version: 2.3.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-separator"
  dependency-version: 1.1.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-slider"
  dependency-version: 1.4.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-switch"
  dependency-version: 1.3.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-tabs"
  dependency-version: 1.1.18
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-tooltip"
  dependency-version: 1.2.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@tailwindcss/vite"
  dependency-version: 4.3.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@uiw/codemirror-extensions-langs"
  dependency-version: 4.25.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@uiw/codemirror-theme-github"
  dependency-version: 4.25.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@uiw/react-codemirror"
  dependency-version: 4.25.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 4.1.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: "@vitest/ui"
  dependency-version: 4.1.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: i18next
  dependency-version: 26.3.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: radix-ui
  dependency-version: 1.6.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: react-i18next
  dependency-version: 17.0.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: tailwindcss
  dependency-version: 4.3.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
- dependency-name: vitest
  dependency-version: 4.1.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dev-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump ws in the prod-patch-updates group (#1071)

Bumps the prod-patch-updates group with 1 update: [ws](https://github.com/websockets/ws).


Updates `ws` from 8.21.0 to 8.21.1
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/8.21.0...8.21.1)

---
updated-dependencies:
- dependency-name: ws
  dependency-version: 8.21.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump the major-updates group with 2 updates (#1072)

Bumps the major-updates group with 2 updates: [nanoid](https://github.com/ai/nanoid) and [typescript](https://github.com/microsoft/TypeScript).


Updates `nanoid` from 5.1.16 to 6.0.0
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/5.1.16...6.0.0)

Updates `typescript` from 6.0.3 to 7.0.2
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Commits](https://github.com/microsoft/TypeScript/commits)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: major-updates
- dependency-name: typescript
  dependency-version: 7.0.2
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: major-updates
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix: general qol additions and new analytics/telemetrics feature

* fix: incorrect version sent to posthog

* feat: add multiplayer/shared sessions for terminal and guacd

* feat: rework Electron desktop app to run standalone-first with optional two-way sync to a remote Termix server

* Fix Guacamole tab visibility lifecycle (#1074)

Co-authored-by: default-student <default-student@github.com>
Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* fix(alerts): send channel config as object payload instead of JSON string (#1075)

* fix tmux-monitor tailscale issue (#1076)

* Initial plan

* fix(tmux-monitor): explicitly handle tailscale auth in PanePreview hostConfig

For Tailscale-auth hosts the pane-preview attach path was building the
Terminal hostConfig with only the generic spread of host fields.  This
could omit or mismap auth-critical details and trigger a plain TCP/SSH
reachability path that doesn't work with Tailscale-only SSH endpoints.

The fix branches on `host.authType === "tailscale"` and:
- Carries `authType: "tailscale"` explicitly so the backend always selects
  the Tailscale-aware PTY path regardless of how the host object evolves.
- Derives `port` from `host.sshPort ?? host.port` so Tailscale SSH
  endpoints on a non-default SSH port are reached correctly.
- Leaves all non-tailscale auth types on the unchanged code path.

Reattach (bumping instanceId + attachNonce) continues to work because
terminalHostConfig is recomputed on every render with the latest
instanceIdRef.current value.

* refactor(tmux-monitor): simplify tailscale port logic with extracted variable

Address code review feedback: extract resolvedPort into a local variable
to avoid the duplicated `host.sshPort ?? host.port` expression that was
assigned to both `port` and `sshPort`.  Restructure as an if/else block
instead of an IIFE for readability.

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* chore: run prettier

* chore: update beta release text

* fix: cant update credential of an RDP host

* feat: add custom key shortcuts

* feat: add support for MFA over SSH

* fix: Invalid websocket frame causing code 10006 crash triggering restart loop

* fix(net): correct SSRF blocklist false-positive blocking all outbound IPv4 (#1079)

* fix: correct IPv4-mapped-IPv6 blocklist entry blocking all outbound IPv4

::ffff:0:0/96 in the IPv6 blocklist matches every IPv4 address once
mapped, since Node's BlockList compares addresses in their mapped form
internally regardless of the declared family. This caused
safeOutboundFetch to reject all IPv4-resolved destinations as private,
breaking outbound requests (e.g. ntfy/webhook notifications) whenever
DNS resolved to IPv4. Replaced with individual mapped ranges mirroring
the existing IPv4 blocklist.

* test: cover isBlockedAddress and link the Node BlockList citation

Exports isBlockedAddress so its family-crossing behavior around
IPv4-mapped-IPv6 addresses can actually be asserted, instead of relying
on manual container debugging to notice a regression. Also swaps the
prior "Node's BlockList compares addresses in mapped form" comment for
one citing the documented example in the Node docs
(https://nodejs.org/api/net.html#class-netblocklist), since that
behavior isn't otherwise obvious from the addSubnet/check call sites.

Related: Termix-SSH/Support#1024

* refactor: derive IPv6 mirror from IPv4 list, split DNS error messages

Two follow-ups from review:

- The IPv6 blocklist previously hand-duplicated each IPv4 range as its
  IPv4-mapped-IPv6 equivalent. Nothing enforced the two stayed in sync,
  which is exactly how the original bug (a mismatched ::ffff:0:0/96
  entry blocking all IPv4) was introduced in the first place. Now
  derived from a single blockedIpv4Ranges list in one loop.

- The connect.lookup hook threw the same "Private destinations are not
  allowed" for both an empty DNS result and an actually-blocked address.
  An empty result is a resolution failure, not a privacy decision, and
  conflating the two is the same kind of opaque-error problem that made
  this bug slow to diagnose in production. Split into distinct messages.

Also extracted the lookup hook itself (createDnsLookupHook) so it can be
unit-tested against a fake resolver directly, instead of only through a
real fetch()/Agent call — the bug lived entirely in this callback, and
undici wraps any error thrown here as a generic "fetch failed" TypeError,
which is why isolating it matters for testability.

---------

Co-authored-by: brennanneoh <497569+brennanneoh@users.noreply.github.com>

* fix(ssh): do not offer chacha20-poly1305 without the native ssh2 binding (#1081)

The availability probe treated a working OpenSSL "chacha20" cipher as proof
that chacha20-poly1305@openssh.com is usable. It is not: ssh2 pure-JS
chacha20-poly1305 corrupts the transport, so the peer aborts the KEX
("incomplete message [preauth]") and the connection times out. Easy to hit
on jump-host connections whose target sshd negotiates chacha20-poly1305
first.

Only trust the native binding (sshcrypto.node); otherwise leave the cipher
disabled so filterCiphers() drops it and AES-GCM is negotiated instead.

Co-authored-by: XtraLarge <>

* fix: add Swiss German server layout (#1078)

* chore: update release notes

* feat: continue improving desktop app 2-way sync with logic fixes and a migration dialog

* fix: dekstop app showing auth form without syncing

* feat: create desktop auto sessions for existing setups

* feat: add electron backend killing

* fix: electron login and session related bugs and updated readme for v2.6.0

* chore: finalize release notes

* fix: click to expand hosts including extra bottom margin

* fix: desktop auth modal failing to log users in

* fix: desktop app failing to sync

* fix: reverse proxy causing sync error

* chore: lint, format, and bump version to 2.6.0

* chore: sync Crowdin translations for 2.6.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: L.H. <117188168+default-student@users.noreply.github.com>
Co-authored-by: default-student <default-student@github.com>
Co-authored-by: Brad Baker <xyzulu@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Brennan Neoh <brennanneoh@users.noreply.github.com>
Co-authored-by: brennanneoh <497569+brennanneoh@users.noreply.github.com>
Co-authored-by: XtraLarge <eMail@WilliWerres.de>
Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
This commit is contained in:
232 files changed
+50585 -32016

No files matched your search

+216 -3
View File
@@ -389,6 +389,45 @@
"noSavedServers": "Nincsenek mentett szerverek",
"removeServer": "Eltávolítás"
},
"migrationNotice": {
"title": "A Termix Desktop mostantól önállóan is fut",
"body1": "Ez az alkalmazás korábban közvetlenül a Termix szerveredhez csatlakozott. Átdolgoztuk, hogy teljesen önállóan fusson, helyben tárolja a hosztokat és a hitelesítő adatokat, így offline is működik. A kétirányú szinkronizálás egy saját üzemeltetésű Termix szerverrel mostantól opcionális.",
"body2": "A meglévő hosztok és hitelesítő adatok továbbra is a {{url}}címen találhatók. Kapcsold be a távoli szinkronizálást, és csatlakozz újra ehhez a szerverhez, hogy visszahozd őket, és a jövőben is szinkronban maradjanak.",
"dismiss": "Most nem",
"setUpSync": "Távoli szinkronizálás beállítása"
},
"remoteSync": {
"title": "Távoli szinkronizálás",
"description": "Opcionálisan csatlakoztathatod ezt az asztali alkalmazást egy saját üzemeltetésű Termix szerverhez, hogy szinkronizálhasd a hosztjaidat, hitelesítő adataidat és kódrészleteidet az eszközök között. Az alkalmazás mindig teljesen offline működik, függetlenül attól, hogy csatlakozol-e vagy sem.",
"notConnected": "Nincs csatlakoztatva",
"connected": "Csatlakoztatva",
"connectedTo": "Csatlakoztatva ehhez: {{url}}",
"lastSynced": "Utolsó szinkronizálás {{time}}",
"neverSynced": "Soha nem szinkronizálva",
"syncError": "Szinkronizálási hiba: {{message}}",
"needsReauth": "Bejelentkezés lejárt",
"connectButton": "Kapcsolódás a szerverhez",
"disconnectButton": "Leválasztás",
"syncNowButton": "Szinkronizálás most",
"syncing": "Szinkronizálás...",
"serverUrl": "Szerver URL-címe",
"enterServerUrl": "Kérjük, adjon meg egy szerver URL-címét",
"mustIncludeProtocol": "A szerver URL-címének http:// vagy https:// előtaggal kell kezdődnie.",
"connectionTestFailed": "Nem sikerült elérni a Termix szervert ezen az URL-címen.",
"allowInvalidCertificate": "Érvénytelen tanúsítvány engedélyezése",
"allowInvalidCertificateDesc": "Csak megbízható, saját üzemeltetésű szerverekhez használja, amelyek önaláírt vagy IP-cím alapú tanúsítvánnyal rendelkeznek.",
"savedServers": "Mentett szerverek",
"removeServer": "Eltávolítás",
"continueButton": "Folytatás",
"cancelButton": "Mégsem",
"signInTitle": "Jelentkezzen be ide: {{url}}",
"originTitle": "Kapcsolat eredete",
"originDescription": "Alapértelmezés szerint válassza ki az SSH-kapcsolatok forrását. Ez gazdagépenként felülbírálható.",
"originLocal": "Ez az eszköz (helyi hálózat)",
"originRemote": "Távoli szerver",
"bannerReconnect": "Újracsatlakozás",
"bannerMessage": "A távoli szinkronizáláshoz újra kell hitelesíteni"
},
"versionCheck": {
"error": "Verzióellenőrzési hiba",
"checkFailed": "Nem sikerült ellenőrizni a frissítéseket",
@@ -602,6 +641,7 @@
"overrideCredentialUsername": "Hitelesítő adat felülírása Felhasználónév",
"overrideCredentialUsernameDesc": "Használja a fent megadott felhasználónevet a hitelesítő adat felhasználóneve helyett.",
"oidcUsernameHint": "A $oidc.preferred_username paraméterrel helyettesítheti az OIDC bejelentkezési nevét.",
"tailscaleUsernameHint": "Ennek Unix felhasználónak kell lennie, akinek a Tailscale identitását a tailnet SSH ACL-jében adták meg, nem feltétlenül root felhasználónak.",
"jumpHostChain": "Jump Host Chain",
"portKnocking": "Port Knocking",
"addKnock": "Port hozzáadása",
@@ -650,6 +690,11 @@
"delayAfterMs": "Késleltetés után (ms)",
"useSocks5Proxy": "Használjon SOCKS5 proxyt",
"useSocks5ProxyDesc": "Kapcsolat átirányítása proxy szerveren keresztül",
"connectionOrigin": "Kapcsolat eredete",
"connectionOriginDesc": "Honnan származik ennek a gazdagépnek az SSH-kapcsolata. Felülírja az asztali alkalmazás globális alapértelmezett beállítását.",
"connectionOriginDefault": "Alapértelmezett használata",
"connectionOriginLocal": "Ez az eszköz (helyi hálózat)",
"connectionOriginRemote": "Távoli szerver",
"proxyHost": "Proxy állomás",
"proxyPort": "Proxy port",
"proxyUsername": "Proxy felhasználónév",
@@ -762,6 +807,14 @@
"customThemeBrightCyan": "Élénk ciánkék",
"customThemeBrightWhite": "Élénk fehér",
"customThemeResetTooltip": "Alapértelmezett beállítások visszaállítása",
"savedThemesLabel": "Mentett témák",
"saveAsGlobalTheme": "Mentés globális témaként",
"saveGlobalThemeNamePrompt": "Adjon meg egy nevet ennek a témának",
"saveGlobalThemeSuccess": "Téma mentve",
"saveGlobalThemeError": "Nem sikerült menteni a témát",
"applyGlobalThemeTooltip": "Alkalmazd ezt a témát",
"deleteGlobalThemeTooltip": "Téma törlése",
"noSavedThemes": "Még nincsenek mentett témák",
"syntaxHighlightingLabel": "Szintaxis kiemelése",
"syntaxHighlightingDesc": "Terminál kimenetének színezése (hibák, elérési utak, IP-címek, időbélyegek)",
"syntaxHighlightingCategories": "Kiemelt kategóriák",
@@ -791,6 +844,8 @@
"enableAutoTmuxDesc": "Automatikus indítás vagy csatlakozás a tmux munkamenethez",
"enableSessionLogging": "Munkamenet-naplózás",
"enableSessionLoggingDesc": "Terminál munkamenet kimenetének rögzítése későbbi áttekintés céljából",
"allowSessionSharing": "Munkamenet-megosztás engedélyezése",
"allowSessionSharingDesc": "Engedélyezi az élő munkamenetek megosztását ezen a gazdagépen linken vagy más felhasználókkal",
"enableCommandHistory": "Parancsnoki előzmények",
"enableCommandHistoryDesc": "A terminálon futó parancsok rögzítése előzmények és automatikus kiegészítés céljából",
"linkClickBehaviorLabel": "Linkkattintási viselkedés",
@@ -895,6 +950,7 @@
"proxmoxResultImported": "{{count}} importálva",
"proxmoxResultUpdated": "{{count}} frissítve",
"proxmoxResultFailed": "{{count}} sikertelen",
"proxmoxResultSkippedNoIp": "{{count}} kihagyva (nem található IP cím)",
"proxmoxImportComplete": "Proxmox importálás kész: {{summary}}",
"proxmoxDiscoveryFailed": "A felfedezés sikertelen",
"proxmoxImportFailed": "Importálás sikertelen",
@@ -961,6 +1017,9 @@
"failedToSaveCredential": "Nem sikerült menteni a hitelesítő adatokat",
"credentialNameRequired": "Kérjük, adjon meg egy nevet a hitelesítő adatnak",
"credentialAuthRequired": "Jelszó, SSH-kulcs vagy mindkettő hozzáadása",
"createCredentialFromHostBtn": "Hitelesítő adat létrehozása",
"createCredentialFromHostTitle": "Hitelesítő adat létrehozása a gazdagépről",
"createCredentialFromHostDesc": "Hozzon létre egy újrafelhasználható, megosztható hitelesítőadat-bejegyzést, amely előre ki van töltve a gazdagép jelenlegi felhasználónevével, jelszavával és/vagy SSH-kulcsával.",
"backToHosts": "Vissza a házigazdákhoz",
"backToCredentials": "Vissza a hitelesítő adatokhoz",
"pinned": "Rögzítve",
@@ -1000,6 +1059,9 @@
"folderNestingHint": "A / jellel választhatja el a szinteket, és hozhat létre beágyazott mappákat.",
"folderColor": "Szín",
"folderIcon": "Ikon",
"folderCredential": "Hitelesítő adat",
"folderCredentialNone": "Nincs hozzárendelve hitelesítő adat",
"folderCredentialHint": "Az ebben a mappában található, kiválasztott hitelesítő adatok nélküli „Tárolt hitelesítő adatok” hitelesítést használó hosztok öröklik ezt a hitelesítő adatot.",
"folderPreview": "Előnézet",
"folderNameFallback": "Névtelen mappa",
"createFolderButton": "Mappa létrehozása",
@@ -1181,6 +1243,10 @@
"filterTagsGroup": "Címkék",
"shareHost": "Megosztási házigazda",
"shareHostTitle": "Megosztás: {{name}}",
"shareFolder": "Mappa megosztása",
"shareFolderTitle": "Megosztott mappa: {{name}}",
"folderSharedSuccessfully": "Megosztott {{count}} gazdagép(ek) a mappában",
"failedToShareFolder": "Nem sikerült megosztani a mappát",
"sharing": {
"loadError": "Nem sikerült betölteni a megosztási adatokat. Próbáld újra.",
"shareWithSection": "Megosztás",
@@ -1221,6 +1287,7 @@
"shareWithCount": "Megosztás ({{count}})",
"currentAccess": "Jelenlegi hozzáférés",
"noAccessEntries": "Ez a hoszt még nincs megosztva",
"folderShareSummary": "Megosztott {{shared}} / {{total}} gazdagép ebben a mappában",
"grantedBy": "Megadta",
"expires": "Lejár",
"expired": "Lejárt",
@@ -1242,6 +1309,8 @@
"authMethod": "Aut. módszer",
"authTypeDirect": "Közvetlen",
"authTypeCredential": "Hitelesítő adat",
"authTypeNone": "Egyik sem",
"authTypeNoneDesc": "Nincsenek tárolt hitelesítő adatok. Minden csatlakozáskor meg kell adnia a felhasználónevet és a jelszót; ezek nem kerülnek mentésre.",
"selectCredential": "Válasszon hitelesítő adatot...",
"connectionSettings": "Kapcsolati beállítások",
"displaySettings": "Kijelzőbeállítások",
@@ -1259,6 +1328,7 @@
"rdpPort": "RDP-port",
"username": "Felhasználónév",
"password": "Jelszó",
"passwordSaved": "Jelszó mentve, gépelje be a módosításhoz",
"domain": "Domain",
"securityMode": "Biztonsági mód",
"colorDepth": "Színmélység",
@@ -1424,7 +1494,60 @@
"expiresIn": "Lejár {{duration}} múlva",
"search": "Kapcsolatok keresése...",
"noSearchResults": "Nincsenek a keresésnek megfelelő kapcsolatok",
"rename": "Munkamenet átnevezése"
"rename": "Munkamenet átnevezése",
"sectionSharedWithMe": "Megosztva velem",
"sharedBy": "Megosztotta: {{username}}",
"join": "Csatlakozik",
"sharedSessionLabel": "{{hostName}} (megosztva)"
},
"sessionSharing": {
"guestView": {
"loading": "Kapcsolódás a megosztott munkamenethez...",
"linkInvalid": "Ez a megosztási link érvénytelen, lejárt vagy visszavonták.",
"rateLimited": "Túl sok próbálkozás, kérjük, próbáld újra később",
"sessionEnded": "Ez a munkamenet véget ért",
"readOnlyBadge": "Csak megtekintés"
},
"modalTitle": "Megosztási munkamenet",
"shareButton": "Részesedés",
"notReadyToShare": "A munkamenet még nem megosztható",
"modeTab": {
"link": "Link",
"user": "Felhasználó"
},
"linkModeDescription": "Bárki csatlakozhat a link birtokában, nincs szükség regisztrációra.",
"userModeDescription": "Megosztás egy adott felhasználóval, aki már rendelkezik hozzáféréssel ehhez a gazdagéphez. Ha még nincs hozzáférésük, először oszd meg vele a gazdagépet, vagy használj hivatkozást. A megosztás után a munkamenet megjelenik a Kapcsolatok lapon.",
"permissionLevel": {
"label": "Jogosultsági szint",
"readOnly": "Csak olvasható",
"readOnlyDescription": "Élőben nézhetem az előadást, de nem gépelhetek és nem léphetek interakcióba.",
"readWrite": "Olvasható-írható",
"readWriteDescription": "Pont úgy tud gépelni és kommunikálni a munkamenettel, mint a tulajdonos."
},
"expiryLabel": "Link lejárata",
"createLinkButton": "Link létrehozása",
"createShareButton": "Megosztás a felhasználóval",
"searchUsersPlaceholder": "Felhasználók keresése...",
"noUsersFound": "Nem található felhasználó",
"linkCreated": "Megosztási link létrehozva",
"linkCopied": "Link a vágólapra másolva",
"copyLink": "Link másolása",
"shareCreated": "Munkamenet megosztva. Megjelenik a Kapcsolatok fülön.",
"shareFailed": "Nem sikerült létrehozni a megosztást",
"userLacksHostAccess": "A felhasználónak még nincs hozzáférése ehhez a gazdagéphez. Először oszd meg vele a gazdagépet, vagy használj linket.",
"activeShares": "Aktív megosztások",
"noActiveShares": "Nincsenek aktív megosztások ebben a munkamenetben",
"revoke": "Visszavonás",
"revokeConfirmTitle": "Visszavonja ezt a megosztást?",
"revokeConfirmDescription": "Bárki, aki ezt a megosztást használja, azonnal elveszíti a hozzáférését.",
"revoked": "Megosztás visszavonva",
"revokeFailed": "Nem sikerült visszavonni a megosztást",
"joinCount": "{{count}} csatlakozás",
"joinCount_other": "{{count}} csatlakozások",
"expiresAt": "Lejár {{date}}",
"linkShareBadge": "Link",
"userShareBadge": "Felhasználó: {{username}}",
"loadSharesFailed": "Nem sikerült betölteni az aktív megosztásokat"
},
"guacamole": {
"connecting": "Kapcsolódás ehhez: {{type}} munkamenet...",
@@ -1436,6 +1559,9 @@
"reconnect": "Újracsatlakozás",
"retry": "Újrapróbálkozás",
"guacdUnavailable": "A távoli asztali szolgáltatás (guacd) nem érhető el. Kérjük, győződjön meg róla, hogy a guacd fut, elérhető és megfelelően van konfigurálva az adminisztrátori beállításokban.",
"credentialPromptTitle": "RDP hitelesítő adatok megadása",
"credentialPromptDescription": "Ez a gazdagép úgy van beállítva, hogy csatlakozáskor hitelesítő adatokat kérjen. Ezeket csak ehhez a munkamenethez használjuk, és nem kerülnek mentésre.",
"connect": "Csatlakozás",
"ctrlAltDel": "Ctrl+Alt+Del",
"toolbar": {
"ctrlAltDel": "Ctrl+Alt+Del",
@@ -1461,7 +1587,9 @@
"reconnect": "Munkamenet újracsatlakoztatása",
"collapse": "Eszköztár összecsukása",
"expand": "Eszköztár kibontása",
"dragHandle": "Húzással áthelyezhető"
"dragHandle": "Húzással áthelyezhető",
"switchToTrackpad": "Váltás trackpad módra (húzással mozgathatja a kurzort, koppintással kattinthat)",
"switchToTouch": "Váltás érintőképernyős módra (koppintson közvetlenül oda, ahová kattintani szeretne)"
}
},
"terminal": {
@@ -1508,6 +1636,11 @@
"totpRequired": "Kétfaktoros hitelesítés szükséges",
"totpCodeLabel": "Ellenőrző kód",
"totpVerify": "Ellenőrzés",
"mfaPromptRequired": "Hitelesítés szükséges",
"mfaPushRequired": "Push hitelesítés szükséges",
"mfaMenuPlaceholder": "Írd be a válaszod",
"mfaWaitingApproval": "Várakozás a jóváhagyásra az eszközödön...",
"mfaSendRequest": "Kérés küldése",
"warpgateAuthRequired": "Warpgate hitelesítés szükséges",
"warpgateSecurityKey": "Biztonsági kulcs",
"warpgateAuthUrl": "Hitelesítési URL",
@@ -2277,7 +2410,8 @@
"resetCodeRateLimited": "Korlátozott sebesség: Túl sok ellenőrzési kísérlet. Kérjük, próbálja újra később.",
"resetCodeRateLimitedWithTime": "Korlátozott sebesség: Túl sok ellenőrzési kísérlet. Kérjük, várjon {{time}} másodpercet, mielőtt újra próbálkozik.",
"authTokenSaveFailed": "Nem sikerült menteni a hitelesítési tokent",
"failedToLoadServer": "Nem sikerült betölteni a szervert"
"failedToLoadServer": "Nem sikerült betölteni a szervert",
"remoteServerRequired": "Távoli szerver szükséges. Csatlakoztasson egy távoli szervert a Beállításokban a kapcsolattípus használatához."
},
"messages": {
"registrationDisabled": "Az új fiók regisztrációját jelenleg egy adminisztrátor letiltotta. Kérjük, jelentkezzen be, vagy vegye fel a kapcsolatot egy adminisztrátorral.",
@@ -2644,6 +2778,17 @@
"sslSaveFailed": "Nem sikerült menteni az SSL-beállításokat",
"sslRequiresDomain": "Domain és email cím megadása kötelező",
"sslInfoNote": "Tanúsítvány kiállítása után engedélyezze az SSL-t a környezeti változókban (ENABLE_SSL=true), és indítsa újra a Termixet.",
"sslManualOption": "Kézikönyv (tanúsítvány feltöltése)",
"sslManualCert": "Tanúsítvány (PEM)",
"sslManualCertPlaceholder": "-----TANÚSÍTVÁNY KEZDETE-----",
"sslManualKey": "Privát kulcs (PEM)",
"sslManualKeyPlaceholder": "-----PRIVÁT KULCS KEZDETE-----",
"sslManualDesc": "Illeszd be a meglévő tanúsítványodat és privát kulcsodat, beleértve a teljes láncot is, ha a hitelesítésszolgáltatód megköveteli.",
"sslManualUpload": "Tanúsítvány feltöltése és telepítése",
"sslManualUploadLoading": "Tanúsítvány feltöltése...",
"sslManualUploadSuccess": "A tanúsítvány feltöltése és telepítése sikeresen megtörtént",
"sslManualUploadFailed": "A tanúsítvány feltöltése sikertelen",
"sslManualRequiresFields": "Tanúsítvány és privát kulcs szükséges",
"auditLogTotal": "{{total}} összes bejegyzés",
"auditLogEmpty": "Nem találhatók naplóbejegyzések",
"auditLogSuccess": "Siker",
@@ -2672,6 +2817,12 @@
"commandHistoryEnabled": "Parancsnoki előzmények",
"commandHistoryEnabledDesc": "Parancselőzmények rögzítésének engedélyezése. Ha le van tiltva, az előzmények nem kerülnek mentésre, függetlenül a gazdagép beállításaitól.",
"updateCommandHistoryFailed": "Nem sikerült frissíteni a parancselőzmények beállítását",
"analyticsEnabled": "Névtelen használati statisztikák megosztása",
"analyticsEnabledDesc": "Naponta névtelenül küldi a felhasználók, a hosztok és a funkciók használatának számát a Termix fejlesztése érdekében. Személyes adatokat vagy kapcsolati adatokat nem tartalmaz.",
"updateAnalyticsFailed": "Nem sikerült frissíteni az analitikai beállításokat",
"sessionSharingGloballyEnabled": "Munkamenet-megosztás engedélyezése",
"sessionSharingGloballyEnabledDesc": "Engedélyezi az élő terminál-, RDP-, VNC- és Telnet-munkamenetek példányonkénti megosztását. Letiltás esetén felülírja az összes gazdagépenkénti megosztási kapcsolót.",
"updateSessionSharingFailed": "Nem sikerült frissíteni a munkamenet-megosztási beállítást",
"sessionTimeout": "Munkamenet időkorlátja",
"hours": "órák",
"sessionTimeoutRange": "Minimum 1 óra · Max. 720 óra",
@@ -3119,6 +3270,47 @@
"executionSuccess": "Siker",
"executionFailed": "Sikertelen"
},
"keybindings": {
"title": "Billentyűparancsok",
"description": "Testreszabhatja a terminál másolási, beillesztési és vezérlési billentyűparancsait, vagy billentyűket köthet szöveg küldéséhez vagy kódrészlet futtatásához.",
"defaultsHeading": "Beépített gyorsbillentyűk",
"customHeading": "Egyéni billentyűparancsok",
"addBinding": "Parancsikon hozzáadása",
"addBindingTitle": "Parancsikon hozzáadása",
"editBindingTitle": "Parancsikon szerkesztése",
"loading": "Terhelés...",
"noCustomBindings": "Még nincsenek egyéni billentyűparancsok",
"defaultBadge": "Alapértelmezett",
"customizedBadge": "Testreszabott",
"customize": "Testreszabás",
"resetToDefault": "Visszaállítás az alapértelmezettre",
"resetAllToDefaults": "Minden visszaállítása alapértelmezettre",
"close": "Közeli",
"cancel": "Mégsem",
"saveBinding": "Parancsikon mentése",
"saveError": "Nem sikerült menteni a billentyűparancsokat",
"pressKeysToRecord": "Billentyűkombináció",
"pressKeysPlaceholder": "Kattintson és nyomja meg a billentyűket",
"recording": "Nyomja meg a billentyűket...",
"comboRequiredError": "Először nyomjon meg egy billentyűkombinációt",
"textRequiredError": "Írd be a küldendő szöveget",
"controlCodeRequiredError": "Írjon be egyetlen betűt az ellenőrző kódhoz",
"snippetRequiredError": "Válasszon ki egy részletet",
"conflictWarning": "Ez a kombináció már a {{combo}}-hoz van kötve. Mentés esetén mindkettő aktiválódik.",
"actionLabel": "Akció",
"actionCopy": "Kijelölés másolása",
"actionPaste": "Paszta",
"actionSendControlCode": "Ctrl+betűjel küldése",
"actionSendText": "SMS küldése",
"actionRunSnippet": "Meglévő kódrészlet futtatása",
"controlCodeLabel": "Levél",
"textLabel": "Küldendő szöveg",
"appendEnterLabel": "Küldés után nyomja meg az Enter billentyűt",
"snippetLabel": "Töredék",
"selectSnippetPlaceholder": "Válasszon ki egy részletet",
"orphanedSnippetWarning": "részlet nem található",
"clipboardPermissionNote": "Egyes böngészőkben első használatkor vágólap-engedélyt kérhet."
},
"userProfile": {
"donateTitle": "Tartsd életben a Termixet",
"donateDescription": "A Termix ingyenes, saját tárhelyen üzemel, és csak néhány ember fejlesztette a szabadidejében. Ha időt vagy pénzt takarított meg vele, egy kriptovaluta-adomány segíthet a működésben.",
@@ -3134,6 +3326,7 @@
"sectionAppearance": "Megjelenés",
"sectionSecurity": "Biztonság",
"sectionApiKeys": "API-kulcsok",
"sectionData": "Adat",
"sectionC2sTunnels": "C2S alagutak",
"usernameLabel": "Felhasználónév",
"roleLabel": "Szerep",
@@ -3162,6 +3355,9 @@
"settingsTerminal": "Terminál",
"commandAutocomplete": "Parancs automatikus kiegészítése",
"commandAutocompleteDesc": "Automatikus kiegészítés megjelenítése gépelés közben",
"keyboardShortcuts": "Billentyűparancsok",
"keyboardShortcutsDescription": "A terminál másolási, beillesztési és parancsikonjainak testreszabása",
"manageShortcuts": "Kezelés",
"terminalLinkBehavior": "Terminálkapcsolat kattintása",
"terminalLinkBehaviorDesc": "Alapértelmezett viselkedés hivatkozásokra kattintva a terminálban",
"historyTracking": "Előzménykövetés",
@@ -3228,6 +3424,22 @@
"apiKeyUsageHint": "Tedd bele a kulcsodat",
"apiKeyUsageHintHeader": "fejléc.",
"apiKeyPermissionsHint": "A kulcsok öröklik a létrehozó felhasználó jogosultságait.",
"exportData": "Adatok exportálása",
"exportDataDesc": "Töltsd le a gazdagépeid, hitelesítő adataid és beállításaid biztonsági másolatát egy másik eszközre való átvitelhez.",
"export": "Export",
"exporting": "Exportálás...",
"importData": "Adatok importálása",
"importDataDesc": "Állítsa vissza a gazdagépeket, hitelesítő adatokat és beállításokat egy .sqlite biztonsági mentésfájlból",
"importDataSelected": "Kiválasztva: {{name}}",
"selectFile": "Fájl kiválasztása",
"changeFile": "Változás",
"import": "Importálás",
"importing": "Importálás...",
"exportSuccess": "Az adatok exportálása sikeresen megtörtént",
"exportFailed": "Adatexportálás sikertelen",
"importSelectFile": "Kérjük, először válasszon ki egy fájlt",
"importCompleted": "Importálás befejezve: {{total}} elem importálva, {{skipped}} kihagyva",
"importFailed": "Importálás sikertelen: {{error}}",
"roleUser": "Felhasználó",
"authMethodDual": "Kettős hitelesítés",
"authMethodOidc": "OIDC",
@@ -3379,6 +3591,7 @@
"pageUp": "PgUp",
"pageDown": "PgDn",
"delete": "Del",
"paste": "Paszta",
"editQuickKeys": "Gyorsbillentyűk szerkesztése",
"quickKeysTitle": "Gyorsbillentyűk",
"quickKeysDesc": "Koppintson a × jelre az eltávolításhoz. Legfeljebb 8 karaktert támogat.",