Просмотр исходного кода

feat: add WorkspaceTaskVisibility type for organization cloud settings (#10020)

* feat: add WorkspaceTaskVisibility type and workspaceTaskVisibility property to OrganizationCloudSettings

* refactor: create workspaceTaskVisibilitySchema and derive WorkspaceTaskVisibility type from it

---------

Co-authored-by: Roo Code <[email protected]>
roomote[bot] 2 недель назад
Родитель
Сommit
8da4d3d8d8
2 измененных файлов с 93 добавлено и 0 удалено
  1. 84 0
      packages/types/src/__tests__/cloud.test.ts
  2. 9 0
      packages/types/src/cloud.ts

+ 84 - 0
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")
+	})
+})

+ 9 - 0
packages/types/src/cloud.ts

@@ -120,6 +120,14 @@ export const organizationDefaultSettingsSchema = globalSettingsSchema
 
 export type OrganizationDefaultSettings = z.infer<typeof organizationDefaultSettingsSchema>
 
+/**
+ * WorkspaceTaskVisibility
+ */
+
+const workspaceTaskVisibilitySchema = z.enum(["all", "list-only", "full-lockdown"])
+
+export type WorkspaceTaskVisibility = z.infer<typeof workspaceTaskVisibilitySchema>
+
 /**
  * OrganizationCloudSettings
  */
@@ -129,6 +137,7 @@ export const organizationCloudSettingsSchema = z.object({
 	enableTaskSharing: z.boolean().optional(),
 	taskShareExpirationDays: z.number().int().positive().optional(),
 	allowMembersViewAllTasks: z.boolean().optional(),
+	workspaceTaskVisibility: workspaceTaskVisibilitySchema.optional(),
 })
 
 export type OrganizationCloudSettings = z.infer<typeof organizationCloudSettingsSchema>