@adhdev/daemon-core 0.9.82-rc.190 → 0.9.82-rc.192

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/dist/index.mjs CHANGED
@@ -3391,6 +3391,15 @@ var init_beads_db = __esm({
3391
3391
 
3392
3392
  CREATE INDEX IF NOT EXISTS idx_direct_dispatches_mesh_session
3393
3393
  ON mesh_direct_dispatches(mesh_id, session_id, status);
3394
+
3395
+ CREATE TABLE IF NOT EXISTS remote_idle_sessions (
3396
+ node_id TEXT NOT NULL,
3397
+ session_id TEXT NOT NULL,
3398
+ provider_type TEXT NOT NULL,
3399
+ expires_at INTEGER NOT NULL,
3400
+ metadata TEXT,
3401
+ PRIMARY KEY (node_id, session_id)
3402
+ );
3394
3403
  `);
3395
3404
  }
3396
3405
  hasCompletionFingerprint(fingerprint) {
@@ -3692,6 +3701,29 @@ var init_beads_db = __esm({
3692
3701
  WHERE mesh_id = ? AND status = 'dispatched' AND dispatched_at < ?
3693
3702
  `).run(now, meshId, cutoff);
3694
3703
  }
3704
+ // ── Remote Idle Sessions ─────────────────────────────────────────────────
3705
+ setRemoteIdleSession(nodeId, sessionId, providerType, expiresAt, metadata) {
3706
+ this.db.prepare(`
3707
+ INSERT OR REPLACE INTO remote_idle_sessions (node_id, session_id, provider_type, expires_at, metadata)
3708
+ VALUES (?, ?, ?, ?, ?)
3709
+ `).run(nodeId, sessionId, providerType, expiresAt, metadata ? JSON.stringify(metadata) : null);
3710
+ }
3711
+ getRemoteIdleSessions() {
3712
+ const rows = this.db.prepare("SELECT node_id, session_id, provider_type, expires_at, metadata FROM remote_idle_sessions").all();
3713
+ return rows.map((r) => ({
3714
+ nodeId: r.node_id,
3715
+ sessionId: r.session_id,
3716
+ providerType: r.provider_type,
3717
+ expiresAt: r.expires_at,
3718
+ metadata: r.metadata ? JSON.parse(r.metadata) : void 0
3719
+ }));
3720
+ }
3721
+ deleteRemoteIdleSession(nodeId, sessionId) {
3722
+ this.db.prepare("DELETE FROM remote_idle_sessions WHERE node_id = ? AND session_id = ?").run(nodeId, sessionId);
3723
+ }
3724
+ pruneExpiredRemoteIdleSessions() {
3725
+ this.db.prepare("DELETE FROM remote_idle_sessions WHERE expires_at <= ?").run(Date.now());
3726
+ }
3695
3727
  };
3696
3728
  }
3697
3729
  });
@@ -4136,9 +4168,9 @@ function __resetIdleAutoFastForwardForTests() {
4136
4168
  idleAutoFastForwardLastAttempt.clear();
4137
4169
  }
4138
4170
  function sweepExpiredRemoteIdleSessions() {
4139
- const now = Date.now();
4140
- for (const [key, session] of remoteIdleSessions) {
4141
- if (session.expiresAt <= now) remoteIdleSessions.delete(key);
4171
+ try {
4172
+ BeadsDB.getInstance().pruneExpiredRemoteIdleSessions();
4173
+ } catch {
4142
4174
  }
4143
4175
  }
4144
4176
  function readRefineJobId(event) {
@@ -5038,13 +5070,21 @@ async function triggerMeshQueue(components, meshId) {
5038
5070
  });
5039
5071
  }
5040
5072
  }
5041
- for (const [key, idle] of remoteIdleSessions.entries()) {
5073
+ let remoteSessions = [];
5074
+ try {
5075
+ remoteSessions = BeadsDB.getInstance().getRemoteIdleSessions();
5076
+ } catch {
5077
+ }
5078
+ for (const idle of remoteSessions) {
5042
5079
  const node = mesh.nodes.find((n) => n.id === idle.nodeId);
5043
5080
  if (node) {
5044
5081
  remoteIdleSessionsChecked += 1;
5045
5082
  const assigned = tryAssignQueueTask(components, meshId, idle.nodeId, idle.sessionId, idle.providerType);
5046
5083
  if (assigned) {
5047
- remoteIdleSessions.delete(key);
5084
+ try {
5085
+ BeadsDB.getInstance().deleteRemoteIdleSession(idle.nodeId, idle.sessionId);
5086
+ } catch {
5087
+ }
5048
5088
  }
5049
5089
  }
5050
5090
  }
@@ -5243,7 +5283,10 @@ function injectMeshSystemMessage(components, args) {
5243
5283
  });
