@adhdev/daemon-core 0.9.82-rc.513 → 0.9.82-rc.515

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.
@@ -5,7 +5,7 @@
5
5
  * Cloud mode syncs these to D1 via server routes; standalone mode
6
6
  * uses this file as the single source of truth.
7
7
  */
8
- import type { LocalMeshEntry, LocalMeshNodeEntry, RepoMeshPolicy, RepoMeshNodePolicy, RepoMeshNodeCapabilities, RepoMeshCoordinatorConfig, RepoMeshHostMetadata, RepoMeshDaemonRole } from '../repo-mesh-types.js';
8
+ import type { LocalMeshEntry, LocalMeshNodeEntry, RepoMeshPolicy, RepoMeshNodePolicy, RepoMeshNodeCapabilities, RepoMeshCoordinatorConfig, RepoMeshHostMetadata, RepoMeshDaemonRole, MeshReportedMemberState } from '../repo-mesh-types.js';
9
9
  import type { MagiKindPanelMap, MagiSlot, DifficultyBrainMap } from '@adhdev/mesh-shared';
10
10
  /**
11
11
  * Migrate a node policy's legacy `providerRoles` cap onto `slots[].maxParallel`,
@@ -159,6 +159,11 @@ export declare function updateNode(meshId: string, nodeId: string, opts: {
159
159
  * is overwritten by the next report. */
160
160
  reportedProviderVersions?: Record<string, string>;
161
161
  reportedDaemonBuildVersion?: string;
162
+ /** Direction-B unified mirrored member state (versions + build + own resolved
163
+ * slots + lastReportedAt) self-reported by the owning daemon on the git_status
164
+ * envelope. Persisted wholesale so a remote node's slot-cap chips survive a
165
+ * coordinator restart, mirroring the per-field reported* self-heal. */
166
+ reportedMemberState?: MeshReportedMemberState;
162
167
  }): LocalMeshNodeEntry | undefined;
163
168
  /**
164
169
  * Validate + normalize a kind-panel's slots (the SOLE MAGI slot normalizer): provider
@@ -38,6 +38,13 @@ export declare function detectCLI(cliId: string, providerLoader?: ProviderLoader
38
38
  * what the git_status envelope carries and the mesh_status skew check compares.
39
39
  */
40
40
  export declare function buildProviderVersions(detected: CLIInfo[]): Record<string, string>;
41
+ /**
42
+ * Register this daemon's ProviderLoader as the fallback used by loader-less
43
+ * provider-version reads (getCachedProviderVersions() with no argument). Called
44
+ * once at boot. Without it the coordinator's self node never resolves a CLI list,
45
+ * so its provider-version chips stay empty even though remote nodes populate.
46
+ */
47
+ export declare function setDefaultProviderLoader(providerLoader: ProviderLoader): void;
41
48
  /**
42
49
  * Return the current cached provider-versions map for this daemon, triggering a
43
50
  * lazy background refresh when the snapshot is stale/cold. Never blocks: returns
@@ -119,9 +119,17 @@ export interface GitCommandServices {
119
119
  * same way it does platform/arch. Wired at daemon boot from the cached CLI
120
120
  * detection snapshot; omitted (⇒ versions not reported) when unavailable.
121
121
  */
122
- getReporterProviderVersions?: () => {
122
+ getReporterProviderVersions?: (workspace?: string) => {
123
123
  providerVersions?: Record<string, string>;
124
124
  daemonBuildVersion?: string;
125
+ /**
126
+ * Direction-B: the reporter node's OWN resolved capability slots
127
+ * (resolveNodeCapabilitySlots over its LOCAL policy for this workspace). Carried
128
+ * inside the unified reporterMemberState so a remote node's slot-cap chips
129
+ * self-heal on the coordinator the same way versions do. Best-effort; omitted
130
+ * when the reporter cannot resolve slots for the workspace.
131
+ */
132
+ slots?: unknown[];
125
133
  };
126
134
  }
