feat: implement MAGI 3-agent arbiter system for deadlock resolution
Introduces a third agent role (arbiter) that is summoned on-demand when owner and reviewer reach a deadlock (same verdict 3+ rounds). Architecture: - 3 Discord bots: owner (codex), reviewer (claude), arbiter (claude/codex) - Arbiter is NOT always-on — only invoked when deadlock detected - Arbiter renders binding verdict: PROCEED/REVISE/RESET/ESCALATE - Non-escalate verdicts reset round_trip_count and resume ping-pong - Backward compatible: ARBITER_AGENT_TYPE unset = existing 2-agent mode Changes across 13 source files + 7 test files: - types.ts: PairedRoomRole += 'arbiter', new statuses, ArbiterVerdict type - config.ts: ARBITER_AGENT_TYPE, ARBITER_SERVICE_ID, ARBITER_DEADLOCK_THRESHOLD - db.ts: schema migration (arbiter columns in channel_owner + paired_tasks) - service-routing.ts: arbiter_service_id in lease - room-role-context.ts: arbiter role detection - paired-execution-context.ts: deadlock->arbiter, verdict handling - message-runtime.ts: arbiter turn routing, cursor, sender labeling - message-agent-executor.ts: arbiter mode, failover - agent-runner.ts + environment.ts: arbiter container mode - platform-prompts.ts: arbiter prompt loading New files: - prompts/arbiter-paired-room.md: arbiter system prompt - src/arbiter-context.ts: builds conversation context for arbiter judgment
This commit is contained in:
29
src/arbiter-context.ts
Normal file
29
src/arbiter-context.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
import { getRecentChatMessages } from './db.js';
|
||||
import { formatMessages } from './router.js';
|
||||
|
||||
export function buildArbiterContextPrompt(args: {
|
||||
chatJid: string;
|
||||
taskId: string;
|
||||
roundTripCount: number;
|
||||
timezone: string;
|
||||
recentTurnLimit?: number;
|
||||
}): string {
|
||||
const { chatJid, taskId, roundTripCount, timezone, recentTurnLimit = 20 } = args;
|
||||
|
||||
const recentMessages = getRecentChatMessages(chatJid, recentTurnLimit);
|
||||
const conversationContext = formatMessages(recentMessages, timezone);
|
||||
|
||||
return [
|
||||
`<arbiter-context>`,
|
||||
`<task-id>${taskId}</task-id>`,
|
||||
`<round-trips>${roundTripCount}</round-trips>`,
|
||||
`<reason>Deadlock detected: owner and reviewer exchanged ${roundTripCount} rounds without resolution</reason>`,
|
||||
`</arbiter-context>`,
|
||||
``,
|
||||
`<conversation-history>`,
|
||||
conversationContext,
|
||||
`</conversation-history>`,
|
||||
``,
|
||||
`Review the conversation above and render your verdict.`,
|
||||
].join('\n');
|
||||
}
|
||||
Reference in New Issue
Block a user