@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.
Files changed (82) hide show
  1. package/README.md +48 -118
  2. package/bin/cli.cjs +37 -57
  3. package/crosschat.md +73 -104
  4. package/dashboard/dist/assets/index-BY-IQhma.js +49 -0
  5. package/dashboard/dist/assets/index-CI8v9PKQ.css +1 -0
  6. package/dashboard/dist/index.html +2 -2
  7. package/dist/hub/_hub-section-1-infra.d.ts +8 -0
  8. package/dist/hub/_hub-section-1-infra.d.ts.map +1 -0
  9. package/dist/hub/_hub-section-1-infra.js +152 -0
  10. package/dist/hub/_hub-section-1-infra.js.map +1 -0
  11. package/dist/hub/_hub-section-2-handlers.d.ts +2 -0
  12. package/dist/hub/_hub-section-2-handlers.d.ts.map +1 -0
  13. package/dist/hub/_hub-section-2-handlers.js +514 -0
  14. package/dist/hub/_hub-section-2-handlers.js.map +1 -0
  15. package/dist/hub/_hub-section-3-rest.d.ts +2 -0
  16. package/dist/hub/_hub-section-3-rest.d.ts.map +1 -0
  17. package/dist/hub/_hub-section-3-rest.js +418 -0
  18. package/dist/hub/_hub-section-3-rest.js.map +1 -0
  19. package/dist/hub/_hub-section-4-ws.d.ts +2 -0
  20. package/dist/hub/_hub-section-4-ws.d.ts.map +1 -0
  21. package/dist/hub/_hub-section-4-ws.js +367 -0
  22. package/dist/hub/_hub-section-4-ws.js.map +1 -0
  23. package/dist/hub/agent-connection.d.ts +38 -62
  24. package/dist/hub/agent-connection.d.ts.map +1 -1
  25. package/dist/hub/agent-connection.js +146 -229
  26. package/dist/hub/agent-connection.js.map +1 -1
  27. package/dist/hub/hub-server.d.ts +1 -1
  28. package/dist/hub/hub-server.d.ts.map +1 -1
  29. package/dist/hub/hub-server.js +389 -685
  30. package/dist/hub/hub-server.js.map +1 -1
  31. package/dist/hub/message-manager.d.ts +158 -0
  32. package/dist/hub/message-manager.d.ts.map +1 -0
  33. package/dist/hub/message-manager.js +443 -0
  34. package/dist/hub/message-manager.js.map +1 -0
  35. package/dist/hub/protocol.d.ts +73 -131
  36. package/dist/hub/protocol.d.ts.map +1 -1
  37. package/dist/hub/protocol.js +3 -0
  38. package/dist/hub/protocol.js.map +1 -1
  39. package/dist/lifecycle.d.ts.map +1 -1
  40. package/dist/lifecycle.js +15 -89
  41. package/dist/lifecycle.js.map +1 -1
  42. package/dist/server.d.ts.map +1 -1
  43. package/dist/server.js +22 -33
  44. package/dist/server.js.map +1 -1
  45. package/dist/tools/add-badge.d.ts +4 -0
  46. package/dist/tools/add-badge.d.ts.map +1 -0
  47. package/dist/tools/add-badge.js +29 -0
  48. package/dist/tools/add-badge.js.map +1 -0
  49. package/dist/tools/claim-task.js +5 -5
  50. package/dist/tools/claim-task.js.map +1 -1
  51. package/dist/tools/clear-session.d.ts +1 -2
  52. package/dist/tools/clear-session.d.ts.map +1 -1
  53. package/dist/tools/clear-session.js +7 -22
  54. package/dist/tools/clear-session.js.map +1 -1
  55. package/dist/tools/flag-as-task.d.ts +4 -0
  56. package/dist/tools/flag-as-task.d.ts.map +1 -0
  57. package/dist/tools/flag-as-task.js +31 -0
  58. package/dist/tools/flag-as-task.js.map +1 -0
  59. package/dist/tools/get-messages.d.ts +2 -1
  60. package/dist/tools/get-messages.d.ts.map +1 -1
  61. package/dist/tools/get-messages.js +19 -6
  62. package/dist/tools/get-messages.js.map +1 -1
  63. package/dist/tools/list-peers.d.ts.map +1 -1
  64. package/dist/tools/list-peers.js +1 -4
  65. package/dist/tools/list-peers.js.map +1 -1
  66. package/dist/tools/resolve-task.d.ts +4 -0
  67. package/dist/tools/resolve-task.d.ts.map +1 -0
  68. package/dist/tools/resolve-task.js +29 -0
  69. package/dist/tools/resolve-task.js.map +1 -0
  70. package/dist/tools/send-message.d.ts.map +1 -1
  71. package/dist/tools/send-message.js +6 -5
  72. package/dist/tools/send-message.js.map +1 -1
  73. package/dist/tools/set-status.js +3 -3
  74. package/dist/tools/set-status.js.map +1 -1
  75. package/dist/tools/wait-for-messages.js +1 -1
  76. package/dist/tools/wait-for-messages.js.map +1 -1
  77. package/dist/types.d.ts +4 -3
  78. package/dist/types.d.ts.map +1 -1
  79. package/hooks/permission-hook.sh +19 -18
  80. package/package.json +1 -1
  81. package/dashboard/dist/assets/index-BR-2rRm6.css +0 -1
  82. 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 RoomMessageMessage, type TaskCreatedMessage, type TaskClaimedMessage, type TaskClaimAcceptedMessage, type TaskUpdatedMessage, type TaskCompletedMessage, type TaskFilter, type HubTaskStatus, type TaskSummary, type TaskNote, type MessageImportance } from './protocol.js';
2
- type TaskEvent = TaskCreatedMessage | TaskClaimedMessage | TaskClaimAcceptedMessage | TaskUpdatedMessage | TaskCompletedMessage;
3
- type MessageCallback = (msg: RoomMessageMessage) => void;
4
- type TaskEventCallback = (evt: TaskEvent) => void;
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 readonly port;
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 currentRoomId;
23
+ private currentChannelId;
24
24
  private pendingRequests;
25
25
  private messageCallbacks;
26
- private taskEventCallbacks;
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
- /** Send a message to the agent's current room. */
38
- sendMessage(content: string, metadata?: Record<string, unknown>, importance?: MessageImportance): void;
39
- /** Update this agent's availability status. */
40
- setStatus(status: AgentStatus, detail?: string, taskId?: string): void;
41
- /** Get the current room ID. */
42
- getCurrentRoom(): string;
43
- /** Join a room (implicitly leaves the current room). */
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
- /** Create a task in the current room. */
53
- createTask(description: string, context?: string, filter?: TaskFilter): Promise<TaskSummary>;
54
- /** Bid on an open task. */
55
- claimTask(taskId: string): void;
56
- /** List tasks with optional filters. Returns a Promise. */
57
- listTasks(filter?: {
58
- status?: string;
59
- roomId?: string;
60
- assignedTo?: string;
61
- }): Promise<{
62
- tasks: TaskSummary[];
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
- /** Get full task details including notes. Returns a Promise. */
65
- getTask(taskId: string): Promise<TaskSummary & {
66
- notes: TaskNote[];
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
- /** Register a callback invoked for task lifecycle events. */
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":"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"}
1
+ {"version":3,"file":"agent-connection.d.ts","sourceRoot":"","sources":["../../src/hub/agent-connection.ts"],"names":[],"mappings":"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"}