@agent-relay/daemon 0.1.0

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.
Files changed (109) hide show
  1. package/dist/agent-manager.d.ts +134 -0
  2. package/dist/agent-manager.d.ts.map +1 -0
  3. package/dist/agent-manager.js +578 -0
  4. package/dist/agent-manager.js.map +1 -0
  5. package/dist/agent-registry.d.ts +99 -0
  6. package/dist/agent-registry.d.ts.map +1 -0
  7. package/dist/agent-registry.js +213 -0
  8. package/dist/agent-registry.js.map +1 -0
  9. package/dist/agent-signing.d.ts +158 -0
  10. package/dist/agent-signing.d.ts.map +1 -0
  11. package/dist/agent-signing.js +523 -0
  12. package/dist/agent-signing.js.map +1 -0
  13. package/dist/api.d.ts +106 -0
  14. package/dist/api.d.ts.map +1 -0
  15. package/dist/api.js +876 -0
  16. package/dist/api.js.map +1 -0
  17. package/dist/auth.d.ts +94 -0
  18. package/dist/auth.d.ts.map +1 -0
  19. package/dist/auth.js +197 -0
  20. package/dist/auth.js.map +1 -0
  21. package/dist/channel-membership-store.d.ts +55 -0
  22. package/dist/channel-membership-store.d.ts.map +1 -0
  23. package/dist/channel-membership-store.js +176 -0
  24. package/dist/channel-membership-store.js.map +1 -0
  25. package/dist/cli-auth.d.ts +89 -0
  26. package/dist/cli-auth.d.ts.map +1 -0
  27. package/dist/cli-auth.js +792 -0
  28. package/dist/cli-auth.js.map +1 -0
  29. package/dist/cloud-sync.d.ts +150 -0
  30. package/dist/cloud-sync.d.ts.map +1 -0
  31. package/dist/cloud-sync.js +446 -0
  32. package/dist/cloud-sync.js.map +1 -0
  33. package/dist/connection.d.ts +130 -0
  34. package/dist/connection.d.ts.map +1 -0
  35. package/dist/connection.js +438 -0
  36. package/dist/connection.js.map +1 -0
  37. package/dist/consensus-integration.d.ts +167 -0
  38. package/dist/consensus-integration.d.ts.map +1 -0
  39. package/dist/consensus-integration.js +371 -0
  40. package/dist/consensus-integration.js.map +1 -0
  41. package/dist/consensus.d.ts +271 -0
  42. package/dist/consensus.d.ts.map +1 -0
  43. package/dist/consensus.js +632 -0
  44. package/dist/consensus.js.map +1 -0
  45. package/dist/delivery-tracker.d.ts +34 -0
  46. package/dist/delivery-tracker.d.ts.map +1 -0
  47. package/dist/delivery-tracker.js +104 -0
  48. package/dist/delivery-tracker.js.map +1 -0
  49. package/dist/enhanced-features.d.ts +118 -0
  50. package/dist/enhanced-features.d.ts.map +1 -0
  51. package/dist/enhanced-features.js +176 -0
  52. package/dist/enhanced-features.js.map +1 -0
  53. package/dist/index.d.ts +31 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +37 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/migrations/index.d.ts +73 -0
  58. package/dist/migrations/index.d.ts.map +1 -0
  59. package/dist/migrations/index.js +241 -0
  60. package/dist/migrations/index.js.map +1 -0
  61. package/dist/orchestrator.d.ts +217 -0
  62. package/dist/orchestrator.d.ts.map +1 -0
  63. package/dist/orchestrator.js +1143 -0
  64. package/dist/orchestrator.js.map +1 -0
  65. package/dist/rate-limiter.d.ts +68 -0
  66. package/dist/rate-limiter.d.ts.map +1 -0
  67. package/dist/rate-limiter.js +130 -0
  68. package/dist/rate-limiter.js.map +1 -0
  69. package/dist/registry.d.ts +9 -0
  70. package/dist/registry.d.ts.map +1 -0
  71. package/dist/registry.js +9 -0
  72. package/dist/registry.js.map +1 -0
  73. package/dist/relay-ledger.d.ts +261 -0
  74. package/dist/relay-ledger.d.ts.map +1 -0
  75. package/dist/relay-ledger.js +532 -0
  76. package/dist/relay-ledger.js.map +1 -0
  77. package/dist/relay-watchdog.d.ts +125 -0
  78. package/dist/relay-watchdog.d.ts.map +1 -0
  79. package/dist/relay-watchdog.js +611 -0
  80. package/dist/relay-watchdog.js.map +1 -0
  81. package/dist/repo-manager.d.ts +116 -0
  82. package/dist/repo-manager.d.ts.map +1 -0
  83. package/dist/repo-manager.js +384 -0
  84. package/dist/repo-manager.js.map +1 -0
  85. package/dist/router.d.ts +370 -0
  86. package/dist/router.d.ts.map +1 -0
  87. package/dist/router.js +1437 -0
  88. package/dist/router.js.map +1 -0
  89. package/dist/server.d.ts +174 -0
  90. package/dist/server.d.ts.map +1 -0
  91. package/dist/server.js +1001 -0
  92. package/dist/server.js.map +1 -0
  93. package/dist/spawn-manager.d.ts +78 -0
  94. package/dist/spawn-manager.d.ts.map +1 -0
  95. package/dist/spawn-manager.js +165 -0
  96. package/dist/spawn-manager.js.map +1 -0
  97. package/dist/sync-queue.d.ts +116 -0
  98. package/dist/sync-queue.d.ts.map +1 -0
  99. package/dist/sync-queue.js +361 -0
  100. package/dist/sync-queue.js.map +1 -0
  101. package/dist/types.d.ts +133 -0
  102. package/dist/types.d.ts.map +1 -0
  103. package/dist/types.js +6 -0
  104. package/dist/types.js.map +1 -0
  105. package/dist/workspace-manager.d.ts +80 -0
  106. package/dist/workspace-manager.d.ts.map +1 -0
  107. package/dist/workspace-manager.js +314 -0
  108. package/dist/workspace-manager.js.map +1 -0
  109. package/package.json +52 -0
