diff --git a/packages/app/src/runtime/replica-cache/index.test.ts b/packages/app/src/runtime/replica-cache/index.test.ts index a48a49c95..2b85b0149 100644 --- a/packages/app/src/runtime/replica-cache/index.test.ts +++ b/packages/app/src/runtime/replica-cache/index.test.ts @@ -490,6 +490,63 @@ describe("ReplicaCache", () => { }); }); + it("restores workspace change request checks beside the directory cursor", async () => { + const githubRuntime = { + featuresEnabled: true, + pullRequest: { + number: 824, + url: "https://github.com/blank-dot-page/editor/pull/824", + title: "Cut realistic editor typing latency by two thirds", + state: "OPEN", + baseRefName: "main", + headRefName: "perf-editor-typing-latency", + isMerged: false, + checksStatus: "success" as const, + checks: [ + { + name: "Check", + status: "success" as const, + url: "https://github.com/blank-dot-page/editor/actions/runs/824", + }, + ], + }, + error: null, + }; + const storage = new MemoryStorage(); + const writer = new ReplicaCache(storage); + writer.setHosts([SERVER_ID]); + seedSession(); + useSessionStore.getState().setWorkspaces( + SERVER_ID, + new Map([ + [ + "workspace-1", + normalizeWorkspaceDescriptor({ + ...workspace(), + forge: "github", + githubRuntime, + }), + ], + ]), + ); + writer.writeDirectoryCheckpoint(SERVER_ID, { + workspaces: { generation: "daemon-generation", afterSeq: 9 }, + }); + await writer.flush(); + + useSessionStore.getState().clearSession(SERVER_ID); + const reader = new ReplicaCache(storage); + reader.setHosts([SERVER_ID]); + await reader.restore(); + + expect( + useSessionStore.getState().sessions[SERVER_ID]?.workspaces.get("workspace-1")?.githubRuntime, + ).toEqual(githubRuntime); + expect(reader.readDirectoryCheckpoint(SERVER_ID)).toEqual({ + workspaces: { generation: "daemon-generation", afterSeq: 9 }, + }); + }); + it("restores every registered host directory before any host reconnects", async () => { const storage = new MemoryStorage(); const writer = new ReplicaCache(storage); diff --git a/packages/app/src/runtime/replica-cache/index.ts b/packages/app/src/runtime/replica-cache/index.ts index b18514d50..ef075d85f 100644 --- a/packages/app/src/runtime/replica-cache/index.ts +++ b/packages/app/src/runtime/replica-cache/index.ts @@ -1,6 +1,10 @@ import { Buffer } from "buffer"; import { z } from "zod"; -import { AgentStatusSchema, AgentTimelineItemPayloadSchema } from "@getpaseo/protocol/messages"; +import { + AgentStatusSchema, + AgentTimelineItemPayloadSchema, + WorkspaceGitHubRuntimePayloadSchema, +} from "@getpaseo/protocol/messages"; import { AgentProviderSchema } from "@getpaseo/protocol/provider-manifest"; import { normalizeProjectDescriptor, @@ -238,6 +242,7 @@ const StoredWorkspaceSchema = z.strictObject({ diffStat: z.strictObject({ additions: z.number(), deletions: z.number() }).nullable(), scripts: z.array(WorkspaceScriptSchema), gitRuntime: WorkspaceGitRuntimeSchema, + githubRuntime: WorkspaceGitHubRuntimePayloadSchema, forge: z.string().optional(), }); @@ -573,6 +578,7 @@ function serializeWorkspace(workspace: WorkspaceDescriptor): StoredWorkspace { terminalId: script.terminalId, })), gitRuntime: workspace.gitRuntime, + githubRuntime: workspace.githubRuntime, forge: workspace.forge, }; } diff --git a/packages/protocol/src/messages.ts b/packages/protocol/src/messages.ts index 3570dc45e..9505bd277 100644 --- a/packages/protocol/src/messages.ts +++ b/packages/protocol/src/messages.ts @@ -3514,7 +3514,7 @@ const WorkspaceGitRuntimePayloadSchema = z .optional() .nullable(); -const WorkspaceGitHubRuntimePayloadSchema = z +export const WorkspaceGitHubRuntimePayloadSchema = z .object({ featuresEnabled: z.boolean().optional(), pullRequest: z