refactor: add role agent plan ssot

This commit is contained in:
Eyejoker
2026-03-31 09:28:10 +09:00
parent dd28ac6223
commit a39dad4c8c
2 changed files with 104 additions and 0 deletions

View File

@@ -0,0 +1,63 @@
import { describe, expect, it } from 'vitest';
import { resolveRoleAgentPlan } from './role-agent-plan.js';
describe('resolveRoleAgentPlan', () => {
it('uses the group agent type as owner in single rooms', () => {
expect(
resolveRoleAgentPlan({
paired: false,
groupAgentType: 'codex',
configuredReviewer: 'claude-code',
configuredArbiter: 'claude-code',
}),
).toEqual({
ownerAgentType: 'codex',
reviewerAgentType: null,
arbiterAgentType: null,
});
});
it('falls back to claude-code when group agent type is undefined', () => {
expect(
resolveRoleAgentPlan({
paired: false,
groupAgentType: undefined,
configuredReviewer: 'codex',
}),
).toEqual({
ownerAgentType: 'claude-code',
reviewerAgentType: null,
arbiterAgentType: null,
});
});
it('uses configured reviewer and arbiter when paired room roles differ', () => {
expect(
resolveRoleAgentPlan({
paired: true,
groupAgentType: 'codex',
configuredReviewer: 'claude-code',
configuredArbiter: 'claude-code',
}),
).toEqual({
ownerAgentType: 'codex',
reviewerAgentType: 'claude-code',
arbiterAgentType: 'claude-code',
});
});
it('collapses reviewer to owner and keeps arbiter null when absent', () => {
expect(
resolveRoleAgentPlan({
paired: true,
groupAgentType: 'claude-code',
configuredReviewer: 'claude-code',
}),
).toEqual({
ownerAgentType: 'claude-code',
reviewerAgentType: 'claude-code',
arbiterAgentType: null,
});
});
});

41
src/role-agent-plan.ts Normal file
View File

@@ -0,0 +1,41 @@
import type { AgentType } from './types.js';
export interface RoleAgentPlan {
ownerAgentType: AgentType;
reviewerAgentType: AgentType | null;
arbiterAgentType: AgentType | null;
}
export interface ResolveRoleAgentPlanArgs {
paired: boolean;
groupAgentType?: AgentType;
configuredReviewer: AgentType;
configuredArbiter?: AgentType | null;
}
/**
* Preserve current runtime agent-resolution behavior in one pure helper.
* This intentionally mirrors today's paired inference and does not read room mode yet.
*/
export function resolveRoleAgentPlan(
args: ResolveRoleAgentPlanArgs,
): RoleAgentPlan {
const ownerAgentType: AgentType = args.groupAgentType || 'claude-code';
if (!args.paired) {
return {
ownerAgentType,
reviewerAgentType: null,
arbiterAgentType: null,
};
}
return {
ownerAgentType,
reviewerAgentType:
args.configuredReviewer !== ownerAgentType
? args.configuredReviewer
: ownerAgentType,
arbiterAgentType: args.configuredArbiter ?? null,
};
}