fix: include current task user scope in paired prompts

This commit is contained in:
ejclaw
2026-05-26 03:25:52 +09:00
parent e20cd2f1b0
commit c8f99d8349
3 changed files with 167 additions and 15 deletions

View File

@@ -9,6 +9,7 @@ const CARRIED_FORWARD_OWNER_FINAL_GUIDANCE = `System note:
If you see a message beginning with "${CARRIED_FORWARD_OWNER_FINAL_MARKER}", treat it as background only. Do not repeat, continue, or answer that carried-forward final directly. Respond only to the latest human request and the current task.`;
const ARBITER_TURN_OUTPUT_CONTEXT_LIMIT = 6;
const TASK_USER_CONTEXT_START_SKEW_MS = 5_000;
function turnOutputsToMessages(
outputs: PairedTurnOutput[],
@@ -47,6 +48,23 @@ function latestTurnOutputs(
return outputs.slice(-limit);
}
function currentTaskHumanMessages(
messages: NewMessage[],
taskCreatedAt: string | null | undefined,
): NewMessage[] {
if (!taskCreatedAt) return [];
const taskStartMs = Date.parse(taskCreatedAt);
if (!Number.isFinite(taskStartMs)) return [];
return messages.filter((message) => {
if (message.is_bot_message) return false;
const messageMs = Date.parse(message.timestamp);
return (
Number.isFinite(messageMs) &&
messageMs >= taskStartMs - TASK_USER_CONTEXT_START_SKEW_MS
);
});
}
function hasCarriedForwardOwnerFinal(outputs: PairedTurnOutput[]): boolean {
return outputs.some((output) =>
output.output_text.startsWith(CARRIED_FORWARD_OWNER_FINAL_MARKER),
@@ -95,9 +113,13 @@ function turnOutputsOnlyPrompt(
chatJid: string,
timezone: string,
turnOutputs: PairedTurnOutput[],
taskHumanMessages: NewMessage[] = [],
): string {
return prependCarriedForwardGuidance(
formatMessages(turnOutputsToMessages(turnOutputs, chatJid), timezone),
formatMessages(
[...taskHumanMessages, ...turnOutputsToMessages(turnOutputs, chatJid)],
timezone,
),
turnOutputs,
);
}
@@ -108,9 +130,15 @@ export function buildReviewerPendingPrompt(args: {
turnOutputs: PairedTurnOutput[];
recentHumanMessages: NewMessage[];
lastHumanMessage: string | null | undefined;
taskCreatedAt?: string | null;
}): string {
if (args.turnOutputs.length > 0) {
return turnOutputsOnlyPrompt(args.chatJid, args.timezone, args.turnOutputs);
return turnOutputsOnlyPrompt(
args.chatJid,
args.timezone,
args.turnOutputs,
currentTaskHumanMessages(args.recentHumanMessages, args.taskCreatedAt),
);
}
if (!args.lastHumanMessage) {
@@ -126,9 +154,15 @@ export function buildOwnerPendingPrompt(args: {
turnOutputs: PairedTurnOutput[];
recentHumanMessages: NewMessage[];
lastHumanMessage: string | null | undefined;
taskCreatedAt?: string | null;
}): string {
if (args.turnOutputs.length > 0) {
return turnOutputsOnlyPrompt(args.chatJid, args.timezone, args.turnOutputs);
return turnOutputsOnlyPrompt(
args.chatJid,
args.timezone,
args.turnOutputs,
currentTaskHumanMessages(args.recentHumanMessages, args.taskCreatedAt),
);
}
if (!args.lastHumanMessage) {
@@ -146,15 +180,22 @@ export function buildArbiterPromptForTask(args: {
recentMessages: NewMessage[];
labeledRecentMessages: NewMessage[];
}): string {
const taskHumanMessages = currentTaskHumanMessages(
args.recentMessages,
args.task.created_at,
);
const messages =
args.turnOutputs.length > 0
? turnOutputsToMessages(
latestTurnOutputs(
args.turnOutputs,
ARBITER_TURN_OUTPUT_CONTEXT_LIMIT,
? [
...taskHumanMessages,
...turnOutputsToMessages(
latestTurnOutputs(
args.turnOutputs,
ARBITER_TURN_OUTPUT_CONTEXT_LIMIT,
),
args.chatJid,
),
args.chatJid,
)
]
: args.labeledRecentMessages;
return buildArbiterContextPrompt({