|
@@ -8,16 +8,16 @@ import * as path from "path"
|
|
|
import * as vscode from "vscode"
|
|
import * as vscode from "vscode"
|
|
|
import simpleGit from "simple-git"
|
|
import simpleGit from "simple-git"
|
|
|
|
|
|
|
|
-import { ApiConfiguration, ApiProvider, ModelInfo } from "../../shared/api"
|
|
|
|
|
|
|
+import { ApiConfiguration, ApiProvider, ModelInfo, API_CONFIG_KEYS } from "../../shared/api"
|
|
|
import { CheckpointStorage } from "../../shared/checkpoints"
|
|
import { CheckpointStorage } from "../../shared/checkpoints"
|
|
|
import { findLast } from "../../shared/array"
|
|
import { findLast } from "../../shared/array"
|
|
|
import { CustomSupportPrompts, supportPrompt } from "../../shared/support-prompt"
|
|
import { CustomSupportPrompts, supportPrompt } from "../../shared/support-prompt"
|
|
|
import { GlobalFileNames } from "../../shared/globalFileNames"
|
|
import { GlobalFileNames } from "../../shared/globalFileNames"
|
|
|
-import type { SecretKey, GlobalStateKey } from "../../shared/globalState"
|
|
|
|
|
|
|
+import { SecretKey, GlobalStateKey, SECRET_KEYS, GLOBAL_STATE_KEYS } from "../../shared/globalState"
|
|
|
import { HistoryItem } from "../../shared/HistoryItem"
|
|
import { HistoryItem } from "../../shared/HistoryItem"
|
|
|
import { ApiConfigMeta, ExtensionMessage } from "../../shared/ExtensionMessage"
|
|
import { ApiConfigMeta, ExtensionMessage } from "../../shared/ExtensionMessage"
|
|
|
import { checkoutDiffPayloadSchema, checkoutRestorePayloadSchema, WebviewMessage } from "../../shared/WebviewMessage"
|
|
import { checkoutDiffPayloadSchema, checkoutRestorePayloadSchema, WebviewMessage } from "../../shared/WebviewMessage"
|
|
|
-import { Mode, CustomModePrompts, PromptComponent, defaultModeSlug } from "../../shared/modes"
|
|
|
|
|
|
|
+import { Mode, CustomModePrompts, PromptComponent, defaultModeSlug, ModeConfig } from "../../shared/modes"
|
|
|
import { checkExistKey } from "../../shared/checkExistApiConfig"
|
|
import { checkExistKey } from "../../shared/checkExistApiConfig"
|
|
|
import { EXPERIMENT_IDS, experiments as Experiments, experimentDefault, ExperimentId } from "../../shared/experiments"
|
|
import { EXPERIMENT_IDS, experiments as Experiments, experimentDefault, ExperimentId } from "../../shared/experiments"
|
|
|
import { downloadTask } from "../../integrations/misc/export-markdown"
|
|
import { downloadTask } from "../../integrations/misc/export-markdown"
|
|
@@ -35,6 +35,7 @@ import { getDiffStrategy } from "../diff/DiffStrategy"
|
|
|
import { SYSTEM_PROMPT } from "../prompts/system"
|
|
import { SYSTEM_PROMPT } from "../prompts/system"
|
|
|
import { ConfigManager } from "../config/ConfigManager"
|
|
import { ConfigManager } from "../config/ConfigManager"
|
|
|
import { CustomModesManager } from "../config/CustomModesManager"
|
|
import { CustomModesManager } from "../config/CustomModesManager"
|
|
|
|
|
+import { ContextProxy } from "../contextProxy"
|
|
|
import { buildApiHandler } from "../../api"
|
|
import { buildApiHandler } from "../../api"
|
|
|
import { getOpenRouterModels } from "../../api/providers/openrouter"
|
|
import { getOpenRouterModels } from "../../api/providers/openrouter"
|
|
|
import { getGlamaModels } from "../../api/providers/glama"
|
|
import { getGlamaModels } from "../../api/providers/glama"
|
|
@@ -66,6 +67,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
|
|
|
private workspaceTracker?: WorkspaceTracker
|
|
private workspaceTracker?: WorkspaceTracker
|
|
|
protected mcpHub?: McpHub // Change from private to protected
|
|
protected mcpHub?: McpHub // Change from private to protected
|
|
|
private latestAnnouncementId = "feb-27-2025-automatic-checkpoints" // update to some unique identifier when we add a new announcement
|
|
private latestAnnouncementId = "feb-27-2025-automatic-checkpoints" // update to some unique identifier when we add a new announcement
|
|
|
|
|
+ private contextProxy: ContextProxy
|
|
|
configManager: ConfigManager
|
|
configManager: ConfigManager
|
|
|
customModesManager: CustomModesManager
|
|
customModesManager: CustomModesManager
|
|
|
|
|
|
|
@@ -74,6 +76,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
|
|
|
private readonly outputChannel: vscode.OutputChannel,
|
|
private readonly outputChannel: vscode.OutputChannel,
|
|
|
) {
|
|
) {
|
|
|
this.outputChannel.appendLine("ClineProvider instantiated")
|
|
this.outputChannel.appendLine("ClineProvider instantiated")
|
|
|
|
|
+ this.contextProxy = new ContextProxy(context)
|
|
|
ClineProvider.activeInstances.add(this)
|
|
ClineProvider.activeInstances.add(this)
|
|
|
this.workspaceTracker = new WorkspaceTracker(this)
|
|
this.workspaceTracker = new WorkspaceTracker(this)
|
|
|
this.configManager = new ConfigManager(this.context)
|
|
this.configManager = new ConfigManager(this.context)
|
|
@@ -242,11 +245,11 @@ export class ClineProvider implements vscode.WebviewViewProvider {
|
|
|
webviewView.webview.options = {
|
|
webviewView.webview.options = {
|
|
|
// Allow scripts in the webview
|
|
// Allow scripts in the webview
|
|
|
enableScripts: true,
|
|
enableScripts: true,
|
|
|
- localResourceRoots: [this.context.extensionUri],
|
|
|
|
|
|
|
+ localResourceRoots: [this.contextProxy.extensionUri],
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
webviewView.webview.html =
|
|
webviewView.webview.html =
|
|
|
- this.context.extensionMode === vscode.ExtensionMode.Development
|
|
|
|
|
|
|
+ this.contextProxy.extensionMode === vscode.ExtensionMode.Development
|
|
|
? await this.getHMRHtmlContent(webviewView.webview)
|
|
? await this.getHMRHtmlContent(webviewView.webview)
|
|
|
: this.getHtmlContent(webviewView.webview)
|
|
: this.getHtmlContent(webviewView.webview)
|
|
|
|
|
|
|
@@ -399,8 +402,13 @@ export class ClineProvider implements vscode.WebviewViewProvider {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const nonce = getNonce()
|
|
const nonce = getNonce()
|
|
|
- const stylesUri = getUri(webview, this.context.extensionUri, ["webview-ui", "build", "assets", "index.css"])
|
|
|
|
|
- const codiconsUri = getUri(webview, this.context.extensionUri, [
|
|
|
|
|
|
|
+ const stylesUri = getUri(webview, this.contextProxy.extensionUri, [
|
|
|
|
|
+ "webview-ui",
|
|
|
|
|
+ "build",
|
|
|
|
|
+ "assets",
|
|
|
|
|
+ "index.css",
|
|
|
|
|
+ ])
|
|
|
|
|
+ const codiconsUri = getUri(webview, this.contextProxy.extensionUri, [
|
|
|
"node_modules",
|
|
"node_modules",
|
|
|
"@vscode",
|
|
"@vscode",
|
|
|
"codicons",
|
|
"codicons",
|
|
@@ -466,15 +474,20 @@ export class ClineProvider implements vscode.WebviewViewProvider {
|
|
|
// then convert it to a uri we can use in the webview.
|
|
// then convert it to a uri we can use in the webview.
|
|
|
|
|
|
|
|
// The CSS file from the React build output
|
|
// The CSS file from the React build output
|
|
|
- const stylesUri = getUri(webview, this.context.extensionUri, ["webview-ui", "build", "assets", "index.css"])
|
|
|
|
|
|
|
+ const stylesUri = getUri(webview, this.contextProxy.extensionUri, [
|
|
|
|
|
+ "webview-ui",
|
|
|
|
|
+ "build",
|
|
|
|
|
+ "assets",
|
|
|
|
|
+ "index.css",
|
|
|
|
|
+ ])
|
|
|
// The JS file from the React build output
|
|
// The JS file from the React build output
|
|
|
- const scriptUri = getUri(webview, this.context.extensionUri, ["webview-ui", "build", "assets", "index.js"])
|
|
|
|
|
|
|
+ const scriptUri = getUri(webview, this.contextProxy.extensionUri, ["webview-ui", "build", "assets", "index.js"])
|
|
|
|
|
|
|
|
// The codicon font from the React build output
|
|
// The codicon font from the React build output
|
|
|
// https://github.com/microsoft/vscode-extension-samples/blob/main/webview-codicons-sample/src/extension.ts
|
|
// https://github.com/microsoft/vscode-extension-samples/blob/main/webview-codicons-sample/src/extension.ts
|
|
|
// we installed this package in the extension so that we can access it how its intended from the extension (the font file is likely bundled in vscode), and we just import the css fileinto our react app we don't have access to it
|
|
// we installed this package in the extension so that we can access it how its intended from the extension (the font file is likely bundled in vscode), and we just import the css fileinto our react app we don't have access to it
|
|
|
// don't forget to add font-src ${webview.cspSource};
|
|
// don't forget to add font-src ${webview.cspSource};
|
|
|
- const codiconsUri = getUri(webview, this.context.extensionUri, [
|
|
|
|
|
|
|
+ const codiconsUri = getUri(webview, this.contextProxy.extensionUri, [
|
|
|
"node_modules",
|
|
"node_modules",
|
|
|
"@vscode",
|
|
"@vscode",
|
|
|
"codicons",
|
|
"codicons",
|
|
@@ -1265,7 +1278,9 @@ export class ClineProvider implements vscode.WebviewViewProvider {
|
|
|
// Try to get enhancement config first, fall back to current config
|
|
// Try to get enhancement config first, fall back to current config
|
|
|
let configToUse: ApiConfiguration = apiConfiguration
|
|
let configToUse: ApiConfiguration = apiConfiguration
|
|
|
if (enhancementApiConfigId) {
|
|
if (enhancementApiConfigId) {
|
|
|
- const config = listApiConfigMeta?.find((c) => c.id === enhancementApiConfigId)
|
|
|
|
|
|
|
+ const config = listApiConfigMeta?.find(
|
|
|
|
|
+ (c: ApiConfigMeta) => c.id === enhancementApiConfigId,
|
|
|
|
|
+ )
|
|
|
if (config?.name) {
|
|
if (config?.name) {
|
|
|
const loadedConfig = await this.configManager.loadConfig(config.name)
|
|
const loadedConfig = await this.configManager.loadConfig(config.name)
|
|
|
if (loadedConfig.apiProvider) {
|
|
if (loadedConfig.apiProvider) {
|
|
@@ -1644,108 +1659,9 @@ export class ClineProvider implements vscode.WebviewViewProvider {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- const {
|
|
|
|
|
- apiProvider,
|
|
|
|
|
- apiModelId,
|
|
|
|
|
- apiKey,
|
|
|
|
|
- glamaModelId,
|
|
|
|
|
- glamaModelInfo,
|
|
|
|
|
- glamaApiKey,
|
|
|
|
|
- openRouterApiKey,
|
|
|
|
|
- awsAccessKey,
|
|
|
|
|
- awsSecretKey,
|
|
|
|
|
- awsSessionToken,
|
|
|
|
|
- awsRegion,
|
|
|
|
|
- awsUseCrossRegionInference,
|
|
|
|
|
- awsProfile,
|
|
|
|
|
- awsUseProfile,
|
|
|
|
|
- vertexProjectId,
|
|
|
|
|
- vertexRegion,
|
|
|
|
|
- openAiBaseUrl,
|
|
|
|
|
- openAiApiKey,
|
|
|
|
|
- openAiModelId,
|
|
|
|
|
- openAiCustomModelInfo,
|
|
|
|
|
- openAiUseAzure,
|
|
|
|
|
- ollamaModelId,
|
|
|
|
|
- ollamaBaseUrl,
|
|
|
|
|
- lmStudioModelId,
|
|
|
|
|
- lmStudioBaseUrl,
|
|
|
|
|
- anthropicBaseUrl,
|
|
|
|
|
- geminiApiKey,
|
|
|
|
|
- openAiNativeApiKey,
|
|
|
|
|
- deepSeekApiKey,
|
|
|
|
|
- azureApiVersion,
|
|
|
|
|
- openAiStreamingEnabled,
|
|
|
|
|
- openRouterModelId,
|
|
|
|
|
- openRouterBaseUrl,
|
|
|
|
|
- openRouterModelInfo,
|
|
|
|
|
- openRouterUseMiddleOutTransform,
|
|
|
|
|
- vsCodeLmModelSelector,
|
|
|
|
|
- mistralApiKey,
|
|
|
|
|
- mistralCodestralUrl,
|
|
|
|
|
- unboundApiKey,
|
|
|
|
|
- unboundModelId,
|
|
|
|
|
- unboundModelInfo,
|
|
|
|
|
- requestyApiKey,
|
|
|
|
|
- requestyModelId,
|
|
|
|
|
- requestyModelInfo,
|
|
|
|
|
- modelTemperature,
|
|
|
|
|
- modelMaxTokens,
|
|
|
|
|
- modelMaxThinkingTokens,
|
|
|
|
|
- lmStudioDraftModelId,
|
|
|
|
|
- lmStudioSpeculativeDecodingEnabled,
|
|
|
|
|
- } = apiConfiguration
|
|
|
|
|
- await Promise.all([
|
|
|
|
|
- this.updateGlobalState("apiProvider", apiProvider),
|
|
|
|
|
- this.updateGlobalState("apiModelId", apiModelId),
|
|
|
|
|
- this.storeSecret("apiKey", apiKey),
|
|
|
|
|
- this.updateGlobalState("glamaModelId", glamaModelId),
|
|
|
|
|
- this.updateGlobalState("glamaModelInfo", glamaModelInfo),
|
|
|
|
|
- this.storeSecret("glamaApiKey", glamaApiKey),
|
|
|
|
|
- this.storeSecret("openRouterApiKey", openRouterApiKey),
|
|
|
|
|
- this.storeSecret("awsAccessKey", awsAccessKey),
|
|
|
|
|
- this.storeSecret("awsSecretKey", awsSecretKey),
|
|
|
|
|
- this.storeSecret("awsSessionToken", awsSessionToken),
|
|
|
|
|
- this.updateGlobalState("awsRegion", awsRegion),
|
|
|
|
|
- this.updateGlobalState("awsUseCrossRegionInference", awsUseCrossRegionInference),
|
|
|
|
|
- this.updateGlobalState("awsProfile", awsProfile),
|
|
|
|
|
- this.updateGlobalState("awsUseProfile", awsUseProfile),
|
|
|
|
|
- this.updateGlobalState("vertexProjectId", vertexProjectId),
|
|
|
|
|
- this.updateGlobalState("vertexRegion", vertexRegion),
|
|
|
|
|
- this.updateGlobalState("openAiBaseUrl", openAiBaseUrl),
|
|
|
|
|
- this.storeSecret("openAiApiKey", openAiApiKey),
|
|
|
|
|
- this.updateGlobalState("openAiModelId", openAiModelId),
|
|
|
|
|
- this.updateGlobalState("openAiCustomModelInfo", openAiCustomModelInfo),
|
|
|
|
|
- this.updateGlobalState("openAiUseAzure", openAiUseAzure),
|
|
|
|
|
- this.updateGlobalState("ollamaModelId", ollamaModelId),
|
|
|
|
|
- this.updateGlobalState("ollamaBaseUrl", ollamaBaseUrl),
|
|
|
|
|
- this.updateGlobalState("lmStudioModelId", lmStudioModelId),
|
|
|
|
|
- this.updateGlobalState("lmStudioBaseUrl", lmStudioBaseUrl),
|
|
|
|
|
- this.updateGlobalState("anthropicBaseUrl", anthropicBaseUrl),
|
|
|
|
|
- this.storeSecret("geminiApiKey", geminiApiKey),
|
|
|
|
|
- this.storeSecret("openAiNativeApiKey", openAiNativeApiKey),
|
|
|
|
|
- this.storeSecret("deepSeekApiKey", deepSeekApiKey),
|
|
|
|
|
- this.updateGlobalState("azureApiVersion", azureApiVersion),
|
|
|
|
|
- this.updateGlobalState("openAiStreamingEnabled", openAiStreamingEnabled),
|
|
|
|
|
- this.updateGlobalState("openRouterModelId", openRouterModelId),
|
|
|
|
|
- this.updateGlobalState("openRouterModelInfo", openRouterModelInfo),
|
|
|
|
|
- this.updateGlobalState("openRouterBaseUrl", openRouterBaseUrl),
|
|
|
|
|
- this.updateGlobalState("openRouterUseMiddleOutTransform", openRouterUseMiddleOutTransform),
|
|
|
|
|
- this.updateGlobalState("vsCodeLmModelSelector", vsCodeLmModelSelector),
|
|
|
|
|
- this.storeSecret("mistralApiKey", mistralApiKey),
|
|
|
|
|
- this.updateGlobalState("mistralCodestralUrl", mistralCodestralUrl),
|
|
|
|
|
- this.storeSecret("unboundApiKey", unboundApiKey),
|
|
|
|
|
- this.updateGlobalState("unboundModelId", unboundModelId),
|
|
|
|
|
- this.updateGlobalState("unboundModelInfo", unboundModelInfo),
|
|
|
|
|
- this.storeSecret("requestyApiKey", requestyApiKey),
|
|
|
|
|
- this.updateGlobalState("requestyModelId", requestyModelId),
|
|
|
|
|
- this.updateGlobalState("requestyModelInfo", requestyModelInfo),
|
|
|
|
|
- this.updateGlobalState("modelTemperature", modelTemperature),
|
|
|
|
|
- this.updateGlobalState("modelMaxTokens", modelMaxTokens),
|
|
|
|
|
- this.updateGlobalState("anthropicThinking", modelMaxThinkingTokens),
|
|
|
|
|
- this.updateGlobalState("lmStudioDraftModelId", lmStudioDraftModelId),
|
|
|
|
|
- this.updateGlobalState("lmStudioSpeculativeDecodingEnabled", lmStudioSpeculativeDecodingEnabled),
|
|
|
|
|
- ])
|
|
|
|
|
|
|
+ // Update all configuration values through the contextProxy
|
|
|
|
|
+ await this.contextProxy.updateApiConfiguration(apiConfiguration)
|
|
|
|
|
+
|
|
|
if (this.cline) {
|
|
if (this.cline) {
|
|
|
this.cline.api = buildApiHandler(apiConfiguration)
|
|
this.cline.api = buildApiHandler(apiConfiguration)
|
|
|
}
|
|
}
|
|
@@ -1806,13 +1722,13 @@ export class ClineProvider implements vscode.WebviewViewProvider {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
async ensureSettingsDirectoryExists(): Promise<string> {
|
|
async ensureSettingsDirectoryExists(): Promise<string> {
|
|
|
- const settingsDir = path.join(this.context.globalStorageUri.fsPath, "settings")
|
|
|
|
|
|
|
+ const settingsDir = path.join(this.contextProxy.globalStorageUri.fsPath, "settings")
|
|
|
await fs.mkdir(settingsDir, { recursive: true })
|
|
await fs.mkdir(settingsDir, { recursive: true })
|
|
|
return settingsDir
|
|
return settingsDir
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private async ensureCacheDirectoryExists() {
|
|
private async ensureCacheDirectoryExists() {
|
|
|
- const cacheDir = path.join(this.context.globalStorageUri.fsPath, "cache")
|
|
|
|
|
|
|
+ const cacheDir = path.join(this.contextProxy.globalStorageUri.fsPath, "cache")
|
|
|
await fs.mkdir(cacheDir, { recursive: true })
|
|
await fs.mkdir(cacheDir, { recursive: true })
|
|
|
return cacheDir
|
|
return cacheDir
|
|
|
}
|
|
}
|
|
@@ -1900,7 +1816,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
|
|
|
const history = ((await this.getGlobalState("taskHistory")) as HistoryItem[] | undefined) || []
|
|
const history = ((await this.getGlobalState("taskHistory")) as HistoryItem[] | undefined) || []
|
|
|
const historyItem = history.find((item) => item.id === id)
|
|
const historyItem = history.find((item) => item.id === id)
|
|
|
if (historyItem) {
|
|
if (historyItem) {
|
|
|
- const taskDirPath = path.join(this.context.globalStorageUri.fsPath, "tasks", id)
|
|
|
|
|
|
|
+ const taskDirPath = path.join(this.contextProxy.globalStorageUri.fsPath, "tasks", id)
|
|
|
const apiConversationHistoryFilePath = path.join(taskDirPath, GlobalFileNames.apiConversationHistory)
|
|
const apiConversationHistoryFilePath = path.join(taskDirPath, GlobalFileNames.apiConversationHistory)
|
|
|
const uiMessagesFilePath = path.join(taskDirPath, GlobalFileNames.uiMessages)
|
|
const uiMessagesFilePath = path.join(taskDirPath, GlobalFileNames.uiMessages)
|
|
|
const fileExists = await fileExistsAtPath(apiConversationHistoryFilePath)
|
|
const fileExists = await fileExistsAtPath(apiConversationHistoryFilePath)
|
|
@@ -2053,7 +1969,7 @@ export class ClineProvider implements vscode.WebviewViewProvider {
|
|
|
alwaysAllowModeSwitch: alwaysAllowModeSwitch ?? false,
|
|
alwaysAllowModeSwitch: alwaysAllowModeSwitch ?? false,
|
|
|
uriScheme: vscode.env.uriScheme,
|
|
uriScheme: vscode.env.uriScheme,
|
|
|
currentTaskItem: this.cline?.taskId
|
|
currentTaskItem: this.cline?.taskId
|
|
|
- ? (taskHistory || []).find((item) => item.id === this.cline?.taskId)
|
|
|
|
|
|
|
+ ? (taskHistory || []).find((item: HistoryItem) => item.id === this.cline?.taskId)
|
|
|
: undefined,
|
|
: undefined,
|
|
|
clineMessages: this.cline?.clineMessages || [],
|
|
clineMessages: this.cline?.clineMessages || [],
|
|
|
taskHistory: (taskHistory || [])
|
|
taskHistory: (taskHistory || [])
|
|
@@ -2145,273 +2061,58 @@ export class ClineProvider implements vscode.WebviewViewProvider {
|
|
|
*/
|
|
*/
|
|
|
|
|
|
|
|
async getState() {
|
|
async getState() {
|
|
|
- const [
|
|
|
|
|
- storedApiProvider,
|
|
|
|
|
- apiModelId,
|
|
|
|
|
- apiKey,
|
|
|
|
|
- glamaApiKey,
|
|
|
|
|
- glamaModelId,
|
|
|
|
|
- glamaModelInfo,
|
|
|
|
|
- openRouterApiKey,
|
|
|
|
|
- awsAccessKey,
|
|
|
|
|
- awsSecretKey,
|
|
|
|
|
- awsSessionToken,
|
|
|
|
|
- awsRegion,
|
|
|
|
|
- awsUseCrossRegionInference,
|
|
|
|
|
- awsProfile,
|
|
|
|
|
- awsUseProfile,
|
|
|
|
|
- vertexProjectId,
|
|
|
|
|
- vertexRegion,
|
|
|
|
|
- openAiBaseUrl,
|
|
|
|
|
- openAiApiKey,
|
|
|
|
|
- openAiModelId,
|
|
|
|
|
- openAiCustomModelInfo,
|
|
|
|
|
- openAiUseAzure,
|
|
|
|
|
- ollamaModelId,
|
|
|
|
|
- ollamaBaseUrl,
|
|
|
|
|
- lmStudioModelId,
|
|
|
|
|
- lmStudioBaseUrl,
|
|
|
|
|
- anthropicBaseUrl,
|
|
|
|
|
- geminiApiKey,
|
|
|
|
|
- openAiNativeApiKey,
|
|
|
|
|
- deepSeekApiKey,
|
|
|
|
|
- mistralApiKey,
|
|
|
|
|
- mistralCodestralUrl,
|
|
|
|
|
- azureApiVersion,
|
|
|
|
|
- openAiStreamingEnabled,
|
|
|
|
|
- openRouterModelId,
|
|
|
|
|
- openRouterModelInfo,
|
|
|
|
|
- openRouterBaseUrl,
|
|
|
|
|
- openRouterUseMiddleOutTransform,
|
|
|
|
|
- lastShownAnnouncementId,
|
|
|
|
|
- customInstructions,
|
|
|
|
|
- alwaysAllowReadOnly,
|
|
|
|
|
- alwaysAllowWrite,
|
|
|
|
|
- alwaysAllowExecute,
|
|
|
|
|
- alwaysAllowBrowser,
|
|
|
|
|
- alwaysAllowMcp,
|
|
|
|
|
- alwaysAllowModeSwitch,
|
|
|
|
|
- taskHistory,
|
|
|
|
|
- allowedCommands,
|
|
|
|
|
- soundEnabled,
|
|
|
|
|
- diffEnabled,
|
|
|
|
|
- enableCheckpoints,
|
|
|
|
|
- checkpointStorage,
|
|
|
|
|
- soundVolume,
|
|
|
|
|
- browserViewportSize,
|
|
|
|
|
- fuzzyMatchThreshold,
|
|
|
|
|
- preferredLanguage,
|
|
|
|
|
- writeDelayMs,
|
|
|
|
|
- screenshotQuality,
|
|
|
|
|
- terminalOutputLineLimit,
|
|
|
|
|
- mcpEnabled,
|
|
|
|
|
- enableMcpServerCreation,
|
|
|
|
|
- alwaysApproveResubmit,
|
|
|
|
|
- requestDelaySeconds,
|
|
|
|
|
- rateLimitSeconds,
|
|
|
|
|
- currentApiConfigName,
|
|
|
|
|
- listApiConfigMeta,
|
|
|
|
|
- vsCodeLmModelSelector,
|
|
|
|
|
- mode,
|
|
|
|
|
- modeApiConfigs,
|
|
|
|
|
- customModePrompts,
|
|
|
|
|
- customSupportPrompts,
|
|
|
|
|
- enhancementApiConfigId,
|
|
|
|
|
- autoApprovalEnabled,
|
|
|
|
|
- customModes,
|
|
|
|
|
- experiments,
|
|
|
|
|
- unboundApiKey,
|
|
|
|
|
- unboundModelId,
|
|
|
|
|
- unboundModelInfo,
|
|
|
|
|
- requestyApiKey,
|
|
|
|
|
- requestyModelId,
|
|
|
|
|
- requestyModelInfo,
|
|
|
|
|
- modelTemperature,
|
|
|
|
|
- modelMaxTokens,
|
|
|
|
|
- modelMaxThinkingTokens,
|
|
|
|
|
- maxOpenTabsContext,
|
|
|
|
|
- browserToolEnabled,
|
|
|
|
|
- lmStudioSpeculativeDecodingEnabled,
|
|
|
|
|
- lmStudioDraftModelId,
|
|
|
|
|
- ] = await Promise.all([
|
|
|
|
|
- this.getGlobalState("apiProvider") as Promise<ApiProvider | undefined>,
|
|
|
|
|
- this.getGlobalState("apiModelId") as Promise<string | undefined>,
|
|
|
|
|
- this.getSecret("apiKey") as Promise<string | undefined>,
|
|
|
|
|
- this.getSecret("glamaApiKey") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("glamaModelId") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("glamaModelInfo") as Promise<ModelInfo | undefined>,
|
|
|
|
|
- this.getSecret("openRouterApiKey") as Promise<string | undefined>,
|
|
|
|
|
- this.getSecret("awsAccessKey") as Promise<string | undefined>,
|
|
|
|
|
- this.getSecret("awsSecretKey") as Promise<string | undefined>,
|
|
|
|
|
- this.getSecret("awsSessionToken") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("awsRegion") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("awsUseCrossRegionInference") as Promise<boolean | undefined>,
|
|
|
|
|
- this.getGlobalState("awsProfile") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("awsUseProfile") as Promise<boolean | undefined>,
|
|
|
|
|
- this.getGlobalState("vertexProjectId") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("vertexRegion") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("openAiBaseUrl") as Promise<string | undefined>,
|
|
|
|
|
- this.getSecret("openAiApiKey") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("openAiModelId") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("openAiCustomModelInfo") as Promise<ModelInfo | undefined>,
|
|
|
|
|
- this.getGlobalState("openAiUseAzure") as Promise<boolean | undefined>,
|
|
|
|
|
- this.getGlobalState("ollamaModelId") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("ollamaBaseUrl") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("lmStudioModelId") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("lmStudioBaseUrl") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("anthropicBaseUrl") as Promise<string | undefined>,
|
|
|
|
|
- this.getSecret("geminiApiKey") as Promise<string | undefined>,
|
|
|
|
|
- this.getSecret("openAiNativeApiKey") as Promise<string | undefined>,
|
|
|
|
|
- this.getSecret("deepSeekApiKey") as Promise<string | undefined>,
|
|
|
|
|
- this.getSecret("mistralApiKey") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("mistralCodestralUrl") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("azureApiVersion") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("openAiStreamingEnabled") as Promise<boolean | undefined>,
|
|
|
|
|
- this.getGlobalState("openRouterModelId") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("openRouterModelInfo") as Promise<ModelInfo | undefined>,
|
|
|
|
|
- this.getGlobalState("openRouterBaseUrl") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("openRouterUseMiddleOutTransform") as Promise<boolean | undefined>,
|
|
|
|
|
- this.getGlobalState("lastShownAnnouncementId") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("customInstructions") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("alwaysAllowReadOnly") as Promise<boolean | undefined>,
|
|
|
|
|
- this.getGlobalState("alwaysAllowWrite") as Promise<boolean | undefined>,
|
|
|
|
|
- this.getGlobalState("alwaysAllowExecute") as Promise<boolean | undefined>,
|
|
|
|
|
- this.getGlobalState("alwaysAllowBrowser") as Promise<boolean | undefined>,
|
|
|
|
|
- this.getGlobalState("alwaysAllowMcp") as Promise<boolean | undefined>,
|
|
|
|
|
- this.getGlobalState("alwaysAllowModeSwitch") as Promise<boolean | undefined>,
|
|
|
|
|
- this.getGlobalState("taskHistory") as Promise<HistoryItem[] | undefined>,
|
|
|
|
|
- this.getGlobalState("allowedCommands") as Promise<string[] | undefined>,
|
|
|
|
|
- this.getGlobalState("soundEnabled") as Promise<boolean | undefined>,
|
|
|
|
|
- this.getGlobalState("diffEnabled") as Promise<boolean | undefined>,
|
|
|
|
|
- this.getGlobalState("enableCheckpoints") as Promise<boolean | undefined>,
|
|
|
|
|
- this.getGlobalState("checkpointStorage") as Promise<CheckpointStorage | undefined>,
|
|
|
|
|
- this.getGlobalState("soundVolume") as Promise<number | undefined>,
|
|
|
|
|
- this.getGlobalState("browserViewportSize") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("fuzzyMatchThreshold") as Promise<number | undefined>,
|
|
|
|
|
- this.getGlobalState("preferredLanguage") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("writeDelayMs") as Promise<number | undefined>,
|
|
|
|
|
- this.getGlobalState("screenshotQuality") as Promise<number | undefined>,
|
|
|
|
|
- this.getGlobalState("terminalOutputLineLimit") as Promise<number | undefined>,
|
|
|
|
|
- this.getGlobalState("mcpEnabled") as Promise<boolean | undefined>,
|
|
|
|
|
- this.getGlobalState("enableMcpServerCreation") as Promise<boolean | undefined>,
|
|
|
|
|
- this.getGlobalState("alwaysApproveResubmit") as Promise<boolean | undefined>,
|
|
|
|
|
- this.getGlobalState("requestDelaySeconds") as Promise<number | undefined>,
|
|
|
|
|
- this.getGlobalState("rateLimitSeconds") as Promise<number | undefined>,
|
|
|
|
|
- this.getGlobalState("currentApiConfigName") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("listApiConfigMeta") as Promise<ApiConfigMeta[] | undefined>,
|
|
|
|
|
- this.getGlobalState("vsCodeLmModelSelector") as Promise<vscode.LanguageModelChatSelector | undefined>,
|
|
|
|
|
- this.getGlobalState("mode") as Promise<Mode | undefined>,
|
|
|
|
|
- this.getGlobalState("modeApiConfigs") as Promise<Record<Mode, string> | undefined>,
|
|
|
|
|
- this.getGlobalState("customModePrompts") as Promise<CustomModePrompts | undefined>,
|
|
|
|
|
- this.getGlobalState("customSupportPrompts") as Promise<CustomSupportPrompts | undefined>,
|
|
|
|
|
- this.getGlobalState("enhancementApiConfigId") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("autoApprovalEnabled") as Promise<boolean | undefined>,
|
|
|
|
|
- this.customModesManager.getCustomModes(),
|
|
|
|
|
- this.getGlobalState("experiments") as Promise<Record<ExperimentId, boolean> | undefined>,
|
|
|
|
|
- this.getSecret("unboundApiKey") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("unboundModelId") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("unboundModelInfo") as Promise<ModelInfo | undefined>,
|
|
|
|
|
- this.getSecret("requestyApiKey") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("requestyModelId") as Promise<string | undefined>,
|
|
|
|
|
- this.getGlobalState("requestyModelInfo") as Promise<ModelInfo | undefined>,
|
|
|
|
|
- this.getGlobalState("modelTemperature") as Promise<number | undefined>,
|
|
|
|
|
- this.getGlobalState("modelMaxTokens") as Promise<number | undefined>,
|
|
|
|
|
- this.getGlobalState("anthropicThinking") as Promise<number | undefined>,
|
|
|
|
|
- this.getGlobalState("maxOpenTabsContext") as Promise<number | undefined>,
|
|
|
|
|
- this.getGlobalState("browserToolEnabled") as Promise<boolean | undefined>,
|
|
|
|
|
- this.getGlobalState("lmStudioSpeculativeDecodingEnabled") as Promise<boolean | undefined>,
|
|
|
|
|
- this.getGlobalState("lmStudioDraftModelId") as Promise<string | undefined>,
|
|
|
|
|
- ])
|
|
|
|
|
|
|
+ // Get ApiConfiguration directly from contextProxy
|
|
|
|
|
+ const apiConfiguration = this.contextProxy.getApiConfiguration()
|
|
|
|
|
|
|
|
- let apiProvider: ApiProvider
|
|
|
|
|
- if (storedApiProvider) {
|
|
|
|
|
- apiProvider = storedApiProvider
|
|
|
|
|
- } else {
|
|
|
|
|
- // Either new user or legacy user that doesn't have the apiProvider stored in state
|
|
|
|
|
- // (If they're using OpenRouter or Bedrock, then apiProvider state will exist)
|
|
|
|
|
- if (apiKey) {
|
|
|
|
|
- apiProvider = "anthropic"
|
|
|
|
|
- } else {
|
|
|
|
|
- // New users should default to openrouter
|
|
|
|
|
- apiProvider = "openrouter"
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // Create an object to store all fetched values (excluding API config which we already have)
|
|
|
|
|
+ const stateValues: Record<GlobalStateKey, any> = {} as Record<GlobalStateKey, any>
|
|
|
|
|
|
|
|
|
|
+ // Create promise arrays for global state
|
|
|
|
|
+ const statePromises = GLOBAL_STATE_KEYS
|
|
|
|
|
+ // Filter out API config keys since we already have them
|
|
|
|
|
+ .filter((key) => !API_CONFIG_KEYS.includes(key))
|
|
|
|
|
+ .map((key) => this.getGlobalState(key))
|
|
|
|
|
+
|
|
|
|
|
+ // Add promise for custom modes which is handled separately
|
|
|
|
|
+ const customModesPromise = this.customModesManager.getCustomModes()
|
|
|
|
|
+
|
|
|
|
|
+ let idx = 0
|
|
|
|
|
+ const valuePromises = await Promise.all([...statePromises, customModesPromise])
|
|
|
|
|
+
|
|
|
|
|
+ // Populate stateValues
|
|
|
|
|
+ GLOBAL_STATE_KEYS.filter((key) => !API_CONFIG_KEYS.includes(key)).forEach((key) => {
|
|
|
|
|
+ stateValues[key] = valuePromises[idx]
|
|
|
|
|
+ idx = idx + 1
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ let customModes = valuePromises[idx] as ModeConfig[] | undefined
|
|
|
|
|
+
|
|
|
|
|
+ // Return the same structure as before
|
|
|
return {
|
|
return {
|
|
|
- apiConfiguration: {
|
|
|
|
|
- apiProvider,
|
|
|
|
|
- apiModelId,
|
|
|
|
|
- apiKey,
|
|
|
|
|
- glamaApiKey,
|
|
|
|
|
- glamaModelId,
|
|
|
|
|
- glamaModelInfo,
|
|
|
|
|
- openRouterApiKey,
|
|
|
|
|
- awsAccessKey,
|
|
|
|
|
- awsSecretKey,
|
|
|
|
|
- awsSessionToken,
|
|
|
|
|
- awsRegion,
|
|
|
|
|
- awsUseCrossRegionInference,
|
|
|
|
|
- awsProfile,
|
|
|
|
|
- awsUseProfile,
|
|
|
|
|
- vertexProjectId,
|
|
|
|
|
- vertexRegion,
|
|
|
|
|
- openAiBaseUrl,
|
|
|
|
|
- openAiApiKey,
|
|
|
|
|
- openAiModelId,
|
|
|
|
|
- openAiCustomModelInfo,
|
|
|
|
|
- openAiUseAzure,
|
|
|
|
|
- ollamaModelId,
|
|
|
|
|
- ollamaBaseUrl,
|
|
|
|
|
- lmStudioModelId,
|
|
|
|
|
- lmStudioBaseUrl,
|
|
|
|
|
- anthropicBaseUrl,
|
|
|
|
|
- geminiApiKey,
|
|
|
|
|
- openAiNativeApiKey,
|
|
|
|
|
- deepSeekApiKey,
|
|
|
|
|
- mistralApiKey,
|
|
|
|
|
- mistralCodestralUrl,
|
|
|
|
|
- azureApiVersion,
|
|
|
|
|
- openAiStreamingEnabled,
|
|
|
|
|
- openRouterModelId,
|
|
|
|
|
- openRouterModelInfo,
|
|
|
|
|
- openRouterBaseUrl,
|
|
|
|
|
- openRouterUseMiddleOutTransform,
|
|
|
|
|
- vsCodeLmModelSelector,
|
|
|
|
|
- unboundApiKey,
|
|
|
|
|
- unboundModelId,
|
|
|
|
|
- unboundModelInfo,
|
|
|
|
|
- requestyApiKey,
|
|
|
|
|
- requestyModelId,
|
|
|
|
|
- requestyModelInfo,
|
|
|
|
|
- modelTemperature,
|
|
|
|
|
- modelMaxTokens,
|
|
|
|
|
- modelMaxThinkingTokens,
|
|
|
|
|
- lmStudioSpeculativeDecodingEnabled,
|
|
|
|
|
- lmStudioDraftModelId,
|
|
|
|
|
- },
|
|
|
|
|
- lastShownAnnouncementId,
|
|
|
|
|
- customInstructions,
|
|
|
|
|
- alwaysAllowReadOnly: alwaysAllowReadOnly ?? false,
|
|
|
|
|
- alwaysAllowWrite: alwaysAllowWrite ?? false,
|
|
|
|
|
- alwaysAllowExecute: alwaysAllowExecute ?? false,
|
|
|
|
|
- alwaysAllowBrowser: alwaysAllowBrowser ?? false,
|
|
|
|
|
- alwaysAllowMcp: alwaysAllowMcp ?? false,
|
|
|
|
|
- alwaysAllowModeSwitch: alwaysAllowModeSwitch ?? false,
|
|
|
|
|
- taskHistory,
|
|
|
|
|
- allowedCommands,
|
|
|
|
|
- soundEnabled: soundEnabled ?? false,
|
|
|
|
|
- diffEnabled: diffEnabled ?? true,
|
|
|
|
|
- enableCheckpoints: enableCheckpoints ?? true,
|
|
|
|
|
- checkpointStorage: checkpointStorage ?? "task",
|
|
|
|
|
- soundVolume,
|
|
|
|
|
- browserViewportSize: browserViewportSize ?? "900x600",
|
|
|
|
|
- screenshotQuality: screenshotQuality ?? 75,
|
|
|
|
|
- fuzzyMatchThreshold: fuzzyMatchThreshold ?? 1.0,
|
|
|
|
|
- writeDelayMs: writeDelayMs ?? 1000,
|
|
|
|
|
- terminalOutputLineLimit: terminalOutputLineLimit ?? 500,
|
|
|
|
|
- mode: mode ?? defaultModeSlug,
|
|
|
|
|
|
|
+ apiConfiguration,
|
|
|
|
|
+ lastShownAnnouncementId: stateValues.lastShownAnnouncementId,
|
|
|
|
|
+ customInstructions: stateValues.customInstructions,
|
|
|
|
|
+ alwaysAllowReadOnly: stateValues.alwaysAllowReadOnly ?? false,
|
|
|
|
|
+ alwaysAllowWrite: stateValues.alwaysAllowWrite ?? false,
|
|
|
|
|
+ alwaysAllowExecute: stateValues.alwaysAllowExecute ?? false,
|
|
|
|
|
+ alwaysAllowBrowser: stateValues.alwaysAllowBrowser ?? false,
|
|
|
|
|
+ alwaysAllowMcp: stateValues.alwaysAllowMcp ?? false,
|
|
|
|
|
+ alwaysAllowModeSwitch: stateValues.alwaysAllowModeSwitch ?? false,
|
|
|
|
|
+ taskHistory: stateValues.taskHistory,
|
|
|
|
|
+ allowedCommands: stateValues.allowedCommands,
|
|
|
|
|
+ soundEnabled: stateValues.soundEnabled ?? false,
|
|
|
|
|
+ diffEnabled: stateValues.diffEnabled ?? true,
|
|
|
|
|
+ enableCheckpoints: stateValues.enableCheckpoints ?? false,
|
|
|
|
|
+ checkpointStorage: stateValues.checkpointStorage ?? "task",
|
|
|
|
|
+ soundVolume: stateValues.soundVolume,
|
|
|
|
|
+ browserViewportSize: stateValues.browserViewportSize ?? "900x600",
|
|
|
|
|
+ screenshotQuality: stateValues.screenshotQuality ?? 75,
|
|
|
|
|
+ fuzzyMatchThreshold: stateValues.fuzzyMatchThreshold ?? 1.0,
|
|
|
|
|
+ writeDelayMs: stateValues.writeDelayMs ?? 1000,
|
|
|
|
|
+ terminalOutputLineLimit: stateValues.terminalOutputLineLimit ?? 500,
|
|
|
|
|
+ mode: stateValues.mode ?? defaultModeSlug,
|
|
|
preferredLanguage:
|
|
preferredLanguage:
|
|
|
- preferredLanguage ??
|
|
|
|
|
|
|
+ stateValues.preferredLanguage ??
|
|
|
(() => {
|
|
(() => {
|
|
|
// Get VSCode's locale setting
|
|
// Get VSCode's locale setting
|
|
|
const vscodeLang = vscode.env.language
|
|
const vscodeLang = vscode.env.language
|
|
@@ -2441,23 +2142,23 @@ export class ClineProvider implements vscode.WebviewViewProvider {
|
|
|
// Return mapped language or default to English
|
|
// Return mapped language or default to English
|
|
|
return langMap[vscodeLang] ?? langMap[vscodeLang.split("-")[0]] ?? "English"
|
|
return langMap[vscodeLang] ?? langMap[vscodeLang.split("-")[0]] ?? "English"
|
|
|
})(),
|
|
})(),
|
|
|
- mcpEnabled: mcpEnabled ?? true,
|
|
|
|
|
- enableMcpServerCreation: enableMcpServerCreation ?? true,
|
|
|
|
|
- alwaysApproveResubmit: alwaysApproveResubmit ?? false,
|
|
|
|
|
- requestDelaySeconds: Math.max(5, requestDelaySeconds ?? 10),
|
|
|
|
|
- rateLimitSeconds: rateLimitSeconds ?? 0,
|
|
|
|
|
- currentApiConfigName: currentApiConfigName ?? "default",
|
|
|
|
|
- listApiConfigMeta: listApiConfigMeta ?? [],
|
|
|
|
|
- modeApiConfigs: modeApiConfigs ?? ({} as Record<Mode, string>),
|
|
|
|
|
- customModePrompts: customModePrompts ?? {},
|
|
|
|
|
- customSupportPrompts: customSupportPrompts ?? {},
|
|
|
|
|
- enhancementApiConfigId,
|
|
|
|
|
- experiments: experiments ?? experimentDefault,
|
|
|
|
|
- autoApprovalEnabled: autoApprovalEnabled ?? false,
|
|
|
|
|
|
|
+ mcpEnabled: stateValues.mcpEnabled ?? true,
|
|
|
|
|
+ enableMcpServerCreation: stateValues.enableMcpServerCreation ?? true,
|
|
|
|
|
+ alwaysApproveResubmit: stateValues.alwaysApproveResubmit ?? false,
|
|
|
|
|
+ requestDelaySeconds: Math.max(5, stateValues.requestDelaySeconds ?? 10),
|
|
|
|
|
+ rateLimitSeconds: stateValues.rateLimitSeconds ?? 0,
|
|
|
|
|
+ currentApiConfigName: stateValues.currentApiConfigName ?? "default",
|
|
|
|
|
+ listApiConfigMeta: stateValues.listApiConfigMeta ?? [],
|
|
|
|
|
+ modeApiConfigs: stateValues.modeApiConfigs ?? ({} as Record<Mode, string>),
|
|
|
|
|
+ customModePrompts: stateValues.customModePrompts ?? {},
|
|
|
|
|
+ customSupportPrompts: stateValues.customSupportPrompts ?? {},
|
|
|
|
|
+ enhancementApiConfigId: stateValues.enhancementApiConfigId,
|
|
|
|
|
+ experiments: stateValues.experiments ?? experimentDefault,
|
|
|
|
|
+ autoApprovalEnabled: stateValues.autoApprovalEnabled ?? false,
|
|
|
customModes,
|
|
customModes,
|
|
|
- maxOpenTabsContext: maxOpenTabsContext ?? 20,
|
|
|
|
|
- openRouterUseMiddleOutTransform: openRouterUseMiddleOutTransform ?? true,
|
|
|
|
|
- browserToolEnabled: browserToolEnabled ?? true,
|
|
|
|
|
|
|
+ maxOpenTabsContext: stateValues.maxOpenTabsContext ?? 20,
|
|
|
|
|
+ openRouterUseMiddleOutTransform: stateValues.openRouterUseMiddleOutTransform ?? true,
|
|
|
|
|
+ browserToolEnabled: stateValues.browserToolEnabled ?? true,
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -2477,25 +2178,21 @@ export class ClineProvider implements vscode.WebviewViewProvider {
|
|
|
// global
|
|
// global
|
|
|
|
|
|
|
|
async updateGlobalState(key: GlobalStateKey, value: any) {
|
|
async updateGlobalState(key: GlobalStateKey, value: any) {
|
|
|
- await this.context.globalState.update(key, value)
|
|
|
|
|
|
|
+ await this.contextProxy.updateGlobalState(key, value)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
async getGlobalState(key: GlobalStateKey) {
|
|
async getGlobalState(key: GlobalStateKey) {
|
|
|
- return await this.context.globalState.get(key)
|
|
|
|
|
|
|
+ return await this.contextProxy.getGlobalState(key)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// secrets
|
|
// secrets
|
|
|
|
|
|
|
|
public async storeSecret(key: SecretKey, value?: string) {
|
|
public async storeSecret(key: SecretKey, value?: string) {
|
|
|
- if (value) {
|
|
|
|
|
- await this.context.secrets.store(key, value)
|
|
|
|
|
- } else {
|
|
|
|
|
- await this.context.secrets.delete(key)
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ await this.contextProxy.storeSecret(key, value)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private async getSecret(key: SecretKey) {
|
|
private async getSecret(key: SecretKey) {
|
|
|
- return await this.context.secrets.get(key)
|
|
|
|
|
|
|
+ return await this.contextProxy.getSecret(key)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// dev
|
|
// dev
|
|
@@ -2512,26 +2209,13 @@ export class ClineProvider implements vscode.WebviewViewProvider {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
for (const key of this.context.globalState.keys()) {
|
|
for (const key of this.context.globalState.keys()) {
|
|
|
- await this.context.globalState.update(key, undefined)
|
|
|
|
|
|
|
+ await this.contextProxy.updateGlobalState(key, undefined)
|
|
|
}
|
|
}
|
|
|
- const secretKeys: SecretKey[] = [
|
|
|
|
|
- "apiKey",
|
|
|
|
|
- "glamaApiKey",
|
|
|
|
|
- "openRouterApiKey",
|
|
|
|
|
- "awsAccessKey",
|
|
|
|
|
- "awsSecretKey",
|
|
|
|
|
- "awsSessionToken",
|
|
|
|
|
- "openAiApiKey",
|
|
|
|
|
- "geminiApiKey",
|
|
|
|
|
- "openAiNativeApiKey",
|
|
|
|
|
- "deepSeekApiKey",
|
|
|
|
|
- "mistralApiKey",
|
|
|
|
|
- "unboundApiKey",
|
|
|
|
|
- "requestyApiKey",
|
|
|
|
|
- ]
|
|
|
|
|
- for (const key of secretKeys) {
|
|
|
|
|
|
|
+
|
|
|
|
|
+ for (const key of SECRET_KEYS) {
|
|
|
await this.storeSecret(key, undefined)
|
|
await this.storeSecret(key, undefined)
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
await this.configManager.resetAllConfigs()
|
|
await this.configManager.resetAllConfigs()
|
|
|
await this.customModesManager.resetCustomModes()
|
|
await this.customModesManager.resetCustomModes()
|
|
|
if (this.cline) {
|
|
if (this.cline) {
|