adhdev 0.9.82-rc.59 → 0.9.82-rc.60

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/cli/index.js CHANGED
@@ -48856,6 +48856,10 @@ var init_router = __esm({
48856
48856
  inlineMeshCache = /* @__PURE__ */ new Map();
48857
48857
  /** Coordinator-owned whole-mesh aggregate status snapshots. Browser callers read this by default. */
48858
48858
  aggregateMeshStatusCache = /* @__PURE__ */ new Map();
48859
+ /** In-memory async Refinery jobs keyed by meshId:nodeId to reject/return duplicate in-flight requests. */
48860
+ runningRefineJobs = /* @__PURE__ */ new Map();
48861
+ /** Terminal async Refinery jobs preserve a clear answer after the worktree node has been removed. */
48862
+ terminalRefineJobs = /* @__PURE__ */ new Map();
48859
48863
  constructor(deps) {
48860
48864
  this.deps = deps;
48861
48865
  }
@@ -49485,6 +49489,340 @@ var init_router = __esm({
49485
49489
  throw e;
49486
49490
  }
49487
49491
  }
49492
+ buildRefineJobKey(meshId, nodeId) {
49493
+ return `${meshId}:${nodeId}`;
49494
+ }
49495
+ buildRefineJobHandle(args) {
49496
+ return {
49497
+ success: true,
49498
+ async: true,
49499
+ status: args.status || "accepted",
49500
+ jobId: args.jobId || `refine_${createInteractionId()}`,
49501
+ interactionId: args.interactionId || createInteractionId(),
49502
+ meshId: args.meshId,
49503
+ nodeId: args.nodeId,
49504
+ targetNodeId: args.nodeId,
49505
+ targetDaemonId: readStringValue(args.node?.daemonId),
49506
+ workspace: readStringValue(args.node?.workspace),
49507
+ startedAt: args.startedAt || (/* @__PURE__ */ new Date()).toISOString(),
49508
+ ...args.completedAt ? { completedAt: args.completedAt } : {},
49509
+ eventDelivery: { pendingEvents: true, ledger: true },
49510
+ evidence: {
49511
+ pendingEventsCommand: "get_pending_mesh_events",
49512
+ ledgerCommand: "get_mesh_ledger_slice",
49513
+ taskHistoryKind: args.status === "completed" ? "task_completed" : args.status === "failed" ? "task_failed" : "task_dispatched"
49514
+ }
49515
+ };
49516
+ }
49517
+ queueRefineJobEvent(event, handle, result) {
49518
+ queuePendingMeshCoordinatorEvent({
49519
+ event,
49520
+ meshId: handle.meshId,
49521
+ nodeLabel: handle.targetNodeId,
49522
+ nodeId: handle.targetNodeId,
49523
+ workspace: handle.workspace,
49524
+ metadataEvent: {
49525
+ source: "refine_mesh_node_async_job",
49526
+ jobId: handle.jobId,
49527
+ interactionId: handle.interactionId,
49528
+ meshId: handle.meshId,
49529
+ nodeId: handle.targetNodeId,
49530
+ targetDaemonId: handle.targetDaemonId,
49531
+ workspace: handle.workspace,
49532
+ status: handle.status,
49533
+ startedAt: handle.startedAt,
49534
+ completedAt: handle.completedAt,
49535
+ ...result ? { result } : {}
49536
+ },
49537
+ queuedAt: Date.now()
49538
+ });
49539
+ }
49540
+ async appendRefineJobLedger(kind, handle, result) {
49541
+ try {
49542
+ const { appendLedgerEntry: appendLedgerEntry2 } = await Promise.resolve().then(() => (init_mesh_ledger(), mesh_ledger_exports));
49543
+ appendLedgerEntry2(handle.meshId, {
49544
+ kind,
49545
+ nodeId: handle.targetNodeId,
49546
+ payload: {
49547
+ source: "refine_mesh_node_async_job",
49548
+ refineJob: {
49549
+ jobId: handle.jobId,
49550
+ interactionId: handle.interactionId,
49551
+ status: handle.status,
49552
+ meshId: handle.meshId,
49553
+ nodeId: handle.targetNodeId,
49554
+ targetDaemonId: handle.targetDaemonId,
49555
+ workspace: handle.workspace,
49556
+ startedAt: handle.startedAt,
49557
+ completedAt: handle.completedAt
49558
+ },
49559
+ async: true,
49560
+ ...result ? {
49561
+ success: result.success === true,
49562
+ result,
49563
+ finalBranchConvergenceState: result.finalBranchConvergenceState
49564
+ } : {}
49565
+ }
49566
+ });
49567
+ } catch (e) {
49568
+ LOG.warn("Mesh", `[Refinery] Failed to append async refine ledger entry: ${e?.message || e}`);
49569
+ }
49570
+ }
49571
+ async executeMeshRefineNodeSynchronously(meshId, nodeId, args) {
49572
+ const refineStages = [];
49573
+ try {
49574
+ const meshRecord = await this.getMeshForCommand(meshId, args?.inlineMesh);
49575
+ const mesh = meshRecord?.mesh;
49576
+ const node = mesh?.nodes?.find((n) => n.id === nodeId || n.nodeId === nodeId);
49577
+ if (!node) return { success: false, error: `Node '${nodeId}' not found in mesh`, refineStages };
49578
+ if (!node.isLocalWorktree || !node.workspace) {
49579
+ return { success: false, error: `Refinery requires a local worktree node`, refineStages };
49580
+ }
49581
+ const sourceNode = node.clonedFromNodeId ? mesh?.nodes.find((n) => n.id === node.clonedFromNodeId || n.nodeId === node.clonedFromNodeId) : mesh?.nodes.find((n) => !n.isLocalWorktree);
49582
+ const repoRoot = sourceNode?.repoRoot || sourceNode?.workspace;
49583
+ if (!repoRoot) return { success: false, error: "Source node repoRoot not found", refineStages };
49584
+ const { execFile: execFile3 } = await import("child_process");
49585
+ const { promisify: promisify3 } = await import("util");
49586
+ const execFileAsync3 = promisify3(execFile3);
49587
+ const resolveStarted = Date.now();
49588
+ const { stdout: branchStdout } = await execFileAsync3("git", ["branch", "--show-current"], { cwd: node.workspace, encoding: "utf8" });
49589
+ const branch = branchStdout.trim();
49590
+ if (!branch) return { success: false, error: "Could not determine branch of the worktree node", refineStages };
49591
+ const { stdout: baseBranchStdout } = await execFileAsync3("git", ["branch", "--show-current"], { cwd: repoRoot, encoding: "utf8" });
49592
+ const baseBranch = baseBranchStdout.trim();
49593
+ const { stdout: baseHeadStdout } = await execFileAsync3("git", ["rev-parse", "HEAD"], { cwd: repoRoot, encoding: "utf8" });
49594
+ const { stdout: branchHeadStdout } = await execFileAsync3("git", ["rev-parse", branch], { cwd: node.workspace, encoding: "utf8" });
49595
+ const baseHead = baseHeadStdout.trim();
49596
+ const branchHead = branchHeadStdout.trim();
49597
+ recordMeshRefineStage(refineStages, "resolve_refs", "passed", resolveStarted, { branch, baseBranch, baseHead, branchHead });
49598
+ const validationStarted = Date.now();
49599
+ const validationSummary = await runMeshRefineValidationGate(mesh, node.workspace);
49600
+ recordMeshRefineStage(
49601
+ refineStages,
49602
+ "validation",
49603
+ validationSummary.status === "passed" ? "passed" : validationSummary.status === "failed" ? "failed" : "skipped",
49604
+ validationStarted,
49605
+ { validationStatus: validationSummary.status, commandsRun: validationSummary.commandsRun.length }
49606
+ );
49607
+ if (validationSummary.status === "failed") {
49608
+ return {
49609
+ success: false,
49610
+ code: "validation_failed",
49611
+ convergenceStatus: "blocked_review",
49612
+ error: "Refinery validation gate failed; merge/refine was not attempted.",
49613
+ branch,
49614
+ into: baseBranch,
49615
+ validationSummary,
49616
+ refineStages,
49617
+ finalBranchConvergenceState: {
49618
+ branch,
49619
+ baseBranch,
49620
+ merged: false,
49621
+ removed: false,
49622
+ validation: "failed",
49623
+ status: "blocked_review"
49624
+ }
49625
+ };
49626
+ }
49627
+ if (validationSummary.status === "skipped") {
49628
+ return {
49629
+ success: false,
49630
+ code: "validation_unavailable",
49631
+ convergenceStatus: "blocked_review",
49632
+ error: "Refinery validation gate is required but no allowlisted validation command was available; merge/refine was not attempted.",
49633
+ branch,
49634
+ into: baseBranch,
49635
+ validationSummary,
49636
+ refineStages,
49637
+ finalBranchConvergenceState: {
49638
+ branch,
49639
+ baseBranch,
49640
+ merged: false,
49641
+ removed: false,
49642
+ validation: "unavailable",
49643
+ status: "blocked_review"
49644
+ }
49645
+ };
49646
+ }
49647
+ const patchEquivalenceStarted = Date.now();
49648
+ const patchEquivalence = await runMeshRefinePatchEquivalenceGate(repoRoot, baseHead, branchHead);
49649
+ recordMeshRefineStage(refineStages, "patch_equivalence", patchEquivalence.status, patchEquivalenceStarted, {
49650
+ equivalent: patchEquivalence.equivalent,
49651
+ expectedPatchId: patchEquivalence.expectedPatchId,
49652
+ actualPatchId: patchEquivalence.actualPatchId,
49653
+ error: patchEquivalence.error
49654
+ });
49655
+ if (!patchEquivalence.equivalent) {
49656
+ return {
49657
+ success: false,
49658
+ code: "patch_equivalence_failed",
49659
+ convergenceStatus: "blocked_review",
49660
+ error: "Refinery patch-equivalence preflight failed; merge/refine was not attempted.",
49661
+ branch,
49662
+ into: baseBranch,
49663
+ validationSummary,
49664
+ patchEquivalence,
49665
+ refineStages,
49666
+ finalBranchConvergenceState: {
49667
+ branch,
49668
+ baseBranch,
49669
+ merged: false,
49670
+ removed: false,
49671
+ validation: "passed",
49672
+ patchEquivalence: "failed",
49673
+ status: "blocked_review"
49674
+ }
49675
+ };
49676
+ }
49677
+ let mergeResult;
49678
+ const mergeStarted = Date.now();
49679
+ try {
49680
+ const result = await execFileAsync3("git", ["merge", "--no-ff", branch, "-m", `Auto-merge branch '${branch}' via Refinery`], { cwd: repoRoot, encoding: "utf8" });
49681
+ mergeResult = {
49682
+ stdout: truncateValidationOutput(result.stdout),
49683
+ stderr: truncateValidationOutput(result.stderr),
49684
+ durationMs: Date.now() - mergeStarted
49685
+ };
49686
+ recordMeshRefineStage(refineStages, "merge", "passed", mergeStarted, mergeResult);
49687
+ } catch (e) {
49688
+ recordMeshRefineStage(refineStages, "merge", "failed", mergeStarted, {
49689
+ error: e?.message || String(e),
49690
+ stdout: truncateValidationOutput(e?.stdout),
49691
+ stderr: truncateValidationOutput(e?.stderr)
49692
+ });
49693
+ return {
49694
+ success: false,
49695
+ error: `Merge failed (conflicts?): ${e.message}`,
49696
+ validationSummary,
49697
+ patchEquivalence,
49698
+ refineStages,
49699
+ finalBranchConvergenceState: {
49700
+ branch,
49701
+ baseBranch,
49702
+ merged: false,
49703
+ removed: false,
49704
+ validation: "passed",
49705
+ patchEquivalence: "passed",
49706
+ status: "not_mergeable"
49707
+ }
49708
+ };
49709
+ }
49710
+ const cleanupStarted = Date.now();
49711
+ const removeResult = await this.execute("remove_mesh_node", {
49712
+ meshId,
49713
+ nodeId,
49714
+ sessionCleanupMode: "preserve",
49715
+ inlineMesh: args?.inlineMesh
49716
+ });
49717
+ recordMeshRefineStage(refineStages, "cleanup", removeResult?.success === false ? "failed" : "passed", cleanupStarted, {
49718
+ removed: removeResult?.removed,
49719
+ code: removeResult?.code,
49720
+ error: removeResult?.error
49721
+ });
49722
+ let ledgerError;
49723
+ const ledgerStarted = Date.now();
49724
+ try {
49725
+ const { appendLedgerEntry: appendLedgerEntry2 } = await Promise.resolve().then(() => (init_mesh_ledger(), mesh_ledger_exports));
49726
+ appendLedgerEntry2(meshId, {
49727
+ kind: "node_removed",
49728
+ nodeId,
49729
+ payload: { refined: true, mergedBranch: branch, into: baseBranch, validationSummary, patchEquivalence }
49730
+ });
49731
+ recordMeshRefineStage(refineStages, "ledger", "passed", ledgerStarted);
49732
+ } catch (e) {
49733
+ ledgerError = e?.message || String(e);
49734
+ recordMeshRefineStage(refineStages, "ledger", "failed", ledgerStarted, { error: ledgerError });
49735
+ }
49736
+ const finalBranchConvergenceState = {
49737
+ branch: baseBranch,
49738
+ mergedBranch: branch,
49739
+ baseBranch,
49740
+ merged: true,
49741
+ removed: removeResult?.success !== false,
49742
+ validation: "passed",
49743
+ patchEquivalence: "passed",
49744
+ status: removeResult?.success === false ? "merged_cleanup_failed" : "merged"
49745
+ };
49746
+ if (removeResult?.success === false) {
49747
+ return {
49748
+ success: false,
49749
+ code: "cleanup_failed",
49750
+ error: "Refinery merge completed but worktree cleanup failed; manual cleanup/retry is required.",
49751
+ merged: true,
49752
+ branch,
49753
+ into: baseBranch,
49754
+ removeResult,
49755
+ validationSummary,
49756
+ patchEquivalence,
49757
+ mergeResult,
49758
+ refineStages,
49759
+ ...ledgerError ? { ledgerError } : {},
49760
+ finalBranchConvergenceState
49761
+ };
49762
+ }
49763
+ return {
49764
+ success: true,
49765
+ merged: true,
49766
+ branch,
49767
+ into: baseBranch,
49768
+ removeResult,
49769
+ validationSummary,
49770
+ patchEquivalence,
49771
+ mergeResult,
49772
+ refineStages,
49773
+ ...ledgerError ? { ledgerError } : {},
49774
+ finalBranchConvergenceState
49775
+ };
49776
+ } catch (e) {
49777
+ return { success: false, error: e.message, refineStages };
49778
+ }
49779
+ }
49780
+ async finishMeshRefineJob(handle, args) {
49781
+ const key = this.buildRefineJobKey(handle.meshId, handle.targetNodeId);
49782
+ let result;
49783
+ try {
49784
+ result = await this.executeMeshRefineNodeSynchronously(handle.meshId, handle.targetNodeId, args);
49785
+ } catch (e) {
49786
+ result = { success: false, error: e?.message || String(e) };
49787
+ }
49788
+ const completedAt = (/* @__PURE__ */ new Date()).toISOString();
49789
+ const terminalHandle = this.buildRefineJobHandle({
49790
+ meshId: handle.meshId,
49791
+ nodeId: handle.targetNodeId,
49792
+ status: result.success === true ? "completed" : "failed",
49793
+ startedAt: handle.startedAt,
49794
+ completedAt,
49795
+ jobId: handle.jobId,
49796
+ interactionId: handle.interactionId,
49797
+ node: { daemonId: handle.targetDaemonId, workspace: handle.workspace }
49798
+ });
49799
+ const terminal2 = { ...terminalHandle, result };
49800
+ this.terminalRefineJobs.set(key, terminal2);
49801
+ this.runningRefineJobs.delete(key);
49802
+ this.invalidateAggregateMeshStatus(handle.meshId);
49803
+ await this.appendRefineJobLedger(result.success === true ? "task_completed" : "task_failed", terminalHandle, result);
49804
+ this.queueRefineJobEvent(result.success === true ? "refine:completed" : "refine:failed", terminalHandle, result);
49805
+ }
49806
+ async startMeshRefineJob(meshId, nodeId, args) {
49807
+ const key = this.buildRefineJobKey(meshId, nodeId);
49808
+ const running = this.runningRefineJobs.get(key);
49809
+ if (running) return { ...running, duplicate: true };
49810
+ const terminal2 = this.terminalRefineJobs.get(key);
49811
+ if (terminal2) return { ...terminal2, duplicate: true };
49812
+ const meshRecord = await this.getMeshForCommand(meshId, args?.inlineMesh);
49813
+ const mesh = meshRecord?.mesh;
49814
+ const node = mesh?.nodes?.find((n) => n.id === nodeId || n.nodeId === nodeId);
49815
+ if (!node) return { success: false, error: `Node '${nodeId}' not found in mesh` };
49816
+ if (!node.isLocalWorktree || !node.workspace) return { success: false, error: `Refinery requires a local worktree node` };
49817
+ const handle = this.buildRefineJobHandle({ meshId, nodeId, node });
49818
+ this.runningRefineJobs.set(key, handle);
49819
+ await this.appendRefineJobLedger("task_dispatched", handle);
49820
+ this.queueRefineJobEvent("refine:accepted", handle);
49821
+ setImmediate(() => {
49822
+ void this.finishMeshRefineJob(handle, args);
49823
+ });
49824
+ return handle;
49825
+ }
49488
49826
  // ─── Daemon-level command core ───────────────────
49489
49827
  /**
49490
49828
  * Daemon-level command execution (IDE start/stop/restart, CLI, detect, logs).
@@ -50570,213 +50908,7 @@ var init_router = __esm({
50570
50908
  const meshId = typeof args?.meshId === "string" ? args.meshId.trim() : "";
50571
50909
  const nodeId = typeof args?.nodeId === "string" ? args.nodeId.trim() : "";
50572
50910
  if (!meshId || !nodeId) return { success: false, error: "meshId and nodeId required" };
50573
- const refineStages = [];
50574
- try {
50575
- const meshRecord = await this.getMeshForCommand(meshId, args?.inlineMesh);
50576
- const mesh = meshRecord?.mesh;
50577
- const node = mesh?.nodes?.find((n) => n.id === nodeId || n.nodeId === nodeId);
50578
- if (!node) return { success: false, error: `Node '${nodeId}' not found in mesh`, refineStages };
50579
- if (!node.isLocalWorktree || !node.workspace) {
50580
- return { success: false, error: `Refinery requires a local worktree node`, refineStages };
50581
- }
50582
- const sourceNode = node.clonedFromNodeId ? mesh?.nodes.find((n) => n.id === node.clonedFromNodeId || n.nodeId === node.clonedFromNodeId) : mesh?.nodes.find((n) => !n.isLocalWorktree);
50583
- const repoRoot = sourceNode?.repoRoot || sourceNode?.workspace;
50584
- if (!repoRoot) return { success: false, error: "Source node repoRoot not found", refineStages };
50585
- const { execFile: execFile3 } = await import("child_process");
50586
- const { promisify: promisify3 } = await import("util");
50587
- const execFileAsync3 = promisify3(execFile3);
50588
- const resolveStarted = Date.now();
50589
- const { stdout: branchStdout } = await execFileAsync3("git", ["branch", "--show-current"], { cwd: node.workspace, encoding: "utf8" });
50590
- const branch = branchStdout.trim();
50591
- if (!branch) return { success: false, error: "Could not determine branch of the worktree node", refineStages };
50592
- const { stdout: baseBranchStdout } = await execFileAsync3("git", ["branch", "--show-current"], { cwd: repoRoot, encoding: "utf8" });
50593
- const baseBranch = baseBranchStdout.trim();
50594
- const { stdout: baseHeadStdout } = await execFileAsync3("git", ["rev-parse", "HEAD"], { cwd: repoRoot, encoding: "utf8" });
50595
- const { stdout: branchHeadStdout } = await execFileAsync3("git", ["rev-parse", branch], { cwd: node.workspace, encoding: "utf8" });
50596
- const baseHead = baseHeadStdout.trim();
50597
- const branchHead = branchHeadStdout.trim();
50598
- recordMeshRefineStage(refineStages, "resolve_refs", "passed", resolveStarted, { branch, baseBranch, baseHead, branchHead });
50599
- const validationStarted = Date.now();
50600
- const validationSummary = await runMeshRefineValidationGate(mesh, node.workspace);
50601
- recordMeshRefineStage(
50602
- refineStages,
50603
- "validation",
50604
- validationSummary.status === "passed" ? "passed" : validationSummary.status === "failed" ? "failed" : "skipped",
50605
- validationStarted,
50606
- { validationStatus: validationSummary.status, commandsRun: validationSummary.commandsRun.length }
50607
- );
50608
- if (validationSummary.status === "failed") {
50609
- return {
50610
- success: false,
50611
- code: "validation_failed",
50612
- convergenceStatus: "blocked_review",
50613
- error: "Refinery validation gate failed; merge/refine was not attempted.",
50614
- branch,
50615
- into: baseBranch,
50616
- validationSummary,
50617
- refineStages,
50618
- finalBranchConvergenceState: {
50619
- branch,
50620
- baseBranch,
50621
- merged: false,
50622
- removed: false,
50623
- validation: "failed",
50624
- status: "blocked_review"
50625
- }
50626
- };
50627
- }
50628
- if (validationSummary.status === "skipped") {
50629
- return {
50630
- success: false,
50631
- code: "validation_unavailable",
50632
- convergenceStatus: "blocked_review",
50633
- error: "Refinery validation gate is required but no allowlisted validation command was available; merge/refine was not attempted.",
50634
- branch,
50635
- into: baseBranch,
50636
- validationSummary,
50637
- refineStages,
50638
- finalBranchConvergenceState: {
50639
- branch,
50640
- baseBranch,
50641
- merged: false,
50642
- removed: false,
50643
- validation: "unavailable",
50644
- status: "blocked_review"
50645
- }
50646
- };
50647
- }
50648
- const patchEquivalenceStarted = Date.now();
50649
- const patchEquivalence = await runMeshRefinePatchEquivalenceGate(repoRoot, baseHead, branchHead);
50650
- recordMeshRefineStage(refineStages, "patch_equivalence", patchEquivalence.status, patchEquivalenceStarted, {
50651
- equivalent: patchEquivalence.equivalent,
50652
- expectedPatchId: patchEquivalence.expectedPatchId,
50653
- actualPatchId: patchEquivalence.actualPatchId,
50654
- error: patchEquivalence.error
50655
- });
50656
- if (!patchEquivalence.equivalent) {
50657
- return {
50658
- success: false,
50659
- code: "patch_equivalence_failed",
50660
- convergenceStatus: "blocked_review",
50661
- error: "Refinery patch-equivalence preflight failed; merge/refine was not attempted.",
50662
- branch,
50663
- into: baseBranch,
50664
- validationSummary,
50665
- patchEquivalence,
50666
- refineStages,
50667
- finalBranchConvergenceState: {
50668
- branch,
50669
- baseBranch,
50670
- merged: false,
50671
- removed: false,
50672
- validation: "passed",
50673
- patchEquivalence: "failed",
50674
- status: "blocked_review"
50675
- }
50676
- };
50677
- }
50678
- let mergeResult;
50679
- const mergeStarted = Date.now();
50680
- try {
50681
- const result = await execFileAsync3("git", ["merge", "--no-ff", branch, "-m", `Auto-merge branch '${branch}' via Refinery`], { cwd: repoRoot, encoding: "utf8" });
50682
- mergeResult = {
50683
- stdout: truncateValidationOutput(result.stdout),
50684
- stderr: truncateValidationOutput(result.stderr),
50685
- durationMs: Date.now() - mergeStarted
50686
- };
50687
- recordMeshRefineStage(refineStages, "merge", "passed", mergeStarted, mergeResult);
50688
- } catch (e) {
50689
- recordMeshRefineStage(refineStages, "merge", "failed", mergeStarted, {
50690
- error: e?.message || String(e),
50691
- stdout: truncateValidationOutput(e?.stdout),
50692
- stderr: truncateValidationOutput(e?.stderr)
50693
- });
50694
- return {
50695
- success: false,
50696
- error: `Merge failed (conflicts?): ${e.message}`,
50697
- validationSummary,
50698
- patchEquivalence,
50699
- refineStages,
50700
- finalBranchConvergenceState: {
50701
- branch,
50702
- baseBranch,
50703
- merged: false,
50704
- removed: false,
50705
- validation: "passed",
50706
- patchEquivalence: "passed",
50707
- status: "not_mergeable"
50708
- }
50709
- };
50710
- }
50711
- const cleanupStarted = Date.now();
50712
- const removeResult = await this.execute("remove_mesh_node", {
50713
- meshId,
50714
- nodeId,
50715
- sessionCleanupMode: "preserve",
50716
- inlineMesh: args?.inlineMesh
50717
- });
50718
- recordMeshRefineStage(refineStages, "cleanup", removeResult?.success === false ? "failed" : "passed", cleanupStarted, {
50719
- removed: removeResult?.removed,
50720
- code: removeResult?.code,
50721
- error: removeResult?.error
50722
- });
50723
- let ledgerError;
50724
- const ledgerStarted = Date.now();
50725
- try {
50726
- const { appendLedgerEntry: appendLedgerEntry2 } = await Promise.resolve().then(() => (init_mesh_ledger(), mesh_ledger_exports));
50727
- appendLedgerEntry2(meshId, {
50728
- kind: "node_removed",
50729
- nodeId,
50730
- payload: { refined: true, mergedBranch: branch, into: baseBranch, validationSummary, patchEquivalence }
50731
- });
50732
- recordMeshRefineStage(refineStages, "ledger", "passed", ledgerStarted);
50733
- } catch (e) {
50734
- ledgerError = e?.message || String(e);
50735
- recordMeshRefineStage(refineStages, "ledger", "failed", ledgerStarted, { error: ledgerError });
50736
- }
50737
- const finalBranchConvergenceState = {
50738
- branch: baseBranch,
50739
- mergedBranch: branch,
50740
- baseBranch,
50741
- merged: true,
50742
- removed: removeResult?.success !== false,
50743
- validation: "passed",
50744
- patchEquivalence: "passed",
50745
- status: removeResult?.success === false ? "merged_cleanup_failed" : "merged"
50746
- };
50747
- if (removeResult?.success === false) {
50748
- return {
50749
- success: false,
50750
- code: "cleanup_failed",
50751
- error: "Refinery merge completed but worktree cleanup failed; manual cleanup/retry is required.",
50752
- merged: true,
50753
- branch,
50754
- into: baseBranch,
50755
- removeResult,
50756
- validationSummary,
50757
- patchEquivalence,
50758
- mergeResult,
50759
- refineStages,
50760
- ...ledgerError ? { ledgerError } : {},
50761
- finalBranchConvergenceState
50762
- };
50763
- }
50764
- return {
50765
- success: true,
50766
- merged: true,
50767
- branch,
50768
- into: baseBranch,
50769
- removeResult,
50770
- validationSummary,
50771
- patchEquivalence,
50772
- mergeResult,
50773
- refineStages,
50774
- ...ledgerError ? { ledgerError } : {},
50775
- finalBranchConvergenceState
50776
- };
50777
- } catch (e) {
50778
- return { success: false, error: e.message, refineStages };
50779
- }
50911
+ return this.startMeshRefineJob(meshId, nodeId, args);
50780
50912
  }
50781
50913
  case "remove_mesh_node": {
50782
50914
  const meshId = typeof args?.meshId === "string" ? args.meshId.trim() : "";
@@ -100880,7 +101012,7 @@ var init_adhdev_daemon = __esm({
100880
101012
  init_version();
100881
101013
  init_src();
100882
101014
  init_runtime_defaults();
100883
- pkgVersion = resolvePackageVersion({ injectedVersion: "0.9.82-rc.59" });
101015
+ pkgVersion = resolvePackageVersion({ injectedVersion: "0.9.82-rc.60" });
100884
101016
  AdhdevDaemon = class _AdhdevDaemon {
100885
101017
  localHttpServer = null;
100886
101018
  localWss = null;