fix: arbiter session collision — separate session folder + always fresh session
- resolveSessionFolder now always returns unique folder for arbiter (prevents sharing session with owner when both use same agent type) - Arbiter sessionId forced to undefined to prevent resume attempts
This commit is contained in:
12
src/db.ts
12
src/db.ts
@@ -1137,6 +1137,18 @@ export function getLastHumanMessageTimestamp(chatJid: string): string | null {
|
||||
return row?.timestamp ?? null;
|
||||
}
|
||||
|
||||
export function getLastHumanMessageSender(chatJid: string): string | null {
|
||||
const row = db
|
||||
.prepare(
|
||||
`SELECT sender FROM messages
|
||||
WHERE chat_jid = ? AND is_bot_message = 0 AND is_from_me = 0
|
||||
AND content != '' AND content IS NOT NULL
|
||||
ORDER BY timestamp DESC, seq DESC LIMIT 1`,
|
||||
)
|
||||
.get(chatJid) as { sender: string } | undefined;
|
||||
return row?.sender ?? null;
|
||||
}
|
||||
|
||||
export function getLastHumanMessageContent(chatJid: string): string | null {
|
||||
const row = db
|
||||
.prepare(
|
||||
|
||||
@@ -14,8 +14,10 @@ import { listAvailableGroups } from './available-groups.js';
|
||||
import {
|
||||
createServiceHandoff,
|
||||
getAllTasks,
|
||||
getLastHumanMessageSender,
|
||||
getLatestOpenPairedTaskForChat,
|
||||
getLatestTurnNumber,
|
||||
getPairedTaskById,
|
||||
insertPairedTurnOutput,
|
||||
} from './db.js';
|
||||
import { GroupQueue } from './group-queue.js';
|
||||
@@ -128,7 +130,8 @@ export async function runAgentForGroup(
|
||||
activeRole,
|
||||
group.agentType,
|
||||
);
|
||||
const sessionId = sessions[sessionFolder];
|
||||
// Arbiter always starts fresh — never resume a previous session
|
||||
const sessionId = activeRole === 'arbiter' ? undefined : sessions[sessionFolder];
|
||||
const memoryBriefing = sessionId
|
||||
? undefined
|
||||
: await buildRoomMemoryBriefing({
|
||||
|
||||
@@ -89,6 +89,8 @@ export function resolveSessionFolder(
|
||||
role: 'owner' | 'reviewer' | 'arbiter',
|
||||
groupAgentType: AgentType | undefined,
|
||||
): string {
|
||||
// Arbiter always gets a separate session — must never share with owner/reviewer
|
||||
if (role === 'arbiter') return `${groupFolder}:arbiter`;
|
||||
const effectiveType = resolveEffectiveAgentType(role, groupAgentType);
|
||||
const groupDefault: AgentType = groupAgentType || 'claude-code';
|
||||
if (effectiveType === groupDefault) return groupFolder;
|
||||
|
||||
Reference in New Issue
Block a user