ZacharyZcR
64a80f411a
make the repository layer engine-agnostic ( #1127 )
...
DatabaseContext handed every repository a raw better-sqlite3 handle alongside
drizzle, and three of them used it for retention queries built on datetime('now',
?) — a SQLite-only function. That handle is the one thing standing between the
repository layer and a second engine.
Drop it. The two time-based prunes compute their cutoff in JS against the
CURRENT_TIMESTAMP text format, which every engine writes the same way and which
compares correctly as a string; the health-history prune becomes a select of the
rows to keep followed by a NOT IN delete. All three turn async, so their two
callers await them.
Name the dialect rather than repeating a string literal, so adding an engine is
one edit instead of a search.
Tests built their schema through context.sqlite?.exec(). Optional chaining meant
removing the field type-checked cleanly and then silently created no tables, so
the fixture now owns exec() and a raw handle for direct assertions — schema setup
belongs to the test harness, not to the interface repositories consume.
No behaviour change, and no Postgres yet: this only removes the coupling that
would have to be undone first.
2026-07-28 16:59:10 +08:00
ZacharyZcR
cdb030dff1
restore lint by pinning typescript below 7 ( #1131 )
...
#1090 bumped typescript to 7.0.2. typescript-eslint declares
`typescript: >=4.8.4 <6.1.0`, and TypeScript 7 removed `ts.Extension`, which
@typescript-eslint/typescript-estree dereferences at import time:
node_modules/@typescript-eslint/typescript-estree/dist/create-program/shared.js:59
ts.Extension.Cjs,
TypeError: Cannot read properties of undefined (reading 'Cjs')
ESLint hits that while loading eslint.config.mjs, so `npm run lint` fails before
linting anything. Node reports it as ERR_INTERNAL_ASSERTION, which hides the
cause. Every open PR fails this check, not just new ones.
Even the latest typescript-eslint prerelease still caps at <6.1.0, so there is
nothing to upgrade to yet. Pin back to ~6.0.3 and tell dependabot to hold major
typescript bumps until the ecosystem catches up.
Also fixes biome.json pointing vcs.defaultBranch at dev-2.5.0, a branch that no
longer exists.
2026-07-28 16:57:00 +08:00
dependabot[bot] and dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
f625eada86
chore(deps): bump the major-updates group with 4 updates ( #1090 )
...
Bumps the major-updates group with 4 updates: [better-sqlite3](https://github.com/WiseLibs/better-sqlite3 ), [chalk](https://github.com/chalk/chalk ), [@testing-library/jest-dom](https://github.com/testing-library/jest-dom ) and [typescript](https://github.com/microsoft/TypeScript ).
Updates `better-sqlite3` from 12.11.1 to 13.0.1
- [Release notes](https://github.com/WiseLibs/better-sqlite3/releases )
- [Commits](https://github.com/WiseLibs/better-sqlite3/compare/v12.11.1...v13.0.1 )
Updates `chalk` from 5.6.2 to 6.0.0
- [Release notes](https://github.com/chalk/chalk/releases )
- [Commits](https://github.com/chalk/chalk/compare/v5.6.2...v6.0.0 )
Updates `@testing-library/jest-dom` from 6.9.1 to 7.0.0
- [Release notes](https://github.com/testing-library/jest-dom/releases )
- [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md )
- [Commits](https://github.com/testing-library/jest-dom/compare/v6.9.1...v7.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: better-sqlite3
dependency-version: 13.0.1
dependency-type: direct:production
update-type: version-update:semver-major
dependency-group: major-updates
- dependency-name: chalk
dependency-version: 6.0.0
dependency-type: direct:production
update-type: version-update:semver-major
dependency-group: major-updates
- dependency-name: "@testing-library/jest-dom"
dependency-version: 7.0.0
dependency-type: direct:development
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>
2026-07-28 01:58:48 -05:00
dependabot[bot] and dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
f0ea087ac0
chore(deps): bump undici in the prod-minor-updates group ( #1089 )
...
Bumps the prod-minor-updates group with 1 update: [undici](https://github.com/nodejs/undici ).
Updates `undici` from 8.7.0 to 8.9.0
- [Release notes](https://github.com/nodejs/undici/releases )
- [Commits](https://github.com/nodejs/undici/compare/v8.7.0...v8.9.0 )
---
updated-dependencies:
- dependency-name: undici
dependency-version: 8.9.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: prod-minor-updates
...
Signed-off-by: dependabot[bot] <support@github.com >
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-28 01:58:08 -05:00
dependabot[bot] and dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
a04fa2f0da
chore(deps): bump the prod-patch-updates group with 3 updates ( #1088 )
...
Bumps the prod-patch-updates group with 3 updates: [@tanstack/react-virtual](https://github.com/TanStack/virtual/tree/HEAD/packages/react-virtual ), [jose](https://github.com/panva/jose ) and [js-yaml](https://github.com/nodeca/js-yaml ).
Updates `@tanstack/react-virtual` from 3.14.6 to 3.14.8
- [Release notes](https://github.com/TanStack/virtual/releases )
- [Changelog](https://github.com/TanStack/virtual/blob/main/packages/react-virtual/CHANGELOG.md )
- [Commits](https://github.com/TanStack/virtual/commits/@tanstack/react-virtual@3.14.8/packages/react-virtual )
Updates `jose` from 6.2.3 to 6.2.4
- [Release notes](https://github.com/panva/jose/releases )
- [Changelog](https://github.com/panva/jose/blob/main/CHANGELOG.md )
- [Commits](https://github.com/panva/jose/compare/v6.2.3...v6.2.4 )
Updates `js-yaml` from 5.2.1 to 5.2.2
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md )
- [Commits](https://github.com/nodeca/js-yaml/compare/5.2.1...5.2.2 )
---
updated-dependencies:
- dependency-name: "@tanstack/react-virtual"
dependency-version: 3.14.8
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: prod-patch-updates
- dependency-name: jose
dependency-version: 6.2.4
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: prod-patch-updates
- dependency-name: js-yaml
dependency-version: 5.2.2
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>
2026-07-28 01:57:29 -05:00
dependabot[bot] and dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
88b232e19c
chore(deps-dev): bump the dev-patch-updates group with 23 updates ( #1087 )
...
Bumps the dev-patch-updates group with 23 updates:
| Package | From | To |
| --- | --- | --- |
| [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome ) | `2.5.4` | `2.5.5` |
| [@radix-ui/react-accordion](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/accordion ) | `1.2.17` | `1.2.20` |
| [@radix-ui/react-alert-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/alert-dialog ) | `1.1.20` | `1.1.23` |
| [@radix-ui/react-checkbox](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/checkbox ) | `1.3.8` | `1.3.11` |
| [@radix-ui/react-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dialog ) | `1.1.20` | `1.1.23` |
| [@radix-ui/react-dropdown-menu](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dropdown-menu ) | `2.1.21` | `2.1.24` |
| [@radix-ui/react-label](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/label ) | `2.1.12` | `2.1.15` |
| [@radix-ui/react-popover](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/popover ) | `1.1.20` | `1.1.23` |
| [@radix-ui/react-progress](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/progress ) | `1.1.13` | `1.1.16` |
| [@radix-ui/react-scroll-area](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/scroll-area ) | `1.2.15` | `1.2.18` |
| [@radix-ui/react-select](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/select ) | `2.3.4` | `2.3.7` |
| [@radix-ui/react-separator](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/separator ) | `1.1.12` | `1.1.15` |
| [@radix-ui/react-slider](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/slider ) | `1.4.4` | `1.4.7` |
| [@radix-ui/react-slot](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/slot ) | `1.3.0` | `1.3.3` |
| [@radix-ui/react-switch](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/switch ) | `1.3.4` | `1.3.7` |
| [@radix-ui/react-tabs](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tabs ) | `1.1.18` | `1.1.21` |
| [@radix-ui/react-tooltip](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tooltip ) | `1.2.13` | `1.2.16` |
| [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react ) | `6.0.3` | `6.0.4` |
| [concurrently](https://github.com/open-cli-tools/concurrently ) | `10.0.3` | `10.0.4` |
| [radix-ui](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/radix-ui ) | `1.6.3` | `1.6.7` |
| [react](https://github.com/react/react/tree/HEAD/packages/react ) | `19.2.7` | `19.2.8` |
| [react-dom](https://github.com/react/react/tree/HEAD/packages/react-dom ) | `19.2.7` | `19.2.8` |
| [react-i18next](https://github.com/i18next/react-i18next ) | `17.0.10` | `17.0.11` |
Updates `@biomejs/biome` from 2.5.4 to 2.5.5
- [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.5/packages/@biomejs/biome )
Updates `@radix-ui/react-accordion` from 1.2.17 to 1.2.20
- [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.20 to 1.1.23
- [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.8 to 1.3.11
- [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.20 to 1.1.23
- [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.21 to 2.1.24
- [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.12 to 2.1.15
- [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.20 to 1.1.23
- [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.13 to 1.1.16
- [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.15 to 1.2.18
- [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.4 to 2.3.7
- [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.12 to 1.1.15
- [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.4 to 1.4.7
- [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-slot` from 1.3.0 to 1.3.3
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/slot/CHANGELOG.md )
- [Commits](https://github.com/radix-ui/primitives/commits/HEAD/packages/react/slot )
Updates `@radix-ui/react-switch` from 1.3.4 to 1.3.7
- [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.18 to 1.1.21
- [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.13 to 1.2.16
- [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 `@vitejs/plugin-react` from 6.0.3 to 6.0.4
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases )
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md )
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.0.4/packages/plugin-react )
Updates `concurrently` from 10.0.3 to 10.0.4
- [Release notes](https://github.com/open-cli-tools/concurrently/releases )
- [Commits](https://github.com/open-cli-tools/concurrently/compare/v10.0.3...v10.0.4 )
Updates `radix-ui` from 1.6.3 to 1.6.7
- [Changelog](https://github.com/radix-ui/primitives/blob/main/packages/react/radix-ui/CHANGELOG.md )
- [Commits](https://github.com/radix-ui/primitives/commits/1.6.7/packages/react/radix-ui )
Updates `react` from 19.2.7 to 19.2.8
- [Release notes](https://github.com/react/react/releases )
- [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md )
- [Commits](https://github.com/react/react/commits/v19.2.8/packages/react )
Updates `react-dom` from 19.2.7 to 19.2.8
- [Release notes](https://github.com/react/react/releases )
- [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md )
- [Commits](https://github.com/react/react/commits/v19.2.8/packages/react-dom )
Updates `react-i18next` from 17.0.10 to 17.0.11
- [Changelog](https://github.com/i18next/react-i18next/blob/master/CHANGELOG.md )
- [Commits](https://github.com/i18next/react-i18next/compare/v17.0.10...v17.0.11 )
---
updated-dependencies:
- dependency-name: "@biomejs/biome"
dependency-version: 2.5.5
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.20
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.23
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.11
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.23
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.24
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.15
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.23
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.16
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.18
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.7
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.15
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.7
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-slot"
dependency-version: 1.3.3
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.7
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.21
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.16
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: "@vitejs/plugin-react"
dependency-version: 6.0.4
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: concurrently
dependency-version: 10.0.4
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: radix-ui
dependency-version: 1.6.7
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: react
dependency-version: 19.2.8
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: react-dom
dependency-version: 19.2.8
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: react-i18next
dependency-version: 17.0.11
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>
2026-07-28 01:56:49 -05:00
dependabot[bot] and dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
bfda179c90
ci(deps): bump the github-actions group with 2 updates ( #1086 )
...
Bumps the github-actions group with 2 updates: [actions/setup-node](https://github.com/actions/setup-node ) and [useblacksmith/setup-docker-builder](https://github.com/useblacksmith/setup-docker-builder ).
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 )
Updates `useblacksmith/setup-docker-builder` from 1 to 2
- [Release notes](https://github.com/useblacksmith/setup-docker-builder/releases )
- [Commits](https://github.com/useblacksmith/setup-docker-builder/compare/v1...v2 )
---
updated-dependencies:
- dependency-name: actions/setup-node
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
dependency-group: github-actions
- dependency-name: useblacksmith/setup-docker-builder
dependency-version: '2'
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>
2026-07-28 01:56:10 -05:00
ZacharyZcR
291ccf2549
fix: use jump host SOCKS proxy settings ( #1116 )
2026-07-28 02:21:21 +08:00
ZacharyZcR
5c709d38d6
fix desktop preference synchronization ( #1106 )
2026-07-28 02:21:09 +08:00
ZacharyZcR
a9c2aec165
improve settings navigation and legal disclosure ( #1105 )
2026-07-28 02:20:56 +08:00
ZacharyZcR
44a4534baa
fix: show remote sync account identity ( #1110 )
...
* fix: show remote sync account identity
* cover getRemoteSyncUserInfo and make its null contract hold
Nothing asserted the renderer-side gate: browser builds must not reach for the
IPC bridge, and a missing bridge, an unconfigured server, an expired JWT or a
failed channel all have to degrade to no identity rather than throw.
Writing that turned up a mismatch — with no preload bridge the optional chain
resolved to undefined while the signature promises null. The only caller uses
??, so nothing is broken today, but the type was not telling the truth.
The main-process half (token expiry, /users/me, the roles fallback) stays
uncovered: remote-sync.cjs requires electron at load, so exercising it means
stubbing safeStorage and the filesystem, which is a bigger change than this PR
warrants.
2026-07-28 02:08:37 +08:00
ZacharyZcR
5f3e840892
fix: clarify desktop local profile ( #1095 )
...
* fix: clarify desktop local profile
* cover the AccordionSection hidden branch
The desktop build hides the Security section because the embedded profile signs
in automatically and has no login password, so the controls there would imply a
protection that does not exist. Nothing asserted that hidden actually keeps the
children out of the DOM rather than merely collapsing them.
Export the component and cover both states, including that an expanded hidden
section still renders nothing.
2026-07-28 01:57:52 +08:00
ZacharyZcR
8a1db9da37
fail the guacamole-lite patch when an anchor is gone ( #1126 )
...
Each patch bails out with a console.log and process.exit(0) when its anchor
string is missing. The write-back happens at the end of the file, so an upstream
release that moves any one anchor drops every patch, exits successfully, and
leaves postinstall reporting nothing wrong. Termix then builds and starts
normally and drops VNC/RDP sessions at runtime — with no signal pointing at the
patch.
Every patch here is required for correctness: protocol negotiation, the guacd
1.6.0 name handshake, dynamic argument answering, UTF-8 tokens, read-only joins.
A missing anchor means the patch no longer applies, so exit non-zero and say
which one and what to do.
Unchanged: a missing guacamole-lite still skips quietly, and an already-patched
tree still exits 0.
2026-07-28 01:49:21 +08:00
ZacharyZcR
8cd6288d19
stop session-log route test importing the real repository layer ( #1125 )
...
The test mocks db, logger and AuthManager, but the route module also calls
PermissionManager.getInstance() at import time and pulls in the repository
factory, which loads the drizzle schema and the better-sqlite3 native binding.
Importing that costs seconds when the full suite runs its projects
concurrently, and the test times out at 5s. On its own it passes, so it read as
flaky rather than as a missing mock.
Mock both. None of it is under test here, and the file now imports in
milliseconds regardless of load.
2026-07-28 01:49:17 +08:00
ZacharyZcR
f2055caa5b
stop highlighting inside a split control string ( #1124 )
...
A control string (OSC/DCS/APC/PM) carries text that must never be displayed —
an OSC 0 title holds the user, host and path, and PROMPT_COMMAND emits one on
every prompt. Its opener and its terminator routinely land in different
websocket frames, and the continuation frame contains no escape byte at all, so
every guard in the highlighter misses it: TUI_SEQUENCE, CONTROL_STRING_SEQUENCE
and hasIncompleteAnsiSequence all only look at one chunk.
Highlighting that continuation injects an SGR sequence into the middle of the
open string, which aborts it early in xterm.js and prints the remainder as
ordinary text — the stray ~/path glued to the prompt, and the cursor arithmetic
drift behind the duplicate prompts and Ctrl+R corruption.
Track the state across chunks the way alternate-screen mode already is, and skip
any chunk that starts or ends inside a control string. A trailing lone ESC counts
as inside, since its meaning only arrives with the next chunk.
Closes Termix-SSH/Support#1025
2026-07-28 01:49:13 +08:00
ZacharyZcR
f0d2e36332
move the Homebrew cask to where a tap looks for it ( #1123 )
...
A tap discovers casks in a top-level Casks/ directory. The cask sat in
packaging/Casks/, so tapping the repository succeeded and every subsequent
brew install --cask termix reported that no cask with that name exists.
Move it and repoint the five workflow references. The release job still rewrites
the version and checksum in place, and the electron job still copies it into the
generated and submission trees.
Closes Termix-SSH/Support#1044
2026-07-28 01:49:09 +08:00
ZacharyZcR
60109be10f
route desktop guacd calls to the connected remote server ( #1122 )
...
resolveConnectionOrigin() pins RDP/VNC/Telnet to "remote" because the embedded
desktop backend does not bundle guacd, and the Guacamole websocket already
follows that. The status check and both token calls did not: they use the shared
authApi, which in Electron is hard-coded to the embedded backend.
So the desktop app asked the backend without guacd whether guacd was available,
got "disconnected", and refused to connect — while the connected server it would
actually have used reports it as connected and serves the same host fine from the
web client.
Send those three calls through a remote-origin instance in Electron, alongside
the existing file-manager, tunnel and stats ones.
Closes Termix-SSH/Support#1043
2026-07-28 01:49:05 +08:00
ZacharyZcR
1d26f820c6
honour per-host recording flags and explain a missing recording ( #1121 )
...
The session recording section offers a recording path, a filename template and
four content toggles, but the backend overwrote five of the six on every
connection. A host could set none of them and get no indication why.
Location and filename genuinely are not the host's to choose — recordings are
indexed by them for playback and the backend refuses to read outside its
recordings directory — so drop those two inputs rather than keep pretending they
apply. The content flags are a host-level decision, so default them instead of
forcing them.
That still leaves the reported case, where guacd writes the file somewhere the
backend cannot see it. The warning now reports both paths and names the two env
vars that align them, which is otherwise guesswork for a split-container setup.
Closes Termix-SSH/Support#1041
2026-07-28 01:49:01 +08:00
ZacharyZcR
94a072b76d
apply the configured RDP resolution to the session ( #1120 )
...
The host editor stores width and height in guacamoleConfig, and the backend
passes them to guacd in the connection token. The renderer then appends its own
width and height query parameters measured from the container, which take
precedence, so a configured resolution never reached the session — only dpi did,
because that was the one display field GuacamoleApp read back.
Pass the configured width and height alongside dpi, and skip the container-driven
sendSize on connect and on resize when a resolution is pinned. rescaleDisplay
still fits the fixed display into the available space.
Closes Termix-SSH/Support#1039
2026-07-28 01:48:57 +08:00
ZacharyZcR
6bdd38159c
stop read-only shared hosts from being dragged into folders ( #1119 )
...
Shared hosts hide their edit, share and delete actions based on the recipient's
permission level, but the sidebar row stays draggable regardless. Dropping one on
a folder issues a bulk folder update the server rejects, so a recipient without
edit rights gets a failure toast for an action the UI offered them.
Gate draggable on canEditHost, and skip hosts the recipient cannot edit in the
move handler so a mixed selection moves what it can instead of failing whole.
Closes Termix-SSH/Support#1011
2026-07-28 01:48:52 +08:00
ZacharyZcR
ac5da581e2
refuse to start with an empty database when data exists elsewhere ( #1118 )
...
When the data directory holds no database, startup treats it as a first run and
silently creates an empty one. A deployment that loses DATA_DIR — an .env file
the service no longer loads, a volume that did not mount — lands in exactly that
state, so the user is asked to register an admin account again while the real
database sits untouched one directory over. It is indistinguishable from the
upgrade having deleted everything.
Check the known data locations before creating a new database and refuse to
start when one of them already holds a database, naming both directories.
ALLOW_EMPTY_DATA_DIR=true starts anyway for anyone deliberately starting over.
This matches how a failed decryption already behaves: it throws rather than
falling back to an empty database.
Closes Termix-SSH/Support#1006
2026-07-28 01:48:48 +08:00
ZacharyZcR
384abebe37
fix OIDC login with unverifiable ID tokens ( #1117 )
...
verifyOIDCToken passed the raw id_token straight to jose's jwtVerify, which
throws JWSInvalid when the token is not a three-segment compact JWS. Authentik
issues an encrypted JWE id_token when the provider has an encryption key set,
so the callback threw and every OIDC login failed with 'Invalid Compact JWS'.
2.5.0 hid this behind a catch-all that decoded the unverified payload; removing
that fallback fixed the trust bug but turned the pre-existing verification
failure into a hard login failure.
Check the segment count before verifying and raise a distinct
OIDCTokenFormatError, which the callback treats as 'no usable claims here' and
falls through to the userinfo endpoint. Signature and claim failures still
reject the login.
Fixes Termix-SSH/Support#1016
Fixes Termix-SSH/Support#1018
2026-07-28 01:48:44 +08:00
ZacharyZcR
760c7b86c3
fix: expose jump tunnels to guacd ( #1115 )
2026-07-28 01:48:40 +08:00
ZacharyZcR
066d7e77b3
fix: forward Android hardware keyboard keys ( #1114 )
2026-07-28 01:48:35 +08:00
ZacharyZcR
8743e6daa2
fix: support Tailscale auth in tmux monitor ( #1113 )
2026-07-28 01:48:31 +08:00
ZacharyZcR
3f33961657
fix: keep localhost database export same-origin ( #1112 )
2026-07-28 01:48:27 +08:00
ZacharyZcR
50372cb25f
fix: export repository user record ( #1111 )
2026-07-28 01:48:23 +08:00
ZacharyZcR
9dd81cf813
fix: recognize Windows terminal Tab events ( #1109 )
...
* fix: recognize Windows terminal Tab events
* style: format terminal key event test
2026-07-28 01:48:19 +08:00
ZacharyZcR
5258edf7a1
fix: persist host command history setting ( #1107 )
2026-07-28 01:48:15 +08:00
ZacharyZcR
c48bc478f8
fix database persistence during container shutdown ( #1104 )
2026-07-28 01:48:11 +08:00
ZacharyZcR
697e363b74
fix file manager navigation after permission errors ( #1103 )
2026-07-28 01:48:07 +08:00
ZacharyZcR
6866176778
fix OIDC verification for JWKs without alg ( #1102 )
2026-07-28 01:48:03 +08:00
ZacharyZcR
cf827f9a9c
fix outbound DNS lookup callback shape ( #1101 )
2026-07-28 01:47:58 +08:00
ZacharyZcR
1139f17319
fix SSH login alert delivery ( #1100 )
2026-07-28 01:47:54 +08:00
ZacharyZcR
6d790b8d61
fix snippet execution result handling ( #1099 )
2026-07-28 01:47:50 +08:00
ZacharyZcR
9c61ae1ac4
fix: deduplicate shared hosts ( #1098 )
2026-07-28 01:47:46 +08:00
ZacharyZcR
5c30c5862f
fix: preserve WoL broadcast address ( #1097 )
2026-07-28 01:47:42 +08:00
ZacharyZcR
c12fc19c76
fix: allow sharing empty folders ( #1096 )
2026-07-28 01:47:38 +08:00
ZacharyZcR
7c397e3f8a
fix: preserve architecture in unpacked ASAR path ( #1094 )
2026-07-28 01:47:33 +08:00
ZacharyZcR
fdeb79e9e9
fix: centralize outbound address validation ( #1093 )
2026-07-28 01:47:29 +08:00
ZacharyZcR
113eb5619c
fix: preserve remote sync references ( #1092 )
2026-07-28 01:47:25 +08:00
LukeGus
4a7117b67f
fix: macOS appstore submission encryption fix
2026-07-26 20:29:38 -05:00
LukeGus
9ae48a8c6c
fix: macOS appstore IAP error
2026-07-26 20:05:38 -05:00
LukeGus
e5b0db60c4
fix: macOS appstore versioning error
2026-07-26 19:54:12 -05:00
LukeGus
0327f9020c
fix: macOS appstore upload failure
2026-07-26 19:42:11 -05:00
LukeGus
9f066d814a
chore: bump Homebrew cask to 2.6.0
2026-07-27 00:25:42 +00:00
+2
1a26628a48
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 >
release-2.6.0-tag
2026-07-26 18:47:27 -05:00
LukeGus
cf3e2cb499
fix: overlapping hosts when using click to expand
2026-07-19 14:24:38 -05:00
LukeGus
845bb494a6
Merge remote-tracking branch 'origin/main'
2026-07-19 13:09:05 -05:00
LukeGus
1b3a805010
chore: release workflow cleanup errors
2026-07-19 13:08:45 -05:00