From 084dd22d57e156543c178e59033d0d3c46a2c120 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Padez?= Date: Wed, 25 Feb 2026 04:50:16 +0000 Subject: [PATCH] fix sidecar issue, node 22 --- package.json | 1 + src/servers/api/terminal/entrypoint.sh | 25 ++++++++++++++++++++++++ src/servers/api/terminal/pty-sidecar.mjs | 4 ++-- src/servers/api/terminal/websocket.ts | 2 ++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 394724ba..173ba0b6 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "src/workspaces/*" ], "scripts": { + "preinstall": "node -e \"var v = +process.versions.node.split('.')[0]; if (v < 22 || v > 22) { console.error('Node 22 required (got ' + process.versions.node + '). Run: nvm use 22'); process.exit(1); }\"", "dev": "bun --env-file=.env --watch src/server.tsx", "start": "NODE_ENV=production bun src/server.tsx", "prebuild": "bun run ./scripts/prebuild.ts", diff --git a/src/servers/api/terminal/entrypoint.sh b/src/servers/api/terminal/entrypoint.sh index c768179c..6d714f58 100755 --- a/src/servers/api/terminal/entrypoint.sh +++ b/src/servers/api/terminal/entrypoint.sh @@ -31,5 +31,30 @@ if [ ! -d /home/$USERNAME/.config/nvim ]; then chown -R "$USER_UID:$USER_GID" /home/$USERNAME/.config fi +# Seed shell config files from templates if not present +if [ ! -f /home/$USERNAME/.zshrc ]; then + cp /opt/terminal-templates/.zshrc /home/$USERNAME/.zshrc + chown "$USER_UID:$USER_GID" /home/$USERNAME/.zshrc +fi + +if [ ! -f /home/$USERNAME/.tmux.conf ]; then + cp /opt/terminal-templates/.tmux.conf /home/$USERNAME/.tmux.conf + chown "$USER_UID:$USER_GID" /home/$USERNAME/.tmux.conf +fi + +if [ ! -f /home/$USERNAME/.config/starship-officer.toml ]; then + mkdir -p /home/$USERNAME/.config + cp /opt/terminal-templates/starship-officer.toml /home/$USERNAME/.config/starship-officer.toml + chown -R "$USER_UID:$USER_GID" /home/$USERNAME/.config +fi + +if [ ! -d /home/$USERNAME/.oh-my-zsh ]; then + cp -r /opt/oh-my-zsh /home/$USERNAME/.oh-my-zsh + chown -R "$USER_UID:$USER_GID" /home/$USERNAME/.oh-my-zsh +fi + +mkdir -p /home/$USERNAME/.local/bin +chown -R "$USER_UID:$USER_GID" /home/$USERNAME/.local + # Run sidecar as the user exec gosu "$USER_UID:$USER_GID" node /app/pty-sidecar.mjs diff --git a/src/servers/api/terminal/pty-sidecar.mjs b/src/servers/api/terminal/pty-sidecar.mjs index 3f587997..200af5a3 100644 --- a/src/servers/api/terminal/pty-sidecar.mjs +++ b/src/servers/api/terminal/pty-sidecar.mjs @@ -158,8 +158,8 @@ wss.on('connection', (ws) => { try { await ensureUserFiles(homeDir); - } catch { - // ignore + } catch (err) { + console.error('[sidecar] ensureUserFiles failed:', err); } ptyEnv = { diff --git a/src/servers/api/terminal/websocket.ts b/src/servers/api/terminal/websocket.ts index f3f270eb..a71f5499 100644 --- a/src/servers/api/terminal/websocket.ts +++ b/src/servers/api/terminal/websocket.ts @@ -251,6 +251,7 @@ export const ensureDockerContainer = async (email: string, userId: number, homeD console.log(`[terminal] recreating container for ${email} — resource mounts missing`); stopDockerSidecar(existing.dockerId); } else { + console.log(`[terminal] reusing running container ${existing.dockerId} for ${email} on port ${existing.port}`); return existing; } } @@ -411,6 +412,7 @@ export const terminalWebsocket = { sidecar = await connectSidecar(info.port); } catch (err) { const message = err instanceof Error ? err.message : 'Failed to connect terminal sidecar'; + console.error(`[terminal] sidecar connection failed for ${email}:`, message); sendOutput(ws, `\r\n[Terminal error] ${message}\r\n`); if (info) { const logs = readDockerLogs(info.dockerId);