import * as vscode from "vscode" import { WebviewMessage } from "../../shared/WebviewMessage" import { defaultModeSlug, getModeBySlug, getGroupName } from "../../shared/modes" import { buildApiHandler } from "../../api" import { SYSTEM_PROMPT } from "../prompts/system" import { MultiSearchReplaceDiffStrategy } from "../diff/strategies/multi-search-replace" import { Package } from "../../shared/package" import { ClineProvider } from "./ClineProvider" export const generateSystemPrompt = async (provider: ClineProvider, message: WebviewMessage) => { const { apiConfiguration, customModePrompts, customInstructions, browserViewportSize, mcpEnabled, experiments, browserToolEnabled, language, enableSubfolderRules, } = await provider.getState() const diffStrategy = new MultiSearchReplaceDiffStrategy() const cwd = provider.cwd const mode = message.mode ?? defaultModeSlug const customModes = await provider.customModesManager.getCustomModes() const rooIgnoreInstructions = provider.getCurrentTask()?.rooIgnoreController?.getInstructions() // Determine if browser tools can be used based on model support, mode, and user settings let modelInfo: any = undefined // Create a temporary API handler to check if the model supports browser capability // This avoids relying on an active Cline instance which might not exist during preview try { const tempApiHandler = buildApiHandler(apiConfiguration) modelInfo = tempApiHandler.getModel().info } catch (error) { console.error("Error checking if model supports browser capability:", error) } // Check if the current mode includes the browser tool group const modeConfig = getModeBySlug(mode, customModes) const modeSupportsBrowser = modeConfig?.groups.some((group) => getGroupName(group) === "browser") ?? false // Check if model supports browser capability (images) const modelSupportsBrowser = modelInfo && (modelInfo as any)?.supportsImages === true // Only enable browser tools if the model supports it, the mode includes browser tools, // and browser tools are enabled in settings const canUseBrowserTool = modelSupportsBrowser && modeSupportsBrowser && (browserToolEnabled ?? true) const systemPrompt = await SYSTEM_PROMPT( provider.context, cwd, canUseBrowserTool, mcpEnabled ? provider.getMcpHub() : undefined, diffStrategy, browserViewportSize ?? "900x600", mode, customModePrompts, customModes, customInstructions, experiments, language, rooIgnoreInstructions, { todoListEnabled: apiConfiguration?.todoListEnabled ?? true, useAgentRules: vscode.workspace.getConfiguration(Package.name).get("useAgentRules") ?? true, enableSubfolderRules: enableSubfolderRules ?? false, newTaskRequireTodos: vscode.workspace .getConfiguration(Package.name) .get("newTaskRequireTodos", false), isStealthModel: modelInfo?.isStealthModel, }, undefined, // todoList undefined, // modelId provider.getSkillsManager(), ) return systemPrompt }