





























@@ -1,4 +1,9 @@
1+import fs from "node:fs/promises";
2+import path from "node:path";
13import { afterEach, describe, expect, it, vi } from "vitest";
4+import { clearConfigCache, clearRuntimeConfigSnapshot } from "../config/config.js";
5+import { makeTempWorkspace } from "../test-helpers/workspace.js";
6+import { captureEnv } from "../test-utils/env.js";
27import type { GatewayService } from "./service.js";
38import {
49describeGatewayServiceRestart,
@@ -49,6 +54,44 @@ describe("resolveGatewayService", () => {
4954expect(() => resolveGatewayService()).toThrow("Gateway service install not supported on aix");
5055});
515657+it("guards mutating service adapters when config was written by a newer OpenClaw", async () => {
58+const tempHome = await makeTempWorkspace("openclaw-service-future-config-");
59+const stateDir = path.join(tempHome, ".openclaw");
60+const configPath = path.join(stateDir, "openclaw.json");
61+const envSnapshot = captureEnv(["HOME", "OPENCLAW_STATE_DIR", "OPENCLAW_CONFIG_PATH"]);
62+try {
63+await fs.mkdir(stateDir, { recursive: true });
64+await fs.writeFile(
65+configPath,
66+JSON.stringify(
67+{
68+meta: {
69+lastTouchedVersion: "9999.1.1",
70+},
71+},
72+null,
73+2,
74+),
75+);
76+process.env.HOME = tempHome;
77+process.env.OPENCLAW_STATE_DIR = stateDir;
78+process.env.OPENCLAW_CONFIG_PATH = configPath;
79+clearConfigCache();
80+clearRuntimeConfigSnapshot();
81+82+const service = resolveGatewayService();
83+84+await expect(service.restart({ env: process.env, stdout: process.stdout })).rejects.toThrow(
85+"Refusing to restart the gateway service",
86+);
87+} finally {
88+envSnapshot.restore();
89+clearConfigCache();
90+clearRuntimeConfigSnapshot();
91+await fs.rm(tempHome, { recursive: true, force: true });
92+}
93+});
94+5295it("describes scheduled restart handoffs consistently", () => {
5396expect(describeGatewayServiceRestart("Gateway", { outcome: "scheduled" })).toEqual({
5497scheduled: true,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。