feat: add room-level assignment write path

This commit is contained in:
Eyejoker
2026-03-31 21:21:57 +09:00
parent 200cbef0f9
commit b9538e54bc
6 changed files with 769 additions and 114 deletions

View File

@@ -24,15 +24,15 @@ import {
import { writeGroupsSnapshot } from './agent-runner.js';
import { listAvailableGroups } from './available-groups.js';
import {
type AssignRoomInput,
assignRoom,
getAllRegisteredGroups,
getAllSessions,
getAllTasks,
getLatestMessageSeqAtOrBefore,
hasRecentRestartAnnouncement,
getRegisteredGroup,
getRouterState,
initDatabase,
setRegisteredGroup,
setRouterState,
deleteAllSessionsForGroup,
deleteSession,
@@ -217,29 +217,68 @@ function clearSession(
}
function registerGroup(jid: string, group: RegisteredGroup): void {
const assignedGroup = assignRoom(jid, {
name: group.name,
ownerAgentType: group.agentType,
folder: group.folder,
trigger: group.trigger,
requiresTrigger: group.requiresTrigger,
isMain: group.isMain,
workDir: group.workDir,
addedAt: group.added_at,
ownerAgentConfig: group.agentConfig,
});
if (!assignedGroup) {
logger.warn({ jid }, 'Failed to assign room during legacy registration');
return;
}
let groupDir: string;
try {
groupDir = resolveGroupFolderPath(group.folder);
groupDir = resolveGroupFolderPath(assignedGroup.folder);
} catch (err) {
logger.warn(
{ jid, folder: group.folder, err },
{ jid, folder: assignedGroup.folder, err },
'Rejecting group registration with invalid folder',
);
return;
}
registeredGroups[jid] = group;
setRegisteredGroup(jid, group);
const { jid: _ignoredJid, ...storedGroup } = assignedGroup;
registeredGroups[jid] = storedGroup;
// Create group folder
fs.mkdirSync(path.join(groupDir, 'logs'), { recursive: true });
logger.info(
{ jid, name: group.name, folder: group.folder },
{ jid, name: assignedGroup.name, folder: assignedGroup.folder },
'Group registered',
);
}
function assignRoomForIpc(jid: string, input: AssignRoomInput): void {
const assignedGroup = assignRoom(jid, input);
if (!assignedGroup) {
logger.warn({ jid }, 'Failed to assign room from IPC');
return;
}
let groupDir: string;
try {
groupDir = resolveGroupFolderPath(assignedGroup.folder);
} catch (err) {
logger.warn(
{ jid, folder: assignedGroup.folder, err },
'Rejecting room assignment with invalid folder',
);
return;
}
const { jid: _ignoredJid, ...storedGroup } = assignedGroup;
registeredGroups[jid] = storedGroup;
fs.mkdirSync(path.join(groupDir, 'logs'), { recursive: true });
}
/**
* Get available groups list for the agent.
* Returns groups ordered by most recent activity.
@@ -483,6 +522,7 @@ async function main(): Promise<void> {
nudgeScheduler: nudgeSchedulerLoop,
registeredGroups: () => registeredGroups,
registerGroup,
assignRoom: assignRoomForIpc,
syncGroups: async (force: boolean) => {
await Promise.all(
channels