fix(app): retain workspace pull request status across reloads

This commit is contained in:
Mohamed Boudra
2026-08-18 00:32:03 +02:00
parent 2538dd1e7b
commit 405c6e07a9
3 changed files with 65 additions and 2 deletions
@@ -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);
@@ -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,
};
}
+1 -1
View File
@@ -3514,7 +3514,7 @@ const WorkspaceGitRuntimePayloadSchema = z
.optional()
.nullable();
const WorkspaceGitHubRuntimePayloadSchema = z
export const WorkspaceGitHubRuntimePayloadSchema = z
.object({
featuresEnabled: z.boolean().optional(),
pullRequest: z