Skip to content

Commit 30c10b9

Browse files
doscode-krclaude
andcommitted
feat(ui): Persist Plan First and Thinking Mode toggle states
Add persistence for toggle button states across VS Code restarts. Changes: - extension.ts: Add _planModeEnabled and _thinkingModeEnabled instance variables - extension.ts: Load/save toggle states from/to globalState - extension.ts: Include toggle states in _sendCurrentSettings() - extension.ts: Handle toggle state updates in _updateSettings() - script.ts: Send updateSettings message on toggle change - script.ts: Restore toggle UI states when receiving settingsData Previously, Plan First and Thinking Mode toggles reset to off when reopening the chat panel or restarting VS Code. Now these preferences are persisted using VS Code's globalState API. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 505e9b1 commit 30c10b9

File tree

2 files changed

+69
-8
lines changed

2 files changed

+69
-8
lines changed

src/extension.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,8 @@ class ClaudeChatProvider {
153153
private _selectedModel: string = 'default'; // Default model
154154
private _isProcessing: boolean | undefined;
155155
private _draftMessage: string = '';
156+
private _planModeEnabled: boolean = false;
157+
private _thinkingModeEnabled: boolean = false;
156158

157159
constructor(
158160
private readonly _extensionUri: vscode.Uri,
@@ -173,6 +175,10 @@ class ClaudeChatProvider {
173175
// Load cached subscription type (will be refreshed on first message)
174176
this._subscriptionType = this._context.globalState.get('claude.subscriptionType');
175177

178+
// Load saved toggle states
179+
this._planModeEnabled = this._context.globalState.get('claude.planModeEnabled', false);
180+
this._thinkingModeEnabled = this._context.globalState.get('claude.thinkingModeEnabled', false);
181+
176182
// Resume session from latest conversation
177183
const latestConversation = this._getLatestConversation();
178184
this._currentSessionId = latestConversation?.sessionId;
@@ -2598,7 +2604,9 @@ class ClaudeChatProvider {
25982604
'wsl.distro': config.get<string>('wsl.distro', 'Ubuntu'),
25992605
'wsl.nodePath': config.get<string>('wsl.nodePath', '/usr/bin/node'),
26002606
'wsl.claudePath': config.get<string>('wsl.claudePath', '/usr/local/bin/claude'),
2601-
'permissions.yoloMode': config.get<boolean>('permissions.yoloMode', false)
2607+
'permissions.yoloMode': config.get<boolean>('permissions.yoloMode', false),
2608+
'planModeEnabled': this._planModeEnabled,
2609+
'thinkingModeEnabled': this._thinkingModeEnabled
26022610
};
26032611

26042612
this._postMessage({
@@ -2634,7 +2642,15 @@ class ClaudeChatProvider {
26342642

26352643
try {
26362644
for (const [key, value] of Object.entries(settings)) {
2637-
if (key === 'permissions.yoloMode') {
2645+
if (key === 'planModeEnabled') {
2646+
// Save to globalState for persistence across sessions
2647+
this._planModeEnabled = value;
2648+
await this._context.globalState.update('claude.planModeEnabled', value);
2649+
} else if (key === 'thinkingModeEnabled') {
2650+
// Save to globalState for persistence across sessions
2651+
this._thinkingModeEnabled = value;
2652+
await this._context.globalState.update('claude.thinkingModeEnabled', value);
2653+
} else if (key === 'permissions.yoloMode') {
26382654
// YOLO mode is workspace-specific
26392655
await config.update(key, value, vscode.ConfigurationTarget.Workspace);
26402656
} else {

src/script.ts

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -861,15 +861,20 @@ const getScript = (isTelemetryEnabled: boolean) => `<script>
861861
} else {
862862
switchElement.classList.remove('active');
863863
}
864+
// Save state to extension for persistence
865+
vscode.postMessage({
866+
type: 'updateSettings',
867+
settings: { planModeEnabled: planModeEnabled }
868+
});
864869
}
865870
866871
function toggleThinkingMode() {
867872
thinkingModeEnabled = !thinkingModeEnabled;
868-
873+
869874
if (thinkingModeEnabled) {
870875
sendStats('Thinking mode enabled');
871876
}
872-
877+
873878
const switchElement = document.getElementById('thinkingModeSwitch');
874879
const toggleLabel = document.getElementById('thinkingModeLabel');
875880
if (thinkingModeEnabled) {
@@ -883,6 +888,11 @@ const getScript = (isTelemetryEnabled: boolean) => `<script>
883888
toggleLabel.textContent = 'Thinking Mode';
884889
}
885890
}
891+
// Save state to extension for persistence
892+
vscode.postMessage({
893+
type: 'updateSettings',
894+
settings: { thinkingModeEnabled: thinkingModeEnabled }
895+
});
886896
}
887897
888898
@@ -3440,7 +3450,7 @@ const getScript = (isTelemetryEnabled: boolean) => `<script>
34403450
const thinkingIntensity = message.data['thinking.intensity'] || 'think';
34413451
const intensityValues = ['think', 'think-hard', 'think-harder', 'ultrathink'];
34423452
const sliderValue = intensityValues.indexOf(thinkingIntensity);
3443-
3453+
34443454
// Update thinking intensity modal if it exists
34453455
const thinkingIntensitySlider = document.getElementById('thinkingIntensitySlider');
34463456
if (thinkingIntensitySlider) {
@@ -3450,18 +3460,53 @@ const getScript = (isTelemetryEnabled: boolean) => `<script>
34503460
// Update toggle name even if modal isn't open
34513461
updateThinkingModeToggleName(sliderValue >= 0 ? sliderValue : 0);
34523462
}
3453-
3463+
34543464
document.getElementById('wsl-enabled').checked = message.data['wsl.enabled'] || false;
34553465
document.getElementById('wsl-distro').value = message.data['wsl.distro'] || 'Ubuntu';
34563466
document.getElementById('wsl-node-path').value = message.data['wsl.nodePath'] || '/usr/bin/node';
34573467
document.getElementById('wsl-claude-path').value = message.data['wsl.claudePath'] || '/usr/local/bin/claude';
34583468
document.getElementById('yolo-mode').checked = message.data['permissions.yoloMode'] || false;
3459-
3469+
34603470
// Update yolo warning visibility
34613471
updateYoloWarning();
3462-
3472+
34633473
// Show/hide WSL options
34643474
document.getElementById('wslOptions').style.display = message.data['wsl.enabled'] ? 'block' : 'none';
3475+
3476+
// Restore Plan Mode toggle state
3477+
if (message.data.planModeEnabled !== undefined) {
3478+
planModeEnabled = message.data.planModeEnabled;
3479+
const planSwitch = document.getElementById('planModeSwitch');
3480+
if (planSwitch) {
3481+
if (planModeEnabled) {
3482+
planSwitch.classList.add('active');
3483+
} else {
3484+
planSwitch.classList.remove('active');
3485+
}
3486+
}
3487+
}
3488+
3489+
// Restore Thinking Mode toggle state
3490+
if (message.data.thinkingModeEnabled !== undefined) {
3491+
thinkingModeEnabled = message.data.thinkingModeEnabled;
3492+
const thinkingSwitch = document.getElementById('thinkingModeSwitch');
3493+
const thinkingLabel = document.getElementById('thinkingModeLabel');
3494+
if (thinkingSwitch) {
3495+
if (thinkingModeEnabled) {
3496+
thinkingSwitch.classList.add('active');
3497+
// Update the label to show current intensity
3498+
if (thinkingLabel) {
3499+
const intensityNames = ['Thinking', 'Think Hard', 'Think Harder', 'Ultrathink'];
3500+
thinkingLabel.textContent = intensityNames[sliderValue >= 0 ? sliderValue : 0];
3501+
}
3502+
} else {
3503+
thinkingSwitch.classList.remove('active');
3504+
if (thinkingLabel) {
3505+
thinkingLabel.textContent = 'Thinking Mode';
3506+
}
3507+
}
3508+
}
3509+
}
34653510
}
34663511
34673512
if (message.type === 'platformInfo') {

0 commit comments

Comments
 (0)