@studiomopoke/crosschat 1.8.2 → 2.0.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 (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,418 @@
1
+ // ── Agent message dispatch ─────────────────────────────────────
2
+ async function handleAgentMessage(ws, raw) {
3
+ const agent = findAgentByWs(ws);
4
+ if (!agent)
5
+ return;
6
+ let msg;
7
+ try {
8
+ msg = decodeMessage(raw);
9
+ }
10
+ catch {
11
+ sendError(ws, 'Invalid message format');
12
+ return;
13
+ }
14
+ switch (msg.type) {
15
+ case 'agent.heartbeat':
16
+ // Already handled by pong; nothing to do
17
+ break;
18
+ case 'agent.status':
19
+ handleAgentStatus(agent, msg);
20
+ break;
21
+ case 'agent.disconnect':
22
+ removeAgent(agent.peerId);
23
+ ws.close();
24
+ break;
25
+ case 'agent.sendMessage':
26
+ await handleSendMessage(agent, msg);
27
+ break;
28
+ case 'agent.listPeers':
29
+ handleListPeers(agent, msg);
30
+ break;
31
+ case 'agent.getMessages':
32
+ handleGetMessages(agent, msg);
33
+ break;
34
+ case 'agent.flagTask':
35
+ await handleFlagTask(agent, msg);
36
+ break;
37
+ case 'agent.claimTask':
38
+ await handleClaimTask(agent, msg);
39
+ break;
40
+ case 'agent.resolveTask':
41
+ await handleResolveTask(agent, msg);
42
+ break;
43
+ case 'agent.addBadge':
44
+ await handleAddBadge(agent, msg);
45
+ break;
46
+ case 'agent.clearSession':
47
+ await handleClearSession(agent, msg);
48
+ break;
49
+ default:
50
+ sendError(ws, `Unknown message type: ${msg.type}`);
51
+ }
52
+ }
53
+ // ── Express app ────────────────────────────────────────────────
54
+ const app = express();
55
+ app.use(express.json());
56
+ // CORS — restrict to localhost origins only
57
+ const ALLOWED_ORIGINS = new Set([
58
+ 'http://localhost',
59
+ 'http://127.0.0.1',
60
+ 'http://[::1]',
61
+ ]);
62
+ app.use((req, res, next) => {
63
+ const origin = req.headers.origin;
64
+ // Allow requests with no origin (same-origin, curl, agents)
65
+ if (!origin) {
66
+ res.header('Access-Control-Allow-Headers', 'Content-Type');
67
+ res.header('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
68
+ next();
69
+ return;
70
+ }
71
+ // Match origin with or without port
72
+ const originBase = origin.replace(/:\d+$/, '');
73
+ if (ALLOWED_ORIGINS.has(originBase)) {
74
+ res.header('Access-Control-Allow-Origin', origin);
75
+ res.header('Access-Control-Allow-Headers', 'Content-Type');
76
+ res.header('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
77
+ }
78
+ // Preflight
79
+ if (req.method === 'OPTIONS') {
80
+ res.sendStatus(204);
81
+ return;
82
+ }
83
+ next();
84
+ });
85
+ // Serve dashboard React frontend
86
+ const distPath = path.join(__dirname, '..', '..', 'dashboard', 'dist');
87
+ app.use(express.static(distPath));
88
+ // ── REST: Channels ──────────────────────────────────────────────
89
+ app.get('/api/channels', (_req, res) => {
90
+ res.json([...channels]);
91
+ });
92
+ app.get('/api/channels/:channelId/messages', (req, res) => {
93
+ const channelId = req.params.channelId;
94
+ if (!channels.has(channelId)) {
95
+ res.status(404).json({ error: 'Channel not found' });
96
+ return;
97
+ }
98
+ const limit = req.query.limit ? parseInt(req.query.limit, 10) : undefined;
99
+ const afterMessageId = req.query.afterMessageId;
100
+ const messages = messageManager.getChannelMessages(channelId, { limit, afterMessageId });
101
+ res.json(messages);
102
+ });
103
+ app.post('/api/channels/:channelId/messages', async (req, res) => {
104
+ const channelId = req.params.channelId;
105
+ if (!channels.has(channelId)) {
106
+ res.status(404).json({ error: 'Channel not found' });
107
+ return;
108
+ }
109
+ const { username, text, threadId, metadata } = req.body;
110
+ if (!username || !text) {
111
+ res.status(400).json({ error: 'username and text are required' });
112
+ return;
113
+ }
114
+ const content = text.trim();
115
+ const { mentions, mentionType } = parseMentions(content);
116
+ const message = {
117
+ messageId: generateId(),
118
+ channelId,
119
+ threadId: threadId || undefined,
120
+ fromPeerId: 'dashboard-user',
121
+ fromName: username.trim(),
122
+ content,
123
+ timestamp: new Date().toISOString(),
124
+ source: 'user',
125
+ mentions: mentions.length > 0 ? mentions : undefined,
126
+ mentionType,
127
+ badges: [],
128
+ metadata: metadata || undefined,
129
+ };
130
+ await messageManager.addMessage(message);
131
+ broadcastChannelMessage(channelId, message);
132
+ res.status(201).json(message);
133
+ });
134
+ app.get('/api/channels/:channelId/messages/:messageId/thread', (req, res) => {
135
+ const threadId = req.params.messageId;
136
+ const messages = messageManager.getThreadMessages(threadId);
137
+ res.json(messages);
138
+ });
139
+ app.post('/api/channels/:channelId/messages/:messageId/flag-task', async (req, res) => {
140
+ const messageId = req.params.messageId;
141
+ const { addedBy, filter } = req.body;
142
+ const meta = await messageManager.flagAsTask(messageId, addedBy || 'dashboard-user', filter || undefined);
143
+ if (!meta) {
144
+ res.status(404).json({ error: 'Message not found' });
145
+ return;
146
+ }
147
+ const message = messageManager.getMessage(messageId);
148
+ if (message) {
149
+ broadcastToAllBrowsers({
150
+ type: 'message.updated',
151
+ messageId,
152
+ badges: message.badges,
153
+ });
154
+ }
155
+ res.json(meta);
156
+ });
157
+ app.post('/api/channels/:channelId/messages/:messageId/badges', async (req, res) => {
158
+ const messageId = req.params.messageId;
159
+ const { type: badgeType, value, label, addedBy } = req.body;
160
+ if (!badgeType || !value) {
161
+ res.status(400).json({ error: 'type and value are required' });
162
+ return;
163
+ }
164
+ const badge = {
165
+ type: badgeType,
166
+ value,
167
+ label: label || undefined,
168
+ addedBy: addedBy || 'dashboard-user',
169
+ addedAt: new Date().toISOString(),
170
+ };
171
+ const message = await messageManager.addBadge(messageId, badge);
172
+ if (!message) {
173
+ res.status(404).json({ error: 'Message not found' });
174
+ return;
175
+ }
176
+ broadcastToAllBrowsers({
177
+ type: 'message.badgeAdded',
178
+ messageId,
179
+ badge,
180
+ });
181
+ res.json({ messageId, badge });
182
+ });
183
+ // ── REST: Peers ────────────────────────────────────────────────
184
+ app.get('/api/peers', (_req, res) => {
185
+ const peers = [];
186
+ for (const agent of agents.values()) {
187
+ peers.push(buildPeerInfo(agent));
188
+ }
189
+ res.json(peers);
190
+ });
191
+ // ── REST: Agent lookup by parent PID (for permission hook) ─────
192
+ app.get('/api/agents/by-parent-pid/:pid', (req, res) => {
193
+ const parentPid = parseInt(req.params.pid, 10);
194
+ if (isNaN(parentPid)) {
195
+ res.status(400).json({ error: 'Invalid PID' });
196
+ return;
197
+ }
198
+ for (const agent of agents.values()) {
199
+ if (agent.parentPid === parentPid) {
200
+ res.json({ peerId: agent.peerId, name: agent.name, cwd: agent.cwd });
201
+ return;
202
+ }
203
+ }
204
+ res.status(404).json({ error: 'No agent found with that parent PID' });
205
+ });
206
+ // ── REST: Tasks ────────────────────────────────────────────────
207
+ app.get('/api/tasks', (req, res) => {
208
+ const filter = {};
209
+ if (req.query.status)
210
+ filter.status = req.query.status;
211
+ if (req.query.channelId)
212
+ filter.channelId = req.query.channelId;
213
+ if (req.query.claimantId)
214
+ filter.claimantId = req.query.claimantId;
215
+ const tasks = messageManager.listTasks(Object.keys(filter).length > 0 ? filter : undefined);
216
+ res.json(tasks);
217
+ });
218
+ // ── REST: Clear session ──────────────────────────────────────────
219
+ app.post('/api/channels/:channelId/clear', (req, res) => {
220
+ const channelId = req.params.channelId;
221
+ if (!channels.has(channelId)) {
222
+ res.status(404).json({ error: 'Channel not found' });
223
+ return;
224
+ }
225
+ const messagesCleared = messageManager.clearChannel(channelId);
226
+ broadcastToAllBrowsers({
227
+ type: 'sessionCleared',
228
+ channelId,
229
+ clearedBy: 'dashboard',
230
+ messagesCleared,
231
+ });
232
+ res.json({ messagesCleared });
233
+ });
234
+ // ── REST: Permissions ────────────────────────────────────────────
235
+ app.get('/api/permissions', (_req, res) => {
236
+ const list = [...pendingPermissions.values()].filter((p) => p.status === 'pending');
237
+ res.json(list);
238
+ });
239
+ app.post('/api/permissions', (req, res) => {
240
+ const { agentName, agentPeerId, toolName, toolInput, description } = req.body;
241
+ if (!toolName) {
242
+ res.status(400).json({ error: 'toolName is required' });
243
+ return;
244
+ }
245
+ const id = generateId();
246
+ const permission = {
247
+ id,
248
+ agentName: agentName || 'unknown',
249
+ agentPeerId,
250
+ toolName,
251
+ toolInput: toolInput || {},
252
+ description,
253
+ status: 'pending',
254
+ createdAt: new Date().toISOString(),
255
+ };
256
+ pendingPermissions.set(id, permission);
257
+ // Broadcast to all browser clients
258
+ broadcastToAllBrowsers({
259
+ type: 'permission.request',
260
+ permission,
261
+ });
262
+ log(`Permission request: ${permission.agentName} wants to use ${toolName} (${id})`);
263
+ res.status(201).json(permission);
264
+ });
265
+ app.get('/api/permissions/:id', (req, res) => {
266
+ const permission = pendingPermissions.get(req.params.id);
267
+ if (!permission) {
268
+ res.status(404).json({ error: 'Permission request not found' });
269
+ return;
270
+ }
271
+ res.json(permission);
272
+ });
273
+ app.post('/api/permissions/:id/decide', (req, res) => {
274
+ // Require a valid dashboard session token
275
+ const authHeader = req.headers.authorization;
276
+ const token = authHeader?.startsWith('Bearer ') ? authHeader.slice(7) : null;
277
+ if (!token || !validTokens.has(token)) {
278
+ res.status(401).json({ error: 'Valid dashboard session required' });
279
+ return;
280
+ }
281
+ const permission = pendingPermissions.get(req.params.id);
282
+ if (!permission) {
283
+ res.status(404).json({ error: 'Permission request not found' });
284
+ return;
285
+ }
286
+ if (permission.status !== 'pending') {
287
+ res.status(409).json({ error: `Already decided: ${permission.status}` });
288
+ return;
289
+ }
290
+ const { decision, reason } = req.body;
291
+ if (decision !== 'approved' && decision !== 'denied') {
292
+ res.status(400).json({ error: 'decision must be "approved" or "denied"' });
293
+ return;
294
+ }
295
+ permission.status = decision;
296
+ permission.reason = reason;
297
+ permission.decidedAt = new Date().toISOString();
298
+ // Broadcast decision to all browsers
299
+ broadcastToAllBrowsers({
300
+ type: 'permission.decided',
301
+ id: permission.id,
302
+ status: permission.status,
303
+ reason: permission.reason,
304
+ });
305
+ log(`Permission ${decision}: ${permission.agentName} / ${permission.toolName} (${permission.id})`);
306
+ res.json(permission);
307
+ // Clean up after 60 seconds
308
+ setTimeout(() => pendingPermissions.delete(permission.id), 60_000);
309
+ });
310
+ // ── REST: Instances ──────────────────────────────────────────────
311
+ app.get('/api/instances', (_req, res) => {
312
+ const list = [...instances.values()].map((p) => {
313
+ // Count active agents whose cwd matches this instance path
314
+ let activeAgents = 0;
315
+ for (const agent of agents.values()) {
316
+ if (agent.cwd === p.path)
317
+ activeAgents++;
318
+ }
319
+ return { ...p, activeAgents };
320
+ });
321
+ list.sort((a, b) => a.name.localeCompare(b.name));
322
+ res.json(list);
323
+ });
324
+ app.post('/api/instances', async (req, res) => {
325
+ const { name, path: instPath, description } = req.body;
326
+ if (!name || typeof name !== 'string' || name.trim().length === 0) {
327
+ res.status(400).json({ error: 'Instance name is required' });
328
+ return;
329
+ }
330
+ if (!instPath || typeof instPath !== 'string' || instPath.trim().length === 0) {
331
+ res.status(400).json({ error: 'Instance path is required' });
332
+ return;
333
+ }
334
+ const resolvedPath = path.resolve(instPath.trim());
335
+ // Validate path contains only safe characters (prevent shell injection in launch)
336
+ if (!/^[a-zA-Z0-9\s/\-_\.~]+$/.test(resolvedPath)) {
337
+ res.status(400).json({ error: 'Path contains unsupported characters' });
338
+ return;
339
+ }
340
+ // Validate directory exists
341
+ try {
342
+ const stat = await fs.stat(resolvedPath);
343
+ if (!stat.isDirectory()) {
344
+ res.status(400).json({ error: 'Path is not a directory' });
345
+ return;
346
+ }
347
+ }
348
+ catch {
349
+ res.status(400).json({ error: 'Directory does not exist' });
350
+ return;
351
+ }
352
+ // Check for duplicate path
353
+ for (const existing of instances.values()) {
354
+ if (existing.path === resolvedPath) {
355
+ res.status(409).json({ error: 'An instance with this path is already registered' });
356
+ return;
357
+ }
358
+ }
359
+ const instance = {
360
+ id: generateId(),
361
+ name: name.trim(),
362
+ path: resolvedPath,
363
+ description: description?.trim() || undefined,
364
+ createdAt: new Date().toISOString(),
365
+ };
366
+ instances.set(instance.id, instance);
367
+ await persistInstances(instances);
368
+ log(`Instance registered: ${instance.name} (${instance.path})`);
369
+ res.status(201).json(instance);
370
+ });
371
+ app.delete('/api/instances/:id', async (req, res) => {
372
+ const instance = instances.get(req.params.id);
373
+ if (!instance) {
374
+ res.status(404).json({ error: 'Instance not found' });
375
+ return;
376
+ }
377
+ instances.delete(req.params.id);
378
+ await persistInstances(instances);
379
+ log(`Instance removed: ${instance.name} (${instance.path})`);
380
+ res.json({ deleted: true });
381
+ });
382
+ app.post('/api/instances/:id/launch', async (req, res) => {
383
+ const instance = instances.get(req.params.id);
384
+ if (!instance) {
385
+ res.status(404).json({ error: 'Instance not found' });
386
+ return;
387
+ }
388
+ // Re-validate directory
389
+ try {
390
+ const stat = await fs.stat(instance.path);
391
+ if (!stat.isDirectory()) {
392
+ res.status(400).json({ error: 'Instance directory no longer exists' });
393
+ return;
394
+ }
395
+ }
396
+ catch {
397
+ res.status(400).json({ error: 'Instance directory no longer exists' });
398
+ return;
399
+ }
400
+ if (process.platform !== 'darwin') {
401
+ res.status(501).json({ error: 'Agent launching is currently only supported on macOS' });
402
+ return;
403
+ }
404
+ // Escape path for AppleScript (replace backslashes and double-quotes)
405
+ const escapedPath = instance.path.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
406
+ const agentName = `agent-${instance.id.slice(0, 8)}`;
407
+ const script = `tell application "Terminal"
408
+ activate
409
+ do script "cd \\"${escapedPath}\\" && CROSSCHAT_AGENT_NAME=${agentName} claude crosschat"
410
+ end tell`;
411
+ spawn('osascript', ['-e', script], { detached: true, stdio: 'ignore' }).unref();
412
+ log(`Launched Claude Code in: ${instance.path}`);
413
+ postActivity(`Launched Claude Code at ${instance.path}`);
414
+ res.json({ launched: true, instanceId: instance.id, path: instance.path });
415
+ });
416
+ export {};
417
+ // ── WebSocket and server startup (continued in section 4) ──
418
+ //# sourceMappingURL=_hub-section-3-rest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_hub-section-3-rest.js","sourceRoot":"","sources":["../../src/hub/_hub-section-3-rest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=_hub-section-4-ws.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_hub-section-4-ws.d.ts","sourceRoot":"","sources":["../../src/hub/_hub-section-4-ws.ts"],"names":[],"mappings":""}