Update workspace model ownership flows

This commit is contained in:
Mohamed Boudra
2026-06-15 22:02:18 +07:00
parent af0437e6df
commit a4d4d42873
23 changed files with 1100 additions and 154 deletions
@@ -4,6 +4,7 @@ import {
RecentProviderSessionDescriptorPayloadSchema,
SessionInboundMessageSchema,
SessionOutboundMessageSchema,
WorkspaceCreateRequestSchema,
WorkspaceDescriptorPayloadSchema,
WorkspaceScriptPayloadSchema,
} from "./messages.js";
@@ -866,4 +867,42 @@ describe("workspace message schemas", () => {
const checkout = result.data.payload.entries[0]?.project.checkout;
expect(checkout?.worktreeRoot).toBe("C:\\repo");
});
test("workspace.create.request rejects old flat backing shape and accepts new source envelope", () => {
// Old flat shape with backing enum must be rejected.
const oldFlat = WorkspaceCreateRequestSchema.safeParse({
type: "workspace.create.request",
requestId: "req-old",
backing: "worktree",
cwd: "/tmp/repo",
branch: "feat/my-feature",
});
expect(oldFlat.success).toBe(false);
// New envelope shape with source discriminated union must be accepted.
const newWorktree = WorkspaceCreateRequestSchema.parse({
type: "workspace.create.request",
requestId: "req-worktree",
source: {
kind: "worktree",
cwd: "/tmp/repo",
action: "checkout",
refName: "feat/my-feature",
},
});
expect(newWorktree.type).toBe("workspace.create.request");
expect(newWorktree.source.kind).toBe("worktree");
// Directory source must also be accepted.
const newDirectory = WorkspaceCreateRequestSchema.parse({
type: "workspace.create.request",
requestId: "req-dir",
source: {
kind: "directory",
path: "/tmp/repo",
},
});
expect(newDirectory.type).toBe("workspace.create.request");
expect(newDirectory.source.kind).toBe("directory");
});
});