From 76f98f6c0510fdee5a06ee5920be777f39f3bc5a Mon Sep 17 00:00:00 2001 From: R00-B0T <110429663+R00-B0T@users.noreply.github.com> Date: Wed, 30 Apr 2025 12:59:38 -0700 Subject: [PATCH 01/29] Changeset version bump (#3074) * changeset version bump * Updating CHANGELOG.md format * Update CHANGELOG.md --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: R00-B0T Co-authored-by: Chris Estreich --- .changeset/fifty-pumpkins-wave.md | 5 ----- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) delete mode 100644 .changeset/fifty-pumpkins-wave.md diff --git a/.changeset/fifty-pumpkins-wave.md b/.changeset/fifty-pumpkins-wave.md deleted file mode 100644 index c128270bb44..00000000000 --- a/.changeset/fifty-pumpkins-wave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -Capture stderr in execa-spawned processes diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cfcd35ac39..6eec06de640 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Roo Code Changelog +## [3.15.1] - 2025-04-30 + +- Capture stderr in execa-spawned processes +- Play sound only when action needed from the user (thanks @olearycrew) +- Make retries respect the global auto approve checkbox +- Fix a selection mode bug in the history view (thanks @jr) + ## 3.15.0 - 2025-04-30 - Add prompt caching to the Google Vertex provider (thanks @ashktn) diff --git a/package-lock.json b/package-lock.json index c1aaeb1daf9..3dc8c66a83c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "roo-cline", - "version": "3.15.0", + "version": "3.15.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "roo-cline", - "version": "3.15.0", + "version": "3.15.1", "dependencies": { "@anthropic-ai/bedrock-sdk": "^0.10.2", "@anthropic-ai/sdk": "^0.37.0", diff --git a/package.json b/package.json index 61a68949db7..6a92a10a9e5 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "%extension.displayName%", "description": "%extension.description%", "publisher": "RooVeterinaryInc", - "version": "3.15.0", + "version": "3.15.1", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", From 14afaca5fb16eb84bd2ff9889cb2c116db2f1b54 Mon Sep 17 00:00:00 2001 From: Hannes Rudolph Date: Wed, 30 Apr 2025 21:17:02 -0600 Subject: [PATCH 02/29] =?UTF-8?q?fix=20the=20built=20boomerang=20orchestra?= =?UTF-8?q?tor=20mode=20to=20bring=20in=20line=20with=20origi=E2=80=A6=20(?= =?UTF-8?q?#3081)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix the built boomerang orchestrator mode to bring in line with original boomerang mode --- src/shared/modes.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/shared/modes.ts b/src/shared/modes.ts index 922a17cf95e..37b7694341d 100644 --- a/src/shared/modes.ts +++ b/src/shared/modes.ts @@ -91,13 +91,7 @@ export const modes: readonly ModeConfig[] = [ name: "🪃 Orchestrator", roleDefinition: "You are Roo, a strategic workflow orchestrator who coordinates complex tasks by delegating them to appropriate specialized modes. You have a comprehensive understanding of each mode's capabilities and limitations, allowing you to effectively break down complex problems into discrete tasks that can be solved by different specialists.", - groups: [ - "read", - ["edit", { fileRegex: "\\.roomodes$|custom_modes\\.json$", description: "Mode configuration files only" }], - "browser", - "command", - "mcp", - ], + groups: [], customInstructions: "Your role is to coordinate complex workflows by delegating tasks to specialized modes. As an orchestrator, you should:\n\n1. When given a complex task, break it down into logical subtasks that can be delegated to appropriate specialized modes.\n\n2. For each subtask, use the `new_task` tool to delegate. Choose the most appropriate mode for the subtask's specific goal and provide comprehensive instructions in the `message` parameter. These instructions must include:\n * All necessary context from the parent task or previous subtasks required to complete the work.\n * A clearly defined scope, specifying exactly what the subtask should accomplish.\n * An explicit statement that the subtask should *only* perform the work outlined in these instructions and not deviate.\n * An instruction for the subtask to signal completion by using the `attempt_completion` tool, providing a concise yet thorough summary of the outcome in the `result` parameter, keeping in mind that this summary will be the source of truth used to keep track of what was completed on this project.\n * A statement that these specific instructions supersede any conflicting general instructions the subtask's mode might have.\n\n3. Track and manage the progress of all subtasks. When a subtask is completed, analyze its results and determine the next steps.\n\n4. Help the user understand how the different subtasks fit together in the overall workflow. Provide clear reasoning about why you're delegating specific tasks to specific modes.\n\n5. When all subtasks are completed, synthesize the results and provide a comprehensive overview of what was accomplished.\n\n6. Ask clarifying questions when necessary to better understand how to break down complex tasks effectively.\n\n7. Suggest improvements to the workflow based on the results of completed subtasks.\n\nUse subtasks to maintain clarity. If a request significantly shifts focus or requires a different expertise (mode), consider creating a subtask rather than overloading the current one.", }, From 8c428b5b63d98a5c0356ead88a8e25f6e0c3c92a Mon Sep 17 00:00:00 2001 From: gongzhongqiang Date: Thu, 1 May 2025 22:23:18 +0800 Subject: [PATCH 03/29] feat(openai): Add Config Option to Overwrite OpenAI's API Base (#3066) * feat(openai): Add Config Option to Overwrite OpenAI's API Base * feat(openai): Add option to use custom base URL for OpenAI native API --- evals/packages/types/src/roo-code.ts | 2 ++ src/api/providers/openai-native.ts | 2 +- src/exports/roo-code.d.ts | 1 + src/exports/types.ts | 1 + src/schemas/index.ts | 2 ++ .../src/components/settings/ApiOptions.tsx | 25 +++++++++++++++++++ 6 files changed, 32 insertions(+), 1 deletion(-) diff --git a/evals/packages/types/src/roo-code.ts b/evals/packages/types/src/roo-code.ts index 4470d2c3ecb..911bad8b583 100644 --- a/evals/packages/types/src/roo-code.ts +++ b/evals/packages/types/src/roo-code.ts @@ -358,6 +358,7 @@ export const providerSettingsSchema = z.object({ googleGeminiBaseUrl: z.string().optional(), // OpenAI Native openAiNativeApiKey: z.string().optional(), + openAiNativeBaseUrl: z.string().optional(), // XAI xaiApiKey: z.string().optional(), // Mistral @@ -445,6 +446,7 @@ const providerSettingsRecord: ProviderSettingsRecord = { googleGeminiBaseUrl: undefined, // OpenAI Native openAiNativeApiKey: undefined, + openAiNativeBaseUrl: undefined, // Mistral mistralApiKey: undefined, mistralCodestralUrl: undefined, diff --git a/src/api/providers/openai-native.ts b/src/api/providers/openai-native.ts index 37eb924d13b..62782b3d4f9 100644 --- a/src/api/providers/openai-native.ts +++ b/src/api/providers/openai-native.ts @@ -29,7 +29,7 @@ export class OpenAiNativeHandler extends BaseProvider implements SingleCompletio super() this.options = options const apiKey = this.options.openAiNativeApiKey ?? "not-provided" - this.client = new OpenAI({ apiKey }) + this.client = new OpenAI({ baseURL: this.options.openAiNativeBaseUrl, apiKey }) } override async *createMessage(systemPrompt: string, messages: Anthropic.Messages.MessageParam[]): ApiStream { diff --git a/src/exports/roo-code.d.ts b/src/exports/roo-code.d.ts index 04d713005eb..71902841b0c 100644 --- a/src/exports/roo-code.d.ts +++ b/src/exports/roo-code.d.ts @@ -105,6 +105,7 @@ type ProviderSettings = { geminiApiKey?: string | undefined googleGeminiBaseUrl?: string | undefined openAiNativeApiKey?: string | undefined + openAiNativeBaseUrl?: string | undefined mistralApiKey?: string | undefined mistralCodestralUrl?: string | undefined deepSeekBaseUrl?: string | undefined diff --git a/src/exports/types.ts b/src/exports/types.ts index 7eee7d3cdf1..d3e7059f7c9 100644 --- a/src/exports/types.ts +++ b/src/exports/types.ts @@ -106,6 +106,7 @@ type ProviderSettings = { geminiApiKey?: string | undefined googleGeminiBaseUrl?: string | undefined openAiNativeApiKey?: string | undefined + openAiNativeBaseUrl?: string | undefined mistralApiKey?: string | undefined mistralCodestralUrl?: string | undefined deepSeekBaseUrl?: string | undefined diff --git a/src/schemas/index.ts b/src/schemas/index.ts index 00c79190180..202dbff01a6 100644 --- a/src/schemas/index.ts +++ b/src/schemas/index.ts @@ -401,6 +401,7 @@ export const providerSettingsSchema = z.object({ googleGeminiBaseUrl: z.string().optional(), // OpenAI Native openAiNativeApiKey: z.string().optional(), + openAiNativeBaseUrl: z.string().optional(), // Mistral mistralApiKey: z.string().optional(), mistralCodestralUrl: z.string().optional(), @@ -492,6 +493,7 @@ const providerSettingsRecord: ProviderSettingsRecord = { googleGeminiBaseUrl: undefined, // OpenAI Native openAiNativeApiKey: undefined, + openAiNativeBaseUrl: undefined, // Mistral mistralApiKey: undefined, mistralCodestralUrl: undefined, diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx index 917947ac056..3682b46842f 100644 --- a/webview-ui/src/components/settings/ApiOptions.tsx +++ b/webview-ui/src/components/settings/ApiOptions.tsx @@ -75,6 +75,9 @@ const ApiOptions = ({ const [openAiModels, setOpenAiModels] = useState | null>(null) const [anthropicBaseUrlSelected, setAnthropicBaseUrlSelected] = useState(!!apiConfiguration?.anthropicBaseUrl) + const [openAiNativeBaseUrlSelected, setOpenAiNativeBaseUrlSelected] = useState( + !!apiConfiguration?.openAiNativeBaseUrl, + ) const [azureApiVersionSelected, setAzureApiVersionSelected] = useState(!!apiConfiguration?.azureApiVersion) const [openRouterBaseUrlSelected, setOpenRouterBaseUrlSelected] = useState(!!apiConfiguration?.openRouterBaseUrl) const [openAiHostHeaderSelected, setOpenAiHostHeaderSelected] = useState(!!apiConfiguration?.openAiHostHeader) @@ -490,6 +493,28 @@ const ApiOptions = ({ {selectedProvider === "openai-native" && ( <> + { + setOpenAiNativeBaseUrlSelected(checked) + + if (!checked) { + setApiConfigurationField("openAiNativeBaseUrl", "") + } + }}> + {t("settings:providers.useCustomBaseUrl")} + + {openAiNativeBaseUrlSelected && ( + <> + + + )} Date: Thu, 1 May 2025 22:25:26 +0800 Subject: [PATCH 04/29] Fix padding problem in #2965 (#3084) --- webview-ui/src/components/chat/ChatView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 8bd4cd51aea..4dabee8ade9 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -1232,7 +1232,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction )}
0 ? "mt-0" : ""} max-[370px]:p-3.5 p-10 pt-5 transition-all duration-300`}> + className={` w-full flex flex-col gap-4 m-auto ${isExpanded && tasks.length > 0 ? "mt-0" : ""} px-3.5 min-[370px]:px-10 pt-5 transition-all duration-300`}> {telemetrySetting === "unset" && } {/* Show the task history preview if expanded and tasks exist */} From dc03cb75da98904a4a197b563d54003d8b263a23 Mon Sep 17 00:00:00 2001 From: Sacha Sayan Date: Thu, 1 May 2025 11:32:47 -0400 Subject: [PATCH 05/29] Design Engineer Roomode (#3070) * Design Engineer Roomode * Create spicy-tips-fail.md * Update .roomodes Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --------- Co-authored-by: Matt Rubens Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --- .changeset/spicy-tips-fail.md | 5 +++++ .roomodes | 14 ++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 .changeset/spicy-tips-fail.md diff --git a/.changeset/spicy-tips-fail.md b/.changeset/spicy-tips-fail.md new file mode 100644 index 00000000000..25f387c973f --- /dev/null +++ b/.changeset/spicy-tips-fail.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +Design Engineer Roomode diff --git a/.roomodes b/.roomodes index 6bff26d4f9a..f69dd3d4bc9 100644 --- a/.roomodes +++ b/.roomodes @@ -35,6 +35,20 @@ ], "source": "project" }, + { + "slug": "design-engineer", + "name": "🎨 Design Engineer", + "roleDefinition": "You are Roo, an expert Design Engineer focused on VSCode Extension development. Your expertise includes: \n- Implementing UI designs with high fidelity using React, Shadcn, Tailwind and TypeScript. \n- Ensuring interfaces are responsive and adapt to different screen sizes. \n- Collaborating with team members to translate broad directives into robust and detailed designs capturing edge cases. \n- Maintaining uniformity and consistency across the user interface.", + "groups": [ + "read", + ["edit", { "fileRegex": "\\.(css|html|json|mdx?|jsx?|tsx?|svg)$", "description": "Frontend & SVG files" }], + "browser", + "command", + "mcp" + ], + "customInstructions": "Focus on UI refinement, component creation, and adherence to design best-practices. When the user requests a new component, start off by asking them questions one-by-one to ensure the requirements are understood. Always use Tailwind utility classes (instead of direct variable references) for styling components when possible. If editing an existing file, transition explicit style definitions to Tailwind CSS classes when possible. Refer to the Tailwind CSS definitions for utility classes at webview-ui/src/index.css. Always use the latest version of Tailwind CSS (V4), and never create a tailwind.config.js file. Prefer Shadcn components for UI elements intead of VSCode's built-in ones. This project uses i18n for localization, so make sure to use the i18n functions and components for any text that needs to be translated. Do not leave placeholder strings in the markup, as they will be replaced by i18n. Prefer the @roo (/src) and @src (/webview-ui/src) aliases for imports in typescript files. Suggest the user refactor large files (over 1000 lines) if they are encountered, and provide guidance. Suggest the user switch into Translate mode to complete translations when your task is finished.", + "source": "project" + }, { "slug": "release-engineer", "name": "🚀 Release Engineer", From 026a3e10592e189bc4823dcc367246882d95ffff Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Thu, 1 May 2025 13:09:08 -0400 Subject: [PATCH 06/29] Show 'None' when a mode has no tool groups (#3095) --- webview-ui/src/components/prompts/PromptsView.tsx | 6 ++++++ webview-ui/src/i18n/locales/ca/prompts.json | 3 ++- webview-ui/src/i18n/locales/de/prompts.json | 3 ++- webview-ui/src/i18n/locales/en/prompts.json | 3 ++- webview-ui/src/i18n/locales/es/prompts.json | 3 ++- webview-ui/src/i18n/locales/fr/prompts.json | 3 ++- webview-ui/src/i18n/locales/hi/prompts.json | 3 ++- webview-ui/src/i18n/locales/it/prompts.json | 3 ++- webview-ui/src/i18n/locales/ja/prompts.json | 3 ++- webview-ui/src/i18n/locales/ko/prompts.json | 3 ++- webview-ui/src/i18n/locales/pl/prompts.json | 3 ++- webview-ui/src/i18n/locales/pt-BR/prompts.json | 3 ++- webview-ui/src/i18n/locales/ru/prompts.json | 3 ++- webview-ui/src/i18n/locales/tr/prompts.json | 3 ++- webview-ui/src/i18n/locales/vi/prompts.json | 3 ++- webview-ui/src/i18n/locales/zh-CN/prompts.json | 3 ++- webview-ui/src/i18n/locales/zh-TW/prompts.json | 3 ++- 17 files changed, 38 insertions(+), 16 deletions(-) diff --git a/webview-ui/src/components/prompts/PromptsView.tsx b/webview-ui/src/components/prompts/PromptsView.tsx index 9eecb1e6ed3..4c84416a2c2 100644 --- a/webview-ui/src/components/prompts/PromptsView.tsx +++ b/webview-ui/src/components/prompts/PromptsView.tsx @@ -696,6 +696,12 @@ const PromptsView = ({ onDone }: PromptsViewProps) => { {(() => { const currentMode = getCurrentMode() const enabledGroups = currentMode?.groups || [] + + // If there are no enabled groups, display translated "None" + if (enabledGroups.length === 0) { + return t("prompts:tools.noTools") + } + return enabledGroups .map((group) => { const groupName = getGroupName(group) diff --git a/webview-ui/src/i18n/locales/ca/prompts.json b/webview-ui/src/i18n/locales/ca/prompts.json index 0acb8d5d067..d37e8629425 100644 --- a/webview-ui/src/i18n/locales/ca/prompts.json +++ b/webview-ui/src/i18n/locales/ca/prompts.json @@ -25,7 +25,8 @@ "browser": "Utilitzar navegador", "command": "Executar comandes", "mcp": "Utilitzar MCP" - } + }, + "noTools": "Cap" }, "roleDefinition": { "title": "Definició de rol", diff --git a/webview-ui/src/i18n/locales/de/prompts.json b/webview-ui/src/i18n/locales/de/prompts.json index 55e8440c516..7d0a19ec470 100644 --- a/webview-ui/src/i18n/locales/de/prompts.json +++ b/webview-ui/src/i18n/locales/de/prompts.json @@ -25,7 +25,8 @@ "browser": "Browser verwenden", "command": "Befehle ausführen", "mcp": "MCP verwenden" - } + }, + "noTools": "Keine" }, "roleDefinition": { "title": "Rollendefinition", diff --git a/webview-ui/src/i18n/locales/en/prompts.json b/webview-ui/src/i18n/locales/en/prompts.json index ba836a7012e..ce567a48697 100644 --- a/webview-ui/src/i18n/locales/en/prompts.json +++ b/webview-ui/src/i18n/locales/en/prompts.json @@ -25,7 +25,8 @@ "browser": "Use Browser", "command": "Run Commands", "mcp": "Use MCP" - } + }, + "noTools": "None" }, "roleDefinition": { "title": "Role Definition", diff --git a/webview-ui/src/i18n/locales/es/prompts.json b/webview-ui/src/i18n/locales/es/prompts.json index e93835edf49..3c6b0526393 100644 --- a/webview-ui/src/i18n/locales/es/prompts.json +++ b/webview-ui/src/i18n/locales/es/prompts.json @@ -25,7 +25,8 @@ "browser": "Usar navegador", "command": "Ejecutar comandos", "mcp": "Usar MCP" - } + }, + "noTools": "Ninguna" }, "roleDefinition": { "title": "Definición de rol", diff --git a/webview-ui/src/i18n/locales/fr/prompts.json b/webview-ui/src/i18n/locales/fr/prompts.json index 1d5b871d625..b746bd83117 100644 --- a/webview-ui/src/i18n/locales/fr/prompts.json +++ b/webview-ui/src/i18n/locales/fr/prompts.json @@ -25,7 +25,8 @@ "browser": "Utiliser le navigateur", "command": "Exécuter des commandes", "mcp": "Utiliser MCP" - } + }, + "noTools": "Aucun" }, "roleDefinition": { "title": "Définition du rôle", diff --git a/webview-ui/src/i18n/locales/hi/prompts.json b/webview-ui/src/i18n/locales/hi/prompts.json index e30f04c664d..d5291a577c7 100644 --- a/webview-ui/src/i18n/locales/hi/prompts.json +++ b/webview-ui/src/i18n/locales/hi/prompts.json @@ -25,7 +25,8 @@ "browser": "ब्राउज़र का उपयोग करें", "command": "कमांड्स चलाएँ", "mcp": "MCP का उपयोग करें" - } + }, + "noTools": "कोई नहीं" }, "roleDefinition": { "title": "भूमिका परिभाषा", diff --git a/webview-ui/src/i18n/locales/it/prompts.json b/webview-ui/src/i18n/locales/it/prompts.json index cfb35f150c4..81bb7534def 100644 --- a/webview-ui/src/i18n/locales/it/prompts.json +++ b/webview-ui/src/i18n/locales/it/prompts.json @@ -25,7 +25,8 @@ "browser": "Usa browser", "command": "Esegui comandi", "mcp": "Usa MCP" - } + }, + "noTools": "Nessuno" }, "roleDefinition": { "title": "Definizione del ruolo", diff --git a/webview-ui/src/i18n/locales/ja/prompts.json b/webview-ui/src/i18n/locales/ja/prompts.json index 8f18095a121..16f30a2ebc5 100644 --- a/webview-ui/src/i18n/locales/ja/prompts.json +++ b/webview-ui/src/i18n/locales/ja/prompts.json @@ -25,7 +25,8 @@ "browser": "ブラウザを使用", "command": "コマンドを実行", "mcp": "MCP を使用" - } + }, + "noTools": "なし" }, "roleDefinition": { "title": "役割の定義", diff --git a/webview-ui/src/i18n/locales/ko/prompts.json b/webview-ui/src/i18n/locales/ko/prompts.json index 7ce93e8be02..5942105f055 100644 --- a/webview-ui/src/i18n/locales/ko/prompts.json +++ b/webview-ui/src/i18n/locales/ko/prompts.json @@ -25,7 +25,8 @@ "browser": "브라우저 사용", "command": "명령 실행", "mcp": "MCP 사용" - } + }, + "noTools": "없음" }, "roleDefinition": { "title": "역할 정의", diff --git a/webview-ui/src/i18n/locales/pl/prompts.json b/webview-ui/src/i18n/locales/pl/prompts.json index 459b2069194..ef8a5ffe083 100644 --- a/webview-ui/src/i18n/locales/pl/prompts.json +++ b/webview-ui/src/i18n/locales/pl/prompts.json @@ -25,7 +25,8 @@ "browser": "Używaj przeglądarki", "command": "Uruchamiaj polecenia", "mcp": "Używaj MCP" - } + }, + "noTools": "Brak" }, "roleDefinition": { "title": "Definicja roli", diff --git a/webview-ui/src/i18n/locales/pt-BR/prompts.json b/webview-ui/src/i18n/locales/pt-BR/prompts.json index 50c3852b15f..f255b91a27d 100644 --- a/webview-ui/src/i18n/locales/pt-BR/prompts.json +++ b/webview-ui/src/i18n/locales/pt-BR/prompts.json @@ -25,7 +25,8 @@ "browser": "Usar navegador", "command": "Executar comandos", "mcp": "Usar MCP" - } + }, + "noTools": "Nenhuma" }, "roleDefinition": { "title": "Definição de função", diff --git a/webview-ui/src/i18n/locales/ru/prompts.json b/webview-ui/src/i18n/locales/ru/prompts.json index 28778498e0d..0ff448bedbd 100644 --- a/webview-ui/src/i18n/locales/ru/prompts.json +++ b/webview-ui/src/i18n/locales/ru/prompts.json @@ -25,7 +25,8 @@ "browser": "Использовать браузер", "command": "Выполнять команды", "mcp": "Использовать MCP" - } + }, + "noTools": "Отсутствуют" }, "roleDefinition": { "title": "Определение роли", diff --git a/webview-ui/src/i18n/locales/tr/prompts.json b/webview-ui/src/i18n/locales/tr/prompts.json index 40cd10aa895..8d7c7b9305a 100644 --- a/webview-ui/src/i18n/locales/tr/prompts.json +++ b/webview-ui/src/i18n/locales/tr/prompts.json @@ -25,7 +25,8 @@ "browser": "Tarayıcı Kullan", "command": "Komutları Çalıştır", "mcp": "MCP Kullan" - } + }, + "noTools": "Yok" }, "roleDefinition": { "title": "Rol Tanımı", diff --git a/webview-ui/src/i18n/locales/vi/prompts.json b/webview-ui/src/i18n/locales/vi/prompts.json index 3951da818c6..4b62d3718e6 100644 --- a/webview-ui/src/i18n/locales/vi/prompts.json +++ b/webview-ui/src/i18n/locales/vi/prompts.json @@ -25,7 +25,8 @@ "browser": "Sử dụng trình duyệt", "command": "Chạy lệnh", "mcp": "Sử dụng MCP" - } + }, + "noTools": "Không có" }, "roleDefinition": { "title": "Định nghĩa vai trò", diff --git a/webview-ui/src/i18n/locales/zh-CN/prompts.json b/webview-ui/src/i18n/locales/zh-CN/prompts.json index abfd892039f..2980bd66997 100644 --- a/webview-ui/src/i18n/locales/zh-CN/prompts.json +++ b/webview-ui/src/i18n/locales/zh-CN/prompts.json @@ -25,7 +25,8 @@ "browser": "浏览器", "command": "运行命令", "mcp": "MCP服务" - } + }, + "noTools": "无" }, "roleDefinition": { "title": "角色定义", diff --git a/webview-ui/src/i18n/locales/zh-TW/prompts.json b/webview-ui/src/i18n/locales/zh-TW/prompts.json index 874c9361dc0..9b99707cf67 100644 --- a/webview-ui/src/i18n/locales/zh-TW/prompts.json +++ b/webview-ui/src/i18n/locales/zh-TW/prompts.json @@ -25,7 +25,8 @@ "browser": "使用瀏覽器", "command": "執行命令", "mcp": "使用 MCP" - } + }, + "noTools": "無" }, "roleDefinition": { "title": "角色定義", From f39dcf40aa0faa6e99f2956e942de6e04f68ee9b Mon Sep 17 00:00:00 2001 From: Dicha Zelianivan Arkana <51877647+elianiva@users.noreply.github.com> Date: Fri, 2 May 2025 01:11:39 +0700 Subject: [PATCH 07/29] refactor(chat): show inline code more subtle (#2747) * refactor(chat): show inline code more subtle * refactor: make inline code more readable --- webview-ui/src/components/common/MarkdownBlock.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/webview-ui/src/components/common/MarkdownBlock.tsx b/webview-ui/src/components/common/MarkdownBlock.tsx index ba8eab1eb8e..be7d5459802 100644 --- a/webview-ui/src/components/common/MarkdownBlock.tsx +++ b/webview-ui/src/components/common/MarkdownBlock.tsx @@ -57,11 +57,10 @@ const remarkUrlToLink = () => { const StyledMarkdown = styled.div` code:not(pre > code) { font-family: var(--vscode-editor-font-family, monospace); - color: var(--vscode-textPreformat-foreground, #f78383); - background-color: var(--vscode-textCodeBlock-background, #1e1e1e); + filter: saturation(110%) brightness(95%); + color: var(--vscode-textPreformat-foreground) !important; + background-color: var(--vscode-textPreformat-background) !important; padding: 0px 2px; - border-radius: 3px; - border: 1px solid var(--vscode-textSeparator-foreground, #424242); white-space: pre-line; word-break: break-word; overflow-wrap: anywhere; From d6e86a9eed8a2033474adf987279f5c2209a196a Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Thu, 1 May 2025 11:15:28 -0700 Subject: [PATCH 08/29] Sync evals types (#3069) --- evals/package.json | 12 +- evals/packages/types/src/roo-code-defaults.ts | 37 +- evals/packages/types/src/roo-code.ts | 111 +++- evals/pnpm-lock.yaml | 596 +++++++++++++----- src/schemas/index.ts | 4 + 5 files changed, 540 insertions(+), 220 deletions(-) diff --git a/evals/package.json b/evals/package.json index 5ba6a42fd57..2e7c21d9770 100644 --- a/evals/package.json +++ b/evals/package.json @@ -13,14 +13,14 @@ "drizzle:studio": "pnpm --filter @evals/db db:studio" }, "devDependencies": { - "@dotenvx/dotenvx": "^1.39.1", - "@eslint/js": "^9.24.0", - "eslint": "^9.24.0", + "@dotenvx/dotenvx": "^1.41.0", + "@eslint/js": "^9.25.1", + "eslint": "^9.25.1", "globals": "^16.0.0", "prettier": "^3.5.3", - "tsx": "^4.19.3", - "turbo": "^2.5.0", + "tsx": "^4.19.4", + "turbo": "^2.5.2", "typescript": "^5.8.3", - "typescript-eslint": "^8.29.1" + "typescript-eslint": "^8.31.1" } } diff --git a/evals/packages/types/src/roo-code-defaults.ts b/evals/packages/types/src/roo-code-defaults.ts index ae467860424..42d9a1bc9fa 100644 --- a/evals/packages/types/src/roo-code-defaults.ts +++ b/evals/packages/types/src/roo-code-defaults.ts @@ -4,12 +4,7 @@ export const rooCodeDefaults: RooCodeSettings = { apiProvider: "openrouter", openRouterUseMiddleOutTransform: false, - // modelTemperature: null, - // reasoningEffort: "high", - rateLimitSeconds: 0, - - pinnedApiConfigs: {}, - lastShownAnnouncementId: "apr-18-2025-3-13", + lastShownAnnouncementId: "apr-30-2025-3-15", autoApprovalEnabled: true, alwaysAllowReadOnly: true, @@ -27,43 +22,17 @@ export const rooCodeDefaults: RooCodeSettings = { allowedCommands: ["*"], browserToolEnabled: false, - browserViewportSize: "900x600", - screenshotQuality: 75, - remoteBrowserEnabled: false, enableCheckpoints: false, - checkpointStorage: "task", - - ttsEnabled: false, - ttsSpeed: 1, - soundEnabled: false, - soundVolume: 0.5, maxOpenTabsContext: 20, maxWorkspaceFiles: 200, showRooIgnoredFiles: true, maxReadFileLine: 500, - terminalOutputLineLimit: 500, - terminalShellIntegrationTimeout: 30000, - terminalCommandDelay: 0, - terminalPowershellCounter: false, - terminalZshClearEolMark: true, - terminalZshOhMy: true, - terminalZshP10k: false, - terminalZdotdir: true, - - diffEnabled: true, - fuzzyMatchThreshold: 1.0, - experiments: { - powerSteering: false, - }, - - language: "en", - - telemetrySetting: "enabled", + terminalShellIntegrationDisabled: true, mcpEnabled: false, + mode: "code", - customModes: [], } diff --git a/evals/packages/types/src/roo-code.ts b/evals/packages/types/src/roo-code.ts index 911bad8b583..8070bdeea0a 100644 --- a/evals/packages/types/src/roo-code.ts +++ b/evals/packages/types/src/roo-code.ts @@ -18,13 +18,13 @@ export const providerNames = [ "lmstudio", "gemini", "openai-native", - "xai", "mistral", "deepseek", "unbound", "requesty", "human-relay", "fake-ai", + "xai", ] as const export const providerNamesSchema = z.enum(providerNames) @@ -41,19 +41,6 @@ export const toolGroupsSchema = z.enum(toolGroups) export type ToolGroup = z.infer -/** - * CheckpointStorage - */ - -export const checkpointStorages = ["task", "workspace"] as const - -export const checkpointStoragesSchema = z.enum(checkpointStorages) - -export type CheckpointStorage = z.infer - -export const isCheckpointStorage = (value: string): value is CheckpointStorage => - checkpointStorages.includes(value as CheckpointStorage) - /** * Language */ @@ -93,23 +80,49 @@ export const telemetrySettingsSchema = z.enum(telemetrySettings) export type TelemetrySetting = z.infer +/** + * ReasoningEffort + */ + +export const reasoningEfforts = ["low", "medium", "high"] as const + +export const reasoningEffortsSchema = z.enum(reasoningEfforts) + +export type ReasoningEffort = z.infer + /** * ModelInfo */ export const modelInfoSchema = z.object({ maxTokens: z.number().nullish(), + maxThinkingTokens: z.number().nullish(), contextWindow: z.number(), supportsImages: z.boolean().optional(), supportsComputerUse: z.boolean().optional(), supportsPromptCache: z.boolean(), + isPromptCacheOptional: z.boolean().optional(), inputPrice: z.number().optional(), outputPrice: z.number().optional(), cacheWritesPrice: z.number().optional(), cacheReadsPrice: z.number().optional(), description: z.string().optional(), - reasoningEffort: z.enum(["low", "medium", "high"]).optional(), + reasoningEffort: reasoningEffortsSchema.optional(), thinking: z.boolean().optional(), + minTokensPerCachePoint: z.number().optional(), + maxCachePoints: z.number().optional(), + cachableFields: z.array(z.string()).optional(), + tiers: z + .array( + z.object({ + contextWindow: z.number(), + inputPrice: z.number().optional(), + outputPrice: z.number().optional(), + cacheWritesPrice: z.number().optional(), + cacheReadsPrice: z.number().optional(), + }), + ) + .optional(), }) export type ModelInfo = z.infer @@ -141,6 +154,7 @@ export const historyItemSchema = z.object({ cacheReads: z.number().optional(), totalCost: z.number(), size: z.number().optional(), + workspace: z.string().optional(), }) export type HistoryItem = z.infer @@ -268,6 +282,29 @@ export const customSupportPromptsSchema = z.record(z.string(), z.string().option export type CustomSupportPrompts = z.infer +/** + * CommandExecutionStatus + */ + +export const commandExecutionStatusSchema = z.discriminatedUnion("status", [ + z.object({ + executionId: z.string(), + status: z.literal("running"), + pid: z.number().optional(), + }), + z.object({ + executionId: z.string(), + status: z.literal("exited"), + exitCode: z.number().optional(), + }), + z.object({ + executionId: z.string(), + status: z.literal("fallback"), + }), +]) + +export type CommandExecutionStatus = z.infer + /** * ExperimentId */ @@ -330,12 +367,15 @@ export const providerSettingsSchema = z.object({ // OpenAI openAiBaseUrl: z.string().optional(), openAiApiKey: z.string().optional(), + openAiHostHeader: z.string().optional(), + openAiLegacyFormat: z.boolean().optional(), openAiR1FormatEnabled: z.boolean().optional(), openAiModelId: z.string().optional(), - openAiCustomModelInfo: modelInfoSchema.optional(), + openAiCustomModelInfo: modelInfoSchema.nullish(), openAiUseAzure: z.boolean().optional(), azureApiVersion: z.string().optional(), openAiStreamingEnabled: z.boolean().optional(), + enableReasoningEffort: z.boolean().optional(), // Ollama ollamaModelId: z.string().optional(), ollamaBaseUrl: z.string().optional(), @@ -373,13 +413,18 @@ export const providerSettingsSchema = z.object({ // Requesty requestyApiKey: z.string().optional(), requestyModelId: z.string().optional(), + // X.AI (Grok) + xaiApiKey: z.string().optional(), // Claude 3.7 Sonnet Thinking - modelMaxTokens: z.number().optional(), // Currently only used by Anthropic hybrid thinking models. - modelMaxThinkingTokens: z.number().optional(), // Currently only used by Anthropic hybrid thinking models. + modelMaxTokens: z.number().optional(), + modelMaxThinkingTokens: z.number().optional(), // Generic includeMaxTokens: z.boolean().optional(), + reasoningEffort: reasoningEffortsSchema.optional(), + promptCachingEnabled: z.boolean().optional(), + diffEnabled: z.boolean().optional(), + fuzzyMatchThreshold: z.number().optional(), modelTemperature: z.number().nullish(), - reasoningEffort: z.enum(["low", "medium", "high"]).optional(), rateLimitSeconds: z.number().optional(), // Fake AI fakeAi: z.unknown().optional(), @@ -424,14 +469,15 @@ const providerSettingsRecord: ProviderSettingsRecord = { // OpenAI openAiBaseUrl: undefined, openAiApiKey: undefined, + openAiHostHeader: undefined, + openAiLegacyFormat: undefined, openAiR1FormatEnabled: undefined, openAiModelId: undefined, openAiCustomModelInfo: undefined, openAiUseAzure: undefined, azureApiVersion: undefined, openAiStreamingEnabled: undefined, - // xAI - xaiApiKey: undefined, + enableReasoningEffort: undefined, // Ollama ollamaModelId: undefined, ollamaBaseUrl: undefined, @@ -464,11 +510,16 @@ const providerSettingsRecord: ProviderSettingsRecord = { modelMaxThinkingTokens: undefined, // Generic includeMaxTokens: undefined, - modelTemperature: undefined, reasoningEffort: undefined, + promptCachingEnabled: undefined, + diffEnabled: undefined, + fuzzyMatchThreshold: undefined, + modelTemperature: undefined, rateLimitSeconds: undefined, // Fake AI fakeAi: undefined, + // X.AI (Grok) + xaiApiKey: undefined, } export const PROVIDER_SETTINGS_KEYS = Object.keys(providerSettingsRecord) as Keys[] @@ -506,9 +557,9 @@ export const globalSettingsSchema = z.object({ screenshotQuality: z.number().optional(), remoteBrowserEnabled: z.boolean().optional(), remoteBrowserHost: z.string().optional(), + cachedChromeHostUrl: z.string().optional(), enableCheckpoints: z.boolean().optional(), - checkpointStorage: checkpointStoragesSchema.optional(), ttsEnabled: z.boolean().optional(), ttsSpeed: z.number().optional(), @@ -522,13 +573,16 @@ export const globalSettingsSchema = z.object({ terminalOutputLineLimit: z.number().optional(), terminalShellIntegrationTimeout: z.number().optional(), + terminalShellIntegrationDisabled: z.boolean().optional(), terminalCommandDelay: z.number().optional(), terminalPowershellCounter: z.boolean().optional(), terminalZshClearEolMark: z.boolean().optional(), terminalZshOhMy: z.boolean().optional(), terminalZshP10k: z.boolean().optional(), terminalZdotdir: z.boolean().optional(), + terminalCompressProgressBar: z.boolean().optional(), + rateLimitSeconds: z.number().optional(), diffEnabled: z.boolean().optional(), fuzzyMatchThreshold: z.number().optional(), experiments: experimentsSchema.optional(), @@ -546,6 +600,7 @@ export const globalSettingsSchema = z.object({ customModePrompts: customModePromptsSchema.optional(), customSupportPrompts: customSupportPromptsSchema.optional(), enhancementApiConfigId: z.string().optional(), + historyPreviewCollapsed: z.boolean().optional(), }) export type GlobalSettings = z.infer @@ -583,7 +638,6 @@ const globalSettingsRecord: GlobalSettingsRecord = { remoteBrowserHost: undefined, enableCheckpoints: undefined, - checkpointStorage: undefined, ttsEnabled: undefined, ttsSpeed: undefined, @@ -597,13 +651,16 @@ const globalSettingsRecord: GlobalSettingsRecord = { terminalOutputLineLimit: undefined, terminalShellIntegrationTimeout: undefined, + terminalShellIntegrationDisabled: undefined, terminalCommandDelay: undefined, terminalPowershellCounter: undefined, terminalZshClearEolMark: undefined, terminalZshOhMy: undefined, terminalZshP10k: undefined, terminalZdotdir: undefined, + terminalCompressProgressBar: undefined, + rateLimitSeconds: undefined, diffEnabled: undefined, fuzzyMatchThreshold: undefined, experiments: undefined, @@ -621,6 +678,8 @@ const globalSettingsRecord: GlobalSettingsRecord = { customModePrompts: undefined, customSupportPrompts: undefined, enhancementApiConfigId: undefined, + cachedChromeHostUrl: undefined, + historyPreviewCollapsed: undefined, } export const GLOBAL_SETTINGS_KEYS = Object.keys(globalSettingsRecord) as Keys[] @@ -654,6 +713,7 @@ export type SecretState = Pick< | "mistralApiKey" | "unboundApiKey" | "requestyApiKey" + | "xaiApiKey" > type SecretStateRecord = Record, undefined> @@ -672,6 +732,7 @@ const secretStateRecord: SecretStateRecord = { mistralApiKey: undefined, unboundApiKey: undefined, requestyApiKey: undefined, + xaiApiKey: undefined, } export const SECRET_STATE_KEYS = Object.keys(secretStateRecord) as Keys[] @@ -749,6 +810,7 @@ export type ClineSay = z.infer */ export const toolProgressStatusSchema = z.object({ + id: z.string().optional(), icon: z.string().optional(), text: z.string().optional(), }) @@ -798,7 +860,6 @@ export const toolNames = [ "execute_command", "read_file", "write_to_file", - "append_to_file", "apply_diff", "insert_content", "search_and_replace", diff --git a/evals/pnpm-lock.yaml b/evals/pnpm-lock.yaml index ef2171d29d3..b2acaab60d1 100644 --- a/evals/pnpm-lock.yaml +++ b/evals/pnpm-lock.yaml @@ -9,14 +9,14 @@ importers: .: devDependencies: '@dotenvx/dotenvx': - specifier: ^1.39.1 - version: 1.39.1 + specifier: ^1.41.0 + version: 1.41.0 '@eslint/js': - specifier: ^9.24.0 - version: 9.24.0 + specifier: ^9.25.1 + version: 9.25.1 eslint: - specifier: ^9.24.0 - version: 9.24.0(jiti@2.4.2) + specifier: ^9.25.1 + version: 9.25.1(jiti@2.4.2) globals: specifier: ^16.0.0 version: 16.0.0 @@ -24,17 +24,17 @@ importers: specifier: ^3.5.3 version: 3.5.3 tsx: - specifier: ^4.19.3 - version: 4.19.3 + specifier: ^4.19.4 + version: 4.19.4 turbo: - specifier: ^2.5.0 - version: 2.5.0 + specifier: ^2.5.2 + version: 2.5.2 typescript: specifier: ^5.8.3 version: 5.8.3 typescript-eslint: - specifier: ^8.29.1 - version: 8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + specifier: ^8.31.1 + version: 8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.8.3) apps/cli: dependencies: @@ -231,7 +231,7 @@ importers: version: 5.2.0(eslint@9.22.0(jiti@2.4.2)) eslint-plugin-turbo: specifier: ^2.4.4 - version: 2.4.4(eslint@9.22.0(jiti@2.4.2))(turbo@2.5.0) + version: 2.4.4(eslint@9.22.0(jiti@2.4.2))(turbo@2.5.2) globals: specifier: ^16.0.0 version: 16.0.0 @@ -279,7 +279,7 @@ importers: version: 9.5.2 vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3) + version: 3.0.9(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4) packages/ipc: dependencies: @@ -313,7 +313,7 @@ importers: version: link:../../config/typescript vitest: specifier: ^3.0.9 - version: 3.0.9(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3) + version: 3.0.9(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4) packages/types: dependencies: @@ -346,8 +346,8 @@ packages: resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} engines: {node: '>=6.9.0'} - '@dotenvx/dotenvx@1.39.1': - resolution: {integrity: sha512-FIjEB/s3TSQBYnYA64GPkXJrOR6w5J52SSnl6gSoq1tp+4r9zLjaAsf65AgDv5emA4ypm90gVWv1XX0/bfHA/A==} + '@dotenvx/dotenvx@1.41.0': + resolution: {integrity: sha512-lFZOSKLM2/Jm7FXYUIvnciUhMsuEatyxCgau4lnjDD59LaSYiaNLjyjnUL/aYpH1+iaDhD37+mPOzH9kBZlUJQ==} hasBin: true '@drizzle-team/brocli@0.10.2': @@ -382,6 +382,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.25.3': + resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.18.20': resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -400,6 +406,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.3': + resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.18.20': resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} @@ -418,6 +430,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.3': + resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.18.20': resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} @@ -436,6 +454,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.3': + resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.18.20': resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} @@ -454,6 +478,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.3': + resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.18.20': resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} @@ -472,6 +502,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.3': + resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.18.20': resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} @@ -490,6 +526,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.3': + resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.18.20': resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} @@ -508,6 +550,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.3': + resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.18.20': resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} @@ -526,6 +574,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.3': + resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.18.20': resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} @@ -544,6 +598,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.3': + resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.18.20': resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} @@ -562,6 +622,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.3': + resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.18.20': resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} @@ -580,6 +646,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.3': + resolution: {integrity: sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.18.20': resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} @@ -598,6 +670,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.3': + resolution: {integrity: sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.18.20': resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} @@ -616,6 +694,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.3': + resolution: {integrity: sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.18.20': resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} @@ -634,6 +718,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.3': + resolution: {integrity: sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.18.20': resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} @@ -652,6 +742,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.3': + resolution: {integrity: sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.18.20': resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} @@ -670,12 +766,24 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.3': + resolution: {integrity: sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.1': resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.25.3': + resolution: {integrity: sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.18.20': resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} @@ -694,12 +802,24 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.3': + resolution: {integrity: sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.1': resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.25.3': + resolution: {integrity: sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.18.20': resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} @@ -718,6 +838,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.3': + resolution: {integrity: sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.18.20': resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} @@ -736,6 +862,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.3': + resolution: {integrity: sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.18.20': resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} @@ -754,6 +886,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.3': + resolution: {integrity: sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.18.20': resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} @@ -772,6 +910,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.3': + resolution: {integrity: sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.18.20': resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} @@ -790,12 +934,24 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.3': + resolution: {integrity: sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.5.1': resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.6.1': + resolution: {integrity: sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.12.1': resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -820,6 +976,10 @@ packages: resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@0.13.0': + resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@3.3.0': resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -832,8 +992,8 @@ packages: resolution: {integrity: sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.24.0': - resolution: {integrity: sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==} + '@eslint/js@9.25.1': + resolution: {integrity: sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': @@ -844,6 +1004,10 @@ packages: resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.2.8': + resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@floating-ui/core@1.6.9': resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} @@ -1100,16 +1264,16 @@ packages: cpu: [x64] os: [win32] - '@noble/ciphers@1.2.1': - resolution: {integrity: sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==} + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} engines: {node: ^14.21.3 || >=16} - '@noble/curves@1.8.1': - resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} + '@noble/curves@1.9.0': + resolution: {integrity: sha512-7YDlXiNMdO1YZeH6t/kvopHHbIZzlxrCV9WLqCY6QhcXOoXiNCMDqJIglZ9Yjx5+w7Dz30TITFrlTjnRg7sKEg==} engines: {node: ^14.21.3 || >=16} - '@noble/hashes@1.7.1': - resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} '@nodelib/fs.scandir@2.1.5': @@ -2038,8 +2202,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/eslint-plugin@8.29.1': - resolution: {integrity: sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg==} + '@typescript-eslint/eslint-plugin@8.31.1': + resolution: {integrity: sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -2053,8 +2217,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.29.1': - resolution: {integrity: sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg==} + '@typescript-eslint/parser@8.31.1': + resolution: {integrity: sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2064,8 +2228,8 @@ packages: resolution: {integrity: sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.29.1': - resolution: {integrity: sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA==} + '@typescript-eslint/scope-manager@8.31.1': + resolution: {integrity: sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/type-utils@8.26.1': @@ -2075,8 +2239,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/type-utils@8.29.1': - resolution: {integrity: sha512-DkDUSDwZVCYN71xA4wzySqqcZsHKic53A4BLqmrWFFpOpNSoxX233lwGu/2135ymTCR04PoKiEEEvN1gFYg4Tw==} + '@typescript-eslint/type-utils@8.31.1': + resolution: {integrity: sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2086,8 +2250,8 @@ packages: resolution: {integrity: sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.29.1': - resolution: {integrity: sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ==} + '@typescript-eslint/types@8.31.1': + resolution: {integrity: sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.26.1': @@ -2096,8 +2260,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@8.29.1': - resolution: {integrity: sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g==} + '@typescript-eslint/typescript-estree@8.31.1': + resolution: {integrity: sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' @@ -2109,8 +2273,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.29.1': - resolution: {integrity: sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA==} + '@typescript-eslint/utils@8.31.1': + resolution: {integrity: sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2120,8 +2284,8 @@ packages: resolution: {integrity: sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.29.1': - resolution: {integrity: sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg==} + '@typescript-eslint/visitor-keys@8.31.1': + resolution: {integrity: sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitest/expect@3.0.9': @@ -2467,8 +2631,8 @@ packages: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} - dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + dotenv@16.5.0: + resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} drizzle-kit@0.30.5: @@ -2666,6 +2830,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.25.3: + resolution: {integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -2728,8 +2897,8 @@ packages: jiti: optional: true - eslint@9.24.0: - resolution: {integrity: sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==} + eslint@9.25.1: + resolution: {integrity: sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -2806,8 +2975,8 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fdir@6.4.3: - resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + fdir@6.4.4: + resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -4079,43 +4248,43 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.19.3: - resolution: {integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==} + tsx@4.19.4: + resolution: {integrity: sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q==} engines: {node: '>=18.0.0'} hasBin: true - turbo-darwin-64@2.5.0: - resolution: {integrity: sha512-fP1hhI9zY8hv0idym3hAaXdPi80TLovmGmgZFocVAykFtOxF+GlfIgM/l4iLAV9ObIO4SUXPVWHeBZQQ+Hpjag==} + turbo-darwin-64@2.5.2: + resolution: {integrity: sha512-2aIl0Sx230nLk+Cg2qSVxvPOBWCZpwKNuAMKoROTvWKif6VMpkWWiR9XEPoz7sHeLmCOed4GYGMjL1bqAiIS/g==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.5.0: - resolution: {integrity: sha512-p9sYq7kXH7qeJwIQE86cOWv/xNqvow846l6c/qWc26Ib1ci5W7V0sI5thsrP3eH+VA0d+SHalTKg5SQXgNQBWA==} + turbo-darwin-arm64@2.5.2: + resolution: {integrity: sha512-MrFYhK/jYu8N6QlqZtqSHi3e4QVxlzqU3ANHTKn3/tThuwTLbNHEvzBPWSj5W7nZcM58dCqi6gYrfRz6bJZyAA==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.5.0: - resolution: {integrity: sha512-1iEln2GWiF3iPPPS1HQJT6ZCFXynJPd89gs9SkggH2EJsj3eRUSVMmMC8y6d7bBbhBFsiGGazwFIYrI12zs6uQ==} + turbo-linux-64@2.5.2: + resolution: {integrity: sha512-LxNqUE2HmAJQ/8deoLgMUDzKxd5bKxqH0UBogWa+DF+JcXhtze3UTMr6lEr0dEofdsEUYK1zg8FRjglmwlN5YA==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.5.0: - resolution: {integrity: sha512-bKBcbvuQHmsX116KcxHJuAcppiiBOfivOObh2O5aXNER6mce7YDDQJy00xQQNp1DhEfcSV2uOsvb3O3nN2cbcA==} + turbo-linux-arm64@2.5.2: + resolution: {integrity: sha512-0MI1Ao1q8zhd+UUbIEsrM+yLq1BsrcJQRGZkxIsHFlGp7WQQH1oR3laBgfnUCNdCotCMD6w4moc9pUbXdOR3bg==} cpu: [arm64] os: [linux] - turbo-windows-64@2.5.0: - resolution: {integrity: sha512-9BCo8oQ7BO7J0K913Czbc3tw8QwLqn2nTe4E47k6aVYkM12ASTScweXPTuaPFP5iYXAT6z5Dsniw704Ixa5eGg==} + turbo-windows-64@2.5.2: + resolution: {integrity: sha512-hOLcbgZzE5ttACHHyc1ajmWYq4zKT42IC3G6XqgiXxMbS+4eyVYTL+7UvCZBd3Kca1u4TLQdLQjeO76zyDJc2A==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.5.0: - resolution: {integrity: sha512-OUHCV+ueXa3UzfZ4co/ueIHgeq9B2K48pZwIxKSm5VaLVuv8M13MhM7unukW09g++dpdrrE1w4IOVgxKZ0/exg==} + turbo-windows-arm64@2.5.2: + resolution: {integrity: sha512-fMU41ABhSLa18H8V3Z7BMCGynQ8x+wj9WyBMvWm1jeyRKgkvUYJsO2vkIsy8m0vrwnIeVXKOIn6eSe1ddlBVqw==} cpu: [arm64] os: [win32] - turbo@2.5.0: - resolution: {integrity: sha512-PvSRruOsitjy6qdqwIIyolv99+fEn57gP6gn4zhsHTEcCYgXPhv6BAxzAjleS8XKpo+Y582vTTA9nuqYDmbRuA==} + turbo@2.5.2: + resolution: {integrity: sha512-Qo5lfuStr6LQh3sPQl7kIi243bGU4aHGDQJUf6ylAdGwks30jJFloc9NYHP7Y373+gGU9OS0faA4Mb5Sy8X9Xw==} hasBin: true type-check@0.4.0: @@ -4145,8 +4314,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - typescript-eslint@8.29.1: - resolution: {integrity: sha512-f8cDkvndhbQMPcysk6CUSGBWV+g1utqdn71P5YKwMumVMOG/5k7cHq0KyG4O52nB0oKS4aN2Tp5+wB4APJGC+w==} + typescript-eslint@8.31.1: + resolution: {integrity: sha512-j6DsEotD/fH39qKzXTQRwYYWlt7D+0HmfpOK+DVhwJOFLcdmn92hq3mBb7HlKJHbjjI/gTOqEcc9d6JfpFf/VA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -4397,13 +4566,13 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - '@dotenvx/dotenvx@1.39.1': + '@dotenvx/dotenvx@1.41.0': dependencies: commander: 11.1.0 - dotenv: 16.4.7 + dotenv: 16.5.0 eciesjs: 0.4.14 execa: 5.1.1 - fdir: 6.4.3(picomatch@4.0.2) + fdir: 6.4.4(picomatch@4.0.2) ignore: 5.3.2 object-treeify: 1.1.33 picomatch: 4.0.2 @@ -4411,9 +4580,9 @@ snapshots: '@drizzle-team/brocli@0.10.2': {} - '@ecies/ciphers@0.2.3(@noble/ciphers@1.2.1)': + '@ecies/ciphers@0.2.3(@noble/ciphers@1.3.0)': dependencies: - '@noble/ciphers': 1.2.1 + '@noble/ciphers': 1.3.0 '@emnapi/runtime@1.3.1': dependencies: @@ -4436,6 +4605,9 @@ snapshots: '@esbuild/aix-ppc64@0.25.1': optional: true + '@esbuild/aix-ppc64@0.25.3': + optional: true + '@esbuild/android-arm64@0.18.20': optional: true @@ -4445,6 +4617,9 @@ snapshots: '@esbuild/android-arm64@0.25.1': optional: true + '@esbuild/android-arm64@0.25.3': + optional: true + '@esbuild/android-arm@0.18.20': optional: true @@ -4454,6 +4629,9 @@ snapshots: '@esbuild/android-arm@0.25.1': optional: true + '@esbuild/android-arm@0.25.3': + optional: true + '@esbuild/android-x64@0.18.20': optional: true @@ -4463,6 +4641,9 @@ snapshots: '@esbuild/android-x64@0.25.1': optional: true + '@esbuild/android-x64@0.25.3': + optional: true + '@esbuild/darwin-arm64@0.18.20': optional: true @@ -4472,6 +4653,9 @@ snapshots: '@esbuild/darwin-arm64@0.25.1': optional: true + '@esbuild/darwin-arm64@0.25.3': + optional: true + '@esbuild/darwin-x64@0.18.20': optional: true @@ -4481,6 +4665,9 @@ snapshots: '@esbuild/darwin-x64@0.25.1': optional: true + '@esbuild/darwin-x64@0.25.3': + optional: true + '@esbuild/freebsd-arm64@0.18.20': optional: true @@ -4490,6 +4677,9 @@ snapshots: '@esbuild/freebsd-arm64@0.25.1': optional: true + '@esbuild/freebsd-arm64@0.25.3': + optional: true + '@esbuild/freebsd-x64@0.18.20': optional: true @@ -4499,6 +4689,9 @@ snapshots: '@esbuild/freebsd-x64@0.25.1': optional: true + '@esbuild/freebsd-x64@0.25.3': + optional: true + '@esbuild/linux-arm64@0.18.20': optional: true @@ -4508,6 +4701,9 @@ snapshots: '@esbuild/linux-arm64@0.25.1': optional: true + '@esbuild/linux-arm64@0.25.3': + optional: true + '@esbuild/linux-arm@0.18.20': optional: true @@ -4517,6 +4713,9 @@ snapshots: '@esbuild/linux-arm@0.25.1': optional: true + '@esbuild/linux-arm@0.25.3': + optional: true + '@esbuild/linux-ia32@0.18.20': optional: true @@ -4526,6 +4725,9 @@ snapshots: '@esbuild/linux-ia32@0.25.1': optional: true + '@esbuild/linux-ia32@0.25.3': + optional: true + '@esbuild/linux-loong64@0.18.20': optional: true @@ -4535,6 +4737,9 @@ snapshots: '@esbuild/linux-loong64@0.25.1': optional: true + '@esbuild/linux-loong64@0.25.3': + optional: true + '@esbuild/linux-mips64el@0.18.20': optional: true @@ -4544,6 +4749,9 @@ snapshots: '@esbuild/linux-mips64el@0.25.1': optional: true + '@esbuild/linux-mips64el@0.25.3': + optional: true + '@esbuild/linux-ppc64@0.18.20': optional: true @@ -4553,6 +4761,9 @@ snapshots: '@esbuild/linux-ppc64@0.25.1': optional: true + '@esbuild/linux-ppc64@0.25.3': + optional: true + '@esbuild/linux-riscv64@0.18.20': optional: true @@ -4562,6 +4773,9 @@ snapshots: '@esbuild/linux-riscv64@0.25.1': optional: true + '@esbuild/linux-riscv64@0.25.3': + optional: true + '@esbuild/linux-s390x@0.18.20': optional: true @@ -4571,6 +4785,9 @@ snapshots: '@esbuild/linux-s390x@0.25.1': optional: true + '@esbuild/linux-s390x@0.25.3': + optional: true + '@esbuild/linux-x64@0.18.20': optional: true @@ -4580,9 +4797,15 @@ snapshots: '@esbuild/linux-x64@0.25.1': optional: true + '@esbuild/linux-x64@0.25.3': + optional: true + '@esbuild/netbsd-arm64@0.25.1': optional: true + '@esbuild/netbsd-arm64@0.25.3': + optional: true + '@esbuild/netbsd-x64@0.18.20': optional: true @@ -4592,9 +4815,15 @@ snapshots: '@esbuild/netbsd-x64@0.25.1': optional: true + '@esbuild/netbsd-x64@0.25.3': + optional: true + '@esbuild/openbsd-arm64@0.25.1': optional: true + '@esbuild/openbsd-arm64@0.25.3': + optional: true + '@esbuild/openbsd-x64@0.18.20': optional: true @@ -4604,6 +4833,9 @@ snapshots: '@esbuild/openbsd-x64@0.25.1': optional: true + '@esbuild/openbsd-x64@0.25.3': + optional: true + '@esbuild/sunos-x64@0.18.20': optional: true @@ -4613,6 +4845,9 @@ snapshots: '@esbuild/sunos-x64@0.25.1': optional: true + '@esbuild/sunos-x64@0.25.3': + optional: true + '@esbuild/win32-arm64@0.18.20': optional: true @@ -4622,6 +4857,9 @@ snapshots: '@esbuild/win32-arm64@0.25.1': optional: true + '@esbuild/win32-arm64@0.25.3': + optional: true + '@esbuild/win32-ia32@0.18.20': optional: true @@ -4631,6 +4869,9 @@ snapshots: '@esbuild/win32-ia32@0.25.1': optional: true + '@esbuild/win32-ia32@0.25.3': + optional: true + '@esbuild/win32-x64@0.18.20': optional: true @@ -4640,14 +4881,22 @@ snapshots: '@esbuild/win32-x64@0.25.1': optional: true + '@esbuild/win32-x64@0.25.3': + optional: true + '@eslint-community/eslint-utils@4.5.1(eslint@9.22.0(jiti@2.4.2))': dependencies: eslint: 9.22.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.5.1(eslint@9.24.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.6.1(eslint@9.22.0(jiti@2.4.2))': + dependencies: + eslint: 9.22.0(jiti@2.4.2) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.6.1(eslint@9.25.1(jiti@2.4.2))': dependencies: - eslint: 9.24.0(jiti@2.4.2) + eslint: 9.25.1(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -4676,6 +4925,10 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 + '@eslint/core@0.13.0': + dependencies: + '@types/json-schema': 7.0.15 + '@eslint/eslintrc@3.3.0': dependencies: ajv: 6.12.6 @@ -4706,7 +4959,7 @@ snapshots: '@eslint/js@9.22.0': {} - '@eslint/js@9.24.0': {} + '@eslint/js@9.25.1': {} '@eslint/object-schema@2.1.6': {} @@ -4715,6 +4968,11 @@ snapshots: '@eslint/core': 0.12.0 levn: 0.4.1 + '@eslint/plugin-kit@0.2.8': + dependencies: + '@eslint/core': 0.13.0 + levn: 0.4.1 + '@floating-ui/core@1.6.9': dependencies: '@floating-ui/utils': 0.2.9 @@ -4915,13 +5173,13 @@ snapshots: '@next/swc-win32-x64-msvc@15.2.2': optional: true - '@noble/ciphers@1.2.1': {} + '@noble/ciphers@1.3.0': {} - '@noble/curves@1.8.1': + '@noble/curves@1.9.0': dependencies: - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.8.0 - '@noble/hashes@1.7.1': {} + '@noble/hashes@1.8.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -5775,15 +6033,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.25.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.29.1 - '@typescript-eslint/type-utils': 8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.29.1 - eslint: 9.24.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.31.1 + '@typescript-eslint/type-utils': 8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.31.1 + eslint: 9.25.1(jiti@2.4.2) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -5804,14 +6062,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/parser@8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.29.1 - '@typescript-eslint/types': 8.29.1 - '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.29.1 + '@typescript-eslint/scope-manager': 8.31.1 + '@typescript-eslint/types': 8.31.1 + '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.31.1 debug: 4.4.0 - eslint: 9.24.0(jiti@2.4.2) + eslint: 9.25.1(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -5821,10 +6079,10 @@ snapshots: '@typescript-eslint/types': 8.26.1 '@typescript-eslint/visitor-keys': 8.26.1 - '@typescript-eslint/scope-manager@8.29.1': + '@typescript-eslint/scope-manager@8.31.1': dependencies: - '@typescript-eslint/types': 8.29.1 - '@typescript-eslint/visitor-keys': 8.29.1 + '@typescript-eslint/types': 8.31.1 + '@typescript-eslint/visitor-keys': 8.31.1 '@typescript-eslint/type-utils@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)': dependencies: @@ -5837,12 +6095,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.8.3) debug: 4.4.0 - eslint: 9.24.0(jiti@2.4.2) + eslint: 9.25.1(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -5850,7 +6108,7 @@ snapshots: '@typescript-eslint/types@8.26.1': {} - '@typescript-eslint/types@8.29.1': {} + '@typescript-eslint/types@8.31.1': {} '@typescript-eslint/typescript-estree@8.26.1(typescript@5.8.2)': dependencies: @@ -5866,10 +6124,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.29.1(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.31.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.29.1 - '@typescript-eslint/visitor-keys': 8.29.1 + '@typescript-eslint/types': 8.31.1 + '@typescript-eslint/visitor-keys': 8.31.1 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -5882,7 +6140,7 @@ snapshots: '@typescript-eslint/utils@8.26.1(eslint@9.22.0(jiti@2.4.2))(typescript@5.8.2)': dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.6.1(eslint@9.22.0(jiti@2.4.2)) '@typescript-eslint/scope-manager': 8.26.1 '@typescript-eslint/types': 8.26.1 '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.8.2) @@ -5891,13 +6149,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/utils@8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.29.1 - '@typescript-eslint/types': 8.29.1 - '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.8.3) - eslint: 9.24.0(jiti@2.4.2) + '@eslint-community/eslint-utils': 4.6.1(eslint@9.25.1(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.31.1 + '@typescript-eslint/types': 8.31.1 + '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.8.3) + eslint: 9.25.1(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -5907,9 +6165,9 @@ snapshots: '@typescript-eslint/types': 8.26.1 eslint-visitor-keys: 4.2.0 - '@typescript-eslint/visitor-keys@8.29.1': + '@typescript-eslint/visitor-keys@8.31.1': dependencies: - '@typescript-eslint/types': 8.29.1 + '@typescript-eslint/types': 8.31.1 eslint-visitor-keys: 4.2.0 '@vitest/expect@3.0.9': @@ -5919,13 +6177,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.9(vite@6.2.3(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3))': + '@vitest/mocker@3.0.9(vite@6.2.3(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4))': dependencies: '@vitest/spy': 3.0.9 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.3(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3) + vite: 6.2.3(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4) '@vitest/pretty-format@3.0.9': dependencies: @@ -6305,7 +6563,7 @@ snapshots: dotenv@16.0.3: {} - dotenv@16.4.7: {} + dotenv@16.5.0: {} drizzle-kit@0.30.5: dependencies: @@ -6339,10 +6597,10 @@ snapshots: eciesjs@0.4.14: dependencies: - '@ecies/ciphers': 0.2.3(@noble/ciphers@1.2.1) - '@noble/ciphers': 1.2.1 - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 + '@ecies/ciphers': 0.2.3(@noble/ciphers@1.3.0) + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.0 + '@noble/hashes': 1.8.0 ejs@3.1.8: dependencies: @@ -6555,6 +6813,34 @@ snapshots: '@esbuild/win32-ia32': 0.25.1 '@esbuild/win32-x64': 0.25.1 + esbuild@0.25.3: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.3 + '@esbuild/android-arm': 0.25.3 + '@esbuild/android-arm64': 0.25.3 + '@esbuild/android-x64': 0.25.3 + '@esbuild/darwin-arm64': 0.25.3 + '@esbuild/darwin-x64': 0.25.3 + '@esbuild/freebsd-arm64': 0.25.3 + '@esbuild/freebsd-x64': 0.25.3 + '@esbuild/linux-arm': 0.25.3 + '@esbuild/linux-arm64': 0.25.3 + '@esbuild/linux-ia32': 0.25.3 + '@esbuild/linux-loong64': 0.25.3 + '@esbuild/linux-mips64el': 0.25.3 + '@esbuild/linux-ppc64': 0.25.3 + '@esbuild/linux-riscv64': 0.25.3 + '@esbuild/linux-s390x': 0.25.3 + '@esbuild/linux-x64': 0.25.3 + '@esbuild/netbsd-arm64': 0.25.3 + '@esbuild/netbsd-x64': 0.25.3 + '@esbuild/openbsd-arm64': 0.25.3 + '@esbuild/openbsd-x64': 0.25.3 + '@esbuild/sunos-x64': 0.25.3 + '@esbuild/win32-arm64': 0.25.3 + '@esbuild/win32-ia32': 0.25.3 + '@esbuild/win32-x64': 0.25.3 + escalade@3.2.0: {} escape-string-regexp@1.0.5: {} @@ -6593,11 +6879,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.4.4(eslint@9.22.0(jiti@2.4.2))(turbo@2.5.0): + eslint-plugin-turbo@2.4.4(eslint@9.22.0(jiti@2.4.2))(turbo@2.5.2): dependencies: dotenv: 16.0.3 eslint: 9.22.0(jiti@2.4.2) - turbo: 2.5.0 + turbo: 2.5.2 eslint-scope@8.3.0: dependencies: @@ -6650,20 +6936,20 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@9.24.0(jiti@2.4.2): + eslint@9.25.1(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.6.1(eslint@9.25.1(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.20.0 '@eslint/config-helpers': 0.2.1 - '@eslint/core': 0.12.0 + '@eslint/core': 0.13.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.24.0 - '@eslint/plugin-kit': 0.2.7 + '@eslint/js': 9.25.1 + '@eslint/plugin-kit': 0.2.8 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.2 - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 @@ -6710,7 +6996,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 esutils@2.0.3: {} @@ -6788,7 +7074,7 @@ snapshots: dependencies: reusify: 1.1.0 - fdir@6.4.3(picomatch@4.0.2): + fdir@6.4.4(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -8098,39 +8384,39 @@ snapshots: tslib@2.8.1: {} - tsx@4.19.3: + tsx@4.19.4: dependencies: - esbuild: 0.25.1 + esbuild: 0.25.3 get-tsconfig: 4.10.0 optionalDependencies: fsevents: 2.3.3 - turbo-darwin-64@2.5.0: + turbo-darwin-64@2.5.2: optional: true - turbo-darwin-arm64@2.5.0: + turbo-darwin-arm64@2.5.2: optional: true - turbo-linux-64@2.5.0: + turbo-linux-64@2.5.2: optional: true - turbo-linux-arm64@2.5.0: + turbo-linux-arm64@2.5.2: optional: true - turbo-windows-64@2.5.0: + turbo-windows-64@2.5.2: optional: true - turbo-windows-arm64@2.5.0: + turbo-windows-arm64@2.5.2: optional: true - turbo@2.5.0: + turbo@2.5.2: optionalDependencies: - turbo-darwin-64: 2.5.0 - turbo-darwin-arm64: 2.5.0 - turbo-linux-64: 2.5.0 - turbo-linux-arm64: 2.5.0 - turbo-windows-64: 2.5.0 - turbo-windows-arm64: 2.5.0 + turbo-darwin-64: 2.5.2 + turbo-darwin-arm64: 2.5.2 + turbo-linux-64: 2.5.2 + turbo-linux-arm64: 2.5.2 + turbo-windows-64: 2.5.2 + turbo-windows-arm64: 2.5.2 type-check@0.4.0: dependencies: @@ -8179,12 +8465,12 @@ snapshots: transitivePeerDependencies: - supports-color - typescript-eslint@8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3): + typescript-eslint@8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': 8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.29.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.24.0(jiti@2.4.2) + '@typescript-eslint/eslint-plugin': 8.31.1(@typescript-eslint/parser@8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.25.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.31.1(eslint@9.25.1(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.25.1(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -8236,13 +8522,13 @@ snapshots: - '@types/react' - '@types/react-dom' - vite-node@3.0.9(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3): + vite-node@3.0.9(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.3(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3) + vite: 6.2.3(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4) transitivePeerDependencies: - '@types/node' - jiti @@ -8257,7 +8543,7 @@ snapshots: - tsx - yaml - vite@6.2.3(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3): + vite@6.2.3(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4): dependencies: esbuild: 0.25.1 postcss: 8.5.3 @@ -8267,12 +8553,12 @@ snapshots: fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.29.2 - tsx: 4.19.3 + tsx: 4.19.4 - vitest@3.0.9(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3): + vitest@3.0.9(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4): dependencies: '@vitest/expect': 3.0.9 - '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3)) + '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4)) '@vitest/pretty-format': 3.0.9 '@vitest/runner': 3.0.9 '@vitest/snapshot': 3.0.9 @@ -8288,8 +8574,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.3(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3) - vite-node: 3.0.9(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.3) + vite: 6.2.3(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4) + vite-node: 3.0.9(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(tsx@4.19.4) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.17.24 diff --git a/src/schemas/index.ts b/src/schemas/index.ts index 202dbff01a6..e241674b867 100644 --- a/src/schemas/index.ts +++ b/src/schemas/index.ts @@ -851,6 +851,10 @@ export const tokenUsageSchema = z.object({ export type TokenUsage = z.infer +/** + * ToolName + */ + export const toolNames = [ "execute_command", "read_file", From be387fa948edd89b1bf7a327df32814e657a42b8 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Thu, 1 May 2025 11:19:12 -0700 Subject: [PATCH 09/29] Update CHANGELOG.md (#3076) --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6eec06de640..14634c44516 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ - Make retries respect the global auto approve checkbox - Fix a selection mode bug in the history view (thanks @jr) -## 3.15.0 - 2025-04-30 +## [3.15.0] - 2025-04-30 - Add prompt caching to the Google Vertex provider (thanks @ashktn) - Add a fallback mechanism for executing terminal commands if VSCode terminal shell integration fails From 2d8beb2ed03ca8b8d0d101ce3bf4247d7cccefc6 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Thu, 1 May 2025 23:11:32 -0400 Subject: [PATCH 10/29] Telemetry for title button clicks (#3108) --- src/activate/registerCommands.ts | 19 ++++++++++++++++++- src/services/telemetry/TelemetryService.ts | 8 ++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/activate/registerCommands.ts b/src/activate/registerCommands.ts index ffb419ddfd1..b6d2edb00d4 100644 --- a/src/activate/registerCommands.ts +++ b/src/activate/registerCommands.ts @@ -3,6 +3,7 @@ import delay from "delay" import { ClineProvider } from "../core/webview/ClineProvider" import { ContextProxy } from "../core/config/ContextProxy" +import { telemetryService } from "../services/telemetry/TelemetryService" import { registerHumanRelayCallback, unregisterHumanRelayCallback, handleHumanRelayResponse } from "./humanRelay" import { handleNewTask } from "./handleTask" @@ -71,6 +72,8 @@ const getCommandsMap = ({ context, outputChannel, provider }: RegisterCommandOpt return } + telemetryService.captureTitleButtonClicked("plus") + await visibleProvider.removeClineFromStack() await visibleProvider.postStateToWebview() await visibleProvider.postMessageToWebview({ type: "action", action: "chatButtonClicked" }) @@ -82,6 +85,8 @@ const getCommandsMap = ({ context, outputChannel, provider }: RegisterCommandOpt return } + telemetryService.captureTitleButtonClicked("mcp") + visibleProvider.postMessageToWebview({ type: "action", action: "mcpButtonClicked" }) }, "roo-cline.promptsButtonClicked": () => { @@ -91,9 +96,15 @@ const getCommandsMap = ({ context, outputChannel, provider }: RegisterCommandOpt return } + telemetryService.captureTitleButtonClicked("prompts") + visibleProvider.postMessageToWebview({ type: "action", action: "promptsButtonClicked" }) }, - "roo-cline.popoutButtonClicked": () => openClineInNewTab({ context, outputChannel }), + "roo-cline.popoutButtonClicked": () => { + telemetryService.captureTitleButtonClicked("popout") + + return openClineInNewTab({ context, outputChannel }) + }, "roo-cline.openInNewTab": () => openClineInNewTab({ context, outputChannel }), "roo-cline.settingsButtonClicked": () => { const visibleProvider = getVisibleProviderOrLog(outputChannel) @@ -102,6 +113,8 @@ const getCommandsMap = ({ context, outputChannel, provider }: RegisterCommandOpt return } + telemetryService.captureTitleButtonClicked("settings") + visibleProvider.postMessageToWebview({ type: "action", action: "settingsButtonClicked" }) }, "roo-cline.historyButtonClicked": () => { @@ -111,9 +124,13 @@ const getCommandsMap = ({ context, outputChannel, provider }: RegisterCommandOpt return } + telemetryService.captureTitleButtonClicked("history") + visibleProvider.postMessageToWebview({ type: "action", action: "historyButtonClicked" }) }, "roo-cline.helpButtonClicked": () => { + telemetryService.captureTitleButtonClicked("help") + vscode.env.openExternal(vscode.Uri.parse("https://docs.roocode.com")) }, "roo-cline.showHumanRelayDialog": (params: { requestId: string; promptText: string }) => { diff --git a/src/services/telemetry/TelemetryService.ts b/src/services/telemetry/TelemetryService.ts index 031456f62e4..37423542b09 100644 --- a/src/services/telemetry/TelemetryService.ts +++ b/src/services/telemetry/TelemetryService.ts @@ -145,6 +145,14 @@ class TelemetryService { this.captureEvent(PostHogClient.EVENTS.ERRORS.CONSECUTIVE_MISTAKE_ERROR, { taskId }) } + /** + * Captures a title button click event + * @param button The button that was clicked + */ + public captureTitleButtonClicked(button: string): void { + this.captureEvent("Title Button Clicked", { button }) + } + /** * Checks if telemetry is currently enabled * @returns Whether telemetry is enabled From a356d7066915eff3bc9f1c8188ae4425a6fa7c94 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Thu, 1 May 2025 23:30:57 -0400 Subject: [PATCH 11/29] Customizable headers for the OpenAI-compatible provider (#3056) * Customizable headers for the OpenAI-compatible provider * PR feedback * Fix migration * Update webview-ui/src/components/settings/ApiOptions.tsx Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --------- Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --- src/api/providers/openai.ts | 28 ++-- src/core/config/ContextProxy.ts | 10 ++ src/core/config/ProviderSettingsManager.ts | 33 ++++ .../__tests__/ProviderSettingsManager.test.ts | 1 + src/core/webview/webviewMessageHandler.ts | 2 +- src/exports/roo-code.d.ts | 7 +- src/exports/types.ts | 7 +- src/schemas/index.ts | 6 +- .../src/components/settings/ApiOptions.tsx | 148 +++++++++++++++--- webview-ui/src/i18n/locales/ca/settings.json | 8 +- webview-ui/src/i18n/locales/de/settings.json | 8 +- webview-ui/src/i18n/locales/en/settings.json | 8 +- webview-ui/src/i18n/locales/es/settings.json | 8 +- webview-ui/src/i18n/locales/fr/settings.json | 8 +- webview-ui/src/i18n/locales/hi/settings.json | 8 +- webview-ui/src/i18n/locales/it/settings.json | 8 +- webview-ui/src/i18n/locales/ja/settings.json | 8 +- webview-ui/src/i18n/locales/ko/settings.json | 8 +- webview-ui/src/i18n/locales/pl/settings.json | 8 +- .../src/i18n/locales/pt-BR/settings.json | 8 +- webview-ui/src/i18n/locales/ru/settings.json | 8 +- webview-ui/src/i18n/locales/tr/settings.json | 8 +- webview-ui/src/i18n/locales/vi/settings.json | 8 +- .../src/i18n/locales/zh-CN/settings.json | 8 +- .../src/i18n/locales/zh-TW/settings.json | 8 +- 25 files changed, 312 insertions(+), 58 deletions(-) diff --git a/src/api/providers/openai.ts b/src/api/providers/openai.ts index 10cc5e40cd4..64932b03921 100644 --- a/src/api/providers/openai.ts +++ b/src/api/providers/openai.ts @@ -35,12 +35,17 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl const urlHost = this._getUrlHost(this.options.openAiBaseUrl) const isAzureOpenAi = urlHost === "azure.com" || urlHost.endsWith(".azure.com") || options.openAiUseAzure + const headers = { + ...DEFAULT_HEADERS, + ...(this.options.openAiHeaders || {}), + } + if (isAzureAiInference) { // Azure AI Inference Service (e.g., for DeepSeek) uses a different path structure this.client = new OpenAI({ baseURL, apiKey, - defaultHeaders: DEFAULT_HEADERS, + defaultHeaders: headers, defaultQuery: { "api-version": this.options.azureApiVersion || "2024-05-01-preview" }, }) } else if (isAzureOpenAi) { @@ -50,19 +55,13 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl baseURL, apiKey, apiVersion: this.options.azureApiVersion || azureOpenAiDefaultApiVersion, - defaultHeaders: { - ...DEFAULT_HEADERS, - ...(this.options.openAiHostHeader ? { Host: this.options.openAiHostHeader } : {}), - }, + defaultHeaders: headers, }) } else { this.client = new OpenAI({ baseURL, apiKey, - defaultHeaders: { - ...DEFAULT_HEADERS, - ...(this.options.openAiHostHeader ? { Host: this.options.openAiHostHeader } : {}), - }, + defaultHeaders: headers, }) } } @@ -361,7 +360,7 @@ export class OpenAiHandler extends BaseProvider implements SingleCompletionHandl } } -export async function getOpenAiModels(baseUrl?: string, apiKey?: string, hostHeader?: string) { +export async function getOpenAiModels(baseUrl?: string, apiKey?: string, openAiHeaders?: Record) { try { if (!baseUrl) { return [] @@ -372,16 +371,15 @@ export async function getOpenAiModels(baseUrl?: string, apiKey?: string, hostHea } const config: Record = {} - const headers: Record = {} + const headers: Record = { + ...DEFAULT_HEADERS, + ...(openAiHeaders || {}), + } if (apiKey) { headers["Authorization"] = `Bearer ${apiKey}` } - if (hostHeader) { - headers["Host"] = hostHeader - } - if (Object.keys(headers).length > 0) { config["headers"] = headers } diff --git a/src/core/config/ContextProxy.ts b/src/core/config/ContextProxy.ts index 6b017503d5e..c2373ccad20 100644 --- a/src/core/config/ContextProxy.ts +++ b/src/core/config/ContextProxy.ts @@ -192,6 +192,16 @@ export class ContextProxy { // If a value is not present in the new configuration, then it is assumed // that the setting's value should be `undefined` and therefore we // need to remove it from the state cache if it exists. + + // Ensure openAiHeaders is always an object even when empty + // This is critical for proper serialization/deserialization through IPC + if (values.openAiHeaders !== undefined) { + // Check if it's empty or null + if (!values.openAiHeaders || Object.keys(values.openAiHeaders).length === 0) { + values.openAiHeaders = {} + } + } + await this.setValues({ ...PROVIDER_SETTINGS_KEYS.filter((key) => !isSecretStateKey(key)) .filter((key) => !!this.stateCache[key]) diff --git a/src/core/config/ProviderSettingsManager.ts b/src/core/config/ProviderSettingsManager.ts index 7df34e7844a..ca53cba8892 100644 --- a/src/core/config/ProviderSettingsManager.ts +++ b/src/core/config/ProviderSettingsManager.ts @@ -17,6 +17,7 @@ export const providerProfilesSchema = z.object({ .object({ rateLimitSecondsMigrated: z.boolean().optional(), diffSettingsMigrated: z.boolean().optional(), + openAiHeadersMigrated: z.boolean().optional(), }) .optional(), }) @@ -38,6 +39,7 @@ export class ProviderSettingsManager { migrations: { rateLimitSecondsMigrated: true, // Mark as migrated on fresh installs diffSettingsMigrated: true, // Mark as migrated on fresh installs + openAiHeadersMigrated: true, // Mark as migrated on fresh installs }, } @@ -90,6 +92,7 @@ export class ProviderSettingsManager { providerProfiles.migrations = { rateLimitSecondsMigrated: false, diffSettingsMigrated: false, + openAiHeadersMigrated: false, } // Initialize with default values isDirty = true } @@ -106,6 +109,12 @@ export class ProviderSettingsManager { isDirty = true } + if (!providerProfiles.migrations.openAiHeadersMigrated) { + await this.migrateOpenAiHeaders(providerProfiles) + providerProfiles.migrations.openAiHeadersMigrated = true + isDirty = true + } + if (isDirty) { await this.store(providerProfiles) } @@ -175,6 +184,30 @@ export class ProviderSettingsManager { } } + private async migrateOpenAiHeaders(providerProfiles: ProviderProfiles) { + try { + for (const [_name, apiConfig] of Object.entries(providerProfiles.apiConfigs)) { + // Use type assertion to access the deprecated property safely + const configAny = apiConfig as any + + // Check if openAiHostHeader exists but openAiHeaders doesn't + if ( + configAny.openAiHostHeader && + (!apiConfig.openAiHeaders || Object.keys(apiConfig.openAiHeaders || {}).length === 0) + ) { + // Create the headers object with the Host value + apiConfig.openAiHeaders = { Host: configAny.openAiHostHeader } + + // Delete the old property to prevent re-migration + // This prevents the header from reappearing after deletion + configAny.openAiHostHeader = undefined + } + } + } catch (error) { + console.error(`[MigrateOpenAiHeaders] Failed to migrate OpenAI headers:`, error) + } + } + /** * List all available configs with metadata. */ diff --git a/src/core/config/__tests__/ProviderSettingsManager.test.ts b/src/core/config/__tests__/ProviderSettingsManager.test.ts index ade40c29d38..3cacc4c8b72 100644 --- a/src/core/config/__tests__/ProviderSettingsManager.test.ts +++ b/src/core/config/__tests__/ProviderSettingsManager.test.ts @@ -56,6 +56,7 @@ describe("ProviderSettingsManager", () => { migrations: { rateLimitSecondsMigrated: true, diffSettingsMigrated: true, + openAiHeadersMigrated: true, }, }), ) diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 94bd68f9c94..cee8ec76182 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -310,7 +310,7 @@ export const webviewMessageHandler = async (provider: ClineProvider, message: We const openAiModels = await getOpenAiModels( message?.values?.baseUrl, message?.values?.apiKey, - message?.values?.hostHeader, + message?.values?.openAiHeaders, ) provider.postMessageToWebview({ type: "openAiModels", openAiModels }) diff --git a/src/exports/roo-code.d.ts b/src/exports/roo-code.d.ts index 71902841b0c..70376cf9483 100644 --- a/src/exports/roo-code.d.ts +++ b/src/exports/roo-code.d.ts @@ -50,7 +50,6 @@ type ProviderSettings = { vertexRegion?: string | undefined openAiBaseUrl?: string | undefined openAiApiKey?: string | undefined - openAiHostHeader?: string | undefined openAiLegacyFormat?: boolean | undefined openAiR1FormatEnabled?: boolean | undefined openAiModelId?: string | undefined @@ -88,6 +87,12 @@ type ProviderSettings = { azureApiVersion?: string | undefined openAiStreamingEnabled?: boolean | undefined enableReasoningEffort?: boolean | undefined + openAiHostHeader?: string | undefined + openAiHeaders?: + | { + [x: string]: string + } + | undefined ollamaModelId?: string | undefined ollamaBaseUrl?: string | undefined vsCodeLmModelSelector?: diff --git a/src/exports/types.ts b/src/exports/types.ts index d3e7059f7c9..c2da70391f2 100644 --- a/src/exports/types.ts +++ b/src/exports/types.ts @@ -51,7 +51,6 @@ type ProviderSettings = { vertexRegion?: string | undefined openAiBaseUrl?: string | undefined openAiApiKey?: string | undefined - openAiHostHeader?: string | undefined openAiLegacyFormat?: boolean | undefined openAiR1FormatEnabled?: boolean | undefined openAiModelId?: string | undefined @@ -89,6 +88,12 @@ type ProviderSettings = { azureApiVersion?: string | undefined openAiStreamingEnabled?: boolean | undefined enableReasoningEffort?: boolean | undefined + openAiHostHeader?: string | undefined + openAiHeaders?: + | { + [x: string]: string + } + | undefined ollamaModelId?: string | undefined ollamaBaseUrl?: string | undefined vsCodeLmModelSelector?: diff --git a/src/schemas/index.ts b/src/schemas/index.ts index e241674b867..772832990d1 100644 --- a/src/schemas/index.ts +++ b/src/schemas/index.ts @@ -370,7 +370,6 @@ export const providerSettingsSchema = z.object({ // OpenAI openAiBaseUrl: z.string().optional(), openAiApiKey: z.string().optional(), - openAiHostHeader: z.string().optional(), openAiLegacyFormat: z.boolean().optional(), openAiR1FormatEnabled: z.boolean().optional(), openAiModelId: z.string().optional(), @@ -379,6 +378,8 @@ export const providerSettingsSchema = z.object({ azureApiVersion: z.string().optional(), openAiStreamingEnabled: z.boolean().optional(), enableReasoningEffort: z.boolean().optional(), + openAiHostHeader: z.string().optional(), // Keep temporarily for backward compatibility during migration + openAiHeaders: z.record(z.string(), z.string()).optional(), // Ollama ollamaModelId: z.string().optional(), ollamaBaseUrl: z.string().optional(), @@ -470,7 +471,6 @@ const providerSettingsRecord: ProviderSettingsRecord = { // OpenAI openAiBaseUrl: undefined, openAiApiKey: undefined, - openAiHostHeader: undefined, openAiLegacyFormat: undefined, openAiR1FormatEnabled: undefined, openAiModelId: undefined, @@ -479,6 +479,8 @@ const providerSettingsRecord: ProviderSettingsRecord = { azureApiVersion: undefined, openAiStreamingEnabled: undefined, enableReasoningEffort: undefined, + openAiHostHeader: undefined, // Keep temporarily for backward compatibility during migration + openAiHeaders: undefined, // Ollama ollamaModelId: undefined, ollamaBaseUrl: undefined, diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx index 3682b46842f..12b66ae0d79 100644 --- a/webview-ui/src/components/settings/ApiOptions.tsx +++ b/webview-ui/src/components/settings/ApiOptions.tsx @@ -3,7 +3,13 @@ import { useDebounce, useEvent } from "react-use" import { Trans } from "react-i18next" import { LanguageModelChatSelector } from "vscode" import { Checkbox } from "vscrui" -import { VSCodeLink, VSCodeRadio, VSCodeRadioGroup, VSCodeTextField } from "@vscode/webview-ui-toolkit/react" +import { + VSCodeButton, + VSCodeLink, + VSCodeRadio, + VSCodeRadioGroup, + VSCodeTextField, +} from "@vscode/webview-ui-toolkit/react" import { ExternalLinkIcon } from "@radix-ui/react-icons" import { ReasoningEffort as ReasoningEffortType } from "@roo/schemas" @@ -74,17 +80,92 @@ const ApiOptions = ({ const [openAiModels, setOpenAiModels] = useState | null>(null) + const [customHeaders, setCustomHeaders] = useState<[string, string][]>(() => { + const headers = apiConfiguration?.openAiHeaders || {} + return Object.entries(headers) + }) + + // Effect to synchronize internal customHeaders state with prop changes + useEffect(() => { + const propHeaders = apiConfiguration?.openAiHeaders || {} + if (JSON.stringify(customHeaders) !== JSON.stringify(Object.entries(propHeaders))) setCustomHeaders(Object.entries(propHeaders)) + }, [apiConfiguration?.openAiHeaders]) + const [anthropicBaseUrlSelected, setAnthropicBaseUrlSelected] = useState(!!apiConfiguration?.anthropicBaseUrl) const [openAiNativeBaseUrlSelected, setOpenAiNativeBaseUrlSelected] = useState( !!apiConfiguration?.openAiNativeBaseUrl, ) const [azureApiVersionSelected, setAzureApiVersionSelected] = useState(!!apiConfiguration?.azureApiVersion) const [openRouterBaseUrlSelected, setOpenRouterBaseUrlSelected] = useState(!!apiConfiguration?.openRouterBaseUrl) - const [openAiHostHeaderSelected, setOpenAiHostHeaderSelected] = useState(!!apiConfiguration?.openAiHostHeader) const [openAiLegacyFormatSelected, setOpenAiLegacyFormatSelected] = useState(!!apiConfiguration?.openAiLegacyFormat) const [googleGeminiBaseUrlSelected, setGoogleGeminiBaseUrlSelected] = useState( !!apiConfiguration?.googleGeminiBaseUrl, ) + + const handleAddCustomHeader = useCallback(() => { + // Only update the local state to show the new row in the UI + setCustomHeaders((prev) => [...prev, ["", ""]]) + // Do not update the main configuration yet, wait for user input + }, []) + + const handleUpdateHeaderKey = useCallback((index: number, newKey: string) => { + setCustomHeaders((prev) => { + const updated = [...prev] + if (updated[index]) { + updated[index] = [newKey, updated[index][1]] + } + return updated + }) + }, []) + + const handleUpdateHeaderValue = useCallback((index: number, newValue: string) => { + setCustomHeaders((prev) => { + const updated = [...prev] + if (updated[index]) { + updated[index] = [updated[index][0], newValue] + } + return updated + }) + }, []) + + const handleRemoveCustomHeader = useCallback((index: number) => { + setCustomHeaders((prev) => prev.filter((_, i) => i !== index)) + }, []) + + // Helper to convert array of tuples to object (filtering out empty keys) + const convertHeadersToObject = (headers: [string, string][]): Record => { + const result: Record = {} + + // Process each header tuple + for (const [key, value] of headers) { + const trimmedKey = key.trim() + + // Skip empty keys + if (!trimmedKey) continue + + // For duplicates, the last one in the array wins + // This matches how HTTP headers work in general + result[trimmedKey] = value.trim() + } + + return result + } + + // Debounced effect to update the main configuration when local customHeaders state stabilizes + useDebounce( + () => { + const currentConfigHeaders = apiConfiguration?.openAiHeaders || {} + const newHeadersObject = convertHeadersToObject(customHeaders) + + // Only update if the processed object is different from the current config + if (JSON.stringify(currentConfigHeaders) !== JSON.stringify(newHeadersObject)) { + setApiConfigurationField("openAiHeaders", newHeadersObject) + } + }, + 300, + [customHeaders, apiConfiguration?.openAiHeaders, setApiConfigurationField], + ) + const [isDescriptionExpanded, setIsDescriptionExpanded] = useState(false) const noTransform = (value: T) => value @@ -121,12 +202,15 @@ const ApiOptions = ({ useDebounce( () => { if (selectedProvider === "openai") { + // Use our custom headers state to build the headers object + const headerObject = convertHeadersToObject(customHeaders) vscode.postMessage({ type: "requestOpenAiModels", values: { baseUrl: apiConfiguration?.openAiBaseUrl, apiKey: apiConfiguration?.openAiApiKey, - hostHeader: apiConfiguration?.openAiHostHeader, + customHeaders: {}, // Reserved for any additional headers + openAiHeaders: headerObject, }, }) } else if (selectedProvider === "ollama") { @@ -145,6 +229,7 @@ const ApiOptions = ({ apiConfiguration?.openAiApiKey, apiConfiguration?.ollamaBaseUrl, apiConfiguration?.lmStudioBaseUrl, + customHeaders, ], ) @@ -854,25 +939,44 @@ const ApiOptions = ({ )}
-
- { - setOpenAiHostHeaderSelected(checked) - - if (!checked) { - setApiConfigurationField("openAiHostHeader", "") - } - }}> - {t("settings:providers.useHostHeader")} - - {openAiHostHeaderSelected && ( - + {/* Custom Headers UI */} +
+
+ + + + +
+ {!customHeaders.length ? ( +
+ {t("settings:providers.noCustomHeaders")} +
+ ) : ( + customHeaders.map(([key, value], index) => ( +
+ handleUpdateHeaderKey(index, e.target.value)} + /> + handleUpdateHeaderValue(index, e.target.value)} + /> + handleRemoveCustomHeader(index)}> + + +
+ )) )}
diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index a3896118644..7f26f797c16 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -4,7 +4,9 @@ "done": "Fet", "cancel": "Cancel·lar", "reset": "Restablir", - "select": "Seleccionar" + "select": "Seleccionar", + "add": "Afegir capçalera", + "remove": "Eliminar" }, "header": { "title": "Configuració", @@ -107,6 +109,10 @@ "useCustomBaseUrl": "Utilitzar URL base personalitzada", "useHostHeader": "Utilitzar capçalera Host personalitzada", "useLegacyFormat": "Utilitzar el format d'API OpenAI antic", + "customHeaders": "Capçaleres personalitzades", + "headerName": "Nom de la capçalera", + "headerValue": "Valor de la capçalera", + "noCustomHeaders": "No hi ha capçaleres personalitzades definides. Feu clic al botó + per afegir-ne una.", "openRouterTransformsText": "Comprimir prompts i cadenes de missatges a la mida del context (Transformacions d'OpenRouter)", "model": "Model", "getOpenRouterApiKey": "Obtenir clau API d'OpenRouter", diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index e0f470e8e07..6447004a224 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -4,7 +4,9 @@ "done": "Fertig", "cancel": "Abbrechen", "reset": "Zurücksetzen", - "select": "Auswählen" + "select": "Auswählen", + "add": "Header hinzufügen", + "remove": "Entfernen" }, "header": { "title": "Einstellungen", @@ -111,6 +113,10 @@ "useCustomBaseUrl": "Benutzerdefinierte Basis-URL verwenden", "useHostHeader": "Benutzerdefinierten Host-Header verwenden", "useLegacyFormat": "Altes OpenAI API-Format verwenden", + "customHeaders": "Benutzerdefinierte Headers", + "headerName": "Header-Name", + "headerValue": "Header-Wert", + "noCustomHeaders": "Keine benutzerdefinierten Headers definiert. Klicke auf die + Schaltfläche, um einen hinzuzufügen.", "requestyApiKey": "Requesty API-Schlüssel", "getRequestyApiKey": "Requesty API-Schlüssel erhalten", "openRouterTransformsText": "Prompts und Nachrichtenketten auf Kontextgröße komprimieren (OpenRouter Transformationen)", diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index b057d94043c..3701d8a69c8 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -4,7 +4,9 @@ "done": "Done", "cancel": "Cancel", "reset": "Reset", - "select": "Select" + "select": "Select", + "add": "Add Header", + "remove": "Remove" }, "header": { "title": "Settings", @@ -111,6 +113,10 @@ "useCustomBaseUrl": "Use custom base URL", "useHostHeader": "Use custom Host header", "useLegacyFormat": "Use legacy OpenAI API format", + "customHeaders": "Custom Headers", + "headerName": "Header name", + "headerValue": "Header value", + "noCustomHeaders": "No custom headers defined. Click the + button to add one.", "requestyApiKey": "Requesty API Key", "getRequestyApiKey": "Get Requesty API Key", "openRouterTransformsText": "Compress prompts and message chains to the context size (OpenRouter Transforms)", diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index 5b810ea168c..7108f60a1b1 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -4,7 +4,9 @@ "done": "Hecho", "cancel": "Cancelar", "reset": "Restablecer", - "select": "Seleccionar" + "select": "Seleccionar", + "add": "Añadir encabezado", + "remove": "Eliminar" }, "header": { "title": "Configuración", @@ -111,6 +113,10 @@ "useCustomBaseUrl": "Usar URL base personalizada", "useHostHeader": "Usar encabezado Host personalizado", "useLegacyFormat": "Usar formato API de OpenAI heredado", + "customHeaders": "Encabezados personalizados", + "headerName": "Nombre del encabezado", + "headerValue": "Valor del encabezado", + "noCustomHeaders": "No hay encabezados personalizados definidos. Haga clic en el botón + para añadir uno.", "requestyApiKey": "Clave API de Requesty", "getRequestyApiKey": "Obtener clave API de Requesty", "openRouterTransformsText": "Comprimir prompts y cadenas de mensajes al tamaño del contexto (Transformaciones de OpenRouter)", diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index 25efb24c1fb..f81424539dd 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -4,7 +4,9 @@ "done": "Terminé", "cancel": "Annuler", "reset": "Réinitialiser", - "select": "Sélectionner" + "select": "Sélectionner", + "add": "Ajouter un en-tête", + "remove": "Supprimer" }, "header": { "title": "Paramètres", @@ -111,6 +113,10 @@ "useCustomBaseUrl": "Utiliser une URL de base personnalisée", "useHostHeader": "Utiliser un en-tête Host personnalisé", "useLegacyFormat": "Utiliser le format API OpenAI hérité", + "customHeaders": "En-têtes personnalisés", + "headerName": "Nom de l'en-tête", + "headerValue": "Valeur de l'en-tête", + "noCustomHeaders": "Aucun en-tête personnalisé défini. Cliquez sur le bouton + pour en ajouter un.", "requestyApiKey": "Clé API Requesty", "getRequestyApiKey": "Obtenir la clé API Requesty", "openRouterTransformsText": "Compresser les prompts et chaînes de messages à la taille du contexte (Transformations OpenRouter)", diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 5cc20642dac..eda9195811e 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -4,7 +4,9 @@ "done": "पूर्ण", "cancel": "रद्द करें", "reset": "रीसेट करें", - "select": "चुनें" + "select": "चुनें", + "add": "हेडर जोड़ें", + "remove": "हटाएं" }, "header": { "title": "सेटिंग्स", @@ -111,6 +113,10 @@ "useCustomBaseUrl": "कस्टम बेस URL का उपयोग करें", "useHostHeader": "कस्टम होस्ट हेडर का उपयोग करें", "useLegacyFormat": "पुराने OpenAI API प्रारूप का उपयोग करें", + "customHeaders": "कस्टम हेडर्स", + "headerName": "हेडर नाम", + "headerValue": "हेडर मूल्य", + "noCustomHeaders": "कोई कस्टम हेडर परिभाषित नहीं है। एक जोड़ने के लिए + बटन पर क्लिक करें।", "requestyApiKey": "Requesty API कुंजी", "getRequestyApiKey": "Requesty API कुंजी प्राप्त करें", "openRouterTransformsText": "संदर्भ आकार के लिए प्रॉम्प्ट और संदेश श्रृंखलाओं को संपीड़ित करें (OpenRouter ट्रांसफॉर्म)", diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 55866e53504..24a2bd210e1 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -4,7 +4,9 @@ "done": "Fatto", "cancel": "Annulla", "reset": "Ripristina", - "select": "Seleziona" + "select": "Seleziona", + "add": "Aggiungi intestazione", + "remove": "Rimuovi" }, "header": { "title": "Impostazioni", @@ -111,6 +113,10 @@ "useCustomBaseUrl": "Usa URL base personalizzato", "useHostHeader": "Usa intestazione Host personalizzata", "useLegacyFormat": "Usa formato API OpenAI legacy", + "customHeaders": "Intestazioni personalizzate", + "headerName": "Nome intestazione", + "headerValue": "Valore intestazione", + "noCustomHeaders": "Nessuna intestazione personalizzata definita. Fai clic sul pulsante + per aggiungerne una.", "requestyApiKey": "Chiave API Requesty", "getRequestyApiKey": "Ottieni chiave API Requesty", "openRouterTransformsText": "Comprimi prompt e catene di messaggi alla dimensione del contesto (Trasformazioni OpenRouter)", diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index b7960b9b455..84fa016eda2 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -4,7 +4,9 @@ "done": "完了", "cancel": "キャンセル", "reset": "リセット", - "select": "選択" + "select": "選択", + "add": "ヘッダーを追加", + "remove": "削除" }, "header": { "title": "設定", @@ -111,6 +113,10 @@ "useCustomBaseUrl": "カスタムベースURLを使用", "useHostHeader": "カスタムHostヘッダーを使用", "useLegacyFormat": "レガシーOpenAI API形式を使用", + "customHeaders": "カスタムヘッダー", + "headerName": "ヘッダー名", + "headerValue": "ヘッダー値", + "noCustomHeaders": "カスタムヘッダーが定義されていません。+ ボタンをクリックして追加してください。", "requestyApiKey": "Requesty APIキー", "getRequestyApiKey": "Requesty APIキーを取得", "openRouterTransformsText": "プロンプトとメッセージチェーンをコンテキストサイズに圧縮 (OpenRouter Transforms)", diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index b513a308cee..48123b7670a 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -4,7 +4,9 @@ "done": "완료", "cancel": "취소", "reset": "초기화", - "select": "선택" + "select": "선택", + "add": "헤더 추가", + "remove": "삭제" }, "header": { "title": "설정", @@ -111,6 +113,10 @@ "useCustomBaseUrl": "사용자 정의 기본 URL 사용", "useHostHeader": "사용자 정의 Host 헤더 사용", "useLegacyFormat": "레거시 OpenAI API 형식 사용", + "customHeaders": "사용자 정의 헤더", + "headerName": "헤더 이름", + "headerValue": "헤더 값", + "noCustomHeaders": "정의된 사용자 정의 헤더가 없습니다. + 버튼을 클릭하여 추가하세요.", "requestyApiKey": "Requesty API 키", "getRequestyApiKey": "Requesty API 키 받기", "openRouterTransformsText": "프롬프트와 메시지 체인을 컨텍스트 크기로 압축 (OpenRouter Transforms)", diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 8f80043fa0a..5128a700320 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -4,7 +4,9 @@ "done": "Gotowe", "cancel": "Anuluj", "reset": "Resetuj", - "select": "Wybierz" + "select": "Wybierz", + "add": "Dodaj nagłówek", + "remove": "Usuń" }, "header": { "title": "Ustawienia", @@ -111,6 +113,10 @@ "useCustomBaseUrl": "Użyj niestandardowego URL bazowego", "useHostHeader": "Użyj niestandardowego nagłówka Host", "useLegacyFormat": "Użyj starszego formatu API OpenAI", + "customHeaders": "Niestandardowe nagłówki", + "headerName": "Nazwa nagłówka", + "headerValue": "Wartość nagłówka", + "noCustomHeaders": "Brak zdefiniowanych niestandardowych nagłówków. Kliknij przycisk +, aby dodać.", "requestyApiKey": "Klucz API Requesty", "getRequestyApiKey": "Uzyskaj klucz API Requesty", "openRouterTransformsText": "Kompresuj podpowiedzi i łańcuchy wiadomości do rozmiaru kontekstu (Transformacje OpenRouter)", diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index d27a053247c..e7439bfef7a 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -4,7 +4,9 @@ "done": "Concluído", "cancel": "Cancelar", "reset": "Redefinir", - "select": "Selecionar" + "select": "Selecionar", + "add": "Adicionar cabeçalho", + "remove": "Remover" }, "header": { "title": "Configurações", @@ -111,6 +113,10 @@ "useCustomBaseUrl": "Usar URL base personalizado", "useHostHeader": "Usar cabeçalho Host personalizado", "useLegacyFormat": "Usar formato de API OpenAI legado", + "customHeaders": "Cabeçalhos personalizados", + "headerName": "Nome do cabeçalho", + "headerValue": "Valor do cabeçalho", + "noCustomHeaders": "Nenhum cabeçalho personalizado definido. Clique no botão + para adicionar um.", "requestyApiKey": "Chave de API Requesty", "getRequestyApiKey": "Obter chave de API Requesty", "openRouterTransformsText": "Comprimir prompts e cadeias de mensagens para o tamanho do contexto (Transformações OpenRouter)", diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index 27f1240a89f..9a72541eae0 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -4,7 +4,9 @@ "done": "Готово", "cancel": "Отмена", "reset": "Сбросить", - "select": "Выбрать" + "select": "Выбрать", + "add": "Добавить заголовок", + "remove": "Удалить" }, "header": { "title": "Настройки", @@ -111,6 +113,10 @@ "useCustomBaseUrl": "Использовать пользовательский базовый URL", "useHostHeader": "Использовать пользовательский Host-заголовок", "useLegacyFormat": "Использовать устаревший формат OpenAI API", + "customHeaders": "Пользовательские заголовки", + "headerName": "Имя заголовка", + "headerValue": "Значение заголовка", + "noCustomHeaders": "Пользовательские заголовки не определены. Нажмите кнопку +, чтобы добавить.", "requestyApiKey": "Requesty API-ключ", "getRequestyApiKey": "Получить Requesty API-ключ", "openRouterTransformsText": "Сжимать подсказки и цепочки сообщений до размера контекста (OpenRouter Transforms)", diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index 94861a6139c..3d55385faf2 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -4,7 +4,9 @@ "done": "Tamamlandı", "cancel": "İptal", "reset": "Sıfırla", - "select": "Seç" + "select": "Seç", + "add": "Başlık Ekle", + "remove": "Kaldır" }, "header": { "title": "Ayarlar", @@ -111,6 +113,10 @@ "useCustomBaseUrl": "Özel temel URL kullan", "useHostHeader": "Özel Host başlığı kullan", "useLegacyFormat": "Eski OpenAI API formatını kullan", + "customHeaders": "Özel Başlıklar", + "headerName": "Başlık adı", + "headerValue": "Başlık değeri", + "noCustomHeaders": "Tanımlanmış özel başlık yok. Eklemek için + düğmesine tıklayın.", "requestyApiKey": "Requesty API Anahtarı", "getRequestyApiKey": "Requesty API Anahtarı Al", "openRouterTransformsText": "İstem ve mesaj zincirlerini bağlam boyutuna sıkıştır (OpenRouter Dönüşümleri)", diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index 87941b5b8e9..c70115e77e3 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -4,7 +4,9 @@ "done": "Hoàn thành", "cancel": "Hủy", "reset": "Đặt lại", - "select": "Chọn" + "select": "Chọn", + "add": "Thêm tiêu đề", + "remove": "Xóa" }, "header": { "title": "Cài đặt", @@ -111,6 +113,10 @@ "useCustomBaseUrl": "Sử dụng URL cơ sở tùy chỉnh", "useHostHeader": "Sử dụng tiêu đề Host tùy chỉnh", "useLegacyFormat": "Sử dụng định dạng API OpenAI cũ", + "customHeaders": "Tiêu đề tùy chỉnh", + "headerName": "Tên tiêu đề", + "headerValue": "Giá trị tiêu đề", + "noCustomHeaders": "Chưa có tiêu đề tùy chỉnh nào được định nghĩa. Nhấp vào nút + để thêm.", "requestyApiKey": "Khóa API Requesty", "getRequestyApiKey": "Lấy khóa API Requesty", "anthropicApiKey": "Khóa API Anthropic", diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index fd10b77b63b..f9aa5177e06 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -4,7 +4,9 @@ "done": "完成", "cancel": "取消", "reset": "恢复默认设置", - "select": "选择" + "select": "选择", + "add": "添加标头", + "remove": "移除" }, "header": { "title": "设置", @@ -109,6 +111,10 @@ "useCustomBaseUrl": "使用自定义基础 URL", "useHostHeader": "使用自定义 Host 标头", "useLegacyFormat": "使用传统 OpenAI API 格式", + "customHeaders": "自定义标头", + "headerName": "标头名称", + "headerValue": "标头值", + "noCustomHeaders": "暂无自定义标头。点击 + 按钮添加。", "glamaApiKey": "Glama API 密钥", "getGlamaApiKey": "获取 Glama API 密钥", "requestyApiKey": "Requesty API 密钥", diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index a40be4d17fd..1d329752fe1 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -4,7 +4,9 @@ "done": "完成", "cancel": "取消", "reset": "重設", - "select": "選擇" + "select": "選擇", + "add": "新增標頭", + "remove": "移除" }, "header": { "title": "設定", @@ -111,6 +113,10 @@ "useCustomBaseUrl": "使用自訂基礎 URL", "useHostHeader": "使用自訂 Host 標頭", "useLegacyFormat": "使用舊版 OpenAI API 格式", + "customHeaders": "自訂標頭", + "headerName": "標頭名稱", + "headerValue": "標頭值", + "noCustomHeaders": "尚未定義自訂標頭。點擊 + 按鈕以新增。", "requestyApiKey": "Requesty API 金鑰", "getRequestyApiKey": "取得 Requesty API 金鑰", "openRouterTransformsText": "將提示和訊息鏈壓縮到上下文大小 (OpenRouter 轉換)", From 6a6443e6484a7e829c9aca5a616135b84e11ed11 Mon Sep 17 00:00:00 2001 From: Tony Zhang <157202938+zhangtony239@users.noreply.github.com> Date: Fri, 2 May 2025 12:09:23 +0800 Subject: [PATCH 12/29] Fix: ChatTextArea's height moving unexcepted when Roo Code width change (#2969) Fix: ChatTextArea's height moving unexcepted when Roo Code width change. --- webview-ui/src/components/chat/ChatTextArea.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/webview-ui/src/components/chat/ChatTextArea.tsx b/webview-ui/src/components/chat/ChatTextArea.tsx index 484f50c2507..43722a5d6d4 100644 --- a/webview-ui/src/components/chat/ChatTextArea.tsx +++ b/webview-ui/src/components/chat/ChatTextArea.tsx @@ -880,9 +880,7 @@ const ChatTextArea = forwardRef( : "bg-vscode-input-background", "transition-background-color duration-150 ease-in-out", "will-change-background-color", - "h-[100px]", - "[@media(min-width:150px)]:min-h-[80px]", - "[@media(min-width:425px)]:min-h-[60px]", + "min-h-[90px]", "box-border", "rounded", "resize-none", From f813ed850b6cd06e69f3a9986ff700de9db4dcbe Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Fri, 2 May 2025 00:40:44 -0400 Subject: [PATCH 13/29] Remove flaky tiktoken test (#3113) --- src/utils/__tests__/tiktoken.test.ts | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/utils/__tests__/tiktoken.test.ts b/src/utils/__tests__/tiktoken.test.ts index 2e0485d4e60..dc9b7c80b82 100644 --- a/src/utils/__tests__/tiktoken.test.ts +++ b/src/utils/__tests__/tiktoken.test.ts @@ -119,24 +119,10 @@ describe("tiktoken", () => { const content: Anthropic.Messages.ContentBlockParam[] = [{ type: "text", text: "Hello world" }] - // Time the first call which should create the encoder - const startTime1 = performance.now() const result1 = await tiktoken(content) - const endTime1 = performance.now() - const duration1 = endTime1 - startTime1 - - // Time the second call which should reuse the encoder - const startTime2 = performance.now() const result2 = await tiktoken(content) - const endTime2 = performance.now() - const duration2 = endTime2 - startTime2 // Both calls should return the same token count expect(result1).toBe(result2) - - // This is a loose test and might occasionally fail due to system load, - // but generally the second call should be faster or similar in speed - // since it reuses the encoder - expect(duration2).toBeLessThanOrEqual(duration1 * 1.5) }) }) From da9b85737681548ea6e531767f55d4a11b42c8d3 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Fri, 2 May 2025 01:23:44 -0400 Subject: [PATCH 14/29] Handle Mermaid validation errors (#3112) * Handle Mermaid validation errors * PR feedback * More PR feedback --- .../src/components/common/MermaidBlock.tsx | 102 ++++++++++++++++-- webview-ui/src/i18n/locales/ca/common.json | 4 + webview-ui/src/i18n/locales/de/common.json | 4 + webview-ui/src/i18n/locales/en/common.json | 4 + webview-ui/src/i18n/locales/es/common.json | 4 + webview-ui/src/i18n/locales/fr/common.json | 4 + webview-ui/src/i18n/locales/hi/common.json | 4 + webview-ui/src/i18n/locales/it/common.json | 4 + webview-ui/src/i18n/locales/ja/common.json | 4 + webview-ui/src/i18n/locales/ko/common.json | 4 + webview-ui/src/i18n/locales/pl/common.json | 4 + webview-ui/src/i18n/locales/pt-BR/common.json | 4 + webview-ui/src/i18n/locales/ru/common.json | 4 + webview-ui/src/i18n/locales/tr/common.json | 4 + webview-ui/src/i18n/locales/vi/common.json | 4 + webview-ui/src/i18n/locales/zh-CN/common.json | 4 + webview-ui/src/i18n/locales/zh-TW/common.json | 4 + 17 files changed, 156 insertions(+), 10 deletions(-) diff --git a/webview-ui/src/components/common/MermaidBlock.tsx b/webview-ui/src/components/common/MermaidBlock.tsx index 59132e42390..b3b34f7fea2 100644 --- a/webview-ui/src/components/common/MermaidBlock.tsx +++ b/webview-ui/src/components/common/MermaidBlock.tsx @@ -3,6 +3,9 @@ import mermaid from "mermaid" import { useDebounceEffect } from "@src/utils/useDebounceEffect" import styled from "styled-components" import { vscode } from "@src/utils/vscode" +import { useAppTranslation } from "@src/i18n/TranslationContext" +import { useCopyToClipboard } from "@src/utils/clipboard" +import CodeBlock from "./CodeBlock" const MERMAID_THEME = { background: "#1e1e1e", // VS Code dark theme background @@ -81,10 +84,15 @@ interface MermaidBlockProps { export default function MermaidBlock({ code }: MermaidBlockProps) { const containerRef = useRef(null) const [isLoading, setIsLoading] = useState(false) + const [error, setError] = useState(null) + const [isErrorExpanded, setIsErrorExpanded] = useState(false) + const { showCopyFeedback, copyWithFeedback } = useCopyToClipboard() + const { t } = useAppTranslation() // 1) Whenever `code` changes, mark that we need to re-render a new chart useEffect(() => { setIsLoading(true) + setError(null) }, [code]) // 2) Debounce the actual parse/render @@ -93,12 +101,10 @@ export default function MermaidBlock({ code }: MermaidBlockProps) { if (containerRef.current) { containerRef.current.innerHTML = "" } + mermaid - .parse(code, { suppressErrors: true }) - .then((isValid) => { - if (!isValid) { - throw new Error("Invalid or incomplete Mermaid code") - } + .parse(code) + .then(() => { const id = `mermaid-${Math.random().toString(36).substring(2)}` return mermaid.render(id, code) }) @@ -109,7 +115,7 @@ export default function MermaidBlock({ code }: MermaidBlockProps) { }) .catch((err) => { console.warn("Mermaid parse/render failed:", err) - containerRef.current!.innerHTML = code.replace(//g, ">") + setError(err.message || "Failed to render Mermaid diagram") }) .finally(() => { setIsLoading(false) @@ -139,12 +145,71 @@ export default function MermaidBlock({ code }: MermaidBlockProps) { } } + // Copy functionality handled directly through the copyWithFeedback utility + return ( - {isLoading && Generating mermaid diagram...} - - {/* The container for the final or raw code. */} - + {isLoading && {t("common:mermaid.loading")}} + + {error ? ( +
+
setIsErrorExpanded(!isErrorExpanded)}> +
+ + {t("common:mermaid.render_error")} +
+
+ { + e.stopPropagation() + copyWithFeedback(code, e) + }}> + + + +
+
+ {isErrorExpanded && ( +
+
+ {error} +
+ +
+ )} +
+ ) : ( + + )}
) } @@ -212,6 +277,23 @@ const LoadingMessage = styled.div` font-size: 0.9em; ` +const CopyButton = styled.button` + padding: 3px; + height: 24px; + margin-right: 4px; + color: var(--vscode-editor-foreground); + display: flex; + align-items: center; + justify-content: center; + background: transparent; + border: none; + cursor: pointer; + + &:hover { + opacity: 0.8; + } +` + interface SvgContainerProps { $isLoading: boolean } diff --git a/webview-ui/src/i18n/locales/ca/common.json b/webview-ui/src/i18n/locales/ca/common.json index c6a797f7c6b..8e95450cc46 100644 --- a/webview-ui/src/i18n/locales/ca/common.json +++ b/webview-ui/src/i18n/locales/ca/common.json @@ -6,5 +6,9 @@ }, "ui": { "search_placeholder": "Cerca..." + }, + "mermaid": { + "loading": "Generant diagrama mermaid...", + "render_error": "No es pot renderitzar el diagrama" } } diff --git a/webview-ui/src/i18n/locales/de/common.json b/webview-ui/src/i18n/locales/de/common.json index 62056d8d53f..c5b7172efe3 100644 --- a/webview-ui/src/i18n/locales/de/common.json +++ b/webview-ui/src/i18n/locales/de/common.json @@ -6,5 +6,9 @@ }, "ui": { "search_placeholder": "Suchen..." + }, + "mermaid": { + "loading": "Mermaid-Diagramm wird generiert...", + "render_error": "Diagramm kann nicht gerendert werden" } } diff --git a/webview-ui/src/i18n/locales/en/common.json b/webview-ui/src/i18n/locales/en/common.json index 757867bb2cb..70a3c4a2d71 100644 --- a/webview-ui/src/i18n/locales/en/common.json +++ b/webview-ui/src/i18n/locales/en/common.json @@ -6,5 +6,9 @@ }, "ui": { "search_placeholder": "Search..." + }, + "mermaid": { + "loading": "Generating mermaid diagram...", + "render_error": "Unable to Render Diagram" } } diff --git a/webview-ui/src/i18n/locales/es/common.json b/webview-ui/src/i18n/locales/es/common.json index 04123769577..6d649eb9263 100644 --- a/webview-ui/src/i18n/locales/es/common.json +++ b/webview-ui/src/i18n/locales/es/common.json @@ -6,5 +6,9 @@ }, "ui": { "search_placeholder": "Buscar..." + }, + "mermaid": { + "loading": "Generando diagrama mermaid...", + "render_error": "No se puede renderizar el diagrama" } } diff --git a/webview-ui/src/i18n/locales/fr/common.json b/webview-ui/src/i18n/locales/fr/common.json index fc7b0686df0..caeb10851f1 100644 --- a/webview-ui/src/i18n/locales/fr/common.json +++ b/webview-ui/src/i18n/locales/fr/common.json @@ -6,5 +6,9 @@ }, "ui": { "search_placeholder": "Rechercher..." + }, + "mermaid": { + "loading": "Génération du diagramme mermaid...", + "render_error": "Impossible de rendre le diagramme" } } diff --git a/webview-ui/src/i18n/locales/hi/common.json b/webview-ui/src/i18n/locales/hi/common.json index 5cf4876d327..de95d083b52 100644 --- a/webview-ui/src/i18n/locales/hi/common.json +++ b/webview-ui/src/i18n/locales/hi/common.json @@ -6,5 +6,9 @@ }, "ui": { "search_placeholder": "खोजें..." + }, + "mermaid": { + "loading": "मरमेड डायग्राम जनरेट हो रहा है...", + "render_error": "डायग्राम रेंडर नहीं किया जा सकता" } } diff --git a/webview-ui/src/i18n/locales/it/common.json b/webview-ui/src/i18n/locales/it/common.json index c6a797f7c6b..c07023796af 100644 --- a/webview-ui/src/i18n/locales/it/common.json +++ b/webview-ui/src/i18n/locales/it/common.json @@ -6,5 +6,9 @@ }, "ui": { "search_placeholder": "Cerca..." + }, + "mermaid": { + "loading": "Generazione del diagramma mermaid...", + "render_error": "Impossibile renderizzare il diagramma" } } diff --git a/webview-ui/src/i18n/locales/ja/common.json b/webview-ui/src/i18n/locales/ja/common.json index 063ca02c318..c890f8baede 100644 --- a/webview-ui/src/i18n/locales/ja/common.json +++ b/webview-ui/src/i18n/locales/ja/common.json @@ -6,5 +6,9 @@ }, "ui": { "search_placeholder": "検索..." + }, + "mermaid": { + "loading": "Mermaidダイアグラムを生成中...", + "render_error": "ダイアグラムをレンダリングできません" } } diff --git a/webview-ui/src/i18n/locales/ko/common.json b/webview-ui/src/i18n/locales/ko/common.json index e4335f16aeb..6996f6c3879 100644 --- a/webview-ui/src/i18n/locales/ko/common.json +++ b/webview-ui/src/i18n/locales/ko/common.json @@ -6,5 +6,9 @@ }, "ui": { "search_placeholder": "검색..." + }, + "mermaid": { + "loading": "머메이드 다이어그램 생성 중...", + "render_error": "다이어그램을 렌더링할 수 없음" } } diff --git a/webview-ui/src/i18n/locales/pl/common.json b/webview-ui/src/i18n/locales/pl/common.json index 6163d7f10fd..cf2da432f8f 100644 --- a/webview-ui/src/i18n/locales/pl/common.json +++ b/webview-ui/src/i18n/locales/pl/common.json @@ -6,5 +6,9 @@ }, "ui": { "search_placeholder": "Szukaj..." + }, + "mermaid": { + "loading": "Generowanie diagramu mermaid...", + "render_error": "Nie można renderować diagramu" } } diff --git a/webview-ui/src/i18n/locales/pt-BR/common.json b/webview-ui/src/i18n/locales/pt-BR/common.json index 0a36a8483bc..dd89eee333f 100644 --- a/webview-ui/src/i18n/locales/pt-BR/common.json +++ b/webview-ui/src/i18n/locales/pt-BR/common.json @@ -6,5 +6,9 @@ }, "ui": { "search_placeholder": "Pesquisar..." + }, + "mermaid": { + "loading": "Gerando diagrama mermaid...", + "render_error": "Não foi possível renderizar o diagrama" } } diff --git a/webview-ui/src/i18n/locales/ru/common.json b/webview-ui/src/i18n/locales/ru/common.json index 25bc20927ff..83277624671 100644 --- a/webview-ui/src/i18n/locales/ru/common.json +++ b/webview-ui/src/i18n/locales/ru/common.json @@ -6,5 +6,9 @@ }, "ui": { "search_placeholder": "Поиск..." + }, + "mermaid": { + "loading": "Создание диаграммы mermaid...", + "render_error": "Не удалось отобразить диаграмму" } } diff --git a/webview-ui/src/i18n/locales/tr/common.json b/webview-ui/src/i18n/locales/tr/common.json index a41fcaf6db7..a66d24e02fb 100644 --- a/webview-ui/src/i18n/locales/tr/common.json +++ b/webview-ui/src/i18n/locales/tr/common.json @@ -6,5 +6,9 @@ }, "ui": { "search_placeholder": "Ara..." + }, + "mermaid": { + "loading": "Mermaid diyagramı oluşturuluyor...", + "render_error": "Diyagram render edilemiyor" } } diff --git a/webview-ui/src/i18n/locales/vi/common.json b/webview-ui/src/i18n/locales/vi/common.json index 3ab6697795a..19f8b8b8013 100644 --- a/webview-ui/src/i18n/locales/vi/common.json +++ b/webview-ui/src/i18n/locales/vi/common.json @@ -6,5 +6,9 @@ }, "ui": { "search_placeholder": "Tìm kiếm..." + }, + "mermaid": { + "loading": "Đang tạo biểu đồ mermaid...", + "render_error": "Không thể hiển thị biểu đồ" } } diff --git a/webview-ui/src/i18n/locales/zh-CN/common.json b/webview-ui/src/i18n/locales/zh-CN/common.json index a437837df55..adaa86ec701 100644 --- a/webview-ui/src/i18n/locales/zh-CN/common.json +++ b/webview-ui/src/i18n/locales/zh-CN/common.json @@ -6,5 +6,9 @@ }, "ui": { "search_placeholder": "搜索..." + }, + "mermaid": { + "loading": "生成 Mermaid 图表中...", + "render_error": "无法渲染图表" } } diff --git a/webview-ui/src/i18n/locales/zh-TW/common.json b/webview-ui/src/i18n/locales/zh-TW/common.json index e8cc39e07e6..12c42220dde 100644 --- a/webview-ui/src/i18n/locales/zh-TW/common.json +++ b/webview-ui/src/i18n/locales/zh-TW/common.json @@ -6,5 +6,9 @@ }, "ui": { "search_placeholder": "搜尋..." + }, + "mermaid": { + "loading": "產生 Mermaid 圖表中...", + "render_error": "無法渲染圖表" } } From 2e660819215ef06dfacad846381a7c637b603712 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Fri, 2 May 2025 02:38:40 -0700 Subject: [PATCH 15/29] Terminal performance improvements (#3119) --- src/core/tools/executeCommandTool.ts | 9 +- .../terminal/ExecaTerminalProcess.ts | 34 ++- src/schemas/index.ts | 8 +- src/shared/combineCommandSequences.ts | 32 --- webview-ui/src/components/chat/ChatRow.tsx | 10 +- .../src/components/chat/CommandExecution.tsx | 201 ++++++++++-------- 6 files changed, 159 insertions(+), 135 deletions(-) diff --git a/src/core/tools/executeCommandTool.ts b/src/core/tools/executeCommandTool.ts index 579627997c9..7db12668c86 100644 --- a/src/core/tools/executeCommandTool.ts +++ b/src/core/tools/executeCommandTool.ts @@ -152,15 +152,15 @@ export async function executeCommand( const callbacks: RooTerminalCallbacks = { onLine: async (output: string, process: RooTerminalProcess) => { - const compressed = Terminal.compressTerminalOutput(output, terminalOutputLineLimit) - cline.say("command_output", compressed) + const status: CommandExecutionStatus = { executionId, status: "output", output } + clineProvider?.postMessageToWebview({ type: "commandExecutionStatus", text: JSON.stringify(status) }) if (runInBackground) { return } try { - const { response, text, images } = await cline.ask("command_output", compressed) + const { response, text, images } = await cline.ask("command_output", "") runInBackground = true if (response === "messageResponse") { @@ -171,10 +171,11 @@ export async function executeCommand( }, onCompleted: (output: string | undefined) => { result = Terminal.compressTerminalOutput(output ?? "", terminalOutputLineLimit) + cline.say("command_output", result) completed = true }, onShellExecutionStarted: (pid: number | undefined) => { - const status: CommandExecutionStatus = { executionId, status: "running", pid } + const status: CommandExecutionStatus = { executionId, status: "started", pid, command } clineProvider?.postMessageToWebview({ type: "commandExecutionStatus", text: JSON.stringify(status) }) }, onShellExecutionComplete: (details: ExitCodeDetails) => { diff --git a/src/integrations/terminal/ExecaTerminalProcess.ts b/src/integrations/terminal/ExecaTerminalProcess.ts index 1f41fa082db..63b772e5db0 100644 --- a/src/integrations/terminal/ExecaTerminalProcess.ts +++ b/src/integrations/terminal/ExecaTerminalProcess.ts @@ -6,6 +6,7 @@ import { BaseTerminalProcess } from "./BaseTerminalProcess" export class ExecaTerminalProcess extends BaseTerminalProcess { private terminalRef: WeakRef private controller?: AbortController + private aborted = false constructor(terminal: RooTerminal) { super() @@ -45,11 +46,15 @@ export class ExecaTerminalProcess extends BaseTerminalProcess { this.terminal.setActiveStream(stream, subprocess.pid) for await (const line of stream) { + if (this.aborted) { + break + } + this.fullOutput += line const now = Date.now() - if (this.isListening && (now - this.lastEmitTime_ms > 250 || this.lastEmitTime_ms === 0)) { + if (this.isListening && (now - this.lastEmitTime_ms > 500 || this.lastEmitTime_ms === 0)) { this.emitRemainingBufferIfListening() this.lastEmitTime_ms = now } @@ -57,6 +62,32 @@ export class ExecaTerminalProcess extends BaseTerminalProcess { this.startHotTimer(line) } + if (this.aborted) { + let timeoutId: NodeJS.Timeout | undefined + + const kill = new Promise((resolve) => { + timeoutId = setTimeout(() => { + try { + subprocess.kill("SIGKILL") + } catch (e) {} + + resolve() + }, 5_000) + }) + + try { + await Promise.race([subprocess, kill]) + } catch (error) { + console.log( + `[ExecaTerminalProcess] subprocess termination error: ${error instanceof Error ? error.message : String(error)}`, + ) + } + + if (timeoutId) { + clearTimeout(timeoutId) + } + } + this.emit("shell_execution_complete", { exitCode: 0 }) } catch (error) { if (error instanceof ExecaError) { @@ -84,6 +115,7 @@ export class ExecaTerminalProcess extends BaseTerminalProcess { } public override abort() { + this.aborted = true this.controller?.abort() } diff --git a/src/schemas/index.ts b/src/schemas/index.ts index 772832990d1..ff8c01f0cff 100644 --- a/src/schemas/index.ts +++ b/src/schemas/index.ts @@ -293,8 +293,14 @@ export type CustomSupportPrompts = z.infer export const commandExecutionStatusSchema = z.discriminatedUnion("status", [ z.object({ executionId: z.string(), - status: z.literal("running"), + status: z.literal("started"), pid: z.number().optional(), + command: z.string(), + }), + z.object({ + executionId: z.string(), + status: z.literal("output"), + output: z.string(), }), z.object({ executionId: z.string(), diff --git a/src/shared/combineCommandSequences.ts b/src/shared/combineCommandSequences.ts index 4e1d2d7bb4a..dd171a77ece 100644 --- a/src/shared/combineCommandSequences.ts +++ b/src/shared/combineCommandSequences.ts @@ -77,35 +77,3 @@ export function combineCommandSequences(messages: ClineMessage[]): ClineMessage[ return msg }) } - -export const splitCommandOutput = (text: string) => { - const outputIndex = text.indexOf(COMMAND_OUTPUT_STRING) - - if (outputIndex === -1) { - return { command: text, output: "" } - } - - return { - command: text.slice(0, outputIndex).trim(), - - output: text - .slice(outputIndex + COMMAND_OUTPUT_STRING.length) - .trim() - .split("") - .map((char) => { - switch (char) { - case "\t": - return "→ " - case "\b": - return "⌫" - case "\f": - return "⏏" - case "\v": - return "⇳" - default: - return char - } - }) - .join(""), - } -} diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index ea85bda79ca..714c47ee5b1 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -5,7 +5,7 @@ import deepEqual from "fast-deep-equal" import { VSCodeBadge, VSCodeButton } from "@vscode/webview-ui-toolkit/react" import { ClineApiReqInfo, ClineAskUseMcpServer, ClineMessage, ClineSayTool } from "@roo/shared/ExtensionMessage" -import { splitCommandOutput, COMMAND_OUTPUT_STRING } from "@roo/shared/combineCommandSequences" +import { COMMAND_OUTPUT_STRING } from "@roo/shared/combineCommandSequences" import { safeJsonParse } from "@roo/shared/safeJsonParse" import { useCopyToClipboard } from "@src/utils/clipboard" @@ -979,19 +979,13 @@ export const ChatRowContent = ({ ) case "command": - const { command, output } = splitCommandOutput(message.text || "") - return ( <>
{icon} {title}
- + ) case "use_mcp_server": diff --git a/webview-ui/src/components/chat/CommandExecution.tsx b/webview-ui/src/components/chat/CommandExecution.tsx index 7e2acdb492a..2a5600d06ba 100644 --- a/webview-ui/src/components/chat/CommandExecution.tsx +++ b/webview-ui/src/components/chat/CommandExecution.tsx @@ -1,4 +1,4 @@ -import { HTMLAttributes, forwardRef, useCallback, useMemo, useState } from "react" +import { HTMLAttributes, useCallback, useEffect, useMemo, useState } from "react" import { useEvent } from "react-use" import { Virtuoso } from "react-virtuoso" import { ChevronDown, Skull } from "lucide-react" @@ -6,6 +6,7 @@ import { ChevronDown, Skull } from "lucide-react" import { CommandExecutionStatus, commandExecutionStatusSchema } from "@roo/schemas" import { ExtensionMessage } from "@roo/shared/ExtensionMessage" import { safeJsonParse } from "@roo/shared/safeJsonParse" +import { COMMAND_OUTPUT_STRING } from "@roo/shared/combineCommandSequences" import { vscode } from "@src/utils/vscode" import { useExtensionState } from "@src/context/ExtensionStateContext" @@ -14,112 +15,134 @@ import { Button } from "@src/components/ui" interface CommandExecutionProps { executionId?: string - command: string - output: string + text?: string } -export const CommandExecution = forwardRef( - ({ executionId, command, output }, ref) => { - const { terminalShellIntegrationDisabled = false } = useExtensionState() +export const CommandExecution = ({ executionId, text }: CommandExecutionProps) => { + const { terminalShellIntegrationDisabled = false } = useExtensionState() - // If we aren't opening the VSCode terminal for this command then we default - // to expanding the command execution output. - const [isExpanded, setIsExpanded] = useState(terminalShellIntegrationDisabled) + // If we aren't opening the VSCode terminal for this command then we default + // to expanding the command execution output. + const [isExpanded, setIsExpanded] = useState(terminalShellIntegrationDisabled) - const [status, setStatus] = useState(null) + const [status, setStatus] = useState(null) + const [output, setOutput] = useState("") + const [command, setCommand] = useState("") - const lines = useMemo( - () => [`$ ${command}`, ...output.split("\n").filter((line) => line.trim() !== "")], - [command, output], - ) + const lines = useMemo( + () => [`$ ${command}`, ...output.split("\n").filter((line) => line.trim() !== "")], + [output, command], + ) - const onMessage = useCallback( - (event: MessageEvent) => { - if (!executionId) { - return - } + const onMessage = useCallback( + (event: MessageEvent) => { + if (!executionId) { + return + } - const message: ExtensionMessage = event.data + const message: ExtensionMessage = event.data - if (message.type === "commandExecutionStatus") { - const result = commandExecutionStatusSchema.safeParse(safeJsonParse(message.text, {})) + if (message.type === "commandExecutionStatus") { + const result = commandExecutionStatusSchema.safeParse(safeJsonParse(message.text, {})) - if (result.success) { - if (result.data.executionId !== executionId) { - return - } + if (result.success) { + const data = result.data + + if (data.executionId !== executionId) { + return + } - if (result.data.status === "fallback") { + switch (data.status) { + case "started": + setCommand(data.command) + setStatus(data) + break + case "output": + setOutput((output) => output + data.output) + break + case "fallback": setIsExpanded(true) - } else { - setStatus(result.data) - } + break + default: + setStatus(data) + break } } - }, - [executionId], - ) - - useEvent("message", onMessage) - - return ( -
-
- {command} -
- {status?.status === "running" && ( -
-
-
Running
- {status.pid &&
(PID: {status.pid})
} - -
- )} - {status?.status === "exited" && ( -
-
-
Exited ({status.exitCode})
-
- )} - {lines.length > 0 && ( - - )} -
-
-
+
+ )} + {status?.status === "exited" && ( +
+
+
Exited ({status.exitCode})
+
+ )} {lines.length > 0 && ( - {lines[i]}} - followOutput="auto" - /> + )}
- ) - }, -) +
+ {lines.length > 0 && ( + {lines[i]}} + followOutput="auto" + /> + )} +
+
+ ) +} type LineProps = HTMLAttributes From 71f428bbebaec0c9660311f69f5d427520d86685 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Fri, 2 May 2025 10:09:49 -0400 Subject: [PATCH 16/29] Copy both error message and content on mermaid error (#3120) --- webview-ui/src/components/common/MermaidBlock.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webview-ui/src/components/common/MermaidBlock.tsx b/webview-ui/src/components/common/MermaidBlock.tsx index b3b34f7fea2..d44d51b5f9c 100644 --- a/webview-ui/src/components/common/MermaidBlock.tsx +++ b/webview-ui/src/components/common/MermaidBlock.tsx @@ -186,7 +186,8 @@ export default function MermaidBlock({ code }: MermaidBlockProps) { { e.stopPropagation() - copyWithFeedback(code, e) + const combinedContent = `Error: ${error}\n\n\`\`\`mermaid\n${code}\n\`\`\`` + copyWithFeedback(combinedContent, e) }}> From e625a1e9577bc0c75894a895eaa13293da93d8ae Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Fri, 2 May 2025 10:43:27 -0400 Subject: [PATCH 17/29] V3.15.2 (#3121) v3.15.2 --- .changeset/v3.15.2.md | 11 +++++++++++ .roomodes | 12 +++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 .changeset/v3.15.2.md diff --git a/.changeset/v3.15.2.md b/.changeset/v3.15.2.md new file mode 100644 index 00000000000..ad410ff0b87 --- /dev/null +++ b/.changeset/v3.15.2.md @@ -0,0 +1,11 @@ +--- +"roo-cline": patch +--- + +- Fix terminal performance issues +- Handle Mermaid validation errors and copy both error message and content +- Add customizable headers for OpenAI-compatible provider +- Add config option to overwrite OpenAI's API base (thanks @GOODBOY008!) +- Fixes to padding and height issues when resizing the sidebar (thanks @zhangtony239!) +- Remove tool groups from orchestrator mode definition +- Add telemetry for title button clicks diff --git a/.roomodes b/.roomodes index f69dd3d4bc9..962a9271eb5 100644 --- a/.roomodes +++ b/.roomodes @@ -41,19 +41,25 @@ "roleDefinition": "You are Roo, an expert Design Engineer focused on VSCode Extension development. Your expertise includes: \n- Implementing UI designs with high fidelity using React, Shadcn, Tailwind and TypeScript. \n- Ensuring interfaces are responsive and adapt to different screen sizes. \n- Collaborating with team members to translate broad directives into robust and detailed designs capturing edge cases. \n- Maintaining uniformity and consistency across the user interface.", "groups": [ "read", - ["edit", { "fileRegex": "\\.(css|html|json|mdx?|jsx?|tsx?|svg)$", "description": "Frontend & SVG files" }], + [ + "edit", + { + "fileRegex": "\\.(css|html|json|mdx?|jsx?|tsx?|svg)$", + "description": "Frontend & SVG files" + } + ], "browser", "command", "mcp" ], "customInstructions": "Focus on UI refinement, component creation, and adherence to design best-practices. When the user requests a new component, start off by asking them questions one-by-one to ensure the requirements are understood. Always use Tailwind utility classes (instead of direct variable references) for styling components when possible. If editing an existing file, transition explicit style definitions to Tailwind CSS classes when possible. Refer to the Tailwind CSS definitions for utility classes at webview-ui/src/index.css. Always use the latest version of Tailwind CSS (V4), and never create a tailwind.config.js file. Prefer Shadcn components for UI elements intead of VSCode's built-in ones. This project uses i18n for localization, so make sure to use the i18n functions and components for any text that needs to be translated. Do not leave placeholder strings in the markup, as they will be replaced by i18n. Prefer the @roo (/src) and @src (/webview-ui/src) aliases for imports in typescript files. Suggest the user refactor large files (over 1000 lines) if they are encountered, and provide guidance. Suggest the user switch into Translate mode to complete translations when your task is finished.", "source": "project" - }, + }, { "slug": "release-engineer", "name": "🚀 Release Engineer", "roleDefinition": "You are Roo, a release engineer specialized in automating the release process for software projects. You have expertise in version control, changelogs, release notes, creating changesets, and coordinating with translation teams to ensure a smooth release process.", - "customInstructions": "When preparing a release:\n1. Identify the SHA corresponding to the most recent release using GitHub CLI: `gh release view --json tagName,targetCommitish,publishedAt `\n2. Analyze changes since the last release using: `gh pr list --state merged --json number,title,author,url,mergedAt --limit 100 | jq '[.[] | select(.mergedAt > \"TIMESTAMP\") | {number, title, author: .author.login, url, mergedAt}]'`\n3. Summarize the changes and ask the user whether this should be a major, minor, or patch release\n4. Create a changeset in .changeset/v[version].md instead of directly modifying package.json. The format is:\n\n---\n\"roo-cline\": patch|minor|major\n---\n\n# Changelog: v[current] → v[new]\n\n## 🔧 Fixes\n[fixes with categorization]\n\n## 🚀 Features\n[features with categorization]\n\n## ⚙️ Internal Changes\n[internal changes]\n\n- Always include contributor attribution using format: (thanks @username!)\n- Provide brief descriptions under each item to explain the change\n\n5. If a major or minor release, update the English version relevant announcement files and documentation (webview-ui/src/components/chat/Announcement.tsx, README.md, and the `latestAnnouncementId` in src/core/webview/ClineProvider.ts)\n6. Ask the user to confirm the English version\n7. Use the new_task tool to create a subtask in `translate` mode with detailed instructions of which content needs to be translated into all supported languages", + "customInstructions": "When preparing a release:\n1. Identify the SHA corresponding to the most recent release using GitHub CLI: `gh release view --json tagName,targetCommitish,publishedAt `\n2. Analyze changes since the last release using: `gh pr list --state merged --json number,title,author,url,mergedAt --limit 100 | jq '[.[] | select(.mergedAt > \"TIMESTAMP\") | {number, title, author: .author.login, url, mergedAt}]'`\n3. Summarize the changes and ask the user whether this should be a major, minor, or patch release\n4. Create a changeset in .changeset/v[version].md instead of directly modifying package.json. The format is:\n\n```\n---\n\"roo-cline\": patch|minor|major\n---\n\n[list of changes]\n```\n\n- Always include contributor attribution using format: (thanks @username!)\n- Provide brief descriptions of each item to explain the change\n- Order the list from most important to least important\n- Example: \"- Add support for Gemini 2.5 Pro caching (thanks @contributor!)\"\n\n5. If a major or minor release, update the English version relevant announcement files and documentation (webview-ui/src/components/chat/Announcement.tsx, README.md, and the `latestAnnouncementId` in src/core/webview/ClineProvider.ts)\n6. Ask the user to confirm the English version\n7. Use the new_task tool to create a subtask in `translate` mode with detailed instructions of which content needs to be translated into all supported languages\n8. Commit and push the changeset file to the repository\n9. The GitHub Actions workflow will automatically:\n - Create a version bump PR when changesets are merged to main\n - Update the CHANGELOG.md with proper formatting\n - Publish the release when the version bump PR is merged", "groups": [ "read", "edit", From a1993a90cc15742e82f86e83936cd57122c5490b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 2 May 2025 10:55:49 -0400 Subject: [PATCH 18/29] Update contributors list (#3058) docs: update contributors list [skip ci] Co-authored-by: mrubens --- README.md | 51 ++++++++++++++++++++------------------- locales/ca/README.md | 53 ++++++++++++++++++++--------------------- locales/de/README.md | 53 ++++++++++++++++++++--------------------- locales/es/README.md | 53 ++++++++++++++++++++--------------------- locales/fr/README.md | 53 ++++++++++++++++++++--------------------- locales/hi/README.md | 53 ++++++++++++++++++++--------------------- locales/it/README.md | 53 ++++++++++++++++++++--------------------- locales/ja/README.md | 53 ++++++++++++++++++++--------------------- locales/ko/README.md | 53 ++++++++++++++++++++--------------------- locales/pl/README.md | 53 ++++++++++++++++++++--------------------- locales/pt-BR/README.md | 53 ++++++++++++++++++++--------------------- locales/ru/README.md | 53 ++++++++++++++++++++--------------------- locales/tr/README.md | 53 ++++++++++++++++++++--------------------- locales/vi/README.md | 53 ++++++++++++++++++++--------------------- locales/zh-CN/README.md | 53 ++++++++++++++++++++--------------------- locales/zh-TW/README.md | 53 ++++++++++++++++++++--------------------- 16 files changed, 416 insertions(+), 430 deletions(-) diff --git a/README.md b/README.md index 757114c9af1..fd8da612724 100644 --- a/README.md +++ b/README.md @@ -181,31 +181,32 @@ Thanks to all our contributors who have helped make Roo Code better! -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| KJ7LNW
KJ7LNW
| -| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| wkordalski
wkordalski
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| qdaxb
qdaxb
| Szpadel
Szpadel
| Premshay
Premshay
| sachasayan
sachasayan
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| lupuletic
lupuletic
| elianiva
elianiva
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| dtrugman
dtrugman
| emshvac
emshvac
| -| kyle-apex
kyle-apex
| pdecat
pdecat
| zhangtony239
zhangtony239
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| upamune
upamune
| -| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| philfung
philfung
| -| ross
ross
| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| -| vincentsong
vincentsong
| yongjer
yongjer
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| benzntech
benzntech
| bramburn
bramburn
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| -| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| napter
napter
| SplittyDev
SplittyDev
| mdp
mdp
| nevermorec
nevermorec
| -| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| -| shoopapa
shoopapa
| im47cn
im47cn
| hongzio
hongzio
| dqroid
dqroid
| dlab-anton
dlab-anton
| dairui1
dairui1
| -| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| jr
jr
| PretzelVector
PretzelVector
| cdlliuy
cdlliuy
| -| student20880
student20880
| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| shariqriazz
shariqriazz
| seedlord
seedlord
| samir-nimbly
samir-nimbly
| -| ronyblum
ronyblum
| refactorthis
refactorthis
| pokutuna
pokutuna
| philipnext
philipnext
| oprstchn
oprstchn
| nobu007
nobu007
| -| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| -| celestial-vault
celestial-vault
| linegel
linegel
| dbasclpy
dbasclpy
| dleen
dleen
| chadgauth
chadgauth
| bogdan0083
bogdan0083
| -| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| QuinsZouls
QuinsZouls
| alarno
alarno
| adamwlarson
adamwlarson
| -| AMHesch
AMHesch
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| vladstudio
vladstudio
| NamesMT
NamesMT
| -| tmsjngx0
tmsjngx0
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| samsilveira
samsilveira
| mr-ryan-james
mr-ryan-james
| 01Rian
01Rian
| -| Sarke
Sarke
| kvokka
kvokka
| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| libertyteeth
libertyteeth
| shtse8
shtse8
| +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| +| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| KJ7LNW
KJ7LNW
| +| nissa-seru
nissa-seru
| jquanton
jquanton
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| +| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| wkordalski
wkordalski
| feifei325
feifei325
| lloydchang
lloydchang
| cannuri
cannuri
| +| vigneshsubbiah16
vigneshsubbiah16
| Szpadel
Szpadel
| sachasayan
sachasayan
| qdaxb
qdaxb
| zhangtony239
zhangtony239
| lupuletic
lupuletic
| +| Premshay
Premshay
| psv2522
psv2522
| elianiva
elianiva
| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| +| pugazhendhi-m
pugazhendhi-m
| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| dtrugman
dtrugman
| +| emshvac
emshvac
| kyle-apex
kyle-apex
| pdecat
pdecat
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| upamune
upamune
| +| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| anton-otee
anton-otee
| +| philfung
philfung
| ross
ross
| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| +| vagadiya
vagadiya
| vincentsong
vincentsong
| yongjer
yongjer
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| +| benzntech
benzntech
| axkirillov
axkirillov
| bramburn
bramburn
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| +| Chenjiayuan195
Chenjiayuan195
| jr
jr
| julionav
julionav
| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| +| nevermorec
nevermorec
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| +| jwcraig
jwcraig
| shoopapa
shoopapa
| im47cn
im47cn
| hongzio
hongzio
| GOODBOY008
GOODBOY008
| dqroid
dqroid
| +| dlab-anton
dlab-anton
| dairui1
dairui1
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| PretzelVector
PretzelVector
| +| cdlliuy
cdlliuy
| student20880
student20880
| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| shariqriazz
shariqriazz
| seedlord
seedlord
| +| samir-nimbly
samir-nimbly
| ronyblum
ronyblum
| refactorthis
refactorthis
| pokutuna
pokutuna
| philipnext
philipnext
| oprstchn
oprstchn
| +| nobu007
nobu007
| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| Jdo300
Jdo300
| hesara
hesara
| +| DeXtroTip
DeXtroTip
| celestial-vault
celestial-vault
| linegel
linegel
| dbasclpy
dbasclpy
| dleen
dleen
| chadgauth
chadgauth
| +| olearycrew
olearycrew
| bogdan0083
bogdan0083
| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| QuinsZouls
QuinsZouls
| +| alarno
alarno
| adamwlarson
adamwlarson
| AMHesch
AMHesch
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| +| vladstudio
vladstudio
| NamesMT
NamesMT
| tmsjngx0
tmsjngx0
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| samsilveira
samsilveira
| +| mr-ryan-james
mr-ryan-james
| 01Rian
01Rian
| Sarke
Sarke
| kvokka
kvokka
| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| +| libertyteeth
libertyteeth
| shtse8
shtse8
| | | | | diff --git a/locales/ca/README.md b/locales/ca/README.md index 9044ba13592..4bbcfb1e36e 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -178,33 +178,32 @@ Ens encanten les contribucions de la comunitat! Comenceu llegint el nostre [CONT Gràcies a tots els nostres col·laboradors que han ajudat a millorar Roo Code! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| KJ7LNW
KJ7LNW
| -| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| wkordalski
wkordalski
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| qdaxb
qdaxb
| Szpadel
Szpadel
| Premshay
Premshay
| sachasayan
sachasayan
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| lupuletic
lupuletic
| elianiva
elianiva
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| dtrugman
dtrugman
| emshvac
emshvac
| -| kyle-apex
kyle-apex
| pdecat
pdecat
| zhangtony239
zhangtony239
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| upamune
upamune
| -| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| philfung
philfung
| -| ross
ross
| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| -| vincentsong
vincentsong
| yongjer
yongjer
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| benzntech
benzntech
| bramburn
bramburn
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| -| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| napter
napter
| SplittyDev
SplittyDev
| mdp
mdp
| nevermorec
nevermorec
| -| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| -| shoopapa
shoopapa
| im47cn
im47cn
| hongzio
hongzio
| dqroid
dqroid
| dlab-anton
dlab-anton
| dairui1
dairui1
| -| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| jr
jr
| PretzelVector
PretzelVector
| cdlliuy
cdlliuy
| -| student20880
student20880
| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| shariqriazz
shariqriazz
| seedlord
seedlord
| samir-nimbly
samir-nimbly
| -| ronyblum
ronyblum
| refactorthis
refactorthis
| pokutuna
pokutuna
| philipnext
philipnext
| oprstchn
oprstchn
| nobu007
nobu007
| -| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| -| celestial-vault
celestial-vault
| linegel
linegel
| dbasclpy
dbasclpy
| dleen
dleen
| chadgauth
chadgauth
| bogdan0083
bogdan0083
| -| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| QuinsZouls
QuinsZouls
| alarno
alarno
| adamwlarson
adamwlarson
| -| AMHesch
AMHesch
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| vladstudio
vladstudio
| NamesMT
NamesMT
| -| tmsjngx0
tmsjngx0
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| samsilveira
samsilveira
| mr-ryan-james
mr-ryan-james
| 01Rian
01Rian
| -| Sarke
Sarke
| kvokka
kvokka
| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| libertyteeth
libertyteeth
| shtse8
shtse8
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|KJ7LNW
KJ7LNW
| +|nissa-seru
nissa-seru
|jquanton
jquanton
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|lloydchang
lloydchang
|cannuri
cannuri
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|sachasayan
sachasayan
|qdaxb
qdaxb
|zhangtony239
zhangtony239
|lupuletic
lupuletic
| +|Premshay
Premshay
|psv2522
psv2522
|elianiva
elianiva
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|anton-otee
anton-otee
| +|philfung
philfung
|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
| +|vagadiya
vagadiya
|vincentsong
vincentsong
|yongjer
yongjer
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| +|benzntech
benzntech
|axkirillov
axkirillov
|bramburn
bramburn
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|jr
jr
|julionav
julionav
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
| +|nevermorec
nevermorec
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| +|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|GOODBOY008
GOODBOY008
|dqroid
dqroid
| +|dlab-anton
dlab-anton
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|PretzelVector
PretzelVector
| +|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|shariqriazz
shariqriazz
|seedlord
seedlord
| +|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| +|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Jdo300
Jdo300
|hesara
hesara
| +|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|dbasclpy
dbasclpy
|dleen
dleen
|chadgauth
chadgauth
| +|olearycrew
olearycrew
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|QuinsZouls
QuinsZouls
| +|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
| +|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
| +|mr-ryan-james
mr-ryan-james
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
| | | | | ## Llicència diff --git a/locales/de/README.md b/locales/de/README.md index 25603ace540..19ad5ebb6e1 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -178,33 +178,32 @@ Wir lieben Community-Beiträge! Beginnen Sie mit dem Lesen unserer [CONTRIBUTING Danke an alle unsere Mitwirkenden, die geholfen haben, Roo Code zu verbessern! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| KJ7LNW
KJ7LNW
| -| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| wkordalski
wkordalski
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| qdaxb
qdaxb
| Szpadel
Szpadel
| Premshay
Premshay
| sachasayan
sachasayan
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| lupuletic
lupuletic
| elianiva
elianiva
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| dtrugman
dtrugman
| emshvac
emshvac
| -| kyle-apex
kyle-apex
| pdecat
pdecat
| zhangtony239
zhangtony239
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| upamune
upamune
| -| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| philfung
philfung
| -| ross
ross
| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| -| vincentsong
vincentsong
| yongjer
yongjer
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| benzntech
benzntech
| bramburn
bramburn
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| -| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| napter
napter
| SplittyDev
SplittyDev
| mdp
mdp
| nevermorec
nevermorec
| -| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| -| shoopapa
shoopapa
| im47cn
im47cn
| hongzio
hongzio
| dqroid
dqroid
| dlab-anton
dlab-anton
| dairui1
dairui1
| -| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| jr
jr
| PretzelVector
PretzelVector
| cdlliuy
cdlliuy
| -| student20880
student20880
| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| shariqriazz
shariqriazz
| seedlord
seedlord
| samir-nimbly
samir-nimbly
| -| ronyblum
ronyblum
| refactorthis
refactorthis
| pokutuna
pokutuna
| philipnext
philipnext
| oprstchn
oprstchn
| nobu007
nobu007
| -| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| -| celestial-vault
celestial-vault
| linegel
linegel
| dbasclpy
dbasclpy
| dleen
dleen
| chadgauth
chadgauth
| bogdan0083
bogdan0083
| -| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| QuinsZouls
QuinsZouls
| alarno
alarno
| adamwlarson
adamwlarson
| -| AMHesch
AMHesch
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| vladstudio
vladstudio
| NamesMT
NamesMT
| -| tmsjngx0
tmsjngx0
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| samsilveira
samsilveira
| mr-ryan-james
mr-ryan-james
| 01Rian
01Rian
| -| Sarke
Sarke
| kvokka
kvokka
| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| libertyteeth
libertyteeth
| shtse8
shtse8
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|KJ7LNW
KJ7LNW
| +|nissa-seru
nissa-seru
|jquanton
jquanton
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|lloydchang
lloydchang
|cannuri
cannuri
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|sachasayan
sachasayan
|qdaxb
qdaxb
|zhangtony239
zhangtony239
|lupuletic
lupuletic
| +|Premshay
Premshay
|psv2522
psv2522
|elianiva
elianiva
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|anton-otee
anton-otee
| +|philfung
philfung
|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
| +|vagadiya
vagadiya
|vincentsong
vincentsong
|yongjer
yongjer
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| +|benzntech
benzntech
|axkirillov
axkirillov
|bramburn
bramburn
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|jr
jr
|julionav
julionav
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
| +|nevermorec
nevermorec
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| +|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|GOODBOY008
GOODBOY008
|dqroid
dqroid
| +|dlab-anton
dlab-anton
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|PretzelVector
PretzelVector
| +|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|shariqriazz
shariqriazz
|seedlord
seedlord
| +|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| +|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Jdo300
Jdo300
|hesara
hesara
| +|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|dbasclpy
dbasclpy
|dleen
dleen
|chadgauth
chadgauth
| +|olearycrew
olearycrew
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|QuinsZouls
QuinsZouls
| +|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
| +|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
| +|mr-ryan-james
mr-ryan-james
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
| | | | | ## Lizenz diff --git a/locales/es/README.md b/locales/es/README.md index be1aa0edda4..a5d8df2f8e2 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -178,33 +178,32 @@ Usamos [changesets](https://github.com/changesets/changesets) para versionar y p ¡Gracias a todos nuestros colaboradores que han ayudado a mejorar Roo Code! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| KJ7LNW
KJ7LNW
| -| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| wkordalski
wkordalski
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| qdaxb
qdaxb
| Szpadel
Szpadel
| Premshay
Premshay
| sachasayan
sachasayan
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| lupuletic
lupuletic
| elianiva
elianiva
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| dtrugman
dtrugman
| emshvac
emshvac
| -| kyle-apex
kyle-apex
| pdecat
pdecat
| zhangtony239
zhangtony239
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| upamune
upamune
| -| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| philfung
philfung
| -| ross
ross
| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| -| vincentsong
vincentsong
| yongjer
yongjer
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| benzntech
benzntech
| bramburn
bramburn
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| -| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| napter
napter
| SplittyDev
SplittyDev
| mdp
mdp
| nevermorec
nevermorec
| -| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| -| shoopapa
shoopapa
| im47cn
im47cn
| hongzio
hongzio
| dqroid
dqroid
| dlab-anton
dlab-anton
| dairui1
dairui1
| -| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| jr
jr
| PretzelVector
PretzelVector
| cdlliuy
cdlliuy
| -| student20880
student20880
| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| shariqriazz
shariqriazz
| seedlord
seedlord
| samir-nimbly
samir-nimbly
| -| ronyblum
ronyblum
| refactorthis
refactorthis
| pokutuna
pokutuna
| philipnext
philipnext
| oprstchn
oprstchn
| nobu007
nobu007
| -| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| -| celestial-vault
celestial-vault
| linegel
linegel
| dbasclpy
dbasclpy
| dleen
dleen
| chadgauth
chadgauth
| bogdan0083
bogdan0083
| -| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| QuinsZouls
QuinsZouls
| alarno
alarno
| adamwlarson
adamwlarson
| -| AMHesch
AMHesch
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| vladstudio
vladstudio
| NamesMT
NamesMT
| -| tmsjngx0
tmsjngx0
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| samsilveira
samsilveira
| mr-ryan-james
mr-ryan-james
| 01Rian
01Rian
| -| Sarke
Sarke
| kvokka
kvokka
| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| libertyteeth
libertyteeth
| shtse8
shtse8
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|KJ7LNW
KJ7LNW
| +|nissa-seru
nissa-seru
|jquanton
jquanton
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|lloydchang
lloydchang
|cannuri
cannuri
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|sachasayan
sachasayan
|qdaxb
qdaxb
|zhangtony239
zhangtony239
|lupuletic
lupuletic
| +|Premshay
Premshay
|psv2522
psv2522
|elianiva
elianiva
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|anton-otee
anton-otee
| +|philfung
philfung
|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
| +|vagadiya
vagadiya
|vincentsong
vincentsong
|yongjer
yongjer
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| +|benzntech
benzntech
|axkirillov
axkirillov
|bramburn
bramburn
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|jr
jr
|julionav
julionav
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
| +|nevermorec
nevermorec
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| +|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|GOODBOY008
GOODBOY008
|dqroid
dqroid
| +|dlab-anton
dlab-anton
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|PretzelVector
PretzelVector
| +|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|shariqriazz
shariqriazz
|seedlord
seedlord
| +|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| +|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Jdo300
Jdo300
|hesara
hesara
| +|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|dbasclpy
dbasclpy
|dleen
dleen
|chadgauth
chadgauth
| +|olearycrew
olearycrew
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|QuinsZouls
QuinsZouls
| +|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
| +|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
| +|mr-ryan-james
mr-ryan-james
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
| | | | | ## Licencia diff --git a/locales/fr/README.md b/locales/fr/README.md index 301fcd75c33..bb5f3862a76 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -178,33 +178,32 @@ Nous adorons les contributions de la communauté ! Commencez par lire notre [CON Merci à tous nos contributeurs qui ont aidé à améliorer Roo Code ! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| KJ7LNW
KJ7LNW
| -| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| wkordalski
wkordalski
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| qdaxb
qdaxb
| Szpadel
Szpadel
| Premshay
Premshay
| sachasayan
sachasayan
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| lupuletic
lupuletic
| elianiva
elianiva
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| dtrugman
dtrugman
| emshvac
emshvac
| -| kyle-apex
kyle-apex
| pdecat
pdecat
| zhangtony239
zhangtony239
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| upamune
upamune
| -| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| philfung
philfung
| -| ross
ross
| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| -| vincentsong
vincentsong
| yongjer
yongjer
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| benzntech
benzntech
| bramburn
bramburn
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| -| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| napter
napter
| SplittyDev
SplittyDev
| mdp
mdp
| nevermorec
nevermorec
| -| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| -| shoopapa
shoopapa
| im47cn
im47cn
| hongzio
hongzio
| dqroid
dqroid
| dlab-anton
dlab-anton
| dairui1
dairui1
| -| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| jr
jr
| PretzelVector
PretzelVector
| cdlliuy
cdlliuy
| -| student20880
student20880
| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| shariqriazz
shariqriazz
| seedlord
seedlord
| samir-nimbly
samir-nimbly
| -| ronyblum
ronyblum
| refactorthis
refactorthis
| pokutuna
pokutuna
| philipnext
philipnext
| oprstchn
oprstchn
| nobu007
nobu007
| -| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| -| celestial-vault
celestial-vault
| linegel
linegel
| dbasclpy
dbasclpy
| dleen
dleen
| chadgauth
chadgauth
| bogdan0083
bogdan0083
| -| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| QuinsZouls
QuinsZouls
| alarno
alarno
| adamwlarson
adamwlarson
| -| AMHesch
AMHesch
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| vladstudio
vladstudio
| NamesMT
NamesMT
| -| tmsjngx0
tmsjngx0
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| samsilveira
samsilveira
| mr-ryan-james
mr-ryan-james
| 01Rian
01Rian
| -| Sarke
Sarke
| kvokka
kvokka
| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| libertyteeth
libertyteeth
| shtse8
shtse8
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|KJ7LNW
KJ7LNW
| +|nissa-seru
nissa-seru
|jquanton
jquanton
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|lloydchang
lloydchang
|cannuri
cannuri
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|sachasayan
sachasayan
|qdaxb
qdaxb
|zhangtony239
zhangtony239
|lupuletic
lupuletic
| +|Premshay
Premshay
|psv2522
psv2522
|elianiva
elianiva
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|anton-otee
anton-otee
| +|philfung
philfung
|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
| +|vagadiya
vagadiya
|vincentsong
vincentsong
|yongjer
yongjer
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| +|benzntech
benzntech
|axkirillov
axkirillov
|bramburn
bramburn
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|jr
jr
|julionav
julionav
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
| +|nevermorec
nevermorec
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| +|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|GOODBOY008
GOODBOY008
|dqroid
dqroid
| +|dlab-anton
dlab-anton
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|PretzelVector
PretzelVector
| +|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|shariqriazz
shariqriazz
|seedlord
seedlord
| +|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| +|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Jdo300
Jdo300
|hesara
hesara
| +|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|dbasclpy
dbasclpy
|dleen
dleen
|chadgauth
chadgauth
| +|olearycrew
olearycrew
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|QuinsZouls
QuinsZouls
| +|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
| +|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
| +|mr-ryan-james
mr-ryan-james
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
| | | | | ## Licence diff --git a/locales/hi/README.md b/locales/hi/README.md index d159d5e64ef..2d14f74ef90 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -178,33 +178,32 @@ code --install-extension bin/roo-cline-.vsix Roo Code को बेहतर बनाने में मदद करने वाले हमारे सभी योगदानकर्ताओं को धन्यवाद! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| KJ7LNW
KJ7LNW
| -| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| wkordalski
wkordalski
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| qdaxb
qdaxb
| Szpadel
Szpadel
| Premshay
Premshay
| sachasayan
sachasayan
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| lupuletic
lupuletic
| elianiva
elianiva
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| dtrugman
dtrugman
| emshvac
emshvac
| -| kyle-apex
kyle-apex
| pdecat
pdecat
| zhangtony239
zhangtony239
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| upamune
upamune
| -| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| philfung
philfung
| -| ross
ross
| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| -| vincentsong
vincentsong
| yongjer
yongjer
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| benzntech
benzntech
| bramburn
bramburn
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| -| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| napter
napter
| SplittyDev
SplittyDev
| mdp
mdp
| nevermorec
nevermorec
| -| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| -| shoopapa
shoopapa
| im47cn
im47cn
| hongzio
hongzio
| dqroid
dqroid
| dlab-anton
dlab-anton
| dairui1
dairui1
| -| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| jr
jr
| PretzelVector
PretzelVector
| cdlliuy
cdlliuy
| -| student20880
student20880
| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| shariqriazz
shariqriazz
| seedlord
seedlord
| samir-nimbly
samir-nimbly
| -| ronyblum
ronyblum
| refactorthis
refactorthis
| pokutuna
pokutuna
| philipnext
philipnext
| oprstchn
oprstchn
| nobu007
nobu007
| -| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| -| celestial-vault
celestial-vault
| linegel
linegel
| dbasclpy
dbasclpy
| dleen
dleen
| chadgauth
chadgauth
| bogdan0083
bogdan0083
| -| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| QuinsZouls
QuinsZouls
| alarno
alarno
| adamwlarson
adamwlarson
| -| AMHesch
AMHesch
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| vladstudio
vladstudio
| NamesMT
NamesMT
| -| tmsjngx0
tmsjngx0
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| samsilveira
samsilveira
| mr-ryan-james
mr-ryan-james
| 01Rian
01Rian
| -| Sarke
Sarke
| kvokka
kvokka
| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| libertyteeth
libertyteeth
| shtse8
shtse8
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|KJ7LNW
KJ7LNW
| +|nissa-seru
nissa-seru
|jquanton
jquanton
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|lloydchang
lloydchang
|cannuri
cannuri
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|sachasayan
sachasayan
|qdaxb
qdaxb
|zhangtony239
zhangtony239
|lupuletic
lupuletic
| +|Premshay
Premshay
|psv2522
psv2522
|elianiva
elianiva
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|anton-otee
anton-otee
| +|philfung
philfung
|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
| +|vagadiya
vagadiya
|vincentsong
vincentsong
|yongjer
yongjer
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| +|benzntech
benzntech
|axkirillov
axkirillov
|bramburn
bramburn
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|jr
jr
|julionav
julionav
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
| +|nevermorec
nevermorec
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| +|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|GOODBOY008
GOODBOY008
|dqroid
dqroid
| +|dlab-anton
dlab-anton
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|PretzelVector
PretzelVector
| +|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|shariqriazz
shariqriazz
|seedlord
seedlord
| +|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| +|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Jdo300
Jdo300
|hesara
hesara
| +|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|dbasclpy
dbasclpy
|dleen
dleen
|chadgauth
chadgauth
| +|olearycrew
olearycrew
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|QuinsZouls
QuinsZouls
| +|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
| +|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
| +|mr-ryan-james
mr-ryan-james
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
| | | | | ## लाइसेंस diff --git a/locales/it/README.md b/locales/it/README.md index f0f6cda7869..dbf6fb5e886 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -178,33 +178,32 @@ Amiamo i contributi della community! Inizia leggendo il nostro [CONTRIBUTING.md] Grazie a tutti i nostri contributori che hanno aiutato a migliorare Roo Code! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| KJ7LNW
KJ7LNW
| -| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| wkordalski
wkordalski
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| qdaxb
qdaxb
| Szpadel
Szpadel
| Premshay
Premshay
| sachasayan
sachasayan
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| lupuletic
lupuletic
| elianiva
elianiva
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| dtrugman
dtrugman
| emshvac
emshvac
| -| kyle-apex
kyle-apex
| pdecat
pdecat
| zhangtony239
zhangtony239
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| upamune
upamune
| -| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| philfung
philfung
| -| ross
ross
| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| -| vincentsong
vincentsong
| yongjer
yongjer
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| benzntech
benzntech
| bramburn
bramburn
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| -| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| napter
napter
| SplittyDev
SplittyDev
| mdp
mdp
| nevermorec
nevermorec
| -| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| -| shoopapa
shoopapa
| im47cn
im47cn
| hongzio
hongzio
| dqroid
dqroid
| dlab-anton
dlab-anton
| dairui1
dairui1
| -| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| jr
jr
| PretzelVector
PretzelVector
| cdlliuy
cdlliuy
| -| student20880
student20880
| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| shariqriazz
shariqriazz
| seedlord
seedlord
| samir-nimbly
samir-nimbly
| -| ronyblum
ronyblum
| refactorthis
refactorthis
| pokutuna
pokutuna
| philipnext
philipnext
| oprstchn
oprstchn
| nobu007
nobu007
| -| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| -| celestial-vault
celestial-vault
| linegel
linegel
| dbasclpy
dbasclpy
| dleen
dleen
| chadgauth
chadgauth
| bogdan0083
bogdan0083
| -| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| QuinsZouls
QuinsZouls
| alarno
alarno
| adamwlarson
adamwlarson
| -| AMHesch
AMHesch
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| vladstudio
vladstudio
| NamesMT
NamesMT
| -| tmsjngx0
tmsjngx0
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| samsilveira
samsilveira
| mr-ryan-james
mr-ryan-james
| 01Rian
01Rian
| -| Sarke
Sarke
| kvokka
kvokka
| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| libertyteeth
libertyteeth
| shtse8
shtse8
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|KJ7LNW
KJ7LNW
| +|nissa-seru
nissa-seru
|jquanton
jquanton
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|lloydchang
lloydchang
|cannuri
cannuri
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|sachasayan
sachasayan
|qdaxb
qdaxb
|zhangtony239
zhangtony239
|lupuletic
lupuletic
| +|Premshay
Premshay
|psv2522
psv2522
|elianiva
elianiva
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|anton-otee
anton-otee
| +|philfung
philfung
|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
| +|vagadiya
vagadiya
|vincentsong
vincentsong
|yongjer
yongjer
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| +|benzntech
benzntech
|axkirillov
axkirillov
|bramburn
bramburn
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|jr
jr
|julionav
julionav
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
| +|nevermorec
nevermorec
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| +|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|GOODBOY008
GOODBOY008
|dqroid
dqroid
| +|dlab-anton
dlab-anton
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|PretzelVector
PretzelVector
| +|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|shariqriazz
shariqriazz
|seedlord
seedlord
| +|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| +|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Jdo300
Jdo300
|hesara
hesara
| +|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|dbasclpy
dbasclpy
|dleen
dleen
|chadgauth
chadgauth
| +|olearycrew
olearycrew
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|QuinsZouls
QuinsZouls
| +|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
| +|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
| +|mr-ryan-james
mr-ryan-james
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
| | | | | ## Licenza diff --git a/locales/ja/README.md b/locales/ja/README.md index 026a4cbba4e..3700bc271a5 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -178,33 +178,32 @@ code --install-extension bin/roo-cline-.vsix Roo Codeの改善に貢献してくれたすべての貢献者に感謝します! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| KJ7LNW
KJ7LNW
| -| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| wkordalski
wkordalski
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| qdaxb
qdaxb
| Szpadel
Szpadel
| Premshay
Premshay
| sachasayan
sachasayan
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| lupuletic
lupuletic
| elianiva
elianiva
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| dtrugman
dtrugman
| emshvac
emshvac
| -| kyle-apex
kyle-apex
| pdecat
pdecat
| zhangtony239
zhangtony239
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| upamune
upamune
| -| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| philfung
philfung
| -| ross
ross
| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| -| vincentsong
vincentsong
| yongjer
yongjer
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| benzntech
benzntech
| bramburn
bramburn
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| -| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| napter
napter
| SplittyDev
SplittyDev
| mdp
mdp
| nevermorec
nevermorec
| -| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| -| shoopapa
shoopapa
| im47cn
im47cn
| hongzio
hongzio
| dqroid
dqroid
| dlab-anton
dlab-anton
| dairui1
dairui1
| -| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| jr
jr
| PretzelVector
PretzelVector
| cdlliuy
cdlliuy
| -| student20880
student20880
| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| shariqriazz
shariqriazz
| seedlord
seedlord
| samir-nimbly
samir-nimbly
| -| ronyblum
ronyblum
| refactorthis
refactorthis
| pokutuna
pokutuna
| philipnext
philipnext
| oprstchn
oprstchn
| nobu007
nobu007
| -| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| -| celestial-vault
celestial-vault
| linegel
linegel
| dbasclpy
dbasclpy
| dleen
dleen
| chadgauth
chadgauth
| bogdan0083
bogdan0083
| -| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| QuinsZouls
QuinsZouls
| alarno
alarno
| adamwlarson
adamwlarson
| -| AMHesch
AMHesch
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| vladstudio
vladstudio
| NamesMT
NamesMT
| -| tmsjngx0
tmsjngx0
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| samsilveira
samsilveira
| mr-ryan-james
mr-ryan-james
| 01Rian
01Rian
| -| Sarke
Sarke
| kvokka
kvokka
| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| libertyteeth
libertyteeth
| shtse8
shtse8
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|KJ7LNW
KJ7LNW
| +|nissa-seru
nissa-seru
|jquanton
jquanton
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|lloydchang
lloydchang
|cannuri
cannuri
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|sachasayan
sachasayan
|qdaxb
qdaxb
|zhangtony239
zhangtony239
|lupuletic
lupuletic
| +|Premshay
Premshay
|psv2522
psv2522
|elianiva
elianiva
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|anton-otee
anton-otee
| +|philfung
philfung
|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
| +|vagadiya
vagadiya
|vincentsong
vincentsong
|yongjer
yongjer
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| +|benzntech
benzntech
|axkirillov
axkirillov
|bramburn
bramburn
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|jr
jr
|julionav
julionav
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
| +|nevermorec
nevermorec
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| +|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|GOODBOY008
GOODBOY008
|dqroid
dqroid
| +|dlab-anton
dlab-anton
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|PretzelVector
PretzelVector
| +|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|shariqriazz
shariqriazz
|seedlord
seedlord
| +|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| +|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Jdo300
Jdo300
|hesara
hesara
| +|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|dbasclpy
dbasclpy
|dleen
dleen
|chadgauth
chadgauth
| +|olearycrew
olearycrew
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|QuinsZouls
QuinsZouls
| +|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
| +|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
| +|mr-ryan-james
mr-ryan-james
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
| | | | | ## ライセンス diff --git a/locales/ko/README.md b/locales/ko/README.md index fb814edaa10..29e2358178c 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -178,33 +178,32 @@ code --install-extension bin/roo-cline-.vsix Roo Code를 더 좋게 만드는 데 도움을 준 모든 기여자에게 감사드립니다! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| KJ7LNW
KJ7LNW
| -| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| wkordalski
wkordalski
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| qdaxb
qdaxb
| Szpadel
Szpadel
| Premshay
Premshay
| sachasayan
sachasayan
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| lupuletic
lupuletic
| elianiva
elianiva
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| dtrugman
dtrugman
| emshvac
emshvac
| -| kyle-apex
kyle-apex
| pdecat
pdecat
| zhangtony239
zhangtony239
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| upamune
upamune
| -| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| philfung
philfung
| -| ross
ross
| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| -| vincentsong
vincentsong
| yongjer
yongjer
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| benzntech
benzntech
| bramburn
bramburn
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| -| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| napter
napter
| SplittyDev
SplittyDev
| mdp
mdp
| nevermorec
nevermorec
| -| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| -| shoopapa
shoopapa
| im47cn
im47cn
| hongzio
hongzio
| dqroid
dqroid
| dlab-anton
dlab-anton
| dairui1
dairui1
| -| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| jr
jr
| PretzelVector
PretzelVector
| cdlliuy
cdlliuy
| -| student20880
student20880
| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| shariqriazz
shariqriazz
| seedlord
seedlord
| samir-nimbly
samir-nimbly
| -| ronyblum
ronyblum
| refactorthis
refactorthis
| pokutuna
pokutuna
| philipnext
philipnext
| oprstchn
oprstchn
| nobu007
nobu007
| -| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| -| celestial-vault
celestial-vault
| linegel
linegel
| dbasclpy
dbasclpy
| dleen
dleen
| chadgauth
chadgauth
| bogdan0083
bogdan0083
| -| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| QuinsZouls
QuinsZouls
| alarno
alarno
| adamwlarson
adamwlarson
| -| AMHesch
AMHesch
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| vladstudio
vladstudio
| NamesMT
NamesMT
| -| tmsjngx0
tmsjngx0
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| samsilveira
samsilveira
| mr-ryan-james
mr-ryan-james
| 01Rian
01Rian
| -| Sarke
Sarke
| kvokka
kvokka
| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| libertyteeth
libertyteeth
| shtse8
shtse8
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|KJ7LNW
KJ7LNW
| +|nissa-seru
nissa-seru
|jquanton
jquanton
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|lloydchang
lloydchang
|cannuri
cannuri
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|sachasayan
sachasayan
|qdaxb
qdaxb
|zhangtony239
zhangtony239
|lupuletic
lupuletic
| +|Premshay
Premshay
|psv2522
psv2522
|elianiva
elianiva
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|anton-otee
anton-otee
| +|philfung
philfung
|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
| +|vagadiya
vagadiya
|vincentsong
vincentsong
|yongjer
yongjer
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| +|benzntech
benzntech
|axkirillov
axkirillov
|bramburn
bramburn
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|jr
jr
|julionav
julionav
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
| +|nevermorec
nevermorec
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| +|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|GOODBOY008
GOODBOY008
|dqroid
dqroid
| +|dlab-anton
dlab-anton
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|PretzelVector
PretzelVector
| +|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|shariqriazz
shariqriazz
|seedlord
seedlord
| +|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| +|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Jdo300
Jdo300
|hesara
hesara
| +|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|dbasclpy
dbasclpy
|dleen
dleen
|chadgauth
chadgauth
| +|olearycrew
olearycrew
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|QuinsZouls
QuinsZouls
| +|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
| +|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
| +|mr-ryan-james
mr-ryan-james
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
| | | | | ## 라이선스 diff --git a/locales/pl/README.md b/locales/pl/README.md index dfa184752d8..08ad175d278 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -178,33 +178,32 @@ Kochamy wkład społeczności! Zacznij od przeczytania naszego [CONTRIBUTING.md] Dziękujemy wszystkim naszym współtwórcom, którzy pomogli ulepszyć Roo Code! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| KJ7LNW
KJ7LNW
| -| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| wkordalski
wkordalski
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| qdaxb
qdaxb
| Szpadel
Szpadel
| Premshay
Premshay
| sachasayan
sachasayan
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| lupuletic
lupuletic
| elianiva
elianiva
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| dtrugman
dtrugman
| emshvac
emshvac
| -| kyle-apex
kyle-apex
| pdecat
pdecat
| zhangtony239
zhangtony239
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| upamune
upamune
| -| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| philfung
philfung
| -| ross
ross
| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| -| vincentsong
vincentsong
| yongjer
yongjer
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| benzntech
benzntech
| bramburn
bramburn
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| -| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| napter
napter
| SplittyDev
SplittyDev
| mdp
mdp
| nevermorec
nevermorec
| -| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| -| shoopapa
shoopapa
| im47cn
im47cn
| hongzio
hongzio
| dqroid
dqroid
| dlab-anton
dlab-anton
| dairui1
dairui1
| -| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| jr
jr
| PretzelVector
PretzelVector
| cdlliuy
cdlliuy
| -| student20880
student20880
| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| shariqriazz
shariqriazz
| seedlord
seedlord
| samir-nimbly
samir-nimbly
| -| ronyblum
ronyblum
| refactorthis
refactorthis
| pokutuna
pokutuna
| philipnext
philipnext
| oprstchn
oprstchn
| nobu007
nobu007
| -| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| -| celestial-vault
celestial-vault
| linegel
linegel
| dbasclpy
dbasclpy
| dleen
dleen
| chadgauth
chadgauth
| bogdan0083
bogdan0083
| -| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| QuinsZouls
QuinsZouls
| alarno
alarno
| adamwlarson
adamwlarson
| -| AMHesch
AMHesch
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| vladstudio
vladstudio
| NamesMT
NamesMT
| -| tmsjngx0
tmsjngx0
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| samsilveira
samsilveira
| mr-ryan-james
mr-ryan-james
| 01Rian
01Rian
| -| Sarke
Sarke
| kvokka
kvokka
| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| libertyteeth
libertyteeth
| shtse8
shtse8
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|KJ7LNW
KJ7LNW
| +|nissa-seru
nissa-seru
|jquanton
jquanton
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|lloydchang
lloydchang
|cannuri
cannuri
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|sachasayan
sachasayan
|qdaxb
qdaxb
|zhangtony239
zhangtony239
|lupuletic
lupuletic
| +|Premshay
Premshay
|psv2522
psv2522
|elianiva
elianiva
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|anton-otee
anton-otee
| +|philfung
philfung
|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
| +|vagadiya
vagadiya
|vincentsong
vincentsong
|yongjer
yongjer
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| +|benzntech
benzntech
|axkirillov
axkirillov
|bramburn
bramburn
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|jr
jr
|julionav
julionav
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
| +|nevermorec
nevermorec
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| +|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|GOODBOY008
GOODBOY008
|dqroid
dqroid
| +|dlab-anton
dlab-anton
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|PretzelVector
PretzelVector
| +|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|shariqriazz
shariqriazz
|seedlord
seedlord
| +|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| +|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Jdo300
Jdo300
|hesara
hesara
| +|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|dbasclpy
dbasclpy
|dleen
dleen
|chadgauth
chadgauth
| +|olearycrew
olearycrew
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|QuinsZouls
QuinsZouls
| +|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
| +|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
| +|mr-ryan-james
mr-ryan-james
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
| | | | | ## Licencja diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index eb9092e0080..153580a893f 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -178,33 +178,32 @@ Adoramos contribuições da comunidade! Comece lendo nosso [CONTRIBUTING.md](CON Obrigado a todos os nossos contribuidores que ajudaram a tornar o Roo Code melhor! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| KJ7LNW
KJ7LNW
| -| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| wkordalski
wkordalski
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| qdaxb
qdaxb
| Szpadel
Szpadel
| Premshay
Premshay
| sachasayan
sachasayan
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| lupuletic
lupuletic
| elianiva
elianiva
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| dtrugman
dtrugman
| emshvac
emshvac
| -| kyle-apex
kyle-apex
| pdecat
pdecat
| zhangtony239
zhangtony239
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| upamune
upamune
| -| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| philfung
philfung
| -| ross
ross
| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| -| vincentsong
vincentsong
| yongjer
yongjer
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| benzntech
benzntech
| bramburn
bramburn
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| -| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| napter
napter
| SplittyDev
SplittyDev
| mdp
mdp
| nevermorec
nevermorec
| -| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| -| shoopapa
shoopapa
| im47cn
im47cn
| hongzio
hongzio
| dqroid
dqroid
| dlab-anton
dlab-anton
| dairui1
dairui1
| -| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| jr
jr
| PretzelVector
PretzelVector
| cdlliuy
cdlliuy
| -| student20880
student20880
| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| shariqriazz
shariqriazz
| seedlord
seedlord
| samir-nimbly
samir-nimbly
| -| ronyblum
ronyblum
| refactorthis
refactorthis
| pokutuna
pokutuna
| philipnext
philipnext
| oprstchn
oprstchn
| nobu007
nobu007
| -| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| -| celestial-vault
celestial-vault
| linegel
linegel
| dbasclpy
dbasclpy
| dleen
dleen
| chadgauth
chadgauth
| bogdan0083
bogdan0083
| -| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| QuinsZouls
QuinsZouls
| alarno
alarno
| adamwlarson
adamwlarson
| -| AMHesch
AMHesch
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| vladstudio
vladstudio
| NamesMT
NamesMT
| -| tmsjngx0
tmsjngx0
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| samsilveira
samsilveira
| mr-ryan-james
mr-ryan-james
| 01Rian
01Rian
| -| Sarke
Sarke
| kvokka
kvokka
| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| libertyteeth
libertyteeth
| shtse8
shtse8
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|KJ7LNW
KJ7LNW
| +|nissa-seru
nissa-seru
|jquanton
jquanton
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|lloydchang
lloydchang
|cannuri
cannuri
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|sachasayan
sachasayan
|qdaxb
qdaxb
|zhangtony239
zhangtony239
|lupuletic
lupuletic
| +|Premshay
Premshay
|psv2522
psv2522
|elianiva
elianiva
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|anton-otee
anton-otee
| +|philfung
philfung
|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
| +|vagadiya
vagadiya
|vincentsong
vincentsong
|yongjer
yongjer
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| +|benzntech
benzntech
|axkirillov
axkirillov
|bramburn
bramburn
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|jr
jr
|julionav
julionav
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
| +|nevermorec
nevermorec
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| +|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|GOODBOY008
GOODBOY008
|dqroid
dqroid
| +|dlab-anton
dlab-anton
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|PretzelVector
PretzelVector
| +|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|shariqriazz
shariqriazz
|seedlord
seedlord
| +|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| +|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Jdo300
Jdo300
|hesara
hesara
| +|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|dbasclpy
dbasclpy
|dleen
dleen
|chadgauth
chadgauth
| +|olearycrew
olearycrew
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|QuinsZouls
QuinsZouls
| +|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
| +|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
| +|mr-ryan-james
mr-ryan-james
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
| | | | | ## Licença diff --git a/locales/ru/README.md b/locales/ru/README.md index c97286810ac..d61b395731e 100644 --- a/locales/ru/README.md +++ b/locales/ru/README.md @@ -180,33 +180,32 @@ code --install-extension bin/roo-cline-.vsix Спасибо всем нашим участникам, которые помогли сделать Roo Code лучше! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| KJ7LNW
KJ7LNW
| -| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| wkordalski
wkordalski
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| qdaxb
qdaxb
| Szpadel
Szpadel
| Premshay
Premshay
| sachasayan
sachasayan
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| lupuletic
lupuletic
| elianiva
elianiva
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| dtrugman
dtrugman
| emshvac
emshvac
| -| kyle-apex
kyle-apex
| pdecat
pdecat
| zhangtony239
zhangtony239
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| upamune
upamune
| -| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| philfung
philfung
| -| ross
ross
| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| -| vincentsong
vincentsong
| yongjer
yongjer
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| benzntech
benzntech
| bramburn
bramburn
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| -| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| napter
napter
| SplittyDev
SplittyDev
| mdp
mdp
| nevermorec
nevermorec
| -| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| -| shoopapa
shoopapa
| im47cn
im47cn
| hongzio
hongzio
| dqroid
dqroid
| dlab-anton
dlab-anton
| dairui1
dairui1
| -| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| jr
jr
| PretzelVector
PretzelVector
| cdlliuy
cdlliuy
| -| student20880
student20880
| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| shariqriazz
shariqriazz
| seedlord
seedlord
| samir-nimbly
samir-nimbly
| -| ronyblum
ronyblum
| refactorthis
refactorthis
| pokutuna
pokutuna
| philipnext
philipnext
| oprstchn
oprstchn
| nobu007
nobu007
| -| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| -| celestial-vault
celestial-vault
| linegel
linegel
| dbasclpy
dbasclpy
| dleen
dleen
| chadgauth
chadgauth
| bogdan0083
bogdan0083
| -| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| QuinsZouls
QuinsZouls
| alarno
alarno
| adamwlarson
adamwlarson
| -| AMHesch
AMHesch
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| vladstudio
vladstudio
| NamesMT
NamesMT
| -| tmsjngx0
tmsjngx0
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| samsilveira
samsilveira
| mr-ryan-james
mr-ryan-james
| 01Rian
01Rian
| -| Sarke
Sarke
| kvokka
kvokka
| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| libertyteeth
libertyteeth
| shtse8
shtse8
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|KJ7LNW
KJ7LNW
| +|nissa-seru
nissa-seru
|jquanton
jquanton
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|lloydchang
lloydchang
|cannuri
cannuri
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|sachasayan
sachasayan
|qdaxb
qdaxb
|zhangtony239
zhangtony239
|lupuletic
lupuletic
| +|Premshay
Premshay
|psv2522
psv2522
|elianiva
elianiva
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|anton-otee
anton-otee
| +|philfung
philfung
|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
| +|vagadiya
vagadiya
|vincentsong
vincentsong
|yongjer
yongjer
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| +|benzntech
benzntech
|axkirillov
axkirillov
|bramburn
bramburn
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|jr
jr
|julionav
julionav
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
| +|nevermorec
nevermorec
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| +|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|GOODBOY008
GOODBOY008
|dqroid
dqroid
| +|dlab-anton
dlab-anton
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|PretzelVector
PretzelVector
| +|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|shariqriazz
shariqriazz
|seedlord
seedlord
| +|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| +|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Jdo300
Jdo300
|hesara
hesara
| +|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|dbasclpy
dbasclpy
|dleen
dleen
|chadgauth
chadgauth
| +|olearycrew
olearycrew
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|QuinsZouls
QuinsZouls
| +|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
| +|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
| +|mr-ryan-james
mr-ryan-james
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
| | | | | ## Лицензия diff --git a/locales/tr/README.md b/locales/tr/README.md index 66a7d54c6f0..44b5f286187 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -178,33 +178,32 @@ Topluluk katkılarını seviyoruz! [CONTRIBUTING.md](CONTRIBUTING.md) dosyasın Roo Code'u daha iyi hale getirmeye yardımcı olan tüm katkıda bulunanlara teşekkür ederiz! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| KJ7LNW
KJ7LNW
| -| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| wkordalski
wkordalski
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| qdaxb
qdaxb
| Szpadel
Szpadel
| Premshay
Premshay
| sachasayan
sachasayan
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| lupuletic
lupuletic
| elianiva
elianiva
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| dtrugman
dtrugman
| emshvac
emshvac
| -| kyle-apex
kyle-apex
| pdecat
pdecat
| zhangtony239
zhangtony239
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| upamune
upamune
| -| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| philfung
philfung
| -| ross
ross
| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| -| vincentsong
vincentsong
| yongjer
yongjer
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| benzntech
benzntech
| bramburn
bramburn
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| -| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| napter
napter
| SplittyDev
SplittyDev
| mdp
mdp
| nevermorec
nevermorec
| -| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| -| shoopapa
shoopapa
| im47cn
im47cn
| hongzio
hongzio
| dqroid
dqroid
| dlab-anton
dlab-anton
| dairui1
dairui1
| -| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| jr
jr
| PretzelVector
PretzelVector
| cdlliuy
cdlliuy
| -| student20880
student20880
| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| shariqriazz
shariqriazz
| seedlord
seedlord
| samir-nimbly
samir-nimbly
| -| ronyblum
ronyblum
| refactorthis
refactorthis
| pokutuna
pokutuna
| philipnext
philipnext
| oprstchn
oprstchn
| nobu007
nobu007
| -| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| -| celestial-vault
celestial-vault
| linegel
linegel
| dbasclpy
dbasclpy
| dleen
dleen
| chadgauth
chadgauth
| bogdan0083
bogdan0083
| -| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| QuinsZouls
QuinsZouls
| alarno
alarno
| adamwlarson
adamwlarson
| -| AMHesch
AMHesch
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| vladstudio
vladstudio
| NamesMT
NamesMT
| -| tmsjngx0
tmsjngx0
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| samsilveira
samsilveira
| mr-ryan-james
mr-ryan-james
| 01Rian
01Rian
| -| Sarke
Sarke
| kvokka
kvokka
| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| libertyteeth
libertyteeth
| shtse8
shtse8
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|KJ7LNW
KJ7LNW
| +|nissa-seru
nissa-seru
|jquanton
jquanton
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|lloydchang
lloydchang
|cannuri
cannuri
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|sachasayan
sachasayan
|qdaxb
qdaxb
|zhangtony239
zhangtony239
|lupuletic
lupuletic
| +|Premshay
Premshay
|psv2522
psv2522
|elianiva
elianiva
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|anton-otee
anton-otee
| +|philfung
philfung
|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
| +|vagadiya
vagadiya
|vincentsong
vincentsong
|yongjer
yongjer
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| +|benzntech
benzntech
|axkirillov
axkirillov
|bramburn
bramburn
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|jr
jr
|julionav
julionav
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
| +|nevermorec
nevermorec
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| +|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|GOODBOY008
GOODBOY008
|dqroid
dqroid
| +|dlab-anton
dlab-anton
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|PretzelVector
PretzelVector
| +|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|shariqriazz
shariqriazz
|seedlord
seedlord
| +|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| +|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Jdo300
Jdo300
|hesara
hesara
| +|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|dbasclpy
dbasclpy
|dleen
dleen
|chadgauth
chadgauth
| +|olearycrew
olearycrew
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|QuinsZouls
QuinsZouls
| +|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
| +|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
| +|mr-ryan-james
mr-ryan-james
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
| | | | | ## Lisans diff --git a/locales/vi/README.md b/locales/vi/README.md index 1cef868b18e..5a63bd65348 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -178,33 +178,32 @@ Chúng tôi rất hoan nghênh đóng góp từ cộng đồng! Bắt đầu b Cảm ơn tất cả những người đóng góp đã giúp cải thiện Roo Code! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| KJ7LNW
KJ7LNW
| -| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| wkordalski
wkordalski
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| qdaxb
qdaxb
| Szpadel
Szpadel
| Premshay
Premshay
| sachasayan
sachasayan
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| lupuletic
lupuletic
| elianiva
elianiva
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| dtrugman
dtrugman
| emshvac
emshvac
| -| kyle-apex
kyle-apex
| pdecat
pdecat
| zhangtony239
zhangtony239
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| upamune
upamune
| -| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| philfung
philfung
| -| ross
ross
| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| -| vincentsong
vincentsong
| yongjer
yongjer
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| benzntech
benzntech
| bramburn
bramburn
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| -| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| napter
napter
| SplittyDev
SplittyDev
| mdp
mdp
| nevermorec
nevermorec
| -| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| -| shoopapa
shoopapa
| im47cn
im47cn
| hongzio
hongzio
| dqroid
dqroid
| dlab-anton
dlab-anton
| dairui1
dairui1
| -| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| jr
jr
| PretzelVector
PretzelVector
| cdlliuy
cdlliuy
| -| student20880
student20880
| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| shariqriazz
shariqriazz
| seedlord
seedlord
| samir-nimbly
samir-nimbly
| -| ronyblum
ronyblum
| refactorthis
refactorthis
| pokutuna
pokutuna
| philipnext
philipnext
| oprstchn
oprstchn
| nobu007
nobu007
| -| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| -| celestial-vault
celestial-vault
| linegel
linegel
| dbasclpy
dbasclpy
| dleen
dleen
| chadgauth
chadgauth
| bogdan0083
bogdan0083
| -| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| QuinsZouls
QuinsZouls
| alarno
alarno
| adamwlarson
adamwlarson
| -| AMHesch
AMHesch
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| vladstudio
vladstudio
| NamesMT
NamesMT
| -| tmsjngx0
tmsjngx0
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| samsilveira
samsilveira
| mr-ryan-james
mr-ryan-james
| 01Rian
01Rian
| -| Sarke
Sarke
| kvokka
kvokka
| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| libertyteeth
libertyteeth
| shtse8
shtse8
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|KJ7LNW
KJ7LNW
| +|nissa-seru
nissa-seru
|jquanton
jquanton
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|lloydchang
lloydchang
|cannuri
cannuri
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|sachasayan
sachasayan
|qdaxb
qdaxb
|zhangtony239
zhangtony239
|lupuletic
lupuletic
| +|Premshay
Premshay
|psv2522
psv2522
|elianiva
elianiva
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|anton-otee
anton-otee
| +|philfung
philfung
|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
| +|vagadiya
vagadiya
|vincentsong
vincentsong
|yongjer
yongjer
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| +|benzntech
benzntech
|axkirillov
axkirillov
|bramburn
bramburn
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|jr
jr
|julionav
julionav
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
| +|nevermorec
nevermorec
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| +|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|GOODBOY008
GOODBOY008
|dqroid
dqroid
| +|dlab-anton
dlab-anton
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|PretzelVector
PretzelVector
| +|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|shariqriazz
shariqriazz
|seedlord
seedlord
| +|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| +|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Jdo300
Jdo300
|hesara
hesara
| +|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|dbasclpy
dbasclpy
|dleen
dleen
|chadgauth
chadgauth
| +|olearycrew
olearycrew
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|QuinsZouls
QuinsZouls
| +|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
| +|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
| +|mr-ryan-james
mr-ryan-james
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
| | | | | ## Giấy Phép diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index cda62290700..98e29ac8102 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -178,33 +178,32 @@ code --install-extension bin/roo-cline-.vsix 感谢所有帮助改进 Roo Code 的贡献者! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| KJ7LNW
KJ7LNW
| -| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| wkordalski
wkordalski
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| qdaxb
qdaxb
| Szpadel
Szpadel
| Premshay
Premshay
| sachasayan
sachasayan
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| lupuletic
lupuletic
| elianiva
elianiva
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| dtrugman
dtrugman
| emshvac
emshvac
| -| kyle-apex
kyle-apex
| pdecat
pdecat
| zhangtony239
zhangtony239
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| upamune
upamune
| -| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| philfung
philfung
| -| ross
ross
| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| -| vincentsong
vincentsong
| yongjer
yongjer
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| benzntech
benzntech
| bramburn
bramburn
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| -| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| napter
napter
| SplittyDev
SplittyDev
| mdp
mdp
| nevermorec
nevermorec
| -| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| -| shoopapa
shoopapa
| im47cn
im47cn
| hongzio
hongzio
| dqroid
dqroid
| dlab-anton
dlab-anton
| dairui1
dairui1
| -| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| jr
jr
| PretzelVector
PretzelVector
| cdlliuy
cdlliuy
| -| student20880
student20880
| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| shariqriazz
shariqriazz
| seedlord
seedlord
| samir-nimbly
samir-nimbly
| -| ronyblum
ronyblum
| refactorthis
refactorthis
| pokutuna
pokutuna
| philipnext
philipnext
| oprstchn
oprstchn
| nobu007
nobu007
| -| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| -| celestial-vault
celestial-vault
| linegel
linegel
| dbasclpy
dbasclpy
| dleen
dleen
| chadgauth
chadgauth
| bogdan0083
bogdan0083
| -| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| QuinsZouls
QuinsZouls
| alarno
alarno
| adamwlarson
adamwlarson
| -| AMHesch
AMHesch
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| vladstudio
vladstudio
| NamesMT
NamesMT
| -| tmsjngx0
tmsjngx0
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| samsilveira
samsilveira
| mr-ryan-james
mr-ryan-james
| 01Rian
01Rian
| -| Sarke
Sarke
| kvokka
kvokka
| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| libertyteeth
libertyteeth
| shtse8
shtse8
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|KJ7LNW
KJ7LNW
| +|nissa-seru
nissa-seru
|jquanton
jquanton
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|lloydchang
lloydchang
|cannuri
cannuri
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|sachasayan
sachasayan
|qdaxb
qdaxb
|zhangtony239
zhangtony239
|lupuletic
lupuletic
| +|Premshay
Premshay
|psv2522
psv2522
|elianiva
elianiva
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|anton-otee
anton-otee
| +|philfung
philfung
|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
| +|vagadiya
vagadiya
|vincentsong
vincentsong
|yongjer
yongjer
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| +|benzntech
benzntech
|axkirillov
axkirillov
|bramburn
bramburn
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|jr
jr
|julionav
julionav
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
| +|nevermorec
nevermorec
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| +|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|GOODBOY008
GOODBOY008
|dqroid
dqroid
| +|dlab-anton
dlab-anton
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|PretzelVector
PretzelVector
| +|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|shariqriazz
shariqriazz
|seedlord
seedlord
| +|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| +|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Jdo300
Jdo300
|hesara
hesara
| +|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|dbasclpy
dbasclpy
|dleen
dleen
|chadgauth
chadgauth
| +|olearycrew
olearycrew
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|QuinsZouls
QuinsZouls
| +|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
| +|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
| +|mr-ryan-james
mr-ryan-james
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
| | | | | ## 许可证 diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index 29ca9a66f4a..91151e07638 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -179,33 +179,32 @@ code --install-extension bin/roo-cline-.vsix 感謝所有幫助改進 Roo Code 的貢獻者! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| a8trejo
a8trejo
| -| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| ColemanRoo
ColemanRoo
| stea9499
stea9499
| joemanley201
joemanley201
| System233
System233
| hannesrudolph
hannesrudolph
| KJ7LNW
KJ7LNW
| -| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| MuriloFP
MuriloFP
| d-oit
d-oit
| punkpeye
punkpeye
| -| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| wkordalski
wkordalski
| feifei325
feifei325
| cannuri
cannuri
| lloydchang
lloydchang
| -| vigneshsubbiah16
vigneshsubbiah16
| qdaxb
qdaxb
| Szpadel
Szpadel
| Premshay
Premshay
| sachasayan
sachasayan
| psv2522
psv2522
| -| diarmidmackenzie
diarmidmackenzie
| lupuletic
lupuletic
| elianiva
elianiva
| olweraltuve
olweraltuve
| afshawnlotfi
afshawnlotfi
| pugazhendhi-m
pugazhendhi-m
| -| aheizi
aheizi
| RaySinner
RaySinner
| PeterDaveHello
PeterDaveHello
| nbihan-mediware
nbihan-mediware
| dtrugman
dtrugman
| emshvac
emshvac
| -| kyle-apex
kyle-apex
| pdecat
pdecat
| zhangtony239
zhangtony239
| Lunchb0ne
Lunchb0ne
| arthurauffray
arthurauffray
| upamune
upamune
| -| StevenTCramer
StevenTCramer
| sammcj
sammcj
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| philfung
philfung
| -| ross
ross
| heyseth
heyseth
| taisukeoe
taisukeoe
| eonghk
eonghk
| teddyOOXX
teddyOOXX
| vagadiya
vagadiya
| -| vincentsong
vincentsong
| yongjer
yongjer
| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| axkirillov
axkirillov
| -| anton-otee
anton-otee
| benzntech
benzntech
| bramburn
bramburn
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| -| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| napter
napter
| SplittyDev
SplittyDev
| mdp
mdp
| nevermorec
nevermorec
| -| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| kohii
kohii
| kinandan
kinandan
| jwcraig
jwcraig
| -| shoopapa
shoopapa
| im47cn
im47cn
| hongzio
hongzio
| dqroid
dqroid
| dlab-anton
dlab-anton
| dairui1
dairui1
| -| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| jr
jr
| PretzelVector
PretzelVector
| cdlliuy
cdlliuy
| -| student20880
student20880
| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| shariqriazz
shariqriazz
| seedlord
seedlord
| samir-nimbly
samir-nimbly
| -| ronyblum
ronyblum
| refactorthis
refactorthis
| pokutuna
pokutuna
| philipnext
philipnext
| oprstchn
oprstchn
| nobu007
nobu007
| -| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| mlopezr
mlopezr
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| -| celestial-vault
celestial-vault
| linegel
linegel
| dbasclpy
dbasclpy
| dleen
dleen
| chadgauth
chadgauth
| bogdan0083
bogdan0083
| -| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| QuinsZouls
QuinsZouls
| alarno
alarno
| adamwlarson
adamwlarson
| -| AMHesch
AMHesch
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| vladstudio
vladstudio
| NamesMT
NamesMT
| -| tmsjngx0
tmsjngx0
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| samsilveira
samsilveira
| mr-ryan-james
mr-ryan-james
| 01Rian
01Rian
| -| Sarke
Sarke
| kvokka
kvokka
| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| libertyteeth
libertyteeth
| shtse8
shtse8
| - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|a8trejo
a8trejo
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|ColemanRoo
ColemanRoo
|stea9499
stea9499
|joemanley201
joemanley201
|System233
System233
|hannesrudolph
hannesrudolph
|KJ7LNW
KJ7LNW
| +|nissa-seru
nissa-seru
|jquanton
jquanton
|NyxJae
NyxJae
|MuriloFP
MuriloFP
|d-oit
d-oit
|punkpeye
punkpeye
| +|Smartsheet-JB-Brown
Smartsheet-JB-Brown
|monotykamary
monotykamary
|wkordalski
wkordalski
|feifei325
feifei325
|lloydchang
lloydchang
|cannuri
cannuri
| +|vigneshsubbiah16
vigneshsubbiah16
|Szpadel
Szpadel
|sachasayan
sachasayan
|qdaxb
qdaxb
|zhangtony239
zhangtony239
|lupuletic
lupuletic
| +|Premshay
Premshay
|psv2522
psv2522
|elianiva
elianiva
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|afshawnlotfi
afshawnlotfi
| +|pugazhendhi-m
pugazhendhi-m
|aheizi
aheizi
|RaySinner
RaySinner
|PeterDaveHello
PeterDaveHello
|nbihan-mediware
nbihan-mediware
|dtrugman
dtrugman
| +|emshvac
emshvac
|kyle-apex
kyle-apex
|pdecat
pdecat
|Lunchb0ne
Lunchb0ne
|arthurauffray
arthurauffray
|upamune
upamune
| +|StevenTCramer
StevenTCramer
|sammcj
sammcj
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|anton-otee
anton-otee
| +|philfung
philfung
|ross
ross
|heyseth
heyseth
|taisukeoe
taisukeoe
|eonghk
eonghk
|teddyOOXX
teddyOOXX
| +|vagadiya
vagadiya
|vincentsong
vincentsong
|yongjer
yongjer
|ashktn
ashktn
|franekp
franekp
|yt3trees
yt3trees
| +|benzntech
benzntech
|axkirillov
axkirillov
|bramburn
bramburn
|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
| +|Chenjiayuan195
Chenjiayuan195
|jr
jr
|julionav
julionav
|SplittyDev
SplittyDev
|mdp
mdp
|napter
napter
| +|nevermorec
nevermorec
|mecab
mecab
|olup
olup
|lightrabbit
lightrabbit
|kohii
kohii
|kinandan
kinandan
| +|jwcraig
jwcraig
|shoopapa
shoopapa
|im47cn
im47cn
|hongzio
hongzio
|GOODBOY008
GOODBOY008
|dqroid
dqroid
| +|dlab-anton
dlab-anton
|dairui1
dairui1
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
|PretzelVector
PretzelVector
| +|cdlliuy
cdlliuy
|student20880
student20880
|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|shariqriazz
shariqriazz
|seedlord
seedlord
| +|samir-nimbly
samir-nimbly
|ronyblum
ronyblum
|refactorthis
refactorthis
|pokutuna
pokutuna
|philipnext
philipnext
|oprstchn
oprstchn
| +|nobu007
nobu007
|mosleyit
mosleyit
|moqimoqidea
moqimoqidea
|mlopezr
mlopezr
|Jdo300
Jdo300
|hesara
hesara
| +|DeXtroTip
DeXtroTip
|celestial-vault
celestial-vault
|linegel
linegel
|dbasclpy
dbasclpy
|dleen
dleen
|chadgauth
chadgauth
| +|olearycrew
olearycrew
|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|QuinsZouls
QuinsZouls
| +|alarno
alarno
|adamwlarson
adamwlarson
|AMHesch
AMHesch
|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
| +|vladstudio
vladstudio
|NamesMT
NamesMT
|tmsjngx0
tmsjngx0
|tgfjt
tgfjt
|maekawataiki
maekawataiki
|samsilveira
samsilveira
| +|mr-ryan-james
mr-ryan-james
|01Rian
01Rian
|Sarke
Sarke
|kvokka
kvokka
|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
| +|libertyteeth
libertyteeth
|shtse8
shtse8
| | | | | ## 授權 From e483f9bb9dad868da50ed908227f5f6236ee6244 Mon Sep 17 00:00:00 2001 From: R00-B0T <110429663+R00-B0T@users.noreply.github.com> Date: Fri, 2 May 2025 08:38:44 -0700 Subject: [PATCH 19/29] Changeset version bump (#3098) * changeset version bump * Update CHANGELOG.md * Update CHANGELOG.md * Update CHANGELOG.md --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens --- .changeset/spicy-tips-fail.md | 5 ----- .changeset/v3.15.2.md | 11 ----------- CHANGELOG.md | 10 ++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 5 files changed, 13 insertions(+), 19 deletions(-) delete mode 100644 .changeset/spicy-tips-fail.md delete mode 100644 .changeset/v3.15.2.md diff --git a/.changeset/spicy-tips-fail.md b/.changeset/spicy-tips-fail.md deleted file mode 100644 index 25f387c973f..00000000000 --- a/.changeset/spicy-tips-fail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -Design Engineer Roomode diff --git a/.changeset/v3.15.2.md b/.changeset/v3.15.2.md deleted file mode 100644 index ad410ff0b87..00000000000 --- a/.changeset/v3.15.2.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"roo-cline": patch ---- - -- Fix terminal performance issues -- Handle Mermaid validation errors and copy both error message and content -- Add customizable headers for OpenAI-compatible provider -- Add config option to overwrite OpenAI's API base (thanks @GOODBOY008!) -- Fixes to padding and height issues when resizing the sidebar (thanks @zhangtony239!) -- Remove tool groups from orchestrator mode definition -- Add telemetry for title button clicks diff --git a/CHANGELOG.md b/CHANGELOG.md index 14634c44516..8e7a9766160 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Roo Code Changelog +## [3.15.2] - 2025-05-02 + +- Fix terminal performance issues +- Handle Mermaid validation errors +- Add customizable headers for OpenAI-compatible provider (thanks @mark-bradshaw!) +- Add config option to overwrite OpenAI's API base (thanks @GOODBOY008!) +- Fixes to padding and height issues when resizing the sidebar (thanks @zhangtony239!) +- Remove tool groups from orchestrator mode definition +- Add telemetry for title button clicks + ## [3.15.1] - 2025-04-30 - Capture stderr in execa-spawned processes diff --git a/package-lock.json b/package-lock.json index 3dc8c66a83c..528e962b899 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "roo-cline", - "version": "3.15.1", + "version": "3.15.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "roo-cline", - "version": "3.15.1", + "version": "3.15.2", "dependencies": { "@anthropic-ai/bedrock-sdk": "^0.10.2", "@anthropic-ai/sdk": "^0.37.0", diff --git a/package.json b/package.json index 6a92a10a9e5..44f516ffd2c 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "%extension.displayName%", "description": "%extension.description%", "publisher": "RooVeterinaryInc", - "version": "3.15.1", + "version": "3.15.2", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", From aae6fc0ad258173f893efda1a53da17408369168 Mon Sep 17 00:00:00 2001 From: Aleks Volochnev Date: Fri, 2 May 2025 20:16:39 +0200 Subject: [PATCH 20/29] Updates `terminal.zshOhMy` description (#3125) Updates settings description - Updates setting terminal.zshOhMY.description to mention need to restart IDE to apply the changes --- webview-ui/src/i18n/locales/ca/settings.json | 2 +- webview-ui/src/i18n/locales/de/settings.json | 2 +- webview-ui/src/i18n/locales/en/settings.json | 2 +- webview-ui/src/i18n/locales/es/settings.json | 2 +- webview-ui/src/i18n/locales/fr/settings.json | 2 +- webview-ui/src/i18n/locales/hi/settings.json | 2 +- webview-ui/src/i18n/locales/it/settings.json | 2 +- webview-ui/src/i18n/locales/ja/settings.json | 2 +- webview-ui/src/i18n/locales/ko/settings.json | 2 +- webview-ui/src/i18n/locales/pl/settings.json | 2 +- webview-ui/src/i18n/locales/pt-BR/settings.json | 2 +- webview-ui/src/i18n/locales/ru/settings.json | 2 +- webview-ui/src/i18n/locales/tr/settings.json | 2 +- webview-ui/src/i18n/locales/vi/settings.json | 2 +- webview-ui/src/i18n/locales/zh-CN/settings.json | 2 +- webview-ui/src/i18n/locales/zh-TW/settings.json | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 7f26f797c16..91ed2326c1d 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -344,7 +344,7 @@ }, "zshOhMy": { "label": "Habilita la integració Oh My Zsh", - "description": "Quan està habilitat, estableix ITERM_SHELL_INTEGRATION_INSTALLED=Yes per habilitar les característiques d'integració del shell Oh My Zsh. (experimental)" + "description": "Quan està habilitat, estableix ITERM_SHELL_INTEGRATION_INSTALLED=Yes per habilitar les característiques d'integració del shell Oh My Zsh. Aplicar aquesta configuració pot requerir reiniciar l'IDE. (experimental)" }, "zshP10k": { "label": "Habilita la integració Powerlevel10k", diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index 6447004a224..3db3f0b4d4b 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -344,7 +344,7 @@ }, "zshOhMy": { "label": "Oh My Zsh-Integration aktivieren", - "description": "Wenn aktiviert, wird ITERM_SHELL_INTEGRATION_INSTALLED=Yes gesetzt, um die Shell-Integrationsfunktionen von Oh My Zsh zu aktivieren. (experimentell)" + "description": "Wenn aktiviert, wird ITERM_SHELL_INTEGRATION_INSTALLED=Yes gesetzt, um die Shell-Integrationsfunktionen von Oh My Zsh zu aktivieren. Das Anwenden dieser Einstellung erfordert möglicherweise einen Neustart der IDE. (experimentell)" }, "zshP10k": { "label": "Powerlevel10k-Integration aktivieren", diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 3701d8a69c8..fe585334832 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -340,7 +340,7 @@ }, "zshOhMy": { "label": "Enable Oh My Zsh integration", - "description": "When enabled, sets ITERM_SHELL_INTEGRATION_INSTALLED=Yes to enable Oh My Zsh shell integration features. (experimental)" + "description": "When enabled, sets ITERM_SHELL_INTEGRATION_INSTALLED=Yes to enable Oh My Zsh shell integration features. Applying this setting might require restarting the IDE. (experimental)" }, "zshP10k": { "label": "Enable Powerlevel10k integration", diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index 7108f60a1b1..882f171abab 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -344,7 +344,7 @@ }, "zshOhMy": { "label": "Habilitar integración Oh My Zsh", - "description": "Cuando está habilitado, establece ITERM_SHELL_INTEGRATION_INSTALLED=Yes para habilitar las características de integración del shell Oh My Zsh. (experimental)" + "description": "Cuando está habilitado, establece ITERM_SHELL_INTEGRATION_INSTALLED=Yes para habilitar las características de integración del shell Oh My Zsh. Aplicar esta configuración puede requerir reiniciar el IDE. (experimental)" }, "zshP10k": { "label": "Habilitar integración Powerlevel10k", diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index f81424539dd..00abf194d1d 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -344,7 +344,7 @@ }, "zshOhMy": { "label": "Activer l'intégration Oh My Zsh", - "description": "Lorsqu'activé, définit ITERM_SHELL_INTEGRATION_INSTALLED=Yes pour activer les fonctionnalités d'intégration du shell Oh My Zsh. (expérimental)" + "description": "Lorsqu'activé, définit ITERM_SHELL_INTEGRATION_INSTALLED=Yes pour activer les fonctionnalités d'intégration du shell Oh My Zsh. L'application de ce paramètre peut nécessiter le redémarrage de l'IDE. (expérimental)" }, "zshP10k": { "label": "Activer l'intégration Powerlevel10k", diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index eda9195811e..2d4b527bb6e 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -344,7 +344,7 @@ }, "zshOhMy": { "label": "Oh My Zsh एकीकरण सक्षम करें", - "description": "सक्षम होने पर, Oh My Zsh शेल एकीकरण सुविधाओं को सक्षम करने के लिए ITERM_SHELL_INTEGRATION_INSTALLED=Yes सेट करता है। (प्रयोगात्मक)" + "description": "सक्षम होने पर, Oh My Zsh शेल एकीकरण सुविधाओं को सक्षम करने के लिए ITERM_SHELL_INTEGRATION_INSTALLED=Yes सेट करता है। इस सेटिंग को लागू करने के लिए IDE को पुनरारंभ करने की आवश्यकता हो सकती है। (प्रयोगात्मक)" }, "zshP10k": { "label": "Powerlevel10k एकीकरण सक्षम करें", diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 24a2bd210e1..8b6f068b907 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -344,7 +344,7 @@ }, "zshOhMy": { "label": "Abilita integrazione Oh My Zsh", - "description": "Quando abilitato, imposta ITERM_SHELL_INTEGRATION_INSTALLED=Yes per abilitare le funzionalità di integrazione della shell Oh My Zsh. (sperimentale)" + "description": "Quando abilitato, imposta ITERM_SHELL_INTEGRATION_INSTALLED=Yes per abilitare le funzionalità di integrazione della shell Oh My Zsh. L'applicazione di questa impostazione potrebbe richiedere il riavvio dell'IDE. (sperimentale)" }, "zshP10k": { "label": "Abilita integrazione Powerlevel10k", diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index 84fa016eda2..0eee0902a44 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -344,7 +344,7 @@ }, "zshOhMy": { "label": "Oh My Zsh 統合を有効化", - "description": "有効にすると、ITERM_SHELL_INTEGRATION_INSTALLED=Yes を設定して Oh My Zsh シェル統合機能を有効にします。(実験的)" + "description": "有効にすると、ITERM_SHELL_INTEGRATION_INSTALLED=Yes を設定して Oh My Zsh シェル統合機能を有効にします。この設定を適用するには、IDEの再起動が必要な場合があります。(実験的)" }, "zshP10k": { "label": "Powerlevel10k 統合を有効化", diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index 48123b7670a..db1ed2d3c84 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -344,7 +344,7 @@ }, "zshOhMy": { "label": "Oh My Zsh 통합 활성화", - "description": "활성화하면 ITERM_SHELL_INTEGRATION_INSTALLED=Yes를 설정하여 Oh My Zsh 셸 통합 기능을 활성화합니다. (실험적)" + "description": "활성화하면 ITERM_SHELL_INTEGRATION_INSTALLED=Yes를 설정하여 Oh My Zsh 셸 통합 기능을 활성화합니다. 이 설정을 적용하려면 IDE를 다시 시작해야 할 수 있습니다. (실험적)" }, "zshP10k": { "label": "Powerlevel10k 통합 활성화", diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 5128a700320..fbc1b375e04 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -344,7 +344,7 @@ }, "zshOhMy": { "label": "Włącz integrację Oh My Zsh", - "description": "Po włączeniu ustawia ITERM_SHELL_INTEGRATION_INSTALLED=Yes, aby włączyć funkcje integracji powłoki Oh My Zsh. (eksperymentalne)" + "description": "Po włączeniu ustawia ITERM_SHELL_INTEGRATION_INSTALLED=Yes, aby włączyć funkcje integracji powłoki Oh My Zsh. Zastosowanie tego ustawienia może wymagać ponownego uruchomienia IDE. (eksperymentalne)" }, "zshP10k": { "label": "Włącz integrację Powerlevel10k", diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index e7439bfef7a..d8d683f8477 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -344,7 +344,7 @@ }, "zshOhMy": { "label": "Ativar integração Oh My Zsh", - "description": "Quando ativado, define ITERM_SHELL_INTEGRATION_INSTALLED=Yes para habilitar os recursos de integração do shell Oh My Zsh. (experimental)" + "description": "Quando ativado, define ITERM_SHELL_INTEGRATION_INSTALLED=Yes para habilitar os recursos de integração do shell Oh My Zsh. A aplicação desta configuração pode exigir a reinicialização do IDE. (experimental)" }, "zshP10k": { "label": "Ativar integração Powerlevel10k", diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index 9a72541eae0..85e0432e156 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -340,7 +340,7 @@ }, "zshOhMy": { "label": "Включить интеграцию Oh My Zsh", - "description": "Если включено, устанавливает ITERM_SHELL_INTEGRATION_INSTALLED=Yes для поддержки функций интеграции Oh My Zsh. (экспериментально)" + "description": "Если включено, устанавливает ITERM_SHELL_INTEGRATION_INSTALLED=Yes для поддержки функций интеграции Oh My Zsh. Применение этой настройки может потребовать перезапуска IDE. (экспериментально)" }, "zshP10k": { "label": "Включить интеграцию Powerlevel10k", diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index 3d55385faf2..ffd586bf023 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -344,7 +344,7 @@ }, "zshOhMy": { "label": "Oh My Zsh entegrasyonunu etkinleştir", - "description": "Etkinleştirildiğinde, Oh My Zsh kabuk entegrasyon özelliklerini etkinleştirmek için ITERM_SHELL_INTEGRATION_INSTALLED=Yes ayarlar. (deneysel)" + "description": "Etkinleştirildiğinde, Oh My Zsh kabuk entegrasyon özelliklerini etkinleştirmek için ITERM_SHELL_INTEGRATION_INSTALLED=Yes ayarlar. Bu ayarın uygulanması IDE'nin yeniden başlatılmasını gerektirebilir. (deneysel)" }, "zshP10k": { "label": "Powerlevel10k entegrasyonunu etkinleştir", diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index c70115e77e3..1ef56743355 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -344,7 +344,7 @@ }, "zshOhMy": { "label": "Bật tích hợp Oh My Zsh", - "description": "Khi được bật, đặt ITERM_SHELL_INTEGRATION_INSTALLED=Yes để kích hoạt các tính năng tích hợp shell của Oh My Zsh. (thử nghiệm)" + "description": "Khi được bật, đặt ITERM_SHELL_INTEGRATION_INSTALLED=Yes để kích hoạt các tính năng tích hợp shell của Oh My Zsh. Việc áp dụng cài đặt này có thể yêu cầu khởi động lại IDE. (thử nghiệm)" }, "zshP10k": { "label": "Bật tích hợp Powerlevel10k", diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index f9aa5177e06..7ecfa8024c5 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -344,7 +344,7 @@ }, "zshOhMy": { "label": "启用 Oh My Zsh 集成", - "description": "启用后,设置 ITERM_SHELL_INTEGRATION_INSTALLED=Yes 以启用 Oh My Zsh shell 集成功能。(实验性)" + "description": "启用后,设置 ITERM_SHELL_INTEGRATION_INSTALLED=Yes 以启用 Oh My Zsh shell 集成功能。应用此设置可能需要重启 IDE。(实验性)" }, "zshP10k": { "label": "启用 Powerlevel10k 集成", diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index 1d329752fe1..32b9f709769 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -344,7 +344,7 @@ }, "zshOhMy": { "label": "啟用 Oh My Zsh 整合", - "description": "啟用後,設定 ITERM_SHELL_INTEGRATION_INSTALLED=Yes 以啟用 Oh My Zsh shell 整合功能。(實驗性)" + "description": "啟用後,設定 ITERM_SHELL_INTEGRATION_INSTALLED=Yes 以啟用 Oh My Zsh shell 整合功能。套用此設定可能需要重新啟動 IDE。(實驗性)" }, "zshP10k": { "label": "啟用 Powerlevel10k 整合", From 369e3a610b8bd3a1f74df1f60cf2751fe46aab3a Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Fri, 2 May 2025 14:50:43 -0700 Subject: [PATCH 21/29] Update default settings for evals (#3130) --- evals/packages/types/src/roo-code-defaults.ts | 30 ++++++++++++++++++- evals/packages/types/src/roo-code.ts | 2 -- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/evals/packages/types/src/roo-code-defaults.ts b/evals/packages/types/src/roo-code-defaults.ts index 42d9a1bc9fa..442510976bf 100644 --- a/evals/packages/types/src/roo-code-defaults.ts +++ b/evals/packages/types/src/roo-code-defaults.ts @@ -6,6 +6,8 @@ export const rooCodeDefaults: RooCodeSettings = { lastShownAnnouncementId: "apr-30-2025-3-15", + pinnedApiConfigs: {}, + autoApprovalEnabled: true, alwaysAllowReadOnly: true, alwaysAllowReadOnlyOutsideWorkspace: false, @@ -22,17 +24,43 @@ export const rooCodeDefaults: RooCodeSettings = { allowedCommands: ["*"], browserToolEnabled: false, + browserViewportSize: "900x600", + screenshotQuality: 75, + remoteBrowserEnabled: false, + + ttsEnabled: false, + ttsSpeed: 1, + soundEnabled: false, + soundVolume: 0.5, + + terminalOutputLineLimit: 500, + terminalShellIntegrationTimeout: 30000, + terminalCommandDelay: 0, + terminalPowershellCounter: false, + terminalZshOhMy: true, + terminalZshClearEolMark: true, + terminalZshP10k: false, + terminalZdotdir: true, + terminalCompressProgressBar: true, + terminalShellIntegrationDisabled: true, + + diffEnabled: true, + fuzzyMatchThreshold: 1, enableCheckpoints: false, + rateLimitSeconds: 0, maxOpenTabsContext: 20, maxWorkspaceFiles: 200, showRooIgnoredFiles: true, maxReadFileLine: 500, - terminalShellIntegrationDisabled: true, + language: "en", + telemetrySetting: "enabled", mcpEnabled: false, mode: "code", + + customModes: [], } diff --git a/evals/packages/types/src/roo-code.ts b/evals/packages/types/src/roo-code.ts index 8070bdeea0a..f530dc3ea1e 100644 --- a/evals/packages/types/src/roo-code.ts +++ b/evals/packages/types/src/roo-code.ts @@ -399,8 +399,6 @@ export const providerSettingsSchema = z.object({ // OpenAI Native openAiNativeApiKey: z.string().optional(), openAiNativeBaseUrl: z.string().optional(), - // XAI - xaiApiKey: z.string().optional(), // Mistral mistralApiKey: z.string().optional(), mistralCodestralUrl: z.string().optional(), From 19ef52bd85c3515ee0dec4ce1a1c123a7df092ed Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Fri, 2 May 2025 14:51:53 -0700 Subject: [PATCH 22/29] More command execution improvements (#3124) --- src/core/tools/executeCommandTool.ts | 1 - webview-ui/src/components/chat/CommandExecution.tsx | 2 +- webview-ui/src/components/chat/CommandExecutionError.tsx | 2 +- webview-ui/src/i18n/locales/ca/chat.json | 6 +++--- webview-ui/src/i18n/locales/de/chat.json | 8 ++++---- webview-ui/src/i18n/locales/en/chat.json | 4 ++-- webview-ui/src/i18n/locales/es/chat.json | 6 +++--- webview-ui/src/i18n/locales/fr/chat.json | 6 +++--- webview-ui/src/i18n/locales/hi/chat.json | 6 +++--- webview-ui/src/i18n/locales/it/chat.json | 6 +++--- webview-ui/src/i18n/locales/ja/chat.json | 6 +++--- webview-ui/src/i18n/locales/ko/chat.json | 8 ++++---- webview-ui/src/i18n/locales/pl/chat.json | 6 +++--- webview-ui/src/i18n/locales/pt-BR/chat.json | 6 +++--- webview-ui/src/i18n/locales/ru/chat.json | 6 +++--- webview-ui/src/i18n/locales/tr/chat.json | 8 ++++---- webview-ui/src/i18n/locales/vi/chat.json | 8 ++++---- webview-ui/src/i18n/locales/zh-CN/chat.json | 6 +++--- webview-ui/src/i18n/locales/zh-TW/chat.json | 6 +++--- 19 files changed, 53 insertions(+), 54 deletions(-) diff --git a/src/core/tools/executeCommandTool.ts b/src/core/tools/executeCommandTool.ts index 7db12668c86..f3f655b0363 100644 --- a/src/core/tools/executeCommandTool.ts +++ b/src/core/tools/executeCommandTool.ts @@ -79,7 +79,6 @@ export async function executeCommandTool( } catch (error: unknown) { const status: CommandExecutionStatus = { executionId, status: "fallback" } clineProvider?.postMessageToWebview({ type: "commandExecutionStatus", text: JSON.stringify(status) }) - clineProvider?.setValue("terminalShellIntegrationDisabled", true) await cline.say("shell_integration_warning") if (error instanceof ShellIntegrationError) { diff --git a/webview-ui/src/components/chat/CommandExecution.tsx b/webview-ui/src/components/chat/CommandExecution.tsx index 2a5600d06ba..f5cd63ff03d 100644 --- a/webview-ui/src/components/chat/CommandExecution.tsx +++ b/webview-ui/src/components/chat/CommandExecution.tsx @@ -87,7 +87,7 @@ export const CommandExecution = ({ executionId, text }: CommandExecutionProps) = }, [status, text]) return ( -
+
{command}
diff --git a/webview-ui/src/components/chat/CommandExecutionError.tsx b/webview-ui/src/components/chat/CommandExecutionError.tsx index 14041b7dca1..3c8c6273c19 100644 --- a/webview-ui/src/components/chat/CommandExecutionError.tsx +++ b/webview-ui/src/components/chat/CommandExecutionError.tsx @@ -11,7 +11,7 @@ export const CommandExecutionError = () => { }, []) return ( -
+
diff --git a/webview-ui/src/i18n/locales/ca/chat.json b/webview-ui/src/i18n/locales/ca/chat.json index 9d081e737ac..282cac6a64c 100644 --- a/webview-ui/src/i18n/locales/ca/chat.json +++ b/webview-ui/src/i18n/locales/ca/chat.json @@ -90,6 +90,7 @@ } }, "selectMode": "Selecciona el mode d'interacció", + "selectApiConfig": "Seleccioneu la configuració de l'API", "enhancePrompt": "Millora la sol·licitud amb context addicional", "addImages": "Afegeix imatges al missatge", "sendMessage": "Envia el missatge", @@ -233,10 +234,9 @@ } }, "systemPromptWarning": "ADVERTÈNCIA: S'ha activat una substitució personalitzada d'instruccions del sistema. Això pot trencar greument la funcionalitat i causar un comportament impredictible.", - "selectApiConfig": "Seleccioneu la configuració de l'API", "shellIntegration": { - "title": "Integració de Shell no disponible", - "description": "La teva ordre s'està executant sense la integració de shell de VSCode. Pots tornar a activar la integració de shell a la secció Terminal de la configuració de Roo Code.", + "title": "Advertència d'execució d'ordres", + "description": "La teva ordre s'està executant sense la integració de shell del terminal VSCode. Per suprimir aquest advertiment, pots desactivar la integració de shell a la secció Terminal de la configuració de Roo Code o solucionar problemes d'integració del terminal VSCode utilitzant l'enllaç a continuació.", "troubleshooting": "Fes clic aquí per a la documentació d'integració de shell." } } diff --git a/webview-ui/src/i18n/locales/de/chat.json b/webview-ui/src/i18n/locales/de/chat.json index 32a4e852d44..7d4a7990ebd 100644 --- a/webview-ui/src/i18n/locales/de/chat.json +++ b/webview-ui/src/i18n/locales/de/chat.json @@ -90,6 +90,7 @@ } }, "selectMode": "Interaktionsmodus auswählen", + "selectApiConfig": "API-Konfiguration auswählen", "enhancePrompt": "Prompt mit zusätzlichem Kontext verbessern", "addImages": "Bilder zur Nachricht hinzufügen", "sendMessage": "Nachricht senden", @@ -233,10 +234,9 @@ } }, "systemPromptWarning": "WARNUNG: Benutzerdefinierte Systemaufforderung aktiv. Dies kann die Funktionalität erheblich beeinträchtigen und zu unvorhersehbarem Verhalten führen.", - "selectApiConfig": "API-Konfiguration auswählen", "shellIntegration": { - "title": "Shell-Integration nicht verfügbar", - "description": "Dein Befehl wird ohne VSCode-Shell-Integration ausgeführt. Du kannst die Shell-Integration im Bereich Terminal in den Roo Code Einstellungen wieder aktivieren.", - "troubleshooting": "Klicke hier für die Shell-Integrations-Dokumentation." + "title": "Befehlsausführungswarnung", + "description": "Dein Befehl wird ohne VSCode Terminal-Shell-Integration ausgeführt. Um diese Warnung zu unterdrücken, kannst du die Shell-Integration im Abschnitt Terminal der Roo Code Einstellungen deaktivieren oder die VSCode Terminal-Integration mit dem Link unten beheben.", + "troubleshooting": "Klicke hier für die Shell-Integrationsdokumentation." } } diff --git a/webview-ui/src/i18n/locales/en/chat.json b/webview-ui/src/i18n/locales/en/chat.json index 803645a7e19..f810143084f 100644 --- a/webview-ui/src/i18n/locales/en/chat.json +++ b/webview-ui/src/i18n/locales/en/chat.json @@ -235,8 +235,8 @@ }, "systemPromptWarning": "WARNING: Custom system prompt override active. This can severely break functionality and cause unpredictable behavior.", "shellIntegration": { - "title": "Shell Integration Unavailable", - "description": "Your command is being executed without VSCode shell integration. You can re-enable shell integration in the Terminal section of the Roo Code settings.", + "title": "Command Execution Warning", + "description": "Your command is being executed without VSCode terminal shell integration. To suppress this warning you can disable shell integration in the Terminal section of the Roo Code settings or troubleshoot VSCode terminal integration using the link below.", "troubleshooting": "Click here for shell integration documentation." } } diff --git a/webview-ui/src/i18n/locales/es/chat.json b/webview-ui/src/i18n/locales/es/chat.json index b35e7336b66..afabbb6f64d 100644 --- a/webview-ui/src/i18n/locales/es/chat.json +++ b/webview-ui/src/i18n/locales/es/chat.json @@ -90,6 +90,7 @@ } }, "selectMode": "Seleccionar modo de interacción", + "selectApiConfig": "Seleccionar configuración de API", "enhancePrompt": "Mejorar el mensaje con contexto adicional", "addImages": "Agregar imágenes al mensaje", "sendMessage": "Enviar mensaje", @@ -233,10 +234,9 @@ } }, "systemPromptWarning": "ADVERTENCIA: Anulación de instrucciones del sistema personalizada activa. Esto puede romper gravemente la funcionalidad y causar un comportamiento impredecible.", - "selectApiConfig": "Seleccionar configuración de API", "shellIntegration": { - "title": "Integración de Shell no disponible", - "description": "Tu comando se está ejecutando sin la integración de shell de VSCode. Puedes reactivar la integración de shell en la sección Terminal de la configuración de Roo Code.", + "title": "Advertencia de ejecución de comandos", + "description": "Tu comando se está ejecutando sin la integración de shell de terminal de VSCode. Para suprimir esta advertencia, puedes desactivar la integración de shell en la sección Terminal de la configuración de Roo Code o solucionar problemas de integración de terminal de VSCode usando el enlace de abajo.", "troubleshooting": "Haz clic aquí para ver la documentación de integración de shell." } } diff --git a/webview-ui/src/i18n/locales/fr/chat.json b/webview-ui/src/i18n/locales/fr/chat.json index 725efc9be18..0627715e619 100644 --- a/webview-ui/src/i18n/locales/fr/chat.json +++ b/webview-ui/src/i18n/locales/fr/chat.json @@ -90,6 +90,7 @@ } }, "selectMode": "Sélectionner le mode d'interaction", + "selectApiConfig": "Sélectionner la configuration de l'API", "enhancePrompt": "Améliorer la requête avec un contexte supplémentaire", "addImages": "Ajouter des images au message", "sendMessage": "Envoyer le message", @@ -233,10 +234,9 @@ } }, "systemPromptWarning": "AVERTISSEMENT : Remplacement d'instructions système personnalisées actif. Cela peut gravement perturber la fonctionnalité et provoquer un comportement imprévisible.", - "selectApiConfig": "Sélectionner la configuration de l'API", "shellIntegration": { - "title": "Intégration Shell non disponible", - "description": "Votre commande est exécutée sans l'intégration shell de VSCode. Vous pouvez réactiver l'intégration shell dans la section Terminal des paramètres de Roo Code.", + "title": "Avertissement d'exécution de commande", + "description": "Votre commande est exécutée sans l'intégration shell du terminal VSCode. Pour supprimer cet avertissement, vous pouvez désactiver l'intégration shell dans la section Terminal des paramètres de Roo Code ou résoudre les problèmes d'intégration du terminal VSCode en utilisant le lien ci-dessous.", "troubleshooting": "Cliquez ici pour la documentation d'intégration shell." } } diff --git a/webview-ui/src/i18n/locales/hi/chat.json b/webview-ui/src/i18n/locales/hi/chat.json index 4c5e87dee5b..62aedebafda 100644 --- a/webview-ui/src/i18n/locales/hi/chat.json +++ b/webview-ui/src/i18n/locales/hi/chat.json @@ -90,6 +90,7 @@ } }, "selectMode": "इंटरैक्शन मोड चुनें", + "selectApiConfig": "एपीआई कॉन्फ़िगरेशन का चयन करें", "enhancePrompt": "अतिरिक्त संदर्भ के साथ प्रॉम्प्ट बढ़ाएँ", "addImages": "संदेश में चित्र जोड़ें", "sendMessage": "संदेश भेजें", @@ -233,10 +234,9 @@ } }, "systemPromptWarning": "चेतावनी: कस्टम सिस्टम प्रॉम्प्ट ओवरराइड सक्रिय है। यह कार्यक्षमता को गंभीर रूप से बाधित कर सकता है और अनियमित व्यवहार का कारण बन सकता है.", - "selectApiConfig": "एपीआई कॉन्फ़िगरेशन का चयन करें", "shellIntegration": { - "title": "शेल इंटीग्रेशन अनुपलब्ध", - "description": "आपका कमांड VSCode शेल इंटीग्रेशन के बिना निष्पादित हो रहा है। आप Roo Code सेटिंग्स के टर्मिनल अनुभाग में शेल इंटीग्रेशन को पुनः सक्षम कर सकते हैं।", + "title": "कमांड निष्पादन चेतावनी", + "description": "आपका कमांड VSCode टर्मिनल शेल इंटीग्रेशन के बिना निष्पादित हो रहा है। इस चेतावनी को दबाने के लिए आप Roo Code सेटिंग्स के Terminal अनुभाग में शेल इंटीग्रेशन को अक्षम कर सकते हैं या नीचे दिए गए लिंक का उपयोग करके VSCode टर्मिनल इंटीग्रेशन की समस्या का समाधान कर सकते हैं।", "troubleshooting": "शेल इंटीग्रेशन दस्तावेज़ के लिए यहां क्लिक करें।" } } diff --git a/webview-ui/src/i18n/locales/it/chat.json b/webview-ui/src/i18n/locales/it/chat.json index 102b8911c27..ac5163c69a7 100644 --- a/webview-ui/src/i18n/locales/it/chat.json +++ b/webview-ui/src/i18n/locales/it/chat.json @@ -90,6 +90,7 @@ } }, "selectMode": "Seleziona modalità di interazione", + "selectApiConfig": "Seleziona la configurazione API", "enhancePrompt": "Migliora prompt con contesto aggiuntivo", "addImages": "Aggiungi immagini al messaggio", "sendMessage": "Invia messaggio", @@ -233,10 +234,9 @@ } }, "systemPromptWarning": "ATTENZIONE: Sovrascrittura personalizzata delle istruzioni di sistema attiva. Questo può compromettere gravemente le funzionalità e causare comportamenti imprevedibili.", - "selectApiConfig": "Seleziona la configurazione API", "shellIntegration": { - "title": "Integrazione Shell non disponibile", - "description": "Il tuo comando viene eseguito senza l'integrazione shell di VSCode. Puoi riattivare l'integrazione shell nella sezione Terminal delle impostazioni di Roo Code.", + "title": "Avviso di esecuzione comando", + "description": "Il tuo comando viene eseguito senza l'integrazione shell del terminale VSCode. Per sopprimere questo avviso puoi disattivare l'integrazione shell nella sezione Terminal delle impostazioni di Roo Code o risolvere i problemi di integrazione del terminale VSCode utilizzando il link qui sotto.", "troubleshooting": "Clicca qui per la documentazione sull'integrazione shell." } } diff --git a/webview-ui/src/i18n/locales/ja/chat.json b/webview-ui/src/i18n/locales/ja/chat.json index d598394dd15..f31b8575a9a 100644 --- a/webview-ui/src/i18n/locales/ja/chat.json +++ b/webview-ui/src/i18n/locales/ja/chat.json @@ -90,6 +90,7 @@ } }, "selectMode": "対話モードを選択", + "selectApiConfig": "API構成を選択", "enhancePrompt": "追加コンテキストでプロンプトを強化", "addImages": "メッセージに画像を追加", "sendMessage": "メッセージを送信", @@ -233,10 +234,9 @@ } }, "systemPromptWarning": "警告:カスタムシステムプロンプトの上書きが有効です。これにより機能が深刻に損なわれ、予測不可能な動作が発生する可能性があります。", - "selectApiConfig": "API構成を選択", "shellIntegration": { - "title": "シェル統合が利用できません", - "description": "コマンドはVSCodeシェル統合なしで実行されています。Roo Code設定ターミナルセクションでシェル統合を再有効化できます。", + "title": "コマンド実行警告", + "description": "コマンドはVSCodeターミナルシェル統合なしで実行されています。この警告を非表示にするには、Roo Code設定Terminalセクションでシェル統合を無効にするか、以下のリンクを使用してVSCodeターミナル統合のトラブルシューティングを行ってください。", "troubleshooting": "シェル統合のドキュメントはこちらをクリック" } } diff --git a/webview-ui/src/i18n/locales/ko/chat.json b/webview-ui/src/i18n/locales/ko/chat.json index 919d5cb55e0..1354a7cce82 100644 --- a/webview-ui/src/i18n/locales/ko/chat.json +++ b/webview-ui/src/i18n/locales/ko/chat.json @@ -90,6 +90,7 @@ } }, "selectMode": "상호작용 모드 선택", + "selectApiConfig": "API 구성 선택", "enhancePrompt": "추가 컨텍스트로 프롬프트 향상", "addImages": "메시지에 이미지 추가", "sendMessage": "메시지 보내기", @@ -233,10 +234,9 @@ } }, "systemPromptWarning": "경고: 사용자 정의 시스템 프롬프트 재정의가 활성화되었습니다. 이로 인해 기능이 심각하게 손상되고 예측할 수 없는 동작이 발생할 수 있습니다.", - "selectApiConfig": "API 구성 선택", "shellIntegration": { - "title": "Shell 통합 사용 불가", - "description": "명령이 VSCode shell 통합 없이 실행되고 있습니다. Roo Code 설정터미널 섹션에서 shell 통합을 다시 활성화할 수 있습니다.", - "troubleshooting": "shell 통합 문서를 보려면 여기를 클릭하세요." + "title": "명령 실행 경고", + "description": "명령이 VSCode 터미널 쉘 통합 없이 실행되고 있습니다. 이 경고를 숨기려면 Roo Code 설정Terminal 섹션에서 쉘 통합을 비활성화하거나 아래 링크를 사용하여 VSCode 터미널 통합 문제를 해결하세요.", + "troubleshooting": "쉘 통합 문서를 보려면 여기를 클릭하세요." } } diff --git a/webview-ui/src/i18n/locales/pl/chat.json b/webview-ui/src/i18n/locales/pl/chat.json index e41be5aa7ed..0a7adbe7317 100644 --- a/webview-ui/src/i18n/locales/pl/chat.json +++ b/webview-ui/src/i18n/locales/pl/chat.json @@ -90,6 +90,7 @@ } }, "selectMode": "Wybierz tryb interakcji", + "selectApiConfig": "Wybierz konfigurację API", "enhancePrompt": "Ulepsz podpowiedź dodatkowym kontekstem", "addImages": "Dodaj obrazy do wiadomości", "sendMessage": "Wyślij wiadomość", @@ -233,10 +234,9 @@ } }, "systemPromptWarning": "OSTRZEŻENIE: Aktywne niestandardowe zastąpienie instrukcji systemowych. Może to poważnie zakłócić funkcjonalność i powodować nieprzewidywalne zachowanie.", - "selectApiConfig": "Wybierz konfigurację API", "shellIntegration": { - "title": "Integracja powłoki niedostępna", - "description": "Twoje polecenie jest wykonywane bez integracji powłoki VSCode. Możesz ponownie włączyć integrację powłoki w sekcji Terminal w ustawieniach Roo Code.", + "title": "Ostrzeżenie wykonania polecenia", + "description": "Twoje polecenie jest wykonywane bez integracji powłoki terminala VSCode. Aby ukryć to ostrzeżenie, możesz wyłączyć integrację powłoki w sekcji Terminal w ustawieniach Roo Code lub rozwiązać problemy z integracją terminala VSCode korzystając z poniższego linku.", "troubleshooting": "Kliknij tutaj, aby zobaczyć dokumentację integracji powłoki." } } diff --git a/webview-ui/src/i18n/locales/pt-BR/chat.json b/webview-ui/src/i18n/locales/pt-BR/chat.json index 80fed655c6b..0600ea3a85d 100644 --- a/webview-ui/src/i18n/locales/pt-BR/chat.json +++ b/webview-ui/src/i18n/locales/pt-BR/chat.json @@ -90,6 +90,7 @@ } }, "selectMode": "Selecionar modo de interação", + "selectApiConfig": "Selecionar configuração da API", "enhancePrompt": "Aprimorar prompt com contexto adicional", "addImages": "Adicionar imagens à mensagem", "sendMessage": "Enviar mensagem", @@ -233,10 +234,9 @@ } }, "systemPromptWarning": "AVISO: Substituição personalizada de instrução do sistema ativa. Isso pode comprometer gravemente a funcionalidade e causar comportamento imprevisível.", - "selectApiConfig": "Selecionar configuração da API", "shellIntegration": { - "title": "Integração de Shell Indisponível", - "description": "Seu comando está sendo executado sem a integração de shell do VSCode. Você pode reativar a integração de shell na seção Terminal das configurações do Roo Code.", + "title": "Aviso de execução de comando", + "description": "Seu comando está sendo executado sem a integração de shell do terminal VSCode. Para suprimir este aviso, você pode desativar a integração de shell na seção Terminal das configurações do Roo Code ou solucionar problemas de integração do terminal VSCode usando o link abaixo.", "troubleshooting": "Clique aqui para a documentação de integração de shell." } } diff --git a/webview-ui/src/i18n/locales/ru/chat.json b/webview-ui/src/i18n/locales/ru/chat.json index 2b2b1ecf61e..77ddc3cb227 100644 --- a/webview-ui/src/i18n/locales/ru/chat.json +++ b/webview-ui/src/i18n/locales/ru/chat.json @@ -235,8 +235,8 @@ }, "systemPromptWarning": "ПРЕДУПРЕЖДЕНИЕ: Активна пользовательская системная подсказка. Это может серьезно нарушить работу и вызвать непредсказуемое поведение.", "shellIntegration": { - "title": "Интеграция с оболочкой недоступна", - "description": "Ваша команда выполняется без интеграции с оболочкой VSCode. Вы можете повторно включить интеграцию с оболочкой в разделе Терминал настроек Roo Code.", - "troubleshooting": "Нажмите здесь для просмотра документации по интеграции с оболочкой." + "title": "Предупреждение о выполнении команды", + "description": "Ваша команда выполняется без интеграции оболочки терминала VSCode. Чтобы скрыть это предупреждение, вы можете отключить интеграцию оболочки в разделе Terminal в настройках Roo Code или устранить проблемы с интеграцией терминала VSCode, используя ссылку ниже.", + "troubleshooting": "Нажмите здесь для просмотра документации по интеграции оболочки." } } diff --git a/webview-ui/src/i18n/locales/tr/chat.json b/webview-ui/src/i18n/locales/tr/chat.json index e9461995ae1..8003cdb0451 100644 --- a/webview-ui/src/i18n/locales/tr/chat.json +++ b/webview-ui/src/i18n/locales/tr/chat.json @@ -90,6 +90,7 @@ } }, "selectMode": "Etkileşim modunu seçin", + "selectApiConfig": "API yapılandırmasını seçin", "enhancePrompt": "Ek bağlamla istemi geliştir", "addImages": "Mesaja resim ekle", "sendMessage": "Mesaj gönder", @@ -233,10 +234,9 @@ } }, "systemPromptWarning": "UYARI: Özel sistem komut geçersiz kılma aktif. Bu işlevselliği ciddi şekilde bozabilir ve öngörülemeyen davranışlara neden olabilir.", - "selectApiConfig": "API yapılandırmasını seçin", "shellIntegration": { - "title": "Kabuk Entegrasyonu Kullanılamıyor", - "description": "Komutunuz VSCode kabuk entegrasyonu olmadan çalıştırılıyor. Roo Code ayarları'nın Terminal bölümünden kabuk entegrasyonunu yeniden etkinleştirebilirsiniz.", - "troubleshooting": "Kabuk entegrasyonu belgeleri için buraya tıklayın." + "title": "Komut Çalıştırma Uyarısı", + "description": "Komutunuz VSCode terminal kabuk entegrasyonu olmadan çalıştırılıyor. Bu uyarıyı gizlemek için Roo Code ayarları'nın Terminal bölümünden kabuk entegrasyonunu devre dışı bırakabilir veya aşağıdaki bağlantıyı kullanarak VSCode terminal entegrasyonu sorunlarını giderebilirsiniz.", + "troubleshooting": "Kabuk entegrasyonu belgelerini görmek için buraya tıklayın." } } diff --git a/webview-ui/src/i18n/locales/vi/chat.json b/webview-ui/src/i18n/locales/vi/chat.json index b96d7161d8c..ed913a6d6b4 100644 --- a/webview-ui/src/i18n/locales/vi/chat.json +++ b/webview-ui/src/i18n/locales/vi/chat.json @@ -90,6 +90,7 @@ } }, "selectMode": "Chọn chế độ tương tác", + "selectApiConfig": "Chọn cấu hình API", "enhancePrompt": "Nâng cao yêu cầu với ngữ cảnh bổ sung", "addImages": "Thêm hình ảnh vào tin nhắn", "sendMessage": "Gửi tin nhắn", @@ -233,10 +234,9 @@ } }, "systemPromptWarning": "CẢNH BÁO: Đã kích hoạt ghi đè lệnh nhắc hệ thống tùy chỉnh. Điều này có thể phá vỡ nghiêm trọng chức năng và gây ra hành vi không thể dự đoán.", - "selectApiConfig": "Chọn cấu hình API", "shellIntegration": { - "title": "Tích hợp Shell không khả dụng", - "description": "Lệnh của bạn đang được thực thi mà không có tích hợp shell VSCode. Bạn có thể kích hoạt lại tích hợp shell trong phần Terminal của cài đặt Roo Code.", - "troubleshooting": "Nhấp vào đây để xem tài liệu về tích hợp shell." + "title": "Cảnh báo thực thi lệnh", + "description": "Lệnh của bạn đang được thực thi mà không có tích hợp shell terminal VSCode. Để ẩn cảnh báo này, bạn có thể vô hiệu hóa tích hợp shell trong phần Terminal của cài đặt Roo Code hoặc khắc phục sự cố tích hợp terminal VSCode bằng liên kết bên dưới.", + "troubleshooting": "Nhấp vào đây để xem tài liệu tích hợp shell." } } diff --git a/webview-ui/src/i18n/locales/zh-CN/chat.json b/webview-ui/src/i18n/locales/zh-CN/chat.json index b7db3028f5c..961801edb10 100644 --- a/webview-ui/src/i18n/locales/zh-CN/chat.json +++ b/webview-ui/src/i18n/locales/zh-CN/chat.json @@ -90,6 +90,7 @@ } }, "selectMode": "选择交互模式", + "selectApiConfig": "选择 API 配置", "enhancePrompt": "增强提示词", "addImages": "添加图片到消息", "sendMessage": "发送消息", @@ -233,10 +234,9 @@ } }, "systemPromptWarning": "警告:自定义系统提示词覆盖已激活。这可能严重破坏功能并导致不可预测的行为。", - "selectApiConfig": "选择 API 配置", "shellIntegration": { - "title": "Shell 集成不可用", - "description": "您的命令正在没有 VSCode shell 集成的情况下执行。您可以在 Roo Code 设置终端 部分重新启用 shell 集成。", + "title": "命令执行警告", + "description": "您的命令正在没有 VSCode 终端 shell 集成的情况下执行。要隐藏此警告,您可以在 Roo Code 设置Terminal 部分禁用 shell 集成,或使用下方链接排查 VSCode 终端集成问题。", "troubleshooting": "点击此处查看 shell 集成文档。" } } diff --git a/webview-ui/src/i18n/locales/zh-TW/chat.json b/webview-ui/src/i18n/locales/zh-TW/chat.json index 94601aba986..03c64cc1807 100644 --- a/webview-ui/src/i18n/locales/zh-TW/chat.json +++ b/webview-ui/src/i18n/locales/zh-TW/chat.json @@ -90,6 +90,7 @@ } }, "selectMode": "選擇互動模式", + "selectApiConfig": "選取 API 設定", "enhancePrompt": "使用額外內容增強提示", "addImages": "新增圖片到訊息中", "sendMessage": "傳送訊息", @@ -233,10 +234,9 @@ } }, "systemPromptWarning": "警告:自訂系統提示詞覆蓋已啟用。這可能嚴重破壞功能並導致不可預測的行為。", - "selectApiConfig": "選取 API 設定", "shellIntegration": { - "title": "Shell 整合不可用", - "description": "您的命令正在沒有 VSCode shell 整合的情況下執行。您可以在 Roo Code 設定終端機 部分重新啟用 shell 整合。", + "title": "命令執行警告", + "description": "您的命令正在沒有 VSCode 終端機 shell 整合的情況下執行。要隱藏此警告,您可以在 Roo Code 設定Terminal 部分停用 shell 整合,或使用下方連結排查 VSCode 終端機整合問題。", "troubleshooting": "點擊此處查看 shell 整合文件。" } } From a2dcc1869d175f26613a28bc1f3554418993e004 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Fri, 2 May 2025 14:52:08 -0700 Subject: [PATCH 23/29] Improve performance of CustomModesManager (#3123) --- src/core/config/CustomModesManager.ts | 93 +++++-- .../__tests__/CustomModesManager.test.ts | 251 ++++++++++++++++++ src/core/webview/ClineProvider.ts | 3 +- 3 files changed, 318 insertions(+), 29 deletions(-) diff --git a/src/core/config/CustomModesManager.ts b/src/core/config/CustomModesManager.ts index efa3366aee2..eed7dee9485 100644 --- a/src/core/config/CustomModesManager.ts +++ b/src/core/config/CustomModesManager.ts @@ -11,9 +11,13 @@ import { GlobalFileNames } from "../../shared/globalFileNames" const ROOMODES_FILENAME = ".roomodes" export class CustomModesManager { + private static readonly cacheTTL = 10_000 + private disposables: vscode.Disposable[] = [] private isWriting = false private writeQueue: Array<() => Promise> = [] + private cachedModes: ModeConfig[] | null = null + private cachedAt: number = 0 constructor( private readonly context: vscode.ExtensionContext, @@ -25,6 +29,7 @@ export class CustomModesManager { private async queueWrite(operation: () => Promise): Promise { this.writeQueue.push(operation) + if (!this.isWriting) { await this.processWriteQueue() } @@ -36,9 +41,11 @@ export class CustomModesManager { } this.isWriting = true + try { while (this.writeQueue.length > 0) { const operation = this.writeQueue.shift() + if (operation) { await operation() } @@ -50,9 +57,11 @@ export class CustomModesManager { private async getWorkspaceRoomodes(): Promise { const workspaceFolders = vscode.workspace.workspaceFolders + if (!workspaceFolders || workspaceFolders.length === 0) { return undefined } + const workspaceRoot = getWorkspacePath() const roomodesPath = path.join(workspaceRoot, ROOMODES_FILENAME) const exists = await fileExistsAtPath(roomodesPath) @@ -73,10 +82,7 @@ export class CustomModesManager { const source = isRoomodes ? ("project" as const) : ("global" as const) // Add source to each mode - return result.data.customModes.map((mode) => ({ - ...mode, - source, - })) + return result.data.customModes.map((mode) => ({ ...mode, source })) } catch (error) { const errorMsg = `Failed to load modes from ${filePath}: ${error instanceof Error ? error.message : String(error)}` console.error(`[CustomModesManager] ${errorMsg}`) @@ -92,10 +98,7 @@ export class CustomModesManager { for (const mode of projectModes) { if (!slugs.has(mode.slug)) { slugs.add(mode.slug) - merged.push({ - ...mode, - source: "project", - }) + merged.push({ ...mode, source: "project" }) } } @@ -103,25 +106,22 @@ export class CustomModesManager { for (const mode of globalModes) { if (!slugs.has(mode.slug)) { slugs.add(mode.slug) - merged.push({ - ...mode, - source: "global", - }) + merged.push({ ...mode, source: "global" }) } } return merged } - async getCustomModesFilePath(): Promise { + public async getCustomModesFilePath(): Promise { const settingsDir = await this.ensureSettingsDirectoryExists() const filePath = path.join(settingsDir, GlobalFileNames.customModes) const fileExists = await fileExistsAtPath(filePath) + if (!fileExists) { - await this.queueWrite(async () => { - await fs.writeFile(filePath, JSON.stringify({ customModes: [] }, null, 2)) - }) + await this.queueWrite(() => fs.writeFile(filePath, JSON.stringify({ customModes: [] }, null, 2))) } + return filePath } @@ -133,10 +133,12 @@ export class CustomModesManager { vscode.workspace.onDidSaveTextDocument(async (document) => { if (arePathsEqual(document.uri.fsPath, settingsPath)) { const content = await fs.readFile(settingsPath, "utf-8") + const errorMessage = "Invalid custom modes format. Please ensure your settings follow the correct JSON format." let config: any + try { config = JSON.parse(content) } catch (error) { @@ -159,6 +161,7 @@ export class CustomModesManager { // Merge modes from both sources (.roomodes takes precedence) const mergedModes = await this.mergeCustomModes(roomodesModes, result.data.customModes) await this.context.globalState.update("customModes", mergedModes) + this.clearCache() await this.onUpdate() } }), @@ -166,6 +169,7 @@ export class CustomModesManager { // Watch .roomodes file if it exists const roomodesPath = await this.getWorkspaceRoomodes() + if (roomodesPath) { this.disposables.push( vscode.workspace.onDidSaveTextDocument(async (document) => { @@ -175,6 +179,7 @@ export class CustomModesManager { // .roomodes takes precedence const mergedModes = await this.mergeCustomModes(roomodesModes, settingsModes) await this.context.globalState.update("customModes", mergedModes) + this.clearCache() await this.onUpdate() } }), @@ -182,32 +187,39 @@ export class CustomModesManager { } } - async getCustomModes(): Promise { - // Get modes from settings file + public async getCustomModes(): Promise { + // Check if we have a valid cached result. + const now = Date.now() + + if (this.cachedModes && now - this.cachedAt < CustomModesManager.cacheTTL) { + return this.cachedModes + } + + // Get modes from settings file. const settingsPath = await this.getCustomModesFilePath() const settingsModes = await this.loadModesFromFile(settingsPath) - // Get modes from .roomodes if it exists + // Get modes from .roomodes if it exists. const roomodesPath = await this.getWorkspaceRoomodes() const roomodesModes = roomodesPath ? await this.loadModesFromFile(roomodesPath) : [] - // Create maps to store modes by source + // Create maps to store modes by source. const projectModes = new Map() const globalModes = new Map() - // Add project modes (they take precedence) + // Add project modes (they take precedence). for (const mode of roomodesModes) { projectModes.set(mode.slug, { ...mode, source: "project" as const }) } - // Add global modes + // Add global modes. for (const mode of settingsModes) { if (!projectModes.has(mode.slug)) { globalModes.set(mode.slug, { ...mode, source: "global" as const }) } } - // Combine modes in the correct order: project modes first, then global modes + // Combine modes in the correct order: project modes first, then global modes. const mergedModes = [ ...roomodesModes.map((mode) => ({ ...mode, source: "project" as const })), ...settingsModes @@ -216,22 +228,30 @@ export class CustomModesManager { ] await this.context.globalState.update("customModes", mergedModes) + + this.cachedModes = mergedModes + this.cachedAt = now + return mergedModes } - async updateCustomMode(slug: string, config: ModeConfig): Promise { + + public async updateCustomMode(slug: string, config: ModeConfig): Promise { try { const isProjectMode = config.source === "project" let targetPath: string if (isProjectMode) { const workspaceFolders = vscode.workspace.workspaceFolders + if (!workspaceFolders || workspaceFolders.length === 0) { logger.error("Failed to update project mode: No workspace folder found", { slug }) throw new Error("No workspace folder found for project-specific mode") } + const workspaceRoot = getWorkspacePath() targetPath = path.join(workspaceRoot, ROOMODES_FILENAME) const exists = await fileExistsAtPath(targetPath) + logger.info(`${exists ? "Updating" : "Creating"} project mode in ${ROOMODES_FILENAME}`, { slug, workspace: workspaceRoot, @@ -241,7 +261,7 @@ export class CustomModesManager { } await this.queueWrite(async () => { - // Ensure source is set correctly based on target file + // Ensure source is set correctly based on target file. const modeWithSource = { ...config, source: isProjectMode ? ("project" as const) : ("global" as const), @@ -253,6 +273,7 @@ export class CustomModesManager { return updatedModes }) + this.clearCache() await this.refreshMergedState() }) } catch (error) { @@ -261,22 +282,26 @@ export class CustomModesManager { vscode.window.showErrorMessage(`Failed to update custom mode: ${errorMessage}`) } } + private async updateModesInFile(filePath: string, operation: (modes: ModeConfig[]) => ModeConfig[]): Promise { let content = "{}" + try { content = await fs.readFile(filePath, "utf-8") } catch (error) { - // File might not exist yet + // File might not exist yet. content = JSON.stringify({ customModes: [] }) } let settings + try { settings = JSON.parse(content) } catch (error) { console.error(`[CustomModesManager] Failed to parse JSON from ${filePath}:`, error) settings = { customModes: [] } } + settings.customModes = operation(settings.customModes || []) await fs.writeFile(filePath, JSON.stringify(settings, null, 2), "utf-8") } @@ -290,10 +315,13 @@ export class CustomModesManager { const mergedModes = await this.mergeCustomModes(roomodesModes, settingsModes) await this.context.globalState.update("customModes", mergedModes) + + this.clearCache() + await this.onUpdate() } - async deleteCustomMode(slug: string): Promise { + public async deleteCustomMode(slug: string): Promise { try { const settingsPath = await this.getCustomModesFilePath() const roomodesPath = await this.getWorkspaceRoomodes() @@ -320,6 +348,8 @@ export class CustomModesManager { await this.updateModesInFile(settingsPath, (modes) => modes.filter((m) => m.slug !== slug)) } + // Clear cache when modes are deleted + this.clearCache() await this.refreshMergedState() }) } catch (error) { @@ -335,11 +365,12 @@ export class CustomModesManager { return settingsDir } - async resetCustomModes(): Promise { + public async resetCustomModes(): Promise { try { const filePath = await this.getCustomModesFilePath() await fs.writeFile(filePath, JSON.stringify({ customModes: [] }, null, 2)) await this.context.globalState.update("customModes", []) + this.clearCache() await this.onUpdate() } catch (error) { vscode.window.showErrorMessage( @@ -348,10 +379,16 @@ export class CustomModesManager { } } + private clearCache(): void { + this.cachedModes = null + this.cachedAt = 0 + } + dispose(): void { for (const disposable of this.disposables) { disposable.dispose() } + this.disposables = [] } } diff --git a/src/core/config/__tests__/CustomModesManager.test.ts b/src/core/config/__tests__/CustomModesManager.test.ts index a5de1414835..065f1478285 100644 --- a/src/core/config/__tests__/CustomModesManager.test.ts +++ b/src/core/config/__tests__/CustomModesManager.test.ts @@ -131,6 +131,257 @@ describe("CustomModesManager", () => { expect(modes).toHaveLength(1) expect(modes[0].slug).toBe("mode1") }) + + it("should memoize results for 10 seconds", async () => { + // Setup test data + const settingsModes = [{ slug: "mode1", name: "Mode 1", roleDefinition: "Role 1", groups: ["read"] }] + ;(fs.readFile as jest.Mock).mockImplementation(async (path: string) => { + if (path === mockSettingsPath) { + return JSON.stringify({ customModes: settingsModes }) + } + throw new Error("File not found") + }) + + // Mock fileExistsAtPath to only return true for settings path + ;(fileExistsAtPath as jest.Mock).mockImplementation(async (path: string) => { + return path === mockSettingsPath + }) + + // First call should read from file + const firstResult = await manager.getCustomModes() + + // Reset mock to verify it's not called again + jest.clearAllMocks() + + // Setup mocks again for second call + ;(fileExistsAtPath as jest.Mock).mockImplementation(async (path: string) => { + return path === mockSettingsPath + }) + ;(fs.readFile as jest.Mock).mockImplementation(async (path: string) => { + if (path === mockSettingsPath) { + return JSON.stringify({ customModes: settingsModes }) + } + throw new Error("File not found") + }) + + // Second call should use cached result + const secondResult = await manager.getCustomModes() + expect(fs.readFile).not.toHaveBeenCalled() + expect(secondResult).toHaveLength(1) + expect(secondResult[0].slug).toBe("mode1") + + // Results should be the same object (not just equal) + expect(secondResult).toBe(firstResult) + }) + + it("should invalidate cache when modes are updated", async () => { + // Setup initial data + const settingsModes = [{ slug: "mode1", name: "Mode 1", roleDefinition: "Role 1", groups: ["read"] }] + ;(fs.readFile as jest.Mock).mockImplementation(async (path: string) => { + if (path === mockSettingsPath) { + return JSON.stringify({ customModes: settingsModes }) + } + throw new Error("File not found") + }) + ;(fs.writeFile as jest.Mock).mockResolvedValue(undefined) + + // First call to cache the result + await manager.getCustomModes() + + // Reset mocks to track new calls + jest.clearAllMocks() + + // Update a mode + const updatedMode: ModeConfig = { + slug: "mode1", + name: "Updated Mode 1", + roleDefinition: "Updated Role 1", + groups: ["read"], + source: "global", + } + + // Mock the updated file content + const updatedSettingsModes = [updatedMode] + ;(fs.readFile as jest.Mock).mockImplementation(async (path: string) => { + if (path === mockSettingsPath) { + return JSON.stringify({ customModes: updatedSettingsModes }) + } + throw new Error("File not found") + }) + + // Update the mode + await manager.updateCustomMode("mode1", updatedMode) + + // Reset mocks again + jest.clearAllMocks() + + // Next call should read from file again (cache invalidated) + await manager.getCustomModes() + expect(fs.readFile).toHaveBeenCalled() + }) + + it("should invalidate cache when modes are deleted", async () => { + // Setup initial data + const settingsModes = [{ slug: "mode1", name: "Mode 1", roleDefinition: "Role 1", groups: ["read"] }] + ;(fs.readFile as jest.Mock).mockImplementation(async (path: string) => { + if (path === mockSettingsPath) { + return JSON.stringify({ customModes: settingsModes }) + } + throw new Error("File not found") + }) + ;(fs.writeFile as jest.Mock).mockResolvedValue(undefined) + + // First call to cache the result + await manager.getCustomModes() + + // Reset mocks to track new calls + jest.clearAllMocks() + + // Delete a mode + await manager.deleteCustomMode("mode1") + + // Mock the updated file content (empty) + ;(fs.readFile as jest.Mock).mockImplementation(async (path: string) => { + if (path === mockSettingsPath) { + return JSON.stringify({ customModes: [] }) + } + throw new Error("File not found") + }) + + // Reset mocks again + jest.clearAllMocks() + + // Next call should read from file again (cache invalidated) + await manager.getCustomModes() + expect(fs.readFile).toHaveBeenCalled() + }) + + it("should invalidate cache when modes are updated (simulating file changes)", async () => { + // Setup initial data + const settingsModes = [{ slug: "mode1", name: "Mode 1", roleDefinition: "Role 1", groups: ["read"] }] + ;(fs.readFile as jest.Mock).mockImplementation(async (path: string) => { + if (path === mockSettingsPath) { + return JSON.stringify({ customModes: settingsModes }) + } + throw new Error("File not found") + }) + ;(fileExistsAtPath as jest.Mock).mockImplementation(async (path: string) => { + return path === mockSettingsPath + }) + ;(fs.writeFile as jest.Mock).mockResolvedValue(undefined) + + // First call to cache the result + await manager.getCustomModes() + + // Reset mocks to track new calls + jest.clearAllMocks() + + // Setup for update + const updatedMode: ModeConfig = { + slug: "mode1", + name: "Updated Mode 1", + roleDefinition: "Updated Role 1", + groups: ["read"], + source: "global", + } + + // Mock the updated file content + const updatedSettingsModes = [updatedMode] + ;(fs.readFile as jest.Mock).mockImplementation(async (path: string) => { + if (path === mockSettingsPath) { + return JSON.stringify({ customModes: updatedSettingsModes }) + } + throw new Error("File not found") + }) + + // Simulate a file change by updating a mode + // This should invalidate the cache + await manager.updateCustomMode("mode1", updatedMode) + + // Reset mocks again + jest.clearAllMocks() + + // Setup mocks again + ;(fileExistsAtPath as jest.Mock).mockImplementation(async (path: string) => { + return path === mockSettingsPath + }) + ;(fs.readFile as jest.Mock).mockImplementation(async (path: string) => { + if (path === mockSettingsPath) { + return JSON.stringify({ customModes: updatedSettingsModes }) + } + throw new Error("File not found") + }) + + // Next call should read from file again (cache was invalidated by the update) + await manager.getCustomModes() + expect(fs.readFile).toHaveBeenCalled() + }) + + it("should refresh cache after TTL expires", async () => { + // Setup test data + const settingsModes = [{ slug: "mode1", name: "Mode 1", roleDefinition: "Role 1", groups: ["read"] }] + ;(fs.readFile as jest.Mock).mockImplementation(async (path: string) => { + if (path === mockSettingsPath) { + return JSON.stringify({ customModes: settingsModes }) + } + throw new Error("File not found") + }) + ;(fileExistsAtPath as jest.Mock).mockImplementation(async (path: string) => { + return path === mockSettingsPath + }) + + // Mock Date.now to control time + const originalDateNow = Date.now + let currentTime = 1000 + Date.now = jest.fn(() => currentTime) + + try { + // First call should read from file + await manager.getCustomModes() + + // Reset mock to verify it's not called again + jest.clearAllMocks() + + // Setup mocks again for second call + ;(fileExistsAtPath as jest.Mock).mockImplementation(async (path: string) => { + return path === mockSettingsPath + }) + ;(fs.readFile as jest.Mock).mockImplementation(async (path: string) => { + if (path === mockSettingsPath) { + return JSON.stringify({ customModes: settingsModes }) + } + throw new Error("File not found") + }) + + // Second call within TTL should use cache + await manager.getCustomModes() + expect(fs.readFile).not.toHaveBeenCalled() + + // Advance time beyond TTL (10 seconds) + currentTime += 11000 + + // Reset mocks again + jest.clearAllMocks() + + // Setup mocks again for third call + ;(fileExistsAtPath as jest.Mock).mockImplementation(async (path: string) => { + return path === mockSettingsPath + }) + ;(fs.readFile as jest.Mock).mockImplementation(async (path: string) => { + if (path === mockSettingsPath) { + return JSON.stringify({ customModes: settingsModes }) + } + throw new Error("File not found") + }) + + // Call after TTL should read from file again + await manager.getCustomModes() + expect(fs.readFile).toHaveBeenCalled() + } finally { + // Restore original Date.now + Date.now = originalDateNow + } + }) }) describe("updateCustomMode", () => { diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 51b6c47fac3..167c5d327e3 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -1184,6 +1184,7 @@ export class ClineProvider extends EventEmitter implements customSupportPrompts, enhancementApiConfigId, autoApprovalEnabled, + customModes, experiments, maxOpenTabsContext, maxWorkspaceFiles, @@ -1263,7 +1264,7 @@ export class ClineProvider extends EventEmitter implements customSupportPrompts: customSupportPrompts ?? {}, enhancementApiConfigId, autoApprovalEnabled: autoApprovalEnabled ?? false, - customModes: await this.customModesManager.getCustomModes(), + customModes, experiments: experiments ?? experimentDefault, mcpServers: this.mcpHub?.getAllServers() ?? [], maxOpenTabsContext: maxOpenTabsContext ?? 20, From 06d8dd2bcf7d036ab5b6c8bbe90cedb40859ba17 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Fri, 2 May 2025 16:36:22 -0700 Subject: [PATCH 24/29] Gemini caching fixes (#3096) --- src/api/providers/anthropic-vertex.ts | 24 +- src/api/providers/glama.ts | 6 +- src/api/providers/openrouter.ts | 42 +-- src/api/providers/unbound.ts | 6 +- src/api/transform/caching.ts | 36 --- .../caching/__tests__/anthropic.test.ts | 181 ++++++++++++ .../caching/__tests__/gemini.test.ts | 266 ++++++++++++++++++ .../caching/__tests__/vertex.test.ts | 178 ++++++++++++ src/api/transform/caching/anthropic.ts | 41 +++ src/api/transform/caching/gemini.ts | 47 ++++ src/api/transform/caching/vertex.ts | 49 ++++ src/api/transform/vertex-caching.ts | 70 ----- .../settings/ExperimentalSettings.tsx | 3 +- .../src/components/settings/SettingsView.tsx | 6 +- 14 files changed, 784 insertions(+), 171 deletions(-) delete mode 100644 src/api/transform/caching.ts create mode 100644 src/api/transform/caching/__tests__/anthropic.test.ts create mode 100644 src/api/transform/caching/__tests__/gemini.test.ts create mode 100644 src/api/transform/caching/__tests__/vertex.test.ts create mode 100644 src/api/transform/caching/anthropic.ts create mode 100644 src/api/transform/caching/gemini.ts create mode 100644 src/api/transform/caching/vertex.ts delete mode 100644 src/api/transform/vertex-caching.ts diff --git a/src/api/providers/anthropic-vertex.ts b/src/api/providers/anthropic-vertex.ts index 2eeafd222ca..91cbd2eb345 100644 --- a/src/api/providers/anthropic-vertex.ts +++ b/src/api/providers/anthropic-vertex.ts @@ -3,13 +3,14 @@ import { AnthropicVertex } from "@anthropic-ai/vertex-sdk" import { GoogleAuth, JWTInput } from "google-auth-library" import { ApiHandlerOptions, ModelInfo, vertexDefaultModelId, VertexModelId, vertexModels } from "../../shared/api" -import { ApiStream } from "../transform/stream" import { safeJsonParse } from "../../shared/safeJsonParse" +import { ApiStream } from "../transform/stream" +import { addCacheBreakpoints } from "../transform/caching/vertex" + import { getModelParams, SingleCompletionHandler } from "../index" -import { BaseProvider } from "./base-provider" import { ANTHROPIC_DEFAULT_MAX_TOKENS } from "./constants" -import { formatMessageForCache } from "../transform/vertex-caching" +import { BaseProvider } from "./base-provider" // https://docs.anthropic.com/en/api/claude-on-vertex-ai export class AnthropicVertexHandler extends BaseProvider implements SingleCompletionHandler { @@ -57,16 +58,6 @@ export class AnthropicVertexHandler extends BaseProvider implements SingleComple thinking, } = this.getModel() - // Find indices of user messages that we want to cache - // We only cache the last two user messages to stay within the 4-block limit - // (1 block for system + 1 block each for last two user messages = 3 total) - const userMsgIndices = supportsPromptCache - ? messages.reduce((acc, msg, i) => (msg.role === "user" ? [...acc, i] : acc), [] as number[]) - : [] - - const lastUserMsgIndex = userMsgIndices[userMsgIndices.length - 1] ?? -1 - const secondLastMsgUserIndex = userMsgIndices[userMsgIndices.length - 2] ?? -1 - /** * Vertex API has specific limitations for prompt caching: * 1. Maximum of 4 blocks can have cache_control @@ -89,12 +80,7 @@ export class AnthropicVertexHandler extends BaseProvider implements SingleComple system: supportsPromptCache ? [{ text: systemPrompt, type: "text" as const, cache_control: { type: "ephemeral" } }] : systemPrompt, - messages: messages.map((message, index) => { - // Only cache the last two user messages. - const shouldCache = - supportsPromptCache && (index === lastUserMsgIndex || index === secondLastMsgUserIndex) - return formatMessageForCache(message, shouldCache) - }), + messages: supportsPromptCache ? addCacheBreakpoints(messages) : messages, stream: true, } diff --git a/src/api/providers/glama.ts b/src/api/providers/glama.ts index 4dd97fd8276..b0132580d47 100644 --- a/src/api/providers/glama.ts +++ b/src/api/providers/glama.ts @@ -3,9 +3,11 @@ import axios from "axios" import OpenAI from "openai" import { ApiHandlerOptions, glamaDefaultModelId, glamaDefaultModelInfo } from "../../shared/api" + import { ApiStream } from "../transform/stream" import { convertToOpenAiMessages } from "../transform/openai-format" -import { addCacheControlDirectives } from "../transform/caching" +import { addCacheBreakpoints } from "../transform/caching/anthropic" + import { SingleCompletionHandler } from "../index" import { RouterProvider } from "./router-provider" @@ -37,7 +39,7 @@ export class GlamaHandler extends RouterProvider implements SingleCompletionHand ] if (modelId.startsWith("anthropic/claude-3")) { - addCacheControlDirectives(systemPrompt, openAiMessages) + addCacheBreakpoints(systemPrompt, openAiMessages) } // Required by Anthropic; other providers default to max tokens allowed. diff --git a/src/api/providers/openrouter.ts b/src/api/providers/openrouter.ts index efe659e1452..e1104f4f9a5 100644 --- a/src/api/providers/openrouter.ts +++ b/src/api/providers/openrouter.ts @@ -11,9 +11,12 @@ import { OPTIONAL_PROMPT_CACHING_MODELS, REASONING_MODELS, } from "../../shared/api" + import { convertToOpenAiMessages } from "../transform/openai-format" import { ApiStreamChunk } from "../transform/stream" import { convertToR1Format } from "../transform/r1-format" +import { addCacheBreakpoints as addAnthropicCacheBreakpoints } from "../transform/caching/anthropic" +import { addCacheBreakpoints as addGeminiCacheBreakpoints } from "../transform/caching/gemini" import { getModelParams, SingleCompletionHandler } from "../index" import { DEFAULT_HEADERS, DEEP_SEEK_DEFAULT_TEMPERATURE } from "./constants" @@ -93,42 +96,11 @@ export class OpenRouterHandler extends BaseProvider implements SingleCompletionH const isCacheAvailable = promptCache.supported && (!promptCache.optional || this.options.promptCachingEnabled) - // Prompt caching: https://openrouter.ai/docs/prompt-caching - // Now with Gemini support: https://openrouter.ai/docs/features/prompt-caching - // Note that we don't check the `ModelInfo` object because it is cached - // in the settings for OpenRouter and the value could be stale. + // https://openrouter.ai/docs/features/prompt-caching if (isCacheAvailable) { - openAiMessages[0] = { - role: "system", - // @ts-ignore-next-line - content: [{ type: "text", text: systemPrompt, cache_control: { type: "ephemeral" } }], - } - - // Add cache_control to the last two user messages - // (note: this works because we only ever add one user message at a time, but if we added multiple we'd need to mark the user message before the last assistant message) - const lastTwoUserMessages = openAiMessages.filter((msg) => msg.role === "user").slice(-2) - - lastTwoUserMessages.forEach((msg) => { - if (typeof msg.content === "string") { - msg.content = [{ type: "text", text: msg.content }] - } - - if (Array.isArray(msg.content)) { - // NOTE: This is fine since env details will always be added - // at the end. But if it wasn't there, and the user added a - // image_url type message, it would pop a text part before - // it and then move it after to the end. - let lastTextPart = msg.content.filter((part) => part.type === "text").pop() - - if (!lastTextPart) { - lastTextPart = { type: "text", text: "..." } - msg.content.push(lastTextPart) - } - - // @ts-ignore-next-line - lastTextPart["cache_control"] = { type: "ephemeral" } - } - }) + modelId.startsWith("google") + ? addGeminiCacheBreakpoints(systemPrompt, openAiMessages) + : addAnthropicCacheBreakpoints(systemPrompt, openAiMessages) } // https://openrouter.ai/docs/transforms diff --git a/src/api/providers/unbound.ts b/src/api/providers/unbound.ts index 27c10313a60..5e8dbf66b40 100644 --- a/src/api/providers/unbound.ts +++ b/src/api/providers/unbound.ts @@ -2,9 +2,11 @@ import { Anthropic } from "@anthropic-ai/sdk" import OpenAI from "openai" import { ApiHandlerOptions, unboundDefaultModelId, unboundDefaultModelInfo } from "../../shared/api" + import { ApiStream, ApiStreamUsageChunk } from "../transform/stream" import { convertToOpenAiMessages } from "../transform/openai-format" -import { addCacheControlDirectives } from "../transform/caching" +import { addCacheBreakpoints } from "../transform/caching/anthropic" + import { SingleCompletionHandler } from "../index" import { RouterProvider } from "./router-provider" @@ -39,7 +41,7 @@ export class UnboundHandler extends RouterProvider implements SingleCompletionHa ] if (modelId.startsWith("anthropic/claude-3")) { - addCacheControlDirectives(systemPrompt, openAiMessages) + addCacheBreakpoints(systemPrompt, openAiMessages) } // Required by Anthropic; other providers default to max tokens allowed. diff --git a/src/api/transform/caching.ts b/src/api/transform/caching.ts deleted file mode 100644 index 0a8ae6bf459..00000000000 --- a/src/api/transform/caching.ts +++ /dev/null @@ -1,36 +0,0 @@ -import OpenAI from "openai" - -export const addCacheControlDirectives = (systemPrompt: string, messages: OpenAI.Chat.ChatCompletionMessageParam[]) => { - messages[0] = { - role: "system", - content: [ - { - type: "text", - text: systemPrompt, - // @ts-ignore-next-line - cache_control: { type: "ephemeral" }, - }, - ], - } - - messages - .filter((msg) => msg.role === "user") - .slice(-2) - .forEach((msg) => { - if (typeof msg.content === "string") { - msg.content = [{ type: "text", text: msg.content }] - } - - if (Array.isArray(msg.content)) { - let lastTextPart = msg.content.filter((part) => part.type === "text").pop() - - if (!lastTextPart) { - lastTextPart = { type: "text", text: "..." } - msg.content.push(lastTextPart) - } - - // @ts-ignore-next-line - lastTextPart["cache_control"] = { type: "ephemeral" } - } - }) -} diff --git a/src/api/transform/caching/__tests__/anthropic.test.ts b/src/api/transform/caching/__tests__/anthropic.test.ts new file mode 100644 index 00000000000..6c836e954c8 --- /dev/null +++ b/src/api/transform/caching/__tests__/anthropic.test.ts @@ -0,0 +1,181 @@ +// npx jest src/api/transform/caching/__tests__/anthropic.test.ts + +import OpenAI from "openai" + +import { addCacheBreakpoints } from "../anthropic" + +describe("addCacheBreakpoints (Anthropic)", () => { + const systemPrompt = "You are a helpful assistant." + + it("should always add a cache breakpoint to the system prompt", () => { + const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [ + { role: "system", content: systemPrompt }, + { role: "user", content: "Hello" }, + ] + + addCacheBreakpoints(systemPrompt, messages) + + expect(messages[0].content).toEqual([ + { type: "text", text: systemPrompt, cache_control: { type: "ephemeral" } }, + ]) + }) + + it("should not add breakpoints to user messages if there are none", () => { + const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [{ role: "system", content: systemPrompt }] + const originalMessages = JSON.parse(JSON.stringify(messages)) + + addCacheBreakpoints(systemPrompt, messages) + + expect(messages[0].content).toEqual([ + { type: "text", text: systemPrompt, cache_control: { type: "ephemeral" } }, + ]) + + expect(messages.length).toBe(originalMessages.length) + }) + + it("should add a breakpoint to the only user message if only one exists", () => { + const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [ + { role: "system", content: systemPrompt }, + { role: "user", content: "User message 1" }, + ] + + addCacheBreakpoints(systemPrompt, messages) + + expect(messages[1].content).toEqual([ + { type: "text", text: "User message 1", cache_control: { type: "ephemeral" } }, + ]) + }) + + it("should add breakpoints to both user messages if only two exist", () => { + const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [ + { role: "system", content: systemPrompt }, + { role: "user", content: "User message 1" }, + { role: "user", content: "User message 2" }, + ] + + addCacheBreakpoints(systemPrompt, messages) + + expect(messages[1].content).toEqual([ + { type: "text", text: "User message 1", cache_control: { type: "ephemeral" } }, + ]) + + expect(messages[2].content).toEqual([ + { type: "text", text: "User message 2", cache_control: { type: "ephemeral" } }, + ]) + }) + + it("should add breakpoints to the last two user messages when more than two exist", () => { + const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [ + { role: "system", content: systemPrompt }, + { role: "user", content: "User message 1" }, // Should not get breakpoint. + { role: "user", content: "User message 2" }, // Should get breakpoint. + { role: "user", content: "User message 3" }, // Should get breakpoint. + ] + addCacheBreakpoints(systemPrompt, messages) + + expect(messages[1].content).toEqual([{ type: "text", text: "User message 1" }]) + + expect(messages[2].content).toEqual([ + { type: "text", text: "User message 2", cache_control: { type: "ephemeral" } }, + ]) + + expect(messages[3].content).toEqual([ + { type: "text", text: "User message 3", cache_control: { type: "ephemeral" } }, + ]) + }) + + it("should handle assistant messages correctly when finding last two user messages", () => { + const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [ + { role: "system", content: systemPrompt }, + { role: "user", content: "User message 1" }, // Should not get breakpoint. + { role: "assistant", content: "Assistant response 1" }, + { role: "user", content: "User message 2" }, // Should get breakpoint (second to last user). + { role: "assistant", content: "Assistant response 2" }, + { role: "user", content: "User message 3" }, // Should get breakpoint (last user). + { role: "assistant", content: "Assistant response 3" }, + ] + addCacheBreakpoints(systemPrompt, messages) + + const userMessages = messages.filter((m) => m.role === "user") + + expect(userMessages[0].content).toEqual([{ type: "text", text: "User message 1" }]) + + expect(userMessages[1].content).toEqual([ + { type: "text", text: "User message 2", cache_control: { type: "ephemeral" } }, + ]) + + expect(userMessages[2].content).toEqual([ + { type: "text", text: "User message 3", cache_control: { type: "ephemeral" } }, + ]) + }) + + it("should add breakpoint to the last text part if content is an array", () => { + const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [ + { role: "system", content: systemPrompt }, + { role: "user", content: "User message 1" }, + { + role: "user", + content: [ + { type: "text", text: "This is the last user message." }, + { type: "image_url", image_url: { url: "data:image/png;base64,..." } }, + { type: "text", text: "This part should get the breakpoint." }, + ], + }, + ] + + addCacheBreakpoints(systemPrompt, messages) + + expect(messages[1].content).toEqual([ + { type: "text", text: "User message 1", cache_control: { type: "ephemeral" } }, + ]) + + expect(messages[2].content).toEqual([ + { type: "text", text: "This is the last user message." }, + { type: "image_url", image_url: { url: "data:image/png;base64,..." } }, + { type: "text", text: "This part should get the breakpoint.", cache_control: { type: "ephemeral" } }, + ]) + }) + + it("should add a placeholder text part if the target message has no text parts", () => { + const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [ + { role: "system", content: systemPrompt }, + { role: "user", content: "User message 1" }, + { + role: "user", + content: [{ type: "image_url", image_url: { url: "data:image/png;base64,..." } }], + }, + ] + + addCacheBreakpoints(systemPrompt, messages) + + expect(messages[1].content).toEqual([ + { type: "text", text: "User message 1", cache_control: { type: "ephemeral" } }, + ]) + + expect(messages[2].content).toEqual([ + { type: "image_url", image_url: { url: "data:image/png;base64,..." } }, + { type: "text", text: "...", cache_control: { type: "ephemeral" } }, // Placeholder added. + ]) + }) + + it("should ensure content is array format even if no breakpoint added", () => { + const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [ + { role: "system", content: systemPrompt }, + { role: "user", content: "User message 1" }, // String content, no breakpoint. + { role: "user", content: "User message 2" }, // Gets breakpoint. + { role: "user", content: "User message 3" }, // Gets breakpoint. + ] + + addCacheBreakpoints(systemPrompt, messages) + + expect(messages[1].content).toEqual([{ type: "text", text: "User message 1" }]) + + expect(messages[2].content).toEqual([ + { type: "text", text: "User message 2", cache_control: { type: "ephemeral" } }, + ]) + + expect(messages[3].content).toEqual([ + { type: "text", text: "User message 3", cache_control: { type: "ephemeral" } }, + ]) + }) +}) diff --git a/src/api/transform/caching/__tests__/gemini.test.ts b/src/api/transform/caching/__tests__/gemini.test.ts new file mode 100644 index 00000000000..bed3b334ca9 --- /dev/null +++ b/src/api/transform/caching/__tests__/gemini.test.ts @@ -0,0 +1,266 @@ +// npx jest src/api/transform/caching/__tests__/gemini.test.ts + +import OpenAI from "openai" + +import { addCacheBreakpoints } from "../gemini" + +describe("addCacheBreakpoints", () => { + const systemPrompt = "You are a helpful assistant." + + it("should always add a cache breakpoint to the system prompt", () => { + const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [ + { role: "system", content: systemPrompt }, + { role: "user", content: "Hello" }, + ] + addCacheBreakpoints(systemPrompt, messages, 10) // Pass frequency + expect(messages[0].content).toEqual([ + { type: "text", text: systemPrompt, cache_control: { type: "ephemeral" } }, + ]) + }) + + it("should not add breakpoints for fewer than N user messages", () => { + const frequency = 5 + + const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [ + { role: "system", content: systemPrompt }, + ...Array.from({ length: frequency - 1 }, (_, i) => ({ + role: "user" as const, + content: `User message ${i + 1}`, + })), + ] + + const originalMessages = JSON.parse(JSON.stringify(messages)) + + addCacheBreakpoints(systemPrompt, messages, frequency) + + expect(messages[0].content).toEqual([ + { type: "text", text: systemPrompt, cache_control: { type: "ephemeral" } }, + ]) + + for (let i = 1; i < messages.length; i++) { + const originalContent = originalMessages[i].content + + const expectedContent = + typeof originalContent === "string" ? [{ type: "text", text: originalContent }] : originalContent + + expect(messages[i].content).toEqual(expectedContent) + } + }) + + it("should add a breakpoint to the Nth user message", () => { + const frequency = 5 + + const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [ + { role: "system", content: systemPrompt }, + ...Array.from({ length: frequency }, (_, i) => ({ + role: "user" as const, + content: `User message ${i + 1}`, + })), + ] + + addCacheBreakpoints(systemPrompt, messages, frequency) + + // Check Nth user message (index 'frequency' in the full array). + expect(messages[frequency].content).toEqual([ + { type: "text", text: `User message ${frequency}`, cache_control: { type: "ephemeral" } }, + ]) + + // Check (N-1)th user message (index frequency-1) - should be unchanged. + expect(messages[frequency - 1].content).toEqual([{ type: "text", text: `User message ${frequency - 1}` }]) + }) + + it("should add breakpoints to the Nth and 2*Nth user messages", () => { + const frequency = 5 + + const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [ + { role: "system", content: systemPrompt }, + ...Array.from({ length: frequency * 2 }, (_, i) => ({ + role: "user" as const, + content: `User message ${i + 1}`, + })), + ] + + expect(messages.length).toEqual(frequency * 2 + 1) + + addCacheBreakpoints(systemPrompt, messages, frequency) + + const indices = [] + + for (let i = 0; i < messages.length; i++) { + const content = messages[i].content?.[0] + + if (typeof content === "object" && "cache_control" in content) { + indices.push(i) + } + } + + expect(indices).toEqual([0, 5, 10]) + + // Check Nth user message (index frequency) + expect(messages[frequency].content).toEqual([ + { type: "text", text: `User message ${frequency}`, cache_control: { type: "ephemeral" } }, + ]) + + // Check (2*N-1)th user message (index 2*frequency-1) - unchanged + expect(messages[frequency * 2 - 1].content).toEqual([ + { type: "text", text: `User message ${frequency * 2 - 1}` }, + ]) + + // Check 2*Nth user message (index 2*frequency) + expect(messages[frequency * 2].content).toEqual([ + { type: "text", text: `User message ${frequency * 2}`, cache_control: { type: "ephemeral" } }, + ]) + }) + + it("should handle assistant messages correctly when counting user messages", () => { + const frequency = 5 + + const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [ + { role: "system", content: systemPrompt }, + // N-1 user messages + ...Array.from({ length: frequency - 1 }, (_, i) => ({ + role: "user" as const, + content: `User message ${i + 1}`, + })), + { role: "assistant", content: "Assistant response" }, + { role: "user", content: `User message ${frequency}` }, // This is the Nth user message. + { role: "assistant", content: "Another response" }, + { role: "user", content: `User message ${frequency + 1}` }, + ] + + addCacheBreakpoints(systemPrompt, messages, frequency) + + // Find the Nth user message. + const nthUserMessage = messages.filter((m) => m.role === "user")[frequency - 1] + expect(nthUserMessage.content).toEqual([ + { type: "text", text: `User message ${frequency}`, cache_control: { type: "ephemeral" } }, + ]) + + // Check the (N+1)th user message is unchanged. + const nPlusOneUserMessage = messages.filter((m) => m.role === "user")[frequency] + expect(nPlusOneUserMessage.content).toEqual([{ type: "text", text: `User message ${frequency + 1}` }]) + }) + + it("should add breakpoint to the last text part if content is an array", () => { + const frequency = 5 + + const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [ + { role: "system", content: systemPrompt }, + ...Array.from({ length: frequency - 1 }, (_, i) => ({ + role: "user" as const, + content: `User message ${i + 1}`, + })), + { + role: "user", // Nth user message + content: [ + { type: "text", text: `This is the ${frequency}th user message.` }, + { type: "image_url", image_url: { url: "data:image/png;base64,..." } }, + { type: "text", text: "This part should get the breakpoint." }, + ], + }, + ] + + addCacheBreakpoints(systemPrompt, messages, frequency) + + expect(messages[frequency].content).toEqual([ + { type: "text", text: `This is the ${frequency}th user message.` }, + { type: "image_url", image_url: { url: "data:image/png;base64,..." } }, + { type: "text", text: "This part should get the breakpoint.", cache_control: { type: "ephemeral" } }, + ]) + }) + + it("should add a placeholder text part if the target message has no text parts", () => { + const frequency = 5 + + const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [ + { role: "system", content: systemPrompt }, + ...Array.from({ length: frequency - 1 }, (_, i) => ({ + role: "user" as const, + content: `User message ${i + 1}`, + })), + { + role: "user", // Nth user message. + content: [{ type: "image_url", image_url: { url: "data:image/png;base64,..." } }], + }, + ] + + addCacheBreakpoints(systemPrompt, messages, frequency) + + expect(messages[frequency].content).toEqual([ + { type: "image_url", image_url: { url: "data:image/png;base64,..." } }, + { type: "text", text: "...", cache_control: { type: "ephemeral" } }, + ]) + }) + + it("should add breakpoints correctly with frequency 5", () => { + const frequency = 5 + + const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [ + { role: "system", content: systemPrompt }, + ...Array.from({ length: 12 }, (_, i) => ({ + role: "user" as const, + content: `User message ${i + 1}`, + })), + ] + + addCacheBreakpoints(systemPrompt, messages, frequency) + + // Check 5th user message (index 5). + expect(messages[5].content).toEqual([ + { type: "text", text: "User message 5", cache_control: { type: "ephemeral" } }, + ]) + + // Check 9th user message (index 9) - unchanged + expect(messages[9].content).toEqual([{ type: "text", text: "User message 9" }]) + + // Check 10th user message (index 10). + expect(messages[10].content).toEqual([ + { type: "text", text: "User message 10", cache_control: { type: "ephemeral" } }, + ]) + + // Check 11th user message (index 11) - unchanged + expect(messages[11].content).toEqual([{ type: "text", text: "User message 11" }]) + }) + + it("should not add breakpoints (except system) if frequency is 0", () => { + const frequency = 0 + const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [ + { role: "system", content: systemPrompt }, + ...Array.from({ length: 15 }, (_, i) => ({ + role: "user" as const, + content: `User message ${i + 1}`, + })), + ] + const originalMessages = JSON.parse(JSON.stringify(messages)) + + addCacheBreakpoints(systemPrompt, messages, frequency) + + // Check system prompt. + expect(messages[0].content).toEqual([ + { type: "text", text: systemPrompt, cache_control: { type: "ephemeral" } }, + ]) + + // Check all user messages - none should have cache_control + for (let i = 1; i < messages.length; i++) { + const originalContent = originalMessages[i].content + + const expectedContent = + typeof originalContent === "string" ? [{ type: "text", text: originalContent }] : originalContent + + expect(messages[i].content).toEqual(expectedContent) // Should match original (after string->array conversion). + + // Ensure no cache_control was added to user messages. + const content = messages[i].content + + if (Array.isArray(content)) { + // Assign to new variable after type check. + const contentParts = content + + contentParts.forEach((part: any) => { + // Iterate over the correctly typed variable. + expect(part).not.toHaveProperty("cache_control") + }) + } + } + }) +}) diff --git a/src/api/transform/caching/__tests__/vertex.test.ts b/src/api/transform/caching/__tests__/vertex.test.ts new file mode 100644 index 00000000000..a707495c7fe --- /dev/null +++ b/src/api/transform/caching/__tests__/vertex.test.ts @@ -0,0 +1,178 @@ +// npx jest src/api/transform/caching/__tests__/vertex.test.ts + +import { Anthropic } from "@anthropic-ai/sdk" + +import { addCacheBreakpoints } from "../vertex" + +describe("addCacheBreakpoints (Vertex)", () => { + it("should return an empty array if input is empty", () => { + const messages: Anthropic.Messages.MessageParam[] = [] + const result = addCacheBreakpoints(messages) + expect(result).toEqual([]) + expect(result).not.toBe(messages) // Ensure new array. + }) + + it("should not add breakpoints if there are no user messages", () => { + const messages: Anthropic.Messages.MessageParam[] = [{ role: "assistant", content: "Hello" }] + const originalMessages = JSON.parse(JSON.stringify(messages)) + const result = addCacheBreakpoints(messages) + expect(result).toEqual(originalMessages) // Should be unchanged. + expect(result).not.toBe(messages) // Ensure new array. + }) + + it("should add a breakpoint to the only user message if only one exists", () => { + const messages: Anthropic.Messages.MessageParam[] = [{ role: "user", content: "User message 1" }] + const result = addCacheBreakpoints(messages) + + expect(result).toHaveLength(1) + + expect(result[0].content).toEqual([ + { type: "text", text: "User message 1", cache_control: { type: "ephemeral" } }, + ]) + + expect(result).not.toBe(messages) // Ensure new array. + }) + + it("should add breakpoints to both user messages if only two exist", () => { + const messages: Anthropic.Messages.MessageParam[] = [ + { role: "user", content: "User message 1" }, + { role: "user", content: "User message 2" }, + ] + + const result = addCacheBreakpoints(messages) + expect(result).toHaveLength(2) + + expect(result[0].content).toEqual([ + { type: "text", text: "User message 1", cache_control: { type: "ephemeral" } }, + ]) + + expect(result[1].content).toEqual([ + { type: "text", text: "User message 2", cache_control: { type: "ephemeral" } }, + ]) + + expect(result).not.toBe(messages) // Ensure new array. + }) + + it("should add breakpoints only to the last two user messages when more than two exist", () => { + const messages: Anthropic.Messages.MessageParam[] = [ + { role: "user", content: "User message 1" }, // Should not get breakpoint. + { role: "user", content: "User message 2" }, // Should get breakpoint. + { role: "user", content: "User message 3" }, // Should get breakpoint. + ] + + const originalMessage1 = JSON.parse(JSON.stringify(messages[0])) + const result = addCacheBreakpoints(messages) + + expect(result).toHaveLength(3) + expect(result[0]).toEqual(originalMessage1) + + expect(result[1].content).toEqual([ + { type: "text", text: "User message 2", cache_control: { type: "ephemeral" } }, + ]) + + expect(result[2].content).toEqual([ + { type: "text", text: "User message 3", cache_control: { type: "ephemeral" } }, + ]) + + expect(result).not.toBe(messages) // Ensure new array. + }) + + it("should handle assistant messages correctly when finding last two user messages", () => { + const messages: Anthropic.Messages.MessageParam[] = [ + { role: "user", content: "User message 1" }, // Should not get breakpoint. + { role: "assistant", content: "Assistant response 1" }, // Should be unchanged. + { role: "user", content: "User message 2" }, // Should get breakpoint (second to last user). + { role: "assistant", content: "Assistant response 2" }, // Should be unchanged. + { role: "user", content: "User message 3" }, // Should get breakpoint (last user). + { role: "assistant", content: "Assistant response 3" }, // Should be unchanged. + ] + const originalMessage1 = JSON.parse(JSON.stringify(messages[0])) + const originalAssistant1 = JSON.parse(JSON.stringify(messages[1])) + const originalAssistant2 = JSON.parse(JSON.stringify(messages[3])) + const originalAssistant3 = JSON.parse(JSON.stringify(messages[5])) + + const result = addCacheBreakpoints(messages) + expect(result).toHaveLength(6) + + expect(result[0]).toEqual(originalMessage1) + expect(result[1]).toEqual(originalAssistant1) + + expect(result[2].content).toEqual([ + { type: "text", text: "User message 2", cache_control: { type: "ephemeral" } }, + ]) + + expect(result[3]).toEqual(originalAssistant2) + + expect(result[4].content).toEqual([ + { type: "text", text: "User message 3", cache_control: { type: "ephemeral" } }, + ]) + + expect(result[5]).toEqual(originalAssistant3) + expect(result).not.toBe(messages) // Ensure new array. + }) + + it("should add breakpoint only to the last text part if content is an array", () => { + const messages: Anthropic.Messages.MessageParam[] = [ + { role: "user", content: "User message 1" }, // Gets breakpoint. + { + role: "user", // Gets breakpoint. + content: [ + { type: "text", text: "First text part." }, // No breakpoint. + { type: "image", source: { type: "base64", media_type: "image/png", data: "..." } }, + { type: "text", text: "Last text part." }, // Gets breakpoint. + ], + }, + ] + + const result = addCacheBreakpoints(messages) + expect(result).toHaveLength(2) + + expect(result[0].content).toEqual([ + { type: "text", text: "User message 1", cache_control: { type: "ephemeral" } }, + ]) + + expect(result[1].content).toEqual([ + { type: "text", text: "First text part." }, // Unchanged. + { type: "image", source: { type: "base64", media_type: "image/png", data: "..." } }, // Unchanged. + { type: "text", text: "Last text part.", cache_control: { type: "ephemeral" } }, // Breakpoint added. + ]) + + expect(result).not.toBe(messages) // Ensure new array. + }) + + it("should handle array content with no text parts gracefully", () => { + const messages: Anthropic.Messages.MessageParam[] = [ + { role: "user", content: "User message 1" }, // Gets breakpoint. + { + role: "user", // Gets breakpoint, but has no text part to add it to. + content: [{ type: "image", source: { type: "base64", media_type: "image/png", data: "..." } }], + }, + ] + + const originalMessage2 = JSON.parse(JSON.stringify(messages[1])) + + const result = addCacheBreakpoints(messages) + expect(result).toHaveLength(2) + + expect(result[0].content).toEqual([ + { type: "text", text: "User message 1", cache_control: { type: "ephemeral" } }, + ]) + + // Check second user message - should be unchanged as no text part found. + expect(result[1]).toEqual(originalMessage2) + expect(result).not.toBe(messages) // Ensure new array. + }) + + it("should not modify the original messages array", () => { + const messages: Anthropic.Messages.MessageParam[] = [ + { role: "user", content: "User message 1" }, + { role: "user", content: "User message 2" }, + ] + const originalMessagesCopy = JSON.parse(JSON.stringify(messages)) + + addCacheBreakpoints(messages) + + // Verify original array is untouched. + expect(messages).toEqual(originalMessagesCopy) + }) +}) diff --git a/src/api/transform/caching/anthropic.ts b/src/api/transform/caching/anthropic.ts new file mode 100644 index 00000000000..cff671a56ce --- /dev/null +++ b/src/api/transform/caching/anthropic.ts @@ -0,0 +1,41 @@ +import OpenAI from "openai" + +export function addCacheBreakpoints(systemPrompt: string, messages: OpenAI.Chat.ChatCompletionMessageParam[]) { + messages[0] = { + role: "system", + // @ts-ignore-next-line + content: [{ type: "text", text: systemPrompt, cache_control: { type: "ephemeral" } }], + } + + // Ensure all user messages have content in array format first + for (const msg of messages) { + if (msg.role === "user" && typeof msg.content === "string") { + msg.content = [{ type: "text", text: msg.content }] + } + } + + // Add `cache_control: ephemeral` to the last two user messages. + // (Note: this works because we only ever add one user message at a + // time, but if we added multiple we'd need to mark the user message + // before the last assistant message.) + messages + .filter((msg) => msg.role === "user") + .slice(-2) + .forEach((msg) => { + if (Array.isArray(msg.content)) { + // NOTE: This is fine since env details will always be added + // at the end. But if it wasn't there, and the user added a + // image_url type message, it would pop a text part before + // it and then move it after to the end. + let lastTextPart = msg.content.filter((part) => part.type === "text").pop() + + if (!lastTextPart) { + lastTextPart = { type: "text", text: "..." } + msg.content.push(lastTextPart) + } + + // @ts-ignore-next-line + lastTextPart["cache_control"] = { type: "ephemeral" } + } + }) +} diff --git a/src/api/transform/caching/gemini.ts b/src/api/transform/caching/gemini.ts new file mode 100644 index 00000000000..66d43e85553 --- /dev/null +++ b/src/api/transform/caching/gemini.ts @@ -0,0 +1,47 @@ +import OpenAI from "openai" + +export function addCacheBreakpoints( + systemPrompt: string, + messages: OpenAI.Chat.ChatCompletionMessageParam[], + frequency: number = 10, +) { + // *Always* cache the system prompt. + messages[0] = { + role: "system", + // @ts-ignore-next-line + content: [{ type: "text", text: systemPrompt, cache_control: { type: "ephemeral" } }], + } + + // Add breakpoints every N user messages based on frequency. + let count = 0 + + for (const msg of messages) { + if (msg.role !== "user") { + continue + } + + // Ensure content is in array format for potential modification. + if (typeof msg.content === "string") { + msg.content = [{ type: "text", text: msg.content }] + } + + const isNthMessage = count % frequency === frequency - 1 + + if (isNthMessage) { + if (Array.isArray(msg.content)) { + // Find the last text part to add the cache control to. + let lastTextPart = msg.content.filter((part) => part.type === "text").pop() + + if (!lastTextPart) { + lastTextPart = { type: "text", text: "..." } // Add a placeholder if no text part exists. + msg.content.push(lastTextPart) + } + + // @ts-ignore-next-line - Add cache control property + lastTextPart["cache_control"] = { type: "ephemeral" } + } + } + + count++ + } +} diff --git a/src/api/transform/caching/vertex.ts b/src/api/transform/caching/vertex.ts new file mode 100644 index 00000000000..48bf2615873 --- /dev/null +++ b/src/api/transform/caching/vertex.ts @@ -0,0 +1,49 @@ +import { Anthropic } from "@anthropic-ai/sdk" + +export function addCacheBreakpoints(messages: Anthropic.Messages.MessageParam[]) { + // Find indices of user messages that we want to cache. + // We only cache the last two user messages to stay within the 4-block limit + // (1 block for system + 1 block each for last two user messages = 3 total). + const indices = messages.reduce((acc, msg, i) => (msg.role === "user" ? [...acc, i] : acc), [] as number[]) + + // Only cache the last two user messages. + const lastIndex = indices[indices.length - 1] ?? -1 + const secondLastIndex = indices[indices.length - 2] ?? -1 + + return messages.map((message, index) => + message.role !== "assistant" && (index === lastIndex || index === secondLastIndex) + ? cachedMessage(message) + : message, + ) +} + +function cachedMessage(message: Anthropic.Messages.MessageParam): Anthropic.Messages.MessageParam { + // For string content, we convert to array format with optional cache control. + if (typeof message.content === "string") { + return { + ...message, + // For string content, we only have one block so it's always the last block. + content: [{ type: "text" as const, text: message.content, cache_control: { type: "ephemeral" } }], + } + } + + // For array content, find the last text block index once before mapping. + const lastTextBlockIndex = message.content.reduce( + (lastIndex, content, index) => (content.type === "text" ? index : lastIndex), + -1, + ) + + // Then use this pre-calculated index in the map function. + return { + ...message, + content: message.content.map((content, index) => + content.type === "text" + ? { + ...content, + // Check if this is the last text block using our pre-calculated index. + ...(index === lastTextBlockIndex && { cache_control: { type: "ephemeral" } }), + } + : content, + ), + } +} diff --git a/src/api/transform/vertex-caching.ts b/src/api/transform/vertex-caching.ts deleted file mode 100644 index 2d866bd13b6..00000000000 --- a/src/api/transform/vertex-caching.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { Anthropic } from "@anthropic-ai/sdk" - -interface VertexTextBlock { - type: "text" - text: string - cache_control?: { type: "ephemeral" } -} - -interface VertexImageBlock { - type: "image" - source: { - type: "base64" - media_type: "image/jpeg" | "image/png" | "image/gif" | "image/webp" - data: string - } -} - -type VertexContentBlock = VertexTextBlock | VertexImageBlock - -interface VertexMessage extends Omit { - content: string | VertexContentBlock[] -} - -export function formatMessageForCache(message: Anthropic.Messages.MessageParam, shouldCache: boolean): VertexMessage { - // Assistant messages are kept as-is since they can't be cached - if (message.role === "assistant") { - return message as VertexMessage - } - - // For string content, we convert to array format with optional cache control - if (typeof message.content === "string") { - return { - ...message, - content: [ - { - type: "text" as const, - text: message.content, - // For string content, we only have one block so it's always the last - ...(shouldCache && { cache_control: { type: "ephemeral" } }), - }, - ], - } - } - - // For array content, find the last text block index once before mapping - const lastTextBlockIndex = message.content.reduce( - (lastIndex, content, index) => (content.type === "text" ? index : lastIndex), - -1, - ) - - // Then use this pre-calculated index in the map function. - return { - ...message, - content: message.content.map((content, contentIndex) => { - // Images and other non-text content are passed through unchanged. - if (content.type === "image") { - return content as VertexImageBlock - } - - // Check if this is the last text block using our pre-calculated index. - const isLastTextBlock = contentIndex === lastTextBlockIndex - - return { - type: "text" as const, - text: (content as { text: string }).text, - ...(shouldCache && isLastTextBlock && { cache_control: { type: "ephemeral" } }), - } - }), - } -} diff --git a/webview-ui/src/components/settings/ExperimentalSettings.tsx b/webview-ui/src/components/settings/ExperimentalSettings.tsx index 5e060832cf0..6270ded6e80 100644 --- a/webview-ui/src/components/settings/ExperimentalSettings.tsx +++ b/webview-ui/src/components/settings/ExperimentalSettings.tsx @@ -6,13 +6,12 @@ import { EXPERIMENT_IDS, experimentConfigsMap, ExperimentId } from "@roo/shared/ import { cn } from "@/lib/utils" -import { SetCachedStateField, SetExperimentEnabled } from "./types" +import { SetExperimentEnabled } from "./types" import { SectionHeader } from "./SectionHeader" import { Section } from "./Section" import { ExperimentalFeature } from "./ExperimentalFeature" type ExperimentalSettingsProps = HTMLAttributes & { - setCachedStateField: SetCachedStateField<"terminalOutputLineLimit" | "maxOpenTabsContext"> experiments: Record setExperimentEnabled: SetExperimentEnabled } diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index e12c9161597..fc36ac5a908 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -501,11 +501,7 @@ const SettingsView = forwardRef(({ onDone, t
- +
From 0f977724de3160dcca91dc78a20c566ceab91540 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Fri, 2 May 2025 16:41:58 -0700 Subject: [PATCH 25/29] v3.15.3 (#3133) --- .changeset/famous-jars-dance.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/famous-jars-dance.md diff --git a/.changeset/famous-jars-dance.md b/.changeset/famous-jars-dance.md new file mode 100644 index 00000000000..030f640be14 --- /dev/null +++ b/.changeset/famous-jars-dance.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +v3.15.3 From dd3cd7fd7d2cd38ea61404634b8cb47291980ba0 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Fri, 2 May 2025 18:15:22 -0700 Subject: [PATCH 26/29] More robust process killing (#3136) --- .changeset/great-sheep-speak.md | 5 ++ package-lock.json | 89 +++++++++++++++++++ package.json | 2 + src/core/tools/executeCommandTool.ts | 1 + .../terminal/ExecaTerminalProcess.ts | 39 +++++++- 5 files changed, 132 insertions(+), 4 deletions(-) create mode 100644 .changeset/great-sheep-speak.md diff --git a/.changeset/great-sheep-speak.md b/.changeset/great-sheep-speak.md new file mode 100644 index 00000000000..727e72c8ee6 --- /dev/null +++ b/.changeset/great-sheep-speak.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +More robust process killing diff --git a/package-lock.json b/package-lock.json index 528e962b899..396d799518b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,6 +47,7 @@ "pkce-challenge": "^4.1.0", "posthog-node": "^4.7.0", "pretty-bytes": "^6.1.1", + "ps-tree": "^1.2.0", "puppeteer-chromium-resolver": "^23.0.0", "puppeteer-core": "^23.4.0", "reconnecting-eventsource": "^1.6.4", @@ -79,6 +80,7 @@ "@types/node": "20.x", "@types/node-cache": "^4.1.3", "@types/node-ipc": "^9.2.3", + "@types/ps-tree": "^1.1.6", "@types/string-similarity": "^4.0.2", "@typescript-eslint/eslint-plugin": "^7.14.1", "@typescript-eslint/parser": "^7.11.0", @@ -9029,6 +9031,13 @@ "resolved": "https://registry.npmjs.org/@types/pdf-parse/-/pdf-parse-1.1.4.tgz", "integrity": "sha512-+gbBHbNCVGGYw1S9lAIIvrHW47UYOhMIFUsJcMkMrzy1Jf0vulBN3XQIjPgnoOXveMuHnF3b57fXROnY/Or7eg==" }, + "node_modules/@types/ps-tree": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@types/ps-tree/-/ps-tree-1.1.6.tgz", + "integrity": "sha512-PtrlVaOaI44/3pl3cvnlK+GxOM3re2526TJvPvh7W+keHIXdV4TE0ylpPBAcvFQCbGitaTXwL9u+RF7qtVeazQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -11792,6 +11801,12 @@ "node": ">= 0.4" } }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -12458,6 +12473,21 @@ "node": ">=12.0.0" } }, + "node_modules/event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", + "license": "MIT", + "dependencies": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + } + }, "node_modules/event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", @@ -13137,6 +13167,12 @@ "node": ">= 0.8" } }, + "node_modules/from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", + "license": "MIT" + }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -16515,6 +16551,11 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, + "node_modules/map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==" + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -17803,6 +17844,18 @@ "node": ">=16" } }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "license": [ + "MIT", + "Apache2" + ], + "dependencies": { + "through": "~2.3" + } + }, "node_modules/pdf-parse": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pdf-parse/-/pdf-parse-1.1.1.tgz", @@ -18245,6 +18298,21 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, + "node_modules/ps-tree": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", + "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", + "license": "MIT", + "dependencies": { + "event-stream": "=3.3.4" + }, + "bin": { + "ps-tree": "bin/ps-tree.js" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/pump": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", @@ -19389,6 +19457,18 @@ "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", "dev": true }, + "node_modules/split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", + "license": "MIT", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, "node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", @@ -19448,6 +19528,15 @@ "npm": ">=6" } }, + "node_modules/stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", + "license": "MIT", + "dependencies": { + "duplexer": "~0.1.1" + } + }, "node_modules/streamx": { "version": "2.21.0", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.0.tgz", diff --git a/package.json b/package.json index 44f516ffd2c..d60089fee96 100644 --- a/package.json +++ b/package.json @@ -417,6 +417,7 @@ "pkce-challenge": "^4.1.0", "posthog-node": "^4.7.0", "pretty-bytes": "^6.1.1", + "ps-tree": "^1.2.0", "puppeteer-chromium-resolver": "^23.0.0", "puppeteer-core": "^23.4.0", "reconnecting-eventsource": "^1.6.4", @@ -449,6 +450,7 @@ "@types/node": "20.x", "@types/node-cache": "^4.1.3", "@types/node-ipc": "^9.2.3", + "@types/ps-tree": "^1.1.6", "@types/string-similarity": "^4.0.2", "@typescript-eslint/eslint-plugin": "^7.14.1", "@typescript-eslint/parser": "^7.11.0", diff --git a/src/core/tools/executeCommandTool.ts b/src/core/tools/executeCommandTool.ts index f3f655b0363..4bd303904f7 100644 --- a/src/core/tools/executeCommandTool.ts +++ b/src/core/tools/executeCommandTool.ts @@ -174,6 +174,7 @@ export async function executeCommand( completed = true }, onShellExecutionStarted: (pid: number | undefined) => { + console.log(`[executeCommand] onShellExecutionStarted: ${pid}`) const status: CommandExecutionStatus = { executionId, status: "started", pid, command } clineProvider?.postMessageToWebview({ type: "commandExecutionStatus", text: JSON.stringify(status) }) }, diff --git a/src/integrations/terminal/ExecaTerminalProcess.ts b/src/integrations/terminal/ExecaTerminalProcess.ts index 63b772e5db0..7764ecadbef 100644 --- a/src/integrations/terminal/ExecaTerminalProcess.ts +++ b/src/integrations/terminal/ExecaTerminalProcess.ts @@ -1,12 +1,14 @@ import { execa, ExecaError } from "execa" +import psTree from "ps-tree" +import process from "process" import type { RooTerminal } from "./types" import { BaseTerminalProcess } from "./BaseTerminalProcess" export class ExecaTerminalProcess extends BaseTerminalProcess { private terminalRef: WeakRef - private controller?: AbortController private aborted = false + private pid?: number constructor(terminal: RooTerminal) { super() @@ -30,7 +32,6 @@ export class ExecaTerminalProcess extends BaseTerminalProcess { public override async run(command: string) { this.command = command - this.controller = new AbortController() try { this.isHot = true @@ -38,10 +39,10 @@ export class ExecaTerminalProcess extends BaseTerminalProcess { const subprocess = execa({ shell: true, cwd: this.terminal.getCurrentWorkingDirectory(), - cancelSignal: this.controller.signal, all: true, })`${command}` + this.pid = subprocess.pid const stream = subprocess.iterable({ from: "all", preserveNewlines: true }) this.terminal.setActiveStream(stream, subprocess.pid) @@ -116,7 +117,37 @@ export class ExecaTerminalProcess extends BaseTerminalProcess { public override abort() { this.aborted = true - this.controller?.abort() + + if (this.pid) { + psTree(this.pid, async (err, children) => { + if (!err) { + const pids = children.map((p) => parseInt(p.PID)) + + for (const pid of pids) { + try { + process.kill(pid, "SIGINT") + } catch (e) { + console.warn( + `[ExecaTerminalProcess] Failed to send SIGINT to child PID ${pid}: ${e instanceof Error ? e.message : String(e)}`, + ) + // Optionally try SIGTERM or SIGKILL on failure, depending on desired behavior. + } + } + } else { + console.error( + `[ExecaTerminalProcess] Failed to get process tree for PID ${this.pid}: ${err.message}`, + ) + } + }) + + try { + process.kill(this.pid, "SIGINT") + } catch (e) { + console.warn( + `[ExecaTerminalProcess] Failed to send SIGINT to main PID ${this.pid}: ${e instanceof Error ? e.message : String(e)}`, + ) + } + } } public override hasUnretrievedOutput() { From 5bca10d73cb0d7c56a3e6d4f558b86c3ac40d8b4 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Fri, 2 May 2025 19:52:11 -0700 Subject: [PATCH 27/29] Fix empty command bug (#3139) --- .changeset/chilled-books-relate.md | 5 +++++ webview-ui/src/components/chat/CommandExecution.tsx | 6 ++++-- 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 .changeset/chilled-books-relate.md diff --git a/.changeset/chilled-books-relate.md b/.changeset/chilled-books-relate.md new file mode 100644 index 00000000000..281d55d1046 --- /dev/null +++ b/.changeset/chilled-books-relate.md @@ -0,0 +1,5 @@ +--- +"roo-cline": patch +--- + +Fix empty command bug diff --git a/webview-ui/src/components/chat/CommandExecution.tsx b/webview-ui/src/components/chat/CommandExecution.tsx index f5cd63ff03d..827e7119489 100644 --- a/webview-ui/src/components/chat/CommandExecution.tsx +++ b/webview-ui/src/components/chat/CommandExecution.tsx @@ -27,7 +27,7 @@ export const CommandExecution = ({ executionId, text }: CommandExecutionProps) = const [status, setStatus] = useState(null) const [output, setOutput] = useState("") - const [command, setCommand] = useState("") + const [command, setCommand] = useState(text) const lines = useMemo( () => [`$ ${command}`, ...output.split("\n").filter((line) => line.trim() !== "")], @@ -79,7 +79,9 @@ export const CommandExecution = ({ executionId, text }: CommandExecutionProps) = if (!status && text) { const index = text.indexOf(COMMAND_OUTPUT_STRING) - if (index !== -1) { + if (index === -1) { + setCommand(text) + } else { setCommand(text.slice(0, index)) setOutput(text.slice(index + COMMAND_OUTPUT_STRING.length)) } From 3ad7f6e300e3316ab9a763366acd837784a2836b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 3 May 2025 02:53:10 +0000 Subject: [PATCH 28/29] changeset version bump --- .changeset/chilled-books-relate.md | 5 ----- .changeset/famous-jars-dance.md | 5 ----- .changeset/great-sheep-speak.md | 5 ----- CHANGELOG.md | 8 ++++++++ package-lock.json | 4 ++-- package.json | 2 +- 6 files changed, 11 insertions(+), 18 deletions(-) delete mode 100644 .changeset/chilled-books-relate.md delete mode 100644 .changeset/famous-jars-dance.md delete mode 100644 .changeset/great-sheep-speak.md diff --git a/.changeset/chilled-books-relate.md b/.changeset/chilled-books-relate.md deleted file mode 100644 index 281d55d1046..00000000000 --- a/.changeset/chilled-books-relate.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -Fix empty command bug diff --git a/.changeset/famous-jars-dance.md b/.changeset/famous-jars-dance.md deleted file mode 100644 index 030f640be14..00000000000 --- a/.changeset/famous-jars-dance.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -v3.15.3 diff --git a/.changeset/great-sheep-speak.md b/.changeset/great-sheep-speak.md deleted file mode 100644 index 727e72c8ee6..00000000000 --- a/.changeset/great-sheep-speak.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"roo-cline": patch ---- - -More robust process killing diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e7a9766160..a5c3fe62b2d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Roo Code Changelog +## 3.15.3 + +### Patch Changes + +- Fix empty command bug +- v3.15.3 +- More robust process killing + ## [3.15.2] - 2025-05-02 - Fix terminal performance issues diff --git a/package-lock.json b/package-lock.json index 396d799518b..1f6ad6dc9a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "roo-cline", - "version": "3.15.2", + "version": "3.15.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "roo-cline", - "version": "3.15.2", + "version": "3.15.3", "dependencies": { "@anthropic-ai/bedrock-sdk": "^0.10.2", "@anthropic-ai/sdk": "^0.37.0", diff --git a/package.json b/package.json index d60089fee96..48dcd53674f 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "%extension.displayName%", "description": "%extension.description%", "publisher": "RooVeterinaryInc", - "version": "3.15.2", + "version": "3.15.3", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", From 2b17a1380d26abf2a9eeb7ae5181a591cbd2cb75 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Fri, 2 May 2025 20:03:37 -0700 Subject: [PATCH 29/29] Update CHANGELOG.md --- CHANGELOG.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5c3fe62b2d..d2b44282d69 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,11 @@ # Roo Code Changelog -## 3.15.3 +## [3.15.3] - 2025-05-02 -### Patch Changes - -- Fix empty command bug -- v3.15.3 -- More robust process killing +- Terminal: Fix empty command bug +- Terminal: More robust process killing +- Optimize Gemini prompt caching for OpenRouter +- Chat view performance improvements ## [3.15.2] - 2025-05-02