@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.js +60 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +60 -9
- package/dist/index.mjs.map +1 -1
- package/dist/mesh/mesh-work-queue.d.ts +3 -0
- package/package.json +1 -1
- package/src/commands/router.ts +15 -0
- package/src/mesh/mesh-events.ts +37 -7
- package/src/mesh/mesh-work-queue.ts +20 -5
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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:
|
|
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:
|
|
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() : "";
|