Merge pull request #96 from phj1081/codex/owner/ejclaw
Extract message runtime role channel resolution
This commit is contained in:
56
src/message-runtime-role-channels.test.ts
Normal file
56
src/message-runtime-role-channels.test.ts
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
import { describe, expect, it, vi } from 'vitest';
|
||||||
|
|
||||||
|
import { resolvePairedRoleChannels } from './message-runtime-role-channels.js';
|
||||||
|
import type { Channel } from './types.js';
|
||||||
|
|
||||||
|
function makeChannel(name: string): Channel {
|
||||||
|
return {
|
||||||
|
name,
|
||||||
|
connect: vi.fn(),
|
||||||
|
sendMessage: vi.fn(),
|
||||||
|
isConnected: vi.fn(() => true),
|
||||||
|
ownsJid: vi.fn(() => false),
|
||||||
|
disconnect: vi.fn(),
|
||||||
|
} as unknown as Channel;
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('message-runtime-role-channels', () => {
|
||||||
|
it('maps owner, reviewer, and arbiter roles to their runtime channels', () => {
|
||||||
|
const ownerChannel = makeChannel('discord-owner');
|
||||||
|
const reviewerChannel = makeChannel('discord-review');
|
||||||
|
const arbiterChannel = makeChannel('discord-arbiter');
|
||||||
|
|
||||||
|
const result = resolvePairedRoleChannels(
|
||||||
|
[ownerChannel, reviewerChannel, arbiterChannel],
|
||||||
|
ownerChannel,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(result).toEqual({
|
||||||
|
roleToChannel: {
|
||||||
|
owner: ownerChannel,
|
||||||
|
reviewer: reviewerChannel,
|
||||||
|
arbiter: arbiterChannel,
|
||||||
|
},
|
||||||
|
reviewerChannelName: 'discord-review',
|
||||||
|
foundReviewerChannel: reviewerChannel,
|
||||||
|
arbiterChannelName: 'discord-arbiter',
|
||||||
|
foundArbiterChannel: arbiterChannel,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('keeps missing reviewer and arbiter channels explicit as null', () => {
|
||||||
|
const ownerChannel = makeChannel('discord-owner');
|
||||||
|
|
||||||
|
expect(resolvePairedRoleChannels([ownerChannel], ownerChannel)).toEqual({
|
||||||
|
roleToChannel: {
|
||||||
|
owner: ownerChannel,
|
||||||
|
reviewer: null,
|
||||||
|
arbiter: null,
|
||||||
|
},
|
||||||
|
reviewerChannelName: 'discord-review',
|
||||||
|
foundReviewerChannel: null,
|
||||||
|
arbiterChannelName: 'discord-arbiter',
|
||||||
|
foundArbiterChannel: null,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
37
src/message-runtime-role-channels.ts
Normal file
37
src/message-runtime-role-channels.ts
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
import { findChannelByName } from './router.js';
|
||||||
|
import type { Channel, PairedRoomRole } from './types.js';
|
||||||
|
|
||||||
|
export type PairedRoleChannels = Record<PairedRoomRole, Channel | null>;
|
||||||
|
|
||||||
|
export interface PairedRoleChannelResolution {
|
||||||
|
roleToChannel: PairedRoleChannels;
|
||||||
|
reviewerChannelName: string;
|
||||||
|
foundReviewerChannel: Channel | null;
|
||||||
|
arbiterChannelName: string;
|
||||||
|
foundArbiterChannel: Channel | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function resolvePairedRoleChannels(
|
||||||
|
channels: Channel[],
|
||||||
|
ownerChannel: Channel,
|
||||||
|
): PairedRoleChannelResolution {
|
||||||
|
const reviewerChannelName = 'discord-review';
|
||||||
|
const foundReviewerChannel =
|
||||||
|
findChannelByName(channels, reviewerChannelName) ?? null;
|
||||||
|
|
||||||
|
const arbiterChannelName = 'discord-arbiter';
|
||||||
|
const foundArbiterChannel =
|
||||||
|
findChannelByName(channels, arbiterChannelName) ?? null;
|
||||||
|
|
||||||
|
return {
|
||||||
|
roleToChannel: {
|
||||||
|
owner: ownerChannel,
|
||||||
|
reviewer: foundReviewerChannel,
|
||||||
|
arbiter: foundArbiterChannel,
|
||||||
|
},
|
||||||
|
reviewerChannelName,
|
||||||
|
foundReviewerChannel,
|
||||||
|
arbiterChannelName,
|
||||||
|
foundArbiterChannel,
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -13,7 +13,7 @@ import {
|
|||||||
SERVICE_SESSION_SCOPE,
|
SERVICE_SESSION_SCOPE,
|
||||||
} from './config.js';
|
} from './config.js';
|
||||||
import { GroupQueue, GroupRunContext } from './group-queue.js';
|
import { GroupQueue, GroupRunContext } from './group-queue.js';
|
||||||
import { findChannel, findChannelByName, formatMessages } from './router.js';
|
import { findChannel, formatMessages } from './router.js';
|
||||||
import { isTriggerAllowed, loadSenderAllowlist } from './sender-allowlist.js';
|
import { isTriggerAllowed, loadSenderAllowlist } from './sender-allowlist.js';
|
||||||
import { enqueueGenericFollowUpAfterDeliveryRetry as enqueueDeliveryRetryFollowUp } from './message-runtime-dispatch.js';
|
import { enqueueGenericFollowUpAfterDeliveryRetry as enqueueDeliveryRetryFollowUp } from './message-runtime-dispatch.js';
|
||||||
import {
|
import {
|
||||||
@@ -73,6 +73,7 @@ import {
|
|||||||
isDuplicateOfLastBotFinal,
|
isDuplicateOfLastBotFinal,
|
||||||
labelPairedSenders,
|
labelPairedSenders,
|
||||||
} from './message-runtime-turns.js';
|
} from './message-runtime-turns.js';
|
||||||
|
import { resolvePairedRoleChannels } from './message-runtime-role-channels.js';
|
||||||
|
|
||||||
export { isDuplicateOfLastBotFinal };
|
export { isDuplicateOfLastBotFinal };
|
||||||
|
|
||||||
@@ -381,28 +382,13 @@ export function createMessageRuntime(deps: MessageRuntimeDeps): {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// For paired rooms, reviewer/arbiter outputs use their fixed role bots.
|
const {
|
||||||
const reviewerChannelName = 'discord-review';
|
roleToChannel,
|
||||||
const foundReviewerChannel = findChannelByName(
|
|
||||||
deps.channels,
|
|
||||||
reviewerChannelName,
|
reviewerChannelName,
|
||||||
);
|
foundReviewerChannel,
|
||||||
|
|
||||||
const arbiterChannelName = 'discord-arbiter';
|
|
||||||
const foundArbiterChannel = findChannelByName(
|
|
||||||
deps.channels,
|
|
||||||
arbiterChannelName,
|
arbiterChannelName,
|
||||||
);
|
foundArbiterChannel,
|
||||||
|
} = resolvePairedRoleChannels(deps.channels, channel);
|
||||||
// Resolve the correct Discord channel for a given task status.
|
|
||||||
const roleToChannel: Record<
|
|
||||||
'owner' | 'reviewer' | 'arbiter',
|
|
||||||
Channel | null
|
|
||||||
> = {
|
|
||||||
owner: channel,
|
|
||||||
reviewer: foundReviewerChannel || null,
|
|
||||||
arbiter: foundArbiterChannel || null,
|
|
||||||
};
|
|
||||||
if (hasReviewerLease(chatJid)) {
|
if (hasReviewerLease(chatJid)) {
|
||||||
log.info(
|
log.info(
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user