fix(rooms): default new rooms to tribunal when room_mode is omitted

assign_room (MCP tool + host-side assignRoomInDatabase) and setup
register previously fell back to 'single' when no room_mode was given,
so newly added rooms silently lost the reviewer. Default to 'tribunal'
across the MCP zod schema, the IPC arg fallback, and the DB helper, and
update the ipc-auth expectation accordingly.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Codex
2026-06-19 00:00:20 +09:00
parent 822ac34c0e
commit f9b1e74838
3 changed files with 8 additions and 6 deletions

View File

@@ -765,8 +765,10 @@ If folder is omitted, the host generates one automatically.`,
name: z.string().describe('Display name for the room'), name: z.string().describe('Display name for the room'),
room_mode: z room_mode: z
.enum(['single', 'tribunal']) .enum(['single', 'tribunal'])
.default('single') .default('tribunal')
.describe('single=owner only, tribunal=owner/reviewer roles enabled'), .describe(
'single=owner only, tribunal=owner/reviewer roles enabled (default)',
),
owner_agent_type: z owner_agent_type: z
.enum(['claude-code', 'codex']) .enum(['claude-code', 'codex'])
.optional() .optional()
@@ -831,7 +833,7 @@ If folder is omitted, the host generates one automatically.`,
type: 'assign_room', type: 'assign_room',
jid: args.jid, jid: args.jid,
name: args.name, name: args.name,
room_mode: args.room_mode || 'single', room_mode: args.room_mode || 'tribunal',
owner_agent_type: args.owner_agent_type, owner_agent_type: args.owner_agent_type,
reviewer_agent_type: args.reviewer_agent_type, reviewer_agent_type: args.reviewer_agent_type,
arbiter_agent_type: args.arbiter_agent_type, arbiter_agent_type: args.arbiter_agent_type,

View File

@@ -194,7 +194,7 @@ export function assignRoomInDatabase(
input: AssignRoomInput, input: AssignRoomInput,
): (RegisteredGroup & { jid: string }) | undefined { ): (RegisteredGroup & { jid: string }) | undefined {
const existing = getStoredRoomSettingsRowFromDatabase(database, chatJid); const existing = getStoredRoomSettingsRowFromDatabase(database, chatJid);
const roomMode = input.roomMode || existing?.roomMode || 'single'; const roomMode = input.roomMode || existing?.roomMode || 'tribunal';
const ownerAgentType = const ownerAgentType =
input.ownerAgentType || existing?.ownerAgentType || OWNER_AGENT_TYPE; input.ownerAgentType || existing?.ownerAgentType || OWNER_AGENT_TYPE;
const folder = resolveAssignedRoomFolder( const folder = resolveAssignedRoomFolder(

View File

@@ -1131,7 +1131,7 @@ describe('assign_room success', () => {
}); });
}); });
it('assign_room auto-fills missing folder for single rooms without exposing trigger metadata', async () => { it('assign_room auto-fills missing folder and defaults to tribunal without exposing trigger metadata', async () => {
await processTaskIpc( await processTaskIpc(
{ {
type: 'assign_room', type: 'assign_room',
@@ -1146,7 +1146,7 @@ describe('assign_room success', () => {
const group = getRegisteredGroup('partial@g.us'); const group = getRegisteredGroup('partial@g.us');
expect(group).toBeDefined(); expect(group).toBeDefined();
expect(group!.folder).toMatch(/^grp_whatsapp_/); expect(group!.folder).toMatch(/^grp_whatsapp_/);
expect(getStoredRoomSettings('partial@g.us')?.roomMode).toBe('single'); expect(getStoredRoomSettings('partial@g.us')?.roomMode).toBe('tribunal');
}); });
it('assign_room preserves an existing tribunal room mode when room_mode is omitted', async () => { it('assign_room preserves an existing tribunal room mode when room_mode is omitted', async () => {