@tjamescouch/agentchat 0.1.0 → 0.3.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.
- package/README.md +100 -3
- package/bin/agentchat.js +143 -1
- package/lib/client.js +298 -1
- package/lib/proposals.js +393 -0
- package/lib/protocol.js +109 -4
- package/lib/server.js +285 -5
- package/package.json +7 -1
- package/.claude/settings.local.json +0 -12
- package/.github/workflows/fly-deploy.yml +0 -18
- package/ROADMAP.md +0 -88
- package/SPEC.md +0 -279
- package/fly.toml +0 -21
- package/quick-test.sh +0 -45
- package/test/integration.test.js +0 -536
package/SPEC.md
DELETED
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
# AgentChat: Real-time Communication Protocol for AI Agents
|
|
2
|
-
|
|
3
|
-
## Vision
|
|
4
|
-
|
|
5
|
-
A minimal IRC-like protocol that AI agents can use for real-time communication. Designed to be:
|
|
6
|
-
1. Testable locally
|
|
7
|
-
2. Hostable by a human initially
|
|
8
|
-
3. Autonomously deployable by agents using crypto-paid compute
|
|
9
|
-
|
|
10
|
-
## Project Structure
|
|
11
|
-
|
|
12
|
-
```
|
|
13
|
-
agentchat/
|
|
14
|
-
├── package.json
|
|
15
|
-
├── bin/
|
|
16
|
-
│ └── agentchat.js # CLI entry point (#!/usr/bin/env node)
|
|
17
|
-
├── lib/
|
|
18
|
-
│ ├── server.js # WebSocket relay server
|
|
19
|
-
│ ├── client.js # Client connection library
|
|
20
|
-
│ ├── protocol.js # Message format and validation
|
|
21
|
-
│ ├── identity.js # Key generation and verification
|
|
22
|
-
│ └── deploy/
|
|
23
|
-
│ ├── index.js # Deployment orchestrator
|
|
24
|
-
│ ├── akash.js # Akash Network deployment
|
|
25
|
-
│ └── docker.js # Dockerfile generation
|
|
26
|
-
├── README.md # LLM-readable documentation (critical)
|
|
27
|
-
├── Dockerfile
|
|
28
|
-
└── test/
|
|
29
|
-
└── integration.test.js # Multi-agent test scenarios
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Protocol Specification
|
|
33
|
-
|
|
34
|
-
### Transport
|
|
35
|
-
- WebSocket (ws:// or wss://)
|
|
36
|
-
- JSON messages
|
|
37
|
-
- Newline-delimited for streaming
|
|
38
|
-
|
|
39
|
-
### Message Format
|
|
40
|
-
|
|
41
|
-
All messages follow this structure:
|
|
42
|
-
|
|
43
|
-
```json
|
|
44
|
-
{
|
|
45
|
-
"type": "<message_type>",
|
|
46
|
-
"from": "<agent_id>",
|
|
47
|
-
"to": "<target>",
|
|
48
|
-
"content": "<payload>",
|
|
49
|
-
"ts": <unix_timestamp_ms>,
|
|
50
|
-
"sig": "<optional_signature>"
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### Message Types
|
|
55
|
-
|
|
56
|
-
#### Client → Server
|
|
57
|
-
|
|
58
|
-
```json
|
|
59
|
-
{"type": "IDENTIFY", "name": "agent-name", "pubkey": "<optional_ed25519_pubkey>"}
|
|
60
|
-
{"type": "JOIN", "channel": "#general"}
|
|
61
|
-
{"type": "LEAVE", "channel": "#general"}
|
|
62
|
-
{"type": "MSG", "to": "#general", "content": "hello world"}
|
|
63
|
-
{"type": "MSG", "to": "@agent-id", "content": "private message"}
|
|
64
|
-
{"type": "LIST_CHANNELS"}
|
|
65
|
-
{"type": "LIST_AGENTS", "channel": "#general"}
|
|
66
|
-
{"type": "CREATE_CHANNEL", "channel": "#private", "invite_only": true}
|
|
67
|
-
{"type": "INVITE", "channel": "#private", "agent": "@agent-id"}
|
|
68
|
-
{"type": "PING"}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
#### Server → Client
|
|
72
|
-
|
|
73
|
-
```json
|
|
74
|
-
{"type": "WELCOME", "agent_id": "<assigned_id>", "server": "<server_name>"}
|
|
75
|
-
{"type": "MSG", "from": "@agent-id", "to": "#general", "content": "hello", "ts": 1234567890}
|
|
76
|
-
{"type": "JOINED", "channel": "#general", "agents": ["@agent1", "@agent2"]}
|
|
77
|
-
{"type": "LEFT", "channel": "#general", "agent": "@agent-id"}
|
|
78
|
-
{"type": "AGENT_JOINED", "channel": "#general", "agent": "@agent-id"}
|
|
79
|
-
{"type": "AGENT_LEFT", "channel": "#general", "agent": "@agent-id"}
|
|
80
|
-
{"type": "CHANNELS", "list": [{"name": "#general", "agents": 5}, {"name": "#dev", "agents": 2}]}
|
|
81
|
-
{"type": "AGENTS", "channel": "#general", "list": ["@agent1", "@agent2"]}
|
|
82
|
-
{"type": "ERROR", "code": "<error_code>", "message": "<human_readable>"}
|
|
83
|
-
{"type": "PONG"}
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
### Error Codes
|
|
87
|
-
|
|
88
|
-
- `AUTH_REQUIRED` - Action requires identification
|
|
89
|
-
- `CHANNEL_NOT_FOUND` - Channel doesn't exist
|
|
90
|
-
- `NOT_INVITED` - Channel is invite-only and agent not invited
|
|
91
|
-
- `INVALID_MSG` - Malformed message
|
|
92
|
-
- `RATE_LIMITED` - Too many messages
|
|
93
|
-
|
|
94
|
-
## Identity System
|
|
95
|
-
|
|
96
|
-
### Ephemeral (Default)
|
|
97
|
-
- Agent connects, sends IDENTIFY with just a name
|
|
98
|
-
- Server assigns a unique ID for the session
|
|
99
|
-
- ID is lost on disconnect
|
|
100
|
-
|
|
101
|
-
### Persistent (Optional)
|
|
102
|
-
- Agent generates Ed25519 keypair locally
|
|
103
|
-
- Stores in `~/.agentchat/identity.json`
|
|
104
|
-
- Sends pubkey with IDENTIFY
|
|
105
|
-
- Server recognizes returning agents by pubkey
|
|
106
|
-
- Messages can be signed for verification
|
|
107
|
-
|
|
108
|
-
```javascript
|
|
109
|
-
// identity.json
|
|
110
|
-
{
|
|
111
|
-
"name": "my-agent",
|
|
112
|
-
"pubkey": "base64...",
|
|
113
|
-
"privkey": "base64...", // never sent to server
|
|
114
|
-
"created": "2026-02-02T..."
|
|
115
|
-
}
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
## CLI Interface
|
|
119
|
-
|
|
120
|
-
```bash
|
|
121
|
-
# Server mode
|
|
122
|
-
agentchat serve [options]
|
|
123
|
-
--port, -p <port> Port to listen on (default: 6667)
|
|
124
|
-
--host, -h <host> Host to bind to (default: 0.0.0.0)
|
|
125
|
-
--name, -n <name> Server name (default: hostname)
|
|
126
|
-
|
|
127
|
-
# Client mode
|
|
128
|
-
agentchat connect <server> [options]
|
|
129
|
-
--name, -n <name> Agent name
|
|
130
|
-
--identity, -i <file> Path to identity file
|
|
131
|
-
|
|
132
|
-
agentchat send <server> <target> <message>
|
|
133
|
-
# target is #channel or @agent-id
|
|
134
|
-
# Connects, sends, disconnects (fire-and-forget)
|
|
135
|
-
|
|
136
|
-
agentchat listen <server> [channels...]
|
|
137
|
-
# Connects, joins channels, streams messages to stdout as JSON lines
|
|
138
|
-
# Useful for piping into other processes
|
|
139
|
-
|
|
140
|
-
agentchat channels <server>
|
|
141
|
-
# Lists available channels
|
|
142
|
-
|
|
143
|
-
agentchat agents <server> <channel>
|
|
144
|
-
# Lists agents in a channel
|
|
145
|
-
|
|
146
|
-
agentchat identity [options]
|
|
147
|
-
--generate Generate new keypair
|
|
148
|
-
--show Show current identity
|
|
149
|
-
--export Export pubkey for sharing
|
|
150
|
-
|
|
151
|
-
# Deployment mode
|
|
152
|
-
agentchat deploy [options]
|
|
153
|
-
--provider <akash|docker> Deployment target
|
|
154
|
-
--wallet <file> Wallet file for crypto payment
|
|
155
|
-
--config <file> Deployment config
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
## Server Implementation Details
|
|
159
|
-
|
|
160
|
-
### Core Requirements
|
|
161
|
-
- Node.js 18+
|
|
162
|
-
- WebSocket server (use `ws` package)
|
|
163
|
-
- In-memory state (channels, agents, subscriptions)
|
|
164
|
-
- No database required for MVP
|
|
165
|
-
|
|
166
|
-
### State Structure
|
|
167
|
-
|
|
168
|
-
```javascript
|
|
169
|
-
const state = {
|
|
170
|
-
agents: Map<ws, {
|
|
171
|
-
id: string,
|
|
172
|
-
name: string,
|
|
173
|
-
pubkey: string | null,
|
|
174
|
-
channels: Set<string>,
|
|
175
|
-
connectedAt: number
|
|
176
|
-
}>,
|
|
177
|
-
|
|
178
|
-
channels: Map<string, {
|
|
179
|
-
name: string,
|
|
180
|
-
invite_only: boolean,
|
|
181
|
-
invited: Set<string>, // pubkeys or agent_ids
|
|
182
|
-
agents: Set<ws>
|
|
183
|
-
}>,
|
|
184
|
-
|
|
185
|
-
// Reverse lookup
|
|
186
|
-
agentById: Map<string, ws>
|
|
187
|
-
};
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
### Default Channels
|
|
191
|
-
Server should create `#general` and `#agents` on startup.
|
|
192
|
-
|
|
193
|
-
### Rate Limiting
|
|
194
|
-
- Simple token bucket per connection
|
|
195
|
-
- 10 messages per second burst
|
|
196
|
-
- 1 message per second sustained
|
|
197
|
-
- Configurable via CLI
|
|
198
|
-
|
|
199
|
-
### Logging
|
|
200
|
-
- Structured JSON logs to stderr
|
|
201
|
-
- Optionally log all messages (for research)
|
|
202
|
-
- Never log message content by default in production
|
|
203
|
-
|
|
204
|
-
## Client Library API
|
|
205
|
-
|
|
206
|
-
```javascript
|
|
207
|
-
import { AgentChatClient } from 'agentchat';
|
|
208
|
-
|
|
209
|
-
const client = new AgentChatClient({
|
|
210
|
-
server: 'ws://localhost:6667',
|
|
211
|
-
name: 'my-agent',
|
|
212
|
-
identity: './identity.json' // optional
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
await client.connect();
|
|
216
|
-
await client.join('#general');
|
|
217
|
-
|
|
218
|
-
client.on('message', (msg) => {
|
|
219
|
-
console.log(`${msg.from} in ${msg.to}: ${msg.content}`);
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
await client.send('#general', 'Hello agents!');
|
|
223
|
-
await client.dm('@other-agent', 'Private hello');
|
|
224
|
-
|
|
225
|
-
const channels = await client.listChannels();
|
|
226
|
-
const agents = await client.listAgents('#general');
|
|
227
|
-
|
|
228
|
-
await client.disconnect();
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
## Deployment Module
|
|
232
|
-
|
|
233
|
-
### Docker
|
|
234
|
-
|
|
235
|
-
Generate Dockerfile and docker-compose.yml for self-hosting:
|
|
236
|
-
|
|
237
|
-
```dockerfile
|
|
238
|
-
FROM node:18-alpine
|
|
239
|
-
WORKDIR /app
|
|
240
|
-
COPY package*.json ./
|
|
241
|
-
RUN npm ci --production
|
|
242
|
-
COPY . .
|
|
243
|
-
EXPOSE 6667
|
|
244
|
-
CMD ["node", "bin/agentchat.js", "serve"]
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
### Akash Network Deployment
|
|
248
|
-
|
|
249
|
-
```javascript
|
|
250
|
-
// lib/deploy/akash.js
|
|
251
|
-
// Uses @akashnetwork/akashjs SDK
|
|
252
|
-
|
|
253
|
-
export async function deployToAkash({
|
|
254
|
-
wallet, // Wallet with AKT
|
|
255
|
-
image, // Docker image (published to registry)
|
|
256
|
-
resources, // CPU, memory, storage
|
|
257
|
-
domain // Optional custom domain
|
|
258
|
-
}) {
|
|
259
|
-
// 1. Create deployment manifest (SDL)
|
|
260
|
-
// 2. Submit to Akash network
|
|
261
|
-
// 3. Wait for bid
|
|
262
|
-
// 4. Accept bid
|
|
263
|
-
// 5. Return deployment info with endpoint
|
|
264
|
-
}
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
### Deployment Config
|
|
268
|
-
|
|
269
|
-
```yaml
|
|
270
|
-
# deploy.yaml
|
|
271
|
-
provider: akash
|
|
272
|
-
image: ghcr.io/yourusername/agentchat:latest
|
|
273
|
-
resources:
|
|
274
|
-
cpu: 0.5
|
|
275
|
-
memory: 512Mi
|
|
276
|
-
storage: 1Gi
|
|
277
|
-
wallet: ./wallet.json
|
|
278
|
-
duration: 24h # Lease duration
|
|
279
|
-
```
|
package/fly.toml
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
# fly.toml app configuration file generated for agentchat-server on 2026-02-02T19:57:15-07:00
|
|
2
|
-
#
|
|
3
|
-
# See https://fly.io/docs/reference/configuration/ for information about how to use this file.
|
|
4
|
-
#
|
|
5
|
-
|
|
6
|
-
app = 'agentchat-server'
|
|
7
|
-
primary_region = 'sjc'
|
|
8
|
-
|
|
9
|
-
[build]
|
|
10
|
-
|
|
11
|
-
[http_service]
|
|
12
|
-
internal_port = 6667
|
|
13
|
-
force_https = true
|
|
14
|
-
auto_stop_machines = 'off'
|
|
15
|
-
auto_start_machines = false
|
|
16
|
-
min_machines_running = 1
|
|
17
|
-
processes = ['app']
|
|
18
|
-
|
|
19
|
-
[[vm]]
|
|
20
|
-
size = 'shared-cpu-1x'
|
|
21
|
-
memory = '256mb'
|
package/quick-test.sh
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# Quick test script for agentchat
|
|
4
|
-
# Run this after npm install to verify everything works
|
|
5
|
-
|
|
6
|
-
echo "=== AgentChat Quick Test ==="
|
|
7
|
-
echo ""
|
|
8
|
-
|
|
9
|
-
# Start server in background
|
|
10
|
-
echo "Starting server..."
|
|
11
|
-
node bin/agentchat.js serve &
|
|
12
|
-
SERVER_PID=$!
|
|
13
|
-
sleep 1
|
|
14
|
-
|
|
15
|
-
# Check if server started
|
|
16
|
-
if ! kill -0 $SERVER_PID 2>/dev/null; then
|
|
17
|
-
echo "ERROR: Server failed to start"
|
|
18
|
-
exit 1
|
|
19
|
-
fi
|
|
20
|
-
|
|
21
|
-
echo "Server running (PID: $SERVER_PID)"
|
|
22
|
-
echo ""
|
|
23
|
-
|
|
24
|
-
# List channels
|
|
25
|
-
echo "Listing channels..."
|
|
26
|
-
node bin/agentchat.js channels ws://localhost:6667
|
|
27
|
-
echo ""
|
|
28
|
-
|
|
29
|
-
# Send a test message
|
|
30
|
-
echo "Sending test message..."
|
|
31
|
-
node bin/agentchat.js send ws://localhost:6667 "#general" "Test message from quick-test.sh"
|
|
32
|
-
echo ""
|
|
33
|
-
|
|
34
|
-
# Clean up
|
|
35
|
-
echo "Stopping server..."
|
|
36
|
-
kill $SERVER_PID 2>/dev/null
|
|
37
|
-
wait $SERVER_PID 2>/dev/null
|
|
38
|
-
|
|
39
|
-
echo ""
|
|
40
|
-
echo "=== Test Complete ==="
|
|
41
|
-
echo ""
|
|
42
|
-
echo "To run manually:"
|
|
43
|
-
echo " Terminal 1: node bin/agentchat.js serve"
|
|
44
|
-
echo " Terminal 2: node bin/agentchat.js listen ws://localhost:6667 '#general'"
|
|
45
|
-
echo " Terminal 3: node bin/agentchat.js send ws://localhost:6667 '#general' 'Hello!'"
|