

























@@ -34,6 +34,7 @@ const mocks = vi.hoisted(() => {
3434},
3535},
3636})),
37+finalizeUpdateRestartSentinelRunningVersion: vi.fn(async () => null),
3738removeRestartSentinelFile: vi.fn(async () => undefined),
3839resolveRestartSentinelPath: vi.fn(() => "/tmp/restart-sentinel.json"),
3940formatRestartSentinelMessage: vi.fn(() => "restart message"),
@@ -173,6 +174,7 @@ vi.mock("../agents/agent-scope.js", async () => {
173174});
174175175176vi.mock("../infra/restart-sentinel.js", () => ({
177+finalizeUpdateRestartSentinelRunningVersion: mocks.finalizeUpdateRestartSentinelRunningVersion,
176178readRestartSentinel: mocks.readRestartSentinel,
177179removeRestartSentinelFile: mocks.removeRestartSentinelFile,
178180resolveRestartSentinelPath: mocks.resolveRestartSentinelPath,
@@ -292,8 +294,11 @@ vi.mock("./server-methods/agent-timestamp.js", () => ({
292294timestampOptsFromConfig: mocks.timestampOptsFromConfig,
293295}));
294296295-const { getLatestUpdateRestartSentinel, scheduleRestartSentinelWake } =
296-await import("./server-restart-sentinel.js");
297+const {
298+ getLatestUpdateRestartSentinel,
299+ refreshLatestUpdateRestartSentinel,
300+ scheduleRestartSentinelWake,
301+} = await import("./server-restart-sentinel.js");
297302298303function expectRecordFields(
299304record: unknown,
@@ -409,6 +414,8 @@ describe("scheduleRestartSentinelWake", () => {
409414mocks.loadPendingSessionDelivery.mockClear();
410415mocks.drainPendingSessionDeliveries.mockClear();
411416mocks.recoverPendingSessionDeliveries.mockClear();
417+mocks.finalizeUpdateRestartSentinelRunningVersion.mockReset();
418+mocks.finalizeUpdateRestartSentinelRunningVersion.mockResolvedValue(null);
412419mocks.removeRestartSentinelFile.mockClear();
413420mocks.injectTimestamp.mockClear();
414421mocks.timestampOptsFromConfig.mockClear();
@@ -1345,6 +1352,28 @@ describe("scheduleRestartSentinelWake", () => {
13451352expect(getLatestUpdateRestartSentinel()).toEqual(payload);
13461353});
134713541355+it("does not rewrite pending update sentinels during status refresh", async () => {
1356+const payload = {
1357+kind: "update",
1358+status: "skipped",
1359+ts: 123,
1360+stats: {
1361+mode: "git",
1362+handoffId: "handoff-1",
1363+reason: "managed-service-handoff-started",
1364+},
1365+} as const;
1366+mocks.readRestartSentinel.mockResolvedValue({
1367+version: 1,
1368+ payload,
1369+});
1370+1371+await expect(refreshLatestUpdateRestartSentinel()).resolves.toEqual(payload);
1372+1373+expect(mocks.finalizeUpdateRestartSentinelRunningVersion).not.toHaveBeenCalled();
1374+expect(getLatestUpdateRestartSentinel()).toEqual(payload);
1375+});
1376+13481377it("does not wake the main session when the sentinel has no sessionKey", async () => {
13491378mocks.readRestartSentinel.mockResolvedValue({
13501379payload: {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。