diff --git a/src/vs/workbench/contrib/void/browser/autocompleteService.ts b/src/vs/workbench/contrib/void/browser/autocompleteService.ts index 34c7025c..b8c6c466 100644 --- a/src/vs/workbench/contrib/void/browser/autocompleteService.ts +++ b/src/vs/workbench/contrib/void/browser/autocompleteService.ts @@ -793,7 +793,7 @@ export class AutocompleteService extends Disposable implements IAutocompleteServ const featureName: FeatureName = 'Autocomplete' const modelSelection = this._settingsService.state.modelSelectionOfFeature[featureName] - const modelSelectionOptions = modelSelection ? this._settingsService.state.optionsOfModelSelection[modelSelection.providerName]?.[modelSelection.modelName] : undefined + const modelSelectionOptions = modelSelection ? this._settingsService.state.optionsOfModelSelection[featureName][modelSelection.providerName]?.[modelSelection.modelName] : undefined // set parameters of `newAutocompletion` appropriately diff --git a/src/vs/workbench/contrib/void/browser/chatThreadService.ts b/src/vs/workbench/contrib/void/browser/chatThreadService.ts index 87ba8fff..224a57c6 100644 --- a/src/vs/workbench/contrib/void/browser/chatThreadService.ts +++ b/src/vs/workbench/contrib/void/browser/chatThreadService.ts @@ -36,6 +36,7 @@ import { INotificationService, Severity } from '../../../../platform/notificatio import { IModelService } from '../../../../editor/common/services/model.js'; import { IDirectoryStrService } from './directoryStrService.js'; import { truncate } from '../../../../base/common/strings.js'; +import { THREAD_STORAGE_KEY } from '../common/storageKeys.js'; /* @@ -155,10 +156,6 @@ const newThreadObject = () => { } -// past values: -// 'void.chatThreadStorage' - -export const THREAD_STORAGE_KEY = 'void.chatThreadStorageI' @@ -455,7 +452,7 @@ class ChatThreadService extends Disposable implements IChatThreadService { // these settings should not change throughout the loop (eg anthropic breaks if you change its thinking mode and it's using tools) const featureName: FeatureName = 'Chat' const modelSelection = this._settingsService.state.modelSelectionOfFeature[featureName] - const modelSelectionOptions = modelSelection ? this._settingsService.state.optionsOfModelSelection[modelSelection.providerName]?.[modelSelection.modelName] : undefined + const modelSelectionOptions = modelSelection ? this._settingsService.state.optionsOfModelSelection[featureName][modelSelection.providerName]?.[modelSelection.modelName] : undefined return { modelSelection, modelSelectionOptions } } diff --git a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx index be8e7e57..2499ae26 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx @@ -157,7 +157,7 @@ const ReasoningOptionSlider = ({ featureName }: { featureName: FeatureName }) => const { reasoningCapabilities } = getModelCapabilities(providerName, modelName) const { canTurnOffReasoning, reasoningBudgetSlider } = reasoningCapabilities || {} - const modelSelectionOptions = voidSettingsState.optionsOfModelSelection[providerName]?.[modelName] + const modelSelectionOptions = voidSettingsState.optionsOfModelSelection[featureName][providerName]?.[modelName] const isReasoningEnabled = getIsResoningEnabledState(providerName, modelName, modelSelectionOptions) if (canTurnOffReasoning && !reasoningBudgetSlider) { // if it's just a on/off toggle without a power slider (no models right now) return null // unused right now @@ -174,7 +174,7 @@ const ReasoningOptionSlider = ({ featureName }: { featureName: FeatureName }) => if (reasoningBudgetSlider?.type === 'slider') { // if it's a slider const { min: min_, max, default: defaultVal } = reasoningBudgetSlider - const value = voidSettingsState.optionsOfModelSelection[modelSelection.providerName]?.[modelSelection.modelName]?.reasoningBudget ?? defaultVal + const value = voidSettingsState.optionsOfModelSelection[featureName][modelSelection.providerName]?.[modelSelection.modelName]?.reasoningBudget ?? defaultVal const nSteps = 8 // only used in calculating stepSize, stepSize is what actually matters const stepSize = Math.round((max - min_) / nSteps) @@ -191,7 +191,7 @@ const ReasoningOptionSlider = ({ featureName }: { featureName: FeatureName }) => value={value} onChange={(newVal) => { const disabled = newVal === min && canTurnOffReasoning - voidSettingsService.setOptionsOfModelSelection(modelSelection.providerName, modelSelection.modelName, { reasoningEnabled: !disabled, reasoningBudget: newVal }) + voidSettingsService.setOptionsOfModelSelection(featureName, modelSelection.providerName, modelSelection.modelName, { reasoningEnabled: !disabled, reasoningBudget: newVal }) }} /> {isReasoningEnabled ? `${value} tokens` : 'Thinking disabled'} diff --git a/src/vs/workbench/contrib/void/common/storageKeys.ts b/src/vs/workbench/contrib/void/common/storageKeys.ts new file mode 100644 index 00000000..476c05b1 --- /dev/null +++ b/src/vs/workbench/contrib/void/common/storageKeys.ts @@ -0,0 +1,19 @@ +/*-------------------------------------------------------------------------------------- + * Copyright 2025 Glass Devtools, Inc. All rights reserved. + * Licensed under the Apache License, Version 2.0. See LICENSE.txt for more information. + *--------------------------------------------------------------------------------------*/ + +// past values: +// 'void.settingsServiceStorage' +// 'void.settingsServiceStorageI' // 1.0.2 + +// 1.0.3 +export const VOID_SETTINGS_STORAGE_KEY = 'void.settingsServiceStorageII' + + +// past values: +// 'void.chatThreadStorage' +// 'void.chatThreadStorageI' // 1.0.2 + +// 1.0.3 +export const THREAD_STORAGE_KEY = 'void.chatThreadStorageII' diff --git a/src/vs/workbench/contrib/void/common/voidSettingsService.ts b/src/vs/workbench/contrib/void/common/voidSettingsService.ts index e631a8aa..47558e71 100644 --- a/src/vs/workbench/contrib/void/common/voidSettingsService.ts +++ b/src/vs/workbench/contrib/void/common/voidSettingsService.ts @@ -12,13 +12,9 @@ import { createDecorator } from '../../../../platform/instantiation/common/insta import { IStorageService, StorageScope, StorageTarget } from '../../../../platform/storage/common/storage.js'; import { IMetricsService } from './metricsService.js'; import { getModelCapabilities } from './modelCapabilities.js'; +import { VOID_SETTINGS_STORAGE_KEY } from './storageKeys.js'; import { defaultSettingsOfProvider, FeatureName, ProviderName, ModelSelectionOfFeature, SettingsOfProvider, SettingName, providerNames, ModelSelection, modelSelectionsEqual, featureNames, VoidModelInfo, GlobalSettings, GlobalSettingName, defaultGlobalSettings, defaultProviderSettings, ModelSelectionOptions, OptionsOfModelSelection, ChatMode } from './voidSettingsTypes.js'; -// past values: -// 'void.settingsServiceStorage' - -const STORAGE_KEY = 'void.settingsServiceStorageI' - // name is the name in the dropdown export type ModelOption = { name: string, selection: ModelSelection } @@ -38,7 +34,7 @@ type SetModelSelectionOfFeatureFn = ( type SetGlobalSettingFn = (settingName: T, newVal: GlobalSettings[T]) => void; -type SetOptionsOfModelSelection = (providerName: ProviderName, modelName: string, newVal: Partial) => void +type SetOptionsOfModelSelection = (featureName: FeatureName, providerName: ProviderName, modelName: string, newVal: Partial) => void export type VoidSettingsState = { @@ -177,7 +173,7 @@ const defaultState = () => { settingsOfProvider: deepClone(defaultSettingsOfProvider), modelSelectionOfFeature: { 'Chat': null, 'Ctrl+K': null, 'Autocomplete': null, 'Apply': null }, globalSettings: deepClone(defaultGlobalSettings), - optionsOfModelSelection: {}, + optionsOfModelSelection: { 'Chat': {}, 'Ctrl+K': {}, 'Autocomplete': {}, 'Apply': {} }, _modelOptions: [], // computed later } return d @@ -227,7 +223,7 @@ class VoidSettingsService extends Disposable implements IVoidSettingsService { private async _readState(): Promise { - const encryptedState = this._storageService.get(STORAGE_KEY, StorageScope.APPLICATION) + const encryptedState = this._storageService.get(VOID_SETTINGS_STORAGE_KEY, StorageScope.APPLICATION) if (!encryptedState) return defaultState() @@ -240,7 +236,7 @@ class VoidSettingsService extends Disposable implements IVoidSettingsService { private async _storeState() { const state = this.state const encryptedState = await this._encryptionService.encrypt(JSON.stringify(state)) - this._storageService.store(STORAGE_KEY, encryptedState, StorageScope.APPLICATION, StorageTarget.USER); + this._storageService.store(VOID_SETTINGS_STORAGE_KEY, encryptedState, StorageScope.APPLICATION, StorageTarget.USER); } setSettingOfProvider: SetSettingOfProviderFn = async (providerName, settingName, newVal) => { @@ -318,16 +314,19 @@ class VoidSettingsService extends Disposable implements IVoidSettingsService { } - setOptionsOfModelSelection = async (providerName: ProviderName, modelName: string, newVal: Partial) => { + setOptionsOfModelSelection = async (featureName: FeatureName, providerName: ProviderName, modelName: string, newVal: Partial) => { const newState: VoidSettingsState = { ...this.state, optionsOfModelSelection: { ...this.state.optionsOfModelSelection, - [providerName]: { - ...this.state.optionsOfModelSelection[providerName], - [modelName]: { - ...this.state.optionsOfModelSelection[providerName]?.[modelName], - ...newVal + [featureName]: { + ...this.state.optionsOfModelSelection[featureName], + [providerName]: { + ...this.state.optionsOfModelSelection[featureName][providerName], + [modelName]: { + ...this.state.optionsOfModelSelection[featureName][providerName]?.[modelName], + ...newVal + } } } } diff --git a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts index acfe57f0..bbb274a4 100644 --- a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts +++ b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts @@ -420,4 +420,11 @@ export type ModelSelectionOptions = { reasoningBudget?: number; } -export type OptionsOfModelSelection = Partial<{ [providerName in ProviderName]: { [modelName: string]: ModelSelectionOptions | undefined } }> +export type OptionsOfModelSelection = { + [featureName in FeatureName]: Partial<{ + [providerName in ProviderName]: { + [modelName: string]: + ModelSelectionOptions | undefined + } + }> +}