feat: add structured room role metadata

This commit is contained in:
Eyejoker
2026-03-28 19:30:32 +09:00
parent 806e5e4ff1
commit 79a8a2639e
13 changed files with 300 additions and 0 deletions

View File

@@ -21,6 +21,11 @@ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
import { fileURLToPath } from 'url';
import {
prependRoomRoleHeader,
type RoomRoleContext,
} from './room-role-context.js';
interface ContainerInput {
prompt: string;
sessionId?: string;
@@ -30,6 +35,7 @@ interface ContainerInput {
isScheduledTask?: boolean;
assistantName?: string;
secrets?: Record<string, string>;
roomRoleContext?: RoomRoleContext;
}
/** Mirrors AgentOutput in src/agent-runner.ts (separate package, can't import directly). */
@@ -971,6 +977,7 @@ async function main(): Promise<void> {
log(`Draining ${pending.length} pending IPC messages into initial prompt`);
prompt += '\n' + pending.join('\n');
}
prompt = prependRoomRoleHeader(prompt, containerInput.roomRoleContext);
// --- Slash command handling ---
// Only known session slash commands are handled here. This prevents

View File

@@ -0,0 +1,23 @@
export interface RoomRoleContext {
serviceId: string;
role: 'owner' | 'reviewer';
ownerServiceId: string;
reviewerServiceId: string;
failoverOwner: boolean;
}
export function prependRoomRoleHeader(
prompt: string,
roomRoleContext?: RoomRoleContext,
): string {
if (!roomRoleContext) {
return prompt;
}
const header =
`[ROOM_ROLE self=${roomRoleContext.serviceId} role=${roomRoleContext.role} ` +
`owner=${roomRoleContext.ownerServiceId} reviewer=${roomRoleContext.reviewerServiceId} ` +
`failover=${roomRoleContext.failoverOwner ? 1 : 0}]`;
return `${header}\n\n${prompt}`;
}

View File

@@ -0,0 +1,23 @@
import { describe, expect, it } from 'vitest';
import { prependRoomRoleHeader } from '../src/room-role-context.js';
describe('claude runner room role header', () => {
it('prepends a canonical role header when metadata exists', () => {
expect(
prependRoomRoleHeader('hello', {
serviceId: 'codex-review',
role: 'owner',
ownerServiceId: 'codex-review',
reviewerServiceId: 'codex-main',
failoverOwner: true,
}),
).toBe(
'[ROOM_ROLE self=codex-review role=owner owner=codex-review reviewer=codex-main failover=1]\n\nhello',
);
});
it('leaves prompts unchanged without room metadata', () => {
expect(prependRoomRoleHeader('hello')).toBe('hello');
});
});