feat: Discord-independent inter-agent communication via paired_turn_outputs

- New paired_turn_outputs table stores agent output directly in DB
- Owner/reviewer prompts assembled from DB instead of Discord messages
- Arbiter context includes human messages + turn outputs
- Falls back to Discord messages for pre-migration tasks
- 50k char storage limit with truncation warning
This commit is contained in:
Eyejoker
2026-03-31 03:38:53 +09:00
parent dddf18428e
commit efb5710aad
4 changed files with 183 additions and 11 deletions

View File

@@ -15,6 +15,8 @@ import {
createServiceHandoff,
getAllTasks,
getLatestOpenPairedTaskForChat,
getLatestTurnNumber,
insertPairedTurnOutput,
} from './db.js';
import { GroupQueue } from './group-queue.js';
import { logger } from './logger.js';
@@ -226,6 +228,7 @@ export async function runAgentForGroup(
const effectivePrompt = moaEnrichedPrompt;
let pairedExecutionStatus: 'succeeded' | 'failed' = 'failed';
let pairedExecutionSummary: string | null = null;
let pairedFullOutput: string | null = null;
let pairedExecutionCompleted = false;
let pairedSawOutput = false;
@@ -420,6 +423,7 @@ export async function runAgentForGroup(
const outputText = getAgentOutputText(output);
if (typeof outputText === 'string' && outputText.length > 0) {
pairedExecutionSummary = outputText.slice(0, 500);
pairedFullOutput = outputText;
} else if (
typeof output.error === 'string' &&
output.error.length > 0
@@ -1019,6 +1023,25 @@ export async function runAgentForGroup(
status: effectiveStatus,
summary: pairedExecutionSummary,
});
// Store full output for direct inter-agent data passing (Discord-independent).
if (pairedFullOutput && effectiveStatus === 'succeeded') {
try {
const turnNumber =
getLatestTurnNumber(pairedExecutionContext.task.id) + 1;
insertPairedTurnOutput(
pairedExecutionContext.task.id,
turnNumber,
completedRole,
pairedFullOutput,
);
} catch (err) {
logger.warn(
{ taskId: pairedExecutionContext.task.id, err },
'Failed to store paired turn output',
);
}
}
}
// After owner/reviewer completes, enqueue the next turn so