{"version":3,"sources":["../src/key-normalizer.ts"],"sourcesContent":["/**\n * Key name normalization utilities for press_keys tool.\n *\n * This module provides utilities to normalize key names to the correct case format\n * expected by the press_keys MCP tool, improving case compatibility.\n */\n\n// Define key name mappings with correct case formats\n// Category 1: Modifier keys - should be Title Case\nconst MODIFIER_KEYS: Record<string, string> = {\n  ctrl: \"Ctrl\",\n  control: \"Ctrl\",\n  alt: \"Alt\",\n  shift: \"Shift\",\n  win: \"Win\",\n  windows: \"Win\",\n  meta: \"Meta\",\n  super: \"Super\",\n  command: \"Command\",\n  cmd: \"Command\",\n};\n\n// Category 2: Function keys - should be Title Case\nconst FUNCTION_KEYS: Record<string, string> = {\n  tab: \"Tab\",\n  enter: \"Enter\",\n  return: \"Enter\",\n  escape: \"Escape\",\n  esc: \"Escape\",\n  backspace: \"Backspace\",\n  delete: \"Delete\",\n  del: \"Delete\",\n  insert: \"Insert\",\n  ins: \"Insert\",\n  home: \"Home\",\n  end: \"End\",\n  pageup: \"PageUp\",\n  pagedown: \"PageDown\",\n  pgup: \"PageUp\",\n  pgdn: \"PageDown\",\n  space: \"Space\",\n  capslock: \"CapsLock\",\n  numlock: \"NumLock\",\n  scrolllock: \"ScrollLock\",\n  printscreen: \"PrintScreen\",\n  prtsc: \"PrintScreen\",\n  pause: \"Pause\",\n  break: \"Pause\",\n};\n\n// Category 3: Arrow keys - should be Title Case\nconst ARROW_KEYS: Record<string, string> = {\n  arrowup: \"ArrowUp\",\n  arrowdown: \"ArrowDown\",\n  arrowleft: \"ArrowLeft\",\n  arrowright: \"ArrowRight\",\n  up: \"ArrowUp\",\n  down: \"ArrowDown\",\n  left: \"ArrowLeft\",\n  right: \"ArrowRight\",\n};\n\n// Category 4: Special characters - as-is\nconst SPECIAL_CHARS: Record<string, string> = {\n  minus: \"-\",\n  equal: \"=\",\n  leftbracket: \"[\",\n  rightbracket: \"]\",\n  backslash: \"\\\\\",\n  semicolon: \";\",\n  quote: \"'\",\n  comma: \",\",\n  period: \".\",\n  slash: \"/\",\n  backtick: \"`\",\n};\n\n// Category 5: F-keys - Title Case (F1, F2, ..., F24)\nconst F_KEYS: Record<string, string> = {};\nfor (let i = 1; i <= 24; i++) {\n  const fKeyLower = `f${i}`;\n  const fKeyUpper = `F${i}`;\n  F_KEYS[fKeyLower] = fKeyUpper;\n}\n\n/**\n * Normalize a single key name to the correct case format.\n *\n * @param key - The key name to normalize (can be any case)\n * @returns The normalized key name with correct case\n *\n * Rules:\n * - Letter keys (a-z): Convert to lowercase\n * - Number keys (0-9): Keep as-is\n * - Modifier keys: Convert to Title Case (Ctrl, Alt, Shift, Win, etc.)\n * - Function keys: Convert to Title Case (Tab, Enter, Escape, etc.)\n * - Arrow keys: Convert to Title Case (ArrowUp, ArrowDown, etc.)\n * - F-keys: Convert to correct format (F1, F2, ..., F12)\n * - Unknown keys: Return as-is\n *\n * @example\n * ```typescript\n * normalizeSingleKey(\"A\")        // returns \"a\"\n * normalizeSingleKey(\"ctrl\")     // returns \"Ctrl\"\n * normalizeSingleKey(\"CTRL\")     // returns \"Ctrl\"\n * normalizeSingleKey(\"TAB\")      // returns \"Tab\"\n * normalizeSingleKey(\"f1\")       // returns \"F1\"\n * ```\n */\nfunction normalizeSingleKey(key: string): string {\n  if (!key) {\n    return key;\n  }\n\n  // Convert to lowercase for comparison\n  const keyLower = key.toLowerCase();\n\n  // Check if it's a single letter (a-z)\n  if (key.length === 1 && /[a-zA-Z]/.test(key)) {\n    return key.toLowerCase();\n  }\n\n  // Check if it's a single digit (0-9)\n  if (key.length === 1 && /[0-9]/.test(key)) {\n    return key;\n  }\n\n  // Check modifier keys\n  if (keyLower in MODIFIER_KEYS) {\n    return MODIFIER_KEYS[keyLower];\n  }\n\n  // Check function keys\n  if (keyLower in FUNCTION_KEYS) {\n    return FUNCTION_KEYS[keyLower];\n  }\n\n  // Check arrow keys\n  if (keyLower in ARROW_KEYS) {\n    return ARROW_KEYS[keyLower];\n  }\n\n  // Check F-keys\n  if (keyLower in F_KEYS) {\n    return F_KEYS[keyLower];\n  }\n\n  // Check special characters\n  if (keyLower in SPECIAL_CHARS) {\n    return SPECIAL_CHARS[keyLower];\n  }\n\n  // If the key is already in a known good format (starts with uppercase letter\n  // and is not all uppercase), assume it's already correct\n  if (\n    key[0] === key[0].toUpperCase() &&\n    key !== key.toUpperCase() &&\n    ![\"Control\", \"Windows\", \"Command\"].includes(key)\n  ) {\n    return key;\n  }\n\n  // Unknown key - return as-is\n  return key;\n}\n\n/**\n * Normalize a list of key names to the correct case format for press_keys tool.\n *\n * This function automatically converts key names to the format expected by the\n * press_keys MCP tool, improving case compatibility and user experience.\n *\n * @param keys - Array of key names to normalize (can be any case)\n * @returns Array of normalized key names with correct case\n *\n * @example\n * ```typescript\n * normalizeKeys([\"CTRL\", \"C\"])           // returns [\"Ctrl\", \"c\"]\n * normalizeKeys([\"ctrl\", \"shift\", \"Z\"])  // returns [\"Ctrl\", \"Shift\", \"z\"]\n * normalizeKeys([\"alt\", \"TAB\"])          // returns [\"Alt\", \"Tab\"]\n * normalizeKeys([\"win\", \"d\"])            // returns [\"Win\", \"d\"]\n * ```\n *\n * Note:\n * - Modifier keys are converted to Title Case (Ctrl, Alt, Shift, Win)\n * - Function keys are converted to Title Case (Tab, Enter, Escape)\n * - Letter keys are converted to lowercase (a, b, c)\n * - Number keys remain unchanged (0, 1, 2)\n * - Unknown keys are returned as-is\n */\nexport function normalizeKeys(keys: string[]): string[] {\n  if (!keys) {\n    return keys;\n  }\n\n  const normalized: string[] = [];\n  for (const key of keys) {\n    if (typeof key === \"string\") {\n      normalized.push(normalizeSingleKey(key));\n    } else {\n      // Non-string keys are passed through unchanged\n      normalized.push(key);\n    }\n  }\n\n  return normalized;\n}\n\n/**\n * Get a dictionary of all supported key name mappings.\n *\n * @returns Object with categories and their supported key names\n *\n * @example\n * ```typescript\n * const mappings = getSupportedKeyNames();\n * console.log(mappings.modifierKeys);  // { ctrl: 'Ctrl', alt: 'Alt', ... }\n * ```\n */\nexport function getSupportedKeyNames(): {\n  modifierKeys: Record<string, string>;\n  functionKeys: Record<string, string>;\n  arrowKeys: Record<string, string>;\n  fKeys: Record<string, string>;\n  specialChars: Record<string, string>;\n} {\n  return {\n    modifierKeys: MODIFIER_KEYS,\n    functionKeys: FUNCTION_KEYS,\n    arrowKeys: ARROW_KEYS,\n    fKeys: F_KEYS,\n    specialChars: SPECIAL_CHARS,\n  };\n}\n"],"mappings":"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","names":[]}