diff --git a/src/command/Commands.js b/src/command/Commands.js index caa7c4bd14..e62ff0e073 100644 --- a/src/command/Commands.js +++ b/src/command/Commands.js @@ -303,6 +303,9 @@ define(function (require, exports, module) { /** Opens the terminal panel */ exports.VIEW_TERMINAL = "view.terminal"; // Terminal/main.js _showTerminal() + /** Toggles whether AI features are enabled */ + exports.VIEW_ENABLE_AI = "view.enableAI"; // phoenix-pro aiEnabled.js _handleToggleEnableAI() + /** Toggles line numbers visibility */ exports.TOGGLE_LINE_NUMBERS = "view.toggleLineNumbers"; // EditorOptionHandlers.js _getToggler() diff --git a/src/extensionsIntegrated/Phoenix/phoenix-tour.js b/src/extensionsIntegrated/Phoenix/phoenix-tour.js index 6635a58205..944e224c28 100644 --- a/src/extensionsIntegrated/Phoenix/phoenix-tour.js +++ b/src/extensionsIntegrated/Phoenix/phoenix-tour.js @@ -40,6 +40,7 @@ define(function (require, exports, module) { CommandManager = require("command/CommandManager"), Commands = require("command/Commands"), WorkspaceManager = require("view/WorkspaceManager"), + PreferencesManager = require("preferences/PreferencesManager"), CentralControlBar = require("view/CentralControlBar"); const TOUR_STORAGE_KEY = "phoenixOnboardingTourState"; @@ -89,6 +90,17 @@ define(function (require, exports, module) { const STEP2_PEEK_HOLD_MS = 2000; const SIDEBAR_AI_TAB_ID = "ai"; + /** + * True when the user has deliberately turned AI off (see the `enableAI` + * preference owned by phoenix-pro). The tab is legitimately absent in that + * case, so step 2 skips itself instead of reporting a missing-tab error. + * The pref is undefined in builds without phoenix-pro, hence the explicit + * `=== false` check rather than a falsy test. + */ + function _isAIDisabledByUser() { + return PreferencesManager.get("enableAI") === false; + } + function _markComplete() { _state.version = CURRENT_TOUR_VERSION; _saveState(_state); @@ -391,6 +403,14 @@ define(function (require, exports, module) { _detachStepClickMetric(); _cancelStep2AIPeek(); _ensureSidebarVisible(); + if (_isAIDisabledByUser()) { + // The user turned AI off — there is nothing to introduce, so skip the + // whole step rather than half of it. Checked before the tab lookup so + // this also covers the window between disabling AI and the restart + // that actually removes the tab, where the tab is still in the DOM. + _runStep3(); + return; + } const $tab = $('.sidebar-tab[data-tab-id="ai"]'); if (!$tab.length) { logger.reportError(new Error("phoenix-tour: AI sidebar tab missing at step 2")); diff --git a/src/nls/root/strings.js b/src/nls/root/strings.js index b4bbf0b8de..0a3c898f71 100644 --- a/src/nls/root/strings.js +++ b/src/nls/root/strings.js @@ -1199,6 +1199,7 @@ define({ "CMD_VIEW_TOGGLE_INSPECTION": "Lint Files on Save", "CMD_VIEW_TOGGLE_PROBLEMS": "Problems", "CMD_VIEW_TERMINAL": "Terminal", + "CMD_VIEW_ENABLE_AI": "Enable AI", "CMD_WORKINGSET_SORT_BY_ADDED": "Sort by Added", "CMD_WORKINGSET_SORT_BY_NAME": "Sort by Name", "CMD_WORKINGSET_SORT_BY_TYPE": "Sort by Type", @@ -2019,6 +2020,7 @@ define({ "DESCRIPTION_INDENT_GUIDES_ENABLED": "true to show indent guide lines, else false.", "DESCRIPTION_HIDE_FIRST": "true to show the first Indent Guide line else false.", "DESCRIPTION_CSS_COLOR_PREVIEW": "true to display color previews in the gutter, else false.", + "DESCRIPTION_ENABLE_AI": "true to enable AI features, false to disable AI entirely.", // Emmet "DESCRIPTION_EMMET": "true to enable Emmet, else false.", @@ -2489,6 +2491,14 @@ define({ "AI_UPSELL_DIALOG_TITLE": "Continue with {0}?", "AI_UPSELL_DIALOG_MESSAGE": "You’ve discovered {0}. To proceed, you’ll need an AI subscription or credits.", + // Enable/disable AI toggle + "AI_DISABLE_CONFIRM_TITLE": "Disable AI?", + "AI_DISABLE_CONFIRM_MESSAGE": "This turns off all AI features. The AI panel will be removed and {APP_NAME} will stop connecting to AI services.

Restart {APP_NAME} for this to take effect.", + "AI_DISABLE_CONFIRM_BTN": "Disable AI", + "AI_ENABLE_CONFIRM_TITLE": "Enable AI?", + "AI_ENABLE_CONFIRM_MESSAGE": "This turns AI features back on and restores the AI panel.

Restart {APP_NAME} for this to take effect.", + "AI_ENABLE_CONFIRM_BTN": "Enable AI", + // AI CHAT PANEL "AI_CHAT_TITLE": "Claude Code", "AI_CHAT_SURPRISE_ME_USER_MSG": "Surprise me!",