diff --git a/src/api/providers/utils/response-render-config.ts b/src/api/providers/utils/response-render-config.ts index 6f4a3f6165..49768c7a2f 100644 --- a/src/api/providers/utils/response-render-config.ts +++ b/src/api/providers/utils/response-render-config.ts @@ -18,7 +18,7 @@ export const renderModes = { export function getApiResponseRenderMode() { if (isJetbrainsPlatform()) { - return renderModes.fast + return renderModes.slow } const apiResponseRenderMode = vscode.workspace .getConfiguration("zgsm") diff --git a/src/core/task/__tests__/Task.sticky-profile-race.spec.ts b/src/core/task/__tests__/Task.sticky-profile-race.spec.ts index e78301541d..f5fcf14149 100644 --- a/src/core/task/__tests__/Task.sticky-profile-race.spec.ts +++ b/src/core/task/__tests__/Task.sticky-profile-race.spec.ts @@ -43,6 +43,14 @@ vi.mock("vscode", () => { createTextEditorDecorationType: vi.fn().mockReturnValue({ dispose: vi.fn(), }), + createOutputChannel: vi.fn().mockReturnValue({ + appendLine: vi.fn(), + append: vi.fn(), + clear: vi.fn(), + show: vi.fn(), + hide: vi.fn(), + dispose: vi.fn(), + }), visibleTextEditors: [mockTextEditor], tabGroups: { all: [mockTabGroup], @@ -71,6 +79,11 @@ vi.mock("vscode", () => { }, onDidSaveTextDocument: vi.fn(() => mockDisposable), }, + extensions: { + getExtension: vi.fn().mockReturnValue({ + extensionUri: { fsPath: "/mock/extension/path", path: "/mock/extension/path" }, + }), + }, env: { uriScheme: "vscode", language: "en", diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 89733782e0..c505bdf486 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -173,7 +173,7 @@ export class ClineProvider public isViewLaunched = false public settingsImportedAt?: number - public readonly latestAnnouncementId = "dec-2025-v3.38.0-skills-native-tool-calling" // v3.38.0 Skills & Native Tool Calling Required + public readonly latestAnnouncementId = "jan-2026-v3.39.0-sticky-profiles-image-mentions-brrr" // v3.39.0 Sticky Profiles, Image @Mentions, BRRR Mode public readonly providerSettingsManager: ProviderSettingsManager public readonly customModesManager: CustomModesManager diff --git a/src/core/webview/__tests__/ClineProvider.sticky-profile.spec.ts b/src/core/webview/__tests__/ClineProvider.sticky-profile.spec.ts index 3df4408b71..5688977ff8 100644 --- a/src/core/webview/__tests__/ClineProvider.sticky-profile.spec.ts +++ b/src/core/webview/__tests__/ClineProvider.sticky-profile.spec.ts @@ -26,6 +26,14 @@ vi.mock("vscode", () => ({ showWarningMessage: vi.fn(), showErrorMessage: vi.fn(), onDidChangeActiveTextEditor: vi.fn(() => ({ dispose: vi.fn() })), + createOutputChannel: vi.fn().mockReturnValue({ + appendLine: vi.fn(), + append: vi.fn(), + clear: vi.fn(), + show: vi.fn(), + hide: vi.fn(), + dispose: vi.fn(), + }), }, workspace: { getConfiguration: vi.fn().mockReturnValue({ @@ -40,6 +48,11 @@ vi.mock("vscode", () => ({ onDidOpenTextDocument: vi.fn(() => ({ dispose: vi.fn() })), onDidCloseTextDocument: vi.fn(() => ({ dispose: vi.fn() })), }, + extensions: { + getExtension: vi.fn().mockReturnValue({ + extensionUri: { fsPath: "/mock/extension/path", path: "/mock/extension/path" }, + }), + }, env: { uriScheme: "vscode", language: "en", diff --git a/src/core/webview/__tests__/webviewMessageHandler.imageMentions.integration.spec.ts b/src/core/webview/__tests__/webviewMessageHandler.imageMentions.integration.spec.ts index 277e56626a..90535b136c 100644 --- a/src/core/webview/__tests__/webviewMessageHandler.imageMentions.integration.spec.ts +++ b/src/core/webview/__tests__/webviewMessageHandler.imageMentions.integration.spec.ts @@ -12,10 +12,30 @@ vi.mock("vscode", () => ({ window: { showInformationMessage: vi.fn(), showErrorMessage: vi.fn(), + createOutputChannel: vi.fn().mockReturnValue({ + appendLine: vi.fn(), + append: vi.fn(), + clear: vi.fn(), + show: vi.fn(), + hide: vi.fn(), + dispose: vi.fn(), + }), + createTextEditorDecorationType: vi.fn().mockReturnValue({ + dispose: vi.fn(), + }), }, workspace: { workspaceFolders: [{ uri: { fsPath: "/mock/workspace" } }], }, + extensions: { + getExtension: vi.fn().mockReturnValue({ + extensionUri: { fsPath: "/mock/extension/path", path: "/mock/extension/path" }, + }), + }, + env: { + uriScheme: "vscode", + language: "en", + }, })) // Mock imageHelpers - use actual implementations for functions that need real file access @@ -89,9 +109,13 @@ describe("webviewMessageHandler - image mentions (integration)", () => { images: [], } as any) - expect(handleWebviewAskResponse).toHaveBeenCalledWith("messageResponse", "Please look at @/cat.jpg", [ - `data:image/jpeg;base64,${imgBytes.toString("base64")}`, - ]) + expect(handleWebviewAskResponse).toHaveBeenCalledWith( + "messageResponse", + "Please look at @/cat.jpg", + [`data:image/jpeg;base64,${imgBytes.toString("base64")}`], + "system", + false, + ) } finally { await fs.rm(tmpRoot, { recursive: true, force: true }) } diff --git a/src/core/webview/__tests__/webviewMessageHandler.searchFiles.spec.ts b/src/core/webview/__tests__/webviewMessageHandler.searchFiles.spec.ts index 82f4d765ab..f857c8756e 100644 --- a/src/core/webview/__tests__/webviewMessageHandler.searchFiles.spec.ts +++ b/src/core/webview/__tests__/webviewMessageHandler.searchFiles.spec.ts @@ -17,10 +17,30 @@ vi.mock("vscode", () => ({ window: { showInformationMessage: vi.fn(), showErrorMessage: vi.fn(), + createOutputChannel: vi.fn().mockReturnValue({ + appendLine: vi.fn(), + append: vi.fn(), + clear: vi.fn(), + show: vi.fn(), + hide: vi.fn(), + dispose: vi.fn(), + }), + createTextEditorDecorationType: vi.fn().mockReturnValue({ + dispose: vi.fn(), + }), }, workspace: { workspaceFolders: [{ uri: { fsPath: "/mock/workspace" } }], }, + extensions: { + getExtension: vi.fn().mockReturnValue({ + extensionUri: { fsPath: "/mock/extension/path", path: "/mock/extension/path" }, + }), + }, + env: { + uriScheme: "vscode", + language: "en", + }, })) describe("webviewMessageHandler - searchFiles with RooIgnore filtering", () => { diff --git a/webview-ui/src/components/chat/Announcement.tsx b/webview-ui/src/components/chat/Announcement.tsx index 7488328614..490d0f2d68 100644 --- a/webview-ui/src/components/chat/Announcement.tsx +++ b/webview-ui/src/components/chat/Announcement.tsx @@ -44,24 +44,9 @@ const Announcement = ({ hideAnnouncement }: AnnouncementProps) => {

{t("chat:announcement.release.heading")}

@@ -139,15 +124,4 @@ const CareersLink = ({ children }: { children?: ReactNode }) => ( ) -const BlogLink = ({ href, children }: { href: string; children?: ReactNode }) => ( - { - e.preventDefault() - vscode.postMessage({ type: "openExternal", url: href }) - }}> - {children} - -) - export default memo(Announcement) diff --git a/webview-ui/src/components/chat/FollowUpSuggest.tsx b/webview-ui/src/components/chat/FollowUpSuggest.tsx index cb367716d3..24f8a61d35 100644 --- a/webview-ui/src/components/chat/FollowUpSuggest.tsx +++ b/webview-ui/src/components/chat/FollowUpSuggest.tsx @@ -142,7 +142,7 @@ export const FollowUpSuggest = ({ )}
{ e.stopPropagation() // Cancel the auto-approve timer when edit button is clicked diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index c42dd824f4..55b7ad107c 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -348,8 +348,9 @@ }, "release": { "heading": "What's New:", - "skills": "Roo now supports Agent Skills - reusable packages of prompts, tools, and resources to extend Roo's capabilities.", - "nativeToolCalling": "Native tool calling is now required for all new tasks. Read more about the motivation and what to do if you're encountering issues." + "stickyProfiles": "Sticky provider profiles - Tasks now remember their API configuration, so switching profiles mid-session doesn't affect running tasks.", + "imageMentions": "Image file @mentions - Reference images directly in chat using @ mentions to include them in your context.", + "brrrMode": "YOLO is now BRRR - Auto-approving everything has been renamed from \"YOLO\" to \"BRRR\". Obviously." }, "cloudAgents": { "heading": "New in the Cloud:", diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index 7dd1b2060f..4ca0304800 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -342,8 +342,9 @@ }, "release": { "heading": "新增功能:", - "skills": "Roo 现支持 Agent Skills - 可复用的提示词、工具和资源包,扩展 Roo 的功能。", - "nativeToolCalling": "所有新任务现在需要使用原生工具调用。了解更多相关信息和解决方案。" + "stickyProfiles": "粘性提供商配置文件 - 任务现在会记住其 API 配置,因此在会话中途切换配置文件不会影响正在运行的任务。", + "imageMentions": "图像文件 @mentions - 在聊天中直接使用 @mentions 引用图像,将其包含在您的上下文中。", + "brrrMode": "YOLO 现在是 BRRR - 自动批准一切已从 \"YOLO\" 更名为 \"BRRR\"。显然。" }, "cloudAgents": { "heading": "云端新功能:", diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index 99e0d35898..75b62c34fb 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -352,8 +352,9 @@ }, "release": { "heading": "新增功能:", - "skills": "Roo 現已支援 Agent Skills - 可重複使用的提示詞、工具和資源套件,用於擴展 Roo 的功能。", - "nativeToolCalling": "所有新工作現在都需要原生工具呼叫。深入了解相關動機以及遇到問題時的解決方案。" + "stickyProfiles": "固定式提供商設定檔 - 工作現在會記住其 API 設定,因此在會話中途切換設定檔不會影響正在執行的工作。", + "imageMentions": "圖像檔案 @mentions - 在聊天中直接使用 @mentions 引用圖像,將其包含在您的上下文中。", + "brrrMode": "YOLO 現在是 BRRR - 自動批准一切已從 \"YOLO\" 更名為 \"BRRR\"。顯然。" }, "cloudAgents": { "heading": "雲端的新功能:",