diff --git a/src/infra/device-identity.state-dir.test.ts b/src/infra/device-identity.state-dir.test.ts index 71281344819..785fa343ec0 100644 --- a/src/infra/device-identity.state-dir.test.ts +++ b/src/infra/device-identity.state-dir.test.ts @@ -13,4 +13,40 @@ describe("device identity state dir defaults", () => { expect(raw.deviceId).toBe(identity.deviceId); }); }); + + it("reuses the stored identity on subsequent loads", async () => { + await withStateDirEnv("openclaw-identity-state-", async ({ stateDir }) => { + const first = loadOrCreateDeviceIdentity(); + const second = loadOrCreateDeviceIdentity(); + const identityPath = path.join(stateDir, "identity", "device.json"); + const raw = JSON.parse(await fs.readFile(identityPath, "utf8")) as { + deviceId?: string; + publicKeyPem?: string; + }; + + expect(second).toEqual(first); + expect(raw.deviceId).toBe(first.deviceId); + expect(raw.publicKeyPem).toBe(first.publicKeyPem); + }); + }); + + it("repairs stored device IDs that no longer match the public key", async () => { + await withStateDirEnv("openclaw-identity-state-", async ({ stateDir }) => { + const original = loadOrCreateDeviceIdentity(); + const identityPath = path.join(stateDir, "identity", "device.json"); + const raw = JSON.parse(await fs.readFile(identityPath, "utf8")) as Record; + + await fs.writeFile( + identityPath, + `${JSON.stringify({ ...raw, deviceId: "stale-device-id" }, null, 2)}\n`, + "utf8", + ); + + const repaired = loadOrCreateDeviceIdentity(); + const stored = JSON.parse(await fs.readFile(identityPath, "utf8")) as { deviceId?: string }; + + expect(repaired.deviceId).toBe(original.deviceId); + expect(stored.deviceId).toBe(original.deviceId); + }); + }); });