5244
5284
  if (intentionalCleanupStop) {
5245
5285
  if (eventSessionId && eventNodeId) {
5246
- remoteIdleSessions.delete(`${eventNodeId}:${eventSessionId}`);
5286
+ try {
5287
+ BeadsDB.getInstance().deleteRemoteIdleSession(eventNodeId, eventSessionId);
5288
+ } catch {
5289
+ }
5247
5290
  }
5248
5291
  LOG.info("MeshEvents", `Suppressed ${args.event} for intentionally cleanup-stopped session ${eventSessionId || "(unknown session)"}`);
5249
5292
  return { success: true, forwarded: 0, suppressed: true, intentionalCleanupStop: true };
@@ -5330,18 +5373,21 @@ function injectMeshSystemMessage(components, args) {
5330
5373
  return { success: true, forwarded: 0, suppressed: true, duplicateCompletion: true };
5331
5374
  }
5332
5375
  }
5376
+ function markSessionTerminal(sessionId, outcome, occurredAtMs) {
5377
+ const task = updateSessionTaskStatus(args.meshId, sessionId, outcome, {
5378
+ occurredAt: occurredAtMs != null ? new Date(occurredAtMs).toISOString() : void 0
5379
+ });
5380
+ updateDirectDispatchStatus(args.meshId, sessionId, outcome);
5381
+ setImmediate(() => cleanupTerminalDirectDispatches());
5382
+ return task ? { id: task.id } : null;
5383
+ }
5333
5384
  let completedTaskForLedger = null;
