142 lines
3.4 KiB
TypeScript
142 lines
3.4 KiB
TypeScript
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<PermissionMode, PermissionModeConfig>
|
|
> = {
|
|
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
|
|
}
|