feat(wevia-agent): wave 313 CONSENSUS mode multi-IA vote
- /api/wevia-agent-exec.php v3: STEP 1.5 consensus query N IA souveraines
- Default models: cerebras-fast, groq, gemini, mistral, cloudflare-ai
- Each IA returns JSON {vote:approve|reject|modify, confidence, concerns, suggested_changes, rationale}
- Vote tally: approve|reject|modify, decision: approved/rejected_by_majority/modify_recommended/no_quorum
- If modify_recommended: WEVIA revise plan auto avec suggestions agregees
- If rejected_by_majority OR no_quorum: ABORT + raisons
- /wevia-agent.html: checkbox consensus + SSE handlers consensus_query/consensus_response/consensus_decision/plan_revised/aborted
- TEST PASS: dry_run cerebras+groq -> modify_recommended (find > ls), plan_revised integrated suggestion
Doctrine 313: avant exec critique, WEVIA consulte N IA, vote majoritaire, abort si reject ou no_quorum, revise auto si modify. Zero cost (sovereign API).
This commit is contained in:
@@ -322,6 +322,26 @@ async function executeTask() {
|
||||
addEvent('summary', data, {provider: data.provider});
|
||||
} else if (eventType === 'done') {
|
||||
addEvent('done', data);
|
||||
} else if (eventType === 'consensus_query') {
|
||||
pendingThinking = addEvent('thinking', '🗳 Vote ' + data.model + '...');
|
||||
} else if (eventType === 'consensus_response') {
|
||||
const voteIcon = data.vote === 'approve' ? '✅' : (data.vote === 'reject' ? '❌' : (data.vote === 'modify' ? '✏️' : '⚠️'));
|
||||
const ev = document.createElement('div');
|
||||
ev.className = 'event plan';
|
||||
ev.innerHTML = '<div class="event-header"><span class="event-icon">' + voteIcon + '</span><span>Vote ' + data.model + '</span><span class="badge">' + (data.provider || '?') + '</span><span style="margin-left:auto;color:var(--gold)">conf ' + (data.confidence||'?') + '/10</span></div>' +
|
||||
'<div style="font-weight:700;color:var(--violet);margin-bottom:6px">' + data.vote.toUpperCase() + '</div>' +
|
||||
(data.rationale ? '<div style="font-size:11px;color:var(--ink-dim);margin-bottom:6px">' + escapeHtml(data.rationale) + '</div>' : '') +
|
||||
(data.concerns && data.concerns.length ? '<div style="font-size:11px;color:var(--coral);margin-top:6px">⚠ ' + data.concerns.map(escapeHtml).join('<br>⚠ ') + '</div>' : '') +
|
||||
(data.suggested_changes && data.suggested_changes.length ? '<div style="font-size:10px;color:var(--cyan);margin-top:6px;font-family:var(--font-mono)">↻ ' + data.suggested_changes.map(escapeHtml).join('<br>↻ ') + '</div>' : '');
|
||||
transcript.appendChild(ev);
|
||||
transcript.scrollTop = transcript.scrollHeight;
|
||||
} else if (eventType === 'consensus_decision') {
|
||||
const decisionIcon = data.decision === 'approved' ? '✅' : (data.decision === 'rejected_by_majority' ? '❌' : (data.decision === 'modify_recommended' ? '✏️' : '⚠️'));
|
||||
addEvent('summary', {content: decisionIcon + ' DÉCISION CONSENSUS: ' + data.decision.toUpperCase() + '\n\nVotes: approve=' + data.tally.approve + ' · reject=' + data.tally.reject + ' · modify=' + data.tally.modify + ' / ' + data.tally.total + '\n\n' + (data.concerns_aggregated.length ? 'Concerns:\n• ' + data.concerns_aggregated.join('\n• ') + '\n\n' : '') + (data.suggestions_aggregated.length ? 'Suggestions intégrées:\n• ' + data.suggestions_aggregated.join('\n• ') : '')});
|
||||
} else if (eventType === 'plan_revised') {
|
||||
addEvent('plan', data, {provider: 'WEVIA-revised'});
|
||||
} else if (eventType === 'aborted') {
|
||||
addEvent('error', {msg: '🛑 ABORTED: ' + data.reason + '\n\nConcerns: ' + (data.concerns||[]).join(' · ')});
|
||||
} else if (eventType === 'error') {
|
||||
addEvent('error', data);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user