@adhdev/daemon-core 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/index.mjs CHANGED
@@ -26002,6 +26002,10 @@ var DaemonCommandRouter = class {
26002
26002
  inlineMeshCache = /* @__PURE__ */ new Map();
26003
26003
  /** Coordinator-owned whole-mesh aggregate status snapshots. Browser callers read this by default. */
26004
26004
  aggregateMeshStatusCache = /* @__PURE__ */ new Map();
26005
+ /** In-memory async Refinery jobs keyed by meshId:nodeId to reject/return duplicate in-flight requests. */
26006
+ runningRefineJobs = /* @__PURE__ */ new Map();
26007
+ /** Terminal async Refinery jobs preserve a clear answer after the worktree node has been removed. */
26008
+ terminalRefineJobs = /* @__PURE__ */ new Map();
26005
26009
  constructor(deps) {
26006
26010
  this.deps = deps;
26007
26011
  }
@@ -26631,6 +26635,340 @@ var DaemonCommandRouter = class {
26631
26635
  throw e;
26632
26636
  }
26633
26637
  }
26638
+ buildRefineJobKey(meshId, nodeId) {
26639
+ return `${meshId}:${nodeId}`;
26640
+ }
26641
+ buildRefineJobHandle(args) {
26642
+ return {
26643
+ success: true,
26644
+ async: true,
26645
+ status: args.status || "accepted",
26646
+ jobId: args.jobId || `refine_${createInteractionId()}`,
26647
+ interactionId: args.interactionId || createInteractionId(),
26648
+ meshId: args.meshId,
26649
+ nodeId: args.nodeId,
26650
+ targetNodeId: args.nodeId,
26651
+ targetDaemonId: readStringValue(args.node?.daemonId),
26652
+ workspace: readStringValue(args.node?.workspace),
26653
+ startedAt: args.startedAt || (/* @__PURE__ */ new Date()).toISOString(),
26654
+ ...args.completedAt ? { completedAt: args.completedAt } : {},
26655
+ eventDelivery: { pendingEvents: true, ledger: true },
26656
+ evidence: {
26657
+ pendingEventsCommand: "get_pending_mesh_events",
26658
+ ledgerCommand: "get_mesh_ledger_slice",
26659
+ taskHistoryKind: args.status === "completed" ? "task_completed" : args.status === "failed" ? "task_failed" : "task_dispatched"
26660
+ }
26661
+ };
26662
+ }
26663
+ queueRefineJobEvent(event, handle, result) {
26664
+ queuePendingMeshCoordinatorEvent({
26665
+ event,
26666
+ meshId: handle.meshId,
26667
+ nodeLabel: handle.targetNodeId,
26668
+ nodeId: handle.targetNodeId,
26669
+ workspace: handle.workspace,
26670
+ metadataEvent: {
26671
+ source: "refine_mesh_node_async_job",
26672
+ jobId: handle.jobId,
26673
+ interactionId: handle.interactionId,
26674
+ meshId: handle.meshId,
26675
+ nodeId: handle.targetNodeId,
26676
+ targetDaemonId: handle.targetDaemonId,
26677
+ workspace: handle.workspace,
26678
+ status: handle.status,
26679
+ startedAt: handle.startedAt,
26680
+ completedAt: handle.completedAt,
26681
+ ...result ? { result } : {}
26682
+ },
26683
+ queuedAt: Date.now()
26684
+ });
26685
+ }
26686
+ async appendRefineJobLedger(kind, handle, result) {
26687
+ try {
26688
+ const { appendLedgerEntry: appendLedgerEntry2 } = await Promise.resolve().then(() => (init_mesh_ledger(), mesh_ledger_exports));
26689
+ appendLedgerEntry2(handle.meshId, {
26690
+ kind,
26691
+ nodeId: handle.targetNodeId,
26692
+ payload: {
26693
+ source: "refine_mesh_node_async_job",
26694
+ refineJob: {
26695
+ jobId: handle.jobId,
26696
+ interactionId: handle.interactionId,
26697
+ status: handle.status,
26698
+ meshId: handle.meshId,
26699
+ nodeId: handle.targetNodeId,
26700
+ targetDaemonId: handle.targetDaemonId,
26701
+ workspace: handle.workspace,
26702
+ startedAt: handle.startedAt,
26703
+ completedAt: handle.completedAt
26704
+ },
26705
+ async: true,
26706
+ ...result ? {
26707
+ success: result.success === true,
26708
+ result,
26709
+ finalBranchConvergenceState: result.finalBranchConvergenceState
26710
+ } : {}
26711
+ }
26712
+ });
26713
+ } catch (e) {
26714
+ LOG.warn("Mesh", `[Refinery] Failed to append async refine ledger entry: ${e?.message || e}`);
26715
+ }
26716
+ }
26717
+ async executeMeshRefineNodeSynchronously(meshId, nodeId, args) {
26718
+ const refineStages = [];
26719
+ try {
26720
+ const meshRecord = await this.getMeshForCommand(meshId, args?.inlineMesh);
26721
+ const mesh = meshRecord?.mesh;
26722
+ const node = mesh?.nodes?.find((n) => n.id === nodeId || n.nodeId === nodeId);
26723
+ if (!node) return { success: false, error: `Node '${nodeId}' not found in mesh`, refineStages };
26724
+ if (!node.isLocalWorktree || !node.workspace) {
26725
+ return { success: false, error: `Refinery requires a local worktree node`, refineStages };
26726
+ }
26727
+ const sourceNode = node.clonedFromNodeId ? mesh?.nodes.find((n) => n.id === node.clonedFromNodeId || n.nodeId === node.clonedFromNodeId) : mesh?.nodes.find((n) => !n.isLocalWorktree);
26728
+ const repoRoot = sourceNode?.repoRoot || sourceNode?.workspace;
26729
+ if (!repoRoot) return { success: false, error: "Source node repoRoot not found", refineStages };
26730
+ const { execFile: execFile3 } = await import("child_process");
26731
+ const { promisify: promisify3 } = await import("util");
26732
+ const execFileAsync3 = promisify3(execFile3);
26733
+ const resolveStarted = Date.now();
26734
+ const { stdout: branchStdout } = await execFileAsync3("git", ["branch", "--show-current"], { cwd: node.workspace, encoding: "utf8" });
26735
+ const branch = branchStdout.trim();
26736
+ if (!branch) return { success: false, error: "Could not determine branch of the worktree node", refineStages };
26737
+ const { stdout: baseBranchStdout } = await execFileAsync3("git", ["branch", "--show-current"], { cwd: repoRoot, encoding: "utf8" });
26738
+ const baseBranch = baseBranchStdout.trim();
26739
+ const { stdout: baseHeadStdout } = await execFileAsync3("git", ["rev-parse", "HEAD"], { cwd: repoRoot, encoding: "utf8" });
26740
+ const { stdout: branchHeadStdout } = await execFileAsync3("git", ["rev-parse", branch], { cwd: node.workspace, encoding: "utf8" });
26741
+ const baseHead = baseHeadStdout.trim();
26742
+ const branchHead = branchHeadStdout.trim();
26743
+ recordMeshRefineStage(refineStages, "resolve_refs", "passed", resolveStarted, { branch, baseBranch, baseHead, branchHead });
26744
+ const validationStarted = Date.now();
26745
+ const validationSummary = await runMeshRefineValidationGate(mesh, node.workspace);
26746
+ recordMeshRefineStage(
26747
+ refineStages,
26748
+ "validation",
26749
+ validationSummary.status === "passed" ? "passed" : validationSummary.status === "failed" ? "failed" : "skipped",
26750
+ validationStarted,
26751
+ { validationStatus: validationSummary.status, commandsRun: validationSummary.commandsRun.length }
26752
+ );
26753
+ if (validationSummary.status === "failed") {
26754
+ return {
26755
+ success: false,
26756
+ code: "validation_failed",
26757
+ convergenceStatus: "blocked_review",
26758
+ error: "Refinery validation gate failed; merge/refine was not attempted.",
26759
+ branch,
26760
+ into: baseBranch,
26761
+ validationSummary,
26762
+ refineStages,
26763
+ finalBranchConvergenceState: {
26764
+ branch,
26765
+ baseBranch,
26766
+ merged: false,
26767
+ removed: false,
26768
+ validation: "failed",
26769
+ status: "blocked_review"
26770
+ }
26771
+ };
26772
+ }
26773
+ if (validationSummary.status === "skipped") {
26774
+ return {
26775
+ success: false,
26776
+ code: "validation_unavailable",
26777
+ convergenceStatus: "blocked_review",
26778
+ error: "Refinery validation gate is required but no allowlisted validation command was available; merge/refine was not attempted.",
26779
+ branch,
26780
+ into: baseBranch,
26781
+ validationSummary,
26782
+ refineStages,
26783
+ finalBranchConvergenceState: {
26784
+ branch,
26785
+ baseBranch,
26786
+ merged: false,
26787
+ removed: false,
26788
+ validation: "unavailable",
26789
+ status: "blocked_review"
26790
+ }
26791
+ };
26792
+ }
26793
+ const patchEquivalenceStarted = Date.now();
26794
+ const patchEquivalence = await runMeshRefinePatchEquivalenceGate(repoRoot, baseHead, branchHead);
26795
+ recordMeshRefineStage(refineStages, "patch_equivalence", patchEquivalence.status, patchEquivalenceStarted, {
26796
+ equivalent: patchEquivalence.equivalent,
26797
+ expectedPatchId: patchEquivalence.expectedPatchId,
26798
+ actualPatchId: patchEquivalence.actualPatchId,
26799
+ error: patchEquivalence.error
26800
+ });
26801
+ if (!patchEquivalence.equivalent) {
26802
+ return {
26803
+ success: false,
26804
+ code: "patch_equivalence_failed",
26805
+ convergenceStatus: "blocked_review",
26806
+ error: "Refinery patch-equivalence preflight failed; merge/refine was not attempted.",
26807
+ branch,
26808
+ into: baseBranch,
26809
+ validationSummary,
26810
+ patchEquivalence,
26811
+ refineStages,
26812
+ finalBranchConvergenceState: {
26813
+ branch,
26814
+ baseBranch,
26815
+ merged: false,
26816
+ removed: false,
26817
+ validation: "passed",
26818
+ patchEquivalence: "failed",
26819
+ status: "blocked_review"
26820
+ }
26821
+ };
26822
+ }
26823
+ let mergeResult;
26824
+ const mergeStarted = Date.now();
26825
+ try {
26826
+ const result = await execFileAsync3("git", ["merge", "--no-ff", branch, "-m", `Auto-merge branch '${branch}' via Refinery`], { cwd: repoRoot, encoding: "utf8" });
26827
+ mergeResult = {
26828
+ stdout: truncateValidationOutput(result.stdout),
26829
+ stderr: truncateValidationOutput(result.stderr),
26830
+ durationMs: Date.now() - mergeStarted
26831
+ };
26832
+ recordMeshRefineStage(refineStages, "merge", "passed", mergeStarted, mergeResult);
26833
+ } catch (e) {
26834
+ recordMeshRefineStage(refineStages, "merge", "failed", mergeStarted, {
26835
+ error: e?.message || String(e),
26836
+ stdout: truncateValidationOutput(e?.stdout),
26837
+ stderr: truncateValidationOutput(e?.stderr)
26838
+ });
26839
+ return {
26840
+ success: false,
26841
+ error: `Merge failed (conflicts?): ${e.message}`,
26842
+ validationSummary,
26843
+ patchEquivalence,
26844
+ refineStages,
26845
+ finalBranchConvergenceState: {
26846
+ branch,
26847
+ baseBranch,
26848
+ merged: false,
26849
+ removed: false,
26850
+ validation: "passed",
26851
+ patchEquivalence: "passed",
26852
+ status: "not_mergeable"
26853
+ }
26854
+ };
26855
+ }
26856
+ const cleanupStarted = Date.now();
26857
+ const removeResult = await this.execute("remove_mesh_node", {
26858
+ meshId,
26859
+ nodeId,
26860
+ sessionCleanupMode: "preserve",
26861
+ inlineMesh: args?.inlineMesh
26862
+ });
26863
+ recordMeshRefineStage(refineStages, "cleanup", removeResult?.success === false ? "failed" : "passed", cleanupStarted, {
26864
+ removed: removeResult?.removed,
26865
+ code: removeResult?.code,
26866
+ error: removeResult?.error
26867
+ });
26868
+ let ledgerError;
26869
+ const ledgerStarted = Date.now();
26870
+ try {
26871
+ const { appendLedgerEntry: appendLedgerEntry2 } = await Promise.resolve().then(() => (init_mesh_ledger(), mesh_ledger_exports));
26872
+ appendLedgerEntry2(meshId, {
26873
+ kind: "node_removed",
26874
+ nodeId,
26875
+ payload: { refined: true, mergedBranch: branch, into: baseBranch, validationSummary, patchEquivalence }
26876
+ });
26877
+ recordMeshRefineStage(refineStages, "ledger", "passed", ledgerStarted);
26878
+ } catch (e) {
26879
+ ledgerError = e?.message || String(e);
26880
+ recordMeshRefineStage(refineStages, "ledger", "failed", ledgerStarted, { error: ledgerError });
26881
+ }
26882
+ const finalBranchConvergenceState = {
26883
+ branch: baseBranch,
26884
+ mergedBranch: branch,
26885
+ baseBranch,
26886
+ merged: true,
26887
+ removed: removeResult?.success !== false,
26888
+ validation: "passed",
26889
+ patchEquivalence: "passed",
26890
+ status: removeResult?.success === false ? "merged_cleanup_failed" : "merged"
26891
+ };
26892
+ if (removeResult?.success === false) {
26893
+ return {
26894
+ success: false,
26895
+ code: "cleanup_failed",
26896
+ error: "Refinery merge completed but worktree cleanup failed; manual cleanup/retry is required.",
26897
+ merged: true,
26898
+ branch,
26899
+ into: baseBranch,
26900
+ removeResult,
26901
+ validationSummary,
26902
+ patchEquivalence,
26903
+ mergeResult,
26904
+ refineStages,
26905
+ ...ledgerError ? { ledgerError } : {},
26906
+ finalBranchConvergenceState
26907
+ };
26908
+ }
26909
+ return {
26910
+ success: true,
26911
+ merged: true,
26912
+ branch,
26913
+ into: baseBranch,
26914
+ removeResult,
26915
+ validationSummary,
26916
+ patchEquivalence,
26917
+ mergeResult,
26918
+ refineStages,
26919
+ ...ledgerError ? { ledgerError } : {},
26920
+ finalBranchConvergenceState
26921
+ };
26922
+ } catch (e) {
26923
+ return { success: false, error: e.message, refineStages };
26924
+ }
26925
+ }
26926
+ async finishMeshRefineJob(handle, args) {
26927
+ const key = this.buildRefineJobKey(handle.meshId, handle.targetNodeId);
26928
+ let result;
26929
+ try {
26930
+ result = await this.executeMeshRefineNodeSynchronously(handle.meshId, handle.targetNodeId, args);
26931
+ } catch (e) {
26932
+ result = { success: false, error: e?.message || String(e) };
26933
+ }
26934
+ const completedAt = (/* @__PURE__ */ new Date()).toISOString();
26935
+ const terminalHandle = this.buildRefineJobHandle({
26936
+ meshId: handle.meshId,
26937
+ nodeId: handle.targetNodeId,
26938
+ status: result.success === true ? "completed" : "failed",
26939
+ startedAt: handle.startedAt,
26940
+ completedAt,
26941
+ jobId: handle.jobId,
26942
+ interactionId: handle.interactionId,
26943
+ node: { daemonId: handle.targetDaemonId, workspace: handle.workspace }
26944
+ });
26945
+ const terminal = { ...terminalHandle, result };
26946
+ this.terminalRefineJobs.set(key, terminal);
26947
+ this.runningRefineJobs.delete(key);
26948
+ this.invalidateAggregateMeshStatus(handle.meshId);
26949
+ await this.appendRefineJobLedger(result.success === true ? "task_completed" : "task_failed", terminalHandle, result);
26950
+ this.queueRefineJobEvent(result.success === true ? "refine:completed" : "refine:failed", terminalHandle, result);
26951
+ }
26952
+ async startMeshRefineJob(meshId, nodeId, args) {
26953
+ const key = this.buildRefineJobKey(meshId, nodeId);
26954
+ const running = this.runningRefineJobs.get(key);
26955
+ if (running) return { ...running, duplicate: true };
26956
+ const terminal = this.terminalRefineJobs.get(key);
26957
+ if (terminal) return { ...terminal, duplicate: true };
26958
+ const meshRecord = await this.getMeshForCommand(meshId, args?.inlineMesh);
26959
+ const mesh = meshRecord?.mesh;
26960
+ const node = mesh?.nodes?.find((n) => n.id === nodeId || n.nodeId === nodeId);
26961
+ if (!node) return { success: false, error: `Node '${nodeId}' not found in mesh` };
26962
+ if (!node.isLocalWorktree || !node.workspace) return { success: false, error: `Refinery requires a local worktree node` };
26963
+ const handle = this.buildRefineJobHandle({ meshId, nodeId, node });
26964
+ this.runningRefineJobs.set(key, handle);
26965
+ await this.appendRefineJobLedger("task_dispatched", handle);
26966
+ this.queueRefineJobEvent("refine:accepted", handle);
26967
+ setImmediate(() => {
26968
+ void this.finishMeshRefineJob(handle, args);
26969
+ });
26970
+ return handle;
26971
+ }
26634
26972
  // ─── Daemon-level command core ───────────────────
