You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Scope JetBrains cache per-workspace to fix Toolbox Agent collision
Concurrent workspaces shared ~/.cache/JetBrains/ via the per-owner persist
volume, so the Toolbox Agent's UnixApplicationStartLock + IPC socket under
Toolbox/ports/ collided across workspaces ("main instance is alive, cannot
bind twice"). Split the JetBrains manifest: settings, plugins, and
JetProfile state stay owner-scoped; .cache/JetBrains/ becomes
workspace-scoped under /mnt/home-persist/.workspaces/<id>/. Adds a generic
scope field to the home-persist manifest schema and a one-shot migration
sweep that drops the orphaned owner-scoped cache after rollout.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|`jetbrains`|`.cache/JetBrains/`, `.config/JetBrains/`, `.local/share/JetBrains/`, `.java/.userPrefs/jetbrains/`| The workspace is headless — Toolbox/Gateway runs on the user's local machine. Clicking the IDE button opens a `jetbrains-gateway://` URL; Gateway SSHes in and has `remote-dev-server.sh` download the IDE backend into `~/.cache/JetBrains/RemoteDev/dist/` on first connect (hundreds of MB per IDE). The three JetBrains roots keep the downloaded backend plus per-IDE `RemoteDev-<Code>/` settings, plugins, and project indexes. `.java/.userPrefs/jetbrains/` is the Java `Preferences` store the IDEs use for JetBrains Account / JetProfile login, license activation, and non-commercial-license acceptance — persisting it avoids re-login on every restart. |
|`jetbrains`| owner |`.config/JetBrains/`, `.local/share/JetBrains/`, `.java/.userPrefs/jetbrains/`| Settings, plugins, and JetProfile state that should follow the user across workspaces. Keymaps, color schemes, installed plugins, license acceptance. |
140
+
|`jetbrains-local`| workspace |`.cache/JetBrains/`| Per-workspace runtime: the SSH-deployed Toolbox Agent (`Toolbox-CLI-dist/`), its IPC lock and unix socket under `Toolbox/ports/`, the downloaded IDE backend (`RemoteDev/dist/`), and per-IDE system caches and project indexes. Must be per-workspace — concurrent workspaces that share `.cache/JetBrains/` race on the Toolbox Agent's `UnixApplicationStartLock` and fail to connect ("main instance is alive, cannot bind twice"). |
107
141
108
142
Anything not declared is image-owned (or per-workspace-home-volume-owned)
109
143
and resets on image rebuild — git config, SSH keys, bash history, caches.
@@ -154,6 +188,24 @@ EOF
154
188
155
189
Trailing `/` for directories, no slash for files.
156
190
191
+
If any of those paths must not be shared between concurrent workspaces (lock
192
+
files, sockets, per-project indexes), split them into a second manifest with
0 commit comments