/** * Zod schemas for permission updates. * * This file is intentionally kept minimal with no complex dependencies * so it can be safely imported by src/types/hooks.ts without creating * circular dependencies. */ import z from 'zod/v4' // Types extracted to src/types/permissions.ts to break import cycles import type { PermissionUpdate, PermissionUpdateDestination, } from '../../types/permissions.js' import { lazySchema } from '../lazySchema.js' import { externalPermissionModeSchema } from './PermissionMode.js' import { permissionBehaviorSchema, permissionRuleValueSchema, } from './PermissionRule.js' // Re-export for backwards compatibility export type { PermissionUpdate, PermissionUpdateDestination } /** * PermissionUpdateDestination is where a new permission rule should be saved to. */ export const permissionUpdateDestinationSchema = lazySchema(() => z.enum([ // User settings (global) 'userSettings', // Project settings (shared per-directory) 'projectSettings', // Local settings (gitignored) 'localSettings', // In-memory for the current session only 'session', // From the command line arguments 'cliArg', ]), ) export const permissionUpdateSchema = lazySchema(() => z.discriminatedUnion('type', [ z.object({ type: z.literal('addRules'), rules: z.array(permissionRuleValueSchema()), behavior: permissionBehaviorSchema(), destination: permissionUpdateDestinationSchema(), }), z.object({ type: z.literal('replaceRules'), rules: z.array(permissionRuleValueSchema()), behavior: permissionBehaviorSchema(), destination: permissionUpdateDestinationSchema(), }), z.object({ type: z.literal('removeRules'), rules: z.array(permissionRuleValueSchema()), behavior: permissionBehaviorSchema(), destination: permissionUpdateDestinationSchema(), }), z.object({ type: z.literal('setMode'), mode: externalPermissionModeSchema(), destination: permissionUpdateDestinationSchema(), }), z.object({ type: z.literal('addDirectories'), directories: z.array(z.string()), destination: permissionUpdateDestinationSchema(), }), z.object({ type: z.literal('removeDirectories'), directories: z.array(z.string()), destination: permissionUpdateDestinationSchema(), }), ]), )