69 lines
1.6 KiB
TypeScript
69 lines
1.6 KiB
TypeScript
import {
|
|
ARBITER_SERVICE_ID,
|
|
CLAUDE_SERVICE_ID,
|
|
CODEX_MAIN_SERVICE_ID,
|
|
CODEX_REVIEW_SERVICE_ID,
|
|
normalizeServiceId,
|
|
} from './config.js';
|
|
import type { AgentType, PairedRoomRole } from './types.js';
|
|
|
|
export function resolveRoleServiceShadow(
|
|
role: PairedRoomRole,
|
|
agentType: AgentType | null | undefined,
|
|
): string | null {
|
|
if (!agentType) {
|
|
return null;
|
|
}
|
|
if (agentType === 'claude-code') {
|
|
return CLAUDE_SERVICE_ID;
|
|
}
|
|
if (role === 'owner') {
|
|
return CODEX_MAIN_SERVICE_ID;
|
|
}
|
|
if (role === 'arbiter') {
|
|
return ARBITER_SERVICE_ID ?? CODEX_REVIEW_SERVICE_ID;
|
|
}
|
|
return CODEX_REVIEW_SERVICE_ID;
|
|
}
|
|
|
|
export function inferAgentTypeFromServiceShadow(
|
|
serviceId: string | null | undefined,
|
|
): AgentType | undefined {
|
|
if (!serviceId) {
|
|
return undefined;
|
|
}
|
|
|
|
const normalized = normalizeServiceId(serviceId);
|
|
if (normalized === CLAUDE_SERVICE_ID) {
|
|
return 'claude-code';
|
|
}
|
|
if (
|
|
normalized === CODEX_MAIN_SERVICE_ID ||
|
|
normalized === CODEX_REVIEW_SERVICE_ID ||
|
|
(ARBITER_SERVICE_ID != null && normalized === ARBITER_SERVICE_ID)
|
|
) {
|
|
return 'codex';
|
|
}
|
|
return undefined;
|
|
}
|
|
|
|
export function inferRoleFromServiceShadow(
|
|
agentType: AgentType | null | undefined,
|
|
serviceId: string | null | undefined,
|
|
): PairedRoomRole | null {
|
|
if (!agentType || !serviceId) {
|
|
return null;
|
|
}
|
|
|
|
const normalized = normalizeServiceId(serviceId);
|
|
const matches = (['owner', 'reviewer', 'arbiter'] as const).filter(
|
|
(role) => resolveRoleServiceShadow(role, agentType) === normalized,
|
|
);
|
|
|
|
if (matches.length !== 1) {
|
|
return null;
|
|
}
|
|
|
|
return matches[0];
|
|
}
|