From 4dc4b3bc014d655e4a09015e351f71bcd80ca755 Mon Sep 17 00:00:00 2001 From: Eyejoker Date: Sun, 29 Mar 2026 19:04:51 +0900 Subject: [PATCH] fix: route paired room turns by task status instead of SERVICE_ID MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In unified mode, SERVICE_SESSION_SCOPE doesn't match the lease's owner/reviewer service IDs. Determine the effective role from the paired task status: review_ready/in_review → reviewer, otherwise → owner. This restores the owner↔reviewer ping-pong in unified single-process mode. --- src/message-agent-executor.ts | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/message-agent-executor.ts b/src/message-agent-executor.ts index b0fa0be..acf765d 100644 --- a/src/message-agent-executor.ts +++ b/src/message-agent-executor.ts @@ -11,7 +11,11 @@ import { writeTasksSnapshot, } from './agent-runner.js'; import { listAvailableGroups } from './available-groups.js'; -import { createServiceHandoff, getAllTasks } from './db.js'; +import { + createServiceHandoff, + getAllTasks, + getLatestOpenPairedTaskForChat, +} from './db.js'; import { GroupQueue } from './group-queue.js'; import { logger } from './logger.js'; import { buildRoomMemoryBriefing } from './memento-client.js'; @@ -127,11 +131,22 @@ export async function runAgentForGroup( const canRotateToken = isClaudeCodeAgent && getTokenCount() > 1; const currentLease = getEffectiveChannelLease(chatJid); - const reviewerMode = - currentLease.reviewer_service_id === SERVICE_SESSION_SCOPE; + + // In unified mode, determine role from the lease directly. + // Default to owner; the auto-review trigger in completePairedExecutionContext + // will switch to reviewer when the task is in review_ready state. + const pairedTask = currentLease.reviewer_service_id + ? getLatestOpenPairedTaskForChat(chatJid) + : null; + const effectiveServiceId = + pairedTask && + (pairedTask.status === 'review_ready' || pairedTask.status === 'in_review') + ? currentLease.reviewer_service_id! + : currentLease.owner_service_id; + const reviewerMode = effectiveServiceId === currentLease.reviewer_service_id; const roomRoleContext = buildRoomRoleContext( currentLease, - SERVICE_SESSION_SCOPE, + effectiveServiceId, ); const pairedExecutionContext = preparePairedExecutionContext({ group,