@studiomopoke/crosschat 1.8.2 → 2.0.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 +48 -118
- package/bin/cli.cjs +37 -57
- package/crosschat.md +73 -104
- package/dashboard/dist/assets/index-BY-IQhma.js +49 -0
- package/dashboard/dist/assets/index-CI8v9PKQ.css +1 -0
- package/dashboard/dist/index.html +2 -2
- package/dist/hub/_hub-section-1-infra.d.ts +8 -0
- package/dist/hub/_hub-section-1-infra.d.ts.map +1 -0
- package/dist/hub/_hub-section-1-infra.js +152 -0
- package/dist/hub/_hub-section-1-infra.js.map +1 -0
- package/dist/hub/_hub-section-2-handlers.d.ts +2 -0
- package/dist/hub/_hub-section-2-handlers.d.ts.map +1 -0
- package/dist/hub/_hub-section-2-handlers.js +514 -0
- package/dist/hub/_hub-section-2-handlers.js.map +1 -0
- package/dist/hub/_hub-section-3-rest.d.ts +2 -0
- package/dist/hub/_hub-section-3-rest.d.ts.map +1 -0
- package/dist/hub/_hub-section-3-rest.js +418 -0
- package/dist/hub/_hub-section-3-rest.js.map +1 -0
- package/dist/hub/_hub-section-4-ws.d.ts +2 -0
- package/dist/hub/_hub-section-4-ws.d.ts.map +1 -0
- package/dist/hub/_hub-section-4-ws.js +367 -0
- package/dist/hub/_hub-section-4-ws.js.map +1 -0
- package/dist/hub/agent-connection.d.ts +38 -62
- package/dist/hub/agent-connection.d.ts.map +1 -1
- package/dist/hub/agent-connection.js +146 -229
- package/dist/hub/agent-connection.js.map +1 -1
- package/dist/hub/hub-server.d.ts +1 -1
- package/dist/hub/hub-server.d.ts.map +1 -1
- package/dist/hub/hub-server.js +389 -685
- package/dist/hub/hub-server.js.map +1 -1
- package/dist/hub/message-manager.d.ts +158 -0
- package/dist/hub/message-manager.d.ts.map +1 -0
- package/dist/hub/message-manager.js +443 -0
- package/dist/hub/message-manager.js.map +1 -0
- package/dist/hub/protocol.d.ts +73 -131
- package/dist/hub/protocol.d.ts.map +1 -1
- package/dist/hub/protocol.js +3 -0
- package/dist/hub/protocol.js.map +1 -1
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +15 -89
- package/dist/lifecycle.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +22 -33
- package/dist/server.js.map +1 -1
- package/dist/tools/add-badge.d.ts +4 -0
- package/dist/tools/add-badge.d.ts.map +1 -0
- package/dist/tools/add-badge.js +29 -0
- package/dist/tools/add-badge.js.map +1 -0
- package/dist/tools/claim-task.js +5 -5
- package/dist/tools/claim-task.js.map +1 -1
- package/dist/tools/clear-session.d.ts +1 -2
- package/dist/tools/clear-session.d.ts.map +1 -1
- package/dist/tools/clear-session.js +7 -22
- package/dist/tools/clear-session.js.map +1 -1
- package/dist/tools/flag-as-task.d.ts +4 -0
- package/dist/tools/flag-as-task.d.ts.map +1 -0
- package/dist/tools/flag-as-task.js +31 -0
- package/dist/tools/flag-as-task.js.map +1 -0
- package/dist/tools/get-messages.d.ts +2 -1
- package/dist/tools/get-messages.d.ts.map +1 -1
- package/dist/tools/get-messages.js +19 -6
- package/dist/tools/get-messages.js.map +1 -1
- package/dist/tools/list-peers.d.ts.map +1 -1
- package/dist/tools/list-peers.js +1 -4
- package/dist/tools/list-peers.js.map +1 -1
- package/dist/tools/resolve-task.d.ts +4 -0
- package/dist/tools/resolve-task.d.ts.map +1 -0
- package/dist/tools/resolve-task.js +29 -0
- package/dist/tools/resolve-task.js.map +1 -0
- package/dist/tools/send-message.d.ts.map +1 -1
- package/dist/tools/send-message.js +6 -5
- package/dist/tools/send-message.js.map +1 -1
- package/dist/tools/set-status.js +3 -3
- package/dist/tools/set-status.js.map +1 -1
- package/dist/tools/wait-for-messages.js +1 -1
- package/dist/tools/wait-for-messages.js.map +1 -1
- package/dist/types.d.ts +4 -3
- package/dist/types.d.ts.map +1 -1
- package/hooks/permission-hook.sh +19 -18
- package/package.json +1 -1
- package/dashboard/dist/assets/index-BR-2rRm6.css +0 -1
- package/dashboard/dist/assets/index-Ci2ihChN.js +0 -49
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
// ── Pending permission sweep ──────────────────────────────────
|
|
2
|
+
const permissionSweepInterval = setInterval(() => {
|
|
3
|
+
const now = Date.now();
|
|
4
|
+
for (const [id, perm] of pendingPermissions) {
|
|
5
|
+
if (perm.status === 'pending' && now - new Date(perm.createdAt).getTime() > PERMISSION_TTL_MS) {
|
|
6
|
+
pendingPermissions.delete(id);
|
|
7
|
+
log(`Expired stale pending permission: ${id} (${perm.toolName})`);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}, PERMISSION_SWEEP_INTERVAL_MS);
|
|
11
|
+
// ── Express app ────────────────────────────────────────────────
|
|
12
|
+
const app = express();
|
|
13
|
+
app.use(express.json());
|
|
14
|
+
// CORS — restrict to localhost origins only
|
|
15
|
+
const ALLOWED_ORIGINS = new Set([
|
|
16
|
+
'http://localhost',
|
|
17
|
+
'http://127.0.0.1',
|
|
18
|
+
'http://[::1]',
|
|
19
|
+
]);
|
|
20
|
+
app.use((req, res, next) => {
|
|
21
|
+
const origin = req.headers.origin;
|
|
22
|
+
// Allow requests with no origin (same-origin, curl, agents)
|
|
23
|
+
if (!origin) {
|
|
24
|
+
res.header('Access-Control-Allow-Headers', 'Content-Type');
|
|
25
|
+
res.header('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
|
|
26
|
+
next();
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// Match origin with or without port
|
|
30
|
+
const originBase = origin.replace(/:\d+$/, '');
|
|
31
|
+
if (ALLOWED_ORIGINS.has(originBase)) {
|
|
32
|
+
res.header('Access-Control-Allow-Origin', origin);
|
|
33
|
+
res.header('Access-Control-Allow-Headers', 'Content-Type');
|
|
34
|
+
res.header('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
|
|
35
|
+
}
|
|
36
|
+
// Preflight
|
|
37
|
+
if (req.method === 'OPTIONS') {
|
|
38
|
+
res.sendStatus(204);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
next();
|
|
42
|
+
});
|
|
43
|
+
// Serve dashboard React frontend
|
|
44
|
+
const distPath = path.join(__dirname, '..', '..', 'dashboard', 'dist');
|
|
45
|
+
app.use(express.static(distPath));
|
|
46
|
+
// ... REST routes defined in section 3 are assumed to be above this point ...
|
|
47
|
+
// ── API 404 — reject unmatched API routes before SPA fallback ──
|
|
48
|
+
app.use('/api', (_req, res) => {
|
|
49
|
+
res.status(404).json({ error: 'API route not found' });
|
|
50
|
+
});
|
|
51
|
+
// ── SPA fallback ───────────────────────────────────────────────
|
|
52
|
+
app.use((_req, res, next) => {
|
|
53
|
+
const indexPath = path.join(distPath, 'index.html');
|
|
54
|
+
res.sendFile(indexPath, (err) => {
|
|
55
|
+
if (err)
|
|
56
|
+
next();
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
// ── HTTP server ────────────────────────────────────────────────
|
|
60
|
+
const server = http.createServer(app);
|
|
61
|
+
// ── WebSocket servers (noServer mode) ──────────────────────────
|
|
62
|
+
const agentWss = new WebSocketServer({ noServer: true, maxPayload: WS_MAX_PAYLOAD });
|
|
63
|
+
const browserWss = new WebSocketServer({ noServer: true, maxPayload: WS_MAX_PAYLOAD });
|
|
64
|
+
// Route upgrade requests to the correct WebSocket server
|
|
65
|
+
server.on('upgrade', (request, socket, head) => {
|
|
66
|
+
const { pathname } = new URL(request.url ?? '/', `http://${request.headers.host}`);
|
|
67
|
+
// Block browser WebSocket upgrades from non-localhost origins
|
|
68
|
+
const origin = request.headers.origin;
|
|
69
|
+
if (origin) {
|
|
70
|
+
const originBase = origin.replace(/:\d+$/, '');
|
|
71
|
+
if (!ALLOWED_ORIGINS.has(originBase)) {
|
|
72
|
+
log(`Rejected WebSocket upgrade from origin: ${origin}`);
|
|
73
|
+
socket.write('HTTP/1.1 403 Forbidden\r\n\r\n');
|
|
74
|
+
socket.destroy();
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (pathname === '/ws/agent') {
|
|
79
|
+
agentWss.handleUpgrade(request, socket, head, (ws) => {
|
|
80
|
+
agentWss.emit('connection', ws, request);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
else if (pathname === '/ws' || pathname === '/ws/browser') {
|
|
84
|
+
browserWss.handleUpgrade(request, socket, head, (ws) => {
|
|
85
|
+
browserWss.emit('connection', ws, request);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
socket.destroy();
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
// ── Agent WebSocket handler ────────────────────────────────────
|
|
93
|
+
agentWss.on('connection', (ws) => {
|
|
94
|
+
let registered = false;
|
|
95
|
+
// Registration timeout: close if not registered within 5 seconds
|
|
96
|
+
const registrationTimer = setTimeout(() => {
|
|
97
|
+
if (!registered) {
|
|
98
|
+
log('Agent connection timed out waiting for registration');
|
|
99
|
+
ws.close(4001, 'Registration timeout');
|
|
100
|
+
}
|
|
101
|
+
}, REGISTER_TIMEOUT_MS);
|
|
102
|
+
ws.on('message', (raw) => {
|
|
103
|
+
const data = raw.toString();
|
|
104
|
+
if (!registered) {
|
|
105
|
+
// First message must be agent.register
|
|
106
|
+
try {
|
|
107
|
+
const msg = decodeMessage(data);
|
|
108
|
+
if (msg.type !== 'agent.register') {
|
|
109
|
+
sendError(ws, 'First message must be agent.register');
|
|
110
|
+
ws.close(4002, 'Expected agent.register');
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
clearTimeout(registrationTimer);
|
|
114
|
+
registered = true;
|
|
115
|
+
const agent = {
|
|
116
|
+
peerId: msg.peerId,
|
|
117
|
+
name: msg.name,
|
|
118
|
+
cwd: msg.cwd,
|
|
119
|
+
pid: msg.pid,
|
|
120
|
+
parentPid: msg.parentPid,
|
|
121
|
+
ws,
|
|
122
|
+
status: 'available',
|
|
123
|
+
statusDetail: undefined,
|
|
124
|
+
currentChannel: 'general',
|
|
125
|
+
connectedAt: new Date().toISOString(),
|
|
126
|
+
};
|
|
127
|
+
// If an agent with the same peerId is already connected, close the old one
|
|
128
|
+
const existing = agents.get(msg.peerId);
|
|
129
|
+
if (existing) {
|
|
130
|
+
log(`Replacing existing connection for agent ${msg.peerId}`);
|
|
131
|
+
postActivity(`${existing.name} reconnected (replaced existing connection)`);
|
|
132
|
+
existing.ws.close(4003, 'Replaced by new connection');
|
|
133
|
+
agents.delete(msg.peerId);
|
|
134
|
+
}
|
|
135
|
+
agents.set(msg.peerId, agent);
|
|
136
|
+
// Cancel idle shutdown — an agent is here
|
|
137
|
+
if (idleShutdownTimer) {
|
|
138
|
+
clearTimeout(idleShutdownTimer);
|
|
139
|
+
idleShutdownTimer = null;
|
|
140
|
+
log('Idle shutdown cancelled — agent connected');
|
|
141
|
+
}
|
|
142
|
+
sendToWs(ws, {
|
|
143
|
+
type: 'registered',
|
|
144
|
+
peerId: msg.peerId,
|
|
145
|
+
serverVersion: getServerVersion(),
|
|
146
|
+
});
|
|
147
|
+
log(`Agent registered: ${agent.name} (${agent.peerId}), cwd=${agent.cwd}`);
|
|
148
|
+
broadcastToAllBrowsers({ type: 'peerConnected', peer: buildPeerInfo(agent) });
|
|
149
|
+
postActivity(`${agent.name} connected (cwd: ${agent.cwd})`);
|
|
150
|
+
// Auto-register agent's working directory as an instance
|
|
151
|
+
autoRegisterInstance(agent.cwd).catch((err) => {
|
|
152
|
+
logError('Auto-register instance failed', err);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
sendError(ws, 'Invalid registration message');
|
|
157
|
+
ws.close(4002, 'Invalid registration');
|
|
158
|
+
}
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
// Registered — dispatch normally
|
|
162
|
+
handleAgentMessage(ws, data).catch((err) => {
|
|
163
|
+
logError('Error handling agent message', err);
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
ws.on('close', () => {
|
|
167
|
+
clearTimeout(registrationTimer);
|
|
168
|
+
const agent = findAgentByWs(ws);
|
|
169
|
+
if (agent) {
|
|
170
|
+
removeAgent(agent.peerId);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
ws.on('error', (err) => {
|
|
174
|
+
logError('Agent WebSocket error', err);
|
|
175
|
+
});
|
|
176
|
+
// Pong handler for liveness
|
|
177
|
+
ws.on('pong', () => {
|
|
178
|
+
// Mark as alive — handled by heartbeat interval
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
// ── Browser WebSocket handler ──────────────────────────────────
|
|
182
|
+
const browserChannels = new WeakMap();
|
|
183
|
+
browserWss.on('connection', (ws) => {
|
|
184
|
+
browserClients.add(ws);
|
|
185
|
+
browserChannels.set(ws, new Set());
|
|
186
|
+
// Issue a session token for this dashboard connection
|
|
187
|
+
const sessionToken = generateId();
|
|
188
|
+
browserTokens.set(ws, sessionToken);
|
|
189
|
+
validTokens.add(sessionToken);
|
|
190
|
+
ws.send(JSON.stringify({ type: 'session', token: sessionToken }));
|
|
191
|
+
ws.on('message', (raw) => {
|
|
192
|
+
let data;
|
|
193
|
+
try {
|
|
194
|
+
data = JSON.parse(raw.toString());
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
ws.send(JSON.stringify({ type: 'error', error: 'Invalid JSON' }));
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
switch (data.type) {
|
|
201
|
+
case 'join': {
|
|
202
|
+
const channelId = data.channelId;
|
|
203
|
+
if (!channelId || !channels.has(channelId)) {
|
|
204
|
+
ws.send(JSON.stringify({ type: 'error', error: 'Channel not found' }));
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
browserChannels.get(ws).add(channelId);
|
|
208
|
+
if (!data.silent) {
|
|
209
|
+
broadcastToChannelBrowsers(channelId, {
|
|
210
|
+
type: 'userJoined',
|
|
211
|
+
channelId,
|
|
212
|
+
username: data.username || 'Anonymous',
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
case 'message': {
|
|
218
|
+
const channelId = data.channelId;
|
|
219
|
+
if (!channelId || !channels.has(channelId) || !data.username || !data.text)
|
|
220
|
+
return;
|
|
221
|
+
const wsContent = data.text.trim();
|
|
222
|
+
const { mentions: wsMentions, mentionType: wsMentionType } = parseMentions(wsContent);
|
|
223
|
+
const chatMsg = {
|
|
224
|
+
messageId: generateId(),
|
|
225
|
+
channelId,
|
|
226
|
+
fromPeerId: 'dashboard-user',
|
|
227
|
+
fromName: data.username.trim(),
|
|
228
|
+
content: wsContent,
|
|
229
|
+
metadata: undefined,
|
|
230
|
+
timestamp: new Date().toISOString(),
|
|
231
|
+
source: 'user',
|
|
232
|
+
mentions: wsMentions.length > 0 ? wsMentions : undefined,
|
|
233
|
+
mentionType: wsMentionType,
|
|
234
|
+
badges: [],
|
|
235
|
+
};
|
|
236
|
+
messageManager.addMessage(chatMsg).catch((err) => logError('Error persisting browser message', err));
|
|
237
|
+
// Broadcast with mention filtering
|
|
238
|
+
broadcastChannelMessage(channelId, chatMsg);
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
case 'leave': {
|
|
242
|
+
browserChannels.get(ws)?.delete(data.channelId);
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
ws.on('close', () => {
|
|
248
|
+
const token = browserTokens.get(ws);
|
|
249
|
+
if (token)
|
|
250
|
+
validTokens.delete(token);
|
|
251
|
+
browserTokens.delete(ws);
|
|
252
|
+
browserClients.delete(ws);
|
|
253
|
+
// WeakMap entry for browserChannels is automatically GC'd
|
|
254
|
+
});
|
|
255
|
+
ws.on('error', (err) => {
|
|
256
|
+
logError('Browser WebSocket error', err);
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
// ── Heartbeat interval ─────────────────────────────────────────
|
|
260
|
+
const heartbeatInterval = setInterval(() => {
|
|
261
|
+
for (const agent of agents.values()) {
|
|
262
|
+
if (agent.ws.readyState === WebSocket.OPEN) {
|
|
263
|
+
let alive = true;
|
|
264
|
+
const pongTimer = setTimeout(() => {
|
|
265
|
+
if (!alive) {
|
|
266
|
+
log(`Agent ${agent.name} (${agent.peerId}) failed heartbeat, terminating`);
|
|
267
|
+
postActivity(`${agent.name} heartbeat failed — disconnecting`, 'important');
|
|
268
|
+
agent.ws.terminate();
|
|
269
|
+
removeAgent(agent.peerId);
|
|
270
|
+
}
|
|
271
|
+
}, PONG_TIMEOUT_MS);
|
|
272
|
+
const onPong = () => {
|
|
273
|
+
alive = true;
|
|
274
|
+
clearTimeout(pongTimer);
|
|
275
|
+
agent.ws.removeListener('pong', onPong);
|
|
276
|
+
};
|
|
277
|
+
alive = false;
|
|
278
|
+
agent.ws.on('pong', onPong);
|
|
279
|
+
agent.ws.ping();
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}, HEARTBEAT_INTERVAL_MS);
|
|
283
|
+
// ── Start listening ────────────────────────────────────────────
|
|
284
|
+
const configPort = process.env.CROSSCHAT_DASHBOARD_PORT
|
|
285
|
+
? parseInt(process.env.CROSSCHAT_DASHBOARD_PORT, 10)
|
|
286
|
+
: 0;
|
|
287
|
+
const actualPort = await new Promise((resolve, reject) => {
|
|
288
|
+
let settled = false;
|
|
289
|
+
const onListening = () => {
|
|
290
|
+
if (settled)
|
|
291
|
+
return;
|
|
292
|
+
settled = true;
|
|
293
|
+
const addr = server.address();
|
|
294
|
+
const port = typeof addr === 'object' && addr ? addr.port : configPort;
|
|
295
|
+
resolve(port);
|
|
296
|
+
};
|
|
297
|
+
server.on('error', (err) => {
|
|
298
|
+
if (err.code === 'EADDRINUSE' && !settled) {
|
|
299
|
+
log(`Port ${configPort} in use, trying auto-select...`);
|
|
300
|
+
server.listen(0, onListening);
|
|
301
|
+
}
|
|
302
|
+
else if (!settled) {
|
|
303
|
+
settled = true;
|
|
304
|
+
reject(err);
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
server.listen(configPort, onListening);
|
|
308
|
+
});
|
|
309
|
+
await writeDashboardLock(actualPort);
|
|
310
|
+
log(`Hub started on port ${actualPort} (pid ${process.pid})`);
|
|
311
|
+
// Post startup event to the activity channel
|
|
312
|
+
postActivity(`Hub started on port ${actualPort}`, 'important');
|
|
313
|
+
// ── Graceful shutdown ──────────────────────────────────────────
|
|
314
|
+
let shuttingDown = false;
|
|
315
|
+
const shutdown = async (signal) => {
|
|
316
|
+
if (shuttingDown)
|
|
317
|
+
return;
|
|
318
|
+
shuttingDown = true;
|
|
319
|
+
if (signal) {
|
|
320
|
+
log(`Received ${signal}, shutting down...`);
|
|
321
|
+
postActivity(`Hub shutting down (${signal})`, 'important');
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
log('Shutting down...');
|
|
325
|
+
postActivity('Hub shutting down', 'important');
|
|
326
|
+
}
|
|
327
|
+
// Stop timers
|
|
328
|
+
clearInterval(heartbeatInterval);
|
|
329
|
+
clearInterval(permissionSweepInterval);
|
|
330
|
+
if (idleShutdownTimer)
|
|
331
|
+
clearTimeout(idleShutdownTimer);
|
|
332
|
+
// Close all agent WebSocket connections
|
|
333
|
+
for (const agent of agents.values()) {
|
|
334
|
+
try {
|
|
335
|
+
agent.ws.close(1001, 'Server shutting down');
|
|
336
|
+
}
|
|
337
|
+
catch {
|
|
338
|
+
// ignore
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
agents.clear();
|
|
342
|
+
// Close all browser WebSocket connections
|
|
343
|
+
for (const client of browserClients) {
|
|
344
|
+
try {
|
|
345
|
+
client.close(1001, 'Server shutting down');
|
|
346
|
+
}
|
|
347
|
+
catch {
|
|
348
|
+
// ignore
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
browserClients.clear();
|
|
352
|
+
// Close WebSocket servers
|
|
353
|
+
agentWss.close();
|
|
354
|
+
browserWss.close();
|
|
355
|
+
// Close HTTP server
|
|
356
|
+
await new Promise((resolve) => {
|
|
357
|
+
server.close(() => resolve());
|
|
358
|
+
});
|
|
359
|
+
await removeDashboardLock();
|
|
360
|
+
log('Hub shutdown complete');
|
|
361
|
+
process.exit(0);
|
|
362
|
+
};
|
|
363
|
+
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
364
|
+
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
365
|
+
process.on('SIGHUP', () => shutdown('SIGHUP'));
|
|
366
|
+
export {};
|
|
367
|
+
//# sourceMappingURL=_hub-section-4-ws.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_hub-section-4-ws.js","sourceRoot":"","sources":["../../src/hub/_hub-section-4-ws.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { type AgentStatus, type PeerInfo, type
|
|
2
|
-
type
|
|
3
|
-
type MessageCallback = (msg:
|
|
4
|
-
type
|
|
1
|
+
import { type AgentStatus, type PeerInfo, type ChannelMessageMessage, type MessageBadgeAddedMessage, type MessageImportance } from './protocol.js';
|
|
2
|
+
import type { Badge, TaskFilter } from './message-manager.js';
|
|
3
|
+
type MessageCallback = (msg: ChannelMessageMessage) => void;
|
|
4
|
+
type BadgeCallback = (msg: MessageBadgeAddedMessage) => void;
|
|
5
5
|
type VoidCallback = () => void;
|
|
6
6
|
/**
|
|
7
7
|
* Client-side WebSocket connection used by each agent to communicate
|
|
@@ -11,7 +11,7 @@ type VoidCallback = () => void;
|
|
|
11
11
|
* backoff, and provides typed methods for every protocol message.
|
|
12
12
|
*/
|
|
13
13
|
export declare class AgentConnection {
|
|
14
|
-
private
|
|
14
|
+
private port;
|
|
15
15
|
private readonly peerId;
|
|
16
16
|
private readonly name;
|
|
17
17
|
private readonly cwd;
|
|
@@ -20,88 +20,64 @@ export declare class AgentConnection {
|
|
|
20
20
|
private reconnectTimer;
|
|
21
21
|
private reconnectDelay;
|
|
22
22
|
private stopped;
|
|
23
|
-
private
|
|
23
|
+
private currentChannelId;
|
|
24
24
|
private pendingRequests;
|
|
25
25
|
private messageCallbacks;
|
|
26
|
-
private
|
|
26
|
+
private badgeCallbacks;
|
|
27
27
|
private connectedCallbacks;
|
|
28
28
|
private disconnectedCallbacks;
|
|
29
29
|
constructor(port: number, peerId: string, name: string, cwd: string);
|
|
30
|
-
/** Open the WebSocket connection to the hub and send registration. */
|
|
31
30
|
connect(): void;
|
|
32
31
|
private doConnect;
|
|
33
|
-
/** Gracefully close the connection without reconnecting. */
|
|
34
32
|
disconnect(): void;
|
|
35
|
-
/** Whether the underlying WebSocket is currently open. */
|
|
36
33
|
get connected(): boolean;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
joinRoom(roomId: string): void;
|
|
45
|
-
/** Create a new room on the server. */
|
|
46
|
-
createRoom(roomId: string, name?: string): void;
|
|
47
|
-
/**
|
|
48
|
-
* Request the list of connected peers from the hub.
|
|
49
|
-
* Returns a Promise that resolves when the server responds.
|
|
50
|
-
*/
|
|
34
|
+
sendMessage(content: string, opts?: {
|
|
35
|
+
threadId?: string;
|
|
36
|
+
metadata?: Record<string, unknown>;
|
|
37
|
+
importance?: MessageImportance;
|
|
38
|
+
}): void;
|
|
39
|
+
setStatus(status: AgentStatus, detail?: string, taskMessageId?: string): void;
|
|
40
|
+
getCurrentChannel(): string;
|
|
51
41
|
listPeers(): Promise<PeerInfo[]>;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
42
|
+
getMessages(opts?: {
|
|
43
|
+
threadId?: string;
|
|
44
|
+
limit?: number;
|
|
45
|
+
afterMessageId?: string;
|
|
46
|
+
}): Promise<ChannelMessageMessage[]>;
|
|
47
|
+
flagTask(messageId: string, filter?: TaskFilter): Promise<{
|
|
48
|
+
messageId: string;
|
|
49
|
+
badges: Badge[];
|
|
50
|
+
}>;
|
|
51
|
+
claimTask(messageId: string): Promise<{
|
|
52
|
+
messageId: string;
|
|
53
|
+
claimantId: string;
|
|
54
|
+
}>;
|
|
55
|
+
resolveTask(messageId: string, status: 'completed' | 'failed', result: string, error?: string): Promise<{
|
|
56
|
+
messageId: string;
|
|
57
|
+
status: string;
|
|
63
58
|
}>;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
result?: string;
|
|
68
|
-
error?: string;
|
|
59
|
+
addBadge(messageId: string, badgeType: string, badgeValue: string, label?: string): Promise<{
|
|
60
|
+
messageId: string;
|
|
61
|
+
badge: Badge;
|
|
69
62
|
}>;
|
|
70
|
-
/** Accept a claim on a task you created. */
|
|
71
|
-
acceptClaim(taskId: string, claimantId: string): void;
|
|
72
|
-
/** Append a progress note to a task (supports markdown). */
|
|
73
|
-
updateTask(taskId: string, content: string, status?: HubTaskStatus): void;
|
|
74
|
-
/** Mark a task as completed or failed with a result blob. */
|
|
75
|
-
completeTask(taskId: string, result: string, status: 'completed' | 'failed', error?: string): void;
|
|
76
|
-
/** Clear session state: messages from current room and optionally archive completed tasks. */
|
|
77
63
|
clearSession(opts?: {
|
|
78
64
|
messages?: boolean;
|
|
79
|
-
tasks?: boolean;
|
|
80
65
|
}): Promise<{
|
|
81
66
|
messagesCleared: number;
|
|
82
|
-
tasksArchived: number;
|
|
83
|
-
}>;
|
|
84
|
-
requestDigest(opts?: {
|
|
85
|
-
clearMessages?: boolean;
|
|
86
|
-
}): Promise<{
|
|
87
|
-
taskId: string;
|
|
88
|
-
messageCount: number;
|
|
89
|
-
messagesCleared: boolean;
|
|
90
67
|
}>;
|
|
91
|
-
/** Register a callback invoked for every incoming room message. */
|
|
92
68
|
onMessage(callback: MessageCallback): void;
|
|
93
|
-
|
|
94
|
-
onTaskEvent(callback: TaskEventCallback): void;
|
|
95
|
-
/** Register a callback invoked on (re)connection. */
|
|
69
|
+
onBadge(callback: BadgeCallback): void;
|
|
96
70
|
onConnected(callback: VoidCallback): void;
|
|
97
|
-
/** Register a callback invoked when the connection drops. */
|
|
98
71
|
onDisconnected(callback: VoidCallback): void;
|
|
99
72
|
private send;
|
|
100
|
-
/** Send without throwing — used for internal/lifecycle messages where failure is expected. */
|
|
101
73
|
private trySend;
|
|
74
|
+
private createPendingRequest;
|
|
75
|
+
private resolvePending;
|
|
102
76
|
private handleServerMessage;
|
|
103
77
|
private startHeartbeat;
|
|
104
78
|
private stopHeartbeat;
|
|
79
|
+
/** Re-read the dashboard lock file to pick up a new hub port after restart. */
|
|
80
|
+
private refreshPort;
|
|
105
81
|
private scheduleReconnect;
|
|
106
82
|
}
|
|
107
83
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-connection.d.ts","sourceRoot":"","sources":["../../src/hub/agent-connection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent-connection.d.ts","sourceRoot":"","sources":["../../src/hub/agent-connection.ts"],"names":[],"mappings":"AAMA,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,QAAQ,EAEb,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAO7B,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAM9D,KAAK,eAAe,GAAG,CAAC,GAAG,EAAE,qBAAqB,KAAK,IAAI,CAAC;AAC5D,KAAK,aAAa,GAAG,CAAC,GAAG,EAAE,wBAAwB,KAAK,IAAI,CAAC;AAC7D,KAAK,YAAY,GAAG,MAAM,IAAI,CAAC;AAQ/B;;;;;;GAMG;AACH,qBAAa,eAAe;IAgBxB,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAlBtB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,gBAAgB,CAAa;IAErC,OAAO,CAAC,eAAe,CAA8C;IAErE,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,kBAAkB,CAAsB;IAChD,OAAO,CAAC,qBAAqB,CAAsB;gBAGzC,IAAI,EAAE,MAAM,EACH,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM;IAK9B,OAAO,IAAI,IAAI;IAKf,OAAO,CAAC,SAAS;IAyDjB,UAAU,IAAI,IAAI;IAwBlB,IAAI,SAAS,IAAI,OAAO,CAEvB;IAID,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,UAAU,CAAC,EAAE,iBAAiB,CAAC;KAChC,GAAG,IAAI;IAUR,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAI7E,iBAAiB,IAAI,MAAM;IAI3B,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAMhC,WAAW,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAYpH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,KAAK,EAAE,CAAA;KAAE,CAAC;IAMjG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAMhF,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAM9I,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAC;IAMhI,YAAY,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;IAQjF,SAAS,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAI1C,OAAO,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAItC,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAIzC,cAAc,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAM5C,OAAO,CAAC,IAAI;IAOZ,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,mBAAmB;IA4F3B,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,aAAa;IAOrB,+EAA+E;YACjE,WAAW;IAczB,OAAO,CAAC,iBAAiB;CAa1B"}
|