refactor: transition to opaque workspace identifiers

This commit is contained in:
Mohamed Boudra
2026-04-15 17:59:09 +07:00
parent beeb315c8d
commit e6044264e2
34 changed files with 462 additions and 382 deletions
+7 -7
View File
@@ -739,7 +739,7 @@ export const FetchWorkspacesRequestMessageSchema = z.object({
filter: z
.object({
query: z.string().optional(),
projectId: z.union([z.string(), z.number()]).transform(String).optional(),
projectId: z.string().optional(),
idPrefix: z.string().optional(),
})
.optional(),
@@ -843,7 +843,7 @@ export type GitSetupOptions = z.infer<typeof GitSetupOptionsSchema>;
export const CreateAgentRequestMessageSchema = z.object({
type: z.literal("create_agent_request"),
config: AgentSessionConfigSchema,
workspaceId: z.union([z.string(), z.number()]).transform(String).optional(),
workspaceId: z.string().optional(),
worktreeName: z.string().optional(),
initialPrompt: z.string().optional(),
clientMessageId: z.string().optional(),
@@ -1285,7 +1285,7 @@ export const OpenProjectRequestSchema = z.object({
export const ArchiveWorkspaceRequestSchema = z.object({
type: z.literal("archive_workspace_request"),
workspaceId: z.union([z.string(), z.number()]).transform(String),
workspaceId: z.string(),
requestId: z.string(),
});
@@ -1993,8 +1993,8 @@ const WorkspaceGitHubRuntimePayloadSchema = z
.nullable();
export const WorkspaceDescriptorPayloadSchema = z.object({
id: z.union([z.string(), z.number()]).transform(String),
projectId: z.union([z.string(), z.number()]).transform(String),
id: z.string(),
projectId: z.string(),
projectDisplayName: z.string(),
projectRootPath: z.string(),
workspaceDirectory: z.string(),
@@ -2101,7 +2101,7 @@ export const WorkspaceUpdateMessageSchema = z.object({
}),
z.object({
kind: z.literal("remove"),
id: z.union([z.string(), z.number()]).transform(String),
id: z.string(),
}),
]),
});
@@ -2180,7 +2180,7 @@ export const ArchiveWorkspaceResponseMessageSchema = z.object({
type: z.literal("archive_workspace_response"),
payload: z.object({
requestId: z.string(),
workspaceId: z.union([z.string(), z.number()]).transform(String),
workspaceId: z.string(),
archivedAt: z.string().nullable(),
error: z.string().nullable(),
}),
@@ -9,7 +9,7 @@ describe("workspace message schemas", () => {
requestId: "req-1",
filter: {
query: "repo",
projectId: 12,
projectId: "proj-12",
idPrefix: "/Users/me",
},
sort: [{ key: "activity_at", direction: "desc" }],
@@ -102,8 +102,8 @@ describe("workspace message schemas", () => {
payload: {
kind: "upsert",
workspace: {
id: 1,
projectId: 1,
id: "ws-invalid",
projectId: "proj-invalid",
projectDisplayName: "repo",
projectRootPath: "/repo",
projectKind: "directory",
@@ -125,8 +125,8 @@ describe("workspace message schemas", () => {
payload: {
kind: "upsert",
workspace: {
id: 1,
projectId: 1,
id: "ws-1",
projectId: "proj-1",
projectDisplayName: "repo",
projectRootPath: "/repo",
workspaceDirectory: "/repo",
@@ -200,7 +200,7 @@ describe("workspace message schemas", () => {
const parsed = SessionOutboundMessageSchema.parse({
type: "script_status_update",
payload: {
workspaceId: "/repo",
workspaceId: "ws-repo",
scripts: [
{
scriptName: "web",
@@ -215,7 +215,7 @@ describe("workspace message schemas", () => {
});
expect(parsed.type).toBe("script_status_update");
expect(parsed.payload.workspaceId).toBe("/repo");
expect(parsed.payload.workspaceId).toBe("ws-repo");
expect(parsed.payload.scripts[0]).toMatchObject({
type: "service",
exitCode: null,
@@ -226,7 +226,7 @@ describe("workspace message schemas", () => {
const parsed = SessionOutboundMessageSchema.parse({
type: "workspace_setup_progress",
payload: {
workspaceId: "/repo/.paseo/worktrees/feature-a",
workspaceId: "ws-feature-a",
status: "completed",
detail: {
type: "worktree_setup",
@@ -255,7 +255,7 @@ describe("workspace message schemas", () => {
test("parses workspace_setup_status_request", () => {
const parsed = SessionInboundMessageSchema.parse({
type: "workspace_setup_status_request",
workspaceId: "/repo/.paseo/worktrees/feature-a",
workspaceId: "ws-feature-a",
requestId: "req-status",
});
@@ -267,7 +267,7 @@ describe("workspace message schemas", () => {
type: "workspace_setup_status_response",
payload: {
requestId: "req-status",
workspaceId: "/repo/.paseo/worktrees/feature-a",
workspaceId: "ws-feature-a",
snapshot: {
status: "completed",
detail: {
@@ -292,7 +292,7 @@ describe("workspace message schemas", () => {
requestId: "req-workspaces",
entries: [
{
id: "/tmp/repo",
id: "ws-main",
projectId: "remote:github.com/acme/repo",
projectDisplayName: "acme/repo",
projectRootPath: "/tmp/repo",
@@ -357,7 +357,7 @@ describe("workspace message schemas", () => {
requestId: "req-workspaces",
entries: [
{
id: "/tmp/repo",
id: "ws-main",
projectId: "remote:github.com/acme/repo",
projectDisplayName: "acme/repo",
projectRootPath: "/tmp/repo",
@@ -429,7 +429,7 @@ describe("workspace message schemas", () => {
const parsed = legacyMessageSchema.parse(message);
expect(parsed.payload.entries[0]).toEqual({
id: "/tmp/repo",
id: "ws-main",
projectId: "remote:github.com/acme/repo",
projectDisplayName: "acme/repo",
projectRootPath: "/tmp/repo",