@tjamescouch/agentchat 0.22.1 → 0.23.1

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,507 @@
1
+ /**
2
+ * AgentChat Protocol
3
+ * Message types and validation for agent-to-agent communication
4
+ */
5
+ import crypto from 'crypto';
6
+ // Re-export enums as const objects for backwards compatibility
7
+ export const ClientMessageType = {
8
+ IDENTIFY: 'IDENTIFY',
9
+ JOIN: 'JOIN',
10
+ LEAVE: 'LEAVE',
11
+ MSG: 'MSG',
12
+ LIST_CHANNELS: 'LIST_CHANNELS',
13
+ LIST_AGENTS: 'LIST_AGENTS',
14
+ CREATE_CHANNEL: 'CREATE_CHANNEL',
15
+ INVITE: 'INVITE',
16
+ PING: 'PING',
17
+ // Proposal/negotiation message types
18
+ PROPOSAL: 'PROPOSAL',
19
+ ACCEPT: 'ACCEPT',
20
+ REJECT: 'REJECT',
21
+ COMPLETE: 'COMPLETE',
22
+ DISPUTE: 'DISPUTE',
23
+ // Skill discovery message types
24
+ REGISTER_SKILLS: 'REGISTER_SKILLS',
25
+ SEARCH_SKILLS: 'SEARCH_SKILLS',
26
+ // Presence message types
27
+ SET_PRESENCE: 'SET_PRESENCE',
28
+ // Identity verification message types
29
+ VERIFY_REQUEST: 'VERIFY_REQUEST',
30
+ VERIFY_RESPONSE: 'VERIFY_RESPONSE',
31
+ // Admin message types
32
+ ADMIN_APPROVE: 'ADMIN_APPROVE',
33
+ ADMIN_REVOKE: 'ADMIN_REVOKE',
34
+ ADMIN_LIST: 'ADMIN_LIST',
35
+ // Challenge-response auth
36
+ VERIFY_IDENTITY: 'VERIFY_IDENTITY',
37
+ };
38
+ export const ServerMessageType = {
39
+ WELCOME: 'WELCOME',
40
+ MSG: 'MSG',
41
+ JOINED: 'JOINED',
42
+ LEFT: 'LEFT',
43
+ AGENT_JOINED: 'AGENT_JOINED',
44
+ AGENT_LEFT: 'AGENT_LEFT',
45
+ CHANNELS: 'CHANNELS',
46
+ AGENTS: 'AGENTS',
47
+ ERROR: 'ERROR',
48
+ PONG: 'PONG',
49
+ // Proposal/negotiation message types
50
+ PROPOSAL: 'PROPOSAL',
51
+ ACCEPT: 'ACCEPT',
52
+ REJECT: 'REJECT',
53
+ COMPLETE: 'COMPLETE',
54
+ DISPUTE: 'DISPUTE',
55
+ // Skill discovery message types
56
+ SKILLS_REGISTERED: 'SKILLS_REGISTERED',
57
+ SEARCH_RESULTS: 'SEARCH_RESULTS',
58
+ // Presence message types
59
+ PRESENCE_CHANGED: 'PRESENCE_CHANGED',
60
+ // Identity verification message types
61
+ VERIFY_REQUEST: 'VERIFY_REQUEST',
62
+ VERIFY_RESPONSE: 'VERIFY_RESPONSE',
63
+ VERIFY_SUCCESS: 'VERIFY_SUCCESS',
64
+ VERIFY_FAILED: 'VERIFY_FAILED',
65
+ // Admin response
66
+ ADMIN_RESULT: 'ADMIN_RESULT',
67
+ // Challenge-response auth
68
+ CHALLENGE: 'CHALLENGE',
69
+ };
70
+ export const ErrorCode = {
71
+ AUTH_REQUIRED: 'AUTH_REQUIRED',
72
+ CHANNEL_NOT_FOUND: 'CHANNEL_NOT_FOUND',
73
+ NOT_INVITED: 'NOT_INVITED',
74
+ INVALID_MSG: 'INVALID_MSG',
75
+ RATE_LIMITED: 'RATE_LIMITED',
76
+ AGENT_NOT_FOUND: 'AGENT_NOT_FOUND',
77
+ CHANNEL_EXISTS: 'CHANNEL_EXISTS',
78
+ INVALID_NAME: 'INVALID_NAME',
79
+ // Proposal errors
80
+ PROPOSAL_NOT_FOUND: 'PROPOSAL_NOT_FOUND',
81
+ PROPOSAL_EXPIRED: 'PROPOSAL_EXPIRED',
82
+ INVALID_PROPOSAL: 'INVALID_PROPOSAL',
83
+ SIGNATURE_REQUIRED: 'SIGNATURE_REQUIRED',
84
+ NOT_PROPOSAL_PARTY: 'NOT_PROPOSAL_PARTY',
85
+ // Staking errors
86
+ INSUFFICIENT_REPUTATION: 'INSUFFICIENT_REPUTATION',
87
+ INVALID_STAKE: 'INVALID_STAKE',
88
+ // Verification errors
89
+ VERIFICATION_FAILED: 'VERIFICATION_FAILED',
90
+ VERIFICATION_EXPIRED: 'VERIFICATION_EXPIRED',
91
+ NO_PUBKEY: 'NO_PUBKEY',
92
+ // Allowlist errors
93
+ NOT_ALLOWED: 'NOT_ALLOWED',
94
+ };
95
+ export const PresenceStatus = {
96
+ ONLINE: 'online',
97
+ AWAY: 'away',
98
+ BUSY: 'busy',
99
+ OFFLINE: 'offline',
100
+ LISTENING: 'listening'
101
+ };
102
+ export const ProposalStatus = {
103
+ PENDING: 'pending',
104
+ ACCEPTED: 'accepted',
105
+ REJECTED: 'rejected',
106
+ COMPLETED: 'completed',
107
+ DISPUTED: 'disputed',
108
+ EXPIRED: 'expired'
109
+ };
110
+ /**
111
+ * Check if a target is a channel (#name) or agent (@name)
112
+ */
113
+ export function isChannel(target) {
114
+ return Boolean(target && target.startsWith('#'));
115
+ }
116
+ export function isAgent(target) {
117
+ return Boolean(target && target.startsWith('@'));
118
+ }
119
+ /**
120
+ * Validate agent name
121
+ * - 1-32 characters
122
+ * - alphanumeric, dash, underscore
123
+ * - no spaces
124
+ */
125
+ export function isValidName(name) {
126
+ if (!name || typeof name !== 'string')
127
+ return false;
128
+ if (name.length < 1 || name.length > 32)
129
+ return false;
130
+ return /^[a-zA-Z0-9_-]+$/.test(name);
131
+ }
132
+ /**
133
+ * Validate channel name
134
+ * - starts with #
135
+ * - 2-32 characters total
136
+ * - alphanumeric, dash, underscore after #
137
+ */
138
+ export function isValidChannel(channel) {
139
+ if (!channel || typeof channel !== 'string')
140
+ return false;
141
+ if (!channel.startsWith('#'))
142
+ return false;
143
+ const name = channel.slice(1);
144
+ if (name.length < 1 || name.length > 31)
145
+ return false;
146
+ return /^[a-zA-Z0-9_-]+$/.test(name);
147
+ }
148
+ /**
149
+ * Validate Ed25519 public key in PEM format
150
+ */
151
+ export function isValidPubkey(pubkey) {
152
+ if (!pubkey || typeof pubkey !== 'string')
153
+ return false;
154
+ try {
155
+ const keyObj = crypto.createPublicKey(pubkey);
156
+ return keyObj.asymmetricKeyType === 'ed25519';
157
+ }
158
+ catch {
159
+ return false;
160
+ }
161
+ }
162
+ /**
163
+ * Generate stable agent ID from pubkey
164
+ * Returns first 8 chars of SHA256 hash (hex)
165
+ */
166
+ export function pubkeyToAgentId(pubkey) {
167
+ const hash = crypto.createHash('sha256').update(pubkey).digest('hex');
168
+ return hash.substring(0, 8);
169
+ }
170
+ /**
171
+ * Create a message object with timestamp
172
+ */
173
+ export function createMessage(type, data = {}) {
174
+ return {
175
+ type,
176
+ ts: Date.now(),
177
+ ...data
178
+ };
179
+ }
180
+ /**
181
+ * Create an error message
182
+ */
183
+ export function createError(code, message) {
184
+ return createMessage(ServerMessageType.ERROR, { code, message });
185
+ }
186
+ /**
187
+ * Validate incoming client message
188
+ * Returns { valid: true, msg } or { valid: false, error }
189
+ */
190
+ export function validateClientMessage(raw) {
191
+ let msg;
192
+ // Parse JSON
193
+ try {
194
+ msg = typeof raw === 'string' ? JSON.parse(raw) : raw;
195
+ }
196
+ catch (e) {
197
+ return { valid: false, error: 'Invalid JSON' };
198
+ }
199
+ // Must have type
200
+ if (!msg.type) {
201
+ return { valid: false, error: 'Missing message type' };
202
+ }
203
+ // Validate by type
204
+ switch (msg.type) {
205
+ case ClientMessageType.IDENTIFY:
206
+ if (!isValidName(msg.name)) {
207
+ return { valid: false, error: 'Invalid agent name' };
208
+ }
209
+ // Validate pubkey if provided
210
+ if (msg.pubkey !== undefined && msg.pubkey !== null) {
211
+ if (!isValidPubkey(msg.pubkey)) {
212
+ return { valid: false, error: 'Invalid public key format (must be Ed25519 PEM)' };
213
+ }
214
+ }
215
+ break;
216
+ case ClientMessageType.JOIN:
217
+ case ClientMessageType.LEAVE:
218
+ case ClientMessageType.LIST_AGENTS:
219
+ if (!isValidChannel(msg.channel)) {
220
+ return { valid: false, error: 'Invalid channel name' };
221
+ }
222
+ break;
223
+ case ClientMessageType.MSG:
224
+ if (!msg.to) {
225
+ return { valid: false, error: 'Missing target' };
226
+ }
227
+ if (!isChannel(msg.to) && !isAgent(msg.to)) {
228
+ return { valid: false, error: 'Invalid target (must start with # or @)' };
229
+ }
230
+ if (typeof msg.content !== 'string') {
231
+ return { valid: false, error: 'Missing or invalid content' };
232
+ }
233
+ if (msg.content.length > 4096) {
234
+ return { valid: false, error: 'Content too long (max 4096 chars)' };
235
+ }
236
+ // Validate signature format if present
237
+ if (msg.sig !== undefined && typeof msg.sig !== 'string') {
238
+ return { valid: false, error: 'Invalid signature format' };
239
+ }
240
+ break;
241
+ case ClientMessageType.CREATE_CHANNEL:
242
+ if (!isValidChannel(msg.channel)) {
243
+ return { valid: false, error: 'Invalid channel name' };
244
+ }
245
+ break;
246
+ case ClientMessageType.INVITE:
247
+ if (!isValidChannel(msg.channel)) {
248
+ return { valid: false, error: 'Invalid channel name' };
249
+ }
250
+ if (!msg.agent || !isAgent(msg.agent)) {
251
+ return { valid: false, error: 'Invalid agent target' };
252
+ }
253
+ break;
254
+ case ClientMessageType.LIST_CHANNELS:
255
+ case ClientMessageType.PING:
256
+ // No additional validation needed
257
+ break;
258
+ case ClientMessageType.PROPOSAL:
259
+ // Proposals require: to, task, and signature
260
+ if (!msg.to) {
261
+ return { valid: false, error: 'Missing target (to)' };
262
+ }
263
+ if (!isAgent(msg.to)) {
264
+ return { valid: false, error: 'Proposals must be sent to an agent (@id)' };
265
+ }
266
+ if (!msg.task || typeof msg.task !== 'string') {
267
+ return { valid: false, error: 'Missing or invalid task description' };
268
+ }
269
+ if (!msg.sig) {
270
+ return { valid: false, error: 'Proposals must be signed' };
271
+ }
272
+ // Optional fields: amount, currency, payment_code, expires, terms, elo_stake
273
+ if (msg.expires !== undefined && typeof msg.expires !== 'number') {
274
+ return { valid: false, error: 'expires must be a number (seconds)' };
275
+ }
276
+ if (msg.elo_stake !== undefined && msg.elo_stake !== null) {
277
+ if (typeof msg.elo_stake !== 'number' || msg.elo_stake < 0 || !Number.isInteger(msg.elo_stake)) {
278
+ return { valid: false, error: 'elo_stake must be a non-negative integer' };
279
+ }
280
+ }
281
+ break;
282
+ case ClientMessageType.ACCEPT:
283
+ // Accept requires: proposal_id and signature
284
+ if (!msg.proposal_id) {
285
+ return { valid: false, error: 'Missing proposal_id' };
286
+ }
287
+ if (!msg.sig) {
288
+ return { valid: false, error: 'Accept must be signed' };
289
+ }
290
+ // Optional: elo_stake for acceptor's stake
291
+ if (msg.elo_stake !== undefined && msg.elo_stake !== null) {
292
+ if (typeof msg.elo_stake !== 'number' || msg.elo_stake < 0 || !Number.isInteger(msg.elo_stake)) {
293
+ return { valid: false, error: 'elo_stake must be a non-negative integer' };
294
+ }
295
+ }
296
+ break;
297
+ case ClientMessageType.REJECT:
298
+ // Reject requires: proposal_id and signature
299
+ if (!msg.proposal_id) {
300
+ return { valid: false, error: 'Missing proposal_id' };
301
+ }
302
+ if (!msg.sig) {
303
+ return { valid: false, error: 'Reject must be signed' };
304
+ }
305
+ break;
306
+ case ClientMessageType.COMPLETE:
307
+ // Complete requires: proposal_id, signature, and optionally proof
308
+ if (!msg.proposal_id) {
309
+ return { valid: false, error: 'Missing proposal_id' };
310
+ }
311
+ if (!msg.sig) {
312
+ return { valid: false, error: 'Complete must be signed' };
313
+ }
314
+ break;
315
+ case ClientMessageType.DISPUTE:
316
+ // Dispute requires: proposal_id, reason, and signature
317
+ if (!msg.proposal_id) {
318
+ return { valid: false, error: 'Missing proposal_id' };
319
+ }
320
+ if (!msg.reason || typeof msg.reason !== 'string') {
321
+ return { valid: false, error: 'Missing or invalid dispute reason' };
322
+ }
323
+ if (!msg.sig) {
324
+ return { valid: false, error: 'Dispute must be signed' };
325
+ }
326
+ break;
327
+ case ClientMessageType.REGISTER_SKILLS:
328
+ // Register skills requires: skills array and signature
329
+ if (!msg.skills || !Array.isArray(msg.skills)) {
330
+ return { valid: false, error: 'Missing or invalid skills array' };
331
+ }
332
+ if (msg.skills.length === 0) {
333
+ return { valid: false, error: 'Skills array cannot be empty' };
334
+ }
335
+ // Validate each skill has at least a capability
336
+ for (const skill of msg.skills) {
337
+ if (!skill.capability || typeof skill.capability !== 'string') {
338
+ return { valid: false, error: 'Each skill must have a capability string' };
339
+ }
340
+ }
341
+ if (!msg.sig) {
342
+ return { valid: false, error: 'Skill registration must be signed' };
343
+ }
344
+ break;
345
+ case ClientMessageType.SEARCH_SKILLS:
346
+ // Search skills requires: query object
347
+ if (!msg.query || typeof msg.query !== 'object') {
348
+ return { valid: false, error: 'Missing or invalid query object' };
349
+ }
350
+ // query_id is optional but useful for tracking responses
351
+ break;
352
+ case ClientMessageType.SET_PRESENCE:
353
+ // Set presence requires: status (online, away, busy, offline)
354
+ const validStatuses = ['online', 'away', 'busy', 'offline', 'listening'];
355
+ if (!msg.status || !validStatuses.includes(msg.status)) {
356
+ return { valid: false, error: `Invalid presence status. Must be one of: ${validStatuses.join(', ')}` };
357
+ }
358
+ // Optional: status_text for custom message
359
+ if (msg.status_text !== undefined && typeof msg.status_text !== 'string') {
360
+ return { valid: false, error: 'status_text must be a string' };
361
+ }
362
+ if (msg.status_text && msg.status_text.length > 100) {
363
+ return { valid: false, error: 'status_text too long (max 100 chars)' };
364
+ }
365
+ break;
366
+ case ClientMessageType.VERIFY_REQUEST:
367
+ // Verify request requires: target agent and nonce
368
+ if (!msg.target) {
369
+ return { valid: false, error: 'Missing target agent' };
370
+ }
371
+ if (!isAgent(msg.target)) {
372
+ return { valid: false, error: 'Target must be an agent (@id)' };
373
+ }
374
+ if (!msg.nonce || typeof msg.nonce !== 'string') {
375
+ return { valid: false, error: 'Missing or invalid nonce' };
376
+ }
377
+ if (msg.nonce.length < 16 || msg.nonce.length > 128) {
378
+ return { valid: false, error: 'Nonce must be 16-128 characters' };
379
+ }
380
+ break;
381
+ case ClientMessageType.VERIFY_RESPONSE:
382
+ // Verify response requires: request_id, nonce, and signature
383
+ if (!msg.request_id) {
384
+ return { valid: false, error: 'Missing request_id' };
385
+ }
386
+ if (!msg.nonce || typeof msg.nonce !== 'string') {
387
+ return { valid: false, error: 'Missing or invalid nonce' };
388
+ }
389
+ if (!msg.sig || typeof msg.sig !== 'string') {
390
+ return { valid: false, error: 'Missing or invalid signature' };
391
+ }
392
+ break;
393
+ case ClientMessageType.ADMIN_APPROVE:
394
+ if (!msg.pubkey || typeof msg.pubkey !== 'string') {
395
+ return { valid: false, error: 'Missing or invalid pubkey' };
396
+ }
397
+ if (!msg.admin_key || typeof msg.admin_key !== 'string') {
398
+ return { valid: false, error: 'Missing admin_key' };
399
+ }
400
+ break;
401
+ case ClientMessageType.ADMIN_REVOKE:
402
+ if (!msg.pubkey && !msg.agent_id) {
403
+ return { valid: false, error: 'Missing pubkey or agent_id' };
404
+ }
405
+ if (!msg.admin_key || typeof msg.admin_key !== 'string') {
406
+ return { valid: false, error: 'Missing admin_key' };
407
+ }
408
+ break;
409
+ case ClientMessageType.ADMIN_LIST:
410
+ if (!msg.admin_key || typeof msg.admin_key !== 'string') {
411
+ return { valid: false, error: 'Missing admin_key' };
412
+ }
413
+ break;
414
+ case ClientMessageType.VERIFY_IDENTITY:
415
+ if (!msg.challenge_id || typeof msg.challenge_id !== 'string') {
416
+ return { valid: false, error: 'Missing or invalid challenge_id' };
417
+ }
418
+ if (!msg.signature || typeof msg.signature !== 'string') {
419
+ return { valid: false, error: 'Missing or invalid signature' };
420
+ }
421
+ if (!msg.timestamp || typeof msg.timestamp !== 'number') {
422
+ return { valid: false, error: 'Missing or invalid timestamp' };
423
+ }
424
+ break;
425
+ default:
426
+ return { valid: false, error: `Unknown message type: ${msg.type}` };
427
+ }
428
+ return { valid: true, msg: msg };
429
+ }
430
+ /**
431
+ * Generate a unique agent ID
432
+ */
433
+ export function generateAgentId() {
434
+ const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
435
+ let id = '';
436
+ for (let i = 0; i < 8; i++) {
437
+ id += chars[Math.floor(Math.random() * chars.length)];
438
+ }
439
+ return id;
440
+ }
441
+ /**
442
+ * Serialize message for sending over WebSocket
443
+ */
444
+ export function serialize(msg) {
445
+ return JSON.stringify(msg);
446
+ }
447
+ /**
448
+ * Parse message from WebSocket
449
+ */
450
+ export function parse(data) {
451
+ return JSON.parse(data);
452
+ }
453
+ /**
454
+ * Generate a unique proposal ID
455
+ * Format: prop_<timestamp>_<random>
456
+ */
457
+ export function generateProposalId() {
458
+ const timestamp = Date.now().toString(36);
459
+ const random = crypto.randomBytes(4).toString('hex');
460
+ return `prop_${timestamp}_${random}`;
461
+ }
462
+ /**
463
+ * Check if a message type is a proposal-related type
464
+ */
465
+ export function isProposalMessage(type) {
466
+ const proposalTypes = [
467
+ ClientMessageType.PROPOSAL,
468
+ ClientMessageType.ACCEPT,
469
+ ClientMessageType.REJECT,
470
+ ClientMessageType.COMPLETE,
471
+ ClientMessageType.DISPUTE
472
+ ];
473
+ return proposalTypes.includes(type);
474
+ }
475
+ /**
476
+ * Generate a unique verification request ID
477
+ * Format: verify_<timestamp>_<random>
478
+ */
479
+ export function generateVerifyId() {
480
+ const timestamp = Date.now().toString(36);
481
+ const random = crypto.randomBytes(4).toString('hex');
482
+ return `verify_${timestamp}_${random}`;
483
+ }
484
+ /**
485
+ * Generate a random nonce for identity verification
486
+ * Returns a 32-character hex string
487
+ */
488
+ export function generateNonce() {
489
+ return crypto.randomBytes(16).toString('hex');
490
+ }
491
+ /**
492
+ * Generate a unique challenge ID
493
+ * Format: chal_<timestamp36>_<random>
494
+ */
495
+ export function generateChallengeId() {
496
+ const timestamp = Date.now().toString(36);
497
+ const random = crypto.randomBytes(4).toString('hex');
498
+ return `chal_${timestamp}_${random}`;
499
+ }
500
+ /**
501
+ * Generate the canonical signing content for challenge-response auth.
502
+ * Client signs this to prove private key ownership.
503
+ */
504
+ export function generateAuthSigningContent(nonce, challengeId, timestamp) {
505
+ return `AGENTCHAT_AUTH|${nonce}|${challengeId}|${timestamp}`;
506
+ }
507
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../lib/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * AgentChat Receipts Module
3
+ * Stores and manages COMPLETE receipts for portable reputation
4
+ *
5
+ * Receipts are proof of completed work between agents.
6
+ * They can be exported for reputation aggregation.
7
+ */
8
+ import type { RatingChanges } from './reputation.js';
9
+ export interface ProposalInfo {
10
+ from?: string;
11
+ to?: string;
12
+ task?: string;
13
+ amount?: number;
14
+ currency?: string;
15
+ }
16
+ export interface Receipt {
17
+ type?: string;
18
+ status?: string;
19
+ proposal_id?: string;
20
+ proposal?: ProposalInfo;
21
+ from?: string;
22
+ to?: string;
23
+ amount?: number;
24
+ currency?: string;
25
+ completed_by?: string;
26
+ completed_at?: number;
27
+ disputed_at?: number;
28
+ stored_at?: number;
29
+ ts?: number;
30
+ proof?: string;
31
+ _ratingChanges?: RatingChanges;
32
+ }
33
+ export interface StoredReceipt extends Receipt {
34
+ stored_at: number;
35
+ }
36
+ export interface AppendReceiptOptions {
37
+ updateRatings?: boolean;
38
+ }
39
+ export interface ReceiptStats {
40
+ count: number;
41
+ counterparties: string[];
42
+ dateRange: {
43
+ oldest: string;
44
+ newest: string;
45
+ } | null;
46
+ currencies: Record<string, CurrencyStats>;
47
+ }
48
+ export interface CurrencyStats {
49
+ count: number;
50
+ totalAmount: number;
51
+ }
52
+ export declare const DEFAULT_RECEIPTS_PATH: string;
53
+ /**
54
+ * Append a receipt to the receipts file
55
+ * @param receipt - The COMPLETE message/receipt to store
56
+ * @param receiptsPath - Path to receipts file
57
+ * @param options - Options
58
+ * @param options.updateRatings - Whether to update ELO ratings (default: true)
59
+ */
60
+ export declare function appendReceipt(receipt: Receipt, receiptsPath?: string, options?: AppendReceiptOptions): Promise<StoredReceipt>;
61
+ /**
62
+ * Read all receipts from the receipts file
63
+ * @param receiptsPath - Path to receipts file
64
+ * @returns Array of receipt objects
65
+ */
66
+ export declare function readReceipts(receiptsPath?: string): Promise<Receipt[]>;
67
+ /**
68
+ * Filter receipts by agent ID (where agent is a party)
69
+ * @param receipts - Array of receipts
70
+ * @param agentId - Agent ID to filter by
71
+ * @returns Filtered receipts
72
+ */
73
+ export declare function filterByAgent(receipts: Receipt[], agentId: string): Receipt[];
74
+ /**
75
+ * Get unique counterparties from receipts
76
+ * @param receipts - Array of receipts
77
+ * @param agentId - Our agent ID
78
+ * @returns Array of unique counterparty IDs
79
+ */
80
+ export declare function getCounterparties(receipts: Receipt[], agentId: string): string[];
81
+ /**
82
+ * Get receipt statistics
83
+ * @param receipts - Array of receipts
84
+ * @param agentId - Optional agent ID for filtering
85
+ * @returns Statistics object
86
+ */
87
+ export declare function getStats(receipts: Receipt[], agentId?: string | null): ReceiptStats;
88
+ /**
89
+ * Export receipts in specified format
90
+ * @param receipts - Array of receipts
91
+ * @param format - 'json' or 'yaml'
92
+ * @returns Formatted output
93
+ */
94
+ export declare function exportReceipts(receipts: Receipt[], format?: 'json' | 'yaml'): string;
95
+ /**
96
+ * Check if a receipt should be stored (we are a party to it)
97
+ * @param completeMsg - The COMPLETE message
98
+ * @param ourAgentId - Our agent ID
99
+ * @returns boolean
100
+ */
101
+ export declare function shouldStoreReceipt(completeMsg: Receipt, ourAgentId: string): boolean;
102
+ /**
103
+ * ReceiptStore class for managing receipts
104
+ */
105
+ export declare class ReceiptStore {
106
+ private receiptsPath;
107
+ private _receipts;
108
+ constructor(receiptsPath?: string);
109
+ /**
110
+ * Load receipts from file
111
+ */
112
+ load(): Promise<Receipt[]>;
113
+ /**
114
+ * Get all receipts (loads if needed)
115
+ */
116
+ getAll(): Promise<Receipt[]>;
117
+ /**
118
+ * Add a receipt
119
+ */
120
+ add(receipt: Receipt): Promise<StoredReceipt>;
121
+ /**
122
+ * Get receipts for an agent
123
+ */
124
+ getForAgent(agentId: string): Promise<Receipt[]>;
125
+ /**
126
+ * Get statistics
127
+ */
128
+ getStats(agentId?: string | null): Promise<ReceiptStats>;
129
+ /**
130
+ * Export receipts
131
+ */
132
+ export(format?: 'json' | 'yaml', agentId?: string | null): Promise<string>;
133
+ }
134
+ //# sourceMappingURL=receipts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipts.d.ts","sourceRoot":"","sources":["../../lib/receipts.ts"],"names":[],"mappings":"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"}