π File detail
utils/permissions/PermissionMode.ts
π― Use case
This file lives under βutils/β, which covers cross-cutting helpers (shell, tempfiles, settings, messages, process input, β¦). On the API surface it exposes permissionModeSchema, externalPermissionModeSchema, isExternalPermissionMode, toExternalPermissionMode, and permissionModeFromString (and more) β mainly functions, hooks, or classes. Dependencies touch bun:bundle and schema validation. It composes internal code from constants, types, and lazySchema (relative imports).
Generated from folder role, exports, dependency roots, and inline comments β not hand-reviewed for every path.
π§ Inline summary
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 {
π€ Exports (heuristic)
permissionModeSchemaexternalPermissionModeSchemaisExternalPermissionModetoExternalPermissionModepermissionModeFromStringpermissionModeTitleisDefaultModepermissionModeShortTitlepermissionModeSymbolgetModeColorEXTERNAL_PERMISSION_MODESPERMISSION_MODEStype ExternalPermissionModetype PermissionMode
π External import roots
Package roots from from "β¦" (relative paths omitted).
bun:bundlezod
π₯οΈ Source preview
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
}