@tjamescouch/agentchat 0.22.1 → 0.23.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 (153) hide show
  1. package/Dockerfile +1 -1
  2. package/dist/bin/agentchat.d.ts +7 -0
  3. package/dist/bin/agentchat.d.ts.map +1 -0
  4. package/dist/bin/agentchat.js +1511 -0
  5. package/dist/bin/agentchat.js.map +1 -0
  6. package/dist/lib/allowlist.d.ts +77 -0
  7. package/dist/lib/allowlist.d.ts.map +1 -0
  8. package/dist/lib/allowlist.js +151 -0
  9. package/dist/lib/allowlist.js.map +1 -0
  10. package/dist/lib/client.d.ts +147 -0
  11. package/dist/lib/client.d.ts.map +1 -0
  12. package/dist/lib/client.js +704 -0
  13. package/dist/lib/client.js.map +1 -0
  14. package/dist/lib/daemon.d.ts +122 -0
  15. package/dist/lib/daemon.d.ts.map +1 -0
  16. package/dist/lib/daemon.js +523 -0
  17. package/dist/lib/daemon.js.map +1 -0
  18. package/dist/lib/deploy/akash.d.ts +271 -0
  19. package/dist/lib/deploy/akash.d.ts.map +1 -0
  20. package/dist/lib/deploy/akash.js +671 -0
  21. package/dist/lib/deploy/akash.js.map +1 -0
  22. package/dist/lib/deploy/config.d.ts +62 -0
  23. package/dist/lib/deploy/config.d.ts.map +1 -0
  24. package/dist/lib/deploy/config.js +116 -0
  25. package/dist/lib/deploy/config.js.map +1 -0
  26. package/dist/lib/deploy/docker.d.ts +37 -0
  27. package/dist/lib/deploy/docker.d.ts.map +1 -0
  28. package/dist/lib/deploy/docker.js +122 -0
  29. package/dist/lib/deploy/docker.js.map +1 -0
  30. package/dist/lib/deploy/index.d.ts +11 -0
  31. package/dist/lib/deploy/index.d.ts.map +1 -0
  32. package/dist/lib/deploy/index.js +11 -0
  33. package/dist/lib/deploy/index.js.map +1 -0
  34. package/dist/lib/escrow-hooks.d.ts +199 -0
  35. package/dist/lib/escrow-hooks.d.ts.map +1 -0
  36. package/dist/lib/escrow-hooks.js +221 -0
  37. package/dist/lib/escrow-hooks.js.map +1 -0
  38. package/dist/lib/identity.d.ts +134 -0
  39. package/dist/lib/identity.d.ts.map +1 -0
  40. package/dist/lib/identity.js +334 -0
  41. package/dist/lib/identity.js.map +1 -0
  42. package/dist/lib/jitter.d.ts +42 -0
  43. package/dist/lib/jitter.d.ts.map +1 -0
  44. package/{lib/jitter.ts → dist/lib/jitter.js} +10 -18
  45. package/dist/lib/jitter.js.map +1 -0
  46. package/dist/lib/proposals.d.ts +223 -0
  47. package/dist/lib/proposals.d.ts.map +1 -0
  48. package/dist/lib/proposals.js +379 -0
  49. package/dist/lib/proposals.js.map +1 -0
  50. package/dist/lib/protocol.d.ts +220 -0
  51. package/dist/lib/protocol.d.ts.map +1 -0
  52. package/dist/lib/protocol.js +507 -0
  53. package/dist/lib/protocol.js.map +1 -0
  54. package/dist/lib/receipts.d.ts +134 -0
  55. package/dist/lib/receipts.d.ts.map +1 -0
  56. package/dist/lib/receipts.js +270 -0
  57. package/dist/lib/receipts.js.map +1 -0
  58. package/dist/lib/reputation.d.ts +250 -0
  59. package/dist/lib/reputation.d.ts.map +1 -0
  60. package/dist/lib/reputation.js +586 -0
  61. package/dist/lib/reputation.js.map +1 -0
  62. package/dist/lib/security.d.ts +27 -0
  63. package/dist/lib/security.d.ts.map +1 -0
  64. package/dist/lib/security.js +150 -0
  65. package/dist/lib/security.js.map +1 -0
  66. package/dist/lib/server/handlers/admin.d.ts +26 -0
  67. package/dist/lib/server/handlers/admin.d.ts.map +1 -0
  68. package/dist/lib/server/handlers/admin.js +76 -0
  69. package/dist/lib/server/handlers/admin.js.map +1 -0
  70. package/dist/lib/server/handlers/identity.d.ts +36 -0
  71. package/dist/lib/server/handlers/identity.d.ts.map +1 -0
  72. package/dist/lib/server/handlers/identity.js +330 -0
  73. package/dist/lib/server/handlers/identity.js.map +1 -0
  74. package/dist/lib/server/handlers/index.d.ts +10 -0
  75. package/dist/lib/server/handlers/index.d.ts.map +1 -0
  76. package/dist/lib/server/handlers/index.js +15 -0
  77. package/dist/lib/server/handlers/index.js.map +1 -0
  78. package/dist/lib/server/handlers/message.d.ts +47 -0
  79. package/dist/lib/server/handlers/message.d.ts.map +1 -0
  80. package/dist/lib/server/handlers/message.js +265 -0
  81. package/dist/lib/server/handlers/message.js.map +1 -0
  82. package/dist/lib/server/handlers/presence.d.ts +18 -0
  83. package/dist/lib/server/handlers/presence.d.ts.map +1 -0
  84. package/dist/lib/server/handlers/presence.js +35 -0
  85. package/dist/lib/server/handlers/presence.js.map +1 -0
  86. package/dist/lib/server/handlers/proposal.d.ts +38 -0
  87. package/dist/lib/server/handlers/proposal.d.ts.map +1 -0
  88. package/dist/lib/server/handlers/proposal.js +273 -0
  89. package/dist/lib/server/handlers/proposal.js.map +1 -0
  90. package/dist/lib/server/handlers/skills.d.ts +22 -0
  91. package/dist/lib/server/handlers/skills.d.ts.map +1 -0
  92. package/dist/lib/server/handlers/skills.js +119 -0
  93. package/dist/lib/server/handlers/skills.js.map +1 -0
  94. package/dist/lib/server-directory.d.ts +85 -0
  95. package/dist/lib/server-directory.d.ts.map +1 -0
  96. package/dist/lib/server-directory.js +177 -0
  97. package/dist/lib/server-directory.js.map +1 -0
  98. package/dist/lib/server.d.ts +162 -0
  99. package/dist/lib/server.d.ts.map +1 -0
  100. package/dist/lib/server.js +602 -0
  101. package/dist/lib/server.js.map +1 -0
  102. package/dist/lib/types.d.ts +461 -0
  103. package/dist/lib/types.d.ts.map +1 -0
  104. package/dist/lib/types.js +98 -0
  105. package/dist/lib/types.js.map +1 -0
  106. package/package.json +22 -13
  107. package/bin/agentchat.js +0 -1617
  108. package/bin/agentchat.ts +0 -1812
  109. package/lib/allowlist.js +0 -162
  110. package/lib/chat.py +0 -241
  111. package/lib/client.js +0 -821
  112. package/lib/client.ts +0 -877
  113. package/lib/daemon.js +0 -562
  114. package/lib/daemon.ts +0 -662
  115. package/lib/deploy/akash.js +0 -811
  116. package/lib/deploy/config.js +0 -128
  117. package/lib/deploy/docker.js +0 -132
  118. package/lib/deploy/index.js +0 -24
  119. package/lib/elo_swarm.py +0 -569
  120. package/lib/escrow-hooks.js +0 -237
  121. package/lib/escrow-hooks.ts +0 -391
  122. package/lib/identity.js +0 -376
  123. package/lib/identity.ts +0 -412
  124. package/lib/jitter.js +0 -54
  125. package/lib/proposals.js +0 -426
  126. package/lib/proposals.ts +0 -612
  127. package/lib/protocol.js +0 -516
  128. package/lib/receipts.js +0 -294
  129. package/lib/receipts.ts +0 -359
  130. package/lib/reputation.js +0 -664
  131. package/lib/reputation.ts +0 -790
  132. package/lib/security.js +0 -183
  133. package/lib/server/handlers/admin.js +0 -94
  134. package/lib/server/handlers/identity.js +0 -258
  135. package/lib/server/handlers/index.js +0 -42
  136. package/lib/server/handlers/message.js +0 -319
  137. package/lib/server/handlers/presence.js +0 -45
  138. package/lib/server/handlers/proposal.js +0 -358
  139. package/lib/server/handlers/skills.js +0 -141
  140. package/lib/server-directory.js +0 -190
  141. package/lib/server-directory.ts +0 -232
  142. package/lib/server.js +0 -633
  143. package/lib/server.ts +0 -698
  144. package/lib/supervisor/USAGE.md +0 -110
  145. package/lib/supervisor/agent-health.sh +0 -107
  146. package/lib/supervisor/agent-monitor.sh +0 -123
  147. package/lib/supervisor/agent-supervisor.sh +0 -135
  148. package/lib/supervisor/agentctl.sh +0 -266
  149. package/lib/supervisor/god-backup.sh +0 -126
  150. package/lib/supervisor/god-watchdog.sh +0 -107
  151. package/lib/supervisor/killswitch.sh +0 -43
  152. package/lib/supervisor/notify.sh +0 -19
  153. package/lib/types.ts +0 -433
