@defai.digital/discussion-domain 13.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +214 -0
- package/dist/consensus/index.d.ts +23 -0
- package/dist/consensus/index.d.ts.map +1 -0
- package/dist/consensus/index.js +45 -0
- package/dist/consensus/index.js.map +1 -0
- package/dist/consensus/moderator.d.ts +15 -0
- package/dist/consensus/moderator.d.ts.map +1 -0
- package/dist/consensus/moderator.js +201 -0
- package/dist/consensus/moderator.js.map +1 -0
- package/dist/consensus/synthesis.d.ts +15 -0
- package/dist/consensus/synthesis.d.ts.map +1 -0
- package/dist/consensus/synthesis.js +161 -0
- package/dist/consensus/synthesis.js.map +1 -0
- package/dist/consensus/voting.d.ts +17 -0
- package/dist/consensus/voting.d.ts.map +1 -0
- package/dist/consensus/voting.js +168 -0
- package/dist/consensus/voting.js.map +1 -0
- package/dist/executor.d.ts +73 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +223 -0
- package/dist/executor.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/patterns/critique.d.ts +20 -0
- package/dist/patterns/critique.d.ts.map +1 -0
- package/dist/patterns/critique.js +338 -0
- package/dist/patterns/critique.js.map +1 -0
- package/dist/patterns/debate.d.ts +20 -0
- package/dist/patterns/debate.d.ts.map +1 -0
- package/dist/patterns/debate.js +236 -0
- package/dist/patterns/debate.js.map +1 -0
- package/dist/patterns/index.d.ts +25 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +49 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/patterns/round-robin.d.ts +13 -0
- package/dist/patterns/round-robin.d.ts.map +1 -0
- package/dist/patterns/round-robin.js +160 -0
- package/dist/patterns/round-robin.js.map +1 -0
- package/dist/patterns/synthesis.d.ts +20 -0
- package/dist/patterns/synthesis.d.ts.map +1 -0
- package/dist/patterns/synthesis.js +250 -0
- package/dist/patterns/synthesis.js.map +1 -0
- package/dist/patterns/voting.d.ts +19 -0
- package/dist/patterns/voting.d.ts.map +1 -0
- package/dist/patterns/voting.js +186 -0
- package/dist/patterns/voting.js.map +1 -0
- package/dist/prompts/index.d.ts +7 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +21 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/templates.d.ts +55 -0
- package/dist/prompts/templates.d.ts.map +1 -0
- package/dist/prompts/templates.js +346 -0
- package/dist/prompts/templates.js.map +1 -0
- package/dist/provider-bridge.d.ts +115 -0
- package/dist/provider-bridge.d.ts.map +1 -0
- package/dist/provider-bridge.js +215 -0
- package/dist/provider-bridge.js.map +1 -0
- package/dist/types.d.ts +201 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +102 -0
- package/dist/types.js.map +1 -0
- package/package.json +48 -0
- package/src/consensus/index.ts +52 -0
- package/src/consensus/moderator.ts +242 -0
- package/src/consensus/synthesis.ts +202 -0
- package/src/consensus/voting.ts +221 -0
- package/src/executor.ts +338 -0
- package/src/index.ts +69 -0
- package/src/patterns/critique.ts +465 -0
- package/src/patterns/debate.ts +340 -0
- package/src/patterns/index.ts +56 -0
- package/src/patterns/round-robin.ts +223 -0
- package/src/patterns/synthesis.ts +353 -0
- package/src/patterns/voting.ts +266 -0
- package/src/prompts/index.ts +41 -0
- package/src/prompts/templates.ts +381 -0
- package/src/provider-bridge.ts +346 -0
- package/src/types.ts +375 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synthesis Consensus Executor
|
|
3
|
+
*
|
|
4
|
+
* One model synthesizes all perspectives into a unified conclusion.
|
|
5
|
+
* This is the default consensus method.
|
|
6
|
+
*/
|
|
7
|
+
import { SYNTHESIS_FINAL, interpolate, formatPreviousResponses, getProviderSystemPrompt, } from '../prompts/templates.js';
|
|
8
|
+
export class SynthesisConsensus {
|
|
9
|
+
method = 'synthesis';
|
|
10
|
+
async execute(context) {
|
|
11
|
+
const startTime = Date.now();
|
|
12
|
+
const { topic, rounds, participatingProviders, config, providerExecutor, abortSignal, onProgress } = context;
|
|
13
|
+
// Determine synthesizer (default to first participating provider or 'claude')
|
|
14
|
+
const synthesizerId = config.synthesizer ||
|
|
15
|
+
(participatingProviders.includes('claude') ? 'claude' : participatingProviders[0]) ||
|
|
16
|
+
'claude';
|
|
17
|
+
onProgress?.({
|
|
18
|
+
type: 'synthesis_start',
|
|
19
|
+
provider: synthesizerId,
|
|
20
|
+
message: `${synthesizerId} synthesizing discussion`,
|
|
21
|
+
timestamp: new Date().toISOString(),
|
|
22
|
+
});
|
|
23
|
+
// Build synthesis prompt with all round data
|
|
24
|
+
const initialPerspectives = this.formatRoundPerspectives(rounds[0]);
|
|
25
|
+
const crossDiscussion = rounds.slice(1).map((round, i) => `### Round ${i + 2}\n${this.formatRoundPerspectives(round)}`).join('\n\n');
|
|
26
|
+
const prompt = interpolate(SYNTHESIS_FINAL, {
|
|
27
|
+
topic,
|
|
28
|
+
initialPerspectives,
|
|
29
|
+
crossDiscussion: crossDiscussion || 'No cross-discussion rounds.',
|
|
30
|
+
});
|
|
31
|
+
try {
|
|
32
|
+
const result = await providerExecutor.execute({
|
|
33
|
+
providerId: synthesizerId,
|
|
34
|
+
prompt,
|
|
35
|
+
systemPrompt: getProviderSystemPrompt(synthesizerId),
|
|
36
|
+
temperature: 0.7,
|
|
37
|
+
timeoutMs: 90000, // Synthesis may take longer
|
|
38
|
+
abortSignal,
|
|
39
|
+
});
|
|
40
|
+
onProgress?.({
|
|
41
|
+
type: 'synthesis_complete',
|
|
42
|
+
provider: synthesizerId,
|
|
43
|
+
message: result.success ? 'Synthesis complete' : `Synthesis failed: ${result.error}`,
|
|
44
|
+
timestamp: new Date().toISOString(),
|
|
45
|
+
});
|
|
46
|
+
if (!result.success) {
|
|
47
|
+
return {
|
|
48
|
+
synthesis: '',
|
|
49
|
+
consensus: {
|
|
50
|
+
method: 'synthesis',
|
|
51
|
+
synthesizer: synthesizerId,
|
|
52
|
+
},
|
|
53
|
+
durationMs: Date.now() - startTime,
|
|
54
|
+
success: false,
|
|
55
|
+
error: result.error || 'Synthesis failed',
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// Extract agreement score and dissent from synthesis
|
|
59
|
+
const analysisResult = this.analyzeSynthesis(result.content || '', participatingProviders);
|
|
60
|
+
return {
|
|
61
|
+
synthesis: result.content || '',
|
|
62
|
+
consensus: {
|
|
63
|
+
method: 'synthesis',
|
|
64
|
+
synthesizer: synthesizerId,
|
|
65
|
+
agreementScore: analysisResult.agreementScore,
|
|
66
|
+
agreements: analysisResult.agreements,
|
|
67
|
+
dissent: config.includeDissent ? analysisResult.dissent : undefined,
|
|
68
|
+
},
|
|
69
|
+
durationMs: Date.now() - startTime,
|
|
70
|
+
success: true,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
75
|
+
onProgress?.({
|
|
76
|
+
type: 'synthesis_complete',
|
|
77
|
+
provider: synthesizerId,
|
|
78
|
+
message: `Synthesis error: ${errorMessage}`,
|
|
79
|
+
timestamp: new Date().toISOString(),
|
|
80
|
+
});
|
|
81
|
+
return {
|
|
82
|
+
synthesis: '',
|
|
83
|
+
consensus: {
|
|
84
|
+
method: 'synthesis',
|
|
85
|
+
synthesizer: synthesizerId,
|
|
86
|
+
},
|
|
87
|
+
durationMs: Date.now() - startTime,
|
|
88
|
+
success: false,
|
|
89
|
+
error: errorMessage,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
formatRoundPerspectives(round) {
|
|
94
|
+
if (!round?.responses) {
|
|
95
|
+
return 'No responses in this round.';
|
|
96
|
+
}
|
|
97
|
+
return formatPreviousResponses(round.responses.map(r => ({
|
|
98
|
+
provider: r.provider,
|
|
99
|
+
content: r.content,
|
|
100
|
+
role: r.role,
|
|
101
|
+
})));
|
|
102
|
+
}
|
|
103
|
+
analyzeSynthesis(synthesis, providers) {
|
|
104
|
+
const agreements = [];
|
|
105
|
+
const dissent = [];
|
|
106
|
+
// Look for agreement section
|
|
107
|
+
const agreementMatch = /areas?\s+of\s+(?:strong\s+)?agreement[:\s]*([^#]+?)(?=##|$)/is.exec(synthesis);
|
|
108
|
+
if (agreementMatch?.[1]) {
|
|
109
|
+
const agreementText = agreementMatch[1];
|
|
110
|
+
// Extract bullet points
|
|
111
|
+
const bullets = agreementText.match(/[-•*]\s*([^\n]+)/g);
|
|
112
|
+
if (bullets) {
|
|
113
|
+
agreements.push(...bullets.map(b => b.replace(/^[-•*]\s*/, '').trim()));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Look for disagreement/dissent section
|
|
117
|
+
const dissentMatch = /(?:key\s+)?disagreements?[:\s]*([^#]+?)(?=##|$)/is.exec(synthesis);
|
|
118
|
+
if (dissentMatch?.[1]) {
|
|
119
|
+
const dissentText = dissentMatch[1];
|
|
120
|
+
// Try to extract provider-specific dissent
|
|
121
|
+
for (const provider of providers) {
|
|
122
|
+
const providerPattern = new RegExp(`${provider}[:\\s]+([^\\n]+)`, 'i');
|
|
123
|
+
const match = dissentText.match(providerPattern);
|
|
124
|
+
if (match?.[1]) {
|
|
125
|
+
dissent.push({
|
|
126
|
+
provider,
|
|
127
|
+
position: match[1].trim(),
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// If no provider-specific dissent found, create general entry
|
|
132
|
+
if (dissent.length === 0 && dissentText.trim().length > 0) {
|
|
133
|
+
const bullets = dissentText.match(/[-•*]\s*([^\n]+)/g);
|
|
134
|
+
if (bullets && bullets.length > 0) {
|
|
135
|
+
dissent.push({
|
|
136
|
+
provider: 'general',
|
|
137
|
+
position: 'Areas of disagreement noted',
|
|
138
|
+
keyPoints: bullets.map(b => b.replace(/^[-•*]\s*/, '').trim()),
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Calculate agreement score based on content analysis
|
|
144
|
+
const agreementScore = this.calculateAgreementScore(synthesis, agreements.length, dissent.length);
|
|
145
|
+
return { agreementScore, agreements, dissent };
|
|
146
|
+
}
|
|
147
|
+
calculateAgreementScore(synthesis, agreementCount, dissentCount) {
|
|
148
|
+
// Base score from ratio of agreements to total points
|
|
149
|
+
const totalPoints = agreementCount + dissentCount;
|
|
150
|
+
if (totalPoints === 0) {
|
|
151
|
+
return 0.7; // Default moderate agreement
|
|
152
|
+
}
|
|
153
|
+
const ratioScore = agreementCount / totalPoints;
|
|
154
|
+
// Adjust based on sentiment indicators in text
|
|
155
|
+
const strongAgreementIndicators = (synthesis.match(/unanimous|all\s+(?:models?\s+)?agree|consensus|strong\s+agreement/gi) || []).length;
|
|
156
|
+
const disagreementIndicators = (synthesis.match(/disagree|conflict|diverge|oppose|contrary/gi) || []).length;
|
|
157
|
+
const sentimentAdjustment = (strongAgreementIndicators * 0.1) - (disagreementIndicators * 0.05);
|
|
158
|
+
return Math.max(0, Math.min(1, ratioScore + sentimentAdjustment));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=synthesis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synthesis.js","sourceRoot":"","sources":["../../src/consensus/synthesis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voting Consensus Executor
|
|
3
|
+
*
|
|
4
|
+
* Tallies votes from all providers and determines winner based on
|
|
5
|
+
* raw counts or confidence-weighted scores.
|
|
6
|
+
*/
|
|
7
|
+
import type { ConsensusExecutor, ConsensusExecutionContext, ConsensusExecutionResult } from '../types.js';
|
|
8
|
+
export declare class VotingConsensus implements ConsensusExecutor {
|
|
9
|
+
readonly method: "voting";
|
|
10
|
+
execute(context: ConsensusExecutionContext): Promise<ConsensusExecutionResult>;
|
|
11
|
+
private extractVotes;
|
|
12
|
+
private extractReasoning;
|
|
13
|
+
private tallyVotes;
|
|
14
|
+
private generateVoteSummary;
|
|
15
|
+
private generateFallbackSummary;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=voting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voting.d.ts","sourceRoot":"","sources":["../../src/consensus/voting.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAQ1G,qBAAa,eAAgB,YAAW,iBAAiB;IACvD,QAAQ,CAAC,MAAM,EAAG,QAAQ,CAAU;IAE9B,OAAO,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAwDpF,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,UAAU;YA6CJ,mBAAmB;IAgDjC,OAAO,CAAC,uBAAuB;CA4BhC"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voting Consensus Executor
|
|
3
|
+
*
|
|
4
|
+
* Tallies votes from all providers and determines winner based on
|
|
5
|
+
* raw counts or confidence-weighted scores.
|
|
6
|
+
*/
|
|
7
|
+
import { VOTING_TALLY, interpolate, formatVotes, getProviderSystemPrompt, } from '../prompts/templates.js';
|
|
8
|
+
export class VotingConsensus {
|
|
9
|
+
method = 'voting';
|
|
10
|
+
async execute(context) {
|
|
11
|
+
const startTime = Date.now();
|
|
12
|
+
const { topic, rounds, participatingProviders, config, providerExecutor, abortSignal, onProgress } = context;
|
|
13
|
+
// Extract votes from round responses
|
|
14
|
+
const votes = this.extractVotes(rounds);
|
|
15
|
+
if (votes.length === 0) {
|
|
16
|
+
return {
|
|
17
|
+
synthesis: 'No valid votes were cast.',
|
|
18
|
+
consensus: {
|
|
19
|
+
method: 'voting',
|
|
20
|
+
},
|
|
21
|
+
durationMs: Date.now() - startTime,
|
|
22
|
+
success: false,
|
|
23
|
+
error: 'No valid votes found in discussion rounds',
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
// Tally votes
|
|
27
|
+
const votingResults = this.tallyVotes(votes, config.threshold);
|
|
28
|
+
// Generate synthesis summary
|
|
29
|
+
const synthesizerId = config.synthesizer ||
|
|
30
|
+
(participatingProviders.includes('claude') ? 'claude' : participatingProviders[0]) ||
|
|
31
|
+
'claude';
|
|
32
|
+
onProgress?.({
|
|
33
|
+
type: 'synthesis_start',
|
|
34
|
+
provider: synthesizerId,
|
|
35
|
+
message: 'Generating vote summary',
|
|
36
|
+
timestamp: new Date().toISOString(),
|
|
37
|
+
});
|
|
38
|
+
const synthesis = await this.generateVoteSummary(topic, votingResults, synthesizerId, providerExecutor, abortSignal, onProgress);
|
|
39
|
+
return {
|
|
40
|
+
synthesis,
|
|
41
|
+
consensus: {
|
|
42
|
+
method: 'voting',
|
|
43
|
+
synthesizer: synthesizerId,
|
|
44
|
+
agreementScore: votingResults.unanimous ? 1.0 : votingResults.margin,
|
|
45
|
+
},
|
|
46
|
+
votingResults,
|
|
47
|
+
durationMs: Date.now() - startTime,
|
|
48
|
+
success: true,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
extractVotes(rounds) {
|
|
52
|
+
const votes = [];
|
|
53
|
+
for (const round of rounds) {
|
|
54
|
+
for (const response of round.responses) {
|
|
55
|
+
if (response.vote && response.confidence !== undefined) {
|
|
56
|
+
votes.push({
|
|
57
|
+
provider: response.provider,
|
|
58
|
+
choice: response.vote,
|
|
59
|
+
confidence: response.confidence,
|
|
60
|
+
reasoning: this.extractReasoning(response.content),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return votes;
|
|
66
|
+
}
|
|
67
|
+
extractReasoning(content) {
|
|
68
|
+
const reasoningMatch = /reasoning:\s*(.+?)(?=\n\n|$)/is.exec(content);
|
|
69
|
+
return reasoningMatch?.[1] ? reasoningMatch[1].trim() : '';
|
|
70
|
+
}
|
|
71
|
+
tallyVotes(votes, _threshold) {
|
|
72
|
+
// Count raw votes
|
|
73
|
+
const rawVotes = {};
|
|
74
|
+
const weightedVotes = {};
|
|
75
|
+
for (const vote of votes) {
|
|
76
|
+
rawVotes[vote.choice] = (rawVotes[vote.choice] || 0) + 1;
|
|
77
|
+
weightedVotes[vote.choice] = (weightedVotes[vote.choice] || 0) + vote.confidence;
|
|
78
|
+
}
|
|
79
|
+
// Determine winner (by weighted votes)
|
|
80
|
+
let winner = '';
|
|
81
|
+
let maxWeight = 0;
|
|
82
|
+
let secondMaxWeight = 0;
|
|
83
|
+
for (const [choice, weight] of Object.entries(weightedVotes)) {
|
|
84
|
+
if (weight > maxWeight) {
|
|
85
|
+
secondMaxWeight = maxWeight;
|
|
86
|
+
maxWeight = weight;
|
|
87
|
+
winner = choice;
|
|
88
|
+
}
|
|
89
|
+
else if (weight > secondMaxWeight) {
|
|
90
|
+
secondMaxWeight = weight;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Calculate total weight
|
|
94
|
+
const totalWeight = Object.values(weightedVotes).reduce((a, b) => a + b, 0);
|
|
95
|
+
// Check if unanimous
|
|
96
|
+
const uniqueChoices = new Set(votes.map(v => v.choice));
|
|
97
|
+
const unanimous = uniqueChoices.size === 1;
|
|
98
|
+
// Calculate margin
|
|
99
|
+
const margin = totalWeight > 0 ? (maxWeight - secondMaxWeight) / totalWeight : 0;
|
|
100
|
+
return {
|
|
101
|
+
winner,
|
|
102
|
+
votes: rawVotes,
|
|
103
|
+
weightedVotes,
|
|
104
|
+
voteRecords: votes,
|
|
105
|
+
unanimous,
|
|
106
|
+
margin,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
async generateVoteSummary(topic, votingResults, synthesizerId, providerExecutor, abortSignal, onProgress) {
|
|
110
|
+
// Build options list
|
|
111
|
+
const options = Object.keys(votingResults.votes);
|
|
112
|
+
// Build formatted votes
|
|
113
|
+
const formattedVotes = formatVotes(votingResults.voteRecords);
|
|
114
|
+
const prompt = interpolate(VOTING_TALLY, {
|
|
115
|
+
topic,
|
|
116
|
+
options: options.join(', '),
|
|
117
|
+
votes: formattedVotes,
|
|
118
|
+
});
|
|
119
|
+
try {
|
|
120
|
+
const result = await providerExecutor.execute({
|
|
121
|
+
providerId: synthesizerId,
|
|
122
|
+
prompt,
|
|
123
|
+
systemPrompt: getProviderSystemPrompt(synthesizerId),
|
|
124
|
+
temperature: 0.5,
|
|
125
|
+
timeoutMs: 60000,
|
|
126
|
+
abortSignal,
|
|
127
|
+
});
|
|
128
|
+
onProgress?.({
|
|
129
|
+
type: 'synthesis_complete',
|
|
130
|
+
provider: synthesizerId,
|
|
131
|
+
timestamp: new Date().toISOString(),
|
|
132
|
+
});
|
|
133
|
+
if (result.success && result.content) {
|
|
134
|
+
return result.content;
|
|
135
|
+
}
|
|
136
|
+
// Fallback to generated summary
|
|
137
|
+
return this.generateFallbackSummary(votingResults);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return this.generateFallbackSummary(votingResults);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
generateFallbackSummary(votingResults) {
|
|
144
|
+
const { winner, votes, weightedVotes, unanimous, margin, voteRecords } = votingResults;
|
|
145
|
+
let summary = `## Voting Results\n\n`;
|
|
146
|
+
summary += `**Winner**: ${winner}\n\n`;
|
|
147
|
+
if (unanimous) {
|
|
148
|
+
summary += `The vote was **unanimous** - all providers agreed on ${winner}.\n\n`;
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
summary += `**Margin of victory**: ${(margin * 100).toFixed(1)}%\n\n`;
|
|
152
|
+
}
|
|
153
|
+
summary += `### Vote Breakdown\n\n`;
|
|
154
|
+
for (const [choice, count] of Object.entries(votes)) {
|
|
155
|
+
const weight = weightedVotes[choice] || 0;
|
|
156
|
+
summary += `- **${choice}**: ${count} vote(s), weighted score: ${weight.toFixed(2)}\n`;
|
|
157
|
+
}
|
|
158
|
+
summary += `\n### Individual Votes\n\n`;
|
|
159
|
+
for (const record of voteRecords) {
|
|
160
|
+
summary += `- **${record.provider}**: ${record.choice} (${(record.confidence * 100).toFixed(0)}% confidence)\n`;
|
|
161
|
+
if (record.reasoning) {
|
|
162
|
+
summary += ` - Reasoning: ${record.reasoning}\n`;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return summary;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=voting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voting.js","sourceRoot":"","sources":["../../src/consensus/voting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discussion Executor
|
|
3
|
+
*
|
|
4
|
+
* Main orchestrator for multi-model discussions.
|
|
5
|
+
* Coordinates pattern execution, consensus mechanisms, and result assembly.
|
|
6
|
+
*
|
|
7
|
+
* Invariants enforced:
|
|
8
|
+
* - INV-DISC-100: Provider availability check before starting
|
|
9
|
+
* - INV-DISC-101: Minimum participating providers enforced
|
|
10
|
+
* - INV-DISC-102: Provider timeouts enforced
|
|
11
|
+
* - INV-DISC-009: Result always contains synthesis
|
|
12
|
+
*/
|
|
13
|
+
import { type DiscussStepConfig, type DiscussionResult, type DiscussionRequest } from '@defai.digital/contracts';
|
|
14
|
+
import type { DiscussionProviderExecutor, DiscussionExecutorOptions, DiscussionProgressEvent } from './types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Main discussion executor class.
|
|
17
|
+
*
|
|
18
|
+
* Orchestrates multi-model discussions across different patterns and consensus mechanisms.
|
|
19
|
+
*/
|
|
20
|
+
export declare class DiscussionExecutor {
|
|
21
|
+
private readonly providerExecutor;
|
|
22
|
+
private readonly defaultTimeoutMs;
|
|
23
|
+
private readonly checkProviderHealth;
|
|
24
|
+
private readonly traceId;
|
|
25
|
+
constructor(options: DiscussionExecutorOptions);
|
|
26
|
+
/**
|
|
27
|
+
* Execute a discussion from a DiscussionRequest (CLI/MCP input format)
|
|
28
|
+
*/
|
|
29
|
+
executeRequest(request: DiscussionRequest, options?: {
|
|
30
|
+
abortSignal?: AbortSignal;
|
|
31
|
+
onProgress?: (event: DiscussionProgressEvent) => void;
|
|
32
|
+
}): Promise<DiscussionResult>;
|
|
33
|
+
/**
|
|
34
|
+
* Execute a discussion with full configuration
|
|
35
|
+
*/
|
|
36
|
+
execute(config: DiscussStepConfig, options?: {
|
|
37
|
+
abortSignal?: AbortSignal;
|
|
38
|
+
onProgress?: (event: DiscussionProgressEvent) => void;
|
|
39
|
+
}): Promise<DiscussionResult>;
|
|
40
|
+
/**
|
|
41
|
+
* Check provider availability (INV-DISC-100)
|
|
42
|
+
*/
|
|
43
|
+
private checkProviders;
|
|
44
|
+
/**
|
|
45
|
+
* Create a quick synthesis discussion (2 rounds, default providers)
|
|
46
|
+
*/
|
|
47
|
+
quickSynthesis(topic: string, options?: {
|
|
48
|
+
providers?: string[];
|
|
49
|
+
abortSignal?: AbortSignal;
|
|
50
|
+
onProgress?: (event: DiscussionProgressEvent) => void;
|
|
51
|
+
}): Promise<DiscussionResult>;
|
|
52
|
+
/**
|
|
53
|
+
* Create a debate discussion
|
|
54
|
+
*/
|
|
55
|
+
debate(topic: string, proponent?: string, opponent?: string, judge?: string, options?: {
|
|
56
|
+
rounds?: number;
|
|
57
|
+
abortSignal?: AbortSignal;
|
|
58
|
+
onProgress?: (event: DiscussionProgressEvent) => void;
|
|
59
|
+
}): Promise<DiscussionResult>;
|
|
60
|
+
/**
|
|
61
|
+
* Create a voting discussion
|
|
62
|
+
*/
|
|
63
|
+
vote(question: string, voteOptions: string[], options?: {
|
|
64
|
+
providers?: string[];
|
|
65
|
+
abortSignal?: AbortSignal;
|
|
66
|
+
onProgress?: (event: DiscussionProgressEvent) => void;
|
|
67
|
+
}): Promise<DiscussionResult>;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Create a discussion executor with default options
|
|
71
|
+
*/
|
|
72
|
+
export declare function createDiscussionExecutor(providerExecutor: DiscussionProviderExecutor, options?: Partial<Omit<DiscussionExecutorOptions, 'providerExecutor'>>): DiscussionExecutor;
|
|
73
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACvB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EACV,0BAA0B,EAC1B,yBAAyB,EAEzB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAIpB;;;;GAIG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAC9D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAU;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;gBAEjC,OAAO,EAAE,yBAAyB;IAO9C;;OAEG;IACG,cAAc,CAClB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,CAAC,EAAE;QACR,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAC;KACvD,GACA,OAAO,CAAC,gBAAgB,CAAC;IAwB5B;;OAEG;IACG,OAAO,CACX,MAAM,EAAE,iBAAiB,EACzB,OAAO,CAAC,EAAE;QACR,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAC;KACvD,GACA,OAAO,CAAC,gBAAgB,CAAC;IAgH5B;;OAEG;YACW,cAAc;IAuB5B;;OAEG;IACG,cAAc,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAC;KACvD,GACA,OAAO,CAAC,gBAAgB,CAAC;IAY5B;;OAEG;IACG,MAAM,CACV,KAAK,EAAE,MAAM,EACb,SAAS,SAAW,EACpB,QAAQ,SAAQ,EAChB,KAAK,SAAW,EAChB,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAC;KACvD,GACA,OAAO,CAAC,gBAAgB,CAAC;IA2B5B;;OAEG;IACG,IAAI,CACR,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAC;KACvD,GACA,OAAO,CAAC,gBAAgB,CAAC;CAsB7B;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,gBAAgB,EAAE,0BAA0B,EAC5C,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE,kBAAkB,CAAC,CAAC,GACrE,kBAAkB,CAKpB"}
|