@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.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
|
|
1383
|
+
if (instMeshId !== meshId) continue;
|
|
1370
1384
|
const nodeId = readNonEmptyString(settings.meshNodeId) || readNonEmptyString(settings.nodeId);
|
|
1371
1385
|
if (!nodeId) continue;
|
|
1372
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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:
|
|
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:
|
|
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() : "";
|