@adhdev/daemon-core 0.9.77-rc.30 → 0.9.77-rc.32

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
@@ -973,6 +973,15 @@ var init_mesh_ledger = __esm({
973
973
  });
974
974
 
975
975
  // src/mesh/mesh-work-queue.ts
976
+ var mesh_work_queue_exports = {};
977
+ __export(mesh_work_queue_exports, {
978
+ claimNextTask: () => claimNextTask,
979
+ enqueueTask: () => enqueueTask,
980
+ getMeshQueueStats: () => getMeshQueueStats,
981
+ getQueue: () => getQueue,
982
+ updateSessionTaskStatus: () => updateSessionTaskStatus,
983
+ updateTaskStatus: () => updateTaskStatus
984
+ });
976
985
  import { existsSync as existsSync6, writeFileSync as writeFileSync3, readFileSync as readFileSync4 } from "fs";
977
986
  import { join as join6 } from "path";
978
987
  import { randomUUID as randomUUID5 } from "crypto";
@@ -1002,6 +1011,7 @@ function enqueueTask(meshId, message, opts) {
1002
1011
  message,
1003
1012
  status: "pending",
1004
1013
  targetNodeId: opts?.targetNodeId,
1014
+ targetSessionId: opts?.targetSessionId,
1005
1015
  createdAt: (/* @__PURE__ */ new Date()).toISOString(),
1006
1016
  updatedAt: (/* @__PURE__ */ new Date()).toISOString()
1007
1017
  };
@@ -1019,9 +1029,14 @@ function getQueue(meshId, opts) {
1019
1029
  }
1020
1030
  function claimNextTask(meshId, nodeId, sessionId) {
1021
1031
  const queue = readQueue(meshId);
1022
- let targetIdx = queue.findIndex((q) => q.status === "pending" && q.targetNodeId === nodeId);
1032
+ const hasActiveAssignment = queue.some((q) => q.status === "assigned" && (q.assignedSessionId === sessionId || q.assignedNodeId === nodeId));
1033
+ if (hasActiveAssignment) return null;
1034
+ let targetIdx = queue.findIndex((q) => q.status === "pending" && q.targetSessionId === sessionId);
1035
+ if (targetIdx === -1) {
1036
+ targetIdx = queue.findIndex((q) => q.status === "pending" && q.targetNodeId === nodeId && !q.targetSessionId);
1037
+ }
1023
1038
  if (targetIdx === -1) {
1024
- targetIdx = queue.findIndex((q) => q.status === "pending" && !q.targetNodeId);
1039
+ targetIdx = queue.findIndex((q) => q.status === "pending" && !q.targetNodeId && !q.targetSessionId);
1025
1040
  }
1026
1041
  if (targetIdx === -1) return null;
1027
1042
  const entry = queue[targetIdx];
@@ -1298,6 +1313,9 @@ function drainPendingMeshCoordinatorEvents() {
1298
1313
  function readNonEmptyString(value) {
1299
1314
  return typeof value === "string" && value.trim() ? value.trim() : "";
1300
1315
  }
1316
+ function resolveEventSessionId(event, fallback) {
1317
+ return readNonEmptyString(event.targetSessionId) || readNonEmptyString(event.sessionId) || readNonEmptyString(event.instanceId) || readNonEmptyString(fallback);
1318
+ }
1301
1319
  function isMeshCoordinatorEvent(eventName) {
1302
1320
  return typeof eventName === "string" && MESH_COORDINATOR_EVENTS.has(eventName);
1303
1321
  }
@@ -1422,7 +1440,7 @@ Do NOT retry on this node. Consider reassigning to a different node or asking th
1422
1440
  }
1423
1441
  function injectMeshSystemMessage(components, args) {
1424
1442
  if (args.event === "agent:generating_completed") {
1425
- const sessionId = readNonEmptyString(args.metadataEvent.targetSessionId);
1443
+ const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
1426
1444
  const nodeId = readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId);
1427
1445
  const providerType = readNonEmptyString(args.metadataEvent.providerType);
1428
1446
  if (sessionId) {
@@ -1434,9 +1452,29 @@ function injectMeshSystemMessage(components, args) {
1434
1452
  }
1435
1453
  }
1436
1454
  } else if (args.event === "agent:ready") {
1437
- const sessionId = readNonEmptyString(args.metadataEvent.targetSessionId);
1455
+ const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
1438
1456
  const nodeId = readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId);
1439
1457
  const providerType = readNonEmptyString(args.metadataEvent.providerType);
1458
+ const completedTask = sessionId ? updateSessionTaskStatus(args.meshId, sessionId, "completed") : null;
1459
+ if (completedTask) {
1460
+ try {
1461
+ appendLedgerEntry(args.meshId, {
1462
+ kind: "task_completed",
1463
+ nodeId: nodeId || void 0,
1464
+ sessionId,
1465
+ providerType: providerType || void 0,
1466
+ payload: {
1467
+ event: args.event,
1468
+ nodeLabel: args.nodeLabel,
1469
+ taskId: completedTask.id,
1470
+ completedViaReady: true,
1471
+ providerSessionId: readNonEmptyString(args.metadataEvent.providerSessionId) || void 0
1472
+ }
1473
+ });
1474
+ } catch (e) {
1475
+ LOG.warn("MeshLedger", `Failed to record task_completed from ready: ${e?.message || e}`);
1476
+ }
1477
+ }
1440
1478
  if (sessionId && nodeId && providerType) {
1441
1479
  remoteIdleSessions.set(`${nodeId}:${sessionId}`, { nodeId, sessionId, providerType });
1442
1480
  setTimeout(() => {
@@ -1447,13 +1485,13 @@ function injectMeshSystemMessage(components, args) {
1447
1485
  }, 500);
1448
1486
  }
1449
1487
  } else if (args.event === "agent:generating_started") {
1450
- const sessionId = readNonEmptyString(args.metadataEvent.targetSessionId);
1488
+ const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
1451
1489
  const nodeId = readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId);
1452
1490
  if (sessionId && nodeId) {
1453
1491
  remoteIdleSessions.delete(`${nodeId}:${sessionId}`);
1454
1492
  }
1455
1493
  } else if (args.event === "agent:stopped") {
1456
- const sessionId = readNonEmptyString(args.metadataEvent.targetSessionId);
1494
+ const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
1457
1495
  const nodeId = readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId);
