{"bin":{"directory":{"keyreps":{"file":{"contents":"#!/usr/bin/env node\n// keyreps, built by `npm run build` and mounted at ~/.keyreps/dist. A CommonJS shim, since the sandbox runs extensionless ES modules silently.\nimport(\"../.keyreps/dist/src/cli.js\");\n"}}}},".keyreps":{"directory":{"package.json":{"file":{"contents":"{\n  \"name\": \"@soleone/keyreps\",\n  \"version\": \"0.1.2\",\n  \"description\": \"A terminal game for learning Unix and Readline keyboard shortcuts\",\n  \"type\": \"module\",\n  \"bin\": {\n    \"keyreps\": \"dist/src/cli.js\"\n  },\n  \"files\": [\n    \"dist/src\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsc && chmod +x dist/src/cli.js\",\n    \"prepare\": \"npm run build\",\n    \"prepack\": \"npm run build\",\n    \"release\": \"release-it\",\n    \"start\": \"node dist/src/cli.js\",\n    \"test\": \"npm run build && node --test dist/test/*.test.js\",\n    \"typecheck\": \"tsc --noEmit\",\n    \"demo:build\": \"npm run build && showcase terminal demo/browser --out dist/browser\",\n    \"demo\": \"npm run build && showcase terminal demo/browser --out dist/browser --serve\",\n    \"media:capture\": \"node demo/capture.mjs\"\n  },\n  \"keywords\": [\n    \"cli\",\n    \"terminal\",\n    \"game\",\n    \"readline\",\n    \"unix\",\n    \"keyboard-shortcuts\"\n  ],\n  \"author\": \"Soleone <dev@soleone.xyz>\",\n  \"license\": \"MIT\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"engines\": {\n    \"node\": \">=20\"\n  },\n  \"devEngines\": {\n    \"runtime\": {\n      \"name\": \"node\",\n      \"version\": \">=22\",\n      \"onFail\": \"warn\"\n    },\n    \"packageManager\": {\n      \"name\": \"npm\",\n      \"version\": \">=10\",\n      \"onFail\": \"warn\"\n    }\n  },\n  \"devDependencies\": {\n    \"@soleone/showcase\": \"github:Soleone/showcase#658b1b5\",\n    \"@types/node\": \"^22.0.0\",\n    \"release-it\": \"^21.1.0\",\n    \"typescript\": \"^5.6.0\"\n  },\n  \"release-it\": {\n    \"hooks\": {\n      \"before:init\": \"npm test\"\n    },\n    \"npm\": {\n      \"stage\": true\n    }\n  }\n}\n"}},"dist":{"directory":{"src":{"directory":{"challenges.d.ts":{"file":{"contents":"import type { EditorAction } from \"./editor.js\";\nexport type ChallengeTier = \"basic\" | \"intermediate\" | \"expert\";\nexport interface Challenge {\n    id: string;\n    tier: ChallengeTier;\n    title: string;\n    instructions: string[];\n    hint: string;\n    start: string;\n    startCursor: number;\n    target: string;\n    targetCursor: number;\n    focus: EditorAction;\n    focusLabel: string;\n    focusDescription: string;\n    /** Minimum physical keyboard presses, excluding Enter used to submit. */\n    idealKeys: number;\n}\nexport declare const challenges: Challenge[];\n"}},"challenges.js":{"file":{"contents":"const length = (value) => Array.from(value).length;\nexport const challenges = [\n    // Basic drills stay beside their alternate scenario for the same shortcut.\n    {\n        id: \"line-start\",\n        tier: \"basic\",\n        title: \"Get to the start\",\n        instructions: [\"Prefix the command with sudo followed by a space.\"],\n        hint: \"Ctrl+A jumps to the beginning of the line.\",\n        start: \"systemctl restart api\",\n        startCursor: length(\"systemctl restart api\"),\n        target: \"sudo systemctl restart api\",\n        targetCursor: length(\"sudo \"),\n        focus: \"line-start\",\n        focusLabel: \"Ctrl+A\",\n        focusDescription: \"start of line\",\n        idealKeys: 1 + length(\"sudo \"),\n    },\n    {\n        id: \"line-start-prefix\",\n        tier: \"basic\",\n        title: \"Prefix another command\",\n        instructions: [\"Prefix the test command with env APP_ENV=test followed by a space.\"],\n        hint: \"Ctrl+A jumps to the beginning of the line.\",\n        start: \"npm test -- --runInBand\",\n        startCursor: length(\"npm test \"),\n        target: \"env APP_ENV=test npm test -- --runInBand\",\n        targetCursor: length(\"env APP_ENV=test \"),\n        focus: \"line-start\",\n        focusLabel: \"Ctrl+A\",\n        focusDescription: \"start of line\",\n        idealKeys: 1 + length(\"env APP_ENV=test \"),\n    },\n    {\n        id: \"line-end\",\n        tier: \"basic\",\n        title: \"Get to the end\",\n        instructions: [\"Append --short to the command.\"],\n        hint: \"Ctrl+E jumps to the end of the line.\",\n        start: \"git status\",\n        startCursor: 0,\n        target: \"git status --short\",\n        targetCursor: length(\"git status --short\"),\n        focus: \"line-end\",\n        focusLabel: \"Ctrl+E\",\n        focusDescription: \"end of line\",\n        idealKeys: 1 + length(\" --short\"),\n    },\n    {\n        id: \"line-end-redirect\",\n        tier: \"basic\",\n        title: \"Append a redirect\",\n        instructions: [\"Append 2>&1 to the test command with a leading space.\"],\n        hint: \"Ctrl+E jumps to the end of the line.\",\n        start: \"npm test\",\n        startCursor: length(\"npm \"),\n        target: \"npm test 2>&1\",\n        targetCursor: length(\"npm test 2>&1\"),\n        focus: \"line-end\",\n        focusLabel: \"Ctrl+E\",\n        focusDescription: \"end of line\",\n        idealKeys: 1 + length(\" 2>&1\"),\n    },\n    {\n        id: \"char-left\",\n        tier: \"basic\",\n        title: \"One character back\",\n        instructions: [\"Move left once.\", \"Insert t.\"],\n        hint: \"Ctrl+B or Left Arrow moves backward by one character.\",\n        start: \"git staus\",\n        startCursor: 8,\n        target: \"git status\",\n        targetCursor: 8,\n        focus: \"move-char-left\",\n        focusLabel: \"Ctrl+B / Left Arrow\",\n        focusDescription: \"move left\",\n        idealKeys: 2,\n    },\n    {\n        id: \"char-right\",\n        tier: \"basic\",\n        title: \"One character forward\",\n        instructions: [\"Move right once.\", \"Insert t.\"],\n        hint: \"Ctrl+F or Right Arrow moves forward by one character.\",\n        start: \"git staus\",\n        startCursor: 6,\n        target: \"git status\",\n        targetCursor: 8,\n        focus: \"move-char-right\",\n        focusLabel: \"Ctrl+F / Right Arrow\",\n        focusDescription: \"move right\",\n        idealKeys: 2,\n    },\n    {\n        id: \"word-left\",\n        tier: \"basic\",\n        title: \"Jump back a word\",\n        instructions: [\"Move to the start of feature.\", \"Insert switch followed by a space.\"],\n        hint: \"Alt+B or Ctrl+Left moves backward by one word.\",\n        start: \"git feature\",\n        startCursor: length(\"git feature\"),\n        target: \"git switch feature\",\n        targetCursor: length(\"git switch \"),\n        focus: \"move-word-left\",\n        focusLabel: \"Alt+B / Ctrl+Left\",\n        focusDescription: \"previous word\",\n        idealKeys: 1 + length(\"switch \"),\n    },\n    {\n        id: \"word-left-option\",\n        tier: \"basic\",\n        title: \"Insert before the deployment target\",\n        instructions: [\"Move to the start of production.\", \"Insert --dry-run followed by a space.\"],\n        hint: \"Alt+B or Ctrl+Left moves backward by one word.\",\n        start: \"git deploy production --force\",\n        startCursor: length(\"git deploy production\"),\n        target: \"git deploy --dry-run production --force\",\n        targetCursor: length(\"git deploy --dry-run \"),\n        focus: \"move-word-left\",\n        focusLabel: \"Alt+B / Ctrl+Left\",\n        focusDescription: \"previous word\",\n        idealKeys: 1 + length(\"--dry-run \"),\n    },\n    {\n        id: \"word-right\",\n        tier: \"basic\",\n        title: \"Jump forward a word\",\n        instructions: [\"Move past login.\", \"Insert --verbose with a leading space.\"],\n        hint: \"Alt+F or Ctrl+Right moves forward by one word.\",\n        start: \"git login --force\",\n        startCursor: length(\"git \"),\n        target: \"git login --verbose --force\",\n        targetCursor: length(\"git login --verbose\"),\n        focus: \"move-word-right\",\n        focusLabel: \"Alt+F / Ctrl+Right\",\n        focusDescription: \"next word\",\n        idealKeys: 1 + length(\" --verbose\"),\n    },\n    {\n        id: \"word-right-option\",\n        tier: \"basic\",\n        title: \"Insert after the first command\",\n        instructions: [\"Move past docker.\", \"Insert --rm with a leading space.\"],\n        hint: \"Alt+F or Ctrl+Right moves forward by one word.\",\n        start: \"docker run alpine\",\n        startCursor: 0,\n        target: \"docker --rm run alpine\",\n        targetCursor: length(\"docker --rm\"),\n        focus: \"move-word-right\",\n        focusLabel: \"Alt+F / Ctrl+Right\",\n        focusDescription: \"next word\",\n        idealKeys: 1 + length(\" --rm\"),\n    },\n    {\n        id: \"kill-to-end\",\n        tier: \"basic\",\n        title: \"Clear to the end\",\n        instructions: [\"Remove --short while keeping git status and its trailing space.\"],\n        hint: \"Ctrl+K kills everything from the cursor to the end.\",\n        start: \"git status --short\",\n        startCursor: length(\"git status \"),\n        target: \"git status \",\n        targetCursor: length(\"git status \"),\n        focus: \"kill-to-end\",\n        focusLabel: \"Ctrl+K\",\n        focusDescription: \"clear to end\",\n        idealKeys: 1,\n    },\n    {\n        id: \"kill-to-end-options\",\n        tier: \"basic\",\n        title: \"Clear the final option\",\n        instructions: [\"Remove --no-edit while keeping git commit --amend and its trailing space.\"],\n        hint: \"Ctrl+K kills everything from the cursor to the end.\",\n        start: \"git commit --amend --no-edit\",\n        startCursor: length(\"git commit --amend \"),\n        target: \"git commit --amend \",\n        targetCursor: length(\"git commit --amend \"),\n        focus: \"kill-to-end\",\n        focusLabel: \"Ctrl+K\",\n        focusDescription: \"clear to end\",\n        idealKeys: 1,\n    },\n    {\n        id: \"kill-to-start\",\n        tier: \"basic\",\n        title: \"Clear to the start\",\n        instructions: [\"Delete the whole temporary command.\"],\n        hint: \"Ctrl+U kills everything from the start to the cursor.\",\n        start: \"temporary git status\",\n        startCursor: length(\"temporary git status\"),\n        target: \"\",\n        targetCursor: 0,\n        focus: \"kill-to-start\",\n        focusLabel: \"Ctrl+U\",\n        focusDescription: \"clear to start\",\n        idealKeys: 1,\n    },\n    {\n        id: \"kill-to-start-prefix\",\n        tier: \"basic\",\n        title: \"Clear a command prefix\",\n        instructions: [\"Remove sudo while keeping the rest of the command.\"],\n        hint: \"Ctrl+U kills everything from the start to the cursor.\",\n        start: \"sudo systemctl restart api\",\n        startCursor: length(\"sudo \"),\n        target: \"systemctl restart api\",\n        targetCursor: 0,\n        focus: \"kill-to-start\",\n        focusLabel: \"Ctrl+U\",\n        focusDescription: \"clear to start\",\n        idealKeys: 1,\n    },\n    {\n        id: \"kill-previous-word\",\n        tier: \"basic\",\n        title: \"Kill the previous word\",\n        instructions: [\"Remove the word message.\"],\n        hint: \"Ctrl+W kills the previous word and its separating space.\",\n        start: \"git commit message\",\n        startCursor: length(\"git commit message\"),\n        target: \"git commit\",\n        targetCursor: length(\"git commit\"),\n        focus: \"kill-previous-word\",\n        focusLabel: \"Ctrl+W\",\n        focusDescription: \"delete previous word\",\n        idealKeys: 1,\n    },\n    {\n        id: \"kill-previous-option\",\n        tier: \"basic\",\n        title: \"Kill a previous option\",\n        instructions: [\"From after --no-edit, remove that option and its separating space.\"],\n        hint: \"Ctrl+W kills the previous word and its separating space.\",\n        start: \"git commit --amend --no-edit message\",\n        startCursor: length(\"git commit --amend --no-edit\"),\n        target: \"git commit --amend message\",\n        targetCursor: length(\"git commit --amend\"),\n        focus: \"kill-previous-word\",\n        focusLabel: \"Ctrl+W\",\n        focusDescription: \"delete previous word\",\n        idealKeys: 1,\n    },\n    {\n        id: \"kill-next-word\",\n        tier: \"basic\",\n        title: \"Kill the next word\",\n        instructions: [\"From after git, remove commit and its trailing space.\"],\n        hint: \"Alt+D kills the next word and its following space.\",\n        start: \"git commit message\",\n        startCursor: length(\"git \"),\n        target: \"git message\",\n        targetCursor: length(\"git \"),\n        focus: \"kill-next-word\",\n        focusLabel: \"Alt+D\",\n        focusDescription: \"delete next word\",\n        idealKeys: 1,\n    },\n    {\n        id: \"kill-next-prefix\",\n        tier: \"basic\",\n        title: \"Kill the next word\",\n        instructions: [\"From the start, remove sudo and its following space.\"],\n        hint: \"Alt+D kills the next word and its following space.\",\n        start: \"sudo git status\",\n        startCursor: 0,\n        target: \"git status\",\n        targetCursor: 0,\n        focus: \"kill-next-word\",\n        focusLabel: \"Alt+D\",\n        focusDescription: \"delete next word\",\n        idealKeys: 1,\n    },\n    {\n        id: \"yank\",\n        tier: \"basic\",\n        title: \"Yank it back\",\n        instructions: [\"Kill --short.\", \"Restore it with one yank.\"],\n        hint: \"Ctrl+Y inserts the most recently killed text.\",\n        start: \"git status --short\",\n        startCursor: length(\"git status \"),\n        target: \"git status --short\",\n        targetCursor: length(\"git status --short\"),\n        focus: \"yank\",\n        focusLabel: \"Ctrl+Y\",\n        focusDescription: \"restore last kill\",\n        idealKeys: 2,\n    },\n    {\n        id: \"yank-command\",\n        tier: \"basic\",\n        title: \"Yank a whole command\",\n        instructions: [\"Kill the command.\", \"Restore it with one yank.\"],\n        hint: \"Ctrl+Y inserts the most recently killed text.\",\n        start: \"docker compose up --detach\",\n        startCursor: length(\"docker compose up --detach\"),\n        target: \"docker compose up --detach\",\n        targetCursor: length(\"docker compose up --detach\"),\n        focus: \"yank\",\n        focusLabel: \"Ctrl+Y\",\n        focusDescription: \"restore last kill\",\n        idealKeys: 2,\n    },\n    {\n        id: \"transpose\",\n        tier: \"basic\",\n        title: \"Transpose a typo\",\n        instructions: [\"Fix stauts by transposing the two middle letters.\"],\n        hint: \"Ctrl+T swaps the character before and at the cursor.\",\n        start: \"git stauts\",\n        startCursor: 8,\n        target: \"git status\",\n        targetCursor: 9,\n        focus: \"transpose\",\n        focusLabel: \"Ctrl+T\",\n        focusDescription: \"swap characters\",\n        idealKeys: 1,\n    },\n    {\n        id: \"transpose-at-end\",\n        tier: \"basic\",\n        title: \"Transpose at the end\",\n        instructions: [\"Fix statsu by transposing its final two letters.\"],\n        hint: \"Ctrl+T swaps the character before and at the cursor.\",\n        start: \"git statsu\",\n        startCursor: length(\"git statsu\"),\n        target: \"git status\",\n        targetCursor: length(\"git status\"),\n        focus: \"transpose\",\n        focusLabel: \"Ctrl+T\",\n        focusDescription: \"swap characters\",\n        idealKeys: 1,\n    },\n    {\n        id: \"delete-character\",\n        tier: \"basic\",\n        title: \"Delete under the cursor\",\n        instructions: [\"Delete the extra t under the cursor.\"],\n        hint: \"Ctrl+D deletes the character at the cursor.\",\n        start: \"git sttatus\",\n        startCursor: 6,\n        target: \"git status\",\n        targetCursor: 6,\n        focus: \"delete-next-char\",\n        focusLabel: \"Ctrl+D\",\n        focusDescription: \"delete next character\",\n        idealKeys: 1,\n    },\n    {\n        id: \"delete-option-character\",\n        tier: \"basic\",\n        title: \"Delete an extra option character\",\n        instructions: [\"Delete the extra dash under the cursor.\"],\n        hint: \"Ctrl+D deletes the character at the cursor.\",\n        start: \"git --status\",\n        startCursor: length(\"git \"),\n        target: \"git -status\",\n        targetCursor: length(\"git \"),\n        focus: \"delete-next-char\",\n        focusLabel: \"Ctrl+D\",\n        focusDescription: \"delete next character\",\n        idealKeys: 1,\n    },\n    // Intermediate drills combine several editing commands into one repair so\n    // the player has to choose an order instead of repeating one shortcut.\n    {\n        id: \"combo-prefix-and-append\",\n        tier: \"intermediate\",\n        title: \"Build a longer command\",\n        instructions: [\n            \"Append --branch with a leading space.\",\n            \"Add sudo and a space at the start.\",\n        ],\n        hint: \"Append --branch first, then use Ctrl+A to jump to the start.\",\n        start: \"git status --short\",\n        startCursor: length(\"git status --short\"),\n        target: \"sudo git status --short --branch\",\n        targetCursor: length(\"sudo \"),\n        focus: \"line-start\",\n        focusLabel: \"Ctrl+A\",\n        focusDescription: \"start of line\",\n        idealKeys: length(\" --branch\") + 1 + length(\"sudo \"),\n    },\n    {\n        id: \"combo-prefix-and-insert-option\",\n        tier: \"intermediate\",\n        title: \"Prefix and insert an option\",\n        instructions: [\n            \"Prefix the deploy command with sudo and a space.\",\n            \"Insert --dry-run before staging.\",\n        ],\n        hint: \"Use Ctrl+A, then move forward by two words before inserting the option.\",\n        start: \"git deploy staging\",\n        startCursor: length(\"git deploy staging\"),\n        target: \"sudo git deploy --dry-run staging\",\n        targetCursor: length(\"sudo git deploy --dry-run\"),\n        focus: \"line-start\",\n        focusLabel: \"Ctrl+A + Alt+F ×2\",\n        focusDescription: \"prefix and insert\",\n        idealKeys: 1 + length(\"sudo \") + 1 + 1 + length(\" --dry-run\"),\n    },\n    {\n        id: \"combo-remove-and-append\",\n        tier: \"intermediate\",\n        title: \"Remove and append an option\",\n        instructions: [\n            \"Remove --rm from the middle of the command.\",\n            \"Append --detach with a leading space.\",\n        ],\n        hint: \"Use Alt+B to find --rm, Alt+D to remove it, and Ctrl+E to finish.\",\n        start: \"docker run --rm alpine\",\n        startCursor: length(\"docker run --rm alpine\"),\n        target: \"docker run alpine --detach\",\n        targetCursor: length(\"docker run alpine --detach\"),\n        focus: \"kill-next-word\",\n        focusLabel: \"Alt+B ×2 + Alt+D + Ctrl+E\",\n        focusDescription: \"remove and append\",\n        idealKeys: 1 + 1 + 1 + 1 + length(\" --detach\"),\n    },\n    {\n        id: \"combo-restore-and-trim\",\n        tier: \"intermediate\",\n        title: \"Restore, then trim\",\n        instructions: [\n            \"Clear the line and prefix the restored command with sudo.\",\n            \"Yank the original command back, then remove --short.\",\n        ],\n        hint: \"Combine Ctrl+U, Ctrl+Y, and Ctrl+W to reshape the command.\",\n        start: \"git status --short\",\n        startCursor: length(\"git status --short\"),\n        target: \"sudo git status\",\n        targetCursor: length(\"sudo git status\"),\n        focus: \"kill-to-start\",\n        focusLabel: \"Ctrl+U + Ctrl+Y + Ctrl+W\",\n        focusDescription: \"clear, restore, and trim\",\n        idealKeys: 1 + length(\"sudo \") + 1 + 1,\n    },\n    {\n        id: \"combo-strip-options-and-rebuild\",\n        tier: \"intermediate\",\n        title: \"Strip options and rebuild\",\n        instructions: [\n            \"Remove sudo and both existing options.\",\n            \"Append --message release.\",\n        ],\n        hint: \"Clear the prefix, jump to the end, and kill the two old options.\",\n        start: \"sudo git commit --amend --no-edit\",\n        startCursor: length(\"sudo \"),\n        target: \"git commit --message release\",\n        targetCursor: length(\"git commit --message release\"),\n        focus: \"kill-to-start\",\n        focusLabel: \"Ctrl+U + Ctrl+E + Ctrl+W ×2\",\n        focusDescription: \"strip and rebuild\",\n        idealKeys: 1 + 1 + 1 + 1 + length(\" --message release\"),\n    },\n    {\n        id: \"combo-repair-and-replace\",\n        tier: \"intermediate\",\n        title: \"Repair and replace an option\",\n        instructions: [\n            \"Transpose the typo in stauts.\",\n            \"Replace --force with --verbose.\",\n        ],\n        hint: \"Use Ctrl+T, Ctrl+E, and Ctrl+W in that order.\",\n        start: \"git stauts --force\",\n        startCursor: 8,\n        target: \"git status --verbose\",\n        targetCursor: length(\"git status --verbose\"),\n        focus: \"transpose\",\n        focusLabel: \"Ctrl+T + Ctrl+E + Ctrl+W\",\n        focusDescription: \"repair and replace\",\n        idealKeys: 1 + 1 + 1 + length(\" --verbose\"),\n    },\n    // Expert drills deliberately keep their instructions out of sight until a\n    // wasted key or failed attempt shows that the player needs a safety net.\n    {\n        id: \"expert-release-command\",\n        tier: \"expert\",\n        title: \"Rewrite a release command\",\n        instructions: [\n            \"Remove --amend and --no-edit.\",\n            \"Prefix the command with sudo.\",\n            \"Append --message release --no-verify.\",\n        ],\n        hint: \"Use two word kills, then rebuild the command at its boundaries.\",\n        start: \"git commit --amend --no-edit\",\n        startCursor: length(\"git commit --amend --no-edit\"),\n        target: \"sudo git commit --message release --no-verify\",\n        targetCursor: length(\"sudo git commit --message release --no-verify\"),\n        focus: \"kill-previous-word\",\n        focusLabel: \"Ctrl+W ×2 + Ctrl+A + Ctrl+E\",\n        focusDescription: \"rewrite from memory\",\n        idealKeys: 1 + 1 + 1 + length(\"sudo \") + 1 + length(\" --message release --no-verify\"),\n    },\n    {\n        id: \"expert-compose-file\",\n        tier: \"expert\",\n        title: \"Add a compose file\",\n        instructions: [\n            \"Remove --detach and --build.\",\n            \"Insert -f compose.prod.yml before up.\",\n            \"Append --wait.\",\n        ],\n        hint: \"Trim from the end, move back to up, then finish at the line end.\",\n        start: \"docker compose up --detach --build\",\n        startCursor: length(\"docker compose up --detach --build\"),\n        target: \"docker compose -f compose.prod.yml up --wait\",\n        targetCursor: length(\"docker compose -f compose.prod.yml up --wait\"),\n        focus: \"kill-previous-word\",\n        focusLabel: \"Ctrl+W ×2 + Alt+B + Ctrl+E\",\n        focusDescription: \"reposition a command\",\n        idealKeys: 1 + 1 + 1 + length(\"-f compose.prod.yml \") + 1 + length(\" --wait\"),\n    },\n    {\n        id: \"expert-repair-deploy\",\n        tier: \"expert\",\n        title: \"Repair a deploy command\",\n        instructions: [\n            \"Replace prod.yaml with production.yaml.\",\n            \"Insert --server-side before -f.\",\n        ],\n        hint: \"Kill the two trailing words, restore the filename, then move back twice.\",\n        start: \"kubectl apply -f prod.yaml --dryrun\",\n        startCursor: length(\"kubectl apply -f prod.yaml --dryrun\"),\n        target: \"kubectl apply --server-side -f production.yaml\",\n        targetCursor: length(\"kubectl apply --server-side -f production.yaml\"),\n        focus: \"kill-previous-word\",\n        focusLabel: \"Ctrl+W ×2 + Alt+B ×2 + Ctrl+E\",\n        focusDescription: \"repair and reposition\",\n        idealKeys: 1 + 1 + length(\" production.yaml\") + 1 + 1 + length(\"--server-side \") + 1,\n    },\n    {\n        id: \"expert-test-command\",\n        tier: \"expert\",\n        title: \"Extend a test command\",\n        instructions: [\n            \"Restore --runInBand after briefly removing it.\",\n            \"Prefix the command with env NODE_ENV=production.\",\n            \"Append --reporter=spec.\",\n        ],\n        hint: \"Use the kill ring, then work from the start and end of the line.\",\n        start: \"npm test -- --runInBand\",\n        startCursor: length(\"npm test -- --runInBand\"),\n        target: \"env NODE_ENV=production npm test -- --runInBand --reporter=spec\",\n        targetCursor: length(\"env NODE_ENV=production npm test -- --runInBand --reporter=spec\"),\n        focus: \"yank\",\n        focusLabel: \"Ctrl+W + Ctrl+Y + Ctrl+A + Ctrl+E\",\n        focusDescription: \"restore and extend\",\n        idealKeys: 1 + 1 + 1 + length(\"env NODE_ENV=production \") + 1 + length(\" --reporter=spec\"),\n    },\n    {\n        id: \"expert-service-options\",\n        tier: \"expert\",\n        title: \"Reposition a service option\",\n        instructions: [\n            \"Remove sudo.\",\n            \"Insert --force between restart and api.\",\n        ],\n        hint: \"Delete the prefix, then move forward by two words from the new start.\",\n        start: \"sudo systemctl restart api --no-block\",\n        startCursor: length(\"sudo systemctl restart api --no-block\"),\n        target: \"systemctl restart --force api --no-block\",\n        targetCursor: length(\"systemctl restart --force\"),\n        focus: \"kill-next-word\",\n        focusLabel: \"Ctrl+A + Alt+D + Alt+F ×2\",\n        focusDescription: \"reposition an option\",\n        idealKeys: 1 + 1 + 1 + 1 + length(\" --force\"),\n    },\n    {\n        id: \"expert-reorder-diff\",\n        tier: \"expert\",\n        title: \"Replace diff options\",\n        instructions: [\n            \"Remove --cached while keeping --stat.\",\n            \"Append --word-diff.\",\n        ],\n        hint: \"Move back by two words, remove --cached, and finish at the line end.\",\n        start: \"git diff --cached --stat\",\n        startCursor: length(\"git diff --cached --stat\"),\n        target: \"git diff --stat --word-diff\",\n        targetCursor: length(\"git diff --stat --word-diff\"),\n        focus: \"kill-next-word\",\n        focusLabel: \"Alt+B ×2 + Alt+D + Ctrl+E\",\n        focusDescription: \"replace an option\",\n        idealKeys: 1 + 1 + 1 + 1 + length(\" --word-diff\"),\n    },\n];\n//# sourceMappingURL=challenges.js.map"}},"challenges.js.map":{"file":{"contents":"{\"version\":3,\"file\":\"challenges.js\",\"sourceRoot\":\"\",\"sources\":[\"../../src/challenges.ts\"],\"names\":[],\"mappings\":\"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\"}"}},"cli.d.ts":{"file":{"contents":"#!/usr/bin/env node\nexport {};\n"}},"cli.js":{"file":{"contents":"#!/usr/bin/env node\nimport process from \"node:process\";\nimport { InputDecoder } from \"./input.js\";\nimport { handleKey, startGame, } from \"./game.js\";\nimport { refreshTheme, renderGame } from \"./render.js\";\nconst THEME_POLL_INTERVAL_MS = 750;\nconst NOTIFICATION_DURATION_MS = 3000;\nfunction main() {\n    if (!process.stdin.isTTY || !process.stdout.isTTY) {\n        console.error(\"keyreps needs an interactive terminal (TTY).\");\n        process.exitCode = 1;\n        return;\n    }\n    const decoder = new InputDecoder();\n    let game = startGame();\n    let cleanedUp = false;\n    let pendingTimer;\n    let notificationTimer;\n    let themeTimer;\n    const cleanup = () => {\n        if (cleanedUp) {\n            return;\n        }\n        cleanedUp = true;\n        if (pendingTimer !== undefined) {\n            clearTimeout(pendingTimer);\n            pendingTimer = undefined;\n        }\n        if (notificationTimer !== undefined) {\n            clearTimeout(notificationTimer);\n            notificationTimer = undefined;\n        }\n        if (themeTimer !== undefined) {\n            clearInterval(themeTimer);\n            themeTimer = undefined;\n        }\n        process.stdin.setRawMode(false);\n        process.stdin.pause();\n        process.stdout.write(\"\\u001b[?25h\\u001b[0m\\n\");\n    };\n    const quit = (code = 0) => {\n        cleanup();\n        process.exitCode = code;\n    };\n    const draw = () => {\n        process.stdout.write(renderGame(game));\n    };\n    const scheduleNotificationExpiry = (notification) => {\n        if (notificationTimer !== undefined) {\n            clearTimeout(notificationTimer);\n            notificationTimer = undefined;\n        }\n        if (notification === null) {\n            return;\n        }\n        notificationTimer = setTimeout(() => {\n            notificationTimer = undefined;\n            if (game.notification !== notification) {\n                return;\n            }\n            game = { ...game, notification: null };\n            draw();\n        }, NOTIFICATION_DURATION_MS);\n    };\n    const consume = (keys) => {\n        for (const key of keys) {\n            const previousNotification = game.notification;\n            const result = handleKey(game, key);\n            game = result.state;\n            if (game.notification !== previousNotification) {\n                scheduleNotificationExpiry(game.notification);\n            }\n            if (result.quit) {\n                quit();\n                return false;\n            }\n        }\n        return true;\n    };\n    const schedulePendingFlush = () => {\n        if (!decoder.hasPending()) {\n            return;\n        }\n        pendingTimer = setTimeout(() => {\n            pendingTimer = undefined;\n            if (consume(decoder.flushPending())) {\n                draw();\n            }\n        }, 35);\n    };\n    const onData = (chunk) => {\n        if (pendingTimer !== undefined) {\n            clearTimeout(pendingTimer);\n            pendingTimer = undefined;\n        }\n        if (!consume(decoder.feed(chunk))) {\n            return;\n        }\n        schedulePendingFlush();\n        draw();\n    };\n    process.stdin.setRawMode(true);\n    process.stdin.resume();\n    process.stdin.on(\"data\", onData);\n    process.once(\"SIGINT\", () => quit());\n    process.once(\"SIGTERM\", () => quit());\n    process.once(\"uncaughtException\", (error) => {\n        cleanup();\n        console.error(error);\n        process.exitCode = 1;\n    });\n    themeTimer = setInterval(() => {\n        if (refreshTheme()) {\n            draw();\n        }\n    }, THEME_POLL_INTERVAL_MS);\n    themeTimer.unref();\n    process.stdout.write(\"\\u001b[?25l\");\n    draw();\n}\nmain();\n//# sourceMappingURL=cli.js.map"}},"cli.js.map":{"file":{"contents":"{\"version\":3,\"file\":\"cli.js\",\"sourceRoot\":\"\",\"sources\":[\"../../src/cli.ts\"],\"names\":[],\"mappings\":\";AAEA,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EACL,SAAS,EACT,SAAS,GAGV,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGvD,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAEtC,SAAS,IAAI;IACX,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC9D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;IACnC,IAAI,IAAI,GAAc,SAAS,EAAE,CAAC;IAClC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,YAAwC,CAAC;IAC7C,IAAI,iBAA6C,CAAC;IAClD,IAAI,UAAsC,CAAC;IAE3C,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,IAAI,SAAS,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QACD,SAAS,GAAG,IAAI,CAAC;QACjB,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,YAAY,CAAC,YAAY,CAAC,CAAC;YAC3B,YAAY,GAAG,SAAS,CAAC;QAC3B,CAAC;QACD,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;YACpC,YAAY,CAAC,iBAAiB,CAAC,CAAC;YAChC,iBAAiB,GAAG,SAAS,CAAC;QAChC,CAAC;QACD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,aAAa,CAAC,UAAU,CAAC,CAAC;YAC1B,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACjD,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,EAAQ,EAAE;QAC9B,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC1B,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,GAAS,EAAE;QACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC;IAEF,MAAM,0BAA0B,GAAG,CAAC,YAAuC,EAAQ,EAAE;QACnF,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;YACpC,YAAY,CAAC,iBAAiB,CAAC,CAAC;YAChC,iBAAiB,GAAG,SAAS,CAAC;QAChC,CAAC;QACD,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,iBAAiB,GAAG,UAAU,CAAC,GAAG,EAAE;YAClC,iBAAiB,GAAG,SAAS,CAAC;YAC9B,IAAI,IAAI,CAAC,YAAY,KAAK,YAAY,EAAE,CAAC;gBACvC,OAAO;YACT,CAAC;YACD,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;YACvC,IAAI,EAAE,CAAC;QACT,CAAC,EAAE,wBAAwB,CAAC,CAAC;IAC/B,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,IAAW,EAAW,EAAE;QACvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,oBAAoB,GAAG,IAAI,CAAC,YAAY,CAAC;YAC/C,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACpC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC;YACpB,IAAI,IAAI,CAAC,YAAY,KAAK,oBAAoB,EAAE,CAAC;gBAC/C,0BAA0B,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAChD,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChB,IAAI,EAAE,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,oBAAoB,GAAG,GAAS,EAAE;QACtC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;YAC7B,YAAY,GAAG,SAAS,CAAC;YACzB,IAAI,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC;gBACpC,IAAI,EAAE,CAAC;YACT,CAAC;QACH,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,KAAa,EAAQ,EAAE;QACrC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,YAAY,CAAC,YAAY,CAAC,CAAC;YAC3B,YAAY,GAAG,SAAS,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAClC,OAAO;QACT,CAAC;QAED,oBAAoB,EAAE,CAAC;QACvB,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;IAEF,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;QAC1C,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,IAAI,YAAY,EAAE,EAAE,CAAC;YACnB,IAAI,EAAE,CAAC;QACT,CAAC;IACH,CAAC,EAAE,sBAAsB,CAAC,CAAC;IAC3B,UAAU,CAAC,KAAK,EAAE,CAAC;IAEnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACpC,IAAI,EAAE,CAAC;AACT,CAAC;AAED,IAAI,EAAE,CAAC\"}"}},"editor.d.ts":{"file":{"contents":"import type { Key } from \"./types.js\";\nexport type EditorAction = \"insert-text\" | \"move-char-left\" | \"move-char-right\" | \"move-word-left\" | \"move-word-right\" | \"line-start\" | \"line-end\" | \"kill-to-start\" | \"kill-to-end\" | \"kill-previous-word\" | \"kill-next-word\" | \"yank\" | \"transpose\" | \"delete-previous-char\" | \"delete-next-char\";\nexport interface EditorState {\n    text: string;\n    /** Cursor position measured in Unicode code points, not UTF-16 units. */\n    cursor: number;\n    killRing: string;\n}\nexport interface AppliedKey {\n    state: EditorState;\n    action: EditorAction | null;\n    handled: boolean;\n}\nexport declare function createEditor(text?: string, cursor?: number): EditorState;\nexport declare function applyKey(editor: EditorState, key: Key): AppliedKey;\n"}},"editor.js":{"file":{"contents":"export function createEditor(text = \"\", cursor = codePoints(text).length) {\n    const characters = codePoints(text);\n    return {\n        text,\n        cursor: clamp(cursor, 0, characters.length),\n        killRing: \"\",\n    };\n}\nexport function applyKey(editor, key) {\n    switch (key.type) {\n        case \"text\":\n            return {\n                state: insert(editor, key.value),\n                action: \"insert-text\",\n                handled: true,\n            };\n        case \"move\":\n            return applyMovement(editor, key.direction, key.by);\n        case \"home\":\n            return result({ ...editor, cursor: 0 }, \"line-start\");\n        case \"end\":\n            return result({ ...editor, cursor: codePoints(editor.text).length }, \"line-end\");\n        case \"backspace\":\n            return deletePreviousCharacter(editor);\n        case \"delete\":\n            return deleteNextCharacter(editor);\n        case \"control\":\n            return applyControl(editor, key.key);\n        case \"alt\":\n            return applyAlt(editor, key.key);\n        case \"enter\":\n        case \"escape\":\n        case \"tab\":\n        case \"page\":\n        case \"unknown\":\n            return { state: editor, action: null, handled: false };\n    }\n}\nfunction applyControl(editor, key) {\n    switch (key) {\n        case \"a\":\n            return result({ ...editor, cursor: 0 }, \"line-start\");\n        case \"e\":\n            return result({ ...editor, cursor: codePoints(editor.text).length }, \"line-end\");\n        case \"b\":\n            return applyMovement(editor, \"left\", \"char\");\n        case \"f\":\n            return applyMovement(editor, \"right\", \"char\");\n        case \"u\":\n            return killToStart(editor);\n        case \"k\":\n            return killToEnd(editor);\n        case \"w\":\n            return killPreviousWord(editor);\n        case \"d\":\n            return deleteNextCharacter(editor);\n        case \"y\":\n            return yank(editor);\n        case \"t\":\n            return transpose(editor);\n        case \"h\":\n            return deletePreviousCharacter(editor);\n        default:\n            return { state: editor, action: null, handled: false };\n    }\n}\nfunction applyAlt(editor, key) {\n    switch (key) {\n        case \"b\":\n            return applyMovement(editor, \"left\", \"word\");\n        case \"f\":\n            return applyMovement(editor, \"right\", \"word\");\n        case \"d\":\n            return killNextWord(editor);\n        default:\n            return { state: editor, action: null, handled: false };\n    }\n}\nfunction applyMovement(editor, direction, by) {\n    const characters = codePoints(editor.text);\n    let cursor = editor.cursor;\n    let action;\n    if (by === \"char\") {\n        cursor = direction === \"left\" ? Math.max(0, cursor - 1) : Math.min(characters.length, cursor + 1);\n        action = direction === \"left\" ? \"move-char-left\" : \"move-char-right\";\n    }\n    else if (direction === \"left\") {\n        cursor = wordLeft(characters, cursor);\n        action = \"move-word-left\";\n    }\n    else {\n        cursor = wordRight(characters, cursor);\n        action = \"move-word-right\";\n    }\n    return result({ ...editor, cursor }, action);\n}\nfunction killToStart(editor) {\n    const characters = codePoints(editor.text);\n    const killed = characters.slice(0, editor.cursor).join(\"\");\n    return result({\n        text: characters.slice(editor.cursor).join(\"\"),\n        cursor: 0,\n        killRing: killed,\n    }, \"kill-to-start\");\n}\nfunction killToEnd(editor) {\n    const characters = codePoints(editor.text);\n    const killed = characters.slice(editor.cursor).join(\"\");\n    return result({\n        text: characters.slice(0, editor.cursor).join(\"\"),\n        cursor: editor.cursor,\n        killRing: killed,\n    }, \"kill-to-end\");\n}\nfunction killPreviousWord(editor) {\n    const characters = codePoints(editor.text);\n    let start = wordStart(characters, editor.cursor);\n    while (start > 0 && isWhitespace(characters[start - 1])) {\n        start -= 1;\n    }\n    const killed = characters.slice(start, editor.cursor).join(\"\");\n    return result({\n        text: [...characters.slice(0, start), ...characters.slice(editor.cursor)].join(\"\"),\n        cursor: start,\n        killRing: killed,\n    }, \"kill-previous-word\");\n}\nfunction killNextWord(editor) {\n    const characters = codePoints(editor.text);\n    let end = wordEnd(characters, editor.cursor);\n    while (end < characters.length && isWhitespace(characters[end])) {\n        end += 1;\n    }\n    const killed = characters.slice(editor.cursor, end).join(\"\");\n    return result({\n        text: [...characters.slice(0, editor.cursor), ...characters.slice(end)].join(\"\"),\n        cursor: editor.cursor,\n        killRing: killed,\n    }, \"kill-next-word\");\n}\nfunction yank(editor) {\n    return result(insert(editor, editor.killRing), \"yank\");\n}\nfunction transpose(editor) {\n    const characters = codePoints(editor.text);\n    if (characters.length < 2 || editor.cursor === 0) {\n        return result(editor, \"transpose\");\n    }\n    const right = editor.cursor >= characters.length ? characters.length - 1 : editor.cursor;\n    const left = right - 1;\n    if (left < 0) {\n        return result(editor, \"transpose\");\n    }\n    [characters[left], characters[right]] = [characters[right], characters[left]];\n    const cursor = editor.cursor >= characters.length ? editor.cursor : editor.cursor + 1;\n    return result({ ...editor, text: characters.join(\"\"), cursor }, \"transpose\");\n}\nfunction deletePreviousCharacter(editor) {\n    if (editor.cursor === 0) {\n        return result(editor, \"delete-previous-char\");\n    }\n    const characters = codePoints(editor.text);\n    characters.splice(editor.cursor - 1, 1);\n    return result({ ...editor, text: characters.join(\"\"), cursor: editor.cursor - 1 }, \"delete-previous-char\");\n}\nfunction deleteNextCharacter(editor) {\n    const characters = codePoints(editor.text);\n    if (editor.cursor >= characters.length) {\n        return result(editor, \"delete-next-char\");\n    }\n    characters.splice(editor.cursor, 1);\n    return result({ ...editor, text: characters.join(\"\") }, \"delete-next-char\");\n}\nfunction insert(editor, value) {\n    if (value.length === 0) {\n        return editor;\n    }\n    const characters = codePoints(editor.text);\n    const inserted = codePoints(value);\n    characters.splice(editor.cursor, 0, ...inserted);\n    return {\n        ...editor,\n        text: characters.join(\"\"),\n        cursor: editor.cursor + inserted.length,\n    };\n}\nfunction wordStart(characters, cursor) {\n    let start = cursor;\n    while (start > 0 && isWhitespace(characters[start - 1])) {\n        start -= 1;\n    }\n    while (start > 0 && !isWhitespace(characters[start - 1])) {\n        start -= 1;\n    }\n    return start;\n}\nfunction wordEnd(characters, cursor) {\n    let end = cursor;\n    while (end < characters.length && isWhitespace(characters[end])) {\n        end += 1;\n    }\n    while (end < characters.length && !isWhitespace(characters[end])) {\n        end += 1;\n    }\n    return end;\n}\nfunction wordLeft(characters, cursor) {\n    return wordStart(characters, cursor);\n}\nfunction wordRight(characters, cursor) {\n    return wordEnd(characters, cursor);\n}\nfunction isWhitespace(value) {\n    return value !== undefined && /\\s/.test(value);\n}\nfunction codePoints(value) {\n    return Array.from(value);\n}\nfunction clamp(value, minimum, maximum) {\n    return Math.max(minimum, Math.min(maximum, value));\n}\nfunction result(state, action) {\n    return { state, action, handled: true };\n}\n//# sourceMappingURL=editor.js.map"}},"editor.js.map":{"file":{"contents":"{\"version\":3,\"file\":\"editor.js\",\"sourceRoot\":\"\",\"sources\":[\"../../src/editor.ts\"],\"names\":[],\"mappings\":\"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\"}"}},"game.d.ts":{"file":{"contents":"import { type Challenge } from \"./challenges.js\";\nimport { type EditorAction, type EditorState } from \"./editor.js\";\nimport type { Key } from \"./types.js\";\nexport type KeyPerformance = \"perfect\" | \"close\" | \"poor\";\nexport interface LessonNotification {\n    performance: KeyPerformance;\n    text: string;\n}\nexport interface GameState {\n    challengeIndex: number;\n    editor: EditorState;\n    keyCount: number;\n    mistakes: number;\n    focusUsed: boolean;\n    totalKeys: number;\n    completed: number;\n    lastKeyCount: number | null;\n    lastPerformance: KeyPerformance | null;\n    notification: LessonNotification | null;\n    finished: boolean;\n}\nexport interface KeyResult {\n    state: GameState;\n    quit: boolean;\n}\nexport declare function startGame(): GameState;\nexport declare function currentChallenge(state: GameState): Challenge | undefined;\n/**\n * Expert drills are memory tests. Reveal their instructions only after the\n * player has spent more than the ideal number of key presses or made a\n * failed/unhandled attempt.\n */\nexport declare function shouldShowInstructions(state: GameState, challenge?: Challenge): boolean;\nexport declare function keyPerformance(keyCount: number, idealKeys: number): KeyPerformance;\nexport declare function handleKey(state: GameState, key: Key): KeyResult;\nexport declare function actionLabel(action: EditorAction | null): string;\n"}},"game.js":{"file":{"contents":"import { challenges } from \"./challenges.js\";\nimport { applyKey, createEditor, } from \"./editor.js\";\nconst CLOSE_KEY_TOLERANCE = 2;\nexport function startGame() {\n    return makeChallengeState(0, 0);\n}\nexport function currentChallenge(state) {\n    return challenges[state.challengeIndex];\n}\n/**\n * Expert drills are memory tests. Reveal their instructions only after the\n * player has spent more than the ideal number of key presses or made a\n * failed/unhandled attempt.\n */\nexport function shouldShowInstructions(state, challenge) {\n    const activeChallenge = challenge ?? currentChallenge(state);\n    return activeChallenge === undefined\n        || activeChallenge.tier !== \"expert\"\n        || state.keyCount > activeChallenge.idealKeys\n        || state.mistakes > 0;\n}\nexport function keyPerformance(keyCount, idealKeys) {\n    if (keyCount <= idealKeys) {\n        return \"perfect\";\n    }\n    return keyCount <= idealKeys + CLOSE_KEY_TOLERANCE ? \"close\" : \"poor\";\n}\nexport function handleKey(state, key) {\n    if (key.type === \"control\" && key.key === \"c\") {\n        return { state, quit: true };\n    }\n    if (state.finished) {\n        if (key.type === \"text\" && key.value.toLowerCase() === \"r\") {\n            return { state: startGame(), quit: false };\n        }\n        return { state, quit: false };\n    }\n    if (key.type === \"page\") {\n        return navigateLesson(state, key.direction);\n    }\n    const challenge = currentChallenge(state);\n    if (challenge === undefined) {\n        return { state: { ...state, finished: true }, quit: false };\n    }\n    if (key.type === \"escape\") {\n        return {\n            state: makeChallengeState(state.challengeIndex, state.totalKeys, state.completed),\n            quit: false,\n        };\n    }\n    if (key.type === \"enter\") {\n        return submit(state, challenge);\n    }\n    const applied = applyKey(state.editor, key);\n    if (!applied.handled) {\n        return {\n            state: {\n                ...state,\n                mistakes: state.mistakes + 1,\n                lastPerformance: null,\n            },\n            quit: false,\n        };\n    }\n    const focusUsed = state.focusUsed || applied.action === challenge.focus;\n    const keyPresses = key.type === \"text\" ? Array.from(key.value).length : 1;\n    return {\n        state: {\n            ...state,\n            editor: applied.state,\n            keyCount: state.keyCount + keyPresses,\n            focusUsed,\n        },\n        quit: false,\n    };\n}\nfunction navigateLesson(state, direction) {\n    const offset = direction === \"up\" ? 1 : -1;\n    const challengeIndex = state.challengeIndex + offset;\n    if (challengeIndex < 0 || challengeIndex >= challenges.length) {\n        return { state, quit: false };\n    }\n    return {\n        state: makeChallengeState(challengeIndex, state.totalKeys, state.completed, state.lastKeyCount, state.lastPerformance),\n        quit: false,\n    };\n}\nfunction submit(state, challenge) {\n    if (!solved(state.editor, challenge)) {\n        return {\n            state: {\n                ...state,\n                mistakes: state.mistakes + 1,\n                lastPerformance: null,\n            },\n            quit: false,\n        };\n    }\n    const performance = keyPerformance(state.keyCount, challenge.idealKeys);\n    const totalKeys = state.totalKeys + state.keyCount;\n    const completed = state.completed + 1;\n    if (state.challengeIndex === challenges.length - 1) {\n        return {\n            state: {\n                ...state,\n                totalKeys,\n                completed,\n                lastKeyCount: state.keyCount,\n                lastPerformance: performance,\n                notification: lessonCompleteNotification(performance),\n                finished: true,\n            },\n            quit: false,\n        };\n    }\n    return {\n        state: makeChallengeState(state.challengeIndex + 1, totalKeys, completed, state.keyCount, performance, lessonCompleteNotification(performance)),\n        quit: false,\n    };\n}\nfunction solved(editor, challenge) {\n    return editor.text === challenge.target && editor.cursor === challenge.targetCursor;\n}\nfunction lessonCompleteNotification(performance) {\n    return {\n        performance,\n        text: \"Lesson complete\",\n    };\n}\nfunction makeChallengeState(challengeIndex, totalKeys, completed = 0, lastKeyCount = null, lastPerformance = null, notification = null) {\n    const challenge = challenges[challengeIndex];\n    if (challenge === undefined) {\n        return {\n            challengeIndex,\n            editor: createEditor(),\n            keyCount: 0,\n            mistakes: 0,\n            focusUsed: false,\n            totalKeys,\n            completed,\n            lastKeyCount,\n            lastPerformance,\n            notification,\n            finished: true,\n        };\n    }\n    return {\n        challengeIndex,\n        editor: createEditor(challenge.start, challenge.startCursor),\n        keyCount: 0,\n        mistakes: 0,\n        focusUsed: false,\n        totalKeys,\n        completed,\n        lastKeyCount,\n        lastPerformance,\n        notification,\n        finished: false,\n    };\n}\nexport function actionLabel(action) {\n    return action === null ? \"unknown\" : action;\n}\n//# sourceMappingURL=game.js.map"}},"game.js.map":{"file":{"contents":"{\"version\":3,\"file\":\"game.js\",\"sourceRoot\":\"\",\"sources\":[\"../../src/game.ts\"],\"names\":[],\"mappings\":\"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\"}"}},"icons.d.ts":{"file":{"contents":"export interface TerminalIcons {\n    readonly nerdFont: boolean;\n    readonly keyboard: string;\n    readonly key: string;\n    readonly target: string;\n    readonly goal: string;\n    readonly terminal: string;\n    readonly hint: string;\n    readonly complete: string;\n    readonly submit: string;\n    readonly reset: string;\n    readonly quit: string;\n}\n/**\n * Select the small decorative icon set used by the renderer.\n *\n * Font availability cannot be queried through a terminal protocol. In auto\n * mode, we use fontconfig when the app is attached to a TTY and otherwise keep\n * rendering deterministic text-only output. KEYREPS_ICONS can force either\n * mode for terminals where fontconfig does not reflect the active font.\n */\nexport declare function createTerminalIcons(env?: NodeJS.ProcessEnv, isTTY?: boolean): TerminalIcons;\nexport declare function iconLabel(icon: string, label: string): string;\n"}},"icons.js":{"file":{"contents":"import { spawnSync } from \"node:child_process\";\nconst textIcons = {\n    nerdFont: false,\n    keyboard: \"\",\n    key: \"\",\n    target: \"\",\n    goal: \"\",\n    terminal: \"\",\n    hint: \"\",\n    complete: \"\",\n    submit: \"\",\n    reset: \"\",\n    quit: \"\",\n};\n// These are Font Awesome glyphs included by Nerd Fonts. Keep the set small so\n// icons act as landmarks instead of turning every label into decoration.\nconst nerdFontIcons = {\n    nerdFont: true,\n    keyboard: \"\\uf11c\",\n    key: \"\\uf084\",\n    target: \"\\uf140\",\n    goal: \"\\uf062\",\n    terminal: \"\\uf120\",\n    hint: \"\\uf0eb\",\n    complete: \"\\uf091\",\n    submit: \"\\uf00c\",\n    reset: \"\\uf021\",\n    quit: \"\\uf08b\",\n};\n/**\n * Select the small decorative icon set used by the renderer.\n *\n * Font availability cannot be queried through a terminal protocol. In auto\n * mode, we use fontconfig when the app is attached to a TTY and otherwise keep\n * rendering deterministic text-only output. KEYREPS_ICONS can force either\n * mode for terminals where fontconfig does not reflect the active font.\n */\nexport function createTerminalIcons(env = process.env, isTTY = process.stdout.isTTY === true) {\n    const preference = parsePreference(env.KEYREPS_ICONS);\n    if (preference === \"text\") {\n        return textIcons;\n    }\n    if (preference === \"nerd\") {\n        return nerdFontIcons;\n    }\n    return isTTY && hasNerdFont() ? nerdFontIcons : textIcons;\n}\nexport function iconLabel(icon, label) {\n    return icon.length > 0 ? `${icon} ${label}` : label;\n}\nfunction parsePreference(value) {\n    switch (value?.trim().toLowerCase()) {\n        case \"nerd\":\n        case \"nerdfont\":\n        case \"nerd-font\":\n        case \"1\":\n        case \"true\":\n            return \"nerd\";\n        case \"text\":\n        case \"ascii\":\n        case \"off\":\n        case \"0\":\n        case \"false\":\n            return \"text\";\n        default:\n            return \"auto\";\n    }\n}\nfunction hasNerdFont() {\n    try {\n        const result = spawnSync(\"fc-list\", [\":\", \"family\"], {\n            encoding: \"utf8\",\n            stdio: [\"ignore\", \"pipe\", \"ignore\"],\n            timeout: 250,\n        });\n        const families = typeof result.stdout === \"string\" ? result.stdout : \"\";\n        return result.status === 0 && /nerd\\s*font|\\bnf\\b/i.test(families);\n    }\n    catch {\n        return false;\n    }\n}\n//# sourceMappingURL=icons.js.map"}},"icons.js.map":{"file":{"contents":"{\"version\":3,\"file\":\"icons.js\",\"sourceRoot\":\"\",\"sources\":[\"../../src/icons.ts\"],\"names\":[],\"mappings\":\"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAgB/C,MAAM,SAAS,GAAkB;IAC/B,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,EAAE;IACZ,GAAG,EAAE,EAAE;IACP,MAAM,EAAE,EAAE;IACV,IAAI,EAAE,EAAE;IACR,QAAQ,EAAE,EAAE;IACZ,IAAI,EAAE,EAAE;IACR,QAAQ,EAAE,EAAE;IACZ,MAAM,EAAE,EAAE;IACV,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,EAAE;CACT,CAAC;AAEF,8EAA8E;AAC9E,yEAAyE;AACzE,MAAM,aAAa,GAAkB;IACnC,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,QAAQ;IAClB,GAAG,EAAE,QAAQ;IACb,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,QAAQ;IAClB,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,QAAQ;IACf,IAAI,EAAE,QAAQ;CACf,CAAC;AAIF;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAyB,OAAO,CAAC,GAAG,EACpC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI;IAErC,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACtD,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,OAAO,KAAK,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,KAAa;IACnD,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AACtD,CAAC;AAED,SAAS,eAAe,CAAC,KAAyB;IAChD,QAAQ,KAAK,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QACpC,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU,CAAC;QAChB,KAAK,WAAW,CAAC;QACjB,KAAK,GAAG,CAAC;QACT,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,KAAK,CAAC;QACX,KAAK,GAAG,CAAC;QACT,KAAK,OAAO;YACV,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE;YACnD,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;YACnC,OAAO,EAAE,GAAG;SACb,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC\"}"}},"input.d.ts":{"file":{"contents":"import type { Key } from \"./types.js\";\n/**\n * Turns raw terminal bytes into semantic key events.\n *\n * Escape sequences can arrive split across stdin chunks, so incomplete\n * sequences stay buffered until the next call to feed().\n */\nexport declare class InputDecoder {\n    private readonly utf8;\n    private buffer;\n    feed(chunk: Buffer | string): Key[];\n    flush(): Key[];\n    hasPending(): boolean;\n    flushPending(): Key[];\n    private parse;\n    private parseOne;\n    private parseOrdinaryCharacter;\n    private parseCsi;\n    private parseSs3;\n}\n"}},"input.js":{"file":{"contents":"import { StringDecoder } from \"node:string_decoder\";\nconst ESC = \"\\u001b\";\n/**\n * Turns raw terminal bytes into semantic key events.\n *\n * Escape sequences can arrive split across stdin chunks, so incomplete\n * sequences stay buffered until the next call to feed().\n */\nexport class InputDecoder {\n    utf8 = new StringDecoder(\"utf8\");\n    buffer = \"\";\n    feed(chunk) {\n        this.buffer += typeof chunk === \"string\" ? chunk : this.utf8.write(chunk);\n        return this.parse();\n    }\n    flush() {\n        this.buffer += this.utf8.end();\n        return this.flushPending();\n    }\n    hasPending() {\n        return this.buffer.length > 0;\n    }\n    flushPending() {\n        if (this.buffer.startsWith(ESC)) {\n            this.buffer = this.buffer.slice(1);\n            return [{ type: \"escape\" }, ...this.parse()];\n        }\n        return this.parse();\n    }\n    parse() {\n        const keys = [];\n        while (this.buffer.length > 0) {\n            const parsed = this.parseOne();\n            if (parsed === null) {\n                break;\n            }\n            keys.push(parsed.key);\n            this.buffer = this.buffer.slice(parsed.length);\n        }\n        return keys;\n    }\n    parseOne() {\n        const first = this.buffer[0];\n        if (first === undefined) {\n            return null;\n        }\n        if (first !== ESC) {\n            return this.parseOrdinaryCharacter();\n        }\n        if (this.buffer.length === 1) {\n            return null;\n        }\n        const second = this.buffer[1];\n        if (second === \"[\") {\n            return this.parseCsi();\n        }\n        if (second === \"O\") {\n            return this.parseSs3();\n        }\n        const altCharacter = Array.from(this.buffer.slice(1))[0];\n        if (altCharacter === undefined) {\n            return null;\n        }\n        if (/^[a-zA-Z]$/.test(altCharacter)) {\n            return {\n                key: { type: \"alt\", key: altCharacter.toLowerCase() },\n                length: 1 + altCharacter.length,\n            };\n        }\n        return { key: { type: \"escape\" }, length: 1 };\n    }\n    parseOrdinaryCharacter() {\n        const code = this.buffer.charCodeAt(0);\n        if (code === 0x7f || code === 0x08) {\n            return { key: { type: \"backspace\" }, length: 1 };\n        }\n        if (code === 0x0d || code === 0x0a) {\n            return { key: { type: \"enter\" }, length: 1 };\n        }\n        if (code === 0x09) {\n            return { key: { type: \"tab\" }, length: 1 };\n        }\n        if (code >= 0x01 && code <= 0x1a) {\n            return {\n                key: { type: \"control\", key: String.fromCharCode(code + 0x60) },\n                length: 1,\n            };\n        }\n        const character = Array.from(this.buffer)[0];\n        if (character === undefined) {\n            return null;\n        }\n        if (code < 0x20) {\n            return {\n                key: { type: \"unknown\", value: this.buffer[0] ?? \"\" },\n                length: 1,\n            };\n        }\n        return { key: { type: \"text\", value: character }, length: character.length };\n    }\n    parseCsi() {\n        const match = this.buffer.match(/^\\u001b\\[([0-9;?]*)([A-Za-z~])/);\n        if (match === null) {\n            return null;\n        }\n        const sequence = match[0];\n        const final = match[2];\n        if (final === undefined) {\n            return null;\n        }\n        const key = csiKey(sequence);\n        if (key !== null) {\n            return { key, length: sequence.length };\n        }\n        // Unknown CSI sequence. Treat the escape itself as Escape and let the\n        // remaining bytes be parsed normally rather than swallowing user input.\n        return { key: { type: \"escape\" }, length: 1 };\n    }\n    parseSs3() {\n        if (this.buffer.length < 3) {\n            return null;\n        }\n        const sequence = this.buffer.slice(0, 3);\n        const key = ss3Key(sequence);\n        if (key !== null) {\n            return { key, length: 3 };\n        }\n        return { key: { type: \"escape\" }, length: 1 };\n    }\n}\nfunction csiKey(sequence) {\n    switch (sequence) {\n        case `${ESC}[A`:\n        case `${ESC}[B`:\n            return { type: \"unknown\", value: sequence };\n        case `${ESC}[C`:\n            return { type: \"move\", direction: \"right\", by: \"char\" };\n        case `${ESC}[D`:\n            return { type: \"move\", direction: \"left\", by: \"char\" };\n        case `${ESC}[H`:\n            return { type: \"home\" };\n        case `${ESC}[F`:\n            return { type: \"end\" };\n        case `${ESC}[1~`:\n        case `${ESC}[7~`:\n            return { type: \"home\" };\n        case `${ESC}[4~`:\n        case `${ESC}[8~`:\n            return { type: \"end\" };\n        case `${ESC}[3~`:\n            return { type: \"delete\" };\n        case `${ESC}[5~`:\n            return { type: \"page\", direction: \"up\" };\n        case `${ESC}[6~`:\n            return { type: \"page\", direction: \"down\" };\n        case `${ESC}[1;5A`:\n        case `${ESC}[5A`:\n            return { type: \"page\", direction: \"up\" };\n        case `${ESC}[1;5B`:\n        case `${ESC}[5B`:\n            return { type: \"page\", direction: \"down\" };\n        case `${ESC}[1;5D`:\n        case `${ESC}[5D`:\n        case `${ESC}[1;3D`:\n        case `${ESC}[3D`:\n        case `${ESC}[1;6D`:\n        case `${ESC}[6D`:\n            return { type: \"move\", direction: \"left\", by: \"word\" };\n        case `${ESC}[1;5C`:\n        case `${ESC}[5C`:\n        case `${ESC}[1;3C`:\n        case `${ESC}[3C`:\n        case `${ESC}[1;6C`:\n        case `${ESC}[6C`:\n            return { type: \"move\", direction: \"right\", by: \"word\" };\n        default:\n            return null;\n    }\n}\nfunction ss3Key(sequence) {\n    switch (sequence) {\n        case `${ESC}OA`:\n        case `${ESC}OB`:\n            return { type: \"unknown\", value: sequence };\n        case `${ESC}OC`:\n            return { type: \"move\", direction: \"right\", by: \"char\" };\n        case `${ESC}OD`:\n            return { type: \"move\", direction: \"left\", by: \"char\" };\n        case `${ESC}OH`:\n            return { type: \"home\" };\n        case `${ESC}OF`:\n            return { type: \"end\" };\n        default:\n            return null;\n    }\n}\n//# sourceMappingURL=input.js.map"}},"input.js.map":{"file":{"contents":"{\"version\":3,\"file\":\"input.js\",\"sourceRoot\":\"\",\"sources\":[\"../../src/input.ts\"],\"names\":[],\"mappings\":\"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\"}"}},"render.d.ts":{"file":{"contents":"import { type GameState } from \"./game.js\";\nimport type { EditorState } from \"./editor.js\";\nexport declare function refreshTheme(): boolean;\nexport declare function renderGame(state: GameState): string;\nexport declare function renderEditorLine(editor: EditorState): string;\n"}},"render.js":{"file":{"contents":"import { challenges } from \"./challenges.js\";\nimport { currentChallenge, keyPerformance, shouldShowInstructions, } from \"./game.js\";\nimport { createThemeManager } from \"./theme.js\";\nimport { createTerminalIcons, iconLabel } from \"./icons.js\";\nconst ESC = \"\\u001b[\";\nconst RESET = `${ESC}0m`;\nconst CLEAR_SCREEN = `${ESC}2J${ESC}H`;\nconst PANEL_WIDTH = 76;\nconst PANEL_CONTENT_WIDTH = PANEL_WIDTH - 4;\nconst INPUT_WIDTH = PANEL_CONTENT_WIDTH - 2;\nconst INPUT_CONTENT_WIDTH = INPUT_WIDTH - 4;\nconst ANSI_SEQUENCE = /\\u001b\\[[0-9;?]*[ -/]*[@-~]/g;\nconst LEFT_PADDING = \"  \";\nconst GOAL_INDENT = \"  \";\nconst themeManager = createThemeManager();\nconst icons = createTerminalIcons();\nexport function refreshTheme() {\n    return themeManager.refresh();\n}\nexport function renderGame(state) {\n    if (state.finished) {\n        return renderFinished(state);\n    }\n    const challenge = currentChallenge(state);\n    if (challenge === undefined) {\n        return renderScreen([paint(\"error\", \"No challenge loaded.\", \"1\")]);\n    }\n    const lessonNumber = String(state.challengeIndex + 1).padStart(2, \"0\");\n    const challengeHeading = alignColumns(`${paint(\"accent\", lessonNumber, \"1\")}${paint(\"text\", ` · ${challenge.title}`, \"1\")}`, renderProgressLabel(state));\n    const challengeContent = [\n        challengeHeading,\n        \"\",\n        paint(\"accent\", \"GOAL\", \"1\"),\n        `${GOAL_INDENT}${paint(\"dim\", \"$\", \"2\")} ${paint(\"text\", challenge.target, \"2\")}`,\n        `${targetMarker(challenge.target, challenge.targetCursor)}`,\n        \"\",\n        ...renderEditorBlock(state.editor),\n        \"\",\n        ...renderChallengeGuidance(state, challenge),\n    ];\n    const lines = [\n        ...renderHeader(state),\n        \"\",\n        ...challengeContent,\n        \"\",\n        renderStatsStrip(state),\n        \"\",\n        renderControls(),\n        ...(state.notification === null ? [] : [\"\", \"\", renderNotification(state.notification)]),\n    ];\n    return renderScreen(lines);\n}\nfunction renderFinished(state) {\n    const idealTotal = challenges.reduce((total, challenge) => total + challenge.idealKeys, 0);\n    const totalPerformance = keyPerformance(state.totalKeys, idealTotal);\n    const result = [\n        `${paint(\"success\", \"All keyboard drills cleared.\", \"1\")}`,\n        \"\",\n        `${paint(\"text\", \"DRILLS COMPLETED\", \"2\")}  ${paint(\"text\", `${state.completed} / ${challenges.length}`, \"1\")}`,\n        `${paint(\"text\", \"KEY PRESSES\", \"2\")}       ${paint(performanceColor(totalPerformance), `${state.totalKeys} · ${performanceLabel(totalPerformance)}`, \"1\")}`,\n        state.lastKeyCount === null\n            ? \"\"\n            : `${paint(\"text\", \"LAST DRILL\", \"2\")}          ${paint(performanceColor(state.lastPerformance), `${state.lastKeyCount} ${keyPressLabel(state.lastKeyCount)} · ${performanceLabel(state.lastPerformance)}`, \"1\")}`,\n    ];\n    const lines = [\n        ...renderHeader(state, \"Learn to control the unix keyboard  /  COMPLETE\", true),\n        \"\",\n        ...panel(iconLabel(icons.complete, \"RUN COMPLETE\"), result),\n        \"\",\n        renderStatsStrip(state),\n        \"\",\n        `${paint(\"accent\", \"R\", \"1\")} play again   ${paint(\"text\", \"CTRL+C\", \"2\")} quit`,\n        ...(state.notification === null ? [] : [\"\", \"\", renderNotification(state.notification)]),\n    ];\n    return renderScreen(lines);\n}\nfunction renderScreen(lines) {\n    return `${CLEAR_SCREEN}${[\"\", ...lines].map((line) => `${LEFT_PADDING}${line}`).join(\"\\n\")}\\n`;\n}\nexport function renderEditorLine(editor) {\n    const characters = Array.from(editor.text);\n    const cursor = Math.max(0, Math.min(editor.cursor, characters.length));\n    const before = characters.slice(0, cursor).join(\"\");\n    const current = characters[cursor] ?? \" \";\n    const after = characters.slice(cursor + 1).join(\"\");\n    return `${before}${paint(\"accent\", current, \"7;1\")}${after}`;\n}\nfunction renderHeader(state, title = \"Learn to control the unix keyboard\", includeProgress = false) {\n    const drillLabel = state.finished\n        ? \"ALL DRILLS CLEARED\"\n        : `${String(state.challengeIndex + 1).padStart(2, \"0\")} / ${String(challenges.length).padStart(2, \"0\")}`;\n    const lines = [\n        headerLine(`${paintHeader(\"accent\", \"Key Reps\", \"1\")}${paintHeader(\"text\", ` · ${title}`, \"1\")}`, paintHeader(\"accent\", drillLabel, \"1\")),\n    ];\n    if (includeProgress) {\n        lines.push(alignColumns(\"\", `  ${renderProgressLabel(state)}`));\n    }\n    return lines;\n}\nfunction renderProgressLabel(state) {\n    const completed = Math.max(0, Math.min(state.completed, challenges.length));\n    const progress = progressBar(completed, challenges.length, 14);\n    const percent = Math.round((completed / challenges.length) * 100);\n    return `${paint(\"accent\", progress.filled, \"1\")}${paint(\"dim\", progress.empty, \"2\")}  ${paint(\"text\", `${percent}%`, \"2\")}`;\n}\nfunction renderStatsStrip(state) {\n    return backgroundLine(renderKeyStat(state));\n}\nfunction renderKeyStat(state) {\n    const challenge = currentChallenge(state);\n    const remainingKeys = challenge === undefined ? 0 : challenge.idealKeys - state.keyCount;\n    const performance = challenge !== undefined && state.keyCount >= challenge.idealKeys\n        ? keyPerformance(state.keyCount, challenge.idealKeys)\n        : null;\n    const color = performance === null ? \"text\" : performanceColor(performance);\n    return paint(color, `KEYS ${formatRemainingKeys(remainingKeys)}`, \"1\");\n}\nfunction formatRemainingKeys(value) {\n    return value >= 0 ? ` ${value}` : `${value}`;\n}\nfunction renderControls() {\n    return `${paint(\"success\", \"ENTER\", \"1\")} ${paint(\"text\", \"submit\", \"2\")}   ${paint(\"warning\", \"ESC\", \"1\")} ${paint(\"text\", \"reset\", \"2\")}   ${paint(\"error\", \"CTRL+C\", \"1\")} ${paint(\"text\", \"quit\", \"2\")}   ${paint(\"blue\", \"CTRL+UP\", \"1\")} ${paint(\"text\", \"next\")}   ${paint(\"blue\", \"CTRL+DOWN\", \"1\")} ${paint(\"text\", \"previous\")}`;\n}\nfunction renderNotification(notification) {\n    const color = performanceColor(notification.performance);\n    const icon = icons.submit.length > 0 ? icons.submit : \"✓\";\n    return `${paint(color, icon, \"1\")} ${paint(color, performanceLabel(notification.performance), \"1\")} ${paint(\"text\", notification.text, \"2\")}`;\n}\nfunction panel(title, contents) {\n    const titleText = `─ ${title} `;\n    const fill = Math.max(1, PANEL_WIDTH - 2 - visibleLength(titleText));\n    const top = `${border(\"╭\")}${paint(\"accent\", titleText, \"1\")}${border(\"─\".repeat(fill))}${border(\"╮\")}`;\n    const bottom = `${border(\"╰\")}${border(\"─\".repeat(PANEL_WIDTH - 2))}${border(\"╯\")}`;\n    return [top, ...contents.map(panelRow), bottom];\n}\nfunction panelRow(content) {\n    const padding = Math.max(0, PANEL_CONTENT_WIDTH - visibleLength(content));\n    return `${border(\"│\")} ${content}${\" \".repeat(padding)} ${border(\"│\")}`;\n}\nfunction backgroundLine(content) {\n    const theme = themeManager.current();\n    const padding = Math.max(0, PANEL_WIDTH - visibleLength(content));\n    return paintRaw(`${theme.colors.text};${theme.panelBackground}`, `${content}${\" \".repeat(padding)}`);\n}\nfunction headerLine(left, right) {\n    const spaces = Math.max(1, PANEL_WIDTH - visibleLength(left) - visibleLength(right));\n    const content = `${left}${paintHeader(\"text\", \" \".repeat(spaces), \"1\")}${right}`;\n    const padding = Math.max(0, PANEL_WIDTH - visibleLength(content));\n    return `${content}${paintHeader(\"text\", \" \".repeat(padding), \"1\")}`;\n}\nfunction paintHeader(role, value, attributes = \"\") {\n    const theme = themeManager.current();\n    const foreground = theme.colors[role];\n    const code = attributes.length > 0\n        ? `${attributes};${foreground};${theme.headerBackground}`\n        : `${foreground};${theme.headerBackground}`;\n    return paintRaw(code, value);\n}\nfunction border(value) {\n    return paint(\"border\", value, \"2\");\n}\nfunction renderEditorBlock(editor) {\n    const fill = Math.max(1, INPUT_WIDTH - 2);\n    const top = `${inputBorder(\"╭\")}${inputBorder(\"─\".repeat(fill))}${inputBorder(\"╮\")}`;\n    const value = `${paint(\"accent\", \"$\", \"1\")} ${renderEditorLine(editor)}`;\n    const padding = Math.max(0, INPUT_CONTENT_WIDTH - visibleLength(value));\n    const row = `${inputBorder(\"│\")} ${value}${\" \".repeat(padding)} ${inputBorder(\"│\")}`;\n    const bottom = `${inputBorder(\"╰\")}${inputBorder(\"─\".repeat(INPUT_WIDTH - 2))}${inputBorder(\"╯\")}`;\n    return [top, row, bottom];\n}\nfunction inputBorder(value, attributes = \"2\") {\n    return paint(\"accent\", value, attributes);\n}\nfunction targetMarker(target, cursor) {\n    const targetLength = Array.from(target).length;\n    const offset = Math.max(0, Math.min(cursor, targetLength));\n    const marker = icons.goal.length > 0\n        ? iconLabel(icons.goal, \"cursor\")\n        : \"^ cursor\";\n    return `${GOAL_INDENT}  ${\" \".repeat(offset)}${paint(\"dim\", marker, \"2\")}`;\n}\nfunction progressBar(completed, total, width) {\n    if (total <= 0) {\n        return { filled: \"\", empty: \"░\".repeat(width) };\n    }\n    const filledCount = Math.round((completed / total) * width);\n    return {\n        filled: \"█\".repeat(filledCount),\n        empty: \"░\".repeat(Math.max(0, width - filledCount)),\n    };\n}\nfunction alignColumns(left, right) {\n    const spaces = Math.max(1, PANEL_WIDTH - visibleLength(left) - visibleLength(right));\n    return `${left}${\" \".repeat(spaces)}${right}`;\n}\nfunction renderChallengeGuidance(state, challenge) {\n    const expert = challenge.tier === \"expert\";\n    const revealed = shouldShowInstructions(state, challenge);\n    if (expert && !revealed) {\n        return [\n            paint(\"text\", \"EXPERT · instructions hidden\", \"1\"),\n            paint(\"dim\", \"Solve from memory. Guidance appears after a wasted key press.\", \"2\"),\n        ];\n    }\n    const focus = `${paint(\"accent\", challenge.focusLabel, \"1\")} ${paint(\"text\", challenge.focusDescription, \"2\")}`;\n    const guidance = [focus, ...renderInstructionList(challenge.instructions)];\n    if (expert) {\n        guidance.unshift(paint(\"warning\", \"Guidance unlocked after a wasted key press.\", \"2\"), \"\");\n    }\n    return guidance;\n}\nfunction renderInstructionList(instructions) {\n    return instructions.flatMap((instruction) => wrapText(stripTrailingPunctuation(instruction), PANEL_CONTENT_WIDTH - 4).map((line, index) => `${index === 0 ? `${paint(\"accent\", \"•\", \"1\")} ` : \"\"}${line}`));\n}\nfunction stripTrailingPunctuation(value) {\n    return value.replace(/[\\p{P}]+$/gu, \"\");\n}\nfunction wrapText(value, width) {\n    const words = value.trim().split(/\\s+/).filter(Boolean);\n    if (words.length === 0) {\n        return [\"\"];\n    }\n    const lines = [];\n    let current = \"\";\n    for (const word of words) {\n        if (current.length === 0) {\n            current = word;\n            continue;\n        }\n        if (current.length + 1 + word.length <= width) {\n            current += ` ${word}`;\n            continue;\n        }\n        lines.push(current);\n        current = word;\n    }\n    if (current.length > 0) {\n        lines.push(current);\n    }\n    return lines;\n}\nfunction visibleLength(value) {\n    return Array.from(value.replace(ANSI_SEQUENCE, \"\")).length;\n}\nfunction paint(role, value, attributes = \"\") {\n    const theme = themeManager.current();\n    const code = attributes.length > 0 ? `${attributes};${theme.colors[role]}` : theme.colors[role];\n    return paintRaw(code, value);\n}\nfunction paintRaw(code, value) {\n    return `${ESC}${code}m${value}${RESET}`;\n}\nfunction performanceColor(performance) {\n    switch (performance) {\n        case \"perfect\":\n            return \"success\";\n        case \"close\":\n            return \"warning\";\n        case \"poor\":\n            return \"error\";\n        default:\n            return \"warning\";\n    }\n}\nfunction performanceLabel(performance) {\n    switch (performance) {\n        case \"perfect\":\n            return \"Perfect\";\n        case \"close\":\n            return \"Close\";\n        case \"poor\":\n            return \"Too many\";\n        default:\n            return \"n/a\";\n    }\n}\nfunction keyPressLabel(count) {\n    return count === 1 ? \"key press\" : \"key presses\";\n}\n//# sourceMappingURL=render.js.map"}},"render.js.map":{"file":{"contents":"{\"version\":3,\"file\":\"render.js\",\"sourceRoot\":\"\",\"sources\":[\"../../src/render.ts\"],\"names\":[],\"mappings\":\"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\"}"}},"theme.d.ts":{"file":{"contents":"export type ThemeColor = \"accent\" | \"blue\" | \"text\" | \"muted\" | \"dim\" | \"border\" | \"warning\" | \"success\" | \"error\" | \"info\" | \"secondary\";\nexport interface TerminalTheme {\n    source: \"omarchy\" | \"ansi\";\n    colors: Record<ThemeColor, string>;\n    panelBackground: string;\n    headerText: string;\n    headerBackground: string;\n}\nexport interface ThemeManager {\n    current(): TerminalTheme;\n    refresh(): boolean;\n}\nexport declare function createThemeManager(): ThemeManager;\nexport declare function loadTerminalTheme(): TerminalTheme;\n"}},"theme.js":{"file":{"contents":"import { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nconst fallbackTheme = {\n    source: \"ansi\",\n    colors: {\n        accent: \"36\",\n        blue: \"34\",\n        text: \"37\",\n        muted: \"37\",\n        dim: \"37\",\n        border: \"90\",\n        warning: \"33\",\n        success: \"32\",\n        error: \"31\",\n        info: \"36\",\n        secondary: \"35\",\n    },\n    panelBackground: \"100\",\n    headerText: \"97\",\n    headerBackground: \"44\",\n};\nexport function createThemeManager() {\n    let activeTheme = fallbackTheme;\n    let activeSignature;\n    const refresh = () => {\n        const path = findOmarchyColorsFile();\n        if (path === undefined) {\n            // Keep the last good theme if Omarchy is midway through replacing it.\n            return false;\n        }\n        const signature = fileSignature(path);\n        if (signature === undefined || signature === activeSignature) {\n            return false;\n        }\n        const nextTheme = readThemeFile(path);\n        if (nextTheme === undefined) {\n            // A partially-written file is retried on the next poll.\n            return false;\n        }\n        activeTheme = nextTheme;\n        activeSignature = signature;\n        return true;\n    };\n    refresh();\n    return {\n        current: () => activeTheme,\n        refresh,\n    };\n}\nexport function loadTerminalTheme() {\n    const path = findOmarchyColorsFile();\n    return path === undefined ? fallbackTheme : readThemeFile(path) ?? fallbackTheme;\n}\nfunction findOmarchyColorsFile() {\n    const stateHome = process.env.XDG_STATE_HOME || join(homedir(), \".local\", \"state\");\n    const candidates = [\n        process.env.KEYREPS_THEME_FILE,\n        join(stateHome, \"omarchy\", \"current\", \"theme\", \"colors.toml\"),\n        join(homedir(), \".config\", \"omarchy\", \"current\", \"theme\", \"colors.toml\"),\n    ];\n    return candidates.find((candidate) => candidate !== undefined && candidate.length > 0 && existsSync(candidate));\n}\nfunction fileSignature(path) {\n    try {\n        const stats = statSync(path);\n        return `${path}:${stats.dev}:${stats.ino}:${stats.mtimeMs}:${stats.size}`;\n    }\n    catch {\n        return undefined;\n    }\n}\nfunction readThemeFile(path) {\n    try {\n        const colors = parseColorsToml(readFileSync(path, \"utf8\"));\n        if (Object.keys(colors).length === 0) {\n            return undefined;\n        }\n        return {\n            source: \"omarchy\",\n            colors: {\n                accent: foreground(colors.accent ?? colors.yellow ?? colors.cyan, fallbackTheme.colors.accent),\n                blue: foreground(colors.blue, fallbackTheme.colors.blue),\n                text: foreground(colors.foreground ?? colors.bright_foreground, fallbackTheme.colors.text),\n                muted: foreground(colors.muted ?? colors.dark_foreground ?? colors.color8, fallbackTheme.colors.muted),\n                dim: foreground(colors.dark_foreground ?? colors.muted ?? colors.color8, fallbackTheme.colors.dim),\n                border: foreground(colors.border ?? colors.muted ?? colors.color8, fallbackTheme.colors.border),\n                warning: foreground(colors.yellow ?? colors.orange ?? colors.accent, fallbackTheme.colors.warning),\n                success: foreground(colors.green ?? colors.accent, fallbackTheme.colors.success),\n                error: foreground(colors.red ?? colors.accent, fallbackTheme.colors.error),\n                info: foreground(colors.cyan ?? colors.blue ?? colors.accent, fallbackTheme.colors.info),\n                secondary: foreground(colors.magenta ?? colors.blue ?? colors.accent, fallbackTheme.colors.secondary),\n            },\n            panelBackground: background(colors.lighter_background ?? colors.background, fallbackTheme.panelBackground),\n            headerText: foreground(colors.accent ?? colors.foreground, fallbackTheme.headerText),\n            headerBackground: background(colors.selection ?? colors.lighter_background ?? colors.background, fallbackTheme.headerBackground),\n        };\n    }\n    catch {\n        return undefined;\n    }\n}\nfunction parseColorsToml(value) {\n    const colors = {};\n    const colorPattern = /^\\s*([A-Za-z_][A-Za-z0-9_-]*)\\s*=\\s*[\"']?(#[0-9a-fA-F]{3,6})/;\n    for (const line of value.split(/\\r?\\n/)) {\n        const match = colorPattern.exec(line);\n        if (match?.[1] !== undefined && match[2] !== undefined) {\n            colors[match[1]] = match[2];\n        }\n    }\n    return colors;\n}\nfunction foreground(value, fallback) {\n    return value === undefined ? fallback : hexToSgr(value, false) ?? fallback;\n}\nfunction background(value, fallback) {\n    return value === undefined ? fallback : hexToSgr(value, true) ?? fallback;\n}\nfunction hexToSgr(value, isBackground) {\n    const hex = value.length === 4\n        ? value\n            .slice(1)\n            .split(\"\")\n            .map((digit) => `${digit}${digit}`)\n            .join(\"\")\n        : value.slice(1);\n    if (!/^[0-9a-fA-F]{6}$/.test(hex)) {\n        return undefined;\n    }\n    const red = Number.parseInt(hex.slice(0, 2), 16);\n    const green = Number.parseInt(hex.slice(2, 4), 16);\n    const blue = Number.parseInt(hex.slice(4, 6), 16);\n    return `${isBackground ? \"48\" : \"38\"};2;${red};${green};${blue}`;\n}\n//# sourceMappingURL=theme.js.map"}},"theme.js.map":{"file":{"contents":"{\"version\":3,\"file\":\"theme.js\",\"sourceRoot\":\"\",\"sources\":[\"../../src/theme.ts\"],\"names\":[],\"mappings\":\"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\"}"}},"types.d.ts":{"file":{"contents":"export type Direction = \"left\" | \"right\";\nexport type PageDirection = \"up\" | \"down\";\nexport type Key = {\n    type: \"text\";\n    value: string;\n} | {\n    type: \"control\";\n    key: string;\n} | {\n    type: \"alt\";\n    key: string;\n} | {\n    type: \"move\";\n    direction: Direction;\n    by: \"char\" | \"word\";\n} | {\n    type: \"home\";\n} | {\n    type: \"end\";\n} | {\n    type: \"backspace\";\n} | {\n    type: \"delete\";\n} | {\n    type: \"enter\";\n} | {\n    type: \"escape\";\n} | {\n    type: \"tab\";\n} | {\n    type: \"page\";\n    direction: PageDirection;\n} | {\n    type: \"unknown\";\n    value: string;\n};\n"}},"types.js":{"file":{"contents":"export {};\n//# sourceMappingURL=types.js.map"}},"types.js.map":{"file":{"contents":"{\"version\":3,\"file\":\"types.js\",\"sourceRoot\":\"\",\"sources\":[\"../../src/types.ts\"],\"names\":[],\"mappings\":\"\"}"}}}}}}}}}