All notable changes to the CS Bridge VS Code extension will be documented in this file.
The format is based on Keep a Changelog.
- Cross-window UI stutter when a session window opens — the cross-window sync watcher re-read and re-parsed every session file on every record write, so opening a new remote window (or any session change) briefly hung every other open window. It now reads only the single record that changed, and coalesces the duplicate filesystem events macOS fires per write. (#107)
- linkspan socket permission clash on shared compute nodes — the in-allocation control socket now binds at
/tmp/csbridge-<id>.sockdirectly in the sticky, world-writable/tmp, instead of a shared/tmp/csbridge/directory that the first user to launch on a node would own (mode 0755) and lock every other user out of, failing withbind: permission denied. (#105)
- Utilization metrics + Stats view — each finished run records CPU/memory efficiency from
sacct; a summary tab and the new Stats view keep the history. (#82, #83, #84) - Wall-time session summary — a status bar tracks elapsed time; a summary tab opens when a session ends. (#76)
- Submit-filter validation — Add/Save preflights the script via
sbatch --test-onlyand saves only on pass, showing the site's own rejection. (#72) - Live resource metrics on the session card — each running session shows live CPU/memory samples pulled from linkspan. (#87)
(No Allocation)allocation option — pick it to omit--accounton clusters that don't require an allocation. (#89)- Clear a session's run history from its card. (#92)
- Graceful Stop from the remote window — Stop reloads the window to local and finishes the cancel + summary there; the session holds
stoppinguntilsacctconfirms. (#85) - Connect spinner; Switch focuses — Connect stays disabled until the window registers (no duplicate windows); Switch focuses the live window. (#73)
- Monitoring rewrite — one lock-free poll loop per session; relay-live sessions ping the tunnel and skip
sacct; connect tolerates an already-forwarded tunnel. (#77) - Per-cluster window names —
<cluster>-<session>instead ofcshost-<uuid>. (#77) PENDINGshown asQUEUED. (#75)- linkspan port pinned at launch — tunnel URL derived without scraping logs. (#75)
- Atomic
sessions.jsonwrites — temp-file + rename, no truncation on crash. (#81) - Per-session storage —
sessions.jsonand the run store split into per-session files (sessions/{id}.json,metrics/{id}.json), cutting cross-window write contention. (#91, #92) - SSH auth prompts rendered verbatim in a monospace webview, so password/Duo challenges stay readable. (#88)
- New extension logo — refreshed the CS Bridge activity-bar and command icons (
csbridge.svg/csbridge.png).
- Dead node behind the Dev Tunnels edge — require linkspan's
{"status":"ok"}body so wall-timeTIMEOUTis detected instead of staying green. (#70) - Missing node count — always emit
#SBATCH --nodes=1. (#69) - New sessions sorting to the bottom — reissue legacy
session-<ts>ids as UUIDv7 on load. (#71) (No Allocation)leaking as a bogus--account— its label no longer reachessbatch, which had failed session create with "Invalid account or account/partition combination". (#97)- Half-open Dev Tunnel relay — a relay that goes half-open (keep-alive failing while the SDK still reports Connected) now rebuilds itself, so the SSH forward self-heals instead of hanging until a manual reconnect. (#98)
sacctefficiency accounting — utilization is read from the.batchstep only, fixing incorrect CPU/memory efficiency numbers. (#93)- Atomic, locked
~/.ssh/configedits — host-config writes are file-locked and atomic, avoiding corruption when multiple windows edit hosts. (#94) - Remote VS Code server OOM on Delta — the server now installs to node-local disk (
/tmp) instead of$HOME, and the job memory floor is raised to 4 GB, fixing 2 GB job-cgroup OOM crashes. (#99)
- One persistent SSH connection per host — every remote command (SLURM queries, linkspan install,
sbatch) now rides a single SSH connection established on first use and reused until it drops, then lazily re-established. On Windows (noControlMaster) this is what makes connection reuse work at all; on macOS/Linux aControlMastersocket is still layered in so multiple windows share one authentication. (#66) - Session statuses consolidated and reordered — hitting the wall-time limit is now a restartable
stopped(wasfailed), and a dropped link is a self-recoveringunreachablestate (replacingdisconnected). The status set is ordered by lifecycle and the session-card icons/labels were refreshed. (#62) - Time-ordered session ids — session ids are now UUIDv7, so the sidebar keeps a stable order across relaunches and a restarted session no longer jumps to the top. (#65)
- Higher resource floors — the minimum session memory is now 2 GB (1 GB could OOM-kill the VS Code remote server) and the minimum CPU count is now 2. (#57, #59)
- Windows: a fresh auth prompt on every SSH operation against 2FA hosts — Windows OpenSSH has no
ControlMaster, so each operation re-authenticated and raised a new Duo prompt. The persistent connection now authenticates once at connect and is reused until it actually drops. (#66) - Remote sessions stalling under heavy I/O — opening a large file (or other bursts) no longer stalls or drops the Remote-SSH connection; the Dev Tunnel relay now uses keepalives and the SSH connection has tuned resilience options. (#56)
- Repeated launches failing with tunnel port exhaustion — each launch now uses a fresh Dev Tunnel, avoiding the
PortsPerTunnel(HTTP 429) buildup that made successive launches on a cluster fail. (#58) - Wall-time-expired sessions handled reliably — a session that reaches its SLURM
--timelimit is now ended even when the login node is briefly unreachable forsacct, no longer offers a doomed Connect/Stop, and the queued-time counter no longer flashes-1. (#63) - Cross-window connect race — connecting two sessions at once no longer reverts both to "Connect"; session state now merges reliably across windows. (#64)
- Legacy migration shims — the old
cancelled/cancellingstatus migration, the legacy~/.cybershuttle/ssh_hostsInclude cleanup, and the unusedfrptunnel-provider vestige. (#61)
- Edit a session's parameters from its card — change partition, CPU, memory, GPU, allocation, and wall time without recreating the session.
- Account switcher in the Sessions title bar, plus automatic reuse of a signed-in Microsoft account when creating a session.
- SSH Hosts view improvements — expandable host rows and a refresh action.
- SSH auth prompts surface in the Sessions view — password/Duo prompts raised during launch are reflected on the session card.
- Session resilience — only an authoritative SLURM terminal state (
COMPLETED/FAILED/TIMEOUT/OUT_OF_MEMORY/CANCELLED) now ends a session. A transient login-node or tunnel failure becomes a recoverableunreachablestate instead offailed, and the in-process relay is rebuilt automatically on extension restart from the persisted reattach refs, so a live session reconnects without a manual Connect. - Background SLURM polling now runs non-interactively (
BatchMode), so a deadControlMasterfails fast instead of raising an unanswerable auth prompt and exhausting local ports. - Tunnel reliability — a single client-owned Dev Tunnel per session with a clearer connect/reattach lifecycle.
- Session-card metadata redesigned as compact chips.
- Internal refactor — one provider per sidebar view over a shared base, with vscode-free, unit-tested capability modules and lint/type tooling.
- Remote server death on compute nodes without systemd-logind — the server inherited a stale
XDG_RUNTIME_DIR=/run/user/<uid>that does not exist on the compute node; the SLURM script now unsetsXDG_RUNTIME_DIR/TMPDIRso the server falls back to node-local/tmp. - A transient tunnel
/healthblip no longer tears down a working relay (it self-heals), and a brief login-node outage no longer sticks a session atfailed. - GPU type and count now pre-populate when editing a GPU session (the gres name's own colon was being mis-split).
- Corrected the SLURM
--gresresource specification format.
- The managed
~/.cybershuttle/ssh_hostshost level — SSH hosts are now read directly from~/.ssh/configand the read-only system config.
- SSH Hosts view — add, list, and delete SSH login hosts from the sidebar, mirroring Remote-SSH's "Add New SSH Host" (verbatim
sshcommand parsing and host validation). Hosts merge from a managed~/.cybershuttle/ssh_hostsfile (Include'd atop~/.ssh/config), your~/.ssh/config, and the read-only system/etc/ssh/ssh_config. - Stats view — a dedicated sidebar view for session statistics (local-only for now).
- New Session and Add SSH Host toolbar actions on the sidebar views.
- Per-session SSH connection resilience —
cshost-*blocks now setServerAliveInterval/ServerAliveCountMax,TCPKeepAlive,ConnectTimeout, andIPQoS cs0, and disable compression, so sessions ride out transient network stalls instead of dropping.
- Webview UI rewritten on Preact +
@vscode-elements/elements, split into independent per-view esbuild roots (Sessions, SSH Hosts, Stats), with each view rendered from a single pushed state slice. - Session-card action buttons (Restart / Start / Cancel / Connect / Switch / Current) made more compact.
- README demo images now load from the GitHub repository at
HEADinstead of relative paths.
docs/media/demo assets are no longer bundled in the published.vsix— the packaged extension drops from ~5.25 MB to ~0.31 MB.
Initial release of CS Bridge — remote HPC development from VS Code. Published as cybershuttle.csbridge.
- Interactive session management for any SSH-accessible host, with support for multiple remote hosts
- SLURM job submission with configurable partition, CPU, memory, GPU, and wall-time options
- Dynamic resource picker that queries available partitions, accounts, and limits per host
- Microsoft Dev Tunnel integration (in-process) for secure tunneling from compute nodes back to the user
- OS-native SSH with a CyberShuttle-managed ControlMaster pool for efficient multiplexed connections
- Per-session SSH config generation (
~/.cybershuttle/ssh_config), consumed by the systemsshvia anIncludein~/.ssh/config - Automatic linkspan binary deployment to remote hosts, with cancellation support
- SLURM session auto-polling (
sacct) to track job state transitions - SSH password/passphrase prompt handling via an SSH_ASKPASS bridge
- Session persistence via file-based storage, with cross-window reload resilience
- Status bar countdown and progress toasts for active sessions
- esbuild-based build producing a single bundled, minified
out/extension.js(tscused for type-checking only)