@studiomopoke/crosschat 1.6.0 → 1.8.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.
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>CrossChat Dashboard</title>
7
- <script type="module" crossorigin src="/assets/index-DzcjxzDR.js"></script>
8
- <link rel="stylesheet" crossorigin href="/assets/index-Blgmbgo_.css">
7
+ <script type="module" crossorigin src="/assets/index-Ci2ihChN.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-BR-2rRm6.css">
9
9
  </head>
10
10
  <body>
11
11
  <div id="root"></div>
@@ -50,7 +50,7 @@ export declare class AgentConnection {
50
50
  */
51
51
  listPeers(): Promise<PeerInfo[]>;
52
52
  /** Create a task in the current room. */
53
- createTask(description: string, context?: string, filter?: TaskFilter): void;
53
+ createTask(description: string, context?: string, filter?: TaskFilter): Promise<TaskSummary>;
54
54
  /** Bid on an open task. */
55
55
  claimTask(taskId: string): void;
56
56
  /** List tasks with optional filters. Returns a Promise. */
@@ -81,6 +81,13 @@ export declare class AgentConnection {
81
81
  messagesCleared: number;
82
82
  tasksArchived: number;
83
83
  }>;
84
+ requestDigest(opts?: {
85
+ clearMessages?: boolean;
86
+ }): Promise<{
87
+ taskId: string;
88
+ messageCount: number;
89
+ messagesCleared: boolean;
90
+ }>;
84
91
  /** Register a callback invoked for every incoming room message. */
85
92
  onMessage(callback: MessageCallback): void;
86
93
  /** Register a callback invoked for task lifecycle events. */
@@ -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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"}
@@ -166,7 +166,20 @@ export class AgentConnection {
166
166
  }
167
167
  /** Create a task in the current room. */
168
168
  createTask(description, context, filter) {
169
- this.send({ type: 'task.create', description, context, filter });
169
+ const requestId = generateId();
170
+ this.send({ type: 'task.create', requestId, description, context, filter });
171
+ return new Promise((resolve, reject) => {
172
+ const timer = setTimeout(() => {
173
+ this.pendingRequests.delete(requestId);
174
+ reject(new Error('createTask request timed out'));
175
+ }, 10_000);
176
+ timer.unref();
177
+ this.pendingRequests.set(requestId, {
178
+ resolve: resolve,
179
+ reject,
180
+ timer,
181
+ });
182
+ });
170
183
  }
171
184
  /** Bid on an open task. */
172
185
  claimTask(taskId) {
@@ -240,6 +253,26 @@ export class AgentConnection {
240
253
  });
241
254
  });
242
255
  }
256
+ requestDigest(opts) {
257
+ const requestId = generateId();
258
+ this.send({
259
+ type: 'agent.requestDigest',
260
+ requestId,
261
+ clearMessages: opts?.clearMessages,
262
+ });
263
+ return new Promise((resolve, reject) => {
264
+ const timer = setTimeout(() => {
265
+ this.pendingRequests.delete(requestId);
266
+ reject(new Error('requestDigest request timed out'));
267
+ }, 10_000);
268
+ timer.unref();
269
+ this.pendingRequests.set(requestId, {
270
+ resolve: resolve,
271
+ reject,
272
+ timer,
273
+ });
274
+ });
275
+ }
243
276
  // ─── Event registration ────────────────────────────────────────
244
277
  /** Register a callback invoked for every incoming room message. */
245
278
  onMessage(callback) {
@@ -313,6 +346,15 @@ export class AgentConnection {
313
346
  }
314
347
  break;
315
348
  }
349
+ case 'digest.requested': {
350
+ const pending = this.pendingRequests.get(msg.requestId);
351
+ if (pending) {
352
+ clearTimeout(pending.timer);
353
+ this.pendingRequests.delete(msg.requestId);
354
+ pending.resolve({ taskId: msg.taskId, messageCount: msg.messageCount, messagesCleared: msg.messagesCleared });
355
+ }
356
+ break;
357
+ }
316
358
  case 'room.joined':
317
359
  this.currentRoomId = msg.roomId;
318
360
  log(`Joined room "${msg.name}" (${msg.roomId})`);
@@ -328,7 +370,27 @@ export class AgentConnection {
328
370
  catch { /* swallow */ }
329
371
  }
330
372
  break;
