* feat: optional auto reconnect for dropped ssh sessions (#1321)
* feat: tighter compact host rows with inline tags (#1325)
* feat: bring back the alert feed homepage widget
* feat: pick target terminals for snippets again
* feat: share button on connection tabs again
* feat: recent servers list when linking the desktop app
* feat: list the fixed app shortcuts in keyboard shortcuts
* fix: translate hardcoded toasts and drop em dashes from ui text
* fix: translate leftover hardcoded ui text
* fix: toolbar files button opens at the shell directory again
* fix: show the remote desktop note under connection origin again
* chore: openapi docs for host metrics manager routes
* chore: openapi docs for undocumented routes and fix two broken doc blocks
* fix: declare terminal.listSessions use for snippet targets
* revert: drop the alert feed widget, the notification center replaces it
* feat: restore the alert feed homepage widget
* fix: quick connect fills the host address from plugin auth editors like tailscale
* fix: docker container logs use the base background color
* chore: fix dependabot alerts and apply safe npm upgrades
* fix: proxmox stats tab reads its switch from plugin host settings
* fix: count plugin ssh logins toward host status and stop showing reachable as a warning
* fix: hide the built-in source pill in the host editor
* fix: host status shows online when the port answers and only warns on a failed login
* fix: drop the top border on the split layout menu
* fix: host defaults tabs sit where the host editor puts them and skip plugins with nothing to default
* fix: remote desktop auth method labels and notes for vnc and telnet
* fix: add description to the web endpoint enable switch
* fix: crowdin sync and pretranslate for plugin locales, run plugin tests on release
* feat: move telemetry out of core into a usage statistics plugin
* fix: recent activity card no longer cuts off host names early
* fix: remove duplicate top border on split screen menu
* fix: redesign session log player controls, fix tooltip overlap and drop dot separators
* fix: file manager and sftp text showing raw i18n keys
* fix: onboarding rerunning for existing users after upgrading
* fix: fleet detail buttons overflowing the sidebar
* fix: session log player scrolling off screen horizontally
* fix: network graph lag when adding hosts and on every render
* fix: maintenance index name, shared host read only view and badge polling
* fix: meeting tabs, workspace tab merging, rail panels as tabs and general ui lag
* chore: update release notes
* fix: remote desktop tabs reconnecting on every tab switch
* fix: build plugin sdk before linting in release workflow
* chore: lint, format, and bump version to 2.9.0
* chore: skip crowdin pre-translate in release for now
* chore: switch to calver, bump version to 26.10.0
* fix(sso): send the PKCE verifier for GitHub login (#1534)
* fix(remote-desktop): clip cursor overflow without disabling zoom (#1535)
* test(remote-desktop): preserve sessions beyond one hour (#1536)
* fix(hosts): expose controls for overflowing editor tabs (#1537)
* fix(hosts): expose controls for overflowing editor tabs
* test(hosts): mock resize observation in admin panel tests
* fix(status): skip TCP probes while host sessions are active (#1538)
* fix(database): batch session activity persistence (#1539)
* docs(api): describe cookie and API key authentication (#1540)
* fix(snippets): repair missing note column on SQLite upgrades (#1541)
* fix(docker): retain stored SSH credential association (#1543)
* fix(file-manager): render transfer toasts without plugin hooks (#1546)
* feat(hosts): keep compact row actions inline (#1547)
* fix(auth): allow retrying unavailable second-factor interfaces (#1549)
* fix(auth): reject unresolved legacy identity provisioning (#1550)
* fix(desktop): ship the plugin SDK inside Mac App Store builds (#1551)
* fix(tmux): pass full session info to the terminal's session picker (#1552)
The tmux.sessions service reduced detected sessions to bare names, but the
picker reads session.name, so every entry rendered blank and selecting one
sent an empty name, which created a new session instead of attaching.
* fix(ssh): read force keyboard-interactive as a boolean when resolving hosts (#1553)
The column holds the text "true"/"false", and the resolver passed it
through as-is. The string "false" is truthy, so the password provider
treated every saved host as forced keyboard-interactive and left the
password out. Jump hops are built straight from the resolved host, so a
password hop whose server doesn't offer keyboard-interactive failed with
"All configured authentication methods failed".
* fix(database): batch database saves for bulk host writes (#1554)
* fix(database): yield to the event loop between database saves
Each SQLite save serializes and encrypts the whole database into new
buffers, which V8 only releases once the event loop turns. Boot
migrations and bulk host import write plugin settings per host and per
key in an awaited loop, so hundreds of full copies piled up and the
container ran out of memory.
* fix(database): save once per bulk host write instead of once per row
On SQLite every repository write force-saves the whole database. Boot
plugin data migrations, host defaults materialization and the bulk
host routes write one row per host per setting, so they serialized and
encrypted the full database hundreds of times in a row.
DatabaseSaveTrigger.batched wraps a function so force saves made while
it runs collapse into a single save when it finishes. Nested scopes fold
into the outer one, and work that outlives its scope saves normally.
* feat(hosts): add instance-wide predefined tag suggestions (#1548)
* feat(hosts): add shared predefined tag suggestions
* style(hosts): format tag catalog routes
* test(database): advance fake timers past the save yield (#1555)
* fix(i18n): complete Simplified Chinese core and plugin translations (#1542)
* fix(i18n): complete Chinese onboarding and navigation labels
* fix(i18n): translate remaining Chinese core and plugin interfaces
* fix(i18n): translate host editor tab overflow controls
* fix(i18n): use consistent Chinese fleet terminology
* fix(i18n): localize hardcoded controls and plugin views
* fix(i18n): translate built-in homepage widget catalog
* test(homepage): follow translated timezone placeholder
* fix(i18n): translate plugin-provided homepage widgets
* fix(i18n): localize feature settings section titles
* fix: 2.8 oidc accounts unable to sign in after upgrading (#1381)
* fix: plugins losing the saved ssh login when copying a host (#1391)
* fix: fleets, proxmox and automations not getting the host sudo password
* fix: host imports running a defaults pass and metrics restart per host (#1384)
* fix: high cpu from status probes and full database saves on every sample (#1300)
* fix: user data export freezing the server (#1393)
* fix: op:// secret references rejected as ssh keys on credentials (#1394)
* fix: slow file deletes from the trash lookups on every delete (#1390)
* fix: add openapi docs and error handling to host tag routes
* test: compare download stream buffers directly so it stops timing out
* chore: drop em dash from host row comment
* chore: update release notes for 2.9.1
* feat(ai): add remote coding agent sessions for SSH hosts (#1545)
* feat(ai): add host coding agent sessions with configured providers
* Wait for agent initialization and shutdown before resuming sessions
* Keep Pi transcripts outside its configuration migration directory
* Cover Pi session directory separation
* Update core permission catalog expectations for remote agents
* Install remote agent runtimes from verified official sources
* Wait for the identity panel credentials request in its test
* Add scoped SSH forwarding setup for remote agents
* Verify forwarding setup through a fresh SSH connection
* Bound the SSH forwarding verification timeout
* Return the forwarding verification callback result
* fix(ai): support agent send and interrupt keyboard shortcuts
* feat(ai): add agent queues attachments worktrees and session recovery
* fix(ai): handle deleted workspace paths and duplicate status events
* fix(ai): accept file references in root workspaces
* fix(ai): refresh paused queues after agent errors
* fix(ai): store agent sessions in plugin tables and lock down OpenCode
Agent sessions lived in a single ctx.kv value holding up to 2000 events,
which passed the 256 KB kv limit within minutes of a normal run. Every
save after that failed, so history, nativeId, queue and archive changes
were lost and every event wrote a kv audit row.
Sessions, events and queued prompts now have their own tables. A running
agent appends events in batches at most once a second with a lazy save;
session and queue changes save immediately. Prompts, drafts and stored
event text are capped in UTF-8 bytes to fit MySQL TEXT. kv:own is no
longer requested.
The OpenCode server now requires a per-session password, so other local
accounts on the host cannot drive the agent through its loopback port.
* test(upgrade): include agent session tables in the reviewed upgrade SQL
* test: run the posix-only ai agent tests on linux only
* fix: restore space to add host tags and redesign predefined tags editor
* fix: host key silently accepted when the host is missing from the database (#1397)
* fix: clearer host login failed status label and fix its translations (#1396)
* chore: add host key and status label fixes to release notes
* fix: sso and ldap provider dialogs overflowing the screen and using mismatched toggles
* chore: increment ver
* fix(audit): store plugin entries with no acting user as a null user_id (#1556)
Plugin audit entries written outside a request used the literal "system"
as user_id. That column references users.id, so the insert was refused
(Postgres logs it as an FK violation) and the entry was silently dropped.
Write null instead and keep "system" / plugin:<id> in username.
* chore: add sso/ldap dialog and audit log fixes to release notes
* fix: tunnels and host settings missing from shared hosts on desktop
* fix: remote desktop logins missing from shared hosts on desktop
* fix: simplify host status to online/offline and keep it live without a refresh
* chore: sync Crowdin translations for 2.9.1
* fix: build docker frontend/backend natively to stop arm64 hang, build sdk before openapi
* chore: rework plugin readmes, json changelogs and standalone repo setup
* chore: move plugins to their own repos and drop the plugins folder
* chore(deps-dev): bump globals (#1560)
Bumps the dev-minor-updates group with 1 update: [globals](https://github.com/sindresorhus/globals).
Updates `globals` from 17.12.0 to 17.13.0
- [Release notes](https://github.com/sindresorhus/globals/releases)
- [Commits](https://github.com/sindresorhus/globals/compare/v17.12.0...v17.13.0)
---
updated-dependencies:
- dependency-name: globals
dependency-version: 17.13.0
dependency-type: direct:development
update-type: version-update:semver-minor
dependency-group: dev-minor-updates
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* feat: drop the 2.8 columns, moves and aliases kept for a downgrade
* chore: remove the 2.9 finish list
* feat: port the demo redesign with Manage and Settings tabs
* chore: pin the plugin signing key and use TERMIX_PAT in workflows
* chore: rename the plugin sdk to @termix-ssh/plugin-sdk
* feat: add a publish workflow for the plugin sdk
* chore: cleanup
* fix: harden plugin sockets, public routes, prebuilt binaries and login fallback
* chore: add a 2.9.1 upgrade check for postgres and mysql
* fix: stop full database rewrites on every plugin db call
* fix: stop full database rewrites on every plugin db call
* fix: restore release video link in 2.9.2 notes
* fix: use TERMIX_PAT in workflows
* feat: pin the official plugins in the docker image
* feat: implement plugin management UI
* feat: shared list kit, settings search, rail order and ui consistency fixes
* chore: run all workflows on blacksmith runners
* chore: split dashboard quick actions into quarters and drop host status row lines
* fix: open plain settings from the profile button, navigation only from the rail menu
* feat: consent check, developer mode file installs, install counts and issue links for plugins
* feat: row detail options for hosts and credentials, open manage from sidebar header
* fix: unify connection failure screens and rebuild stale local plugins
* feat: dev:all runner for web, electron and docker with plugin hot reload, termix-plugin dev
* chore: clean up npm scripts, make npm run dev the full runner and drop concurrently
* fix: settle quick connect panel loads in tests so they stop flaking
* fix: stop the dev runner rebuilding plugins when windows reports file reads as changes
* chore: update the plugin sdk ui export snapshot
* feat: full screen onboarding with a plugin picker and per step versions
* feat: changelog.md release notes, v tags, plugin release notes and videos
* chore: add temp changelog
* chore: release the plugin sdk as 1.0.1
* feat: show only the latest plugin release notes and cap long ones
* chore: publish docker images to termix-ssh on ghcr and termixssh on docker hub
* chore: rename docker hub token secret to DOCKERHUB_BUGATTIGUY527_TOKEN
* chore: renew mac app store provisioning profile
* chore: drop docs job from release workflow
* chore: run sdk publish on github hosted runner
* chore: remove dependabot
* chore: general file cleanup
* chore: rewrite readme and taglines for plugin-based termix
* chore: drop optional from ai plugin row in readme
* feat: per-repo issue forms and prefilled bug reports instead of the support repo
* feat: add report a bug link to the your account settings section
* fix: open settings goes to the plugin's page and hides when it has none
* feat: show plugin features from the manifest on the plugin page
* fix: retry failed or blocked plugins on restart instead of leaving them disabled
* fix: refresh plugin settings after enabling a plugin and match select and disabled bar styling
* feat: request a feature link for plugins and use the bug form for unverified plugins
* feat: beta channels for core and plugins with one stable/beta release workflow
* fix(sync): resolve shared hosts for connect-only recipients (#1568)
* fix(ssh): accept full passwords in keyboard-interactive prompts (#1569)
* fix(ssh): normalize PKCS8 private keys before connecting (#1570)
* fix(sidebar): reclaim space from hidden folder actions (#1571)
* fix(hosts): display protocol credential usernames for non-SSH hosts (#1572)
* fix: ask for a push/TOTP menu choice as text instead of a push confirm
* fix: keep client tunnels open when one of their connections fails (Support#1417)
* fix: send plugin form uploads to the plugin's route (Support#1406, Support#1420)
* fix: add missing sync ids to old snippet tables so snippets sync again (Support#1419)
* fix: start the macOS local terminal when the shell or spawn helper is broken (Support#1418)
* fix: refresh cached plugin translations when only a translation changes (Support#1411)
* fix: import sshpk as a default so the backend starts under ESM
* feat: add a plugin sdk changelog and tag sdk releases, release 1.0.2
* fix: drop the ./ from the plugin sdk bin path so npm stops warning
* chore: name core and sdk releases Termix vX and Plugin SDK vX
* fix: lock the desktop backend to the app's own origin (GHSA-frx8-qqgg-7j7g)
* fix: trust devices by a server-issued token, not a client header (GHSA-6gr3-r7jx-wfmh)
* fix: keep global settings out of non-admin data exports (GHSA-v3vp-ffww-q7pw)
* fix: refuse sessionless tokens and keep the secrets file owner only
* feat: add TRUSTED_PROXIES to choose who nginx takes client IPs from (GHSA-7j7m-85p4-2cpm)
* chore: standardize repo setup files
* chore: remove unused knip config
* chore: add LICENSE and use Node 24 from .nvmrc
* chore: update translation guidance, only en.json needs editing
* feat: plugin docs and env manifest fields, in-app docs links, SDK 1.0.3
* fix: header separators render as borders and center the status divider
* fix: lighter confirm prompt overlay to stop lag when it opens
* fix: put plugin-only tailwind classes in core's utilities layer, SDK 1.0.4
* fix: dev stages local plugin builds on paths with spaces and builds them with the local SDK
* fix: keep plugin tailwind variants in core's layer so overrides keep their order
* fix: manage tab refetches before giving up on a host or credential it cannot find
* fix: tab buttons like share show as soon as the terminal is ready
* fix: folder rows no longer nest action buttons inside a button
* fix: repin remote-desktop after its 1.0.0 re-release
* chore: repin bundled plugins after the 1.0.0 re-release
* fix: recent activity rows use the same separator as host status
* feat: upload banner
* fix: reject expired sessions on sockets, api key desktop links and 192.0.0.0/24
* fix: plugin sdk 1.0.5 with optional ui peers, safer timeouts and validate checks
* fix: bundled plugins path for source runs and backend cleanup
* fix: load plugin strings on guest pages, plugin wording and drop unused keys
* fix: beta version stamping, homebrew cask bump, dockerignore and readme platforms
* docs: 26.10.0 changelog
* fix: current version in the version route example
* chore: stop pushing the release- docker tag
* feat: remove the donation reminder and its column
* docs: note the removed donation reminder
* fix: link server wizard always opens inline, onboarding card grows for it
* feat: plugin text columns are longtext on mysql so they are not capped at 64KB
* fix: linked desktops keep a plugin when its update from the server fails
* chore: default mobile download links to v tags
* fix: sso only accounts cannot sign in with a passkey or other local method
* feat: note in the plugins tab that community plugins are coming
* fix: plugin validate accepts beta versions
* chore: pin bundled plugins rebuilt on sdk 1.0.5
* fix: skip locale fetches for disabled plugins
* fix: show translated names for the built-in admin and user roles
* fix: show host keys as SHA256 fingerprints like ssh-keygen
* fix: host editor scrolls to a newly enabled protocol section
* fix: pass the host to dashboard host row plugins
* fix: plugin cards show dividers between author, version and category
* fix: refuse plugin archives with paths outside the plugin folder
* fix: theme picker shows one dropdown arrow
* fix: read activity and audit times as UTC so they show in local time
* fix: show the real error for a wrong password or code on plugin sign in
* fix: explain that external sign in needs Auto-create external accounts
* fix: clear leftover plugin unpack folders at startup
* fix: shared session links open for guests again
* fix: share panels no longer list yourself as a share target
* fix: a host update without an auth type keeps the saved password
* fix: guest pages get the tab ids a guest plugin registers
* fix: refuse a 2.8 database, which already had a plugins table
* fix: dashboard cards fit on a phone
* fix: desktop setup no longer asks to secure the local account
* fix: the desktop app keeps the desktop layout in a narrow window
* fix: the desktop app shows the rail and no phone bar in a narrow window
* fix: name every sync type in the Sync panel and pluralize the link prompt
* chore: update the sdk ui snapshot for the host key dialog
* fix: turning a plugin back on restarts the plugins it turned off
* fix: quick connect asks to trust the host key
* fix: revoking a manager also removes the shares they handed out
* fix: database export works for users with TOTP on (#1426)
* fix: rdp and vnc logins use the folder credential when none is picked (#1429)
* fix: imported hosts get status checks without a restart
* fix: re-pin bundled plugins after 1.0.0 re-release
* fix: re-pin bundled plugins after search bar fix
* chore: update app icon to smaller version
* chore: round the readme logo, keep square source for app icons
* feat: grid columns and table view in the plugins tab
* fix: match the host key copy button to the fingerprint height
* fix: use brand color for toggles in sync settings
* fix: re-pin bundled plugins after 1.0.0 re-release
* fix: web terminals failing auth behind a proxy that rewrites Host (Support#651)
* fix: re-pin snippets and termix-identity after 1.0.0 overwrite
* fix: re-pin file-manager after 1.0.0 overwrite
* fix: re-pin file-manager after 1.0.0 overwrite
* chore: remove Crowdin from the release workflow
* chore: remove crowdin config
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* feat: continued adding features to the release.yml
* feat: added auto youtube submit
* feat: add dry run to release workflow
* feat: improve release workflow mode system with new dropdown and overwrite release mode
* fix: make credentials start collapsed
* fix: make hostname fill entire column and truncate at proper spot in dashboard
* fix: guacamole display using an incorrect height
* feat: add folder management (nested folders, folder icons, folder colors, improved folder selection, etc.)
* feat: move ssh host config outside of top tab bar and into new tab bar visible when on SSH tab
* fix: 2FA failing to disable
* feat: Proxmox guest discovery and import (#881)
* feat(db): add Proxmox host fields and schema migration
Add enableProxmox flag and proxmoxConfig JSON to the hosts table so an
SSH host can be marked as a Proxmox node and carry per-host discovery
settings (default credential, Windows/Docker name patterns, preferred
IP prefixes). Includes addColumnIfNotExists migration entries and the
matching SSHHost / HostData / Host type definitions.
* feat(api): add Proxmox guest discovery endpoint
Add POST /proxmox/discover which connects to a Proxmox node over SSH
using the host's existing stored credentials (no separate API token),
runs pvesh to enumerate cluster guests, and returns VMs and LXC
containers ready to import. Guest IPs are resolved with bounded
concurrency (LXC from net config, QEMU via guest agent) to stay within
the node's SSH MaxSessions; configured preferred prefixes pick the
address when a guest has several. Name patterns flag Windows guests as
RDP and enable Docker. Node names are validated before use in shell
commands and the SSH connection is always closed via try/finally. The
endpoint carries an OpenAPI annotation. Persists the new host fields
across host create/update/select, the normalizers (transformHostResponse)
and the bulk routes, with normalizer test coverage.
* feat(ui): add Proxmox host settings and guest import
Add a Proxmox tab to the host editor (following the Docker tab pattern)
to enable the integration and configure the default credential, name
patterns and preferred IP ranges. Proxmox-enabled hosts show a discover
action in the sidebar that opens an import dialog listing the cluster's
guests with multi-select; the import reuses the host's credential, maps
Windows guests to RDP, and groups imported guests into a folder named
after the Proxmox host. Also exposes the import via the hosts
import/export menu. All user-facing strings are added to the en.json
locale and rendered via i18n. Built with the existing shadcn Select,
dialog and section-card components to match the dark theme.
* feat(ui): add Proxmox to the bulk feature toggle
Proxmox was the only host feature missing from the multi-select
"Features" menu. Enabling it in bulk is special: unlike the other
toggles it needs a credential to be useful, so each host now defaults
its Proxmox credential to the credential already stored on that host
(host.credentialId). Discovery then works right away without picking
one by hand, and per-host settings can still be adjusted afterwards.
- SidebarTree: Enable/Disable Proxmox entries (Boxes icon) in the
bulk Features dropdown
- host-bulk-routes: enabling Proxmox runs per-host so each host keeps
its own default credential; existing proxmoxConfig is preserved;
disabling stays a simple flag flip
- en.json: enableProxmoxFeature / disableProxmoxFeature
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* fix: reliable OIDC group syncing for admin roles (#882)
- always fetch from the userinfo endpoint to get extra claims (like `groups` from Authelia) instead of skipping it if the id_token was already parsed
- handle cases where the OIDC provider sends groups as a single string, a comma-separated string
- add debug logging
* fix: incorrect guacd screen height
* fix: guacd black screen on connnection
* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)
* feat: initial server stats rewrite (renamed to host metrics)
* feat: continue renaming and improving host metrics features and UI
* fix: clipboard copy fails in Brave/non-HTTPS, dashboard total credentials stuck at 0, host username ignored when credential attached, cloned host can't switch auth method, file-manager context menu off-screen, file delete affecting inactive tabs, silent delete failure on Windows hosts, iPad host tap does nothing, OIDC custom group claim support
* chore: update dependabot for my app and add auto merge/branch update
* chore: update dependabot for my app and add auto merge/branch update
* Feat/docker release tag (#894)
* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)
* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"
This reverts commit 4d04559ca5.
* feat(docker): add version tag to production Docker image tags
---------
Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
* fix: disable hardware acceleration on Windows to prevent startup crash (#895)
* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)
* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"
This reverts commit 4d04559ca5.
* fix: disable hardware acceleration on Windows to prevent startup crash
---------
Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
* chore(deps-dev): bump the dev-patch-updates group across 1 directory with 23 updates (#893)
* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)
* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"
This reverts commit 4d04559ca5.
* chore(deps-dev): bump the dev-patch-updates group across 1 directory with 23 updates
Bumps the dev-patch-updates group with 22 updates in the / directory:
| Package | From | To |
| --- | --- | --- |
| [@codemirror/autocomplete](https://github.com/codemirror/autocomplete) | `6.20.2` | `6.20.3` |
| [@commitlint/cli](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli) | `21.0.1` | `21.0.2` |
| [@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/config-conventional) | `21.0.1` | `21.0.2` |
| [@radix-ui/react-accordion](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/accordion) | `1.2.12` | `1.2.13` |
| [@radix-ui/react-alert-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/alert-dialog) | `1.1.15` | `1.1.16` |
| [@radix-ui/react-checkbox](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/checkbox) | `1.3.3` | `1.3.4` |
| [@radix-ui/react-dialog](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dialog) | `1.1.15` | `1.1.16` |
| [@radix-ui/react-dropdown-menu](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/dropdown-menu) | `2.1.16` | `2.1.17` |
| [@radix-ui/react-label](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/label) | `2.1.8` | `2.1.9` |
| [@radix-ui/react-popover](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/popover) | `1.1.15` | `1.1.16` |
| [@radix-ui/react-progress](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/progress) | `1.1.8` | `1.1.9` |
| [@radix-ui/react-scroll-area](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/scroll-area) | `1.2.10` | `1.2.11` |
| [@radix-ui/react-separator](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/separator) | `1.1.8` | `1.1.9` |
| [@radix-ui/react-tabs](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tabs) | `1.1.13` | `1.1.14` |
| [@radix-ui/react-tooltip](https://github.com/radix-ui/primitives/tree/HEAD/packages/react/tooltip) | `1.2.8` | `1.2.9` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `25.9.1` | `25.9.2` |
| [i18next](https://github.com/i18next/i18next) | `26.3.0` | `26.3.1` |
| [lint-staged](https://github.com/lint-staged/lint-staged) | `17.0.5` | `17.0.7` |
| [react](https://github.com/facebook/react/tree/HEAD/packages/react) | `19.2.6` | `19.2.7` |
| [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) | `19.2.15` | `19.2.17` |
| [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom) | `19.2.6` | `19.2.7` |
| [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `8.0.14` | `8.0.16` |
Updates `@codemirror/autocomplete` from 6.20.2 to 6.20.3
- [Changelog](https://github.com/codemirror/autocomplete/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codemirror/autocomplete/commits)
Updates `@commitlint/cli` from 21.0.1 to 21.0.2
- [Release notes](https://github.com/conventional-changelog/commitlint/releases)
- [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/cli/CHANGELOG.md)
- [Commits](https://github.com/conventional-changelog/commitlint/commits/v21.0.2/@commitlint/cli)
Updates `@commitlint/config-conventional` from 21.0.1 to 21.0.2
- [Release notes](https://github.com/conventional-changelog/commitlint/releases)
- [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/config-conventional/CHANGELOG.md)
- [Commits](https://github.com/conventional-changelog/commitlint/commits/v21.0.2/@commitlint/config-conventional)
Updates `@radix-ui/react-accordion` from 1.2.12 to 1.2.13
- [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.15 to 1.1.16
- [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.3 to 1.3.4
- [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.15 to 1.1.16
- [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.16 to 2.1.17
- [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.8 to 2.1.9
- [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.15 to 1.1.16
- [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.8 to 1.1.9
- [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.10 to 1.2.11
- [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-separator` from 1.1.8 to 1.1.9
- [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-slot` from 1.2.4 to 1.2.5
- [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-tabs` from 1.1.13 to 1.1.14
- [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.8 to 1.2.9
- [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 `@types/node` from 25.9.1 to 25.9.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)
Updates `i18next` from 26.3.0 to 26.3.1
- [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.0...v26.3.1)
Updates `lint-staged` from 17.0.5 to 17.0.7
- [Release notes](https://github.com/lint-staged/lint-staged/releases)
- [Changelog](https://github.com/lint-staged/lint-staged/blob/main/CHANGELOG.md)
- [Commits](https://github.com/lint-staged/lint-staged/compare/v17.0.5...v17.0.7)
Updates `react` from 19.2.6 to 19.2.7
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.7/packages/react)
Updates `@types/react` from 19.2.15 to 19.2.17
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)
Updates `react-dom` from 19.2.6 to 19.2.7
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.7/packages/react-dom)
Updates `vite` from 8.0.14 to 8.0.16
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.16/packages/vite)
---
updated-dependencies:
- dependency-name: "@codemirror/autocomplete"
dependency-version: 6.20.3
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: "@commitlint/cli"
dependency-version: 21.0.2
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: "@commitlint/config-conventional"
dependency-version: 21.0.2
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.13
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.16
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.4
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.16
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.17
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.9
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.16
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.9
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.11
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.9
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: "@radix-ui/react-slot"
dependency-version: 1.2.5
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.14
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.9
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: "@types/node"
dependency-version: 25.9.2
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: i18next
dependency-version: 26.3.1
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: lint-staged
dependency-version: 17.0.7
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: react
dependency-version: 19.2.7
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: "@types/react"
dependency-version: 19.2.17
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: react-dom
dependency-version: 19.2.7
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
- dependency-name: vite
dependency-version: 8.0.16
dependency-type: direct:development
update-type: version-update:semver-patch
dependency-group: dev-patch-updates
...
Signed-off-by: dependabot[bot] <support@github.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps): bump undici from 7.26.0 to 8.4.0 (#891)
* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)
* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"
This reverts commit 4d04559ca5.
* chore(deps): bump undici from 7.26.0 to 8.4.0
Bumps [undici](https://github.com/nodejs/undici) from 7.26.0 to 8.4.0.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v7.26.0...v8.4.0)
---
updated-dependencies:
- dependency-name: undici
dependency-version: 8.4.0
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps): bump the prod-minor-updates group with 2 updates (#890)
* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)
* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"
This reverts commit 4d04559ca5.
* chore(deps): bump the prod-minor-updates group with 2 updates
Bumps the prod-minor-updates group with 2 updates: [axios](https://github.com/axios/axios) and [js-yaml](https://github.com/nodeca/js-yaml).
Updates `axios` from 1.16.1 to 1.17.0
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.16.1...v1.17.0)
Updates `js-yaml` from 4.1.1 to 4.2.0
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/commits)
---
updated-dependencies:
- dependency-name: axios
dependency-version: 1.17.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: prod-minor-updates
- dependency-name: js-yaml
dependency-version: 4.2.0
dependency-type: direct:production
update-type: version-update:semver-minor
dependency-group: prod-minor-updates
...
Signed-off-by: dependabot[bot] <support@github.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps): bump actions/setup-node from 4 to 6 (#887)
* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)
* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"
This reverts commit 4d04559ca5.
* chore(deps): bump actions/setup-node from 4 to 6
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 6.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v4...v6)
---
updated-dependencies:
- dependency-name: actions/setup-node
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps): bump actions/checkout from 4 to 6 (#886)
* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)
* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"
This reverts commit 4d04559ca5.
* chore(deps): bump actions/checkout from 4 to 6
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v6)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '6'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps): bump actions/upload-artifact from 4 to 7 (#885)
* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)
* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"
This reverts commit 4d04559ca5.
* chore(deps): bump actions/upload-artifact from 4 to 7
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v7)
---
updated-dependencies:
- dependency-name: actions/upload-artifact
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore(deps): bump actions/download-artifact from 4 to 8 (#884)
* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)
* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"
This reverts commit 4d04559ca5.
* chore(deps): bump actions/download-artifact from 4 to 8
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 8.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v4...v8)
---
updated-dependencies:
- dependency-name: actions/download-artifact
dependency-version: '8'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* chore: automate rebasing dependabot
* feat: add admin settings audit log feature
* feat: add customizability of app rail tabs
* fix: host metrics giving sudo password error
* feat: add terminal session logging
* feat: sso system redesign (multiple oidc, ldap support, etc.)
* feat: tailscale auth support
* feat: improve syntax highlighting system
* feat: improve nested folder system/ui
* feat: improve nested folder system/ui
* fix: move tailscale i18n and add scrollbar to ssh host manager customization
* feat: improve syntax highlighting, fix tailscale bugs and host manger UX
* fix: admin page not loading user admin information
* chore: update crowdin workflow
* fix: guacd getting passed incorrect protocol for app view
* fix: add SFTP jump-host fallback from host data (#902)
* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)
* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"
This reverts commit 4d04559ca5.
* fix: add SFTP jump-host fallback from host data
---------
Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
* feat(tmux-monitor): add per-host tmux session monitor (#896)
* fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)
* Revert "fix(docker): use resolveTermixThemeColors for Docker console terminal background (#883)"
This reverts commit 4d04559ca5.
* feat(tmux-monitor): add per-host tmux session monitor
New isolated feature module following the docker/server-stats pattern:
- Backend Express service on port 30010 (src/backend/ssh/tmux-monitor.ts)
listing tmux sessions/windows/panes, pane capture, cross-session
output search, and per-pane CPU/RAM/GPU metrics over pooled SSH
connections. Read-only; reuses host-resolver, jump-host-chain,
connection pool and RBAC access checks.
- tmux_session_tags table for per-user project tags on sessions.
- Frontend fullscreen app at ?view=tmux-monitor with host selector,
session/window/pane tree, live pane preview (2s polling), search
bar, metrics display, and tag editing.
- nginx location blocks for /tmux_monitor in Docker deployments.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(tmux-monitor): live streaming backend and shell integration
- WebSocket service on port 30011 (tmux-monitor-live.ts) bridging tmux
control mode (-C attach-session) to the browser: subscribe per pane,
decoded %output events streamed as JSON, structure-change and detach
notifications. Pure control-mode parser with 17 unit tests.
- Register tmux_monitor as a singleton shell tab: AppRail entry below
Network Graph, global Command Palette action, and per-host palette
action (gated on enableTerminal) that opens with the host preselected.
- nginx WebSocket location /tmux_monitor/live/ for Docker deployments.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(tmux-monitor): xterm live preview and UX polish
- Pane preview is now a read-only xterm.js terminal with ANSI colors
(capture-pane -e via new ansi=1 param) fed by the live WebSocket;
status chip shows live/connecting/polling and the original 2s REST
polling remains as automatic fallback.
- useTmuxLive hook: survives React StrictMode remounts (unmounted flag
reset on mount), force-closes sockets stuck in CONNECTING after 8s so
retry/fallback always engages, uses import.meta.env.DEV for dev
detection.
- UX: skeleton loading, error state with retry, actionable empty states,
persisted host/expanded-session selection, "/" and Escape shortcuts,
search match highlighting, fresh relative timestamps.
Verified end-to-end in Chrome against a local backend: live chip goes
green and pane output streams in real time over the control-mode bridge.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* refactor(tmux-monitor): replace control-mode bridge with native PTY attach
The pane preview now embeds the real Terminal component and attaches to
the selected session through the existing terminal WebSocket (new
tmuxAttachSession handshake field in ssh/terminal.ts), making the
preview fully interactive — typing, mouse scrolling and tmux copy-mode
behave exactly like a normal terminal tab. Pane clicks within a session
use the new /focus endpoint (select-window/select-pane) instead of
remounting the terminal.
This removes the entire custom live-streaming stack: the control-mode
WebSocket service on port 30011 (tmux-monitor-live.ts), the control
sequence parser and its tests, the useTmuxLive hook, the nginx
/tmux_monitor/live/ location blocks, and the now-unused live/polling
status chip locale keys.
Verified end-to-end against a dockerized SSH host (Alpine + tmux 3.6):
session tree, interactive preview with ANSI colors, cross-session
search with jump-to-pane, per-pane CPU/RAM metrics, session tags, and
attach-in-new-tab.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(tmux-monitor): use printable field separator in tmux format strings
The unit separator control character (\x1f) used to delimit fields in
tmux -F output gets sanitized to "_" by tmux itself — tmux replaces
control characters (and, under non-UTF-8 locales, any multibyte
character) in expanded format output. On such hosts every list-sessions
line came back as a single unsplittable field, so the monitor showed
session names like "build_1781066459_1781066459_0" and windows/panes
failed to parse entirely.
Switch SEP to the printable ASCII token "<<TMX>>", which survives every
tmux version and locale. Reproduced and verified against tmux 3.6 on
Alpine (C locale) in a docker container.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(tmux-monitor): create sessions and split panes from the monitor
- POST /tmux_monitor/:hostId/sessions creates a detached session
(tmux new-session -d), starting the tmux server if needed. Session
names are validated against a conservative charset on both ends
(tmux forbids ":" and "."), and a duplicate name returns 409 with
tmux's own message surfaced in the toast.
- POST /tmux_monitor/:hostId/split splits the window containing a pane
(tmux split-window -h/-v), with the new pane starting in the source
pane's working directory via -c '#{pane_current_path}'.
- UI: a "+" button next to the host selector opens a name popover
(Enter or Create); the pane preview header gains split-right and
split-down buttons. Splits appear instantly in the attached preview
terminal and a silent overview reload updates the tree; new sessions
are auto-expanded.
Command syntax verified against tmux 3.6 in a dockerized SSH host.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(tmux-monitor): VSCode tmux-manager style tree with window actions
Restyle the session tree after the VSCode tmux manager view:
- Header toolbar: new-session (+) popover and refresh moved next to the
panel title; the host selector row is back to a plain full-width
select.
- Session rows gain hover actions — attach (play) and new window (+) —
revealed with the opacity pattern used by docker's ContainerCard so
they stay keyboard-focusable, with aria-labels on all icon buttons.
- Window rows are collapsible (chevron, "index: name" with a window
icon); panes show "index: command" plus the pane's working directory
in muted text with a full-path tooltip.
- New POST /tmux_monitor/:hostId/windows route runs tmux new-window
against an exact-match ("=name") shell-escaped target; rejects names
containing ":"/"."/newline and returns 404 for missing sessions.
- Pane preview header groups the split buttons apart from close with a
separator.
Reviewed by SA/BA/UX subagent panel; keyboard accessibility and
aria-label findings applied.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(tmux-monitor): rename/kill sessions, collapse-all, no-flash refresh
- Session rows gain a "…" menu with Rename (dialog, validated name) and
Kill (destructive confirmation). Rename migrates saved tags to the
new name and re-attaches an open preview; kill closes the preview and
drops the session's tags. Both routes use exact-match ("=name")
shell-escaped targets and map tmux's "can't find session" /
"duplicate session" errors to 404/409.
- Header gains a VSCode-style collapse-all / expand-all toggle for the
session tree.
- Refresh UX: manual refresh no longer blanks the tree into skeletons —
the skeleton is reserved for a host's first load; refresh keeps the
tree, spins the icon (header and toolbar) and reports failures with a
toast instead of silently keeping stale data.
tmux command syntax verified against tmux 3.6 in the docker test host.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(tmux-monitor): single-row sessions, overlay hover actions, tag dialog
UI cleanup after desktop testing showed the tree looked cluttered:
- Sessions are now a single row. The permanently visible tags row (a
mostly empty line with a lone tag icon under every session) is gone:
tags render as inline badges after the name (max 2, then "+n" with a
full-list tooltip) and editing moved to the "…" menu, which opens a
dialog like rename.
- Session metrics merged into the right-hand meta label
("just now · 0% · 7 MB"). Hover actions (attach, new window, …) are
stacked over that label in a grid cell with an opacity cross-fade, so
the row never shifts and the buttons remain keyboard-focusable
(focus-within reveals them).
- Dropdown items no longer wrap: short labels (Rename / Edit tags /
Kill), whitespace-nowrap, min-w-36, align="end".
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(tmux-monitor): kill pane; fix session actions in the desktop app
- Kill pane: hover ✕ on pane rows and a trash button in the preview
header, both behind a confirmation dialog (kill-pane terminates the
pane's process; the last pane closes its window). New
POST /tmux_monitor/:hostId/kill-pane route with pane-id validation.
- Fix attach (▷) doing nothing in the Electron build: window.open of
internal file:// URLs is denied by the window-open handler, so on
desktop the button now attaches inline — expands the session and
selects its active pane in the embedded terminal. Browsers keep the
open-in-new-tab behavior.
- Enlarge the hover-action hit areas (-m-1 p-1) so clicks land on the
buttons instead of toggling the session row.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(tmux-monitor): session hover actions were unclickable
The meta label (time · cpu · mem) fades to opacity-0 on hover, which
turns it into a stacking context painted above its plain-flow sibling —
the invisible label sat on top of the attach/new-window/menu buttons
and swallowed their clicks, so clicking them toggled the session row
instead. Give the actions overlay z-10 and make the label
pointer-events-none.
Reproduced and verified in Chrome with elementFromPoint before/after;
create → rename → kill all work end-to-end through the UI now.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(tmux-monitor): resizable session tree panel
The tree panel was fixed at w-72; long session names and pane paths had
no room. Its right edge is now a drag handle (200–520px, same pattern
and styling as the AppShell host sidebar), double-click resets to the
default width, and the width persists in localStorage.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(tmux-monitor): split buttons on pane rows
Pane rows' hover actions gain split-right and split-down next to the
kill button, so a pane can be split straight from the tree. splitPane
now takes the target pane id instead of implicitly using the selected
pane; the preview header passes its own pane through.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(tmux-monitor): repair garbled preview after layout changes
External split / kill-pane / new-window actions can leave the attached
preview client with stale borders (the redraw races the xterm size).
Two-part fix:
- After any layout-changing action the monitor nudges the embedded
terminal (fit + notifyResize + refresh) — the PTY resize forces tmux
to fully redraw the client.
- The preview header gains a re-attach button that remounts the
terminal with a fresh PTY as a one-click rescue when the view is
garbled.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(tmux-monitor): kill window, compact mode, session status tooltip
- Kill window: hover ✕ on window rows behind a confirmation dialog
(kills every pane; the last window ends the session). New
POST /tmux_monitor/:hostId/kill-window route with exact-match target
and 404 mapping.
- Narrow tree panel (<280px) hides the inline "time · cpu · mem" label,
which used to crush long session names into "bui…".
- Hovering a session row now shows a status board tooltip (attached
state, activity, window/pane counts, CPU/RAM/GPU, tags) — the numbers
stay reachable in compact mode and richer in normal mode.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(tmux-monitor): keep preview attached after killing the viewed pane
Killing the selected pane (or its window) dumped the user back to the
"select a pane" empty state even though the session was still alive and
the attached terminal had already focused a sibling pane. After the
kill the monitor now refetches the overview and selects the session's
new active pane, so the preview stays on the same attach connection
(same session key → no remount); the empty state only appears when the
whole session died with the pane.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(tmux-monitor): require execute permission, audit destructive actions, persist tag mutations
- Mutating endpoints (kill/kill-window/kill-pane/rename/split/focus,
create session/window) now require "execute" host access like docker;
read-only shared hosts could previously kill sessions and spawn shells
- Log kill/rename actions to the audit log (same pattern as host.ts)
- Trigger a DB save after tag updates in rename/kill handlers; the dirty
flag was never set, so a crash could lose or resurrect tags
- Add host_id -> ssh_data FK with ON DELETE CASCADE to tmux_session_tags
(drizzle schema + SQL migration), with a rebuild migration for
pre-release tables created without the FK
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(tmux-monitor): stop polling and key handling while the tab is hidden, guard stale host responses
- Pass isVisible into TmuxMonitor (like DockerManager/HostMetricsTab);
the global "/"+Escape keydown listener and both SSH polling loops now
pause while the tab is mounted but hidden
- Split the overview polling interval out of the host-change effect so
resuming a tab does not reset state or flash the skeleton
- Ignore overview responses for a host the user has switched away from;
a slow response could overwrite the selected host's tree
- Format SearchResults/SessionTree/TmuxMonitorApp/SidebarTree with
prettier (pr-check was failing on these)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(tmux-monitor): show an empty state when no SSH hosts exist
With zero hosts the host dropdown opened an empty popover and the
preview area showed the unrelated "select a pane" hint. Disable the
select (its placeholder now says no hosts are available) and show a
central no-hosts message with a pointer to the Host Manager.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(tmux-monitor): refresh the host list when hosts change elsewhere
The list was fetched once on mount, but the tab stays mounted forever,
so adding the first host in Host Manager left the monitor stuck on
"no hosts" until the tab was closed and reopened. Listen to the
app-wide termix:hosts-changed event (same as AppShell/HostManager),
keep the current selection when still valid, auto-select the first
host when one appears, and clear the session tree when the selected
host is deleted.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(tmux-monitor): keep pane/window actions reachable on a narrow tree
Pane rows kept the split/kill buttons and the "index: command" label at
fixed width, so dragging the panel toward the 200px minimum pushed the
buttons past the right edge; Radix ScrollArea's display:table viewport
wrapper made it worse by stretching every row to the widest pane path,
clipping the window kill button too.
Stack the cpu label and the hover actions in one grid cell (the same
overlay pattern as the session rows), let the command and path labels
truncate, and force the viewport wrapper back to display:block.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(tmux-monitor): reskin the session status tooltip as a popover card
The base TooltipContent is the inverted one-line chip (bg-foreground,
sharp corners, arrow), so the multi-row session board inherited a light
surface that washed out its muted-foreground labels and clashed with
every other floating card in the app. Restyle this one instance with the
popover surface tokens and hide the chip arrow (important is needed
because Radix sets display on the arrow svg inline).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(tmux-monitor): disable new-session and search when tmux is missing
On a host without tmux the + button still opened the create popover
(submitting just surfaced the backend TMUX_NOT_INSTALLED toast) and
search silently returned "0 matches". Gate both on overview.available
like the neighboring refresh/expand buttons; the search input carries
the unavailable message as its tooltip.
Verified against a real no-tmux host (alpine+sshd container): both
controls disable on it and stay enabled on a host with tmux.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(tmux-monitor): restyle floating surfaces to match the square UI
Review feedback on #896: the host selector, the new-session popover,
the session status tooltip and the three kill confirmations rendered
with the stock rounded shadcn look while the rest of the app moved to
square corners, ring borders and blurred dialog overlays. Convert the
kill confirmations from AlertDialog to the already-restyled Dialog and
override the remaining surfaces with rounded-none + ring-border.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* style(host-editor): format the tailscale device options with project prettier
The block arrived unformatted in the dev-2.4.0 merge; committing the
reformat separately keeps the tmux-monitor commits free of unrelated
churn.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(tmux-monitor): per-host opt-in flag, disabled by default
Review feedback on #896: the tmux actions appeared on every SSH host's
sidebar entry even though most users do not use tmux. Add an
enable_tmux_monitor column (default off) mirroring the enableDocker
plumbing, expose it as an "Enable Tmux Monitor" toggle in the host
editor's Terminal tab, and gate every per-host tmux surface on it:
the sidebar hover action and copy-URL menu item, the command palette
entry, the monitor's host selector, and the tmux-monitor API itself
(refusing like docker.ts does when the feature is off).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(tmux-monitor): drop the redundant navbar rail entry
The monitor is per-host opt-in, so the global rail item opened a
host-less view. Hosts with enableTmuxMonitor still expose it via the
host action in the sidebar tree and the command palette.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(tmux-monitor): fill the status popover card width
TooltipContent is an inline-flex container, so the inner block sized
to its natural content width and left a dead gutter on the right of
the w-56 card. Stretch it with w-full so the values align to the edge.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat: remove unused dropdown, seperate 3 line menu, and fix a few small UI bugs
---------
Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix: add i18n for tmux
* feat: continue improving terminal highlighint with more options and more consistency
* feat: add per host configuration of history tracking with overarching admin toggle
* feat: add storage preference to user profile settings (local or DB)
* chore: update release notes
* fix: return user password reset code to logs
* fix: missing tailscale errors and i18n
* fix: sso/browser preference fixes
* fix: remove SSL_ENABLED references
* feat: add filter/sort to credentials list and fixed some JSDoc comments
* chore: update release notes
* chore: update readmes
* chore: update readmes and add docs links
* feat: continue improving SSO system
* fix: host metrics bugs
* fix: session logging api endpoint fail
* chore: make electron.yml auto deliver to macos app store
* chore: fix linting issues
* chore: fix linting issues
* chore: lint, format, and bump version to 2.4.0
* chore: crowdin using incorrect api key name
* chore: sync Crowdin translations for 2.4.0
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: XtraLarge <eMail@WilliWerres.de>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: verybadsoldier <364469+verybadsoldier@users.noreply.github.com>
Co-authored-by: i/o agent <273482092+claw-io@users.noreply.github.com>
Co-authored-by: Félix MARQUET <72651575+BreizhHardware@users.noreply.github.com>
Co-authored-by: Rabindra Kumar Meher <rabindrameher116@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Jose Tenggren <kf16el42@students.muetkhp.edu.pk>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Kang <78076796+khengyun@users.noreply.github.com>