5334
5385
  if (args.event === "agent:generating_completed") {
5335
5386
  const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
5336
5387
  const nodeId = readNonEmptyString2(args.nodeId) || readNonEmptyString2(args.metadataEvent.meshNodeId);
5337
5388
  const providerType = readNonEmptyString2(args.metadataEvent.providerType);
5338
5389
  if (sessionId) {
5339
- const completedTask = updateSessionTaskStatus(args.meshId, sessionId, "completed", {
5340
- occurredAt: eventTimestamp !== null ? new Date(eventTimestamp).toISOString() : void 0
5341
- });
5342
- completedTaskForLedger = completedTask ? { id: completedTask.id } : null;
5343
- updateDirectDispatchStatus(args.meshId, sessionId, "completed");
5344
- setImmediate(() => cleanupTerminalDirectDispatches());
5390
+ completedTaskForLedger = markSessionTerminal(sessionId, "completed", eventTimestamp);
5345
5391
  if (nodeId && providerType) {
5346
5392
  runIdleMaintenanceThenAssignQueue(components, { meshId: args.meshId, nodeId, sessionId, providerType });
5347
5393
  }
@@ -5354,53 +5400,50 @@ function injectMeshSystemMessage(components, args) {
5354
5400
  const finalSummary = readNonEmptyString2(args.metadataEvent.finalSummary) || void 0;
5355
5401
  const workerResult = readWorkerResultMetadata(args.metadataEvent);
5356
5402
  const hasCompletionEvidence = !!finalSummary || !!workerResult;
5357
- const completedTask = sessionId && hasCompletionEvidence ? updateSessionTaskStatus(args.meshId, sessionId, "completed") : null;
5358
- if (completedTask && sessionId) {
5359
- completedTaskForLedger = { id: completedTask.id };
5360
- updateDirectDispatchStatus(args.meshId, sessionId, "completed");
5361
- setImmediate(() => cleanupTerminalDirectDispatches());
5362
- try {
5363
- appendLedgerEntry(args.meshId, {
5364
- kind: "task_completed",
5365
- nodeId: nodeId || void 0,
5366
- sessionId,
5367
- providerType: providerType || void 0,
5368
- payload: {
5369
- event: args.event,
5370
- nodeLabel: args.nodeLabel,
5371
- taskId: completedTask.id,
5372
- completedViaReady: true,
5373
- providerSessionId,
5374
- finalSummary,
5375
- workerResult,
5376
- evidence: buildTaskCompletionEvidence({
5377
- event: "agent:ready",
5378
- nodeId,
5379
- sessionId,
5380
- providerType: providerType || void 0,
5403
+ if (sessionId && hasCompletionEvidence) {
5404
+ completedTaskForLedger = markSessionTerminal(sessionId, "completed");
5405
+ if (completedTaskForLedger) {
5406
+ try {
5407
+ appendLedgerEntry(args.meshId, {
5408
+ kind: "task_completed",
5409
+ nodeId: nodeId || void 0,
5410
+ sessionId,
5411
+ providerType: providerType || void 0,
5412
+ payload: {
5413
+ event: args.event,
5414
+ nodeLabel: args.nodeLabel,
5415
+ taskId: completedTaskForLedger.id,
5416
+ completedViaReady: true,
5381
5417
  providerSessionId,
5382
5418
  finalSummary,
5383
- workerResult
5384
- })
5385
- }
5386
- });
5387
- } catch (e) {
5388
- LOG.warn("MeshLedger", `Failed to record task_completed from ready: ${e?.message || e}`);
5419
+ workerResult,
5420
+ evidence: buildTaskCompletionEvidence({
5421
+ event: "agent:ready",
5422
+ nodeId,
5423
+ sessionId,
5424
+ providerType: providerType || void 0,
5425
+ providerSessionId,
5426
+ finalSummary,
5427
+ workerResult
5428
+ })
5429
+ }
5430
+ });
5431
+ } catch (e) {
5432
+ LOG.warn("MeshLedger", `Failed to record task_completed from ready: ${e?.message || e}`);
5433
+ }
5389
5434
  }
5390
5435
  }
5391
5436
  if (sessionId && nodeId && providerType) {
5392
5437
  sweepExpiredRemoteIdleSessions();
5393
- remoteIdleSessions.set(`${nodeId}:${sessionId}`, {
5394
- nodeId,
5395
- sessionId,
5396
- providerType,
5397
- expiresAt: Date.now() + REMOTE_IDLE_SESSION_TTL_MS
5398
- });
5438
+ try {
5439
+ BeadsDB.getInstance().setRemoteIdleSession(nodeId, sessionId, providerType, Date.now() + REMOTE_IDLE_SESSION_TTL_MS);
5440
+ } catch {
5441
+ }
5399
5442
  setImmediate(() => {
5400
5443
  maybeAutoFastForwardIdleNode(components, { meshId: args.meshId, nodeId, sessionId, providerType }).finally(() => {
5401
5444
  try {
5402
5445
  const assigned = tryAssignQueueTask(components, args.meshId, nodeId, sessionId, providerType);
5403
- if (assigned) remoteIdleSessions.delete(`${nodeId}:${sessionId}`);
5446
+ if (assigned) BeadsDB.getInstance().deleteRemoteIdleSession(nodeId, sessionId);
5404
5447
  } catch (e) {
5405
5448
  LOG.warn("MeshQueue", `Failed to assign idle queue task after maintenance for ${nodeId}: ${e?.message || e}`);
5406
5449
  }
@@ -5411,7 +5454,10 @@ function injectMeshSystemMessage(components, args) {
5411
5454
  const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
5412
5455
  const nodeId = readNonEmptyString2(args.nodeId) || readNonEmptyString2(args.metadataEvent.meshNodeId);
5413
5456
  if (sessionId && nodeId) {
5414
- remoteIdleSessions.delete(`${nodeId}:${sessionId}`);
5457
+ try {
5458
+ BeadsDB.getInstance().deleteRemoteIdleSession(nodeId, sessionId);
5459
+ } catch {
5460
+ }
5415
5461
  }
5416
5462
  if (sessionId) {
5417
5463
  updateDirectDispatchStatus(args.meshId, sessionId, "acked");
@@ -5420,12 +5466,13 @@ function injectMeshSystemMessage(components, args) {
5420
5466
  const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
5421
5467
  const nodeId = readNonEmptyString2(args.nodeId) || readNonEmptyString2(args.metadataEvent.meshNodeId);
5422
5468
  if (sessionId && nodeId) {
5423
- remoteIdleSessions.delete(`${nodeId}:${sessionId}`);
5469
+ try {
5470
+ BeadsDB.getInstance().deleteRemoteIdleSession(nodeId, sessionId);
5471
+ } catch {
5472
+ }
5424
5473
  }
5425
5474
  if (sessionId) {
5426
- const failedTask = updateSessionTaskStatus(args.meshId, sessionId, "failed");
5427
- completedTaskForLedger = failedTask ? { id: failedTask.id } : null;
5428
- updateDirectDispatchStatus(args.meshId, sessionId, "failed");
5475
+ completedTaskForLedger = markSessionTerminal(sessionId, "failed");
5429
5476
  }
5430
5477
  }
5431
5478
  const ledgerKind = EVENT_TO_LEDGER_KIND[args.event];
@@ -5656,10 +5703,8 @@ function setupMeshEventForwarding(components) {
5656
5703
  let meshIdFromDirectDispatch = "";
5657
5704
  if (coordinatorMeshId) {
5658
5705
  try {
5659
- const activeDispatches = getActiveDirectDispatches(coordinatorMeshId);
5660
- if (activeDispatches.some((d) => d.sessionId === instanceId) || hasUnterminalDirectDispatchLedgerEntry(coordinatorMeshId, instanceId)) {
5661
- meshIdFromDirectDispatch = coordinatorMeshId;
5662
- }
5706
+ const hasActiveDispatch = getActiveDirectDispatches(coordinatorMeshId).some((d) => d.sessionId === instanceId) || hasUnterminalDirectDispatchLedgerEntry(coordinatorMeshId, instanceId);
5707
+ if (hasActiveDispatch) meshIdFromDirectDispatch = coordinatorMeshId;
5663
5708
  } catch {
5664
5709
  }
5665
5710
  if (!meshIdFromDirectDispatch) return;
@@ -5684,7 +5729,7 @@ function setupMeshEventForwarding(components) {
5684
5729
  });
5685
5730
  });
5686
5731
  }
5687
- var REMOTE_IDLE_SESSION_TTL_MS, remoteIdleSessions, meshByWorkspaceCache, MESH_WORKSPACE_CACHE_TTL_MS, IDLE_AUTO_FAST_FORWARD_THROTTLE_MS, idleAutoFastForwardLastAttempt, REFINE_TERMINAL_EVENTS, MAX_PENDING_EVENTS_BYTES, MAX_PENDING_EVENTS_KEEP, MESH_COORDINATOR_EVENTS, EVENT_TO_LEDGER_KIND, INTENTIONAL_CLEANUP_STOP_SUPPRESSION_MS, RECENT_COMPLETION_FINGERPRINT_TTL_MS, autoLaunchInProgress, autoLaunchCooldownUntil, AUTO_LAUNCH_COOLDOWN_MS;
5732
+ var REMOTE_IDLE_SESSION_TTL_MS, meshByWorkspaceCache, MESH_WORKSPACE_CACHE_TTL_MS, IDLE_AUTO_FAST_FORWARD_THROTTLE_MS, idleAutoFastForwardLastAttempt, REFINE_TERMINAL_EVENTS, MAX_PENDING_EVENTS_BYTES, MAX_PENDING_EVENTS_KEEP, MESH_COORDINATOR_EVENTS, EVENT_TO_LEDGER_KIND, INTENTIONAL_CLEANUP_STOP_SUPPRESSION_MS, RECENT_COMPLETION_FINGERPRINT_TTL_MS, autoLaunchInProgress, autoLaunchCooldownUntil, AUTO_LAUNCH_COOLDOWN_MS;
5688
5733
  var init_mesh_events = __esm({
5689
5734
  "src/mesh/mesh-events.ts"() {
5690
5735
  "use strict";
@@ -5697,7 +5742,6 @@ var init_mesh_events = __esm({
5697
5742
  init_beads_db();
5698
5743
  init_mesh_fast_forward();
5699
5744
  REMOTE_IDLE_SESSION_TTL_MS = 5 * 60 * 1e3;
5700
- remoteIdleSessions = /* @__PURE__ */ new Map();
5701
5745
  meshByWorkspaceCache = /* @__PURE__ */ new Map();
5702
5746
  MESH_WORKSPACE_CACHE_TTL_MS = 5e3;
5703
5747
  IDLE_AUTO_FAST_FORWARD_THROTTLE_MS = 30 * 60 * 1e3;