@adhdev/daemon-core 0.9.82-rc.24 → 0.9.82-rc.25
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 +64 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +64 -9
- package/dist/index.mjs.map +1 -1
- package/dist/mesh/mesh-events.d.ts +9 -0
- package/dist/mesh/mesh-work-queue.d.ts +3 -1
- package/package.json +1 -1
- package/src/mesh/mesh-events.ts +77 -1
- package/src/mesh/mesh-work-queue.ts +7 -4
package/dist/index.mjs
CHANGED
|
@@ -1512,18 +1512,20 @@ function requeueTask(meshId, taskId, opts) {
|
|
|
1512
1512
|
return entry;
|
|
1513
1513
|
});
|
|
1514
1514
|
}
|
|
1515
|
-
function updateSessionTaskStatus(meshId, sessionId, status) {
|
|
1515
|
+
function updateSessionTaskStatus(meshId, sessionId, status, opts) {
|
|
1516
1516
|
return withQueueLock(meshId, () => {
|
|
1517
1517
|
const queue = readQueue(meshId);
|
|
1518
|
+
const occurredAtTime = opts?.occurredAt ? new Date(opts.occurredAt).getTime() : Number.NaN;
|
|
1519
|
+
const hasOccurredAt = Number.isFinite(occurredAtTime);
|
|
1518
1520
|
let bestIdx = -1;
|
|
1519
1521
|
let bestTime = 0;
|
|
1520
1522
|
for (let i = queue.length - 1; i >= 0; i--) {
|
|
1521
|
-
if (queue[i].assignedSessionId
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1523
|
+
if (queue[i].assignedSessionId !== sessionId || queue[i].status !== "assigned") continue;
|
|
1524
|
+
const time = new Date(queue[i].dispatchTimestamp || queue[i].updatedAt).getTime();
|
|
1525
|
+
if (hasOccurredAt && Number.isFinite(time) && time > occurredAtTime) continue;
|
|
1526
|
+
if (time > bestTime) {
|
|
1527
|
+
bestTime = time;
|
|
1528
|
+
bestIdx = i;
|
|
1527
1529
|
}
|
|
1528
1530
|
}
|
|
1529
1531
|
if (bestIdx === -1) return null;
|
|
@@ -2047,6 +2049,38 @@ function shouldSuppressIntentionalCleanupStop(args) {
|
|
|
2047
2049
|
if (isIntentionalCleanupStopMetadata(args.metadataEvent)) return true;
|
|
2048
2050
|
return hasRecentIntentionalCleanupStop(args.meshId, args.sessionId, args.nodeId);
|
|
2049
2051
|
}
|
|
2052
|
+
function readEventTimestamp(value) {
|
|
2053
|
+
if (typeof value === "number" && Number.isFinite(value)) return value;
|
|
2054
|
+
if (typeof value === "string" && value.trim()) {
|
|
2055
|
+
const numeric = Number(value);
|
|
2056
|
+
if (Number.isFinite(numeric)) return numeric;
|
|
2057
|
+
const parsed = Date.parse(value);
|
|
2058
|
+
if (Number.isFinite(parsed)) return parsed;
|
|
2059
|
+
}
|
|
2060
|
+
return null;
|
|
2061
|
+
}
|
|
2062
|
+
function buildMeshCompletionFingerprint(args) {
|
|
2063
|
+
const timestampPart = Number.isFinite(args.timestamp) ? String(args.timestamp) : readNonEmptyString(args.finalSummary).slice(0, 200);
|
|
2064
|
+
return [
|
|
2065
|
+
args.meshId,
|
|
2066
|
+
args.event,
|
|
2067
|
+
args.sessionId,
|
|
2068
|
+
args.providerType || "",
|
|
2069
|
+
args.providerSessionId || "",
|
|
2070
|
+
timestampPart
|
|
2071
|
+
].join("::");
|
|
2072
|
+
}
|
|
2073
|
+
function isDuplicateMeshCompletionEvent(args) {
|
|
2074
|
+
const fingerprint = buildMeshCompletionFingerprint(args);
|
|
2075
|
+
if (!fingerprint) return false;
|
|
2076
|
+
const now = Date.now();
|
|
2077
|
+
for (const [key, seenAt] of recentCompletionFingerprints.entries()) {
|
|
2078
|
+
if (now - seenAt > RECENT_COMPLETION_FINGERPRINT_TTL_MS) recentCompletionFingerprints.delete(key);
|
|
2079
|
+
}
|
|
2080
|
+
if (recentCompletionFingerprints.has(fingerprint)) return true;
|
|
2081
|
+
recentCompletionFingerprints.set(fingerprint, now);
|
|
2082
|
+
return false;
|
|
2083
|
+
}
|
|
2050
2084
|
function tryAssignQueueTask(components, meshId, nodeId, sessionId, providerType) {
|
|
2051
2085
|
const task = claimNextTask(meshId, nodeId, sessionId);
|
|
2052
2086
|
if (!task) {
|
|
@@ -2408,13 +2442,31 @@ function injectMeshSystemMessage(components, args) {
|
|
|
2408
2442
|
LOG.info("MeshEvents", `Suppressed ${args.event} for intentionally cleanup-stopped session ${eventSessionId || "(unknown session)"}`);
|
|
2409
2443
|
return { success: true, forwarded: 0, suppressed: true, intentionalCleanupStop: true };
|
|
2410
2444
|
}
|
|
2445
|
+
const eventTimestamp = readEventTimestamp(args.metadataEvent.timestamp);
|
|
2446
|
+
if (args.event === "agent:generating_completed" && eventSessionId) {
|
|
2447
|
+
const duplicateCompletion = isDuplicateMeshCompletionEvent({
|
|
2448
|
+
meshId: args.meshId,
|
|
2449
|
+
event: args.event,
|
|
2450
|
+
sessionId: eventSessionId,
|
|
2451
|
+
providerType: readNonEmptyString(args.metadataEvent.providerType) || void 0,
|
|
2452
|
+
providerSessionId: readNonEmptyString(args.metadataEvent.providerSessionId) || void 0,
|
|
2453
|
+
timestamp: eventTimestamp,
|
|
2454
|
+
finalSummary: readNonEmptyString(args.metadataEvent.finalSummary) || void 0
|
|
2455
|
+
});
|
|
2456
|
+
if (duplicateCompletion) {
|
|
2457
|
+
LOG.info("MeshEvents", `Suppressed duplicate completion for mesh ${args.meshId} session ${eventSessionId}`);
|
|
2458
|
+
return { success: true, forwarded: 0, suppressed: true, duplicateCompletion: true };
|
|
2459
|
+
}
|
|
2460
|
+
}
|
|
2411
2461
|
let completedTaskForLedger = null;
|
|
2412
2462
|
if (args.event === "agent:generating_completed") {
|
|
2413
2463
|
const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
|
|
2414
2464
|
const nodeId = readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId);
|
|
2415
2465
|
const providerType = readNonEmptyString(args.metadataEvent.providerType);
|
|
2416
2466
|
if (sessionId) {
|
|
2417
|
-
const completedTask = updateSessionTaskStatus(args.meshId, sessionId, "completed"
|
|
2467
|
+
const completedTask = updateSessionTaskStatus(args.meshId, sessionId, "completed", {
|
|
2468
|
+
occurredAt: eventTimestamp !== null ? new Date(eventTimestamp).toISOString() : void 0
|
|
2469
|
+
});
|
|
2418
2470
|
completedTaskForLedger = completedTask ? { id: completedTask.id } : null;
|
|
2419
2471
|
if (nodeId && providerType) {
|
|
2420
2472
|
setImmediate(() => {
|
|
@@ -2628,6 +2680,7 @@ function handleMeshForwardEvent(components, payload) {
|
|
|
2628
2680
|
providerType: readNonEmptyString(payload.providerType),
|
|
2629
2681
|
providerSessionId: readNonEmptyString(payload.providerSessionId),
|
|
2630
2682
|
finalSummary: readNonEmptyString(payload.finalSummary) || readNonEmptyString(payload.summary),
|
|
2683
|
+
...payload.timestamp !== void 0 ? { timestamp: payload.timestamp } : {},
|
|
2631
2684
|
intentional: payload.intentional === true,
|
|
2632
2685
|
intentionalStop: payload.intentionalStop === true,
|
|
2633
2686
|
operatorCleanup: payload.operatorCleanup === true,
|
|
@@ -2670,7 +2723,7 @@ function setupMeshEventForwarding(components) {
|
|
|
2670
2723
|
});
|
|
2671
2724
|
});
|
|
2672
2725
|
}
|
|
2673
|
-
var REMOTE_IDLE_SESSION_TTL_MS, remoteIdleSessions, MESH_COORDINATOR_EVENTS, EVENT_TO_LEDGER_KIND, INTENTIONAL_CLEANUP_STOP_SUPPRESSION_MS, autoLaunchInProgress, autoLaunchCooldownUntil, AUTO_LAUNCH_COOLDOWN_MS;
|
|
2726
|
+
var REMOTE_IDLE_SESSION_TTL_MS, remoteIdleSessions, MESH_COORDINATOR_EVENTS, EVENT_TO_LEDGER_KIND, INTENTIONAL_CLEANUP_STOP_SUPPRESSION_MS, RECENT_COMPLETION_FINGERPRINT_TTL_MS, recentCompletionFingerprints, autoLaunchInProgress, autoLaunchCooldownUntil, AUTO_LAUNCH_COOLDOWN_MS;
|
|
2674
2727
|
var init_mesh_events = __esm({
|
|
2675
2728
|
"src/mesh/mesh-events.ts"() {
|
|
2676
2729
|
"use strict";
|
|
@@ -2697,6 +2750,8 @@ var init_mesh_events = __esm({
|
|
|
2697
2750
|
"monitor:long_generating": "task_stalled"
|
|
2698
2751
|
};
|
|
2699
2752
|
INTENTIONAL_CLEANUP_STOP_SUPPRESSION_MS = 30 * 60 * 1e3;
|
|
2753
|
+
RECENT_COMPLETION_FINGERPRINT_TTL_MS = 10 * 60 * 1e3;
|
|
2754
|
+
recentCompletionFingerprints = /* @__PURE__ */ new Map();
|
|
2700
2755
|
autoLaunchInProgress = /* @__PURE__ */ new Set();
|
|
2701
2756
|
autoLaunchCooldownUntil = /* @__PURE__ */ new Map();
|
|
2702
2757
|
AUTO_LAUNCH_COOLDOWN_MS = 5e3;
|