@adhdev/daemon-core 0.9.82-rc.370 → 0.9.82-rc.372

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.
@@ -0,0 +1,2 @@
1
+ import type { MedFamilyHandler } from './types.js';
2
+ export declare const meshRestartHandlers: Record<string, MedFamilyHandler>;
package/dist/index.d.ts CHANGED
@@ -84,7 +84,7 @@ export { DaemonCdpInitializer } from './cdp/initializer.js';
84
84
  export type { CdpInitializerConfig } from './cdp/initializer.js';
85
85
  export { DaemonCommandHandler } from './commands/handler.js';
86
86
  export type { CommandResult, CommandContext } from './commands/handler.js';
87
- export { DaemonCommandRouter, readCachedInlineMeshActiveSessionDetails, resolveMeshNodeAttribution } from './commands/router.js';
87
+ export { DaemonCommandRouter, readCachedInlineMeshActiveSessionDetails, resolveMeshNodeAttribution, buildMeshNodeDataFreshness, MESH_NODE_LIVE_TRUTH_MARKER } from './commands/router.js';
88
88
  export type { CommandRouterDeps, CommandRouterResult } from './commands/router.js';
89
89
  export { maybeRunDaemonUpgradeHelperFromEnv, spawnDetachedDaemonUpgradeHelper, resolveCurrentGlobalInstallSurface, buildPinnedGlobalInstallCommand, execNpmCommandSync, getNpmExecOptions, } from './commands/upgrade-helper.js';
90
90
  export type { DaemonUpgradeHelperPayload, CurrentGlobalInstallSurface, PinnedGlobalInstallCommand, NpmExecOptions, } from './commands/upgrade-helper.js';
package/dist/index.js CHANGED
@@ -316,10 +316,10 @@ function readInjected(value) {
316
316
  }
317
317
  function getDaemonBuildInfo() {
318
318
  if (cached) return cached;
319
- const commit = readInjected(true ? "84d52e533859a9dd3c3bc8bc11a2541911f7bd0c" : void 0) ?? "unknown";
320
- const commitShort = readInjected(true ? "84d52e53" : void 0) ?? (commit !== "unknown" ? commit.slice(0, 7) : "unknown");
321
- const version = readInjected(true ? "0.9.82-rc.370" : void 0) ?? readInjected(typeof process !== "undefined" ? process.env?.ADHDEV_PKG_VERSION : void 0) ?? "unknown";
322
- const builtAt = readInjected(true ? "2026-06-24T10:07:48.772Z" : void 0);
319
+ const commit = readInjected(true ? "376a56400a2a60c210b7d8a2476b5d2a15604c7e" : void 0) ?? "unknown";
320
+ const commitShort = readInjected(true ? "376a5640" : void 0) ?? (commit !== "unknown" ? commit.slice(0, 7) : "unknown");
321
+ const version = readInjected(true ? "0.9.82-rc.372" : void 0) ?? readInjected(typeof process !== "undefined" ? process.env?.ADHDEV_PKG_VERSION : void 0) ?? "unknown";
322
+ const builtAt = readInjected(true ? "2026-06-24T13:46:48.450Z" : void 0);
323
323
  cached = builtAt ? { commit, commitShort, version, builtAt } : { commit, commitShort, version };
324
324
  return cached;
325
325
  }
