From 787c05a561be1ea02b22ead53eb22af0af85250b Mon Sep 17 00:00:00 2001 From: Eyejoker Date: Sun, 29 Mar 2026 21:14:04 +0900 Subject: [PATCH] fix: /compact masked by room role header in both runners prependRoomRoleHeader was called BEFORE /compact detection, turning "/compact" into "[PAIRED ROOM: owner]\n/compact" which failed the exact match check. Now session commands are detected first. --- runners/agent-runner/src/index.ts | 11 ++++++----- runners/codex-runner/src/index.ts | 10 ++++++++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/runners/agent-runner/src/index.ts b/runners/agent-runner/src/index.ts index 56a211d..09906e9 100644 --- a/runners/agent-runner/src/index.ts +++ b/runners/agent-runner/src/index.ts @@ -1037,14 +1037,15 @@ async function main(): Promise { log(`Draining ${pending.length} pending IPC messages into initial prompt`); prompt += '\n' + pending.join('\n'); } - prompt = prependRoomRoleHeader(prompt, containerInput.roomRoleContext); - // --- Slash command handling --- - // Only known session slash commands are handled here. This prevents - // accidental interception of user prompts that happen to start with '/'. + // Check BEFORE prepending room role header so /compact isn't masked. const KNOWN_SESSION_COMMANDS = new Set(['/compact']); + const isSessionSlashCommand = KNOWN_SESSION_COMMANDS.has(containerInput.prompt.trim()); + + if (!isSessionSlashCommand) { + prompt = prependRoomRoleHeader(prompt, containerInput.roomRoleContext); + } const trimmedPrompt = prompt.trim(); - const isSessionSlashCommand = KNOWN_SESSION_COMMANDS.has(trimmedPrompt); if (isSessionSlashCommand) { log(`Handling session command: ${trimmedPrompt}`); diff --git a/runners/codex-runner/src/index.ts b/runners/codex-runner/src/index.ts index e9d2a5b..1f7ae40 100644 --- a/runners/codex-runner/src/index.ts +++ b/runners/codex-runner/src/index.ts @@ -504,7 +504,8 @@ async function main(): Promise { /* ignore */ } - let prompt = containerInput.prompt; + const rawPrompt = containerInput.prompt; + let prompt = rawPrompt; if (containerInput.isScheduledTask) { prompt = `[SCHEDULED TASK]\n\n${prompt}`; } @@ -512,7 +513,12 @@ async function main(): Promise { if (pending.length > 0) { prompt += '\n' + pending.join('\n'); } - prompt = prependRoomRoleHeader(prompt, containerInput.roomRoleContext); + // Prepend room role header AFTER checking for session commands, + // so /compact is not masked by the header prefix. + const isSessionCommand = rawPrompt.trim() === '/compact'; + if (!isSessionCommand) { + prompt = prependRoomRoleHeader(prompt, containerInput.roomRoleContext); + } try { log('Runtime selected: app-server');