diff --git a/CHANGELOG.md b/CHANGELOG.md index 4139468c6b..273a7f1466 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## [v5.2.1] - 2026-01-15 + +### Added + +- Updated translations and added memories locale files for internationalization support + +### Fixed + +- Fixed issue where messages were being queued after rejecting exec_cmd tool + +### Changed + +- Code cleanup and improvements + +--- + ## [v5.2.0] - 2026-01-14 ### Added diff --git a/cli/esbuild.config.mjs b/cli/esbuild.config.mjs index 61bd82b738..449639c014 100644 --- a/cli/esbuild.config.mjs +++ b/cli/esbuild.config.mjs @@ -1,6 +1,6 @@ /* eslint-disable no-undef */ import esbuild from "esbuild" -import { chmodSync, mkdirSync, copyFileSync } from "fs" +import { chmodSync, mkdirSync, copyFileSync, cpSync } from "fs" import { rimrafSync } from "rimraf" // Function to copy post-build files @@ -15,7 +15,7 @@ function copyPostBuildFiles() { try { copyFileSync(".env", "dist/.env") - copyFileSync(".env", "dist/kilocode/.env") + copyFileSync(".env", "dist/axoncode/.env") } catch { // .env might not exist, that's okay } @@ -26,9 +26,32 @@ function copyPostBuildFiles() { } } +// Function to copy extension bundle +function copyExtensionBundle() { + try { + // Remove existing axoncode directory if it exists + rimrafSync("dist/axoncode") + + // Copy extension from bin-unpacked to dist/axoncode + cpSync("../bin-unpacked/extension", "dist/axoncode", { + recursive: true, + filter: (src) => { + // Skip webview-ui and assets to reduce size + const relativePath = src.replace(/.*\/bin-unpacked\/extension\//, "") + return !relativePath.startsWith("webview-ui") && !relativePath.startsWith("assets") + }, + }) + + console.log("✓ Extension bundle copied to dist/axoncode") + } catch (err) { + console.error("Error copying extension bundle:", err) + console.warn("⚠ Extension bundle not copied - CLI may not work properly") + } +} + function removeUnneededFiles() { - rimrafSync("dist/kilocode/webview-ui") - rimrafSync("dist/kilocode/assets") + rimrafSync("dist/axoncode/webview-ui") + rimrafSync("dist/axoncode/assets") console.log("✓ Unneeded files removed") } @@ -39,6 +62,7 @@ const afterBuildPlugin = { if (result.errors.length > 0) return copyPostBuildFiles() + copyExtensionBundle() removeUnneededFiles() try { chmodSync("dist/index.js", 0o755) diff --git a/cli/src/cli.ts b/cli/src/cli.ts index a76b7699e4..977235019d 100644 --- a/cli/src/cli.ts +++ b/cli/src/cli.ts @@ -13,7 +13,6 @@ import { requestRouterModelsAtom } from "./state/atoms/actions.js" import { loadHistoryAtom } from "./state/atoms/history.js" import { getTelemetryService, getIdentityManager } from "./services/telemetry/index.js" import { notificationsAtom, notificationsErrorAtom, notificationsLoadingAtom } from "./state/atoms/notifications.js" -import { fetchKilocodeNotifications } from "./utils/notifications.js" import { finishParallelMode } from "./parallel/parallel.js" import { isGitWorktree } from "./utils/git.js" @@ -133,11 +132,6 @@ export class CLI { // Request router models after configuration is injected void this.requestRouterModels() - if (!this.options.ci && !this.options.prompt) { - // Fetch Kilocode notifications if provider is kilocode - void this.fetchNotifications() - } - this.isInitialized = true logs.info("Axon Code CLI initialized successfully", "CLI") } catch (error) { @@ -326,39 +320,6 @@ export class CLI { } } - /** - * Fetch notifications from Kilocode backend if provider is kilocode - */ - private async fetchNotifications(): Promise { - if (!this.store) { - logs.warn("Cannot fetch notifications: store not available", "CLI") - return - } - - try { - const providers = this.store.get(providersAtom) - - const provider = providers.find(({ provider }) => provider === "kilocode") - - if (!provider) { - logs.debug("No provider configured, skipping notification fetch", "CLI") - return - } - - this.store.set(notificationsLoadingAtom, true) - - const notifications = await fetchKilocodeNotifications(provider) - - this.store.set(notificationsAtom, notifications) - } catch (error) { - const err = error instanceof Error ? error : new Error(String(error)) - this.store.set(notificationsErrorAtom, err) - logs.error("Failed to fetch notifications", "CLI", { error }) - } finally { - this.store.set(notificationsLoadingAtom, false) - } - } - /** * Get the ExtensionService instance */ diff --git a/cli/src/commands/__tests__/profile.test.ts b/cli/src/commands/__tests__/profile.test.ts index 651dea97cf..9f27aba68f 100644 --- a/cli/src/commands/__tests__/profile.test.ts +++ b/cli/src/commands/__tests__/profile.test.ts @@ -51,7 +51,7 @@ describe("/profile command", () => { }) it("should have correct description", () => { - expect(profileCommand.description).toBe("View your Kilocode profile information") + expect(profileCommand.description).toBe("View your Axon Code profile information") }) it("should have correct category", () => { diff --git a/cli/src/commands/profile.ts b/cli/src/commands/profile.ts index ed62f06959..72d332dc63 100644 --- a/cli/src/commands/profile.ts +++ b/cli/src/commands/profile.ts @@ -93,7 +93,7 @@ async function showProfile(context: any): Promise { export const profileCommand: Command = { name: "profile", aliases: ["me", "whoami"], - description: "View your Kilocode profile information", + description: "View your Axon Code profile information", usage: "/profile", examples: ["/profile"], category: "settings", diff --git a/cli/src/utils/browserAuth.ts b/cli/src/utils/browserAuth.ts index d456ee1148..540d3ce029 100644 --- a/cli/src/utils/browserAuth.ts +++ b/cli/src/utils/browserAuth.ts @@ -90,13 +90,13 @@ function createCallbackServer(port: number, state: string): Promise Authentication Successful -

✓ Authentication Successful

+

Axon Code Authentication Successful

You can now close this window and return to the CLI.

