@adhdev/daemon-core 0.9.82-rc.190 → 0.9.82-rc.192
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 +104 -60
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +104 -60
- package/dist/index.mjs.map +1 -1
- package/dist/mesh/beads-db.d.ts +10 -0
- package/package.json +1 -1
- package/src/mesh/beads-db.ts +37 -0
- package/src/mesh/mesh-events.ts +79 -75
package/dist/index.mjs
CHANGED
|
@@ -3391,6 +3391,15 @@ var init_beads_db = __esm({
|
|
|
3391
3391
|
|
|
3392
3392
|
CREATE INDEX IF NOT EXISTS idx_direct_dispatches_mesh_session
|
|
3393
3393
|
ON mesh_direct_dispatches(mesh_id, session_id, status);
|
|
3394
|
+
|
|
3395
|
+
CREATE TABLE IF NOT EXISTS remote_idle_sessions (
|
|
3396
|
+
node_id TEXT NOT NULL,
|
|
3397
|
+
session_id TEXT NOT NULL,
|
|
3398
|
+
provider_type TEXT NOT NULL,
|
|
3399
|
+
expires_at INTEGER NOT NULL,
|
|
3400
|
+
metadata TEXT,
|
|
3401
|
+
PRIMARY KEY (node_id, session_id)
|
|
3402
|
+
);
|
|
3394
3403
|
`);
|
|
3395
3404
|
}
|
|
3396
3405
|
hasCompletionFingerprint(fingerprint) {
|
|
@@ -3692,6 +3701,29 @@ var init_beads_db = __esm({
|
|
|
3692
3701
|
WHERE mesh_id = ? AND status = 'dispatched' AND dispatched_at < ?
|
|
3693
3702
|
`).run(now, meshId, cutoff);
|
|
3694
3703
|
}
|
|
3704
|
+
// ── Remote Idle Sessions ─────────────────────────────────────────────────
|
|
3705
|
+
setRemoteIdleSession(nodeId, sessionId, providerType, expiresAt, metadata) {
|
|
3706
|
+
this.db.prepare(`
|
|
3707
|
+
INSERT OR REPLACE INTO remote_idle_sessions (node_id, session_id, provider_type, expires_at, metadata)
|
|
3708
|
+
VALUES (?, ?, ?, ?, ?)
|
|
3709
|
+
`).run(nodeId, sessionId, providerType, expiresAt, metadata ? JSON.stringify(metadata) : null);
|
|
3710
|
+
}
|
|
3711
|
+
getRemoteIdleSessions() {
|
|
3712
|
+
const rows = this.db.prepare("SELECT node_id, session_id, provider_type, expires_at, metadata FROM remote_idle_sessions").all();
|
|
3713
|
+
return rows.map((r) => ({
|
|
3714
|
+
nodeId: r.node_id,
|
|
3715
|
+
sessionId: r.session_id,
|
|
3716
|
+
providerType: r.provider_type,
|
|
3717
|
+
expiresAt: r.expires_at,
|
|
3718
|
+
metadata: r.metadata ? JSON.parse(r.metadata) : void 0
|
|
3719
|
+
}));
|
|
3720
|
+
}
|
|
3721
|
+
deleteRemoteIdleSession(nodeId, sessionId) {
|
|
3722
|
+
this.db.prepare("DELETE FROM remote_idle_sessions WHERE node_id = ? AND session_id = ?").run(nodeId, sessionId);
|
|
3723
|
+
}
|
|
3724
|
+
pruneExpiredRemoteIdleSessions() {
|
|
3725
|
+
this.db.prepare("DELETE FROM remote_idle_sessions WHERE expires_at <= ?").run(Date.now());
|
|
3726
|
+
}
|
|
3695
3727
|
};
|
|
3696
3728
|
}
|
|
3697
3729
|
});
|
|
@@ -4136,9 +4168,9 @@ function __resetIdleAutoFastForwardForTests() {
|
|
|
4136
4168
|
idleAutoFastForwardLastAttempt.clear();
|
|
4137
4169
|
}
|
|
4138
4170
|
function sweepExpiredRemoteIdleSessions() {
|
|
4139
|
-
|
|
4140
|
-
|
|
4141
|
-
|
|
4171
|
+
try {
|
|
4172
|
+
BeadsDB.getInstance().pruneExpiredRemoteIdleSessions();
|
|
4173
|
+
} catch {
|
|
4142
4174
|
}
|
|
4143
4175
|
}
|
|
4144
4176
|
function readRefineJobId(event) {
|
|
@@ -5038,13 +5070,21 @@ async function triggerMeshQueue(components, meshId) {
|
|
|
5038
5070
|
});
|
|
5039
5071
|
}
|
|
5040
5072
|
}
|
|
5041
|
-
|
|
5073
|
+
let remoteSessions = [];
|
|
5074
|
+
try {
|
|
5075
|
+
remoteSessions = BeadsDB.getInstance().getRemoteIdleSessions();
|
|
5076
|
+
} catch {
|
|
5077
|
+
}
|
|
5078
|
+
for (const idle of remoteSessions) {
|
|
5042
5079
|
const node = mesh.nodes.find((n) => n.id === idle.nodeId);
|
|
5043
5080
|
if (node) {
|
|
5044
5081
|
remoteIdleSessionsChecked += 1;
|
|
5045
5082
|
const assigned = tryAssignQueueTask(components, meshId, idle.nodeId, idle.sessionId, idle.providerType);
|
|
5046
5083
|
if (assigned) {
|
|
5047
|
-
|
|
5084
|
+
try {
|
|
5085
|
+
BeadsDB.getInstance().deleteRemoteIdleSession(idle.nodeId, idle.sessionId);
|
|
5086
|
+
} catch {
|
|
5087
|
+
}
|
|
5048
5088
|
}
|
|
5049
5089
|
}
|
|
5050
5090
|
}
|
|
@@ -5243,7 +5283,10 @@ function injectMeshSystemMessage(components, args) {
|
|
|
5243
5283
|
});
|
|
5244
5284
|
if (intentionalCleanupStop) {
|
|
5245
5285
|
if (eventSessionId && eventNodeId) {
|
|
5246
|
-
|
|
5286
|
+
try {
|
|
5287
|
+
BeadsDB.getInstance().deleteRemoteIdleSession(eventNodeId, eventSessionId);
|
|
5288
|
+
} catch {
|
|
5289
|
+
}
|
|
5247
5290
|
}
|
|
5248
5291
|
LOG.info("MeshEvents", `Suppressed ${args.event} for intentionally cleanup-stopped session ${eventSessionId || "(unknown session)"}`);
|
|
5249
5292
|
return { success: true, forwarded: 0, suppressed: true, intentionalCleanupStop: true };
|
|
@@ -5330,18 +5373,21 @@ function injectMeshSystemMessage(components, args) {
|
|
|
5330
5373
|
return { success: true, forwarded: 0, suppressed: true, duplicateCompletion: true };
|
|
5331
5374
|
}
|
|
5332
5375
|
}
|
|
5376
|
+
function markSessionTerminal(sessionId, outcome, occurredAtMs) {
|
|
5377
|
+
const task = updateSessionTaskStatus(args.meshId, sessionId, outcome, {
|
|
5378
|
+
occurredAt: occurredAtMs != null ? new Date(occurredAtMs).toISOString() : void 0
|
|
5379
|
+
});
|
|
5380
|
+
updateDirectDispatchStatus(args.meshId, sessionId, outcome);
|
|
5381
|
+
setImmediate(() => cleanupTerminalDirectDispatches());
|
|
5382
|
+
return task ? { id: task.id } : null;
|
|
5383
|
+
}
|
|
5333
5384
|
let completedTaskForLedger = null;
|
|
5334
5385
|
if (args.event === "agent:generating_completed") {
|
|
5335
5386
|
const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
|
|
5336
5387
|
const nodeId = readNonEmptyString2(args.nodeId) || readNonEmptyString2(args.metadataEvent.meshNodeId);
|
|
5337
5388
|
const providerType = readNonEmptyString2(args.metadataEvent.providerType);
|
|
5338
5389
|
if (sessionId) {
|
|
5339
|
-
|
|
5340
|
-
occurredAt: eventTimestamp !== null ? new Date(eventTimestamp).toISOString() : void 0
|
|
5341
|
-
});
|
|
5342
|
-
completedTaskForLedger = completedTask ? { id: completedTask.id } : null;
|
|
5343
|
-
updateDirectDispatchStatus(args.meshId, sessionId, "completed");
|
|
5344
|
-
setImmediate(() => cleanupTerminalDirectDispatches());
|
|
5390
|
+
completedTaskForLedger = markSessionTerminal(sessionId, "completed", eventTimestamp);
|
|
5345
5391
|
if (nodeId && providerType) {
|
|
5346
5392
|
runIdleMaintenanceThenAssignQueue(components, { meshId: args.meshId, nodeId, sessionId, providerType });
|
|
5347
5393
|
}
|
|
@@ -5354,53 +5400,50 @@ function injectMeshSystemMessage(components, args) {
|
|
|
5354
5400
|
const finalSummary = readNonEmptyString2(args.metadataEvent.finalSummary) || void 0;
|
|
5355
5401
|
const workerResult = readWorkerResultMetadata(args.metadataEvent);
|
|
5356
5402
|
const hasCompletionEvidence = !!finalSummary || !!workerResult;
|
|
5357
|
-
|
|
5358
|
-
|
|
5359
|
-
completedTaskForLedger
|
|
5360
|
-
|
|
5361
|
-
|
|
5362
|
-
|
|
5363
|
-
|
|
5364
|
-
|
|
5365
|
-
|
|
5366
|
-
|
|
5367
|
-
|
|
5368
|
-
|
|
5369
|
-
|
|
5370
|
-
|
|
5371
|
-
taskId: completedTask.id,
|
|
5372
|
-
completedViaReady: true,
|
|
5373
|
-
providerSessionId,
|
|
5374
|
-
finalSummary,
|
|
5375
|
-
workerResult,
|
|
5376
|
-
evidence: buildTaskCompletionEvidence({
|
|
5377
|
-
event: "agent:ready",
|
|
5378
|
-
nodeId,
|
|
5379
|
-
sessionId,
|
|
5380
|
-
providerType: providerType || void 0,
|
|
5403
|
+
if (sessionId && hasCompletionEvidence) {
|
|
5404
|
+
completedTaskForLedger = markSessionTerminal(sessionId, "completed");
|
|
5405
|
+
if (completedTaskForLedger) {
|
|
5406
|
+
try {
|
|
5407
|
+
appendLedgerEntry(args.meshId, {
|
|
5408
|
+
kind: "task_completed",
|
|
5409
|
+
nodeId: nodeId || void 0,
|
|
5410
|
+
sessionId,
|
|
5411
|
+
providerType: providerType || void 0,
|
|
5412
|
+
payload: {
|
|
5413
|
+
event: args.event,
|
|
5414
|
+
nodeLabel: args.nodeLabel,
|
|
5415
|
+
taskId: completedTaskForLedger.id,
|
|
5416
|
+
completedViaReady: true,
|
|
5381
5417
|
providerSessionId,
|
|
5382
5418
|
finalSummary,
|
|
5383
|
-
workerResult
|
|
5384
|
-
|
|
5385
|
-
|
|
5386
|
-
|
|
5387
|
-
|
|
5388
|
-
|
|
5419
|
+
workerResult,
|
|
5420
|
+
evidence: buildTaskCompletionEvidence({
|
|
5421
|
+
event: "agent:ready",
|
|
5422
|
+
nodeId,
|
|
5423
|
+
sessionId,
|
|
5424
|
+
providerType: providerType || void 0,
|
|
5425
|
+
providerSessionId,
|
|
5426
|
+
finalSummary,
|
|
5427
|
+
workerResult
|
|
5428
|
+
})
|
|
5429
|
+
}
|
|
5430
|
+
});
|
|
5431
|
+
} catch (e) {
|
|
5432
|
+
LOG.warn("MeshLedger", `Failed to record task_completed from ready: ${e?.message || e}`);
|
|
5433
|
+
}
|
|
5389
5434
|
}
|
|
5390
5435
|
}
|
|
5391
5436
|
if (sessionId && nodeId && providerType) {
|
|
5392
5437
|
sweepExpiredRemoteIdleSessions();
|
|
5393
|
-
|
|
5394
|
-
nodeId,
|
|
5395
|
-
|
|
5396
|
-
|
|
5397
|
-
expiresAt: Date.now() + REMOTE_IDLE_SESSION_TTL_MS
|
|
5398
|
-
});
|
|
5438
|
+
try {
|
|
5439
|
+
BeadsDB.getInstance().setRemoteIdleSession(nodeId, sessionId, providerType, Date.now() + REMOTE_IDLE_SESSION_TTL_MS);
|
|
5440
|
+
} catch {
|
|
5441
|
+
}
|
|
5399
5442
|
setImmediate(() => {
|
|
5400
5443
|
maybeAutoFastForwardIdleNode(components, { meshId: args.meshId, nodeId, sessionId, providerType }).finally(() => {
|
|
5401
5444
|
try {
|
|
5402
5445
|
const assigned = tryAssignQueueTask(components, args.meshId, nodeId, sessionId, providerType);
|
|
5403
|
-
if (assigned)
|
|
5446
|
+
if (assigned) BeadsDB.getInstance().deleteRemoteIdleSession(nodeId, sessionId);
|
|
5404
5447
|
} catch (e) {
|
|
5405
5448
|
LOG.warn("MeshQueue", `Failed to assign idle queue task after maintenance for ${nodeId}: ${e?.message || e}`);
|
|
5406
5449
|
}
|
|
@@ -5411,7 +5454,10 @@ function injectMeshSystemMessage(components, args) {
|
|
|
5411
5454
|
const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
|
|
5412
5455
|
const nodeId = readNonEmptyString2(args.nodeId) || readNonEmptyString2(args.metadataEvent.meshNodeId);
|
|
5413
5456
|
if (sessionId && nodeId) {
|
|
5414
|
-
|
|
5457
|
+
try {
|
|
5458
|
+
BeadsDB.getInstance().deleteRemoteIdleSession(nodeId, sessionId);
|
|
5459
|
+
} catch {
|
|
5460
|
+
}
|
|
5415
5461
|
}
|
|
5416
5462
|
if (sessionId) {
|
|
5417
5463
|
updateDirectDispatchStatus(args.meshId, sessionId, "acked");
|
|
@@ -5420,12 +5466,13 @@ function injectMeshSystemMessage(components, args) {
|
|
|
5420
5466
|
const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
|
|
5421
5467
|
const nodeId = readNonEmptyString2(args.nodeId) || readNonEmptyString2(args.metadataEvent.meshNodeId);
|
|
5422
5468
|
if (sessionId && nodeId) {
|
|
5423
|
-
|
|
5469
|
+
try {
|
|
5470
|
+
BeadsDB.getInstance().deleteRemoteIdleSession(nodeId, sessionId);
|
|
5471
|
+
} catch {
|
|
5472
|
+
}
|
|
5424
5473
|
}
|
|
5425
5474
|
if (sessionId) {
|
|
5426
|
-
|
|
5427
|
-
completedTaskForLedger = failedTask ? { id: failedTask.id } : null;
|
|
5428
|
-
updateDirectDispatchStatus(args.meshId, sessionId, "failed");
|
|
5475
|
+
completedTaskForLedger = markSessionTerminal(sessionId, "failed");
|
|
5429
5476
|
}
|
|
5430
5477
|
}
|
|
5431
5478
|
const ledgerKind = EVENT_TO_LEDGER_KIND[args.event];
|
|
@@ -5656,10 +5703,8 @@ function setupMeshEventForwarding(components) {
|
|
|
5656
5703
|
let meshIdFromDirectDispatch = "";
|
|
5657
5704
|
if (coordinatorMeshId) {
|
|
5658
5705
|
try {
|
|
5659
|
-
const
|
|
5660
|
-
if (
|
|
5661
|
-
meshIdFromDirectDispatch = coordinatorMeshId;
|
|
5662
|
-
}
|
|
5706
|
+
const hasActiveDispatch = getActiveDirectDispatches(coordinatorMeshId).some((d) => d.sessionId === instanceId) || hasUnterminalDirectDispatchLedgerEntry(coordinatorMeshId, instanceId);
|
|
5707
|
+
if (hasActiveDispatch) meshIdFromDirectDispatch = coordinatorMeshId;
|
|
5663
5708
|
} catch {
|
|
5664
5709
|
}
|
|
5665
5710
|
if (!meshIdFromDirectDispatch) return;
|
|
@@ -5684,7 +5729,7 @@ function setupMeshEventForwarding(components) {
|
|
|
5684
5729
|
});
|
|
5685
5730
|
});
|
|
5686
5731
|
}
|
|
5687
|
-
var REMOTE_IDLE_SESSION_TTL_MS,
|
|
5732
|
+
var REMOTE_IDLE_SESSION_TTL_MS, meshByWorkspaceCache, MESH_WORKSPACE_CACHE_TTL_MS, IDLE_AUTO_FAST_FORWARD_THROTTLE_MS, idleAutoFastForwardLastAttempt, REFINE_TERMINAL_EVENTS, MAX_PENDING_EVENTS_BYTES, MAX_PENDING_EVENTS_KEEP, MESH_COORDINATOR_EVENTS, EVENT_TO_LEDGER_KIND, INTENTIONAL_CLEANUP_STOP_SUPPRESSION_MS, RECENT_COMPLETION_FINGERPRINT_TTL_MS, autoLaunchInProgress, autoLaunchCooldownUntil, AUTO_LAUNCH_COOLDOWN_MS;
|
|
5688
5733
|
var init_mesh_events = __esm({
|
|
5689
5734
|
"src/mesh/mesh-events.ts"() {
|
|
5690
5735
|
"use strict";
|
|
@@ -5697,7 +5742,6 @@ var init_mesh_events = __esm({
|
|
|
5697
5742
|
init_beads_db();
|
|
5698
5743
|
init_mesh_fast_forward();
|
|
5699
5744
|
REMOTE_IDLE_SESSION_TTL_MS = 5 * 60 * 1e3;
|
|
5700
|
-
remoteIdleSessions = /* @__PURE__ */ new Map();
|
|
5701
5745
|
meshByWorkspaceCache = /* @__PURE__ */ new Map();
|
|
5702
5746
|
MESH_WORKSPACE_CACHE_TTL_MS = 5e3;
|
|
5703
5747
|
IDLE_AUTO_FAST_FORWARD_THROTTLE_MS = 30 * 60 * 1e3;
|