Skip to content

Commit 972f5c2

Browse files
committed
refactor(server): delete tmux module and all references
- Delete services/tmux.rs (TmuxRuntime, janitor, session management) - Remove tmux module from services/mod.rs - Remove tmux janitor and socket path setup from main.rs - Remove tmux PID env var insertion from session_runtime.rs - Rename SessionRuntimeLiveness::TmuxMissing to RuntimeMissing (terminal-bound but terminal not found — not tmux-specific) - Update all call sites and tests to use RuntimeMissing
1 parent cb3106f commit 972f5c2

7 files changed

Lines changed: 12 additions & 999 deletions

File tree

apps/server/src/main.rs

Lines changed: 0 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -149,11 +149,6 @@ pub(crate) use ws::server::{
149149
};
150150

151151
use runtime::RuntimeHandle;
152-
use std::time::Duration;
153-
154-
const DEFAULT_TMUX_JANITOR_INTERVAL_MS: u64 = 45_000;
155-
const MIN_TMUX_JANITOR_INTERVAL_MS: u64 = 5_000;
156-
const MAX_TMUX_JANITOR_INTERVAL_MS: u64 = 300_000;
157152

158153
fn env_path(key: &str) -> Option<PathBuf> {
159154
std::env::var_os(key).map(PathBuf::from)
@@ -235,12 +230,6 @@ fn install_provider_hooks_on_startup(app: &AppHandle) -> Vec<(String, String)> {
235230
mod tests {
236231
use super::*;
237232
use crate::runtime::RuntimeHandle;
238-
use std::sync::{Mutex, OnceLock};
239-
240-
fn janitor_env_lock() -> &'static Mutex<()> {
241-
static LOCK: OnceLock<Mutex<()>> = OnceLock::new();
242-
LOCK.get_or_init(|| Mutex::new(()))
243-
}
244233

245234
fn test_app() -> AppHandle {
246235
let (app, _shutdown_rx) = RuntimeHandle::new();
@@ -326,39 +315,6 @@ mod tests {
326315
let _ = std::fs::remove_dir_all(claude_home);
327316
let _ = std::fs::remove_dir_all(codex_home);
328317
}
329-
330-
#[test]
331-
fn resolve_tmux_janitor_interval_defaults_when_env_missing() {
332-
let _guard = janitor_env_lock().lock().unwrap();
333-
let previous = std::env::var_os("CODER_STUDIO_TMUX_JANITOR_INTERVAL_MS");
334-
std::env::remove_var("CODER_STUDIO_TMUX_JANITOR_INTERVAL_MS");
335-
336-
let interval = resolve_tmux_janitor_interval();
337-
assert_eq!(interval, Duration::from_millis(DEFAULT_TMUX_JANITOR_INTERVAL_MS));
338-
339-
if let Some(value) = previous {
340-
std::env::set_var("CODER_STUDIO_TMUX_JANITOR_INTERVAL_MS", value);
341-
}
342-
}
343-
344-
#[test]
345-
fn resolve_tmux_janitor_interval_clamps_out_of_range_values() {
346-
let _guard = janitor_env_lock().lock().unwrap();
347-
let previous = std::env::var_os("CODER_STUDIO_TMUX_JANITOR_INTERVAL_MS");
348-
std::env::set_var("CODER_STUDIO_TMUX_JANITOR_INTERVAL_MS", "1");
349-
let min_interval = resolve_tmux_janitor_interval();
350-
assert_eq!(min_interval, Duration::from_millis(MIN_TMUX_JANITOR_INTERVAL_MS));
351-
352-
std::env::set_var("CODER_STUDIO_TMUX_JANITOR_INTERVAL_MS", "9999999");
353-
let max_interval = resolve_tmux_janitor_interval();
354-
assert_eq!(max_interval, Duration::from_millis(MAX_TMUX_JANITOR_INTERVAL_MS));
355-
356-
if let Some(value) = previous {
357-
std::env::set_var("CODER_STUDIO_TMUX_JANITOR_INTERVAL_MS", value);
358-
} else {
359-
std::env::remove_var("CODER_STUDIO_TMUX_JANITOR_INTERVAL_MS");
360-
}
361-
}
362318
}
363319

364320
#[tokio::main]
@@ -377,18 +333,6 @@ async fn main() {
377333
async fn run() -> Result<(), String> {
378334
let state_dir = resolve_state_dir().map_err(|e| e.to_string())?;
379335
std::fs::create_dir_all(&state_dir).map_err(|e| e.to_string())?;
380-
crate::services::tmux::configure_tmux_socket_path(state_dir.join("tmux.sock"));
381-
382-
match crate::services::tmux::cleanup_managed_tmux_sessions_stale() {
383-
Ok(report) => {
384-
eprintln!("info: tmux startup cleanup {}", report.summary_line());
385-
}
386-
Err(error) => {
387-
eprintln!(
388-
"warning: failed to cleanup stale coder-studio tmux sessions on startup: {error}"
389-
);
390-
}
391-
}
392336

393337
let app_data = resolve_app_data_dir().map_err(|e| e.to_string())?;
394338
std::fs::create_dir_all(&app_data).map_err(|e| e.to_string())?;
@@ -417,7 +361,6 @@ async fn run() -> Result<(), String> {
417361
}
418362

419363
let transport_server = start_transport_server(&app)?;
420-
let janitor_interval = resolve_tmux_janitor_interval();
421364
if cfg!(debug_assertions) {
422365
println!("Coder Studio web dev server: {DEV_FRONTEND_URL}");
423366
println!("Coder Studio local server: {}", transport_server.endpoint);
@@ -428,9 +371,6 @@ async fn run() -> Result<(), String> {
428371
);
429372
}
430373

431-
let janitor_shutdown_rx = shutdown_rx.clone();
432-
let janitor_task = tokio::spawn(run_tmux_janitor(janitor_shutdown_rx, janitor_interval));
433-
434374
let serve_result = axum::serve(
435375
transport_server.listener,
436376
transport_server
@@ -446,46 +386,5 @@ async fn run() -> Result<(), String> {
446386
.await
447387
.map_err(|e| e.to_string());
448388

449-
janitor_task.abort();
450-
451-
match crate::services::tmux::cleanup_managed_tmux_sessions_for_current_process() {
452-
Ok(report) => {
453-
eprintln!("info: tmux shutdown cleanup {}", report.summary_line());
454-
}
455-
Err(error) => {
456-
eprintln!("warning: failed to cleanup coder-studio tmux sessions on shutdown: {error}");
457-
}
458-
}
459-
460389
serve_result
461390
}
462-
463-
fn resolve_tmux_janitor_interval() -> Duration {
464-
let base = crate::services::tmux::tmux_janitor_interval();
465-
base.clamp(
466-
Duration::from_millis(MIN_TMUX_JANITOR_INTERVAL_MS),
467-
Duration::from_millis(MAX_TMUX_JANITOR_INTERVAL_MS),
468-
)
469-
}
470-
471-
async fn run_tmux_janitor(mut shutdown_rx: tokio::sync::watch::Receiver<bool>, interval: Duration) {
472-
loop {
473-
tokio::select! {
474-
_ = shutdown_rx.changed() => {
475-
break;
476-
}
477-
_ = tokio::time::sleep(interval) => {
478-
match crate::services::tmux::cleanup_managed_tmux_sessions_stale() {
479-
Ok(report) => {
480-
if report.cleaned_sessions > 0 {
481-
eprintln!("info: tmux janitor cleanup {}", report.summary_line());
482-
}
483-
}
484-
Err(error) => {
485-
eprintln!("warning: tmux janitor cleanup failed: {error}");
486-
}
487-
}
488-
}
489-
}
490-
}
491-
}

apps/server/src/models.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ pub struct SessionMessage {
356356
pub enum SessionRuntimeLiveness {
357357
Attached,
358358
ProviderExited,
359-
TmuxMissing,
359+
RuntimeMissing,
360360
}
361361

362362
#[derive(Clone, Serialize, Deserialize, Debug)]

apps/server/src/services/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ pub(crate) mod supervisor;
1414
pub(crate) mod system;
1515
pub(crate) mod terminal;
1616
pub(crate) mod terminal_gateway;
17-
pub(crate) mod tmux;
1817
pub(crate) mod utf8_stream;
1918
pub(crate) mod workspace;
2019
pub(crate) mod workspace_runtime;

apps/server/src/services/session_runtime.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -225,10 +225,6 @@ fn resolve_session_shell_env(
225225
"CODER_STUDIO_SESSION_ID".to_string(),
226226
session_id.to_string(),
227227
);
228-
runtime_env.insert(
229-
crate::services::tmux::CODER_STUDIO_RUNTIME_PID_ENV_KEY.to_string(),
230-
std::process::id().to_string(),
231-
);
232228
Ok(runtime_env)
233229
}
234230

0 commit comments

Comments
 (0)