1458
1496
  if (sessionId && nodeId) {
1459
1497
  remoteIdleSessions.delete(`${nodeId}:${sessionId}`);
@@ -1468,7 +1506,7 @@ function injectMeshSystemMessage(components, args) {
1468
1506
  appendLedgerEntry(args.meshId, {
1469
1507
  kind: ledgerKind,
1470
1508
  nodeId: readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId) || void 0,
1471
- sessionId: readNonEmptyString(args.metadataEvent.targetSessionId) || void 0,
1509
+ sessionId: resolveEventSessionId(args.metadataEvent, args.sourceInstanceId) || void 0,
1472
1510
  providerType: readNonEmptyString(args.metadataEvent.providerType) || void 0,
1473
1511
  payload: {
1474
1512
  event: args.event,
@@ -1486,7 +1524,7 @@ function injectMeshSystemMessage(components, args) {
1486
1524
  const mesh = getMesh(args.meshId);
1487
1525
  const maxRetries = mesh?.policy?.maxTaskRetries ?? 1;
1488
1526
  recoveryContext = getSessionRecoveryContext(args.meshId, {
1489
- sessionId: readNonEmptyString(args.metadataEvent.targetSessionId) || void 0,
1527
+ sessionId: resolveEventSessionId(args.metadataEvent, args.sourceInstanceId) || void 0,
1490
1528
  nodeId: readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId) || void 0,
1491
1529
  maxRetries
1492
1530
  });
@@ -1586,7 +1624,7 @@ function handleMeshForwardEvent(components, payload) {
1586
1624
  nodeLabel,
1587
1625
  event: eventName,
1588
1626
  metadataEvent: {
1589
- targetSessionId: readNonEmptyString(payload.targetSessionId) || readNonEmptyString(payload.sessionId),
1627
+ targetSessionId: readNonEmptyString(payload.targetSessionId) || readNonEmptyString(payload.sessionId) || readNonEmptyString(payload.instanceId),
1590
1628
  providerType: readNonEmptyString(payload.providerType),
1591
1629
  providerSessionId: readNonEmptyString(payload.providerSessionId)
1592
1630
  }
@@ -1636,6 +1674,7 @@ var init_mesh_events = __esm({
1636
1674
  MAX_PENDING_EVENTS = 50;
1637
1675
  pendingMeshCoordinatorEvents = [];
1638
1676
  MESH_COORDINATOR_EVENTS = /* @__PURE__ */ new Set([
1677
+ "agent:generating_started",
1639
1678
  "agent:generating_completed",
1640
1679
  "agent:waiting_approval",
1641
1680
  "agent:stopped",
@@ -23646,6 +23685,18 @@ var DaemonCommandRouter = class {
23646
23685
  return { success: false, error: e.message };
23647
23686
  }
23648
23687
  }
23688
+ case "get_mesh_queue": {
23689
+ const meshId = typeof args?.meshId === "string" ? args.meshId.trim() : "";
23690
+ if (!meshId) return { success: false, error: "meshId required" };
23691
+ try {
23692
+ const { getQueue: getQueue2 } = await Promise.resolve().then(() => (init_mesh_work_queue(), mesh_work_queue_exports));
23693
+ const status = Array.isArray(args?.status) ? args.status.map((s) => typeof s === "string" ? s.trim() : "").filter(Boolean) : void 0;
23694
+ const queue = getQueue2(meshId, { status });
23695
+ return { success: true, queue };
23696
+ } catch (e) {
23697
+ return { success: false, error: e.message };
23698
+ }
23699
+ }
23649
23700
  case "add_mesh_node": {
23650
23701
  const meshId = typeof args?.meshId === "string" ? args.meshId.trim() : "";
23651
23702
  const workspace = typeof args?.workspace === "string" ? args.workspace.trim() : "";