fix(app): invalidate incompatible replica cache
Todo timeline entries gained required activity metadata in beta.1 while the persisted cache format remained unchanged. Reject version 3 snapshots so upgrades hydrate authoritative state instead of rendering legacy rows.
This commit is contained in:
@@ -272,7 +272,7 @@ describe("ReplicaCache", () => {
|
|||||||
version: number;
|
version: number;
|
||||||
hosts: Array<{ timeline: Record<string, unknown> | null }>;
|
hosts: Array<{ timeline: Record<string, unknown> | null }>;
|
||||||
};
|
};
|
||||||
expect(persisted.version).toBe(3);
|
expect(persisted.version).toBe(4);
|
||||||
expect(Object.keys(persisted.hosts[0]?.timeline ?? {}).sort()).toEqual(["agentId", "items"]);
|
expect(Object.keys(persisted.hosts[0]?.timeline ?? {}).sort()).toEqual(["agentId", "items"]);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -331,12 +331,12 @@ describe("ReplicaCache", () => {
|
|||||||
expect(Object.keys(useSessionStore.getState().sessions).sort()).toEqual(["host-a", "host-c"]);
|
expect(Object.keys(useSessionStore.getState().sessions).sort()).toEqual(["host-a", "host-c"]);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("rejects version 1 cache data and overwrites it on flush", async () => {
|
it("rejects version 3 cache data and overwrites it on flush", async () => {
|
||||||
const storage = new MemoryStorage();
|
const storage = new MemoryStorage();
|
||||||
storage.values.set(
|
storage.values.set(
|
||||||
"@paseo:replica-cache",
|
"@paseo:replica-cache",
|
||||||
JSON.stringify({
|
JSON.stringify({
|
||||||
version: 1,
|
version: 3,
|
||||||
hosts: [
|
hosts: [
|
||||||
{
|
{
|
||||||
serverId: SERVER_ID,
|
serverId: SERVER_ID,
|
||||||
@@ -361,7 +361,7 @@ describe("ReplicaCache", () => {
|
|||||||
|
|
||||||
expect(useSessionStore.getState().sessions[SERVER_ID]).toBeUndefined();
|
expect(useSessionStore.getState().sessions[SERVER_ID]).toBeUndefined();
|
||||||
expect(JSON.parse(storage.values.get("@paseo:replica-cache") ?? "null")).toEqual({
|
expect(JSON.parse(storage.values.get("@paseo:replica-cache") ?? "null")).toEqual({
|
||||||
version: 3,
|
version: 4,
|
||||||
hosts: [],
|
hosts: [],
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ import { isUnreconciledLocalUserMessage, type StreamItem } from "@/types/stream"
|
|||||||
import { normalizeAgentSnapshot } from "@/utils/agent-snapshots";
|
import { normalizeAgentSnapshot } from "@/utils/agent-snapshots";
|
||||||
|
|
||||||
const STORAGE_KEY = "@paseo:replica-cache";
|
const STORAGE_KEY = "@paseo:replica-cache";
|
||||||
const CACHE_VERSION = 3;
|
const CACHE_VERSION = 4;
|
||||||
const PERSIST_DELAY_MS = 750;
|
const PERSIST_DELAY_MS = 750;
|
||||||
const MAX_TIMELINE_ITEMS = 50;
|
const MAX_TIMELINE_ITEMS = 50;
|
||||||
const MAX_CACHE_BYTES = 1024 * 1024;
|
const MAX_CACHE_BYTES = 1024 * 1024;
|
||||||
|
|||||||
Reference in New Issue
Block a user