export interface KeyToken { keytoken_id: string; name: string; timestamp_created: string; timestamp_lastused: string | null; owner_user_id: string; all_channels: boolean; channels: string[]; token?: string; permissions: string; messages_sent: number; } export interface KeyTokenPreview { keytoken_id: string; name: string; } export type TokenPermission = 'A' | 'CR' | 'CS' | 'UR'; export interface CreateKeyRequest { name: string; permissions: string; all_channels?: boolean; channels?: string[]; } export interface UpdateKeyRequest { name?: string; permissions?: string; all_channels?: boolean; channels?: string[]; } export interface KeyListResponse { keys: KeyToken[]; } export function parsePermissions(permissions: string): TokenPermission[] { if (!permissions) return []; return permissions.split(';').filter(p => p) as TokenPermission[]; } export function hasPermission(permissions: string, required: TokenPermission): boolean { const perms = parsePermissions(permissions); return perms.includes(required) || perms.includes('A'); } export function isAdminKey(key: KeyToken): boolean { return hasPermission(key.permissions, 'A'); }