fix(tmux): scope isolated session name per plugin instance (Oracle review)
Oracle flagged the previous commit: "omo-agents" was a shared constant, so when two plugin instances ran in the same tmux server they wrote into the same session. One instance's cleanup would then kill-session on the shared name and tear down the other instance's live attached panes. Replace the const ISOLATED_SESSION_NAME with getIsolatedSessionName(pid) which defaults to process.pid, so every opencode process owns its own "omo-agents-<pid>" session. spawnTmuxSession and cleanup both resolve the name through this helper. Discovery is straightforward from the host tmux via 'tmux list-sessions | grep omo-agents-'. Manager test covers two concurrent managers and asserts each kills a per-pid session name, proving they no longer collide on a global name.
This commit is contained in:
@@ -10,7 +10,7 @@ export { spawnTmuxPane } from "./tmux-utils/pane-spawn"
|
||||
export { closeTmuxPane } from "./tmux-utils/pane-close"
|
||||
export { replaceTmuxPane } from "./tmux-utils/pane-replace"
|
||||
export { spawnTmuxWindow } from "./tmux-utils/window-spawn"
|
||||
export { spawnTmuxSession, ISOLATED_SESSION_NAME } from "./tmux-utils/session-spawn"
|
||||
export { spawnTmuxSession, getIsolatedSessionName } from "./tmux-utils/session-spawn"
|
||||
export { killTmuxSessionIfExists } from "./tmux-utils/session-kill"
|
||||
|
||||
export { applyLayout, enforceMainPaneWidth } from "./tmux-utils/layout"
|
||||
|
||||
@@ -6,7 +6,11 @@ import { isInsideTmux } from "./environment"
|
||||
import { isServerRunning } from "./server-health"
|
||||
import { shellEscapeForDoubleQuotedCommand } from "../../shell-env"
|
||||
|
||||
export const ISOLATED_SESSION_NAME = "omo-agents"
|
||||
const ISOLATED_SESSION_NAME_PREFIX = "omo-agents"
|
||||
|
||||
export function getIsolatedSessionName(pid: number = process.pid): string {
|
||||
return `${ISOLATED_SESSION_NAME_PREFIX}-${pid}`
|
||||
}
|
||||
|
||||
async function getWindowDimensions(
|
||||
tmux: string,
|
||||
@@ -87,12 +91,13 @@ export async function spawnTmuxSession(
|
||||
}
|
||||
}
|
||||
|
||||
const sessionAlreadyExists = await sessionExists(tmux, ISOLATED_SESSION_NAME)
|
||||
const isolatedSessionName = getIsolatedSessionName()
|
||||
const sessionAlreadyExists = await sessionExists(tmux, isolatedSessionName)
|
||||
|
||||
const args = sessionAlreadyExists
|
||||
? [
|
||||
"new-window",
|
||||
"-t", ISOLATED_SESSION_NAME,
|
||||
"-t", isolatedSessionName,
|
||||
"-P",
|
||||
"-F", "#{pane_id}",
|
||||
opencodeCmd,
|
||||
@@ -100,7 +105,7 @@ export async function spawnTmuxSession(
|
||||
: [
|
||||
"new-session",
|
||||
"-d",
|
||||
"-s", ISOLATED_SESSION_NAME,
|
||||
"-s", isolatedSessionName,
|
||||
...sizeArgs,
|
||||
"-P",
|
||||
"-F", "#{pane_id}",
|
||||
@@ -109,7 +114,7 @@ export async function spawnTmuxSession(
|
||||
|
||||
log("[spawnTmuxSession] spawning", {
|
||||
mode: sessionAlreadyExists ? "new-window" : "new-session",
|
||||
sessionName: ISOLATED_SESSION_NAME,
|
||||
sessionName: isolatedSessionName,
|
||||
})
|
||||
|
||||
const proc = spawn([tmux, ...args], { stdout: "pipe", stderr: "pipe" })
|
||||
@@ -140,6 +145,6 @@ export async function spawnTmuxSession(
|
||||
})
|
||||
}
|
||||
|
||||
log("[spawnTmuxSession] SUCCESS", { paneId, sessionName: ISOLATED_SESSION_NAME })
|
||||
log("[spawnTmuxSession] SUCCESS", { paneId, sessionName: isolatedSessionName })
|
||||
return { success: true, paneId }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user