import { z } from "zod"; export const STATIC_KEYBINDING_COMMANDS = [ "terminal.toggle", "terminal.split", "terminal.new", "terminal.close", "chat.new", "chat.newLocal", "editor.openFavorite", ] as const; export const keybindingCommandSchema = z.union([ z.enum(STATIC_KEYBINDING_COMMANDS), z .string() .trim() .min(1) .max(96) .regex(/^script\.[a-z0-9][a-z0-9-]*\.run$/), ]); const keybindingValueSchema = z.string().trim().min(1).max(64); const keybindingWhenSchema = z.string().trim().min(1).max(256); export const keybindingRuleSchema = z.object({ key: keybindingValueSchema, command: keybindingCommandSchema, when: keybindingWhenSchema.optional(), }); export const keybindingsConfigSchema = z.array(keybindingRuleSchema).max(256); export const keybindingShortcutSchema = z .object({ key: z.string().trim().min(1).max(32), metaKey: z.boolean(), ctrlKey: z.boolean(), shiftKey: z.boolean(), altKey: z.boolean(), modKey: z.boolean(), }) .strict(); export type KeybindingWhenNode = | { type: "identifier"; name: string } | { type: "not"; node: KeybindingWhenNode } | { type: "and"; left: KeybindingWhenNode; right: KeybindingWhenNode } | { type: "or"; left: KeybindingWhenNode; right: KeybindingWhenNode }; export const keybindingWhenNodeSchema: z.ZodType = z.lazy(() => z.union([ z.object({ type: z.literal("identifier"), name: z.string().min(1), }), z.object({ type: z.literal("not"), node: keybindingWhenNodeSchema, }), z.object({ type: z.literal("and"), left: keybindingWhenNodeSchema, right: keybindingWhenNodeSchema, }), z.object({ type: z.literal("or"), left: keybindingWhenNodeSchema, right: keybindingWhenNodeSchema, }), ]), ); export const resolvedKeybindingRuleSchema = z .object({ command: keybindingCommandSchema, shortcut: keybindingShortcutSchema, whenAst: keybindingWhenNodeSchema.optional(), }) .strict(); export const resolvedKeybindingsConfigSchema = z.array(resolvedKeybindingRuleSchema).max(256); export type KeybindingCommand = z.infer; export type KeybindingRule = z.infer; export type KeybindingsConfig = z.infer; export type KeybindingShortcut = z.infer; export type ResolvedKeybindingRule = z.infer; export type ResolvedKeybindingsConfig = z.infer;