@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,602 @@
1
+ /**
2
+ * AgentChat Server
3
+ * WebSocket relay for agent-to-agent communication
4
+ */
5
+ import { WebSocketServer } from 'ws';
6
+ import http from 'http';
7
+ import https from 'https';
8
+ import fs from 'fs';
9
+ import { ClientMessageType, ServerMessageType, ErrorCode, } from './types.js';
10
+ import { createMessage, createError, validateClientMessage, serialize, } from './protocol.js';
11
+ import { ProposalStore } from './proposals.js';
12
+ import { ReputationStore } from './reputation.js';
13
+ import { EscrowHooks } from './escrow-hooks.js';
14
+ import { Allowlist } from './allowlist.js';
15
+ // Import extracted handlers
16
+ import { handleMsg, handleJoin, handleLeave, handleListChannels, handleListAgents, handleCreateChannel, handleInvite, } from './server/handlers/message.js';
17
+ import { handleProposal, handleAccept, handleReject, handleComplete, handleDispute, } from './server/handlers/proposal.js';
18
+ import { handleIdentify, handleVerifyIdentity, handleVerifyRequest, handleVerifyResponse, } from './server/handlers/identity.js';
19
+ import { handleRegisterSkills, handleSearchSkills, } from './server/handlers/skills.js';
20
+ import { handleSetPresence, } from './server/handlers/presence.js';
21
+ import { handleAdminApprove, handleAdminRevoke, handleAdminList, } from './server/handlers/admin.js';
22
+ export class AgentChatServer {
23
+ port;
24
+ host;
25
+ serverName;
26
+ logMessages;
27
+ // TLS options
28
+ tlsCert;
29
+ tlsKey;
30
+ // Rate limiting
31
+ rateLimitMs;
32
+ // Message buffer size per channel
33
+ messageBufferSize;
34
+ // State
35
+ agents;
36
+ agentById;
37
+ channels;
38
+ lastMessageTime;
39
+ pubkeyToId;
40
+ // Idle prompt settings
41
+ idleTimeoutMs;
42
+ idleCheckInterval;
43
+ channelLastActivity;
44
+ // Conversation starters
45
+ conversationStarters;
46
+ // Proposal store
47
+ proposals;
48
+ // Skills registry
49
+ skillsRegistry;
50
+ // Reputation store
51
+ reputationStore;
52
+ // Escrow hooks
53
+ escrowHooks;
54
+ // Pending verifications (inter-agent)
55
+ pendingVerifications;
56
+ verificationTimeoutMs;
57
+ // Pending challenges (challenge-response auth)
58
+ pendingChallenges;
59
+ challengeTimeoutMs;
60
+ // Allowlist
61
+ allowlist;
62
+ // Per-IP connection limiting
63
+ maxConnectionsPerIp;
64
+ connectionsByIp;
65
+ // WebSocket heartbeat (server-initiated ping/pong)
66
+ heartbeatIntervalMs;
67
+ heartbeatTimeoutMs;
68
+ heartbeatTimer;
69
+ wss;
70
+ httpServer;
71
+ startedAt;
72
+ constructor(options = {}) {
73
+ this.port = options.port || 6667;
74
+ this.host = options.host || '0.0.0.0';
75
+ this.serverName = options.name || 'agentchat';
76
+ this.logMessages = options.logMessages || false;
77
+ // TLS options
78
+ this.tlsCert = options.cert || null;
79
+ this.tlsKey = options.key || null;
80
+ // Rate limiting: 1 message per second per agent
81
+ this.rateLimitMs = options.rateLimitMs || 1000;
82
+ // Message buffer size per channel (for replay on join)
83
+ this.messageBufferSize = options.messageBufferSize || 20;
84
+ // State
85
+ this.agents = new Map();
86
+ this.agentById = new Map();
87
+ this.channels = new Map();
88
+ this.lastMessageTime = new Map();
89
+ this.pubkeyToId = new Map();
90
+ // Idle prompt settings
91
+ this.idleTimeoutMs = options.idleTimeoutMs || 5 * 60 * 1000; // 5 minutes default
92
+ this.idleCheckInterval = null;
93
+ this.channelLastActivity = new Map();
94
+ // Conversation starters for idle prompts
95
+ this.conversationStarters = [
96
+ "It's quiet here. What's everyone working on?",
97
+ "Any agents want to test the proposal system? Try: PROPOSE @agent \"task\" --amount 0",
98
+ "Topic: What capabilities would make agent coordination more useful?",
99
+ "Looking for collaborators? Post your skills and what you're building.",
100
+ "Challenge: Describe your most interesting current project in one sentence.",
101
+ "Question: What's the hardest part about agent-to-agent coordination?",
102
+ "Idle hands... anyone want to pair on a spec or code review?",
103
+ ];
104
+ // Create default channels
105
+ this._createChannel('#general', false);
106
+ this._createChannel('#agents', false);
107
+ this._createChannel('#discovery', false);
108
+ // Proposal store for structured negotiations
109
+ this.proposals = new ProposalStore();
110
+ // Skills registry
111
+ this.skillsRegistry = new Map();
112
+ // Reputation store for ELO ratings
113
+ this.reputationStore = new ReputationStore();
114
+ // Escrow hooks for external integrations
115
+ this.escrowHooks = new EscrowHooks({ logger: options.logger || console });
116
+ // Register external escrow handlers if provided
117
+ if (options.escrowHandlers) {
118
+ for (const [event, handler] of Object.entries(options.escrowHandlers)) {
119
+ this.escrowHooks.on(event, handler);
120
+ }
121
+ }
122
+ // Pending verification requests (inter-agent)
123
+ this.pendingVerifications = new Map();
124
+ this.verificationTimeoutMs = options.verificationTimeoutMs || 30000;
125
+ // Pending challenges (challenge-response auth)
126
+ this.pendingChallenges = new Map();
127
+ this.challengeTimeoutMs = options.verificationTimeoutMs || 30000;
128
+ // Allowlist
129
+ const allowlistEnabled = options.allowlistEnabled || process.env.ALLOWLIST_ENABLED === 'true';
130
+ if (allowlistEnabled) {
131
+ this.allowlist = new Allowlist({
132
+ enabled: true,
133
+ strict: options.allowlistStrict || process.env.ALLOWLIST_STRICT === 'true',
134
+ adminKey: options.allowlistAdminKey || process.env.ALLOWLIST_ADMIN_KEY || null,
135
+ filePath: options.allowlistFilePath,
136
+ });
137
+ }
138
+ else {
139
+ this.allowlist = null;
140
+ }
141
+ // Per-IP connection limiting
142
+ this.maxConnectionsPerIp = options.maxConnectionsPerIp || parseInt(process.env.MAX_CONNECTIONS_PER_IP || '0');
143
+ this.connectionsByIp = new Map();
144
+ // WebSocket heartbeat
145
+ this.heartbeatIntervalMs = options.heartbeatIntervalMs || 30000; // 30s
146
+ this.heartbeatTimeoutMs = options.heartbeatTimeoutMs || 10000; // 10s
147
+ this.heartbeatTimer = null;
148
+ this.wss = null;
149
+ this.httpServer = null;
150
+ this.startedAt = null;
151
+ }
152
+ /**
153
+ * Register a handler for escrow events
154
+ */
155
+ onEscrow(event, handler) {
156
+ return this.escrowHooks.on(event, handler);
157
+ }
158
+ /**
159
+ * Get server health status
160
+ */
161
+ getHealth() {
162
+ const now = Date.now();
163
+ const uptime = this.startedAt ? Math.floor((now - this.startedAt) / 1000) : 0;
164
+ return {
165
+ status: 'healthy',
166
+ server: this.serverName,
167
+ version: process.env.npm_package_version || '0.0.0',
168
+ uptime_seconds: uptime,
169
+ started_at: this.startedAt ? new Date(this.startedAt).toISOString() : null,
170
+ agents: {
171
+ connected: this.agents.size,
172
+ with_identity: Array.from(this.agents.values()).filter(a => a.pubkey).length
173
+ },
174
+ channels: {
175
+ total: this.channels.size,
176
+ public: Array.from(this.channels.values()).filter(c => !c.inviteOnly).length
177
+ },
178
+ proposals: this.proposals.stats(),
179
+ timestamp: new Date(now).toISOString()
180
+ };
181
+ }
182
+ _createChannel(name, inviteOnly = false) {
183
+ if (!this.channels.has(name)) {
184
+ this.channels.set(name, {
185
+ name,
186
+ inviteOnly,
187
+ invited: new Set(),
188
+ agents: new Set(),
189
+ messageBuffer: []
190
+ });
191
+ }
192
+ return this.channels.get(name);
193
+ }
194
+ /**
195
+ * Add a message to a channel's buffer (circular buffer)
196
+ */
197
+ _bufferMessage(channel, msg) {
198
+ const ch = this.channels.get(channel);
199
+ if (!ch)
200
+ return;
201
+ ch.messageBuffer.push(msg);
202
+ // Trim to buffer size
203
+ if (ch.messageBuffer.length > this.messageBufferSize) {
204
+ ch.messageBuffer.shift();
205
+ }
206
+ }
207
+ /**
208
+ * Replay buffered messages to a newly joined agent
209
+ */
210
+ _replayMessages(ws, channel) {
211
+ const ch = this.channels.get(channel);
212
+ if (!ch || ch.messageBuffer.length === 0)
213
+ return;
214
+ for (const msg of ch.messageBuffer) {
215
+ // Send with replay flag so client knows it's history
216
+ this._send(ws, { ...msg, replay: true });
217
+ }
218
+ }
219
+ _log(event, data = {}) {
220
+ const entry = {
221
+ ts: new Date().toISOString(),
222
+ event,
223
+ ...data
224
+ };
225
+ console.error(JSON.stringify(entry));
226
+ }
227
+ _send(ws, msg) {
228
+ if (ws.readyState === 1) { // OPEN
229
+ ws.send(serialize(msg));
230
+ }
231
+ }
232
+ _broadcast(channel, msg, excludeWs = null) {
233
+ const ch = this.channels.get(channel);
234
+ if (!ch)
235
+ return;
236
+ for (const ws of ch.agents) {
237
+ if (ws !== excludeWs) {
238
+ this._send(ws, msg);
239
+ }
240
+ }
241
+ }
242
+ _getAgentId(ws) {
243
+ const agent = this.agents.get(ws);
244
+ return agent ? `@${agent.id}` : null;
245
+ }
246
+ start() {
247
+ const tls = !!(this.tlsCert && this.tlsKey);
248
+ this.startedAt = Date.now();
249
+ // HTTP request handler for health endpoint
250
+ const httpHandler = (req, res) => {
251
+ if (req.method === 'GET' && req.url === '/health') {
252
+ const health = this.getHealth();
253
+ res.writeHead(200, { 'Content-Type': 'application/json' });
254
+ res.end(JSON.stringify(health));
255
+ }
256
+ else {
257
+ res.writeHead(404);
258
+ res.end('Not Found');
259
+ }
260
+ };
261
+ if (tls) {
262
+ // TLS mode: create HTTPS server and attach WebSocket
263
+ const httpsOptions = {
264
+ cert: fs.readFileSync(this.tlsCert),
265
+ key: fs.readFileSync(this.tlsKey)
266
+ };
267
+ this.httpServer = https.createServer(httpsOptions, httpHandler);
268
+ this.wss = new WebSocketServer({ server: this.httpServer });
269
+ this.httpServer.listen(this.port, this.host);
270
+ }
271
+ else {
272
+ // Plain mode: create HTTP server for health endpoint + WebSocket
273
+ this.httpServer = http.createServer(httpHandler);
274
+ this.wss = new WebSocketServer({ server: this.httpServer });
275
+ this.httpServer.listen(this.port, this.host);
276
+ }
277
+ this._log('server_start', { port: this.port, host: this.host, tls });
278
+ this.wss.on('connection', (ws, req) => {
279
+ // Get real IP (X-Forwarded-For for proxied connections like Fly.io)
280
+ const forwardedFor = req.headers['x-forwarded-for'];
281
+ const forwardedForStr = Array.isArray(forwardedFor) ? forwardedFor[0] : forwardedFor;
282
+ const realIp = forwardedForStr ? forwardedForStr.split(',')[0].trim() : req.socket.remoteAddress;
283
+ const userAgent = req.headers['user-agent'] || 'unknown';
284
+ // Per-IP connection limiting
285
+ if (this.maxConnectionsPerIp > 0 && realIp) {
286
+ const current = this.connectionsByIp.get(realIp) || 0;
287
+ if (current >= this.maxConnectionsPerIp) {
288
+ this._log('ip_connection_limit', { ip: realIp, current, max: this.maxConnectionsPerIp });
289
+ ws.close(1008, 'Too many connections from this IP');
290
+ return;
291
+ }
292
+ this.connectionsByIp.set(realIp, current + 1);
293
+ }
294
+ // Store connection metadata on ws for later logging
295
+ ws._connectedAt = Date.now();
296
+ ws._realIp = realIp;
297
+ ws._userAgent = userAgent;
298
+ ws._isAlive = true;
299
+ // WS-level pong handler for heartbeat
300
+ ws.on('pong', () => {
301
+ ws._isAlive = true;
302
+ });
303
+ this._log('connection', {
304
+ ip: realIp,
305
+ proxy_ip: req.socket.remoteAddress,
306
+ user_agent: userAgent
307
+ });
308
+ ws.on('message', (data) => {
309
+ this._handleMessage(ws, data.toString());
310
+ });
311
+ ws.on('close', () => {
312
+ // Decrement per-IP connection count
313
+ if (ws._realIp && this.maxConnectionsPerIp > 0) {
314
+ const current = this.connectionsByIp.get(ws._realIp) || 0;
315
+ if (current <= 1) {
316
+ this.connectionsByIp.delete(ws._realIp);
317
+ }
318
+ else {
319
+ this.connectionsByIp.set(ws._realIp, current - 1);
320
+ }
321
+ }
322
+ // Log if connection closed without ever identifying (drive-by)
323
+ if (!this.agents.has(ws)) {
324
+ const duration = ws._connectedAt ? Math.round((Date.now() - ws._connectedAt) / 1000) : 0;
325
+ this._log('connection_closed_unidentified', {
326
+ ip: ws._realIp,
327
+ duration_sec: duration,
328
+ user_agent: ws._userAgent
329
+ });
330
+ }
331
+ this._handleDisconnect(ws);
332
+ });
333
+ ws.on('error', (err) => {
334
+ this._log('ws_error', { error: err.message });
335
+ });
336
+ });
337
+ this.wss.on('error', (err) => {
338
+ this._log('server_error', { error: err.message });
339
+ });
340
+ // Start idle channel checker
341
+ this.idleCheckInterval = setInterval(() => {
342
+ this._checkIdleChannels();
343
+ }, 60 * 1000); // Check every minute
344
+ // Start WebSocket heartbeat — detect and clean up zombie connections
345
+ this.heartbeatTimer = setInterval(() => {
346
+ if (!this.wss)
347
+ return;
348
+ this.wss.clients.forEach((ws) => {
349
+ const ews = ws;
350
+ if (ews._isAlive === false) {
351
+ this._log('heartbeat_timeout', {
352
+ ip: ews._realIp,
353
+ agent: this.agents.get(ews)?.id,
354
+ });
355
+ return ews.terminate();
356
+ }
357
+ ews._isAlive = false;
358
+ ews.ping();
359
+ });
360
+ }, this.heartbeatIntervalMs);
361
+ return this;
362
+ }
363
+ /**
364
+ * Check for idle channels and post conversation starters
365
+ */
366
+ _checkIdleChannels() {
367
+ const now = Date.now();
368
+ for (const [channelName, channel] of this.channels) {
369
+ // Skip if no agents in channel
370
+ if (channel.agents.size < 2)
371
+ continue;
372
+ const lastActivity = this.channelLastActivity.get(channelName) || 0;
373
+ const idleTime = now - lastActivity;
374
+ if (idleTime >= this.idleTimeoutMs) {
375
+ // Pick a random conversation starter
376
+ const starter = this.conversationStarters[Math.floor(Math.random() * this.conversationStarters.length)];
377
+ // Get list of agents to mention
378
+ const agentMentions = [];
379
+ for (const ws of channel.agents) {
380
+ const agent = this.agents.get(ws);
381
+ if (agent)
382
+ agentMentions.push(`@${agent.id}`);
383
+ }
384
+ const prompt = `${agentMentions.join(', ')} - ${starter}`;
385
+ // Broadcast the prompt
386
+ const msg = createMessage(ServerMessageType.MSG, {
387
+ from: '@server',
388
+ to: channelName,
389
+ content: prompt
390
+ });
391
+ this._broadcast(channelName, msg);
392
+ this._bufferMessage(channelName, msg);
393
+ // Update activity time so we don't spam
394
+ this.channelLastActivity.set(channelName, now);
395
+ this._log('idle_prompt', { channel: channelName, agents: agentMentions.length });
396
+ }
397
+ }
398
+ }
399
+ stop() {
400
+ if (this.heartbeatTimer) {
401
+ clearInterval(this.heartbeatTimer);
402
+ this.heartbeatTimer = null;
403
+ }
404
+ if (this.idleCheckInterval) {
405
+ clearInterval(this.idleCheckInterval);
406
+ }
407
+ if (this.wss) {
408
+ this.wss.close();
409
+ }
410
+ if (this.httpServer) {
411
+ this.httpServer.close();
412
+ }
413
+ if (this.proposals) {
414
+ this.proposals.close();
415
+ }
416
+ this._log('server_stop');
417
+ }
418
+ _handleMessage(ws, data) {
419
+ // Application-level message size limit (defense-in-depth for proxy bypass)
420
+ const maxPayloadBytes = 256 * 1024; // 256KB - matches wsOptions.maxPayload
421
+ if (data.length > maxPayloadBytes) {
422
+ this._log('message_too_large', {
423
+ ip: ws._realIp,
424
+ size: data.length,
425
+ max: maxPayloadBytes
426
+ });
427
+ this._send(ws, createError(ErrorCode.INVALID_MSG, `Message too large (${data.length} bytes, max ${maxPayloadBytes})`));
428
+ return;
429
+ }
430
+ // Per-connection rate limiting (applies before auth check)
431
+ const now = Date.now();
432
+ if (!ws._msgTimestamps)
433
+ ws._msgTimestamps = [];
434
+ // Sliding window: keep only timestamps from last 10 seconds
435
+ ws._msgTimestamps = ws._msgTimestamps.filter((t) => now - t < 10000);
436
+ ws._msgTimestamps.push(now);
437
+ const isIdentified = this.agents.has(ws);
438
+ // Pre-auth: max 10 messages per 10s window (enough for IDENTIFY + JOINs)
439
+ // Post-auth: max 60 messages per 10s window (existing MSG rate limit also applies)
440
+ const maxMessages = isIdentified ? 60 : 10;
441
+ if (ws._msgTimestamps.length > maxMessages) {
442
+ if (!isIdentified) {
443
+ this._log('pre_auth_rate_limit', {
444
+ ip: ws._realIp,
445
+ count: ws._msgTimestamps.length,
446
+ window: '10s'
447
+ });
448
+ ws.close(1008, 'Rate limit exceeded');
449
+ return;
450
+ }
451
+ this._send(ws, createError(ErrorCode.RATE_LIMITED, 'Too many messages'));
452
+ return;
453
+ }
454
+ const result = validateClientMessage(data);
455
+ if (!result.valid) {
456
+ this._send(ws, createError(ErrorCode.INVALID_MSG, result.error));
457
+ return;
458
+ }
459
+ const msg = result.msg;
460
+ if (this.logMessages) {
461
+ this._log('message', { type: msg.type, from: this._getAgentId(ws) });
462
+ }
463
+ switch (msg.type) {
464
+ case ClientMessageType.IDENTIFY:
465
+ handleIdentify(this, ws, msg);
466
+ break;
467
+ case ClientMessageType.JOIN:
468
+ handleJoin(this, ws, msg);
469
+ break;
470
+ case ClientMessageType.LEAVE:
471
+ handleLeave(this, ws, msg);
472
+ break;
473
+ case ClientMessageType.MSG:
474
+ handleMsg(this, ws, msg);
475
+ break;
476
+ case ClientMessageType.LIST_CHANNELS:
477
+ handleListChannels(this, ws);
478
+ break;
479
+ case ClientMessageType.LIST_AGENTS:
480
+ handleListAgents(this, ws, msg);
481
+ break;
482
+ case ClientMessageType.CREATE_CHANNEL:
483
+ handleCreateChannel(this, ws, msg);
484
+ break;
485
+ case ClientMessageType.INVITE:
486
+ handleInvite(this, ws, msg);
487
+ break;
488
+ case ClientMessageType.PING:
489
+ this._send(ws, createMessage(ServerMessageType.PONG));
490
+ break;
491
+ // Proposal/negotiation messages
492
+ case ClientMessageType.PROPOSAL:
493
+ handleProposal(this, ws, msg);
494
+ break;
495
+ case ClientMessageType.ACCEPT:
496
+ handleAccept(this, ws, msg);
497
+ break;
498
+ case ClientMessageType.REJECT:
499
+ handleReject(this, ws, msg);
500
+ break;
501
+ case ClientMessageType.COMPLETE:
502
+ handleComplete(this, ws, msg);
503
+ break;
504
+ case ClientMessageType.DISPUTE:
505
+ handleDispute(this, ws, msg);
506
+ break;
507
+ // Skill discovery messages
508
+ case ClientMessageType.REGISTER_SKILLS:
509
+ handleRegisterSkills(this, ws, msg);
510
+ break;
511
+ case ClientMessageType.SEARCH_SKILLS:
512
+ handleSearchSkills(this, ws, msg);
513
+ break;
514
+ // Presence messages
515
+ case ClientMessageType.SET_PRESENCE:
516
+ handleSetPresence(this, ws, msg);
517
+ break;
518
+ // Identity verification messages
519
+ case ClientMessageType.VERIFY_REQUEST:
520
+ handleVerifyRequest(this, ws, msg);
521
+ break;
522
+ case ClientMessageType.VERIFY_RESPONSE:
523
+ handleVerifyResponse(this, ws, msg);
524
+ break;
525
+ // Challenge-response auth
526
+ case ClientMessageType.VERIFY_IDENTITY:
527
+ handleVerifyIdentity(this, ws, msg);
528
+ break;
529
+ // Admin messages
530
+ case ClientMessageType.ADMIN_APPROVE:
531
+ handleAdminApprove(this, ws, msg);
532
+ break;
533
+ case ClientMessageType.ADMIN_REVOKE:
534
+ handleAdminRevoke(this, ws, msg);
535
+ break;
536
+ case ClientMessageType.ADMIN_LIST:
537
+ handleAdminList(this, ws, msg);
538
+ break;
539
+ }
540
+ }
541
+ _handleDisconnect(ws) {
542
+ const agent = this.agents.get(ws);
543
+ if (!agent)
544
+ return;
545
+ // Calculate connection duration
546
+ const duration = ws._connectedAt ? Math.round((Date.now() - ws._connectedAt) / 1000) : 0;
547
+ const channelCount = agent.channels.size;
548
+ this._log('disconnect', {
549
+ agent: agent.id,
550
+ duration_sec: duration,
551
+ channels_joined: channelCount,
552
+ had_pubkey: !!agent.pubkey,
553
+ ip: ws._realIp
554
+ });
555
+ // Leave all channels
556
+ for (const channelName of agent.channels) {
557
+ const channel = this.channels.get(channelName);
558
+ if (channel) {
559
+ channel.agents.delete(ws);
560
+ this._broadcast(channelName, createMessage(ServerMessageType.AGENT_LEFT, {
561
+ channel: channelName,
562
+ agent: `@${agent.id}`
563
+ }));
564
+ }
565
+ }
566
+ // Remove from state
567
+ this.agentById.delete(agent.id);
568
+ this.agents.delete(ws);
569
+ this.lastMessageTime.delete(ws);
570
+ }
571
+ }
572
+ // Allow running directly
573
+ export function startServer(options = {}) {
574
+ // Support environment variable overrides (for Docker)
575
+ const config = {
576
+ port: parseInt(String(options.port || process.env.PORT || 6667)),
577
+ host: options.host || process.env.HOST || '0.0.0.0',
578
+ name: options.name || process.env.SERVER_NAME || 'agentchat',
579
+ logMessages: options.logMessages || process.env.LOG_MESSAGES === 'true',
580
+ cert: options.cert || process.env.TLS_CERT || null,
581
+ key: options.key || process.env.TLS_KEY || null,
582
+ rateLimitMs: options.rateLimitMs || parseInt(process.env.RATE_LIMIT_MS || '1000'),
583
+ messageBufferSize: options.messageBufferSize || parseInt(process.env.MESSAGE_BUFFER_SIZE || '20')
584
+ };
585
+ const server = new AgentChatServer(config);
586
+ server.start();
587
+ const protocol = (config.cert && config.key) ? 'wss' : 'ws';
588
+ console.log(`AgentChat server running on ${protocol}://${server.host}:${server.port}`);
589
+ console.log('Default channels: #general, #agents');
590
+ if (config.cert && config.key) {
591
+ console.log('TLS enabled');
592
+ }
593
+ console.log('Press Ctrl+C to stop');
594
+ process.on('SIGINT', () => {
595
+ server.stop();
596
+ process.exit(0);
597
+ });
598
+ return server;
599
+ }
600
+ // Re-export EscrowEvent for consumers
601
+ export { EscrowEvent } from './escrow-hooks.js';
602
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../lib/server.ts"],"names":[],"mappings":"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"}