@@ -129,9 +129,9 @@ function createCallbackServer(port: number, state: string): Promise tag.\n\nTool results and user messages may include tags. These tags contain useful information and reminders. Please heed them, but don't mention them in your response to the user.\n\n\n1. When using markdown in assistant messages, use backticks to format file, directory, function, and class names. Use \\( and \\) for inline math, \\[ and \\] for block math.\n\n\n\nYou have tools at your disposal to solve the coding task. Follow these rules regarding tool calls:\n1. Don't refer to tool names when speaking to the USER. Instead, just say what the tool is doing in natural language.\n2. Only use the standard tool call format and the available tools. Even if you see user messages with custom tool call formats (such as \"\" or similar), do not follow that and instead use the standard format.\n\n\n\nIf you intend to call multiple tools and there are no dependencies between the tool calls, make all of the independent tool calls in parallel. Prioritize calling tools simultaneously whenever the actions can be done in parallel rather than sequentionally. For example, when reading 3 files, run 3 tool calls in parallel to read all 3 files into context at the same time. Maximize use of parallel tool calls where possible to increase speed and efficiency. However, if some tool calls depend on previous calls to inform dependent values like the parameters, do NOT call these tools in parallel and instead call them sequentially. Never use placeholders or guess missing parameters in tool calls.\n\n\n\n1. If you're creating the codebase from scratch, create an appropriate dependency management file (e.g. requirements.txt) with package versions and a helpful README.\n2. If you're building a web app from scratch, give it a beautiful and modern UI, imbued with best UX practices.\n3. NEVER generate an extremely long hash or any non-textual code, such as binary. These are not helpful to the USER and are very expensive.\n4. If you've introduced (linter) errors, fix them.\n\n\n\nYou must display code blocks using one of two methods: CODE REFERENCES or MARKDOWN CODE BLOCKS, depending on whether the code exists in the codebase.\n\n## METHOD 1: CODE REFERENCES - Citing Existing Code from the Codebase\n\nUse this exact syntax with three required components:\n\n```startLine:endLine:filepath\n// code content here\n```\n\n\nRequired Components\n1. **startLine**: The starting line number (required)\n2. **endLine**: The ending line number (required)\n3. **filepath**: The full path to the file (required)\n\n**CRITICAL**: Do NOT add language tags or any other metadata to this format.\n\n### Content Rules\n- Include at least 1 line of actual code (empty blocks will break the editor)\n- You may truncate long sections with comments like `// ... more code ...`\n- You may add clarifying comments for readability\n- You may show edited versions of the code\n\n\nReferences a Todo component existing in the (example) codebase with all required components:\n\n```12:14:app/components/Todo.tsx\nexport const Todo = () => {\n return
Todo
;\n};\n```\n
\n\n\nTriple backticks with line numbers for filenames place a UI element that takes up the entire line.\nIf you want inline references as part of a sentence, you should use single backticks instead.\n\nBad: The TODO element (```12:14:app/components/Todo.tsx```) contains the bug you are looking for.\n\nGood: The TODO element (`app/components/Todo.tsx`) contains the bug you are looking for.\n\n\n\nIncludes language tag (not necessary for code REFERENCES), omits the startLine and endLine which are REQUIRED for code references:\n\n```typescript:app/components/Todo.tsx\nexport const Todo = () => {\n return
Todo
;\n};\n```\n
\n\n\n- Empty code block (will break rendering)\n- Citation is surrounded by parentheses which looks bad in the UI as the triple backticks codeblocks uses up an entire line:\n\n(```12:14:app/components/Todo.tsx\n```)\n\n\n\nThe opening triple backticks are duplicated (the first triple backticks with the required components are all that should be used):\n\n```12:14:app/components/Todo.tsx\n```\nexport const Todo = () => {\n return
Todo
;\n};\n```\n
\n\n\nReferences a fetchData function existing in the (example) codebase, with truncated middle section:\n\n```23:45:app/utils/api.ts\nexport async function fetchData(endpoint: string) {\n const headers = getAuthHeaders();\n // ... validation and error handling ...\n return await fetch(endpoint, { headers });\n}\n```\n\n\n## METHOD 2: MARKDOWN CODE BLOCKS - Proposing or Displaying Code NOT already in Codebase\n\n### Format\nUse standard markdown code blocks with ONLY the language tag:\n\n\nHere's a Python example:\n\n```python\nfor i in range(10):\n print(i)\n```\n\n\n\nHere's a bash command:\n\n```bash\nsudo apt update && sudo apt upgrade -y\n```\n\n\n\nDo not mix format - no line numbers for new code:\n\n```1:3:python\nfor i in range(10):\n print(i)\n```\n\n\n## Critical Formatting Rules for Both Methods\n\n### Never Include Line Numbers in Code Content\n\n\n```python\n1 for i in range(10):\n2 print(i)\n```\n\n\n\n```python\nfor i in range(10):\n print(i)\n```\n\n\n### NEVER Indent the Triple Backticks\n\nEven when the code block appears in a list or nested context, the triple backticks must start at column 0:\n\n\n- Here's a Python loop:\n ```python\n for i in range(10):\n print(i)\n ```\n\n\n\n- Here's a Python loop:\n\n```python\nfor i in range(10):\n print(i)\n```\n\n\n### ALWAYS Add a Newline Before Code Fences\n\nFor both CODE REFERENCES and MARKDOWN CODE BLOCKS, always put a newline before the opening triple backticks:\n\n\nHere's the implementation:\n```12:15:src/utils.ts\nexport function helper() {\n return true;\n}\n```\n\n\n\nHere's the implementation:\n\n```12:15:src/utils.ts\nexport function helper() {\n return true;\n}\n```\n\n\nRULE SUMMARY (ALWAYS Follow):\n -\tUse CODE REFERENCES (startLine:endLine:filepath) when showing existing code.\n```startLine:endLine:filepath\n// ... existing code ...\n```\n -\tUse MARKDOWN CODE BLOCKS (with language tag) for new or proposed code.\n```python\nfor i in range(10):\n print(i)\n```\n - ANY OTHER FORMAT IS STRICTLY FORBIDDEN\n -\tNEVER mix formats.\n -\tNEVER add language tags to CODE REFERENCES.\n -\tNEVER indent triple backticks.\n -\tALWAYS include at least 1 line of code in any reference block.\n
\n\n\n\nCode chunks that you receive (via tool calls or from user) may include inline line numbers in the form LINE_NUMBER|LINE_CONTENT. Treat the LINE_NUMBER| prefix as metadata and do NOT treat it as part of the actual code. LINE_NUMBER is right-aligned number padded with spaces to 6 characters.\n\n\n\nYou may be provided a list of memories. These memories are generated from past conversations with the agent.\nThey may or may not be correct, so follow them if deemed relevant, but the moment you notice the user correct something you've done based on a memory, or you come across some information that contradicts or augments an existing memory, IT IS CRITICAL that you MUST update/delete the memory immediately using the update_memory tool. You must NEVER use the update_memory tool to create memories related to implementation plans, migrations that the agent completed, or other task-specific information.\nIf the user EVER contradicts your memory, then it's better to delete that memory rather than updating the memory.\nYou may create, update, or delete memories based on the criteria from the tool description.\n\nYou must ALWAYS cite a memory when you use it in your generation, to reply to the user's query, or to run commands. To do so, use the following format: [[memory:MEMORY_ID]]. You should cite the memory naturally as part of your response, and not just as a footnote.\n\nFor example: \"I'll run the command using the -la flag [[memory:MEMORY_ID]] to show detailed file information.\"\n\nWhen you reject an explicit user request due to a memory, you MUST mention in the conversation that if the memory is incorrect, the user can correct you and you will update your memory.\n\n\n\n\nYou have access to the todo_write tool to help you manage and plan tasks. Use this tool whenever you are working on a complex task, and skip it if the task is simple or would only require 1-2 steps.\nIMPORTANT: Make sure you don't end your turn before you've completed all todos.\n. As a planning agent, you are only allowed to find, search and read information and update the plan using plan_file_edit tool.", @@ -154,7 +154,7 @@ export const DEFAULT_MODES: readonly ModeConfig[] = [ slug: "agent", // kilocode_change start name: "Agent", - iconName: "codicon-code", + iconName: "infinity-ic", // kilocode_change end roleDefinition: `You are an AI coding assistant, powered by axon-code. You operate in Axon Code IDE. @@ -384,7 +384,7 @@ CRITICAL: For any task, small or big, you will always and always use the update_ slug: "ask", // kilocode_change start name: "Ask", - iconName: "codicon-comment", + iconName: "messages-square", // kilocode_change end roleDefinition: "You are Axon Code, a knowledgeable technical assistant focused on answering questions and providing information about software development, technology, and related topics.", diff --git a/src/core/prompts/tools/native-tools/index.ts b/src/core/prompts/tools/native-tools/index.ts index 18d23c0b92..cbc514275f 100644 --- a/src/core/prompts/tools/native-tools/index.ts +++ b/src/core/prompts/tools/native-tools/index.ts @@ -8,7 +8,7 @@ import listCodeDefinitionNames from "./list_code_definition_names" import listFiles from "./list_files" // import newTask from "./new_task" import { read_file_single } from "./read_file" -import runSlashCommand from "./run_slash_command" +// import runSlashCommand from "./run_slash_command" // import searchAndReplace from "./search_and_replace" import searchFiles from "./search_files" // import switchMode from "./switch_mode" @@ -36,7 +36,7 @@ export const nativeTools = [ // newTask, planFileEdit, read_file_single, - runSlashCommand, + // runSlashCommand, // searchAndReplace, searchFiles, updateTodoList, diff --git a/src/package.json b/src/package.json index 93fb29a179..79a8162db0 100644 --- a/src/package.json +++ b/src/package.json @@ -3,7 +3,7 @@ "displayName": "%extension.displayName%", "description": "%extension.description%", "publisher": "matterai", - "version": "5.2.1", + "version": "5.2.2", "icon": "assets/icons/matterai-ic.png", "galleryBanner": { "color": "#FFFFFF", diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index ba37dedd88..6c792382c1 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea.tsx @@ -25,14 +25,15 @@ import { renderMentionChip } from "@/utils/chat-render" import { MessageSquareX, Paperclip, SendHorizontal, VolumeX } from "lucide-react" import Thumbnails from "../common/Thumbnails" import KiloModeSelector from "../kilocode/KiloModeSelector" -import { KiloProfileSelector } from "../kilocode/chat/KiloProfileSelector" // kilocode_change +import { ModelSelector } from "../kilocode/chat/ModelSelector" +import { useSelectedModel } from "../ui/hooks/useSelectedModel" import { MAX_IMAGES_PER_MESSAGE } from "./ChatView" import ContextMenu from "./ContextMenu" +import { ContextUsageIndicator } from "./ContextUsageIndicator" // kilocode_change import { ImageWarningBanner } from "./ImageWarningBanner" // kilocode_change import { IndexingStatusBadge } from "./IndexingStatusBadge" import { usePromptHistory } from "./hooks/usePromptHistory" import { AcceptRejectButtons } from "./kilocode/AcceptRejectButtons" -import { ContextUsageIndicator } from "./ContextUsageIndicator" // kilocode_change // kilocode_change start: pull slash commands from Cline import SlashCommandMenu from "@/components/chat/SlashCommandMenu" @@ -74,7 +75,7 @@ export const ChatTextArea = forwardRef( inputValue, setInputValue, sendingDisabled, - selectApiConfigDisabled, + // selectApiConfigDisabled, selectedImages, setSelectedImages, onSend, @@ -97,25 +98,25 @@ export const ChatTextArea = forwardRef( filePaths, openedTabs, currentApiConfigName, - listApiConfigMeta, + apiConfiguration, customModes, cwd, - pinnedApiConfigs, - togglePinnedApiConfig, localWorkflows, // kilocode_change globalWorkflows, // kilocode_change taskHistoryVersion, // kilocode_change clineMessages, } = useExtensionState() + const { id: selectedModelId, provider: selectedProvider } = useSelectedModel(apiConfiguration) + // Find the ID and display text for the currently selected API configuration - const { currentConfigId, displayName } = useMemo(() => { - const currentConfig = listApiConfigMeta?.find((config) => config.name === currentApiConfigName) - return { - currentConfigId: currentConfig?.id || "", - displayName: currentApiConfigName || "", // Use the name directly for display - } - }, [listApiConfigMeta, currentApiConfigName]) + // const { currentConfigId, displayName } = useMemo(() => { + // const currentConfig = listApiConfigMeta?.find((config) => config.name === currentApiConfigName) + // return { + // currentConfigId: currentConfig?.id || "", + // displayName: currentApiConfigName || "", // Use the name directly for display + // } + // }, [listApiConfigMeta, currentApiConfigName]) const [gitCommits, setGitCommits] = useState([]) const [showDropdown, setShowDropdown] = useState(false) @@ -1540,7 +1541,7 @@ export const ChatTextArea = forwardRef( /> {/* kilocode_change {Transparent overlay at bottom of textArea to avoid text overlap } */} diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 20d4037a4e..5578823d06 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -2274,6 +2274,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction Get Started for free @@ -2282,7 +2283,10 @@ const ChatViewComponent: React.ForwardRefRenderFunction + style={{ + borderRadius: "6px", + color: "var(--color-secondary-foreground)", + }}> View Demo diff --git a/webview-ui/src/components/kilocode/BottomApiConfig.tsx b/webview-ui/src/components/kilocode/BottomApiConfig.tsx index 16c72d93cf..9316465d45 100644 --- a/webview-ui/src/components/kilocode/BottomApiConfig.tsx +++ b/webview-ui/src/components/kilocode/BottomApiConfig.tsx @@ -1,15 +1,13 @@ import { useExtensionState } from "@/context/ExtensionStateContext" import { vscode } from "@/utils/vscode" -import { WebviewMessage, ProfileData } from "@roo/WebviewMessage" +import { ProfileData, WebviewMessage } from "@roo/WebviewMessage" import { GaugeCircle } from "lucide-react" import { useEffect, useRef, useState } from "react" import { createPortal } from "react-dom" -import { useSelectedModel } from "../ui/hooks/useSelectedModel" -import { ModelSelector } from "./chat/ModelSelector" export const BottomApiConfig = () => { - const { currentApiConfigName, apiConfiguration, clineMessages } = useExtensionState() - const { id: selectedModelId, provider: selectedProvider } = useSelectedModel(apiConfiguration) + const { apiConfiguration, clineMessages } = useExtensionState() + // const { id: selectedModelId, provider: selectedProvider } = useSelectedModel(apiConfiguration) const [profileData, setProfileData] = useState(null) const [showHoverCard, setShowHoverCard] = useState(false) const [cardPosition, setCardPosition] = useState({ top: 0, left: 0 }) @@ -99,14 +97,6 @@ export const BottomApiConfig = () => { return (
- {/* kilocode_change - add data-testid="model-selector" below */} -
- -
{apiConfiguration.kilocodeToken && (
getAllModes(customModes), [customModes]) // Group modes by source - const { organizationModes, otherModes } = React.useMemo(() => { + const { otherModes } = React.useMemo(() => { const orgModes = allModes.filter((mode) => mode.source === "organization") const other = allModes.filter((mode) => mode.source !== "organization") return { organizationModes: orgModes, otherModes: other } @@ -50,38 +50,38 @@ export const KiloModeSelector = ({ // Build options with organization modes grouped separately const options = React.useMemo(() => { const opts: DropdownOption[] = [ - { - value: "shortcut", - label: modeShortcutText, - disabled: true, - type: DropdownOptionType.SHORTCUT, - }, + // { + // value: "shortcut", + // label: modeShortcutText, + // disabled: true, + // type: DropdownOptionType.SHORTCUT, + // }, ] // Add organization modes section if any exist - if (organizationModes.length > 0) { - // Add header as a disabled item - opts.push({ - value: "org-header", - label: t("chat:modeSelector.organizationModes"), - disabled: true, - type: DropdownOptionType.SHORTCUT, - }) - opts.push( - ...organizationModes.map((mode) => ({ - value: mode.slug, - label: mode.name, - codicon: mode.iconName || "codicon-organization", - // description: mode.description, - type: DropdownOptionType.ITEM, - })), - ) - opts.push({ - value: "sep-org", - label: t("chat:separator"), - type: DropdownOptionType.SEPARATOR, - }) - } + // if (organizationModes.length > 0) { + // // Add header as a disabled item + // opts.push({ + // value: "org-header", + // label: t("chat:modeSelector.organizationModes"), + // disabled: true, + // type: DropdownOptionType.SHORTCUT, + // }) + // opts.push( + // ...organizationModes.map((mode) => ({ + // value: mode.slug, + // label: mode.name, + // codicon: mode.iconName || "codicon-organization", + // // description: mode.description, + // type: DropdownOptionType.ITEM, + // })), + // ) + // opts.push({ + // value: "sep-org", + // label: t("chat:separator"), + // type: DropdownOptionType.SEPARATOR, + // }) + // } // Add other modes opts.push( @@ -108,7 +108,7 @@ export const KiloModeSelector = ({ // ) return opts - }, [organizationModes, otherModes, modeShortcutText, t]) + }, [otherModes]) return ( m.slug === value)?.slug ?? defaultModeSlug) === "plan" ? "bg-[var(--color-matterai-blue-dark)]" : "bg-[var(--color-matterai-border)]"} + rounded-md + border-none + hover:bg-[var(--color-matterai-blue)]`, triggerClassName, )} /> diff --git a/webview-ui/src/components/ui/popover.tsx b/webview-ui/src/components/ui/popover.tsx index e02de9c831..b040ab5469 100644 --- a/webview-ui/src/components/ui/popover.tsx +++ b/webview-ui/src/components/ui/popover.tsx @@ -1,6 +1,6 @@ -import * as React from "react" -import { PortalProps } from "@radix-ui/react-portal" import * as PopoverPrimitive from "@radix-ui/react-popover" +import { PortalProps } from "@radix-ui/react-portal" +import * as React from "react" import { cn } from "@/lib/utils" @@ -20,8 +20,8 @@ const PopoverContent = React.forwardRef< align={align} sideOffset={sideOffset} className={cn( - "z-50 w-72 rounded-xs p-4 shadow-xs outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 rounded-xl border border-[var(--color-matterai-border)] outline-none", - "bg-popover", + "z-50 max-w-max min-w-52 p-0 shadow-xs outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 rounded-md border border-[var(--color-matterai-border)] outline-none", + "bg-vscode-editor-background", "text-popover-foreground", className, )} @@ -31,4 +31,4 @@ const PopoverContent = React.forwardRef< )) PopoverContent.displayName = PopoverPrimitive.Content.displayName -export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor } +export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger } diff --git a/webview-ui/src/components/ui/select-dropdown.tsx b/webview-ui/src/components/ui/select-dropdown.tsx index f6a23b7e6f..7367790597 100644 --- a/webview-ui/src/components/ui/select-dropdown.tsx +++ b/webview-ui/src/components/ui/select-dropdown.tsx @@ -1,6 +1,6 @@ -import { CaretUpIcon } from "@radix-ui/react-icons" +import { CaretDownIcon } from "@radix-ui/react-icons" import { Fzf } from "fzf" -import { Check } from "lucide-react" +import { Infinity as InfinityIC, ListTodo, LucideIcon, MessagesSquare } from "lucide-react" import * as React from "react" import { Popover, PopoverContent, PopoverTrigger, StandardTooltip } from "@/components/ui" @@ -8,6 +8,24 @@ import { cn } from "@/lib/utils" import { IconProps } from "@radix-ui/react-icons/dist/types" // kilocode_change import { useRooPortal } from "./hooks/useRooPortal" +// kilocode_change: Map icon names to Lucide icons +const iconMap: Record = { + "list-todo": ListTodo, + "infinity-ic": InfinityIC, + "messages-square": MessagesSquare, +} + +// kilocode_change: Helper function to get Lucide icon component from icon name +const getIconComponent = (iconName?: string): LucideIcon | null => { + if (!iconName) return null + // Check if it's a Lucide icon name + if (iconMap[iconName]) { + return iconMap[iconName] + } + // Fallback for codicon names - return null (will render as codicon class) + return null +} + export enum DropdownOptionType { ITEM = "item", SEPARATOR = "separator", @@ -60,10 +78,10 @@ export const SelectDropdown = React.memo( sideOffset = 4, align = "start", placeholder = "", - shortcutText = "", + // shortcutText = "", renderItem, disableSearch = false, - triggerIcon = CaretUpIcon, // kilocode_change + triggerIcon = CaretDownIcon, // kilocode_change }, ref, ) => { @@ -74,7 +92,7 @@ export const SelectDropdown = React.memo( const portalContainer = useRooPortal("roo-portal") // kilocode_change start - const TriggerIcon = triggerIcon === false ? null : triggerIcon === true ? CaretUpIcon : triggerIcon + const TriggerIcon = triggerIcon === false ? null : triggerIcon === true ? CaretDownIcon : triggerIcon // kilocode_change end // Memoize the selected option to prevent unnecessary calculations @@ -214,13 +232,20 @@ export const SelectDropdown = React.memo( {/* kilocode_change end */} {/* kilocode_change start */} - {selectedOption?.codicon && ( - - )} + {selectedOption?.codicon && + (() => { + const IconComponent = getIconComponent(selectedOption.codicon) + if (IconComponent) { + return + } + return ( + + ) + })()} {/* kilocode_change end */} {displayText} @@ -234,7 +259,7 @@ export const SelectDropdown = React.memo( sideOffset={sideOffset} container={portalContainer} className={cn("p-0 overflow-hidden", contentClassName)}> -
+
{/* Search input */} {/* {!disableSearch && (
@@ -276,18 +301,18 @@ export const SelectDropdown = React.memo( ) } - if ( - option.type === DropdownOptionType.SHORTCUT || - (option.disabled && shortcutText && option.label.includes(shortcutText)) - ) { - return ( -
- {option.label} -
- ) - } + // if ( + // option.type === DropdownOptionType.SHORTCUT || + // (option.disabled && shortcutText && option.label.includes(shortcutText)) + // ) { + // return ( + //
+ // {option.label} + //
+ // ) + // } // Use stable keys for better reconciliation const itemKey = `item-${option.value || option.label || index}` @@ -302,8 +327,8 @@ export const SelectDropdown = React.memo( ? "opacity-50 cursor-not-allowed" : "hover:bg-vscode-list-hoverBackground", option.value === value - ? "bg-vscode-list-activeSelectionBackground text-vscode-list-activeSelectionForeground" - : "", + ? "bg-[var(--vscode-menu-background)] text-vscode-list-activeSelectionForeground" + : "opacity-80", itemClassName, )} data-testid="dropdown-item"> @@ -312,15 +337,28 @@ export const SelectDropdown = React.memo( ) : ( <> {/* kilocode_change start */} -
- +
+ {option.codicon && + (() => { + const IconComponent = getIconComponent( + option.codicon, + ) + if (IconComponent) { + return ( + + ) + } + return ( + + ) + })()}
{option.label}
{option.description && ( @@ -330,9 +368,9 @@ export const SelectDropdown = React.memo( )}
{/* kilocode_change end */} - {option.value === value && ( - - )} + {/* {option.value === value && ( + + )} */}
)} diff --git a/webview-ui/src/i18n/locales/ar/kilocode.json b/webview-ui/src/i18n/locales/ar/kilocode.json index 5dec001ec4..b38ce12c18 100644 --- a/webview-ui/src/i18n/locales/ar/kilocode.json +++ b/webview-ui/src/i18n/locales/ar/kilocode.json @@ -4,7 +4,7 @@ "introText1": "Axon Code وكيل برمجة مدعوم بالذكاء ومفتوح المصدر ومجاني.", "introText2": "يعمل مع أحدث نماذج الذكاء الاصطناعي مثل Claude Sonnet 4.5 وGemini 2.5 Pro وGPT-5 وأكثر من 450 نموذج آخر.", "introText3": "أنشئ حسابًا مجانيًا واحصل على 20 دولارًا كرصيد إضافي عند إضافة رصيد لأول مرة.", - "ctaButton": "ابدأ الآن", + "ctaButton": "تسجيل الدخول / التسجيل", "manualModeButton": "استخدم مفتاح API الخاص بك", "alreadySignedUp": "مسجل من قبل؟", "loginText": "سجّل دخولك هنا", diff --git a/webview-ui/src/i18n/locales/ca/kilocode.json b/webview-ui/src/i18n/locales/ca/kilocode.json index ef5141dc2b..4f1a2c14e4 100644 --- a/webview-ui/src/i18n/locales/ca/kilocode.json +++ b/webview-ui/src/i18n/locales/ca/kilocode.json @@ -4,7 +4,7 @@ "introText1": "Axon Code és un agent de codificació d'IA gratuït i de codi obert.", "introText2": "Funciona amb els models d'IA més recents com Claude Sonnet 4.5, Gemini 2.5 Pro, GPT-5, i més de 450 més.", "introText3": "Crea un compte gratuït i obtén $20 en crèdits de bonificació quan recarreguis per primera vegada.", - "ctaButton": "Comença", + "ctaButton": "Iniciar sessió / Registrar-se", "manualModeButton": "Utilitza la teva pròpia clau API", "alreadySignedUp": "Ja t'has registrat?", "loginText": "Inicia sessió aquí", diff --git a/webview-ui/src/i18n/locales/cs/kilocode.json b/webview-ui/src/i18n/locales/cs/kilocode.json index baa2643545..ec77217f1a 100644 --- a/webview-ui/src/i18n/locales/cs/kilocode.json +++ b/webview-ui/src/i18n/locales/cs/kilocode.json @@ -4,7 +4,7 @@ "introText1": "Axon Code je bezplatný open source AI coding agent.", "introText2": "Funguje s nejnovějšími AI modely jako Claude Sonnet 4.5, Gemini 2.5 Pro, GPT-5 a více než 450 dalšími.", "introText3": "Vytvoř si bezplatný účet a získej $20 bonusových kreditů při prvním dobití.", - "ctaButton": "Začít", + "ctaButton": "Přihlásit se / Registrovat se", "manualModeButton": "Použij vlastní API key", "alreadySignedUp": "Už jsi registrovaný?", "loginText": "Přihlas se zde", diff --git a/webview-ui/src/i18n/locales/de/kilocode.json b/webview-ui/src/i18n/locales/de/kilocode.json index 0cd7550199..a2bd5d89ed 100644 --- a/webview-ui/src/i18n/locales/de/kilocode.json +++ b/webview-ui/src/i18n/locales/de/kilocode.json @@ -4,7 +4,7 @@ "introText1": "Axon Code ist ein kostenloser Open-Source-KI-Coding-Agent.", "introText2": "Er funktioniert mit den neuesten KI-Modellen wie Claude Sonnet 4.5, Gemini 2.5 Pro, GPT-5 und über 450 weiteren.", "introText3": "Erstelle ein kostenloses Konto und erhalte $20 Bonusguthaben bei deiner ersten Aufladung.", - "ctaButton": "Loslegen", + "ctaButton": "Anmelden / Registrieren", "manualModeButton": "Eigenen API-Schlüssel verwenden", "alreadySignedUp": "Bereits registriert?", "loginText": "Hier anmelden", diff --git a/webview-ui/src/i18n/locales/en/kilocode.json b/webview-ui/src/i18n/locales/en/kilocode.json index 952f470afb..e2e60dfbd6 100644 --- a/webview-ui/src/i18n/locales/en/kilocode.json +++ b/webview-ui/src/i18n/locales/en/kilocode.json @@ -4,7 +4,7 @@ "tagline": "The AI Engineering Agent", "introText1": "Boost your engineering productivity with the complete AI Engineer to Build, Debug and Review your code.", "introText2": "Create a free account with $5 credits (~20 tasks) every month!", - "ctaButton": "Get Started", + "ctaButton": "Login / Sign Up", "exploreMatterAI": "Explore MatterAI", "manualModeButton": "Use your own API key", "alreadySignedUp": "Already signed up?", diff --git a/webview-ui/src/i18n/locales/es/kilocode.json b/webview-ui/src/i18n/locales/es/kilocode.json index d40d597ba2..75032d206b 100644 --- a/webview-ui/src/i18n/locales/es/kilocode.json +++ b/webview-ui/src/i18n/locales/es/kilocode.json @@ -4,7 +4,7 @@ "introText1": "Axon Code es un agente de codificación de IA gratuito y de código abierto.", "introText2": "Funciona con los modelos de IA más recientes como Claude Sonnet 4.5, Gemini 2.5 Pro, GPT-5, y más de 450 modelos adicionales.", "introText3": "Crea una cuenta gratuita y obtén $20 en créditos de bonificación cuando recargues por primera vez.", - "ctaButton": "Empezar", + "ctaButton": "Iniciar Sesión / Registrarse", "manualModeButton": "Usa tu propia clave API", "alreadySignedUp": "¿Ya te registraste?", "loginText": "Inicia sesión aquí", diff --git a/webview-ui/src/i18n/locales/fr/kilocode.json b/webview-ui/src/i18n/locales/fr/kilocode.json index 23fef2a3f4..95dbd5ce47 100644 --- a/webview-ui/src/i18n/locales/fr/kilocode.json +++ b/webview-ui/src/i18n/locales/fr/kilocode.json @@ -4,7 +4,7 @@ "introText1": "Axon Code est un agent de codage IA gratuit et open source.", "introText2": "Il fonctionne avec les derniers modèles d'IA comme Claude Sonnet 4.5, Gemini 2.5 Pro, GPT-5, et plus de 450 autres.", "introText3": "Créez un compte gratuit et obtenez 20 $ de crédits bonus lors de votre première recharge.", - "ctaButton": "Commencer", + "ctaButton": "Se connecter / S'inscrire", "manualModeButton": "Utilisez votre propre clé API", "alreadySignedUp": "Déjà inscrit ?", "loginText": "Connectez-vous ici", diff --git a/webview-ui/src/i18n/locales/hi/kilocode.json b/webview-ui/src/i18n/locales/hi/kilocode.json index 96842ff9a6..fd0aa2587b 100644 --- a/webview-ui/src/i18n/locales/hi/kilocode.json +++ b/webview-ui/src/i18n/locales/hi/kilocode.json @@ -4,7 +4,7 @@ "introText1": "Axon Code एक मुफ्त, ओपन सोर्स AI कोडिंग एजेंट है।", "introText2": "यह Claude Sonnet 4.5, Gemini 2.5 Pro, GPT-5, और 450+ अन्य नवीनतम AI मॉडल्स के साथ काम करता है।", "introText3": "एक मुफ्त खाता बनाएं और पहली बार टॉप-अप करने पर $20 बोनस क्रेडिट प्राप्त करें।", - "ctaButton": "शुरू करें", + "ctaButton": "लॉग इन / साइन अप करें", "manualModeButton": "अपनी स्वयं की API कुंजी का उपयोग करें", "alreadySignedUp": "पहले से साइन अप हैं?", "loginText": "यहाँ लॉग इन करें", diff --git a/webview-ui/src/i18n/locales/id/kilocode.json b/webview-ui/src/i18n/locales/id/kilocode.json index 5b4fc77cd9..369a0cc916 100644 --- a/webview-ui/src/i18n/locales/id/kilocode.json +++ b/webview-ui/src/i18n/locales/id/kilocode.json @@ -4,7 +4,7 @@ "introText1": "Axon Code adalah agen coding AI gratis dan open source.", "introText2": "Bekerja dengan model AI terbaru seperti Claude Sonnet 4.5, Gemini 2.5 Pro, GPT-5, dan lebih dari 450 model lainnya.", "introText3": "Buat akun gratis dan dapatkan $20 kredit bonus saat top-up pertama kali.", - "ctaButton": "Mulai", + "ctaButton": "Masuk / Daftar", "manualModeButton": "Gunakan API key sendiri", "alreadySignedUp": "Sudah mendaftar?", "loginText": "Masuk di sini", diff --git a/webview-ui/src/i18n/locales/it/kilocode.json b/webview-ui/src/i18n/locales/it/kilocode.json index 23a8282fc3..6f174b7e85 100644 --- a/webview-ui/src/i18n/locales/it/kilocode.json +++ b/webview-ui/src/i18n/locales/it/kilocode.json @@ -4,7 +4,7 @@ "introText1": "Axon Code è un agente di coding AI gratuito e open source.", "introText2": "Funziona con i più recenti modelli AI come Claude Sonnet 4.5, Gemini 2.5 Pro, GPT-5, e oltre 450 altri.", "introText3": "Crea un account gratuito e ottieni $20 di crediti bonus quando ricarichi per la prima volta.", - "ctaButton": "Inizia", + "ctaButton": "Accedi / Registrati", "manualModeButton": "Usa la tua chiave API", "alreadySignedUp": "Già registrato?", "loginText": "Accedi qui", diff --git a/webview-ui/src/i18n/locales/ja/kilocode.json b/webview-ui/src/i18n/locales/ja/kilocode.json index 17f44a972f..24eb2d2c94 100644 --- a/webview-ui/src/i18n/locales/ja/kilocode.json +++ b/webview-ui/src/i18n/locales/ja/kilocode.json @@ -4,7 +4,7 @@ "introText1": "Kilo Codeは無料のオープンソースAIコーディングエージェントです。", "introText2": "Claude Sonnet 4.5、Gemini 2.5 Pro、GPT-5、その他450以上の最新のAIモデルと連携します。", "introText3": "無料アカウントを作成して、初回チャージ時に$20のボーナスクレジットを獲得しましょう。", - "ctaButton": "始める", + "ctaButton": "ログイン / サインアップ", "manualModeButton": "自分のAPIキーを使う", "alreadySignedUp": "すでに登録済みですか?", "loginText": "こちらからログイン", diff --git a/webview-ui/src/i18n/locales/ko/kilocode.json b/webview-ui/src/i18n/locales/ko/kilocode.json index 435062d614..400d35f774 100644 --- a/webview-ui/src/i18n/locales/ko/kilocode.json +++ b/webview-ui/src/i18n/locales/ko/kilocode.json @@ -4,7 +4,7 @@ "introText1": "Kilo Code는 무료 오픈소스 AI 코딩 에이전트입니다.", "introText2": "Claude Sonnet 4.5, Gemini 2.5 Pro, GPT-5 및 450개 이상의 최신 AI 모델과 함께 작동합니다.", "introText3": "무료 계정을 만들고 첫 충전 시 $20 보너스 크레딧을 받으세요.", - "ctaButton": "시작하기", + "ctaButton": "로그인 / 회원가입", "manualModeButton": "내 API 키 사용하기", "alreadySignedUp": "이미 가입하셨나요?", "loginText": "여기에서 로그인", diff --git a/webview-ui/src/i18n/locales/nl/kilocode.json b/webview-ui/src/i18n/locales/nl/kilocode.json index bf66408a18..c441f1bd4c 100644 --- a/webview-ui/src/i18n/locales/nl/kilocode.json +++ b/webview-ui/src/i18n/locales/nl/kilocode.json @@ -4,7 +4,7 @@ "introText1": "Axon Code is een gratis, open source AI coding agent.", "introText2": "Het werkt met de nieuwste AI modellen zoals Claude Sonnet 4.5, Gemini 2.5 Pro, GPT-5, en meer dan 450 andere.", "introText3": "Maak een gratis account aan en krijg $20 bonuskrediet bij je eerste opwaardering.", - "ctaButton": "Aan de slag", + "ctaButton": "Inloggen / Registreren", "manualModeButton": "Gebruik je eigen API-sleutel", "alreadySignedUp": "Al aangemeld?", "loginText": "Log hier in", diff --git a/webview-ui/src/i18n/locales/pl/kilocode.json b/webview-ui/src/i18n/locales/pl/kilocode.json index 4d6fc171f3..665a20bcc8 100644 --- a/webview-ui/src/i18n/locales/pl/kilocode.json +++ b/webview-ui/src/i18n/locales/pl/kilocode.json @@ -4,7 +4,7 @@ "introText1": "Axon Code to darmowy, otwartoźródłowy agent kodowania AI.", "introText2": "Współpracuje z najnowszymi modelami AI, takimi jak Claude Sonnet 4.5, Gemini 2.5 Pro, GPT-5 i ponad 450 innymi.", "introText3": "Stwórz darmowe konto i otrzymaj $20 bonusowych kredytów przy pierwszym doładowaniu.", - "ctaButton": "Rozpocznij", + "ctaButton": "Zaloguj się / Zarejestruj się", "manualModeButton": "Użyj własnego klucza API", "alreadySignedUp": "Już zarejestrowany?", "loginText": "Zaloguj się tutaj", diff --git a/webview-ui/src/i18n/locales/pt-BR/kilocode.json b/webview-ui/src/i18n/locales/pt-BR/kilocode.json index 4a935cb999..7a7dc21492 100644 --- a/webview-ui/src/i18n/locales/pt-BR/kilocode.json +++ b/webview-ui/src/i18n/locales/pt-BR/kilocode.json @@ -4,7 +4,7 @@ "introText1": "Axon Code é um agente de codificação AI gratuito e de código aberto.", "introText2": "Funciona com os mais recentes modelos de IA como Claude Sonnet 4.5, Gemini 2.5 Pro, GPT-5, e mais de 450 outros.", "introText3": "Crie uma conta gratuita e receba $20 em créditos bônus ao recarregar pela primeira vez.", - "ctaButton": "Começar", + "ctaButton": "Entrar / Cadastrar-se", "manualModeButton": "Use sua própria chave de API", "alreadySignedUp": "Já se cadastrou?", "loginText": "Faça login aqui", diff --git a/webview-ui/src/i18n/locales/ru/kilocode.json b/webview-ui/src/i18n/locales/ru/kilocode.json index 0e04b08f78..258f5dcdcb 100644 --- a/webview-ui/src/i18n/locales/ru/kilocode.json +++ b/webview-ui/src/i18n/locales/ru/kilocode.json @@ -4,7 +4,7 @@ "introText1": "Axon Code — это бесплатный агент кодирования ИИ с открытым исходным кодом.", "introText2": "Работает с новейшими моделями ИИ, такими как Claude Sonnet 4.5, Gemini 2.5 Pro, GPT-5 и более чем 450 другими.", "introText3": "Создайте бесплатную учетную запись и получите $20 бонусных кредитов при первом пополнении.", - "ctaButton": "Начать", + "ctaButton": "Войти / Зарегистрироваться", "manualModeButton": "Использовать свой API-ключ", "alreadySignedUp": "Уже зарегистрированы?", "loginText": "Войти здесь", diff --git a/webview-ui/src/i18n/locales/th/kilocode.json b/webview-ui/src/i18n/locales/th/kilocode.json index c8b740c20b..fe77d28fbf 100644 --- a/webview-ui/src/i18n/locales/th/kilocode.json +++ b/webview-ui/src/i18n/locales/th/kilocode.json @@ -4,7 +4,7 @@ "introText1": "Axon Code เป็นเอเจนต์เขียนโค้ด AI แบบฟรีและโอเพ่นซอร์ส", "introText2": "ทำงานร่วมกับโมเดล AI ล่าสุด เช่น Claude Sonnet 4.5, Gemini 2.5 Pro, GPT-5 และอีกกว่า 450 โมเดล", "introText3": "สร้างบัญชีฟรีและรับเครดิตโบนัส $20 เมื่อเติมเงินครั้งแรก", - "ctaButton": "เริ่มต้น", + "ctaButton": "เข้าสู่ระบบ / ลงทะเบียน", "manualModeButton": "ใช้ API key ของคุณเอง", "alreadySignedUp": "สมัครแล้ว?", "loginText": "เข้าสู่ระบบที่นี่", diff --git a/webview-ui/src/i18n/locales/tr/kilocode.json b/webview-ui/src/i18n/locales/tr/kilocode.json index fe53edacdc..6837f5eb7e 100644 --- a/webview-ui/src/i18n/locales/tr/kilocode.json +++ b/webview-ui/src/i18n/locales/tr/kilocode.json @@ -4,7 +4,7 @@ "introText1": "Axon Code ücretsiz, açık kaynaklı bir AI kodlama ajanıdır.", "introText2": "Claude Sonnet 4.5, Gemini 2.5 Pro, GPT-5 ve 450+ diğer en yeni AI modelleri ile çalışır.", "introText3": "Ücretsiz hesap oluşturun ve ilk yüklemenizde $20 bonus kredi alın.", - "ctaButton": "Başla", + "ctaButton": "Giriş Yap / Kayıt Ol", "manualModeButton": "Kendi API anahtarınızı kullanın", "alreadySignedUp": "Zaten kaydoldunuz mu?", "loginText": "Buradan giriş yapın", diff --git a/webview-ui/src/i18n/locales/uk/kilocode.json b/webview-ui/src/i18n/locales/uk/kilocode.json index 672a1fab2b..1ba59cf1f4 100644 --- a/webview-ui/src/i18n/locales/uk/kilocode.json +++ b/webview-ui/src/i18n/locales/uk/kilocode.json @@ -4,7 +4,7 @@ "introText1": "Axon Code — це безкоштовний агент кодування AI з відкритим кодом.", "introText2": "Працює з найновішими моделями AI, такими як Claude Sonnet 4.5, Gemini 2.5 Pro, GPT-5 та понад 450 іншими.", "introText3": "Створи безкоштовний акаунт і отримай $20 бонусних кредитів при першому поповненні.", - "ctaButton": "Почати", + "ctaButton": "Увійти / Зареєструватися", "manualModeButton": "Використовуй власний API key", "alreadySignedUp": "Вже зареєструвався?", "loginText": "Увійти тут", diff --git a/webview-ui/src/i18n/locales/vi/kilocode.json b/webview-ui/src/i18n/locales/vi/kilocode.json index 0ab0fd534b..5099e38929 100644 --- a/webview-ui/src/i18n/locales/vi/kilocode.json +++ b/webview-ui/src/i18n/locales/vi/kilocode.json @@ -4,7 +4,7 @@ "introText1": "Axon Code là một agent lập trình AI miễn phí và mã nguồn mở.", "introText2": "Hoạt động với các mô hình AI mới nhất như Claude Sonnet 4.5, Gemini 2.5 Pro, GPT-5, và hơn 450 mô hình khác.", "introText3": "Tạo tài khoản miễn phí và nhận $20 tín dụng thưởng khi nạp tiền lần đầu.", - "ctaButton": "Bắt đầu", + "ctaButton": "Đăng nhập / Đăng ký", "manualModeButton": "Sử dụng khóa API của riêng bạn", "alreadySignedUp": "Đã đăng ký?", "loginText": "Đăng nhập tại đây", diff --git a/webview-ui/src/i18n/locales/zh-CN/kilocode.json b/webview-ui/src/i18n/locales/zh-CN/kilocode.json index a46cc199fb..977b04d2b2 100644 --- a/webview-ui/src/i18n/locales/zh-CN/kilocode.json +++ b/webview-ui/src/i18n/locales/zh-CN/kilocode.json @@ -4,7 +4,7 @@ "introText1": "Axon Code 是一个免费的开源 AI 编程代理。", "introText2": "它适用于最新的 AI 模型,如 Claude Sonnet 4.5、Gemini 2.5 Pro、GPT-5 以及 450 多个其他模型。", "introText3": "创建免费账户,首次充值即可获得 20 美元奖励额度。", - "ctaButton": "开始使用", + "ctaButton": "登录 / 注册", "manualModeButton": "使用你自己的 API 密钥", "alreadySignedUp": "已经注册了?", "loginText": "在此登录", diff --git a/webview-ui/src/i18n/locales/zh-TW/kilocode.json b/webview-ui/src/i18n/locales/zh-TW/kilocode.json index 95adb44cc1..ff25c0ff92 100644 --- a/webview-ui/src/i18n/locales/zh-TW/kilocode.json +++ b/webview-ui/src/i18n/locales/zh-TW/kilocode.json @@ -4,7 +4,7 @@ "introText1": "Axon Code 是一個免費的開源 AI 程式設計代理。", "introText2": "它適用於最新的 AI 模型,如 Claude Sonnet 4.5、Gemini 2.5 Pro、GPT-5 以及 450 多個其他模型。", "introText3": "建立免費帳戶,首次儲值即可獲得 20 美元獎勵額度。", - "ctaButton": "開始使用", + "ctaButton": "登入 / 註冊", "manualModeButton": "使用你自己的 API 金鑰", "alreadySignedUp": "已經註冊了?", "loginText": "在此登入", diff --git a/webview-ui/src/index.css b/webview-ui/src/index.css index 3673b0c160..810a685743 100644 --- a/webview-ui/src/index.css +++ b/webview-ui/src/index.css @@ -146,11 +146,12 @@ --color-matterai-green: #8bf4f7; --color-matterai-green-dark: #199598; - --color-matterai-border: #8bf4f720; + --color-matterai-border: #a0c5c620; --color-matterai-blue: #8bf4f750; --color-matterai-red: #ac3e3e; --color-matterai-chip-blue: #8bf4f720; --color-matterai-yellow: #fff0ac; + --color-matterai-blue-dark: #1a3b59; } @layer base {