@adhdev/daemon-standalone 1.0.28-rc.16 → 1.0.28-rc.17
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 +142 -14
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/vendor/mcp-server/index.js +1 -0
- package/vendor/mcp-server/index.js.map +1 -1
package/dist/index.js
CHANGED
|
@@ -33262,10 +33262,10 @@ var require_dist3 = __commonJS({
|
|
|
33262
33262
|
}
|
|
33263
33263
|
function getDaemonBuildInfo() {
|
|
33264
33264
|
if (cached2) return cached2;
|
|
33265
|
-
const commit = readInjected(true ? "
|
|
33266
|
-
const commitShort = readInjected(true ? "
|
|
33267
|
-
const version2 = readInjected(true ? "1.0.28-rc.
|
|
33268
|
-
const builtAt = readInjected(true ? "2026-07-
|
|
33265
|
+
const commit = readInjected(true ? "9452bd039720355425e62fc7469808a0dda3ab80" : void 0) ?? "unknown";
|
|
33266
|
+
const commitShort = readInjected(true ? "9452bd03" : void 0) ?? (commit !== "unknown" ? commit.slice(0, 7) : "unknown");
|
|
33267
|
+
const version2 = readInjected(true ? "1.0.28-rc.17" : void 0) ?? readInjected(typeof process !== "undefined" ? process.env?.ADHDEV_PKG_VERSION : void 0) ?? "unknown";
|
|
33268
|
+
const builtAt = readInjected(true ? "2026-07-27T01:42:48.643Z" : void 0);
|
|
33269
33269
|
cached2 = builtAt ? { commit, commitShort, version: version2, builtAt } : { commit, commitShort, version: version2 };
|
|
33270
33270
|
return cached2;
|
|
33271
33271
|
}
|
|
@@ -49047,6 +49047,31 @@ The mesh has no work in flight. For each mission, decide its outcome: continue i
|
|
|
49047
49047
|
function recordSynthCompletionGateTrace(stage, payload) {
|
|
49048
49048
|
recordDebugTrace({ category: "completion-gate", stage, level: "debug", payload });
|
|
49049
49049
|
}
|
|
49050
|
+
function evaluateTranscriptSynthAdmission(admission) {
|
|
49051
|
+
if (!admission) return { admitted: true };
|
|
49052
|
+
if (admission.trailingToolActivityAfterFinalAssistant === true) {
|
|
49053
|
+
return { admitted: false, reason: "trailing_tool_activity_after_final_assistant" };
|
|
49054
|
+
}
|
|
49055
|
+
if (!admission.boundedBackstop && typeof admission.liveTurnPendingEvidence === "function") {
|
|
49056
|
+
let pending = false;
|
|
49057
|
+
try {
|
|
49058
|
+
pending = admission.liveTurnPendingEvidence() === true;
|
|
49059
|
+
} catch {
|
|
49060
|
+
}
|
|
49061
|
+
if (pending) return { admitted: false, reason: "live_turn_pending_evidence" };
|
|
49062
|
+
}
|
|
49063
|
+
return { admitted: true };
|
|
49064
|
+
}
|
|
49065
|
+
function resolveLiveTurnPendingEvidence(components, sessionId) {
|
|
49066
|
+
try {
|
|
49067
|
+
const instance = components?.instanceManager?.getInstance?.(sessionId);
|
|
49068
|
+
if (typeof instance?.hasLiveTurnPendingEvidence !== "function") return void 0;
|
|
49069
|
+
const probe = instance.hasLiveTurnPendingEvidence.bind(instance);
|
|
49070
|
+
return () => probe();
|
|
49071
|
+
} catch {
|
|
49072
|
+
return void 0;
|
|
49073
|
+
}
|
|
49074
|
+
}
|
|
49050
49075
|
function findRecentTerminalLedgerEvidence(args) {
|
|
49051
49076
|
if (!args.sessionId && !args.nodeId) return null;
|
|
49052
49077
|
const entries = readLedgerEntries(args.meshId, { tail: 200 });
|
|
@@ -49167,6 +49192,17 @@ The mesh has no work in flight. For each mission, decide its outcome: continue i
|
|
|
49167
49192
|
})) {
|
|
49168
49193
|
return { reconciled: false, alreadyTerminal: true, reason: "terminal_ledger_entry_exists" };
|
|
49169
49194
|
}
|
|
49195
|
+
const admission = evaluateTranscriptSynthAdmission(args.causalAdmission);
|
|
49196
|
+
if (!admission.admitted) {
|
|
49197
|
+
LOG2.info("MeshEvents", `Transcript synth vetoed for task ${args.taskId} session ${args.sessionId} (source ${args.source || "direct_task_transcript_reconciliation"}): ${admission.reason} \u2014 holding the completion; it re-evaluates on the next reconcile pass`);
|
|
49198
|
+
recordSynthCompletionGateTrace("synth-veto", {
|
|
49199
|
+
producer: "transcript_reconcile",
|
|
49200
|
+
source: args.source || "direct_task_transcript_reconciliation",
|
|
49201
|
+
taskId: args.taskId,
|
|
49202
|
+
reason: admission.reason
|
|
49203
|
+
});
|
|
49204
|
+
return { reconciled: false, reason: admission.reason };
|
|
49205
|
+
}
|
|
49170
49206
|
const nodeId = readNonEmptyString(args.nodeId) || dispatch?.nodeId;
|
|
49171
49207
|
const providerType = readNonEmptyString(args.providerType) || dispatch?.providerType || readNonEmptyString(dispatch?.payload.providerType);
|
|
49172
49208
|
const completedAt = args.completedAt || (/* @__PURE__ */ new Date()).toISOString();
|
|
@@ -49329,6 +49365,7 @@ The mesh has no work in flight. For each mission, decide its outcome: continue i
|
|
|
49329
49365
|
init_mesh_events_pending();
|
|
49330
49366
|
init_mesh_events_utils();
|
|
49331
49367
|
init_debug_trace();
|
|
49368
|
+
init_logger();
|
|
49332
49369
|
init_dist();
|
|
49333
49370
|
DIRECT_DISPATCH_RECONCILE_GRACE_MS = 6e4;
|
|
49334
49371
|
DIRECT_DISPATCH_IDLE_SESSION_RECONCILE_GRACE_MS = 12e4;
|
|
@@ -55750,6 +55787,14 @@ ${cleanBody}`;
|
|
|
55750
55787
|
};
|
|
55751
55788
|
}
|
|
55752
55789
|
}
|
|
55790
|
+
if (!readNonEmptyString(args.metadataEvent.taskId) && !sessionHasActiveAssignment(args.meshId, eventSessionId) && !findRecentTerminalLedgerEvidence({ meshId: args.meshId, sessionId: eventSessionId, nodeId: eventNodeId || void 0 }) && isWeakCompletionEvidence(args.metadataEvent)) {
|
|
55791
|
+
LOG2.info("MeshEvents", `Suppressed agent:generating_completed for session ${eventSessionId} (mesh ${args.meshId}): no taskId, no active assignment, and no prior terminal ledger evidence \u2014 a pre-dispatch startup/greeting artifact, not a real task completion`);
|
|
55792
|
+
traceMeshEventDrop("no_dispatch_native_completion", traceCtx);
|
|
55793
|
+
return {
|
|
55794
|
+
kind: "suppress",
|
|
55795
|
+
result: { success: true, forwarded: 0, suppressed: true, noDispatchNativeCompletion: true }
|
|
55796
|
+
};
|
|
55797
|
+
}
|
|
55753
55798
|
const inWindowTask = findInWindowUnclaimedAutoLaunchTask(args.meshId, eventSessionId, Date.now());
|
|
55754
55799
|
if (inWindowTask) {
|
|
55755
55800
|
const causalEvidence = MeshRuntimeStore.getInstance().taskDeliveryConsumed(args.meshId, inWindowTask.id) || hasMatchingTaskDispatchedLedgerEntry(args.meshId, inWindowTask.id, eventSessionId);
|
|
@@ -57501,6 +57546,18 @@ ${cleanBody}`;
|
|
|
57501
57546
|
}
|
|
57502
57547
|
const messages = Array.isArray(payload.messages) ? payload.messages : [];
|
|
57503
57548
|
const evidence = extractFinalAssistantSummaryEvidence(messages);
|
|
57549
|
+
if (hasTrailingToolActivityAfterFinalAssistant(messages)) {
|
|
57550
|
+
setHoldState(synthKey, mesh.id, { liveConfirmedSinceAck: true, consecutiveReadFailures: 0 });
|
|
57551
|
+
LOG2.info("MeshReconcile", `Mid-turn causal admission: task ${taskId} on node ${nodeId} (mesh ${mesh.id}) \u2014 the latest final-looking assistant bubble is followed by trailing tool/terminal activity (interim narration; the turn is still executing); holding the transcript synth`);
|
|
57552
|
+
traceMeshEventDrop("reconcile_synth_veto_trailing_tool_activity", {
|
|
57553
|
+
taskId,
|
|
57554
|
+
sessionId,
|
|
57555
|
+
nodeId,
|
|
57556
|
+
meshId: mesh.id,
|
|
57557
|
+
event: "agent:generating_completed"
|
|
57558
|
+
});
|
|
57559
|
+
continue;
|
|
57560
|
+
}
|
|
57504
57561
|
if (isAcked) {
|
|
57505
57562
|
const ackedAtMs = Date.parse(readNonEmptyString(dispatch.updatedAt));
|
|
57506
57563
|
const sinceAckMs = Number.isFinite(ackedAtMs) ? nowMs - ackedAtMs : Number.POSITIVE_INFINITY;
|
|
@@ -57575,6 +57632,17 @@ ${cleanBody}`;
|
|
|
57575
57632
|
// The ledger-recovered dispatching-coordinator daemon (inside the reconcile fn)
|
|
57576
57633
|
// takes PRIORITY over this arg; this remains the best-available fallback.
|
|
57577
57634
|
...coordinatorDaemonId ? { targetCoordinatorDaemonId: coordinatorDaemonId } : {},
|
|
57635
|
+
// MID-TURN-CAUSAL-ADMISSION (rc.16): pass the LOCAL live adapter's synchronous
|
|
57636
|
+
// turn-state probe into the unified choke point — a pending verdict vetoes this
|
|
57637
|
+
// eager synth (never-acked first-idle / acked fast-track). The death-deadline
|
|
57638
|
+
// backstop is the bounded max-wait net and overrides the veto (genuine-final
|
|
57639
|
+
// fail-open preserved); a remote/missing live source resolves to undefined and
|
|
57640
|
+
// fails open onto the bounded transcript evidence above. The trailing-tool veto
|
|
57641
|
+
// already ran at the top of this tick.
|
|
57642
|
+
causalAdmission: {
|
|
57643
|
+
liveTurnPendingEvidence: resolveLiveTurnPendingEvidence(components, sessionId),
|
|
57644
|
+
boundedBackstop: backstopKind === "ackedHoldDeathDeadlineFired"
|
|
57645
|
+
},
|
|
57578
57646
|
source: "daemon_reconcile_transcript_completion"
|
|
57579
57647
|
});
|
|
57580
57648
|
if (result.reconciled) {
|
|
@@ -58018,10 +58086,10 @@ ${cleanBody}`;
|
|
|
58018
58086
|
if (profile) return profile.emitsPtyTurnEvents === false;
|
|
58019
58087
|
return verdict === "UNKNOWN";
|
|
58020
58088
|
}
|
|
58021
|
-
function propagateWatchdogTranscriptCompletion(meshId, row, evidence, source) {
|
|
58089
|
+
function propagateWatchdogTranscriptCompletion(components, meshId, row, evidence, source, opts) {
|
|
58022
58090
|
const sessionId = readNonEmptyString(row.assignedSessionId) || evidence.sessionId;
|
|
58023
58091
|
if (!sessionId || !readNonEmptyString(evidence.finalSummary)) {
|
|
58024
|
-
return
|
|
58092
|
+
return "unavailable";
|
|
58025
58093
|
}
|
|
58026
58094
|
try {
|
|
58027
58095
|
const result = reconcileDirectDispatchCompletionFromTranscript({
|
|
@@ -58037,11 +58105,26 @@ ${cleanBody}`;
|
|
|
58037
58105
|
// The watchdog poll already enforced idle + post-dispatch + no-trailing-tool + streak;
|
|
58038
58106
|
// skip the reconcile's own grace/transcript_not_proven gates (dedup backstops remain).
|
|
58039
58107
|
preValidatedTranscriptEvidence: true,
|
|
58108
|
+
// MID-TURN-CAUSAL-ADMISSION (rc.16): the transcript poll's structural evidence can
|
|
58109
|
+
// still straddle a genuinely mid-turn LOCAL worker (the incident shape: transcript
|
|
58110
|
+
// reads idle-with-final-assistant while the raw PTY is mid-tool). Route the live
|
|
58111
|
+
// adapter's synchronous probe through the unified choke point. The EARLY-IDLE
|
|
58112
|
+
// caller is an eager path (no opts) → a pending verdict defers; the redrive-deadline
|
|
58113
|
+
// caller passes boundedBackstop (the max-wait net) → the veto yields, preserving the
|
|
58114
|
+
// genuine-final fail-open semantics.
|
|
58115
|
+
causalAdmission: {
|
|
58116
|
+
liveTurnPendingEvidence: resolveLiveTurnPendingEvidence(components, sessionId),
|
|
58117
|
+
boundedBackstop: opts?.boundedBackstop === true
|
|
58118
|
+
},
|
|
58040
58119
|
source
|
|
58041
58120
|
});
|
|
58042
|
-
|
|
58121
|
+
if (result.reconciled || result.alreadyTerminal === true) return "propagated";
|
|
58122
|
+
if (result.reason === "live_turn_pending_evidence" || result.reason === "trailing_tool_activity_after_final_assistant") {
|
|
58123
|
+
return "deferred";
|
|
58124
|
+
}
|
|
58125
|
+
return "unavailable";
|
|
58043
58126
|
} catch {
|
|
58044
|
-
return
|
|
58127
|
+
return "unavailable";
|
|
58045
58128
|
}
|
|
58046
58129
|
}
|
|
58047
58130
|
async function recoverStrandedAssignedDispatches(components, mesh, store, localDaemonId, selfIds = []) {
|
|
@@ -58075,14 +58158,28 @@ ${cleanBody}`;
|
|
|
58075
58158
|
minFinalAssistantAgeMs: ASSIGNED_IDLE_TRANSCRIPT_COMPLETE_MS
|
|
58076
58159
|
});
|
|
58077
58160
|
if (terminalEvidence) {
|
|
58078
|
-
|
|
58079
|
-
|
|
58080
|
-
const propagated = propagateWatchdogTranscriptCompletion(
|
|
58161
|
+
const propagation = propagateWatchdogTranscriptCompletion(
|
|
58162
|
+
components,
|
|
58081
58163
|
meshId,
|
|
58082
58164
|
row,
|
|
58083
58165
|
terminalEvidence,
|
|
58084
58166
|
"early_idle_transcript_evidence"
|
|
58085
58167
|
);
|
|
58168
|
+
if (propagation === "deferred") {
|
|
58169
|
+
assignedIdleFinalAssistantSince.delete(idleTranscriptStreakKey);
|
|
58170
|
+
LOG2.info("MeshReconcile", `Deferred early transcript completion for task ${row.id} on mesh ${meshId} (node=${row.assignedNodeId ?? "?"} session=${row.assignedSessionId ?? "?"}): the live adapter still reports the turn pending (mid-tool / streaming / modal) \u2014 holding; the completion re-evaluates next tick`);
|
|
58171
|
+
traceMeshEventDrop("early_idle_completion_deferred_live_pending", {
|
|
58172
|
+
taskId: row.id,
|
|
58173
|
+
sessionId: row.assignedSessionId,
|
|
58174
|
+
nodeId: row.assignedNodeId,
|
|
58175
|
+
meshId,
|
|
58176
|
+
event: "agent:generating_completed"
|
|
58177
|
+
});
|
|
58178
|
+
continue;
|
|
58179
|
+
}
|
|
58180
|
+
assignedIdleFinalAssistantSince.delete(idleTranscriptStreakKey);
|
|
58181
|
+
updateTaskStatus(meshId, row.id, terminalEvidence.outcome);
|
|
58182
|
+
const propagated = propagation === "propagated";
|
|
58086
58183
|
if (!propagated && !findTerminalLedgerEvidenceForTask({ meshId, taskId: row.id })) {
|
|
58087
58184
|
try {
|
|
58088
58185
|
appendLedgerEntry(meshId, {
|
|
@@ -58257,12 +58354,15 @@ ${cleanBody}`;
|
|
|
58257
58354
|
if (terminalEvidence) {
|
|
58258
58355
|
deliveredNoTurnUnknownStreak.delete(streakKey);
|
|
58259
58356
|
updateTaskStatus(meshId, row.id, terminalEvidence.outcome);
|
|
58260
|
-
const
|
|
58357
|
+
const propagation = propagateWatchdogTranscriptCompletion(
|
|
58358
|
+
components,
|
|
58261
58359
|
meshId,
|
|
58262
58360
|
row,
|
|
58263
58361
|
terminalEvidence,
|
|
58264
|
-
"redrive_deadline_transcript_evidence"
|
|
58362
|
+
"redrive_deadline_transcript_evidence",
|
|
58363
|
+
{ boundedBackstop: true }
|
|
58265
58364
|
);
|
|
58365
|
+
const propagated = propagation === "propagated";
|
|
58266
58366
|
if (!propagated && !findTerminalLedgerEvidenceForTask({ meshId, taskId: row.id })) {
|
|
58267
58367
|
try {
|
|
58268
58368
|
appendLedgerEntry(meshId, {
|
|
@@ -65678,6 +65778,7 @@ ${lastSnapshot}`;
|
|
|
65678
65778
|
handleGitCommand: () => handleGitCommand,
|
|
65679
65779
|
hasCdpManager: () => hasCdpManager,
|
|
65680
65780
|
hasPendingDependents: () => hasPendingDependents,
|
|
65781
|
+
hasTrailingToolActivityAfterFinalAssistant: () => hasTrailingToolActivityAfterFinalAssistant,
|
|
65681
65782
|
hashSignatureParts: () => hashSignatureParts,
|
|
65682
65783
|
initDaemonComponents: () => initDaemonComponents2,
|
|
65683
65784
|
insertDirectDispatch: () => insertDirectDispatch,
|
|
@@ -84082,9 +84183,36 @@ ${body}
|
|
|
84082
84183
|
* OR isModalParked() (a live approval/choice modal) — so a session this method reports
|
|
84083
84184
|
* pending is, by construction, one the local finalization gate would also refuse to
|
|
84084
84185
|
* finalize right now.
|
|
84186
|
+
*
|
|
84187
|
+
* NATIVE-TRAILING-TOOL-GATE (rc.16 follow-up): the three adapter-state discriminators
|
|
84188
|
+
* above are blind to a background shell tool that keeps a turn alive without the adapter
|
|
84189
|
+
* reporting a pending response — e.g. a backgrounded `sleep 40 &` between narration
|
|
84190
|
+
* bubbles on a write-lag native-source provider (claude-cli), which is deliberately
|
|
84191
|
+
* un-floored (noExternalTranscriptSource omitted, mission f2f6da1b owner decision) so its
|
|
84192
|
+
* transcript write-lag emits promptly. That un-flooring is correct for the ordinary
|
|
84193
|
+
* fraction-of-a-second trail, but it also means the growth-hold / busy-lease protections
|
|
84194
|
+
* in getCompletedFinalizationBlock never engage for claude-cli, so an interim final-
|
|
84195
|
+
* LOOKING bubble followed by continuing tool calls can still finalize as a completion
|
|
84196
|
+
* while the transcript demonstrably shows the turn still executing. Close that gap here,
|
|
84197
|
+
* narrowly: for a native-source provider only, reuse the SAME bounded transcript read the
|
|
84198
|
+
* class's own completion judgment already performs (probeNativeTranscriptSignals) and
|
|
84199
|
+
* apply the SAME trailing-tool-activity veto the transcript-synth admission choke point
|
|
84200
|
+
* uses (hasTrailingToolActivityAfterFinalAssistant) — the latest final-looking assistant
|
|
84201
|
+
* bubble followed by tool/terminal activity is interim narration, not a turn end. Fail-open
|
|
84202
|
+
* by construction: a non-native-source class (probe returns null), an unresolved
|
|
84203
|
+
* transcript, or a read error never reaches the veto, so a missing/unavailable transcript
|
|
84204
|
+
* can never wedge a session as "pending" forever.
|
|
84085
84205
|
*/
|
|
84086
84206
|
hasLiveTurnPendingEvidence() {
|
|
84087
|
-
|
|
84207
|
+
if (this.hasAdapterPendingResponse() || this.isModalParked()) return true;
|
|
84208
|
+
try {
|
|
84209
|
+
const probe = this.probeNativeTranscriptSignals();
|
|
84210
|
+
if (probe?.snapshot?.available === true && Array.isArray(probe.messages)) {
|
|
84211
|
+
if (hasTrailingToolActivityAfterFinalAssistant(probe.messages)) return true;
|
|
84212
|
+
}
|
|
84213
|
+
} catch {
|
|
84214
|
+
}
|
|
84215
|
+
return false;
|
|
84088
84216
|
}
|
|
84089
84217
|
/**
|
|
84090
84218
|
* PTY-OVERTRUST-DRAIN (Defect B). The deliverability/drain status the mesh
|