From f3b25b1b40c4af7dbfe6fc6ed582c5bbf3a5cc26 Mon Sep 17 00:00:00 2001 From: Eyejoker Date: Mon, 30 Mar 2026 22:33:42 +0900 Subject: [PATCH] fix: apply role labels to arbiter conversation context --- src/arbiter-context.ts | 14 ++++++++++++-- src/message-runtime.ts | 10 ++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/arbiter-context.ts b/src/arbiter-context.ts index 7a7bea2..653427b 100644 --- a/src/arbiter-context.ts +++ b/src/arbiter-context.ts @@ -1,5 +1,6 @@ import { getRecentChatMessages } from './db.js'; import { formatMessages } from './router.js'; +import type { NewMessage } from './types.js'; export function buildArbiterContextPrompt(args: { chatJid: string; @@ -7,10 +8,19 @@ export function buildArbiterContextPrompt(args: { roundTripCount: number; timezone: string; recentTurnLimit?: number; + /** Pre-labeled messages. If provided, skips DB fetch. */ + messages?: NewMessage[]; }): string { - const { chatJid, taskId, roundTripCount, timezone, recentTurnLimit = 20 } = args; + const { + chatJid, + taskId, + roundTripCount, + timezone, + recentTurnLimit = 20, + } = args; - const recentMessages = getRecentChatMessages(chatJid, recentTurnLimit); + const recentMessages = + args.messages ?? getRecentChatMessages(chatJid, recentTurnLimit); const conversationContext = formatMessages(recentMessages, timezone); return [ diff --git a/src/message-runtime.ts b/src/message-runtime.ts index 8de8e1a..42279bf 100644 --- a/src/message-runtime.ts +++ b/src/message-runtime.ts @@ -668,11 +668,16 @@ export function createMessageRuntime(deps: MessageRuntimeDeps): { ); } + const arbiterMessages = labelPairedSenders( + chatJid, + getRecentChatMessages(chatJid, 20), + ); const arbiterPrompt = buildArbiterContextPrompt({ chatJid, taskId: pendingReviewTask.id, roundTripCount: pendingReviewTask.round_trip_count, timezone: deps.timezone, + messages: arbiterMessages, }); const { deliverySucceeded } = await executeTurn({ @@ -840,11 +845,16 @@ export function createMessageRuntime(deps: MessageRuntimeDeps): { // Arbiter turns use a dedicated context prompt; regular turns use formatted messages. let prompt: string; if (useArbiterChannel && pendingTaskForChannel) { + const arbiterMsgs = labelPairedSenders( + chatJid, + getRecentChatMessages(chatJid, 20), + ); prompt = buildArbiterContextPrompt({ chatJid, taskId: pendingTaskForChannel.id, roundTripCount: pendingTaskForChannel.round_trip_count, timezone: deps.timezone, + messages: arbiterMsgs, }); } else { prompt = formatMessages(