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": "אין שרתים שמורים",
"removeServer": "לְהַסִיר"
},
"migrationNotice": {
"title": "שולחן העבודה של Termix פועל כעת באופן עצמאי",
"body1": "אפליקציה זו הייתה מתחברת ישירות לשרת Termix שלך. היא עובדה מחדש כדי לפעול באופן עצמאי לחלוטין, תוך אחסון מארחים ופרטי גישה מקומיים כך שהיא תמשיך לעבוד במצב לא מקוון. סנכרון דו-כיווני עם שרת Termix המתארח באופן עצמאי הוא כעת אופציונלי.",
"body2": "המארחים והאישורים הקיימים שלך עדיין נמצאים ב- {{url}}. הפעל את הסנכרון מרחוק והתחבר מחדש לשרת זה כדי להחזיר אותם ולשמור על שניהם מסונכרנים מעתה והלאה.",
"dismiss": "לא עכשיו",
"setUpSync": "הגדר סנכרון מרחוק"
},
"remoteSync": {
"title": "סנכרון מרחוק",
"description": "ניתן לחבר אפליקציית שולחן עבודה זו לשרת Termix המתארח באופן עצמאי כדי לסנכרן את המארחים, האישורים והקטעים שלך בין מכשירים. האפליקציה תמיד פועלת באופן מלא במצב לא מקוון, בין אם אתה מתחבר ובין אם לא.",
"notConnected": "לא מחובר",
"connected": "מְחוּבָּר",
"connectedTo": "מחובר אל {{url}}",
"lastSynced": "סנכרון אחרון {{time}}",
"neverSynced": "מעולם לא סנכרן",
"syncError": "שגיאת סינכרון: {{message}}",
"needsReauth": "פג תוקף הכניסה",
"connectButton": "התחברות לשרת",
"disconnectButton": "לְנַתֵק",
"syncNowButton": "סנכרן עכשיו",
"syncing": "מסנכרן...",
"serverUrl": "כתובת URL של השרת",
"enterServerUrl": "אנא הזן כתובת URL של שרת",
"mustIncludeProtocol": "כתובת השרת חייבת להתחיל ב-http:// או https://",
"connectionTestFailed": "לא ניתן היה להגיע לשרת Termix בכתובת URL זו",
"allowInvalidCertificate": "אפשר אישור לא חוקי",
"allowInvalidCertificateDesc": "השתמש רק עבור שרתים מהימנים המתארחים בעצמם עם אישורי חתימה עצמית או אישורי כתובת IP.",
"savedServers": "שרתים שמורים",
"removeServer": "לְהַסִיר",
"continueButton": "לְהַמשִׁיך",
"cancelButton": "לְבַטֵל",
"signInTitle": "היכנס אל {{url}}",
"originTitle": "מקור החיבור",
"originDescription": "בחר כברירת מחדל מהיכן חיבורי SSH מגיעים. ניתן לעקוף זאת לפי מארח.",
"originLocal": "מכשיר זה (רשת מקומית)",
"originRemote": "שרת מרוחק",
"bannerReconnect": "התחבר מחדש",
"bannerMessage": "סנכרון מרחוק דורש אימות מחדש"
},
"versionCheck": {
"error": "שגיאת בדיקת גרסה",
"checkFailed": "נכשל בבדיקת עדכונים",
@@ -602,6 +641,7 @@
"overrideCredentialUsername": "עקיפת שם משתמש של פרטי כניסה",
"overrideCredentialUsernameDesc": "השתמש בשם המשתמש שצוין למעלה במקום שם המשתמש של פרטי האישור",
"oidcUsernameHint": "השתמש ב- $oidc.preferred_username כדי להחליף את שם המשתמש שלך ב-OIDC.",
"tailscaleUsernameHint": "זה חייב להיות משתמש יוניקס שזהות Tailscale שלך מוענקת לו ב-SSH ACL של tailnet, לאו דווקא root.",
"jumpHostChain": "שרשרת מארח קפיצה",
"portKnocking": "פורט נוקינג",
"addKnock": "הוסף יציאה",
@@ -650,6 +690,11 @@
"delayAfterMs": "עיכוב לאחר (מילישניות)",
"useSocks5Proxy": "השתמש בפרוקסי SOCKS5",
"useSocks5ProxyDesc": "ניתוב חיבור דרך שרת פרוקסי",
"connectionOrigin": "מקור החיבור",
"connectionOriginDesc": "מאיפה מגיע חיבור ה-SSH של מארח זה. עוקף את הגדרת ברירת המחדל הגלובלית של אפליקציית שולחן העבודה.",
"connectionOriginDefault": "השתמש בברירת מחדל",
"connectionOriginLocal": "מכשיר זה (רשת מקומית)",
"connectionOriginRemote": "שרת מרוחק",
"proxyHost": "מארח פרוקסי",
"proxyPort": "יציאת פרוקסי",
"proxyUsername": "שם משתמש פרוקסי",
@@ -762,6 +807,14 @@
"customThemeBrightCyan": "ציאן בהיר",
"customThemeBrightWhite": "לבן בהיר",
"customThemeResetTooltip": "איפוס להגדרות ברירת מחדל",
"savedThemesLabel": "ערכות נושא שמורות",
"saveAsGlobalTheme": "שמור כערכת נושא גלובלית",
"saveGlobalThemeNamePrompt": "הזן שם עבור ערכת נושא זו",
"saveGlobalThemeSuccess": "ערכת הנושא נשמרה",
"saveGlobalThemeError": "שמירת ערכת הנושא נכשלה",
"applyGlobalThemeTooltip": "החל ערכת נושא זו",
"deleteGlobalThemeTooltip": "מחק את ערכת הנושא הזו",
"noSavedThemes": "עדיין אין ערכות נושא שנשמרו",
"syntaxHighlightingLabel": "הדגשת תחביר",
"syntaxHighlightingDesc": "צבע את פלט הטרמינל (שגיאות, נתיבים, כתובות IP, חותמות זמן)",
"syntaxHighlightingCategories": "הדגש קטגוריות",
@@ -791,6 +844,8 @@
"enableAutoTmuxDesc": "הפעל או צורף אוטומטית לסשן tmux",
"enableSessionLogging": "רישום מושבים",
"enableSessionLoggingDesc": "הקלט את פלט הפעלת הטרמינל לצורך סקירה מאוחרת יותר",
"allowSessionSharing": "אפשר שיתוף סשנים",
"allowSessionSharingDesc": "אפשר שיתוף של מפגשים חיים במארח זה באמצעות קישור או עם משתמשים אחרים",
"enableCommandHistory": "היסטוריית פקודות",
"enableCommandHistoryDesc": "פקודות הקלטה פועלות בטרמינל זה לצורך היסטוריה והשלמה אוטומטית",
"linkClickBehaviorLabel": "התנהגות לחיצה על קישור",
@@ -895,6 +950,7 @@
"proxmoxResultImported": "{{count}} מיובא",
"proxmoxResultUpdated": "{{count}} updated",
"proxmoxResultFailed": "{{count}} נכשל",
"proxmoxResultSkippedNoIp": "{{count}} דילג (לא נמצאה כתובת IP)",
"proxmoxImportComplete": "ייבוא Proxmox הושלם: {{summary}}",
"proxmoxDiscoveryFailed": "הגילוי נכשל",
"proxmoxImportFailed": "הייבוא נכשל",
@@ -961,6 +1017,9 @@
"failedToSaveCredential": "שמירת האישורים נכשלה",
"credentialNameRequired": "אנא הזן שם עבור האישור",
"credentialAuthRequired": "הוסף סיסמה, מפתח SSH או שניהם",
"createCredentialFromHostBtn": "צור אישור",
"createCredentialFromHostTitle": "צור אישור מהמארח",
"createCredentialFromHostDesc": "צור ערך אישורים רב פעמי וניתן לשיתוף, הממולא מראש בשם המשתמש, הסיסמה ו/או מפתח ה-SSH הנוכחיים של מארח זה.",
"backToHosts": "חזרה למארחים",
"backToCredentials": "חזרה לאישורים",
"pinned": "מוצמד",
@@ -1000,6 +1059,9 @@
"folderNestingHint": "השתמשו ב-/ כדי להפריד רמות וליצור תיקיות מקוננות.",
"folderColor": "צֶבַע",
"folderIcon": "אייקון",
"folderCredential": "תְעוּדָה",
"folderCredentialNone": "לא הוקצו אישורים",
"folderCredentialHint": "מארחים בתיקייה זו המשתמשים באימות \"אישורים מאוחסנים\" מבלי שבחרו אישור משלהם, יירשו את האישור הזה.",
"folderPreview": "תצוגה מקדימה",
"folderNameFallback": "תיקייה ללא שם",
"createFolderButton": "צור תיקייה",
@@ -1181,6 +1243,10 @@
"filterTagsGroup": "תגיות",
"shareHost": "שתף מארח",
"shareHostTitle": "שתף: {{name}}",
"shareFolder": "שיתוף תיקייה",
"shareFolderTitle": "שיתוף תיקייה: {{name}}",
"folderSharedSuccessfully": "מארחים משותפים {{count}} בתיקייה",
"failedToShareFolder": "שיתוף התיקייה נכשל",
"sharing": {
"loadError": "טעינת נתוני השיתוף נכשלה. אנא נסה שוב.",
"shareWithSection": "שתף עם",
@@ -1221,6 +1287,7 @@
"shareWithCount": "שתף ({{count}})",
"currentAccess": "גישה נוכחית",
"noAccessEntries": "מארח זה עדיין לא שותף",
"folderShareSummary": "מארחים משותפים {{shared}} של {{total}} בתיקייה זו",
"grantedBy": "הוענק על ידי",
"expires": "פג תוקף",
"expired": "פג תוקף",
@@ -1242,6 +1309,8 @@
"authMethod": "שיטת אימות",
"authTypeDirect": "יָשִׁיר",
"authTypeCredential": "תְעוּדָה",
"authTypeNone": "אַף לֹא אֶחָד",
"authTypeNoneDesc": "לא נשמרים פרטי גישה. תתבקש להזין שם משתמש וסיסמה בכל פעם שתתחבר; הם לא נשמרים.",
"selectCredential": "בחר אישור...",
"connectionSettings": "הגדרות חיבור",
"displaySettings": "הגדרות תצוגה",
@@ -1259,6 +1328,7 @@
"rdpPort": "יציאת RDP",
"username": "שם משתמש",
"password": "סִיסמָה",
"passwordSaved": "הסיסמה נשמרה, הקלד כדי לשנות",
"domain": "תְחוּם",
"securityMode": "מצב אבטחה",
"colorDepth": "עומק צבע",
@@ -1424,7 +1494,60 @@
"expiresIn": "פג תוקף בעוד {{duration}}",
"search": "חיפוש חיבורים...",
"noSearchResults": "אין קשרים התואמים את החיפוש שלך",
"rename": "שינוי שם של סשן"
"rename": "שינוי שם של סשן",
"sectionSharedWithMe": "שיתף איתי",
"sharedBy": "שותף על ידי {{username}}",
"join": "לְהִצְטַרֵף",
"sharedSessionLabel": "{{hostName}} (שותף)"
},
"sessionSharing": {
"guestView": {
"loading": "מתחבר לסשן משותף...",
"linkInvalid": "קישור השיתוף הזה אינו תקין, פג תוקף או בוטל",
"rateLimited": "יותר מדי ניסיונות, אנא נסה שוב בקרוב",
"sessionEnded": "מושב זה הסתיים",
"readOnlyBadge": "צפייה בלבד"
},
"modalTitle": "שיתוף סשן",
"shareButton": "לַחֲלוֹק",
"notReadyToShare": "הסשן עדיין לא מוכן לשיתוף",
"modeTab": {
"link": "לְקַשֵׁר",
"user": "מִשׁתַמֵשׁ"
},
"linkModeDescription": "כל מי שיש לו קישור זה יכול להצטרף, אין צורך בחשבון.",
"userModeDescription": "שתף עם משתמש ספציפי שכבר יש לו גישה למארח זה. אם עדיין אין לו גישה, שתף איתו תחילה את המארח או השתמש בקישור במקום זאת. לאחר השיתוף, הסשן מופיע בכרטיסייה \"חיבורים\" שלו.",
"permissionLevel": {
"label": "רמת הרשאה",
"readOnly": "לקריאה בלבד",
"readOnlyDescription": "יכול לצפות בפגישה בשידור חי אך לא להקליד או לתקשר.",
"readWrite": "קריאה-כתיבה",
"readWriteDescription": "יכול להקליד ולקיים אינטראקציה עם הסשן בדיוק כמו הבעלים."
},
"expiryLabel": "תוקף הקישור",
"createLinkButton": "צור קישור",
"createShareButton": "שתף עם המשתמש",
"searchUsersPlaceholder": "חיפוש משתמשים...",
"noUsersFound": "לא נמצאו משתמשים",
"linkCreated": "קישור השיתוף נוצר",
"linkCopied": "קישור שהועתק ללוח",
"copyLink": "העתקת קישור",
"shareCreated": "הסשן שותף. זה יופיע בלשונית החיבורים שלהם.",
"shareFailed": "יצירת השיתוף נכשלה",
"userLacksHostAccess": "למשתמש הזה עדיין אין גישה למארח הזה. שתף את המארח איתו תחילה, או השתמש בקישור במקום זאת.",
"activeShares": "מניות פעילות",
"noActiveShares": "אין שיתופים פעילים עבור סשן זה",
"revoke": "לְבַטֵל",
"revokeConfirmTitle": "לבטל את השיתוף הזה?",
"revokeConfirmDescription": "כל מי שישתמש בשיתוף הזה יאבד גישה באופן מיידי.",
"revoked": "השיתוף בוטל",
"revokeFailed": "ביטול השיתוף נכשל",
"joinCount": "{{count}} join",
"joinCount_other": "{{count}} מצטרף",
"expiresAt": "פג תוקף {{date}}",
"linkShareBadge": "לְקַשֵׁר",
"userShareBadge": "משתמש: {{username}}",
"loadSharesFailed": "נכשלה טעינת השיתופים הפעילים"
},
"guacamole": {
"connecting": "מתחבר לסשן {{type}}...",
@@ -1436,6 +1559,9 @@
"reconnect": "התחבר מחדש",
"retry": "נסה שוב",
"guacdUnavailable": "שירות שולחן עבודה מרוחק (guacd) אינו זמין. אנא ודא ש-guacd פועל, נגיש ומוגדר כראוי בהגדרות המנהל.",
"credentialPromptTitle": "הזן אישורי RDP",
"credentialPromptDescription": "מארח זה מוגדר לבקש אישורים בעת התחברות. הם משמשים עבור הפעלה זו בלבד ואינם נשמרים.",
"connect": "לְחַבֵּר",
"ctrlAltDel": "Ctrl+Alt+Del",
"toolbar": {
"ctrlAltDel": "Ctrl+Alt+Del",
@@ -1461,7 +1587,9 @@
"reconnect": "חיבור מחדש של הפעלת המושב",
"collapse": "כיווץ סרגל הכלים",
"expand": "הרחב את סרגל הכלים",
"dragHandle": "גרור כדי למקם מחדש"
"dragHandle": "גרור כדי למקם מחדש",
"switchToTrackpad": "מעבר למצב משטח עקיבה (גרור כדי להזיז את הסמן, הקש כדי ללחוץ)",
"switchToTouch": "מעבר למצב מגע (הקש ישירות במקום שברצונך ללחוץ)"
}
},
"terminal": {
@@ -1508,6 +1636,11 @@
"totpRequired": "נדרש אימות דו-שלבי",
"totpCodeLabel": "קוד אימות",
"totpVerify": "לְאַמֵת",
"mfaPromptRequired": "נדרש אימות",
"mfaPushRequired": "נדרש אימות דחיפה",
"mfaMenuPlaceholder": "הזן את תגובתך",
"mfaWaitingApproval": "ממתין לאישור במכשיר שלך...",
"mfaSendRequest": "שלח בקשה",
"warpgateAuthRequired": "נדרש אימות Warpgate",
"warpgateSecurityKey": "מפתח אבטחה",
"warpgateAuthUrl": "כתובת URL לאימות",
@@ -2277,7 +2410,8 @@
"resetCodeRateLimited": "קצב מוגבל: יותר מדי ניסיונות אימות. אנא נסה שוב מאוחר יותר.",
"resetCodeRateLimitedWithTime": "קצב מוגבל: יותר מדי ניסיונות אימות. אנא המתן {{time}} שניות לפני שתנסה שוב.",
"authTokenSaveFailed": "נכשלה שמירת אסימון האימות",
"failedToLoadServer": "טעינת השרת נכשלה"
"failedToLoadServer": "טעינת השרת נכשלה",
"remoteServerRequired": "נדרש שרת מרוחק. יש להתחבר לשרת מרוחק בהגדרות כדי להשתמש בסוג חיבור זה."
},
"messages": {
"registrationDisabled": "רישום חשבון חדש מושבת כעת על ידי מנהל. אנא התחבר או צור קשר עם מנהל.",
@@ -2644,6 +2778,17 @@
"sslSaveFailed": "שמירת הגדרות SSL נכשלה",
"sslRequiresDomain": "נדרשים דומיין וכתובת אימייל",
"sslInfoNote": "לאחר הנפקת האישור, הפעל את SSL במשתני הסביבה שלך (ENABLE_SSL=true) והפעל מחדש את Termix.",
"sslManualOption": "מדריך (העלאת תעודה)",
"sslManualCert": "תעודה (PEM)",
"sslManualCertPlaceholder": "-----התחלת תעודה-----",
"sslManualKey": "מפתח פרטי (PEM)",
"sslManualKeyPlaceholder": "-----התחל מפתח פרטי-----",
"sslManualDesc": "הדבק את האישור והמפתח הפרטי הקיימים שלך, כולל שרשרת מלאה אם נדרשת על ידי רשות האישורים שלך.",
"sslManualUpload": "העלאה והתקנה של אישור",
"sslManualUploadLoading": "מעלה תעודה...",
"sslManualUploadSuccess": "התעודה הועלתה והותקנה בהצלחה",
"sslManualUploadFailed": "העלאת האישור נכשלה",
"sslManualRequiresFields": "נדרשים תעודה ומפתח פרטי",
"auditLogTotal": "{{total}} סך כל הרשומות",
"auditLogEmpty": "לא נמצאו ערכי יומן ביקורת",
"auditLogSuccess": "הַצלָחָה",
@@ -2672,6 +2817,12 @@
"commandHistoryEnabled": "היסטוריית פקודות",
"commandHistoryEnabledDesc": "אפשר רישום היסטוריית פקודות. כאשר האפשרות מושבתת, ההיסטוריה לא נשמרת ללא קשר להגדרות של כל מחשב מארח.",
"updateCommandHistoryFailed": "נכשל עדכון הגדרת היסטוריית הפקודות",
"analyticsEnabled": "שתף סטטיסטיקות שימוש אנונימיות",
"analyticsEnabledDesc": "שולח ספירה יומית אנונימית של משתמשים, מארחים ושימוש בתכונות כדי לסייע בשיפור Termix. לא כלולים נתונים אישיים או פרטי חיבור.",
"updateAnalyticsFailed": "נכשל עדכון הגדרת הניתוח",
"sessionSharingGloballyEnabled": "אפשר שיתוף סשנים",
"sessionSharingGloballyEnabledDesc": "מאפשר שיתוף של הפעלות מסוף חי, RDP, VNC ו-Telnet בכל המופעים. מבטל כל אפשרות שיתוף לפי מארח כאשר היא מושבתת.",
"updateSessionSharingFailed": "נכשל עדכון הגדרת שיתוף הסשן",
"sessionTimeout": "פסק זמן של סשן",
"hours": "שעות",
"sessionTimeoutRange": "מינימום שעה · מקסימום 720 שעות",
@@ -3119,6 +3270,47 @@
"executionSuccess": "הַצלָחָה",
"executionFailed": "נִכשָׁל"
},
"keybindings": {
"title": "קיצורי מקלדת",
"description": "התאם אישית קיצורי דרך להעתקה, הדבקה ובקרה של הטרמינל, או חבר מקשים לשליחת טקסט או להפעלת קטע קוד.",
"defaultsHeading": "קיצורי דרך מובנים",
"customHeading": "קיצורי דרך מותאמים אישית",
"addBinding": "הוסף קיצור דרך",
"addBindingTitle": "הוסף קיצור דרך",
"editBindingTitle": "עריכת קיצור דרך",
"loading": "טְעִינָה...",
"noCustomBindings": "עדיין אין קיצורי דרך מותאמים אישית",
"defaultBadge": "בְּרִירַת מֶחדָל",
"customizedBadge": "מותאם אישית",
"customize": "התאמה אישית",
"resetToDefault": "איפוס לברירת מחדל",
"resetAllToDefaults": "איפוס הכל להגדרות ברירת המחדל",
"close": "לִסְגוֹר",
"cancel": "לְבַטֵל",
"saveBinding": "שמירת קיצור דרך",
"saveError": "שמירת קיצורי מקלדת נכשלה",
"pressKeysToRecord": "צירוף מקשים",
"pressKeysPlaceholder": "לחיצה ולחיצה על המקשים",
"recording": "לחץ על מקשים...",
"comboRequiredError": "לחץ תחילה על צירוף מקשים",
"textRequiredError": "הזן את הטקסט לשליחה",
"controlCodeRequiredError": "הזן אות אחת עבור קוד הבקרה",
"snippetRequiredError": "בחר קטע",
"conflictWarning": "צירוף זה כבר קשור ל- {{combo}}. שמירה תגרום לשניהם לפעול.",
"actionLabel": "פְּעוּלָה",
"actionCopy": "העתקת הבחירה",
"actionPaste": "לְהַדבִּיק",
"actionSendControlCode": "שלח אות Ctrl+אות",
"actionSendText": "שלח טקסט",
"actionRunSnippet": "הפעלת קטע קוד קיים",
"controlCodeLabel": "מִכְתָב",
"textLabel": "טקסט לשליחה",
"appendEnterLabel": "לחץ על Enter לאחר השליחה",
"snippetLabel": "קטע",
"selectSnippetPlaceholder": "בחר קטע",
"orphanedSnippetWarning": "קטע לא נמצא",
"clipboardPermissionNote": "ייתכן שתבקש הרשאה ללוח בעת השימוש הראשון בדפדפנים מסוימים."
},
"userProfile": {
"donateTitle": "לשמור על טרמיקס בחיים",
"donateDescription": "Termix הוא שירות חינמי, מתארח בעצמו, ונבנה על ידי מספר אנשים בלבד בזמנם הפנוי. אם זה חסך לכם זמן או כסף, תרומת קריפטו תעזור לשמור עליו.",
@@ -3134,6 +3326,7 @@
"sectionAppearance": "הוֹפָעָה",
"sectionSecurity": "בִּטָחוֹן",
"sectionApiKeys": "מפתחות API",
"sectionData": "נְתוּנִים",
"sectionC2sTunnels": "מנהרות C2S",
"usernameLabel": "שם משתמש",
"roleLabel": "תַפְקִיד",
@@ -3162,6 +3355,9 @@
"settingsTerminal": "מָסוֹף",
"commandAutocomplete": "השלמה אוטומטית של הפקודה",
"commandAutocompleteDesc": "הצג השלמה אוטומטית בעת הקלדה",
"keyboardShortcuts": "קיצורי מקלדת",
"keyboardShortcutsDescription": "התאמה אישית של קיצורי דרך להעתקה, הדבקה ופקודות במסוף",
"manageShortcuts": "לְנַהֵל",
"terminalLinkBehavior": "לחיצה על קישור הטרמינל",
"terminalLinkBehaviorDesc": "אופן הפעולה המוגדר כברירת מחדל בעת לחיצה על קישורים בטרמינל",
"historyTracking": "מעקב אחר היסטוריה",
@@ -3228,6 +3424,22 @@
"apiKeyUsageHint": "כלול את המפתח שלך ב-",
"apiKeyUsageHintHeader": "כּוֹתֶרֶת.",
"apiKeyPermissionsHint": "מפתחות יורשים את ההרשאות של המשתמש היוצר.",
"exportData": "ייצוא הנתונים שלי",
"exportDataDesc": "הורד גיבוי של המארחים, האישורים וההגדרות שלך כדי להעביר למכשיר אחר",
"export": "יְצוּא",
"exporting": "ייצוא...",
"importData": "ייבא את הנתונים שלי",
"importDataDesc": "שחזר את המארחים, האישורים וההגדרות שלך מקובץ גיבוי .sqlite",
"importDataSelected": "נבחר: {{name}}",
"selectFile": "בחר קובץ",
"changeFile": "לְשַׁנוֹת",
"import": "יְבוּא",
"importing": "מייבא...",
"exportSuccess": "הנתונים יוצאו בהצלחה",
"exportFailed": "ייצוא הנתונים נכשל",
"importSelectFile": "אנא בחר קובץ תחילה",
"importCompleted": "ייבוא הושלם: {{total}} פריטים יובאו, {{skipped}} דילג",
"importFailed": "ייבוא נכשל: {{error}}",
"roleUser": "מִשׁתַמֵשׁ",
"authMethodDual": "אימות כפול",
"authMethodOidc": "OIDC",
@@ -3379,6 +3591,7 @@
"pageUp": "עמוד למעלה",
"pageDown": "PgDn",
"delete": "דל",
"paste": "לְהַדבִּיק",
"editQuickKeys": "עריכת מקשי מהירים",
"quickKeysTitle": "מקשי מהירים",
"quickKeysDesc": "הקש על × כדי להסיר. תומך בעד 8 תווים.",