@@ -0,0 +1,632 @@
1
+ /**
2
+ * Agent Consensus Mechanism
3
+ *
4
+ * Enables distributed decision-making across multiple agents.
5
+ * Inspired by russian-code-ts roadmap: "Consensus-based decision making"
6
+ *
7
+ * Consensus Types:
8
+ * 1. Majority Vote - Simple >50% agreement
9
+ * 2. Supermajority - 2/3 or configurable threshold
10
+ * 3. Unanimous - All participants must agree
11
+ * 4. Weighted - Votes weighted by agent role/expertise
12
+ * 5. Quorum - Minimum participation required
13
+ *
14
+ * Use Cases:
15
+ * - Code review approval (2+ agents approve)
16
+ * - Architecture decisions (lead + majority)
17
+ * - Deployment gates (all critical agents agree)
18
+ * - Task assignment (weighted by expertise)
19
+ */
20
+ import { randomUUID } from 'node:crypto';
21
+ import { EventEmitter } from 'node:events';
22
+ // =============================================================================
23
+ // Default Configuration
24
+ // =============================================================================
25
+ const DEFAULT_CONFIG = {
26
+ defaultTimeoutMs: 5 * 60 * 1000, // 5 minutes
27
+ defaultConsensusType: 'majority',
28
+ defaultThreshold: 0.67, // 2/3 for supermajority
29
+ allowVoteChange: true,
30
+ autoResolve: true,
31
+ broadcastProposals: true,
32
+ };
33
+ // =============================================================================
34
+ // Consensus Engine
35
+ // =============================================================================
36
+ export class ConsensusEngine extends EventEmitter {
37
+ config;
38
+ proposals = new Map();
39
+ expiryTimers = new Map();
40
+ constructor(config = {}) {
41
+ super();
42
+ this.config = { ...DEFAULT_CONFIG, ...config };
43
+ }
44
+ // ===========================================================================
45
+ // Proposal Management
46
+ // ===========================================================================
47
+ /**
48
+ * Create a new proposal.
49
+ */
50
+ createProposal(options) {
51
+ const id = `prop_${Date.now()}_${randomUUID().substring(0, 8)}`;
52
+ const now = Date.now();
53
+ const timeoutMs = options.timeoutMs ?? this.config.defaultTimeoutMs;
54
+ const proposal = {
55
+ id,
56
+ title: options.title,
57
+ description: options.description,
58
+ proposer: options.proposer,
59
+ consensusType: options.consensusType ?? this.config.defaultConsensusType,
60
+ participants: options.participants,
61
+ quorum: options.quorum,
62
+ threshold: options.threshold ?? this.config.defaultThreshold,
63
+ weights: options.weights,
64
+ createdAt: now,
65
+ expiresAt: now + timeoutMs,
66
+ status: 'pending',
67
+ votes: [],
68
+ metadata: options.metadata,
69
+ thread: options.thread ?? `consensus-${id}`,
70
+ };
71
+ this.proposals.set(id, proposal);
72
+ this.scheduleExpiry(proposal);
73
+ this.emit('proposal:created', proposal);
74
+ return proposal;
75
+ }
76
+ /**
77
+ * Submit a vote on a proposal.
78
+ */
79
+ vote(proposalId, agent, value, reason) {
80
+ const proposal = this.proposals.get(proposalId);
81
+ if (!proposal) {
82
+ return { success: false, error: 'Proposal not found' };
83
+ }
84
+ if (proposal.status !== 'pending') {
85
+ return { success: false, error: `Proposal is ${proposal.status}` };
86
+ }
87
+ if (!proposal.participants.includes(agent)) {
88
+ return { success: false, error: 'Agent not a participant' };
89
+ }
90
+ if (Date.now() > proposal.expiresAt) {
91
+ this.expireProposal(proposal);
92
+ return { success: false, error: 'Proposal has expired' };
93
+ }
94
+ // Check for existing vote
95
+ const existingVoteIndex = proposal.votes.findIndex(v => v.agent === agent);
96
+ if (existingVoteIndex >= 0) {
97
+ if (!this.config.allowVoteChange) {
98
+ return { success: false, error: 'Vote already cast and changes not allowed' };
99
+ }
100
+ // Remove existing vote
101
+ proposal.votes.splice(existingVoteIndex, 1);
102
+ }
103
+ // Determine vote weight
104
+ const weight = this.getAgentWeight(proposal, agent);
105
+ const vote = {
106
+ agent,
107
+ value,
108
+ weight,
109
+ reason,
110
+ timestamp: Date.now(),
111
+ };
112
+ proposal.votes.push(vote);
113
+ this.emit('proposal:voted', proposal, vote);
114
+ // Check for auto-resolution
115
+ if (this.config.autoResolve) {
116
+ const result = this.calculateResult(proposal);
117
+ if (this.canResolveEarly(proposal, result)) {
118
+ this.resolveProposal(proposal, result);
119
+ }
120
+ }
121
+ return { success: true, proposal };
122
+ }
123
+ /**
124
+ * Get a proposal by ID.
125
+ */
126
+ getProposal(proposalId) {
127
+ return this.proposals.get(proposalId) ?? null;
128
+ }
129
+ /**
130
+ * Get all proposals for an agent (as participant or proposer).
131
+ */
132
+ getProposalsForAgent(agent) {
133
+ const results = [];
134
+ for (const proposal of this.proposals.values()) {
135
+ if (proposal.proposer === agent || proposal.participants.includes(agent)) {
136
+ results.push(proposal);
137
+ }
138
+ }
139
+ return results;
140
+ }
141
+ /**
142
+ * Get pending proposals awaiting an agent's vote.
143
+ */
144
+ getPendingVotesForAgent(agent) {
145
+ const results = [];
146
+ for (const proposal of this.proposals.values()) {
147
+ if (proposal.status !== 'pending')
148
+ continue;
149
+ if (!proposal.participants.includes(agent))
150
+ continue;
151
+ if (proposal.votes.some(v => v.agent === agent))
152
+ continue;
153
+ results.push(proposal);
154
+ }
155
+ return results;
156
+ }
157
+ /**
158
+ * Cancel a proposal (only proposer can cancel).
159
+ */
160
+ cancelProposal(proposalId, agent) {
161
+ const proposal = this.proposals.get(proposalId);
162
+ if (!proposal) {
163
+ return { success: false, error: 'Proposal not found' };
164
+ }
165
+ if (proposal.proposer !== agent) {
166
+ return { success: false, error: 'Only proposer can cancel' };
167
+ }
168
+ if (proposal.status !== 'pending') {
169
+ return { success: false, error: `Proposal is ${proposal.status}` };
170
+ }
171
+ proposal.status = 'cancelled';
172
+ this.clearExpiryTimer(proposalId);
173
+ this.emit('proposal:cancelled', proposal);
174
+ return { success: true };
175
+ }
176
+ /**
177
+ * Force resolve a proposal (for admin/system use).
178
+ */
179
+ forceResolve(proposalId) {
180
+ const proposal = this.proposals.get(proposalId);
181
+ if (!proposal || proposal.status !== 'pending')
182
+ return null;
183
+ const result = this.calculateResult(proposal);
184
+ this.resolveProposal(proposal, result);
185
+ return result;
186
+ }
187
+ // ===========================================================================
188
+ // Consensus Calculation
189
+ // ===========================================================================
190
+ /**
191
+ * Calculate current consensus result.
192
+ */
193
+ calculateResult(proposal) {
194
+ let approveWeight = 0;
195
+ let rejectWeight = 0;
196
+ let abstainWeight = 0;
197
+ for (const vote of proposal.votes) {
198
+ switch (vote.value) {
199
+ case 'approve':
200
+ approveWeight += vote.weight;
201
+ break;
202
+ case 'reject':
203
+ rejectWeight += vote.weight;
204
+ break;
205
+ case 'abstain':
206
+ abstainWeight += vote.weight;
207
+ break;
208
+ }
209
+ }
210
+ const totalWeight = this.getTotalWeight(proposal);
211
+ const votedWeight = approveWeight + rejectWeight + abstainWeight;
212
+ const participation = totalWeight > 0 ? votedWeight / totalWeight : 0;
213
+ const voters = new Set(proposal.votes.map(v => v.agent));
214
+ const nonVoters = proposal.participants.filter(p => !voters.has(p));
215
+ // Check quorum
216
+ const quorumRequired = proposal.quorum ?? Math.ceil(proposal.participants.length / 2);
217
+ const quorumMet = proposal.votes.length >= quorumRequired;
218
+ // Determine decision based on consensus type
219
+ const decision = this.determineDecision(proposal, {
220
+ approveWeight,
221
+ rejectWeight,
222
+ abstainWeight,
223
+ totalWeight,
224
+ votedWeight,
225
+ quorumMet,
226
+ });
227
+ return {
228
+ decision,
229
+ approveWeight,
230
+ rejectWeight,
231
+ abstainWeight,
232
+ participation,
233
+ quorumMet,
234
+ resolvedAt: Date.now(),
235
+ nonVoters,
236
+ };
237
+ }
238
+ /**
239
+ * Determine decision based on consensus type and votes.
240
+ */
241
+ determineDecision(proposal, counts) {
242
+ const { approveWeight, rejectWeight, votedWeight, quorumMet } = counts;
243
+ switch (proposal.consensusType) {
244
+ case 'unanimous': {
245
+ // All participants must approve - any reject makes it impossible
246
+ const hasReject = proposal.votes.some(v => v.value === 'reject');
247
+ if (hasReject)
248
+ return 'rejected';
249
+ if (proposal.votes.length < proposal.participants.length) {
250
+ return 'no_consensus';
251
+ }
252
+ const allApprove = proposal.votes.every(v => v.value === 'approve');
253
+ return allApprove ? 'approved' : 'rejected';
254
+ }
255
+ case 'supermajority': {
256
+ const threshold = proposal.threshold ?? this.config.defaultThreshold;
257
+ if (votedWeight === 0)
258
+ return 'no_consensus';
259
+ const approveRatio = approveWeight / votedWeight;
260
+ if (approveRatio >= threshold)
261
+ return 'approved';
262
+ const rejectRatio = rejectWeight / votedWeight;
263
+ if (rejectRatio > (1 - threshold))
264
+ return 'rejected';
265
+ return 'no_consensus';
266
+ }
267
+ case 'quorum': {
268
+ if (!quorumMet)
269
+ return 'no_consensus';
270
+ // Fall through to majority
271
+ }
272
+ // eslint-disable-next-line no-fallthrough
273
+ case 'majority': {
274
+ if (votedWeight === 0)
275
+ return 'no_consensus';
276
+ if (approveWeight > rejectWeight)
277
+ return 'approved';
278
+ if (rejectWeight > approveWeight)
279
+ return 'rejected';
280
+ return 'no_consensus'; // Tie
281
+ }
282
+ case 'weighted': {
283
+ // Same as majority but weights are already applied
284
+ if (votedWeight === 0)
285
+ return 'no_consensus';
286
+ if (approveWeight > rejectWeight)
287
+ return 'approved';
288
+ if (rejectWeight > approveWeight)
289
+ return 'rejected';
290
+ return 'no_consensus';
291
+ }
292
+ default:
293
+ return 'no_consensus';
294
+ }
295
+ }
296
+ /**
297
+ * Check if proposal can be resolved early (consensus mathematically certain).
298
+ */
299
+ canResolveEarly(proposal, result) {
300
+ const totalWeight = this.getTotalWeight(proposal);
301
+ const remainingWeight = totalWeight - (result.approveWeight + result.rejectWeight + result.abstainWeight);
302
+ switch (proposal.consensusType) {
303
+ case 'unanimous':
304
+ // Can resolve early if anyone rejects
305
+ return proposal.votes.some(v => v.value === 'reject') ||
306
+ proposal.votes.length === proposal.participants.length;
307
+ case 'supermajority': {
308
+ const threshold = proposal.threshold ?? this.config.defaultThreshold;
309
+ const votedWeight = result.approveWeight + result.rejectWeight + result.abstainWeight;
310
+ // Approved if approve ratio already exceeds threshold
311
+ if (votedWeight > 0 && result.approveWeight / votedWeight >= threshold) {
312
+ // Check if remaining votes can't change outcome
313
+ return (result.approveWeight / (votedWeight + remainingWeight)) >= threshold;
314
+ }
315
+ // Rejected if reject ratio exceeds (1 - threshold)
316
+ if (votedWeight > 0 && result.rejectWeight / votedWeight > (1 - threshold)) {
317
+ return true;
318
+ }
319
+ return false;
320
+ }
321
+ case 'majority':
322
+ case 'weighted':
323
+ // Can resolve if one side has >50% of total weight
324
+ return result.approveWeight > totalWeight / 2 ||
325
+ result.rejectWeight > totalWeight / 2;
326
+ case 'quorum':
327
+ // Need quorum first
328
+ if (!result.quorumMet)
329
+ return false;
330
+ // Then same as majority
331
+ return result.approveWeight > totalWeight / 2 ||
332
+ result.rejectWeight > totalWeight / 2;
333
+ default:
334
+ return false;
335
+ }
336
+ }
337
+ // ===========================================================================
338
+ // Weight Management
339
+ // ===========================================================================
340
+ /**
341
+ * Get weight for an agent in a proposal.
342
+ */
343
+ getAgentWeight(proposal, agent) {
344
+ if (proposal.weights) {
345
+ const weightConfig = proposal.weights.find(w => w.agent === agent);
346
+ if (weightConfig)
347
+ return weightConfig.weight;
348
+ }
349
+ return 1; // Default weight
350
+ }
351
+ /**
352
+ * Get total weight of all participants.
353
+ */
354
+ getTotalWeight(proposal) {
355
+ let total = 0;
356
+ for (const participant of proposal.participants) {
357
+ total += this.getAgentWeight(proposal, participant);
358
+ }
359
+ return total;
360
+ }
361
+ // ===========================================================================
362
+ // Lifecycle Management
363
+ // ===========================================================================
364
+ /**
365
+ * Resolve a proposal with result.
366
+ */
367
+ resolveProposal(proposal, result) {
368
+ proposal.status = result.decision === 'approved' ? 'approved' :
369
+ result.decision === 'rejected' ? 'rejected' : 'expired';
370
+ proposal.result = result;
371
+ this.clearExpiryTimer(proposal.id);
372
+ this.emit('proposal:resolved', proposal, result);
373
+ }
374
+ /**
375
+ * Expire a proposal.
376
+ */
377
+ expireProposal(proposal) {
378
+ if (proposal.status !== 'pending')
379
+ return;
380
+ const result = this.calculateResult(proposal);
381
+ proposal.status = 'expired';
382
+ proposal.result = result;
383
+ this.clearExpiryTimer(proposal.id);
384
+ this.emit('proposal:expired', proposal);
385
+ }
386
+ /**
387
+ * Schedule expiry timer for a proposal.
388
+ */
389
+ scheduleExpiry(proposal) {
390
+ const timeoutMs = proposal.expiresAt - Date.now();
391
+ if (timeoutMs <= 0) {
392
+ this.expireProposal(proposal);
393
+ return;
394
+ }
395
+ const timer = setTimeout(() => {
396
+ this.expireProposal(proposal);
397
+ }, timeoutMs);
398
+ timer.unref(); // Don't prevent process exit
399
+ this.expiryTimers.set(proposal.id, timer);
400
+ }
401
+ /**
402
+ * Clear expiry timer for a proposal.
403
+ */
404
+ clearExpiryTimer(proposalId) {
405
+ const timer = this.expiryTimers.get(proposalId);
406
+ if (timer) {
407
+ clearTimeout(timer);
408
+ this.expiryTimers.delete(proposalId);
409
+ }
410
+ }
411
+ /**
412
+ * Cleanup all timers (for shutdown).
413
+ */
414
+ cleanup() {
415
+ for (const timer of this.expiryTimers.values()) {
416
+ clearTimeout(timer);
417
+ }
418
+ this.expiryTimers.clear();
419
+ }
420
+ // ===========================================================================
421
+ // Statistics
422
+ // ===========================================================================
423
+ /**
424
+ * Get consensus statistics.
425
+ */
426
+ getStats() {
427
+ let pending = 0, approved = 0, rejected = 0, expired = 0, cancelled = 0;
428
+ let totalParticipation = 0;
429
+ let resolvedCount = 0;
430
+ for (const proposal of this.proposals.values()) {
431
+ switch (proposal.status) {
432
+ case 'pending':
433
+ pending++;
434
+ break;
435
+ case 'approved':
436
+ approved++;
437
+ break;
438
+ case 'rejected':
439
+ rejected++;
440
+ break;
441
+ case 'expired':
442
+ expired++;
443
+ break;
444
+ case 'cancelled':
445
+ cancelled++;
446
+ break;
447
+ }
448
+ if (proposal.result) {
449
+ totalParticipation += proposal.result.participation;
450
+ resolvedCount++;
451
+ }
452
+ }
453
+ return {
454
+ total: this.proposals.size,
455
+ pending,
456
+ approved,
457
+ rejected,
458
+ expired,
459
+ cancelled,
460
+ avgParticipation: resolvedCount > 0 ? totalParticipation / resolvedCount : 0,
461
+ };
462
+ }
463
+ }
464
+ // =============================================================================
465
+ // Factory Function
466
+ // =============================================================================
467
+ /**
468
+ * Create a consensus engine with the given configuration.
469
+ */
470
+ export function createConsensusEngine(config) {
471
+ return new ConsensusEngine(config);
472
+ }
473
+ // =============================================================================
474
+ // Relay Integration Helpers
475
+ // =============================================================================
476
+ /**
477
+ * Format a proposal as a relay message for broadcasting.
478
+ */
479
+ export function formatProposalMessage(proposal) {
480
+ const lines = [
481
+ `📋 **PROPOSAL: ${proposal.title}**`,
482
+ `ID: ${proposal.id}`,
483
+ `From: ${proposal.proposer}`,
484
+ `Type: ${proposal.consensusType}`,
485
+ `Expires: ${new Date(proposal.expiresAt).toISOString()}`,
486
+ '',
487
+ proposal.description,
488
+ '',
489
+ `Participants: ${proposal.participants.join(', ')}`,
490
+ '',
491
+ 'Reply with: VOTE <proposal-id> <approve|reject|abstain> [reason]',
492
+ ];
493
+ return lines.join('\n');
494
+ }
495
+ /**
496
+ * Parse a vote command from a relay message.
497
+ */
498
+ export function parseVoteCommand(message) {
499
+ const match = message.match(/^VOTE\s+(\S+)\s+(approve|reject|abstain)(?:\s+(.+))?$/i);
500
+ if (!match)
501
+ return null;
502
+ return {
503
+ proposalId: match[1],
504
+ value: match[2].toLowerCase(),
505
+ reason: match[3]?.trim(),
506
+ };
507
+ }
508
+ /**
509
+ * Format a consensus result as a relay message.
510
+ */
511
+ export function formatResultMessage(proposal, result) {
512
+ const statusEmoji = result.decision === 'approved' ? '✅' :
513
+ result.decision === 'rejected' ? '❌' : '⏳';
514
+ const lines = [
515
+ `${statusEmoji} **CONSENSUS RESULT: ${proposal.title}**`,
516
+ `Decision: ${result.decision.toUpperCase()}`,
517
+ `Participation: ${(result.participation * 100).toFixed(1)}%`,
518
+ '',
519
+ `Approve: ${result.approveWeight} | Reject: ${result.rejectWeight} | Abstain: ${result.abstainWeight}`,
520
+ ];
521
+ if (result.nonVoters.length > 0) {
522
+ lines.push(`Non-voters: ${result.nonVoters.join(', ')}`);
523
+ }
524
+ return lines.join('\n');
525
+ }
526
+ /**
527
+ * Parse a PROPOSE command from a relay message.
528
+ *
529
+ * Format:
530
+ * ```
531
+ * PROPOSE: Title of the proposal
532
+ * TYPE: majority|supermajority|unanimous|weighted|quorum
533
+ * PARTICIPANTS: Agent1, Agent2, Agent3
534
+ * DESCRIPTION: Detailed description of what is being proposed
535
+ * TIMEOUT: 3600000 (optional, in milliseconds)
536
+ * QUORUM: 3 (optional, minimum votes)
537
+ * THRESHOLD: 0.67 (optional, for supermajority)
538
+ * ```
539
+ */
540
+ export function parseProposalCommand(message) {
541
+ // Check if message starts with PROPOSE:
542
+ if (!message.trim().startsWith('PROPOSE:')) {
543
+ return null;
544
+ }
545
+ const lines = message.split('\n').map(line => line.trim());
546
+ // Parse each field
547
+ let title;
548
+ let description;
549
+ let participants;
550
+ let consensusType = 'majority';
551
+ let timeoutMs;
552
+ let quorum;
553
+ let threshold;
554
+ let inDescription = false;
555
+ const descriptionLines = [];
556
+ for (const line of lines) {
557
+ if (line.startsWith('PROPOSE:')) {
558
+ title = line.substring('PROPOSE:'.length).trim();
559
+ inDescription = false;
560
+ }
561
+ else if (line.startsWith('TYPE:')) {
562
+ const type = line.substring('TYPE:'.length).trim().toLowerCase();
563
+ if (['majority', 'supermajority', 'unanimous', 'weighted', 'quorum'].includes(type)) {
564
+ consensusType = type;
565
+ }
566
+ inDescription = false;
567
+ }
568
+ else if (line.startsWith('PARTICIPANTS:')) {
569
+ const participantStr = line.substring('PARTICIPANTS:'.length).trim();
570
+ participants = participantStr.split(',').map(p => p.trim()).filter(p => p.length > 0);
571
+ inDescription = false;
572
+ }
573
+ else if (line.startsWith('DESCRIPTION:')) {
574
+ description = line.substring('DESCRIPTION:'.length).trim();
575
+ inDescription = true;
576
+ }
577
+ else if (line.startsWith('TIMEOUT:')) {
578
+ const val = parseInt(line.substring('TIMEOUT:'.length).trim(), 10);
579
+ if (!isNaN(val) && val > 0) {
580
+ timeoutMs = val;
581
+ }
582
+ inDescription = false;
583
+ }
584
+ else if (line.startsWith('QUORUM:')) {
585
+ const val = parseInt(line.substring('QUORUM:'.length).trim(), 10);
586
+ if (!isNaN(val) && val > 0) {
587
+ quorum = val;
588
+ }
589
+ inDescription = false;
590
+ }
591
+ else if (line.startsWith('THRESHOLD:')) {
592
+ const val = parseFloat(line.substring('THRESHOLD:'.length).trim());
593
+ if (!isNaN(val) && val > 0 && val <= 1) {
594
+ threshold = val;
595
+ }
596
+ inDescription = false;
597
+ }
598
+ else if (inDescription && line.length > 0) {
599
+ // Continue collecting description lines
600
+ descriptionLines.push(line);
601
+ }
602
+ }
603
+ // Append continuation lines to description
604
+ if (descriptionLines.length > 0 && description) {
605
+ description = description + '\n' + descriptionLines.join('\n');
606
+ }
607
+ // Validate required fields
608
+ if (!title || !participants || participants.length === 0) {
609
+ return null;
610
+ }
611
+ // Default description if not provided
612
+ if (!description) {
613
+ description = title;
614
+ }
615
+ return {
616
+ title,
617
+ description,
618
+ participants,
619
+ consensusType,
620
+ timeoutMs,
621
+ quorum,
622
+ threshold,
623
+ };
624
+ }
625
+ /**
626
+ * Check if a message is a consensus command (PROPOSE or VOTE).
627
+ */
628
+ export function isConsensusCommand(message) {
629
+ const trimmed = message.trim();
630
+ return trimmed.startsWith('PROPOSE:') || /^VOTE\s+/i.test(trimmed);
631
+ }
632
+ //# sourceMappingURL=consensus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consensus.js","sourceRoot":"","sources":["../src/consensus.ts"],"names":[],"mappings":"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"}