@@ -5542,7 +5542,14 @@ var init_mesh_runtime_store = __esm({
5542
5542
  if (candidate.taskMode === "live_debug_readonly") return true;
5543
5543
  return !nodeBusy;
5544
5544
  };
5545
- const entry = candidates.find((candidate) => nodeSatisfiesRequiredTags(candidate.requiredTags, capabilityTags) && dependenciesSatisfied(candidate) && nodeConflictAllows(candidate));
5545
+ const nodeIsWorktree = opts?.nodeIsWorktree === true;
5546
+ const convergenceAllows = (candidate) => candidate.taskMode !== "convergence" || !nodeIsWorktree;
5547
+ const targetMatches = (candidate) => {
5548
+ if (candidate.targetSessionId && candidate.targetSessionId !== sessionId) return false;
5549
+ if (candidate.targetNodeId && candidate.targetNodeId !== nodeId) return false;
5550
+ return true;
5551
+ };
5552
+ const entry = candidates.find((candidate) => nodeSatisfiesRequiredTags(candidate.requiredTags, capabilityTags) && dependenciesSatisfied(candidate) && convergenceAllows(candidate) && targetMatches(candidate) && nodeConflictAllows(candidate));
5546
5553
  if (!entry) return null;
5547
5554
  const now = (/* @__PURE__ */ new Date()).toISOString();
5548
5555
  entry.status = "assigned";
@@ -12746,6 +12753,31 @@ function recoverMeshIdByNodeId(nodeId) {
12746
12753
  }
12747
12754
  return "";
12748
12755
  }
12756
+ function resolveForwardEventMeshId(components, payload) {
12757
+ const direct = readNonEmptyString2(payload.meshId);
12758
+ if (direct) return direct;
12759
+ const workspace = readNonEmptyString2(payload.workspace);
12760
+ const byWorkspace = workspace ? readNonEmptyString2(getCachedMeshByWorkspace(workspace)?.id) : "";
12761
+ if (byWorkspace) return byWorkspace;
12762
+ const byNode = recoverMeshIdByNodeId(readNonEmptyString2(payload.nodeId));
12763
+ if (byNode) return byNode;
12764
+ const sessionId = readNonEmptyString2(payload.targetSessionId) || readNonEmptyString2(payload.sessionId) || readNonEmptyString2(payload.instanceId);
12765
+ if (sessionId) {
12766
+ try {
12767
+ const state = components.instanceManager?.getInstance?.(sessionId)?.getState?.();
12768
+ const settings = state?.settings || {};
12769
+ const meshNodeFor = readNonEmptyString2(settings.meshNodeFor);
12770
+ if (meshNodeFor) return meshNodeFor;
12771
+ const byStamp = recoverMeshIdByNodeId(readNonEmptyString2(settings.meshNodeId));
12772
+ if (byStamp) return byStamp;
12773
+ const sessionWorkspace = readNonEmptyString2(state?.workspace);
12774
+ const bySessionWorkspace = sessionWorkspace ? readNonEmptyString2(getCachedMeshByWorkspace(sessionWorkspace)?.id) : "";
12775
+ if (bySessionWorkspace) return bySessionWorkspace;
12776
+ } catch {
12777
+ }
12778
+ }
12779
+ return "";
12780
+ }
12749
12781
  function __resetIdleAutoFastForwardForTests() {
12750
12782
  idleAutoFastForwardLastAttempt.clear();
12751
12783
  }
@@ -12992,9 +13024,11 @@ function tryAssignQueueTask(components, meshId, nodeId, sessionId, providerType)
12992
13024
  }
12993
13025
  const capabilityTags = buildMeshNodeCapabilityTags(node, providerType);
12994
13026
  const providerMaxParallel = resolveProviderMaxParallel(node?.policy, providerType);
13027
+ const nodeIsWorktree = node?.isLocalWorktree === true;
12995
13028
  const task = claimNextTask(meshId, nodeId, sessionId, capabilityTags, {
12996
13029
  providerType,
12997
- ...providerMaxParallel !== void 0 ? { providerMaxParallel } : {}
13030
+ ...providerMaxParallel !== void 0 ? { providerMaxParallel } : {},
13031
+ nodeIsWorktree
12998
13032
  });
