({
vi.mock("@roo/package", () => ({
Package: {
- version: "3.55.0",
+ version: "3.72.0",
},
}))
@@ -41,11 +41,11 @@ vi.mock("@src/i18n/TranslationContext", () => ({
const translations: Record = {
"chat:announcement.release.heading": "What's New:",
"chat:announcement.release.highlight1":
- "Xiaomi MiMo provider: Added Xiaomi MiMo as a first-class API provider so you can configure MiMo models directly in Zoo Code.",
+ "Moonshot and Kimi Code providers — connect to Moonshot models with live model discovery, or sign in to Kimi Code through its OAuth device flow.",
"chat:announcement.release.highlight2":
- "Upstream Zoo Code handoff: Pulled in the latest upstream sunset merge and related platform updates to keep Zoo Code aligned with the community handoff work.",
+ "Latest model support — use Claude Opus 5 across providers, plus Kimi K3, Gemini 3.6 Flash, and MiniMax-M3.",
"chat:announcement.release.highlight3":
- "Stability fixes across chat and providers: Fixed MCP sign-in copy, Gemini full-tool requests, OpenAI temperature handling, and Markdown single-tilde rendering.",
+ "More reliable workflows — abandon interrupted subtasks cleanly, and index Dart and plain-text files in your codebase.",
"chat:announcement.handoff.heading": "The Roo Code plugin is not going away.",
}
@@ -62,20 +62,20 @@ describe("Announcement", () => {
it("renders the announcement title and highlights", () => {
render()
- expect(screen.getByText("Zoo Code 3.55.0 Released")).toBeInTheDocument()
+ expect(screen.getByText("Zoo Code 3.72.0 Released")).toBeInTheDocument()
expect(
screen.getByText(
- "Xiaomi MiMo provider: Added Xiaomi MiMo as a first-class API provider so you can configure MiMo models directly in Zoo Code.",
+ "Moonshot and Kimi Code providers — connect to Moonshot models with live model discovery, or sign in to Kimi Code through its OAuth device flow.",
),
).toBeInTheDocument()
expect(
screen.getByText(
- "Upstream Zoo Code handoff: Pulled in the latest upstream sunset merge and related platform updates to keep Zoo Code aligned with the community handoff work.",
+ "Latest model support — use Claude Opus 5 across providers, plus Kimi K3, Gemini 3.6 Flash, and MiniMax-M3.",
),
).toBeInTheDocument()
expect(
screen.getByText(
- "Stability fixes across chat and providers: Fixed MCP sign-in copy, Gemini full-tool requests, OpenAI temperature handling, and Markdown single-tilde rendering.",
+ "More reliable workflows — abandon interrupted subtasks cleanly, and index Dart and plain-text files in your codebase.",
),
).toBeInTheDocument()
})
diff --git a/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx b/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx
index ca7d8c8ce6..9d23ca6886 100644
--- a/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx
+++ b/webview-ui/src/components/chat/__tests__/TaskHeader.spec.tsx
@@ -40,6 +40,7 @@ const mockExtensionState: {
apiConfiguration: ProviderSettings
currentTaskItem: { id: string } | null
clineMessages: any[]
+ taskHistory: any[]
} = {
apiConfiguration: {
apiProvider: "anthropic",
@@ -48,6 +49,7 @@ const mockExtensionState: {
} as ProviderSettings,
currentTaskItem: { id: "test-task-id" },
clineMessages: [],
+ taskHistory: [],
}
// Mock the ExtensionStateContext
@@ -223,6 +225,58 @@ describe("TaskHeader", () => {
})
})
+ describe("Delegated parent waiting-on-subtask banner", () => {
+ beforeEach(() => {
+ mockPostMessage.mockClear()
+ })
+
+ afterEach(() => {
+ mockExtensionState.currentTaskItem = { id: "test-task-id" }
+ mockExtensionState.taskHistory = []
+ })
+
+ it("does not show the banner when currentTaskItem is not delegated", () => {
+ mockExtensionState.currentTaskItem = { id: "test-task-id", status: "active" } as any
+ renderTaskHeader()
+ expect(screen.queryByText("chat:task.waitingOnSubtask")).not.toBeInTheDocument()
+ })
+
+ it("shows the banner when currentTaskItem is delegated with an awaitingChildId", () => {
+ mockExtensionState.currentTaskItem = {
+ id: "parent-1",
+ status: "delegated",
+ awaitingChildId: "child-1",
+ } as any
+ renderTaskHeader()
+ expect(screen.getByText("chat:task.waitingOnSubtask")).toBeInTheDocument()
+ })
+
+ it("navigates to the awaited child when the banner is clicked", () => {
+ mockExtensionState.currentTaskItem = {
+ id: "parent-1",
+ status: "delegated",
+ awaitingChildId: "child-1",
+ } as any
+ renderTaskHeader()
+
+ fireEvent.click(screen.getByText("chat:task.waitingOnSubtask"))
+
+ expect(mockPostMessage).toHaveBeenCalledWith({ type: "showTaskWithId", text: "child-1" })
+ })
+
+ it("does not show an Abandon button (removed: implicit sever on re-delegation)", () => {
+ mockExtensionState.currentTaskItem = {
+ id: "parent-1",
+ status: "delegated",
+ awaitingChildId: "child-1",
+ } as any
+ renderTaskHeader()
+
+ expect(screen.getByText("chat:task.waitingOnSubtask")).toBeInTheDocument()
+ expect(screen.queryByText("history:abandonSubtask")).not.toBeInTheDocument()
+ })
+ })
+
describe("Context window percentage calculation", () => {
// The percentage should be calculated as:
// contextTokens / (contextWindow - reservedForOutput) * 100
diff --git a/webview-ui/src/components/history/SubtaskRow.tsx b/webview-ui/src/components/history/SubtaskRow.tsx
index 0089e1f81d..c0aa88489a 100644
--- a/webview-ui/src/components/history/SubtaskRow.tsx
+++ b/webview-ui/src/components/history/SubtaskRow.tsx
@@ -6,6 +6,7 @@ import type { SubtaskTreeNode } from "./types"
import { countAllSubtasks } from "./types"
import { StandardTooltip } from "../ui"
import SubtaskCollapsibleRow from "./SubtaskCollapsibleRow"
+import { TaskStatusBadge } from "./TaskStatusBadge"
interface SubtaskRowProps {
/** The subtask tree node to display */
@@ -52,6 +53,9 @@ const SubtaskRow = ({ node, depth, onToggleExpand, className }: SubtaskRowProps)
{item.task}
+ {(item.status === "delegated" || item.status === "interrupted") && (
+
+ )}
diff --git a/webview-ui/src/components/history/TaskItemFooter.tsx b/webview-ui/src/components/history/TaskItemFooter.tsx
index d0dc367e64..72c6b64420 100644
--- a/webview-ui/src/components/history/TaskItemFooter.tsx
+++ b/webview-ui/src/components/history/TaskItemFooter.tsx
@@ -7,6 +7,7 @@ import { DeleteButton } from "./DeleteButton"
import { StandardTooltip } from "../ui/standard-tooltip"
import { useAppTranslation } from "@/i18n/TranslationContext"
import { Split } from "lucide-react"
+import { TaskStatusBadge } from "./TaskStatusBadge"
export interface TaskItemFooterProps {
item: HistoryItem
@@ -36,6 +37,13 @@ const TaskItemFooter: React.FC = ({
·
>
)}
+ {/* Delegation status (delegated parent waiting on a child, or interrupted child) */}
+ {(item.status === "delegated" || item.status === "interrupted") && (
+ <>
+
+ ·
+ >
+ )}
{/* Datetime with time-ago format */}
{formatTimeAgo(item.ts)}
diff --git a/webview-ui/src/components/history/TaskStatusBadge.tsx b/webview-ui/src/components/history/TaskStatusBadge.tsx
new file mode 100644
index 0000000000..5278f1422e
--- /dev/null
+++ b/webview-ui/src/components/history/TaskStatusBadge.tsx
@@ -0,0 +1,36 @@
+import { useAppTranslation } from "@/i18n/TranslationContext"
+import { cn } from "@/lib/utils"
+import { StandardTooltip } from "../ui"
+
+interface TaskStatusBadgeProps {
+ status: "delegated" | "interrupted"
+ className?: string
+}
+
+/**
+ * Small inline badge for a task's delegation status: a parent "delegated" and
+ * waiting on a subtask, or a child that was "interrupted" mid-execution and
+ * can be resumed rather than silently detached. See #559.
+ */
+export const TaskStatusBadge = ({ status, className }: TaskStatusBadgeProps) => {
+ const { t } = useAppTranslation()
+
+ const isInterrupted = status === "interrupted"
+ const icon = isInterrupted ? "codicon-warning" : "codicon-sync"
+ const label = isInterrupted ? t("history:interruptedTag") : t("history:delegatedTag")
+
+ return (
+
+
+
+ {label}
+
+
+ )
+}
diff --git a/webview-ui/src/components/history/__tests__/TaskItemFooter.spec.tsx b/webview-ui/src/components/history/__tests__/TaskItemFooter.spec.tsx
index aa334d94c2..fc8d7edcca 100644
--- a/webview-ui/src/components/history/__tests__/TaskItemFooter.spec.tsx
+++ b/webview-ui/src/components/history/__tests__/TaskItemFooter.spec.tsx
@@ -94,4 +94,24 @@ describe("TaskItemFooter", () => {
expect(screen.queryByText("history:subtaskTag")).not.toBeInTheDocument()
})
+
+ it("shows a delegated status badge when status is delegated", () => {
+ render(
+ ,
+ )
+
+ expect(screen.getByTestId("task-status-badge-delegated")).toBeInTheDocument()
+ })
+
+ it("shows an interrupted status badge when status is interrupted", () => {
+ render()
+
+ expect(screen.getByTestId("task-status-badge-interrupted")).toBeInTheDocument()
+ })
+
+ it("does not show a status badge for a completed task", () => {
+ render()
+
+ expect(screen.queryByTestId(/task-status-badge-/)).not.toBeInTheDocument()
+ })
})
diff --git a/webview-ui/src/components/mcp/McpEnabledToggle.tsx b/webview-ui/src/components/mcp/McpEnabledToggle.tsx
index 1fd30034b5..3e6e5cf9ff 100644
--- a/webview-ui/src/components/mcp/McpEnabledToggle.tsx
+++ b/webview-ui/src/components/mcp/McpEnabledToggle.tsx
@@ -5,10 +5,22 @@ import { useExtensionState } from "@src/context/ExtensionStateContext"
import { useAppTranslation } from "@src/i18n/TranslationContext"
import { vscode } from "@src/utils/vscode"
-const McpEnabledToggle = () => {
- const { mcpEnabled, setMcpEnabled } = useExtensionState()
+interface McpEnabledToggleProps {
+ mcpEnabled?: boolean
+ setMcpEnabled?: (value: boolean) => void
+}
+
+const McpEnabledToggle = ({
+ mcpEnabled: propsMcpEnabled,
+ setMcpEnabled: propsSetMcpEnabled,
+}: McpEnabledToggleProps = {}) => {
+ const { mcpEnabled: contextMcpEnabled, setMcpEnabled: contextSetMcpEnabled } = useExtensionState()
const { t } = useAppTranslation()
+ // When rendered inside SettingsView the value is buffered in `cachedState` and
+ // only persisted on Save. Fall back to live extension state when used uncontrolled.
+ const mcpEnabled = propsMcpEnabled ?? contextMcpEnabled
+
const handleChange = (e: Event | FormEvent) => {
const target = ("target" in e ? e.target : null) as HTMLInputElement | null
@@ -16,8 +28,12 @@ const McpEnabledToggle = () => {
return
}
- setMcpEnabled(target.checked)
- vscode.postMessage({ type: "updateSettings", updatedSettings: { mcpEnabled: target.checked } })
+ if (propsSetMcpEnabled) {
+ propsSetMcpEnabled(target.checked)
+ } else {
+ contextSetMcpEnabled(target.checked)
+ vscode.postMessage({ type: "updateSettings", updatedSettings: { mcpEnabled: target.checked } })
+ }
}
return (
diff --git a/webview-ui/src/components/mcp/McpView.tsx b/webview-ui/src/components/mcp/McpView.tsx
index 75a9a1a380..72724d72e8 100644
--- a/webview-ui/src/components/mcp/McpView.tsx
+++ b/webview-ui/src/components/mcp/McpView.tsx
@@ -28,8 +28,17 @@ import McpResourceRow from "./McpResourceRow"
import McpEnabledToggle from "./McpEnabledToggle"
import { McpErrorRow } from "./McpErrorRow"
-const McpView = () => {
- const { mcpServers: servers, alwaysAllowMcp, mcpEnabled } = useExtensionState()
+interface McpViewProps {
+ mcpEnabled?: boolean
+ setMcpEnabled?: (value: boolean) => void
+}
+
+const McpView = ({ mcpEnabled: propsMcpEnabled, setMcpEnabled }: McpViewProps = {}) => {
+ const { mcpServers: servers, alwaysAllowMcp, mcpEnabled: contextMcpEnabled } = useExtensionState()
+
+ // When rendered inside SettingsView the value is buffered in `cachedState` and
+ // only persisted on Save. Fall back to live extension state when used uncontrolled.
+ const mcpEnabled = propsMcpEnabled ?? contextMcpEnabled
const { t } = useAppTranslation()
const { isOverThreshold, title, message } = useTooManyTools()
@@ -55,7 +64,7 @@ const McpView = () => {
-
+
{mcpEnabled && (
<>
diff --git a/webview-ui/src/components/mcp/__tests__/McpEnabledToggle.spec.tsx b/webview-ui/src/components/mcp/__tests__/McpEnabledToggle.spec.tsx
new file mode 100644
index 0000000000..f59efce971
--- /dev/null
+++ b/webview-ui/src/components/mcp/__tests__/McpEnabledToggle.spec.tsx
@@ -0,0 +1,58 @@
+// npx vitest src/components/mcp/__tests__/McpEnabledToggle.spec.tsx
+
+import { render, screen, fireEvent } from "@/utils/test-utils"
+
+import McpEnabledToggle from "../McpEnabledToggle"
+import { vscode } from "@src/utils/vscode"
+
+vi.mock("@src/utils/vscode", () => ({
+ vscode: {
+ postMessage: vi.fn(),
+ },
+}))
+
+vi.mock("@src/i18n/TranslationContext", () => ({
+ useAppTranslation: () => ({ t: (key: string) => key }),
+}))
+
+const contextSetMcpEnabled = vi.fn()
+vi.mock("@src/context/ExtensionStateContext", () => ({
+ useExtensionState: () => ({
+ mcpEnabled: true,
+ setMcpEnabled: contextSetMcpEnabled,
+ }),
+}))
+
+const getCheckbox = () => screen.getByRole("checkbox")
+
+describe("McpEnabledToggle - Save/Discard contract", () => {
+ beforeEach(() => {
+ vi.clearAllMocks()
+ })
+
+ // Case 6: controlled (inside SettingsView) must buffer, not persist before Save.
+ it("buffers via the setter prop without persisting before Save when controlled", () => {
+ const setMcpEnabled = vi.fn()
+ render()
+
+ fireEvent.click(getCheckbox())
+
+ expect(setMcpEnabled).toHaveBeenCalledWith(false)
+ expect(vscode.postMessage).not.toHaveBeenCalled()
+ // Must not touch live extension state either.
+ expect(contextSetMcpEnabled).not.toHaveBeenCalled()
+ })
+
+ // Regression guard: uncontrolled usage keeps the original immediate behavior.
+ it("persists immediately via live state when used uncontrolled", () => {
+ render()
+
+ fireEvent.click(getCheckbox())
+
+ expect(contextSetMcpEnabled).toHaveBeenCalledWith(false)
+ expect(vscode.postMessage).toHaveBeenCalledWith({
+ type: "updateSettings",
+ updatedSettings: { mcpEnabled: false },
+ })
+ })
+})
diff --git a/webview-ui/src/components/mcp/__tests__/McpView.spec.tsx b/webview-ui/src/components/mcp/__tests__/McpView.spec.tsx
new file mode 100644
index 0000000000..957797d1e9
--- /dev/null
+++ b/webview-ui/src/components/mcp/__tests__/McpView.spec.tsx
@@ -0,0 +1,77 @@
+import { fireEvent, render, screen } from "@/utils/test-utils"
+
+import McpView from "../McpView"
+
+const setMcpEnabled = vi.fn()
+
+vi.mock("@src/context/ExtensionStateContext", () => ({
+ useExtensionState: () => ({
+ mcpServers: [],
+ alwaysAllowMcp: false,
+ mcpEnabled: false,
+ }),
+}))
+
+vi.mock("@src/i18n/TranslationContext", () => ({
+ useAppTranslation: () => ({ t: (key: string) => key }),
+}))
+
+vi.mock("@src/hooks/useTooManyTools", () => ({
+ useTooManyTools: () => ({ isOverThreshold: false, title: "", message: "" }),
+}))
+
+vi.mock("@src/components/settings/Section", () => ({
+ Section: ({ children }: { children: React.ReactNode }) =>
+ ),
+ }
+})
+
+// Mock the ModelPicker - must be a simple component that doesn't import anything
+vi.mock("../ModelPicker", () => ({
+ ModelPicker: function MockModelPicker() {
+ return React.createElement(
+ "div",
+ { "data-testid": "model-picker" },
+ React.createElement("span", { "data-testid": "model-picker-default" }, "mock-default"),
+ React.createElement("span", { "data-testid": "model-picker-count" }, "0"),
+ )
+ },
+}))
+
+// Mock vscode - factory must not reference outer scope variables
+vi.mock("@src/utils/vscode", () => {
+ const mockPostMessage = vi.fn()
+ return {
+ vscode: { postMessage: mockPostMessage },
+ }
+})
+
+// Mock useExtensionState
+vi.mock("@src/context/ExtensionStateContext", () => ({
+ useExtensionState: vi.fn(),
+}))
+
+// Mock react-use
+vi.mock("react-use", () => ({
+ useEvent: vi.fn(),
+}))
+
+// Mock useRouterModels
+vi.mock("@src/components/ui/hooks/useRouterModels", () => ({
+ useRouterModels: () => ({ data: {}, isLoading: false, error: null }),
+}))
+
+// Mock @src/components/ui using importOriginal to get all real exports
+vi.mock("@src/components/ui", async (importOriginal) => {
+ const actual = await importOriginal()
+ return {
+ ...actual,
+ Button: ({ children, onClick, disabled, variant }: any) => (
+
+ ),
+ }
+})
+
+// Mock VSCodeButtonLink
+vi.mock("@src/components/common/VSCodeButtonLink", () => ({
+ VSCodeButtonLink: ({ href, children }: any) => (
+
+ {children}
+
+ ),
+}))
+
+// Mock handleModelChangeSideEffects
+vi.mock("../utils/providerModelConfig", () => ({
+ handleModelChangeSideEffects: vi.fn(),
+}))
+
+import { useExtensionState } from "@src/context/ExtensionStateContext"
+import { vscode } from "@src/utils/vscode"
+
+const mockUseExtensionState = useExtensionState as ReturnType
+
+describe("Moonshot Component", () => {
+ const mockSetApiConfigurationField = vi.fn()
+
+ const createDefaultApiConfiguration = (overrides?: Partial): ProviderSettings => ({
+ apiProvider: "moonshot",
+ moonshotBaseUrl: "https://api.moonshot.ai/v1",
+ ...overrides,
+ })
+
+ beforeEach(() => {
+ vi.clearAllMocks()
+ mockUseExtensionState.mockReturnValue({
+ routerModels: {},
+ })
+ })
+
+ it("renders API key input, base URL dropdown, and refresh button", () => {
+ render(
+ ,
+ )
+
+ expect(screen.getByTestId("moonshot-api-key-input")).toBeInTheDocument()
+ expect(screen.getByTestId("vscode-dropdown")).toBeInTheDocument()
+ // Use getAllByTestId and filter by variant to find the refresh button
+ const buttons = screen.getAllByTestId("button")
+ const refreshButton = buttons.find((b) => b.getAttribute("data-variant") === "outline")
+ expect(refreshButton).toBeInTheDocument()
+ })
+
+ it("refresh button is disabled when no API key is provided", () => {
+ render(
+ ,
+ )
+
+ const buttons = screen.getAllByTestId("button")
+ const refreshButton = buttons.find((b) => b.getAttribute("data-variant") === "outline")
+ expect(refreshButton).toBeDisabled()
+ })
+
+ it("refresh button is enabled when API key is provided", () => {
+ render(
+ ,
+ )
+
+ const buttons = screen.getAllByTestId("button")
+ const refreshButton = buttons.find((b) => b.getAttribute("data-variant") === "outline")
+ expect(refreshButton).not.toBeDisabled()
+ })
+
+ it("shows loading state when refresh is clicked", () => {
+ mockUseExtensionState.mockReturnValue({
+ routerModels: {},
+ })
+
+ render(
+ ,
+ )
+
+ const buttons = screen.getAllByTestId("button")
+ const refreshButton = buttons.find((b) => b.getAttribute("data-variant") === "outline")!
+ fireEvent.click(refreshButton)
+
+ // After click, the button should be disabled (loading state)
+ expect(refreshButton).toBeDisabled()
+ expect(screen.getByText("settings:providers.refreshModels.loading")).toBeInTheDocument()
+ })
+
+ it("shows success state after routerModels message received", async () => {
+ mockUseExtensionState.mockReturnValue({
+ routerModels: {},
+ })
+
+ render(
+ ,
+ )
+
+ // Click refresh to enter loading state
+ const buttons = screen.getAllByTestId("button")
+ const refreshButton = buttons.find((b) => b.getAttribute("data-variant") === "outline")!
+ fireEvent.click(refreshButton)
+
+ // Simulate receiving routerModels message (without prior error)
+ window.postMessage(
+ {
+ type: "routerModels",
+ values: { moonshot: { "kimi-k2-0905-preview": { maxTokens: 16384 } } },
+ },
+ "*",
+ )
+
+ await waitFor(() => {
+ expect(screen.getByText("settings:providers.refreshModels.success")).toBeInTheDocument()
+ })
+ })
+
+ it("shows error state after singleRouterModelFetchResponse error message", async () => {
+ mockUseExtensionState.mockReturnValue({
+ routerModels: {},
+ })
+
+ render(
+ ,
+ )
+
+ // Click refresh to enter loading state
+ await act(async () => {
+ const buttons = screen.getAllByTestId("button")
+ const refreshButton = buttons.find((b) => b.getAttribute("data-variant") === "outline")
+ fireEvent.click(refreshButton!)
+ })
+
+ // Wait for loading state to render and effect to re-run with new refreshStatus
+ await waitFor(() => {
+ expect(screen.getByText("settings:providers.refreshModels.loading")).toBeInTheDocument()
+ })
+
+ // Simulate error message — use setTimeout to ensure the useEffect has
+ // re-run with the updated refreshStatus === "loading" closure before the
+ // message event fires, otherwise the handler closure still captures "idle".
+ await act(async () => {
+ return new Promise((resolve) => {
+ setTimeout(() => {
+ window.postMessage(
+ {
+ type: "singleRouterModelFetchResponse",
+ success: false,
+ error: "API connection failed",
+ values: { provider: "moonshot" },
+ },
+ "*",
+ )
+ resolve(undefined)
+ }, 0)
+ })
+ })
+
+ // The component displays refreshError ("API connection failed") when set,
+ // falling back to the generic message only when refreshError is undefined.
+ await waitFor(() => {
+ expect(screen.getByText("API connection failed")).toBeInTheDocument()
+ })
+ })
+
+ it("race condition: error arrives before routerModels success — stays in error state", async () => {
+ mockUseExtensionState.mockReturnValue({
+ routerModels: {},
+ })
+
+ render(
+ ,
+ )
+
+ // Click refresh to enter loading state
+ await act(async () => {
+ const buttons = screen.getAllByTestId("button")
+ const btn = buttons.find((b) => b.getAttribute("data-variant") === "outline")
+ fireEvent.click(btn!)
+ })
+
+ // Wait for loading state to render
+ await waitFor(() => {
+ expect(screen.getByText("settings:providers.refreshModels.loading")).toBeInTheDocument()
+ })
+
+ // Error arrives first — delay with setTimeout so the handler closure
+ // captures refreshStatus === "loading".
+ await act(async () => {
+ return new Promise((resolve) => {
+ setTimeout(() => {
+ window.postMessage(
+ {
+ type: "singleRouterModelFetchResponse",
+ success: false,
+ error: "API connection failed",
+ values: { provider: "moonshot" },
+ },
+ "*",
+ )
+ resolve(undefined)
+ }, 0)
+ })
+ })
+
+ // The component displays refreshError ("API connection failed") when set.
+ await waitFor(() => {
+ expect(screen.getByText("API connection failed")).toBeInTheDocument()
+ })
+
+ // Then routerModels arrives — should NOT flip to success because error was received
+ await act(async () => {
+ window.postMessage(
+ {
+ type: "routerModels",
+ values: { moonshot: { "kimi-k2-0905-preview": { maxTokens: 16384 } } },
+ },
+ "*",
+ )
+ })
+
+ // Error state should still be present (not flipped to success)
+ await waitFor(() => {
+ expect(screen.getByText("API connection failed")).toBeInTheDocument()
+ })
+ })
+
+ it("sends correct message when refresh is clicked", () => {
+ mockUseExtensionState.mockReturnValue({
+ routerModels: {},
+ })
+
+ render(
+ ,
+ )
+
+ const buttons = screen.getAllByTestId("button")
+ const refreshButton = buttons.find((b) => b.getAttribute("data-variant") === "outline")!
+ fireEvent.click(refreshButton)
+
+ expect(vscode.postMessage).toHaveBeenCalledWith(
+ expect.objectContaining({
+ type: "requestRouterModels",
+ values: {
+ moonshotApiKey: "test-key",
+ moonshotBaseUrl: "https://api.moonshot.cn/v1",
+ },
+ }),
+ )
+ })
+
+ it("shows 'Get Moonshot API Key' link when no API key is set", () => {
+ render(
+ ,
+ )
+
+ expect(screen.getByTestId("vscode-button-link")).toBeInTheDocument()
+ expect(screen.getByTestId("vscode-button-link")).toHaveAttribute(
+ "href",
+ "https://platform.moonshot.ai/console/api-keys",
+ )
+ })
+
+ it("hides 'Get Moonshot API Key' link when API key is set", () => {
+ render(
+ ,
+ )
+
+ expect(screen.queryByTestId("vscode-button-link")).not.toBeInTheDocument()
+ })
+})
diff --git a/webview-ui/src/components/settings/providers/__tests__/Ollama.spec.tsx b/webview-ui/src/components/settings/providers/__tests__/Ollama.spec.tsx
index 91025ee291..a4e14b4d81 100644
--- a/webview-ui/src/components/settings/providers/__tests__/Ollama.spec.tsx
+++ b/webview-ui/src/components/settings/providers/__tests__/Ollama.spec.tsx
@@ -1,7 +1,7 @@
// npx vitest src/components/settings/providers/__tests__/Ollama.spec.tsx
import React from "react"
-import { render, screen, fireEvent } from "@/utils/test-utils"
+import { render, screen, fireEvent, act } from "@/utils/test-utils"
import { Ollama } from "../Ollama"
import { ProviderSettings } from "@roo-code/types"
@@ -45,7 +45,7 @@ vi.mock("@src/i18n/TranslationContext", () => ({
// Mock the ModelPicker
vi.mock("../../ModelPicker", () => ({
- ModelPicker: () =>
Model Picker
,
+ ModelPicker: ({ models }: any) =>
{Object.keys(models ?? {}).join(",")}
,
}))
// Mock the ThinkingBudget
@@ -57,21 +57,33 @@ vi.mock("../../ThinkingBudget", () => ({
),
}))
-// Mock react-use
-vi.mock("react-use", () => ({
- useEvent: vi.fn(),
-}))
-
// Mock useRouterModels
vi.mock("@src/components/ui/hooks/useRouterModels", () => ({
useRouterModels: () => ({ data: {}, isLoading: false, error: null }),
}))
+const { postMessageMock } = vi.hoisted(() => ({
+ postMessageMock: vi.fn(),
+}))
+
// Mock vscode
vi.mock("@src/utils/vscode", () => ({
- vscode: { postMessage: vi.fn() },
+ vscode: { postMessage: postMessageMock },
}))
+// Stub the shared Button so we can assert onClick/disabled without its styling deps.
+vi.mock("@src/components/ui", async () => {
+ const actual = await vi.importActual("@src/components/ui")
+ return {
+ ...actual,
+ Button: ({ children, onClick, disabled, className }: any) => (
+
+ ),
+ }
+})
+
describe("Ollama Component - thinking setting", () => {
const mockSetApiConfigurationField = vi.fn()
@@ -221,3 +233,167 @@ describe("Ollama Component - thinking setting", () => {
expect(screen.queryByTestId("thinking-budget")).toBeNull()
})
})
+
+describe("Ollama Component - refresh models", () => {
+ const mockSetApiConfigurationField = vi.fn()
+
+ const dispatchMessage = (data: any) =>
+ act(() => {
+ window.dispatchEvent(new MessageEvent("message", { data }))
+ })
+
+ beforeEach(() => {
+ vi.clearAllMocks()
+ })
+
+ it("renders the refresh button in idle state", () => {
+ render(
+ ,
+ )
+
+ const button = screen.getByTestId("refresh-button")
+ expect(button).not.toBeDisabled()
+ expect(button.querySelector(".codicon-refresh")).not.toBeNull()
+ expect(screen.getByText("settings:providers.refreshModels.label")).toBeInTheDocument()
+ })
+
+ it("sends requestOllamaModels with baseUrl and apiKey when the refresh button is clicked", () => {
+ render(
+ ,
+ )
+
+ fireEvent.click(screen.getByTestId("refresh-button"))
+
+ expect(postMessageMock).toHaveBeenCalledWith({
+ type: "requestOllamaModels",
+ values: {
+ baseUrl: "https://ollama.example.com",
+ apiKey: "secret-key",
+ },
+ })
+ })
+
+ it("enters loading state and disables the button while refreshing", () => {
+ render(
+ ,
+ )
+
+ fireEvent.click(screen.getByTestId("refresh-button"))
+
+ const button = screen.getByTestId("refresh-button")
+ expect(button).toBeDisabled()
+ expect(button.querySelector(".codicon-loading")).not.toBeNull()
+ expect(screen.getByText("settings:providers.refreshModels.loading")).toBeInTheDocument()
+ })
+
+ it("handles a response dispatched synchronously while posting the refresh request", () => {
+ render(
+ ,
+ )
+
+ // Ignore the mount request and respond synchronously to the explicit refresh.
+ postMessageMock.mockClear()
+ postMessageMock.mockImplementationOnce(() => {
+ window.dispatchEvent(
+ new MessageEvent("message", { data: { type: "ollamaModels", ollamaModels: { "llama3:latest": {} } } }),
+ )
+ })
+ fireEvent.click(screen.getByTestId("refresh-button"))
+
+ expect(screen.getByText("settings:providers.refreshModels.success")).toBeInTheDocument()
+ expect(screen.getByTestId("model-picker")).toHaveTextContent("llama3:latest")
+ })
+
+ it("shows success state when ollamaModels arrives with models while loading", () => {
+ render(
+ ,
+ )
+
+ fireEvent.click(screen.getByTestId("refresh-button"))
+ dispatchMessage({ type: "ollamaModels", ollamaModels: { "llama3:latest": {} } })
+
+ expect(screen.getByText("settings:providers.refreshModels.success")).toBeInTheDocument()
+ })
+
+ it("shows success state when Ollama is reachable but has no installed models", () => {
+ render(
+ ,
+ )
+
+ fireEvent.click(screen.getByTestId("refresh-button"))
+ dispatchMessage({ type: "ollamaModels", ollamaModels: {} })
+
+ expect(screen.getByText("settings:providers.refreshModels.success")).toBeInTheDocument()
+ })
+
+ it("displays the backend error message when ollamaModels arrives with an error", () => {
+ render(
+ ,
+ )
+
+ fireEvent.click(screen.getByTestId("refresh-button"))
+ dispatchMessage({ type: "ollamaModels", ollamaModels: {}, error: "Connection refused" })
+
+ expect(screen.getByText("Connection refused")).toBeInTheDocument()
+ })
+
+ it("preserves previously loaded models when a later refresh fails", () => {
+ render(
+ ,
+ )
+
+ fireEvent.click(screen.getByTestId("refresh-button"))
+ dispatchMessage({ type: "ollamaModels", ollamaModels: { "llama3:latest": {} } })
+ expect(screen.getByTestId("model-picker")).toHaveTextContent("llama3:latest")
+
+ fireEvent.click(screen.getByTestId("refresh-button"))
+ dispatchMessage({ type: "ollamaModels", ollamaModels: {}, error: "Connection refused" })
+
+ expect(screen.getByText("Connection refused")).toBeInTheDocument()
+ expect(screen.getByTestId("model-picker")).toHaveTextContent("llama3:latest")
+ })
+
+ it("ignores ollamaModels messages when not in loading state", () => {
+ render(
+ ,
+ )
+
+ // No refresh initiated; an unsolicited ollamaModels message should be a no-op.
+ dispatchMessage({ type: "ollamaModels", ollamaModels: { "llama3:latest": {} } })
+
+ expect(screen.queryByText("settings:providers.refreshModels.success")).not.toBeInTheDocument()
+ expect(screen.queryByText("settings:providers.refreshModels.loading")).not.toBeInTheDocument()
+ })
+})
diff --git a/webview-ui/src/components/settings/providers/index.ts b/webview-ui/src/components/settings/providers/index.ts
index 6a990c37a5..8d725efed2 100644
--- a/webview-ui/src/components/settings/providers/index.ts
+++ b/webview-ui/src/components/settings/providers/index.ts
@@ -5,6 +5,7 @@ export { Gemini } from "./Gemini"
export { LMStudio } from "./LMStudio"
export { Mistral } from "./Mistral"
export { Moonshot } from "./Moonshot"
+export { KimiCode } from "./KimiCode"
export { Ollama } from "./Ollama"
export { OpenAI } from "./OpenAI"
export { OpenAICodex } from "./OpenAICodex"
diff --git a/webview-ui/src/components/settings/utils/providerModelConfig.ts b/webview-ui/src/components/settings/utils/providerModelConfig.ts
index d4c87ec02c..da660976f4 100644
--- a/webview-ui/src/components/settings/utils/providerModelConfig.ts
+++ b/webview-ui/src/components/settings/utils/providerModelConfig.ts
@@ -4,6 +4,7 @@ import {
bedrockDefaultModelId,
deepSeekDefaultModelId,
moonshotDefaultModelId,
+ kimiCodeDefaultModelId,
geminiDefaultModelId,
mistralDefaultModelId,
openRouterDefaultModelId,
@@ -42,6 +43,7 @@ export const PROVIDER_SERVICE_CONFIG: Partial> =
bedrock: bedrockDefaultModelId,
deepseek: deepSeekDefaultModelId,
moonshot: moonshotDefaultModelId,
+ "kimi-code": kimiCodeDefaultModelId,
gemini: geminiDefaultModelId,
mistral: mistralDefaultModelId,
"openai-native": openAiNativeDefaultModelId,
@@ -117,6 +120,7 @@ const PROVIDER_MODEL_CONFIG: Partial>
gemini: { field: "apiModelId", default: geminiDefaultModelId },
deepseek: { field: "apiModelId", default: deepSeekDefaultModelId },
moonshot: { field: "apiModelId", default: moonshotDefaultModelId },
+ "kimi-code": { field: "apiModelId", default: kimiCodeDefaultModelId },
minimax: { field: "apiModelId", default: minimaxDefaultModelId },
mimo: { field: "apiModelId", default: mimoDefaultModelId },
mistral: { field: "apiModelId", default: mistralDefaultModelId },
@@ -201,11 +205,13 @@ export const PROVIDERS_WITH_CUSTOM_MODEL_UI: ProviderName[] = [
"unbound",
"openai", // OpenAI Compatible
"openai-codex", // OpenAI Codex has custom UI with auth and rate limits
+ "kimi-code",
"litellm",
"vercel-ai-gateway",
"ollama",
"lmstudio",
"vscode-lm",
+ "moonshot", // Moonshot has custom ModelPicker inside Moonshot.tsx
]
/**
diff --git a/webview-ui/src/components/ui/hooks/__tests__/useSelectedModel.spec.ts b/webview-ui/src/components/ui/hooks/__tests__/useSelectedModel.spec.ts
index 9f107b3841..9433bb8148 100644
--- a/webview-ui/src/components/ui/hooks/__tests__/useSelectedModel.spec.ts
+++ b/webview-ui/src/components/ui/hooks/__tests__/useSelectedModel.spec.ts
@@ -20,6 +20,8 @@ import {
openRouterDefaultModelId,
vscodeLlmModels,
vscodeLlmDefaultModelId,
+ moonshotDefaultModelId,
+ moonshotModels,
} from "@roo-code/types"
import { useSelectedModel } from "../useSelectedModel"
@@ -1041,4 +1043,99 @@ describe("useSelectedModel", () => {
expect(result.current.info).toEqual(friendliModels["zai-org/GLM-5.1"])
})
})
+
+ describe("moonshot provider", () => {
+ beforeEach(() => {
+ mockUseRouterModels.mockReturnValue({
+ data: {
+ openrouter: {},
+ requesty: {},
+ litellm: {},
+ moonshot: {},
+ },
+ isLoading: false,
+ isError: false,
+ } as any)
+
+ mockUseOpenRouterModelProviders.mockReturnValue({
+ data: {},
+ isLoading: false,
+ isError: false,
+ } as any)
+ })
+
+ it("should return default moonshot model when no custom model is specified", () => {
+ const apiConfiguration: ProviderSettings = {
+ apiProvider: "moonshot",
+ }
+
+ const wrapper = createWrapper()
+ const { result } = renderHook(() => useSelectedModel(apiConfiguration), { wrapper })
+
+ expect(result.current.provider).toBe("moonshot")
+ expect(result.current.id).toBe(moonshotDefaultModelId)
+ expect(result.current.info).toEqual(moonshotModels[moonshotDefaultModelId])
+ })
+
+ it("should use router model override when routerModels.moonshot has the model", () => {
+ const routerModelInfo: ModelInfo = {
+ maxTokens: 32000,
+ contextWindow: 262144,
+ supportsImages: false,
+ supportsPromptCache: true,
+ inputPrice: 1.0,
+ outputPrice: 5.0,
+ }
+
+ mockUseRouterModels.mockReturnValue({
+ data: {
+ openrouter: {},
+ requesty: {},
+ litellm: {},
+ moonshot: {
+ "kimi-k2-0905-preview": routerModelInfo,
+ },
+ },
+ isLoading: false,
+ isError: false,
+ } as any)
+
+ const apiConfiguration: ProviderSettings = {
+ apiProvider: "moonshot",
+ }
+
+ const wrapper = createWrapper()
+ const { result } = renderHook(() => useSelectedModel(apiConfiguration), { wrapper })
+
+ expect(result.current.id).toBe(moonshotDefaultModelId)
+ // Router info takes precedence over static info
+ expect(result.current.info).toEqual(routerModelInfo)
+ })
+
+ it("should fallback to default when model ID is not in static or router models", () => {
+ const apiConfiguration: ProviderSettings = {
+ apiProvider: "moonshot",
+ apiModelId: "non-existent-model",
+ }
+
+ const wrapper = createWrapper()
+ const { result } = renderHook(() => useSelectedModel(apiConfiguration), { wrapper })
+
+ expect(result.current.id).toBe(moonshotDefaultModelId)
+ expect(result.current.info).toEqual(moonshotModels[moonshotDefaultModelId])
+ })
+
+ it("should use getValidatedModelId to return apiModelId when valid", () => {
+ const apiConfiguration: ProviderSettings = {
+ apiProvider: "moonshot",
+ apiModelId: "kimi-k2-turbo-preview",
+ }
+
+ const wrapper = createWrapper()
+ const { result } = renderHook(() => useSelectedModel(apiConfiguration), { wrapper })
+
+ expect(result.current.id).toBe("kimi-k2-turbo-preview")
+ expect(result.current.info).toEqual(moonshotModels["kimi-k2-turbo-preview"])
+ })
+ })
})
diff --git a/webview-ui/src/components/ui/hooks/useSelectedModel.ts b/webview-ui/src/components/ui/hooks/useSelectedModel.ts
index 62a30a26b2..50886d4538 100644
--- a/webview-ui/src/components/ui/hooks/useSelectedModel.ts
+++ b/webview-ui/src/components/ui/hooks/useSelectedModel.ts
@@ -26,6 +26,7 @@ import {
friendliModels,
basetenModels,
qwenCodeModels,
+ kimiCodeDefaultModelInfo,
litellmDefaultModelInfo,
lMStudioDefaultModelInfo,
opencodeGoDefaultModelInfo,
@@ -103,7 +104,12 @@ export const useSelectedModel = (apiConfiguration?: ProviderSettings) => {
lmStudioModels: (lmStudioModels.data || undefined) as ModelRecord | undefined,
ollamaModels: (ollamaModels.data || undefined) as ModelRecord | undefined,
})
- : { id: getProviderDefaultModelId(activeProvider ?? "openrouter"), info: undefined }
+ : activeProvider === "kimi-code" && apiConfiguration
+ ? {
+ id: apiConfiguration.apiModelId || getProviderDefaultModelId("kimi-code"),
+ info: kimiCodeDefaultModelInfo,
+ }
+ : { id: getProviderDefaultModelId(activeProvider ?? "openrouter"), info: undefined }
return {
provider,
@@ -253,9 +259,19 @@ function getSelectedModel({
return { id, info: routerInfo ?? staticInfo }
}
case "moonshot": {
- const id = apiConfiguration.apiModelId ?? defaultModelId
- const info = moonshotModels[id as keyof typeof moonshotModels]
- return { id, info }
+ const availableModels = routerModels.moonshot
+ ? { ...moonshotModels, ...routerModels.moonshot }
+ : moonshotModels
+ const id = getValidatedModelId(apiConfiguration.apiModelId, availableModels, defaultModelId)
+ const routerInfo = routerModels.moonshot?.[id]
+ const staticInfo = moonshotModels[id as keyof typeof moonshotModels]
+ return { id, info: routerInfo ?? staticInfo }
+ }
+ case "kimi-code": {
+ const configuredId = apiConfiguration.apiModelId
+ const availableModels = routerModels["kimi-code"]
+ const id = configuredId || defaultModelId
+ return { id, info: availableModels?.[id] ?? kimiCodeDefaultModelInfo }
}
case "minimax": {
const id = apiConfiguration.apiModelId ?? defaultModelId
diff --git a/webview-ui/src/components/welcome/__tests__/RooHero.visual.tsx b/webview-ui/src/components/welcome/__tests__/RooHero.visual.tsx
new file mode 100644
index 0000000000..8b9c8b46dd
--- /dev/null
+++ b/webview-ui/src/components/welcome/__tests__/RooHero.visual.tsx
@@ -0,0 +1,29 @@
+import React from "react"
+
+import { expect, test } from "../../../../playwright/coverage-fixture"
+import RooHero from "../RooHero"
+
+async function waitForAssetsAndRender(component: any) {
+ await component.evaluate(async () => {
+ await document.fonts.ready
+ const images = Array.from(document.querySelectorAll("img"))
+ await Promise.all(
+ images.map((img) => {
+ if (img.complete) return Promise.resolve()
+ return new Promise((resolve) => {
+ img.onload = resolve
+ img.onerror = resolve
+ })
+ }),
+ )
+ await new Promise((resolve) => requestAnimationFrame(() => resolve()))
+ })
+}
+
+test("renders the welcome hero in the VS Code dark theme", async ({ mount }) => {
+ const component = await mount()
+
+ await waitForAssetsAndRender(component)
+
+ await expect(component).toHaveScreenshot("zoo-hero-dark.png")
+})
diff --git a/webview-ui/src/components/welcome/__tests__/__screenshots__/zoo-hero-dark.png b/webview-ui/src/components/welcome/__tests__/__screenshots__/zoo-hero-dark.png
new file mode 100644
index 0000000000..6f5e11eaf9
Binary files /dev/null and b/webview-ui/src/components/welcome/__tests__/__screenshots__/zoo-hero-dark.png differ
diff --git a/webview-ui/src/context/ExtensionStateContext.tsx b/webview-ui/src/context/ExtensionStateContext.tsx
index 29b958319c..d0d4e37afa 100644
--- a/webview-ui/src/context/ExtensionStateContext.tsx
+++ b/webview-ui/src/context/ExtensionStateContext.tsx
@@ -317,7 +317,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode
case "state": {
const newState = message.state ?? {}
setState((prevState) => mergeExtensionState(prevState, newState))
- setShowWelcome(!checkExistKey(newState.apiConfiguration))
+ setShowWelcome(!checkExistKey(newState.apiConfiguration, newState.zooCodeIsAuthenticated))
setDidHydrateState(true)
// Update alwaysAllowFollowupQuestions if present in state message
if ((newState as any).alwaysAllowFollowupQuestions !== undefined) {
diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json
index 6e78f21ef2..d4e5e2524e 100644
--- a/webview-ui/src/i18n/locales/ca/chat.json
+++ b/webview-ui/src/i18n/locales/ca/chat.json
@@ -17,7 +17,9 @@
"condenseContext": "Condensar context de forma intel·ligent",
"openApiHistory": "Obrir historial d'API",
"openUiHistory": "Obrir historial d'UI",
- "backToParentTask": "Tasca principal"
+ "backToParentTask": "Tasca principal",
+ "waitingOnSubtask": "Esperant subtasca",
+ "goToSubtask": "Anar a la subtasca"
},
"unpin": "Desfixar",
"pin": "Fixar",
@@ -341,9 +343,9 @@
"support": "Dona suport a Zoo Code fent-nos una estrella a GitHub.",
"release": {
"heading": "Novetats:",
- "highlight1": "Família OpenAI GPT-5.6 (Sol, Terra, Luna) — disponible tant a OpenAI Codex com a OpenAI Native.",
- "highlight2": "Suport per a Grok 4.5 — el nou model insígnia de xAI, més una correcció del reasoning effort que també beneficia Grok 4 Mini.",
- "highlight3": "Proveïdor Kenari — un gateway d'IA de primera classe compatible amb OpenAI, facturat en rupies, que cobreix Claude, GPT, DeepSeek, GLM, Kimi i més."
+ "highlight1": "Proveïdors Moonshot i Kimi Code — connecta't als models de Moonshot amb detecció de models en temps real o inicia la sessió a Kimi Code mitjançant el flux de dispositiu OAuth.",
+ "highlight2": "Compatibilitat amb els models més recents — utilitza Claude Opus 5 amb tots els proveïdors, a més de Kimi K3, Gemini 3.6 Flash i MiniMax-M3.",
+ "highlight3": "Fluxos de treball més fiables — abandona subtasques interrompudes de manera neta i indexa fitxers Dart i de text pla a la teva base de codi."
},
"cloudAgents": {
"heading": "Novetats al núvol:",
diff --git a/webview-ui/src/i18n/locales/ca/history.json b/webview-ui/src/i18n/locales/ca/history.json
index ab1bba7582..a872651d23 100644
--- a/webview-ui/src/i18n/locales/ca/history.json
+++ b/webview-ui/src/i18n/locales/ca/history.json
@@ -54,5 +54,7 @@
"subtaskTag": "Subtasca",
"deleteWithSubtasks": "Això també eliminarà {{count}} subtasca(s). Estàs segur?",
"expandSubtasks": "Expandir subtasques",
- "collapseSubtasks": "Contreure subtasques"
+ "collapseSubtasks": "Contreure subtasques",
+ "delegatedTag": "Esperant subtasca",
+ "interruptedTag": "Interrompuda"
}
diff --git a/webview-ui/src/i18n/locales/ca/mcp.json b/webview-ui/src/i18n/locales/ca/mcp.json
index 0bda1f751a..6e9e958a58 100644
--- a/webview-ui/src/i18n/locales/ca/mcp.json
+++ b/webview-ui/src/i18n/locales/ca/mcp.json
@@ -8,11 +8,6 @@
"title": "Activa els servidors MCP",
"description": "Activa-ho perquè Zoo pugui utilitzar eines dels servidors MCP connectats. Això dóna més capacitats a Zoo. Si no vols utilitzar aquestes eines addicionals, desactiva-ho per ajudar a reduir el cost dels tokens API."
},
- "enableServerCreation": {
- "title": "Activa la creació de servidors MCP",
- "description": "Activa-ho perquè Zoo t'ajudi a crear <1>nous1> servidors MCP personalitzats. <0>Més informació sobre la creació de servidors0>",
- "hint": "Consell: Per reduir el cost dels tokens API, desactiva aquesta opció quan no demanis a Zoo que creï un nou servidor MCP."
- },
"editGlobalMCP": "Edita MCP global",
"editProjectMCP": "Edita MCP del projecte",
"learnMoreEditingSettings": "Més informació sobre com editar fitxers de configuració MCP",
diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json
index 4cb1e90027..f861b8734c 100644
--- a/webview-ui/src/i18n/locales/ca/settings.json
+++ b/webview-ui/src/i18n/locales/ca/settings.json
@@ -459,6 +459,17 @@
"moonshotApiKey": "Clau API de Moonshot",
"getMoonshotApiKey": "Obtenir clau API de Moonshot",
"moonshotBaseUrl": "Punt d'entrada de Moonshot",
+ "kimiCode": {
+ "authMethod": "Authentication method",
+ "oauth": "Kimi Code subscription (OAuth)",
+ "apiKey": "Kimi Code API key",
+ "apiKeyLabel": "Kimi Code API Key",
+ "signIn": "Sign in to Kimi Code",
+ "signOut": "Sign out",
+ "authenticated": "Signed in to Kimi Code",
+ "deviceCodeHelp": "Enter this device code in the Kimi authorization page:",
+ "docs": "Kimi Code documentation"
+ },
"zaiApiKey": "Clau API de Z AI",
"getZaiApiKey": "Obtenir clau API de Z AI",
"zaiEntrypoint": "Punt d'entrada de Z AI",
diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json
index a9d3472229..fb63e5b6a1 100644
--- a/webview-ui/src/i18n/locales/de/chat.json
+++ b/webview-ui/src/i18n/locales/de/chat.json
@@ -17,7 +17,9 @@
"condenseContext": "Kontext intelligent komprimieren",
"openApiHistory": "API-Verlauf öffnen",
"openUiHistory": "UI-Verlauf öffnen",
- "backToParentTask": "Übergeordnete Aufgabe"
+ "backToParentTask": "Übergeordnete Aufgabe",
+ "waitingOnSubtask": "Wartet auf Unteraufgabe",
+ "goToSubtask": "Zur Unteraufgabe"
},
"unpin": "Lösen von oben",
"pin": "Anheften",
@@ -341,9 +343,9 @@
"support": "Bitte unterstütze Zoo Code, indem du uns auf GitHub einen Stern gibst.",
"release": {
"heading": "Was ist neu:",
- "highlight1": "OpenAI-GPT-5.6-Familie (Sol, Terra, Luna) — verfügbar über OpenAI Codex und OpenAI Native.",
- "highlight2": "Grok-4.5-Unterstützung — xAIs neues Flaggschiff-Modell, plus ein Fix für den Reasoning Effort, von dem auch Grok 4 Mini profitiert.",
- "highlight3": "Kenari-Anbieter — ein erstklassiges OpenAI-kompatibles KI-Gateway, das in Rupiah abgerechnet wird und Claude, GPT, DeepSeek, GLM, Kimi und mehr abdeckt."
+ "highlight1": "Moonshot- und Kimi-Code-Anbieter — verbinde dich dank Live-Modellerkennung mit Moonshot-Modellen oder melde dich über den OAuth-Gerätefluss bei Kimi Code an.",
+ "highlight2": "Unterstützung für die neuesten Modelle — nutze Claude Opus 5 anbieterübergreifend sowie Kimi K3, Gemini 3.6 Flash und MiniMax-M3.",
+ "highlight3": "Zuverlässigere Workflows — brich unterbrochene Unteraufgaben sauber ab und indiziere Dart- und Klartextdateien in deiner Codebasis."
},
"cloudAgents": {
"heading": "Neu in der Cloud:",
diff --git a/webview-ui/src/i18n/locales/de/history.json b/webview-ui/src/i18n/locales/de/history.json
index 46064d6e2e..b10fcd445e 100644
--- a/webview-ui/src/i18n/locales/de/history.json
+++ b/webview-ui/src/i18n/locales/de/history.json
@@ -54,5 +54,7 @@
"subtaskTag": "Teilaufgabe",
"deleteWithSubtasks": "Dies löscht auch {{count}} Teilaufgabe(n). Bist du sicher?",
"expandSubtasks": "Teilaufgaben erweitern",
- "collapseSubtasks": "Teilaufgaben einklappen"
+ "collapseSubtasks": "Teilaufgaben einklappen",
+ "delegatedTag": "Wartet auf Unteraufgabe",
+ "interruptedTag": "Unterbrochen"
}
diff --git a/webview-ui/src/i18n/locales/de/mcp.json b/webview-ui/src/i18n/locales/de/mcp.json
index a8aac6ee37..c8872d4de3 100644
--- a/webview-ui/src/i18n/locales/de/mcp.json
+++ b/webview-ui/src/i18n/locales/de/mcp.json
@@ -8,11 +8,6 @@
"title": "MCP-Server aktivieren",
"description": "Schalte dies EIN, damit Zoo Tools von verbundenen MCP-Servern verwenden kann. Dies gibt Zoo mehr Möglichkeiten. Wenn du diese zusätzlichen Tools nicht verwenden möchtest, schalte es AUS, um API-Token-Kosten zu senken."
},
- "enableServerCreation": {
- "title": "MCP-Server-Erstellung aktivieren",
- "description": "Aktiviere dies, damit Zoo dir helfen kann, <1>neue1> benutzerdefinierte MCP-Server zu erstellen. <0>Erfahre mehr über Server-Erstellung0>",
- "hint": "Hinweis: Um API-Token-Kosten zu senken, deaktiviere diese Einstellung, wenn du Zoo nicht aktiv darum bittest, einen neuen MCP-Server zu erstellen."
- },
"editGlobalMCP": "Globale MCP bearbeiten",
"editProjectMCP": "Projekt-MCP bearbeiten",
"learnMoreEditingSettings": "Mehr über das Bearbeiten von MCP-Einstellungsdateien erfahren",
diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json
index 8566410041..e1ff092237 100644
--- a/webview-ui/src/i18n/locales/de/settings.json
+++ b/webview-ui/src/i18n/locales/de/settings.json
@@ -459,6 +459,17 @@
"moonshotApiKey": "Moonshot API-Schlüssel",
"getMoonshotApiKey": "Moonshot API-Schlüssel erhalten",
"moonshotBaseUrl": "Moonshot-Einstiegspunkt",
+ "kimiCode": {
+ "authMethod": "Authentifizierungsmethode",
+ "oauth": "Kimi Code-Abonnement (OAuth)",
+ "apiKey": "Kimi Code-API-Schlüssel",
+ "apiKeyLabel": "Kimi Code-API-Schlüssel",
+ "signIn": "Bei Kimi Code anmelden",
+ "signOut": "Abmelden",
+ "authenticated": "Bei Kimi Code angemeldet",
+ "deviceCodeHelp": "Gib diesen Gerätecode auf der Kimi-Autorisierungsseite ein:",
+ "docs": "Kimi Code-Dokumentation"
+ },
"zaiApiKey": "Z AI API-Schlüssel",
"getZaiApiKey": "Z AI API-Schlüssel erhalten",
"zaiEntrypoint": "Z AI Einstiegspunkt",
diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json
index f3e2d85565..8df0c2938a 100644
--- a/webview-ui/src/i18n/locales/en/chat.json
+++ b/webview-ui/src/i18n/locales/en/chat.json
@@ -17,7 +17,9 @@
"delete": "Delete Task (Shift + Click to skip confirmation)",
"openApiHistory": "Open API History",
"openUiHistory": "Open UI History",
- "backToParentTask": "Parent task"
+ "backToParentTask": "Parent task",
+ "waitingOnSubtask": "Waiting on subtask",
+ "goToSubtask": "Go to subtask"
},
"unpin": "Unpin",
"pin": "Pin",
@@ -360,9 +362,9 @@
"support": "Please support Zoo Code by starring us on GitHub.",
"release": {
"heading": "What's New:",
- "highlight1": "OpenAI GPT-5.6 family (Sol, Terra, Luna) — available across both the OpenAI Codex and OpenAI Native provider paths.",
- "highlight2": "Grok 4.5 support — xAI's new flagship model, plus a reasoning-effort fix that also benefits Grok 4 Mini.",
- "highlight3": "Kenari provider — a first-class OpenAI-compatible AI gateway billed in Rupiah, covering Claude, GPT, DeepSeek, GLM, Kimi and more."
+ "highlight1": "Moonshot and Kimi Code providers — connect to Moonshot models with live model discovery, or sign in to Kimi Code through its OAuth device flow.",
+ "highlight2": "Latest model support — use Claude Opus 5 across providers, plus Kimi K3, Gemini 3.6 Flash, and MiniMax-M3.",
+ "highlight3": "More reliable workflows — abandon interrupted subtasks cleanly, and index Dart and plain-text files in your codebase."
},
"cloudAgents": {
"heading": "New in the Cloud:",
diff --git a/webview-ui/src/i18n/locales/en/history.json b/webview-ui/src/i18n/locales/en/history.json
index 85174890e1..6d53cd3663 100644
--- a/webview-ui/src/i18n/locales/en/history.json
+++ b/webview-ui/src/i18n/locales/en/history.json
@@ -47,5 +47,7 @@
"subtaskTag": "Subtask",
"deleteWithSubtasks": "This will also delete {{count}} subtask(s). Are you sure?",
"expandSubtasks": "Expand subtasks",
- "collapseSubtasks": "Collapse subtasks"
+ "collapseSubtasks": "Collapse subtasks",
+ "delegatedTag": "Waiting on subtask",
+ "interruptedTag": "Interrupted"
}
diff --git a/webview-ui/src/i18n/locales/en/mcp.json b/webview-ui/src/i18n/locales/en/mcp.json
index 9256146311..f0c033fe74 100644
--- a/webview-ui/src/i18n/locales/en/mcp.json
+++ b/webview-ui/src/i18n/locales/en/mcp.json
@@ -8,11 +8,6 @@
"title": "Enable MCP Servers",
"description": "Turn this ON to let Zoo use tools from connected MCP servers. This gives Zoo more capabilities. If you don't plan to use these extra tools, turn it OFF to help reduce API token costs."
},
- "enableServerCreation": {
- "title": "Enable MCP Server Creation",
- "description": "Enable this to have Zoo help you build <1>new1> custom MCP servers. <0>Learn about server creation0>",
- "hint": "Hint: To reduce API token costs, disable this setting when you are not actively asking Zoo to create a new MCP server."
- },
"editGlobalMCP": "Edit Global MCP",
"editProjectMCP": "Edit Project MCP",
"refreshMCP": "Refresh MCP Servers",
diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json
index 9ef634f866..37d33f8172 100644
--- a/webview-ui/src/i18n/locales/en/settings.json
+++ b/webview-ui/src/i18n/locales/en/settings.json
@@ -539,6 +539,17 @@
"moonshotApiKey": "Moonshot API Key",
"getMoonshotApiKey": "Get Moonshot API Key",
"moonshotBaseUrl": "Moonshot Entrypoint",
+ "kimiCode": {
+ "authMethod": "Authentication method",
+ "oauth": "Kimi Code subscription (OAuth)",
+ "apiKey": "Kimi Code API key",
+ "apiKeyLabel": "Kimi Code API Key",
+ "signIn": "Sign in to Kimi Code",
+ "signOut": "Sign out",
+ "authenticated": "Signed in to Kimi Code",
+ "deviceCodeHelp": "Enter this device code in the Kimi authorization page:",
+ "docs": "Kimi Code documentation"
+ },
"minimaxApiKey": "MiniMax API Key",
"getMiniMaxApiKey": "Get MiniMax API Key",
"minimaxBaseUrl": "MiniMax Entrypoint",
diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json
index 9111e34430..1a297de709 100644
--- a/webview-ui/src/i18n/locales/es/chat.json
+++ b/webview-ui/src/i18n/locales/es/chat.json
@@ -17,7 +17,9 @@
"condenseContext": "Condensar contexto de forma inteligente",
"openApiHistory": "Abrir historial de API",
"openUiHistory": "Abrir historial de UI",
- "backToParentTask": "Tarea principal"
+ "backToParentTask": "Tarea principal",
+ "waitingOnSubtask": "Esperando subtarea",
+ "goToSubtask": "Ir a la subtarea"
},
"unpin": "Desfijar",
"pin": "Fijar",
@@ -341,9 +343,9 @@
"support": "Apoya a Zoo Code dándonos una estrella en GitHub.",
"release": {
"heading": "Novedades:",
- "highlight1": "Familia OpenAI GPT-5.6 (Sol, Terra, Luna) — disponible tanto en OpenAI Codex como en OpenAI Native.",
- "highlight2": "Compatibilidad con Grok 4.5 — el nuevo modelo insignia de xAI, además de una corrección del reasoning effort que también beneficia a Grok 4 Mini.",
- "highlight3": "Proveedor Kenari — un gateway de IA de primera línea compatible con OpenAI, facturado en rupias, que cubre Claude, GPT, DeepSeek, GLM, Kimi y más."
+ "highlight1": "Proveedores Moonshot y Kimi Code — conéctate a modelos de Moonshot con detección de modelos en tiempo real o inicia sesión en Kimi Code mediante su flujo de dispositivo OAuth.",
+ "highlight2": "Compatibilidad con los modelos más recientes — usa Claude Opus 5 con todos los proveedores, además de Kimi K3, Gemini 3.6 Flash y MiniMax-M3.",
+ "highlight3": "Flujos de trabajo más fiables — abandona subtareas interrumpidas de forma limpia e indexa archivos Dart y de texto sin formato en tu base de código."
},
"cloudAgents": {
"heading": "Novedades en la Nube:",
diff --git a/webview-ui/src/i18n/locales/es/history.json b/webview-ui/src/i18n/locales/es/history.json
index 820f003d40..91d28abb99 100644
--- a/webview-ui/src/i18n/locales/es/history.json
+++ b/webview-ui/src/i18n/locales/es/history.json
@@ -54,5 +54,7 @@
"subtaskTag": "Subtarea",
"deleteWithSubtasks": "Esto también eliminará {{count}} subtarea(s). ¿Estás seguro?",
"expandSubtasks": "Expandir subtareas",
- "collapseSubtasks": "Contraer subtareas"
+ "collapseSubtasks": "Contraer subtareas",
+ "delegatedTag": "Esperando subtarea",
+ "interruptedTag": "Interrumpida"
}
diff --git a/webview-ui/src/i18n/locales/es/mcp.json b/webview-ui/src/i18n/locales/es/mcp.json
index 768b4b6e59..e31f70c5ce 100644
--- a/webview-ui/src/i18n/locales/es/mcp.json
+++ b/webview-ui/src/i18n/locales/es/mcp.json
@@ -8,11 +8,6 @@
"title": "Activar servidores MCP",
"description": "Actívalo para que Zoo pueda usar herramientas de servidores MCP conectados. Esto le da más capacidades a Zoo. Si no planeas usar estas herramientas extra, desactívalo para ayudar a reducir los costes de tokens API."
},
- "enableServerCreation": {
- "title": "Activar creación de servidores MCP",
- "description": "Actívalo para que Zoo te ayude a crear <1>nuevos1> servidores MCP personalizados. <0>Más información sobre la creación de servidores0>",
- "hint": "Consejo: Para reducir los costes de tokens API, desactiva esta opción cuando no le pidas a Zoo que cree un nuevo servidor MCP."
- },
"editGlobalMCP": "Editar MCP global",
"editProjectMCP": "Editar MCP del proyecto",
"learnMoreEditingSettings": "Más información sobre cómo editar archivos de configuración MCP",
diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json
index 7500e5bc77..4a5ce59d79 100644
--- a/webview-ui/src/i18n/locales/es/settings.json
+++ b/webview-ui/src/i18n/locales/es/settings.json
@@ -459,6 +459,17 @@
"moonshotApiKey": "Clave API de Moonshot",
"getMoonshotApiKey": "Obtener clave API de Moonshot",
"moonshotBaseUrl": "Punto de entrada de Moonshot",
+ "kimiCode": {
+ "authMethod": "Método de autenticación",
+ "oauth": "Suscripción a Kimi Code (OAuth)",
+ "apiKey": "Clave de API de Kimi Code",
+ "apiKeyLabel": "Clave de API de Kimi Code",
+ "signIn": "Iniciar sesión en Kimi Code",
+ "signOut": "Cerrar sesión",
+ "authenticated": "Sesión iniciada en Kimi Code",
+ "deviceCodeHelp": "Introduce este código de dispositivo en la página de autorización de Kimi:",
+ "docs": "Documentación de Kimi Code"
+ },
"zaiApiKey": "Clave API de Z AI",
"getZaiApiKey": "Obtener clave API de Z AI",
"zaiEntrypoint": "Punto de entrada de Z AI",
diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json
index 3238fcb101..24d27418e7 100644
--- a/webview-ui/src/i18n/locales/fr/chat.json
+++ b/webview-ui/src/i18n/locales/fr/chat.json
@@ -17,7 +17,9 @@
"condenseContext": "Condenser intelligemment le contexte",
"openApiHistory": "Ouvrir l'historique de l'API",
"openUiHistory": "Ouvrir l'historique de l'UI",
- "backToParentTask": "Tâche parente"
+ "backToParentTask": "Tâche parente",
+ "waitingOnSubtask": "En attente de sous-tâche",
+ "goToSubtask": "Aller à la sous-tâche"
},
"unpin": "Désépingler",
"pin": "Épingler",
@@ -341,9 +343,9 @@
"support": "Soutiens Zoo Code en nous donnant une étoile sur GitHub.",
"release": {
"heading": "Nouveautés :",
- "highlight1": "Famille OpenAI GPT-5.6 (Sol, Terra, Luna) — disponible à la fois sur OpenAI Codex et OpenAI Native.",
- "highlight2": "Prise en charge de Grok 4.5 — le nouveau modèle phare de xAI, avec une correction du reasoning effort qui profite aussi à Grok 4 Mini.",
- "highlight3": "Provider Kenari — un gateway IA de premier ordre compatible OpenAI, facturé en roupies, couvrant Claude, GPT, DeepSeek, GLM, Kimi et plus."
+ "highlight1": "Providers Moonshot et Kimi Code — connecte-toi aux modèles Moonshot avec la découverte en temps réel, ou à Kimi Code via son flux d'appareil OAuth.",
+ "highlight2": "Prise en charge des derniers modèles — utilise Claude Opus 5 avec tous les providers, ainsi que Kimi K3, Gemini 3.6 Flash et MiniMax-M3.",
+ "highlight3": "Workflows plus fiables — abandonne proprement les sous-tâches interrompues et indexe les fichiers Dart et texte brut de ta base de code."
},
"cloudAgents": {
"heading": "Nouveautés dans le Cloud :",
diff --git a/webview-ui/src/i18n/locales/fr/history.json b/webview-ui/src/i18n/locales/fr/history.json
index d84cfcb190..443bb0eb3e 100644
--- a/webview-ui/src/i18n/locales/fr/history.json
+++ b/webview-ui/src/i18n/locales/fr/history.json
@@ -54,5 +54,7 @@
"subtaskTag": "Sous-tâche",
"deleteWithSubtasks": "Cela supprimera aussi {{count}} sous-tâche(s). Êtes-vous sûr ?",
"expandSubtasks": "Développer les sous-tâches",
- "collapseSubtasks": "Réduire les sous-tâches"
+ "collapseSubtasks": "Réduire les sous-tâches",
+ "delegatedTag": "En attente de sous-tâche",
+ "interruptedTag": "Interrompue"
}
diff --git a/webview-ui/src/i18n/locales/fr/mcp.json b/webview-ui/src/i18n/locales/fr/mcp.json
index 1698a7f241..f1f0032680 100644
--- a/webview-ui/src/i18n/locales/fr/mcp.json
+++ b/webview-ui/src/i18n/locales/fr/mcp.json
@@ -8,11 +8,6 @@
"title": "Activer les serveurs MCP",
"description": "Active cette option pour que Zoo puisse utiliser des outils provenant de serveurs MCP connectés. Cela donne plus de capacités à Zoo. Si tu ne comptes pas utiliser ces outils supplémentaires, désactive-la pour réduire les coûts de tokens API."
},
- "enableServerCreation": {
- "title": "Activer la création de serveurs MCP",
- "description": "Active cette option pour que Zoo t'aide à créer de <1>nouveaux1> serveurs MCP personnalisés. <0>En savoir plus sur la création de serveurs0>",
- "hint": "Astuce : Pour réduire les coûts de tokens API, désactive cette option quand tu ne demandes pas à Zoo de créer un nouveau serveur MCP."
- },
"editGlobalMCP": "Modifier le MCP global",
"editProjectMCP": "Modifier le MCP du projet",
"learnMoreEditingSettings": "En savoir plus sur la modification des fichiers de configuration MCP",
diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json
index 9d5178f90f..03c64cc1e9 100644
--- a/webview-ui/src/i18n/locales/fr/settings.json
+++ b/webview-ui/src/i18n/locales/fr/settings.json
@@ -459,6 +459,17 @@
"moonshotApiKey": "Clé API Moonshot",
"getMoonshotApiKey": "Obtenir la clé API Moonshot",
"moonshotBaseUrl": "Point d'entrée Moonshot",
+ "kimiCode": {
+ "authMethod": "Méthode d'authentification",
+ "oauth": "Abonnement Kimi Code (OAuth)",
+ "apiKey": "Clé API Kimi Code",
+ "apiKeyLabel": "Clé API Kimi Code",
+ "signIn": "Se connecter à Kimi Code",
+ "signOut": "Se déconnecter",
+ "authenticated": "Connecté à Kimi Code",
+ "deviceCodeHelp": "Saisissez ce code d'appareil sur la page d'autorisation Kimi :",
+ "docs": "Documentation Kimi Code"
+ },
"zaiApiKey": "Clé API Z AI",
"getZaiApiKey": "Obtenir la clé API Z AI",
"zaiEntrypoint": "Point d'entrée Z AI",
diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json
index a1a0ed56a2..65306b39e8 100644
--- a/webview-ui/src/i18n/locales/hi/chat.json
+++ b/webview-ui/src/i18n/locales/hi/chat.json
@@ -17,7 +17,9 @@
"condenseContext": "संदर्भ को बुद्धिमानी से संघनित करें",
"openApiHistory": "API इतिहास खोलें",
"openUiHistory": "UI इतिहास खोलें",
- "backToParentTask": "मूल कार्य"
+ "backToParentTask": "मूल कार्य",
+ "waitingOnSubtask": "उपकार्य की प्रतीक्षा",
+ "goToSubtask": "उपकार्य पर जाएं"
},
"unpin": "पिन करें",
"pin": "अवपिन करें",
@@ -341,9 +343,9 @@
"support": "कृपया GitHub पर हमें स्टार देकर Zoo Code का समर्थन करें।",
"release": {
"heading": "नया क्या है:",
- "highlight1": "OpenAI GPT-5.6 परिवार (Sol, Terra, Luna) — OpenAI Codex और OpenAI Native दोनों में उपलब्ध।",
- "highlight2": "Grok 4.5 समर्थन — xAI का नया flagship model, साथ ही reasoning effort की एक फिक्स जिसका फायदा Grok 4 Mini को भी मिलता है।",
- "highlight3": "Kenari provider — एक first-class OpenAI-compatible AI gateway जो Rupiah में बिल होता है और Claude, GPT, DeepSeek, GLM, Kimi और अधिक को cover करता है।"
+ "highlight1": "Moonshot और Kimi Code providers — live model discovery के साथ Moonshot models से कनेक्ट करें या OAuth device flow से Kimi Code में sign in करें।",
+ "highlight2": "नवीनतम model support — providers पर Claude Opus 5 के साथ Kimi K3, Gemini 3.6 Flash और MiniMax-M3 का उपयोग करें।",
+ "highlight3": "अधिक भरोसेमंद workflows — interrupted subtasks को साफ़ तौर पर छोड़ें और अपनी codebase में Dart व plain-text files को index करें।"
},
"cloudAgents": {
"heading": "क्लाउड में नया:",
diff --git a/webview-ui/src/i18n/locales/hi/history.json b/webview-ui/src/i18n/locales/hi/history.json
index 0d4cb40dd9..3dd7cca9a9 100644
--- a/webview-ui/src/i18n/locales/hi/history.json
+++ b/webview-ui/src/i18n/locales/hi/history.json
@@ -47,5 +47,7 @@
"subtaskTag": "उप-कार्य",
"deleteWithSubtasks": "यह {{count}} उप-कार्य(कों) को भी हटा देगा। क्या आप निश्चित हैं?",
"expandSubtasks": "उप-कार्य विस्तारित करें",
- "collapseSubtasks": "उप-कार्य संपीड़ित करें"
+ "collapseSubtasks": "उप-कार्य संपीड़ित करें",
+ "delegatedTag": "उपकार्य की प्रतीक्षा",
+ "interruptedTag": "बाधित"
}
diff --git a/webview-ui/src/i18n/locales/hi/mcp.json b/webview-ui/src/i18n/locales/hi/mcp.json
index cc2290f9d7..7dd8b8a415 100644
--- a/webview-ui/src/i18n/locales/hi/mcp.json
+++ b/webview-ui/src/i18n/locales/hi/mcp.json
@@ -8,11 +8,6 @@
"title": "MCP सर्वर सक्षम करें",
"description": "इसे ON करो ताकि Zoo जुड़े हुए MCP सर्वरों से टूल्स इस्तेमाल कर सके। इससे Zoo को और क्षमताएँ मिलती हैं। अगर तुम ये अतिरिक्त टूल्स इस्तेमाल नहीं करना चाहते, तो इसे OFF करो ताकि API टोकन लागत कम हो सके।"
},
- "enableServerCreation": {
- "title": "MCP सर्वर बनाना सक्षम करें",
- "description": "इसे ON करो ताकि Zoo तुम्हारी मदद से <1>नए1> कस्टम MCP सर्वर बना सके। <0>सर्वर बनाना जानें0>",
- "hint": "टिप: API टोकन लागत कम करने के लिए, जब Zoo से नया MCP सर्वर नहीं बनवा रहे हो तो इस सेटिंग को बंद कर दो।"
- },
"editGlobalMCP": "ग्लोबल MCP एडिट करें",
"editProjectMCP": "प्रोजेक्ट MCP एडिट करें",
"learnMoreEditingSettings": "MCP सेटिंग्स फाइल एडिट करने के बारे में जानें",
diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json
index 2072485021..2f6c6fc542 100644
--- a/webview-ui/src/i18n/locales/hi/settings.json
+++ b/webview-ui/src/i18n/locales/hi/settings.json
@@ -459,6 +459,17 @@
"moonshotApiKey": "Moonshot API कुंजी",
"getMoonshotApiKey": "Moonshot API कुंजी प्राप्त करें",
"moonshotBaseUrl": "Moonshot प्रवेश बिंदु",
+ "kimiCode": {
+ "authMethod": "प्रमाणीकरण विधि",
+ "oauth": "Kimi Code सदस्यता (OAuth)",
+ "apiKey": "Kimi Code API कुंजी",
+ "apiKeyLabel": "Kimi Code API कुंजी",
+ "signIn": "Kimi Code में साइन इन करें",
+ "signOut": "साइन आउट करें",
+ "authenticated": "Kimi Code में साइन इन किया गया",
+ "deviceCodeHelp": "Kimi प्राधिकरण पृष्ठ पर यह डिवाइस कोड दर्ज करें:",
+ "docs": "Kimi Code दस्तावेज़ीकरण"
+ },
"zaiApiKey": "Z AI API कुंजी",
"getZaiApiKey": "Z AI API कुंजी प्राप्त करें",
"zaiEntrypoint": "Z AI प्रवेश बिंदु",
diff --git a/webview-ui/src/i18n/locales/id/chat.json b/webview-ui/src/i18n/locales/id/chat.json
index f0e73462e9..fb11881cb4 100644
--- a/webview-ui/src/i18n/locales/id/chat.json
+++ b/webview-ui/src/i18n/locales/id/chat.json
@@ -17,7 +17,9 @@
"delete": "Hapus Tugas (Shift + Klik untuk lewati konfirmasi)",
"openApiHistory": "Buka Riwayat API",
"openUiHistory": "Buka Riwayat UI",
- "backToParentTask": "Tugas Induk"
+ "backToParentTask": "Tugas Induk",
+ "waitingOnSubtask": "Menunggu subtugas",
+ "goToSubtask": "Pergi ke subtugas"
},
"history": {
"title": "Riwayat"
@@ -370,9 +372,9 @@
"support": "Dukung Zoo Code dengan memberi kami bintang di GitHub.",
"release": {
"heading": "Yang Baru:",
- "highlight1": "Keluarga OpenAI GPT-5.6 (Sol, Terra, Luna) — tersedia di OpenAI Codex maupun OpenAI Native.",
- "highlight2": "Dukungan Grok 4.5 — model andalan baru xAI, plus perbaikan reasoning effort yang juga menguntungkan Grok 4 Mini.",
- "highlight3": "Provider Kenari — gateway AI kelas utama yang kompatibel dengan OpenAI, ditagih dalam Rupiah, mencakup Claude, GPT, DeepSeek, GLM, Kimi, dan lainnya."
+ "highlight1": "Provider Moonshot dan Kimi Code — hubungkan ke model Moonshot dengan penemuan model secara langsung, atau masuk ke Kimi Code melalui alur perangkat OAuth.",
+ "highlight2": "Dukungan model terbaru — gunakan Claude Opus 5 di berbagai provider, ditambah Kimi K3, Gemini 3.6 Flash, dan MiniMax-M3.",
+ "highlight3": "Workflow lebih andal — tinggalkan subtask yang terinterupsi dengan bersih, serta indeks file Dart dan teks biasa di codebase-mu."
},
"cloudAgents": {
"heading": "Baru di Cloud:",
diff --git a/webview-ui/src/i18n/locales/id/history.json b/webview-ui/src/i18n/locales/id/history.json
index 7796061107..772ca25384 100644
--- a/webview-ui/src/i18n/locales/id/history.json
+++ b/webview-ui/src/i18n/locales/id/history.json
@@ -56,5 +56,7 @@
"subtaskTag": "Subtask",
"deleteWithSubtasks": "Ini juga akan menghapus {{count}} subtask. Apakah Anda yakin?",
"expandSubtasks": "Perluas subtask",
- "collapseSubtasks": "Tutup subtask"
+ "collapseSubtasks": "Tutup subtask",
+ "delegatedTag": "Menunggu subtugas",
+ "interruptedTag": "Terganggu"
}
diff --git a/webview-ui/src/i18n/locales/id/mcp.json b/webview-ui/src/i18n/locales/id/mcp.json
index 368da63b93..e22b10924a 100644
--- a/webview-ui/src/i18n/locales/id/mcp.json
+++ b/webview-ui/src/i18n/locales/id/mcp.json
@@ -8,11 +8,6 @@
"title": "Aktifkan Server MCP",
"description": "Nyalakan ini untuk membiarkan Zoo menggunakan tools dari server MCP yang terhubung. Ini memberikan Zoo lebih banyak kemampuan. Jika Anda tidak berencana menggunakan tools tambahan ini, matikan untuk membantu mengurangi biaya token API."
},
- "enableServerCreation": {
- "title": "Aktifkan Pembuatan Server MCP",
- "description": "Aktifkan ini agar Zoo membantu Anda membangun server MCP kustom <1>baru1>. <0>Pelajari tentang pembuatan server0>",
- "hint": "Petunjuk: Untuk mengurangi biaya token API, nonaktifkan pengaturan ini ketika Anda tidak secara aktif meminta Zoo untuk membuat server MCP baru."
- },
"editGlobalMCP": "Edit MCP Global",
"editProjectMCP": "Edit MCP Proyek",
"refreshMCP": "Refresh Server MCP",
diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json
index 0b30cb84f4..f98af2bc28 100644
--- a/webview-ui/src/i18n/locales/id/settings.json
+++ b/webview-ui/src/i18n/locales/id/settings.json
@@ -459,6 +459,17 @@
"moonshotApiKey": "Kunci API Moonshot",
"getMoonshotApiKey": "Dapatkan Kunci API Moonshot",
"moonshotBaseUrl": "Titik Masuk Moonshot",
+ "kimiCode": {
+ "authMethod": "Metode autentikasi",
+ "oauth": "Langganan Kimi Code (OAuth)",
+ "apiKey": "Kunci API Kimi Code",
+ "apiKeyLabel": "Kunci API Kimi Code",
+ "signIn": "Masuk ke Kimi Code",
+ "signOut": "Keluar",
+ "authenticated": "Masuk ke Kimi Code",
+ "deviceCodeHelp": "Masukkan kode perangkat ini di halaman otorisasi Kimi:",
+ "docs": "Dokumentasi Kimi Code"
+ },
"zaiApiKey": "Kunci API Z AI",
"getZaiApiKey": "Dapatkan Kunci API Z AI",
"zaiEntrypoint": "Titik Masuk Z AI",
diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json
index 2056e8d977..d6917d1be0 100644
--- a/webview-ui/src/i18n/locales/it/chat.json
+++ b/webview-ui/src/i18n/locales/it/chat.json
@@ -17,7 +17,9 @@
"condenseContext": "Condensa contesto in modo intelligente",
"openApiHistory": "Apri cronologia API",
"openUiHistory": "Apri cronologia UI",
- "backToParentTask": "Attività principale"
+ "backToParentTask": "Attività principale",
+ "waitingOnSubtask": "In attesa di sottoattività",
+ "goToSubtask": "Vai alla sottoattività"
},
"unpin": "Rilascia",
"pin": "Fissa",
@@ -341,9 +343,9 @@
"support": "Sostieni Zoo Code lasciandoci una stella su GitHub.",
"release": {
"heading": "Novità:",
- "highlight1": "Famiglia OpenAI GPT-5.6 (Sol, Terra, Luna) — disponibile sia su OpenAI Codex sia su OpenAI Native.",
- "highlight2": "Supporto per Grok 4.5 — il nuovo modello di punta di xAI, più una correzione del reasoning effort che avvantaggia anche Grok 4 Mini.",
- "highlight3": "Provider Kenari — un gateway AI di prima classe compatibile con OpenAI, fatturato in rupie, che copre Claude, GPT, DeepSeek, GLM, Kimi e altro."
+ "highlight1": "Provider Moonshot e Kimi Code — connettiti ai modelli Moonshot con il rilevamento dei modelli in tempo reale oppure accedi a Kimi Code tramite il flusso dispositivo OAuth.",
+ "highlight2": "Supporto per i modelli più recenti — usa Claude Opus 5 con tutti i provider, oltre a Kimi K3, Gemini 3.6 Flash e MiniMax-M3.",
+ "highlight3": "Workflow più affidabili — abbandona in modo pulito le sottoattività interrotte e indicizza i file Dart e di testo semplice nella tua codebase."
},
"cloudAgents": {
"heading": "Novità nel Cloud:",
diff --git a/webview-ui/src/i18n/locales/it/history.json b/webview-ui/src/i18n/locales/it/history.json
index aa728ef8f6..4097d43ce2 100644
--- a/webview-ui/src/i18n/locales/it/history.json
+++ b/webview-ui/src/i18n/locales/it/history.json
@@ -47,5 +47,7 @@
"subtaskTag": "Sottoattività",
"deleteWithSubtasks": "Questo eliminerà anche {{count}} sottoattività. Sei sicuro?",
"expandSubtasks": "Espandi sottoattività",
- "collapseSubtasks": "Comprimi sottoattività"
+ "collapseSubtasks": "Comprimi sottoattività",
+ "delegatedTag": "In attesa di sottoattività",
+ "interruptedTag": "Interrotta"
}
diff --git a/webview-ui/src/i18n/locales/it/mcp.json b/webview-ui/src/i18n/locales/it/mcp.json
index e5f4aff9eb..dc8e6caa6c 100644
--- a/webview-ui/src/i18n/locales/it/mcp.json
+++ b/webview-ui/src/i18n/locales/it/mcp.json
@@ -8,11 +8,6 @@
"title": "Abilita server MCP",
"description": "Attiva questa opzione per permettere a Zoo di usare strumenti dai server MCP collegati. Questo dà a Zoo più capacità. Se non vuoi usare questi strumenti extra, disattiva per ridurre i costi dei token API."
},
- "enableServerCreation": {
- "title": "Abilita creazione server MCP",
- "description": "Abilita questa opzione per farti aiutare da Zoo a creare <1>nuovi1> server MCP personalizzati. <0>Scopri di più sulla creazione di server0>",
- "hint": "Suggerimento: Per ridurre i costi dei token API, disattiva questa impostazione quando non chiedi a Zoo di creare un nuovo server MCP."
- },
"editGlobalMCP": "Modifica MCP globale",
"editProjectMCP": "Modifica MCP del progetto",
"learnMoreEditingSettings": "Scopri di più sulla modifica dei file di configurazione MCP",
diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json
index 125e6a725f..ea66a2ad23 100644
--- a/webview-ui/src/i18n/locales/it/settings.json
+++ b/webview-ui/src/i18n/locales/it/settings.json
@@ -459,6 +459,17 @@
"moonshotApiKey": "Chiave API Moonshot",
"getMoonshotApiKey": "Ottieni chiave API Moonshot",
"moonshotBaseUrl": "Punto di ingresso Moonshot",
+ "kimiCode": {
+ "authMethod": "Metodo di autenticazione",
+ "oauth": "Abbonamento Kimi Code (OAuth)",
+ "apiKey": "Chiave API Kimi Code",
+ "apiKeyLabel": "Chiave API Kimi Code",
+ "signIn": "Accedi a Kimi Code",
+ "signOut": "Esci",
+ "authenticated": "Accesso a Kimi Code effettuato",
+ "deviceCodeHelp": "Inserisci questo codice dispositivo nella pagina di autorizzazione Kimi:",
+ "docs": "Documentazione Kimi Code"
+ },
"zaiApiKey": "Chiave API Z AI",
"getZaiApiKey": "Ottieni chiave API Z AI",
"zaiEntrypoint": "Punto di ingresso Z AI",
diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json
index 88aa788626..17665a3754 100644
--- a/webview-ui/src/i18n/locales/ja/chat.json
+++ b/webview-ui/src/i18n/locales/ja/chat.json
@@ -17,7 +17,9 @@
"condenseContext": "コンテキストをインテリジェントに圧縮",
"openApiHistory": "API履歴を開く",
"openUiHistory": "UI履歴を開く",
- "backToParentTask": "親タスク"
+ "backToParentTask": "親タスク",
+ "waitingOnSubtask": "サブタスク待ち",
+ "goToSubtask": "サブタスクへ"
},
"unpin": "ピン留めを解除",
"pin": "ピン留め",
@@ -341,9 +343,9 @@
"support": "GitHubでスターを付けて Zoo Code を応援してください。",
"release": {
"heading": "新機能:",
- "highlight1": "OpenAI GPT-5.6 ファミリー(Sol、Terra、Luna)— OpenAI Codex と OpenAI Native の両方で利用可能。",
- "highlight2": "Grok 4.5 サポート — xAI の新しいフラッグシップモデル。あわせて reasoning effort の修正も行われ、Grok 4 Mini にも恩恵があります。",
- "highlight3": "Kenari プロバイダー — ルピー建てで請求される、Claude・GPT・DeepSeek・GLM・Kimi などに対応した OpenAI 互換のファーストクラス AI ゲートウェイ。"
+ "highlight1": "Moonshot と Kimi Code プロバイダー — ライブモデル検出で Moonshot モデルに接続するか、OAuth デバイスフローで Kimi Code にサインインできます。",
+ "highlight2": "最新モデルのサポート — 各プロバイダーで Claude Opus 5 を利用できるほか、Kimi K3、Gemini 3.6 Flash、MiniMax-M3 にも対応しました。",
+ "highlight3": "より信頼性の高いワークフロー — 中断されたサブタスクを安全に破棄し、コードベース内の Dart ファイルとプレーンテキストファイルをインデックスできます。"
},
"cloudAgents": {
"heading": "クラウドの新機能:",
diff --git a/webview-ui/src/i18n/locales/ja/history.json b/webview-ui/src/i18n/locales/ja/history.json
index b73baa3a76..be4897ba34 100644
--- a/webview-ui/src/i18n/locales/ja/history.json
+++ b/webview-ui/src/i18n/locales/ja/history.json
@@ -47,5 +47,7 @@
"subtaskTag": "サブタスク",
"deleteWithSubtasks": "これにより {{count}} サブタスクも削除されます。よろしいですか?",
"expandSubtasks": "サブタスクを展開",
- "collapseSubtasks": "サブタスクを折りたたむ"
+ "collapseSubtasks": "サブタスクを折りたたむ",
+ "delegatedTag": "サブタスク待ち",
+ "interruptedTag": "中断"
}
diff --git a/webview-ui/src/i18n/locales/ja/mcp.json b/webview-ui/src/i18n/locales/ja/mcp.json
index d415e30f08..66151f3d60 100644
--- a/webview-ui/src/i18n/locales/ja/mcp.json
+++ b/webview-ui/src/i18n/locales/ja/mcp.json
@@ -8,11 +8,6 @@
"title": "MCPサーバーを有効化",
"description": "これをONにすると、Rooが接続されたMCPサーバーのツールを使えるようになるよ。Rooの機能が増える!追加ツールを使わないなら、APIトークンのコストを抑えるためにOFFにしてね。"
},
- "enableServerCreation": {
- "title": "MCPサーバー作成を有効化",
- "description": "これをONにすると、Rooが<1>新しい1>カスタムMCPサーバーを作るのを手伝ってくれるよ。<0>サーバー作成について詳しく0>",
- "hint": "ヒント: APIトークンのコストを抑えたいときは、Rooに新しいMCPサーバーを作らせないときにこの設定をOFFにしてね。"
- },
"editGlobalMCP": "グローバルMCPを編集",
"editProjectMCP": "プロジェクトMCPを編集",
"learnMoreEditingSettings": "MCP設定ファイルの編集方法を詳しく見る",
diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json
index dd07efdd9a..eed8315620 100644
--- a/webview-ui/src/i18n/locales/ja/settings.json
+++ b/webview-ui/src/i18n/locales/ja/settings.json
@@ -459,6 +459,17 @@
"moonshotApiKey": "Moonshot APIキー",
"getMoonshotApiKey": "Moonshot APIキーを取得",
"moonshotBaseUrl": "Moonshot エントリーポイント",
+ "kimiCode": {
+ "authMethod": "認証方法",
+ "oauth": "Kimi Code サブスクリプション (OAuth)",
+ "apiKey": "Kimi Code API キー",
+ "apiKeyLabel": "Kimi Code API キー",
+ "signIn": "Kimi Code にサインイン",
+ "signOut": "サインアウト",
+ "authenticated": "Kimi Code にサインイン済み",
+ "deviceCodeHelp": "Kimi 認証ページでこのデバイスコードを入力してください:",
+ "docs": "Kimi Code ドキュメント"
+ },
"zaiApiKey": "Z AI APIキー",
"getZaiApiKey": "Z AI APIキーを取得",
"zaiEntrypoint": "Z AI エントリーポイント",
diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json
index d826bf7ca8..53186e7afe 100644
--- a/webview-ui/src/i18n/locales/ko/chat.json
+++ b/webview-ui/src/i18n/locales/ko/chat.json
@@ -17,7 +17,9 @@
"condenseContext": "컨텍스트 지능적으로 압축",
"openApiHistory": "API 기록 열기",
"openUiHistory": "UI 기록 열기",
- "backToParentTask": "상위 작업"
+ "backToParentTask": "상위 작업",
+ "waitingOnSubtask": "하위 작업 대기 중",
+ "goToSubtask": "하위 작업으로 이동"
},
"unpin": "고정 해제하기",
"pin": "고정하기",
@@ -341,9 +343,9 @@
"support": "GitHub에서 별표를 눌러 Zoo Code를 응원해 주세요.",
"release": {
"heading": "새로운 기능:",
- "highlight1": "OpenAI GPT-5.6 패밀리(Sol, Terra, Luna) — OpenAI Codex와 OpenAI Native 양쪽에서 사용 가능합니다.",
- "highlight2": "Grok 4.5 지원 — xAI의 새로운 플래그십 모델이며, Grok 4 Mini에도 도움이 되는 reasoning effort 수정도 포함됩니다.",
- "highlight3": "Kenari 프로바이더 — 루피아로 청구되며 Claude, GPT, DeepSeek, GLM, Kimi 등을 지원하는 OpenAI 호환 퍼스트클래스 AI 게이트웨이."
+ "highlight1": "Moonshot 및 Kimi Code 프로바이더 — 실시간 모델 검색으로 Moonshot 모델에 연결하거나 OAuth 기기 흐름으로 Kimi Code에 로그인하세요.",
+ "highlight2": "최신 모델 지원 — 여러 프로바이더에서 Claude Opus 5를 사용하고 Kimi K3, Gemini 3.6 Flash, MiniMax-M3도 이용하세요.",
+ "highlight3": "더 안정적인 워크플로우 — 중단된 하위 작업을 깔끔하게 포기하고 코드베이스의 Dart 및 일반 텍스트 파일을 인덱싱하세요."
},
"cloudAgents": {
"heading": "클라우드의 새로운 기능:",
diff --git a/webview-ui/src/i18n/locales/ko/history.json b/webview-ui/src/i18n/locales/ko/history.json
index 0363feaaff..8a13ff12cd 100644
--- a/webview-ui/src/i18n/locales/ko/history.json
+++ b/webview-ui/src/i18n/locales/ko/history.json
@@ -47,5 +47,7 @@
"subtaskTag": "부분작업",
"deleteWithSubtasks": "이는 {{count}} 부분작업도 삭제합니다. 확실하십니까?",
"expandSubtasks": "부분작업 확장",
- "collapseSubtasks": "부분작업 축소"
+ "collapseSubtasks": "부분작업 축소",
+ "delegatedTag": "하위 작업 대기 중",
+ "interruptedTag": "중단됨"
}
diff --git a/webview-ui/src/i18n/locales/ko/mcp.json b/webview-ui/src/i18n/locales/ko/mcp.json
index b0ecb215e1..2327ef0ca5 100644
--- a/webview-ui/src/i18n/locales/ko/mcp.json
+++ b/webview-ui/src/i18n/locales/ko/mcp.json
@@ -8,11 +8,6 @@
"title": "MCP 서버 활성화",
"description": "이걸 켜면 Roo가 연결된 MCP 서버의 도구를 쓸 수 있어. Roo의 능력이 더 늘어나! 추가 도구를 쓸 생각이 없다면, API 토큰 비용을 줄이기 위해 꺼 두는 게 좋아."
},
- "enableServerCreation": {
- "title": "MCP 서버 생성 활성화",
- "description": "이걸 켜면 Roo가 <1>새로운1> 맞춤형 MCP 서버를 만드는 걸 도와줄 수 있어. <0>서버 생성에 대해 알아보기0>",
- "hint": "팁: API 토큰 비용을 줄이고 싶으면, Roo에게 새 MCP 서버를 만들라고 하지 않을 때 이 설정을 꺼 둬."
- },
"editGlobalMCP": "글로벌 MCP 편집",
"editProjectMCP": "프로젝트 MCP 편집",
"learnMoreEditingSettings": "MCP 설정 파일 편집 방법 더 알아보기",
diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json
index 36a4ee14e0..ae8fd3b9ef 100644
--- a/webview-ui/src/i18n/locales/ko/settings.json
+++ b/webview-ui/src/i18n/locales/ko/settings.json
@@ -459,6 +459,17 @@
"moonshotApiKey": "Moonshot API 키",
"getMoonshotApiKey": "Moonshot API 키 받기",
"moonshotBaseUrl": "Moonshot 엔트리포인트",
+ "kimiCode": {
+ "authMethod": "인증 방법",
+ "oauth": "Kimi Code 구독 (OAuth)",
+ "apiKey": "Kimi Code API 키",
+ "apiKeyLabel": "Kimi Code API 키",
+ "signIn": "Kimi Code에 로그인",
+ "signOut": "로그아웃",
+ "authenticated": "Kimi Code에 로그인됨",
+ "deviceCodeHelp": "Kimi 인증 페이지에서 이 디바이스 코드를 입력하세요:",
+ "docs": "Kimi Code 문서"
+ },
"zaiApiKey": "Z AI API 키",
"getZaiApiKey": "Z AI API 키 받기",
"zaiEntrypoint": "Z AI 엔트리포인트",
diff --git a/webview-ui/src/i18n/locales/nl/chat.json b/webview-ui/src/i18n/locales/nl/chat.json
index ad489050e7..356b6f618b 100644
--- a/webview-ui/src/i18n/locales/nl/chat.json
+++ b/webview-ui/src/i18n/locales/nl/chat.json
@@ -17,7 +17,9 @@
"condenseContext": "Context intelligent samenvatten",
"openApiHistory": "API-geschiedenis openen",
"openUiHistory": "UI-geschiedenis openen",
- "backToParentTask": "Bovenliggende taak"
+ "backToParentTask": "Bovenliggende taak",
+ "waitingOnSubtask": "Wacht op subtaak",
+ "goToSubtask": "Ga naar subtaak"
},
"unpin": "Losmaken",
"pin": "Vastmaken",
@@ -314,9 +316,9 @@
"support": "Steun Zoo Code door ons een ster te geven op GitHub.",
"release": {
"heading": "Wat is nieuw:",
- "highlight1": "OpenAI GPT-5.6-familie (Sol, Terra, Luna) — beschikbaar via zowel OpenAI Codex als OpenAI Native.",
- "highlight2": "Ondersteuning voor Grok 4.5 — xAI's nieuwe vlaggenschipmodel, plus een fix voor reasoning effort waar ook Grok 4 Mini baat bij heeft.",
- "highlight3": "Kenari-provider — een eersteklas OpenAI-compatibele AI-gateway die in Rupiah wordt gefactureerd en Claude, GPT, DeepSeek, GLM, Kimi en meer ondersteunt."
+ "highlight1": "Moonshot- en Kimi Code-providers — maak verbinding met Moonshot-modellen via live modeldetectie of meld je aan bij Kimi Code via de OAuth-apparaatstroom.",
+ "highlight2": "Ondersteuning voor de nieuwste modellen — gebruik Claude Opus 5 bij verschillende providers, plus Kimi K3, Gemini 3.6 Flash en MiniMax-M3.",
+ "highlight3": "Betrouwbaardere workflows — breek onderbroken subtaken netjes af en indexeer Dart- en plattetekstbestanden in je codebase."
},
"cloudAgents": {
"heading": "Nieuw in de Cloud:",
diff --git a/webview-ui/src/i18n/locales/nl/history.json b/webview-ui/src/i18n/locales/nl/history.json
index 012059ed04..db1515bfe5 100644
--- a/webview-ui/src/i18n/locales/nl/history.json
+++ b/webview-ui/src/i18n/locales/nl/history.json
@@ -47,5 +47,7 @@
"subtaskTag": "Subtaak",
"deleteWithSubtasks": "Dit zal ook {{count}} subtaak(en) verwijderen. Weet je het zeker?",
"expandSubtasks": "Subtaken uitvouwen",
- "collapseSubtasks": "Subtaken samenvouwen"
+ "collapseSubtasks": "Subtaken samenvouwen",
+ "delegatedTag": "Wacht op subtaak",
+ "interruptedTag": "Onderbroken"
}
diff --git a/webview-ui/src/i18n/locales/nl/mcp.json b/webview-ui/src/i18n/locales/nl/mcp.json
index 8a4b2089c0..035f4fa869 100644
--- a/webview-ui/src/i18n/locales/nl/mcp.json
+++ b/webview-ui/src/i18n/locales/nl/mcp.json
@@ -8,11 +8,6 @@
"title": "MCP-servers inschakelen",
"description": "Indien ingeschakeld, kan Zoo communiceren met MCP-servers voor geavanceerde functionaliteit. Gebruik je geen MCP, dan kun je dit uitschakelen om het tokengebruik te verminderen."
},
- "enableServerCreation": {
- "title": "Aanmaken van MCP-server inschakelen",
- "description": "Indien ingeschakeld, kan Zoo je helpen nieuwe MCP-servers te maken via commando's zoals 'voeg een nieuwe tool toe aan...'. Heb je dit niet nodig, schakel het dan uit om het tokengebruik te verminderen.",
- "hint": "Tip: Zet deze instelling uit als je Zoo niet actief vraagt om een nieuwe MCP-server te maken, om API-tokenkosten te besparen."
- },
"editGlobalMCP": "Globale MCP bewerken",
"editProjectMCP": "Project-MCP bewerken",
"learnMoreEditingSettings": "Meer over het bewerken van MCP-instellingen",
diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json
index 5c36d91e30..45b92345d9 100644
--- a/webview-ui/src/i18n/locales/nl/settings.json
+++ b/webview-ui/src/i18n/locales/nl/settings.json
@@ -459,6 +459,17 @@
"moonshotApiKey": "Moonshot API-sleutel",
"getMoonshotApiKey": "Moonshot API-sleutel ophalen",
"moonshotBaseUrl": "Moonshot-ingangspunt",
+ "kimiCode": {
+ "authMethod": "Authenticatiemethode",
+ "oauth": "Kimi Code-abonnement (OAuth)",
+ "apiKey": "Kimi Code API-sleutel",
+ "apiKeyLabel": "Kimi Code API-sleutel",
+ "signIn": "Inloggen bij Kimi Code",
+ "signOut": "Uitloggen",
+ "authenticated": "Ingelogd bij Kimi Code",
+ "deviceCodeHelp": "Voer deze apparaatcode in op de Kimi-autorisatiepagina:",
+ "docs": "Kimi Code-documentatie"
+ },
"zaiApiKey": "Z AI API-sleutel",
"getZaiApiKey": "Z AI API-sleutel ophalen",
"zaiEntrypoint": "Z AI-ingangspunt",
diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json
index 46da82306c..9cf15a939d 100644
--- a/webview-ui/src/i18n/locales/pl/chat.json
+++ b/webview-ui/src/i18n/locales/pl/chat.json
@@ -17,7 +17,9 @@
"condenseContext": "Inteligentnie skondensuj kontekst",
"openApiHistory": "Otwórz historię API",
"openUiHistory": "Otwórz historię UI",
- "backToParentTask": "Zadanie nadrzędne"
+ "backToParentTask": "Zadanie nadrzędne",
+ "waitingOnSubtask": "Oczekuje na podzadanie",
+ "goToSubtask": "Przejdź do podzadania"
},
"unpin": "Odepnij",
"pin": "Przypnij",
@@ -341,9 +343,9 @@
"support": "Wesprzyj Zoo Code, dając nam gwiazdkę na GitHub.",
"release": {
"heading": "Co nowego:",
- "highlight1": "Rodzina OpenAI GPT-5.6 (Sol, Terra, Luna) — dostępna zarówno w OpenAI Codex, jak i OpenAI Native.",
- "highlight2": "Obsługa Grok 4.5 — nowy flagowy model xAI, a także poprawka reasoning effort, z której korzysta również Grok 4 Mini.",
- "highlight3": "Provider Kenari — wysokiej klasy gateway AI kompatybilny z OpenAI, rozliczany w rupii, obsługujący Claude, GPT, DeepSeek, GLM, Kimi i więcej."
+ "highlight1": "Providerzy Moonshot i Kimi Code — łącz się z modelami Moonshot dzięki wykrywaniu modeli na żywo lub zaloguj się do Kimi Code przez przepływ urządzenia OAuth.",
+ "highlight2": "Obsługa najnowszych modeli — korzystaj z Claude Opus 5 u różnych providerów, a także z Kimi K3, Gemini 3.6 Flash i MiniMax-M3.",
+ "highlight3": "Bardziej niezawodne workflow — bezpiecznie porzucaj przerwane podzadania i indeksuj pliki Dart oraz pliki tekstowe w swojej bazie kodu."
},
"cloudAgents": {
"heading": "Nowości w chmurze:",
diff --git a/webview-ui/src/i18n/locales/pl/history.json b/webview-ui/src/i18n/locales/pl/history.json
index 7ec4b40d8f..2924d4710e 100644
--- a/webview-ui/src/i18n/locales/pl/history.json
+++ b/webview-ui/src/i18n/locales/pl/history.json
@@ -47,5 +47,7 @@
"subtaskTag": "Podzadanie",
"deleteWithSubtasks": "Spowoduje to usunięcie {{count}} podzadania(ń). Jesteś pewny?",
"expandSubtasks": "Rozwiń podzadania",
- "collapseSubtasks": "Zwiń podzadania"
+ "collapseSubtasks": "Zwiń podzadania",
+ "delegatedTag": "Oczekuje na podzadanie",
+ "interruptedTag": "Przerwane"
}
diff --git a/webview-ui/src/i18n/locales/pl/mcp.json b/webview-ui/src/i18n/locales/pl/mcp.json
index 5d7ab75550..4854910d5d 100644
--- a/webview-ui/src/i18n/locales/pl/mcp.json
+++ b/webview-ui/src/i18n/locales/pl/mcp.json
@@ -8,11 +8,6 @@
"title": "Włącz serwery MCP",
"description": "Włącz to, aby Zoo mógł korzystać z narzędzi połączonych serwerów MCP. Daje to Zoo więcej możliwości. Jeśli nie planujesz korzystać z tych dodatkowych narzędzi, wyłącz to, aby zmniejszyć koszty tokenów API."
},
- "enableServerCreation": {
- "title": "Włącz tworzenie serwerów MCP",
- "description": "Włącz to, aby Zoo mógł pomóc ci tworzyć <1>nowe1> niestandardowe serwery MCP. <0>Dowiedz się więcej o tworzeniu serwerów0>",
- "hint": "Wskazówka: Aby zmniejszyć koszty tokenów API, wyłącz tę opcję, gdy nie prosisz Zoo o utworzenie nowego serwera MCP."
- },
"editGlobalMCP": "Edytuj globalny MCP",
"editProjectMCP": "Edytuj MCP projektu",
"learnMoreEditingSettings": "Dowiedz się więcej o edycji plików ustawień MCP",
diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json
index 9f9da60b68..bf35f445dd 100644
--- a/webview-ui/src/i18n/locales/pl/settings.json
+++ b/webview-ui/src/i18n/locales/pl/settings.json
@@ -459,6 +459,17 @@
"moonshotApiKey": "Klucz API Moonshot",
"getMoonshotApiKey": "Uzyskaj klucz API Moonshot",
"moonshotBaseUrl": "Punkt wejścia Moonshot",
+ "kimiCode": {
+ "authMethod": "Authentication method",
+ "oauth": "Kimi Code subscription (OAuth)",
+ "apiKey": "Kimi Code API key",
+ "apiKeyLabel": "Kimi Code API Key",
+ "signIn": "Sign in to Kimi Code",
+ "signOut": "Sign out",
+ "authenticated": "Signed in to Kimi Code",
+ "deviceCodeHelp": "Enter this device code in the Kimi authorization page:",
+ "docs": "Kimi Code documentation"
+ },
"zaiApiKey": "Klucz API Z AI",
"getZaiApiKey": "Uzyskaj klucz API Z AI",
"zaiEntrypoint": "Punkt wejścia Z AI",
diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json
index 83452930d6..771d21cd86 100644
--- a/webview-ui/src/i18n/locales/pt-BR/chat.json
+++ b/webview-ui/src/i18n/locales/pt-BR/chat.json
@@ -17,7 +17,9 @@
"condenseContext": "Condensar contexto de forma inteligente",
"openApiHistory": "Abrir histórico da API",
"openUiHistory": "Abrir histórico da UI",
- "backToParentTask": "Tarefa pai"
+ "backToParentTask": "Tarefa pai",
+ "waitingOnSubtask": "Aguardando subtarefa",
+ "goToSubtask": "Ir para subtarefa"
},
"unpin": "Desfixar",
"pin": "Fixar",
@@ -341,9 +343,9 @@
"support": "Apoie o Zoo Code nos dando uma estrela no GitHub.",
"release": {
"heading": "Novidades:",
- "highlight1": "Família OpenAI GPT-5.6 (Sol, Terra, Luna) — disponível tanto no OpenAI Codex quanto no OpenAI Native.",
- "highlight2": "Suporte ao Grok 4.5 — o novo modelo principal da xAI, além de uma correção no reasoning effort que também beneficia o Grok 4 Mini.",
- "highlight3": "Provider Kenari — um gateway de IA de primeira classe compatível com OpenAI, cobrado em rúpias, cobrindo Claude, GPT, DeepSeek, GLM, Kimi e mais."
+ "highlight1": "Providers Moonshot e Kimi Code — conecte-se aos modelos Moonshot com descoberta de modelos em tempo real ou entre no Kimi Code pelo fluxo de dispositivo OAuth.",
+ "highlight2": "Suporte aos modelos mais recentes — use Claude Opus 5 em vários providers, além de Kimi K3, Gemini 3.6 Flash e MiniMax-M3.",
+ "highlight3": "Workflows mais confiáveis — abandone subtarefas interrompidas de forma limpa e indexe arquivos Dart e de texto simples na sua base de código."
},
"cloudAgents": {
"heading": "Novidades na Nuvem:",
diff --git a/webview-ui/src/i18n/locales/pt-BR/history.json b/webview-ui/src/i18n/locales/pt-BR/history.json
index 7966df1f46..79c84b70ef 100644
--- a/webview-ui/src/i18n/locales/pt-BR/history.json
+++ b/webview-ui/src/i18n/locales/pt-BR/history.json
@@ -47,5 +47,7 @@
"subtaskTag": "Subtarefa",
"deleteWithSubtasks": "Isso também excluirá {{count}} subtarefa(s). Tem certeza?",
"expandSubtasks": "Expandir subtarefas",
- "collapseSubtasks": "Recolher subtarefas"
+ "collapseSubtasks": "Recolher subtarefas",
+ "delegatedTag": "Aguardando subtarefa",
+ "interruptedTag": "Interrompida"
}
diff --git a/webview-ui/src/i18n/locales/pt-BR/mcp.json b/webview-ui/src/i18n/locales/pt-BR/mcp.json
index 70b48d0130..a6acac9283 100644
--- a/webview-ui/src/i18n/locales/pt-BR/mcp.json
+++ b/webview-ui/src/i18n/locales/pt-BR/mcp.json
@@ -8,11 +8,6 @@
"title": "Ativar servidores MCP",
"description": "Ative para que o Zoo possa usar ferramentas de servidores MCP conectados. Isso dá mais capacidades ao Zoo. Se você não pretende usar essas ferramentas extras, desative para ajudar a reduzir os custos de tokens da API."
},
- "enableServerCreation": {
- "title": "Ativar criação de servidores MCP",
- "description": "Ative para que o Zoo possa te ajudar a criar <1>novos1> servidores MCP personalizados. <0>Saiba mais sobre criação de servidores0>",
- "hint": "Dica: Para reduzir os custos de tokens da API, desative esta configuração quando não estiver pedindo ao Zoo para criar um novo servidor MCP."
- },
"editGlobalMCP": "Editar MCP global",
"editProjectMCP": "Editar MCP do projeto",
"learnMoreEditingSettings": "Saiba mais sobre como editar arquivos de configuração MCP",
diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json
index b267f41573..99d6013a89 100644
--- a/webview-ui/src/i18n/locales/pt-BR/settings.json
+++ b/webview-ui/src/i18n/locales/pt-BR/settings.json
@@ -459,6 +459,17 @@
"moonshotApiKey": "Chave de API Moonshot",
"getMoonshotApiKey": "Obter chave de API Moonshot",
"moonshotBaseUrl": "Ponto de entrada Moonshot",
+ "kimiCode": {
+ "authMethod": "Authentication method",
+ "oauth": "Kimi Code subscription (OAuth)",
+ "apiKey": "Kimi Code API key",
+ "apiKeyLabel": "Kimi Code API Key",
+ "signIn": "Sign in to Kimi Code",
+ "signOut": "Sign out",
+ "authenticated": "Signed in to Kimi Code",
+ "deviceCodeHelp": "Enter this device code in the Kimi authorization page:",
+ "docs": "Kimi Code documentation"
+ },
"zaiApiKey": "Chave de API Z AI",
"getZaiApiKey": "Obter chave de API Z AI",
"zaiEntrypoint": "Ponto de entrada Z AI",
diff --git a/webview-ui/src/i18n/locales/ru/chat.json b/webview-ui/src/i18n/locales/ru/chat.json
index 4e09e1e704..0e1f45ff17 100644
--- a/webview-ui/src/i18n/locales/ru/chat.json
+++ b/webview-ui/src/i18n/locales/ru/chat.json
@@ -17,7 +17,9 @@
"condenseContext": "Интеллектуально сжать контекст",
"openApiHistory": "Открыть историю API",
"openUiHistory": "Открыть историю UI",
- "backToParentTask": "Родительская задача"
+ "backToParentTask": "Родительская задача",
+ "waitingOnSubtask": "Ожидание подзадачи",
+ "goToSubtask": "Перейти к подзадаче"
},
"unpin": "Открепить",
"pin": "Закрепить",
@@ -315,9 +317,9 @@
"support": "Поддержите Zoo Code, поставив нам звезду на GitHub.",
"release": {
"heading": "Что нового:",
- "highlight1": "Семейство OpenAI GPT-5.6 (Sol, Terra, Luna) — доступно как в OpenAI Codex, так и в OpenAI Native.",
- "highlight2": "Поддержка Grok 4.5 — новая флагманская модель xAI, а также исправление reasoning effort, от которого выигрывает и Grok 4 Mini.",
- "highlight3": "Провайдер Kenari — первоклассный AI-шлюз, совместимый с OpenAI, с выставлением счётов в рупиях, поддерживающий Claude, GPT, DeepSeek, GLM, Kimi и другие модели."
+ "highlight1": "Провайдеры Moonshot и Kimi Code — подключайтесь к моделям Moonshot с динамическим обнаружением моделей или входите в Kimi Code через OAuth-поток для устройств.",
+ "highlight2": "Поддержка новейших моделей — используйте Claude Opus 5 у разных провайдеров, а также Kimi K3, Gemini 3.6 Flash и MiniMax-M3.",
+ "highlight3": "Более надёжные рабочие процессы — безопасно завершайте прерванные подзадачи и индексируйте файлы Dart и обычные текстовые файлы в кодовой базе."
},
"cloudAgents": {
"heading": "Новое в облаке:",
diff --git a/webview-ui/src/i18n/locales/ru/history.json b/webview-ui/src/i18n/locales/ru/history.json
index 7852362348..3035ec59d9 100644
--- a/webview-ui/src/i18n/locales/ru/history.json
+++ b/webview-ui/src/i18n/locales/ru/history.json
@@ -47,5 +47,7 @@
"subtaskTag": "Подзадача",
"deleteWithSubtasks": "Это также удалит {{count}} подзадачу(и). Вы уверены?",
"expandSubtasks": "Развернуть подзадачи",
- "collapseSubtasks": "Свернуть подзадачи"
+ "collapseSubtasks": "Свернуть подзадачи",
+ "delegatedTag": "Ожидание подзадачи",
+ "interruptedTag": "Прервано"
}
diff --git a/webview-ui/src/i18n/locales/ru/mcp.json b/webview-ui/src/i18n/locales/ru/mcp.json
index e67e063f4c..0322016bf4 100644
--- a/webview-ui/src/i18n/locales/ru/mcp.json
+++ b/webview-ui/src/i18n/locales/ru/mcp.json
@@ -8,11 +8,6 @@
"title": "Включить серверы MCP",
"description": "Включи, чтобы Zoo мог использовать инструменты с подключённых серверов MCP. Это даст Zoo больше возможностей. Если не планируешь использовать эти дополнительные инструменты, выключи для экономии токенов API."
},
- "enableServerCreation": {
- "title": "Включить создание серверов MCP",
- "description": "Включи, чтобы Zoo помогал создавать <1>новые1> кастомные серверы MCP. <0>Подробнее о создании серверов0>",
- "hint": "Совет: чтобы снизить расходы на токены API, отключай эту настройку, когда не просишь Zoo создать новый сервер MCP."
- },
"editGlobalMCP": "Редактировать глобальный MCP",
"editProjectMCP": "Редактировать проектный MCP",
"learnMoreEditingSettings": "Подробнее о редактировании файлов настроек MCP",
diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json
index 2d427202f9..a29da12326 100644
--- a/webview-ui/src/i18n/locales/ru/settings.json
+++ b/webview-ui/src/i18n/locales/ru/settings.json
@@ -459,6 +459,17 @@
"moonshotApiKey": "Moonshot API-ключ",
"getMoonshotApiKey": "Получить Moonshot API-ключ",
"moonshotBaseUrl": "Точка входа Moonshot",
+ "kimiCode": {
+ "authMethod": "Authentication method",
+ "oauth": "Kimi Code subscription (OAuth)",
+ "apiKey": "Kimi Code API key",
+ "apiKeyLabel": "Kimi Code API Key",
+ "signIn": "Sign in to Kimi Code",
+ "signOut": "Sign out",
+ "authenticated": "Signed in to Kimi Code",
+ "deviceCodeHelp": "Enter this device code in the Kimi authorization page:",
+ "docs": "Kimi Code documentation"
+ },
"zaiApiKey": "Z AI API-ключ",
"getZaiApiKey": "Получить Z AI API-ключ",
"zaiEntrypoint": "Точка входа Z AI",
diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json
index 88f6c25968..2e9b107008 100644
--- a/webview-ui/src/i18n/locales/tr/chat.json
+++ b/webview-ui/src/i18n/locales/tr/chat.json
@@ -17,7 +17,9 @@
"condenseContext": "Bağlamı akıllıca yoğunlaştır",
"openApiHistory": "API Geçmişini Aç",
"openUiHistory": "UI Geçmişini Aç",
- "backToParentTask": "Üst görev"
+ "backToParentTask": "Üst görev",
+ "waitingOnSubtask": "Alt görev bekleniyor",
+ "goToSubtask": "Alt göreve git"
},
"unpin": "Sabitlemeyi iptal et",
"pin": "Sabitle",
@@ -342,9 +344,9 @@
"support": "Lütfen GitHub'da bize yıldız vererek Zoo Code'u destekle.",
"release": {
"heading": "Yenilikler:",
- "highlight1": "OpenAI GPT-5.6 ailesi (Sol, Terra, Luna) — hem OpenAI Codex hem de OpenAI Native üzerinde kullanılabilir.",
- "highlight2": "Grok 4.5 desteği — xAI'nin yeni amiral gemisi modeli, ayrıca Grok 4 Mini'ye de fayda sağlayan bir reasoning effort düzeltmesi.",
- "highlight3": "Kenari provider — Rupiah üzerinden faturalandırılan, Claude, GPT, DeepSeek, GLM, Kimi ve daha fazlasını kapsayan, OpenAI uyumlu birinci sınıf bir AI ağ geçidi."
+ "highlight1": "Moonshot ve Kimi Code provider'ları — canlı model keşfiyle Moonshot modellerine bağlan veya OAuth cihaz akışıyla Kimi Code'da oturum aç.",
+ "highlight2": "En yeni model desteği — provider'lar genelinde Claude Opus 5'in yanı sıra Kimi K3, Gemini 3.6 Flash ve MiniMax-M3'ü kullan.",
+ "highlight3": "Daha güvenilir iş akışları — kesintiye uğramış alt görevleri temiz biçimde bırak ve kod tabanındaki Dart ile düz metin dosyalarını indeksle."
},
"cloudAgents": {
"heading": "Cloud'daki yenilikler:",
diff --git a/webview-ui/src/i18n/locales/tr/history.json b/webview-ui/src/i18n/locales/tr/history.json
index fb7b6c6832..2ebc1a0154 100644
--- a/webview-ui/src/i18n/locales/tr/history.json
+++ b/webview-ui/src/i18n/locales/tr/history.json
@@ -47,5 +47,7 @@
"subtaskTag": "Alt görev",
"deleteWithSubtasks": "Bu, {{count}} alt görev(i) de silecektir. Emin misiniz?",
"expandSubtasks": "Alt görevleri genişlet",
- "collapseSubtasks": "Alt görevleri daralt"
+ "collapseSubtasks": "Alt görevleri daralt",
+ "delegatedTag": "Alt görev bekleniyor",
+ "interruptedTag": "Kesintiye uğradı"
}
diff --git a/webview-ui/src/i18n/locales/tr/mcp.json b/webview-ui/src/i18n/locales/tr/mcp.json
index 7aab5b8a4e..691e30c1dc 100644
--- a/webview-ui/src/i18n/locales/tr/mcp.json
+++ b/webview-ui/src/i18n/locales/tr/mcp.json
@@ -8,11 +8,6 @@
"title": "MCP Sunucularını Etkinleştir",
"description": "Bunu AÇ, böylece Zoo bağlı MCP sunucularından araçlar kullanabilir. Zoo'ya daha fazla yetenek kazandırır. Ekstra araçları kullanmayacaksan, API token maliyetini azaltmak için bunu KAPAT."
},
- "enableServerCreation": {
- "title": "MCP Sunucu Oluşturmayı Etkinleştir",
- "description": "Bunu AÇ, Zoo'nun <1>yeni1> özel MCP sunucuları oluşturmanda sana yardımcı olmasını sağlar. <0>Sunucu oluşturma hakkında bilgi al0>",
- "hint": "İpucu: API token maliyetini azaltmak için Zoo'dan yeni bir MCP sunucusu oluşturmasını istemediğinde bu ayarı kapat."
- },
"editGlobalMCP": "Global MCP'yi Düzenle",
"editProjectMCP": "Proje MCP'sini Düzenle",
"learnMoreEditingSettings": "MCP ayar dosyalarını düzenleme hakkında daha fazla bilgi",
diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json
index ba4b092cf3..13c0b9c37c 100644
--- a/webview-ui/src/i18n/locales/tr/settings.json
+++ b/webview-ui/src/i18n/locales/tr/settings.json
@@ -459,6 +459,17 @@
"moonshotApiKey": "Moonshot API Anahtarı",
"getMoonshotApiKey": "Moonshot API Anahtarı Al",
"moonshotBaseUrl": "Moonshot Giriş Noktası",
+ "kimiCode": {
+ "authMethod": "Authentication method",
+ "oauth": "Kimi Code subscription (OAuth)",
+ "apiKey": "Kimi Code API key",
+ "apiKeyLabel": "Kimi Code API Key",
+ "signIn": "Sign in to Kimi Code",
+ "signOut": "Sign out",
+ "authenticated": "Signed in to Kimi Code",
+ "deviceCodeHelp": "Enter this device code in the Kimi authorization page:",
+ "docs": "Kimi Code documentation"
+ },
"zaiApiKey": "Z AI API Anahtarı",
"getZaiApiKey": "Z AI API Anahtarı Al",
"zaiEntrypoint": "Z AI Giriş Noktası",
diff --git a/webview-ui/src/i18n/locales/vi/chat.json b/webview-ui/src/i18n/locales/vi/chat.json
index f506962395..7737ea7b75 100644
--- a/webview-ui/src/i18n/locales/vi/chat.json
+++ b/webview-ui/src/i18n/locales/vi/chat.json
@@ -17,7 +17,9 @@
"condenseContext": "Cô đọng ngữ cảnh thông minh",
"openApiHistory": "Mở lịch sử API",
"openUiHistory": "Mở lịch sử UI",
- "backToParentTask": "Nhiệm vụ cha"
+ "backToParentTask": "Nhiệm vụ cha",
+ "waitingOnSubtask": "Đang chờ nhiệm vụ con",
+ "goToSubtask": "Đến nhiệm vụ con"
},
"unpin": "Bỏ ghim khỏi đầu",
"pin": "Ghim lên đầu",
@@ -342,9 +344,9 @@
"support": "Hãy ủng hộ Zoo Code bằng cách tặng sao cho chúng tôi trên GitHub.",
"release": {
"heading": "Có gì mới:",
- "highlight1": "Dòng OpenAI GPT-5.6 (Sol, Terra, Luna) — có sẵn trên cả OpenAI Codex và OpenAI Native.",
- "highlight2": "Hỗ trợ Grok 4.5 — mẫu chủ lực mới của xAI, cùng với bản sửa lỗi reasoning effort cũng có lợi cho Grok 4 Mini.",
- "highlight3": "Provider Kenari — gateway AI hạng nhất tương thích OpenAI, tính phí bằng Rupiah, hỗ trợ Claude, GPT, DeepSeek, GLM, Kimi và nhiều hơn nữa."
+ "highlight1": "Provider Moonshot và Kimi Code — kết nối với các model Moonshot bằng tính năng khám phá model trực tiếp hoặc đăng nhập Kimi Code qua luồng thiết bị OAuth.",
+ "highlight2": "Hỗ trợ model mới nhất — dùng Claude Opus 5 trên nhiều provider, cùng với Kimi K3, Gemini 3.6 Flash và MiniMax-M3.",
+ "highlight3": "Workflow đáng tin cậy hơn — từ bỏ gọn gàng các tác vụ con bị gián đoạn và lập chỉ mục file Dart cùng file văn bản thuần trong codebase."
},
"cloudAgents": {
"heading": "Mới trên Cloud:",
diff --git a/webview-ui/src/i18n/locales/vi/history.json b/webview-ui/src/i18n/locales/vi/history.json
index 779953e540..a6efa0671e 100644
--- a/webview-ui/src/i18n/locales/vi/history.json
+++ b/webview-ui/src/i18n/locales/vi/history.json
@@ -47,5 +47,7 @@
"subtaskTag": "Tác vụ con",
"deleteWithSubtasks": "Điều này cũng sẽ xóa {{count}} tác vụ con. Bạn có chắc không?",
"expandSubtasks": "Mở rộng tác vụ con",
- "collapseSubtasks": "Thu gọn tác vụ con"
+ "collapseSubtasks": "Thu gọn tác vụ con",
+ "delegatedTag": "Đang chờ nhiệm vụ con",
+ "interruptedTag": "Bị gián đoạn"
}
diff --git a/webview-ui/src/i18n/locales/vi/mcp.json b/webview-ui/src/i18n/locales/vi/mcp.json
index 49becffa6f..c5bb53c7e1 100644
--- a/webview-ui/src/i18n/locales/vi/mcp.json
+++ b/webview-ui/src/i18n/locales/vi/mcp.json
@@ -8,11 +8,6 @@
"title": "Bật máy chủ MCP",
"description": "Bật lên để Zoo dùng công cụ từ các máy chủ MCP đã kết nối. Zoo sẽ có nhiều khả năng hơn. Nếu không dùng các công cụ này, hãy tắt để tiết kiệm chi phí token API."
},
- "enableServerCreation": {
- "title": "Bật tạo máy chủ MCP",
- "description": "Bật lên để Zoo giúp bạn tạo <1>máy chủ MCP mới1> tuỳ chỉnh. <0>Tìm hiểu về tạo máy chủ0>",
- "hint": "Mẹo: Để giảm chi phí token API, hãy tắt khi không cần Zoo tạo máy chủ MCP mới."
- },
"editGlobalMCP": "Chỉnh sửa MCP toàn cục",
"editProjectMCP": "Chỉnh sửa MCP dự án",
"learnMoreEditingSettings": "Tìm hiểu thêm về chỉnh sửa file cài đặt MCP",
diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json
index 56a04f6c59..b59313d47a 100644
--- a/webview-ui/src/i18n/locales/vi/settings.json
+++ b/webview-ui/src/i18n/locales/vi/settings.json
@@ -459,6 +459,17 @@
"moonshotApiKey": "Khóa API Moonshot",
"getMoonshotApiKey": "Lấy khóa API Moonshot",
"moonshotBaseUrl": "Điểm vào Moonshot",
+ "kimiCode": {
+ "authMethod": "Authentication method",
+ "oauth": "Kimi Code subscription (OAuth)",
+ "apiKey": "Kimi Code API key",
+ "apiKeyLabel": "Kimi Code API Key",
+ "signIn": "Sign in to Kimi Code",
+ "signOut": "Sign out",
+ "authenticated": "Signed in to Kimi Code",
+ "deviceCodeHelp": "Enter this device code in the Kimi authorization page:",
+ "docs": "Kimi Code documentation"
+ },
"zaiApiKey": "Khóa API Z AI",
"getZaiApiKey": "Lấy khóa API Z AI",
"zaiEntrypoint": "Điểm vào Z AI",
diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json
index 286e49c8f7..3322c53542 100644
--- a/webview-ui/src/i18n/locales/zh-CN/chat.json
+++ b/webview-ui/src/i18n/locales/zh-CN/chat.json
@@ -17,7 +17,9 @@
"condenseContext": "智能压缩上下文",
"openApiHistory": "打开 API 历史",
"openUiHistory": "打开 UI 历史",
- "backToParentTask": "父任务"
+ "backToParentTask": "父任务",
+ "waitingOnSubtask": "等待子任务",
+ "goToSubtask": "前往子任务"
},
"unpin": "取消置顶",
"pin": "置顶",
@@ -342,9 +344,9 @@
"support": "请在 GitHub 上为 Zoo Code 点星支持我们。",
"release": {
"heading": "新增功能:",
- "highlight1": "OpenAI GPT-5.6 系列(Sol、Terra、Luna)— 已在 OpenAI Codex 与 OpenAI Native 中同时提供。",
- "highlight2": "支持 Grok 4.5 — xAI 全新旗舰模型,同时修复了 reasoning effort 问题,Grok 4 Mini 也因此受益。",
- "highlight3": "Kenari 提供商 — 以卢比计费的一流 OpenAI 兼容 AI 网关,支持 Claude、GPT、DeepSeek、GLM、Kimi 等。"
+ "highlight1": "Moonshot 和 Kimi Code 提供商 — 通过实时模型发现连接 Moonshot 模型,或使用 OAuth 设备流程登录 Kimi Code。",
+ "highlight2": "最新模型支持 — 跨提供商使用 Claude Opus 5,以及 Kimi K3、Gemini 3.6 Flash 和 MiniMax-M3。",
+ "highlight3": "更可靠的工作流 — 干净地放弃中断的子任务,并为代码库中的 Dart 和纯文本文件建立索引。"
},
"cloudAgents": {
"heading": "云端新功能:",
diff --git a/webview-ui/src/i18n/locales/zh-CN/history.json b/webview-ui/src/i18n/locales/zh-CN/history.json
index 20a73240ea..6b6bd03300 100644
--- a/webview-ui/src/i18n/locales/zh-CN/history.json
+++ b/webview-ui/src/i18n/locales/zh-CN/history.json
@@ -47,5 +47,7 @@
"subtaskTag": "子任务",
"deleteWithSubtasks": "这也将删除 {{count}} 个子任务。您确定吗?",
"expandSubtasks": "展开子任务",
- "collapseSubtasks": "收起子任务"
+ "collapseSubtasks": "收起子任务",
+ "delegatedTag": "等待子任务",
+ "interruptedTag": "已中断"
}
diff --git a/webview-ui/src/i18n/locales/zh-CN/mcp.json b/webview-ui/src/i18n/locales/zh-CN/mcp.json
index 652ab77dec..070a3a9e3b 100644
--- a/webview-ui/src/i18n/locales/zh-CN/mcp.json
+++ b/webview-ui/src/i18n/locales/zh-CN/mcp.json
@@ -8,11 +8,6 @@
"title": "启用 MCP 服务器",
"description": "开启后 Zoo 可用已连接 MCP 服务器的工具,能力更强。不用这些工具时建议关闭,节省 API Token 费用。"
},
- "enableServerCreation": {
- "title": "启用 MCP 服务器创建",
- "description": "开启后 Zoo 可帮你创建<1>新1>自定义 MCP 服务器。<0>了解服务器创建0>",
- "hint": "提示:不需要 Zoo 创建新 MCP 服务器时建议关闭,减少 API Token 费用。"
- },
"editGlobalMCP": "编辑全局 MCP",
"editProjectMCP": "编辑项目 MCP",
"learnMoreEditingSettings": "了解如何编辑 MCP 设置文件",
diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json
index 03fc075da9..1b408875d4 100644
--- a/webview-ui/src/i18n/locales/zh-CN/settings.json
+++ b/webview-ui/src/i18n/locales/zh-CN/settings.json
@@ -459,6 +459,17 @@
"moonshotApiKey": "Moonshot API 密钥",
"getMoonshotApiKey": "获取 Moonshot API 密钥",
"moonshotBaseUrl": "Moonshot 服务站点",
+ "kimiCode": {
+ "authMethod": "Authentication method",
+ "oauth": "Kimi Code subscription (OAuth)",
+ "apiKey": "Kimi Code API key",
+ "apiKeyLabel": "Kimi Code API Key",
+ "signIn": "Sign in to Kimi Code",
+ "signOut": "Sign out",
+ "authenticated": "Signed in to Kimi Code",
+ "deviceCodeHelp": "Enter this device code in the Kimi authorization page:",
+ "docs": "Kimi Code documentation"
+ },
"minimaxApiKey": "MiniMax API 密钥",
"getMiniMaxApiKey": "获取 MiniMax API 密钥",
"minimaxBaseUrl": "MiniMax 服务站点",
diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json
index 6b6aeba6fe..3807cd2489 100644
--- a/webview-ui/src/i18n/locales/zh-TW/chat.json
+++ b/webview-ui/src/i18n/locales/zh-TW/chat.json
@@ -17,7 +17,9 @@
"delete": "刪除工作(按住 Shift 並點選可跳過確認)",
"openApiHistory": "開啟 API 歷史紀錄",
"openUiHistory": "開啟 UI 歷史紀錄",
- "backToParentTask": "上層工作"
+ "backToParentTask": "上層工作",
+ "waitingOnSubtask": "等待子任務",
+ "goToSubtask": "前往子任務"
},
"unpin": "取消釘選",
"pin": "釘選",
@@ -363,9 +365,9 @@
"support": "請在 GitHub 上為 Zoo Code 加星支持我們。",
"release": {
"heading": "新增功能:",
- "highlight1": "OpenAI GPT-5.6 系列(Sol、Terra、Luna)— 已在 OpenAI Codex 與 OpenAI Native 中同時提供。",
- "highlight2": "支援 Grok 4.5 — xAI 全新旗艦模型,同時修正了 reasoning effort 問題,Grok 4 Mini 也因此受惠。",
- "highlight3": "Kenari 供應商 — 以盧比計費的一流 OpenAI 相容 AI 閘道,支援 Claude、GPT、DeepSeek、GLM、Kimi 等。"
+ "highlight1": "Moonshot 與 Kimi Code 供應商 — 透過即時模型探索連接 Moonshot 模型,或使用 OAuth 裝置流程登入 Kimi Code。",
+ "highlight2": "最新模型支援 — 跨供應商使用 Claude Opus 5,以及 Kimi K3、Gemini 3.6 Flash 與 MiniMax-M3。",
+ "highlight3": "更可靠的工作流程 — 乾淨地放棄中斷的子任務,並為程式碼庫中的 Dart 與純文字檔案建立索引。"
},
"cloudAgents": {
"heading": "雲端的新功能:",
diff --git a/webview-ui/src/i18n/locales/zh-TW/history.json b/webview-ui/src/i18n/locales/zh-TW/history.json
index 1e12190a69..5fb3230c80 100644
--- a/webview-ui/src/i18n/locales/zh-TW/history.json
+++ b/webview-ui/src/i18n/locales/zh-TW/history.json
@@ -47,5 +47,7 @@
"subtaskTag": "子工作",
"deleteWithSubtasks": "這也將刪除 {{count}} 個子工作。您確定嗎?",
"expandSubtasks": "展開子工作",
- "collapseSubtasks": "收起子工作"
+ "collapseSubtasks": "收起子工作",
+ "delegatedTag": "等待子任務",
+ "interruptedTag": "已中斷"
}
diff --git a/webview-ui/src/i18n/locales/zh-TW/mcp.json b/webview-ui/src/i18n/locales/zh-TW/mcp.json
index ad6e67d22c..8a416d2992 100644
--- a/webview-ui/src/i18n/locales/zh-TW/mcp.json
+++ b/webview-ui/src/i18n/locales/zh-TW/mcp.json
@@ -8,11 +8,6 @@
"title": "啟用 MCP 伺服器",
"description": "啟用此選項後,Zoo 將可使用已連線 MCP 伺服器所提供的工具,進一步提升功能。如果您暫無使用這些額外工具的需求,建議關閉此選項以協助降低 API Token 費用。"
},
- "enableServerCreation": {
- "title": "啟用 MCP 伺服器建立功能",
- "description": "啟用此選項後,Zoo 可協助您建立<1>全新1>自訂 MCP 伺服器。<0>深入了解伺服器建立流程0>",
- "hint": "提示:若您暫無建立新 MCP 伺服器的需求,建議停用此設定,以協助降低 API Token 費用。"
- },
"editGlobalMCP": "編輯全域 MCP",
"editProjectMCP": "編輯專案 MCP",
"refreshMCP": "重新整理 MCP 伺服器",
diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json
index b84cb627e7..481bab5301 100644
--- a/webview-ui/src/i18n/locales/zh-TW/settings.json
+++ b/webview-ui/src/i18n/locales/zh-TW/settings.json
@@ -486,6 +486,17 @@
"moonshotApiKey": "Moonshot API 金鑰",
"getMoonshotApiKey": "取得 Moonshot API 金鑰",
"moonshotBaseUrl": "Moonshot 服務端點",
+ "kimiCode": {
+ "authMethod": "Authentication method",
+ "oauth": "Kimi Code subscription (OAuth)",
+ "apiKey": "Kimi Code API key",
+ "apiKeyLabel": "Kimi Code API Key",
+ "signIn": "Sign in to Kimi Code",
+ "signOut": "Sign out",
+ "authenticated": "Signed in to Kimi Code",
+ "deviceCodeHelp": "Enter this device code in the Kimi authorization page:",
+ "docs": "Kimi Code documentation"
+ },
"minimaxApiKey": "MiniMax API 金鑰",
"getMiniMaxApiKey": "取得 MiniMax API 金鑰",
"minimaxBaseUrl": "MiniMax 服務端點",
diff --git a/webview-ui/src/utils/__tests__/validate.spec.ts b/webview-ui/src/utils/__tests__/validate.spec.ts
index 04484397c6..8aebe3f8e5 100644
--- a/webview-ui/src/utils/__tests__/validate.spec.ts
+++ b/webview-ui/src/utils/__tests__/validate.spec.ts
@@ -54,6 +54,8 @@ describe("Model Validation Functions", () => {
"opencode-go": {},
kenari: {},
"zoo-gateway": {},
+ "kimi-code": {},
+ moonshot: {},
}
const allowAllOrganization: OrganizationAllowList = {
@@ -365,6 +367,48 @@ describe("Model Validation Functions", () => {
})
})
})
+
+ describe("Kimi Code validation", () => {
+ it("returns undefined when using OAuth auth method", () => {
+ const config: ProviderSettings = {
+ apiProvider: "kimi-code",
+ kimiCodeAuthMethod: "oauth",
+ }
+
+ const result = validateApiConfigurationExcludingModelErrors(config, mockRouterModels, allowAllOrganization)
+ expect(result).toBeUndefined()
+ })
+
+ it("returns undefined when auth method is not specified (defaults to OAuth)", () => {
+ const config: ProviderSettings = {
+ apiProvider: "kimi-code",
+ }
+
+ const result = validateApiConfigurationExcludingModelErrors(config, mockRouterModels, allowAllOrganization)
+ expect(result).toBeUndefined()
+ })
+
+ it("returns apiKey error when using api-key auth method without key", () => {
+ const config: ProviderSettings = {
+ apiProvider: "kimi-code",
+ kimiCodeAuthMethod: "api-key",
+ }
+
+ const result = validateApiConfigurationExcludingModelErrors(config, mockRouterModels, allowAllOrganization)
+ expect(result).toBe("settings:validation.apiKey")
+ })
+
+ it("returns undefined when using api-key auth method with key", () => {
+ const config: ProviderSettings = {
+ apiProvider: "kimi-code",
+ kimiCodeAuthMethod: "api-key",
+ kimiCodeApiKey: "valid-key",
+ }
+
+ const result = validateApiConfigurationExcludingModelErrors(config, mockRouterModels, allowAllOrganization)
+ expect(result).toBeUndefined()
+ })
+ })
})
describe("validateBedrockArn", () => {
diff --git a/webview-ui/src/utils/validate.ts b/webview-ui/src/utils/validate.ts
index d780786808..0a812e9d48 100644
--- a/webview-ui/src/utils/validate.ts
+++ b/webview-ui/src/utils/validate.ts
@@ -127,6 +127,11 @@ function validateModelsAndKeysProvided(
return i18next.t("settings:validation.qwenCodeOauthPath")
}
break
+ case "kimi-code":
+ if ((apiConfiguration.kimiCodeAuthMethod ?? "oauth") === "api-key" && !apiConfiguration.kimiCodeApiKey) {
+ return i18next.t("settings:validation.apiKey")
+ }
+ break
case "vercel-ai-gateway":
if (!apiConfiguration.vercelAiGatewayApiKey) {
return i18next.t("settings:validation.apiKey")
diff --git a/webview-ui/tsconfig.json b/webview-ui/tsconfig.json
index 14b36b878b..e71653d66e 100644
--- a/webview-ui/tsconfig.json
+++ b/webview-ui/tsconfig.json
@@ -24,5 +24,5 @@
"@roo/*": ["../src/shared/*"]
}
},
- "include": ["src", "../src/shared", "vitest.setup.ts"]
+ "include": ["src", "playwright", "playwright-ct.config.ts", "../src/shared", "vitest.setup.ts"]
}
diff --git a/webview-ui/vitest.config.ts b/webview-ui/vitest.config.ts
index ea1beea51d..9b43616c1d 100644
--- a/webview-ui/vitest.config.ts
+++ b/webview-ui/vitest.config.ts
@@ -15,7 +15,7 @@ export default defineConfig({
reporters,
silent,
environment: "jsdom",
- include: ["src/**/*.spec.ts", "src/**/*.spec.tsx"],
+ include: ["src/**/*.spec.{ts,tsx}", "src/**/*.test.{ts,tsx}"],
onConsoleLog,
maxWorkers: isCI ? 1 : undefined,
testTimeout: isCI ? 15000 : 5000,
@@ -33,6 +33,8 @@ export default defineConfig({
"**/*.test.tsx",
"**/*.spec.ts",
"**/*.spec.tsx",
+ "**/*.visual.ts",
+ "**/*.visual.tsx",
"**/vitest.setup.ts",
"**/vitest.config.ts",
"**/vite.config.ts",