@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 +58 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +58 -9
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/commands/router.ts +15 -0
- package/src/mesh/mesh-events.ts +44 -10
- package/src/mesh/mesh-work-queue.ts +8 -0
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
|
|
1377
|
+
if (instMeshId !== meshId) continue;
|
|
1364
1378
|
const nodeId = readNonEmptyString(settings.meshNodeId) || readNonEmptyString(settings.nodeId);
|
|
1365
1379
|
if (!nodeId) continue;
|
|
1366
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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:
|
|
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:
|
|
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() : "";
|