@@ -0,0 +1,586 @@
1
+ /**
2
+ * AgentChat Reputation Module
3
+ * ELO-based rating system for agent reputation
4
+ *
5
+ * Adapts chess ELO for cooperative agent coordination:
6
+ * - Each agent starts at 1200
7
+ * - On COMPLETE: both agents gain points, scaled by counterparty rating
8
+ * - On DISPUTE: at-fault party loses points
9
+ * - K-factor varies by experience (new agents move faster)
10
+ */
11
+ import fsp from 'fs/promises';
12
+ import path from 'path';
13
+ // ============ Constants ============
14
+ // Default ratings file location
15
+ const AGENTCHAT_DIR = path.join(process.cwd(), '.agentchat');
16
+ export const DEFAULT_RATINGS_PATH = path.join(AGENTCHAT_DIR, 'ratings.json');
17
+ // ELO constants
18
+ export const DEFAULT_RATING = 1200;
19
+ export const ELO_DIVISOR = 400; // Standard ELO divisor
20
+ export const MINIMUM_RATING = 100; // Floor - can't drop below this
21
+ // K-factor thresholds
22
+ const K_FACTOR_NEW = 32; // < 30 transactions
23
+ const K_FACTOR_INTERMEDIATE = 24; // < 100 transactions
24
+ const K_FACTOR_ESTABLISHED = 16; // >= 100 transactions
25
+ const TRANSACTIONS_NEW = 30;
26
+ const TRANSACTIONS_INTERMEDIATE = 100;
27
+ // ============ Helper Functions ============
28
+ /**
29
+ * Calculate expected outcome (standard ELO formula)
30
+ * E = 1 / (1 + 10^((R_opponent - R_self) / 400))
31
+ *
32
+ * @param selfRating - Your rating
33
+ * @param opponentRating - Counterparty rating
34
+ * @returns Expected outcome (0-1)
35
+ */
36
+ export function calculateExpected(selfRating, opponentRating) {
37
+ const exponent = (opponentRating - selfRating) / ELO_DIVISOR;
38
+ return 1 / (1 + Math.pow(10, exponent));
39
+ }
40
+ /**
41
+ * Get K-factor based on transaction count
42
+ * New agents have higher K (volatile), established agents lower K (stable)
43
+ *
44
+ * @param transactions - Number of completed transactions
45
+ * @returns K-factor
46
+ */
47
+ export function getKFactor(transactions) {
48
+ if (transactions < TRANSACTIONS_NEW) {
49
+ return K_FACTOR_NEW;
50
+ }
51
+ else if (transactions < TRANSACTIONS_INTERMEDIATE) {
52
+ return K_FACTOR_INTERMEDIATE;
53
+ }
54
+ return K_FACTOR_ESTABLISHED;
55
+ }
56
+ /**
57
+ * Calculate effective K-factor with optional task value weighting
58
+ * effective_K = K * (1 + log10(amount + 1))
59
+ *
60
+ * @param baseK - Base K-factor
61
+ * @param amount - Task value/amount (optional)
62
+ * @returns Effective K-factor
63
+ */
64
+ export function getEffectiveK(baseK, amount = 0) {
65
+ if (!amount || amount <= 0) {
66
+ return baseK;
67
+ }
68
+ // Weight by task value: higher value = more rating movement
69
+ // Cap the multiplier to prevent extreme swings
70
+ const multiplier = Math.min(1 + Math.log10(amount + 1), 3);
71
+ return baseK * multiplier;
72
+ }
73
+ /**
74
+ * Calculate rating change for a completion (cooperative outcome)
75
+ * Both parties gain, but you gain more when completing with higher-rated counterparty
76
+ *
77
+ * @param selfRating - Your current rating
78
+ * @param counterpartyRating - Counterparty's rating
79
+ * @param kFactor - Your K-factor
80
+ * @param amount - Optional task value
81
+ * @returns Rating change (positive)
82
+ */
83
+ export function calculateCompletionGain(selfRating, counterpartyRating, kFactor, amount = 0) {
84
+ const expected = calculateExpected(selfRating, counterpartyRating);
85
+ const effectiveK = getEffectiveK(kFactor, amount);
86
+ // Gain = K * (1 - E)
87
+ // You gain more when completing with higher-rated counterparty (lower E)
88
+ const gain = effectiveK * (1 - expected);
89
+ // Minimum gain of 1 point for any completion
90
+ return Math.max(1, Math.round(gain));
91
+ }
92
+ /**
93
+ * Calculate rating change for a dispute (loss for at-fault party)
94
+ *
95
+ * @param selfRating - Your current rating
96
+ * @param counterpartyRating - Counterparty's rating
97
+ * @param kFactor - Your K-factor
98
+ * @param amount - Optional task value
99
+ * @returns Rating change (negative)
100
+ */
101
+ export function calculateDisputeLoss(selfRating, counterpartyRating, kFactor, amount = 0) {
102
+ const expected = calculateExpected(selfRating, counterpartyRating);
103
+ const effectiveK = getEffectiveK(kFactor, amount);
104
+ // Loss = K * E
105
+ // You lose more when you were expected to succeed (higher E)
106
+ const loss = effectiveK * expected;
107
+ // Minimum loss of 1 point
108
+ return -Math.max(1, Math.round(loss));
109
+ }
110
+ // ============ ReputationStore Class ============
111
+ /**
112
+ * Reputation Store - manages agent ratings
113
+ */
114
+ export class ReputationStore {
115
+ ratingsPath;
116
+ _ratings;
117
+ _escrows;
118
+ constructor(ratingsPath = DEFAULT_RATINGS_PATH) {
119
+ this.ratingsPath = ratingsPath;
120
+ this._ratings = null; // Lazy load
121
+ this._escrows = new Map(); // proposalId -> escrow record
122
+ }
123
+ /**
124
+ * Load ratings from file
125
+ */
126
+ async load() {
127
+ try {
128
+ const content = await fsp.readFile(this.ratingsPath, 'utf-8');
129
+ this._ratings = JSON.parse(content);
130
+ }
131
+ catch (err) {
132
+ if (err.code === 'ENOENT') {
133
+ this._ratings = {}; // No ratings file yet
134
+ }
135
+ else {
136
+ throw err;
137
+ }
138
+ }
139
+ return this._ratings;
140
+ }
141
+ /**
142
+ * Save ratings to file
143
+ */
144
+ async save() {
145
+ await fsp.mkdir(path.dirname(this.ratingsPath), { recursive: true });
146
+ await fsp.writeFile(this.ratingsPath, JSON.stringify(this._ratings, null, 2), { mode: 0o600 });
147
+ }
148
+ /**
149
+ * Ensure ratings are loaded
150
+ */
151
+ async _ensureLoaded() {
152
+ if (this._ratings === null) {
153
+ await this.load();
154
+ }
155
+ }
156
+ /**
157
+ * Normalize agent ID (ensure @ prefix)
158
+ */
159
+ _normalizeId(agentId) {
160
+ return agentId.startsWith('@') ? agentId : `@${agentId}`;
161
+ }
162
+ /**
163
+ * Get rating for an agent
164
+ * Returns default rating if agent not found
165
+ */
166
+ async getRating(agentId) {
167
+ await this._ensureLoaded();
168
+ const id = this._normalizeId(agentId);
169
+ const record = this._ratings[id];
170
+ if (!record) {
171
+ return {
172
+ agentId: id,
173
+ rating: DEFAULT_RATING,
174
+ transactions: 0,
175
+ updated: null,
176
+ isNew: true
177
+ };
178
+ }
179
+ return {
180
+ agentId: id,
181
+ rating: record.rating,
182
+ transactions: record.transactions,
183
+ updated: record.updated,
184
+ isNew: false
185
+ };
186
+ }
187
+ /**
188
+ * Get K-factor for an agent
189
+ */
190
+ async getAgentKFactor(agentId) {
191
+ const record = await this.getRating(agentId);
192
+ return getKFactor(record.transactions);
193
+ }
194
+ /**
195
+ * Get total escrowed ELO for an agent
196
+ */
197
+ getEscrowedAmount(agentId) {
198
+ const id = this._normalizeId(agentId);
199
+ let total = 0;
200
+ for (const escrow of this._escrows.values()) {
201
+ if (escrow.status === 'active') {
202
+ if (escrow.from.agent_id === id) {
203
+ total += escrow.from.stake;
204
+ }
205
+ if (escrow.to.agent_id === id) {
206
+ total += escrow.to.stake;
207
+ }
208
+ }
209
+ }
210
+ return total;
211
+ }
212
+ /**
213
+ * Get available rating for staking (rating - escrowed - minimum floor)
214
+ */
215
+ async getAvailableRating(agentId) {
216
+ const record = await this.getRating(agentId);
217
+ const escrowed = this.getEscrowedAmount(agentId);
218
+ const available = record.rating - escrowed - MINIMUM_RATING;
219
+ return Math.max(0, available);
220
+ }
221
+ /**
222
+ * Check if agent can stake the requested amount
223
+ */
224
+ async canStake(agentId, amount) {
225
+ if (!amount || amount <= 0) {
226
+ return { canStake: true, available: await this.getAvailableRating(agentId) };
227
+ }
228
+ const available = await this.getAvailableRating(agentId);
229
+ if (amount > available) {
230
+ return {
231
+ canStake: false,
232
+ available,
233
+ reason: `Insufficient ELO. Available: ${available}, Requested: ${amount}`
234
+ };
235
+ }
236
+ return { canStake: true, available };
237
+ }
238
+ /**
239
+ * Create escrow for a proposal
240
+ * Called when proposal is accepted with stakes
241
+ */
242
+ async createEscrow(proposalId, fromStake, toStake, expiresAt = null) {
243
+ // Validate both parties can stake
244
+ if (fromStake.stake > 0) {
245
+ const canFrom = await this.canStake(fromStake.agent_id, fromStake.stake);
246
+ if (!canFrom.canStake) {
247
+ return { success: false, error: `Proposer: ${canFrom.reason}` };
248
+ }
249
+ }
250
+ if (toStake.stake > 0) {
251
+ const canTo = await this.canStake(toStake.agent_id, toStake.stake);
252
+ if (!canTo.canStake) {
253
+ return { success: false, error: `Acceptor: ${canTo.reason}` };
254
+ }
255
+ }
256
+ const escrow = {
257
+ proposal_id: proposalId,
258
+ created_at: Date.now(),
259
+ from: {
260
+ agent_id: this._normalizeId(fromStake.agent_id),
261
+ stake: fromStake.stake || 0
262
+ },
263
+ to: {
264
+ agent_id: this._normalizeId(toStake.agent_id),
265
+ stake: toStake.stake || 0
266
+ },
267
+ status: 'active',
268
+ expires_at: expiresAt,
269
+ settled_at: null,
270
+ settlement_reason: null
271
+ };
272
+ this._escrows.set(proposalId, escrow);
273
+ return { success: true, escrow };
274
+ }
275
+ /**
276
+ * Get escrow for a proposal
277
+ */
278
+ getEscrow(proposalId) {
279
+ return this._escrows.get(proposalId) || null;
280
+ }
281
+ /**
282
+ * Release escrow (return stakes to both parties, no rating change)
283
+ * Used for proposal expiration
284
+ */
285
+ releaseEscrow(proposalId) {
286
+ const escrow = this._escrows.get(proposalId);
287
+ if (!escrow) {
288
+ return { released: false, error: 'Escrow not found' };
289
+ }
290
+ if (escrow.status !== 'active') {
291
+ return { released: false, error: `Escrow already ${escrow.status}` };
292
+ }
293
+ escrow.status = 'released';
294
+ escrow.settled_at = Date.now();
295
+ escrow.settlement_reason = 'expired';
296
+ return { released: true, escrow };
297
+ }
298
+ /**
299
+ * Update rating for an agent
300
+ */
301
+ async _updateAgent(agentId, ratingChange) {
302
+ await this._ensureLoaded();
303
+ const id = this._normalizeId(agentId);
304
+ if (!this._ratings[id]) {
305
+ this._ratings[id] = {
306
+ rating: DEFAULT_RATING,
307
+ transactions: 0,
308
+ updated: null
309
+ };
310
+ }
311
+ this._ratings[id].rating = Math.max(100, this._ratings[id].rating + ratingChange);
312
+ this._ratings[id].transactions += 1;
313
+ this._ratings[id].updated = new Date().toISOString();
314
+ return this._ratings[id];
315
+ }
316
+ /**
317
+ * Process a COMPLETE receipt - both parties gain (halved gains with staking)
318
+ *
319
+ * @param receipt - The COMPLETE receipt
320
+ * @returns Rating changes for both parties
321
+ */
322
+ async processCompletion(receipt) {
323
+ // Extract parties from receipt
324
+ const party1 = receipt.proposal?.from || receipt.from;
325
+ const party2 = receipt.proposal?.to || receipt.to;
326
+ const amount = receipt.proposal?.amount || receipt.amount || 0;
327
+ const proposalId = receipt.proposal_id;
328
+ if (!party1 || !party2) {
329
+ throw new Error('Receipt missing party information');
330
+ }
331
+ // Get current ratings
332
+ const rating1 = await this.getRating(party1);
333
+ const rating2 = await this.getRating(party2);
334
+ // Calculate gains (halved for staking model)
335
+ const k1 = getKFactor(rating1.transactions);
336
+ const k2 = getKFactor(rating2.transactions);
337
+ const fullGain1 = calculateCompletionGain(rating1.rating, rating2.rating, k1, amount);
338
+ const fullGain2 = calculateCompletionGain(rating2.rating, rating1.rating, k2, amount);
339
+ // Half the gains (staking model: split gains to balance inflation)
340
+ const gain1 = Math.max(1, Math.round(fullGain1 / 2));
341
+ const gain2 = Math.max(1, Math.round(fullGain2 / 2));
342
+ // Settle escrow if exists (return stakes)
343
+ let escrowSettlement = null;
344
+ if (proposalId) {
345
+ const escrow = this._escrows.get(proposalId);
346
+ if (escrow && escrow.status === 'active') {
347
+ escrow.status = 'settled';
348
+ escrow.settled_at = Date.now();
349
+ escrow.settlement_reason = 'completed';
350
+ escrowSettlement = {
351
+ proposer_stake: escrow.from.stake,
352
+ acceptor_stake: escrow.to.stake,
353
+ settlement: 'returned'
354
+ };
355
+ }
356
+ }
357
+ // Apply updates
358
+ const updated1 = await this._updateAgent(party1, gain1);
359
+ const updated2 = await this._updateAgent(party2, gain2);
360
+ // Save
361
+ await this.save();
362
+ const result = {
363
+ [party1]: {
364
+ oldRating: rating1.rating,
365
+ newRating: updated1.rating,
366
+ change: gain1,
367
+ transactions: updated1.transactions
368
+ },
369
+ [party2]: {
370
+ oldRating: rating2.rating,
371
+ newRating: updated2.rating,
372
+ change: gain2,
373
+ transactions: updated2.transactions
374
+ }
375
+ };
376
+ if (escrowSettlement) {
377
+ result._escrow = escrowSettlement;
378
+ }
379
+ return result;
380
+ }
381
+ /**
382
+ * Process a DISPUTE receipt
383
+ * If disputed_by is set, they are the "winner" (counterparty is at fault)
384
+ * Otherwise, both parties lose (mutual fault)
385
+ * Stakes are transferred to winner or burned on mutual fault
386
+ *
387
+ * @param receipt - The DISPUTE receipt
388
+ * @returns Rating changes for both parties
389
+ */
390
+ async processDispute(receipt) {
391
+ const party1 = receipt.proposal?.from || receipt.from;
392
+ const party2 = receipt.proposal?.to || receipt.to;
393
+ const disputedBy = receipt.disputed_by;
394
+ const amount = receipt.proposal?.amount || receipt.amount || 0;
395
+ const proposalId = receipt.proposal_id;
396
+ if (!party1 || !party2) {
397
+ throw new Error('Receipt missing party information');
398
+ }
399
+ const rating1 = await this.getRating(party1);
400
+ const rating2 = await this.getRating(party2);
401
+ const k1 = getKFactor(rating1.transactions);
402
+ const k2 = getKFactor(rating2.transactions);
403
+ // Get escrow info for stake calculations
404
+ let escrow = null;
405
+ let stake1 = 0, stake2 = 0;
406
+ if (proposalId) {
407
+ escrow = this._escrows.get(proposalId) || null;
408
+ if (escrow && escrow.status === 'active') {
409
+ stake1 = escrow.from.agent_id === this._normalizeId(party1)
410
+ ? escrow.from.stake
411
+ : escrow.to.stake;
412
+ stake2 = escrow.from.agent_id === this._normalizeId(party2)
413
+ ? escrow.from.stake
414
+ : escrow.to.stake;
415
+ }
416
+ }
417
+ let change1, change2;
418
+ let escrowSettlement = null;
419
+ if (disputedBy) {
420
+ // The disputer is the "winner", counterparty at fault
421
+ const atFault = disputedBy === party1 ? party2 : party1;
422
+ if (atFault === party1) {
423
+ // Party1 at fault: loses ELO + loses stake to party2
424
+ change1 = calculateDisputeLoss(rating1.rating, rating2.rating, k1, amount) - stake1;
425
+ change2 = Math.round(Math.abs(calculateDisputeLoss(rating1.rating, rating2.rating, k1, amount)) * 0.5) + stake1;
426
+ escrowSettlement = {
427
+ proposer_stake: escrow?.from.stake || 0,
428
+ acceptor_stake: escrow?.to.stake || 0,
429
+ settlement: 'transferred',
430
+ transferred_to: party2,
431
+ transferred_amount: stake1
432
+ };
433
+ }
434
+ else {
435
+ // Party2 at fault: loses ELO + loses stake to party1
436
+ change2 = calculateDisputeLoss(rating2.rating, rating1.rating, k2, amount) - stake2;
437
+ change1 = Math.round(Math.abs(calculateDisputeLoss(rating2.rating, rating1.rating, k2, amount)) * 0.5) + stake2;
438
+ escrowSettlement = {
439
+ proposer_stake: escrow?.from.stake || 0,
440
+ acceptor_stake: escrow?.to.stake || 0,
441
+ settlement: 'transferred',
442
+ transferred_to: party1,
443
+ transferred_amount: stake2
444
+ };
445
+ }
446
+ }
447
+ else {
448
+ // Mutual fault - both lose ELO + both stakes burned
449
+ change1 = calculateDisputeLoss(rating1.rating, rating2.rating, k1, amount) - stake1;
450
+ change2 = calculateDisputeLoss(rating2.rating, rating1.rating, k2, amount) - stake2;
451
+ escrowSettlement = {
452
+ proposer_stake: escrow?.from.stake || 0,
453
+ acceptor_stake: escrow?.to.stake || 0,
454
+ settlement: 'burned',
455
+ burned_amount: stake1 + stake2
456
+ };
457
+ }
458
+ // Settle escrow
459
+ if (escrow && escrow.status === 'active') {
460
+ escrow.status = 'settled';
461
+ escrow.settled_at = Date.now();
462
+ escrow.settlement_reason = 'disputed';
463
+ }
464
+ const updated1 = await this._updateAgent(party1, change1);
465
+ const updated2 = await this._updateAgent(party2, change2);
466
+ await this.save();
467
+ const result = {
468
+ [party1]: {
469
+ oldRating: rating1.rating,
470
+ newRating: updated1.rating,
471
+ change: change1,
472
+ transactions: updated1.transactions
473
+ },
474
+ [party2]: {
475
+ oldRating: rating2.rating,
476
+ newRating: updated2.rating,
477
+ change: change2,
478
+ transactions: updated2.transactions
479
+ }
480
+ };
481
+ if (escrowSettlement) {
482
+ result._escrow = escrowSettlement;
483
+ }
484
+ return result;
485
+ }
486
+ /**
487
+ * Process a receipt (routes to completion or dispute)
488
+ */
489
+ async updateRatings(receipt) {
490
+ const type = receipt.type || receipt.status;
491
+ if (type === 'COMPLETE' || type === 'completed') {
492
+ return this.processCompletion(receipt);
493
+ }
494
+ else if (type === 'DISPUTE' || type === 'disputed') {
495
+ return this.processDispute(receipt);
496
+ }
497
+ // Not a rating-relevant receipt type
498
+ return null;
499
+ }
500
+ /**
501
+ * Export all ratings
502
+ */
503
+ async exportRatings() {
504
+ await this._ensureLoaded();
505
+ return { ...this._ratings };
506
+ }
507
+ /**
508
+ * Get all ratings sorted by rating (descending)
509
+ */
510
+ async getLeaderboard(limit = 50) {
511
+ await this._ensureLoaded();
512
+ const entries = Object.entries(this._ratings)
513
+ .map(([id, data]) => ({
514
+ agentId: id,
515
+ rating: data.rating,
516
+ transactions: data.transactions,
517
+ updated: data.updated
518
+ }))
519
+ .sort((a, b) => b.rating - a.rating)
520
+ .slice(0, limit);
521
+ return entries;
522
+ }
523
+ /**
524
+ * Recalculate all ratings from receipt history
525
+ *
526
+ * @param receipts - Array of receipts to process
527
+ */
528
+ async recalculateFromReceipts(receipts) {
529
+ // Reset ratings
530
+ this._ratings = {};
531
+ // Sort receipts by timestamp
532
+ const sorted = [...receipts].sort((a, b) => {
533
+ const tsA = a.completed_at || a.disputed_at || a.stored_at || 0;
534
+ const tsB = b.completed_at || b.disputed_at || b.stored_at || 0;
535
+ return tsA - tsB;
536
+ });
537
+ // Process each receipt
538
+ for (const receipt of sorted) {
539
+ try {
540
+ await this.updateRatings(receipt);
541
+ }
542
+ catch (err) {
543
+ // Skip invalid receipts
544
+ console.error(`Skipping invalid receipt: ${err.message}`);
545
+ }
546
+ }
547
+ // Save is called by updateRatings, but save final state
548
+ await this.save();
549
+ return this._ratings;
550
+ }
551
+ /**
552
+ * Get statistics about the rating system
553
+ */
554
+ async getStats() {
555
+ await this._ensureLoaded();
556
+ const ratings = Object.values(this._ratings).map(r => r.rating);
557
+ if (ratings.length === 0) {
558
+ return {
559
+ totalAgents: 0,
560
+ averageRating: DEFAULT_RATING,
561
+ highestRating: DEFAULT_RATING,
562
+ lowestRating: DEFAULT_RATING,
563
+ totalTransactions: 0
564
+ };
565
+ }
566
+ const totalTransactions = Object.values(this._ratings)
567
+ .reduce((sum, r) => sum + r.transactions, 0);
568
+ return {
569
+ totalAgents: ratings.length,
570
+ averageRating: Math.round(ratings.reduce((a, b) => a + b, 0) / ratings.length),
571
+ highestRating: Math.max(...ratings),
572
+ lowestRating: Math.min(...ratings),
573
+ totalTransactions
574
+ };
575
+ }
576
+ }
577
+ // ============ Default Instance ============
578
+ // Default instance for convenience
579
+ let defaultStore = null;
580
+ export function getDefaultStore() {
581
+ if (!defaultStore) {
582
+ defaultStore = new ReputationStore();
583
+ }
584
+ return defaultStore;
585
+ }
586
+ //# sourceMappingURL=reputation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reputation.js","sourceRoot":"","sources":["../../lib/reputation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Security utilities for AgentChat
3
+ * Prevents running agents in dangerous directories
4
+ */
5
+ export interface DirectorySafetyResult {
6
+ safe: boolean;
7
+ error?: string;
8
+ warning?: string;
9
+ level: 'error' | 'warning' | 'ok';
10
+ }
11
+ /**
12
+ * Check if a directory is safe for running agentchat
13
+ */
14
+ export declare function checkDirectorySafety(dirPath?: string): DirectorySafetyResult;
15
+ export interface EnforceOptions {
16
+ allowWarnings?: boolean;
17
+ silent?: boolean;
18
+ }
19
+ /**
20
+ * Enforce directory safety check - throws if unsafe
21
+ */
22
+ export declare function enforceDirectorySafety(dirPath?: string, options?: EnforceOptions): DirectorySafetyResult;
23
+ /**
24
+ * Check if running in a project directory (has common project indicators)
25
+ */
26
+ export declare function looksLikeProjectDirectory(dirPath?: string): boolean;
27
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../lib/security.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmEH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;CACnC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,MAAsB,GAAG,qBAAqB,CAyC3F;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,MAAsB,EAC/B,OAAO,GAAE,cAAmB,GAC3B,qBAAqB,CAmBvB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,MAAsB,GAAG,OAAO,CA0BlF"}