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 <roomote@roocode.com>
This commit is contained in:
roomote[bot] 2025-12-12 12:45:28 -08:00 committed by GitHub
parent 0f8fac9eb5
commit 8da4d3d8d8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 93 additions and 0 deletions

View file

@ -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")
})
})

View file

@ -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>