{
  "name": "power-claude",
  "displayName": "Power Claude",
  "description": "Spend less, run faster, never stall on Claude Code — save $115+/mo vs Max. Local orchestration via official CLI transport; auto-resume, Token Saver, multi-account continuity. Free to start.",
  "version": "3.0.88",
  "bin": {
    "power-claude": "./bin/power-claude-cli.js",
    "pc": "./bin/power-claude-cli.js"
  },
  "files": [
    "bin/",
    "data/runtime/engine.enc",
    "data/brand-stamp/",
    "data/llm-usage/",
    "data/vendor/",
    "out/extension.js",
    "out/extension.js.sha256",
    "out/uninstall-hook.js",
    "media/icon.png",
    "media/icon.svg",
    "media/icon-activity.svg",
    "media/marketplace/",
    "media/walkthrough/",
    "media/brand/power-claude/badge.svg",
    "media/brand/power-claude/badge.css",
    "media/brand/power-claude/badge-template.html",
    "LICENSE",
    "README.md",
    "CHANGELOG.md"
  ],
  "publisher": "neural-llm",
  "author": {
    "name": "Neural-LLM",
    "email": "support@neural-llm.com",
    "url": "https://neural-llm.com"
  },
  "license": "SEE LICENSE IN LICENSE",
  "icon": "media/icon.png",
  "repository": {
    "type": "git",
    "url": "https://github.com/neural-llm-io/power-claude.git"
  },
  "homepage": "https://neural-llm.com/power-claude",
  "bugs": {
    "url": "https://github.com/neural-llm-io/power-claude/issues",
    "email": "support@neural-llm.com"
  },
  "keywords": [
    "claude-code",
    "claude",
    "anthropic",
    "ai-agent",
    "ai-coding-agent",
    "coding-agent",
    "ai-coding-assistant",
    "ai-coding",
    "agentic-ai",
    "ai-assistant",
    "ai-pair-programming",
    "cursor",
    "windsurf",
    "llm",
    "subagent",
    "ai-tools",
    "ai-productivity",
    "auto-resume",
    "claude-max",
    "claude-pro",
    "cost-tracking",
    "token-analytics",
    "parallel-dispatch",
    "session-recovery",
    "worktree",
    "orchestration",
    "claude-code-cli",
    "local-first",
    "job-scheduler",
    "official-cli"
  ],
  "engines": {
    "vscode": "^1.80.0",
    "node": ">=20.0.0"
  },
  "categories": [
    "AI",
    "Machine Learning",
    "Visualization"
  ],
  "qna": "marketplace",
  "pricing": "Free",
  "galleryBanner": {
    "color": "#1e1e2e",
    "theme": "dark"
  },
  "badges": [
    {
      "url": "https://img.shields.io/visual-studio-marketplace/v/neural-llm.power-claude.svg?style=flat-square&label=VS+Code+Marketplace&logo=visualstudiocode&logoColor=white&color=f26522",
      "href": "https://marketplace.visualstudio.com/items?itemName=neural-llm.power-claude",
      "description": "VS Code Marketplace"
    },
    {
      "url": "https://img.shields.io/open-vsx/v/neural-llm/power-claude.svg?style=flat-square&label=Open+VSX&logo=vscodium&logoColor=white&color=a60ee5",
      "href": "https://open-vsx.org/extension/neural-llm/power-claude",
      "description": "Open VSX (Cursor · VSCodium · Gitpod)"
    },
    {
      "url": "https://img.shields.io/visual-studio-marketplace/i/neural-llm.power-claude.svg?style=flat-square&label=installs&color=4ec9b0",
      "href": "https://marketplace.visualstudio.com/items?itemName=neural-llm.power-claude",
      "description": "Install count"
    }
  ],
  "capabilities": {
    "virtualWorkspaces": {
      "supported": false,
      "description": "Power Claude needs local filesystem access to ~/.claude and ~/.power-claude and runs a local rotation proxy, so it cannot operate in a virtual (remote-only) workspace."
    },
    "untrustedWorkspaces": {
      "supported": true,
      "description": "Power Claude operates only on your ~/.claude and ~/.power-claude state and never executes workspace code, so it runs fully in Restricted Mode."
    }
  },
  "extensionKind": [
    "workspace"
  ],
  "main": "./out/extension.js",
  "activationEvents": [
    "onStartupFinished",
    "onUri",
    "onView:powerClaude.tree",
    "onView:powerClaude.sessionExplorer",
    "onView:powerClaude.filesTouched",
    "onView:powerClaude.dashboard"
  ],
  "contributes": {
    "viewsContainers": {
      "activitybar": [
        {
          "id": "powerClaude",
          "title": "Power Claude",
          "icon": "media/icon-activity.svg"
        }
      ],
      "secondarySidebar": [
        {
          "id": "powerClaudeSecondary",
          "title": "Power Claude",
          "icon": "media/icon-activity.svg"
        }
      ]
    },
    "views": {
      "powerClaude": [
        {
          "id": "powerClaude.tree",
          "name": "Profiles",
          "icon": "media/icon-activity.svg"
        },
        {
          "id": "powerClaude.sessionExplorer",
          "name": "Session Explorer",
          "contextualTitle": "Sessions",
          "icon": "media/icon-activity.svg"
        },
        {
          "id": "powerClaude.filesTouched",
          "name": "Files Touched",
          "contextualTitle": "Files Touched in Selected Session",
          "icon": "media/icon-activity.svg"
        },
        {
          "id": "powerClaude.sessionLauncher",
          "name": "Session Worktrees",
          "contextualTitle": "Session Worktrees",
          "icon": "media/icon-activity.svg",
          "when": "powerClaude.hasSessionWorktrees"
        }
      ],
      "powerClaudeSecondary": [
        {
          "id": "powerClaude.dashboard",
          "name": "Dashboard",
          "type": "webview",
          "icon": "media/icon-activity.svg"
        }
      ]
    },
    "viewsWelcome": [
      {
        "view": "powerClaude.tree",
        "contents": "Power Claude rotates across your Claude accounts so you keep coding through rate limits.\n[Get Started](command:powerClaude.showWelcome)\n[Documentation](command:powerClaude.openDocs)\nThen add an account from the terminal with `pc add`."
      }
    ],
    "walkthroughs": [
      {
        "id": "powerClaude.gettingStarted",
        "title": "Get Started with Power Claude",
        "description": "Multi-account continuity for Claude Code — install, activate, add accounts, enable Auto-Rotation Engine (recommended, after warning) or keep Manual, safety controls. Step bodies from media/walkthrough/*.md (npm run emit:onboarding).",
        "steps": [
          {
            "id": "install",
            "title": "Install Power Claude",
            "description": "Add the extension (VS Code / Cursor) or the CLI (npm).",
            "media": {
              "markdown": "media/walkthrough/install.md"
            }
          },
          {
            "id": "activate",
            "title": "Activate your license",
            "description": "Paste your key to unlock multi-account features and Power mode.",
            "media": {
              "markdown": "media/walkthrough/activate.md"
            }
          },
          {
            "id": "add-account",
            "title": "Add your Claude account(s)",
            "description": "Link one or more Claude logins you own.",
            "media": {
              "markdown": "media/walkthrough/add-account.md"
            }
          },
          {
            "id": "auto-rotation-engine",
            "title": "Auto-Rotation Engine (recommended)",
            "description": "Preferred for multi-account continuity. OFF until you acknowledge the grey-area warning — or keep Manual.",
            "media": {
              "markdown": "media/walkthrough/auto-rotation-engine.md"
            },
            "completionEvents": [
              "onCommand:powerClaude.autoRotationEngine.enable",
              "onCommand:powerClaude.autoRotationEngine.chooseManual"
            ]
          },
          {
            "id": "rotate",
            "title": "Manual rotate & engine process",
            "description": "Manual switch anytime; start engine process only if you opted in.",
            "media": {
              "markdown": "media/walkthrough/rotate.md"
            }
          },
          {
            "id": "tailor",
            "title": "Tailor Power Claude to you",
            "description": "Pick how hands-on you want it — then let it fine-tune itself over time.",
            "media": {
              "markdown": "media/walkthrough/tailor.md"
            }
          },
          {
            "id": "safety",
            "title": "Everyday safety controls",
            "description": "Pause, resume, recover — without losing any data.",
            "media": {
              "markdown": "media/walkthrough/safety.md"
            }
          },
          {
            "id": "objective-mode",
            "title": "Objective Mode (on by default)",
            "description": "Multi-step requests run to completion — hands-free, with safety rails.",
            "media": {
              "markdown": "media/walkthrough/objective-mode.md"
            }
          },
          {
            "id": "optimize",
            "title": "Optimize your setup",
            "description": "One-click toggles — auto-resume and experimental Detached Sessions (Pro).",
            "media": {
              "markdown": "media/walkthrough/optimize.md"
            }
          },
          {
            "id": "learn-more",
            "title": "Go deeper",
            "description": "Power Mode, auto-resume, token saver, and the full docs.",
            "media": {
              "markdown": "media/walkthrough/learn-more.md"
            }
          }
        ]
      }
    ],
    "commands": [
      {
        "command": "powerClaude.refresh",
        "title": "Power Claude: Refresh",
        "icon": "$(refresh)"
      },
      {
        "command": "powerClaude.leaveReview",
        "title": "Power Claude: Leave a Review",
        "icon": "$(star)"
      },
      {
        "command": "powerClaude.sessionActions.menu",
        "title": "Power Claude: Session Actions",
        "icon": "$(pulse)"
      },
      {
        "command": "powerClaude.showWelcome",
        "title": "Power Claude: Run Setup Guide (Onboarding)",
        "icon": "$(rocket)"
      },
      {
        "command": "powerClaude.openDocs",
        "title": "Power Claude: Open Documentation",
        "icon": "$(book)"
      },
      {
        "command": "powerClaude.tokenSaver.open",
        "title": "Power Claude: Token Saver (optimizer slider)",
        "icon": "$(settings-gear)"
      },
      {
        "command": "powerClaude.openSettings",
        "title": "Power Claude: Open Settings",
        "category": "Power Claude",
        "icon": "$(gear)"
      },
      {
        "command": "powerClaude.calibrate.openModal",
        "title": "Power Claude: Calibrate a setting (Interactive Mode)",
        "icon": "$(sparkle)"
      },
      {
        "command": "powerClaude.workflowFlow.open",
        "title": "Flow Explorer",
        "icon": "$(type-hierarchy)"
      },
      {
        "command": "powerClaude.flowExplorer.open",
        "title": "Power Claude: Flow Explorer",
        "icon": "$(type-hierarchy)"
      },
      {
        "command": "powerClaude.flowExplorer.openForSession",
        "title": "Open Flow Explorer",
        "icon": "$(type-hierarchy)"
      },
      {
        "command": "powerClaude.resumeStalledSessions",
        "title": "Power Claude: Finish Stalled Sessions",
        "icon": "$(run-all)"
      },
      {
        "command": "powerClaude.crossModelSessions",
        "title": "Power Claude: Cross-Model Hanging Sessions",
        "icon": "$(git-compare)"
      },
      {
        "command": "powerClaude.statusLegend",
        "title": "Power Claude: Show Status Color Legend",
        "icon": "$(symbol-color)"
      },
      {
        "command": "powerClaude.autoResumeAudit",
        "title": "Power Claude: Auto-Resume Audit",
        "icon": "$(history)"
      },
      {
        "command": "powerClaude.updateNotifier.checkNow",
        "title": "Power Claude: Check for Updates"
      },
      {
        "command": "powerClaude.updateNotifier.resetSuppression",
        "title": "Power Claude: Reset Update Notifier (re-enable prompts)"
      },
      {
        "command": "powerClaude.showWebview",
        "title": "Power Claude: Show Dashboard"
      },
      {
        "command": "powerClaude.openDataFile",
        "title": "Power Claude: Open data.json"
      },
      {
        "command": "powerClaude.rescan",
        "title": "Power Claude: Rescan claude-auth (rebuild data.json)",
        "icon": "$(play)"
      },
      {
        "command": "powerClaude.linkAccount",
        "title": "Power Claude: Link Account (open OAuth browser)"
      },
      {
        "command": "powerClaude.refreshAccount",
        "title": "Power Claude: Refresh Account (force OAuth refresh)"
      },
      {
        "command": "powerClaude.reloginAccount",
        "title": "Power Claude: Re-login Account (start OAuth)"
      },
      {
        "command": "powerClaude.repairAccount",
        "title": "Power Claude: Repair Account Identity (verify token → real account)"
      },
      {
        "command": "powerClaude.verifyIdentities",
        "title": "Power Claude: Verify All Account Identities & Refresh Quota"
      },
      {
        "command": "powerClaude.pinAccount",
        "title": "Power Claude: Pin Account"
      },
      {
        "command": "powerClaude.unpinAccount",
        "title": "Power Claude: Unpin Account"
      },
      {
        "command": "powerClaude.activateAccount",
        "title": "Power Claude: Activate Account"
      },
      {
        "command": "powerClaude.removeAccount",
        "title": "Power Claude: Remove Account"
      },
      {
        "command": "powerClaude.exportAccounts",
        "title": "Power Claude: Export Profiles (to a file)",
        "icon": "$(export)"
      },
      {
        "command": "powerClaude.importAccounts",
        "title": "Power Claude: Import Profiles (from a file)",
        "icon": "$(import)"
      },
      {
        "command": "powerClaude.stopSessionAutoResume",
        "title": "Power Claude: Stop Session Auto-Resume",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.resumeSessionAutoResume",
        "title": "Power Claude: Resume Session Auto-Resume",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.reloginAllExpired",
        "title": "Power Claude: Re-login ALL Expired Profiles"
      },
      {
        "command": "powerClaude.forceHeal",
        "title": "Power Claude: Force Heal All Profiles"
      },
      {
        "command": "powerClaude.toggleRotation",
        "title": "Power Claude: Toggle Rotation Master Switch"
      },
      {
        "command": "powerClaude.toggleThrottleOnly",
        "title": "Power Claude: Toggle Throttle-Only Mode"
      },
      {
        "command": "powerClaude.openActivity",
        "title": "Power Claude: Open Activity Feed"
      },
      {
        "command": "powerClaude.copyCommand",
        "title": "Power Claude: Copy CLI Command"
      },
      {
        "command": "powerClaude.openClaudeAi",
        "title": "Power Claude: Open claude.ai for this account"
      },
      {
        "command": "powerClaude.health",
        "title": "Power Claude: Run claude-health"
      },
      {
        "command": "powerClaude.profiles",
        "title": "Power Claude: List Profiles"
      },
      {
        "command": "powerClaude.tailHandler",
        "title": "Power Claude: Tail Rate-Limit Logs"
      },
      {
        "command": "powerClaude.selfDiagnostics",
        "title": "Power Claude: Self-Diagnostics (auto-resume report)",
        "category": "Power Claude",
        "icon": "$(beaker)"
      },
      {
        "command": "powerClaude.runCommand",
        "title": "Power Claude: Run CLI Command"
      },
      {
        "command": "powerClaude.openSnapshot",
        "title": "Power Claude: Open History Snapshot"
      },
      {
        "command": "powerClaude.openGitCommit",
        "title": "Power Claude: Open Git Commit"
      },
      {
        "command": "powerClaude.openAccountLogs",
        "title": "Power Claude: Show Per-Account Handler Events"
      },
      {
        "command": "powerClaude.snapshotSessions",
        "title": "Power Claude: Snapshot Active Sessions"
      },
      {
        "command": "powerClaude.resumeSavedSessions",
        "title": "Power Claude: Resume Saved Sessions"
      },
      {
        "command": "powerClaude.openSessionTab",
        "title": "Power Claude: Open Session Tab (no prompt injection)"
      },
      {
        "command": "powerClaude.searchOpenTabsQuickPick",
        "title": "Power Claude: Search Open Session Tabs",
        "icon": "$(search)"
      },
      {
        "command": "powerClaude.warmAllSessionTabs",
        "title": "Power Claude: Load All Session Tabs",
        "icon": "$(run-all)"
      },
      {
        "command": "powerClaude.setSessionTitle",
        "title": "Power Claude: Rename Session"
      },
      {
        "command": "powerClaude.openMessageTimeline",
        "title": "Power Claude: Show Message Timeline (your messages, with times)",
        "icon": "$(history)"
      },
      {
        "command": "powerClaude.restoreClaudeCodeToStock",
        "title": "Power Claude: Restore Claude Code to Stock (remove all enhancements)"
      },
      {
        "command": "powerClaude.enableClaudeCodeMods",
        "title": "Power Claude: Enable Claude Code Enhancements"
      },
      {
        "command": "powerClaude.resumeSessionTab",
        "title": "Power Claude: Resume Session Tab (inject wake-up prompt)"
      },
      {
        "command": "powerClaude.resumeSessionInTerminal",
        "title": "Power Claude: Resume Session in Terminal (CLI mode)"
      },
      {
        "command": "powerClaude.clearSavedSessions",
        "title": "Power Claude: Clear Saved Sessions Snapshot"
      },
      {
        "command": "powerClaude.switchToSoonest",
        "title": "Power Claude: Switch Active Account to Soonest-Recovering"
      },
      {
        "command": "powerClaude.toggleAutoSelectSoonest",
        "title": "Power Claude: Toggle Auto-Select Soonest Account"
      },
      {
        "command": "powerClaude.toggleAutoResumeSessions",
        "title": "Power Claude: Toggle Auto-Resume Sessions on Startup"
      },
      {
        "command": "powerClaude.toggleDetachedSessions",
        "title": "Power Claude: Toggle Detached Sessions (experimental)"
      },
      {
        "command": "powerClaude.detached.run",
        "title": "Power Claude: Run Session Detached (keeps running on refresh)"
      },
      {
        "command": "powerClaude.detached.stop",
        "title": "Power Claude: Stop Detached Session"
      },
      {
        "command": "powerClaude.detached.list",
        "title": "Power Claude: List Detached Sessions"
      },
      {
        "command": "powerClaude.runSetupWizard",
        "title": "Power Claude: Run Setup & Optimize Wizard"
      },
      {
        "command": "powerClaude.toggleYourRequestBanner",
        "title": "Power Claude: Toggle Your Request Banner"
      },
      {
        "command": "powerClaude.openUsageWebview",
        "title": "Power Claude: Open LLM Usage Dashboard"
      },
      {
        "command": "powerClaude.refreshLlmUsage",
        "title": "Power Claude: Refresh Usage Data"
      },
      {
        "command": "powerClaude.openLlmUsagePrices",
        "title": "Power Claude: Open prices.json"
      },
      {
        "command": "powerClaude.openLlmUsageData",
        "title": "Power Claude: Open data.json (LLM usage)"
      },
      {
        "command": "powerClaude.openLlmUsageAnchors",
        "title": "Power Claude: Open anchors.json (rate-limit cap-hits)"
      },
      {
        "command": "powerClaude.saveLlmUsagePrices",
        "title": "Power Claude: Save Usage Prices"
      },
      {
        "command": "powerClaude.resetLlmUsagePrices",
        "title": "Power Claude: Reset LLM Usage prices to Anthropic defaults"
      },
      {
        "command": "powerClaude.addLlmUsageOverride",
        "title": "Power Claude: Add LLM Usage account override"
      },
      {
        "command": "powerClaude.removeLlmUsageOverride",
        "title": "Power Claude: Remove Usage Account Override"
      },
      {
        "command": "powerClaude.changeLlmUsageAccountPlan",
        "title": "Power Claude: Change plan for LLM Usage account"
      },
      {
        "command": "powerClaude.searchSessions",
        "title": "Power Claude: Search Sessions",
        "icon": "$(search)"
      },
      {
        "command": "powerClaude.sessionResume",
        "title": "Resume",
        "icon": "$(debug-start)"
      },
      {
        "command": "powerClaude.sessionResumeWithPrompt",
        "title": "Resume with prompt…",
        "icon": "$(edit)"
      },
      {
        "command": "powerClaude.openSessionDetail",
        "title": "Open Detail",
        "icon": "$(open-preview)"
      },
      {
        "command": "powerClaude.openSessionGraph",
        "title": "Show Graph",
        "icon": "$(graph)"
      },
      {
        "command": "powerClaude.copySessionId",
        "title": "Copy Session Id",
        "icon": "$(clippy)"
      },
      {
        "command": "powerClaude.copySessionName",
        "title": "Copy Session Name",
        "icon": "$(clippy)"
      },
      {
        "command": "powerClaude.copySessionFirstPrompt",
        "title": "Copy Session Prompt Text",
        "icon": "$(clippy)"
      },
      {
        "command": "powerClaude.openMultiSessionGraph",
        "title": "Show Graph (Selected Sessions)",
        "icon": "$(graph)"
      },
      {
        "command": "powerClaude.openPreCommitReview",
        "title": "Pre-commit Review",
        "icon": "$(diff-multiple)"
      },
      {
        "command": "powerClaude.addSessionTag",
        "title": "Add Tag",
        "icon": "$(tag)"
      },
      {
        "command": "powerClaude.removeSessionTag",
        "title": "Remove Tag"
      },
      {
        "command": "powerClaude.togglePinSession",
        "title": "Pin / Unpin Session",
        "icon": "$(pin)"
      },
      {
        "command": "powerClaude.setSessionStatus",
        "title": "Set Session Status…",
        "icon": "$(tag)"
      },
      {
        "command": "powerClaude.archiveSession",
        "title": "Archive Session",
        "icon": "$(archive)"
      },
      {
        "command": "powerClaude.unarchiveSession",
        "title": "Unarchive Session"
      },
      {
        "command": "powerClaude.exportSession",
        "title": "Export Session (JSON or Markdown)"
      },
      {
        "command": "powerClaude.openTouchedFile",
        "title": "Open"
      },
      {
        "command": "powerClaude.diffTouchedFile",
        "title": "Diff vs Snapshot"
      },
      {
        "command": "powerClaude.copyTouchedFilePath",
        "title": "Copy Path"
      },
      {
        "command": "powerClaude.installTimelineHook",
        "title": "Power Claude: Install Timeline Hook (track Claude edits in VS Code Timeline)"
      },
      {
        "command": "powerClaude.uninstallTimelineHook",
        "title": "Power Claude: Uninstall Timeline Hook"
      },
      {
        "command": "powerClaude.exportLogs",
        "title": "Power Claude: Export Logs (Sanitized)",
        "icon": "$(cloud-download)"
      },
      {
        "command": "powerClaude.installWatchdogHooks",
        "title": "Power Claude: Install Background Watchdog Hooks (heal sessions between runs)"
      },
      {
        "command": "powerClaude.uninstallWatchdogHooks",
        "title": "Power Claude: Uninstall Background Watchdog Hooks"
      },
      {
        "command": "powerClaude.installLifecycleHooks",
        "title": "Power Claude: Install Session Lifecycle Hooks (enable resilience watchdog)"
      },
      {
        "command": "powerClaude.uninstallLifecycleHooks",
        "title": "Power Claude: Uninstall Session Lifecycle Hooks"
      },
      {
        "command": "powerClaude.uninstallAll",
        "title": "Power Claude: Uninstall Everything (delete ~/.power-claude/ and all hooks)"
      },
      {
        "command": "powerClaude.toggleAutoMode",
        "title": "Power Claude: Toggle Auto Mode (sets permissions.defaultMode in ~/.claude/settings.json)"
      },
      {
        "command": "powerClaude.setPermissionMode",
        "title": "Power Claude: Set Claude Code Permission Mode (auto / acceptEdits / default / plan / bypassPermissions)"
      },
      {
        "command": "powerClaude.refreshLicense",
        "title": "Power Claude: Refresh License Validation"
      },
      {
        "command": "powerClaude.toggleSessionBlame",
        "title": "Power Claude: Toggle Session Trail"
      },
      {
        "command": "powerClaude.sessionTrail.showHistory",
        "title": "Power Claude: Show Session Trail for this file"
      },
      {
        "command": "powerClaude.sessionTrail.exportAttribution",
        "title": "Power Claude: Export Session Trail (Markdown / JSON)"
      },
      {
        "command": "powerClaude.sessionTrail.toggleModelFilter",
        "title": "Power Claude: Filter Session Trail by model…"
      },
      {
        "command": "powerClaude.openFileSessions",
        "title": "Power Claude: Show Sessions That Touched This File"
      },
      {
        "command": "powerClaude.tabIconLegend",
        "title": "Power Claude: Show Tab State Legend"
      },
      {
        "command": "powerClaude.exportInsightSnapshot",
        "title": "Power Claude: Export Insight Snapshot (Daily / Weekly Markdown)"
      },
      {
        "command": "powerClaude.proxy.start",
        "title": "Start Proxy",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.proxy.stop",
        "title": "Stop Proxy",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.toggleBalancedMode",
        "title": "Toggle Power Mode — Parallel Dispatch + Smart 429 Routing",
        "shortTitle": "Toggle Power Mode",
        "category": "Power Claude",
        "enablement": "true"
      },
      {
        "command": "powerClaude.openBalancedModeSettings",
        "title": "Open Power Mode Settings",
        "shortTitle": "Power Mode Settings",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.routing.setMode",
        "title": "Set Routing Mode (smart | fallback)",
        "shortTitle": "Routing Mode",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.balancedMode.reconcile",
        "title": "Reconcile Power Mode (sync settings → proxy.json + restart proxy)",
        "shortTitle": "Reconcile Power Mode",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.openAutoRewakeSettings",
        "title": "Open Auto-Rewake Settings",
        "shortTitle": "Auto-Rewake Settings",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.emergency",
        "title": "Emergency Recovery",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.copyEmergencyCommand",
        "title": "Copy Emergency Command",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.copyEmergencyCommand",
        "title": "Copy Emergency Command",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.emergencyOff",
        "title": "🛑 Emergency Off — Stop Everything (Safe)",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.emergencyOn",
        "title": "✅ Emergency On — Clear Stop-Everything Sentinel",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.disableRotationCli",
        "title": "Disable Rotation (CLI)",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.stopProxy",
        "title": "Stop Proxy (alias)",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.restoreBackupCredentials",
        "title": "Restore Backup Credentials",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.activateLicense",
        "title": "Activate License",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.deactivateLicense",
        "title": "Deactivate License",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.openPricing",
        "title": "Open Pricing",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.findLicenseKey",
        "title": "Find My License Key (open account page)",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.resumeSelectedSessions",
        "title": "Resume Selected Sessions",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.openSessionsLaneView",
        "title": "Open Sessions Lane View",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.openEventsLog",
        "title": "Open Events Log",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.preserveFocusFix.apply",
        "title": "Re-apply Preserve-Focus Patch to Claude Code Extension",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.applyChipDefaultOff",
        "title": "💸 Apply Active-File Chip Default-Off (Saves Tokens)",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.chipDefaultOffStatus",
        "title": "Active-File Chip Default-Off — Status",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.revertChipDefaultOff",
        "title": "Revert Active-File Chip Default-Off",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.openSetting",
        "title": "Power Claude: Open Setting",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.showInboundMessages",
        "title": "⚡ Power Claude: Show Inbound Messages",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.sessionReply",
        "title": "⚡ Power Claude: Reply to Session",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.autoRotationEngine.enable",
        "title": "Power Claude: Enable Auto-Rotation Engine (recommended — use at own risk)",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.autoRotationEngine.chooseManual",
        "title": "Power Claude: Keep Manual Multi-Account (Auto-Rotation OFF)",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.autoRotationEngine.showStatus",
        "title": "Power Claude: Show Auto-Rotation Engine Status",
        "category": "Power Claude"
      },
      {
        "command": "powerClaude.autoRotationEngine.appealKit",
        "title": "Power Claude: Download Appeal Kit",
        "category": "Power Claude"
      }
    ],
    "menus": {
      "view/title": [
        {
          "command": "powerClaude.rescan",
          "when": "view == powerClaude.dashboard || view == powerClaude.tree",
          "group": "navigation@1"
        },
        {
          "command": "powerClaude.refresh",
          "when": "view == powerClaude.dashboard || view == powerClaude.tree",
          "group": "navigation@2"
        },
        {
          "command": "powerClaude.searchSessions",
          "when": "view == powerClaude.sessionExplorer",
          "group": "navigation@1"
        },
        {
          "command": "powerClaude.openMultiSessionGraph",
          "when": "view == powerClaude.sessionExplorer",
          "group": "navigation@2"
        },
        {
          "command": "powerClaude.resumeStalledSessions",
          "when": "view == powerClaude.sessionExplorer || view == powerClaude.dashboard",
          "group": "navigation@3"
        },
        {
          "command": "powerClaude.crossModelSessions",
          "when": "view == powerClaude.sessionExplorer || view == powerClaude.dashboard",
          "group": "navigation@3.5"
        },
        {
          "command": "powerClaude.warmAllSessionTabs",
          "when": "view == powerClaude.sessionExplorer || view == powerClaude.dashboard",
          "group": "navigation@4"
        }
      ],
      "view/item/context": [
        {
          "command": "powerClaude.sessionResume",
          "when": "view == powerClaude.sessionExplorer && viewItem == sessionRecord",
          "group": "0_resume@1"
        },
        {
          "command": "powerClaude.sessionResumeWithPrompt",
          "when": "view == powerClaude.sessionExplorer && viewItem == sessionRecord",
          "group": "0_resume@2"
        },
        {
          "command": "powerClaude.openSessionDetail",
          "when": "view == powerClaude.sessionExplorer && viewItem == sessionRecord",
          "group": "1_inspect@1"
        },
        {
          "command": "powerClaude.openSessionGraph",
          "when": "view == powerClaude.sessionExplorer && viewItem == sessionRecord",
          "group": "1_inspect@2"
        },
        {
          "command": "powerClaude.flowExplorer.openForSession",
          "when": "view == powerClaude.sessionExplorer && viewItem == sessionRecord",
          "group": "1_inspect@3"
        },
        {
          "command": "powerClaude.copySessionId",
          "when": "view == powerClaude.sessionExplorer && viewItem == sessionRecord && config.powerClaude.sessionExplorer.copySession.enabled",
          "group": "3_copy@1"
        },
        {
          "command": "powerClaude.copySessionName",
          "when": "view == powerClaude.sessionExplorer && viewItem == sessionRecord && config.powerClaude.sessionExplorer.copySession.enabled",
          "group": "3_copy@2"
        },
        {
          "command": "powerClaude.copySessionFirstPrompt",
          "when": "view == powerClaude.sessionExplorer && viewItem == sessionRecord && config.powerClaude.sessionExplorer.copySession.enabled",
          "group": "3_copy@3"
        },
        {
          "command": "powerClaude.openPreCommitReview",
          "when": "view == powerClaude.sessionExplorer && viewItem == sessionRecord",
          "group": "1_inspect@3"
        },
        {
          "command": "powerClaude.addSessionTag",
          "when": "view == powerClaude.sessionExplorer && viewItem == sessionRecord",
          "group": "2_metadata@1"
        },
        {
          "command": "powerClaude.togglePinSession",
          "when": "view == powerClaude.sessionExplorer && viewItem == sessionRecord",
          "group": "2_metadata@2"
        },
        {
          "command": "powerClaude.setSessionStatus",
          "when": "view == powerClaude.sessionExplorer && viewItem == sessionRecord",
          "group": "2_metadata@4"
        },
        {
          "command": "powerClaude.removeSessionTag",
          "when": "view == powerClaude.sessionExplorer && viewItem == sessionRecord",
          "group": "2_metadata@3"
        },
        {
          "command": "powerClaude.archiveSession",
          "when": "view == powerClaude.sessionExplorer && viewItem == sessionRecord",
          "group": "9_lifecycle@1"
        },
        {
          "command": "powerClaude.unarchiveSession",
          "when": "view == powerClaude.sessionExplorer && viewItem == sessionRecord",
          "group": "9_lifecycle@2"
        },
        {
          "command": "powerClaude.exportSession",
          "when": "view == powerClaude.sessionExplorer && viewItem == sessionRecord",
          "group": "9_lifecycle@3"
        },
        {
          "command": "powerClaude.openTouchedFile",
          "when": "view == powerClaude.filesTouched && viewItem == fileTouchRecord",
          "group": "0_open@1"
        },
        {
          "command": "powerClaude.diffTouchedFile",
          "when": "view == powerClaude.filesTouched && viewItem == fileTouchRecord",
          "group": "0_open@2"
        },
        {
          "command": "powerClaude.copyTouchedFilePath",
          "when": "view == powerClaude.filesTouched && viewItem == fileTouchRecord",
          "group": "9_clipboard@1"
        }
      ]
    },
    "colors": [
      {
        "id": "powerClaude.badge.enabled",
        "description": "Power Claude brand-stamp badge — feature enabled.",
        "defaults": {
          "dark": "#7c3aed",
          "light": "#7c3aed",
          "highContrast": "#7c3aed",
          "highContrastLight": "#7c3aed"
        }
      },
      {
        "id": "powerClaude.badge.disabled",
        "description": "Power Claude brand-stamp badge — feature disabled.",
        "defaults": {
          "dark": "#8a8a96",
          "light": "#8a8a96",
          "highContrast": "#8a8a96",
          "highContrastLight": "#8a8a96"
        }
      },
      {
        "id": "powerClaude.session.active",
        "description": "Session state — active (Claude's last turn complete, awaiting user).",
        "defaults": {
          "dark": "#7c3aed",
          "light": "#7c3aed",
          "highContrast": "#7c3aed",
          "highContrastLight": "#7c3aed"
        }
      },
      {
        "id": "powerClaude.session.processing",
        "description": "Session state — processing (Claude is mid-message / streaming a response).",
        "defaults": {
          "dark": "#0969da",
          "light": "#0969da",
          "highContrast": "#0969da",
          "highContrastLight": "#0969da"
        }
      },
      {
        "id": "powerClaude.session.completed",
        "description": "Session state — completed (all tasks done).",
        "defaults": {
          "dark": "#1a7f37",
          "light": "#1a7f37",
          "highContrast": "#1a7f37",
          "highContrastLight": "#1a7f37"
        }
      },
      {
        "id": "powerClaude.session.abandoned",
        "description": "Session state — abandoned (left mid-task, no recent activity).",
        "defaults": {
          "dark": "#cf222e",
          "light": "#cf222e",
          "highContrast": "#cf222e",
          "highContrastLight": "#cf222e"
        }
      },
      {
        "id": "powerClaude.session.stale",
        "description": "Session state — stale (idle past the stale threshold).",
        "defaults": {
          "dark": "#bf8700",
          "light": "#bf8700",
          "highContrast": "#bf8700",
          "highContrastLight": "#bf8700"
        }
      },
      {
        "id": "powerClaude.session.archived",
        "description": "Session state — archived.",
        "defaults": {
          "dark": "#8a8a96",
          "light": "#8a8a96",
          "highContrast": "#8a8a96",
          "highContrastLight": "#8a8a96"
        }
      },
      {
        "id": "powerClaude.status.active",
        "description": "Status palette - active / in focus (purple). The shared cross-surface status color, matching the session-list rows.",
        "defaults": {
          "dark": "#7c3aed",
          "light": "#7c3aed",
          "highContrast": "#7c3aed",
          "highContrastLight": "#7c3aed"
        }
      },
      {
        "id": "powerClaude.status.busy",
        "description": "Status palette - working / in progress (blue).",
        "defaults": {
          "dark": "#0969da",
          "light": "#0969da",
          "highContrast": "#0969da",
          "highContrastLight": "#0969da"
        }
      },
      {
        "id": "powerClaude.status.ok",
        "description": "Status palette - healthy / done / passing (green).",
        "defaults": {
          "dark": "#1a7f37",
          "light": "#1a7f37",
          "highContrast": "#1a7f37",
          "highContrastLight": "#1a7f37"
        }
      },
      {
        "id": "powerClaude.status.warn",
        "description": "Status palette - caution / needs review (amber).",
        "defaults": {
          "dark": "#bf8700",
          "light": "#bf8700",
          "highContrast": "#bf8700",
          "highContrastLight": "#bf8700"
        }
      },
      {
        "id": "powerClaude.status.error",
        "description": "Status palette - blocking / failed / critical (red).",
        "defaults": {
          "dark": "#cf222e",
          "light": "#cf222e",
          "highContrast": "#cf222e",
          "highContrastLight": "#cf222e"
        }
      },
      {
        "id": "powerClaude.status.neutral",
        "description": "Status palette - idle / inactive / unknown (grey).",
        "defaults": {
          "dark": "#8a8a96",
          "light": "#8a8a96",
          "highContrast": "#8a8a96",
          "highContrastLight": "#8a8a96"
        }
      }
    ],
    "configuration": [
      {
        "title": "Power Claude: ⚡ Power Mode (Parallel Dispatch + Smart 429 Routing)",
        "order": 1,
        "properties": {
          "powerClaude.proxy.parallelAccounts": {
            "type": "boolean",
            "default": true,
            "order": 1,
            "description": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation.",
            "markdownDescription": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation."
          },
          "powerClaude.proxy.parallelMode": {
            "type": "string",
            "enum": [
              "round-robin",
              "least-utilized",
              "smart"
            ],
            "enumDescriptions": [
              "Round-robin — cycle through every account in strict turn order. Gives every account a strictly EQUAL request count. Best only when every account is on the same plan tier; with mixed tiers it can push a smaller account into 429s while larger accounts sit underused.",
              "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation.",
              "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation."
            ],
            "default": "least-utilized",
            "order": 2,
            "description": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation.",
            "markdownDescription": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation."
          },
          "powerClaude.proxy.parallelPool": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "default": [],
            "order": 3,
            "description": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation.",
            "markdownDescription": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation."
          },
          "powerClaude.autoRotationEngine.enabled": {
            "type": "boolean",
            "default": false,
            "description": "Opt-in Auto-Rotation Engine (classic rotational functionality). OFF by default until Setup Guide / warning ack. RECOMMENDED for multi-account continuity after reading the grey-area warning. Enable via Setup Guide, Command Palette, or `pc rotation engine enable --i-understand`. USE AT YOUR OWN RISK.",
            "markdownDescription": "**Recommended product path** after Setup Guide warning. Read-only mirror of opt-in state. Enable via **Run Setup Guide** / `Power Claude: Enable Auto-Rotation Engine` or `pc rotation engine enable --i-understand`. Default **OFF** until explicit ack. Use at own risk. See docs/product/rotation-modes.md."
          }
        }
      },
      {
        "title": "Power Claude: Context Optimization (Token Saver)",
        "properties": {
          "powerClaude.tokenSaver.level": {
            "type": "number",
            "minimum": 0,
            "maximum": 4,
            "default": 3,
            "order": 0,
            "markdownDescription": "**Token Saver level** — the ease/optimizer slider position (use the slider in the Power Claude dashboard for the full per-level strategy view).\n\n- **0 Off** — no trimming\n- **1 Light** — lossless log + command-output cleanup\n- **2 Lean** — + diff condensing\n- **3 Balanced** *(default)* — + JSON minify\n- **4 Max (local)** — most aggressive local trimming\n\nMoving the slider sets the toggles below; editing a toggle directly puts you in **Custom**. Runs entirely on your machine — no external services."
          },
          "powerClaude.contextOptimize.enabled": {
            "type": "boolean",
            "default": true,
            "order": 1,
            "description": "Token Saver — the proxy trims low-signal noise out of what Claude reads (command output, logs, diffs) before forwarding, so more of the capacity you already pay for goes to real work. Reversible and audited; high-signal lines (errors, stack frames, diff changes) are always preserved. ON by default — dial it down with the profile below, or turn it off here.",
            "markdownDescription": "**Token Saver** — the proxy optimizes the bulky `tool_result` blocks in each request (command output, logs, diffs, JSON) **before** forwarding to Claude, so leaner context leaves more room for real work.\n\n- **Lossless where possible** (JSON is whitespace-minified) and **never fabricates** — it only drops/collapses low-signal noise.\n- **High-signal lines always survive**: errors, stack frames, diff changes, hunk headers.\n- Every optimization is **recorded** (see the dashboard) and the original is retained.\n- Choose how aggressive via `#powerClaude.contextOptimize.profile#`, and which content kinds below.\n\nON by default — dial it down or turn it off here."
          },
          "powerClaude.contextOptimize.profile": {
            "type": "string",
            "enum": [
              "conservative",
              "standard",
              "aggressive"
            ],
            "enumDescriptions": [
              "Conservative — only replaces a block when the saving is large and obviously safe. Highest fidelity, lowest savings.",
              "Standard (default) — meaningful savings while preserving every high-signal span.",
              "Aggressive — maximizes density; replaces whenever there is any real saving. Still never drops preserved (error/stack/diff) lines."
            ],
            "default": "standard",
            "order": 2,
            "description": "How aggressively the Token Saver trims context. 'standard' (default) balances savings and fidelity; 'conservative' is most cautious; 'aggressive' maximizes savings while still preserving all high-signal lines."
          },
          "powerClaude.contextOptimize.commandOutput": {
            "type": "boolean",
            "default": true,
            "order": 3,
            "description": "Optimize shell/command output blocks (the noisiest tool results — ls, build dumps, test logs). Safe to keep on."
          },
          "powerClaude.contextOptimize.log": {
            "type": "boolean",
            "default": true,
            "order": 4,
            "description": "Optimize log blocks — collapse repeated/heartbeat lines while preserving every error and warning. Safe to keep on."
          },
          "powerClaude.contextOptimize.diff": {
            "type": "boolean",
            "default": true,
            "order": 5,
            "description": "Optimize unified-diff blocks — keep every changed line and hunk header, trim the unchanged context around them. On by default."
          },
          "powerClaude.contextOptimize.json": {
            "type": "boolean",
            "default": true,
            "order": 6,
            "description": "Optimize JSON payloads — lossless whitespace minification (semantically identical). On by default; safe because it preserves JSON semantics exactly."
          }
        }
      },
      {
        "title": "Power Claude: ⚡ Warm Compacting (skip the compaction wait)",
        "properties": {
          "powerClaude.warmCompacting.enabled": {
            "type": "boolean",
            "default": true,
            "order": 1,
            "description": "Warm Compacting — when your session nears Claude Code's compaction threshold, Power Claude pre-builds an abstractive summary of the earlier part of the conversation in the background (kept entirely OUT of your live context, in a sidecar) and substitutes it onto the request near the wall so the multi-minute compaction freeze is avoided. The recent tail is always kept verbatim. ON by default; fail-open (any unsafe case falls back to normal compaction). To watch the projected token drop without altering requests first, turn off Apply Rewrite for a measure-only mode.",
            "markdownDescription": "**Warm Compacting** — eliminate Claude Code's long compaction pause.\n\n- When your session approaches the compaction threshold, Power Claude pre-summarizes the earlier ~80% of the conversation **in the background** (off the hot path) and stores it **sidecar-only** — it never enters your live context and never touches the transcript.\n- When the wall is near, the warm summary + the **verbatim** recent tail merge into one compact context that is substituted onto the request, so the native compaction freeze is avoided.\n- **No regression by design:** a runtime invariant detector auto-disables the splice if it ever stops working, and any unsafe case (stale marker, unsafe cut point) falls back to normal compaction.\n- ON + live by default; license-gated. To verify before it alters requests, turn off `#powerClaude.warmCompacting.applyRewrite#` for a measure-only mode that reports the projected token drop."
          },
          "powerClaude.warmCompacting.triggerPercentOfCompactThreshold": {
            "type": "number",
            "default": 80,
            "minimum": 10,
            "maximum": 100,
            "order": 2,
            "description": "Fire the background warm build when context reaches this percent of the real compact threshold (so it runs close to the wall, not early). Default 80. Combined with autocompactPercentOfWindow: warm fires at autocompactPercentOfWindow × this/100 of the window (e.g. 90 × 80/100 ≈ 72% full)."
          },
          "powerClaude.warmCompacting.maxWarmCompactsPerSession": {
            "type": "number",
            "default": 1,
            "minimum": 1,
            "maximum": 20,
            "order": 3,
            "description": "How many warm compacts to build per session before stopping (efficiency cap). Default 1 — most sessions need it at most once."
          },
          "powerClaude.warmCompacting.maxWarmSummaryTokens": {
            "type": "number",
            "default": 3000,
            "minimum": 500,
            "maximum": 20000,
            "order": 4,
            "description": "Clamp the abstractive warm summary (of the earlier ~80%) to this many tokens. Default 3000."
          },
          "powerClaude.warmCompacting.maxInjectedCompactTokens": {
            "type": "number",
            "default": 4500,
            "minimum": 500,
            "maximum": 30000,
            "order": 5,
            "description": "If the merged compact (warm summary + tail) would exceed this many tokens, skip the warm compact and let normal compaction run. Default 4500."
          },
          "powerClaude.warmCompacting.autocompactPercentOfWindow": {
            "type": "number",
            "default": 90,
            "minimum": 50,
            "maximum": 100,
            "order": 6,
            "description": "Defines the 'real compact threshold' as a percent of the model context window (Claude Code does not expose its autocompact point). Default 90. Honors the CLAUDE_AUTOCOMPACT_PCT_OVERRIDE environment variable when set."
          },
          "powerClaude.warmCompacting.applyRewrite": {
            "type": "boolean",
            "default": true,
            "order": 7,
            "description": "Live-splice gate. ON (default) = the proxy substitutes the pre-built merged compact onto the outbound request when near the wall, actually avoiding Claude Code's compaction freeze. OFF = measure-only: Power Claude builds + measures the warm compact but never alters a request (use this to watch the projected token drop on your own sessions first). Fail-open + marker validation + a kill switch (POWER_CLAUDE_WARM_COMPACT=0) protect against regression either way — if anything is unsafe it falls back to normal compaction."
          }
        }
      },
      {
        "title": "Power Claude: 🎯 VS Code Fixes",
        "properties": {
          "powerClaude.preserveFocusFix.enabled": {
            "type": "boolean",
            "default": false,
            "description": "Stop the Claude Code VS Code extension from yanking your cursor when its panel reveals, output arrives, a session reopens, or a file gets shown. Patches the installed extension to pass preserveFocus:true on every autonomous reveal/show/showTextDocument call. Fixes the upstream focus-steal tracked in anthropics/claude-code#32726 — open with no shipping fix as of 2026-05-20. Patch is idempotent, anchor-based (survives extension version drift), and reversible via the .preserve-focus.orig backup. Re-run after each extension upgrade is automatic when preserveFocusFix.autoRunOnUpgrade is ON. Reload the VS Code window after the first apply for the change to take effect."
          },
          "powerClaude.preserveFocusFix.autoRunOnUpgrade": {
            "type": "boolean",
            "default": true,
            "description": "When ON (and preserveFocusFix.enabled is also ON), Power Claude detects Claude Code extension upgrades (via extension.js mtime change) and re-applies the preserve-focus patch automatically. When OFF, you must manually re-run via the command \"Power Claude: Re-apply preserve-focus patch\" after each Claude Code auto-update."
          }
        }
      },
      {
        "title": "Power Claude: 🎨 Branding & Theme",
        "properties": {
          "powerClaude.scrollbarTheme.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Theme VS Code's scrollbars in Power Claude purple, globally — via workbench.colorCustomizations (scrollbarSlider.background/hoverBackground/activeBackground). This is a global VS Code setting, not scoped to Power Claude's own views: VS Code has no per-extension or per-tab scrollbar API. On by default. Power Claude snapshots whatever scrollbar colors you had before applying its own, and restores them exactly (or removes the keys, if you had none) the moment you turn this off or uninstall Power Claude — it never overwrites a scrollbar color you later set by hand.",
            "markdownDescription": "**Scrollbar Theme** — theme VS Code's scrollbars in Power Claude purple.\n\n- Writes to the **global** `workbench.colorCustomizations` (`scrollbarSlider.background` / `.hoverBackground` / `.activeBackground`) — this is a VS Code-wide setting, not scoped to Power Claude's own views. VS Code has no per-extension or per-tab scrollbar API.\n- **On by default.**\n- Non-destructive: Power Claude snapshots whatever scrollbar colors you had *before* applying its own, and restores them exactly — or removes the keys if you had none — the moment you turn this off or uninstall Power Claude. It never overwrites a scrollbar color you later set by hand."
          }
        }
      },
      {
        "title": "Power Claude: 🧩 Claude Core",
        "properties": {
          "powerClaude.tabWarming.enabled": {
            "type": "boolean",
            "default": false,
            "description": "[EXPERIMENTAL — DEVELOPER ONLY, NOT AVAILABLE IN RELEASED BUILDS] Tab Warming would eager-load open Claude Code session tabs after VS Code restores. It is disabled in all public builds and does nothing here: the only way VS Code loads a restored (dormant) webview is to REVEAL its tab, which steals focus / changes the displayed tab — there is no API to load a webview in the background, so warming cannot be made unobtrusive. It is gated to PC_DEV_BUILD dev builds (and default-OFF even there) while a non-focus-stealing approach is researched. Leave OFF.",
            "markdownDescription": "**Tab Warming** *(experimental — developer-only; does nothing in released builds)*\n\n- Goal: eager-load open Claude Code session tabs after VS Code restores, so you don't click each one.\n- **Why it's disabled for everyone:** the *only* way VS Code loads a restored (dormant) webview is to **reveal** its tab, which makes it the active/displayed tab — i.e. it **steals focus**. VS Code has **no API to load a webview in the background** (proven), so warming cannot run silently. Enabling it caused focus to jump to a session tab every few seconds.\n- It is **gated out of all public builds** (compile-time `__PC_DEV__`) and stays **default-OFF** even in developer builds, until a non-focus-stealing load path is found.\n- Leave this **OFF**."
          },
          "powerClaude.tabWarming.resumeOnLoad": {
            "type": "boolean",
            "default": false,
            "description": "When preloading, also inject your wake-up prompt (powerClaude.resumePrompt) into each session as it loads — i.e. RESUME every session, not just render it. Default OFF: tabs are loaded for instant viewing but left dormant (no turn is taken). Turn ON only if you want every restored session to immediately pick up where it left off."
          },
          "powerClaude.tabWarming.minTabs": {
            "type": "number",
            "default": 2,
            "minimum": 1,
            "maximum": 50,
            "description": "Skip the preload sweep unless at least this many Claude tabs are open — there's no point flickering through one or two. Default 2."
          },
          "powerClaude.tabWarming.maxTabs": {
            "type": "number",
            "default": 24,
            "minimum": 1,
            "maximum": 200,
            "description": "Hard ceiling on how many tabs one sweep will instantiate, to bound memory/CPU on very large session sets. Beyond this, the rest stay lazy until you click them. Default 24."
          },
          "powerClaude.tabWarming.idleQuietMs": {
            "type": "number",
            "default": 8000,
            "minimum": 0,
            "maximum": 60000,
            "description": "How long (ms) you must be idle before the visible preload sweep dares to start, so it never flips tabs while you're actively working. Clamped to [0, 60000]. Default 8000 (8s)."
          },
          "powerClaude.tabWarming.manualPerTabTimeoutMs": {
            "type": "number",
            "default": 4000,
            "minimum": 250,
            "maximum": 20000,
            "description": "Used by the manual 'Load All Session Tabs' command. Each tab advances the instant its conversation reports loaded; this is the fallback dwell (ms) to wait per tab if that signal never fires, so a slow tab never stalls the sweep. Default 4000 (4s)."
          },
          "powerClaude.customSessionTitles.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Let you rename a session's editor-tab title (via 'Power Claude: Rename Session'). Claude Code auto-generates a title per session and keeps changing it as the conversation evolves; when this is on, a title you set is pinned and re-applied whenever Claude Code re-renders, so it stays put. Turn it off (or use 'Restore Claude Code to Stock') to go back to Claude Code's own titles."
          },
          "powerClaude.customSessionTitles.showSessionIdSuffix": {
            "type": "boolean",
            "default": false,
            "description": "Append the session's short id (first 8 chars of the UUID, e.g. ' · a9cb7f06') to its editor-tab title, so you can read and reference the real session id straight from the tab. Off by default. Display-only — it never changes how Power Claude tracks tabs internally, so tab-state icons and Tab Warming are unaffected. Note: VS Code truncates long tab titles, so the suffix may not always be visible; for the full id use 'Copy Session Id' in the Session Explorer or the dashboard."
          },
          "powerClaude.sessionExplorer.copySession.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Show the 'Copy Session Id / Name / Prompt Text' actions when you right-click a session in the Session Explorer. On by default; turn it off to remove those copy actions from the menu."
          },
          "powerClaude.resumeDeepLink.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Let Power Claude handle vscode://neural-llm.power-claude/resume?sid=<id> deep links (emitted by the 'pc resume-stalled' table) — clicking a session id resumes that session in a terminal tab via 'claude --resume'. On by default; turn it off to ignore resume deep links."
          },
          "powerClaude.crossModel.sessionStartAdvisory": {
            "type": "boolean",
            "default": false,
            "description": "When true, SessionStart may inject a short advisory listing unfinished sessions on OTHER LLM vendors (Claude↔Grok) for this workspace. DEFAULT OFF. Never auto-resumes foreign CLIs — inventory only. Mirrors to ~/.power-claude/state/cross-model-advisory.enabled for the bash hook. Requires trial/paid session-cross-model feature pack."
          },
          "powerClaude.crossModel.statusBar.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Show a status-bar badge when unfinished sessions exist on OTHER LLM vendors for this workspace (advisory only). Requires trial/paid session-cross-model feature pack. Click opens Power Claude: Cross-Model Hanging Sessions."
          },
          "powerClaude.messageTimestamps.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Stamp each chat message in the Claude Code panel with your local wall-clock time (HH:MM). Pure client-side: the value is rendered by the webview after the message lands, never enters the JSONL transcript, and is invisible to the LLM context (so it costs zero tokens). Patches the installed extension's webview/index.js with a sentinel-bracketed append that uses a MutationObserver to stamp new bubbles as they render. Patch is idempotent and reversible; re-applied automatically on Claude Code auto-update via the extension self-heal."
          },
          "powerClaude.chatScrollNav.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Show floating purple scroll-to-top (↑) and scroll-to-bottom (↓) buttons on the right edge of the Claude Code chat thread. One click jumps a long conversation to its beginning or its newest message. The buttons only appear while the thread is actually scrollable, and respect prefers-reduced-motion (instant jump instead of a smooth scroll). Patches the installed extension's webview/index.js with a sentinel-bracketed append (pure DOM, no network); reversible; re-applied automatically on Claude Code auto-update via the extension self-heal. Reload the VS Code window after toggling for the change to take effect.",
            "markdownDescription": "**Chat Scroll Buttons** — floating purple **↑ / ↓** buttons on the right edge of the *Claude Code chat thread*.\n\n- One click jumps a long conversation to its **top** or to the **newest message**.\n- Buttons only appear while the thread is actually scrollable; `prefers-reduced-motion` makes the jump instant.\n- **On by default.** Reload the window after toggling."
          },
          "powerClaude.chipDefaultOff.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Default the Claude Code \"include current file selection in context\" chip to OFF on each new chat, and stamp it with the Power Claude attribution badge. Without this, the chip silently defaults ON and feeds your active editor file into every prompt. Patches the installed extension's webview/index.js with a sentinel-bracketed append (MutationObserver-driven, idempotent, anchor-based so it survives extension version drift). Reversible via the .orig backup; re-applied automatically on Claude Code auto-update via the extension self-heal. Reload the VS Code window after toggling for the change to take effect."
          },
          "powerClaude.sessionList.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Decorate each row in Claude Code's session-history dropdown (the clock icon menu) with a live state pill: RUNNING (another window is driving the session now) / INCOMPLETE (todos still pending) / COMPLETE (last TodoWrite finished) / IDLE. State is push-fed via Server-Sent Events from the Power Claude proxy — no polling, scales to 20+ concurrent windows at O(1) work per change. Patches the installed extension's webview/index.js with a sentinel-bracketed append; reversible; re-applied on every activate so a proxy-port change takes effect without manual intervention."
          },
          "powerClaude.openTabSearch.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Search WITHIN your open Claude session tabs by conversation CONTENT — not just titles. When you have many sessions open and can't remember which one discussed a topic, type a phrase you remember and Power Claude streams each open session's transcript, ranks the matching turns, and previews the match with your query highlighted; one click reveals (foregrounds) that session's tab. Also available as a keybindable QuickPick (Search Open Session Tabs, default ctrl+alt+shift+s / cmd+alt+shift+s) and in the dashboard Sessions list with a toggle to widen the search to every indexed session. A Power Claude Pro feature; the reveal-tab action itself stays free. Note: VS Code does not allow one extension to scroll inside another's webview, so the highlighted content is rendered in Power Claude's own surfaces, not inside the Claude tab."
          },
          "powerClaude.conversationSync.enabled": {
            "type": "boolean",
            "default": true,
            "description": "When another VS Code window, computer, or tab is actively writing to the same session you have open, surface a 'running elsewhere' banner and highlight new messages with a green diff rail as they stream in. Prevents you from typing into a stale view (and re-running work that already finished elsewhere, costing tokens and creating divergent code paths). Driven by Server-Sent Events from the Power Claude proxy off the same JSONL the session-list watcher already tails — no polling, O(1) per new line. Per-window CLI gate via localStorage \"pc-feature-conversation-sync\"; reversible. Reload the VS Code window after toggling."
          },
          "powerClaude.animatedLoader.mode": {
            "type": "string",
            "enum": [
              "append",
              "override",
              "off"
            ],
            "enumDescriptions": [
              "Append (default) — show the Power Claude loader next to Claude Code's native status line (both visible).",
              "Override — show the Power Claude loader plus a 'running…' label AND hide the native status line.",
              "Off — do not inject the loader (reverts the patch)."
            ],
            "default": "append",
            "description": "Show a branded Power Claude animated loader (dual opposing-rotation rings around the Power Claude lightning bolt) in the Claude Code chat whenever a turn is in progress — a dependable 'this session is running' cue that does NOT drop out the way Claude Code's native 'Whirring…/Thinking…' verb does during tool-execution / between-stream gaps. Keyed off the persistent stop/interrupt affordance, not the flaky verb text. Pure client-side webview patch — no network, no tokens. 'append' (default) shows it beside the native status; 'override' also hides the native status line; 'off' removes it. Patches the installed extension's webview/index.js with a sentinel-bracketed append; idempotent, reversible, re-applied on every activate so a mode change takes effect. Reload the VS Code window after toggling.",
            "markdownDescription": "Show a **branded Power Claude animated loader** (dual opposing-rotation rings around the Power Claude ⚡ bolt) in the Claude Code chat whenever a turn is in progress.\n\nA dependable *'this session is running'* cue that does **not** drop out the way Claude Code's native \"Whirring…/Thinking…\" verb does during tool-execution / between-stream gaps — it is keyed off the persistent stop/interrupt affordance, not the flaky verb text. Pure client-side webview patch (no network, no tokens).\n\n- **append** *(default)* — show it beside the native status\n- **override** — also hide the native status line and show a `running…` label\n- **off** — remove it\n\nPatches the installed extension's `webview/index.js` (sentinel-bracketed, idempotent, reversible, re-applied on every activate). Reload the VS Code window after toggling."
          },
          "powerClaude.usageOverride.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation."
          },
          "powerClaude.tabState.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Override Claude Code's editor-tab icon with a state-colored Power Claude bolt — running (green), incomplete (amber), complete (blue), idle (gray). Lets you read every open session's state straight off the tab strip without clicking into it. Matches the .pc-sl-badge palette used in the clock-icon session-history dropdown so the visual language stays consistent. Patches Claude Code's extension.js (rename_tab handler) to call back into Power Claude's tab-icon resolver; reversible; re-applied on every activate. Reload the VS Code window after toggling for the change to take effect."
          },
          "powerClaude.claudeCore.lockoutVisibility.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation."
          },
          "powerClaude.claudeCore.lockoutVisibility.toast": {
            "type": "boolean",
            "default": false,
            "description": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation."
          },
          "powerClaude.notifications.dwellMs": {
            "type": "number",
            "default": 20000,
            "minimum": 0,
            "maximum": 300000,
            "description": "How long (ms) an autonomous condition — an Anthropic overload/throttle, an all-accounts lockout, or native fallback — must stay CONTINUOUSLY active before Power Claude shows its notification. A quick proxy restart or a brief flap that clears within this window never notifies, so you aren't interrupted by transient blips. Clamped to [0, 300000]. Default 20000 (20s)."
          },
          "powerClaude.notifications.cooldownMs": {
            "type": "number",
            "default": 600000,
            "minimum": 0,
            "maximum": 3600000,
            "description": "Minimum gap (ms) between two of the SAME autonomous notification. After one shows, Power Claude stays quiet for this long even if the condition keeps flapping (locking, clearing, re-locking) — so a rapidly re-tripping overload yields at most one notification per window instead of a storm. Clamped to [0, 3600000]. Default 600000 (10 min)."
          },
          "powerClaude.userTimeZone": {
            "type": "string",
            "default": "",
            "description": "Your IANA timezone (e.g. \"America/Denver\") for recovery-time clocks like \"auto-resume around 4:48 PM\" in the VS Code UI. Leave blank to auto-detect (VS Code uses the editor's client zone; a real local machine is also detected from the OS). Set this only if Power Claude's VS Code host is a REMOTE / container box whose clock is UTC and can't see your real zone. Note this setting applies to the VS Code surface; the `pc` CLI / statusline read the TZ environment variable (or the OS zone) instead — export TZ there. When no zone is known, the recovery time is shown as a relative wait (\"under a minute\", \"about 30 minutes\") with no absolute clock, never a wrong one."
          }
        }
      },
      {
        "title": "Power Claude: Session Awareness",
        "properties": {
          "powerClaude.sessionAwareness.doubleLaunchGuard.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Prevent two processes from driving the same Claude Code session at once. When you Resume a session that is already being worked on, Power Claude shows a modal (Take-over / Open anyway / Open read-only) instead of silently racing the JSONL writer. Detection combines the heartbeat sidecar (~/.power-claude/state/session-live/, written by claiming VS Code windows) with a live `claude --resume <id>` process scan — so a session driven from a terminal or the `pc` CLI is caught too, not just sibling windows. The same guard backs the CLI: `pc session recover` refuses a busy session unless --force, and `pc session live` lists every session being worked on right now. Two writers on one transcript corrupt history; this gate makes the choice explicit."
          },
          "powerClaude.sessionAwareness.statusBadge.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Show a lifecycle status badge at the START of each row in the Session Explorer: 🟢 active, ✅ completed, 🟡 stale, ⚠️ abandoned, 📦 archived. When a session is currently live (fresh heartbeat sidecar < 10s old) and its taxonomy status isn't already 'active', a leading 🟢 overlay is prepended. Driven by the same CoreSessionStatusEnricher that powers the live-running indicator; cached per session ID for O(1) re-render."
          },
          "powerClaude.sessionAwareness.heartbeatIntervalMs": {
            "type": "number",
            "default": 3000,
            "minimum": 1000,
            "maximum": 30000,
            "description": "How often (in milliseconds) Power Claude writes a liveness heartbeat sidecar for the session this window owns. Drives the live-running dot in Session Explorer and the freshness check behind the double-launch guard. Clamped to [1000, 30000]. Default 3000 means a session is considered live when its sidecar's last heartbeat is < 10s old (3 ticks)."
          },
          "powerClaude.sessionAwareness.worktreeBadges.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Badge each linked git worktree's root folder with its lifecycle state, wherever VS Code renders file decorations (Explorer, tabs): link-blue ✓ = LANDED — Power Claude verified the tree is clean AND every file its branch changed is byte-identical in local main, so deleting the worktree loses nothing; orange ● = uncommitted work in progress; yellow ◆ = committed work not yet landed to local main; gray D = detached HEAD. Same verified-accuracy contract and link-blue color as the response summary's LANDED strip — a wrong badge is never shown (probe errors show no badge). States refresh about once a minute."
          }
        }
      },
      {
        "title": "Power Claude",
        "order": 2,
        "properties": {
          "powerClaude.statusBar": {
            "type": "boolean",
            "default": true,
            "description": "Show a status-bar item summarising healthy/cooling/blocked counts."
          },
          "powerClaude.yourRequestBanner.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Legacy alias for 'powerClaude.responseSummary.request.enabled' (kept for back-compat). Controls the 🟦 Your Request banner — the recap of your original ask shown token-free at the end of multi-step Claude responses. When the new responseSummary.request.enabled is explicitly set it takes precedence. Hard-disable everything for one machine by creating ~/.power-claude/state/your-request-banner.disabled."
          },
          "powerClaude.deadChatVeil.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Dead-chat recovery veil — when the connection to Claude Code is lost (the extension host reloads/recycles and the chat silently stops saving what you type — you type, it spins forever, and your message is lost on the next reload), show a dismissible Power Claude veil over the chat that warns you AND rescues your unsent message to the clipboard. Turn OFF to leave the Claude Code chat untouched."
          },
          "powerClaude.deadChatVeil.stallSeconds": {
            "type": "number",
            "default": 12,
            "minimum": 5,
            "description": "Grace window: how many seconds to wait for the assistant's turn to START after you send a message before the dead-chat veil concludes your message never reached Claude Code (a dead connection). The veil arms ONLY when you actually submit — an idle chat can never trip it — so this is a grace window, not an idle timeout. A healthy turn shows its 'generating' indicator in ~1-2s and disarms well inside it. Lower = earlier warning; higher = extra tolerance for a slow start. Default 12."
          },
          "powerClaude.responseSummary.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Master switch for the end-of-response summary boxes (🟦 Your Request, 🟥 Remaining Tasks, 🟧 Optional). When OFF, none are injected or rendered (zero context tokens). Use the per-box toggles below to enable any subset."
          },
          "powerClaude.responseSummary.enforce": {
            "type": "boolean",
            "default": true,
            "markdownDescription": "**Always-on end-of-session status** (default ON — the single opt-OUT). When on, every multi-step reply ends with a status strip: a green **Complete** when nothing genuinely needs you, or a 🟥 **Remaining** strip listing ONLY the items that truly need a decision/action from you (routine SOP — commit / push / publish / deploy — never appears). A lightweight Stop-hook backstop re-nudges Claude if it forgets. Turn OFF to return to the old behavior (a strip only when Claude happens to have something to report). Single-action replies never get a strip either way."
          },
          "powerClaude.responseSummary.request.enabled": {
            "type": "boolean",
            "default": true,
            "description": "🟦 Your Request — show your original ask, captured at first prompt and rendered token-free by the banner (survives context compaction and resume). When on, Claude is told NOT to restate the request in text, saving output tokens. Disabling hides the request banner."
          },
          "powerClaude.responseSummary.request.pinToFirstPrompt": {
            "type": "boolean",
            "default": true,
            "description": "🟦 Your Request — keep the banner PINNED to this session's original first prompt. When on (default), the banner locks onto the first ask it captures and never changes — so a context compaction (which rewrites the transcript and scrolls the original message out of view) can no longer drift the banner onto a later message. When off (adaptive), the banner re-reads the first visible message continuously, matching Claude Code's own title behavior (it can change as the session evolves). Takes effect on the next window reload."
          },
          "powerClaude.responseSummary.remaining.enabled": {
            "type": "boolean",
            "default": true,
            "description": "🟥 Remaining Tasks — show the block listing items that genuinely need your decision, a blocker, or a consequential out-of-band action. Disabling tells Claude to omit it."
          },
          "powerClaude.responseSummary.optional.enabled": {
            "type": "boolean",
            "default": true,
            "description": "🟧 Optional / Nice-to-have — show the block of suggestions and alternative approaches you might want. Conditional (only appears when there are genuine optional items). Disabling tells Claude to omit it."
          },
          "powerClaude.responseSummary.landed.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Link-blue LANDED strip — the trustworthy 'work is on local main' signal. Claude is instructed to emit it ONLY after mechanically verifying the worktree work is fully merged to local main (empty diff vs main AND a clean worktree — deleting the worktree would lose nothing). Its absence means the work has NOT landed yet, so you never have to parse prose to know. In 'strips' render mode it paints as a strip in your theme's link blue (textLink.foreground) with a matching square; in 'text' mode Claude writes a 🔵 LANDED line. Pushing to GitHub remains your step."
          },
          "powerClaude.responseSummary.render": {
            "type": "string",
            "enum": [
              "text",
              "strips"
            ],
            "enumDescriptions": [
              "Text — Claude writes the 🟥 Remaining / 🟧 Optional blocks as lightweight text at the end of each multi-step reply. Always works, in any client (this is the pure-CLI fallback).",
              "Strips (default) — Claude emits a compact token-free marker that Power Claude renders as branded, canonically-colored ⚡ status strips directly in the chat webview (the raw marker is hidden). Saves the output tokens of the text blocks. Uses the Claude Code webview (desktop/Remote-SSH/code-server/web); falls back to a harmless compact block if rendering can't attach."
            ],
            "default": "strips",
            "markdownDescription": "How the Landed / Remaining / Optional / Complete summary is rendered.\n\n- `strips` *(default)* — Claude emits a compact token-free marker (`pc-rs/v1` fenced block) and **Power Claude renders branded, canonically-colored strips in the chat webview**, hiding the raw marker. Saves the text blocks' output tokens. This is the boxes you see.\n- `text` — Claude writes them as lightweight text. Always works (the pure-CLI fallback).\n\nThe 🟦 Your Request banner is unaffected (it is always rendered token-free by its own DOM banner). `strips` mode patches the Claude Code chat webview and **fails open** — if it can't attach, the compact marker stays visible (mildly ugly, never broken)."
          },
          "powerClaude.refreshIntervalMs": {
            "type": "number",
            "default": 0,
            "description": "Optional auto-refresh interval (milliseconds). 0 = disabled (file watcher already detects changes)."
          },
          "powerClaude.autoSelectSoonest": {
            "type": "boolean",
            "default": true,
            "description": "When all accounts are exhausted (none healthy), automatically switch the active account to the one with the soonest 5-hour recovery time. This ensures Claude Code's 'resets in X' message matches the rotator dashboard's next-recovery countdown so both timelines agree."
          },
          "powerClaude.maskSensitiveData": {
            "type": "boolean",
            "default": true,
            "description": "Mask sensitive values (account names, email addresses) in the dashboard Event Log by default, showing only a partial hint (e.g. 'ac••••••••in', 'j***@domain.com'). Masking also covers the row's Copy-JSON payload and the search/sort/filter text so the raw value cannot be recovered by inspection. Use the 👁 Reveal / 🙈 Mask toggle in the Event Log toolbar to flip it for the current view (e.g. before sharing a screenshot). This is a display-only mask and does not affect what is written to logs."
          },
          "powerClaude.events.includeApiTrace": {
            "type": "boolean",
            "default": false,
            "description": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation."
          },
          "powerClaude.devMode.autoOpenSessions": {
            "type": "boolean",
            "default": false,
            "description": "[EXPERIMENTAL · DEV-ONLY · NOT ACTIVE IN RELEASED BUILDS] Master gate for automatic Claude tab opening. This feature shipped buggy — it repeatedly re-opened session tabs in the wrong workspace context (a visible loop) and triggered claude-vscode's pointless \"Session is already open\" toast — so it is EXCLUDED from public builds: even with this setting ON, released (`__PC_DEV__=false`) builds never auto-open a tab (the code path is build-time stripped). It can only be armed in a PC_DEV_BUILD developer build, and even there it defaults OFF. When OFF (default), Power Claude NEVER auto-opens Claude Code session tabs — not on startup, not after a rate-limit recovery, not when the watchdog detects a stalled session; you launch and resume sessions manually from the dashboard / Sessions Explorer. Terminal-side rate-limit recovery (the bash handler → auto-rewake) is unaffected and still resumes interrupted sessions."
          },
          "powerClaude.autoResumeOnRateLimit": {
            "type": "boolean",
            "default": true,
            "description": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation."
          },
          "powerClaude.autoResumeSessions": {
            "type": "boolean",
            "default": false,
            "description": "Automatically reveal the dashboard on VS Code startup so its inline 'Resume Claude Sessions' panel is visible. (Behavior change 2026-04-30: this no longer pops a QuickPick — picking is manual from the UI.) Defaults to OFF. The dev-mode master gate `powerClaude.devMode.autoOpenSessions` does not affect this setting since no tab actually auto-opens; this only chooses whether to focus the dashboard at activation."
          },
          "powerClaude.autoSnapshotSessions": {
            "type": "boolean",
            "default": true,
            "description": "Automatically refresh the saved-sessions snapshot every 60s and on extension shutdown. When ON, you never need to click 'Snapshot sessions' before reloading VS Code — clicking 'Resume sessions now' after a reload just works. Disable only if you want to manage the snapshot file by hand."
          },
          "powerClaude.promptInstallRateLimitHook": {
            "type": "boolean",
            "default": true,
            "description": "On activation, prompt to install the rate-limit anchor-emit hook into ~/.power-claude/hooks/rate-limit/handler.sh when it's missing. The hook is what populates the Anchors panel — without it, anchor data stays empty even when accounts hit caps. The prompt is dismissible per-day per-workspace and never auto-modifies your home dir without explicit consent."
          },
          "powerClaude.promptInstallLifecycleHooks": {
            "type": "boolean",
            "default": true,
            "description": "On activation, prompt to install Power Claude's session lifecycle hooks (session-start.sh / heartbeat.sh / session-end.sh) into ~/.power-claude/hooks/lifecycle/ and register them in ~/.claude/settings.json. Without these hooks, the resilience watchdog can still detect dead sessions but loses precision — no heartbeat signal, no final task-progress snapshot on session end. The prompt is dismissible per-day per-workspace and never auto-modifies your home dir without explicit consent. Manual install: 'Power Claude: Install Session Lifecycle Hooks' from the command palette."
          },
          "powerClaude.autoResumeSilently": {
            "type": "boolean",
            "default": true,
            "description": "When autoResumeSessions is ON, skip the QuickPick on startup and resume every candidate session immediately. Off by default so you can deselect tabs you don't want re-opened (e.g. one-off explorations from yesterday)."
          },
          "powerClaude.directLaunch.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Make dashboard action buttons LAUNCH DIRECTLY instead of popping VS Code's top-center Quick Input. When ON (default): buttons with a clear recommended default run it — immediately for trivial choices, or after a short cancelable countdown for consequential ones (e.g. Recover Session runs the recommended strategy; Resume Stalled defaults to the last day). Mandatory-input buttons (license key, search query, billing amounts) still prompt. HARD SAFETY FLOOR: destructive/irreversible actions (recovery strategies that overwrite the transcript or re-run a tool, deleting a token trip) ALWAYS show the chooser regardless of this setting. Turn OFF to restore the classic always-prompt behavior."
          },
          "powerClaude.directLaunch.countdownSeconds": {
            "type": "number",
            "default": 8,
            "minimum": 2,
            "maximum": 30,
            "description": "Seconds the cancelable countdown shows before a consequential direct-launch action (e.g. Recover Session) auto-runs its recommended default. Click 'Choose…' during the countdown to pick manually, or 'Cancel' to abort. Only applies when powerClaude.directLaunch.enabled is ON."
          },
          "powerClaude.autoResume.crossEnvironment": {
            "type": "boolean",
            "default": false,
            "description": "Defaults to OFF (recommended): auto-resume only opens sessions that were started in THIS environment — same machine (hostname), same client surface (desktop/Remote-SSH VS Code vs browser code-server), AND same launcher (VS Code vs CLI). A session you started on another computer, in a different VS Code client surface on the SAME machine (e.g. a browser code-server instance when you're in desktop VS Code), or in a CLI terminal will NOT pop open as a tab here on startup or after a rate-limit recovery; resume those manually from the Session Explorer if you want them. This keeps each editor's auto-resume in its OWN context and prevents one window/surface from grabbing another's sessions. Turn ON only if you treat all your machines/surfaces as one shared workspace and WANT sessions from any of them to be resume-eligible here. The launcher axis is always enforced (CLI-started sessions never auto-open as VS Code tabs regardless of this setting); this setting gates the machine AND client-surface axes together (the per-window axis is gated separately by `powerClaude.autoResume.crossWindow`). Legacy note: sessions created before host/client stamping shipped don't have those records yet, so they're allowed (same-environment assumed) until restarted — a single Claude Code reload stamps host + client on the next session-start."
          },
          "powerClaude.autoResume.crossWindow": {
            "type": "boolean",
            "default": false,
            "description": "Defaults to OFF (recommended): even within the SAME environment (same machine + same client surface), auto-resume leaves a session alone if it is currently LIVE in a DIFFERENT VS Code window — identified by the window that claimed it in its live session sidecar (vscodeWindowId). With multiple windows of the same surface open (e.g. two Remote-SSH windows), this stops a window from opening another window's sessions as tabs. Turn ON to let any same-environment window resume any same-environment session (the older behavior). Fail-open: a session with no FRESH sidecar (its owning window is closed, or it's a CLI session) is NOT held back by this axis — it falls through to the existing machine/client/in-window-tab gates, so there is no regression."
          },
          "powerClaude.resumePrompt": {
            "type": "string",
            "default": "Continue from where you left off.",
            "description": "Prompt injected into resumed Claude Code sessions to wake them up. Without this, resumed tabs sit dormant — the user has to type something to make the session continue processing. Passed as the second argument to `claude-vscode.editor.open(sessionId, prompt, viewColumn)`. Customize for your workflow (e.g. 'Continue your remaining tasks.', 'Resume the most recent task.'). Empty string disables prompt injection (sessions will reveal but stay dormant)."
          },
          "powerClaude.experimental.autoResume.focusResumedTab": {
            "type": "boolean",
            "default": false,
            "markdownDescription": "**Experimental.** When Power Claude auto-resumes a session (after a rate-limit recovery, or when the watchdog wakes a stalled one), should it bring the resumed tab to the foreground and FOCUS it?\n\n- **OFF (default)** — *never steals your focus.* The session still resumes, but it loads in the background and Power Claude returns you to the tab you were typing in. This matches normal Claude Code behavior — nothing yanks your active editor.\n- **ON** — reveals and focuses each resumed tab (the legacy behavior), useful if you want to jump straight to a session that needs attention.\n\nAuto-resume itself is unaffected (gated by `powerClaude.autoResumeOnRateLimit` + `powerClaude.devMode.autoOpenSessions`); this only controls whether resuming moves your focus. Because `claude-vscode.editor.open` always reveals the tab it opens, OFF works by snapshotting your active tab before the batch and restoring it afterward — flagged experimental until that restore is proven across desktop / Remote-SSH / code-server."
          },
          "powerClaude.recommender.maxHitsPerWeek": {
            "type": "number",
            "default": 1,
            "minimum": 0,
            "description": "Maximum acceptable rate-limit cap-hits per week before the LLM-usage recommender suggests an upgrade. Lower = recommend upgrades sooner; higher = tolerate more throttling before upgrading. Wired into the Usage tab to display your current tolerance and into recommend.json generation when the recommender CLI runs."
          },
          "powerClaude.usage.showApiComparison": {
            "type": "boolean",
            "default": false,
            "description": "When ON, the LLM Usage dashboard shows pay-as-you-go Anthropic API cost comparisons (API-equivalent spend, savings-vs-API, $/MTok rate tables, cost projections, model-mix cost breakdown). OFF by default because Power Claude targets users rotating subscription accounts — API-rate comparisons aren't relevant to them. With it OFF the dashboard shows subscription-fleet value instead (capacity savings vs an all-Max-200 fleet). Toggle ON only if you want the API-billing reference figures."
          },
          "powerClaude.sessionExplorer.autoArchiveAfterDays": {
            "type": "number",
            "default": 30,
            "minimum": 0,
            "description": "Sessions older than this many days are automatically marked archived (hidden from the main tree groups, surfaced under the 'Archived' group). Set to 0 to disable auto-archiving. User-applied tags, notes, and ratings persist regardless. Manual Archive / Unarchive context-menu actions always work and override this setting on a per-session basis."
          },
          "powerClaude.session.activeWindowMin": {
            "type": "number",
            "default": 15,
            "minimum": 1,
            "description": "Minutes after a session's last turn that it still reads as \"active\" in the Session Explorer. Lower = sessions drop to \"completed\" sooner after you stop typing; higher = they stay flagged active longer across short breaks. Clamped to a 1-minute floor. Takes effect immediately on change (triggers a session re-classification)."
          },
          "powerClaude.session.staleAfterDays": {
            "type": "number",
            "default": 7,
            "minimum": 1,
            "description": "Days of inactivity after which an idle (non-abandoned) session ages out to \"stale\" in the Session Explorer. Lower = sessions go stale faster; higher = they stay in the active groups longer. Clamped to a 1-day floor. Takes effect immediately on change (triggers a session re-classification)."
          },
          "powerClaude.session.longRunningMin": {
            "type": "number",
            "default": 120,
            "minimum": 1,
            "description": "Minutes of total session duration above which a session earns the \"long-running\" auto-tag (filterable in the Session Explorer). Lower = more sessions flagged as marathons; higher = only the longest. Clamped to a 1-minute floor. Takes effect immediately on change (triggers a session re-classification)."
          },
          "powerClaude.session.snapshotRetentionDays": {
            "type": "number",
            "default": 7,
            "minimum": 1,
            "description": "Days a saved session lingers in the resume list before the next auto-snapshot prunes it. Power Claude keeps a dual backup of your work — git snapshot refs plus this resume snapshot — so a longer retention means more abandoned sessions stay one click away from resuming. Lower = a tidier resume list; higher = a longer safety net. Clamped to a 1-day floor; applies on the next auto-snapshot."
          },
          "powerClaude.sessionBlame.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Master toggle for Session Trail — Power Claude's inline AI-session attribution on every line of code (gutter ⚡, current-line annotation, hover with diff hunk, CodeLens, status bar). Legacy setting key kept for backward compatibility; equivalent to powerClaude.sessionTrail.lineLevel. When git is available, attribution is line-level; without git, falls back to file-level automatically."
          },
          "powerClaude.sessionTrail.lineLevel": {
            "type": "boolean",
            "default": true,
            "description": "When ON, Session Trail computes line-level attribution by diffing Power Claude's session snapshot refs (refs/power-claude/sessions/<id>/start..end) and projecting through git blame. Requires git on PATH. Falls back to file-level if git is unavailable. Suppress to force file-level even when git is present."
          },
          "powerClaude.sessionTrail.gutter": {
            "type": "boolean",
            "default": true,
            "description": "When ON, Power Claude renders a ⚡ icon in the editor gutter for every AI-edited line in the visible viewport. Click → opens the contributing session in the Session Detail panel. Disable for a cleaner gutter; the current-line annotation and hover remain active independently."
          },
          "powerClaude.sessionTrail.codeLens": {
            "type": "boolean",
            "default": true,
            "description": "When ON, Power Claude adds a CodeLens (⚡ N sessions · last X ago) above any function or class that contains AI-edited lines. Click → opens the Edit History side panel for the file."
          },
          "powerClaude.sessionTrail.modelFilter": {
            "type": [
              "string",
              "null"
            ],
            "default": null,
            "description": "When set to a model name (e.g., 'claude-opus-4-7'), Session Trail surfaces (gutter, annotation, CodeLens) show only edits made by that model. Set via the 'Power Claude: Filter Session Trail by model…' command."
          },
          "powerClaude.fileStats.enabled": {
            "type": "boolean",
            "default": true,
            "description": "When ON, a status-bar item shows session activity for the active editor's file (count + active span). Click to pick from a list of sessions that touched the file. Requires the Session Explorer index to be populated."
          },
          "powerClaude.tabIcon.statusBar.enabled": {
            "type": "boolean",
            "default": true,
            "description": "When ON, a right-aligned status-bar item shows the focused Claude session tab's state (Running / Incomplete / Complete / Idle) with a short explanation. Click for the full legend. The status bar item is the discoverability layer for the editor-tab state icon — VS Code blocks decorating WebviewPanel tooltips directly."
          },
          "powerClaude.promptReloadOnClaudeCodeUpdate": {
            "type": "boolean",
            "default": true,
            "description": "When ON, Power Claude prompts you to reload the window after Claude Code auto-updates. Claude Code loads fresh, unpatched copies of its own bundles into memory on update, which silently drops Power Claude's tab icons and in-chat decorations until a reload; Power Claude re-applies the patches on disk and then offers a one-time reload (only after the patch has actually landed). Turn OFF to suppress the prompt."
          },
          "powerClaude.sessionExplorer.archivedGroupVisible": {
            "type": "boolean",
            "default": true,
            "description": "When ON, the Session Explorer tree shows an 'Archived' group containing every session marked archived (auto or manual). Turn OFF to hide the Archived group entirely and rely on tags/search to find old sessions."
          },
          "powerClaude.sessionExplorer.rememberResumeChoice": {
            "type": "boolean",
            "default": true,
            "description": "When ON, the Session Explorer remembers your most recent answer to 'Continue with prompt' vs 'Resume silently' and reuses it for subsequent right-click → Resume actions in the same VS Code window. Reset by switching VS Code window or clearing the global state."
          },
          "powerClaude.timelineTracking.enabled": {
            "type": "boolean",
            "default": true,
            "description": "When true, Power Claude's Timeline provider surfaces Claude Code edits in VS Code's Timeline view. Requires installing the PostToolUse hook via 'Power Claude: Install Timeline Hook'."
          },
          "powerClaude.licenseKey": {
            "type": "string",
            "default": "",
            "markdownDescription": "Your Power Claude license key from [neural-llm.com](https://neural-llm.com/power-claude). Leave blank to run your free trial; a key is required to keep paid features active after the trial ends. The key is validated against `neural-llm.com/license/validate` and cached locally for 24 hours — no external calls on every keystroke. Run **Power Claude: Refresh License** from the command palette to clear the cache and re-validate immediately (e.g. after a subscription renewal)."
          },
          "powerClaude.reviewPrompt.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Occasionally invite you to leave a marketplace review. The decision to show anything is made server-side and only for genuinely satisfied users — never during trial issues, billing problems, or cancellation. You can always trigger it yourself via the \"Power Claude: Leave a Review\" command, or turn the automatic invite off here. No prompt content or credentials are ever sent."
          },
          "powerClaude.telemetry.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Send anonymized event telemetry to Power Claude so we can debug issues you report. No prompt content, no credentials, no file paths — events pass through a sanitizer that redacts API keys, OAuth tokens, JWTs, emails, phone numbers, home-directory paths, and any string matching prompt-injection patterns. Requires a configured endpoint below."
          },
          "powerClaude.telemetry.endpoint": {
            "type": "string",
            "default": "https://api.neural-llm.com/telemetry",
            "description": "HTTPS endpoint that receives sanitized telemetry batches. Leave blank to disable transport even if the toggle above is on."
          },
          "powerClaude.telemetry.minLevel": {
            "type": "string",
            "enum": [
              "debug",
              "info",
              "warn",
              "error"
            ],
            "default": "warn",
            "description": "Minimum event severity to capture for telemetry. 'warn' = only warnings + errors, 'error' = errors only. Higher (debug) captures more; lower (error) captures less."
          },
          "powerClaude.logLevel": {
            "type": "string",
            "enum": [
              "trace",
              "debug",
              "verbose",
              "info",
              "warn",
              "error"
            ],
            "enumDescriptions": [
              "TRACE — every poll/heartbeat tick (auto-resume probes, sub-second loops). Highest volume; for diagnosing 'is this code path even running'.",
              "DEBUG — granular execution path tracing (state-change ticks, decision branches). Off in normal use; on while reproducing a bug.",
              "VERBOSE — extended state mutations and intermediate steps; quieter than DEBUG, noisier than INFO.",
              "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation.",
              "WARN — recoverable issues (fallback used, throttle deferred, file not found).",
              "ERROR — failures that impact functionality."
            ],
            "default": "info",
            "description": "Verbosity of the extension's local diagnostic output channel and rate-limit handler logs. 'debug' is the most verbose — recommended when reproducing an issue. The extension writes the chosen level to ~/.power-claude/config/ so the rate-limit handler shell scripts can pick it up at runtime."
          },
          "powerClaude.logExport.outputDir": {
            "type": "string",
            "default": "",
            "description": "Default directory for 'Power Claude: Export Logs (Sanitized)'. Leave blank to be prompted each time."
          },
          "powerClaude.logExport.includeRateLimitLogs": {
            "type": "boolean",
            "default": true,
            "description": "Include ~/.power-claude/logs/*.log and events.jsonl in the exported bundle (sanitized)."
          },
          "powerClaude.logExport.includeHandlerLogs": {
            "type": "boolean",
            "default": true,
            "description": "Include the rate-limit handler decision-trail and combined logs in the exported bundle (sanitized)."
          },
          "powerClaude.watchdog.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Enable the session-resilience watchdog. When ON, Power Claude polls active sessions every 30s and detects deaths that the rate-limit recovery system can't see (process kill, OOM, IDE crash, network drop mid-tool, sessions ended with task items still pending) and silently auto-resumes. Requires lifecycle hooks to be installed for heartbeat baselines."
          },
          "powerClaude.watchdog.heartbeatStaleSec": {
            "type": "number",
            "default": 120,
            "minimum": 30,
            "description": "Heartbeat-stale threshold in seconds. The watchdog fires when no `lifecycle:heartbeat` record has appeared in this many seconds AND the session's JSONL has been idle for the same period. Lifecycle hooks at ~/.power-claude/hooks/lifecycle/heartbeat.sh (PostToolUse) write these markers. Lower = faster detection but more false-positives on long-running tools."
          },
          "powerClaude.watchdog.toolTruncationStaleSec": {
            "type": "number",
            "default": 60,
            "minimum": 10,
            "description": "Tool-truncation threshold in seconds. The watchdog fires when the most recent assistant record has stop_reason=tool_use AND no follow-up tool_result user record has arrived within this many seconds. Catches network drops and process kills that occurred mid-tool-call."
          },
          "powerClaude.watchdog.flagIncompleteOnStop": {
            "type": "boolean",
            "default": true,
            "description": "When ON, flag sessions that ended cleanly via the Stop hook BUT left task items in pending or in_progress status. The Sessions UI surfaces these with a yellow badge and the watchdog offers (but does not silently auto-resume) a recovery QuickPick — these are intentional pauses, not deaths. Turn OFF to ignore unfinished-task signals on cleanly-stopped sessions."
          },
          "powerClaude.watchdog.maxResumeAgeHours": {
            "type": "number",
            "default": 24,
            "minimum": 1,
            "description": "Max session age (hours) for watchdog auto-resume. Sessions older than this are skipped — the user has likely moved on. Default 24h covers overnight gaps; raise if you want week-old sessions to still be recoverable."
          },
          "powerClaude.watchdog.pollIntervalSec": {
            "type": "number",
            "default": 30,
            "minimum": 10,
            "maximum": 300,
            "description": "How often (seconds) the watchdog scans active sessions for deaths. Lower = faster crash detection at slightly more CPU per scan; higher = laxer detection. Clamped to 10–300s. Default 30s. Takes effect immediately on change (the watchdog is rebuilt with the new interval)."
          },
          "powerClaude.watchdog.compactThrashAutoRecover": {
            "type": "boolean",
            "default": true,
            "description": "When ON (the default), the watchdog automatically recovers sessions that hit Claude Code's \"Autocompact is thrashing\" failure mode by running the Context Trim + Fresh Resume strategy: it exports a trimmed summary (where you were, unfinished to-dos, files touched) and opens a fresh Claude session in a terminal seeded with it. A naive --resume just re-thrashes, so this is the only correct recovery path. This recovery is independent of the `powerClaude.devMode.autoOpenSessions` gate (that gate governs bulk session re-opening, which can open workspace tabs; thrash recovery opens a focus-preserving terminal in the current directory and is a distinct, fault-confirmed, single-session path). Turn OFF to instead get a notification with a one-click \"Recover now\" action when a thrash is detected."
          },
          "powerClaude.autoNudge.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Auto-Resume Nudges (Pro). When ON, the Stop hook scans the model's last message and automatically re-issues the turn if it stopped for a 'trivial' reason — asking permission to continue, offering a multi-choice menu when one option is obvious, telling YOU to run a command Claude could run itself, etc. Each individual nudge is a separate toggle below. A hard-stop veto list ensures genuine blockers (auth failure, missing credential, approval gate) always stop. Requires Power Mode."
          },
          "powerClaude.autoNudge.loopGuardMax": {
            "type": "number",
            "default": 3,
            "minimum": 1,
            "maximum": 10,
            "description": "Max consecutive auto-nudges per session before the loop guard lets the next Stop be a real stop. Prevents Claude+nudge from ping-ponging on a stubborn pattern. Default 3 — covers the common 'asked permission three times' tic without letting a misfire loop forever."
          },
          "powerClaude.autoNudge.shadowMode": {
            "type": "boolean",
            "default": false,
            "description": "Shadow mode — log every would-fire decision to ~/.power-claude/logs/events.jsonl but do NOT actually resume. Use this for a week before flipping enabled=true to audit which nudges fire and tune your toggles."
          },
          "powerClaude.autoNudge.brandBadge": {
            "type": "boolean",
            "default": true,
            "description": "Brand the auto-resume notice in the VS Code chat. When Power Claude auto-resumes a stopped turn it posts a '⚡ Power Claude auto-resumed this turn' line; with this on, the webview upgrades that line to the Power Claude bolt-logo badge with a purple accent so the resume is attributable at a glance. Off = the plain ⚡ text line only (still shown in the CLI). Secondary kill switch: localStorage['pc-feature-autoresume-badge']='0' in the webview."
          },
          "powerClaude.sessionRestore.extendNativeTtl": {
            "type": "boolean",
            "default": true,
            "description": "Keep a reopened Claude tab bound to its previous session. Claude Code's native tab restore silently discards the tab's saved session when it is more than 10 minutes old and opens a brand-new empty session instead — which is exactly what happens after a slow reload or under heavy system load. With this on, Power Claude extends that native restore window to 7 days so a previously-open tab reliably comes back with the session it had. Off = revert to the stock 10-minute window."
          },
          "powerClaude.autoNudge.objectiveMode": {
            "type": "boolean",
            "default": true,
            "markdownDescription": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation."
          },
          "powerClaude.autoNudge.aggressiveness": {
            "type": "string",
            "enum": [
              "conservative",
              "balanced",
              "aggressive"
            ],
            "default": "balanced",
            "enumDescriptions": [
              "Never auto-resume on a deterministic signal alone — every would-continue is confirmed by the triage model first. Safest, most model calls (~14% of stops).",
              "Clean trivial continuations resume deterministically (no model); only genuinely mixed remaining-lists escalate to item-level triage (~4% of stops). Recommended.",
              "Trusts the deterministic gate most — a trailing question alone no longer forces an escalation, so more stops resume without a model call (~3% of stops)."
            ],
            "description": "How readily Auto-Resume continues a stopped turn. The deterministic tier engine (@hurc/stop-classifier) decides park / continue / escalate; this dial sets where the continue↔escalate boundary sits. The triage model is only consulted on 'escalate'."
          },
          "powerClaude.autoNudge.nudges": {
            "type": "object",
            "description": "Per-nudge on/off toggles. Each key matches an entry in ~/.power-claude/config/nudges.json. Defaults: 6 ON (high-confidence patterns, the two Haiku-confirmed ones included), 4 OFF (opt-in for the more aggressive ones).",
            "default": {
              "ask-permission-to-continue": true,
              "offer-multi-choice": true,
              "tell-user-to-do-work": true,
              "pseudo-checkpoint": true,
              "promised-continuation": true,
              "complete-remaining-tasks": true,
              "multi-session-defer": false,
              "ask-to-verify": false,
              "sample-instead-of-all": false,
              "restate-then-stop": false
            },
            "properties": {
              "ask-permission-to-continue": {
                "type": "boolean",
                "description": "Detect 'Want me to continue?' / 'Should I keep going?' — re-inject 'Continue. Don't ask permission for obvious next steps.'"
              },
              "offer-multi-choice": {
                "type": "boolean",
                "description": "Detect 'Three reasonable next moves — 1) … 2) … 3) … which?' — re-inject 'Pick the most obvious option and proceed.'"
              },
              "tell-user-to-do-work": {
                "type": "boolean",
                "description": "Detect 'You can run X to verify' / 'You'll need to deploy this' — re-inject 'You have the tools to do this yourself. Don't delegate execution back to the user.'"
              },
              "pseudo-checkpoint": {
                "type": "boolean",
                "description": "Detect 'Good stopping point' / 'Let's pause here' without a real reason — re-inject 'Continue to the next concrete deliverable.'"
              },
              "multi-session-defer": {
                "type": "boolean",
                "description": "Detect 'This is multi-session work — let's pick this up next time' — re-inject 'Don't preemptively defer to a future session.'"
              },
              "ask-to-verify": {
                "type": "boolean",
                "description": "Detect 'Want me to take a screenshot to verify?' when verifying is the obvious next step — re-inject 'Just verify; don't ask first.'"
              },
              "sample-instead-of-all": {
                "type": "boolean",
                "description": "Detect 'Should I do this for the first 5, or all of them?' when 'all' is obviously correct — re-inject 'Apply to the whole set.'"
              },
              "restate-then-stop": {
                "type": "boolean",
                "description": "Detect long 'here's where we are' restatement followed by a stalling question — re-inject 'Don't summarize state as a stalling tactic.'"
              },
              "promised-continuation": {
                "type": "boolean",
                "description": "Detect 'I'll continue this automatically once X finishes' / 'I'll resume when …' — the agent promised to keep going but ended its turn. ON by default; confirmed by a fast Haiku call before resuming (the veto layer already catches 'once you've verified'-style waits on the user). Requires ANTHROPIC_API_KEY in the Stop-hook env — the confirm gate no-ops (never resumes) without it."
              },
              "complete-remaining-tasks": {
                "type": "boolean",
                "description": "Detect 'Remaining tasks/sequence/plan: …' / 'Next steps: …' / 'the rest of the …' / 'left to do' when the listed work was part of your original request. ON by default; each match is confirmed by a fast Haiku call before resuming, so ambiguous lists don't auto-continue past real decisions. Requires ANTHROPIC_API_KEY in the Stop-hook env — the confirm gate no-ops (never resumes) without it."
              }
            }
          },
          "powerClaude.autoNudge.fallback.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Optional LLM fallback. When ON, and no deterministic nudge pattern matched, call the configured model with a terse classifier prompt to decide whether to resume anyway. On by default — the deterministic catalog covers the high-confidence ~17% of stops; the fallback handles the long tail. NOTE: this calls the configured model (default Haiku 4.5) on stops the catalog didn't match, so it incurs a small per-stop API cost and requires ANTHROPIC_API_KEY in the environment that runs the Stop hook; if no key is present the fallback silently no-ops. Turn OFF to stay purely deterministic at zero extra cost."
          },
          "powerClaude.autoNudge.fallback.model": {
            "type": "string",
            "default": "claude-haiku-4-5-20251001",
            "description": "Model used for the optional LLM fallback classifier. Haiku 4.5 is the default — cheapest, fastest, adequate for a binary trivial-vs-real classification. Bump to a stronger model if you see the fallback over-firing or missing cases."
          },
          "powerClaude.autoNudge.fallback.effort": {
            "type": "string",
            "default": "fast",
            "enum": [
              "fast",
              "balanced",
              "thorough"
            ],
            "description": "Effort budget for the LLM fallback. 'fast' caps the response at ~128 tokens; 'thorough' raises to ~256 and is recommended only when shadowMode tells you fast misclassifies."
          },
          "powerClaude.autoNudge.featureDiscovery.enabled": {
            "type": "boolean",
            "default": true,
            "description": "Suggest enabling off-by-default Auto-Resume nudges after Power Claude observes they would have helped. When a disabled nudge with a shadow-on-disable flag matches N times within the rolling window, a one-shot toast offers Enable / Not now / Don't ask again."
          },
          "powerClaude.autoNudge.featureDiscovery.threshold": {
            "type": "number",
            "default": 3,
            "minimum": 1,
            "maximum": 20,
            "description": "How many would-have-fired observations of the same nudge must accrue within the window before the discovery toast appears."
          },
          "powerClaude.autoNudge.featureDiscovery.windowDays": {
            "type": "number",
            "default": 14,
            "minimum": 1,
            "maximum": 90,
            "description": "Rolling window in days over which would-have-fired observations are counted toward the discovery threshold."
          },
          "powerClaude.proxy.autoStart": {
            "type": "boolean",
            "default": false,
            "description": "When ON, auto-start the legacy rotation proxy. Public default is OFF — official-cli transport does not use the proxy. Only enable for internal legacy-proxy builds (POWER_CLAUDE_TRANSPORT=legacy-proxy).",
            "markdownDescription": "When ON, auto-start the legacy rotation proxy. Public default is OFF — official-cli transport does not use the proxy. Only enable for internal legacy-proxy builds (POWER_CLAUDE_TRANSPORT=legacy-proxy)."
          },
          "powerClaude.setup.autoEnableBackgroundServices": {
            "type": "boolean",
            "default": true,
            "description": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation."
          },
          "powerClaude.proxy.hideFallbackBanner": {
            "type": "boolean",
            "default": false,
            "description": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation."
          },
          "powerClaude.proxy.port": {
            "type": "number",
            "default": 3456,
            "description": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation."
          },
          "powerClaude.proxy.switchThreshold": {
            "type": "number",
            "default": 0.98,
            "minimum": 0,
            "maximum": 1,
            "description": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation."
          },
          "powerClaude.proxy.pinnedAccounts": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "default": [],
            "description": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation."
          },
          "powerClaude.proxy.pinnedTiers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "default": [],
            "description": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation."
          }
        }
      },
      {
        "title": "Power Claude: 🔄 Auto-Rewake",
        "order": 3,
        "properties": {
          "powerClaude.autoRewake.stuckThresholdAttempts": {
            "type": "number",
            "default": 30,
            "minimum": 5,
            "maximum": 500,
            "order": 1,
            "description": "Number of consecutive rewake attempts with the same reset-at timestamp before the auto-rewake hook declares itself stuck and stops. Range: 5–500. The bash hook reads this from ~/.power-claude/config/auto-rewake-config.json, which the extension auto-derives from this VS Code setting on every change.",
            "markdownDescription": "Number of consecutive rewake attempts with the same reset-at timestamp before the auto-rewake hook declares itself stuck and stops.\n\n- Range: **5–500** (default `30`).\n- The bash hook reads this from `~/.power-claude/config/auto-rewake-config.json`, which the extension auto-derives from this VS Code setting on every change.\n- VS Code Settings is the single source of truth. The JSON file is a derived cache and should never be hand-edited."
          },
          "powerClaude.autoRewake.stalenessBannerSeconds": {
            "type": "number",
            "default": 60,
            "minimum": 30,
            "maximum": 600,
            "order": 2,
            "description": "Seconds after a rate-limit event before the dashboard shows a staleness banner. Range: 30–600.",
            "markdownDescription": "Seconds after a rate-limit event before the dashboard shows a staleness banner.\n\n- Range: **30–600** (default `60`)."
          },
          "powerClaude.autoRewake.preferPremiumAccounts": {
            "type": "boolean",
            "default": true,
            "order": 3,
            "description": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation.",
            "markdownDescription": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation."
          },
          "powerClaude.autoRewake.deferredRewakeMechanism": {
            "type": "string",
            "enum": [
              "systemd-run"
            ],
            "default": "systemd-run",
            "order": 4,
            "description": "The mechanism used to schedule deferred rewakes after all accounts are cooling. Only systemd-run is supported today.",
            "markdownDescription": "The mechanism used to schedule deferred rewakes after all accounts are cooling.\n\n- `systemd-run` *(default, only supported value today)*"
          },
          "powerClaude.autoRewake.userExtras.default": {
            "type": "string",
            "default": "",
            "order": 5,
            "description": "Context string injected into Claude's wake-up prompt on every rewake, regardless of rate-limit type. Leave blank to skip. Useful for briefing the LLM on what task was in progress.",
            "markdownDescription": "Context string injected into Claude's wake-up prompt on **every** rewake, regardless of rate-limit type. Leave blank to skip.\n\nUseful for briefing the LLM on what task was in progress. Per-type overrides (below) take precedence when the matching rate-limit type fires."
          },
          "powerClaude.autoRewake.userExtras.perType.usage-5h": {
            "type": "string",
            "default": "",
            "order": 6,
            "description": "Override injected on usage-5h rewakes (instead of the default). Leave blank to fall back to the default."
          },
          "powerClaude.autoRewake.userExtras.perType.usage-weekly": {
            "type": "string",
            "default": "",
            "order": 7,
            "description": "Override injected on usage-weekly rewakes (instead of the default). Leave blank to fall back to the default."
          },
          "powerClaude.autoRewake.userExtras.perType.server-error": {
            "type": "string",
            "default": "",
            "order": 8,
            "description": "Override injected on server-error rewakes (instead of the default). Leave blank to fall back to the default."
          },
          "powerClaude.autoRewake.userExtras.perType.server-error-escalated": {
            "type": "string",
            "default": "",
            "order": 9,
            "description": "Override injected on escalated server-error rewakes (instead of the default). Leave blank to fall back to the default."
          },
          "powerClaude.autoRewake.userExtras.perType.capacity": {
            "type": "string",
            "default": "",
            "order": 10,
            "description": "Override injected on capacity rewakes (instead of the default). Leave blank to fall back to the default."
          },
          "powerClaude.autoRewake.userExtras.perType.throttle": {
            "type": "string",
            "default": "",
            "order": 11,
            "description": "Override injected on throttle rewakes (instead of the default). Leave blank to fall back to the default."
          },
          "powerClaude.autoRewake.userExtras.perType.all-accounts-exhausted": {
            "type": "string",
            "default": "",
            "order": 12,
            "description": "Override injected on all-accounts-exhausted rewakes (instead of the default). Leave blank to fall back to the default."
          }
        }
      },
      {
        "title": "Power Claude: Self-Heal",
        "order": 98,
        "properties": {
          "powerClaude.selfHeal.autoReloadOnBreach": {
            "type": "boolean",
            "default": false,
            "order": 1,
            "markdownDescription": "**Auto-reload the VS Code window when a sustained extension-host memory breach is detected.**\n\nWhen `false` (default): a non-blocking warning toast appears with a **Reload Window** button — you choose when to reload.\n\nWhen `true`: after a configurable grace period (`selfHeal.autoReloadGraceSec`), the window reloads automatically without further input. This is aggressive: any unsaved work in the editor buffer will be restored by VS Code, but terminal sessions are interrupted.\n\nUseful on long-running shared dev servers where the 71 GB extension-host scenario needs automated recovery without anyone at the keyboard. Leave `false` for interactive use."
          },
          "powerClaude.selfHeal.autoReloadGraceSec": {
            "type": "number",
            "default": 60,
            "minimum": 10,
            "maximum": 300,
            "order": 2,
            "description": "Seconds to wait after a sustained memory breach is detected before auto-reloading the window. Only takes effect when powerClaude.selfHeal.autoReloadOnBreach is true. Minimum 10s (gives you time to cancel). Default: 60s."
          }
        }
      },
      {
        "title": "Power Claude: ⚡ Auto-Tuning & Calibration",
        "order": 7,
        "properties": {
          "powerClaude.calibration.enabled": {
            "type": "boolean",
            "default": true,
            "order": 1,
            "description": "Interactive calibration — let Power Claude learn your preferences over time with a short, occasional interview (at most one prompt per session-end) and set the matching setting for you. Turn this OFF to stop all calibration interviews instantly. (The global `pc emergency off` kill switch also disables it.)",
            "markdownDescription": "**Interactive calibration** — let Power Claude learn your preferences over time with a short, occasional interview (at most one prompt per session-end) and set the matching setting for you.\n\nTurn this **off** to stop all calibration interviews instantly. Per-setting toggles live below. The global `pc emergency off` kill switch also disables it."
          },
          "powerClaude.calibration.autoNudge.aggressiveness.enabled": {
            "type": "boolean",
            "default": true,
            "order": 2,
            "description": "Calibrate the auto-resume / auto-nudge eagerness (powerClaude.autoNudge.aggressiveness) by interview. Turn off to stop just this one calibration while leaving others on. Only applies when powerClaude.calibration.enabled is true."
          },
          "powerClaude.calibration.posture": {
            "type": "string",
            "enum": [
              "gentle",
              "medium",
              "precise"
            ],
            "enumDescriptions": [
              "Ask me the least — set the value as soon as there's a rough signal (lower confidence).",
              "Ask a few times — a balance of accuracy and interruptions (recommended).",
              "Dial it in — keep asking until highly confident before setting the value."
            ],
            "default": "medium",
            "order": 3,
            "description": "How precisely calibration should learn before it sets a value — i.e. how many interviews it needs. gentle = fewest prompts, precise = most. Default: medium."
          },
          "powerClaude.jitSetup.enabled": {
            "type": "boolean",
            "default": true,
            "order": 4,
            "description": "Just-in-time setup offers — when a Power Claude feature would first help, show a one-time, dismissible offer to enable/configure it (instead of hunting through Settings). 'Not now' is re-offered later; 'Don't ask again' suppresses it. Turn this off to never see first-run offers; per-feature offers can be disabled with powerClaude.jitSetup.<feature>.enabled."
          }
        }
      },
      {
        "title": "Power Claude: Developer",
        "order": 98,
        "properties": {
          "powerClaude.dev.autoReloadOnInstall": {
            "type": "boolean",
            "default": false,
            "order": 1,
            "markdownDescription": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation."
          },
          "powerClaude.autoActivateOnInstall": {
            "type": "boolean",
            "default": true,
            "order": 2,
            "markdownDescription": "When a newer Power Claude build is installed into this editor (marketplace update, VSIX, or local install), automatically activate it: on desktop VS Code restart the Extension Host; on code-server / web show a clear notice (those hosts cannot hot-load). Default ON so the dashboard version does not stay stuck on the old build until a full window reload. Turn OFF to require a manual reload only. Always verifies a prior hot-activate attempt so a failed update is never silent."
          }
        }
      },
      {
        "title": "Power Claude: Fail-Open Shim (v2 routing chokepoint — experimental)",
        "order": 98,
        "properties": {
          "powerClaude.failOpenShim.enabled": {
            "type": "boolean",
            "default": false,
            "order": 1,
            "description": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation.",
            "markdownDescription": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation."
          }
        }
      },
      {
        "title": "Power Claude: Detached Sessions (experimental — Pro)",
        "order": 97,
        "properties": {
          "powerClaude.detachedSessions.enabled": {
            "type": "boolean",
            "default": false,
            "order": 1,
            "description": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation.",
            "markdownDescription": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation."
          },
          "powerClaude.detachedSessions.turnTimeoutMinutes": {
            "type": "number",
            "default": 60,
            "minimum": 5,
            "maximum": 360,
            "order": 2,
            "description": "Hard ceiling (systemd RuntimeMaxSec) for a single detached turn. systemd self-kills the turn if it runs longer, bounding worst-case spend if you never come back. Default: 60 minutes."
          },
          "powerClaude.detachedSessions.idleReapMinutes": {
            "type": "number",
            "default": 30,
            "minimum": 5,
            "maximum": 240,
            "order": 3,
            "description": "The background watchdog stops a detached session that has produced no output for this long, so an abandoned turn can't sit idle holding an account. Default: 30 minutes."
          },
          "powerClaude.detachedSessions.maxConcurrent": {
            "type": "number",
            "default": 1,
            "minimum": 1,
            "order": 4,
            "markdownDescription": "Legacy / internal only. Unused when transport is official-cli (public default). Public builds use official Claude Code transport and Claude Code profiles — not consumer-account pooling or automatic credential rotation."
          }
        }
      },
      {
        "title": "Power Claude: Update Notifier",
        "order": 99,
        "properties": {
          "powerClaude.updateNotifier.enabled": {
            "type": "boolean",
            "default": true,
            "order": 1,
            "description": "Check once per day for newer Power Claude releases and show a non-blocking toast when behind. Disable to silence both the toast and the CLI banner. The check polls https://neural-llm.com/api/v1/power-claude/manifest.json once per 24h and caches the result in ~/.power-claude/cache/update-check.json. Setting the POWER_CLAUDE_NO_UPDATE_CHECK=1 environment variable overrides this setting on both the extension and CLI."
          }
        }
      },
      {
        "title": "Power Claude: 🩹 Session Actions",
        "order": 60,
        "properties": {
          "powerClaude.sessionActions.enabled": {
            "type": "boolean",
            "default": true,
            "order": 1,
            "markdownDescription": "Master switch for **Session Actions** — PC-branded recovery actions (Heal, Unstick, Revive, Re-run tool, Finish tasks, Resume, Repair turn) surfaced when a session is stuck or failed. They appear inline on the offending chat line, in the session list, in the `Power Claude: Session Actions` command, and via `pc session action` on the CLI. Turn off to hide every surface and stop the intent watcher from acting. See `docs/features/session/actions.md`."
          },
          "powerClaude.sessionActions.heal.enabled": {
            "type": "boolean",
            "default": true,
            "order": 10,
            "description": "Show the Heal action (trim & resume) on context-overflow / compaction-thrash sessions — i.e. when a turn fails with \"Prompt is too long\"."
          },
          "powerClaude.sessionActions.heal.strategy": {
            "type": "string",
            "default": "",
            "enum": [
              "",
              "context-trim-resume",
              "fork-from-checkpoint",
              "tool-rerun",
              "pending-task-injection",
              "naive-resume",
              "orphaned-turn-trim",
              "manual-export"
            ],
            "order": 11,
            "description": "Recovery strategy the Heal action runs. Empty = the action's default (context-trim-resume)."
          },
          "powerClaude.sessionActions.unstick.enabled": {
            "type": "boolean",
            "default": true,
            "order": 20,
            "description": "Show the Unstick action (fork from the last good checkpoint) on sessions caught in a repeating tool loop."
          },
          "powerClaude.sessionActions.unstick.strategy": {
            "type": "string",
            "default": "",
            "enum": [
              "",
              "context-trim-resume",
              "fork-from-checkpoint",
              "tool-rerun",
              "pending-task-injection",
              "naive-resume",
              "orphaned-turn-trim",
              "manual-export"
            ],
            "order": 21,
            "description": "Recovery strategy the Unstick action runs. Empty = the action's default (fork-from-checkpoint)."
          },
          "powerClaude.sessionActions.revive.enabled": {
            "type": "boolean",
            "default": true,
            "order": 30,
            "description": "Show the Revive action (fork from checkpoint) on crashed / abandoned sessions."
          },
          "powerClaude.sessionActions.revive.strategy": {
            "type": "string",
            "default": "",
            "enum": [
              "",
              "context-trim-resume",
              "fork-from-checkpoint",
              "tool-rerun",
              "pending-task-injection",
              "naive-resume",
              "orphaned-turn-trim",
              "manual-export"
            ],
            "order": 31,
            "description": "Recovery strategy the Revive action runs. Empty = the action's default (fork-from-checkpoint)."
          },
          "powerClaude.sessionActions.rerunTool.enabled": {
            "type": "boolean",
            "default": true,
            "order": 40,
            "description": "Show the Re-run tool action on sessions whose last turn was truncated mid tool-call."
          },
          "powerClaude.sessionActions.rerunTool.strategy": {
            "type": "string",
            "default": "",
            "enum": [
              "",
              "context-trim-resume",
              "fork-from-checkpoint",
              "tool-rerun",
              "pending-task-injection",
              "naive-resume",
              "orphaned-turn-trim",
              "manual-export"
            ],
            "order": 41,
            "description": "Recovery strategy the Re-run tool action runs. Empty = the action's default (tool-rerun)."
          },
          "powerClaude.sessionActions.finishTasks.enabled": {
            "type": "boolean",
            "default": true,
            "order": 50,
            "description": "Show the Finish tasks action (resume + inject pending TODOs) on sessions that ended with unfinished plan items."
          },
          "powerClaude.sessionActions.finishTasks.strategy": {
            "type": "string",
            "default": "",
            "enum": [
              "",
              "context-trim-resume",
              "fork-from-checkpoint",
              "tool-rerun",
              "pending-task-injection",
              "naive-resume",
              "orphaned-turn-trim",
              "manual-export"
            ],
            "order": 51,
            "description": "Recovery strategy the Finish tasks action runs. Empty = the action's default (pending-task-injection)."
          },
          "powerClaude.sessionActions.resume.enabled": {
            "type": "boolean",
            "default": true,
            "order": 60,
            "description": "Show the Resume action on sessions that went idle (stale heartbeat) or are stuck after a rate-limit window."
          },
          "powerClaude.sessionActions.resume.strategy": {
            "type": "string",
            "default": "",
            "enum": [
              "",
              "context-trim-resume",
              "fork-from-checkpoint",
              "tool-rerun",
              "pending-task-injection",
              "naive-resume",
              "orphaned-turn-trim",
              "manual-export"
            ],
            "order": 61,
            "description": "Recovery strategy the Resume action runs. Empty = the action's default (naive-resume)."
          },
          "powerClaude.sessionActions.repairTurn.enabled": {
            "type": "boolean",
            "default": true,
            "order": 70,
            "description": "Show the Repair turn action on sessions wedged by an orphaned/modified thinking turn (HTTP 400 on resume)."
          },
          "powerClaude.sessionActions.repairTurn.strategy": {
            "type": "string",
            "default": "",
            "enum": [
              "",
              "context-trim-resume",
              "fork-from-checkpoint",
              "tool-rerun",
              "pending-task-injection",
              "naive-resume",
              "orphaned-turn-trim",
              "manual-export"
            ],
            "order": 71,
            "description": "Recovery strategy the Repair turn action runs. Empty = the action's default (orphaned-turn-trim)."
          }
        }
      },
      {
        "title": "Power Claude: ⚡ Wake Actuator",
        "properties": {
          "powerClaude.wakeActuator.enabled": {
            "type": "boolean",
            "default": false,
            "order": 1,
            "description": "⚡ Power Claude Wake Actuator — when enabled, Power Claude proactively resumes a parked session when a teammate or another session sends it a cross-session message via the harness bus. The wake actuator watches ~/.hurc-harness/state/session/messaging/.wake/requests/ and re-invokes the session via the Claude Code editor API. Gated by leader election (only one window actuates per event), per-target cooldown (30s), msgId dedup (persisted across restarts), and chainDepth cap. Honors the emergency-off sentinel. Default OFF for v1 (opt-in); enable alongside the harness cross-session messaging feature.",
            "markdownDescription": "**⚡ Power Claude Wake Actuator** — proactively resume a parked session when it receives a cross-session message.\n\n- Watches the harness wake-request directory and re-invokes the target session via the Claude Code editor API.\n- **Safety**: leader-elected (one window actuates per event), per-target 30s cooldown, restart-safe msgId dedup, chainDepth cap, emergency-off honored.\n- **Default OFF** for v1 — enable once you are using the harness cross-session messaging feature (`pc msg send`).\n- The resume prompt is always the constant *\"Continue from where you left off.\"* — never read from the message payload."
          },
          "powerClaude.wakeActuator.pollIntervalMs": {
            "type": "number",
            "default": 8000,
            "minimum": 1000,
            "maximum": 60000,
            "order": 2,
            "description": "How often (ms) the wake actuator polls the wake-request directory as a fallback when fs.watch events are not reliable (WSL2, NFS, Docker bind mounts). Default 8000ms. The fs.watch watcher runs unconditionally alongside this poll."
          }
        }
      },
      {
        "title": "Power Claude: ⚡ Inbound Messages",
        "properties": {
          "powerClaude.inboundMessages.enabled": {
            "type": "boolean",
            "default": true,
            "order": 1,
            "feature": "pc-inbound-messages",
            "description": "⚡ Power Claude Inbound Messages — when enabled, Power Claude watches the harness inbox for sessions open in this window. Cross-session messages are AI-agent-to-AI-agent traffic delivered invisibly into the receiving session's model context by the harness; nothing opens automatically for the human. The ⚡ Power Claude Messages panel is available on demand (Command Palette: 'Power Claude: Show Inbound Messages') and shows the full message history (sender, subject, body, timestamp). All message content is treated as untrusted and HTML-escaped before display; enableScripts is false.",
            "markdownDescription": "**⚡ Power Claude Inbound Messages** — track cross-session AI-agent messages without interrupting the human.\n\n- Watches `inbox/<sessionId>.jsonl` for each session open in this window.\n- These messages are agent-to-agent: the harness already delivers them invisibly into the receiving session's own model context. Nothing is surfaced to the human automatically — no auto-opened tab, no status-bar cue.\n- Open the **branded ⚡ Power Claude panel** on demand via the Command Palette (`Power Claude: Show Inbound Messages`) to review the full message history (sender, kind, timestamp, body) and reply.\n- **Security**: all peer message text is HTML-escaped; the webview runs with `enableScripts: false`.\n- Enable `powerClaude.inboundMessages.showToast` if you want an explicit opt-in toast notification when a message arrives.\n- Default **ON** (governs whether the watcher runs at all — it has no automatic human-facing effect either way)."
          },
          "powerClaude.inboundMessages.showToast": {
            "type": "boolean",
            "default": false,
            "order": 2,
            "feature": "pc-inbound-messages",
            "description": "When true, show an opt-in VS Code toast when a cross-session message arrives, with a 'Show' action that opens the ⚡ Power Claude Messages panel. Default false — cross-session messages are AI-agent-to-AI-agent traffic and nothing is surfaced to the human by default. Enable this only if you personally want to be notified of arrivals."
          }
        }
      }
    ],
    "keybindings": [
      {
        "command": "powerClaude.searchSessions",
        "key": "ctrl+alt+s",
        "mac": "cmd+alt+s",
        "when": "workbenchState != empty"
      },
      {
        "command": "powerClaude.searchOpenTabsQuickPick",
        "key": "ctrl+alt+shift+s",
        "mac": "cmd+alt+shift+s",
        "when": "workbenchState != empty"
      }
    ]
  },
  "scripts": {
    "postinstall": "node -e \"const{existsSync}=require('fs');const{spawnSync}=require('child_process');const steps=['scripts/release/merge-drivers/register.sh','scripts/release/install-bypass-guard.sh'];for (const s of steps){if(!existsSync(s))continue;const r=spawnSync('bash',[s],{stdio:'inherit'});if(s.includes('register')&&r.status)process.exit(r.status??0);}process.exit(0)\"",
    "prepublishOnly": "bash scripts/release/gate/prepublish-npm.sh",
    "vscode:prepublish": "bash scripts/release/prepublish.sh",
    "validate:settings": "if [ -f ../hurc-harness/tools/settings-docs/validate.mjs ]; then node ../hurc-harness/tools/settings-docs/validate.mjs --package package.json --min 40; else echo 'WARN: hurc-harness settings validator missing — skipping settings-docs gate'; fi",
    "docs:settings": "if [ -f ../hurc-harness/tools/settings-docs/generate.mjs ]; then node ../hurc-harness/tools/settings-docs/generate.mjs --package package.json --title \"Power Claude\" --out-md docs/settings/reference.md --out-json docs/settings/reference.json; else echo 'WARN: hurc-harness settings doc generator missing — skipping'; fi",
    "test:prepublish": "node scripts/release/run-vitest-prepublish.mjs",
    "test:prepublish:raw": "vitest run --reporter=basic --no-coverage --config=vitest.config.prepublish.ts",
    "test:replay": "bash test/replay/run-replay-suite.sh",
    "test:messaging": "bash test/messaging/roundtrip.sh",
    "compile": "tsc -p ./ --noEmit",
    "vscode:uninstall": "node ./out/uninstall-hook.js",
    "inject:version": "bash scripts/build/inject-version.sh",
    "vendor:sync": "bash scripts/vendor/sync-token-engines.sh && bash scripts/vendor/sync-jq.sh",
    "sync:media": "node scripts/build/sync-media.mjs --src node_modules/@cj-hurc/webview-ui/static --dest media --prefix pc",
    "deps:refresh-internal": "node scripts/build/refresh-internal-deps.mjs",
    "gen:readme": "node scripts/build/install-channels.mjs --write",
    "gen:savings": "node scripts/build/savings-model.mjs --write",
    "check:savings": "node scripts/build/savings-model.mjs --check",
    "build": "npm run inject:version && npm run gen:readme && npm run gen:savings && npm run vendor:sync && npm run sync:media && node esbuild.config.mjs && node scripts/build/emit-cli-manifest.mjs && node scripts/build/emit-system-index.mjs",
    "build:dev": "npm run deps:refresh-internal && npm run inject:version && npm run gen:readme && npm run gen:savings && npm run vendor:sync && npm run sync:media && PC_DEV_BUILD=1 node esbuild.config.mjs && node scripts/build/emit-cli-manifest.mjs && node scripts/build/emit-system-index.mjs",
    "build:prod": "npm run inject:version && npm run gen:readme && npm run gen:savings && npm run vendor:sync && npm run sync:media && NODE_ENV=production node esbuild.config.mjs && node scripts/build/emit-cli-manifest.mjs && node scripts/build/emit-system-index.mjs",
    "watch": "npm run inject:version && node esbuild.config.mjs --watch",
    "emit:cli-manifest": "node scripts/build/emit-cli-manifest.mjs",
    "emit:onboarding": "node scripts/build/emit-onboarding.mjs",
    "check:onboarding": "node scripts/build/emit-onboarding.mjs --check",
    "emit:system-index": "node scripts/build/emit-system-index.mjs",
    "check:system-index": "node scripts/build/emit-system-index.mjs --check",
    "protect": "node scripts/build/protect.js",
    "embed:key": "node scripts/build/embed-public-key.js",
    "pack:engine": "node scripts/build/pack-runtime-shell.mjs",
    "embed:engine-key": "node scripts/build/embed-engine-key.js",
    "verify:protected": "node scripts/build/verify-protected.js",
    "register:hashes": "node scripts/build/register-code-hashes.mjs",
    "build:protected": "npm run build:prod && npm run protect && npm run embed:key && npm run pack:engine && npm run embed:engine-key && npm run verify:protected",
    "package": "bash scripts/release/package-vsix.sh",
    "package:dev": "mkdir -p dist && cp README.md dist/.README.prestrip.dev && cp CHANGELOG.md dist/.CHANGELOG.prestrip.dev && cp docs/marketplace/public/readme.md README.md && cp docs/marketplace/public/CHANGELOG.public.md CHANGELOG.md && (PC_SKIP_PREPUBLISH=1 vsce package --no-dependencies --out dist/power-claude-$npm_package_version-dev.vsix); STATUS=$?; cp dist/.README.prestrip.dev README.md 2>/dev/null; cp dist/.CHANGELOG.prestrip.dev CHANGELOG.md 2>/dev/null; rm -f dist/.README.prestrip.dev dist/.CHANGELOG.prestrip.dev; exit $STATUS",
    "install:vscode": "code --install-extension dist/power-claude-$npm_package_version.vsix --force",
    "install:cursor": "cursor --install-extension dist/power-claude-$npm_package_version.vsix --force",
    "install:code-server": "code-server --install-extension \"$(pwd)/dist/power-claude-$npm_package_version.vsix\" --force",
    "deploy": "npm run package && npm run install:vscode",
    "deploy:cursor": "npm run package && npm run install:cursor",
    "deploy:code-server": "npm run package && npm run install:code-server",
    "deploy:all": "npm run package && npm run install:vscode; npm run install:code-server",
    "//build-unify": "package:both produces BOTH the prod and the dev .vsix in one run. CRITICAL ORDERING: build:dev MUST run before package:dev — package:dev (PC_SKIP_PREPUBLISH=1) only re-packs the CURRENT out/, so without a preceding build:dev it ships whatever out/ holds (e.g. a prod/__PC_DEV__=false bundle) under a -dev FILENAME → isDevBuild() reports PROD, no dev-unlock. `npm run package` rebuilds out/ as prod (prepublish), then build:dev rebuilds it as dev (PC_DEV_BUILD=1 → __PC_DEV__=true), then package:dev packs that.",
    "package:both": "npm run package && npm run build:dev && npm run package:dev",
    "install:dev": "code --install-extension dist/power-claude-$npm_package_version-dev.vsix --force",
    "deploy:both": "npm run package:both && npm run install:dev",
    "smoke:proxy": "npx ts-node --esm src/proxy/smoke.ts",
    "release:check": "scripts/release/pre-publish-check.sh",
    "release:version-check": "scripts/release/version-check.sh",
    "release:bump": "scripts/release/bump.sh",
    "release:bump:tag": "scripts/release/bump.sh --tag",
    "release:dry-run": "scripts/release/bump.sh --dry-run",
    "sync:public": "scripts/release/sync-public.sh",
    "sync:public:push": "scripts/release/sync-public.sh --push",
    "test": "vitest run",
    "verify": "bash scripts/verify/run.sh",
    "verify:invariants": "bash scripts/verify/run.sh --invariants-only",
    "dedup": "tsx devtools/dedup/similarity.ts --threshold 0.6 --min-stmts 2",
    "dedup:check": "node devtools/dedup/check.mjs",
    "test:workflow": "vitest run --config vitest.config.workflow.ts",
    "test:all": "npm run test && npm run test:workflow && npm run test:replay && npm run test:messaging",
    "test:watch": "vitest",
    "test:coverage": "vitest run --coverage",
    "test:mock": "vitest run src/engine/v2/e2e/mockUpstream.test.ts --no-coverage",
    "test:upstream": "vitest run src/engine/v2/e2e/mockUpstream.test.ts --no-coverage",
    "test:e2e": "POWER_CLAUDE_E2E=1 vitest run src/engine/v2/e2e test/proxy/e2e --no-coverage --reporter=basic",
    "test:install:multi-editor": "bash scripts/release/e2e-multi-editor-install.sh",
    "lint:mirror": "node scripts/build/mirror-lint.mjs",
    "test:integration": "npm run compile:tests && node out-tests/integration/runTest.js",
    "test:ui": "npm run compile:tests && extest setup-and-run -e .extest -i out-tests/ui/**/*.test.js -u out/extension.js",
    "test:workflow:shell": "bats test/workflow/shell/ --recursive",
    "compile:tests": "tsc -p test/tsconfig.json",
    "lint:js": "eslint --config configs/eslint/eslint.config.cjs --no-error-on-unmatched-pattern --pass-on-unpruned-suppressions 'media/dashboard.js' 'media/enhancements/dashboard.js' 'media/tooltip.js'",
    "lint:js:prune": "eslint --config configs/eslint/eslint.config.cjs --no-error-on-unmatched-pattern --prune-suppressions 'media/dashboard.js' 'media/enhancements/dashboard.js' 'media/tooltip.js'",
    "lint:css": "stylelint --config configs/stylelint/stylelint.config.cjs 'media/dashboard.css' 'media/enhancements/dashboard.css' 'media/tooltip.css' 'media/brand/power-claude/badge.css' --allow-empty-input",
    "test:quality": "node scripts/quality/test-quality-engine/selftest.mjs && node scripts/quality/test-quality-engine/scan.mjs --scope official",
    "test:quality:scan": "node scripts/quality/test-quality-engine/scan.mjs --scope all",
    "verify:cross-product": "bash scripts/verify/no-cross-product-hardcoding.sh",
    "e2e:gateway-peer": "bash scripts/verify/e2e-gateway-peer-shell.sh",
    "test:workflow-platform": "vitest run src/shared/workflowPlatform src/shared/session/flow src/shared/trace/loadSpanIntegrity.test.ts src/cli/commands/workflow src/cli/commands/tree.test.ts test/playwright-harness",
    "test:integration:xvfb": "xvfb-run -a npm run test:integration",
    "sandbox:ui": "bash scripts/sandbox/run-ui-sandbox.sh",
    "sandbox:ui:stop": "bash scripts/sandbox/run-ui-sandbox.sh --stop",
    "test:sandbox:ui": "bash scripts/sandbox/run-ui-sandbox.sh --test",
    "test:sandbox:ui:headed": "bash scripts/sandbox/run-ui-sandbox.sh --test --headed",
    "test:sandbox:install": "bash sandbox/run.sh",
    "test:sandbox:all": "npm run test:sandbox:ui && npm run test:workflow-platform && npm run test:integration:xvfb",
    "sandbox:flow:fixtures": "node node_modules/vite-node/vite-node.mjs scripts/sandbox/gen-flow-explorer-fixtures.mts"
  },
  "devDependencies": {
    "@cj-hurc/eslint-plugin": "^0.2.0",
    "@cj-hurc/release-tools": "^0.1.0",
    "@cj-hurc/stylelint-plugin": "^0.2.0",
    "@cj-hurc/webview-ui": "^0.3.0",
    "@resvg/resvg-js": "^2.6.2",
    "@types/chai": "^4.3.11",
    "@types/glob": "^8.1.0",
    "@types/mocha": "^10.0.6",
    "@types/node": "^20.0.0",
    "@types/vscode": "^1.80.0",
    "@typescript-eslint/eslint-plugin": "^8.0.0",
    "@typescript-eslint/parser": "^8.0.0",
    "@vitest/coverage-v8": "^1.6.0",
    "@vscode/test-cli": "^0.0.10",
    "@vscode/test-electron": "^2.4.1",
    "@vscode/vsce": "2.22.0",
    "chai": "^4.4.1",
    "esbuild": "^0.21.0",
    "eslint": "^9.0.0",
    "glob": "^10.3.10",
    "javascript-obfuscator": "^4.2.2",
    "mocha": "^10.7.3",
    "stylelint": "^16.0.0",
    "typescript": "^5.3.0",
    "vitest": "^1.6.0",
    "vscode-extension-tester": "^8.7.0"
  }
}
