@adhdev/daemon-standalone 0.9.82-rc.36 → 0.9.82-rc.38

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 CHANGED
@@ -46541,12 +46541,89 @@ ${(0, import_node_path.resolve)(workspace || os17.tmpdir())}`;
46541
46541
  var REFINE_VALIDATION_OUTPUT_LIMIT_BYTES = 128 * 1024;
46542
46542
  var REFINE_VALIDATION_SUMMARY_CHARS = 2e3;
46543
46543
  var REFINE_VALIDATION_MAX_COMMANDS = 4;
46544
+ var REFINE_PATCH_EQUIVALENCE_OUTPUT_LIMIT_BYTES = 4 * 1024 * 1024;
46544
46545
  function truncateValidationOutput(value) {
46545
46546
  const text = typeof value === "string" ? value : value == null ? "" : String(value);
46546
46547
  if (text.length <= REFINE_VALIDATION_SUMMARY_CHARS) return text;
46547
46548
  return `${text.slice(0, REFINE_VALIDATION_SUMMARY_CHARS)}
46548
46549
  [truncated ${text.length - REFINE_VALIDATION_SUMMARY_CHARS} chars]`;
46549
46550
  }
46551
+ function recordMeshRefineStage(stages, stage, status, startedAt, details) {
46552
+ stages.push({
46553
+ stage,
46554
+ status,
46555
+ durationMs: Date.now() - startedAt,
46556
+ ...details || {}
46557
+ });
46558
+ }
46559
+ async function computeGitPatchId(cwd, fromRef, toRef) {
46560
+ const { execFileSync: execFileSync4 } = await import("child_process");
46561
+ const diff = execFileSync4("git", ["diff", "--patch", "--full-index", fromRef, toRef], {
46562
+ cwd,
46563
+ encoding: "utf8",
46564
+ maxBuffer: REFINE_PATCH_EQUIVALENCE_OUTPUT_LIMIT_BYTES
46565
+ });
46566
+ if (!diff.trim()) return "";
46567
+ const patchId = execFileSync4("git", ["patch-id", "--stable"], {
46568
+ cwd,
46569
+ input: diff,
46570
+ encoding: "utf8",
46571
+ maxBuffer: REFINE_PATCH_EQUIVALENCE_OUTPUT_LIMIT_BYTES
46572
+ }).trim();
46573
+ return patchId.split(/\s+/)[0] || "";
46574
+ }
46575
+ async function runMeshRefinePatchEquivalenceGate(repoRoot, baseHead, branchHead) {
46576
+ const startedAt = Date.now();
46577
+ try {
46578
+ const { execFileSync: execFileSync4 } = await import("child_process");
46579
+ const git = (args) => execFileSync4("git", args, {
46580
+ cwd: repoRoot,
46581
+ encoding: "utf8",
46582
+ maxBuffer: REFINE_PATCH_EQUIVALENCE_OUTPUT_LIMIT_BYTES
46583
+ });
46584
+ const mergeBase = git(["merge-base", baseHead, branchHead]).trim();
46585
+ const mergeTreeStdout = git(["merge-tree", "--write-tree", baseHead, branchHead]);
46586
+ const mergedTree = mergeTreeStdout.trim().split(/\s+/)[0] || "";
46587
+ if (!mergeBase || !mergedTree) {
46588
+ return {
46589
+ status: "failed",
46590
+ equivalent: false,
46591
+ baseHead,
46592
+ branchHead,
46593
+ mergeBase: mergeBase || void 0,
46594
+ mergedTree: mergedTree || void 0,
46595
+ durationMs: Date.now() - startedAt,
46596
+ error: "patch equivalence preflight could not resolve merge-base or synthetic merge tree",
46597
+ stdout: truncateValidationOutput(mergeTreeStdout)
46598
+ };
46599
+ }
46600
+ const expectedPatchId = await computeGitPatchId(repoRoot, mergeBase, branchHead);
46601
+ const actualPatchId = await computeGitPatchId(repoRoot, baseHead, mergedTree);
46602
+ const equivalent = expectedPatchId === actualPatchId;
46603
+ return {
46604
+ status: equivalent ? "passed" : "failed",
46605
+ equivalent,
46606
+ baseHead,
46607
+ branchHead,
46608
+ mergeBase,
46609
+ mergedTree,
46610
+ expectedPatchId,
46611
+ actualPatchId,
46612
+ durationMs: Date.now() - startedAt
46613
+ };
46614
+ } catch (e) {
46615
+ return {
46616
+ status: "failed",
46617
+ equivalent: false,
46618
+ baseHead,
46619
+ branchHead,
46620
+ durationMs: Date.now() - startedAt,
46621
+ error: e?.message || String(e),
46622
+ stdout: truncateValidationOutput(e?.stdout),
46623
+ stderr: truncateValidationOutput(e?.stderr)
46624
+ };
46625
+ }
46626
+ }
46550
46627
  function readPackageScripts(workspace) {
46551
46628
  try {
46552
46629
  const packageJsonPath = (0, import_path7.join)(workspace, "package.json");
@@ -48191,26 +48268,41 @@ ${(0, import_node_path.resolve)(workspace || os17.tmpdir())}`;
48191
48268
  const meshId = typeof args?.meshId === "string" ? args.meshId.trim() : "";