26635
26973
  /**
26636
26974
  * Daemon-level command execution (IDE start/stop/restart, CLI, detect, logs).
@@ -27716,213 +28054,7 @@ var DaemonCommandRouter = class {
27716
28054
  const meshId = typeof args?.meshId === "string" ? args.meshId.trim() : "";
27717
28055
  const nodeId = typeof args?.nodeId === "string" ? args.nodeId.trim() : "";
27718
28056
  if (!meshId || !nodeId) return { success: false, error: "meshId and nodeId required" };
27719
- const refineStages = [];
27720
- try {
27721
- const meshRecord = await this.getMeshForCommand(meshId, args?.inlineMesh);
27722
- const mesh = meshRecord?.mesh;
27723
- const node = mesh?.nodes?.find((n) => n.id === nodeId || n.nodeId === nodeId);
27724
- if (!node) return { success: false, error: `Node '${nodeId}' not found in mesh`, refineStages };
27725
- if (!node.isLocalWorktree || !node.workspace) {
27726
- return { success: false, error: `Refinery requires a local worktree node`, refineStages };
27727
- }
27728
- const sourceNode = node.clonedFromNodeId ? mesh?.nodes.find((n) => n.id === node.clonedFromNodeId || n.nodeId === node.clonedFromNodeId) : mesh?.nodes.find((n) => !n.isLocalWorktree);
27729
- const repoRoot = sourceNode?.repoRoot || sourceNode?.workspace;
27730
- if (!repoRoot) return { success: false, error: "Source node repoRoot not found", refineStages };
27731
- const { execFile: execFile3 } = await import("child_process");
27732
- const { promisify: promisify3 } = await import("util");
27733
- const execFileAsync3 = promisify3(execFile3);
27734
- const resolveStarted = Date.now();
27735
- const { stdout: branchStdout } = await execFileAsync3("git", ["branch", "--show-current"], { cwd: node.workspace, encoding: "utf8" });
27736
- const branch = branchStdout.trim();
27737
- if (!branch) return { success: false, error: "Could not determine branch of the worktree node", refineStages };
27738
- const { stdout: baseBranchStdout } = await execFileAsync3("git", ["branch", "--show-current"], { cwd: repoRoot, encoding: "utf8" });
27739
- const baseBranch = baseBranchStdout.trim();
27740
- const { stdout: baseHeadStdout } = await execFileAsync3("git", ["rev-parse", "HEAD"], { cwd: repoRoot, encoding: "utf8" });
27741
- const { stdout: branchHeadStdout } = await execFileAsync3("git", ["rev-parse", branch], { cwd: node.workspace, encoding: "utf8" });
27742
- const baseHead = baseHeadStdout.trim();
27743
- const branchHead = branchHeadStdout.trim();
27744
- recordMeshRefineStage(refineStages, "resolve_refs", "passed", resolveStarted, { branch, baseBranch, baseHead, branchHead });
27745
- const validationStarted = Date.now();
27746
- const validationSummary = await runMeshRefineValidationGate(mesh, node.workspace);
27747
- recordMeshRefineStage(
27748
- refineStages,
27749
- "validation",
27750
- validationSummary.status === "passed" ? "passed" : validationSummary.status === "failed" ? "failed" : "skipped",
27751
- validationStarted,
27752
- { validationStatus: validationSummary.status, commandsRun: validationSummary.commandsRun.length }
27753
- );
27754
- if (validationSummary.status === "failed") {
27755
- return {
27756
- success: false,
27757
- code: "validation_failed",
27758
- convergenceStatus: "blocked_review",
27759
- error: "Refinery validation gate failed; merge/refine was not attempted.",
27760
- branch,
27761
- into: baseBranch,
27762
- validationSummary,
27763
- refineStages,
27764
- finalBranchConvergenceState: {
27765
- branch,
27766
- baseBranch,
27767
- merged: false,
27768
- removed: false,
27769
- validation: "failed",
27770
- status: "blocked_review"
27771
- }
27772
- };
27773
- }
27774
- if (validationSummary.status === "skipped") {
27775
- return {
27776
- success: false,
27777
- code: "validation_unavailable",
27778
- convergenceStatus: "blocked_review",
27779
- error: "Refinery validation gate is required but no allowlisted validation command was available; merge/refine was not attempted.",
27780
- branch,
27781
- into: baseBranch,
27782
- validationSummary,
27783
- refineStages,
27784
- finalBranchConvergenceState: {
27785
- branch,
27786
- baseBranch,
27787
- merged: false,
27788
- removed: false,
27789
- validation: "unavailable",
27790
- status: "blocked_review"
27791
- }
27792
- };
27793
- }
27794
- const patchEquivalenceStarted = Date.now();
27795
- const patchEquivalence = await runMeshRefinePatchEquivalenceGate(repoRoot, baseHead, branchHead);
27796
- recordMeshRefineStage(refineStages, "patch_equivalence", patchEquivalence.status, patchEquivalenceStarted, {
27797
- equivalent: patchEquivalence.equivalent,
27798
- expectedPatchId: patchEquivalence.expectedPatchId,
27799
- actualPatchId: patchEquivalence.actualPatchId,
27800
- error: patchEquivalence.error
27801
- });
27802
- if (!patchEquivalence.equivalent) {
27803
- return {
27804
- success: false,
27805
- code: "patch_equivalence_failed",
27806
- convergenceStatus: "blocked_review",
27807
- error: "Refinery patch-equivalence preflight failed; merge/refine was not attempted.",
27808
- branch,
27809
- into: baseBranch,
27810
- validationSummary,
27811
- patchEquivalence,
27812
- refineStages,
27813
- finalBranchConvergenceState: {
27814
- branch,
27815
- baseBranch,
27816
- merged: false,
27817
- removed: false,
27818
- validation: "passed",
27819
- patchEquivalence: "failed",
27820
- status: "blocked_review"
27821
- }
27822
- };
27823
- }
27824
- let mergeResult;
27825
- const mergeStarted = Date.now();
27826
- try {
27827
- const result = await execFileAsync3("git", ["merge", "--no-ff", branch, "-m", `Auto-merge branch '${branch}' via Refinery`], { cwd: repoRoot, encoding: "utf8" });
27828
- mergeResult = {
27829
- stdout: truncateValidationOutput(result.stdout),
27830
- stderr: truncateValidationOutput(result.stderr),
27831
- durationMs: Date.now() - mergeStarted
27832
- };
27833
- recordMeshRefineStage(refineStages, "merge", "passed", mergeStarted, mergeResult);
27834
- } catch (e) {
27835
- recordMeshRefineStage(refineStages, "merge", "failed", mergeStarted, {
27836
- error: e?.message || String(e),
27837
- stdout: truncateValidationOutput(e?.stdout),
27838
- stderr: truncateValidationOutput(e?.stderr)
27839
- });
27840
- return {
27841
- success: false,
27842
- error: `Merge failed (conflicts?): ${e.message}`,
27843
- validationSummary,
27844
- patchEquivalence,
27845
- refineStages,
27846
- finalBranchConvergenceState: {
27847
- branch,
27848
- baseBranch,
27849
- merged: false,
27850
- removed: false,
27851
- validation: "passed",
27852
- patchEquivalence: "passed",
27853
- status: "not_mergeable"
27854
- }
27855
- };
27856
- }
27857
- const cleanupStarted = Date.now();
27858
- const removeResult = await this.execute("remove_mesh_node", {
27859
- meshId,
27860
- nodeId,
27861
- sessionCleanupMode: "preserve",
27862
- inlineMesh: args?.inlineMesh
27863
- });
27864
- recordMeshRefineStage(refineStages, "cleanup", removeResult?.success === false ? "failed" : "passed", cleanupStarted, {
27865
- removed: removeResult?.removed,
27866
- code: removeResult?.code,
27867
- error: removeResult?.error
27868
- });
27869
- let ledgerError;
27870
- const ledgerStarted = Date.now();
27871
- try {
27872
- const { appendLedgerEntry: appendLedgerEntry2 } = await Promise.resolve().then(() => (init_mesh_ledger(), mesh_ledger_exports));
27873
- appendLedgerEntry2(meshId, {
27874
- kind: "node_removed",
27875
- nodeId,
27876
- payload: { refined: true, mergedBranch: branch, into: baseBranch, validationSummary, patchEquivalence }
27877
- });
27878
- recordMeshRefineStage(refineStages, "ledger", "passed", ledgerStarted);
27879
- } catch (e) {
27880
- ledgerError = e?.message || String(e);
27881
- recordMeshRefineStage(refineStages, "ledger", "failed", ledgerStarted, { error: ledgerError });
27882
- }
27883
- const finalBranchConvergenceState = {
27884
- branch: baseBranch,
27885
- mergedBranch: branch,
27886
- baseBranch,
27887
- merged: true,
27888
- removed: removeResult?.success !== false,
27889
- validation: "passed",
27890
- patchEquivalence: "passed",
27891
- status: removeResult?.success === false ? "merged_cleanup_failed" : "merged"
27892
- };
27893
- if (removeResult?.success === false) {
27894
- return {
27895
- success: false,
27896
- code: "cleanup_failed",
27897
- error: "Refinery merge completed but worktree cleanup failed; manual cleanup/retry is required.",
27898
- merged: true,
27899
- branch,
27900
- into: baseBranch,
27901
- removeResult,
27902
- validationSummary,
27903
- patchEquivalence,
27904
- mergeResult,
27905
- refineStages,
27906
- ...ledgerError ? { ledgerError } : {},
27907
- finalBranchConvergenceState
27908
- };
27909
- }
27910
- return {
27911
- success: true,
27912
- merged: true,
27913
- branch,
27914
- into: baseBranch,
27915
- removeResult,
27916
- validationSummary,
27917
- patchEquivalence,
27918
- mergeResult,
27919
- refineStages,
27920
- ...ledgerError ? { ledgerError } : {},
27921
- finalBranchConvergenceState
27922
- };
27923
- } catch (e) {
27924
- return { success: false, error: e.message, refineStages };
27925
- }
28057
+ return this.startMeshRefineJob(meshId, nodeId, args);
27926
28058
  }
27927
28059
  case "remove_mesh_node": {
27928
28060
  const meshId = typeof args?.meshId === "string" ? args.meshId.trim() : "";