Route fresh review-ready input to owner

This commit is contained in:
ejclaw
2026-04-07 19:05:18 +09:00
parent 7ad4586985
commit f24d9ee117
4 changed files with 158 additions and 10 deletions

View File

@@ -35,7 +35,9 @@ import {
createImplicitContinuationTracker,
resolveNextTurnAction,
resolveActiveRole,
resolveCursorKeyForRole,
resolveCursorKey,
resolveQueuedTurnRole,
filterLoopingPairedBotMessages,
getProcessableMessages,
hasAllowedTrigger,
@@ -484,7 +486,8 @@ export function createMessageRuntime(deps: MessageRuntimeDeps): {
await turnController.finish(outputStatus);
if (deliverySucceeded && pairedRoom && resolvedDeliveryRole === 'owner') {
const pendingTaskAfterDelivery = getLatestOpenPairedTaskForChat(chatJid);
const pendingTaskAfterDelivery =
getLatestOpenPairedTaskForChat(chatJid);
const nextTurnAction = resolveNextTurnAction({
taskStatus: pendingTaskAfterDelivery?.status,
lastTurnOutputRole: 'owner',
@@ -697,10 +700,13 @@ export function createMessageRuntime(deps: MessageRuntimeDeps): {
reviewer: foundReviewerChannel || null,
arbiter: foundArbiterChannel || null,
};
const resolveChannel = (taskStatus?: string | null): Channel | null => {
const role = resolveActiveRole(taskStatus);
const resolveChannelForRole = (
role: 'owner' | 'reviewer' | 'arbiter',
): Channel | null => {
return role === 'owner' ? channel : roleToChannel[role];
};
const resolveChannel = (taskStatus?: string | null): Channel | null =>
resolveChannelForRole(resolveActiveRole(taskStatus));
const enqueueGroupMessageCheck = (): void => {
enqueueScopedGroupMessageCheck(chatJid, group.folder);
@@ -987,11 +993,22 @@ export function createMessageRuntime(deps: MessageRuntimeDeps): {
? getLatestOpenPairedTaskForChat(chatJid)
: null;
const taskStatus = pendingTaskForChannel?.status;
const turnChannel = resolveChannel(taskStatus);
const cursorKey = resolveCursorKey(chatJid, taskStatus);
const hasHumanMsg = !isBotOnlyPairedRoomTurn(chatJid, missedMessages);
const turnRole = pendingTaskForChannel
? resolveQueuedTurnRole({
taskStatus,
hasHumanMessage: hasHumanMsg,
})
: 'owner';
const turnChannel = resolveChannelForRole(turnRole);
const cursorKey = resolveCursorKeyForRole(chatJid, turnRole);
const forcedRole =
pendingTaskForChannel &&
turnRole !== resolveActiveRole(taskStatus)
? turnRole
: undefined;
// Arbiter turns use a dedicated context prompt; regular turns use formatted messages.
const turnRole = resolveActiveRole(taskStatus);
let prompt: string;
if (turnRole === 'arbiter' && pendingTaskForChannel) {
const recentMessages = getRecentChatMessages(chatJid, 20);
@@ -1052,7 +1069,6 @@ export function createMessageRuntime(deps: MessageRuntimeDeps): {
);
}
const hasHumanMsg = !isBotOnlyPairedRoomTurn(chatJid, missedMessages);
const { deliverySucceeded, visiblePhase } = await executeTurn({
group,
prompt,
@@ -1063,6 +1079,7 @@ export function createMessageRuntime(deps: MessageRuntimeDeps): {
startSeq,
endSeq,
hasHumanMessage: hasHumanMsg,
forcedRole,
});
if (!deliverySucceeded) {