127
135
  type GitCommandFailure = {
@@ -137,6 +145,12 @@ type GitCommandSuccess = {
137
145
  reporterMachineNickname?: string;
138
146
  reporterProviderVersions?: Record<string, string>;
139
147
  reporterDaemonBuildVersion?: string;
148
+ reporterMemberState?: {
149
+ providerVersions?: Record<string, string>;
150
+ daemonBuildVersion?: string;
151
+ slots?: unknown[];
152
+ lastReportedAt?: number;
153
+ };
140
154
  } | {
141
155
  success: true;
142
156
  diffSummary: GitDiffSummary;
package/dist/index.js CHANGED
@@ -417,10 +417,10 @@ function readInjected(value) {
417
417
  }
418
418
  function getDaemonBuildInfo() {
419
419
  if (cached) return cached;
420
- const commit = readInjected(true ? "e32fbf96c63cca603a29156a0f70f41ff8e1b252" : void 0) ?? "unknown";
421
- const commitShort = readInjected(true ? "e32fbf96" : void 0) ?? (commit !== "unknown" ? commit.slice(0, 7) : "unknown");
422
- const version = readInjected(true ? "0.9.82-rc.513" : void 0) ?? readInjected(typeof process !== "undefined" ? process.env?.ADHDEV_PKG_VERSION : void 0) ?? "unknown";
423
- const builtAt = readInjected(true ? "2026-07-13T05:58:35.132Z" : void 0);
420
+ const commit = readInjected(true ? "6dbb06b08d25abd9e91c2f87d5aa3dee08bcc19c" : void 0) ?? "unknown";
421
+ const commitShort = readInjected(true ? "6dbb06b0" : void 0) ?? (commit !== "unknown" ? commit.slice(0, 7) : "unknown");
422
+ const version = readInjected(true ? "0.9.82-rc.515" : void 0) ?? readInjected(typeof process !== "undefined" ? process.env?.ADHDEV_PKG_VERSION : void 0) ?? "unknown";
423
+ const builtAt = readInjected(true ? "2026-07-13T09:44:33.291Z" : void 0);
424
424
  cached = builtAt ? { commit, commitShort, version, builtAt } : { commit, commitShort, version };
425
425
  return cached;
426
426
  }
@@ -3533,6 +3533,9 @@ function updateNode(meshId, nodeId, opts) {
3533
3533
  if (opts.reportedDaemonBuildVersion && opts.reportedDaemonBuildVersion.trim()) {
3534
3534
  node.reportedDaemonBuildVersion = opts.reportedDaemonBuildVersion.trim();
3535
3535
  }
3536
+ if (opts.reportedMemberState) {
3537
+ node.reportedMemberState = opts.reportedMemberState;
3538
+ }
3536
3539
  if (opts.policy) node.policy = { ...node.policy, ...opts.policy };
3537
3540
  if (Object.prototype.hasOwnProperty.call(opts, "capabilities")) {
3538
3541
  const tags = normalizeCapabilityTags(opts.capabilities);
@@ -3672,6 +3675,8 @@ function normalizeProviderPriority(policy) {
3672
3675
  function resolveNodeCapabilitySlots(node) {
3673
3676
  const explicit = normalizeNodeCapabilitySlots(node?.policy?.slots);
3674
3677
  if (explicit.length) return explicit;
3678
+ const mirrored = normalizeNodeCapabilitySlots(node?.reportedMemberState?.slots);
3679
+ if (mirrored.length) return mirrored;
3675
3680
  let difficultyBrains;
3676
3681
  try {
3677
3682
  difficultyBrains = getDifficultyBrains();
@@ -3683,6 +3688,26 @@ function resolveNodeCapabilitySlots(node) {
3683
3688
  difficultyBrains
3684
3689
  });
3685
3690
  }
3691
+ function resolveLocalNodeSlotsForWorkspace(workspace) {
3692
+ const ws = typeof workspace === "string" ? workspace.trim() : "";
3693
+ if (!ws) return [];
3694
+ let meshes;
3695
+ try {
3696
+ meshes = listMeshes();
3697
+ } catch {
3698
+ return [];
3699
+ }
3700
+ for (const mesh of Array.isArray(meshes) ? meshes : []) {
3701
+ for (const node of Array.isArray(mesh?.nodes) ? mesh.nodes : []) {
3702
+ const nodeWs = typeof node?.workspace === "string" ? node.workspace : "";
3703
+ if (nodeWs && meshWorkspacesEquivalent(nodeWs, ws)) {
3704
+ const slots = resolveNodeCapabilitySlots({ policy: node?.policy });
3705
+ if (slots.length) return slots;
3706
+ }
3707
+ }
3708
+ }
3709
+ return [];
3710
+ }
3686
3711
  var init_mesh_node_slots = __esm({
3687
3712
  "src/mesh/mesh-node-slots.ts"() {
3688
3713
  "use strict";
@@ -14179,11 +14204,15 @@ function buildProviderVersions(detected) {
14179
14204
  }
14180
14205
  return out;
14181
14206
  }
14207
+ function setDefaultProviderLoader(providerLoader) {
14208
+ defaultProviderLoader = providerLoader;
14209
+ }
14182
14210
  function refreshProviderVersionsSnapshot(providerLoader) {
14183
14211
  if (providerVersionsRefreshInFlight) return providerVersionsRefreshInFlight;
14212
+ const loader = providerLoader ?? defaultProviderLoader;
14184
14213
  providerVersionsRefreshInFlight = (async () => {
14185
14214
  try {
14186
- const detected = await detectCLIs(providerLoader, { includeVersion: true });
14215
+ const detected = await detectCLIs(loader, { includeVersion: true });
14187
14216
  cachedProviderVersions = buildProviderVersions(detected);
14188
14217
  cachedProviderVersionsAt = Date.now();
14189
14218
  } catch {
@@ -14200,7 +14229,7 @@ function getCachedProviderVersions(providerLoader) {
14200
14229
  }
14201
14230
  return { ...cachedProviderVersions };
14202
14231
  }
14203
- var import_child_process2, os6, path12, import_fs12, PROVIDER_VERSIONS_TTL_MS, cachedProviderVersions, cachedProviderVersionsAt, providerVersionsRefreshInFlight;
14232
+ var import_child_process2, os6, path12, import_fs12, PROVIDER_VERSIONS_TTL_MS, cachedProviderVersions, cachedProviderVersionsAt, providerVersionsRefreshInFlight, defaultProviderLoader;
14204
14233
  var init_cli_detector = __esm({
14205
14234
  "src/detection/cli-detector.ts"() {
14206
14235
  "use strict";
@@ -14585,7 +14614,8 @@ function recordInlineMeshDirectGitTruth(node, git, source) {
14585
14614
  reporterArch: null,
14586
14615
  reporterMachineNickname: null,
14587
14616
  reporterProviderVersions: null,
14588
- reporterDaemonBuildVersion: null
14617
+ reporterDaemonBuildVersion: null,
14618
+ reportedMemberState: null
14589
14619
  };
14590
14620
  }
14591
14621
  const checkedAt = readNumberValue(git.lastCheckedAt) ?? Date.now();
@@ -14613,16 +14643,47 @@ function recordInlineMeshDirectGitTruth(node, git, source) {
14613
14643
  if (reporterArch) node.reportedArch = reporterArch;
14614
14644
  const reporterMachineNickname = readStringValue(git.reporterMachineNickname) ?? null;
14615
14645
  if (reporterMachineNickname) node.machineNickname = reporterMachineNickname;
14616
- const reporterProviderVersions = readProviderVersionsRecord(git.reporterProviderVersions) ?? (isLocalSource ? readLocalReporterProviderVersions() : null);
14646
+ const unified = normalizeReportedMemberState(git.reporterMemberState);
14647
+ const reporterProviderVersions = (unified?.providerVersions ? readProviderVersionsRecord(unified.providerVersions) : null) ?? readProviderVersionsRecord(git.reporterProviderVersions) ?? (isLocalSource ? readLocalReporterProviderVersions() : null);
14617
14648
  if (reporterProviderVersions) node.reportedProviderVersions = reporterProviderVersions;
14618
- const reporterDaemonBuildVersion = readStringValue(git.reporterDaemonBuildVersion) ?? (isLocalSource ? readLocalReporterDaemonBuildVersion() : null) ?? null;
14649
+ const reporterDaemonBuildVersion = readStringValue(unified?.daemonBuildVersion) ?? readStringValue(git.reporterDaemonBuildVersion) ?? (isLocalSource ? readLocalReporterDaemonBuildVersion() : null) ?? null;
14619
14650
  if (reporterDaemonBuildVersion) node.reportedDaemonBuildVersion = reporterDaemonBuildVersion;
14651
+ if (!isLocalSource) {
14652
+ const reportedSlots = normalizeNodeCapabilitySlots(unified?.slots);
14653
+ const mirrored = {
14654
+ ...reporterProviderVersions ? { providerVersions: reporterProviderVersions } : {},
14655
+ ...reporterDaemonBuildVersion ? { daemonBuildVersion: reporterDaemonBuildVersion } : {},
14656
+ ...reportedSlots.length ? { slots: reportedSlots } : {},
14657
+ lastReportedAt: readNumberValue(unified?.lastReportedAt) ?? checkedAt
14658
+ };
14659
+ if (mirrored.providerVersions || mirrored.daemonBuildVersion || mirrored.slots) {
14660
+ node.reportedMemberState = mirrored;
14661
+ }
14662
+ }
14620
14663
  return {
14621
14664
  reporterPlatform,
14622
14665
  reporterArch,
14623
14666
  reporterMachineNickname,
14624
14667
  reporterProviderVersions,
14625
- reporterDaemonBuildVersion
14668
+ reporterDaemonBuildVersion,
14669
+ reportedMemberState: !isLocalSource ? node.reportedMemberState ?? null : null
14670
+ };
14671
+ }
14672
+ function normalizeReportedMemberState(value) {
14673
+ if (!value || typeof value !== "object" || Array.isArray(value)) return null;
14674
+ const raw = value;
14675
+ const providerVersions = readProviderVersionsRecord(raw.providerVersions);
14676
+ const daemonBuildVersion = readStringValue(raw.daemonBuildVersion);
14677
+ const slots = normalizeNodeCapabilitySlots(raw.slots);
14678
+ const lastReportedAt = readNumberValue(raw.lastReportedAt);
14679
+ if (!providerVersions && !daemonBuildVersion && !slots.length && lastReportedAt === void 0) {
14680
+ return null;
14681
+ }
14682
+ return {
14683
+ ...providerVersions ? { providerVersions } : {},
14684
+ ...daemonBuildVersion ? { daemonBuildVersion } : {},
14685
+ ...slots.length ? { slots } : {},
14686
+ ...lastReportedAt !== void 0 ? { lastReportedAt } : {}
14626
14687
  };
14627
14688
  }
14628
14689
  function readProviderVersionsRecord(value) {
@@ -14675,7 +14736,8 @@ function persistNodeReporterPlatform(meshSource, mesh, nodeId, reporter) {
14675
14736
  const reportedMachineNickname = reporter.reporterMachineNickname ?? void 0;
14676
14737
  const reportedProviderVersions = reporter.reporterProviderVersions ?? void 0;
14677
14738
  const reportedDaemonBuildVersion = reporter.reporterDaemonBuildVersion ?? void 0;
14678
- if (!reportedPlatform && !reportedArch && !reportedMachineNickname && !reportedProviderVersions && !reportedDaemonBuildVersion) {
14739
+ const reportedMemberState = reporter.reportedMemberState ?? void 0;
14740
+ if (!reportedPlatform && !reportedArch && !reportedMachineNickname && !reportedProviderVersions && !reportedDaemonBuildVersion && !reportedMemberState) {
14679
14741
  return;
14680
14742
  }
14681
14743
  void Promise.resolve().then(() => (init_mesh_config(), mesh_config_exports)).then(({ updateNode: updateNode2 }) => updateNode2(meshId, nodeId, {
@@ -14683,7 +14745,8 @@ function persistNodeReporterPlatform(meshSource, mesh, nodeId, reporter) {
14683
14745
  reportedArch,
14684
14746
  reportedMachineNickname,
14685
14747
  reportedProviderVersions,
14686
- reportedDaemonBuildVersion
14748
+ reportedDaemonBuildVersion,
14749
+ reportedMemberState
14687
14750
  })).catch(() => {
14688
14751
  });
14689
14752
  }
@@ -15289,6 +15352,8 @@ async function probeRemoteMeshGitStatus(args) {
15289
15352
  if (reporterProviderVersions) git.reporterProviderVersions = reporterProviderVersions;
15290
15353
  const reporterDaemonBuildVersion = readStringValue(remoteResult?.reporterDaemonBuildVersion);
15291
15354
  if (reporterDaemonBuildVersion) git.reporterDaemonBuildVersion = reporterDaemonBuildVersion;
15355
+ const reporterMemberState = normalizeReportedMemberState(remoteResult?.reporterMemberState);
15356
+ if (reporterMemberState) git.reporterMemberState = reporterMemberState;
15292
15357
  return git;
15293
15358
  }
15294
15359
  function readMeshConnectionState(connection) {
@@ -29511,13 +29576,20 @@ async function handleGitCommand(command, args, services = defaultGitCommandServi
29511
29576
  })();
29512
29577
  const reporterVersions = (() => {
29513
29578
  try {
29514
- return services.getReporterProviderVersions?.() ?? {};
29579
+ return services.getReporterProviderVersions?.(workspace) ?? {};
29515
29580
  } catch {
29516
29581
  return {};
29517
29582
  }
29518
29583
  })();
29519
29584
  const reporterProviderVersions = reporterVersions.providerVersions && Object.keys(reporterVersions.providerVersions).length > 0 ? reporterVersions.providerVersions : void 0;
29520
29585
  const reporterDaemonBuildVersion = typeof reporterVersions.daemonBuildVersion === "string" && reporterVersions.daemonBuildVersion.trim() ? reporterVersions.daemonBuildVersion.trim() : void 0;
29586
+ const reporterSlots = Array.isArray(reporterVersions.slots) && reporterVersions.slots.length > 0 ? reporterVersions.slots : void 0;
29587
+ const reporterMemberState = reporterProviderVersions || reporterDaemonBuildVersion || reporterSlots ? {
29588
+ ...reporterProviderVersions ? { providerVersions: reporterProviderVersions } : {},
29589
+ ...reporterDaemonBuildVersion ? { daemonBuildVersion: reporterDaemonBuildVersion } : {},
29590
+ ...reporterSlots ? { slots: reporterSlots } : {},
29591
+ lastReportedAt: Date.now()
29592
+ } : void 0;
29521
29593
  return {
29522
29594
  success: true,
29523
29595
  status,
@@ -29525,7 +29597,8 @@ async function handleGitCommand(command, args, services = defaultGitCommandServi
29525
29597
  reporterArch: process.arch,
29526
29598
  ...reporterMachineNickname ? { reporterMachineNickname } : {},
29527
29599
  ...reporterProviderVersions ? { reporterProviderVersions } : {},
29528
- ...reporterDaemonBuildVersion ? { reporterDaemonBuildVersion } : {}
29600
+ ...reporterDaemonBuildVersion ? { reporterDaemonBuildVersion } : {},
29601
+ ...reporterMemberState ? { reporterMemberState } : {}
29529
29602
  };
29530
29603
  }
29531
29604
  case "git_diff_summary": {
@@ -58679,6 +58752,12 @@ var meshStatusHandlers = {
58679
58752
  }
58680
58753
  applyInlineMeshBranchConvergence(mesh, node, status);
58681
58754
  finalizeMeshNodeStatus({ status, node, daemonId, isSelfNode, directTruthUnavailable: directTruthUnavailableNodeIds.has(nodeId) });
58755
+ if (node.reportedProviderVersions && typeof node.reportedProviderVersions === "object") {
58756
+ status.providerVersions = node.reportedProviderVersions;
58757
+ }
58758
+ if (typeof node.reportedDaemonBuildVersion === "string" && node.reportedDaemonBuildVersion) {
58759
+ status.daemonBuildVersion = node.reportedDaemonBuildVersion;
58760
+ }
58682
58761
  return status;
58683
58762
  };
58684
58763
  const meshNodeEntries = [...(mesh.nodes || []).entries()];
@@ -70842,6 +70921,7 @@ var SessionRegistry = class {
70842
70921
  init_logger();
70843
70922
  init_runtime_defaults();
70844
70923
  init_config();
70924
+ init_mesh_node_slots();
70845
70925
  init_mesh_events();
70846
70926
  init_mesh_reconcile_loop();
70847
70927
  init_coordinator_registry();
@@ -70891,6 +70971,7 @@ async function initDaemonComponents(config) {
70891
70971
  });
70892
70972
  providerLoader.loadAll();
70893
70973
  providerLoader.registerToDetector();
70974
+ setDefaultProviderLoader(providerLoader);
70894
70975
  const versionArchive = new VersionArchive();
70895
70976
  providerLoader.setVersionArchive(versionArchive);
70896
70977
  setTimeout(() => {
@@ -70982,15 +71063,24 @@ async function initDaemonComponents(config) {
70982
71063
  instanceManager,
70983
71064
  sessionRegistry,
70984
71065
  gitCommandServices: createDefaultGitCommandServices({
70985
- // T7: fold this daemon's cached provider versions + build version onto the
70986
- // git_status envelope so the mesh coordinator self-heals each node's
70987
- // providerVersions. Non-blocking: reads a TTL cache, lazily refreshed.
70988
- getReporterProviderVersions: () => {
71066
+ // T7 + Direction-B: fold this daemon's cached provider versions + build
71067
+ // version AND its OWN resolved capability slots for the reported workspace
71068
+ // onto the git_status envelope so the mesh coordinator self-heals each
71069
+ // node's providerVersions AND its slot-cap chips (REMOTE-NODE-SLOT-CAP-CHIP
71070
+ // fix). Non-blocking: reads a TTL cache + local meshes.json, lazily
71071
+ // refreshed. The slots the reporter resolves are its LOCAL real policy's
71072
+ // slots — the coordinator mirrors them wholesale for a remote member whose
71073
+ // join-time policy copy is empty. (setDefaultProviderLoader is registered
71074
+ // above so getCachedProviderVersions/slot resolution is not empty — see
71075
+ // the 380556d3 version-chip lesson.)
71076
+ getReporterProviderVersions: (workspace) => {
70989
71077
  const providerVersions = getCachedProviderVersions(providerLoader);
70990
71078
  const daemonBuildVersion = getDaemonBuildInfo().version;
71079
+ const slots = resolveLocalNodeSlotsForWorkspace(workspace);
70991
71080
  return {
70992
71081
  ...Object.keys(providerVersions).length > 0 ? { providerVersions } : {},
70993
- ...daemonBuildVersion && daemonBuildVersion !== "unknown" ? { daemonBuildVersion } : {}
71082
+ ...daemonBuildVersion && daemonBuildVersion !== "unknown" ? { daemonBuildVersion } : {},
71083
+ ...slots.length > 0 ? { slots } : {}
70994
71084
  };
70995
71085
  }
70996
71086
  }),