12999
13033
  if (!task) {
13000
13034
  return false;
@@ -13338,6 +13372,7 @@ async function maybeAutoLaunchOneQueueSession(components, meshId, mesh) {
13338
13372
  }
13339
13373
  const candidateNodes = Array.isArray(mesh?.nodes) ? mesh.nodes.filter((node) => {
13340
13374
  if (task.targetNodeId && !meshNodeIdMatches(node, task.targetNodeId)) return false;
13375
+ if (task.taskMode === "convergence" && node?.isLocalWorktree === true) return false;
13341
13376
  if (task.requiredTags?.length) {
13342
13377
  const priorities = normalizeProviderPriority(node?.policy);
13343
13378
  const providerCandidates = priorities.length ? priorities : [void 0];
@@ -14321,6 +14356,8 @@ function forwardUnresolvedDelegateEvent(components, routing, event) {
14321
14356
  nodeId: readNonEmptyString2(routing.nodeId) || readNonEmptyString2(event.meshNodeId) || void 0,
14322
14357
  workspace: readNonEmptyString2(routing.workspace) || readNonEmptyString2(event.workspace) || void 0
14323
14358
  };
14359
+ const resolvedMeshId = resolveForwardEventMeshId(components, payload);
14360
+ if (resolvedMeshId) payload.meshId = resolvedMeshId;
14324
14361
  const selfDaemonIds = resolveCoordinatorDrainDaemonIds(components);
14325
14362
  if (selfDaemonIds.some((self) => daemonIdsEquivalent(self, coordinatorDaemonId))) {
14326
14363
  try {
@@ -14843,7 +14880,10 @@ async function retryUnresolvedDelegateForwards(components) {
14843
14880
  if (!dispatchMeshCommand) return;
14844
14881
  expireStaleUnresolvedDelegateForwards();
14845
14882
  const entries = peekUnresolvedDelegateForwards();
14846
- if (entries.length === 0) return;
14883
+ if (entries.length === 0) {
14884
+ if (unresolvedForwardRejectionCounts.size > 0) unresolvedForwardRejectionCounts.clear();
14885
+ return;
14886
+ }
14847
14887
  const selfIds = resolveCoordinatorDaemonIds(components);
14848
14888
  const isSelfCoordinatorId = (id) => selfIds.some((self) => daemonIdsEquivalent(self, id));
14849
14889
  for (const entry of entries) {
@@ -14862,6 +14902,7 @@ async function retryUnresolvedDelegateForwards(components) {
14862
14902
  LOG.warn("MeshReconcile", `Local route of self-addressed forward to ${entry.coordinatorDaemonId} threw: ${e?.message || e} \u2014 draining anyway to break the retry loop`);
14863
14903
  }
14864
14904
  ackUnresolvedDelegateForward(entry.id);
14905
+ unresolvedForwardRejectionCounts.delete(entry.id);
14865
14906
  if (localResult && localResult.success === false) {
14866
14907
  LOG.warn("MeshReconcile", `Self-addressed unresolved-delegate ${readNonEmptyString2(entry.payload.event)} rejected by local router (${readNonEmptyString2(localResult.error) || "no reason"}) \u2014 drained to break the self-forward retry loop`);
14867
14908
  traceMeshEventDrop("self_forward_local_rejected", entryTraceCtx, readNonEmptyString2(localResult.error) || "no reason");
@@ -14870,21 +14911,40 @@ async function retryUnresolvedDelegateForwards(components) {
14870
14911
  }
14871
14912
  continue;
14872
14913
  }
14914
+ let pushPayload = entry.payload;
14915
+ if (!readNonEmptyString2(pushPayload.meshId)) {
14916
+ const recoveredMeshId = resolveForwardEventMeshId(components, pushPayload);
14917
+ if (recoveredMeshId) {
14918
+ pushPayload = { ...pushPayload, meshId: recoveredMeshId };
14919
+ traceMeshEventStage("forward_meshid_recovered", entryTraceCtx, `meshId=${recoveredMeshId}`);
14920
+ }
14921
+ }
14873
14922
  let result;
14874
14923
  try {
14875
14924
  traceMeshEventStage("forward_send", entryTraceCtx, `retry \u2192 ${entry.coordinatorDaemonId}`);
14876
- result = await dispatchMeshCommand(entry.coordinatorDaemonId, "mesh_forward_event", entry.payload);
14925
+ result = await dispatchMeshCommand(entry.coordinatorDaemonId, "mesh_forward_event", pushPayload);
14877
14926
  } catch (e) {
14878
14927
  LOG.warn("MeshReconcile", `Retry forward to coordinator ${entry.coordinatorDaemonId} failed: ${e?.message || e} \u2014 left queued`);
14879
14928
  traceMeshEventDrop("retry_forward_failed", entryTraceCtx, e?.message || String(e));
14880
14929
  continue;
14881
14930
  }
14882
14931
  if (result && result.success === false) {
14883
- LOG.warn("MeshReconcile", `Retry forward to coordinator ${entry.coordinatorDaemonId} rejected (${readNonEmptyString2(result.error) || "no reason"}) \u2014 left queued`);
14884
- traceMeshEventDrop("retry_forward_rejected", entryTraceCtx, readNonEmptyString2(result.error) || "no reason");
14932
+ const rejections = (unresolvedForwardRejectionCounts.get(entry.id) || 0) + 1;
14933
+ unresolvedForwardRejectionCounts.set(entry.id, rejections);
14934
+ const reason = readNonEmptyString2(result.error) || "no reason";
14935
+ if (rejections >= MAX_FORWARD_REJECTIONS) {
14936
+ ackUnresolvedDelegateForward(entry.id);
14937
+ unresolvedForwardRejectionCounts.delete(entry.id);
14938
+ LOG.warn("MeshReconcile", `Retry forward to coordinator ${entry.coordinatorDaemonId} rejected ${rejections}x (${reason}) \u2014 dropping unresolved-delegate ${readNonEmptyString2(entry.payload.event)} (sess=${readNonEmptyString2(entry.payload.targetSessionId) || readNonEmptyString2(entry.payload.sessionId) || "-"}) to stop the retry loop`);
14939
+ traceMeshEventDrop("retry_forward_exhausted", entryTraceCtx, `${reason} (${rejections} rejections)`);
14940
+ } else {
14941
+ LOG.warn("MeshReconcile", `Retry forward to coordinator ${entry.coordinatorDaemonId} rejected (${reason}) \u2014 left queued (attempt ${rejections}/${MAX_FORWARD_REJECTIONS})`);
14942
+ traceMeshEventDrop("retry_forward_rejected", entryTraceCtx, reason);
14943
+ }
14885
14944
  continue;
14886
14945
  }
14887
14946
  ackUnresolvedDelegateForward(entry.id);
14947
+ unresolvedForwardRejectionCounts.delete(entry.id);
14888
14948
  LOG.info("MeshReconcile", `Retried+delivered unresolved-delegate ${readNonEmptyString2(entry.payload.event)} to coordinator ${entry.coordinatorDaemonId}`);
14889
14949
  }
14890
14950
  }
@@ -15110,7 +15170,7 @@ function setupMeshReconcileLoop(components) {
15110
15170
  }
15111
15171
  };
15112
15172
  }
15113
- var DEFAULT_RECONCILE_INTERVAL_MS, DEFAULT_AUTO_PRUNE_MIN_AGE_MS, heldEventLedgerRecorded, ASSIGNED_STRANDED_DEADLINE_MS, STRICT_SESSION_MATCH_TTL_MS;
15173
+ var DEFAULT_RECONCILE_INTERVAL_MS, DEFAULT_AUTO_PRUNE_MIN_AGE_MS, heldEventLedgerRecorded, ASSIGNED_STRANDED_DEADLINE_MS, STRICT_SESSION_MATCH_TTL_MS, unresolvedForwardRejectionCounts, MAX_FORWARD_REJECTIONS;
15114
15174
  var init_mesh_reconcile_loop = __esm({
15115
15175
  "src/mesh/mesh-reconcile-loop.ts"() {
15116
15176
  "use strict";
@@ -15135,6 +15195,8 @@ var init_mesh_reconcile_loop = __esm({
15135
15195
  heldEventLedgerRecorded = /* @__PURE__ */ new Set();
15136
15196
  ASSIGNED_STRANDED_DEADLINE_MS = 5 * 6e4;
15137
15197
  STRICT_SESSION_MATCH_TTL_MS = 6e4;
15198
+ unresolvedForwardRejectionCounts = /* @__PURE__ */ new Map();
15199
+ MAX_FORWARD_REJECTIONS = 5;
15138
15200
  }
15139
15201
  });
15140
15202
 
@@ -20712,6 +20774,7 @@ __export(index_exports, {
20712
20774
  MESH_CONVERGE_FAST_FORWARD_TAG: () => MESH_CONVERGE_FAST_FORWARD_TAG,
20713
20775
  MESH_CONVERGE_REFINE_TAG: () => MESH_CONVERGE_REFINE_TAG,
20714
20776
  MESH_MISSION_STATUSES: () => MESH_MISSION_STATUSES,
20777
+ MESH_NODE_LIVE_TRUTH_MARKER: () => MESH_NODE_LIVE_TRUTH_MARKER,
20715
20778
  MESH_REFINE_CONFIG_LOCATIONS: () => MESH_REFINE_CONFIG_LOCATIONS,
20716
20779
  MESH_REFINE_CONFIG_SCHEMA: () => MESH_REFINE_CONFIG_SCHEMA,
20717
20780
  MESH_SCHEDULING_STRATEGIES: () => MESH_SCHEDULING_STRATEGIES,
@@ -20758,6 +20821,7 @@ __export(index_exports, {
20758
20821
  buildMeshLedgerReconciliationEvidence: () => buildMeshLedgerReconciliationEvidence,
20759
20822
  buildMeshLedgerReplicaEvidence: () => buildMeshLedgerReplicaEvidence,
20760
20823
  buildMeshNodeCapabilityTags: () => buildMeshNodeCapabilityTags,
20824
+ buildMeshNodeDataFreshness: () => buildMeshNodeDataFreshness,
20761
20825
  buildMissionPromptSection: () => buildMissionPromptSection,
20762
20826
  buildP2pRelayFailurePayload: () => buildP2pRelayFailurePayload,
20763
20827
  buildPinnedGlobalInstallCommand: () => buildPinnedGlobalInstallCommand,
@@ -42089,7 +42153,7 @@ Run 'adhdev doctor' for detailed diagnostics.`
42089
42153
  const adapter = this.adapters.get(ik);
42090
42154
  if (adapter) return { adapter, key: ik };
42091
42155
  }
42092
- if (opts?.dir) {
42156
+ if (opts?.dir && !opts?.instanceKey) {
42093
42157
  for (const [k, a] of this.adapters) {
42094
42158
  if (a.cliType === agentType && a.workingDir === opts.dir) {
42095
42159
  return { adapter: a, key: k };
@@ -47696,6 +47760,52 @@ var fastForwardHandlers = {
47696
47760
  }
47697
47761
  };
47698
47762
 
47763
+ // src/commands/med-family/mesh-restart.ts
47764
+ init_dist();
47765
+ var RESTART_BLOCKING_STATES = /* @__PURE__ */ new Set(["generating", "waiting_approval", "starting"]);
47766
+ function hasBlockingSessions(ctx) {
47767
+ const states = ctx.deps.instanceManager.collectAllStates();
47768
+ for (const state of states) {
47769
+ if (RESTART_BLOCKING_STATES.has(String(state.status || ""))) return true;
47770
+ const childStates = "extensions" in state && Array.isArray(state.extensions) ? state.extensions : [];
47771
+ for (const child of childStates) {
47772
+ if (RESTART_BLOCKING_STATES.has(String(child?.status || ""))) return true;
47773
+ }
47774
+ }
47775
+ return false;
47776
+ }
47777
+ var meshRestartHandlers = {
47778
+ restart_daemon_node: async (ctx, args) => {
47779
+ const meshId = typeof args?.meshId === "string" ? args.meshId.trim() : "";
47780
+ const nodeId = typeof args?.nodeId === "string" ? args.nodeId.trim() : "";
47781
+ let nodeDaemonId;
47782
+ if (meshId && nodeId) {
47783
+ const meshRecord = await ctx.getMeshForCommand(meshId, args?.inlineMesh, { preferInline: true });
47784
+ const node = meshRecord?.mesh?.nodes?.find((n) => meshNodeIdMatches(n, nodeId));
47785
+ nodeDaemonId = typeof node?.daemonId === "string" ? node.daemonId.trim() : void 0;
47786
+ }
47787
+ const selfDaemonId = ctx.deps.statusInstanceId;
47788
+ const isRemote = nodeDaemonId && selfDaemonId && !daemonIdsEquivalent(nodeDaemonId, selfDaemonId);
47789
+ if (isRemote && ctx.deps.dispatchMeshCommand && !args?._meshDirectDispatch) {
47790
+ const forwarded = await ctx.deps.dispatchMeshCommand(nodeDaemonId, "restart_daemon_node", {
47791
+ ...typeof args === "object" && args !== null ? args : {},
47792
+ _meshDirectDispatch: true
47793
+ });
47794
+ return forwarded ?? { success: false, error: "no response from remote node" };
47795
+ }
47796
+ if (hasBlockingSessions(ctx)) {
47797
+ return {
47798
+ success: false,
47799
+ restarted: false,
47800
+ code: "blocking_sessions",
47801
+ reason: "Daemon has an active session (generating / waiting_approval / starting); restart refused to avoid interrupting in-flight work. Retry when the node is idle."
47802
+ };
47803
+ }
47804
+ const result = await daemonLifecycleHandlers.daemon_upgrade({ deps: ctx.deps }, args);
47805
+ return { ...result, restarted: result?.restarting === true };
47806
+ }
47807
+ };
47808
+
47699
47809
  // src/commands/med-family/index.ts
47700
47810
  var medFamilyRegistry = new Map(
47701
47811
  Object.entries({
@@ -47704,7 +47814,8 @@ var medFamilyRegistry = new Map(
47704
47814
  ...meshCrudHandlers,
47705
47815
  ...meshHostPairingHandlers,
47706
47816
  ...meshQueueHandlers,
47707
- ...fastForwardHandlers
47817
+ ...fastForwardHandlers,
47818
+ ...meshRestartHandlers
47708
47819
  })
47709
47820
  );
47710
47821
 
@@ -61910,6 +62021,7 @@ var V1_CONTRACT_VERSION = "1.0.0";
61910
62021
  MESH_CONVERGE_FAST_FORWARD_TAG,
61911
62022
  MESH_CONVERGE_REFINE_TAG,
61912
62023
  MESH_MISSION_STATUSES,
62024
+ MESH_NODE_LIVE_TRUTH_MARKER,
61913
62025
  MESH_REFINE_CONFIG_LOCATIONS,
61914
62026
  MESH_REFINE_CONFIG_SCHEMA,
61915
62027
  MESH_SCHEDULING_STRATEGIES,
@@ -61956,6 +62068,7 @@ var V1_CONTRACT_VERSION = "1.0.0";
61956
62068
  buildMeshLedgerReconciliationEvidence,
61957
62069
  buildMeshLedgerReplicaEvidence,
61958
62070
  buildMeshNodeCapabilityTags,
62071
+ buildMeshNodeDataFreshness,
61959
62072
  buildMissionPromptSection,
61960
62073
  buildP2pRelayFailurePayload,
61961
62074
  buildPinnedGlobalInstallCommand,