48192
48269
  const nodeId = typeof args?.nodeId === "string" ? args.nodeId.trim() : "";
48193
48270
  if (!meshId || !nodeId) return { success: false, error: "meshId and nodeId required" };
48271
+ const refineStages = [];
48194
48272
  try {
48195
48273
  const meshRecord = await this.getMeshForCommand(meshId, args?.inlineMesh);
48196
48274
  const mesh = meshRecord?.mesh;
48197
48275
  const node = mesh?.nodes?.find((n) => n.id === nodeId || n.nodeId === nodeId);
48198
- if (!node) return { success: false, error: `Node '${nodeId}' not found in mesh` };
48276
+ if (!node) return { success: false, error: `Node '${nodeId}' not found in mesh`, refineStages };
48199
48277
  if (!node.isLocalWorktree || !node.workspace) {
48200
- return { success: false, error: `Refinery requires a local worktree node` };
48278
+ return { success: false, error: `Refinery requires a local worktree node`, refineStages };
48201
48279
  }
48202
48280
  const sourceNode = node.clonedFromNodeId ? mesh?.nodes.find((n) => n.id === node.clonedFromNodeId || n.nodeId === node.clonedFromNodeId) : mesh?.nodes.find((n) => !n.isLocalWorktree);
48203
48281
  const repoRoot = sourceNode?.repoRoot || sourceNode?.workspace;
48204
- if (!repoRoot) return { success: false, error: "Source node repoRoot not found" };
48282
+ if (!repoRoot) return { success: false, error: "Source node repoRoot not found", refineStages };
48205
48283
  const { execFile: execFile3 } = await import("child_process");
48206
48284
  const { promisify: promisify3 } = await import("util");
48207
48285
  const execFileAsync3 = promisify3(execFile3);
48286
+ const resolveStarted = Date.now();
48208
48287
  const { stdout: branchStdout } = await execFileAsync3("git", ["branch", "--show-current"], { cwd: node.workspace, encoding: "utf8" });
48209
48288
  const branch = branchStdout.trim();
48210
- if (!branch) return { success: false, error: "Could not determine branch of the worktree node" };
48289
+ if (!branch) return { success: false, error: "Could not determine branch of the worktree node", refineStages };
48211
48290
  const { stdout: baseBranchStdout } = await execFileAsync3("git", ["branch", "--show-current"], { cwd: repoRoot, encoding: "utf8" });
48212
48291
  const baseBranch = baseBranchStdout.trim();
48292
+ const { stdout: baseHeadStdout } = await execFileAsync3("git", ["rev-parse", "HEAD"], { cwd: repoRoot, encoding: "utf8" });
48293
+ const { stdout: branchHeadStdout } = await execFileAsync3("git", ["rev-parse", branch], { cwd: node.workspace, encoding: "utf8" });
48294
+ const baseHead = baseHeadStdout.trim();
48295
+ const branchHead = branchHeadStdout.trim();
48296
+ recordMeshRefineStage(refineStages, "resolve_refs", "passed", resolveStarted, { branch, baseBranch, baseHead, branchHead });
48297
+ const validationStarted = Date.now();
48213
48298
  const validationSummary = await runMeshRefineValidationGate(mesh, node.workspace);
48299
+ recordMeshRefineStage(
48300
+ refineStages,
48301
+ "validation",
48302
+ validationSummary.status === "passed" ? "passed" : validationSummary.status === "failed" ? "failed" : "skipped",
48303
+ validationStarted,
48304
+ { validationStatus: validationSummary.status, commandsRun: validationSummary.commandsRun.length }
48305
+ );
48214
48306
  if (validationSummary.status === "failed") {
48215
48307
  return {
48216
48308
  success: false,
@@ -48220,6 +48312,7 @@ ${(0, import_node_path.resolve)(workspace || os17.tmpdir())}`;
48220
48312
  branch,
48221
48313
  into: baseBranch,
48222
48314
  validationSummary,
48315
+ refineStages,
48223
48316
  finalBranchConvergenceState: {
48224
48317
  branch,
48225
48318
  baseBranch,
@@ -48239,6 +48332,7 @@ ${(0, import_node_path.resolve)(workspace || os17.tmpdir())}`;
48239
48332
  branch,
48240
48333
  into: baseBranch,
48241
48334
  validationSummary,
48335
+ refineStages,
48242
48336
  finalBranchConvergenceState: {
48243
48337
  branch,
48244
48338
  baseBranch,
@@ -48249,37 +48343,121 @@ ${(0, import_node_path.resolve)(workspace || os17.tmpdir())}`;
48249
48343
  }
48250
48344
  };
48251
48345
  }
48346
+ const patchEquivalenceStarted = Date.now();
48347
+ const patchEquivalence = await runMeshRefinePatchEquivalenceGate(repoRoot, baseHead, branchHead);
48348
+ recordMeshRefineStage(refineStages, "patch_equivalence", patchEquivalence.status, patchEquivalenceStarted, {
48349
+ equivalent: patchEquivalence.equivalent,
48350
+ expectedPatchId: patchEquivalence.expectedPatchId,
48351
+ actualPatchId: patchEquivalence.actualPatchId,
48352
+ error: patchEquivalence.error
48353
+ });
48354
+ if (!patchEquivalence.equivalent) {
48355
+ return {
48356
+ success: false,
48357
+ code: "patch_equivalence_failed",
48358
+ convergenceStatus: "blocked_review",
48359
+ error: "Refinery patch-equivalence preflight failed; merge/refine was not attempted.",
48360
+ branch,
48361
+ into: baseBranch,
48362
+ validationSummary,
48363
+ patchEquivalence,
48364
+ refineStages,
48365
+ finalBranchConvergenceState: {
48366
+ branch,
48367
+ baseBranch,
48368
+ merged: false,
48369
+ removed: false,
48370
+ validation: "passed",
48371
+ patchEquivalence: "failed",
48372
+ status: "blocked_review"
48373
+ }
48374
+ };
48375
+ }
48376
+ let mergeResult;
48377
+ const mergeStarted = Date.now();
48252
48378
  try {
48253
- await execFileAsync3("git", ["merge", "--no-ff", branch, "-m", `Auto-merge branch '${branch}' via Refinery`], { cwd: repoRoot, encoding: "utf8" });
48379
+ const result = await execFileAsync3("git", ["merge", "--no-ff", branch, "-m", `Auto-merge branch '${branch}' via Refinery`], { cwd: repoRoot, encoding: "utf8" });
48380
+ mergeResult = {
48381
+ stdout: truncateValidationOutput(result.stdout),
48382
+ stderr: truncateValidationOutput(result.stderr),
48383
+ durationMs: Date.now() - mergeStarted
48384
+ };
48385
+ recordMeshRefineStage(refineStages, "merge", "passed", mergeStarted, mergeResult);
48254
48386
  } catch (e) {
48387
+ recordMeshRefineStage(refineStages, "merge", "failed", mergeStarted, {
48388
+ error: e?.message || String(e),
48389
+ stdout: truncateValidationOutput(e?.stdout),
48390
+ stderr: truncateValidationOutput(e?.stderr)
48391
+ });
48255
48392
  return {
48256
48393
  success: false,
48257
48394
  error: `Merge failed (conflicts?): ${e.message}`,
48258
48395
  validationSummary,
48396
+ patchEquivalence,
48397
+ refineStages,
48259
48398
  finalBranchConvergenceState: {
48260
48399
  branch,
48261
48400
  baseBranch,
48262
48401
  merged: false,
48263
48402
  removed: false,
48264
48403
  validation: "passed",
48404
+ patchEquivalence: "passed",
48265
48405
  status: "not_mergeable"
48266
48406
  }
48267
48407
  };
48268
48408
  }
48409
+ const cleanupStarted = Date.now();
48269
48410
  const removeResult = await this.execute("remove_mesh_node", {
48270
48411
  meshId,
48271
48412
  nodeId,
48272
- sessionCleanupMode: "kill",
48413
+ sessionCleanupMode: "preserve",
48273
48414
  inlineMesh: args?.inlineMesh
48274
48415
  });
48416
+ recordMeshRefineStage(refineStages, "cleanup", removeResult?.success === false ? "failed" : "passed", cleanupStarted, {
48417
+ removed: removeResult?.removed,
48418
+ code: removeResult?.code,
48419
+ error: removeResult?.error
48420
+ });
48421
+ let ledgerError;
48422
+ const ledgerStarted = Date.now();
48275
48423
  try {
48276
48424
  const { appendLedgerEntry: appendLedgerEntry2 } = await Promise.resolve().then(() => (init_mesh_ledger(), mesh_ledger_exports));
48277
48425
  appendLedgerEntry2(meshId, {
48278
48426
  kind: "node_removed",
48279
48427
  nodeId,
48280
- payload: { refined: true, mergedBranch: branch, into: baseBranch, validationSummary }
48428
+ payload: { refined: true, mergedBranch: branch, into: baseBranch, validationSummary, patchEquivalence }
48281
48429
  });
48282
- } catch {
48430
+ recordMeshRefineStage(refineStages, "ledger", "passed", ledgerStarted);
48431
+ } catch (e) {
48432
+ ledgerError = e?.message || String(e);
48433
+ recordMeshRefineStage(refineStages, "ledger", "failed", ledgerStarted, { error: ledgerError });
48434
+ }
48435
+ const finalBranchConvergenceState = {
48436
+ branch: baseBranch,
48437
+ mergedBranch: branch,
48438
+ baseBranch,
48439
+ merged: true,
48440
+ removed: removeResult?.success !== false,
48441
+ validation: "passed",
48442
+ patchEquivalence: "passed",
48443
+ status: removeResult?.success === false ? "merged_cleanup_failed" : "merged"
48444
+ };
48445
+ if (removeResult?.success === false) {
48446
+ return {
48447
+ success: false,
48448
+ code: "cleanup_failed",
48449
+ error: "Refinery merge completed but worktree cleanup failed; manual cleanup/retry is required.",
48450
+ merged: true,
48451
+ branch,
48452
+ into: baseBranch,
48453
+ removeResult,
48454
+ validationSummary,
48455
+ patchEquivalence,
48456
+ mergeResult,
48457
+ refineStages,
48458
+ ...ledgerError ? { ledgerError } : {},
48459
+ finalBranchConvergenceState
48460
+ };
48283
48461
  }
48284
48462
  return {
48285
48463
  success: true,
@@ -48288,18 +48466,14 @@ ${(0, import_node_path.resolve)(workspace || os17.tmpdir())}`;
48288
48466
  into: baseBranch,
48289
48467
  removeResult,
48290
48468
  validationSummary,
48291
- finalBranchConvergenceState: {
48292
- branch: baseBranch,
48293
- mergedBranch: branch,
48294
- baseBranch,
48295
- merged: true,
48296
- removed: removeResult?.success !== false,
48297
- validation: "passed",
48298
- status: removeResult?.success === false ? "merged_cleanup_failed" : "merged"
48299
- }
48469
+ patchEquivalence,
48470
+ mergeResult,
48471
+ refineStages,
48472
+ ...ledgerError ? { ledgerError } : {},
48473
+ finalBranchConvergenceState
48300
48474
  };
48301
48475
  } catch (e) {
48302
- return { success: false, error: e.message };
48476
+ return { success: false, error: e.message, refineStages };
48303
48477
  }
48304
48478
  }
48305
48479
  case "remove_mesh_node": {
@@ -48811,6 +48985,43 @@ ${block}`);
48811
48985
  const sessionHostRecords = this.deps.sessionHostControl?.listSessions ? await this.deps.sessionHostControl.listSessions().catch(() => []) : [];
48812
48986
  const liveMeshSessions = partitionSessionHostRecords(Array.isArray(sessionHostRecords) ? sessionHostRecords : []).liveRuntimes;
48813
48987
  const localMachineId = loadConfig2().machineId || "";
48988
+ const requireDirectPeerTruth = args?.requireDirectPeerTruth === true;
48989
+ const directTruth = requireDirectPeerTruth ? await hydrateInlineMeshDirectTruth({
48990
+ mesh,
48991
+ meshSource: meshRecord.source,
48992
+ dispatchMeshCommand: this.deps.dispatchMeshCommand,
48993
+ statusInstanceId: this.deps.statusInstanceId,
48994
+ localMachineId
48995
+ }) : {
48996
+ directEvidenceCount: 0,
48997
+ localConfirmedCount: 0,
48998
+ peerAttemptedCount: 0,
48999
+ peerConfirmedCount: 0,
49000
+ unavailableNodeIds: []
49001
+ };
49002
+ const directTruthSatisfied = meshRecord.source !== "inline_bootstrap" || directTruth.directEvidenceCount > 0;
49003
+ if (requireDirectPeerTruth && !directTruthSatisfied) {
49004
+ return {
49005
+ success: false,
49006
+ code: "mesh_direct_peer_truth_unavailable",
49007
+ error: "Selected coordinator could not confirm direct mesh truth yet. Bootstrap inventory stays unavailable until direct mesh_status probes succeed.",
49008
+ sourceOfTruth: {
49009
+ membership: meshRecord.source === "inline_cache" ? "coordinator_inline_mesh_cache" : meshRecord.source === "local_config" ? "local_mesh_config" : "inline_bootstrap_snapshot",
49010
+ coordinatorOwnsLiveTruth: false,
49011
+ currentStatus: "direct_peer_truth_unavailable",
49012
+ directPeerTruth: {
49013
+ required: true,
49014
+ satisfied: false,
49015
+ directEvidenceCount: directTruth.directEvidenceCount,
49016
+ localConfirmedCount: directTruth.localConfirmedCount,
49017
+ peerAttemptedCount: directTruth.peerAttemptedCount,
49018
+ peerConfirmedCount: directTruth.peerConfirmedCount,
49019
+ unavailableNodeIds: directTruth.unavailableNodeIds
49020
+ }
49021
+ }
49022
+ };
49023
+ }
49024
+ const directTruthUnavailableNodeIds = new Set(directTruth.unavailableNodeIds);
48814
49025
  const selectedCoordinatorNodeId = readStringValue(
48815
49026
  mesh.coordinator?.preferredNodeId,
48816
49027
  mesh.nodes?.[0]?.id,
@@ -48906,7 +49117,7 @@ ${block}`);
48906
49117
  status.git = inlineTransitGit;
48907
49118
  status.health = inlineTransitGit.isGitRepo ? deriveMeshNodeHealthFromGit(inlineTransitGit) : "degraded";
48908
49119
  remoteProbeApplied = true;
48909
- } else if (!isSelfNode && daemonId && this.deps.dispatchMeshCommand) {
49120
+ } else if (!isSelfNode && daemonId && this.deps.dispatchMeshCommand && !directTruthUnavailableNodeIds.has(nodeId)) {
48910
49121
  try {
48911
49122
  const remoteGit = await probeRemoteMeshGitStatus({
48912
49123
  dispatchMeshCommand: this.deps.dispatchMeshCommand,
@@ -48997,7 +49208,19 @@ ${block}`);
48997
49208
  refreshedAt: (/* @__PURE__ */ new Date()).toISOString(),
48998
49209
  sourceOfTruth: {
48999
49210
  membership: meshRecord?.source === "inline_cache" ? "coordinator_inline_mesh_cache" : meshRecord?.source === "local_config" ? "local_mesh_config" : "inline_bootstrap_snapshot",
49000
- coordinatorOwnsLiveTruth: meshRecord?.source !== "inline_bootstrap",
49211
+ coordinatorOwnsLiveTruth: directTruthSatisfied,
49212
+ ...requireDirectPeerTruth ? {
49213
+ currentStatus: directTruthSatisfied ? "live_git_and_session_probes" : "direct_peer_truth_unavailable",
49214
+ directPeerTruth: {
49215
+ required: true,
49216
+ satisfied: directTruthSatisfied,
49217
+ directEvidenceCount: directTruth.directEvidenceCount,
49218
+ localConfirmedCount: directTruth.localConfirmedCount,
49219
+ peerAttemptedCount: directTruth.peerAttemptedCount,
49220
+ peerConfirmedCount: directTruth.peerConfirmedCount,
49221
+ unavailableNodeIds: directTruth.unavailableNodeIds
49222
+ }
49223
+ } : {},
49001
49224
  historicalEvidenceOnly: ["recoveryHints", "ledger.summary", "queue.summary"]
49002
49225
  },
49003
49226
  nodes: nodeStatuses,