From ab261cf52dd8a9e95b240c758fee656de69913a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Padez?= Date: Thu, 30 Jul 2026 05:03:03 +0000 Subject: [PATCH] move the pty sidecar under src/servers/sidecar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit it was the only sidecar living outside src/servers/sidecar/ — it sat in api/terminal/ next to the bridge that talks to it, which is the one place a reader looking for "the sidecars" would not check. now src/servers/sidecar/pty/index.mjs, matching every peer, with a note on the pm2 entry about why this one is node and .mjs (node-pty is a native addon) rather than bun and typescript like the rest. the templates/ directory went to api/users/, next to provision.ts:seedShellConfigs, which is now its only consumer — the sidecar's duplicate seeder went with the sandbox branch in the previous commit. api/terminal/ is left holding exactly one thing: the websocket bridge. no behaviour change. the pm2 entry's script path changed, so `pm2 restart officer-pty` is not enough — pm2 remembers the old path until the entry is deleted and started again. commands are in SIDECAR_WORK_LOG.md. Co-Authored-By: Claude Opus 4.8 --- ecosystem.config.cjs | 5 ++++- src/servers/api/users/provision.ts | 2 +- src/servers/api/{terminal => users}/templates/.tmux.conf | 0 src/servers/api/{terminal => users}/templates/.zshenv | 0 src/servers/api/{terminal => users}/templates/.zshrc | 0 .../api/{terminal => users}/templates/starship-officer.toml | 0 .../{api/terminal/pty-sidecar.mjs => sidecar/pty/index.mjs} | 0 .../pty-sidecar.test.ts => sidecar/pty/index.test.ts} | 2 +- 8 files changed, 6 insertions(+), 3 deletions(-) rename src/servers/api/{terminal => users}/templates/.tmux.conf (100%) rename src/servers/api/{terminal => users}/templates/.zshenv (100%) rename src/servers/api/{terminal => users}/templates/.zshrc (100%) rename src/servers/api/{terminal => users}/templates/starship-officer.toml (100%) rename src/servers/{api/terminal/pty-sidecar.mjs => sidecar/pty/index.mjs} (100%) rename src/servers/{api/terminal/pty-sidecar.test.ts => sidecar/pty/index.test.ts} (98%) diff --git a/ecosystem.config.cjs b/ecosystem.config.cjs index 15c25a28..7a44b4e9 100644 --- a/ecosystem.config.cjs +++ b/ecosystem.config.cjs @@ -24,10 +24,13 @@ module.exports = { args: 'run src/servers/sidecar/email/index.ts', watch: false, }, + // The only sidecar run by `node` rather than `bun`, and the only one that is not TypeScript: node-pty + // is a native addon. It also does not use sidecar/connect.ts, and carries its own copy of the + // reconnect loop. { name: 'officer-pty', script: 'node', - args: 'src/servers/api/terminal/pty-sidecar.mjs', + args: 'src/servers/sidecar/pty/index.mjs', watch: false, }, { diff --git a/src/servers/api/users/provision.ts b/src/servers/api/users/provision.ts index 69b70b4e..9cdcebcf 100644 --- a/src/servers/api/users/provision.ts +++ b/src/servers/api/users/provision.ts @@ -3,7 +3,7 @@ import { join } from 'node:path'; import { DATA_PATH, getHomeDir, toShellUsername } from '@@/data-path'; import { generateContainerContext, generateClaudeSettings } from '@@/generate-container-context'; -const TEMPLATE_DIR = join(import.meta.dir, '../terminal/templates'); +const TEMPLATE_DIR = join(import.meta.dir, 'templates'); const copyTemplate = async (src: string, dest: string) => { if (existsSync(dest)) return; diff --git a/src/servers/api/terminal/templates/.tmux.conf b/src/servers/api/users/templates/.tmux.conf similarity index 100% rename from src/servers/api/terminal/templates/.tmux.conf rename to src/servers/api/users/templates/.tmux.conf diff --git a/src/servers/api/terminal/templates/.zshenv b/src/servers/api/users/templates/.zshenv similarity index 100% rename from src/servers/api/terminal/templates/.zshenv rename to src/servers/api/users/templates/.zshenv diff --git a/src/servers/api/terminal/templates/.zshrc b/src/servers/api/users/templates/.zshrc similarity index 100% rename from src/servers/api/terminal/templates/.zshrc rename to src/servers/api/users/templates/.zshrc diff --git a/src/servers/api/terminal/templates/starship-officer.toml b/src/servers/api/users/templates/starship-officer.toml similarity index 100% rename from src/servers/api/terminal/templates/starship-officer.toml rename to src/servers/api/users/templates/starship-officer.toml diff --git a/src/servers/api/terminal/pty-sidecar.mjs b/src/servers/sidecar/pty/index.mjs similarity index 100% rename from src/servers/api/terminal/pty-sidecar.mjs rename to src/servers/sidecar/pty/index.mjs diff --git a/src/servers/api/terminal/pty-sidecar.test.ts b/src/servers/sidecar/pty/index.test.ts similarity index 98% rename from src/servers/api/terminal/pty-sidecar.test.ts rename to src/servers/sidecar/pty/index.test.ts index 000de990..8ed7af62 100644 --- a/src/servers/api/terminal/pty-sidecar.test.ts +++ b/src/servers/sidecar/pty/index.test.ts @@ -8,7 +8,7 @@ import type { ServerWebSocket, Subprocess } from 'bun'; // // Nothing here touches the running officer — the sidecar dials API_URL, which is overridden per spawn. -const SIDECAR = 'src/servers/api/terminal/pty-sidecar.mjs'; +const SIDECAR = 'src/servers/sidecar/pty/index.mjs'; type Frame = Record;