From 61d2a37a4f77e160d5b6d3a5689213c8ad0c147f Mon Sep 17 00:00:00 2001 From: Roo Code Date: Thu, 11 Dec 2025 17:57:14 +0000 Subject: [PATCH 1/2] feat: add WorkspaceTaskVisibility type and workspaceTaskVisibility property to OrganizationCloudSettings --- packages/types/src/__tests__/cloud.test.ts | 84 ++++++++++++++++++++++ packages/types/src/cloud.ts | 7 ++ 2 files changed, 91 insertions(+) diff --git a/packages/types/src/__tests__/cloud.test.ts b/packages/types/src/__tests__/cloud.test.ts index 31a942c2d41..c1fdd02a66e 100644 --- a/packages/types/src/__tests__/cloud.test.ts +++ b/packages/types/src/__tests__/cloud.test.ts @@ -1,10 +1,13 @@ // npx vitest run src/__tests__/cloud.test.ts import { + organizationCloudSettingsSchema, organizationFeaturesSchema, organizationSettingsSchema, + type OrganizationCloudSettings, type OrganizationFeatures, type OrganizationSettings, + type WorkspaceTaskVisibility, } from "../cloud.js" describe("organizationFeaturesSchema", () => { @@ -171,3 +174,84 @@ describe("organizationSettingsSchema with features", () => { expect(result.data).toEqual(input) }) }) + +describe("organizationCloudSettingsSchema with workspaceTaskVisibility", () => { + it("should validate without workspaceTaskVisibility property", () => { + const input = { + recordTaskMessages: true, + enableTaskSharing: true, + } + const result = organizationCloudSettingsSchema.safeParse(input) + expect(result.success).toBe(true) + expect(result.data?.workspaceTaskVisibility).toBeUndefined() + }) + + it("should validate with workspaceTaskVisibility as 'all'", () => { + const input = { + recordTaskMessages: true, + workspaceTaskVisibility: "all" as WorkspaceTaskVisibility, + } + const result = organizationCloudSettingsSchema.safeParse(input) + expect(result.success).toBe(true) + expect(result.data?.workspaceTaskVisibility).toBe("all") + }) + + it("should validate with workspaceTaskVisibility as 'list-only'", () => { + const input = { + workspaceTaskVisibility: "list-only" as WorkspaceTaskVisibility, + } + const result = organizationCloudSettingsSchema.safeParse(input) + expect(result.success).toBe(true) + expect(result.data?.workspaceTaskVisibility).toBe("list-only") + }) + + it("should validate with workspaceTaskVisibility as 'full-lockdown'", () => { + const input = { + workspaceTaskVisibility: "full-lockdown" as WorkspaceTaskVisibility, + } + const result = organizationCloudSettingsSchema.safeParse(input) + expect(result.success).toBe(true) + expect(result.data?.workspaceTaskVisibility).toBe("full-lockdown") + }) + + it("should reject invalid workspaceTaskVisibility value", () => { + const input = { + workspaceTaskVisibility: "invalid-value", + } + const result = organizationCloudSettingsSchema.safeParse(input) + expect(result.success).toBe(false) + }) + + it("should have correct TypeScript type", () => { + // Type-only test to ensure TypeScript compilation + const settings: OrganizationCloudSettings = { + recordTaskMessages: true, + workspaceTaskVisibility: "all", + } + expect(settings.workspaceTaskVisibility).toBe("all") + + const settingsWithoutVisibility: OrganizationCloudSettings = { + recordTaskMessages: false, + } + expect(settingsWithoutVisibility.workspaceTaskVisibility).toBeUndefined() + }) + + it("should validate in organizationSettingsSchema with workspaceTaskVisibility", () => { + const input = { + version: 1, + cloudSettings: { + recordTaskMessages: true, + enableTaskSharing: true, + workspaceTaskVisibility: "list-only" as WorkspaceTaskVisibility, + }, + defaultSettings: {}, + allowList: { + allowAll: true, + providers: {}, + }, + } + const result = organizationSettingsSchema.safeParse(input) + expect(result.success).toBe(true) + expect(result.data?.cloudSettings?.workspaceTaskVisibility).toBe("list-only") + }) +}) diff --git a/packages/types/src/cloud.ts b/packages/types/src/cloud.ts index a90d342c35c..4b2b5d0200a 100644 --- a/packages/types/src/cloud.ts +++ b/packages/types/src/cloud.ts @@ -120,6 +120,12 @@ export const organizationDefaultSettingsSchema = globalSettingsSchema export type OrganizationDefaultSettings = z.infer +/** + * WorkspaceTaskVisibility + */ + +export type WorkspaceTaskVisibility = "all" | "list-only" | "full-lockdown" + /** * OrganizationCloudSettings */ @@ -129,6 +135,7 @@ export const organizationCloudSettingsSchema = z.object({ enableTaskSharing: z.boolean().optional(), taskShareExpirationDays: z.number().int().positive().optional(), allowMembersViewAllTasks: z.boolean().optional(), + workspaceTaskVisibility: z.enum(["all", "list-only", "full-lockdown"]).optional(), }) export type OrganizationCloudSettings = z.infer From e0b42462fe56c6c507acfc4968d8e9ee496acb45 Mon Sep 17 00:00:00 2001 From: Roo Code Date: Fri, 12 Dec 2025 20:29:35 +0000 Subject: [PATCH 2/2] refactor: create workspaceTaskVisibilitySchema and derive WorkspaceTaskVisibility type from it --- packages/types/src/cloud.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/types/src/cloud.ts b/packages/types/src/cloud.ts index 4b2b5d0200a..774bac52ef2 100644 --- a/packages/types/src/cloud.ts +++ b/packages/types/src/cloud.ts @@ -124,7 +124,9 @@ export type OrganizationDefaultSettings = z.infer /** * OrganizationCloudSettings @@ -135,7 +137,7 @@ export const organizationCloudSettingsSchema = z.object({ enableTaskSharing: z.boolean().optional(), taskShareExpirationDays: z.number().int().positive().optional(), allowMembersViewAllTasks: z.boolean().optional(), - workspaceTaskVisibility: z.enum(["all", "list-only", "full-lockdown"]).optional(), + workspaceTaskVisibility: workspaceTaskVisibilitySchema.optional(), }) export type OrganizationCloudSettings = z.infer