@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.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 === sessionId && queue[i].status === "assigned") {
1522
- const time = new Date(queue[i].dispatchTimestamp || queue[i].updatedAt).getTime();
1523
- if (time > bestTime) {
1524
- bestTime = time;
1525
- bestIdx = i;
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;