fix: separate reviewer session from owner to preserve review context

Reviewer was starting with undefined sessionId every turn, losing all
conversation context. Now uses `group.folder:reviewer` as the session key
so owner and reviewer maintain independent session histories.

Also updates README to reflect unified service architecture and paired
review workflow.
This commit is contained in:
Eyejoker
2026-03-29 22:22:45 +09:00
parent 33baf2970d
commit 8049db0d47
3 changed files with 86 additions and 60 deletions

View File

@@ -128,10 +128,11 @@ export async function runAgentForGroup(
const isClaudeCodeAgent = effectiveAgentType === 'claude-code';
// When the reviewer uses a different agent type than the group default,
// the stored session belongs to the other agent. Don't reuse it.
const sessionId = reviewerAgentTypeOverride
? undefined
: sessions[group.folder];
// use a separate session key so owner and reviewer sessions don't collide.
const sessionFolder = reviewerAgentTypeOverride
? `${group.folder}:reviewer`
: group.folder;
const sessionId = sessions[sessionFolder];
const memoryBriefing = sessionId
? undefined
: await buildRoomMemoryBriefing({
@@ -307,7 +308,7 @@ export async function runAgentForGroup(
output.newSessionId &&
!resetSessionRequested
) {
deps.persistSession(group.folder, output.newSessionId);
deps.persistSession(sessionFolder, output.newSessionId);
}
const evaluation = evaluateStreamedOutput(output, streamedState, {
agentType: isClaudeCodeAgent ? 'claude-code' : 'codex',
@@ -443,7 +444,7 @@ export async function runAgentForGroup(
);
if (provider === 'claude' && output.newSessionId) {
deps.persistSession(group.folder, output.newSessionId);
deps.persistSession(sessionFolder, output.newSessionId);
}
logger.info(
@@ -657,7 +658,7 @@ export async function runAgentForGroup(
})));
if (isRetryableClaudeSessionFailure(primaryAttempt)) {
deps.clearSession(group.folder);
deps.clearSession(sessionFolder);
logger.warn(
{ group: group.name, chatJid, runId },
'Cleared poisoned Claude session before visible output, retrying fresh session',
@@ -666,7 +667,7 @@ export async function runAgentForGroup(
primaryAttempt = await runAttempt('claude');
if (isRetryableClaudeSessionFailure(primaryAttempt)) {
deps.clearSession(group.folder);
deps.clearSession(sessionFolder);
logger.warn(
{ group: group.name, chatJid, runId },
'Fresh Claude retry also hit a retryable session failure',
@@ -791,9 +792,9 @@ export async function runAgentForGroup(
isClaudeCodeAgent &&
(resetSessionRequested || shouldResetSessionOnAgentFailure(output))
) {
deps.clearSession(group.folder);
deps.clearSession(sessionFolder);
logger.warn(
{ group: group.name, chatJid, runId },
{ group: group.name, chatJid, runId, sessionFolder },
'Cleared poisoned agent session after unrecoverable error',
);
}