Răsfoiți Sursa

v3.39.0 Release Notes (#7813)

* v3.39.0 Release Notes

* v3.39.0 Release Notes

* feat: enhance Announcement component with new microwave model and account login functionality

- Updated Announcement component to include a new free microwave model button
- Adjusted active tab logic in OpenRouterModelPicker to default to "free" if a free model is selected

* Add demo link

---------

Co-authored-by: Saoud Rizwan <[email protected]>
Ara 1 lună în urmă
părinte
comite
a575a76e8f

+ 10 - 2
CHANGELOG.md

@@ -1,11 +1,19 @@
 # Changelog
 
+## [3.39.0]
+- Add Explain Changes feature
+- Add microwave Stealth model
+- Add Tabbed Model Picker with Recommended and Free tabs 
+- Add support to View remote rules and workflows in the editor 
+- Enable NTC (Native Tool Calling) by default
+- Bug fixes and improvements for LiteLLM provider
+
 ## [3.38.3]
 
 - Task export feature now opens the task directory, allowing easy access to the full task files
-- Added Grok 4.1 and Grok Code to XAI provider
+- Add Grok 4.1 and Grok Code to XAI provider
 - Enabled native tool calling for Baseten and Kimi K2 models
-- Added thinking level to Gemini 3.0 Pro preview
+- Add thinking level to Gemini 3.0 Pro preview
 - Expanded Hooks functionality
 - Removed Task Timeline from Task Header
 - Bug fix for slash commands

+ 2 - 2
package-lock.json

@@ -1,12 +1,12 @@
 {
 	"name": "claude-dev",
-	"version": "3.38.3",
+	"version": "3.39.0",
 	"lockfileVersion": 3,
 	"requires": true,
 	"packages": {
 		"": {
 			"name": "claude-dev",
-			"version": "3.38.3",
+			"version": "3.39.0",
 			"license": "Apache-2.0",
 			"dependencies": {
 				"@anthropic-ai/sdk": "^0.37.0",

+ 1 - 1
package.json

@@ -2,7 +2,7 @@
 	"name": "claude-dev",
 	"displayName": "Cline",
 	"description": "Autonomous coding agent right in your IDE, capable of creating/editing files, running commands, using the browser, and more with your permission every step of the way.",
-	"version": "3.38.3",
+	"version": "3.39.0",
 	"icon": "assets/icons/icon.png",
 	"engines": {
 		"vscode": "^1.84.0"

+ 71 - 13
webview-ui/src/components/chat/Announcement.tsx

@@ -1,11 +1,15 @@
-import { VSCodeLink } from "@vscode/webview-ui-toolkit/react"
+import { EmptyRequest } from "@shared/proto/cline/common"
+import { VSCodeButton, VSCodeLink } from "@vscode/webview-ui-toolkit/react"
 import { XIcon } from "lucide-react"
-import { CSSProperties, memo } from "react"
+import { CSSProperties, memo, useState } from "react"
 import { useMount } from "react-use"
 import { Button } from "@/components/ui/button"
 import { PLATFORM_CONFIG, PlatformType } from "@/config/platform.config"
+import { useClineAuth } from "@/context/ClineAuthContext"
 import { useExtensionState } from "@/context/ExtensionStateContext"
+import { AccountServiceClient } from "@/services/grpc-client"
 import { getAsVar, VSC_DESCRIPTION_FOREGROUND, VSC_INACTIVE_SELECTION_BACKGROUND } from "@/utils/vscStyles"
+import { useApiConfigurationHandlers } from "../settings/utils/useApiConfigurationHandlers"
 
 interface AnnouncementProps {
 	version: string
@@ -20,7 +24,7 @@ const containerStyle: CSSProperties = {
 	position: "relative",
 	flexShrink: 0,
 }
-const h4TitleStyle: CSSProperties = { margin: "0 0 8px", fontWeight: "bold" }
+const h2TitleStyle: CSSProperties = { margin: "0 0 8px", fontWeight: "bold" }
 const ulStyle: CSSProperties = { margin: "0 0 8px", paddingLeft: "12px", listStyleType: "disc" }
 const _accountIconStyle: CSSProperties = { fontSize: 11 }
 const hrStyle: CSSProperties = {
@@ -39,10 +43,39 @@ Patch releases (3.19.1 → 3.19.2) will not trigger new announcements.
 */
 const Announcement = ({ version, hideAnnouncement }: AnnouncementProps) => {
 	const minorVersion = version.split(".").slice(0, 2).join(".") // 2.0.0 -> 2.0
-	const { refreshOpenRouterModels } = useExtensionState()
+	const { clineUser } = useClineAuth()
+	const { openRouterModels, setShowChatModelSelector, refreshOpenRouterModels } = useExtensionState()
+	const user = clineUser || undefined
+	const { handleFieldsChange } = useApiConfigurationHandlers()
+
+	const [didClickMicrowaveButton, setDidClickMicrowaveButton] = useState(false)
 	// Need to get latest model list in case user hits shortcut button to set model
 	useMount(refreshOpenRouterModels)
 
+	const setMicrowave = () => {
+		const modelId = "stealth/microwave"
+		// set both plan and act modes to use code-supernova-1-million
+		handleFieldsChange({
+			planModeOpenRouterModelId: modelId,
+			actModeOpenRouterModelId: modelId,
+			planModeOpenRouterModelInfo: openRouterModels[modelId],
+			actModeOpenRouterModelInfo: openRouterModels[modelId],
+			planModeApiProvider: "cline",
+			actModeApiProvider: "cline",
+		})
+
+		setTimeout(() => {
+			setDidClickMicrowaveButton(true)
+			setShowChatModelSelector(true)
+		}, 10)
+	}
+
+	const handleShowAccount = () => {
+		AccountServiceClient.accountLoginClicked(EmptyRequest.create()).catch((err) =>
+			console.error("Failed to get login URL:", err),
+		)
+	}
+
 	const isVscode = PLATFORM_CONFIG.type === PlatformType.VSCODE
 
 	return (
@@ -55,9 +88,9 @@ const Announcement = ({ version, hideAnnouncement }: AnnouncementProps) => {
 				variant="icon">
 				<XIcon />
 			</Button>
-			<h4 style={h4TitleStyle}>
+			<h2 style={h2TitleStyle}>
 				🎉{"  "}New in v{version}
-			</h4>
+			</h2>
 			<ul style={ulStyle}>
 				{isVscode && (
 					<>
@@ -66,24 +99,49 @@ const Announcement = ({ version, hideAnnouncement }: AnnouncementProps) => {
 							<VSCodeLink href="https://docs.cline.bot/features/explain-changes" style={linkStyle}>
 								Explain Changes
 							</VSCodeLink>{" "}
-							button when Cline completes a task that helps you review code with inline chat. You can reply to
-							comments with follow-up questions, and send that chat back to Cline to continue working.
+							button when Cline completes a task to help review code with inline chat. You can reply to comments, or
+							send the chat as context back to Cline.
 						</li>
 						<li>
-							You can also use a new{" "}
+							Use the new{" "}
 							<VSCodeLink href="https://docs.cline.bot/features/slash-commands/explain-changes" style={linkStyle}>
 								/explain-changes
 							</VSCodeLink>{" "}
-							slash command to review commits, branches, PRs, or uncommitted work. Try asking Cline to explain the
-							last commit or a PR you need to review!
+							slash command to explain the changes in branches, commits, etc. (Try asking Cline to explain a PR you
+							need to review!)
 						</li>
 					</>
 				)}
+				<li>
+					New <code>microwave</code> stealth model, free for a limited time!
+					<br />
+					{user ? (
+						<div style={{ display: "flex", gap: "8px", flexWrap: "wrap", margin: "5px 0" }}>
+							{!didClickMicrowaveButton && (
+								<VSCodeButton
+									appearance="primary"
+									onClick={setMicrowave}
+									style={{ transform: "scale(0.85)", transformOrigin: "left center" }}>
+									Try stealth/microwave
+								</VSCodeButton>
+							)}
+						</div>
+					) : (
+						<VSCodeButton
+							appearance="primary"
+							onClick={handleShowAccount}
+							style={{ margin: "5px 0", transform: "scale(0.85)", transformOrigin: "left center" }}>
+							Sign Up with Cline
+						</VSCodeButton>
+					)}
+				</li>
 			</ul>
-
 			{isVscode && (
 				<p style={{ margin: "0" }}>
-					See a demo: <VSCodeLink style={linkStyle}>INSERT_LINK</VSCodeLink>
+					See a{" "}
+					<VSCodeLink href="https://x.com/sdrzn/status/1995840893816111246" style={linkStyle}>
+						demo of "Explain Changes"
+					</VSCodeLink>
 				</p>
 			)}
 			<div style={hrStyle} />

+ 9 - 8
webview-ui/src/components/settings/OpenRouterModelPicker.tsx

@@ -11,7 +11,6 @@ import { useExtensionState } from "@/context/ExtensionStateContext"
 import { StateServiceClient } from "@/services/grpc-client"
 import { highlight } from "../history/HistoryView"
 import { ContextWindowSwitcher } from "./common/ContextWindowSwitcher"
-import { ModelInfoView } from "./common/ModelInfoView"
 import { DropdownContainer } from "./common/ModelSelector"
 import FeaturedModelCard from "./FeaturedModelCard"
 import ThinkingBudgetSlider from "./ThinkingBudgetSlider"
@@ -72,18 +71,17 @@ const freeModels = [
 	{
 		id: "x-ai/grok-code-fast-1",
 		description: "Fast inference with strong coding performance",
-		label: "FAST",
+		label: "FREE",
 	},
 	{
 		id: "minimax/minimax-m2",
 		description: "Open source model with solid performance",
-		label: "OSS",
+		label: "FREE",
 	},
 	{
 		id: "stealth/microwave",
 		description: "A stealth model for agentic coding tasks",
-		label: "Free",
-		isFree: true,
+		label: "FREE",
 	},
 ]
 
@@ -96,7 +94,10 @@ const OpenRouterModelPicker: React.FC<OpenRouterModelPickerProps> = ({ isPopup,
 	const [searchTerm, setSearchTerm] = useState(modeFields.openRouterModelId || openRouterDefaultModelId)
 	const [isDropdownVisible, setIsDropdownVisible] = useState(false)
 	const [selectedIndex, setSelectedIndex] = useState(-1)
-	const [activeTab, setActiveTab] = useState<"recommended" | "free">("recommended")
+	const [activeTab, setActiveTab] = useState<"recommended" | "free">(() => {
+		const currentModelId = modeFields.openRouterModelId || openRouterDefaultModelId
+		return freeModels.some((m) => m.id === currentModelId) ? "free" : "recommended"
+	})
 	const dropdownRef = useRef<HTMLDivElement>(null)
 	const itemRefs = useRef<(HTMLDivElement | null)[]>([])
 	const dropdownListRef = useRef<HTMLDivElement>(null)
@@ -298,7 +299,7 @@ const OpenRouterModelPicker: React.FC<OpenRouterModelPickerProps> = ({ isPopup,
 		currentMode === "plan" ? apiConfiguration?.geminiPlanModeThinkingLevel : apiConfiguration?.geminiActModeThinkingLevel
 
 	return (
-		<div style={{ width: "100%" }}>
+		<div style={{ width: "100%", paddingBottom: 2 }}>
 			<style>
 				{`
 				.model-item-highlight {
@@ -473,7 +474,7 @@ const OpenRouterModelPicker: React.FC<OpenRouterModelPickerProps> = ({ isPopup,
 						</DropdownContainer>
 					)}
 
-					<ModelInfoView isPopup={isPopup} modelInfo={selectedModelInfo} selectedModelId={selectedModelId} />
+					{/* <ModelInfoView isPopup={isPopup} modelInfo={selectedModelInfo} selectedModelId={selectedModelId} /> */}
 				</>
 			) : isOpenRouterPreset ? (
 				<p