331
- case 'task.created':
373
+ case 'task.created': {
374
+ // If this is a direct response to our createTask request, resolve the pending Promise
375
+ const created = msg;
376
+ if (created.requestId) {
377
+ const pending = this.pendingRequests.get(created.requestId);
378
+ if (pending) {
379
+ clearTimeout(pending.timer);
380
+ this.pendingRequests.delete(created.requestId);
381
+ pending.resolve(created.task);
382
+ break; // Don't also fire task event callbacks for the direct response
383
+ }
384
+ }
385
+ // Broadcast notification (no requestId) — fall through to task event callbacks
386
+ for (const cb of this.taskEventCallbacks) {
387
+ try {
388
+ cb(msg);
389
+ }
390
+ catch { /* swallow */ }
391
+ }
392
+ break;
393
+ }
332
394
  case 'task.claimed':
333
395
  case 'task.claimAccepted':
334
396
  case 'task.updated':
@@ -1 +1 @@
1
- {"version":3,"file":"agent-connection.js","sourceRoot":"","sources":["../../src/hub/agent-connection.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EACL,aAAa,EACb,aAAa,GAoBd,MAAM,eAAe,CAAC;AAEvB,MAAM,qBAAqB,GAAG,MAAM,CAAC;AACrC,MAAM,0BAA0B,GAAG,KAAK,CAAC;AACzC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAmBtC;;;;;;GAMG;AACH,MAAM,OAAO,eAAe;IAgBP;IACA;IACA;IACA;IAlBX,EAAE,GAAqB,IAAI,CAAC;IAC5B,cAAc,GAA0B,IAAI,CAAC;IAC7C,cAAc,GAA0B,IAAI,CAAC;IAC7C,cAAc,GAAG,0BAA0B,CAAC;IAC5C,OAAO,GAAG,KAAK,CAAC;IAChB,aAAa,GAAG,SAAS,CAAC;IAE1B,eAAe,GAAG,IAAI,GAAG,EAAmC,CAAC;IAE7D,gBAAgB,GAAsB,EAAE,CAAC;IACzC,kBAAkB,GAAwB,EAAE,CAAC;IAC7C,kBAAkB,GAAmB,EAAE,CAAC;IACxC,qBAAqB,GAAmB,EAAE,CAAC;IAEnD,YACmB,IAAY,EACZ,MAAc,EACd,IAAY,EACZ,GAAW;QAHX,SAAI,GAAJ,IAAI,CAAQ;QACZ,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAQ;QACZ,QAAG,GAAH,GAAG,CAAQ;IAC3B,CAAC;IAEJ,kEAAkE;IAElE,sEAAsE;IACtE,OAAO;QACL,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAEO,SAAS;QACf,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAEzB,MAAM,GAAG,GAAG,kBAAkB,IAAI,CAAC,IAAI,WAAW,CAAC;QAEnD,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACtB,GAAG,CAAC,wCAAwC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,cAAc,GAAG,0BAA0B,CAAC;YAEjD,wBAAwB;YACxB,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,gBAAgB;gBACtB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,GAAG,EAAE,OAAO,CAAC,GAAG;aACjB,CAAC,CAAC;YAEH,IAAI,CAAC,cAAc,EAAE,CAAC;YAEtB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACzC,IAAI,CAAC;oBAAC,EAAE,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,6BAA6B,CAAC,CAAC;YACvD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAW,EAAE,EAAE;YACpC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAkB,CAAC;gBAC3D,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;YAChC,CAAC;YAAC,MAAM,CAAC;gBACP,4BAA4B;YAC9B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,aAAa,EAAE,CAAC;YAErB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAC5C,IAAI,CAAC;oBAAC,EAAE,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,6BAA6B,CAAC,CAAC;YACvD,CAAC;YAED,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC1B,QAAQ,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;YAC3C,wDAAwD;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4DAA4D;IAC5D,UAAU;QACR,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QAED,8BAA8B;QAC9B,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACjD,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5B,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;YAC/C,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,wCAAwC;YACxC,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;YAC7B,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,EAAE,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,CAAC;IAChD,CAAC;IAED,kEAAkE;IAElE,kDAAkD;IAClD,WAAW,CAAC,OAAe,EAAE,QAAkC,EAAE,UAA8B;QAC7F,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,+CAA+C;IAC/C,SAAS,CAAC,MAAmB,EAAE,MAAe,EAAE,MAAe;QAC7D,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,+BAA+B;IAC/B,cAAc;QACZ,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,wDAAwD;IACxD,QAAQ,CAAC,MAAc;QACrB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,uCAAuC;IACvC,UAAU,CAAC,MAAc,EAAE,IAAa;QACtC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACH,SAAS;QACP,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAC,CAAC;QAElD,OAAO,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACjD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACvC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACnD,CAAC,EAAE,MAAM,CAAC,CAAC;YACX,KAAK,CAAC,KAAK,EAAE,CAAC;YAEd,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE;gBAClC,OAAO,EAAE,OAAmC;gBAC5C,MAAM;gBACN,KAAK;aACN,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,yCAAyC;IACzC,UAAU,CAAC,WAAmB,EAAE,OAAgB,EAAE,MAAmB;QACnE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,2BAA2B;IAC3B,SAAS,CAAC,MAAc;QACtB,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,2DAA2D;IAC3D,SAAS,CAAC,MAAkE;QAC1E,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAE7D,OAAO,IAAI,OAAO,CAA2B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC/D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACvC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACnD,CAAC,EAAE,MAAM,CAAC,CAAC;YACX,KAAK,CAAC,KAAK,EAAE,CAAC;YAEd,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE;gBAClC,OAAO,EAAE,OAAmC;gBAC5C,MAAM;gBACN,KAAK;aACN,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,gEAAgE;IAChE,OAAO,CAAC,MAAc;QAEpB,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAExD,OAAO,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACjD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACvC,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;YACjD,CAAC,EAAE,MAAM,CAAC,CAAC;YACX,KAAK,CAAC,KAAK,EAAE,CAAC;YAEd,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE;gBAClC,OAAO,EAAE,OAAmC;gBAC5C,MAAM;gBACN,KAAK;aACN,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4CAA4C;IAC5C,WAAW,CAAC,MAAc,EAAE,UAAkB;QAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,4DAA4D;IAC5D,UAAU,CAAC,MAAc,EAAE,OAAe,EAAE,MAAsB;QAChE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,6DAA6D;IAC7D,YAAY,CAAC,MAAc,EAAE,MAAc,EAAE,MAA8B,EAAE,KAAc;QACzF,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,8FAA8F;IAC9F,YAAY,CAAC,IAA8C;QACzD,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,oBAAoB;YAC1B,SAAS;YACT,QAAQ,EAAE,IAAI,EAAE,QAAQ;YACxB,KAAK,EAAE,IAAI,EAAE,KAAK;SACnB,CAAC,CAAC;QAEH,OAAO,IAAI,OAAO,CAAqD,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACzF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACvC,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;YACtD,CAAC,EAAE,MAAM,CAAC,CAAC;YACX,KAAK,CAAC,KAAK,EAAE,CAAC;YAEd,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE;gBAClC,OAAO,EAAE,OAAmC;gBAC5C,MAAM;gBACN,KAAK;aACN,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,kEAAkE;IAElE,mEAAmE;IACnE,SAAS,CAAC,QAAyB;QACjC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,6DAA6D;IAC7D,WAAW,CAAC,QAA2B;QACrC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,qDAAqD;IACrD,WAAW,CAAC,QAAsB;QAChC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,6DAA6D;IAC7D,cAAc,CAAC,QAAsB;QACnC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,kEAAkE;IAE1D,IAAI,CAAC,GAAiB;QAC5B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,8FAA8F;IACtF,OAAO,CAAC,GAAiB;QAC/B,IAAI,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,iDAAiD,CAAC,CAAC;IACrF,CAAC;IAEO,mBAAmB,CAAC,GAAkB;QAC5C,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,YAAY;gBACf,GAAG,CAAC,+BAA+B,GAAG,CAAC,MAAM,YAAY,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC;gBAC/E,MAAM;YAER,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACxD,IAAI,OAAO,EAAE,CAAC;oBACZ,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBAC5B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBAC3C,OAAO,CAAC,OAAO,CAAE,GAAoB,CAAC,KAAK,CAAC,CAAC;gBAC/C,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACxD,IAAI,OAAO,EAAE,CAAC;oBACZ,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBAC5B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBAC3C,OAAO,CAAC,OAAO,CAAE,GAAyB,CAAC,IAAI,CAAC,CAAC;gBACnD,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACxD,IAAI,OAAO,EAAE,CAAC;oBACZ,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBAC5B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBAC3C,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAG,GAAoB,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC1D,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACxD,IAAI,OAAO,EAAE,CAAC;oBACZ,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBAC5B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBAC3C,MAAM,OAAO,GAAG,GAA4B,CAAC;oBAC7C,OAAO,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;gBACtG,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,aAAa;gBAChB,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC;gBAChC,GAAG,CAAC,gBAAgB,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;gBACjD,MAAM;YAER,KAAK,cAAc;gBACjB,GAAG,CAAC,kBAAkB,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;gBACnD,MAAM;YAER,KAAK,cAAc;gBACjB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACvC,IAAI,CAAC;wBAAC,EAAE,CAAC,GAAyB,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;gBAChE,CAAC;gBACD,MAAM;YAER,KAAK,cAAc,CAAC;YACpB,KAAK,cAAc,CAAC;YACpB,KAAK,oBAAoB,CAAC;YAC1B,KAAK,cAAc,CAAC;YACpB,KAAK,gBAAgB;gBACnB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBACzC,IAAI,CAAC;wBAAC,EAAE,CAAC,GAAgB,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;gBACvD,CAAC;gBACD,MAAM;YAER,KAAK,OAAO;gBACV,QAAQ,CAAC,cAAc,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7F,uDAAuD;gBACvD,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;oBAClB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBACxD,IAAI,OAAO,EAAE,CAAC;wBACZ,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;wBAC5B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;wBAC3C,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;oBACzC,CAAC;gBACH,CAAC;gBACD,MAAM;QACV,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;YACrC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAC5C,CAAC,EAAE,qBAAqB,CAAC,CAAC;QAC1B,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAEO,iBAAiB;QACvB,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,cAAc;YAAE,OAAO;QAEhD,GAAG,CAAC,mBAAmB,IAAI,CAAC,cAAc,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACxB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAE5B,8DAA8D;QAC9D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,EAAE,sBAAsB,CAAC,CAAC;IAClF,CAAC;CACF"}
1
+ {"version":3,"file":"agent-connection.js","sourceRoot":"","sources":["../../src/hub/agent-connection.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"hub-server.d.ts","sourceRoot":"","sources":["../../src/hub/hub-server.ts"],"names":[],"mappings":"AAiLA;;;;;GAKG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CA4jD9C"}
1
+ {"version":3,"file":"hub-server.d.ts","sourceRoot":"","sources":["../../src/hub/hub-server.ts"],"names":[],"mappings":"AAkLA;;;;;GAKG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAysD9C"}
@@ -19,11 +19,12 @@ const pkg = require('../../package.json');
19
19
  const CROSSCHAT_DIR = path.join(os.homedir(), '.crosschat');
20
20
  const DIGESTS_DIR = path.join(CROSSCHAT_DIR, 'digests');
21
21
  const DASHBOARD_LOCK_FILE = path.join(CROSSCHAT_DIR, 'dashboard.lock');
22
- const PROJECTS_FILE = path.join(CROSSCHAT_DIR, 'projects.json');
22
+ const INSTANCES_FILE = path.join(CROSSCHAT_DIR, 'instances.json');
23
23
  const REGISTER_TIMEOUT_MS = 5_000;
24
24
  const HEARTBEAT_INTERVAL_MS = 30_000;
25
25
  const PONG_TIMEOUT_MS = 10_000;
26
26
  const ROOM_MESSAGE_CAP = 200;
27
+ const IDLE_SHUTDOWN_MS = 5 * 60 * 1000; // 5 minutes with no agents → auto-shutdown
27
28
  const PERMISSION_TTL_MS = 10 * 60 * 1000; // 10 minutes for pending permissions
28
29
  const PERMISSION_SWEEP_INTERVAL_MS = 60_000;
29
30
  const WS_MAX_PAYLOAD = 1 * 1024 * 1024; // 1MB
@@ -68,10 +69,10 @@ async function removeDashboardLock() {
68
69
  // Lock file already gone or unreadable
69
70
  }
70
71
  }
71
- // ── Project store helpers ────────────────────────────────────────────
72
- async function loadProjects() {
72
+ // ── Instance store helpers ────────────────────────────────────────────
73
+ async function loadInstances() {
73
74
  try {
74
- const data = await fs.readFile(PROJECTS_FILE, 'utf-8');
75
+ const data = await fs.readFile(INSTANCES_FILE, 'utf-8');
75
76
  const list = JSON.parse(data);
76
77
  return new Map(list.map((p) => [p.id, p]));
77
78
  }
@@ -79,11 +80,11 @@ async function loadProjects() {
79
80
  return new Map();
80
81
  }
81
82
  }
82
- async function persistProjects(projects) {
83
- const list = [...projects.values()];
84
- const tmpPath = `${PROJECTS_FILE}.tmp`;
83
+ async function persistInstances(instances) {
84
+ const list = [...instances.values()];
85
+ const tmpPath = `${INSTANCES_FILE}.tmp`;
85
86
  await fs.writeFile(tmpPath, JSON.stringify(list, null, 2), 'utf-8');
86
- await fs.rename(tmpPath, PROJECTS_FILE);
87
+ await fs.rename(tmpPath, INSTANCES_FILE);
87
88
  }
88
89
  // ── Version from package.json ────────────────────────────────────────
89
90
  function getServerVersion() {
@@ -112,12 +113,14 @@ export async function startHub() {
112
113
  const browserTokens = new Map(); // session tokens for permission decisions
113
114
  const validTokens = new Set(); // fast lookup for REST auth
114
115
  const pendingPermissions = new Map();
115
- const projects = await loadProjects();
116
+ const instances = await loadInstances();
116
117
  // Initialize TaskManager
117
118
  const taskManager = new TaskManager();
118
119
  await taskManager.init();
119
120
  // Digest tracking: roomId -> taskId of currently active digest task
120
121
  const activeDigestTasks = new Map();
122
+ // Idle shutdown: auto-shutdown when no agents are connected for IDLE_SHUTDOWN_MS
123
+ let idleShutdownTimer = null;
121
124
  // Ensure digests directory exists
122
125
  await fs.mkdir(DIGESTS_DIR, { recursive: true });
123
126
  // Seed default rooms
@@ -142,13 +145,13 @@ export async function startHub() {
142
145
  function sendError(ws, message, requestId) {
143
146
  sendToWs(ws, { type: 'error', message, requestId });
144
147
  }
145
- async function autoRegisterProject(cwd) {
148
+ async function autoRegisterInstance(cwd) {
146
149
  const resolvedPath = path.resolve(cwd);
147
- // Skip if path has unsafe characters (same check as POST /api/projects)
150
+ // Skip if path has unsafe characters (same check as POST /api/instances)
148
151
  if (!/^[a-zA-Z0-9\s/\-_\.~]+$/.test(resolvedPath))
149
152
  return;
150
- // Skip if a project with this path already exists
151
- for (const existing of projects.values()) {
153
+ // Skip if an instance with this path already exists
154
+ for (const existing of instances.values()) {
152
155
  if (existing.path === resolvedPath)
153
156
  return;
154
157
  }
@@ -162,15 +165,15 @@ export async function startHub() {
162
165
  return;
163
166
  }
164
167
  const dirName = resolvedPath.split('/').filter(Boolean).pop() || 'unknown';
165
- const project = {
168
+ const instance = {
166
169
  id: generateId(),
167
170
  name: dirName,
168
171
  path: resolvedPath,
169
172
  createdAt: new Date().toISOString(),
170
173
  };
171
- projects.set(project.id, project);
172
- await persistProjects(projects);
173
- log(`Auto-registered project: ${project.name} (${project.path})`);
174
+ instances.set(instance.id, instance);
175
+ await persistInstances(instances);
176
+ log(`Auto-registered instance: ${instance.name} (${instance.path})`);
174
177
  }
175
178
  function findAgentByWs(ws) {
176
179
  for (const agent of agents.values()) {
@@ -454,6 +457,16 @@ export async function startHub() {
454
457
  agents.delete(peerId);
455
458
  log(`Agent disconnected: ${agent.name} (${peerId})`);
456
459
  broadcastToAllBrowsers({ type: 'peerDisconnected', peerId, name: agent.name });
460
+ // Start idle shutdown timer if no agents remain
461
+ if (agents.size === 0 && !idleShutdownTimer) {
462
+ log(`No agents connected — hub will auto-shutdown in ${IDLE_SHUTDOWN_MS / 1000}s`);
463
+ idleShutdownTimer = setTimeout(() => {
464
+ if (agents.size === 0) {
465
+ shutdown('idle (no agents for 5 minutes)');
466
+ }
467
+ }, IDLE_SHUTDOWN_MS);
468
+ idleShutdownTimer.unref();
469
+ }
457
470
  }
458
471
  // ── Agent message handlers ────────────────────────────────────
459
472
  function handleAgentStatus(agent, msg) {
@@ -555,12 +568,16 @@ export async function startHub() {
555
568
  filter: msg.filter,
556
569
  });
557
570
  const summary = taskToSummary(task);
571
+ // If the creator sent a requestId, send a direct response so they get the taskId
572
+ if (msg.requestId) {
573
+ sendToWs(agent.ws, { type: 'task.created', requestId: msg.requestId, task: summary });
574
+ }
558
575
  // Broadcast to all agents in the room (including creator) and browsers
559
576
  broadcastToRoomAgents(agent.currentRoom, { type: 'task.created', task: summary });
560
577
  broadcastToRoomBrowsers(agent.currentRoom, { type: 'task.created', task: summary });
561
578
  }
562
579
  catch (err) {
563
- sendError(agent.ws, err instanceof Error ? err.message : 'Failed to create task');
580
+ sendError(agent.ws, err instanceof Error ? err.message : 'Failed to create task', msg.requestId);
564
581
  }
565
582
  }
566
583
  async function handleTaskClaim(agent, msg) {
@@ -713,6 +730,73 @@ export async function startHub() {
713
730
  });
714
731
  log(`Session cleared by ${agent.name}: ${messagesCleared} message(s), ${tasksArchived} task(s) archived`);
715
732
  }
733
+ async function handleRequestDigest(agent, msg) {
734
+ const room = rooms.get(agent.currentRoom);
735
+ if (!room || room.messages.length === 0) {
736
+ sendError(agent.ws, 'No messages in room to digest', msg.requestId);
737
+ return;
738
+ }
739
+ // Check if a digest task is already active for this room
740
+ const existingTaskId = activeDigestTasks.get(agent.currentRoom);
741
+ if (existingTaskId) {
742
+ const existingTask = taskManager.get(existingTaskId);
743
+ if (existingTask && (existingTask.status === 'open' || existingTask.status === 'claimed' || existingTask.status === 'in_progress')) {
744
+ sendError(agent.ws, `A digest task is already in progress for this room (task ${existingTaskId})`, msg.requestId);
745
+ return;
746
+ }
747
+ activeDigestTasks.delete(agent.currentRoom);
748
+ }
749
+ // Capture current messages and write to pending digest file
750
+ const messagesToDigest = [...room.messages];
751
+ const pendingPath = path.join(DIGESTS_DIR, `${room.id}.jsonl`);
752
+ const lines = messagesToDigest.map((m) => JSON.stringify(m)).join('\n') + '\n';
753
+ await fs.appendFile(pendingPath, lines, 'utf-8');
754
+ // Optionally clear room messages
755
+ const clearMessages = msg.clearMessages === true;
756
+ if (clearMessages) {
757
+ room.messages = [];
758
+ broadcastToRoomBrowsers(agent.currentRoom, {
759
+ type: 'sessionCleared',
760
+ roomId: agent.currentRoom,
761
+ clearedBy: agent.name,
762
+ messagesCleared: messagesToDigest.length,
763
+ });
764
+ }
765
+ // Create digest task
766
+ let pendingContent;
767
+ try {
768
+ pendingContent = await fs.readFile(pendingPath, 'utf-8');
769
+ }
770
+ catch {
771
+ pendingContent = lines;
772
+ }
773
+ try {
774
+ const task = await taskManager.create({
775
+ roomId: room.id,
776
+ creatorId: agent.peerId,
777
+ creatorName: agent.name,
778
+ description: 'Summarize the following room messages into a digest',
779
+ context: pendingContent,
780
+ });
781
+ activeDigestTasks.set(room.id, task.taskId);
782
+ // Broadcast task creation
783
+ const summary = taskToSummary(task);
784
+ broadcastToRoomAgents(room.id, { type: 'task.created', task: summary });
785
+ broadcastToRoomBrowsers(room.id, { type: 'task.created', task: summary });
786
+ sendToWs(agent.ws, {
787
+ type: 'digest.requested',
788
+ requestId: msg.requestId,
789
+ taskId: task.taskId,
790
+ messageCount: messagesToDigest.length,
791
+ messagesCleared: clearMessages,
792
+ });
793
+ log(`Digest requested by ${agent.name} for room ${room.id}: ${messagesToDigest.length} message(s), task ${task.taskId}`);
794
+ }
795
+ catch (err) {
796
+ logError(`Failed to create digest task for room ${room.id}`, err);
797
+ sendError(agent.ws, 'Failed to create digest task', msg.requestId);
798
+ }
799
+ }
716
800
  function handleGetTask(agent, msg) {
717
801
  const task = taskManager.get(msg.taskId);
718
802
  if (!task) {
@@ -801,6 +885,9 @@ export async function startHub() {
801
885
  case 'agent.clearSession':
802
886
  await handleClearSession(agent, msg);
803
887
  break;
888
+ case 'agent.requestDigest':
889
+ await handleRequestDigest(agent, msg);
890
+ break;
804
891
  default:
805
892
  sendError(ws, `Unknown message type: ${msg.type}`);
806
893
  }
@@ -934,6 +1021,31 @@ export async function startHub() {
934
1021
  res.json(peers);
935
1022
  });
936
1023
  // ── REST: Tasks ────────────────────────────────────────────────
1024
+ app.post('/api/tasks', async (req, res) => {
1025
+ const { description, context, filter, roomId, creatorName } = req.body || {};
1026
+ if (!description || !roomId) {
1027
+ res.status(400).json({ error: 'description and roomId are required' });
1028
+ return;
1029
+ }
1030
+ try {
1031
+ const task = await taskManager.create({
1032
+ roomId,
1033
+ creatorId: 'dashboard-user',
1034
+ creatorName: creatorName || 'Dashboard',
1035
+ description,
1036
+ context: context || undefined,
1037
+ filter: filter || undefined,
1038
+ });
1039
+ const summary = taskToSummary(task);
1040
+ broadcastToRoomAgents(roomId, { type: 'task.created', task: summary });
1041
+ broadcastToRoomBrowsers(roomId, { type: 'task.created', task: summary });
1042
+ res.json(summary);
1043
+ }
1044
+ catch (err) {
1045
+ const message = err instanceof Error ? err.message : 'Failed to create task';
1046
+ res.status(400).json({ error: message });
1047
+ }
1048
+ });
937
1049
  app.get('/api/tasks', (req, res) => {
938
1050
  const filter = {};
939
1051
  if (req.query.status)
@@ -1065,10 +1177,10 @@ export async function startHub() {
1065
1177
  // Clean up after 60 seconds
1066
1178
  setTimeout(() => pendingPermissions.delete(permission.id), 60_000);
1067
1179
  });
1068
- // ── REST: Projects ──────────────────────────────────────────────
1069
- app.get('/api/projects', (_req, res) => {
1070
- const list = [...projects.values()].map((p) => {
1071
- // Count active agents whose cwd matches this project path
1180
+ // ── REST: Instances ──────────────────────────────────────────────
1181
+ app.get('/api/instances', (_req, res) => {
1182
+ const list = [...instances.values()].map((p) => {
1183
+ // Count active agents whose cwd matches this instance path
1072
1184
  let activeAgents = 0;
1073
1185
  for (const agent of agents.values()) {
1074
1186
  if (agent.cwd === p.path)
@@ -1079,17 +1191,17 @@ export async function startHub() {
1079
1191
  list.sort((a, b) => a.name.localeCompare(b.name));
1080
1192
  res.json(list);
1081
1193
  });
1082
- app.post('/api/projects', async (req, res) => {
1083
- const { name, path: projPath, description } = req.body;
1194
+ app.post('/api/instances', async (req, res) => {
1195
+ const { name, path: instPath, description } = req.body;
1084
1196
  if (!name || typeof name !== 'string' || name.trim().length === 0) {
1085
- res.status(400).json({ error: 'Project name is required' });
1197
+ res.status(400).json({ error: 'Instance name is required' });
1086
1198
  return;
1087
1199
  }
1088
- if (!projPath || typeof projPath !== 'string' || projPath.trim().length === 0) {
1089
- res.status(400).json({ error: 'Project path is required' });
1200
+ if (!instPath || typeof instPath !== 'string' || instPath.trim().length === 0) {
1201
+ res.status(400).json({ error: 'Instance path is required' });
1090
1202
  return;
1091
1203
  }
1092
- const resolvedPath = path.resolve(projPath.trim());
1204
+ const resolvedPath = path.resolve(instPath.trim());
1093
1205
  // Validate path contains only safe characters (prevent shell injection in launch)
1094
1206
  if (!/^[a-zA-Z0-9\s/\-_\.~]+$/.test(resolvedPath)) {
1095
1207
  res.status(400).json({ error: 'Path contains unsupported characters' });
@@ -1108,51 +1220,51 @@ export async function startHub() {
1108
1220
  return;
1109
1221
  }
1110
1222
  // Check for duplicate path
1111
- for (const existing of projects.values()) {
1223
+ for (const existing of instances.values()) {
1112
1224
  if (existing.path === resolvedPath) {
1113
- res.status(409).json({ error: 'A project with this path is already registered' });
1225
+ res.status(409).json({ error: 'An instance with this path is already registered' });
1114
1226
  return;
1115
1227
  }
1116
1228
  }
1117
- const project = {
1229
+ const instance = {
1118
1230
  id: generateId(),
1119
1231
  name: name.trim(),
1120
1232
  path: resolvedPath,
1121
1233
  description: description?.trim() || undefined,
1122
1234
  createdAt: new Date().toISOString(),
1123
1235
  };
1124
- projects.set(project.id, project);
1125
- await persistProjects(projects);
1126
- log(`Project registered: ${project.name} (${project.path})`);
1127
- res.status(201).json(project);
1236
+ instances.set(instance.id, instance);
1237
+ await persistInstances(instances);
1238
+ log(`Instance registered: ${instance.name} (${instance.path})`);
1239
+ res.status(201).json(instance);
1128
1240
  });
1129
- app.delete('/api/projects/:id', async (req, res) => {
1130
- const project = projects.get(req.params.id);
1131
- if (!project) {
1132
- res.status(404).json({ error: 'Project not found' });
1241
+ app.delete('/api/instances/:id', async (req, res) => {
1242
+ const instance = instances.get(req.params.id);
1243
+ if (!instance) {
1244
+ res.status(404).json({ error: 'Instance not found' });
1133
1245
  return;
1134
1246
  }
1135
- projects.delete(req.params.id);
1136
- await persistProjects(projects);
1137
- log(`Project removed: ${project.name} (${project.path})`);
1247
+ instances.delete(req.params.id);
1248
+ await persistInstances(instances);
1249
+ log(`Instance removed: ${instance.name} (${instance.path})`);
1138
1250
  res.json({ deleted: true });
1139
1251
  });
1140
- app.post('/api/projects/:id/launch', async (req, res) => {
1141
- const project = projects.get(req.params.id);
1142
- if (!project) {
1143
- res.status(404).json({ error: 'Project not found' });
1252
+ app.post('/api/instances/:id/launch', async (req, res) => {
1253
+ const instance = instances.get(req.params.id);
1254
+ if (!instance) {
1255
+ res.status(404).json({ error: 'Instance not found' });
1144
1256
  return;
1145
1257
  }
1146
1258
  // Re-validate directory
1147
1259
  try {
1148
- const stat = await fs.stat(project.path);
1260
+ const stat = await fs.stat(instance.path);
1149
1261
  if (!stat.isDirectory()) {
1150
- res.status(400).json({ error: 'Project directory no longer exists' });
1262
+ res.status(400).json({ error: 'Instance directory no longer exists' });
1151
1263
  return;
1152
1264
  }
1153
1265
  }
1154
1266
  catch {
1155
- res.status(400).json({ error: 'Project directory no longer exists' });
1267
+ res.status(400).json({ error: 'Instance directory no longer exists' });
1156
1268
  return;
1157
1269
  }
1158
1270
  if (process.platform !== 'darwin') {
@@ -1160,15 +1272,21 @@ export async function startHub() {
1160
1272
  return;
1161
1273
  }
1162
1274
  // Escape path for AppleScript (replace backslashes and double-quotes)
1163
- const escapedPath = project.path.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
1164
- const agentName = `agent-${project.id.slice(0, 8)}`;
1275
+ const escapedPath = instance.path.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
1276
+ const agentName = `agent-${instance.id.slice(0, 8)}`;
1165
1277
  const script = `tell application "Terminal"
1166
1278
  activate
1167
1279
  do script "cd \\"${escapedPath}\\" && CROSSCHAT_AGENT_NAME=${agentName} claude"
1168
1280
  end tell`;
1169
1281
  spawn('osascript', ['-e', script], { detached: true, stdio: 'ignore' }).unref();
1170
- log(`Launched Claude Code in: ${project.path}`);
1171
- res.json({ launched: true, projectId: project.id, path: project.path });
1282
+ log(`Launched Claude Code in: ${instance.path}`);
1283
+ res.json({ launched: true, instanceId: instance.id, path: instance.path });
1284
+ });
1285
+ // ── REST: Hub control ──────────────────────────────────────────────
1286
+ app.post('/api/hub/shutdown', (_req, res) => {
1287
+ res.json({ shutting_down: true });
1288
+ // Delay slightly so the response is sent before shutdown
1289
+ setTimeout(() => shutdown('API request'), 100);
1172
1290
  });
1173
1291
  // ── API 404 — reject unmatched API routes before SPA fallback ──
1174
1292
  app.use('/api', (_req, res) => {
@@ -1257,6 +1375,12 @@ end tell`;
1257
1375
  agents.delete(msg.peerId);
1258
1376
  }
1259
1377
  agents.set(msg.peerId, agent);
1378
+ // Cancel idle shutdown — an agent is here
1379
+ if (idleShutdownTimer) {
1380
+ clearTimeout(idleShutdownTimer);
1381
+ idleShutdownTimer = null;
1382
+ log('Idle shutdown cancelled — agent connected');
1383
+ }
1260
1384
  sendToWs(ws, {
1261
1385
  type: 'registered',
1262
1386
  peerId: msg.peerId,
@@ -1264,9 +1388,9 @@ end tell`;
1264
1388
  });
1265
1389
  log(`Agent registered: ${agent.name} (${agent.peerId}), cwd=${agent.cwd}`);
1266
1390
  broadcastToAllBrowsers({ type: 'peerConnected', peer: buildPeerInfo(agent) });
1267
- // Auto-register agent's working directory as a project
1268
- autoRegisterProject(agent.cwd).catch((err) => {
1269
- logError('Auto-register project failed', err);
1391
+ // Auto-register agent's working directory as an instance
1392
+ autoRegisterInstance(agent.cwd).catch((err) => {
1393
+ logError('Auto-register instance failed', err);
1270
1394
  });
1271
1395
  }
1272
1396
  catch (err) {
@@ -1462,6 +1586,8 @@ end tell`;
1462
1586
  // Stop timers
1463
1587
  clearInterval(heartbeatInterval);
1464
1588
  clearInterval(permissionSweepInterval);
1589
+ if (idleShutdownTimer)
1590
+ clearTimeout(idleShutdownTimer);
1465
1591
  // Close all agent WebSocket connections
1466
1592
  for (const agent of agents.values()) {
1467
1593
  try {