@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.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";
@@ -1020,6 +1029,8 @@ function getQueue(meshId, opts) {
1020
1029
  }
1021
1030
  function claimNextTask(meshId, nodeId, sessionId) {
1022
1031
  const queue = readQueue(meshId);
1032
+ const hasActiveAssignment = queue.some((q) => q.status === "assigned" && (q.assignedSessionId === sessionId || q.assignedNodeId === nodeId));
1033
+ if (hasActiveAssignment) return null;
1023
1034
  let targetIdx = queue.findIndex((q) => q.status === "pending" && q.targetSessionId === sessionId);
1024
1035
  if (targetIdx === -1) {
1025
1036
  targetIdx = queue.findIndex((q) => q.status === "pending" && q.targetNodeId === nodeId && !q.targetSessionId);
@@ -1302,6 +1313,9 @@ function drainPendingMeshCoordinatorEvents() {
1302
1313
  function readNonEmptyString(value) {
1303
1314
  return typeof value === "string" && value.trim() ? value.trim() : "";
1304
1315
  }
1316
+ function resolveEventSessionId(event, fallback) {
1317
+ return readNonEmptyString(event.targetSessionId) || readNonEmptyString(event.sessionId) || readNonEmptyString(event.instanceId) || readNonEmptyString(fallback);
1318
+ }
1305
1319
  function isMeshCoordinatorEvent(eventName) {
1306
1320
  return typeof eventName === "string" && MESH_COORDINATOR_EVENTS.has(eventName);
1307
1321
  }
@@ -1360,10 +1374,12 @@ function triggerMeshQueue(components, meshId) {
1360
1374
  const state = inst.getState();
1361
1375
  const settings = state.settings || {};
1362
1376
  const instMeshId = readNonEmptyString(settings.meshNodeFor);
1363
- if (instMeshId !== meshId && !settings.launchedByCoordinator) continue;
1377
+ if (instMeshId !== meshId) continue;
1364
1378
  const nodeId = readNonEmptyString(settings.meshNodeId) || readNonEmptyString(settings.nodeId);
1365
1379
  if (!nodeId) continue;
1366
- if (state.status !== "idle" && state.status !== "stopped" && state.activeChat?.status !== "waiting_input") continue;
1380
+ const status = readNonEmptyString(state.status).toLowerCase();
1381
+ if (["stopped", "failed", "terminated", "exited", "closed"].includes(status)) continue;
1382
+ if (status !== "idle" && state.activeChat?.status !== "waiting_input") continue;
1367
1383
  const sessionId = state.instanceId;
1368
1384
  const providerType = state.type || readNonEmptyString(settings.providerType);
1369
1385
  if (providerType) {
@@ -1426,7 +1442,7 @@ Do NOT retry on this node. Consider reassigning to a different node or asking th
1426
1442
  }
1427
1443
  function injectMeshSystemMessage(components, args) {
1428
1444
  if (args.event === "agent:generating_completed") {
1429
- const sessionId = readNonEmptyString(args.metadataEvent.targetSessionId);
1445
+ const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
1430
1446
  const nodeId = readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId);
1431
1447
  const providerType = readNonEmptyString(args.metadataEvent.providerType);
1432
1448
  if (sessionId) {
@@ -1438,9 +1454,29 @@ function injectMeshSystemMessage(components, args) {
1438
1454
  }
1439
1455
  }
1440
1456
  } else if (args.event === "agent:ready") {
1441
- const sessionId = readNonEmptyString(args.metadataEvent.targetSessionId);
1457
+ const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
1442
1458
  const nodeId = readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId);
1443
1459
  const providerType = readNonEmptyString(args.metadataEvent.providerType);
1460
+ const completedTask = sessionId ? updateSessionTaskStatus(args.meshId, sessionId, "completed") : null;
1461
+ if (completedTask) {
1462
+ try {
1463
+ appendLedgerEntry(args.meshId, {
1464
+ kind: "task_completed",
1465
+ nodeId: nodeId || void 0,
1466
+ sessionId,
1467
+ providerType: providerType || void 0,
1468
+ payload: {
1469
+ event: args.event,
1470
+ nodeLabel: args.nodeLabel,
1471
+ taskId: completedTask.id,
1472
+ completedViaReady: true,
1473
+ providerSessionId: readNonEmptyString(args.metadataEvent.providerSessionId) || void 0
1474
+ }
1475
+ });
1476
+ } catch (e) {
1477
+ LOG.warn("MeshLedger", `Failed to record task_completed from ready: ${e?.message || e}`);
1478
+ }
1479
+ }
1444
1480
  if (sessionId && nodeId && providerType) {
1445
1481
  remoteIdleSessions.set(`${nodeId}:${sessionId}`, { nodeId, sessionId, providerType });
1446
1482
  setTimeout(() => {
@@ -1451,13 +1487,13 @@ function injectMeshSystemMessage(components, args) {
1451
1487
  }, 500);
1452
1488
  }
1453
1489
  } else if (args.event === "agent:generating_started") {
1454
- const sessionId = readNonEmptyString(args.metadataEvent.targetSessionId);
1490
+ const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
1455
1491
  const nodeId = readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId);
1456
1492
  if (sessionId && nodeId) {
1457
1493
  remoteIdleSessions.delete(`${nodeId}:${sessionId}`);
1458
1494
  }
1459
1495
  } else if (args.event === "agent:stopped") {
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}`);
@@ -1472,7 +1508,7 @@ function injectMeshSystemMessage(components, args) {
1472
1508
  appendLedgerEntry(args.meshId, {
1473
1509
  kind: ledgerKind,
1474
1510
  nodeId: readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId) || void 0,
1475
- sessionId: readNonEmptyString(args.metadataEvent.targetSessionId) || void 0,
1511
+ sessionId: resolveEventSessionId(args.metadataEvent, args.sourceInstanceId) || void 0,
1476
1512
  providerType: readNonEmptyString(args.metadataEvent.providerType) || void 0,
1477
1513
  payload: {
1478
1514
  event: args.event,
@@ -1490,7 +1526,7 @@ function injectMeshSystemMessage(components, args) {
1490
1526
  const mesh = getMesh(args.meshId);
1491
1527
  const maxRetries = mesh?.policy?.maxTaskRetries ?? 1;
1492
1528
  recoveryContext = getSessionRecoveryContext(args.meshId, {
1493
- sessionId: readNonEmptyString(args.metadataEvent.targetSessionId) || void 0,
1529
+ sessionId: resolveEventSessionId(args.metadataEvent, args.sourceInstanceId) || void 0,
1494
1530
  nodeId: readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId) || void 0,
1495
1531
  maxRetries
1496
1532
  });
@@ -1590,7 +1626,7 @@ function handleMeshForwardEvent(components, payload) {
1590
1626
  nodeLabel,
1591
1627
  event: eventName,
1592
1628
  metadataEvent: {
1593
- targetSessionId: readNonEmptyString(payload.targetSessionId) || readNonEmptyString(payload.sessionId),
1629
+ targetSessionId: readNonEmptyString(payload.targetSessionId) || readNonEmptyString(payload.sessionId) || readNonEmptyString(payload.instanceId),
1594
1630
  providerType: readNonEmptyString(payload.providerType),
1595
1631
  providerSessionId: readNonEmptyString(payload.providerSessionId)
1596
1632
  }
@@ -1640,6 +1676,7 @@ var init_mesh_events = __esm({
1640
1676
  MAX_PENDING_EVENTS = 50;
1641
1677
  pendingMeshCoordinatorEvents = [];
1642
1678
  MESH_COORDINATOR_EVENTS = /* @__PURE__ */ new Set([
1679
+ "agent:generating_started",
1643
1680
  "agent:generating_completed",
1644
1681
  "agent:waiting_approval",
1645
1682
  "agent:stopped",
@@ -23650,6 +23687,18 @@ var DaemonCommandRouter = class {
23650
23687
  return { success: false, error: e.message };
23651
23688
  }
23652
23689
  }
23690
+ case "get_mesh_queue": {
23691
+ const meshId = typeof args?.meshId === "string" ? args.meshId.trim() : "";
23692
+ if (!meshId) return { success: false, error: "meshId required" };
23693
+ try {
23694
+ const { getQueue: getQueue2 } = await Promise.resolve().then(() => (init_mesh_work_queue(), mesh_work_queue_exports));
23695
+ const status = Array.isArray(args?.status) ? args.status.map((s) => typeof s === "string" ? s.trim() : "").filter(Boolean) : void 0;
23696
+ const queue = getQueue2(meshId, { status });
23697
+ return { success: true, queue };
23698
+ } catch (e) {
23699
+ return { success: false, error: e.message };
23700
+ }
23701
+ }
23653
23702
  case "add_mesh_node": {
23654
23703
  const meshId = typeof args?.meshId === "string" ? args.meshId.trim() : "";
23655
23704
  const workspace = typeof args?.workspace === "string" ? args.workspace.trim() : "";