@adhdev/daemon-core 0.9.77-rc.31 → 0.9.77-rc.33

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.js CHANGED
@@ -978,6 +978,15 @@ var init_mesh_ledger = __esm({
978
978
  });
979
979
 
980
980
  // src/mesh/mesh-work-queue.ts
981
+ var mesh_work_queue_exports = {};
982
+ __export(mesh_work_queue_exports, {
983
+ claimNextTask: () => claimNextTask,
984
+ enqueueTask: () => enqueueTask,
985
+ getMeshQueueStats: () => getMeshQueueStats,
986
+ getQueue: () => getQueue,
987
+ updateSessionTaskStatus: () => updateSessionTaskStatus,
988
+ updateTaskStatus: () => updateTaskStatus
989
+ });
981
990
  function getQueuePath(meshId) {
982
991
  const safe = meshId.replace(/[^a-zA-Z0-9_-]/g, "_");
983
992
  return (0, import_path4.join)(getLedgerDir(), `${safe}.queue.json`);
@@ -1022,6 +1031,8 @@ function getQueue(meshId, opts) {
1022
1031
  }
1023
1032
  function claimNextTask(meshId, nodeId, sessionId) {
1024
1033
  const queue = readQueue(meshId);
1034
+ const hasActiveAssignment = queue.some((q) => q.status === "assigned" && (q.assignedSessionId === sessionId || q.assignedNodeId === nodeId));
1035
+ if (hasActiveAssignment) return null;
1025
1036
  let targetIdx = queue.findIndex((q) => q.status === "pending" && q.targetSessionId === sessionId);
1026
1037
  if (targetIdx === -1) {
1027
1038
  targetIdx = queue.findIndex((q) => q.status === "pending" && q.targetNodeId === nodeId && !q.targetSessionId);
@@ -1308,6 +1319,9 @@ function drainPendingMeshCoordinatorEvents() {
1308
1319
  function readNonEmptyString(value) {
1309
1320
  return typeof value === "string" && value.trim() ? value.trim() : "";
1310
1321
  }
1322
+ function resolveEventSessionId(event, fallback) {
1323
+ return readNonEmptyString(event.targetSessionId) || readNonEmptyString(event.sessionId) || readNonEmptyString(event.instanceId) || readNonEmptyString(fallback);
1324
+ }
1311
1325
  function isMeshCoordinatorEvent(eventName) {
1312
1326
  return typeof eventName === "string" && MESH_COORDINATOR_EVENTS.has(eventName);
1313
1327
  }
@@ -1366,10 +1380,12 @@ function triggerMeshQueue(components, meshId) {
1366
1380
  const state = inst.getState();
1367
1381
  const settings = state.settings || {};
1368
1382
  const instMeshId = readNonEmptyString(settings.meshNodeFor);
1369
- if (instMeshId !== meshId && !settings.launchedByCoordinator) continue;
1383
+ if (instMeshId !== meshId) continue;
1370
1384
  const nodeId = readNonEmptyString(settings.meshNodeId) || readNonEmptyString(settings.nodeId);
1371
1385
  if (!nodeId) continue;
1372
- if (state.status !== "idle" && state.status !== "stopped" && state.activeChat?.status !== "waiting_input") continue;
1386
+ const status = readNonEmptyString(state.status).toLowerCase();
1387
+ if (["stopped", "failed", "terminated", "exited", "closed"].includes(status)) continue;
1388
+ if (status !== "idle" && state.activeChat?.status !== "waiting_input") continue;
1373
1389
  const sessionId = state.instanceId;
1374
1390
  const providerType = state.type || readNonEmptyString(settings.providerType);
1375
1391
  if (providerType) {
@@ -1432,7 +1448,7 @@ Do NOT retry on this node. Consider reassigning to a different node or asking th
1432
1448
  }
1433
1449
  function injectMeshSystemMessage(components, args) {
1434
1450
  if (args.event === "agent:generating_completed") {
1435
- const sessionId = readNonEmptyString(args.metadataEvent.targetSessionId);
1451
+ const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
1436
1452
  const nodeId = readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId);
1437
1453
  const providerType = readNonEmptyString(args.metadataEvent.providerType);
1438
1454
  if (sessionId) {
@@ -1444,9 +1460,29 @@ function injectMeshSystemMessage(components, args) {
1444
1460
  }
1445
1461
  }
1446
1462
  } else if (args.event === "agent:ready") {
1447
- const sessionId = readNonEmptyString(args.metadataEvent.targetSessionId);
1463
+ const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
1448
1464
  const nodeId = readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId);
1449
1465
  const providerType = readNonEmptyString(args.metadataEvent.providerType);
1466
+ const completedTask = sessionId ? updateSessionTaskStatus(args.meshId, sessionId, "completed") : null;
1467
+ if (completedTask) {
1468
+ try {
1469
+ appendLedgerEntry(args.meshId, {
1470
+ kind: "task_completed",
1471
+ nodeId: nodeId || void 0,
1472
+ sessionId,
1473
+ providerType: providerType || void 0,
1474
+ payload: {
1475
+ event: args.event,
1476
+ nodeLabel: args.nodeLabel,
1477
+ taskId: completedTask.id,
1478
+ completedViaReady: true,
1479
+ providerSessionId: readNonEmptyString(args.metadataEvent.providerSessionId) || void 0
1480
+ }
1481
+ });
1482
+ } catch (e) {
1483
+ LOG.warn("MeshLedger", `Failed to record task_completed from ready: ${e?.message || e}`);
1484
+ }
1485
+ }
1450
1486
  if (sessionId && nodeId && providerType) {
1451
1487
  remoteIdleSessions.set(`${nodeId}:${sessionId}`, { nodeId, sessionId, providerType });
1452
1488
  setTimeout(() => {
@@ -1457,13 +1493,13 @@ function injectMeshSystemMessage(components, args) {
1457
1493
  }, 500);
1458
1494
  }
1459
1495
  } else if (args.event === "agent:generating_started") {
1460
- const sessionId = readNonEmptyString(args.metadataEvent.targetSessionId);
1496
+ const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
1461
1497
  const nodeId = readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId);
1462
1498
  if (sessionId && nodeId) {
1463
1499
  remoteIdleSessions.delete(`${nodeId}:${sessionId}`);
1464
1500
  }
1465
1501
  } else if (args.event === "agent:stopped") {
1466
- const sessionId = readNonEmptyString(args.metadataEvent.targetSessionId);
1502
+ const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
1467
1503
  const nodeId = readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId);
1468
1504
  if (sessionId && nodeId) {
1469
1505
  remoteIdleSessions.delete(`${nodeId}:${sessionId}`);
@@ -1478,7 +1514,7 @@ function injectMeshSystemMessage(components, args) {
1478
1514
  appendLedgerEntry(args.meshId, {
1479
1515
  kind: ledgerKind,
1480
1516
  nodeId: readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId) || void 0,
1481
- sessionId: readNonEmptyString(args.metadataEvent.targetSessionId) || void 0,
1517
+ sessionId: resolveEventSessionId(args.metadataEvent, args.sourceInstanceId) || void 0,
1482
1518
  providerType: readNonEmptyString(args.metadataEvent.providerType) || void 0,
1483
1519
  payload: {
1484
1520
  event: args.event,
@@ -1496,7 +1532,7 @@ function injectMeshSystemMessage(components, args) {
1496
1532
  const mesh = getMesh(args.meshId);
1497
1533
  const maxRetries = mesh?.policy?.maxTaskRetries ?? 1;
1498
1534
  recoveryContext = getSessionRecoveryContext(args.meshId, {
1499
- sessionId: readNonEmptyString(args.metadataEvent.targetSessionId) || void 0,
1535
+ sessionId: resolveEventSessionId(args.metadataEvent, args.sourceInstanceId) || void 0,
1500
1536
  nodeId: readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId) || void 0,
1501
1537
  maxRetries
1502
1538
  });
@@ -1596,7 +1632,7 @@ function handleMeshForwardEvent(components, payload) {
1596
1632
  nodeLabel,
1597
1633
  event: eventName,
1598
1634
  metadataEvent: {
1599
- targetSessionId: readNonEmptyString(payload.targetSessionId) || readNonEmptyString(payload.sessionId),
1635
+ targetSessionId: readNonEmptyString(payload.targetSessionId) || readNonEmptyString(payload.sessionId) || readNonEmptyString(payload.instanceId),
1600
1636
  providerType: readNonEmptyString(payload.providerType),
1601
1637
  providerSessionId: readNonEmptyString(payload.providerSessionId)
1602
1638
  }
@@ -1646,6 +1682,7 @@ var init_mesh_events = __esm({
1646
1682
  MAX_PENDING_EVENTS = 50;
1647
1683
  pendingMeshCoordinatorEvents = [];
1648
1684
  MESH_COORDINATOR_EVENTS = /* @__PURE__ */ new Set([
1685
+ "agent:generating_started",
1649
1686
  "agent:generating_completed",
1650
1687
  "agent:waiting_approval",
1651
1688
  "agent:stopped",
@@ -23867,6 +23904,18 @@ var DaemonCommandRouter = class {
23867
23904
  return { success: false, error: e.message };
23868
23905
  }
23869
23906
  }
23907
+ case "get_mesh_queue": {
23908
+ const meshId = typeof args?.meshId === "string" ? args.meshId.trim() : "";
23909
+ if (!meshId) return { success: false, error: "meshId required" };
23910
+ try {
23911
+ const { getQueue: getQueue2 } = await Promise.resolve().then(() => (init_mesh_work_queue(), mesh_work_queue_exports));
23912
+ const status = Array.isArray(args?.status) ? args.status.map((s) => typeof s === "string" ? s.trim() : "").filter(Boolean) : void 0;
23913
+ const queue = getQueue2(meshId, { status });
23914
+ return { success: true, queue };
23915
+ } catch (e) {
23916
+ return { success: false, error: e.message };
23917
+ }
23918
+ }
23870
23919
  case "add_mesh_node": {
23871
23920
  const meshId = typeof args?.meshId === "string" ? args.meshId.trim() : "";
23872
23921
  const workspace = typeof args?.workspace === "string" ? args.workspace.trim() : "";