import { feature } from 'bun:bundle' import z from 'zod/v4' import { PAUSE_ICON } from '../../constants/figures.js' // Types extracted to src/types/permissions.ts to break import cycles import { EXTERNAL_PERMISSION_MODES, type ExternalPermissionMode, PERMISSION_MODES, type PermissionMode, } from '../../types/permissions.js' import { lazySchema } from '../lazySchema.js' // Re-export for backwards compatibility export { EXTERNAL_PERMISSION_MODES, PERMISSION_MODES, type ExternalPermissionMode, type PermissionMode, } export const permissionModeSchema = lazySchema(() => z.enum(PERMISSION_MODES)) export const externalPermissionModeSchema = lazySchema(() => z.enum(EXTERNAL_PERMISSION_MODES), ) type ModeColorKey = | 'text' | 'planMode' | 'permission' | 'autoAccept' | 'error' | 'warning' type PermissionModeConfig = { title: string shortTitle: string symbol: string color: ModeColorKey external: ExternalPermissionMode } const PERMISSION_MODE_CONFIG: Partial< Record > = { default: { title: 'Default', shortTitle: 'Default', symbol: '', color: 'text', external: 'default', }, plan: { title: 'Plan Mode', shortTitle: 'Plan', symbol: PAUSE_ICON, color: 'planMode', external: 'plan', }, acceptEdits: { title: 'Accept edits', shortTitle: 'Accept', symbol: '⏵⏵', color: 'autoAccept', external: 'acceptEdits', }, bypassPermissions: { title: 'Bypass Permissions', shortTitle: 'Bypass', symbol: '⏵⏵', color: 'error', external: 'bypassPermissions', }, dontAsk: { title: "Don't Ask", shortTitle: 'DontAsk', symbol: '⏵⏵', color: 'error', external: 'dontAsk', }, ...(feature('TRANSCRIPT_CLASSIFIER') ? { auto: { title: 'Auto mode', shortTitle: 'Auto', symbol: '⏵⏵', color: 'warning' as ModeColorKey, external: 'default' as ExternalPermissionMode, }, } : {}), } /** * Type guard to check if a PermissionMode is an ExternalPermissionMode. * auto is ant-only and excluded from external modes. */ export function isExternalPermissionMode( mode: PermissionMode, ): mode is ExternalPermissionMode { // External users can't have auto, so always true for them if (process.env.USER_TYPE !== 'ant') { return true } return mode !== 'auto' && mode !== 'bubble' } function getModeConfig(mode: PermissionMode): PermissionModeConfig { return PERMISSION_MODE_CONFIG[mode] ?? PERMISSION_MODE_CONFIG.default! } export function toExternalPermissionMode( mode: PermissionMode, ): ExternalPermissionMode { return getModeConfig(mode).external } export function permissionModeFromString(str: string): PermissionMode { return (PERMISSION_MODES as readonly string[]).includes(str) ? (str as PermissionMode) : 'default' } export function permissionModeTitle(mode: PermissionMode): string { return getModeConfig(mode).title } export function isDefaultMode(mode: PermissionMode | undefined): boolean { return mode === 'default' || mode === undefined } export function permissionModeShortTitle(mode: PermissionMode): string { return getModeConfig(mode).shortTitle } export function permissionModeSymbol(mode: PermissionMode): string { return getModeConfig(mode).symbol } export function getModeColor(mode: PermissionMode): ModeColorKey { return getModeConfig(mode).color }