Add Mixture-of-Agents (MoA) mode on top of Fusion

Extend the panel engine with a layer loop: Fusion is one proposer round,
MoA runs N rounds where each round after the first sees the previous
round's responses via <previous_layer_responses> and refines its answer.
Only the final round is persisted; intermediate rounds are live-only.
Rounds are clamped to 1-5.

- SessionRecord + migration: moa_layers column (default 2)
- RunPanel: layer loop with per-member cloned message injection
- CloneForMember / BuildPreviousLayerBlock helpers for member isolation
- SSE: panel_layer_start / panel_layer_done events
- Frontend: layer_index composite keying, round dividers, MoA option
- Docs: ARCHITECTURE + ARCHITECTURE_QUICK updated

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
MelekiandClaude Opus 4.8 committed 2026-06-18 13:46:28 +02:00
1 parent f21ed9ff9f
commit b7ff928340
15 files changed
+239 -65

No files matched your search

+5
View File
@@ -33,6 +33,8 @@ registerPage('session', {
const panelAgentsRow = document.getElementById('panelAgentsRow');
const panelAgentsCard = document.getElementById('panelAgentsCard');
const panelAgentIdsEl = document.getElementById('panelAgentIds');
const moaLayersRow = document.getElementById('moaLayersRow');
const moaLayersEl = document.getElementById('moaLayers');
const imagePreview = document.getElementById('sessionImagePreview');
const saveBtn = document.getElementById('sessionSaveBtn');
const cancelBtn = document.getElementById('sessionCancelBtn');
@@ -148,9 +150,11 @@ registerPage('session', {
}
function updatePanelVisibility() {
panelAgentsRow.hidden = (panelModeEl.value === 'off');
if (moaLayersRow) moaLayersRow.hidden = (panelModeEl.value !== 'moa');
}
panelModeEl.value = (session && session.multiModelMode) || 'off';
panelAgentIdsEl.value = (session && session.panelAgentIds) || '';
if (moaLayersEl) moaLayersEl.value = (session && session.moaLayers) || 2;
renderPanelInCard();
updatePanelVisibility();
panelModeEl.addEventListener('change', updatePanelVisibility);
@@ -215,6 +219,7 @@ registerPage('session', {
preparerAgentId: preparerAgentSelect.value || null,
multiModelMode: panelModeEl.value || 'off',
panelAgentIds: panelAgentIdsEl.value || null,
moaLayers: moaLayersEl ? (parseInt(moaLayersEl.value, 10) || 2) : 2,
context: _sessionContextMde.value().trim() || null,
workspace: workspaceEl.value.trim() || null,
customCommands: commands,