fix: dispatch automation exit from final command

This commit is contained in:
codex
2026-08-03 17:07:40 +03:00
parent e7765cbdda
commit ef615a1f8e
2 changed files with 11 additions and 4 deletions
@@ -234,8 +234,8 @@ internal sealed class FirstLimitedApplyAutomationCoordinator
transitions.Add("CommandCompleted:" + name); transitions.Add("CommandCompleted:" + name);
if (step++ == 0) { after1 = Dbmod(); counts1 = Counts(); Queue("PXP-OA"); return; } if (step++ == 0) { after1 = Dbmod(); counts1 = Counts(); Queue("PXP-OA"); return; }
if (step == 2 && string.Equals(config?.Phase, "Apply", StringComparison.OrdinalIgnoreCase)) { after2 = Dbmod(); counts2 = Counts(); Queue("_.UNDO _1"); return; } if (step == 2 && string.Equals(config?.Phase, "Apply", StringComparison.OrdinalIgnoreCase)) { after2 = Dbmod(); counts2 = Counts(); Queue("_.UNDO _1"); return; }
if (string.Equals(config?.Phase, "Apply", StringComparison.OrdinalIgnoreCase)) { afterUndo = Dbmod(); countsUndo = Counts(); Complete(true, null); } if (string.Equals(config?.Phase, "Apply", StringComparison.OrdinalIgnoreCase)) { afterUndo = Dbmod(); countsUndo = Counts(); Complete(true, null, safeToExitNow: true); }
else { after2 = Dbmod(); counts2 = Counts(); Complete(true, null); } else { after2 = Dbmod(); counts2 = Counts(); Complete(true, null, safeToExitNow: true); }
}); });
} }
private void OnCommandFailed(object sender, CommandEventArgs e) => RunCallback("CommandFailed", () => Complete(false, "AUTOMATION_COMMAND_FAILED:" + e.GlobalCommandName)); private void OnCommandFailed(object sender, CommandEventArgs e) => RunCallback("CommandFailed", () => Complete(false, "AUTOMATION_COMMAND_FAILED:" + e.GlobalCommandName));
@@ -274,7 +274,7 @@ internal sealed class FirstLimitedApplyAutomationCoordinator
throw new InvalidOperationException("AUTOMATION_FIXTURE_OUTSIDE_MARKER_ROOT"); throw new InvalidOperationException("AUTOMATION_FIXTURE_OUTSIDE_MARKER_ROOT");
return loaded; return loaded;
} }
private void Complete(bool success, string? error) private void Complete(bool success, string? error, bool safeToExitNow = false)
{ {
if (IsTerminal) return; if (IsTerminal) return;
Transition(success ? CoordinatorState.Completed : CoordinatorState.Failed, success ? "Completed" : "Failed"); Transition(success ? CoordinatorState.Completed : CoordinatorState.Failed, success ? "Completed" : "Failed");
@@ -282,7 +282,7 @@ internal sealed class FirstLimitedApplyAutomationCoordinator
TryWriteEvidence(success, error); TryWriteEvidence(success, error);
selectedTargetSnapshotId = null; selectedTargetSnapshotId = null;
pxpResults.Clear(); pxpResults.Clear();
RequestControlledExit(); RequestControlledExit(safeToExitNow);
} }
// AutoCAD's direct Application.Quit can leave a startup-script host alive. // AutoCAD's direct Application.Quit can leave a startup-script host alive.
@@ -146,6 +146,13 @@ public sealed class FoundationTests
Assert.Contains("MdiActiveDocument", controlledExit); Assert.Contains("MdiActiveDocument", controlledExit);
} }
[Fact] public void FinalCommandCompletion_UsesItsQuiescentExitBoundary()
{
var source = File.ReadAllText(Path.Combine(ProjectRoot, "src", "PRecAnnot.Plant3D2026", "FirstLimitedApplyAutomation.cs"));
Assert.Contains("Complete(true, null, safeToExitNow: true)", source);
Assert.Contains("RequestControlledExit(safeToExitNow);", source);
}
[Fact] public void PrimaryCommand_IsRegistered() => Assert.Contains("[CommandMethod(\"PHP_REC_ANNOT\")]", File.ReadAllText(Path.Combine(ProjectRoot, "src", "PRecAnnot.Plant3D2026", "EntryPoint.cs"))); [Fact] public void PrimaryCommand_IsRegistered() => Assert.Contains("[CommandMethod(\"PHP_REC_ANNOT\")]", File.ReadAllText(Path.Combine(ProjectRoot, "src", "PRecAnnot.Plant3D2026", "EntryPoint.cs")));
[Fact] public void LegacyAliases_AreRegistered() => Assert.True(File.ReadAllText(Path.Combine(ProjectRoot, "src", "PRecAnnot.Plant3D2026", "EntryPoint.cs")).Contains("PXP-AAV") && File.ReadAllText(Path.Combine(ProjectRoot, "src", "PRecAnnot.Plant3D2026", "EntryPoint.cs")).Contains("PXP-OA")); [Fact] public void LegacyAliases_AreRegistered() => Assert.True(File.ReadAllText(Path.Combine(ProjectRoot, "src", "PRecAnnot.Plant3D2026", "EntryPoint.cs")).Contains("PXP-AAV") && File.ReadAllText(Path.Combine(ProjectRoot, "src", "PRecAnnot.Plant3D2026", "EntryPoint.cs")).Contains("PXP-OA"));
[Fact] public void RibbonCommand_ReferencesRegisteredCommand() => Assert.Contains("PHP_REC_ANNOT ", File.ReadAllText(Path.Combine(ProjectRoot, "src", "PRecAnnot.Plant3D2026", "EntryPoint.cs"))); [Fact] public void RibbonCommand_ReferencesRegisteredCommand() => Assert.Contains("PHP_REC_ANNOT ", File.ReadAllText(Path.Combine(ProjectRoot, "src", "PRecAnnot.Plant3D2026", "EntryPoint.cs")));