From bbe3362359b8bdbb2944914600f3b5dc6e126397 Mon Sep 17 00:00:00 2001 From: "roomote[bot]" <219738659+roomote[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 12:52:08 -0400 Subject: [PATCH 01/36] fix: ensure JSON files respect .rooignore during indexing (#6691) Co-authored-by: Roo Code Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com> --- .../code-index/__tests__/manager.spec.ts | 27 +++++++++++++++++++ src/services/code-index/manager.ts | 7 +++++ src/services/code-index/service-factory.ts | 22 +++++++++++++-- 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/src/services/code-index/__tests__/manager.spec.ts b/src/services/code-index/__tests__/manager.spec.ts index 49f725f69b..929f6f93c8 100644 --- a/src/services/code-index/__tests__/manager.spec.ts +++ b/src/services/code-index/__tests__/manager.spec.ts @@ -19,7 +19,14 @@ vi.mock("vscode", () => { index: 0, }, ], + createFileSystemWatcher: vi.fn().mockReturnValue({ + onDidCreate: vi.fn().mockReturnValue({ dispose: vi.fn() }), + onDidChange: vi.fn().mockReturnValue({ dispose: vi.fn() }), + onDidDelete: vi.fn().mockReturnValue({ dispose: vi.fn() }), + dispose: vi.fn(), + }), }, + RelativePattern: vi.fn().mockImplementation((base, pattern) => ({ base, pattern })), } }) @@ -32,6 +39,26 @@ vi.mock("../../../utils/path", () => { } }) +// Mock fs/promises for RooIgnoreController +vi.mock("fs/promises", () => ({ + default: { + readFile: vi.fn().mockRejectedValue(new Error("File not found")), // Simulate no .gitignore/.rooignore + }, +})) + +// Mock file utils for RooIgnoreController +vi.mock("../../../utils/fs", () => ({ + fileExistsAtPath: vi.fn().mockResolvedValue(false), // Simulate no .rooignore file +})) + +// Mock ignore module +vi.mock("ignore", () => ({ + default: vi.fn().mockReturnValue({ + add: vi.fn(), + ignores: vi.fn().mockReturnValue(false), + }), +})) + vi.mock("../state-manager", () => ({ CodeIndexStateManager: vi.fn().mockImplementation(() => ({ onProgressUpdate: vi.fn(), diff --git a/src/services/code-index/manager.ts b/src/services/code-index/manager.ts index 1257b747c6..d82760533d 100644 --- a/src/services/code-index/manager.ts +++ b/src/services/code-index/manager.ts @@ -9,6 +9,7 @@ import { CodeIndexServiceFactory } from "./service-factory" import { CodeIndexSearchService } from "./search-service" import { CodeIndexOrchestrator } from "./orchestrator" import { CacheManager } from "./cache-manager" +import { RooIgnoreController } from "../../core/ignore/RooIgnoreController" import fs from "fs/promises" import ignore from "ignore" import path from "path" @@ -312,6 +313,7 @@ export class CodeIndexManager { return } + // Create .gitignore instance const ignorePath = path.join(workspacePath, ".gitignore") try { const content = await fs.readFile(ignorePath, "utf8") @@ -327,11 +329,16 @@ export class CodeIndexManager { }) } + // Create RooIgnoreController instance + const rooIgnoreController = new RooIgnoreController(workspacePath) + await rooIgnoreController.initialize() + // (Re)Create shared service instances const { embedder, vectorStore, scanner, fileWatcher } = this._serviceFactory.createServices( this.context, this._cacheManager!, ignoreInstance, + rooIgnoreController, ) // Validate embedder configuration before proceeding diff --git a/src/services/code-index/service-factory.ts b/src/services/code-index/service-factory.ts index 68b0f5c0bc..5c1c366107 100644 --- a/src/services/code-index/service-factory.ts +++ b/src/services/code-index/service-factory.ts @@ -10,6 +10,7 @@ import { codeParser, DirectoryScanner, FileWatcher } from "./processors" import { ICodeParser, IEmbedder, IFileWatcher, IVectorStore } from "./interfaces" import { CodeIndexConfigManager } from "./config-manager" import { CacheManager } from "./cache-manager" +import { RooIgnoreController } from "../../core/ignore/RooIgnoreController" import { Ignore } from "ignore" import { t } from "../../i18n" import { TelemetryService } from "@roo-code/telemetry" @@ -161,8 +162,17 @@ export class CodeIndexServiceFactory { vectorStore: IVectorStore, cacheManager: CacheManager, ignoreInstance: Ignore, + rooIgnoreController?: RooIgnoreController, ): IFileWatcher { - return new FileWatcher(this.workspacePath, context, cacheManager, embedder, vectorStore, ignoreInstance) + return new FileWatcher( + this.workspacePath, + context, + cacheManager, + embedder, + vectorStore, + ignoreInstance, + rooIgnoreController, + ) } /** @@ -173,6 +183,7 @@ export class CodeIndexServiceFactory { context: vscode.ExtensionContext, cacheManager: CacheManager, ignoreInstance: Ignore, + rooIgnoreController?: RooIgnoreController, ): { embedder: IEmbedder vectorStore: IVectorStore @@ -188,7 +199,14 @@ export class CodeIndexServiceFactory { const vectorStore = this.createVectorStore() const parser = codeParser const scanner = this.createDirectoryScanner(embedder, vectorStore, parser, ignoreInstance) - const fileWatcher = this.createFileWatcher(context, embedder, vectorStore, cacheManager, ignoreInstance) + const fileWatcher = this.createFileWatcher( + context, + embedder, + vectorStore, + cacheManager, + ignoreInstance, + rooIgnoreController, + ) return { embedder, From 8e7a2e7bdb87e65ac1ddee94f91a73f9dac73989 Mon Sep 17 00:00:00 2001 From: Daniel <57051444+daniel-lxs@users.noreply.github.com> Date: Tue, 12 Aug 2025 13:40:42 -0500 Subject: [PATCH 02/36] feat: Update Claude Sonnet 4 context window to 1 million tokens (#7005) Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --- packages/types/src/provider-settings.ts | 1 + packages/types/src/providers/anthropic.ts | 16 ++++++-- src/api/providers/anthropic.ts | 23 +++++++++++- .../src/components/settings/ModelInfoView.tsx | 6 +++ .../settings/providers/Anthropic.tsx | 19 ++++++++++ .../components/ui/hooks/useSelectedModel.ts | 37 ++++++++++++++++++- webview-ui/src/i18n/locales/ca/settings.json | 3 ++ webview-ui/src/i18n/locales/de/settings.json | 3 ++ webview-ui/src/i18n/locales/en/settings.json | 3 ++ webview-ui/src/i18n/locales/es/settings.json | 3 ++ webview-ui/src/i18n/locales/fr/settings.json | 3 ++ webview-ui/src/i18n/locales/hi/settings.json | 3 ++ webview-ui/src/i18n/locales/id/settings.json | 3 ++ webview-ui/src/i18n/locales/it/settings.json | 3 ++ webview-ui/src/i18n/locales/ja/settings.json | 3 ++ webview-ui/src/i18n/locales/ko/settings.json | 3 ++ webview-ui/src/i18n/locales/nl/settings.json | 3 ++ webview-ui/src/i18n/locales/pl/settings.json | 3 ++ .../src/i18n/locales/pt-BR/settings.json | 3 ++ webview-ui/src/i18n/locales/ru/settings.json | 3 ++ webview-ui/src/i18n/locales/tr/settings.json | 3 ++ webview-ui/src/i18n/locales/vi/settings.json | 3 ++ .../src/i18n/locales/zh-CN/settings.json | 3 ++ .../src/i18n/locales/zh-TW/settings.json | 3 ++ 24 files changed, 150 insertions(+), 6 deletions(-) diff --git a/packages/types/src/provider-settings.ts b/packages/types/src/provider-settings.ts index fe04ad9185..3c3757188f 100644 --- a/packages/types/src/provider-settings.ts +++ b/packages/types/src/provider-settings.ts @@ -99,6 +99,7 @@ const anthropicSchema = apiModelIdProviderModelSchema.extend({ apiKey: z.string().optional(), anthropicBaseUrl: z.string().optional(), anthropicUseAuthToken: z.boolean().optional(), + anthropicBeta1MContext: z.boolean().optional(), // Enable 'context-1m-2025-08-07' beta for 1M context window }) const claudeCodeSchema = apiModelIdProviderModelSchema.extend({ diff --git a/packages/types/src/providers/anthropic.ts b/packages/types/src/providers/anthropic.ts index 0c3323cffe..2cb38537a4 100644 --- a/packages/types/src/providers/anthropic.ts +++ b/packages/types/src/providers/anthropic.ts @@ -8,15 +8,25 @@ export const anthropicDefaultModelId: AnthropicModelId = "claude-sonnet-4-202505 export const anthropicModels = { "claude-sonnet-4-20250514": { maxTokens: 64_000, // Overridden to 8k if `enableReasoningEffort` is false. - contextWindow: 200_000, + contextWindow: 200_000, // Default 200K, extendable to 1M with beta flag 'context-1m-2025-08-07' supportsImages: true, supportsComputerUse: true, supportsPromptCache: true, - inputPrice: 3.0, // $3 per million input tokens - outputPrice: 15.0, // $15 per million output tokens + inputPrice: 3.0, // $3 per million input tokens (≤200K context) + outputPrice: 15.0, // $15 per million output tokens (≤200K context) cacheWritesPrice: 3.75, // $3.75 per million tokens cacheReadsPrice: 0.3, // $0.30 per million tokens supportsReasoningBudget: true, + // Tiered pricing for extended context (requires beta flag 'context-1m-2025-08-07') + tiers: [ + { + contextWindow: 1_000_000, // 1M tokens with beta flag + inputPrice: 6.0, // $6 per million input tokens (>200K context) + outputPrice: 22.5, // $22.50 per million output tokens (>200K context) + cacheWritesPrice: 7.5, // $7.50 per million tokens (>200K context) + cacheReadsPrice: 0.6, // $0.60 per million tokens (>200K context) + }, + ], }, "claude-opus-4-1-20250805": { maxTokens: 8192, diff --git a/src/api/providers/anthropic.ts b/src/api/providers/anthropic.ts index f456586762..cb48492b60 100644 --- a/src/api/providers/anthropic.ts +++ b/src/api/providers/anthropic.ts @@ -45,6 +45,11 @@ export class AnthropicHandler extends BaseProvider implements SingleCompletionHa const cacheControl: CacheControlEphemeral = { type: "ephemeral" } let { id: modelId, betas = [], maxTokens, temperature, reasoning: thinking } = this.getModel() + // Add 1M context beta flag if enabled for Claude Sonnet 4 + if (modelId === "claude-sonnet-4-20250514" && this.options.anthropicBeta1MContext) { + betas.push("context-1m-2025-08-07") + } + switch (modelId) { case "claude-sonnet-4-20250514": case "claude-opus-4-1-20250805": @@ -236,7 +241,23 @@ export class AnthropicHandler extends BaseProvider implements SingleCompletionHa getModel() { const modelId = this.options.apiModelId let id = modelId && modelId in anthropicModels ? (modelId as AnthropicModelId) : anthropicDefaultModelId - const info: ModelInfo = anthropicModels[id] + let info: ModelInfo = anthropicModels[id] + + // If 1M context beta is enabled for Claude Sonnet 4, update the model info + if (id === "claude-sonnet-4-20250514" && this.options.anthropicBeta1MContext) { + // Use the tier pricing for 1M context + const tier = info.tiers?.[0] + if (tier) { + info = { + ...info, + contextWindow: tier.contextWindow, + inputPrice: tier.inputPrice, + outputPrice: tier.outputPrice, + cacheWritesPrice: tier.cacheWritesPrice, + cacheReadsPrice: tier.cacheReadsPrice, + } + } + } const params = getModelParams({ format: "anthropic", diff --git a/webview-ui/src/components/settings/ModelInfoView.tsx b/webview-ui/src/components/settings/ModelInfoView.tsx index 8078b03acd..2ba732effa 100644 --- a/webview-ui/src/components/settings/ModelInfoView.tsx +++ b/webview-ui/src/components/settings/ModelInfoView.tsx @@ -41,6 +41,12 @@ export const ModelInfoView = ({ supportsLabel={t("settings:modelInfo.supportsPromptCache")} doesNotSupportLabel={t("settings:modelInfo.noPromptCache")} />, + typeof modelInfo?.contextWindow === "number" && modelInfo.contextWindow > 0 && ( + <> + {t("settings:modelInfo.contextWindow")}{" "} + {modelInfo.contextWindow?.toLocaleString()} tokens + + ), typeof modelInfo?.maxTokens === "number" && modelInfo.maxTokens > 0 && ( <> {t("settings:modelInfo.maxOutput")}:{" "} diff --git a/webview-ui/src/components/settings/providers/Anthropic.tsx b/webview-ui/src/components/settings/providers/Anthropic.tsx index f340e73f72..ede2b90208 100644 --- a/webview-ui/src/components/settings/providers/Anthropic.tsx +++ b/webview-ui/src/components/settings/providers/Anthropic.tsx @@ -6,6 +6,7 @@ import type { ProviderSettings } from "@roo-code/types" import { useAppTranslation } from "@src/i18n/TranslationContext" import { VSCodeButtonLink } from "@src/components/common/VSCodeButtonLink" +import { useSelectedModel } from "@src/components/ui/hooks/useSelectedModel" import { inputEventTransform, noTransform } from "../transforms" @@ -16,9 +17,13 @@ type AnthropicProps = { export const Anthropic = ({ apiConfiguration, setApiConfigurationField }: AnthropicProps) => { const { t } = useAppTranslation() + const selectedModel = useSelectedModel(apiConfiguration) const [anthropicBaseUrlSelected, setAnthropicBaseUrlSelected] = useState(!!apiConfiguration?.anthropicBaseUrl) + // Check if the current model supports 1M context beta + const supports1MContextBeta = selectedModel?.id === "claude-sonnet-4-20250514" + const handleInputChange = useCallback( ( field: K, @@ -79,6 +84,20 @@ export const Anthropic = ({ apiConfiguration, setApiConfigurationField }: Anthro )} + {supports1MContextBeta && ( +
+ { + setApiConfigurationField("anthropicBeta1MContext", checked) + }}> + {t("settings:providers.anthropic1MContextBetaLabel")} + +
+ {t("settings:providers.anthropic1MContextBetaDescription")} +
+
+ )} ) } diff --git a/webview-ui/src/components/ui/hooks/useSelectedModel.ts b/webview-ui/src/components/ui/hooks/useSelectedModel.ts index c67ec796b6..b13823a7d2 100644 --- a/webview-ui/src/components/ui/hooks/useSelectedModel.ts +++ b/webview-ui/src/components/ui/hooks/useSelectedModel.ts @@ -291,8 +291,41 @@ function getSelectedModel({ default: { provider satisfies "anthropic" | "gemini-cli" | "human-relay" | "fake-ai" const id = apiConfiguration.apiModelId ?? anthropicDefaultModelId - const info = anthropicModels[id as keyof typeof anthropicModels] - return { id, info } + const baseInfo = anthropicModels[id as keyof typeof anthropicModels] + + // Apply 1M context beta tier pricing for Claude Sonnet 4 + if ( + provider === "anthropic" && + id === "claude-sonnet-4-20250514" && + apiConfiguration.anthropicBeta1MContext && + baseInfo + ) { + // Type assertion since we know claude-sonnet-4-20250514 has tiers + const modelWithTiers = baseInfo as typeof baseInfo & { + tiers?: Array<{ + contextWindow: number + inputPrice?: number + outputPrice?: number + cacheWritesPrice?: number + cacheReadsPrice?: number + }> + } + const tier = modelWithTiers.tiers?.[0] + if (tier) { + // Create a new ModelInfo object with updated values + const info: ModelInfo = { + ...baseInfo, + contextWindow: tier.contextWindow, + inputPrice: tier.inputPrice ?? baseInfo.inputPrice, + outputPrice: tier.outputPrice ?? baseInfo.outputPrice, + cacheWritesPrice: tier.cacheWritesPrice ?? baseInfo.cacheWritesPrice, + cacheReadsPrice: tier.cacheReadsPrice ?? baseInfo.cacheReadsPrice, + } + return { id, info } + } + } + + return { id, info: baseInfo } } } } diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 0212002329..02839a3372 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -259,6 +259,8 @@ "anthropicApiKey": "Clau API d'Anthropic", "getAnthropicApiKey": "Obtenir clau API d'Anthropic", "anthropicUseAuthToken": "Passar la clau API d'Anthropic com a capçalera d'autorització en lloc de X-Api-Key", + "anthropic1MContextBetaLabel": "Activa la finestra de context d'1M (Beta)", + "anthropic1MContextBetaDescription": "Amplia la finestra de context a 1 milió de tokens per a Claude Sonnet 4", "cerebrasApiKey": "Clau API de Cerebras", "getCerebrasApiKey": "Obtenir clau API de Cerebras", "chutesApiKey": "Clau API de Chutes", @@ -727,6 +729,7 @@ "noComputerUse": "No suporta ús de l'ordinador", "supportsPromptCache": "Suporta emmagatzematge en caché de prompts", "noPromptCache": "No suporta emmagatzematge en caché de prompts", + "contextWindow": "Finestra de context:", "maxOutput": "Sortida màxima", "inputPrice": "Preu d'entrada", "outputPrice": "Preu de sortida", diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index c0a7c75096..204d559dfc 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -261,6 +261,8 @@ "anthropicApiKey": "Anthropic API-Schlüssel", "getAnthropicApiKey": "Anthropic API-Schlüssel erhalten", "anthropicUseAuthToken": "Anthropic API-Schlüssel als Authorization-Header anstelle von X-Api-Key übergeben", + "anthropic1MContextBetaLabel": "1M Kontextfenster aktivieren (Beta)", + "anthropic1MContextBetaDescription": "Erweitert das Kontextfenster für Claude Sonnet 4 auf 1 Million Token", "cerebrasApiKey": "Cerebras API-Schlüssel", "getCerebrasApiKey": "Cerebras API-Schlüssel erhalten", "chutesApiKey": "Chutes API-Schlüssel", @@ -727,6 +729,7 @@ "noComputerUse": "Unterstützt keine Computernutzung", "supportsPromptCache": "Unterstützt Prompt-Cache", "noPromptCache": "Unterstützt keinen Prompt-Cache", + "contextWindow": "Kontextfenster:", "maxOutput": "Maximale Ausgabe", "inputPrice": "Eingabepreis", "outputPrice": "Ausgabepreis", diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 74e2e35239..b57a0d7166 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -258,6 +258,8 @@ "anthropicApiKey": "Anthropic API Key", "getAnthropicApiKey": "Get Anthropic API Key", "anthropicUseAuthToken": "Pass Anthropic API Key as Authorization header instead of X-Api-Key", + "anthropic1MContextBetaLabel": "Enable 1M context window (Beta)", + "anthropic1MContextBetaDescription": "Extends context window to 1 million tokens for Claude Sonnet 4", "cerebrasApiKey": "Cerebras API Key", "getCerebrasApiKey": "Get Cerebras API Key", "chutesApiKey": "Chutes API Key", @@ -726,6 +728,7 @@ "noComputerUse": "Does not support computer use", "supportsPromptCache": "Supports prompt caching", "noPromptCache": "Does not support prompt caching", + "contextWindow": "Context Window:", "maxOutput": "Max output", "inputPrice": "Input price", "outputPrice": "Output price", diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index 02f4956dfe..afcff6dfa5 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -259,6 +259,8 @@ "anthropicApiKey": "Clave API de Anthropic", "getAnthropicApiKey": "Obtener clave API de Anthropic", "anthropicUseAuthToken": "Pasar la clave API de Anthropic como encabezado de autorización en lugar de X-Api-Key", + "anthropic1MContextBetaLabel": "Habilitar ventana de contexto de 1M (Beta)", + "anthropic1MContextBetaDescription": "Amplía la ventana de contexto a 1 millón de tokens para Claude Sonnet 4", "cerebrasApiKey": "Clave API de Cerebras", "getCerebrasApiKey": "Obtener clave API de Cerebras", "chutesApiKey": "Clave API de Chutes", @@ -727,6 +729,7 @@ "noComputerUse": "No soporta uso del ordenador", "supportsPromptCache": "Soporta caché de prompts", "noPromptCache": "No soporta caché de prompts", + "contextWindow": "Ventana de contexto", "maxOutput": "Salida máxima", "inputPrice": "Precio de entrada", "outputPrice": "Precio de salida", diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index 790f5f0a5e..2772460344 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -259,6 +259,8 @@ "anthropicApiKey": "Clé API Anthropic", "getAnthropicApiKey": "Obtenir la clé API Anthropic", "anthropicUseAuthToken": "Passer la clé API Anthropic comme en-tête d'autorisation au lieu de X-Api-Key", + "anthropic1MContextBetaLabel": "Activer la fenêtre de contexte de 1M (Bêta)", + "anthropic1MContextBetaDescription": "Étend la fenêtre de contexte à 1 million de tokens pour Claude Sonnet 4", "cerebrasApiKey": "Clé API Cerebras", "getCerebrasApiKey": "Obtenir la clé API Cerebras", "chutesApiKey": "Clé API Chutes", @@ -727,6 +729,7 @@ "noComputerUse": "Ne prend pas en charge l'utilisation de l'ordinateur", "supportsPromptCache": "Prend en charge la mise en cache des prompts", "noPromptCache": "Ne prend pas en charge la mise en cache des prompts", + "contextWindow": "Fenêtre de contexte :", "maxOutput": "Sortie maximale", "inputPrice": "Prix d'entrée", "outputPrice": "Prix de sortie", diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 23ee616ac2..3c76392ffd 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -259,6 +259,8 @@ "anthropicApiKey": "Anthropic API कुंजी", "getAnthropicApiKey": "Anthropic API कुंजी प्राप्त करें", "anthropicUseAuthToken": "X-Api-Key के बजाय Anthropic API कुंजी को Authorization हेडर के रूप में पास करें", + "anthropic1MContextBetaLabel": "1M संदर्भ विंडो सक्षम करें (बीटा)", + "anthropic1MContextBetaDescription": "Claude Sonnet 4 के लिए संदर्भ विंडो को 1 मिलियन टोकन तक बढ़ाता है", "cerebrasApiKey": "Cerebras API कुंजी", "getCerebrasApiKey": "Cerebras API कुंजी प्राप्त करें", "chutesApiKey": "Chutes API कुंजी", @@ -728,6 +730,7 @@ "noComputerUse": "कंप्यूटर उपयोग का समर्थन नहीं करता है", "supportsPromptCache": "प्रॉम्प्ट कैशिंग का समर्थन करता है", "noPromptCache": "प्रॉम्प्ट कैशिंग का समर्थन नहीं करता है", + "contextWindow": "संदर्भ विंडो:", "maxOutput": "अधिकतम आउटपुट", "inputPrice": "इनपुट मूल्य", "outputPrice": "आउटपुट मूल्य", diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index d32c3d6605..cf3dc1d42f 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -263,6 +263,8 @@ "anthropicApiKey": "Anthropic API Key", "getAnthropicApiKey": "Dapatkan Anthropic API Key", "anthropicUseAuthToken": "Kirim Anthropic API Key sebagai Authorization header alih-alih X-Api-Key", + "anthropic1MContextBetaLabel": "Aktifkan jendela konteks 1M (Beta)", + "anthropic1MContextBetaDescription": "Memperluas jendela konteks menjadi 1 juta token untuk Claude Sonnet 4", "cerebrasApiKey": "Cerebras API Key", "getCerebrasApiKey": "Dapatkan Cerebras API Key", "chutesApiKey": "Chutes API Key", @@ -757,6 +759,7 @@ "noComputerUse": "Tidak mendukung computer use", "supportsPromptCache": "Mendukung prompt caching", "noPromptCache": "Tidak mendukung prompt caching", + "contextWindow": "Jendela Konteks:", "maxOutput": "Output maksimum", "inputPrice": "Harga input", "outputPrice": "Harga output", diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 2d8cb156a0..40a15c3e60 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -259,6 +259,8 @@ "anthropicApiKey": "Chiave API Anthropic", "getAnthropicApiKey": "Ottieni chiave API Anthropic", "anthropicUseAuthToken": "Passa la chiave API Anthropic come header di autorizzazione invece di X-Api-Key", + "anthropic1MContextBetaLabel": "Abilita finestra di contesto da 1M (Beta)", + "anthropic1MContextBetaDescription": "Estende la finestra di contesto a 1 milione di token per Claude Sonnet 4", "cerebrasApiKey": "Chiave API Cerebras", "getCerebrasApiKey": "Ottieni chiave API Cerebras", "chutesApiKey": "Chiave API Chutes", @@ -728,6 +730,7 @@ "noComputerUse": "Non supporta uso del computer", "supportsPromptCache": "Supporta cache dei prompt", "noPromptCache": "Non supporta cache dei prompt", + "contextWindow": "Finestra di contesto:", "maxOutput": "Output massimo", "inputPrice": "Prezzo input", "outputPrice": "Prezzo output", diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index b2dedba90c..7009c5d48b 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -259,6 +259,8 @@ "anthropicApiKey": "Anthropic APIキー", "getAnthropicApiKey": "Anthropic APIキーを取得", "anthropicUseAuthToken": "Anthropic APIキーをX-Api-Keyの代わりにAuthorizationヘッダーとして渡す", + "anthropic1MContextBetaLabel": "1Mコンテキストウィンドウを有効にする(ベータ版)", + "anthropic1MContextBetaDescription": "Claude Sonnet 4のコンテキストウィンドウを100万トークンに拡張します", "cerebrasApiKey": "Cerebras APIキー", "getCerebrasApiKey": "Cerebras APIキーを取得", "chutesApiKey": "Chutes APIキー", @@ -728,6 +730,7 @@ "noComputerUse": "コンピュータ使用をサポートしていません", "supportsPromptCache": "プロンプトキャッシュをサポート", "noPromptCache": "プロンプトキャッシュをサポートしていません", + "contextWindow": "コンテキストウィンドウ:", "maxOutput": "最大出力", "inputPrice": "入力価格", "outputPrice": "出力価格", diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index 623a92ccd0..fc27e6a0fe 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -259,6 +259,8 @@ "anthropicApiKey": "Anthropic API 키", "getAnthropicApiKey": "Anthropic API 키 받기", "anthropicUseAuthToken": "X-Api-Key 대신 Authorization 헤더로 Anthropic API 키 전달", + "anthropic1MContextBetaLabel": "1M 컨텍스트 창 활성화 (베타)", + "anthropic1MContextBetaDescription": "Claude Sonnet 4의 컨텍스트 창을 100만 토큰으로 확장", "cerebrasApiKey": "Cerebras API 키", "getCerebrasApiKey": "Cerebras API 키 가져오기", "chutesApiKey": "Chutes API 키", @@ -728,6 +730,7 @@ "noComputerUse": "컴퓨터 사용 지원 안 함", "supportsPromptCache": "프롬프트 캐시 지원", "noPromptCache": "프롬프트 캐시 지원 안 함", + "contextWindow": "컨텍스트 창:", "maxOutput": "최대 출력", "inputPrice": "입력 가격", "outputPrice": "출력 가격", diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index c180fef89f..2dc201851f 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -259,6 +259,8 @@ "anthropicApiKey": "Anthropic API-sleutel", "getAnthropicApiKey": "Anthropic API-sleutel ophalen", "anthropicUseAuthToken": "Anthropic API-sleutel als Authorization-header doorgeven in plaats van X-Api-Key", + "anthropic1MContextBetaLabel": "1M contextvenster inschakelen (bèta)", + "anthropic1MContextBetaDescription": "Breidt het contextvenster uit tot 1 miljoen tokens voor Claude Sonnet 4", "cerebrasApiKey": "Cerebras API-sleutel", "getCerebrasApiKey": "Cerebras API-sleutel verkrijgen", "chutesApiKey": "Chutes API-sleutel", @@ -728,6 +730,7 @@ "noComputerUse": "Ondersteunt geen computergebruik", "supportsPromptCache": "Ondersteunt prompt caching", "noPromptCache": "Ondersteunt geen prompt caching", + "contextWindow": "Contextvenster:", "maxOutput": "Maximale output", "inputPrice": "Invoerprijs", "outputPrice": "Uitvoerprijs", diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 83a46189f9..80324260a3 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -259,6 +259,8 @@ "anthropicApiKey": "Klucz API Anthropic", "getAnthropicApiKey": "Uzyskaj klucz API Anthropic", "anthropicUseAuthToken": "Przekaż klucz API Anthropic jako nagłówek Authorization zamiast X-Api-Key", + "anthropic1MContextBetaLabel": "Włącz okno kontekstowe 1M (Beta)", + "anthropic1MContextBetaDescription": "Rozszerza okno kontekstowe do 1 miliona tokenów dla Claude Sonnet 4", "cerebrasApiKey": "Klucz API Cerebras", "getCerebrasApiKey": "Pobierz klucz API Cerebras", "chutesApiKey": "Klucz API Chutes", @@ -728,6 +730,7 @@ "noComputerUse": "Nie obsługuje użycia komputera", "supportsPromptCache": "Obsługuje buforowanie podpowiedzi", "noPromptCache": "Nie obsługuje buforowania podpowiedzi", + "contextWindow": "Okno kontekstowe:", "maxOutput": "Maksymalne wyjście", "inputPrice": "Cena wejścia", "outputPrice": "Cena wyjścia", diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index a6bd7fb861..76146be742 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -259,6 +259,8 @@ "anthropicApiKey": "Chave de API Anthropic", "getAnthropicApiKey": "Obter chave de API Anthropic", "anthropicUseAuthToken": "Passar a chave de API Anthropic como cabeçalho Authorization em vez de X-Api-Key", + "anthropic1MContextBetaLabel": "Ativar janela de contexto de 1M (Beta)", + "anthropic1MContextBetaDescription": "Estende a janela de contexto para 1 milhão de tokens para o Claude Sonnet 4", "cerebrasApiKey": "Chave de API Cerebras", "getCerebrasApiKey": "Obter chave de API Cerebras", "chutesApiKey": "Chave de API Chutes", @@ -728,6 +730,7 @@ "noComputerUse": "Não suporta uso do computador", "supportsPromptCache": "Suporta cache de prompts", "noPromptCache": "Não suporta cache de prompts", + "contextWindow": "Janela de Contexto:", "maxOutput": "Saída máxima", "inputPrice": "Preço de entrada", "outputPrice": "Preço de saída", diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index 2cd5470173..26b4f56b54 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -259,6 +259,8 @@ "anthropicApiKey": "Anthropic API-ключ", "getAnthropicApiKey": "Получить Anthropic API-ключ", "anthropicUseAuthToken": "Передавать Anthropic API-ключ как Authorization-заголовок вместо X-Api-Key", + "anthropic1MContextBetaLabel": "Включить контекстное окно 1M (бета)", + "anthropic1MContextBetaDescription": "Расширяет контекстное окно до 1 миллиона токенов для Claude Sonnet 4", "cerebrasApiKey": "Cerebras API-ключ", "getCerebrasApiKey": "Получить Cerebras API-ключ", "chutesApiKey": "Chutes API-ключ", @@ -728,6 +730,7 @@ "noComputerUse": "Не поддерживает использование компьютера", "supportsPromptCache": "Поддерживает кэширование подсказок", "noPromptCache": "Не поддерживает кэширование подсказок", + "contextWindow": "Контекстное окно:", "maxOutput": "Максимум вывода", "inputPrice": "Цена за вход", "outputPrice": "Цена за вывод", diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index 96a5b743a6..561695e9cc 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -259,6 +259,8 @@ "anthropicApiKey": "Anthropic API Anahtarı", "getAnthropicApiKey": "Anthropic API Anahtarı Al", "anthropicUseAuthToken": "Anthropic API Anahtarını X-Api-Key yerine Authorization başlığı olarak geçir", + "anthropic1MContextBetaLabel": "1M bağlam penceresini etkinleştir (Beta)", + "anthropic1MContextBetaDescription": "Claude Sonnet 4 için bağlam penceresini 1 milyon token'a genişletir", "cerebrasApiKey": "Cerebras API Anahtarı", "getCerebrasApiKey": "Cerebras API Anahtarını Al", "chutesApiKey": "Chutes API Anahtarı", @@ -728,6 +730,7 @@ "noComputerUse": "Bilgisayar kullanımını desteklemez", "supportsPromptCache": "İstem önbelleğini destekler", "noPromptCache": "İstem önbelleğini desteklemez", + "contextWindow": "Bağlam Penceresi:", "maxOutput": "Maksimum çıktı", "inputPrice": "Giriş fiyatı", "outputPrice": "Çıkış fiyatı", diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index 1b7df514a9..1709022211 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -259,6 +259,8 @@ "anthropicApiKey": "Khóa API Anthropic", "getAnthropicApiKey": "Lấy khóa API Anthropic", "anthropicUseAuthToken": "Truyền khóa API Anthropic dưới dạng tiêu đề Authorization thay vì X-Api-Key", + "anthropic1MContextBetaLabel": "Bật cửa sổ ngữ cảnh 1M (Beta)", + "anthropic1MContextBetaDescription": "Mở rộng cửa sổ ngữ cảnh lên 1 triệu token cho Claude Sonnet 4", "cerebrasApiKey": "Khóa API Cerebras", "getCerebrasApiKey": "Lấy khóa API Cerebras", "chutesApiKey": "Khóa API Chutes", @@ -728,6 +730,7 @@ "noComputerUse": "Không hỗ trợ sử dụng máy tính", "supportsPromptCache": "Hỗ trợ bộ nhớ đệm lời nhắc", "noPromptCache": "Không hỗ trợ bộ nhớ đệm lời nhắc", + "contextWindow": "Cửa sổ ngữ cảnh:", "maxOutput": "Đầu ra tối đa", "inputPrice": "Giá đầu vào", "outputPrice": "Giá đầu ra", diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index 3ebcfb850c..5d0afff83c 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -259,6 +259,8 @@ "anthropicApiKey": "Anthropic API 密钥", "getAnthropicApiKey": "获取 Anthropic API 密钥", "anthropicUseAuthToken": "将 Anthropic API 密钥作为 Authorization 标头传递,而不是 X-Api-Key", + "anthropic1MContextBetaLabel": "启用 1M 上下文窗口 (Beta)", + "anthropic1MContextBetaDescription": "为 Claude Sonnet 4 将上下文窗口扩展至 100 万个 token", "cerebrasApiKey": "Cerebras API 密钥", "getCerebrasApiKey": "获取 Cerebras API 密钥", "chutesApiKey": "Chutes API 密钥", @@ -728,6 +730,7 @@ "noComputerUse": "不支持计算机功能调用", "supportsPromptCache": "支持提示缓存", "noPromptCache": "不支持提示缓存", + "contextWindow": "上下文窗口:", "maxOutput": "最大输出", "inputPrice": "输入价格", "outputPrice": "输出价格", diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index f188a96d51..2b7ae60fa5 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -259,6 +259,8 @@ "anthropicApiKey": "Anthropic API 金鑰", "getAnthropicApiKey": "取得 Anthropic API 金鑰", "anthropicUseAuthToken": "將 Anthropic API 金鑰作為 Authorization 標頭傳遞,而非使用 X-Api-Key", + "anthropic1MContextBetaLabel": "啟用 1M 上下文視窗 (Beta)", + "anthropic1MContextBetaDescription": "為 Claude Sonnet 4 將上下文視窗擴展至 100 萬個 token", "cerebrasApiKey": "Cerebras API 金鑰", "getCerebrasApiKey": "取得 Cerebras API 金鑰", "chutesApiKey": "Chutes API 金鑰", @@ -728,6 +730,7 @@ "noComputerUse": "不支援電腦使用", "supportsPromptCache": "支援提示快取", "noPromptCache": "不支援提示快取", + "contextWindow": "上下文視窗:", "maxOutput": "最大輸出", "inputPrice": "輸入價格", "outputPrice": "輸出價格", From f6f5fa3edeb42eb2251f1d0da2d95290b898cd54 Mon Sep 17 00:00:00 2001 From: "roomote[bot]" <219738659+roomote[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 15:50:06 -0400 Subject: [PATCH 03/36] feat: add OpenAI gpt-oss models to Amazon Bedrock dropdown (#6783) Co-authored-by: Roo Code --- packages/types/src/providers/bedrock.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages/types/src/providers/bedrock.ts b/packages/types/src/providers/bedrock.ts index 3d3aa8b984..d7319c132e 100644 --- a/packages/types/src/providers/bedrock.ts +++ b/packages/types/src/providers/bedrock.ts @@ -221,6 +221,26 @@ export const bedrockModels = { inputPrice: 1.35, outputPrice: 5.4, }, + "openai.gpt-oss-20b-1:0": { + maxTokens: 8192, + contextWindow: 128_000, + supportsImages: false, + supportsComputerUse: false, + supportsPromptCache: false, + inputPrice: 0.5, + outputPrice: 1.5, + description: "GPT-OSS 20B - Optimized for low latency and local/specialized use cases", + }, + "openai.gpt-oss-120b-1:0": { + maxTokens: 8192, + contextWindow: 128_000, + supportsImages: false, + supportsComputerUse: false, + supportsPromptCache: false, + inputPrice: 2.0, + outputPrice: 6.0, + description: "GPT-OSS 120B - Production-ready, general-purpose, high-reasoning model", + }, "meta.llama3-3-70b-instruct-v1:0": { maxTokens: 8192, contextWindow: 128_000, From 2083d1158642a815739d7b4e4d6705ed433e1b3a Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Tue, 12 Aug 2025 16:11:51 -0400 Subject: [PATCH 04/36] chore: add changeset for v3.25.12 (#7018) --- .changeset/v3.25.12.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .changeset/v3.25.12.md diff --git a/.changeset/v3.25.12.md b/.changeset/v3.25.12.md new file mode 100644 index 0000000000..ebc84f4c24 --- /dev/null +++ b/.changeset/v3.25.12.md @@ -0,0 +1,18 @@ +--- +"roo-cline": patch +--- + +- Update: Claude Sonnet 4 context window configurable to 1 million tokens in Anthropic provider (thanks @daniel-lxs!) +- Add: Minimal reasoning support to OpenRouter (thanks @daniel-lxs!) +- Fix: Add configurable API request timeout for local providers (#6521 by @dabockster, PR by @app/roomote) +- Fix: Add --no-sandbox flag to browser launch options (#6632 by @QuinsZouls, PR by @QuinsZouls) +- Fix: Ensure JSON files respect .rooignore during indexing (#6690 by @evermoving, PR by @app/roomote) +- Add: New Chutes provider models (#6698 by @fstandhartinger, PR by @app/roomote) +- Add: OpenAI gpt-oss models to Amazon Bedrock dropdown (#6752 by @josh-clanton-powerschool, PR by @app/roomote) +- Fix: Correct tool repetition detector to not block first tool call when limit is 1 (#6834 by @NaccOll, PR by @app/roomote) +- Fix: Improve checkpoint service initialization handling (thanks @NaccOll!) +- Update: Improve zh-TW Traditional Chinese locale (thanks @PeterDaveHello!) +- Add: Task expand and collapse translations (thanks @app/roomote!) +- Update: Exclude GPT-5 models from 20% context window output token cap (thanks @app/roomote!) +- Fix: Truncate long model names in model selector to prevent overflow (thanks @app/roomote!) +- Add: Requesty base url support (thanks @requesty-JohnCosta27!) From 245bc2a2e6332eb6cff06856fbaa1cb9e8063fb4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 16:15:51 -0400 Subject: [PATCH 05/36] Changeset version bump (#7019) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens --- .changeset/v3.25.12.md | 18 ------------------ CHANGELOG.md | 17 +++++++++++++++++ src/package.json | 2 +- 3 files changed, 18 insertions(+), 19 deletions(-) delete mode 100644 .changeset/v3.25.12.md diff --git a/.changeset/v3.25.12.md b/.changeset/v3.25.12.md deleted file mode 100644 index ebc84f4c24..0000000000 --- a/.changeset/v3.25.12.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -"roo-cline": patch ---- - -- Update: Claude Sonnet 4 context window configurable to 1 million tokens in Anthropic provider (thanks @daniel-lxs!) -- Add: Minimal reasoning support to OpenRouter (thanks @daniel-lxs!) -- Fix: Add configurable API request timeout for local providers (#6521 by @dabockster, PR by @app/roomote) -- Fix: Add --no-sandbox flag to browser launch options (#6632 by @QuinsZouls, PR by @QuinsZouls) -- Fix: Ensure JSON files respect .rooignore during indexing (#6690 by @evermoving, PR by @app/roomote) -- Add: New Chutes provider models (#6698 by @fstandhartinger, PR by @app/roomote) -- Add: OpenAI gpt-oss models to Amazon Bedrock dropdown (#6752 by @josh-clanton-powerschool, PR by @app/roomote) -- Fix: Correct tool repetition detector to not block first tool call when limit is 1 (#6834 by @NaccOll, PR by @app/roomote) -- Fix: Improve checkpoint service initialization handling (thanks @NaccOll!) -- Update: Improve zh-TW Traditional Chinese locale (thanks @PeterDaveHello!) -- Add: Task expand and collapse translations (thanks @app/roomote!) -- Update: Exclude GPT-5 models from 20% context window output token cap (thanks @app/roomote!) -- Fix: Truncate long model names in model selector to prevent overflow (thanks @app/roomote!) -- Add: Requesty base url support (thanks @requesty-JohnCosta27!) diff --git a/CHANGELOG.md b/CHANGELOG.md index abf82c348c..c80facf593 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Roo Code Changelog +## [3.25.12] - 2025-08-12 + +- Update: Claude Sonnet 4 context window configurable to 1 million tokens in Anthropic provider (thanks @daniel-lxs!) +- Add: Minimal reasoning support to OpenRouter (thanks @daniel-lxs!) +- Fix: Add configurable API request timeout for local providers (#6521 by @dabockster, PR by @app/roomote) +- Fix: Add --no-sandbox flag to browser launch options (#6632 by @QuinsZouls, PR by @QuinsZouls) +- Fix: Ensure JSON files respect .rooignore during indexing (#6690 by @evermoving, PR by @app/roomote) +- Add: New Chutes provider models (#6698 by @fstandhartinger, PR by @app/roomote) +- Add: OpenAI gpt-oss models to Amazon Bedrock dropdown (#6752 by @josh-clanton-powerschool, PR by @app/roomote) +- Fix: Correct tool repetition detector to not block first tool call when limit is 1 (#6834 by @NaccOll, PR by @app/roomote) +- Fix: Improve checkpoint service initialization handling (thanks @NaccOll!) +- Update: Improve zh-TW Traditional Chinese locale (thanks @PeterDaveHello!) +- Add: Task expand and collapse translations (thanks @app/roomote!) +- Update: Exclude GPT-5 models from 20% context window output token cap (thanks @app/roomote!) +- Fix: Truncate long model names in model selector to prevent overflow (thanks @app/roomote!) +- Add: Requesty base url support (thanks @requesty-JohnCosta27!) + ## [3.25.11] - 2025-08-11 - Add: Native OpenAI provider support for Codex Mini model (#5386 by @KJ7LNW, PR by @daniel-lxs) diff --git a/src/package.json b/src/package.json index 94b711fc5b..c4ea801c75 100644 --- a/src/package.json +++ b/src/package.json @@ -3,7 +3,7 @@ "displayName": "%extension.displayName%", "description": "%extension.description%", "publisher": "RooVeterinaryInc", - "version": "3.25.11", + "version": "3.25.12", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", From 7b0f489ea2da5a02d7a22e516f974b370a9660da Mon Sep 17 00:00:00 2001 From: "roomote[bot]" <219738659+roomote[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 17:51:06 -0400 Subject: [PATCH 06/36] fix: add --no-messages flag to ripgrep to suppress file access errors (#6757) Fixes #6756 When ripgrep encounters file access errors (e.g., permission denied), it would cause the search_files tool to return empty results. Adding the --no-messages flag suppresses these error messages while still showing pattern syntax errors, allowing the search to continue and return valid results from accessible files. Co-authored-by: Roo Code --- src/services/ripgrep/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/ripgrep/index.ts b/src/services/ripgrep/index.ts index c694221966..d384b27c91 100644 --- a/src/services/ripgrep/index.ts +++ b/src/services/ripgrep/index.ts @@ -150,7 +150,7 @@ export async function regexSearchFiles( throw new Error("Could not find ripgrep binary") } - const args = ["--json", "-e", regex, "--glob", filePattern || "*", "--context", "1", directoryPath] + const args = ["--json", "-e", regex, "--glob", filePattern || "*", "--context", "1", "--no-messages", directoryPath] let output: string try { From 8bd8f5dc598fc5ba9a263aed64c842e0b9812579 Mon Sep 17 00:00:00 2001 From: "roomote[bot]" <219738659+roomote[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 21:20:59 -0400 Subject: [PATCH 07/36] feat: add support for AGENT.md alongside AGENTS.md (#6913) Co-authored-by: Roo Code --- .../__tests__/custom-instructions.spec.ts | 80 +++++++++++++++++++ .../prompts/sections/custom-instructions.ts | 54 +++++++------ src/core/protect/RooProtectedController.ts | 1 + .../__tests__/RooProtectedController.spec.ts | 5 ++ 4 files changed, 116 insertions(+), 24 deletions(-) diff --git a/src/core/prompts/sections/__tests__/custom-instructions.spec.ts b/src/core/prompts/sections/__tests__/custom-instructions.spec.ts index d015748315..be9c25bcaa 100644 --- a/src/core/prompts/sections/__tests__/custom-instructions.spec.ts +++ b/src/core/prompts/sections/__tests__/custom-instructions.spec.ts @@ -775,6 +775,86 @@ describe("addCustomInstructions", () => { expect(readFileMock).toHaveBeenCalledWith(expect.stringContaining("AGENTS.md"), "utf-8") }) + it("should load AGENT.md (singular) when AGENTS.md is not found", async () => { + // Simulate no .roo/rules-test-mode directory + statMock.mockRejectedValueOnce({ code: "ENOENT" }) + + // Mock lstat to indicate AGENTS.md doesn't exist but AGENT.md does + lstatMock.mockImplementation((filePath: PathLike) => { + const pathStr = filePath.toString() + if (pathStr.endsWith("AGENTS.md")) { + return Promise.reject({ code: "ENOENT" }) + } + if (pathStr.endsWith("AGENT.md")) { + return Promise.resolve({ + isSymbolicLink: vi.fn().mockReturnValue(false), + }) + } + return Promise.reject({ code: "ENOENT" }) + }) + + readFileMock.mockImplementation((filePath: PathLike) => { + const pathStr = filePath.toString() + if (pathStr.endsWith("AGENT.md")) { + return Promise.resolve("Agent rules from AGENT.md file (singular)") + } + return Promise.reject({ code: "ENOENT" }) + }) + + const result = await addCustomInstructions( + "mode instructions", + "global instructions", + "/fake/path", + "test-mode", + { settings: { maxConcurrentFileReads: 5, todoListEnabled: true, useAgentRules: true } }, + ) + + expect(result).toContain("# Agent Rules Standard (AGENT.md):") + expect(result).toContain("Agent rules from AGENT.md file (singular)") + expect(readFileMock).toHaveBeenCalledWith(expect.stringContaining("AGENT.md"), "utf-8") + }) + + it("should prefer AGENTS.md over AGENT.md when both exist", async () => { + // Simulate no .roo/rules-test-mode directory + statMock.mockRejectedValueOnce({ code: "ENOENT" }) + + // Mock lstat to indicate both files exist + lstatMock.mockImplementation((filePath: PathLike) => { + const pathStr = filePath.toString() + if (pathStr.endsWith("AGENTS.md") || pathStr.endsWith("AGENT.md")) { + return Promise.resolve({ + isSymbolicLink: vi.fn().mockReturnValue(false), + }) + } + return Promise.reject({ code: "ENOENT" }) + }) + + readFileMock.mockImplementation((filePath: PathLike) => { + const pathStr = filePath.toString() + if (pathStr.endsWith("AGENTS.md")) { + return Promise.resolve("Agent rules from AGENTS.md file (plural)") + } + if (pathStr.endsWith("AGENT.md")) { + return Promise.resolve("Agent rules from AGENT.md file (singular)") + } + return Promise.reject({ code: "ENOENT" }) + }) + + const result = await addCustomInstructions( + "mode instructions", + "global instructions", + "/fake/path", + "test-mode", + { settings: { maxConcurrentFileReads: 5, todoListEnabled: true, useAgentRules: true } }, + ) + + // Should contain AGENTS.md content (preferred) and not AGENT.md + expect(result).toContain("# Agent Rules Standard (AGENTS.md):") + expect(result).toContain("Agent rules from AGENTS.md file (plural)") + expect(result).not.toContain("Agent rules from AGENT.md file (singular)") + expect(readFileMock).toHaveBeenCalledWith(expect.stringContaining("AGENTS.md"), "utf-8") + }) + it("should return empty string when no instructions provided", async () => { // Simulate no .roo/rules directory statMock.mockRejectedValueOnce({ code: "ENOENT" }) diff --git a/src/core/prompts/sections/custom-instructions.ts b/src/core/prompts/sections/custom-instructions.ts index 22fb6122ec..2d70e45419 100644 --- a/src/core/prompts/sections/custom-instructions.ts +++ b/src/core/prompts/sections/custom-instructions.ts @@ -217,40 +217,46 @@ export async function loadRuleFiles(cwd: string): Promise { } /** - * Load AGENTS.md file from the project root if it exists + * Load AGENTS.md or AGENT.md file from the project root if it exists + * Checks for both AGENTS.md (standard) and AGENT.md (alternative) for compatibility */ async function loadAgentRulesFile(cwd: string): Promise { - try { - const agentsPath = path.join(cwd, "AGENTS.md") - let resolvedPath = agentsPath + // Try both filenames - AGENTS.md (standard) first, then AGENT.md (alternative) + const filenames = ["AGENTS.md", "AGENT.md"] - // Check if AGENTS.md exists and handle symlinks + for (const filename of filenames) { try { - const stats = await fs.lstat(agentsPath) - if (stats.isSymbolicLink()) { - // Create a temporary fileInfo array to use with resolveSymLink - const fileInfo: Array<{ originalPath: string; resolvedPath: string }> = [] + const agentPath = path.join(cwd, filename) + let resolvedPath = agentPath - // Use the existing resolveSymLink function to handle symlink resolution - await resolveSymLink(agentsPath, fileInfo, 0) + // Check if file exists and handle symlinks + try { + const stats = await fs.lstat(agentPath) + if (stats.isSymbolicLink()) { + // Create a temporary fileInfo array to use with resolveSymLink + const fileInfo: Array<{ originalPath: string; resolvedPath: string }> = [] - // Extract the resolved path from fileInfo - if (fileInfo.length > 0) { - resolvedPath = fileInfo[0].resolvedPath + // Use the existing resolveSymLink function to handle symlink resolution + await resolveSymLink(agentPath, fileInfo, 0) + + // Extract the resolved path from fileInfo + if (fileInfo.length > 0) { + resolvedPath = fileInfo[0].resolvedPath + } } + } catch (err) { + // If lstat fails (file doesn't exist), try next filename + continue + } + + // Read the content from the resolved path + const content = await safeReadFile(resolvedPath) + if (content) { + return `# Agent Rules Standard (${filename}):\n${content}` } } catch (err) { - // If lstat fails (file doesn't exist), return empty - return "" + // Silently ignore errors - agent rules files are optional } - - // Read the content from the resolved path - const content = await safeReadFile(resolvedPath) - if (content) { - return `# Agent Rules Standard (AGENTS.md):\n${content}` - } - } catch (err) { - // Silently ignore errors - AGENTS.md is optional } return "" } diff --git a/src/core/protect/RooProtectedController.ts b/src/core/protect/RooProtectedController.ts index e6d57b22b5..f4d80c4d64 100644 --- a/src/core/protect/RooProtectedController.ts +++ b/src/core/protect/RooProtectedController.ts @@ -21,6 +21,7 @@ export class RooProtectedController { ".vscode/**", ".rooprotected", // For future use "AGENTS.md", + "AGENT.md", // Alternative singular form for compatibility ] constructor(cwd: string) { diff --git a/src/core/protect/__tests__/RooProtectedController.spec.ts b/src/core/protect/__tests__/RooProtectedController.spec.ts index 0ee6135e81..f19cf17548 100644 --- a/src/core/protect/__tests__/RooProtectedController.spec.ts +++ b/src/core/protect/__tests__/RooProtectedController.spec.ts @@ -48,6 +48,10 @@ describe("RooProtectedController", () => { expect(controller.isWriteProtected("AGENTS.md")).toBe(true) }) + it("should protect AGENT.md file", () => { + expect(controller.isWriteProtected("AGENT.md")).toBe(true) + }) + it("should not protect other files starting with .roo", () => { expect(controller.isWriteProtected(".roosettings")).toBe(false) expect(controller.isWriteProtected(".rooconfig")).toBe(false) @@ -147,6 +151,7 @@ describe("RooProtectedController", () => { ".vscode/**", ".rooprotected", "AGENTS.md", + "AGENT.md", ]) }) }) From 4c018663de93595af30913c9847a935bed6c0336 Mon Sep 17 00:00:00 2001 From: Peter Dave Hello Date: Wed, 13 Aug 2025 10:45:00 +0800 Subject: [PATCH 08/36] Remove deprecated GPT-4.5 Preview model (#6948) --- packages/types/src/providers/openai.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/packages/types/src/providers/openai.ts b/packages/types/src/providers/openai.ts index 78d3cb6334..ff79824984 100644 --- a/packages/types/src/providers/openai.ts +++ b/packages/types/src/providers/openai.ts @@ -193,15 +193,6 @@ export const openAiNativeModels = { outputPrice: 4.4, cacheReadsPrice: 0.55, }, - "gpt-4.5-preview": { - maxTokens: 16_384, - contextWindow: 128_000, - supportsImages: true, - supportsPromptCache: true, - inputPrice: 75, - outputPrice: 150, - cacheReadsPrice: 37.5, - }, "gpt-4o": { maxTokens: 16_384, contextWindow: 128_000, From 13d1a5bc8f06aabd36db732c0c234b13471bb489 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Tue, 12 Aug 2025 22:51:30 -0400 Subject: [PATCH 09/36] Add Sonnet 1M context checkbox (#7032) --- packages/types/src/provider-settings.ts | 4 + src/api/providers/__tests__/bedrock.spec.ts | 181 ++++++++++++++++++ src/api/providers/bedrock.ts | 20 ++ .../components/settings/providers/Bedrock.tsx | 24 ++- .../hooks/__tests__/useSelectedModel.spec.ts | 67 ++++++- .../components/ui/hooks/useSelectedModel.ts | 15 +- 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/id/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/nl/settings.json | 2 + webview-ui/src/i18n/locales/pl/settings.json | 2 + .../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 + .../src/i18n/locales/zh-CN/settings.json | 2 + .../src/i18n/locales/zh-TW/settings.json | 2 + 24 files changed, 343 insertions(+), 4 deletions(-) diff --git a/packages/types/src/provider-settings.ts b/packages/types/src/provider-settings.ts index 3c3757188f..fef7d811a4 100644 --- a/packages/types/src/provider-settings.ts +++ b/packages/types/src/provider-settings.ts @@ -3,6 +3,9 @@ import { z } from "zod" import { reasoningEffortsSchema, verbosityLevelsSchema, modelInfoSchema } from "./model.js" import { codebaseIndexProviderSchema } from "./codebase-index.js" +// Bedrock Claude Sonnet 4 model ID that supports 1M context +export const BEDROCK_CLAUDE_SONNET_4_MODEL_ID = "anthropic.claude-sonnet-4-20250514-v1:0" + // Extended schema that includes "minimal" for GPT-5 models export const extendedReasoningEffortsSchema = z.union([reasoningEffortsSchema, z.literal("minimal")]) @@ -135,6 +138,7 @@ const bedrockSchema = apiModelIdProviderModelSchema.extend({ awsModelContextWindow: z.number().optional(), awsBedrockEndpointEnabled: z.boolean().optional(), awsBedrockEndpoint: z.string().optional(), + awsBedrock1MContext: z.boolean().optional(), // Enable 'context-1m-2025-08-07' beta for 1M context window }) const vertexSchema = apiModelIdProviderModelSchema.extend({ diff --git a/src/api/providers/__tests__/bedrock.spec.ts b/src/api/providers/__tests__/bedrock.spec.ts index ad0ae2bdb5..40daa2fffa 100644 --- a/src/api/providers/__tests__/bedrock.spec.ts +++ b/src/api/providers/__tests__/bedrock.spec.ts @@ -25,6 +25,7 @@ vi.mock("@aws-sdk/client-bedrock-runtime", () => { import { AwsBedrockHandler } from "../bedrock" import { ConverseStreamCommand, BedrockRuntimeClient } from "@aws-sdk/client-bedrock-runtime" +import { BEDROCK_CLAUDE_SONNET_4_MODEL_ID } from "@roo-code/types" import type { Anthropic } from "@anthropic-ai/sdk" @@ -564,4 +565,184 @@ describe("AwsBedrockHandler", () => { expect(typeof model.info.supportsPromptCache).toBe("boolean") }) }) + + describe("1M context beta feature", () => { + it("should enable 1M context window when awsBedrock1MContext is true for Claude Sonnet 4", () => { + const handler = new AwsBedrockHandler({ + apiModelId: BEDROCK_CLAUDE_SONNET_4_MODEL_ID, + awsAccessKey: "test", + awsSecretKey: "test", + awsRegion: "us-east-1", + awsBedrock1MContext: true, + }) + + const model = handler.getModel() + + // Should have 1M context window when enabled + expect(model.info.contextWindow).toBe(1_000_000) + }) + + it("should use default context window when awsBedrock1MContext is false for Claude Sonnet 4", () => { + const handler = new AwsBedrockHandler({ + apiModelId: BEDROCK_CLAUDE_SONNET_4_MODEL_ID, + awsAccessKey: "test", + awsSecretKey: "test", + awsRegion: "us-east-1", + awsBedrock1MContext: false, + }) + + const model = handler.getModel() + + // Should use default context window (200k) + expect(model.info.contextWindow).toBe(200_000) + }) + + it("should not affect context window for non-Claude Sonnet 4 models", () => { + const handler = new AwsBedrockHandler({ + apiModelId: "anthropic.claude-3-5-sonnet-20241022-v2:0", + awsAccessKey: "test", + awsSecretKey: "test", + awsRegion: "us-east-1", + awsBedrock1MContext: true, + }) + + const model = handler.getModel() + + // Should use default context window for non-Sonnet 4 models + expect(model.info.contextWindow).toBe(200_000) + }) + + it("should include anthropic_beta parameter when 1M context is enabled", async () => { + const handler = new AwsBedrockHandler({ + apiModelId: BEDROCK_CLAUDE_SONNET_4_MODEL_ID, + awsAccessKey: "test", + awsSecretKey: "test", + awsRegion: "us-east-1", + awsBedrock1MContext: true, + }) + + const messages: Anthropic.Messages.MessageParam[] = [ + { + role: "user", + content: "Test message", + }, + ] + + const generator = handler.createMessage("", messages) + await generator.next() // Start the generator + + // Verify the command was created with the right payload + expect(mockConverseStreamCommand).toHaveBeenCalled() + const commandArg = mockConverseStreamCommand.mock.calls[0][0] as any + + // Should include anthropic_beta parameter but NOT anthropic_version (only for thinking) + expect(commandArg.anthropic_beta).toEqual(["context-1m-2025-08-07"]) + expect(commandArg.anthropic_version).toBeUndefined() + }) + + it("should not include anthropic_beta parameter when 1M context is disabled", async () => { + const handler = new AwsBedrockHandler({ + apiModelId: BEDROCK_CLAUDE_SONNET_4_MODEL_ID, + awsAccessKey: "test", + awsSecretKey: "test", + awsRegion: "us-east-1", + awsBedrock1MContext: false, + }) + + const messages: Anthropic.Messages.MessageParam[] = [ + { + role: "user", + content: "Test message", + }, + ] + + const generator = handler.createMessage("", messages) + await generator.next() // Start the generator + + // Verify the command was created with the right payload + expect(mockConverseStreamCommand).toHaveBeenCalled() + const commandArg = mockConverseStreamCommand.mock.calls[0][0] as any + + // Should not include anthropic_beta parameter + expect(commandArg.anthropic_beta).toBeUndefined() + }) + + it("should not include anthropic_beta parameter for non-Claude Sonnet 4 models", async () => { + const handler = new AwsBedrockHandler({ + apiModelId: "anthropic.claude-3-5-sonnet-20241022-v2:0", + awsAccessKey: "test", + awsSecretKey: "test", + awsRegion: "us-east-1", + awsBedrock1MContext: true, + }) + + const messages: Anthropic.Messages.MessageParam[] = [ + { + role: "user", + content: "Test message", + }, + ] + + const generator = handler.createMessage("", messages) + await generator.next() // Start the generator + + // Verify the command was created with the right payload + expect(mockConverseStreamCommand).toHaveBeenCalled() + const commandArg = mockConverseStreamCommand.mock.calls[0][0] as any + + // Should not include anthropic_beta parameter for non-Sonnet 4 models + expect(commandArg.anthropic_beta).toBeUndefined() + }) + + it("should enable 1M context window with cross-region inference for Claude Sonnet 4", () => { + const handler = new AwsBedrockHandler({ + apiModelId: BEDROCK_CLAUDE_SONNET_4_MODEL_ID, + awsAccessKey: "test", + awsSecretKey: "test", + awsRegion: "us-east-1", + awsUseCrossRegionInference: true, + awsBedrock1MContext: true, + }) + + const model = handler.getModel() + + // Should have 1M context window even with cross-region prefix + expect(model.info.contextWindow).toBe(1_000_000) + // Model ID should have cross-region prefix + expect(model.id).toBe(`us.${BEDROCK_CLAUDE_SONNET_4_MODEL_ID}`) + }) + + it("should include anthropic_beta parameter with cross-region inference for Claude Sonnet 4", async () => { + const handler = new AwsBedrockHandler({ + apiModelId: BEDROCK_CLAUDE_SONNET_4_MODEL_ID, + awsAccessKey: "test", + awsSecretKey: "test", + awsRegion: "us-east-1", + awsUseCrossRegionInference: true, + awsBedrock1MContext: true, + }) + + const messages: Anthropic.Messages.MessageParam[] = [ + { + role: "user", + content: "Test message", + }, + ] + + const generator = handler.createMessage("", messages) + await generator.next() // Start the generator + + // Verify the command was created with the right payload + expect(mockConverseStreamCommand).toHaveBeenCalled() + const commandArg = mockConverseStreamCommand.mock.calls[ + mockConverseStreamCommand.mock.calls.length - 1 + ][0] as any + + // Should include anthropic_beta parameter but NOT anthropic_version (only for thinking) + expect(commandArg.anthropic_beta).toEqual(["context-1m-2025-08-07"]) + expect(commandArg.anthropic_version).toBeUndefined() + // Model ID should have cross-region prefix + expect(commandArg.modelId).toBe(`us.${BEDROCK_CLAUDE_SONNET_4_MODEL_ID}`) + }) + }) }) diff --git a/src/api/providers/bedrock.ts b/src/api/providers/bedrock.ts index 706b801d0c..5471f2a01f 100644 --- a/src/api/providers/bedrock.ts +++ b/src/api/providers/bedrock.ts @@ -21,6 +21,7 @@ import { BEDROCK_MAX_TOKENS, BEDROCK_DEFAULT_CONTEXT, AWS_INFERENCE_PROFILE_MAPPING, + BEDROCK_CLAUDE_SONNET_4_MODEL_ID, } from "@roo-code/types" import { ApiStream } from "../transform/stream" @@ -62,6 +63,7 @@ interface BedrockPayload { system?: SystemContentBlock[] inferenceConfig: BedrockInferenceConfig anthropic_version?: string + anthropic_beta?: string[] additionalModelRequestFields?: BedrockThinkingConfig } @@ -375,6 +377,11 @@ export class AwsBedrockHandler extends BaseProvider implements SingleCompletionH inferenceConfig.topP = 0.1 } + // Check if 1M context is enabled for Claude Sonnet 4 + // Use parseBaseModelId to handle cross-region inference prefixes + const baseModelId = this.parseBaseModelId(modelConfig.id) + const is1MContextEnabled = baseModelId === BEDROCK_CLAUDE_SONNET_4_MODEL_ID && this.options.awsBedrock1MContext + const payload: BedrockPayload = { modelId: modelConfig.id, messages: formatted.messages, @@ -383,6 +390,8 @@ export class AwsBedrockHandler extends BaseProvider implements SingleCompletionH ...(additionalModelRequestFields && { additionalModelRequestFields }), // Add anthropic_version when using thinking features ...(thinkingEnabled && { anthropic_version: "bedrock-2023-05-31" }), + // Add anthropic_beta when 1M context is enabled + ...(is1MContextEnabled && { anthropic_beta: ["context-1m-2025-08-07"] }), } // Create AbortController with 10 minute timeout @@ -960,6 +969,17 @@ export class AwsBedrockHandler extends BaseProvider implements SingleCompletionH } } + // Check if 1M context is enabled for Claude Sonnet 4 + // Use parseBaseModelId to handle cross-region inference prefixes + const baseModelId = this.parseBaseModelId(modelConfig.id) + if (baseModelId === BEDROCK_CLAUDE_SONNET_4_MODEL_ID && this.options.awsBedrock1MContext) { + // Update context window to 1M tokens when 1M context beta is enabled + modelConfig.info = { + ...modelConfig.info, + contextWindow: 1_000_000, + } + } + // Get model params including reasoning configuration const params = getModelParams({ format: "anthropic", diff --git a/webview-ui/src/components/settings/providers/Bedrock.tsx b/webview-ui/src/components/settings/providers/Bedrock.tsx index 750f631856..6c871e570a 100644 --- a/webview-ui/src/components/settings/providers/Bedrock.tsx +++ b/webview-ui/src/components/settings/providers/Bedrock.tsx @@ -2,7 +2,12 @@ import { useCallback, useState, useEffect } from "react" import { Checkbox } from "vscrui" import { VSCodeTextField } from "@vscode/webview-ui-toolkit/react" -import { type ProviderSettings, type ModelInfo, BEDROCK_REGIONS } from "@roo-code/types" +import { + type ProviderSettings, + type ModelInfo, + BEDROCK_REGIONS, + BEDROCK_CLAUDE_SONNET_4_MODEL_ID, +} from "@roo-code/types" import { useAppTranslation } from "@src/i18n/TranslationContext" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, StandardTooltip } from "@src/components/ui" @@ -19,6 +24,9 @@ export const Bedrock = ({ apiConfiguration, setApiConfigurationField, selectedMo const { t } = useAppTranslation() const [awsEndpointSelected, setAwsEndpointSelected] = useState(!!apiConfiguration?.awsBedrockEndpointEnabled) + // Check if the selected model supports 1M context (Claude Sonnet 4) + const supports1MContextBeta = apiConfiguration?.apiModelId === BEDROCK_CLAUDE_SONNET_4_MODEL_ID + // Update the endpoint enabled state when the configuration changes useEffect(() => { setAwsEndpointSelected(!!apiConfiguration?.awsBedrockEndpointEnabled) @@ -159,6 +167,20 @@ export const Bedrock = ({ apiConfiguration, setApiConfigurationField, selectedMo )} + {supports1MContextBeta && ( +
+ { + setApiConfigurationField("awsBedrock1MContext", checked) + }}> + {t("settings:providers.awsBedrock1MContextBetaLabel")} + +
+ {t("settings:providers.awsBedrock1MContextBetaDescription")} +
+
+ )} { diff --git a/webview-ui/src/components/ui/hooks/__tests__/useSelectedModel.spec.ts b/webview-ui/src/components/ui/hooks/__tests__/useSelectedModel.spec.ts index 76c9878c9d..9d8c627b7f 100644 --- a/webview-ui/src/components/ui/hooks/__tests__/useSelectedModel.spec.ts +++ b/webview-ui/src/components/ui/hooks/__tests__/useSelectedModel.spec.ts @@ -5,7 +5,7 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query" import { renderHook } from "@testing-library/react" import type { Mock } from "vitest" -import { ProviderSettings, ModelInfo } from "@roo-code/types" +import { ProviderSettings, ModelInfo, BEDROCK_CLAUDE_SONNET_4_MODEL_ID } from "@roo-code/types" import { useSelectedModel } from "../useSelectedModel" import { useRouterModels } from "../useRouterModels" @@ -448,4 +448,69 @@ describe("useSelectedModel", () => { expect(result.current.info?.supportsImages).toBe(false) }) }) + + describe("bedrock provider with 1M context", () => { + beforeEach(() => { + mockUseRouterModels.mockReturnValue({ + data: { + openrouter: {}, + requesty: {}, + glama: {}, + unbound: {}, + litellm: {}, + "io-intelligence": {}, + }, + isLoading: false, + isError: false, + } as any) + + mockUseOpenRouterModelProviders.mockReturnValue({ + data: {}, + isLoading: false, + isError: false, + } as any) + }) + + it("should enable 1M context window for Bedrock Claude Sonnet 4 when awsBedrock1MContext is true", () => { + const apiConfiguration: ProviderSettings = { + apiProvider: "bedrock", + apiModelId: BEDROCK_CLAUDE_SONNET_4_MODEL_ID, + awsBedrock1MContext: true, + } + + const wrapper = createWrapper() + const { result } = renderHook(() => useSelectedModel(apiConfiguration), { wrapper }) + + expect(result.current.id).toBe(BEDROCK_CLAUDE_SONNET_4_MODEL_ID) + expect(result.current.info?.contextWindow).toBe(1_000_000) + }) + + it("should use default context window for Bedrock Claude Sonnet 4 when awsBedrock1MContext is false", () => { + const apiConfiguration: ProviderSettings = { + apiProvider: "bedrock", + apiModelId: BEDROCK_CLAUDE_SONNET_4_MODEL_ID, + awsBedrock1MContext: false, + } + + const wrapper = createWrapper() + const { result } = renderHook(() => useSelectedModel(apiConfiguration), { wrapper }) + + expect(result.current.id).toBe(BEDROCK_CLAUDE_SONNET_4_MODEL_ID) + expect(result.current.info?.contextWindow).toBe(200_000) + }) + + it("should not affect context window for non-Claude Sonnet 4 Bedrock models", () => { + const apiConfiguration: ProviderSettings = { + apiProvider: "bedrock", + apiModelId: "anthropic.claude-3-5-sonnet-20241022-v2:0", + awsBedrock1MContext: true, + } + + const wrapper = createWrapper() + const { result } = renderHook(() => useSelectedModel(apiConfiguration), { wrapper }) + + expect(result.current.id).toBe("anthropic.claude-3-5-sonnet-20241022-v2:0") + expect(result.current.info?.contextWindow).toBe(200_000) + }) + }) }) diff --git a/webview-ui/src/components/ui/hooks/useSelectedModel.ts b/webview-ui/src/components/ui/hooks/useSelectedModel.ts index b13823a7d2..b188f3e342 100644 --- a/webview-ui/src/components/ui/hooks/useSelectedModel.ts +++ b/webview-ui/src/components/ui/hooks/useSelectedModel.ts @@ -48,6 +48,7 @@ import { fireworksDefaultModelId, ioIntelligenceDefaultModelId, ioIntelligenceModels, + BEDROCK_CLAUDE_SONNET_4_MODEL_ID, } from "@roo-code/types" import type { ModelRecord, RouterModels } from "@roo/api" @@ -174,7 +175,7 @@ function getSelectedModel({ } case "bedrock": { const id = apiConfiguration.apiModelId ?? bedrockDefaultModelId - const info = bedrockModels[id as keyof typeof bedrockModels] + const baseInfo = bedrockModels[id as keyof typeof bedrockModels] // Special case for custom ARN. if (id === "custom-arn") { @@ -184,7 +185,17 @@ function getSelectedModel({ } } - return { id, info } + // Apply 1M context for Claude Sonnet 4 when enabled + if (id === BEDROCK_CLAUDE_SONNET_4_MODEL_ID && apiConfiguration.awsBedrock1MContext && baseInfo) { + // Create a new ModelInfo object with updated context window + const info: ModelInfo = { + ...baseInfo, + contextWindow: 1_000_000, + } + return { id, info } + } + + return { id, info: baseInfo } } case "vertex": { const id = apiConfiguration.apiModelId ?? vertexDefaultModelId diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 02839a3372..5964798684 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -261,6 +261,8 @@ "anthropicUseAuthToken": "Passar la clau API d'Anthropic com a capçalera d'autorització en lloc de X-Api-Key", "anthropic1MContextBetaLabel": "Activa la finestra de context d'1M (Beta)", "anthropic1MContextBetaDescription": "Amplia la finestra de context a 1 milió de tokens per a Claude Sonnet 4", + "awsBedrock1MContextBetaLabel": "Activa la finestra de context d'1M (Beta)", + "awsBedrock1MContextBetaDescription": "Amplia la finestra de context a 1 milió de tokens per a Claude Sonnet 4", "cerebrasApiKey": "Clau API de Cerebras", "getCerebrasApiKey": "Obtenir clau API de Cerebras", "chutesApiKey": "Clau API de Chutes", diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index 204d559dfc..28f3e847fa 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -263,6 +263,8 @@ "anthropicUseAuthToken": "Anthropic API-Schlüssel als Authorization-Header anstelle von X-Api-Key übergeben", "anthropic1MContextBetaLabel": "1M Kontextfenster aktivieren (Beta)", "anthropic1MContextBetaDescription": "Erweitert das Kontextfenster für Claude Sonnet 4 auf 1 Million Token", + "awsBedrock1MContextBetaLabel": "1M Kontextfenster aktivieren (Beta)", + "awsBedrock1MContextBetaDescription": "Erweitert das Kontextfenster für Claude Sonnet 4 auf 1 Million Token", "cerebrasApiKey": "Cerebras API-Schlüssel", "getCerebrasApiKey": "Cerebras API-Schlüssel erhalten", "chutesApiKey": "Chutes API-Schlüssel", diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index b57a0d7166..fca3d1ade9 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -260,6 +260,8 @@ "anthropicUseAuthToken": "Pass Anthropic API Key as Authorization header instead of X-Api-Key", "anthropic1MContextBetaLabel": "Enable 1M context window (Beta)", "anthropic1MContextBetaDescription": "Extends context window to 1 million tokens for Claude Sonnet 4", + "awsBedrock1MContextBetaLabel": "Enable 1M context window (Beta)", + "awsBedrock1MContextBetaDescription": "Extends context window to 1 million tokens for Claude Sonnet 4", "cerebrasApiKey": "Cerebras API Key", "getCerebrasApiKey": "Get Cerebras API Key", "chutesApiKey": "Chutes API Key", diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index afcff6dfa5..fd6e1e2715 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -261,6 +261,8 @@ "anthropicUseAuthToken": "Pasar la clave API de Anthropic como encabezado de autorización en lugar de X-Api-Key", "anthropic1MContextBetaLabel": "Habilitar ventana de contexto de 1M (Beta)", "anthropic1MContextBetaDescription": "Amplía la ventana de contexto a 1 millón de tokens para Claude Sonnet 4", + "awsBedrock1MContextBetaLabel": "Habilitar ventana de contexto de 1M (Beta)", + "awsBedrock1MContextBetaDescription": "Amplía la ventana de contexto a 1 millón de tokens para Claude Sonnet 4", "cerebrasApiKey": "Clave API de Cerebras", "getCerebrasApiKey": "Obtener clave API de Cerebras", "chutesApiKey": "Clave API de Chutes", diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index 2772460344..451e51d084 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -261,6 +261,8 @@ "anthropicUseAuthToken": "Passer la clé API Anthropic comme en-tête d'autorisation au lieu de X-Api-Key", "anthropic1MContextBetaLabel": "Activer la fenêtre de contexte de 1M (Bêta)", "anthropic1MContextBetaDescription": "Étend la fenêtre de contexte à 1 million de tokens pour Claude Sonnet 4", + "awsBedrock1MContextBetaLabel": "Activer la fenêtre de contexte de 1M (Bêta)", + "awsBedrock1MContextBetaDescription": "Étend la fenêtre de contexte à 1 million de tokens pour Claude Sonnet 4", "cerebrasApiKey": "Clé API Cerebras", "getCerebrasApiKey": "Obtenir la clé API Cerebras", "chutesApiKey": "Clé API Chutes", diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 3c76392ffd..83a4b7b81b 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -261,6 +261,8 @@ "anthropicUseAuthToken": "X-Api-Key के बजाय Anthropic API कुंजी को Authorization हेडर के रूप में पास करें", "anthropic1MContextBetaLabel": "1M संदर्भ विंडो सक्षम करें (बीटा)", "anthropic1MContextBetaDescription": "Claude Sonnet 4 के लिए संदर्भ विंडो को 1 मिलियन टोकन तक बढ़ाता है", + "awsBedrock1MContextBetaLabel": "1M संदर्भ विंडो सक्षम करें (बीटा)", + "awsBedrock1MContextBetaDescription": "Claude Sonnet 4 के लिए संदर्भ विंडो को 1 मिलियन टोकन तक बढ़ाता है", "cerebrasApiKey": "Cerebras API कुंजी", "getCerebrasApiKey": "Cerebras API कुंजी प्राप्त करें", "chutesApiKey": "Chutes API कुंजी", diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index cf3dc1d42f..fd7edf40cf 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -265,6 +265,8 @@ "anthropicUseAuthToken": "Kirim Anthropic API Key sebagai Authorization header alih-alih X-Api-Key", "anthropic1MContextBetaLabel": "Aktifkan jendela konteks 1M (Beta)", "anthropic1MContextBetaDescription": "Memperluas jendela konteks menjadi 1 juta token untuk Claude Sonnet 4", + "awsBedrock1MContextBetaLabel": "Aktifkan jendela konteks 1M (Beta)", + "awsBedrock1MContextBetaDescription": "Memperluas jendela konteks menjadi 1 juta token untuk Claude Sonnet 4", "cerebrasApiKey": "Cerebras API Key", "getCerebrasApiKey": "Dapatkan Cerebras API Key", "chutesApiKey": "Chutes API Key", diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 40a15c3e60..c8a8800e4f 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -261,6 +261,8 @@ "anthropicUseAuthToken": "Passa la chiave API Anthropic come header di autorizzazione invece di X-Api-Key", "anthropic1MContextBetaLabel": "Abilita finestra di contesto da 1M (Beta)", "anthropic1MContextBetaDescription": "Estende la finestra di contesto a 1 milione di token per Claude Sonnet 4", + "awsBedrock1MContextBetaLabel": "Abilita finestra di contesto da 1M (Beta)", + "awsBedrock1MContextBetaDescription": "Estende la finestra di contesto a 1 milione di token per Claude Sonnet 4", "cerebrasApiKey": "Chiave API Cerebras", "getCerebrasApiKey": "Ottieni chiave API Cerebras", "chutesApiKey": "Chiave API Chutes", diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index 7009c5d48b..d3e7b04baf 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -261,6 +261,8 @@ "anthropicUseAuthToken": "Anthropic APIキーをX-Api-Keyの代わりにAuthorizationヘッダーとして渡す", "anthropic1MContextBetaLabel": "1Mコンテキストウィンドウを有効にする(ベータ版)", "anthropic1MContextBetaDescription": "Claude Sonnet 4のコンテキストウィンドウを100万トークンに拡張します", + "awsBedrock1MContextBetaLabel": "1Mコンテキストウィンドウを有効にする(ベータ版)", + "awsBedrock1MContextBetaDescription": "Claude Sonnet 4のコンテキストウィンドウを100万トークンに拡張します", "cerebrasApiKey": "Cerebras APIキー", "getCerebrasApiKey": "Cerebras APIキーを取得", "chutesApiKey": "Chutes APIキー", diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index fc27e6a0fe..a5bcd1f385 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -261,6 +261,8 @@ "anthropicUseAuthToken": "X-Api-Key 대신 Authorization 헤더로 Anthropic API 키 전달", "anthropic1MContextBetaLabel": "1M 컨텍스트 창 활성화 (베타)", "anthropic1MContextBetaDescription": "Claude Sonnet 4의 컨텍스트 창을 100만 토큰으로 확장", + "awsBedrock1MContextBetaLabel": "1M 컨텍스트 창 활성화 (베타)", + "awsBedrock1MContextBetaDescription": "Claude Sonnet 4의 컨텍스트 창을 100만 토큰으로 확장", "cerebrasApiKey": "Cerebras API 키", "getCerebrasApiKey": "Cerebras API 키 가져오기", "chutesApiKey": "Chutes API 키", diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index 2dc201851f..b54e021be0 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -261,6 +261,8 @@ "anthropicUseAuthToken": "Anthropic API-sleutel als Authorization-header doorgeven in plaats van X-Api-Key", "anthropic1MContextBetaLabel": "1M contextvenster inschakelen (bèta)", "anthropic1MContextBetaDescription": "Breidt het contextvenster uit tot 1 miljoen tokens voor Claude Sonnet 4", + "awsBedrock1MContextBetaLabel": "1M contextvenster inschakelen (bèta)", + "awsBedrock1MContextBetaDescription": "Breidt het contextvenster uit tot 1 miljoen tokens voor Claude Sonnet 4", "cerebrasApiKey": "Cerebras API-sleutel", "getCerebrasApiKey": "Cerebras API-sleutel verkrijgen", "chutesApiKey": "Chutes API-sleutel", diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 80324260a3..194bd9029d 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -261,6 +261,8 @@ "anthropicUseAuthToken": "Przekaż klucz API Anthropic jako nagłówek Authorization zamiast X-Api-Key", "anthropic1MContextBetaLabel": "Włącz okno kontekstowe 1M (Beta)", "anthropic1MContextBetaDescription": "Rozszerza okno kontekstowe do 1 miliona tokenów dla Claude Sonnet 4", + "awsBedrock1MContextBetaLabel": "Włącz okno kontekstowe 1M (Beta)", + "awsBedrock1MContextBetaDescription": "Rozszerza okno kontekstowe do 1 miliona tokenów dla Claude Sonnet 4", "cerebrasApiKey": "Klucz API Cerebras", "getCerebrasApiKey": "Pobierz klucz API Cerebras", "chutesApiKey": "Klucz API Chutes", diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index 76146be742..7879dd5154 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -261,6 +261,8 @@ "anthropicUseAuthToken": "Passar a chave de API Anthropic como cabeçalho Authorization em vez de X-Api-Key", "anthropic1MContextBetaLabel": "Ativar janela de contexto de 1M (Beta)", "anthropic1MContextBetaDescription": "Estende a janela de contexto para 1 milhão de tokens para o Claude Sonnet 4", + "awsBedrock1MContextBetaLabel": "Ativar janela de contexto de 1M (Beta)", + "awsBedrock1MContextBetaDescription": "Estende a janela de contexto para 1 milhão de tokens para o Claude Sonnet 4", "cerebrasApiKey": "Chave de API Cerebras", "getCerebrasApiKey": "Obter chave de API Cerebras", "chutesApiKey": "Chave de API Chutes", diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index 26b4f56b54..3744ecedff 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -261,6 +261,8 @@ "anthropicUseAuthToken": "Передавать Anthropic API-ключ как Authorization-заголовок вместо X-Api-Key", "anthropic1MContextBetaLabel": "Включить контекстное окно 1M (бета)", "anthropic1MContextBetaDescription": "Расширяет контекстное окно до 1 миллиона токенов для Claude Sonnet 4", + "awsBedrock1MContextBetaLabel": "Включить контекстное окно 1M (бета)", + "awsBedrock1MContextBetaDescription": "Расширяет контекстное окно до 1 миллиона токенов для Claude Sonnet 4", "cerebrasApiKey": "Cerebras API-ключ", "getCerebrasApiKey": "Получить Cerebras API-ключ", "chutesApiKey": "Chutes API-ключ", diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index 561695e9cc..be1a7a0169 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -261,6 +261,8 @@ "anthropicUseAuthToken": "Anthropic API Anahtarını X-Api-Key yerine Authorization başlığı olarak geçir", "anthropic1MContextBetaLabel": "1M bağlam penceresini etkinleştir (Beta)", "anthropic1MContextBetaDescription": "Claude Sonnet 4 için bağlam penceresini 1 milyon token'a genişletir", + "awsBedrock1MContextBetaLabel": "1M bağlam penceresini etkinleştir (Beta)", + "awsBedrock1MContextBetaDescription": "Claude Sonnet 4 için bağlam penceresini 1 milyon token'a genişletir", "cerebrasApiKey": "Cerebras API Anahtarı", "getCerebrasApiKey": "Cerebras API Anahtarını Al", "chutesApiKey": "Chutes API Anahtarı", diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index 1709022211..7526cf31a7 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -261,6 +261,8 @@ "anthropicUseAuthToken": "Truyền khóa API Anthropic dưới dạng tiêu đề Authorization thay vì X-Api-Key", "anthropic1MContextBetaLabel": "Bật cửa sổ ngữ cảnh 1M (Beta)", "anthropic1MContextBetaDescription": "Mở rộng cửa sổ ngữ cảnh lên 1 triệu token cho Claude Sonnet 4", + "awsBedrock1MContextBetaLabel": "Bật cửa sổ ngữ cảnh 1M (Beta)", + "awsBedrock1MContextBetaDescription": "Mở rộng cửa sổ ngữ cảnh lên 1 triệu token cho Claude Sonnet 4", "cerebrasApiKey": "Khóa API Cerebras", "getCerebrasApiKey": "Lấy khóa API Cerebras", "chutesApiKey": "Khóa API Chutes", diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index 5d0afff83c..c1985e7490 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -261,6 +261,8 @@ "anthropicUseAuthToken": "将 Anthropic API 密钥作为 Authorization 标头传递,而不是 X-Api-Key", "anthropic1MContextBetaLabel": "启用 1M 上下文窗口 (Beta)", "anthropic1MContextBetaDescription": "为 Claude Sonnet 4 将上下文窗口扩展至 100 万个 token", + "awsBedrock1MContextBetaLabel": "启用 1M 上下文窗口 (Beta)", + "awsBedrock1MContextBetaDescription": "为 Claude Sonnet 4 将上下文窗口扩展至 100 万个 token", "cerebrasApiKey": "Cerebras API 密钥", "getCerebrasApiKey": "获取 Cerebras API 密钥", "chutesApiKey": "Chutes API 密钥", diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index 2b7ae60fa5..6a673de60a 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -261,6 +261,8 @@ "anthropicUseAuthToken": "將 Anthropic API 金鑰作為 Authorization 標頭傳遞,而非使用 X-Api-Key", "anthropic1MContextBetaLabel": "啟用 1M 上下文視窗 (Beta)", "anthropic1MContextBetaDescription": "為 Claude Sonnet 4 將上下文視窗擴展至 100 萬個 token", + "awsBedrock1MContextBetaLabel": "啟用 1M 上下文視窗 (Beta)", + "awsBedrock1MContextBetaDescription": "為 Claude Sonnet 4 將上下文視窗擴展至 100 萬個 token", "cerebrasApiKey": "Cerebras API 金鑰", "getCerebrasApiKey": "取得 Cerebras API 金鑰", "chutesApiKey": "Chutes API 金鑰", From 49020da566d1fc4aec8708ebdd26c42f656b44a1 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Tue, 12 Aug 2025 22:57:54 -0400 Subject: [PATCH 10/36] Release v3.25.13 (#7033) --- .changeset/v3.25.13.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .changeset/v3.25.13.md diff --git a/.changeset/v3.25.13.md b/.changeset/v3.25.13.md new file mode 100644 index 0000000000..23244ff124 --- /dev/null +++ b/.changeset/v3.25.13.md @@ -0,0 +1,8 @@ +--- +"roo-cline": patch +--- + +- Add Sonnet 1M context checkbox to Bedrock (thanks @mrubens!) +- Fix: add --no-messages flag to ripgrep to suppress file access errors (#6756 by @R-omk, PR by @app/roomote) +- Add support for AGENT.md alongside AGENTS.md (#6912 by @Brendan-Z, PR by @app/roomote) +- Remove deprecated GPT-4.5 Preview model (thanks @PeterDaveHello!) From 667773be109537dfffa81f600d819f1f487daa36 Mon Sep 17 00:00:00 2001 From: "roomote[bot]" <219738659+roomote[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 22:59:01 -0400 Subject: [PATCH 11/36] fix: add i18n support for Account button title (#6978) Co-authored-by: Roo Code --- src/package.json | 2 +- src/package.nls.ca.json | 1 + src/package.nls.de.json | 1 + src/package.nls.es.json | 1 + src/package.nls.fr.json | 1 + src/package.nls.hi.json | 1 + src/package.nls.id.json | 1 + src/package.nls.it.json | 1 + src/package.nls.ja.json | 1 + src/package.nls.json | 1 + src/package.nls.ko.json | 1 + src/package.nls.nl.json | 1 + src/package.nls.pl.json | 1 + src/package.nls.pt-BR.json | 1 + src/package.nls.ru.json | 1 + src/package.nls.tr.json | 1 + src/package.nls.vi.json | 1 + src/package.nls.zh-CN.json | 1 + src/package.nls.zh-TW.json | 1 + 19 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/package.json b/src/package.json index c4ea801c75..474d8e0f5f 100644 --- a/src/package.json +++ b/src/package.json @@ -102,7 +102,7 @@ }, { "command": "roo-cline.accountButtonClicked", - "title": "Account", + "title": "%command.account.title%", "icon": "$(account)" }, { diff --git a/src/package.nls.ca.json b/src/package.nls.ca.json index 90cba19454..1e2f1eedd6 100644 --- a/src/package.nls.ca.json +++ b/src/package.nls.ca.json @@ -23,6 +23,7 @@ "command.history.title": "Historial", "command.marketplace.title": "Mercat", "command.openInEditor.title": "Obrir a l'Editor", + "command.account.title": "Compte", "command.settings.title": "Configuració", "command.documentation.title": "Documentació", "configuration.title": "Roo Code", diff --git a/src/package.nls.de.json b/src/package.nls.de.json index 09d9ac760f..b5f099ff66 100644 --- a/src/package.nls.de.json +++ b/src/package.nls.de.json @@ -23,6 +23,7 @@ "command.history.title": "Verlauf", "command.marketplace.title": "Marktplatz", "command.openInEditor.title": "Im Editor Öffnen", + "command.account.title": "Konto", "command.settings.title": "Einstellungen", "command.documentation.title": "Dokumentation", "configuration.title": "Roo Code", diff --git a/src/package.nls.es.json b/src/package.nls.es.json index 28d1250bdd..a2479cd770 100644 --- a/src/package.nls.es.json +++ b/src/package.nls.es.json @@ -23,6 +23,7 @@ "command.history.title": "Historial", "command.marketplace.title": "Mercado", "command.openInEditor.title": "Abrir en Editor", + "command.account.title": "Cuenta", "command.settings.title": "Configuración", "command.documentation.title": "Documentación", "configuration.title": "Roo Code", diff --git a/src/package.nls.fr.json b/src/package.nls.fr.json index 7d528bf0a6..03052aaf75 100644 --- a/src/package.nls.fr.json +++ b/src/package.nls.fr.json @@ -23,6 +23,7 @@ "command.history.title": "Historique", "command.marketplace.title": "Marché", "command.openInEditor.title": "Ouvrir dans l'Éditeur", + "command.account.title": "Compte", "command.settings.title": "Paramètres", "command.documentation.title": "Documentation", "configuration.title": "Roo Code", diff --git a/src/package.nls.hi.json b/src/package.nls.hi.json index a3dc74ae2b..24f8ed402d 100644 --- a/src/package.nls.hi.json +++ b/src/package.nls.hi.json @@ -23,6 +23,7 @@ "command.history.title": "इतिहास", "command.marketplace.title": "मार्केटप्लेस", "command.openInEditor.title": "एडिटर में खोलें", + "command.account.title": "खाता", "command.settings.title": "सेटिंग्स", "command.documentation.title": "दस्तावेज़ीकरण", "configuration.title": "Roo Code", diff --git a/src/package.nls.id.json b/src/package.nls.id.json index 2560899f61..98e979ee07 100644 --- a/src/package.nls.id.json +++ b/src/package.nls.id.json @@ -11,6 +11,7 @@ "command.history.title": "Riwayat", "command.marketplace.title": "Marketplace", "command.openInEditor.title": "Buka di Editor", + "command.account.title": "Akun", "command.settings.title": "Pengaturan", "command.documentation.title": "Dokumentasi", "command.openInNewTab.title": "Buka di Tab Baru", diff --git a/src/package.nls.it.json b/src/package.nls.it.json index 4c6f6a1602..6f8bb8fbce 100644 --- a/src/package.nls.it.json +++ b/src/package.nls.it.json @@ -23,6 +23,7 @@ "command.history.title": "Cronologia", "command.marketplace.title": "Marketplace", "command.openInEditor.title": "Apri nell'Editor", + "command.account.title": "Account", "command.settings.title": "Impostazioni", "command.documentation.title": "Documentazione", "configuration.title": "Roo Code", diff --git a/src/package.nls.ja.json b/src/package.nls.ja.json index 1db66a75ab..c26c46905d 100644 --- a/src/package.nls.ja.json +++ b/src/package.nls.ja.json @@ -11,6 +11,7 @@ "command.history.title": "履歴", "command.marketplace.title": "マーケットプレイス", "command.openInEditor.title": "エディタで開く", + "command.account.title": "アカウント", "command.settings.title": "設定", "command.documentation.title": "ドキュメント", "command.openInNewTab.title": "新しいタブで開く", diff --git a/src/package.nls.json b/src/package.nls.json index 0cd834b132..f1c132be65 100644 --- a/src/package.nls.json +++ b/src/package.nls.json @@ -11,6 +11,7 @@ "command.history.title": "History", "command.marketplace.title": "Marketplace", "command.openInEditor.title": "Open in Editor", + "command.account.title": "Account", "command.settings.title": "Settings", "command.documentation.title": "Documentation", "command.openInNewTab.title": "Open In New Tab", diff --git a/src/package.nls.ko.json b/src/package.nls.ko.json index db14b2387f..b4d5dd4c14 100644 --- a/src/package.nls.ko.json +++ b/src/package.nls.ko.json @@ -23,6 +23,7 @@ "command.history.title": "기록", "command.marketplace.title": "마켓플레이스", "command.openInEditor.title": "에디터에서 열기", + "command.account.title": "계정", "command.settings.title": "설정", "command.documentation.title": "문서", "configuration.title": "Roo Code", diff --git a/src/package.nls.nl.json b/src/package.nls.nl.json index 7bc02b1db2..22d9102f18 100644 --- a/src/package.nls.nl.json +++ b/src/package.nls.nl.json @@ -11,6 +11,7 @@ "command.history.title": "Geschiedenis", "command.marketplace.title": "Marktplaats", "command.openInEditor.title": "Openen in Editor", + "command.account.title": "Account", "command.settings.title": "Instellingen", "command.documentation.title": "Documentatie", "command.openInNewTab.title": "Openen in Nieuw Tabblad", diff --git a/src/package.nls.pl.json b/src/package.nls.pl.json index 09cd69b043..cb23404330 100644 --- a/src/package.nls.pl.json +++ b/src/package.nls.pl.json @@ -23,6 +23,7 @@ "command.history.title": "Historia", "command.marketplace.title": "Marketplace", "command.openInEditor.title": "Otwórz w Edytorze", + "command.account.title": "Konto", "command.settings.title": "Ustawienia", "command.documentation.title": "Dokumentacja", "configuration.title": "Roo Code", diff --git a/src/package.nls.pt-BR.json b/src/package.nls.pt-BR.json index 1d24259b0c..e3b432e1d5 100644 --- a/src/package.nls.pt-BR.json +++ b/src/package.nls.pt-BR.json @@ -23,6 +23,7 @@ "command.history.title": "Histórico", "command.marketplace.title": "Marketplace", "command.openInEditor.title": "Abrir no Editor", + "command.account.title": "Conta", "command.settings.title": "Configurações", "command.documentation.title": "Documentação", "configuration.title": "Roo Code", diff --git a/src/package.nls.ru.json b/src/package.nls.ru.json index ffa94cfb30..91da74c6f1 100644 --- a/src/package.nls.ru.json +++ b/src/package.nls.ru.json @@ -11,6 +11,7 @@ "command.history.title": "История", "command.marketplace.title": "Маркетплейс", "command.openInEditor.title": "Открыть в редакторе", + "command.account.title": "Аккаунт", "command.settings.title": "Настройки", "command.documentation.title": "Документация", "command.openInNewTab.title": "Открыть в новой вкладке", diff --git a/src/package.nls.tr.json b/src/package.nls.tr.json index d01702de48..5337db6bb4 100644 --- a/src/package.nls.tr.json +++ b/src/package.nls.tr.json @@ -23,6 +23,7 @@ "command.history.title": "Geçmiş", "command.marketplace.title": "Marketplace", "command.openInEditor.title": "Düzenleyicide Aç", + "command.account.title": "Hesap", "command.settings.title": "Ayarlar", "command.documentation.title": "Dokümantasyon", "configuration.title": "Roo Code", diff --git a/src/package.nls.vi.json b/src/package.nls.vi.json index 667f82101a..f8c79b748a 100644 --- a/src/package.nls.vi.json +++ b/src/package.nls.vi.json @@ -23,6 +23,7 @@ "command.history.title": "Lịch Sử", "command.marketplace.title": "Marketplace", "command.openInEditor.title": "Mở trong Trình Soạn Thảo", + "command.account.title": "Tài khoản", "command.settings.title": "Cài Đặt", "command.documentation.title": "Tài Liệu", "configuration.title": "Roo Code", diff --git a/src/package.nls.zh-CN.json b/src/package.nls.zh-CN.json index c44bdee5c9..1ea96e772a 100644 --- a/src/package.nls.zh-CN.json +++ b/src/package.nls.zh-CN.json @@ -23,6 +23,7 @@ "command.history.title": "历史记录", "command.marketplace.title": "应用市场", "command.openInEditor.title": "在编辑器中打开", + "command.account.title": "账户", "command.settings.title": "设置", "command.documentation.title": "文档", "configuration.title": "Roo Code", diff --git a/src/package.nls.zh-TW.json b/src/package.nls.zh-TW.json index a84e44d598..815a061160 100644 --- a/src/package.nls.zh-TW.json +++ b/src/package.nls.zh-TW.json @@ -23,6 +23,7 @@ "command.history.title": "歷史記錄", "command.marketplace.title": "應用市場", "command.openInEditor.title": "在編輯器中開啟", + "command.account.title": "帳戶", "command.settings.title": "設定", "command.documentation.title": "文件", "configuration.title": "Roo Code", From 140310f05590c7dc75c4ca0c2bbf9059b0f598ae Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 23:11:43 -0400 Subject: [PATCH 12/36] Changeset version bump (#7034) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens --- .changeset/v3.25.13.md | 8 -------- CHANGELOG.md | 7 +++++++ src/package.json | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) delete mode 100644 .changeset/v3.25.13.md diff --git a/.changeset/v3.25.13.md b/.changeset/v3.25.13.md deleted file mode 100644 index 23244ff124..0000000000 --- a/.changeset/v3.25.13.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"roo-cline": patch ---- - -- Add Sonnet 1M context checkbox to Bedrock (thanks @mrubens!) -- Fix: add --no-messages flag to ripgrep to suppress file access errors (#6756 by @R-omk, PR by @app/roomote) -- Add support for AGENT.md alongside AGENTS.md (#6912 by @Brendan-Z, PR by @app/roomote) -- Remove deprecated GPT-4.5 Preview model (thanks @PeterDaveHello!) diff --git a/CHANGELOG.md b/CHANGELOG.md index c80facf593..66fa384754 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Roo Code Changelog +## [3.25.13] - 2025-08-12 + +- Add Sonnet 1M context checkbox to Bedrock +- Fix: add --no-messages flag to ripgrep to suppress file access errors (#6756 by @R-omk, PR by @app/roomote) +- Add support for AGENT.md alongside AGENTS.md (#6912 by @Brendan-Z, PR by @app/roomote) +- Remove deprecated GPT-4.5 Preview model (thanks @PeterDaveHello!) + ## [3.25.12] - 2025-08-12 - Update: Claude Sonnet 4 context window configurable to 1 million tokens in Anthropic provider (thanks @daniel-lxs!) diff --git a/src/package.json b/src/package.json index 474d8e0f5f..226a73602a 100644 --- a/src/package.json +++ b/src/package.json @@ -3,7 +3,7 @@ "displayName": "%extension.displayName%", "description": "%extension.description%", "publisher": "RooVeterinaryInc", - "version": "3.25.12", + "version": "3.25.13", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", From 6f81b775c762f5996b218130143bf0ca297c00af Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Wed, 13 Aug 2025 01:33:57 -0400 Subject: [PATCH 13/36] Revert "Fix token usage / cost often being underreported" (#7039) --- packages/types/src/global-settings.ts | 7 - src/core/task/Task.ts | 191 ++++---------------------- 2 files changed, 25 insertions(+), 173 deletions(-) diff --git a/packages/types/src/global-settings.ts b/packages/types/src/global-settings.ts index 39480e5a3d..c071726d8a 100644 --- a/packages/types/src/global-settings.ts +++ b/packages/types/src/global-settings.ts @@ -29,13 +29,6 @@ export const DEFAULT_WRITE_DELAY_MS = 1000 */ export const DEFAULT_TERMINAL_OUTPUT_CHARACTER_LIMIT = 50_000 -/** - * Default timeout for background usage collection in milliseconds. - * This timeout prevents the background task from running indefinitely - * when collecting usage data from streaming API responses. - */ -export const DEFAULT_USAGE_COLLECTION_TIMEOUT_MS = 30_000 - /** * GlobalSettings */ diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts index cb6694b7f0..2103dacb27 100644 --- a/src/core/task/Task.ts +++ b/src/core/task/Task.ts @@ -29,7 +29,6 @@ import { getApiProtocol, getModelId, DEFAULT_CONSECUTIVE_MISTAKE_LIMIT, - DEFAULT_USAGE_COLLECTION_TIMEOUT_MS, isBlockingAsk, } from "@roo-code/types" import { TelemetryService } from "@roo-code/telemetry" @@ -1566,10 +1565,6 @@ export class Task extends EventEmitter implements TaskLike { // of prices in tasks from history (it's worth removing a few months // from now). const updateApiReqMsg = (cancelReason?: ClineApiReqCancelReason, streamingFailedMessage?: string) => { - if (lastApiReqIndex < 0 || !this.clineMessages[lastApiReqIndex]) { - return - } - const existingData = JSON.parse(this.clineMessages[lastApiReqIndex].text || "{}") this.clineMessages[lastApiReqIndex].text = JSON.stringify({ ...existingData, @@ -1660,11 +1655,7 @@ export class Task extends EventEmitter implements TaskLike { this.isStreaming = true try { - const iterator = stream[Symbol.asyncIterator]() - let item = await iterator.next() - while (!item.done) { - const chunk = item.value - item = await iterator.next() + for await (const chunk of stream) { if (!chunk) { // Sometimes chunk is undefined, no idea that can cause // it, but this workaround seems to fix it. @@ -1732,165 +1723,16 @@ export class Task extends EventEmitter implements TaskLike { break } + // PREV: We need to let the request finish for openrouter to + // get generation details. + // UPDATE: It's better UX to interrupt the request at the + // cost of the API cost not being retrieved. if (this.didAlreadyUseTool) { assistantMessage += "\n\n[Response interrupted by a tool use result. Only one tool may be used at a time and should be placed at the end of the message.]" break } } - - // Create a copy of current token values to avoid race conditions - const currentTokens = { - input: inputTokens, - output: outputTokens, - cacheWrite: cacheWriteTokens, - cacheRead: cacheReadTokens, - total: totalCost, - } - - const drainStreamInBackgroundToFindAllUsage = async (apiReqIndex: number) => { - const timeoutMs = DEFAULT_USAGE_COLLECTION_TIMEOUT_MS - const startTime = Date.now() - const modelId = getModelId(this.apiConfiguration) - - // Local variables to accumulate usage data without affecting the main flow - let bgInputTokens = currentTokens.input - let bgOutputTokens = currentTokens.output - let bgCacheWriteTokens = currentTokens.cacheWrite - let bgCacheReadTokens = currentTokens.cacheRead - let bgTotalCost = currentTokens.total - - // Helper function to capture telemetry and update messages - const captureUsageData = async ( - tokens: { - input: number - output: number - cacheWrite: number - cacheRead: number - total?: number - }, - messageIndex: number = apiReqIndex, - ) => { - if (tokens.input > 0 || tokens.output > 0 || tokens.cacheWrite > 0 || tokens.cacheRead > 0) { - // Update the shared variables atomically - inputTokens = tokens.input - outputTokens = tokens.output - cacheWriteTokens = tokens.cacheWrite - cacheReadTokens = tokens.cacheRead - totalCost = tokens.total - - // Update the API request message with the latest usage data - updateApiReqMsg() - await this.saveClineMessages() - - // Update the specific message in the webview - const apiReqMessage = this.clineMessages[messageIndex] - if (apiReqMessage) { - await this.updateClineMessage(apiReqMessage) - } - - // Capture telemetry - TelemetryService.instance.captureLlmCompletion(this.taskId, { - inputTokens: tokens.input, - outputTokens: tokens.output, - cacheWriteTokens: tokens.cacheWrite, - cacheReadTokens: tokens.cacheRead, - cost: - tokens.total ?? - calculateApiCostAnthropic( - this.api.getModel().info, - tokens.input, - tokens.output, - tokens.cacheWrite, - tokens.cacheRead, - ), - }) - } - } - - try { - // Continue processing the original stream from where the main loop left off - let usageFound = false - let chunkCount = 0 - - // Use the same iterator that the main loop was using - while (!item.done) { - // Check for timeout - if (Date.now() - startTime > timeoutMs) { - console.warn( - `[Background Usage Collection] Timed out after ${timeoutMs}ms for model: ${modelId}, processed ${chunkCount} chunks`, - ) - // Clean up the iterator before breaking - if (iterator.return) { - await iterator.return(undefined) - } - break - } - - const chunk = item.value - item = await iterator.next() - chunkCount++ - - if (chunk && chunk.type === "usage") { - usageFound = true - bgInputTokens += chunk.inputTokens - bgOutputTokens += chunk.outputTokens - bgCacheWriteTokens += chunk.cacheWriteTokens ?? 0 - bgCacheReadTokens += chunk.cacheReadTokens ?? 0 - bgTotalCost = chunk.totalCost - } - } - - if ( - usageFound || - bgInputTokens > 0 || - bgOutputTokens > 0 || - bgCacheWriteTokens > 0 || - bgCacheReadTokens > 0 - ) { - // We have usage data either from a usage chunk or accumulated tokens - await captureUsageData( - { - input: bgInputTokens, - output: bgOutputTokens, - cacheWrite: bgCacheWriteTokens, - cacheRead: bgCacheReadTokens, - total: bgTotalCost, - }, - lastApiReqIndex, - ) - } else { - console.warn( - `[Background Usage Collection] Suspicious: request ${apiReqIndex} is complete, but no usage info was found. Model: ${modelId}`, - ) - } - } catch (error) { - console.error("Error draining stream for usage data:", error) - // Still try to capture whatever usage data we have collected so far - if ( - bgInputTokens > 0 || - bgOutputTokens > 0 || - bgCacheWriteTokens > 0 || - bgCacheReadTokens > 0 - ) { - await captureUsageData( - { - input: bgInputTokens, - output: bgOutputTokens, - cacheWrite: bgCacheWriteTokens, - cacheRead: bgCacheReadTokens, - total: bgTotalCost, - }, - lastApiReqIndex, - ) - } - } - } - - // Start the background task and handle any errors - drainStreamInBackgroundToFindAllUsage(lastApiReqIndex).catch((error) => { - console.error("Background usage collection failed:", error) - }) } catch (error) { // Abandoned happens when extension is no longer waiting for the // Cline instance to finish aborting (error is thrown here when @@ -1924,6 +1766,24 @@ export class Task extends EventEmitter implements TaskLike { this.isStreaming = false } + if (inputTokens > 0 || outputTokens > 0 || cacheWriteTokens > 0 || cacheReadTokens > 0) { + TelemetryService.instance.captureLlmCompletion(this.taskId, { + inputTokens, + outputTokens, + cacheWriteTokens, + cacheReadTokens, + cost: + totalCost ?? + calculateApiCostAnthropic( + this.api.getModel().info, + inputTokens, + outputTokens, + cacheWriteTokens, + cacheReadTokens, + ), + }) + } + // Need to call here in case the stream was aborted. if (this.abort || this.abandoned) { throw new Error(`[RooCode#recursivelyMakeRooRequests] task ${this.taskId}.${this.instanceId} aborted`) @@ -1960,10 +1820,9 @@ export class Task extends EventEmitter implements TaskLike { presentAssistantMessage(this) } - // Note: updateApiReqMsg() is now called from within drainStreamInBackgroundToFindAllUsage - // to ensure usage data is captured even when the stream is interrupted. The background task - // uses local variables to accumulate usage data before atomically updating the shared state. await this.persistGpt5Metadata(reasoningMessage) + + updateApiReqMsg() await this.saveClineMessages() await this.providerRef.deref()?.postStateToWebview() From 9ffc2b0a36686d5de843be487503f7e9cb25c1e6 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Tue, 12 Aug 2025 21:10:29 -1000 Subject: [PATCH 14/36] Move cloud types from @roo-code/types to @roo-code/cloud (#7038) --- packages/types/npm/package.json | 2 +- packages/types/src/cloud.ts | 158 ------------------ packages/types/src/index.ts | 2 - packages/types/src/sharing.ts | 8 - pnpm-lock.yaml | 13 +- scripts/link-packages.js | 7 + src/core/webview/ClineProvider.ts | 4 +- .../webview/__tests__/ClineProvider.spec.ts | 14 +- .../ClineProvider.sticky-mode.spec.ts | 21 ++- src/package.json | 2 +- .../marketplace/MarketplaceManager.ts | 4 +- src/shared/ExtensionMessage.ts | 6 +- src/shared/ProfileValidator.ts | 3 +- src/shared/WebviewMessage.ts | 16 +- src/shared/__tests__/ProfileValidator.spec.ts | 3 +- src/utils/remoteControl.ts | 2 +- webview-ui/package.json | 1 + webview-ui/src/__mocks__/vscode.ts | 18 ++ .../src/components/account/AccountView.tsx | 2 +- .../src/components/chat/ShareButton.tsx | 4 +- .../components/settings/ApiConfigManager.tsx | 15 +- .../src/components/settings/ModelPicker.tsx | 7 +- .../components/settings/providers/Glama.tsx | 3 +- .../settings/providers/IOIntelligence.tsx | 5 +- .../components/settings/providers/LiteLLM.tsx | 3 +- .../settings/providers/OpenAICompatible.tsx | 2 +- .../settings/providers/OpenRouter.tsx | 3 +- .../settings/providers/Requesty.tsx | 3 +- .../components/settings/providers/Unbound.tsx | 3 +- .../__tests__/organizationFilters.test.ts | 3 +- .../settings/utils/organizationFilters.ts | 3 +- .../src/context/ExtensionStateContext.tsx | 3 +- .../src/utils/__tests__/validate.test.ts | 4 +- webview-ui/src/utils/validate.ts | 3 +- webview-ui/vite.config.ts | 1 + webview-ui/vitest.config.ts | 3 + 36 files changed, 129 insertions(+), 225 deletions(-) delete mode 100644 packages/types/src/cloud.ts delete mode 100644 packages/types/src/sharing.ts create mode 100644 webview-ui/src/__mocks__/vscode.ts diff --git a/packages/types/npm/package.json b/packages/types/npm/package.json index 35e01d4ef7..b2be718cf6 100644 --- a/packages/types/npm/package.json +++ b/packages/types/npm/package.json @@ -1,6 +1,6 @@ { "name": "@roo-code/types", - "version": "1.45.0", + "version": "1.46.0", "description": "TypeScript type definitions for Roo Code.", "publishConfig": { "access": "public", diff --git a/packages/types/src/cloud.ts b/packages/types/src/cloud.ts deleted file mode 100644 index be9a039d43..0000000000 --- a/packages/types/src/cloud.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { z } from "zod" - -import { globalSettingsSchema } from "./global-settings.js" -import { mcpMarketplaceItemSchema } from "./marketplace.js" -import { discriminatedProviderSettingsWithIdSchema } from "./provider-settings.js" - -/** - * CloudUserInfo - */ - -export interface CloudUserInfo { - id?: string - name?: string - email?: string - picture?: string - organizationId?: string - organizationName?: string - organizationRole?: string - organizationImageUrl?: string - extensionBridgeEnabled?: boolean -} - -/** - * CloudOrganization Types - */ - -export interface CloudOrganization { - id: string - name: string - slug?: string - image_url?: string - has_image?: boolean - created_at?: number - updated_at?: number -} - -export interface CloudOrganizationMembership { - id: string - organization: CloudOrganization - role: string - permissions?: string[] - created_at?: number - updated_at?: number -} - -/** - * OrganizationAllowList - */ - -export const organizationAllowListSchema = z.object({ - allowAll: z.boolean(), - providers: z.record( - z.object({ - allowAll: z.boolean(), - models: z.array(z.string()).optional(), - }), - ), -}) - -export type OrganizationAllowList = z.infer - -/** - * OrganizationDefaultSettings - */ - -export const organizationDefaultSettingsSchema = globalSettingsSchema - .pick({ - enableCheckpoints: true, - fuzzyMatchThreshold: true, - maxOpenTabsContext: true, - maxReadFileLine: true, - maxWorkspaceFiles: true, - showRooIgnoredFiles: true, - terminalCommandDelay: true, - terminalCompressProgressBar: true, - terminalOutputLineLimit: true, - terminalShellIntegrationDisabled: true, - terminalShellIntegrationTimeout: true, - terminalZshClearEolMark: true, - }) - // Add stronger validations for some fields. - .merge( - z.object({ - maxOpenTabsContext: z.number().int().nonnegative().optional(), - maxReadFileLine: z.number().int().gte(-1).optional(), - maxWorkspaceFiles: z.number().int().nonnegative().optional(), - terminalCommandDelay: z.number().int().nonnegative().optional(), - terminalOutputLineLimit: z.number().int().nonnegative().optional(), - terminalShellIntegrationTimeout: z.number().int().nonnegative().optional(), - }), - ) - -export type OrganizationDefaultSettings = z.infer - -/** - * OrganizationCloudSettings - */ - -export const organizationCloudSettingsSchema = z.object({ - recordTaskMessages: z.boolean().optional(), - enableTaskSharing: z.boolean().optional(), - taskShareExpirationDays: z.number().int().positive().optional(), - allowMembersViewAllTasks: z.boolean().optional(), -}) - -export type OrganizationCloudSettings = z.infer - -/** - * Organization Settings - */ - -export const organizationSettingsSchema = z.object({ - version: z.number(), - cloudSettings: organizationCloudSettingsSchema.optional(), - defaultSettings: organizationDefaultSettingsSchema, - allowList: organizationAllowListSchema, - hiddenMcps: z.array(z.string()).optional(), - hideMarketplaceMcps: z.boolean().optional(), - mcps: z.array(mcpMarketplaceItemSchema).optional(), - providerProfiles: z.record(z.string(), discriminatedProviderSettingsWithIdSchema).optional(), -}) - -export type OrganizationSettings = z.infer - -/** - * Constants - */ - -export const ORGANIZATION_ALLOW_ALL: OrganizationAllowList = { - allowAll: true, - providers: {}, -} as const - -export const ORGANIZATION_DEFAULT: OrganizationSettings = { - version: 0, - cloudSettings: { - recordTaskMessages: true, - enableTaskSharing: true, - taskShareExpirationDays: 30, - allowMembersViewAllTasks: true, - }, - defaultSettings: {}, - allowList: ORGANIZATION_ALLOW_ALL, -} as const - -/** - * Share Types - */ - -export const shareResponseSchema = z.object({ - success: z.boolean(), - shareUrl: z.string().optional(), - error: z.string().optional(), - isNewShare: z.boolean().optional(), - manageUrl: z.string().optional(), -}) - -export type ShareResponse = z.infer diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index dcbb1c4f54..c65d070086 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -1,5 +1,4 @@ export * from "./api.js" -export * from "./cloud.js" export * from "./codebase-index.js" export * from "./events.js" export * from "./experiment.js" @@ -13,7 +12,6 @@ export * from "./message.js" export * from "./mode.js" export * from "./model.js" export * from "./provider-settings.js" -export * from "./sharing.js" export * from "./task.js" export * from "./todo.js" export * from "./telemetry.js" diff --git a/packages/types/src/sharing.ts b/packages/types/src/sharing.ts deleted file mode 100644 index f295798032..0000000000 --- a/packages/types/src/sharing.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Types related to task sharing functionality - */ - -/** - * Visibility options for sharing tasks - */ -export type ShareVisibility = "organization" | "public" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0bc3f93bcb..300c757b23 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -563,8 +563,8 @@ importers: specifier: ^1.14.0 version: 1.14.0(typescript@5.8.3) '@roo-code/cloud': - specifier: ^0.11.0 - version: 0.11.0 + specifier: ^0.13.0 + version: 0.13.0 '@roo-code/ipc': specifier: workspace:^ version: link:../packages/ipc @@ -896,6 +896,9 @@ importers: '@radix-ui/react-tooltip': specifier: ^1.1.8 version: 1.2.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@roo-code/cloud': + specifier: ^0.13.0 + version: 0.13.0 '@roo-code/types': specifier: workspace:^ version: link:../packages/types @@ -3065,8 +3068,8 @@ packages: cpu: [x64] os: [win32] - '@roo-code/cloud@0.11.0': - resolution: {integrity: sha512-ZT3gBRNHI0HGmn5bMxdyhMxJVrp/7l7jcx/lDRl+xjeCP3KmJshzFKlfjdSGDtOoztnNj65hSbs/WiTS2wUodQ==} + '@roo-code/cloud@0.13.0': + resolution: {integrity: sha512-pIrfMpuHSk3LPMG3SLmsfr/IYvL5x0k0iUXQ51dgZ2fP7TlzWg2erxclNl79O7pRMDYFnA/8YoQTAnv1N8VXnQ==} '@roo-code/types@1.45.0': resolution: {integrity: sha512-+rFJ9HcukDl59X9pI6lgZDtJHtKqHg6BIdS4LG759X+5MV7wvlNb4S+bQ3qKqIlBsQhH17bzIJCfsWZwjwxecw==} @@ -12234,7 +12237,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.40.2': optional: true - '@roo-code/cloud@0.11.0': + '@roo-code/cloud@0.13.0': dependencies: '@roo-code/types': 1.45.0 ioredis: 5.6.1 diff --git a/scripts/link-packages.js b/scripts/link-packages.js index 6d8b33f6de..1673fd5dac 100755 --- a/scripts/link-packages.js +++ b/scripts/link-packages.js @@ -14,6 +14,13 @@ const config = { npmPath: "npm", watchCommand: "pnpm build:development:watch", }, + { + name: "@roo-code/cloud", + sourcePath: "../Roo-Code-Cloud/packages/sdk", + targetPath: "webview-ui/node_modules/@roo-code/cloud", + npmPath: "npm", + watchCommand: "pnpm build:development:watch", + }, ], } diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index e6817e1825..81c0a562c7 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -24,17 +24,15 @@ import { type TerminalActionId, type TerminalActionPromptType, type HistoryItem, - type CloudUserInfo, RooCodeEventName, requestyDefaultModelId, openRouterDefaultModelId, glamaDefaultModelId, - ORGANIZATION_ALLOW_ALL, DEFAULT_TERMINAL_OUTPUT_CHARACTER_LIMIT, DEFAULT_WRITE_DELAY_MS, } from "@roo-code/types" import { TelemetryService } from "@roo-code/telemetry" -import { CloudService, getRooCodeApiUrl } from "@roo-code/cloud" +import { type CloudUserInfo, CloudService, ORGANIZATION_ALLOW_ALL, getRooCodeApiUrl } from "@roo-code/cloud" import { Package } from "../../shared/package" import { findLast } from "../../shared/array" diff --git a/src/core/webview/__tests__/ClineProvider.spec.ts b/src/core/webview/__tests__/ClineProvider.spec.ts index eeae44451d..29df1e4a2e 100644 --- a/src/core/webview/__tests__/ClineProvider.spec.ts +++ b/src/core/webview/__tests__/ClineProvider.spec.ts @@ -4,8 +4,9 @@ import Anthropic from "@anthropic-ai/sdk" import * as vscode from "vscode" import axios from "axios" -import { type ProviderSettingsEntry, type ClineMessage, ORGANIZATION_ALLOW_ALL } from "@roo-code/types" +import { type ProviderSettingsEntry, type ClineMessage } from "@roo-code/types" import { TelemetryService } from "@roo-code/telemetry" +import { ORGANIZATION_ALLOW_ALL } from "@roo-code/cloud" import { ExtensionMessage, ExtensionState } from "../../../shared/ExtensionMessage" import { defaultModeSlug } from "../../../shared/modes" @@ -17,11 +18,9 @@ import { safeWriteJson } from "../../../utils/safeWriteJson" import { ClineProvider } from "../ClineProvider" -// Mock setup must come before imports +// Mock setup must come before imports. vi.mock("../../prompts/sections/custom-instructions") -vi.mock("vscode") - vi.mock("p-wait-for", () => ({ __esModule: true, default: vi.fn().mockResolvedValue(undefined), @@ -95,7 +94,7 @@ vi.mock("../../../services/browser/browserDiscovery", () => ({ testBrowserConnection: vi.fn(), })) -// Remove duplicate mock - it's already defined below +// Remove duplicate mock - it's already defined below. const mockAddCustomInstructions = vi.fn().mockResolvedValue("Combined instructions") @@ -228,7 +227,6 @@ vi.mock("../../../integrations/misc/extract-text", () => ({ }), })) -// Mock getModels for router model tests vi.mock("../../../api/providers/fetchers/modelCache", () => ({ getModels: vi.fn().mockResolvedValue({}), flushModels: vi.fn(), @@ -324,6 +322,10 @@ vi.mock("@roo-code/cloud", () => ({ }, }, getRooCodeApiUrl: vi.fn().mockReturnValue("https://app.roocode.com"), + ORGANIZATION_ALLOW_ALL: { + allowAll: true, + providers: {}, + }, })) afterAll(() => { diff --git a/src/core/webview/__tests__/ClineProvider.sticky-mode.spec.ts b/src/core/webview/__tests__/ClineProvider.sticky-mode.spec.ts index e55e0910ab..99285bb68e 100644 --- a/src/core/webview/__tests__/ClineProvider.sticky-mode.spec.ts +++ b/src/core/webview/__tests__/ClineProvider.sticky-mode.spec.ts @@ -7,7 +7,6 @@ import { ContextProxy } from "../../config/ContextProxy" import { Task } from "../../task/Task" import type { HistoryItem, ProviderName } from "@roo-code/types" -// Mock setup vi.mock("vscode", () => ({ ExtensionContext: vi.fn(), OutputChannel: vi.fn(), @@ -54,7 +53,8 @@ vi.mock("vscode", () => ({ }, version: "1.85.0", })) -// Create a counter for unique task IDs + +// Create a counter for unique task IDs. let taskIdCounter = 0 vi.mock("../../task/Task", () => ({ @@ -75,8 +75,11 @@ vi.mock("../../task/Task", () => ({ parentTask: options.parentTask, })), })) + vi.mock("../../prompts/sections/custom-instructions") + vi.mock("../../../utils/safeWriteJson") + vi.mock("../../../api", () => ({ buildApiHandler: vi.fn().mockReturnValue({ getModel: vi.fn().mockReturnValue({ @@ -85,12 +88,14 @@ vi.mock("../../../api", () => ({ }), }), })) + vi.mock("../../../integrations/workspace/WorkspaceTracker", () => ({ default: vi.fn().mockImplementation(() => ({ initializeFilePaths: vi.fn(), dispose: vi.fn(), })), })) + vi.mock("../../diff/strategies/multi-search-replace", () => ({ MultiSearchReplaceDiffStrategy: vi.fn().mockImplementation(() => ({ getToolDescription: () => "test", @@ -98,6 +103,7 @@ vi.mock("../../diff/strategies/multi-search-replace", () => ({ applyDiff: vi.fn(), })), })) + vi.mock("@roo-code/cloud", () => ({ CloudService: { hasInstance: vi.fn().mockReturnValue(true), @@ -108,7 +114,12 @@ vi.mock("@roo-code/cloud", () => ({ }, }, getRooCodeApiUrl: vi.fn().mockReturnValue("https://app.roocode.com"), + ORGANIZATION_ALLOW_ALL: { + allowAll: true, + providers: {}, + }, })) + vi.mock("../../../shared/modes", () => ({ modes: [ { @@ -132,20 +143,25 @@ vi.mock("../../../shared/modes", () => ({ }), defaultModeSlug: "code", })) + vi.mock("../../prompts/system", () => ({ SYSTEM_PROMPT: vi.fn().mockResolvedValue("mocked system prompt"), codeMode: "code", })) + vi.mock("../../../api/providers/fetchers/modelCache", () => ({ getModels: vi.fn().mockResolvedValue({}), flushModels: vi.fn(), })) + vi.mock("../../../integrations/misc/extract-text", () => ({ extractTextFromFile: vi.fn().mockResolvedValue("Mock file content"), })) + vi.mock("p-wait-for", () => ({ default: vi.fn().mockImplementation(async () => Promise.resolve()), })) + vi.mock("fs/promises", () => ({ mkdir: vi.fn().mockResolvedValue(undefined), writeFile: vi.fn().mockResolvedValue(undefined), @@ -153,6 +169,7 @@ vi.mock("fs/promises", () => ({ unlink: vi.fn().mockResolvedValue(undefined), rmdir: vi.fn().mockResolvedValue(undefined), })) + vi.mock("@roo-code/telemetry", () => ({ TelemetryService: { hasInstance: vi.fn().mockReturnValue(true), diff --git a/src/package.json b/src/package.json index 226a73602a..dfe4231f01 100644 --- a/src/package.json +++ b/src/package.json @@ -427,7 +427,7 @@ "@mistralai/mistralai": "^1.3.6", "@modelcontextprotocol/sdk": "^1.9.0", "@qdrant/js-client-rest": "^1.14.0", - "@roo-code/cloud": "^0.11.0", + "@roo-code/cloud": "^0.13.0", "@roo-code/ipc": "workspace:^", "@roo-code/telemetry": "workspace:^", "@roo-code/types": "workspace:^", diff --git a/src/services/marketplace/MarketplaceManager.ts b/src/services/marketplace/MarketplaceManager.ts index 800eba62e0..0227cdb79d 100644 --- a/src/services/marketplace/MarketplaceManager.ts +++ b/src/services/marketplace/MarketplaceManager.ts @@ -4,9 +4,9 @@ import * as path from "path" import * as vscode from "vscode" import * as yaml from "yaml" -import type { MarketplaceItem, MarketplaceItemType, McpMarketplaceItem, OrganizationSettings } from "@roo-code/types" +import type { MarketplaceItem, MarketplaceItemType, McpMarketplaceItem } from "@roo-code/types" import { TelemetryService } from "@roo-code/telemetry" -import { CloudService } from "@roo-code/cloud" +import { type OrganizationSettings, CloudService } from "@roo-code/cloud" import { GlobalFileNames } from "../../shared/globalFileNames" import { ensureSettingsDirectoryExists } from "../../utils/globalContext" diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index f9ac305e07..ebdc137432 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -7,17 +7,15 @@ import type { TelemetrySetting, Experiments, ClineMessage, - OrganizationAllowList, - CloudUserInfo, - ShareVisibility, + MarketplaceItem, } from "@roo-code/types" +import type { CloudUserInfo, OrganizationAllowList, ShareVisibility } from "@roo-code/cloud" import { GitCommit } from "../utils/git" import { McpServer } from "./mcp" import { Mode } from "./modes" import { ModelRecord, RouterModels } from "./api" -import type { MarketplaceItem } from "@roo-code/types" // Command interface for frontend/backend communication export interface Command { diff --git a/src/shared/ProfileValidator.ts b/src/shared/ProfileValidator.ts index 5a7c1da8bd..afdf1b5232 100644 --- a/src/shared/ProfileValidator.ts +++ b/src/shared/ProfileValidator.ts @@ -1,4 +1,5 @@ -import { OrganizationAllowList, ProviderSettings } from "@roo-code/types" +import type { ProviderSettings } from "@roo-code/types" +import type { OrganizationAllowList } from "@roo-code/cloud" export class ProfileValidator { public static isProfileAllowed(profile: ProviderSettings, allowList: OrganizationAllowList): boolean { diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index 2d94896bf5..d59ccd556c 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -1,14 +1,14 @@ import { z } from "zod" -import type { - ProviderSettings, - PromptComponent, - ModeConfig, - InstallMarketplaceItemOptions, - MarketplaceItem, - ShareVisibility, +import { + type ProviderSettings, + type PromptComponent, + type ModeConfig, + type InstallMarketplaceItemOptions, + type MarketplaceItem, + marketplaceItemSchema, } from "@roo-code/types" -import { marketplaceItemSchema } from "@roo-code/types" +import type { ShareVisibility } from "@roo-code/cloud" import { Mode } from "./modes" diff --git a/src/shared/__tests__/ProfileValidator.spec.ts b/src/shared/__tests__/ProfileValidator.spec.ts index f606fdce99..0129f8fc20 100644 --- a/src/shared/__tests__/ProfileValidator.spec.ts +++ b/src/shared/__tests__/ProfileValidator.spec.ts @@ -1,6 +1,7 @@ // npx vitest run src/shared/__tests__/ProfileValidator.spec.ts -import { OrganizationAllowList, ProviderSettings } from "@roo-code/types" +import { type ProviderSettings } from "@roo-code/types" +import { type OrganizationAllowList } from "@roo-code/cloud" import { ProfileValidator } from "../ProfileValidator" diff --git a/src/utils/remoteControl.ts b/src/utils/remoteControl.ts index f003b522d1..e645ce7219 100644 --- a/src/utils/remoteControl.ts +++ b/src/utils/remoteControl.ts @@ -1,4 +1,4 @@ -import type { CloudUserInfo } from "@roo-code/types" +import type { CloudUserInfo } from "@roo-code/cloud" /** * Determines if remote control features should be enabled diff --git a/webview-ui/package.json b/webview-ui/package.json index 681aca126d..e37f75a27c 100644 --- a/webview-ui/package.json +++ b/webview-ui/package.json @@ -29,6 +29,7 @@ "@radix-ui/react-slider": "^1.2.3", "@radix-ui/react-slot": "^1.1.2", "@radix-ui/react-tooltip": "^1.1.8", + "@roo-code/cloud": "^0.13.0", "@roo-code/types": "workspace:^", "@tailwindcss/vite": "^4.0.0", "@tanstack/react-query": "^5.68.0", diff --git a/webview-ui/src/__mocks__/vscode.ts b/webview-ui/src/__mocks__/vscode.ts new file mode 100644 index 0000000000..252b20e08c --- /dev/null +++ b/webview-ui/src/__mocks__/vscode.ts @@ -0,0 +1,18 @@ +/** + * Minimal mock for the vscode module. + * Used in tests to prevent module resolution errors. + * The actual vscode API is only available in VS Code extension contexts. + */ + +export const window = { + showInformationMessage: vi.fn(), + showErrorMessage: vi.fn(), +} + +export const env = { + openExternal: vi.fn(), +} + +export const Uri = { + parse: vi.fn((uri: string) => ({ toString: () => uri })), +} diff --git a/webview-ui/src/components/account/AccountView.tsx b/webview-ui/src/components/account/AccountView.tsx index f01aec9377..86239b1593 100644 --- a/webview-ui/src/components/account/AccountView.tsx +++ b/webview-ui/src/components/account/AccountView.tsx @@ -1,8 +1,8 @@ import { useEffect, useRef } from "react" import { VSCodeButton } from "@vscode/webview-ui-toolkit/react" -import type { CloudUserInfo } from "@roo-code/types" import { TelemetryEventName } from "@roo-code/types" +import type { CloudUserInfo } from "@roo-code/cloud" import { useAppTranslation } from "@src/i18n/TranslationContext" import { useExtensionState } from "@src/context/ExtensionStateContext" diff --git a/webview-ui/src/components/chat/ShareButton.tsx b/webview-ui/src/components/chat/ShareButton.tsx index 04cb1e2b38..ae8e1d99b7 100644 --- a/webview-ui/src/components/chat/ShareButton.tsx +++ b/webview-ui/src/components/chat/ShareButton.tsx @@ -2,8 +2,8 @@ import { useState, useEffect, useRef } from "react" import { useTranslation } from "react-i18next" import { SquareArrowOutUpRightIcon } from "lucide-react" -import type { HistoryItem, ShareVisibility } from "@roo-code/types" -import { TelemetryEventName } from "@roo-code/types" +import { type HistoryItem, TelemetryEventName } from "@roo-code/types" +import type { ShareVisibility } from "@roo-code/cloud" import { vscode } from "@/utils/vscode" import { telemetryClient } from "@/utils/TelemetryClient" diff --git a/webview-ui/src/components/settings/ApiConfigManager.tsx b/webview-ui/src/components/settings/ApiConfigManager.tsx index e737678c01..ecb2c39bdc 100644 --- a/webview-ui/src/components/settings/ApiConfigManager.tsx +++ b/webview-ui/src/components/settings/ApiConfigManager.tsx @@ -2,11 +2,20 @@ import { memo, useEffect, useRef, useState } from "react" import { VSCodeTextField } from "@vscode/webview-ui-toolkit/react" import { AlertTriangle } from "lucide-react" -import type { ProviderSettingsEntry, OrganizationAllowList } from "@roo-code/types" +import type { ProviderSettingsEntry } from "@roo-code/types" +import type { OrganizationAllowList } from "@roo-code/cloud" import { useAppTranslation } from "@/i18n/TranslationContext" -import { Button, Input, Dialog, DialogContent, DialogTitle, StandardTooltip, SearchableSelect } from "@/components/ui" -import type { SearchableSelectOption } from "@/components/ui" +import { + type SearchableSelectOption, + Button, + Input, + Dialog, + DialogContent, + DialogTitle, + StandardTooltip, + SearchableSelect, +} from "@/components/ui" interface ApiConfigManagerProps { currentApiConfigName?: string diff --git a/webview-ui/src/components/settings/ModelPicker.tsx b/webview-ui/src/components/settings/ModelPicker.tsx index a5a3fb6ef3..b8c89dd35f 100644 --- a/webview-ui/src/components/settings/ModelPicker.tsx +++ b/webview-ui/src/components/settings/ModelPicker.tsx @@ -3,7 +3,8 @@ import { VSCodeLink } from "@vscode/webview-ui-toolkit/react" import { Trans } from "react-i18next" import { ChevronsUpDown, Check, X } from "lucide-react" -import type { ProviderSettings, ModelInfo, OrganizationAllowList } from "@roo-code/types" +import type { ProviderSettings, ModelInfo } from "@roo-code/types" +import type { OrganizationAllowList } from "@roo-code/cloud" import { useAppTranslation } from "@src/i18n/TranslationContext" import { useSelectedModel } from "@/components/ui/hooks/useSelectedModel" @@ -194,7 +195,9 @@ export const ModelPicker = ({ value={model} onSelect={onSelect} data-testid={`model-option-${model}`}> -{model} + + {model} + , diff --git a/webview-ui/src/context/ExtensionStateContext.tsx b/webview-ui/src/context/ExtensionStateContext.tsx index 12f13bdf55..0413a82d24 100644 --- a/webview-ui/src/context/ExtensionStateContext.tsx +++ b/webview-ui/src/context/ExtensionStateContext.tsx @@ -6,9 +6,8 @@ import { type CustomModePrompts, type ModeConfig, type ExperimentId, - type OrganizationAllowList, - ORGANIZATION_ALLOW_ALL, } from "@roo-code/types" +import { type OrganizationAllowList, ORGANIZATION_ALLOW_ALL } from "@roo-code/cloud" import { ExtensionMessage, ExtensionState, MarketplaceInstalledMetadata, Command } from "@roo/ExtensionMessage" import { findLastIndex } from "@roo/array" diff --git a/webview-ui/src/utils/__tests__/validate.test.ts b/webview-ui/src/utils/__tests__/validate.test.ts index 9e693544b9..e76672df97 100644 --- a/webview-ui/src/utils/__tests__/validate.test.ts +++ b/webview-ui/src/utils/__tests__/validate.test.ts @@ -1,4 +1,6 @@ -import { ProviderSettings, OrganizationAllowList } from "@roo-code/types" +import type { ProviderSettings } from "@roo-code/types" +import type { OrganizationAllowList } from "@roo-code/cloud" + import { RouterModels } from "@roo/api" import { getModelValidationError, validateApiConfigurationExcludingModelErrors } from "../validate" diff --git a/webview-ui/src/utils/validate.ts b/webview-ui/src/utils/validate.ts index 70caf187f0..002f42055b 100644 --- a/webview-ui/src/utils/validate.ts +++ b/webview-ui/src/utils/validate.ts @@ -1,6 +1,7 @@ import i18next from "i18next" -import type { ProviderSettings, OrganizationAllowList } from "@roo-code/types" +import type { ProviderSettings } from "@roo-code/types" +import type { OrganizationAllowList } from "@roo-code/cloud" import { isRouterName, RouterModels } from "@roo/api" diff --git a/webview-ui/vite.config.ts b/webview-ui/vite.config.ts index 0579344a22..08284d9935 100644 --- a/webview-ui/vite.config.ts +++ b/webview-ui/vite.config.ts @@ -100,6 +100,7 @@ export default defineConfig(({ mode }) => { // Ensure source maps are properly included in the build minify: mode === "production" ? "esbuild" : false, rollupOptions: { + external: ["vscode"], output: { entryFileNames: `assets/[name].js`, chunkFileNames: (chunkInfo) => { diff --git a/webview-ui/vitest.config.ts b/webview-ui/vitest.config.ts index b9455584bf..80f3f49cf6 100644 --- a/webview-ui/vitest.config.ts +++ b/webview-ui/vitest.config.ts @@ -16,6 +16,9 @@ export default defineConfig({ "@": path.resolve(__dirname, "./src"), "@src": path.resolve(__dirname, "./src"), "@roo": path.resolve(__dirname, "../src/shared"), + // Mock the vscode module for tests since it's not available outside + // VS Code extension context. + vscode: path.resolve(__dirname, "./src/__mocks__/vscode.ts"), }, }, }) From 962df868bde863cfb473ed1aeb61881d3bd764d7 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Tue, 12 Aug 2025 22:40:00 -1000 Subject: [PATCH 15/36] Fix webview in dev mode (#7044) --- knip.json | 2 +- pnpm-lock.yaml | 3 --- scripts/link-packages.js | 7 ------- src/shared/cloud.ts | 8 ++++++++ webview-ui/package.json | 1 - webview-ui/src/__mocks__/vscode.ts | 18 ------------------ .../src/components/account/AccountView.tsx | 3 ++- webview-ui/src/components/chat/ShareButton.tsx | 3 ++- .../components/settings/ApiConfigManager.tsx | 3 ++- .../src/components/settings/ModelPicker.tsx | 3 ++- .../components/settings/providers/Glama.tsx | 2 +- .../settings/providers/IOIntelligence.tsx | 3 ++- .../components/settings/providers/LiteLLM.tsx | 2 +- .../settings/providers/OpenAICompatible.tsx | 2 +- .../settings/providers/OpenRouter.tsx | 2 +- .../components/settings/providers/Requesty.tsx | 2 +- .../components/settings/providers/Unbound.tsx | 2 +- .../__tests__/organizationFilters.test.ts | 3 ++- .../settings/utils/organizationFilters.ts | 3 ++- .../src/context/ExtensionStateContext.tsx | 3 ++- .../src/utils/__tests__/validate.test.ts | 2 +- webview-ui/src/utils/validate.ts | 2 +- webview-ui/vite.config.ts | 1 - 23 files changed, 33 insertions(+), 47 deletions(-) create mode 100644 src/shared/cloud.ts delete mode 100644 webview-ui/src/__mocks__/vscode.ts diff --git a/knip.json b/knip.json index 7ca8cfad7b..15fea7e6ff 100644 --- a/knip.json +++ b/knip.json @@ -16,7 +16,7 @@ }, "webview-ui": { "entry": ["src/index.tsx"], - "project": ["src/**/*.{ts,tsx}"] + "project": ["src/**/*.{ts,tsx}", "../src/shared/*.ts"] }, "packages/{build,cloud,evals,ipc,telemetry,types}": { "project": ["src/**/*.ts"] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 300c757b23..cc7fd4a06e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -896,9 +896,6 @@ importers: '@radix-ui/react-tooltip': specifier: ^1.1.8 version: 1.2.6(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@roo-code/cloud': - specifier: ^0.13.0 - version: 0.13.0 '@roo-code/types': specifier: workspace:^ version: link:../packages/types diff --git a/scripts/link-packages.js b/scripts/link-packages.js index 1673fd5dac..6d8b33f6de 100755 --- a/scripts/link-packages.js +++ b/scripts/link-packages.js @@ -14,13 +14,6 @@ const config = { npmPath: "npm", watchCommand: "pnpm build:development:watch", }, - { - name: "@roo-code/cloud", - sourcePath: "../Roo-Code-Cloud/packages/sdk", - targetPath: "webview-ui/node_modules/@roo-code/cloud", - npmPath: "npm", - watchCommand: "pnpm build:development:watch", - }, ], } diff --git a/src/shared/cloud.ts b/src/shared/cloud.ts new file mode 100644 index 0000000000..9adf9294a0 --- /dev/null +++ b/src/shared/cloud.ts @@ -0,0 +1,8 @@ +import { CloudUserInfo, OrganizationAllowList, ShareVisibility } from "@roo-code/cloud" + +export type { CloudUserInfo, OrganizationAllowList, ShareVisibility } + +export const ORGANIZATION_ALLOW_ALL: OrganizationAllowList = { + allowAll: true, + providers: {}, +} as const diff --git a/webview-ui/package.json b/webview-ui/package.json index e37f75a27c..681aca126d 100644 --- a/webview-ui/package.json +++ b/webview-ui/package.json @@ -29,7 +29,6 @@ "@radix-ui/react-slider": "^1.2.3", "@radix-ui/react-slot": "^1.1.2", "@radix-ui/react-tooltip": "^1.1.8", - "@roo-code/cloud": "^0.13.0", "@roo-code/types": "workspace:^", "@tailwindcss/vite": "^4.0.0", "@tanstack/react-query": "^5.68.0", diff --git a/webview-ui/src/__mocks__/vscode.ts b/webview-ui/src/__mocks__/vscode.ts deleted file mode 100644 index 252b20e08c..0000000000 --- a/webview-ui/src/__mocks__/vscode.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Minimal mock for the vscode module. - * Used in tests to prevent module resolution errors. - * The actual vscode API is only available in VS Code extension contexts. - */ - -export const window = { - showInformationMessage: vi.fn(), - showErrorMessage: vi.fn(), -} - -export const env = { - openExternal: vi.fn(), -} - -export const Uri = { - parse: vi.fn((uri: string) => ({ toString: () => uri })), -} diff --git a/webview-ui/src/components/account/AccountView.tsx b/webview-ui/src/components/account/AccountView.tsx index 86239b1593..2e75b2d1c6 100644 --- a/webview-ui/src/components/account/AccountView.tsx +++ b/webview-ui/src/components/account/AccountView.tsx @@ -2,7 +2,8 @@ import { useEffect, useRef } from "react" import { VSCodeButton } from "@vscode/webview-ui-toolkit/react" import { TelemetryEventName } from "@roo-code/types" -import type { CloudUserInfo } from "@roo-code/cloud" + +import type { CloudUserInfo } from "@roo/cloud" import { useAppTranslation } from "@src/i18n/TranslationContext" import { useExtensionState } from "@src/context/ExtensionStateContext" diff --git a/webview-ui/src/components/chat/ShareButton.tsx b/webview-ui/src/components/chat/ShareButton.tsx index ae8e1d99b7..4a0559fec7 100644 --- a/webview-ui/src/components/chat/ShareButton.tsx +++ b/webview-ui/src/components/chat/ShareButton.tsx @@ -3,7 +3,8 @@ import { useTranslation } from "react-i18next" import { SquareArrowOutUpRightIcon } from "lucide-react" import { type HistoryItem, TelemetryEventName } from "@roo-code/types" -import type { ShareVisibility } from "@roo-code/cloud" + +import type { ShareVisibility } from "@roo/cloud" import { vscode } from "@/utils/vscode" import { telemetryClient } from "@/utils/TelemetryClient" diff --git a/webview-ui/src/components/settings/ApiConfigManager.tsx b/webview-ui/src/components/settings/ApiConfigManager.tsx index ecb2c39bdc..0d18f2a55b 100644 --- a/webview-ui/src/components/settings/ApiConfigManager.tsx +++ b/webview-ui/src/components/settings/ApiConfigManager.tsx @@ -3,7 +3,8 @@ import { VSCodeTextField } from "@vscode/webview-ui-toolkit/react" import { AlertTriangle } from "lucide-react" import type { ProviderSettingsEntry } from "@roo-code/types" -import type { OrganizationAllowList } from "@roo-code/cloud" + +import type { OrganizationAllowList } from "@roo/cloud" import { useAppTranslation } from "@/i18n/TranslationContext" import { diff --git a/webview-ui/src/components/settings/ModelPicker.tsx b/webview-ui/src/components/settings/ModelPicker.tsx index b8c89dd35f..2160d4b3c5 100644 --- a/webview-ui/src/components/settings/ModelPicker.tsx +++ b/webview-ui/src/components/settings/ModelPicker.tsx @@ -4,7 +4,8 @@ import { Trans } from "react-i18next" import { ChevronsUpDown, Check, X } from "lucide-react" import type { ProviderSettings, ModelInfo } from "@roo-code/types" -import type { OrganizationAllowList } from "@roo-code/cloud" + +import type { OrganizationAllowList } from "@roo/cloud" import { useAppTranslation } from "@src/i18n/TranslationContext" import { useSelectedModel } from "@/components/ui/hooks/useSelectedModel" diff --git a/webview-ui/src/components/settings/providers/Glama.tsx b/webview-ui/src/components/settings/providers/Glama.tsx index d9dbf895f3..bc3fb71cae 100644 --- a/webview-ui/src/components/settings/providers/Glama.tsx +++ b/webview-ui/src/components/settings/providers/Glama.tsx @@ -2,8 +2,8 @@ import { useCallback } from "react" import { VSCodeTextField } from "@vscode/webview-ui-toolkit/react" import { type ProviderSettings, glamaDefaultModelId } from "@roo-code/types" -import type { OrganizationAllowList } from "@roo-code/cloud" +import type { OrganizationAllowList } from "@roo/cloud" import type { RouterModels } from "@roo/api" import { useAppTranslation } from "@src/i18n/TranslationContext" diff --git a/webview-ui/src/components/settings/providers/IOIntelligence.tsx b/webview-ui/src/components/settings/providers/IOIntelligence.tsx index c6c530cb88..81e0d546f4 100644 --- a/webview-ui/src/components/settings/providers/IOIntelligence.tsx +++ b/webview-ui/src/components/settings/providers/IOIntelligence.tsx @@ -2,7 +2,8 @@ import { useCallback } from "react" import { VSCodeTextField } from "@vscode/webview-ui-toolkit/react" import { type ProviderSettings, ioIntelligenceDefaultModelId, ioIntelligenceModels } from "@roo-code/types" -import type { OrganizationAllowList } from "@roo-code/cloud" + +import type { OrganizationAllowList } from "@roo/cloud" import { useAppTranslation } from "@src/i18n/TranslationContext" import { VSCodeButtonLink } from "@src/components/common/VSCodeButtonLink" diff --git a/webview-ui/src/components/settings/providers/LiteLLM.tsx b/webview-ui/src/components/settings/providers/LiteLLM.tsx index 1ab938fa8f..0cb3245ea4 100644 --- a/webview-ui/src/components/settings/providers/LiteLLM.tsx +++ b/webview-ui/src/components/settings/providers/LiteLLM.tsx @@ -2,8 +2,8 @@ import { useCallback, useState, useEffect, useRef } from "react" import { VSCodeTextField, VSCodeCheckbox } from "@vscode/webview-ui-toolkit/react" import { type ProviderSettings, litellmDefaultModelId } from "@roo-code/types" -import type { OrganizationAllowList } from "@roo-code/cloud" +import type { OrganizationAllowList } from "@roo/cloud" import { RouterName } from "@roo/api" import { ExtensionMessage } from "@roo/ExtensionMessage" diff --git a/webview-ui/src/components/settings/providers/OpenAICompatible.tsx b/webview-ui/src/components/settings/providers/OpenAICompatible.tsx index c5e6742569..ee462296b5 100644 --- a/webview-ui/src/components/settings/providers/OpenAICompatible.tsx +++ b/webview-ui/src/components/settings/providers/OpenAICompatible.tsx @@ -10,8 +10,8 @@ import { azureOpenAiDefaultApiVersion, openAiModelInfoSaneDefaults, } from "@roo-code/types" -import { type OrganizationAllowList } from "@roo-code/cloud" +import type { OrganizationAllowList } from "@roo/cloud" import { ExtensionMessage } from "@roo/ExtensionMessage" import { useAppTranslation } from "@src/i18n/TranslationContext" diff --git a/webview-ui/src/components/settings/providers/OpenRouter.tsx b/webview-ui/src/components/settings/providers/OpenRouter.tsx index 4a920ee272..cf8b54d0cd 100644 --- a/webview-ui/src/components/settings/providers/OpenRouter.tsx +++ b/webview-ui/src/components/settings/providers/OpenRouter.tsx @@ -4,8 +4,8 @@ import { Checkbox } from "vscrui" import { VSCodeTextField } from "@vscode/webview-ui-toolkit/react" import { type ProviderSettings, openRouterDefaultModelId } from "@roo-code/types" -import type { OrganizationAllowList } from "@roo-code/cloud" +import type { OrganizationAllowList } from "@roo/cloud" import type { RouterModels } from "@roo/api" import { useAppTranslation } from "@src/i18n/TranslationContext" diff --git a/webview-ui/src/components/settings/providers/Requesty.tsx b/webview-ui/src/components/settings/providers/Requesty.tsx index 5bfe51a26e..7586b1e084 100644 --- a/webview-ui/src/components/settings/providers/Requesty.tsx +++ b/webview-ui/src/components/settings/providers/Requesty.tsx @@ -2,8 +2,8 @@ import { useCallback, useEffect, useState } from "react" import { VSCodeCheckbox, VSCodeTextField } from "@vscode/webview-ui-toolkit/react" import { type ProviderSettings, requestyDefaultModelId } from "@roo-code/types" -import type { OrganizationAllowList } from "@roo-code/cloud" +import type { OrganizationAllowList } from "@roo/cloud" import type { RouterModels } from "@roo/api" import { vscode } from "@src/utils/vscode" diff --git a/webview-ui/src/components/settings/providers/Unbound.tsx b/webview-ui/src/components/settings/providers/Unbound.tsx index d77ab5c430..a242ee4b3f 100644 --- a/webview-ui/src/components/settings/providers/Unbound.tsx +++ b/webview-ui/src/components/settings/providers/Unbound.tsx @@ -3,8 +3,8 @@ import { VSCodeTextField } from "@vscode/webview-ui-toolkit/react" import { useQueryClient } from "@tanstack/react-query" import { type ProviderSettings, unboundDefaultModelId } from "@roo-code/types" -import type { OrganizationAllowList } from "@roo-code/cloud" +import type { OrganizationAllowList } from "@roo/cloud" import type { RouterModels } from "@roo/api" import { useAppTranslation } from "@src/i18n/TranslationContext" diff --git a/webview-ui/src/components/settings/utils/__tests__/organizationFilters.test.ts b/webview-ui/src/components/settings/utils/__tests__/organizationFilters.test.ts index 17529e4c3f..530e5d4942 100644 --- a/webview-ui/src/components/settings/utils/__tests__/organizationFilters.test.ts +++ b/webview-ui/src/components/settings/utils/__tests__/organizationFilters.test.ts @@ -1,5 +1,6 @@ import type { ModelInfo } from "@roo-code/types" -import type { OrganizationAllowList } from "@roo-code/cloud" + +import type { OrganizationAllowList } from "@roo/cloud" import { filterProviders, filterModels } from "../organizationFilters" diff --git a/webview-ui/src/components/settings/utils/organizationFilters.ts b/webview-ui/src/components/settings/utils/organizationFilters.ts index b6e00b45d2..f6f129257a 100644 --- a/webview-ui/src/components/settings/utils/organizationFilters.ts +++ b/webview-ui/src/components/settings/utils/organizationFilters.ts @@ -1,5 +1,6 @@ import type { ProviderName, ModelInfo } from "@roo-code/types" -import type { OrganizationAllowList } from "@roo-code/cloud" + +import type { OrganizationAllowList } from "@roo/cloud" export const filterProviders = ( providers: Array<{ value: string; label: string }>, diff --git a/webview-ui/src/context/ExtensionStateContext.tsx b/webview-ui/src/context/ExtensionStateContext.tsx index 0413a82d24..ad35452079 100644 --- a/webview-ui/src/context/ExtensionStateContext.tsx +++ b/webview-ui/src/context/ExtensionStateContext.tsx @@ -7,7 +7,8 @@ import { type ModeConfig, type ExperimentId, } from "@roo-code/types" -import { type OrganizationAllowList, ORGANIZATION_ALLOW_ALL } from "@roo-code/cloud" + +import { type OrganizationAllowList, ORGANIZATION_ALLOW_ALL } from "@roo/cloud" import { ExtensionMessage, ExtensionState, MarketplaceInstalledMetadata, Command } from "@roo/ExtensionMessage" import { findLastIndex } from "@roo/array" diff --git a/webview-ui/src/utils/__tests__/validate.test.ts b/webview-ui/src/utils/__tests__/validate.test.ts index e76672df97..f14fb89200 100644 --- a/webview-ui/src/utils/__tests__/validate.test.ts +++ b/webview-ui/src/utils/__tests__/validate.test.ts @@ -1,6 +1,6 @@ import type { ProviderSettings } from "@roo-code/types" -import type { OrganizationAllowList } from "@roo-code/cloud" +import type { OrganizationAllowList } from "@roo/cloud" import { RouterModels } from "@roo/api" import { getModelValidationError, validateApiConfigurationExcludingModelErrors } from "../validate" diff --git a/webview-ui/src/utils/validate.ts b/webview-ui/src/utils/validate.ts index 002f42055b..e4c9ed483d 100644 --- a/webview-ui/src/utils/validate.ts +++ b/webview-ui/src/utils/validate.ts @@ -1,8 +1,8 @@ import i18next from "i18next" import type { ProviderSettings } from "@roo-code/types" -import type { OrganizationAllowList } from "@roo-code/cloud" +import type { OrganizationAllowList } from "@roo/cloud" import { isRouterName, RouterModels } from "@roo/api" export function validateApiConfiguration( diff --git a/webview-ui/vite.config.ts b/webview-ui/vite.config.ts index 08284d9935..0579344a22 100644 --- a/webview-ui/vite.config.ts +++ b/webview-ui/vite.config.ts @@ -100,7 +100,6 @@ export default defineConfig(({ mode }) => { // Ensure source maps are properly included in the build minify: mode === "production" ? "esbuild" : false, rollupOptions: { - external: ["vscode"], output: { entryFileNames: `assets/[name].js`, chunkFileNames: (chunkInfo) => { From 7ed833cb5d1ef3d647946365123a926edc42648c Mon Sep 17 00:00:00 2001 From: Daniel <57051444+daniel-lxs@users.noreply.github.com> Date: Wed, 13 Aug 2025 14:26:50 -0500 Subject: [PATCH 16/36] Fix: AWS Bedrock 1M context - Move anthropic_beta to additionalModelRequestFields (#7056) --- src/api/providers/__tests__/bedrock.spec.ts | 24 +++++++++++--------- src/api/providers/bedrock.ts | 25 +++++++++++++-------- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/api/providers/__tests__/bedrock.spec.ts b/src/api/providers/__tests__/bedrock.spec.ts index 40daa2fffa..8df495ca9f 100644 --- a/src/api/providers/__tests__/bedrock.spec.ts +++ b/src/api/providers/__tests__/bedrock.spec.ts @@ -635,9 +635,11 @@ describe("AwsBedrockHandler", () => { expect(mockConverseStreamCommand).toHaveBeenCalled() const commandArg = mockConverseStreamCommand.mock.calls[0][0] as any - // Should include anthropic_beta parameter but NOT anthropic_version (only for thinking) - expect(commandArg.anthropic_beta).toEqual(["context-1m-2025-08-07"]) - expect(commandArg.anthropic_version).toBeUndefined() + // Should include anthropic_beta in additionalModelRequestFields + expect(commandArg.additionalModelRequestFields).toBeDefined() + expect(commandArg.additionalModelRequestFields.anthropic_beta).toEqual(["context-1m-2025-08-07"]) + // Should not include anthropic_version since thinking is not enabled + expect(commandArg.additionalModelRequestFields.anthropic_version).toBeUndefined() }) it("should not include anthropic_beta parameter when 1M context is disabled", async () => { @@ -663,8 +665,8 @@ describe("AwsBedrockHandler", () => { expect(mockConverseStreamCommand).toHaveBeenCalled() const commandArg = mockConverseStreamCommand.mock.calls[0][0] as any - // Should not include anthropic_beta parameter - expect(commandArg.anthropic_beta).toBeUndefined() + // Should not include anthropic_beta in additionalModelRequestFields + expect(commandArg.additionalModelRequestFields).toBeUndefined() }) it("should not include anthropic_beta parameter for non-Claude Sonnet 4 models", async () => { @@ -690,8 +692,8 @@ describe("AwsBedrockHandler", () => { expect(mockConverseStreamCommand).toHaveBeenCalled() const commandArg = mockConverseStreamCommand.mock.calls[0][0] as any - // Should not include anthropic_beta parameter for non-Sonnet 4 models - expect(commandArg.anthropic_beta).toBeUndefined() + // Should not include anthropic_beta for non-Sonnet 4 models + expect(commandArg.additionalModelRequestFields).toBeUndefined() }) it("should enable 1M context window with cross-region inference for Claude Sonnet 4", () => { @@ -738,9 +740,11 @@ describe("AwsBedrockHandler", () => { mockConverseStreamCommand.mock.calls.length - 1 ][0] as any - // Should include anthropic_beta parameter but NOT anthropic_version (only for thinking) - expect(commandArg.anthropic_beta).toEqual(["context-1m-2025-08-07"]) - expect(commandArg.anthropic_version).toBeUndefined() + // Should include anthropic_beta in additionalModelRequestFields + expect(commandArg.additionalModelRequestFields).toBeDefined() + expect(commandArg.additionalModelRequestFields.anthropic_beta).toEqual(["context-1m-2025-08-07"]) + // Should not include anthropic_version since thinking is not enabled + expect(commandArg.additionalModelRequestFields.anthropic_version).toBeUndefined() // Model ID should have cross-region prefix expect(commandArg.modelId).toBe(`us.${BEDROCK_CLAUDE_SONNET_4_MODEL_ID}`) }) diff --git a/src/api/providers/bedrock.ts b/src/api/providers/bedrock.ts index 5471f2a01f..c6a0b35df4 100644 --- a/src/api/providers/bedrock.ts +++ b/src/api/providers/bedrock.ts @@ -47,12 +47,14 @@ interface BedrockInferenceConfig { topP?: number } -// Define interface for Bedrock thinking configuration -interface BedrockThinkingConfig { - thinking: { +// Define interface for Bedrock additional model request fields +// This includes thinking configuration, 1M context beta, and other model-specific parameters +interface BedrockAdditionalModelFields { + thinking?: { type: "enabled" budget_tokens: number } + anthropic_beta?: string[] [key: string]: any // Add index signature to be compatible with DocumentType } @@ -63,8 +65,7 @@ interface BedrockPayload { system?: SystemContentBlock[] inferenceConfig: BedrockInferenceConfig anthropic_version?: string - anthropic_beta?: string[] - additionalModelRequestFields?: BedrockThinkingConfig + additionalModelRequestFields?: BedrockAdditionalModelFields } // Define specific types for content block events to avoid 'as any' usage @@ -341,7 +342,7 @@ export class AwsBedrockHandler extends BaseProvider implements SingleCompletionH conversationId, ) - let additionalModelRequestFields: BedrockThinkingConfig | undefined + let additionalModelRequestFields: BedrockAdditionalModelFields | undefined let thinkingEnabled = false // Determine if thinking should be enabled @@ -382,16 +383,22 @@ export class AwsBedrockHandler extends BaseProvider implements SingleCompletionH const baseModelId = this.parseBaseModelId(modelConfig.id) const is1MContextEnabled = baseModelId === BEDROCK_CLAUDE_SONNET_4_MODEL_ID && this.options.awsBedrock1MContext + // Add anthropic_beta for 1M context to additionalModelRequestFields + if (is1MContextEnabled) { + if (!additionalModelRequestFields) { + additionalModelRequestFields = {} as BedrockAdditionalModelFields + } + additionalModelRequestFields.anthropic_beta = ["context-1m-2025-08-07"] + } + const payload: BedrockPayload = { modelId: modelConfig.id, messages: formatted.messages, system: formatted.system, inferenceConfig, ...(additionalModelRequestFields && { additionalModelRequestFields }), - // Add anthropic_version when using thinking features + // Add anthropic_version at top level when using thinking features ...(thinkingEnabled && { anthropic_version: "bedrock-2023-05-31" }), - // Add anthropic_beta when 1M context is enabled - ...(is1MContextEnabled && { anthropic_beta: ["context-1m-2025-08-07"] }), } // Create AbortController with 10 minute timeout From 23afdfca03e9f99d7167450097b642e5bf885c77 Mon Sep 17 00:00:00 2001 From: "roomote[bot]" <219738659+roomote[bot]@users.noreply.github.com> Date: Wed, 13 Aug 2025 15:33:18 -0400 Subject: [PATCH 17/36] fix: only include verbosity parameter for models that support it (#7055) Co-authored-by: Roo Code --- .../providers/__tests__/openai-native.spec.ts | 62 +++++++++++++++++++ src/api/providers/openai-native.ts | 4 +- 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/src/api/providers/__tests__/openai-native.spec.ts b/src/api/providers/__tests__/openai-native.spec.ts index 1d76d387a9..0acdb6202e 100644 --- a/src/api/providers/__tests__/openai-native.spec.ts +++ b/src/api/providers/__tests__/openai-native.spec.ts @@ -258,6 +258,68 @@ describe("OpenAiNativeHandler", () => { }) }) + it("should not include verbosity parameter for models that don't support it", async () => { + // Test with gpt-4.1 which does NOT support verbosity + handler = new OpenAiNativeHandler({ + ...mockOptions, + apiModelId: "gpt-4.1", + verbosity: "high", // Set verbosity but it should be ignored + }) + + const stream = handler.createMessage(systemPrompt, messages) + const chunks: any[] = [] + for await (const chunk of stream) { + chunks.push(chunk) + } + + // Verify that verbosity is NOT included in the request + const callArgs = mockCreate.mock.calls[0][0] + expect(callArgs).not.toHaveProperty("verbosity") + expect(callArgs.model).toBe("gpt-4.1") + expect(callArgs.temperature).toBe(0) + expect(callArgs.stream).toBe(true) + }) + + it("should not include verbosity for gpt-4o models", async () => { + // Test with gpt-4o which does NOT support verbosity + handler = new OpenAiNativeHandler({ + ...mockOptions, + apiModelId: "gpt-4o", + verbosity: "medium", // Set verbosity but it should be ignored + }) + + const stream = handler.createMessage(systemPrompt, messages) + const chunks: any[] = [] + for await (const chunk of stream) { + chunks.push(chunk) + } + + // Verify that verbosity is NOT included in the request + const callArgs = mockCreate.mock.calls[0][0] + expect(callArgs).not.toHaveProperty("verbosity") + expect(callArgs.model).toBe("gpt-4o") + }) + + it("should not include verbosity for gpt-4.1-mini models", async () => { + // Test with gpt-4.1-mini which does NOT support verbosity + handler = new OpenAiNativeHandler({ + ...mockOptions, + apiModelId: "gpt-4.1-mini", + verbosity: "low", // Set verbosity but it should be ignored + }) + + const stream = handler.createMessage(systemPrompt, messages) + const chunks: any[] = [] + for await (const chunk of stream) { + chunks.push(chunk) + } + + // Verify that verbosity is NOT included in the request + const callArgs = mockCreate.mock.calls[0][0] + expect(callArgs).not.toHaveProperty("verbosity") + expect(callArgs.model).toBe("gpt-4.1-mini") + }) + it("should handle empty delta content", async () => { const mockStream = [ { choices: [{ delta: {} }], usage: null }, diff --git a/src/api/providers/openai-native.ts b/src/api/providers/openai-native.ts index 053af7f5e5..2ba8566963 100644 --- a/src/api/providers/openai-native.ts +++ b/src/api/providers/openai-native.ts @@ -194,8 +194,8 @@ export class OpenAiNativeHandler extends BaseProvider implements SingleCompletio ...(reasoning && reasoning), } - // Add verbosity if supported - if (verbosity) { + // Add verbosity only if the model supports it + if (verbosity && model.info.supportsVerbosity) { params.verbosity = verbosity } From 46085581d54b7041bd4e4d823ba724a4e3eb25f9 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Wed, 13 Aug 2025 15:42:13 -0400 Subject: [PATCH 18/36] Release v3.25.14 (#7060) --- .changeset/v3.25.14.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changeset/v3.25.14.md diff --git a/.changeset/v3.25.14.md b/.changeset/v3.25.14.md new file mode 100644 index 0000000000..48a95026f8 --- /dev/null +++ b/.changeset/v3.25.14.md @@ -0,0 +1,7 @@ +--- +"roo-cline": patch +--- + +- Fix: Only include verbosity parameter for models that support it (#7054 by @eastonmeth, PR by @app/roomote) +- Fix: AWS Bedrock 1M context - Move anthropic_beta to additionalModelRequestFields (thanks @daniel-lxs!) +- Fix: Make cancelling requests more responsive by reverting recent changes From ca6f261cce0f07c600c4a81e857c606eb0c578f0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 13 Aug 2025 16:09:47 -0400 Subject: [PATCH 19/36] Changeset version bump (#7061) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens --- .changeset/v3.25.14.md | 7 ------- CHANGELOG.md | 6 ++++++ src/package.json | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) delete mode 100644 .changeset/v3.25.14.md diff --git a/.changeset/v3.25.14.md b/.changeset/v3.25.14.md deleted file mode 100644 index 48a95026f8..0000000000 --- a/.changeset/v3.25.14.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"roo-cline": patch ---- - -- Fix: Only include verbosity parameter for models that support it (#7054 by @eastonmeth, PR by @app/roomote) -- Fix: AWS Bedrock 1M context - Move anthropic_beta to additionalModelRequestFields (thanks @daniel-lxs!) -- Fix: Make cancelling requests more responsive by reverting recent changes diff --git a/CHANGELOG.md b/CHANGELOG.md index 66fa384754..bce3038f7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Roo Code Changelog +## [3.25.14] - 2025-08-13 + +- Fix: Only include verbosity parameter for models that support it (#7054 by @eastonmeth, PR by @app/roomote) +- Fix: AWS Bedrock 1M context - Move anthropic_beta to additionalModelRequestFields (thanks @daniel-lxs!) +- Fix: Make cancelling requests more responsive by reverting recent changes + ## [3.25.13] - 2025-08-12 - Add Sonnet 1M context checkbox to Bedrock diff --git a/src/package.json b/src/package.json index dfe4231f01..9d694b2bbb 100644 --- a/src/package.json +++ b/src/package.json @@ -3,7 +3,7 @@ "displayName": "%extension.displayName%", "description": "%extension.description%", "publisher": "RooVeterinaryInc", - "version": "3.25.13", + "version": "3.25.14", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", From a203a90bb714e02240cf8f1ef6ed2d364af9815a Mon Sep 17 00:00:00 2001 From: Christiaan Arnoldus Date: Thu, 14 Aug 2025 03:07:05 +0200 Subject: [PATCH 20/36] Fix allowedMaxRequests and allowedMaxCost values not showing in the settings UI (#6925) --- webview-ui/src/components/settings/SettingsView.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index 630b59485d..987d245105 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -629,6 +629,8 @@ const SettingsView = forwardRef(({ onDone, t alwaysAllowUpdateTodoList={alwaysAllowUpdateTodoList} followupAutoApproveTimeoutMs={followupAutoApproveTimeoutMs} allowedCommands={allowedCommands} + allowedMaxRequests={allowedMaxRequests ?? undefined} + allowedMaxCost={allowedMaxCost ?? undefined} deniedCommands={deniedCommands} setCachedStateField={setCachedStateField} /> From dcbb7a673f8456ab8a470fdfa7e3b2632d51d3ff Mon Sep 17 00:00:00 2001 From: "roomote[bot]" <219738659+roomote[bot]@users.noreply.github.com> Date: Wed, 13 Aug 2025 21:21:32 -0400 Subject: [PATCH 21/36] fix: remove 500-message limit to prevent scrollbar jumping in long conversations (#7064) - Removed array slicing logic that limited messages to 500 - This eliminates array index shifting that caused Virtuoso to lose scroll position - Virtuoso is designed to efficiently handle large lists through virtualization - Fixes the scrollbar jumping issue reported in #7063 and #7052 Co-authored-by: Roo Code --- webview-ui/src/components/chat/ChatView.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 9b8c96dea1..64f761574a 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -897,11 +897,9 @@ const ChatViewComponent: React.ForwardRefRenderFunction textAreaRef.current?.focus()) const visibleMessages = useMemo(() => { - const currentMessageCount = modifiedMessages.length - const startIndex = Math.max(0, currentMessageCount - 500) - const recentMessages = modifiedMessages.slice(startIndex) - - const newVisibleMessages = recentMessages.filter((message: ClineMessage) => { + // Remove the 500-message limit to prevent array index shifting + // Virtuoso is designed to efficiently handle large lists through virtualization + const newVisibleMessages = modifiedMessages.filter((message: ClineMessage) => { if (everVisibleMessagesTsRef.current.has(message.ts)) { const alwaysHiddenOnceProcessedAsk: ClineAsk[] = [ "api_req_failed", From c56b95bc6097715e1cbb6d0dffe297021f010c83 Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Thu, 14 Aug 2025 00:14:17 -1000 Subject: [PATCH 22/36] Task metadata (#7092) --- package.json | 10 +- packages/types/.gitignore | 2 + packages/types/eslint.config.mjs | 18 +- .../{package.json => package.metadata.json} | 28 +- packages/types/package.json | 8 +- packages/types/scripts/publish-npm.cjs | 351 ++++++++++++++++++ packages/types/src/task.ts | 11 + packages/types/tsconfig.json | 2 +- pnpm-lock.yaml | 187 +++++++--- scripts/link-packages.js | 158 -------- scripts/link-packages.ts | 340 +++++++++++++++++ src/core/task/Task.ts | 19 +- src/core/webview/ClineProvider.ts | 51 +-- src/extension.ts | 8 +- src/package.json | 3 +- tsconfig.json | 8 + 16 files changed, 912 insertions(+), 292 deletions(-) create mode 100644 packages/types/.gitignore rename packages/types/npm/{package.json => package.metadata.json} (52%) create mode 100644 packages/types/scripts/publish-npm.cjs delete mode 100755 scripts/link-packages.js create mode 100644 scripts/link-packages.ts create mode 100644 tsconfig.json diff --git a/package.json b/package.json index c1ddc68223..cdc8a1abca 100644 --- a/package.json +++ b/package.json @@ -24,15 +24,20 @@ "knip": "knip --include files", "update-contributors": "node scripts/update-contributors.js", "evals": "dotenvx run -f packages/evals/.env.development packages/evals/.env.local -- docker compose -f packages/evals/docker-compose.yml --profile server --profile runner up --build --scale runner=0", - "link-workspace-packages": "node scripts/link-packages.js", - "unlink-workspace-packages": "node scripts/link-packages.js --unlink" + "npm:publish:types": "pnpm --filter @roo-code/types npm:publish", + "link-workspace-packages": "tsx scripts/link-packages.ts", + "unlink-workspace-packages": "tsx scripts/link-packages.ts --unlink" }, "devDependencies": { "@changesets/cli": "^2.27.10", "@dotenvx/dotenvx": "^1.34.0", + "@roo-code/config-typescript": "workspace:^", + "@types/glob": "^9.0.0", + "@types/node": "^24.1.0", "@vscode/vsce": "3.3.2", "esbuild": "^0.25.0", "eslint": "^9.27.0", + "glob": "^11.0.3", "husky": "^9.1.7", "knip": "^5.44.4", "lint-staged": "^16.0.0", @@ -41,6 +46,7 @@ "ovsx": "0.10.4", "prettier": "^3.4.2", "rimraf": "^6.0.1", + "tsx": "^4.19.3", "turbo": "^2.5.3", "typescript": "^5.4.5" }, diff --git a/packages/types/.gitignore b/packages/types/.gitignore new file mode 100644 index 0000000000..ddf5f39ede --- /dev/null +++ b/packages/types/.gitignore @@ -0,0 +1,2 @@ +dist +npm/package.json diff --git a/packages/types/eslint.config.mjs b/packages/types/eslint.config.mjs index 694bf73664..c603a68f12 100644 --- a/packages/types/eslint.config.mjs +++ b/packages/types/eslint.config.mjs @@ -1,4 +1,20 @@ import { config } from "@roo-code/config-eslint/base" +import globals from "globals" /** @type {import("eslint").Linter.Config} */ -export default [...config] +export default [ + ...config, + { + files: ["**/*.cjs"], + languageOptions: { + globals: { + ...globals.node, + ...globals.commonjs, + }, + sourceType: "commonjs", + }, + rules: { + "@typescript-eslint/no-require-imports": "off", + }, + }, +] diff --git a/packages/types/npm/package.json b/packages/types/npm/package.metadata.json similarity index 52% rename from packages/types/npm/package.json rename to packages/types/npm/package.metadata.json index b2be718cf6..391d2acbaa 100644 --- a/packages/types/npm/package.json +++ b/packages/types/npm/package.metadata.json @@ -1,6 +1,6 @@ { "name": "@roo-code/types", - "version": "1.46.0", + "version": "1.48.0", "description": "TypeScript type definitions for Roo Code.", "publishConfig": { "access": "public", @@ -17,28 +17,6 @@ "url": "https://github.com/RooCodeInc/Roo-Code/issues" }, "homepage": "https://roocode.com", - "keywords": [ - "roo", - "roo-code", - "ai" - ], - "main": "./dist/index.cjs", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", - "exports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js", - "require": { - "types": "./dist/index.d.cts", - "default": "./dist/index.cjs" - } - } - }, - "files": [ - "dist" - ], - "dependencies": { - "zod": "^3.25.61" - } + "keywords": ["roo", "roo-code", "ai"], + "files": ["dist"] } diff --git a/packages/types/package.json b/packages/types/package.json index feda97f289..44fde30b59 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -18,8 +18,9 @@ "check-types": "tsc --noEmit", "test": "vitest run", "build": "tsup", - "npm:publish": "cd npm && npm version minor && cd - && tsup --outDir npm/dist && cd npm && npm publish", - "clean": "rimraf dist npm/dist .turbo" + "build:watch": "tsup --watch --outDir npm/dist --onSuccess 'echo ✅ Types rebuilt to npm/dist'", + "npm:publish": "node scripts/publish-npm.cjs", + "clean": "rimraf dist .turbo" }, "dependencies": { "zod": "^3.25.61" @@ -27,7 +28,8 @@ "devDependencies": { "@roo-code/config-eslint": "workspace:^", "@roo-code/config-typescript": "workspace:^", - "@types/node": "20.x", + "@types/node": "^24.1.0", + "globals": "^16.3.0", "tsup": "^8.3.5", "vitest": "^3.2.3" } diff --git a/packages/types/scripts/publish-npm.cjs b/packages/types/scripts/publish-npm.cjs new file mode 100644 index 0000000000..a82308fdfa --- /dev/null +++ b/packages/types/scripts/publish-npm.cjs @@ -0,0 +1,351 @@ +/* eslint-env node */ + +const fs = require("fs") +const path = require("path") +const { execSync } = require("child_process") +const readline = require("readline") + +const PACKAGE_NAME = "@roo-code/types" +const BRANCH_NAME = "roo-code-types-v" + +const rootDir = path.join(__dirname, "..") +const npmDir = path.join(rootDir, "npm") +const monorepoPackagePath = path.join(rootDir, "package.json") +const npmMetadataPath = path.join(npmDir, "package.metadata.json") +const npmPackagePath = path.join(npmDir, "package.json") + +const args = process.argv.slice(2) +const publishOnly = args.includes("--publish-only") + +async function confirmPublish() { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + }) + + return new Promise((resolve) => { + rl.question("\n⚠️ Are you sure you want to publish to npm? (y/n): ", (answer) => { + rl.close() + resolve(answer.toLowerCase() === "y") + }) + }) +} + +function updatePackageVersion(filePath, version) { + try { + const packageContent = JSON.parse(fs.readFileSync(filePath, "utf8")) + const oldVersion = packageContent.version + packageContent.version = version + fs.writeFileSync(filePath, JSON.stringify(packageContent, null, 2) + "\n") + + try { + execSync(`npx prettier --write "${filePath}"`, { stdio: "pipe" }) + console.log(`✨ Formatted ${path.basename(filePath)} with prettier`) + } catch (prettierError) { + console.warn(`⚠️ Could not format with prettier:`, prettierError.message) + } + + const fileName = path.basename(filePath) + console.log(`✅ Updated ${fileName} version: ${oldVersion} → ${version}`) + return oldVersion + } catch (error) { + throw new Error(`Failed to update version in ${path.basename(filePath)}: ${error.message}`) + } +} + +function syncVersionToMetadata(version) { + console.log(" 📝 Syncing version to package.metadata.json...") + updatePackageVersion(npmMetadataPath, version) +} + +function commitVersionChanges(version) { + try { + console.log(" 📝 Committing version changes to git...") + + try { + const status = execSync("git status --porcelain", { encoding: "utf8" }) + const relevantChanges = status.split("\n").filter((line) => line.includes("packages/sdk/npm/package")) + + if (relevantChanges.length === 0) { + console.log(" ⚠️ No version changes to commit") + return + } + } catch (error) { + console.warn(" ⚠️ Could not check git status:", error.message) + } + + execSync("git add .", { stdio: "pipe" }) + const commitMessage = `chore: bump version to v${version}` + execSync(`git commit -m "${commitMessage}"`, { stdio: "pipe" }) + console.log(` ✅ Committed: ${commitMessage}`) + } catch (error) { + console.warn(" ⚠️ Could not commit version changes:", error.message) + console.log(" You may need to commit these changes manually.") + } +} + +function checkGitHubCLI() { + try { + execSync("gh --version", { stdio: "pipe" }) + execSync("gh auth status", { stdio: "pipe" }) + return true + } catch (_error) { + return false + } +} + +function createPullRequest(branchName, baseBranch, version) { + try { + console.log(` 🔄 Creating pull request...`) + + if (!checkGitHubCLI()) { + console.warn(" ⚠️ GitHub CLI not found or not authenticated") + console.log(" Install gh CLI and run: gh auth login") + console.log(" Then manually create PR with: gh pr create") + return + } + + const title = `Release: v${version}` + const body = `## 🚀 Release v${version} + +This PR contains the version bump for the SDK release v${version}. + +### Changes +- Bumped version from previous to v${version} +- Published to npm as ${PACKAGE_NAME}@${version} + +### Checklist +- [x] Version bumped +- [x] Package published to npm +- [ ] Changelog updated (if applicable) +- [ ] Documentation updated (if applicable) + +--- +*This PR was automatically created by the npm publish script.*` + + try { + // Create the pull request + const prUrl = execSync( + `gh pr create --base "${baseBranch}" --head "${branchName}" --title "${title}" --body "${body}"`, + { encoding: "utf8", stdio: "pipe" }, + ).trim() + + console.log(` ✅ Pull request created: ${prUrl}`) + } catch (error) { + if (error.message.includes("already exists")) { + console.log(" ℹ️ Pull request already exists for this branch") + } else { + throw error + } + } + } catch (error) { + console.error(" ❌ Failed to create pull request:", error.message) + console.log(" You can manually create a PR with:") + console.log(` gh pr create --base "${baseBranch}" --head "${branchName}"`) + } +} + +function createVersionBranchAndCommit(version) { + try { + const branchName = `${BRANCH_NAME}${version}` + console.log(` 🌿 Creating version branch: ${branchName}...`) + + let currentBranch + + try { + currentBranch = execSync("git rev-parse --abbrev-ref HEAD", { + encoding: "utf8", + }).trim() + } catch (_error) { + console.warn(" ⚠️ Could not determine current branch") + currentBranch = "main" + } + + execSync(`git checkout -b ${branchName}`, { stdio: "pipe" }) + console.log(` ✅ Created branch: ${branchName}`) + commitVersionChanges(version) + execSync(`git push --set-upstream origin ${branchName}`, { stdio: "pipe" }) + console.log(` ✅ Pushed branch to origin with upstream tracking`) + createPullRequest(branchName, currentBranch, version) + + if (currentBranch) { + execSync(`git checkout ${currentBranch}`, { stdio: "pipe" }) + console.log(` ✅ Returned to branch: ${currentBranch}`) + } + + console.log(` 🎯 Version branch created with commits: ${branchName}`) + } catch (error) { + console.error(" ❌ Failed to create version branch:", error.message) + console.log(" You may need to create the branch manually.") + } +} + +function generateNpmPackage() { + try { + console.log(" 📖 Reading monorepo package.json...") + + const monorepoPackageContent = fs.readFileSync(monorepoPackagePath, "utf8") + const monorepoPackage = JSON.parse(monorepoPackageContent) + + console.log(" 📖 Reading npm package metadata...") + + const npmMetadataContent = fs.readFileSync(npmMetadataPath, "utf8") + const npmMetadata = JSON.parse(npmMetadataContent) + + console.log(" 🔨 Generating npm package.json...") + + const npmPackage = { + ...npmMetadata, + dependencies: monorepoPackage.dependencies || {}, + main: "./dist/index.cjs", + module: "./dist/index.js", + types: "./dist/index.d.ts", + exports: { + ".": { + types: "./dist/index.d.ts", + import: "./dist/index.js", + require: { + types: "./dist/index.d.cts", + default: "./dist/index.cjs", + }, + }, + }, + files: ["dist"], + } + + const outputContent = JSON.stringify(npmPackage, null, 2) + "\n" + fs.writeFileSync(npmPackagePath, outputContent) + + console.log(" ✅ npm/package.json generated successfully") + console.log(` 📦 Package name: ${npmPackage.name}`) + console.log(` 📌 Version: ${npmPackage.version}`) + console.log(` 📚 Dependencies: ${Object.keys(npmPackage.dependencies).length}`) + } catch (error) { + throw new Error(`Failed to generate npm package.json: ${error.message}`) + } +} + +async function publish() { + try { + console.log("\n🚀 NPM PUBLISH WORKFLOW") + if (publishOnly) { + console.log("📌 Mode: Publish only (no git operations)") + } + console.log("=".repeat(60)) + + console.log("\n📦 Step 1: Generating npm package.json...") + generateNpmPackage() + + const npmPackage = JSON.parse(fs.readFileSync(npmPackagePath, "utf8")) + const originalVersion = npmPackage.version // Save original version + console.log(`\n📌 Current version: ${npmPackage.version}`) + console.log(`📦 Package name: ${npmPackage.name}`) + + console.log("\n📈 Step 2: Bumping version (minor)...") + + try { + execSync("npm version minor --no-git-tag-version", { + cwd: npmDir, + stdio: "inherit", + }) + } catch (error) { + console.error("❌ Failed to bump version:", error.message) + throw error + } + + const updatedPackage = JSON.parse(fs.readFileSync(npmPackagePath, "utf8")) + console.log(`✅ New version: ${updatedPackage.version}`) + + console.log("\n🔨 Step 3: Building production bundle...") + console.log(" This may take a moment...") + + try { + execSync("NODE_ENV=production pnpm tsup --outDir npm/dist", { + cwd: rootDir, + stdio: "inherit", + }) + + console.log("✅ Production build complete") + } catch (error) { + console.error("❌ Build failed:", error.message) + throw error + } + + console.log("\n" + "=".repeat(60)) + console.log("📋 PUBLISH SUMMARY:") + console.log(` Package: ${updatedPackage.name}`) + console.log(` Version: ${updatedPackage.version}`) + console.log(` Registry: ${updatedPackage.publishConfig?.registry || "https://registry.npmjs.org/"}`) + console.log(` Access: ${updatedPackage.publishConfig?.access || "public"}`) + console.log("=".repeat(60)) + + const confirmed = await confirmPublish() + + if (!confirmed) { + console.log("\n❌ Publishing cancelled by user") + console.log("🔙 Reverting version change...") + + try { + updatePackageVersion(npmPackagePath, originalVersion) + } catch (revertError) { + console.error("⚠️ Could not revert version:", revertError.message) + console.log(` You may need to manually change version back to ${originalVersion}`) + } + + process.exit(0) + } + + console.log("\n💾 Step 4: Syncing version to metadata...") + syncVersionToMetadata(updatedPackage.version) + + console.log("\n🚀 Step 5: Publishing to npm...") + + try { + execSync("npm publish", { + cwd: npmDir, + stdio: "inherit", + }) + } catch (error) { + console.error("❌ Publish failed:", error.message) + console.error("💡 The package was built but not published.") + console.error(" You can try publishing manually from the npm directory.") + + throw error + } + + if (!publishOnly) { + console.log("\n🌿 Step 6: Creating version branch, committing, and opening PR...") + createVersionBranchAndCommit(updatedPackage.version) + } else { + console.log("\n📝 Step 6: Skipping version branch creation (--publish-only mode)") + } + + console.log("\n" + "=".repeat(60)) + console.log("✅ Successfully published to npm!") + console.log(`🎉 ${updatedPackage.name}@${updatedPackage.version} is now live`) + console.log(`📦 View at: https://www.npmjs.com/package/${updatedPackage.name}`) + + if (!publishOnly) { + console.log(`🌿 Version branch: ${BRANCH_NAME}${updatedPackage.version}`) + } + + console.log("=".repeat(60) + "\n") + } catch (error) { + console.error("\n❌ Error during publish process:", error.message) + console.error("\n💡 Troubleshooting tips:") + console.error(" 1. Ensure you are logged in to npm: npm whoami") + console.error(" 2. Check your npm permissions for this package") + console.error(" 3. Verify the package name is not already taken") + console.error(" 4. Make sure all dependencies are installed: pnpm install") + process.exit(1) + } +} + +async function main() { + await publish() +} + +main().catch((error) => { + console.error("Unexpected error:", error) + process.exit(1) +}) diff --git a/packages/types/src/task.ts b/packages/types/src/task.ts index a4a2f5f0fc..4fe74c6cd4 100644 --- a/packages/types/src/task.ts +++ b/packages/types/src/task.ts @@ -1,3 +1,5 @@ +import { z } from "zod" + import { RooCodeEventName } from "./events.js" import { type ClineMessage, type BlockingAsk, type TokenUsage } from "./message.js" import { type ToolUsage, type ToolName } from "./tool.js" @@ -61,10 +63,19 @@ export type TaskProviderEvents = { * TaskLike */ +export const taskMetadataSchema = z.object({ + taskId: z.string(), + task: z.string().optional(), + images: z.array(z.string()).optional(), +}) + +export type TaskMetadata = z.infer + export interface TaskLike { readonly taskId: string readonly rootTask?: TaskLike readonly blockingAsk?: BlockingAsk + readonly metadata: TaskMetadata on(event: K, listener: (...args: TaskEvents[K]) => void | Promise): this off(event: K, listener: (...args: TaskEvents[K]) => void | Promise): this diff --git a/packages/types/tsconfig.json b/packages/types/tsconfig.json index a66434e570..2a73ee92bb 100644 --- a/packages/types/tsconfig.json +++ b/packages/types/tsconfig.json @@ -4,6 +4,6 @@ "types": ["vitest/globals"], "outDir": "dist" }, - "include": ["src"], + "include": ["src", "scripts", "*.config.ts"], "exclude": ["node_modules"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cc7fd4a06e..43b0cf2951 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,6 +22,15 @@ importers: '@dotenvx/dotenvx': specifier: ^1.34.0 version: 1.44.2 + '@roo-code/config-typescript': + specifier: workspace:^ + version: link:packages/config-typescript + '@types/glob': + specifier: ^9.0.0 + version: 9.0.0 + '@types/node': + specifier: ^24.1.0 + version: 24.2.1 '@vscode/vsce': specifier: 3.3.2 version: 3.3.2 @@ -31,12 +40,15 @@ importers: eslint: specifier: ^9.27.0 version: 9.28.0(jiti@2.4.2) + glob: + specifier: ^11.0.3 + version: 11.0.3 husky: specifier: ^9.1.7 version: 9.1.7 knip: specifier: ^5.44.4 - version: 5.60.2(@types/node@22.15.29)(typescript@5.8.3) + version: 5.60.2(@types/node@24.2.1)(typescript@5.8.3) lint-staged: specifier: ^16.0.0 version: 16.1.2 @@ -55,6 +67,9 @@ importers: rimraf: specifier: ^6.0.1 version: 6.0.1 + tsx: + specifier: ^4.19.3 + version: 4.19.4 turbo: specifier: ^2.5.3 version: 2.5.4 @@ -235,7 +250,7 @@ importers: version: 4.1.6 vitest: specifier: ^3.2.3 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.15.29)(@vitest/ui@3.2.4)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/ui@3.2.4)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) apps/web-roo-code: dependencies: @@ -521,14 +536,17 @@ importers: specifier: workspace:^ version: link:../config-typescript '@types/node': - specifier: 20.x - version: 20.17.57 + specifier: ^24.1.0 + version: 24.2.1 + globals: + specifier: ^16.3.0 + version: 16.3.0 tsup: specifier: ^8.3.5 version: 8.5.0(jiti@2.4.2)(postcss@8.5.4)(tsx@4.19.4)(typescript@5.8.3)(yaml@2.8.0) vitest: specifier: ^3.2.3 - version: 3.2.4(@types/debug@4.1.12)(@types/node@20.17.57)(@vitest/ui@3.2.4)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/ui@3.2.4)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) src: dependencies: @@ -563,8 +581,8 @@ importers: specifier: ^1.14.0 version: 1.14.0(typescript@5.8.3) '@roo-code/cloud': - specifier: ^0.13.0 - version: 0.13.0 + specifier: ^0.14.0 + version: 0.14.0 '@roo-code/ipc': specifier: workspace:^ version: link:../packages/ipc @@ -703,6 +721,9 @@ importers: simple-git: specifier: ^3.27.0 version: 3.27.0 + socket.io-client: + specifier: ^4.8.1 + version: 4.8.1 sound-play: specifier: ^1.1.0 version: 1.1.0 @@ -1936,6 +1957,14 @@ packages: '@ioredis/commands@1.3.0': resolution: {integrity: sha512-M/T6Zewn7sDaBQEqIZ8Rb+i9y8qfGmq+5SDFSf9sA2lUZTmdDLVdOiQaeDp+Q4wElZ9HG1GAX5KhDaidp6LQsQ==} + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -3065,11 +3094,11 @@ packages: cpu: [x64] os: [win32] - '@roo-code/cloud@0.13.0': - resolution: {integrity: sha512-pIrfMpuHSk3LPMG3SLmsfr/IYvL5x0k0iUXQ51dgZ2fP7TlzWg2erxclNl79O7pRMDYFnA/8YoQTAnv1N8VXnQ==} + '@roo-code/cloud@0.14.0': + resolution: {integrity: sha512-EKFw7sLSJcOpXQDjCMFL4EnE7OH3RhO00joteaysNYNpNe+js6kMFrBZY61rj1tZAXV/943RWeQptG4sSAfPFQ==} - '@roo-code/types@1.45.0': - resolution: {integrity: sha512-+rFJ9HcukDl59X9pI6lgZDtJHtKqHg6BIdS4LG759X+5MV7wvlNb4S+bQ3qKqIlBsQhH17bzIJCfsWZwjwxecw==} + '@roo-code/types@1.48.0': + resolution: {integrity: sha512-DJkA/310sLcs4vM4YLhJhc5A1JFYmdcOt+hRQMUPq+wF02yW9rc7ZZzHNDOOUZL+kk5naUd2nBRxLiJoh6o0Ng==} '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} @@ -3801,6 +3830,10 @@ packages: '@types/glob@8.1.0': resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + '@types/glob@9.0.0': + resolution: {integrity: sha512-00UxlRaIUvYm4R4W9WYkN8/J+kV8fmOQ7okeH6YFtGWFMt3odD45tpG5yA5wnL7HE6lLgjaTW5n14ju2hl2NNA==} + deprecated: This is a stub types definition. glob provides its own type definitions, so you do not need this installed. + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -3871,14 +3904,8 @@ packages: '@types/node@20.17.57': resolution: {integrity: sha512-f3T4y6VU4fVQDKVqJV4Uppy8c1p/sVvS3peyqxyWnzkqXFJLRU7Y1Bl7rMS1Qe9z0v4M6McY0Fp9yBsgHJUsWQ==} - '@types/node@20.19.1': - resolution: {integrity: sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA==} - - '@types/node@20.19.9': - resolution: {integrity: sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==} - - '@types/node@22.15.29': - resolution: {integrity: sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ==} + '@types/node@24.2.1': + resolution: {integrity: sha512-DRh5K+ka5eJic8CjH7td8QpYEV6Zo10gfRkjHCO3weqZHWDtAaSTFtl4+VMqOJ4N5jcuhZ9/l+yy8rVgw7BQeQ==} '@types/prop-types@15.7.14': resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} @@ -6000,6 +6027,11 @@ packages: engines: {node: 20 || >=22} hasBin: true + glob@11.0.3: + resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} + engines: {node: 20 || >=22} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -6020,6 +6052,10 @@ packages: resolution: {integrity: sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==} engines: {node: '>=18'} + globals@16.3.0: + resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} + engines: {node: '>=18'} + globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -6571,6 +6607,10 @@ packages: resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} engines: {node: 20 || >=22} + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} + jest-diff@29.7.0: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7333,6 +7373,10 @@ packages: resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} engines: {node: 20 || >=22} + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -8675,6 +8719,7 @@ packages: source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions space-separated-tokens@1.1.5: resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} @@ -9249,8 +9294,8 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.10.0: + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} undici@6.21.3: resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==} @@ -11133,6 +11178,12 @@ snapshots: '@ioredis/commands@1.3.0': {} + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -11161,7 +11212,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.17.57 + '@types/node': 24.2.1 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -12234,9 +12285,9 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.40.2': optional: true - '@roo-code/cloud@0.13.0': + '@roo-code/cloud@0.14.0': dependencies: - '@roo-code/types': 1.45.0 + '@roo-code/types': 1.48.0 ioredis: 5.6.1 p-wait-for: 5.0.2 socket.io-client: 4.8.1 @@ -12246,7 +12297,7 @@ snapshots: - supports-color - utf-8-validate - '@roo-code/types@1.45.0': + '@roo-code/types@1.48.0': dependencies: zod: 3.25.76 @@ -13159,7 +13210,11 @@ snapshots: '@types/glob@8.1.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.17.57 + '@types/node': 24.2.1 + + '@types/glob@9.0.0': + dependencies: + glob: 11.0.3 '@types/hast@3.0.4': dependencies: @@ -13212,12 +13267,12 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 20.17.57 + '@types/node': 24.2.1 form-data: 4.0.4 '@types/node-ipc@9.2.3': dependencies: - '@types/node': 20.17.57 + '@types/node': 24.2.1 '@types/node@12.20.55': {} @@ -13235,18 +13290,9 @@ snapshots: dependencies: undici-types: 6.19.8 - '@types/node@20.19.1': + '@types/node@24.2.1': dependencies: - undici-types: 6.21.0 - - '@types/node@20.19.9': - dependencies: - undici-types: 6.21.0 - optional: true - - '@types/node@22.15.29': - dependencies: - undici-types: 6.21.0 + undici-types: 7.10.0 '@types/prop-types@15.7.14': {} @@ -13277,11 +13323,11 @@ snapshots: '@types/stream-chain@2.1.0': dependencies: - '@types/node': 20.19.1 + '@types/node': 24.2.1 '@types/stream-json@1.7.8': dependencies: - '@types/node': 20.19.1 + '@types/node': 24.2.1 '@types/stream-chain': 2.1.0 '@types/string-similarity@4.0.2': {} @@ -13307,7 +13353,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 20.19.9 + '@types/node': 24.2.1 optional: true '@types/yargs-parser@21.0.3': {} @@ -13318,7 +13364,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 20.17.50 + '@types/node': 24.2.1 optional: true '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': @@ -13443,13 +13489,13 @@ snapshots: optionalDependencies: vite: 6.3.5(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) - '@vitest/mocker@3.2.4(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(vite@6.3.5(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.3.5(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -13480,7 +13526,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.14 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.15.29)(@vitest/ui@3.2.4)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/ui@3.2.4)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) '@vitest/utils@3.2.4': dependencies: @@ -13561,7 +13607,7 @@ snapshots: cockatiel: 3.2.1 commander: 12.1.0 form-data: 4.0.4 - glob: 11.0.2 + glob: 11.0.3 hosted-git-info: 4.1.0 jsonc-parser: 3.3.1 leven: 3.1.0 @@ -15691,6 +15737,15 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 2.0.0 + glob@11.0.3: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.0.3 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -15708,6 +15763,8 @@ snapshots: globals@16.1.0: {} + globals@16.3.0: {} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -16297,6 +16354,10 @@ snapshots: dependencies: '@isaacs/cliui': 8.0.2 + jackspeak@4.1.1: + dependencies: + '@isaacs/cliui': 8.0.2 + jest-diff@29.7.0: dependencies: chalk: 4.1.2 @@ -16328,7 +16389,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.17.57 + '@types/node': 24.2.1 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -16488,10 +16549,10 @@ snapshots: kind-of@6.0.3: {} - knip@5.60.2(@types/node@22.15.29)(typescript@5.8.3): + knip@5.60.2(@types/node@24.2.1)(typescript@5.8.3): dependencies: '@nodelib/fs.walk': 1.2.8 - '@types/node': 22.15.29 + '@types/node': 24.2.1 fast-glob: 3.3.3 formatly: 0.2.4 jiti: 2.4.2 @@ -17322,6 +17383,10 @@ snapshots: dependencies: brace-expansion: 4.0.1 + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + minimatch@3.1.2: dependencies: brace-expansion: 4.0.1 @@ -18544,7 +18609,7 @@ snapshots: rimraf@6.0.1: dependencies: - glob: 11.0.2 + glob: 11.0.3 package-json-from-dist: 1.0.1 robust-predicates@3.0.2: {} @@ -19531,7 +19596,7 @@ snapshots: undici-types@6.19.8: {} - undici-types@6.21.0: {} + undici-types@7.10.0: {} undici@6.21.3: {} @@ -19806,13 +19871,13 @@ snapshots: - tsx - yaml - vite-node@3.2.4(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): + vite-node@3.2.4(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1(supports-color@8.1.1) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.3.5(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -19859,7 +19924,7 @@ snapshots: tsx: 4.19.4 yaml: 2.8.0 - vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): + vite@6.3.5(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: esbuild: 0.25.5 fdir: 6.4.4(picomatch@4.0.2) @@ -19868,7 +19933,7 @@ snapshots: rollup: 4.40.2 tinyglobby: 0.2.13 optionalDependencies: - '@types/node': 22.15.29 + '@types/node': 24.2.1 fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1 @@ -19963,11 +20028,11 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.15.29)(@vitest/ui@3.2.4)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.2.1)(@vitest/ui@3.2.4)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(vite@6.3.5(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -19985,12 +20050,12 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.3.5(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@24.2.1)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.15.29 + '@types/node': 24.2.1 '@vitest/ui': 3.2.4(vitest@3.2.4) jsdom: 26.1.0 transitivePeerDependencies: diff --git a/scripts/link-packages.js b/scripts/link-packages.js deleted file mode 100755 index 6d8b33f6de..0000000000 --- a/scripts/link-packages.js +++ /dev/null @@ -1,158 +0,0 @@ -#!/usr/bin/env node - -const { spawn, execSync } = require("child_process") -const path = require("path") -const fs = require("fs") - -// Package configuration - Add new packages here as needed. -const config = { - packages: [ - { - name: "@roo-code/cloud", - sourcePath: "../Roo-Code-Cloud/packages/sdk", - targetPath: "src/node_modules/@roo-code/cloud", - npmPath: "npm", - watchCommand: "pnpm build:development:watch", - }, - ], -} - -const args = process.argv.slice(2) -const packageName = args.find((arg) => !arg.startsWith("--")) -const watch = !args.includes("--no-watch") -const unlink = args.includes("--unlink") - -const packages = packageName ? config.packages.filter((p) => p.name === packageName) : config.packages - -if (!packages.length) { - console.error(`Package '${packageName}' not found`) - process.exit(1) -} - -packages.forEach(unlink ? unlinkPackage : linkPackage) - -// After unlinking, restore npm packages with a single pnpm install. -if (unlink && packages.length > 0) { - const srcPath = path.resolve(__dirname, "..", "src") - console.log("\nRestoring npm packages...") - - try { - execSync("pnpm install", { cwd: srcPath, stdio: "inherit" }) - console.log("Successfully restored npm packages") - } catch (error) { - console.error(`Failed to restore packages: ${error.message}`) - console.log("You may need to run 'pnpm install' manually in the src directory") - } -} - -if (!unlink && watch) { - const watchers = packages.filter((pkg) => pkg.watchCommand).map(startWatch) - - if (watchers.length) { - process.on("SIGINT", () => { - console.log("\nStopping...") - watchers.forEach((w) => w.kill()) - process.exit(0) - }) - console.log("\nWatching for changes. Press Ctrl+C to stop.\n") - } -} - -function generateNpmPackageJson(sourcePath, npmPath) { - const npmDir = path.join(sourcePath, npmPath) - const npmPackagePath = path.join(npmDir, "package.json") - const npmMetadataPath = path.join(npmDir, "package.metadata.json") - const monorepoPackagePath = path.join(sourcePath, "package.json") - - if (fs.existsSync(npmPackagePath)) { - console.log(` ✓ npm/package.json already exists`) - return - } - - if (!fs.existsSync(npmMetadataPath)) { - console.log(` ⚠ No package.metadata.json found, skipping npm package.json generation`) - return - } - - try { - console.log(` 📦 Generating npm/package.json...`) - const monorepoPackage = JSON.parse(fs.readFileSync(monorepoPackagePath, "utf8")) - const npmMetadata = JSON.parse(fs.readFileSync(npmMetadataPath, "utf8")) - - const npmPackage = { - ...npmMetadata, - type: "module", - dependencies: monorepoPackage.dependencies || {}, - main: "./dist/index.cjs", - module: "./dist/index.js", - types: "./dist/index.d.ts", - exports: { - ".": { - types: "./dist/index.d.ts", - import: "./dist/index.js", - require: { - types: "./dist/index.d.cts", - default: "./dist/index.cjs", - }, - }, - }, - files: ["dist"], - } - - fs.writeFileSync(npmPackagePath, JSON.stringify(npmPackage, null, 2) + "\n") - console.log(` ✓ Generated npm/package.json for ${npmPackage.name}`) - } catch (error) { - console.error(` ✗ Failed to generate npm/package.json: ${error.message}`) - } -} - -function linkPackage(pkg) { - const sourcePath = path.resolve(__dirname, "..", pkg.sourcePath) - const targetPath = path.resolve(__dirname, "..", pkg.targetPath) - - if (!fs.existsSync(sourcePath)) { - console.error(`Source not found: ${sourcePath}`) - process.exit(1) - } - - // Install dependencies if needed. - if (!fs.existsSync(path.join(sourcePath, "node_modules"))) { - console.log(`Installing dependencies for ${pkg.name}...`) - - try { - execSync("pnpm install", { cwd: sourcePath, stdio: "inherit" }) - } catch (e) { - execSync("pnpm install --no-frozen-lockfile", { cwd: sourcePath, stdio: "inherit" }) - } - } - - // If npmPath is specified, check if we need to generate package.json. - if (pkg.npmPath) { - generateNpmPackageJson(sourcePath, pkg.npmPath) - } - - // Create symlink. - fs.rmSync(targetPath, { recursive: true, force: true }) - fs.mkdirSync(path.dirname(targetPath), { recursive: true }) - const linkSource = pkg.npmPath ? path.join(sourcePath, pkg.npmPath) : sourcePath - fs.symlinkSync(linkSource, targetPath, "dir") - console.log(`Linked ${pkg.name}`) -} - -function unlinkPackage(pkg) { - const targetPath = path.resolve(__dirname, "..", pkg.targetPath) - if (fs.existsSync(targetPath)) { - fs.rmSync(targetPath, { recursive: true, force: true }) - console.log(`Unlinked ${pkg.name}`) - } -} - -function startWatch(pkg) { - console.log(`Watching ${pkg.name}...`) - const [cmd, ...args] = pkg.watchCommand.split(" ") - return spawn(cmd, args, { - cwd: path.resolve(__dirname, "..", pkg.sourcePath), - stdio: "inherit", - shell: true, - }) -} diff --git a/scripts/link-packages.ts b/scripts/link-packages.ts new file mode 100644 index 0000000000..4d7e4a7c4c --- /dev/null +++ b/scripts/link-packages.ts @@ -0,0 +1,340 @@ +import { spawn, execSync, type ChildProcess } from "child_process" +import * as path from "path" +import * as fs from "fs" +import { fileURLToPath } from "url" +import { glob } from "glob" + +// @ts-expect-error - TS1470: We only run this script with tsx so it will never +// compile to CJS and it's safe to ignore this tsc error. +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) + +interface PackageConfig { + readonly name: string + readonly sourcePath: string + readonly targetPaths: readonly string[] + readonly replacePath?: string + readonly npmPath: string + readonly watchCommand?: string + readonly watchOutput?: { + readonly start: string[] + readonly stop: string[] + } +} + +interface Config { + readonly packages: readonly PackageConfig[] +} + +interface WatcherResult { + child: ChildProcess +} + +interface NpmPackage { + name?: string + version?: string + type: "module" + dependencies: Record + main: string + module: string + types: string + exports: { + ".": { + types: string + import: string + require: { + types: string + default: string + } + } + } + files: string[] +} + +const config: Config = { + packages: [ + { + name: "@roo-code/cloud", + sourcePath: "../Roo-Code-Cloud/packages/sdk", + targetPaths: ["src/node_modules/@roo-code/cloud"] as const, + replacePath: "node_modules/.pnpm/@roo-code+cloud*", + npmPath: "npm", + watchCommand: "pnpm build:development:watch", + watchOutput: { + start: ["CLI Building", "CLI Change detected"], + stop: ["DTS ⚡️ Build success"], + }, + }, + ], +} as const + +const args = process.argv.slice(2) +const packageName = args.find((arg) => !arg.startsWith("--")) +const watchMode = !args.includes("--no-watch") +const unlink = args.includes("--unlink") + +const packages: readonly PackageConfig[] = packageName + ? config.packages.filter((p) => p.name === packageName) + : config.packages + +if (!packages.length) { + console.error(`Package '${packageName}' not found`) + process.exit(1) +} + +function pathExists(filePath: string): boolean { + try { + fs.accessSync(filePath) + return true + } catch { + return false + } +} + +function copyRecursiveSync(src: string, dest: string): void { + const exists = pathExists(src) + + if (!exists) { + return + } + + const stats = fs.statSync(src) + const isDirectory = stats.isDirectory() + + if (isDirectory) { + if (!pathExists(dest)) { + fs.mkdirSync(dest, { recursive: true }) + } + + const children = fs.readdirSync(src) + + children.forEach((childItemName) => { + copyRecursiveSync(path.join(src, childItemName), path.join(dest, childItemName)) + }) + } else { + fs.copyFileSync(src, dest) + } +} + +function generateNpmPackageJson(sourcePath: string, npmPath: string): string { + const npmDir = path.join(sourcePath, npmPath) + const npmPackagePath = path.join(npmDir, "package.json") + const npmMetadataPath = path.join(npmDir, "package.metadata.json") + const monorepoPackagePath = path.join(sourcePath, "package.json") + + if (pathExists(npmPackagePath)) { + return npmPackagePath + } + + if (!pathExists(npmMetadataPath)) { + throw new Error(`No package.metadata.json found in ${npmDir}`) + } + + const monorepoPackageContent = fs.readFileSync(monorepoPackagePath, "utf8") + + const monorepoPackage = JSON.parse(monorepoPackageContent) as { + dependencies?: Record + } + + const npmMetadataContent = fs.readFileSync(npmMetadataPath, "utf8") + const npmMetadata = JSON.parse(npmMetadataContent) as Partial + + const npmPackage: NpmPackage = { + ...npmMetadata, + type: "module", + dependencies: monorepoPackage.dependencies || {}, + main: "./dist/index.cjs", + module: "./dist/index.js", + types: "./dist/index.d.ts", + exports: { + ".": { + types: "./dist/index.d.ts", + import: "./dist/index.js", + require: { + types: "./dist/index.d.cts", + default: "./dist/index.cjs", + }, + }, + }, + files: ["dist"], + } + + fs.writeFileSync(npmPackagePath, JSON.stringify(npmPackage, null, 2) + "\n") + + return npmPackagePath +} + +function linkPackage(pkg: PackageConfig): void { + const sourcePath = path.resolve(__dirname, "..", pkg.sourcePath) + + if (!pathExists(sourcePath)) { + console.error(`❌ Source not found: ${sourcePath}`) + process.exit(1) + } + + generateNpmPackageJson(sourcePath, pkg.npmPath) + + for (const currentTargetPath of pkg.targetPaths) { + const targetPath = path.resolve(__dirname, "..", currentTargetPath) + + if (pathExists(targetPath)) { + fs.rmSync(targetPath, { recursive: true, force: true }) + } + + const parentDir = path.dirname(targetPath) + fs.mkdirSync(parentDir, { recursive: true }) + + const linkSource = pkg.npmPath ? path.join(sourcePath, pkg.npmPath) : sourcePath + copyRecursiveSync(linkSource, targetPath) + } +} + +function unlinkPackage(pkg: PackageConfig): void { + for (const currentTargetPath of pkg.targetPaths) { + const targetPath = path.resolve(__dirname, "..", currentTargetPath) + + if (pathExists(targetPath)) { + fs.rmSync(targetPath, { recursive: true, force: true }) + console.log(`🗑️ Removed ${pkg.name} from ${currentTargetPath}`) + } + } +} + +function startWatch(pkg: PackageConfig): WatcherResult { + if (!pkg.watchCommand) { + throw new Error(`Package ${pkg.name} has no watch command configured`) + } + + const commandParts = pkg.watchCommand.split(" ") + const [cmd, ...args] = commandParts + + if (!cmd) { + throw new Error(`Invalid watch command for ${pkg.name}`) + } + + console.log(`Watching for changes to ${pkg.sourcePath} with ${cmd} ${args.join(" ")}`) + + const child = spawn(cmd, args, { + cwd: path.resolve(__dirname, "..", pkg.sourcePath), + stdio: "pipe", + shell: true, + }) + + let debounceTimer: NodeJS.Timeout | null = null + + const DEBOUNCE_DELAY = 500 + + if (child.stdout) { + child.stdout.on("data", (data: Buffer) => { + const output = data.toString() + + const isStarting = pkg.watchOutput?.start.some((start) => output.includes(start)) + + const isDone = pkg.watchOutput?.stop.some((stop) => output.includes(stop)) + + if (isStarting) { + console.log(`🔨 Building ${pkg.name}...`) + + if (debounceTimer) { + clearTimeout(debounceTimer) + debounceTimer = null + } + } + + if (isDone) { + console.log(`✅ Built ${pkg.name}`) + + if (debounceTimer) { + clearTimeout(debounceTimer) + } + + debounceTimer = setTimeout(() => { + linkPackage(pkg) + + console.log(`📋 Copied ${pkg.name} to ${pkg.targetPaths.length} paths\n`) + + debounceTimer = null + }, DEBOUNCE_DELAY) + } + }) + } + + if (child.stderr) { + child.stderr.on("data", (data: Buffer) => { + console.log(`❌ "${data.toString()}"`) + }) + } + + return { child } +} + +function main(): void { + if (unlink) { + packages.forEach(unlinkPackage) + + console.log("\n📦 Restoring npm packages...") + + try { + execSync("pnpm install", { cwd: __dirname, stdio: "ignore" }) + console.log("✅ npm packages restored") + } catch (error) { + console.error(`❌ Failed to restore packages: ${error instanceof Error ? error.message : String(error)}`) + + console.log(" Run 'pnpm install' manually if needed") + } + } else { + packages.forEach((pkg) => { + linkPackage(pkg) + + if (pkg.replacePath) { + const replacePattern = path.resolve(__dirname, "..", pkg.replacePath) + + try { + const matchedPaths = glob.sync(replacePattern) + + if (matchedPaths.length > 0) { + matchedPaths.forEach((matchedPath: string) => { + if (pathExists(matchedPath)) { + fs.rmSync(matchedPath, { recursive: true, force: true }) + console.log(`🗑️ Removed ${pkg.name} from ${matchedPath}`) + } + }) + } else { + if (pathExists(replacePattern)) { + fs.rmSync(replacePattern, { recursive: true, force: true }) + console.log(`🗑️ Removed ${pkg.name} from ${replacePattern}`) + } + } + } catch (error) { + console.error( + `❌ Error processing replace path: ${error instanceof Error ? error.message : String(error)}`, + ) + } + } + }) + + if (watchMode) { + const packagesWithWatch = packages.filter( + (pkg): pkg is PackageConfig & { watchCommand: string } => pkg.watchCommand !== undefined, + ) + + const watchers = packagesWithWatch.map(startWatch) + + if (watchers.length > 0) { + process.on("SIGINT", () => { + console.log("\n👋 Stopping watchers...") + + watchers.forEach((w) => { + if (w.child) { + w.child.kill() + } + }) + + process.exit(0) + }) + } + } + } +} + +main() diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts index 2103dacb27..659e7772d5 100644 --- a/src/core/task/Task.ts +++ b/src/core/task/Task.ts @@ -11,6 +11,7 @@ import { serializeError } from "serialize-error" import { type TaskLike, + type TaskMetadata, type TaskEvents, type ProviderSettings, type TokenUsage, @@ -32,7 +33,7 @@ import { isBlockingAsk, } from "@roo-code/types" import { TelemetryService } from "@roo-code/telemetry" -import { CloudService, UnifiedBridgeService } from "@roo-code/cloud" +import { CloudService, ExtensionBridgeService } from "@roo-code/cloud" // api import { ApiHandler, ApiHandlerCreateMessageMetadata, buildApiHandler } from "../../api" @@ -122,9 +123,11 @@ export type TaskOptions = { } export class Task extends EventEmitter implements TaskLike { - todoList?: TodoItem[] readonly taskId: string readonly instanceId: string + readonly metadata: TaskMetadata + + todoList?: TodoItem[] readonly rootTask: Task | undefined = undefined readonly parentTask: Task | undefined = undefined @@ -240,7 +243,7 @@ export class Task extends EventEmitter implements TaskLike { // Task Bridge enableTaskBridge: boolean - bridgeService: UnifiedBridgeService | null = null + bridgeService: ExtensionBridgeService | null = null // Streaming isWaitingForFirstChunk = false @@ -285,6 +288,12 @@ export class Task extends EventEmitter implements TaskLike { this.taskId = historyItem ? historyItem.id : crypto.randomUUID() + this.metadata = { + taskId: this.taskId, + task: historyItem ? historyItem.task : task, + images: historyItem ? [] : images, + } + // Normal use-case is usually retry similar history task with new workspace. this.workspacePath = parentTask ? parentTask.workspacePath @@ -981,7 +990,7 @@ export class Task extends EventEmitter implements TaskLike { private async startTask(task?: string, images?: string[]): Promise { if (this.enableTaskBridge) { try { - this.bridgeService = this.bridgeService || UnifiedBridgeService.getInstance() + this.bridgeService = this.bridgeService || ExtensionBridgeService.getInstance() if (this.bridgeService) { await this.bridgeService.subscribeToTask(this) @@ -1046,7 +1055,7 @@ export class Task extends EventEmitter implements TaskLike { private async resumeTaskFromHistory() { if (this.enableTaskBridge) { try { - this.bridgeService = this.bridgeService || UnifiedBridgeService.getInstance() + this.bridgeService = this.bridgeService || ExtensionBridgeService.getInstance() if (this.bridgeService) { await this.bridgeService.subscribeToTask(this) diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 81c0a562c7..6622b29891 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -560,18 +560,16 @@ export class ClineProvider this.log("Resolving webview view") this.view = webviewView - - // Set panel reference according to webview type const inTabMode = "onDidChangeViewState" in webviewView + if (inTabMode) { - // Tag page type setPanel(webviewView, "tab") } else if ("onDidChangeVisibility" in webviewView) { - // Sidebar Type setPanel(webviewView, "sidebar") } - // Initialize out-of-scope variables that need to receive persistent global state values + // Initialize out-of-scope variables that need to receive persistent + // global state values. this.getState().then( ({ terminalShellIntegrationTimeout = Terminal.defaultShellIntegrationTimeout, @@ -594,18 +592,15 @@ export class ClineProvider }, ) - // Initialize tts enabled state this.getState().then(({ ttsEnabled }) => { setTtsEnabled(ttsEnabled ?? false) }) - // Initialize tts speed state this.getState().then(({ ttsSpeed }) => { setTtsSpeed(ttsSpeed ?? 1) }) webviewView.webview.options = { - // Allow scripts in the webview enableScripts: true, localResourceRoots: [this.contextProxy.extensionUri], } @@ -616,32 +611,31 @@ export class ClineProvider : this.getHtmlContent(webviewView.webview) // Sets up an event listener to listen for messages passed from the webview view context - // and executes code based on the message that is received + // and executes code based on the message that is received. this.setWebviewMessageListener(webviewView.webview) - // Initialize code index status subscription for the current workspace + // Initialize code index status subscription for the current workspace. this.updateCodeIndexStatusSubscription() - // Listen for active editor changes to update code index status for the current workspace + // Listen for active editor changes to update code index status for the + // current workspace. const activeEditorSubscription = vscode.window.onDidChangeActiveTextEditor(() => { - // Update subscription when workspace might have changed + // Update subscription when workspace might have changed. this.updateCodeIndexStatusSubscription() }) this.webviewDisposables.push(activeEditorSubscription) - // Logs show up in bottom panel > Debug Console - //console.log("registering listener") - - // Listen for when the panel becomes visible + // Listen for when the panel becomes visible. // https://github.com/microsoft/vscode-discussions/discussions/840 if ("onDidChangeViewState" in webviewView) { - // WebviewView and WebviewPanel have all the same properties except for this visibility listener - // panel + // WebviewView and WebviewPanel have all the same properties except + // for this visibility listener panel. const viewStateDisposable = webviewView.onDidChangeViewState(() => { if (this.view?.visible) { this.postMessageToWebview({ type: "action", action: "didBecomeVisible" }) } }) + this.webviewDisposables.push(viewStateDisposable) } else if ("onDidChangeVisibility" in webviewView) { // sidebar @@ -650,6 +644,7 @@ export class ClineProvider this.postMessageToWebview({ type: "action", action: "didBecomeVisible" }) } }) + this.webviewDisposables.push(visibilityDisposable) } @@ -838,8 +833,8 @@ export class ClineProvider } private async getHMRHtmlContent(webview: vscode.Webview): Promise { - // Try to read the port from the file - let localPort = "5173" // Default fallback + let localPort = "5173" + try { const fs = require("fs") const path = require("path") @@ -855,7 +850,6 @@ export class ClineProvider } } catch (err) { console.error("[ClineProvider:Vite] Failed to read Vite port file:", err) - // Continue with default port if file reading fails } const localServerUrl = `localhost:${localPort}` @@ -865,7 +859,6 @@ export class ClineProvider await axios.get(`http://${localServerUrl}`) } catch (error) { vscode.window.showErrorMessage(t("common:errors.hmr_not_running")) - return this.getHtmlContent(webview) } @@ -2130,12 +2123,8 @@ export class ClineProvider return true } - /** - * Handle remote control enabled/disabled state changes - * Manages UnifiedBridgeService lifecycle - */ public async handleRemoteControlToggle(enabled: boolean) { - const { CloudService: CloudServiceImport, UnifiedBridgeService } = await import("@roo-code/cloud") + const { CloudService: CloudServiceImport, ExtensionBridgeService } = await import("@roo-code/cloud") const userInfo = CloudServiceImport.instance.getUserInfo() @@ -2146,10 +2135,10 @@ export class ClineProvider return } - await UnifiedBridgeService.handleRemoteControlState( + await ExtensionBridgeService.handleRemoteControlState( userInfo, enabled, - { ...bridgeConfig, provider: this }, + { ...bridgeConfig, provider: this, sessionId: vscode.env.sessionId }, (message: string) => this.log(message), ) @@ -2158,7 +2147,7 @@ export class ClineProvider if (currentTask && !currentTask.bridgeService) { try { - currentTask.bridgeService = UnifiedBridgeService.getInstance() + currentTask.bridgeService = ExtensionBridgeService.getInstance() if (currentTask.bridgeService) { await currentTask.bridgeService.subscribeToTask(currentTask) @@ -2183,7 +2172,7 @@ export class ClineProvider } } - UnifiedBridgeService.resetInstance() + ExtensionBridgeService.resetInstance() } } diff --git a/src/extension.ts b/src/extension.ts index 767e83c42d..6cb6ea4b07 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -12,7 +12,7 @@ try { console.warn("Failed to load environment variables:", e) } -import { CloudService, UnifiedBridgeService } from "@roo-code/cloud" +import { CloudService, ExtensionBridgeService } from "@roo-code/cloud" import { TelemetryService, PostHogTelemetryClient } from "@roo-code/telemetry" import "./utils/path" // Necessary to have access to String.prototype.toPosix. @@ -141,10 +141,10 @@ export async function activate(context: vscode.ExtensionContext) { return } - UnifiedBridgeService.handleRemoteControlState( + ExtensionBridgeService.handleRemoteControlState( userInfo, contextProxy.getValue("remoteControlEnabled"), - { ...bridgeConfig, provider }, + { ...bridgeConfig, provider, sessionId: vscode.env.sessionId }, (message: string) => outputChannel.appendLine(message), ) }) @@ -280,7 +280,7 @@ export async function activate(context: vscode.ExtensionContext) { export async function deactivate() { outputChannel.appendLine(`${Package.name} extension deactivated`) - const bridgeService = UnifiedBridgeService.getInstance() + const bridgeService = ExtensionBridgeService.getInstance() if (bridgeService) { await bridgeService.disconnect() diff --git a/src/package.json b/src/package.json index 9d694b2bbb..14b534288b 100644 --- a/src/package.json +++ b/src/package.json @@ -427,7 +427,7 @@ "@mistralai/mistralai": "^1.3.6", "@modelcontextprotocol/sdk": "^1.9.0", "@qdrant/js-client-rest": "^1.14.0", - "@roo-code/cloud": "^0.13.0", + "@roo-code/cloud": "^0.14.0", "@roo-code/ipc": "workspace:^", "@roo-code/telemetry": "workspace:^", "@roo-code/types": "workspace:^", @@ -474,6 +474,7 @@ "say": "^0.16.0", "serialize-error": "^12.0.0", "simple-git": "^3.27.0", + "socket.io-client": "^4.8.1", "sound-play": "^1.1.0", "stream-json": "^1.8.0", "string-similarity": "^4.0.4", diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000000..44f734c197 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@roo-code/config-typescript/base.json", + "compilerOptions": { + "types": ["node"] + }, + "exclude": ["node_modules"], + "include": ["scripts/*.ts"] +} From 48af73dba97942c74a4b32bc82f3c4fda4af288d Mon Sep 17 00:00:00 2001 From: Chris Estreich Date: Thu, 14 Aug 2025 00:17:56 -1000 Subject: [PATCH 23/36] Fix publish-npm script (#7093) --- packages/types/scripts/publish-npm.cjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/types/scripts/publish-npm.cjs b/packages/types/scripts/publish-npm.cjs index a82308fdfa..467ae3d506 100644 --- a/packages/types/scripts/publish-npm.cjs +++ b/packages/types/scripts/publish-npm.cjs @@ -64,7 +64,7 @@ function commitVersionChanges(version) { try { const status = execSync("git status --porcelain", { encoding: "utf8" }) - const relevantChanges = status.split("\n").filter((line) => line.includes("packages/sdk/npm/package")) + const relevantChanges = status.split("\n").filter((line) => line.includes("packages/types/npm/package")) if (relevantChanges.length === 0) { console.log(" ⚠️ No version changes to commit") From e5d93f2bca22577dc7e7bd23c53bf4f5b5435d2e Mon Sep 17 00:00:00 2001 From: f14XuanLv <121799454+f14XuanLv@users.noreply.github.com> Date: Thu, 14 Aug 2025 22:21:31 +0800 Subject: [PATCH 24/36] fix: reset condensing state when switching tasks (#6922) Previously, when users initiated context condensing and switched to another task before completion, the 'condensing context' indicator would persist on the new task. This fix ensures the condensing state is properly reset in the task switching effect, preventing the indicator from appearing incorrectly on different tasks. --- webview-ui/src/components/chat/ChatView.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 64f761574a..3b77bbdb7d 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -434,9 +434,12 @@ const ChatViewComponent: React.ForwardRefRenderFunction { + // Reset UI states setExpandedRows({}) everVisibleMessagesTsRef.current.clear() // Clear for new task setCurrentFollowUpTs(null) // Clear follow-up answered state for new task + setIsCondensing(false) // Reset condensing state when switching tasks + // Note: sendingDisabled is not reset here as it's managed by message effects // Clear any pending auto-approval timeout from previous task if (autoApproveTimeoutRef.current) { From 3d2673bb28e7ecade9736902fee63edddcba215a Mon Sep 17 00:00:00 2001 From: Abdullah Hilson Date: Thu, 14 Aug 2025 18:53:16 +0300 Subject: [PATCH 25/36] feat: implement sitemap generation in TypeScript and remove XML file (#6206) Co-authored-by: daniel-lxs Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com> --- apps/web-roo-code/.env.example | 4 ++ apps/web-roo-code/.gitignore | 4 ++ apps/web-roo-code/.npmrc | 1 + apps/web-roo-code/next-sitemap.config.cjs | 57 +++++++++++++++++++++++ apps/web-roo-code/package.json | 2 + apps/web-roo-code/src/app/sitemap.xml | 9 ---- knip.json | 3 +- pnpm-lock.yaml | 28 +++++++++++ 8 files changed, 98 insertions(+), 10 deletions(-) create mode 100644 apps/web-roo-code/.npmrc create mode 100644 apps/web-roo-code/next-sitemap.config.cjs delete mode 100644 apps/web-roo-code/src/app/sitemap.xml diff --git a/apps/web-roo-code/.env.example b/apps/web-roo-code/.env.example index 734a9a2a08..01258bc500 100644 --- a/apps/web-roo-code/.env.example +++ b/apps/web-roo-code/.env.example @@ -6,3 +6,7 @@ NEXT_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com # Basin Form Endpoint for Static Form Submissions # Replace this with your actual Basin form endpoint (e.g., https://usebasin.com/f/your-form-id) NEXT_PUBLIC_BASIN_ENDPOINT=https://usebasin.com/f/your-form-id-here + +# Site URL Configuration +# Used for generating absolute URLs in sitemap and other contexts +NEXT_PUBLIC_SITE_URL=https://roocode.com diff --git a/apps/web-roo-code/.gitignore b/apps/web-roo-code/.gitignore index 7b8da95f5e..6f31e99c00 100644 --- a/apps/web-roo-code/.gitignore +++ b/apps/web-roo-code/.gitignore @@ -40,3 +40,7 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +# generated files +/public/sitemap*.xml +/public/robots.txt diff --git a/apps/web-roo-code/.npmrc b/apps/web-roo-code/.npmrc new file mode 100644 index 0000000000..b7425b9ee8 --- /dev/null +++ b/apps/web-roo-code/.npmrc @@ -0,0 +1 @@ +enable-pre-post-scripts=true \ No newline at end of file diff --git a/apps/web-roo-code/next-sitemap.config.cjs b/apps/web-roo-code/next-sitemap.config.cjs new file mode 100644 index 0000000000..ae9b4b55ba --- /dev/null +++ b/apps/web-roo-code/next-sitemap.config.cjs @@ -0,0 +1,57 @@ +/** @type {import('next-sitemap').IConfig} */ +module.exports = { + siteUrl: process.env.NEXT_PUBLIC_SITE_URL || 'https://roocode.com', + generateRobotsTxt: true, + generateIndexSitemap: false, // We don't need index sitemap for a small site + changefreq: 'monthly', + priority: 0.7, + sitemapSize: 5000, + exclude: [ + '/api/*', + '/server-sitemap-index.xml', + '/404', + '/500', + '/_not-found', + ], + robotsTxtOptions: { + policies: [ + { + userAgent: '*', + allow: '/', + }, + ], + additionalSitemaps: [ + // Add any additional sitemaps here if needed in the future + ], + }, + // Custom transform function to set specific priorities and change frequencies + transform: async (config, path) => { + // Set custom priority for specific pages + let priority = config.priority; + let changefreq = config.changefreq; + + if (path === '/') { + priority = 1.0; + changefreq = 'yearly'; + } else if (path === '/enterprise' || path === '/evals') { + priority = 0.8; + changefreq = 'monthly'; + } else if (path === '/privacy' || path === '/terms') { + priority = 0.5; + changefreq = 'yearly'; + } + + return { + loc: path, + changefreq, + priority, + lastmod: config.autoLastmod ? new Date().toISOString() : undefined, + alternateRefs: config.alternateRefs ?? [], + }; + }, + additionalPaths: async (config) => { + // Add any additional paths that might not be automatically discovered + // This is useful for dynamic routes or API-generated pages + return []; + }, +}; \ No newline at end of file diff --git a/apps/web-roo-code/package.json b/apps/web-roo-code/package.json index 8495dd961a..fa59cacccb 100644 --- a/apps/web-roo-code/package.json +++ b/apps/web-roo-code/package.json @@ -7,6 +7,7 @@ "check-types": "tsc --noEmit", "dev": "next dev", "build": "next build", + "postbuild": "next-sitemap --config next-sitemap.config.cjs", "start": "next start", "clean": "rimraf .next .turbo" }, @@ -42,6 +43,7 @@ "@types/react": "^18.3.23", "@types/react-dom": "^18.3.7", "autoprefixer": "^10.4.21", + "next-sitemap": "^4.2.3", "postcss": "^8.5.4", "tailwindcss": "^3.4.17" } diff --git a/apps/web-roo-code/src/app/sitemap.xml b/apps/web-roo-code/src/app/sitemap.xml deleted file mode 100644 index 43ac973306..0000000000 --- a/apps/web-roo-code/src/app/sitemap.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - https://roocode.com/ - 2025-03-13T22:26:09Z - yearly - 1.0 - - diff --git a/knip.json b/knip.json index 15fea7e6ff..a847111981 100644 --- a/knip.json +++ b/knip.json @@ -7,7 +7,8 @@ "src/activate/**", "src/workers/countTokens.ts", "src/extension.ts", - "scripts/**" + "scripts/**", + "apps/web-roo-code/next-sitemap.config.cjs" ], "workspaces": { "src": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 43b0cf2951..7bcc01f194 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -342,6 +342,9 @@ importers: autoprefixer: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.4) + next-sitemap: + specifier: ^4.2.3 + version: 4.2.3(next@15.2.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) postcss: specifier: ^8.5.4 version: 8.5.4 @@ -1532,6 +1535,9 @@ packages: '@chevrotain/utils@11.0.3': resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + '@corex/deepmerge@4.0.43': + resolution: {integrity: sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==} + '@csstools/color-helpers@5.0.2': resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} engines: {node: '>=18'} @@ -2132,6 +2138,9 @@ packages: '@neon-rs/load@0.0.4': resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} + '@next/env@13.5.11': + resolution: {integrity: sha512-fbb2C7HChgM7CemdCY+y3N1n8pcTKdqtQLbC7/EQtPdLvlMUT9JX/dBYl8MMZAtYG4uVMyPFHXckb68q/NRwqg==} + '@next/env@15.2.5': resolution: {integrity: sha512-uWkCf9C8wKTyQjqrNk+BA7eL3LOQdhL+xlmJUf2O85RM4lbzwBwot3Sqv2QGe/RGnc3zysIf1oJdtq9S00pkmQ==} @@ -7485,6 +7494,13 @@ packages: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} + next-sitemap@4.2.3: + resolution: {integrity: sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ==} + engines: {node: '>=14.18'} + hasBin: true + peerDependencies: + next: '*' + next-themes@0.4.6: resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} peerDependencies: @@ -10821,6 +10837,8 @@ snapshots: '@chevrotain/utils@11.0.3': {} + '@corex/deepmerge@4.0.43': {} + '@csstools/color-helpers@5.0.2': {} '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': @@ -11418,6 +11436,8 @@ snapshots: '@neon-rs/load@0.0.4': optional: true + '@next/env@13.5.11': {} + '@next/env@15.2.5': {} '@next/eslint-plugin-next@15.3.2': @@ -17502,6 +17522,14 @@ snapshots: netmask@2.0.2: {} + next-sitemap@4.2.3(next@15.2.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + dependencies: + '@corex/deepmerge': 4.0.43 + '@next/env': 13.5.11 + fast-glob: 3.3.3 + minimist: 1.2.8 + next: 15.2.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next-themes@0.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 From 253d5acc090e704002105a906e5085cb6703973c Mon Sep 17 00:00:00 2001 From: Daniel <57051444+daniel-lxs@users.noreply.github.com> Date: Thu, 14 Aug 2025 11:48:32 -0500 Subject: [PATCH 26/36] fix: add /evals page to sitemap generation (#7102) Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> --- apps/web-roo-code/next-sitemap.config.cjs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/apps/web-roo-code/next-sitemap.config.cjs b/apps/web-roo-code/next-sitemap.config.cjs index ae9b4b55ba..e9b0ca3c47 100644 --- a/apps/web-roo-code/next-sitemap.config.cjs +++ b/apps/web-roo-code/next-sitemap.config.cjs @@ -52,6 +52,22 @@ module.exports = { additionalPaths: async (config) => { // Add any additional paths that might not be automatically discovered // This is useful for dynamic routes or API-generated pages - return []; + // Add the /evals page since it's a dynamic route + return [{ + loc: '/evals', + changefreq: 'monthly', + priority: 0.8, + lastmod: new Date().toISOString(), + }]; + + // Add the /evals page since it's a dynamic route + result.push({ + loc: '/evals', + changefreq: 'monthly', + priority: 0.8, + lastmod: new Date().toISOString(), + }); + + return result; }, }; \ No newline at end of file From a6feb270932f61fb1bfeb7cfa02c7e925a7ef8b1 Mon Sep 17 00:00:00 2001 From: Matt Rubens Date: Thu, 14 Aug 2025 12:49:21 -0400 Subject: [PATCH 27/36] Release v3.25.15 (#7103) --- .changeset/v3.25.15.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .changeset/v3.25.15.md diff --git a/.changeset/v3.25.15.md b/.changeset/v3.25.15.md new file mode 100644 index 0000000000..bd74530316 --- /dev/null +++ b/.changeset/v3.25.15.md @@ -0,0 +1,8 @@ +--- +"roo-cline": patch +--- + +- Fix: Remove 500-message limit to prevent scrollbar jumping in long conversations (#7052, #7063 by @daniel-lxs, PR by @app/roomote) +- Fix: Reset condensing state when switching tasks (#6919 by @f14XuanLv, PR by @f14XuanLv) +- Fix: Implement sitemap generation in TypeScript and remove XML file (#5231 by @abumalick, PR by @abumalick) +- Fix: allowedMaxRequests and allowedMaxCost values not showing in the settings UI (thanks @chrarnoldus!) From 1ee9e01d6c808c588623d1c7762f4c03be0905c5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 14 Aug 2025 12:50:55 -0400 Subject: [PATCH 28/36] Update contributors list (#6883) Co-authored-by: mrubens <2600+mrubens@users.noreply.github.com> --- README.md | 81 +++++++++++++++++++++-------------------- locales/ca/README.md | 81 +++++++++++++++++++++-------------------- locales/de/README.md | 81 +++++++++++++++++++++-------------------- locales/es/README.md | 81 +++++++++++++++++++++-------------------- locales/fr/README.md | 81 +++++++++++++++++++++-------------------- locales/hi/README.md | 81 +++++++++++++++++++++-------------------- locales/id/README.md | 81 +++++++++++++++++++++-------------------- locales/it/README.md | 81 +++++++++++++++++++++-------------------- locales/ja/README.md | 81 +++++++++++++++++++++-------------------- locales/ko/README.md | 81 +++++++++++++++++++++-------------------- locales/nl/README.md | 81 +++++++++++++++++++++-------------------- locales/pl/README.md | 81 +++++++++++++++++++++-------------------- locales/pt-BR/README.md | 81 +++++++++++++++++++++-------------------- locales/ru/README.md | 81 +++++++++++++++++++++-------------------- locales/tr/README.md | 81 +++++++++++++++++++++-------------------- locales/vi/README.md | 81 +++++++++++++++++++++-------------------- locales/zh-CN/README.md | 81 +++++++++++++++++++++-------------------- locales/zh-TW/README.md | 81 +++++++++++++++++++++-------------------- 18 files changed, 738 insertions(+), 720 deletions(-) diff --git a/README.md b/README.md index 1b5e8fe2ec..2f3a6069d9 100644 --- a/README.md +++ b/README.md @@ -208,46 +208,47 @@ Thanks to all our contributors who have helped make Roo Code better! -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| -| joemanley201
joemanley201
| jr
jr
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| -| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| punkpeye
punkpeye
| -| wkordalski
wkordalski
| chrarnoldus
chrarnoldus
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| -| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| -| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| Szpadel
Szpadel
| lupuletic
lupuletic
| -| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| -| PeterDaveHello
PeterDaveHello
| aheizi
aheizi
| NaccOll
NaccOll
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| -| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| -| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| -| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| -| axkirillov
axkirillov
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| -| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| philfung
philfung
| axmo
axmo
| bannzai
bannzai
| bbenshalom
bbenshalom
| -| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| ershang-fireworks
ershang-fireworks
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| -| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| asychin
asychin
| amittell
amittell
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| -| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| -| AlexandruSmirnov
AlexandruSmirnov
| nevermorec
nevermorec
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| -| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| shaybc
shaybc
| -| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| pokutuna
pokutuna
| -| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| -| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| kohii
kohii
| -| kinandan
kinandan
| jwcraig
jwcraig
| jues
jues
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| ExactDoug
ExactDoug
| -| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| -| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| -| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| -| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| samsilveira
samsilveira
| 01Rian
01Rian
| -| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| -| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| -| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| -| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| -| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| +| jr
jr
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| chrarnoldus
chrarnoldus
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| +| punkpeye
punkpeye
| wkordalski
wkordalski
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| +| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| PeterDaveHello
PeterDaveHello
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| +| ChuKhaLi
ChuKhaLi
| NaccOll
NaccOll
| aheizi
aheizi
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| +| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| +| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| +| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| +| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| benzntech
benzntech
| ross
ross
| mr-ryan-james
mr-ryan-james
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| +| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| +| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| QuinsZouls
QuinsZouls
| anton-otee
anton-otee
| +| axkirillov
axkirillov
| bramburn
bramburn
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| +| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| +| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| dqroid
dqroid
| dairui1
dairui1
| +| chris-garrett
chris-garrett
| bbenshalom
bbenshalom
| bannzai
bannzai
| ershang-fireworks
ershang-fireworks
| f14XuanLv
f14XuanLv
| janaki-sasidhar
janaki-sasidhar
| +| forestyoo
forestyoo
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| axmo
axmo
| +| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| +| vladstudio
vladstudio
| vivekfyi
vivekfyi
| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| +| tgfjt
tgfjt
| maekawataiki
maekawataiki
| DeXtroTip
DeXtroTip
| qingyuan1109
qingyuan1109
| refactorthis
refactorthis
| robertheadley
robertheadley
| +| samir-nimbly
samir-nimbly
| sensei-woo
sensei-woo
| shaybc
shaybc
| shivamd1810
shivamd1810
| shohei-ihaya
shohei-ihaya
| shubhamgupta731
shubhamgupta731
| +| student20880
student20880
| takakoutso
takakoutso
| user202729
user202729
| cdlliuy
cdlliuy
| zetaloop
zetaloop
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| jues
jues
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lhish
lhish
| +| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| mlopezr
mlopezr
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| village-way
village-way
| philipnext
philipnext
| pokutuna
pokutuna
| pfitz
pfitz
| +| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| ertan2002
ertan2002
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| +| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| +| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| +| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| abumalick
abumalick
| +| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| +| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| +| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| +| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| +| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| +| Jdo300
Jdo300
| hesara
hesara
| | | | | diff --git a/locales/ca/README.md b/locales/ca/README.md index a2ba29f1f0..3a156e83a6 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -182,46 +182,47 @@ Gràcies a tots els nostres col·laboradors que han ajudat a millorar Roo Code! -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| -| joemanley201
joemanley201
| jr
jr
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| -| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| punkpeye
punkpeye
| -| wkordalski
wkordalski
| chrarnoldus
chrarnoldus
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| -| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| -| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| Szpadel
Szpadel
| lupuletic
lupuletic
| -| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| -| PeterDaveHello
PeterDaveHello
| aheizi
aheizi
| NaccOll
NaccOll
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| -| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| -| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| -| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| -| axkirillov
axkirillov
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| -| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| philfung
philfung
| axmo
axmo
| bannzai
bannzai
| bbenshalom
bbenshalom
| -| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| ershang-fireworks
ershang-fireworks
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| -| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| asychin
asychin
| amittell
amittell
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| -| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| -| AlexandruSmirnov
AlexandruSmirnov
| nevermorec
nevermorec
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| -| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| shaybc
shaybc
| -| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| pokutuna
pokutuna
| -| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| -| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| kohii
kohii
| -| kinandan
kinandan
| jwcraig
jwcraig
| jues
jues
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| ExactDoug
ExactDoug
| -| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| -| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| -| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| -| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| samsilveira
samsilveira
| 01Rian
01Rian
| -| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| -| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| -| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| -| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| -| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| +| jr
jr
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| chrarnoldus
chrarnoldus
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| +| punkpeye
punkpeye
| wkordalski
wkordalski
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| +| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| PeterDaveHello
PeterDaveHello
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| +| ChuKhaLi
ChuKhaLi
| NaccOll
NaccOll
| aheizi
aheizi
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| +| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| +| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| +| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| +| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| benzntech
benzntech
| ross
ross
| mr-ryan-james
mr-ryan-james
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| +| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| +| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| QuinsZouls
QuinsZouls
| anton-otee
anton-otee
| +| axkirillov
axkirillov
| bramburn
bramburn
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| +| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| +| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| dqroid
dqroid
| dairui1
dairui1
| +| chris-garrett
chris-garrett
| bbenshalom
bbenshalom
| bannzai
bannzai
| ershang-fireworks
ershang-fireworks
| f14XuanLv
f14XuanLv
| janaki-sasidhar
janaki-sasidhar
| +| forestyoo
forestyoo
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| axmo
axmo
| +| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| +| vladstudio
vladstudio
| vivekfyi
vivekfyi
| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| +| tgfjt
tgfjt
| maekawataiki
maekawataiki
| DeXtroTip
DeXtroTip
| qingyuan1109
qingyuan1109
| refactorthis
refactorthis
| robertheadley
robertheadley
| +| samir-nimbly
samir-nimbly
| sensei-woo
sensei-woo
| shaybc
shaybc
| shivamd1810
shivamd1810
| shohei-ihaya
shohei-ihaya
| shubhamgupta731
shubhamgupta731
| +| student20880
student20880
| takakoutso
takakoutso
| user202729
user202729
| cdlliuy
cdlliuy
| zetaloop
zetaloop
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| jues
jues
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lhish
lhish
| +| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| mlopezr
mlopezr
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| village-way
village-way
| philipnext
philipnext
| pokutuna
pokutuna
| pfitz
pfitz
| +| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| ertan2002
ertan2002
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| +| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| +| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| +| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| abumalick
abumalick
| +| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| +| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| +| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| +| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| +| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| +| Jdo300
Jdo300
| hesara
hesara
| | | | | diff --git a/locales/de/README.md b/locales/de/README.md index 296f5d45da..4856e9255b 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -182,46 +182,47 @@ Danke an alle unsere Mitwirkenden, die geholfen haben, Roo Code zu verbessern! -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| -| joemanley201
joemanley201
| jr
jr
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| -| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| punkpeye
punkpeye
| -| wkordalski
wkordalski
| chrarnoldus
chrarnoldus
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| -| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| -| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| Szpadel
Szpadel
| lupuletic
lupuletic
| -| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| -| PeterDaveHello
PeterDaveHello
| aheizi
aheizi
| NaccOll
NaccOll
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| -| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| -| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| -| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| -| axkirillov
axkirillov
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| -| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| philfung
philfung
| axmo
axmo
| bannzai
bannzai
| bbenshalom
bbenshalom
| -| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| ershang-fireworks
ershang-fireworks
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| -| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| asychin
asychin
| amittell
amittell
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| -| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| -| AlexandruSmirnov
AlexandruSmirnov
| nevermorec
nevermorec
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| -| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| shaybc
shaybc
| -| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| pokutuna
pokutuna
| -| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| -| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| kohii
kohii
| -| kinandan
kinandan
| jwcraig
jwcraig
| jues
jues
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| ExactDoug
ExactDoug
| -| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| -| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| -| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| -| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| samsilveira
samsilveira
| 01Rian
01Rian
| -| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| -| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| -| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| -| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| -| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| +| jr
jr
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| chrarnoldus
chrarnoldus
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| +| punkpeye
punkpeye
| wkordalski
wkordalski
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| +| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| PeterDaveHello
PeterDaveHello
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| +| ChuKhaLi
ChuKhaLi
| NaccOll
NaccOll
| aheizi
aheizi
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| +| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| +| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| +| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| +| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| benzntech
benzntech
| ross
ross
| mr-ryan-james
mr-ryan-james
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| +| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| +| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| QuinsZouls
QuinsZouls
| anton-otee
anton-otee
| +| axkirillov
axkirillov
| bramburn
bramburn
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| +| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| +| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| dqroid
dqroid
| dairui1
dairui1
| +| chris-garrett
chris-garrett
| bbenshalom
bbenshalom
| bannzai
bannzai
| ershang-fireworks
ershang-fireworks
| f14XuanLv
f14XuanLv
| janaki-sasidhar
janaki-sasidhar
| +| forestyoo
forestyoo
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| axmo
axmo
| +| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| +| vladstudio
vladstudio
| vivekfyi
vivekfyi
| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| +| tgfjt
tgfjt
| maekawataiki
maekawataiki
| DeXtroTip
DeXtroTip
| qingyuan1109
qingyuan1109
| refactorthis
refactorthis
| robertheadley
robertheadley
| +| samir-nimbly
samir-nimbly
| sensei-woo
sensei-woo
| shaybc
shaybc
| shivamd1810
shivamd1810
| shohei-ihaya
shohei-ihaya
| shubhamgupta731
shubhamgupta731
| +| student20880
student20880
| takakoutso
takakoutso
| user202729
user202729
| cdlliuy
cdlliuy
| zetaloop
zetaloop
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| jues
jues
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lhish
lhish
| +| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| mlopezr
mlopezr
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| village-way
village-way
| philipnext
philipnext
| pokutuna
pokutuna
| pfitz
pfitz
| +| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| ertan2002
ertan2002
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| +| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| +| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| +| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| abumalick
abumalick
| +| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| +| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| +| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| +| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| +| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| +| Jdo300
Jdo300
| hesara
hesara
| | | | | diff --git a/locales/es/README.md b/locales/es/README.md index 55e337ce2b..4a2298009f 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -182,46 +182,47 @@ Usamos [changesets](https://github.com/changesets/changesets) para versionar y p -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| -| joemanley201
joemanley201
| jr
jr
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| -| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| punkpeye
punkpeye
| -| wkordalski
wkordalski
| chrarnoldus
chrarnoldus
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| -| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| -| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| Szpadel
Szpadel
| lupuletic
lupuletic
| -| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| -| PeterDaveHello
PeterDaveHello
| aheizi
aheizi
| NaccOll
NaccOll
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| -| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| -| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| -| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| -| axkirillov
axkirillov
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| -| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| philfung
philfung
| axmo
axmo
| bannzai
bannzai
| bbenshalom
bbenshalom
| -| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| ershang-fireworks
ershang-fireworks
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| -| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| asychin
asychin
| amittell
amittell
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| -| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| -| AlexandruSmirnov
AlexandruSmirnov
| nevermorec
nevermorec
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| -| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| shaybc
shaybc
| -| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| pokutuna
pokutuna
| -| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| -| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| kohii
kohii
| -| kinandan
kinandan
| jwcraig
jwcraig
| jues
jues
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| ExactDoug
ExactDoug
| -| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| -| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| -| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| -| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| samsilveira
samsilveira
| 01Rian
01Rian
| -| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| -| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| -| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| -| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| -| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| +| jr
jr
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| chrarnoldus
chrarnoldus
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| +| punkpeye
punkpeye
| wkordalski
wkordalski
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| +| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| PeterDaveHello
PeterDaveHello
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| +| ChuKhaLi
ChuKhaLi
| NaccOll
NaccOll
| aheizi
aheizi
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| +| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| +| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| +| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| +| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| benzntech
benzntech
| ross
ross
| mr-ryan-james
mr-ryan-james
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| +| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| +| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| QuinsZouls
QuinsZouls
| anton-otee
anton-otee
| +| axkirillov
axkirillov
| bramburn
bramburn
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| +| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| +| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| dqroid
dqroid
| dairui1
dairui1
| +| chris-garrett
chris-garrett
| bbenshalom
bbenshalom
| bannzai
bannzai
| ershang-fireworks
ershang-fireworks
| f14XuanLv
f14XuanLv
| janaki-sasidhar
janaki-sasidhar
| +| forestyoo
forestyoo
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| axmo
axmo
| +| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| +| vladstudio
vladstudio
| vivekfyi
vivekfyi
| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| +| tgfjt
tgfjt
| maekawataiki
maekawataiki
| DeXtroTip
DeXtroTip
| qingyuan1109
qingyuan1109
| refactorthis
refactorthis
| robertheadley
robertheadley
| +| samir-nimbly
samir-nimbly
| sensei-woo
sensei-woo
| shaybc
shaybc
| shivamd1810
shivamd1810
| shohei-ihaya
shohei-ihaya
| shubhamgupta731
shubhamgupta731
| +| student20880
student20880
| takakoutso
takakoutso
| user202729
user202729
| cdlliuy
cdlliuy
| zetaloop
zetaloop
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| jues
jues
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lhish
lhish
| +| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| mlopezr
mlopezr
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| village-way
village-way
| philipnext
philipnext
| pokutuna
pokutuna
| pfitz
pfitz
| +| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| ertan2002
ertan2002
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| +| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| +| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| +| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| abumalick
abumalick
| +| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| +| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| +| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| +| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| +| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| +| Jdo300
Jdo300
| hesara
hesara
| | | | | diff --git a/locales/fr/README.md b/locales/fr/README.md index a21af64235..7ea8ed8bfa 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -182,46 +182,47 @@ Merci à tous nos contributeurs qui ont aidé à améliorer Roo Code ! -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| -| joemanley201
joemanley201
| jr
jr
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| -| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| punkpeye
punkpeye
| -| wkordalski
wkordalski
| chrarnoldus
chrarnoldus
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| -| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| -| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| Szpadel
Szpadel
| lupuletic
lupuletic
| -| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| -| PeterDaveHello
PeterDaveHello
| aheizi
aheizi
| NaccOll
NaccOll
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| -| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| -| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| -| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| -| axkirillov
axkirillov
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| -| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| philfung
philfung
| axmo
axmo
| bannzai
bannzai
| bbenshalom
bbenshalom
| -| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| ershang-fireworks
ershang-fireworks
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| -| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| asychin
asychin
| amittell
amittell
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| -| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| -| AlexandruSmirnov
AlexandruSmirnov
| nevermorec
nevermorec
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| -| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| shaybc
shaybc
| -| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| pokutuna
pokutuna
| -| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| -| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| kohii
kohii
| -| kinandan
kinandan
| jwcraig
jwcraig
| jues
jues
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| ExactDoug
ExactDoug
| -| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| -| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| -| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| -| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| samsilveira
samsilveira
| 01Rian
01Rian
| -| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| -| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| -| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| -| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| -| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| +| jr
jr
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| chrarnoldus
chrarnoldus
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| +| punkpeye
punkpeye
| wkordalski
wkordalski
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| +| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| PeterDaveHello
PeterDaveHello
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| +| ChuKhaLi
ChuKhaLi
| NaccOll
NaccOll
| aheizi
aheizi
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| +| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| +| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| +| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| +| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| benzntech
benzntech
| ross
ross
| mr-ryan-james
mr-ryan-james
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| +| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| +| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| QuinsZouls
QuinsZouls
| anton-otee
anton-otee
| +| axkirillov
axkirillov
| bramburn
bramburn
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| +| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| +| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| dqroid
dqroid
| dairui1
dairui1
| +| chris-garrett
chris-garrett
| bbenshalom
bbenshalom
| bannzai
bannzai
| ershang-fireworks
ershang-fireworks
| f14XuanLv
f14XuanLv
| janaki-sasidhar
janaki-sasidhar
| +| forestyoo
forestyoo
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| axmo
axmo
| +| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| +| vladstudio
vladstudio
| vivekfyi
vivekfyi
| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| +| tgfjt
tgfjt
| maekawataiki
maekawataiki
| DeXtroTip
DeXtroTip
| qingyuan1109
qingyuan1109
| refactorthis
refactorthis
| robertheadley
robertheadley
| +| samir-nimbly
samir-nimbly
| sensei-woo
sensei-woo
| shaybc
shaybc
| shivamd1810
shivamd1810
| shohei-ihaya
shohei-ihaya
| shubhamgupta731
shubhamgupta731
| +| student20880
student20880
| takakoutso
takakoutso
| user202729
user202729
| cdlliuy
cdlliuy
| zetaloop
zetaloop
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| jues
jues
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lhish
lhish
| +| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| mlopezr
mlopezr
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| village-way
village-way
| philipnext
philipnext
| pokutuna
pokutuna
| pfitz
pfitz
| +| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| ertan2002
ertan2002
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| +| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| +| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| +| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| abumalick
abumalick
| +| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| +| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| +| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| +| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| +| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| +| Jdo300
Jdo300
| hesara
hesara
| | | | | diff --git a/locales/hi/README.md b/locales/hi/README.md index dcbb8dfff5..8e174bce24 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -182,46 +182,47 @@ Roo Code को बेहतर बनाने में मदद करने -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| -| joemanley201
joemanley201
| jr
jr
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| -| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| punkpeye
punkpeye
| -| wkordalski
wkordalski
| chrarnoldus
chrarnoldus
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| -| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| -| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| Szpadel
Szpadel
| lupuletic
lupuletic
| -| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| -| PeterDaveHello
PeterDaveHello
| aheizi
aheizi
| NaccOll
NaccOll
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| -| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| -| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| -| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| -| axkirillov
axkirillov
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| -| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| philfung
philfung
| axmo
axmo
| bannzai
bannzai
| bbenshalom
bbenshalom
| -| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| ershang-fireworks
ershang-fireworks
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| -| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| asychin
asychin
| amittell
amittell
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| -| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| -| AlexandruSmirnov
AlexandruSmirnov
| nevermorec
nevermorec
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| -| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| shaybc
shaybc
| -| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| pokutuna
pokutuna
| -| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| -| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| kohii
kohii
| -| kinandan
kinandan
| jwcraig
jwcraig
| jues
jues
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| ExactDoug
ExactDoug
| -| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| -| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| -| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| -| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| samsilveira
samsilveira
| 01Rian
01Rian
| -| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| -| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| -| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| -| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| -| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| +| jr
jr
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| chrarnoldus
chrarnoldus
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| +| punkpeye
punkpeye
| wkordalski
wkordalski
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| +| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| PeterDaveHello
PeterDaveHello
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| +| ChuKhaLi
ChuKhaLi
| NaccOll
NaccOll
| aheizi
aheizi
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| +| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| +| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| +| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| +| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| benzntech
benzntech
| ross
ross
| mr-ryan-james
mr-ryan-james
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| +| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| +| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| QuinsZouls
QuinsZouls
| anton-otee
anton-otee
| +| axkirillov
axkirillov
| bramburn
bramburn
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| +| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| +| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| dqroid
dqroid
| dairui1
dairui1
| +| chris-garrett
chris-garrett
| bbenshalom
bbenshalom
| bannzai
bannzai
| ershang-fireworks
ershang-fireworks
| f14XuanLv
f14XuanLv
| janaki-sasidhar
janaki-sasidhar
| +| forestyoo
forestyoo
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| axmo
axmo
| +| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| +| vladstudio
vladstudio
| vivekfyi
vivekfyi
| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| +| tgfjt
tgfjt
| maekawataiki
maekawataiki
| DeXtroTip
DeXtroTip
| qingyuan1109
qingyuan1109
| refactorthis
refactorthis
| robertheadley
robertheadley
| +| samir-nimbly
samir-nimbly
| sensei-woo
sensei-woo
| shaybc
shaybc
| shivamd1810
shivamd1810
| shohei-ihaya
shohei-ihaya
| shubhamgupta731
shubhamgupta731
| +| student20880
student20880
| takakoutso
takakoutso
| user202729
user202729
| cdlliuy
cdlliuy
| zetaloop
zetaloop
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| jues
jues
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lhish
lhish
| +| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| mlopezr
mlopezr
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| village-way
village-way
| philipnext
philipnext
| pokutuna
pokutuna
| pfitz
pfitz
| +| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| ertan2002
ertan2002
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| +| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| +| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| +| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| abumalick
abumalick
| +| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| +| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| +| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| +| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| +| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| +| Jdo300
Jdo300
| hesara
hesara
| | | | | diff --git a/locales/id/README.md b/locales/id/README.md index fae6572e7b..ebdc117626 100644 --- a/locales/id/README.md +++ b/locales/id/README.md @@ -176,46 +176,47 @@ Terima kasih kepada semua kontributor kami yang telah membantu membuat Roo Code -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| -| joemanley201
joemanley201
| jr
jr
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| -| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| punkpeye
punkpeye
| -| wkordalski
wkordalski
| chrarnoldus
chrarnoldus
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| -| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| -| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| Szpadel
Szpadel
| lupuletic
lupuletic
| -| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| -| PeterDaveHello
PeterDaveHello
| aheizi
aheizi
| NaccOll
NaccOll
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| -| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| -| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| -| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| -| axkirillov
axkirillov
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| -| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| philfung
philfung
| axmo
axmo
| bannzai
bannzai
| bbenshalom
bbenshalom
| -| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| ershang-fireworks
ershang-fireworks
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| -| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| asychin
asychin
| amittell
amittell
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| -| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| -| AlexandruSmirnov
AlexandruSmirnov
| nevermorec
nevermorec
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| -| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| shaybc
shaybc
| -| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| pokutuna
pokutuna
| -| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| -| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| kohii
kohii
| -| kinandan
kinandan
| jwcraig
jwcraig
| jues
jues
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| ExactDoug
ExactDoug
| -| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| -| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| -| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| -| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| samsilveira
samsilveira
| 01Rian
01Rian
| -| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| -| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| -| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| -| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| -| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| +| jr
jr
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| chrarnoldus
chrarnoldus
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| +| punkpeye
punkpeye
| wkordalski
wkordalski
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| +| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| PeterDaveHello
PeterDaveHello
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| +| ChuKhaLi
ChuKhaLi
| NaccOll
NaccOll
| aheizi
aheizi
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| +| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| +| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| +| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| +| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| benzntech
benzntech
| ross
ross
| mr-ryan-james
mr-ryan-james
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| +| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| +| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| QuinsZouls
QuinsZouls
| anton-otee
anton-otee
| +| axkirillov
axkirillov
| bramburn
bramburn
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| +| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| +| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| dqroid
dqroid
| dairui1
dairui1
| +| chris-garrett
chris-garrett
| bbenshalom
bbenshalom
| bannzai
bannzai
| ershang-fireworks
ershang-fireworks
| f14XuanLv
f14XuanLv
| janaki-sasidhar
janaki-sasidhar
| +| forestyoo
forestyoo
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| axmo
axmo
| +| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| +| vladstudio
vladstudio
| vivekfyi
vivekfyi
| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| +| tgfjt
tgfjt
| maekawataiki
maekawataiki
| DeXtroTip
DeXtroTip
| qingyuan1109
qingyuan1109
| refactorthis
refactorthis
| robertheadley
robertheadley
| +| samir-nimbly
samir-nimbly
| sensei-woo
sensei-woo
| shaybc
shaybc
| shivamd1810
shivamd1810
| shohei-ihaya
shohei-ihaya
| shubhamgupta731
shubhamgupta731
| +| student20880
student20880
| takakoutso
takakoutso
| user202729
user202729
| cdlliuy
cdlliuy
| zetaloop
zetaloop
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| jues
jues
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lhish
lhish
| +| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| mlopezr
mlopezr
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| village-way
village-way
| philipnext
philipnext
| pokutuna
pokutuna
| pfitz
pfitz
| +| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| ertan2002
ertan2002
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| +| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| +| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| +| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| abumalick
abumalick
| +| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| +| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| +| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| +| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| +| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| +| Jdo300
Jdo300
| hesara
hesara
| | | | | diff --git a/locales/it/README.md b/locales/it/README.md index a9237c46dc..70c034677b 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -182,46 +182,47 @@ Grazie a tutti i nostri contributori che hanno aiutato a migliorare Roo Code! -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| -| joemanley201
joemanley201
| jr
jr
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| -| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| punkpeye
punkpeye
| -| wkordalski
wkordalski
| chrarnoldus
chrarnoldus
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| -| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| -| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| Szpadel
Szpadel
| lupuletic
lupuletic
| -| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| -| PeterDaveHello
PeterDaveHello
| aheizi
aheizi
| NaccOll
NaccOll
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| -| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| -| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| -| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| -| axkirillov
axkirillov
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| -| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| philfung
philfung
| axmo
axmo
| bannzai
bannzai
| bbenshalom
bbenshalom
| -| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| ershang-fireworks
ershang-fireworks
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| -| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| asychin
asychin
| amittell
amittell
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| -| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| -| AlexandruSmirnov
AlexandruSmirnov
| nevermorec
nevermorec
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| -| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| shaybc
shaybc
| -| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| pokutuna
pokutuna
| -| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| -| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| kohii
kohii
| -| kinandan
kinandan
| jwcraig
jwcraig
| jues
jues
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| ExactDoug
ExactDoug
| -| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| -| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| -| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| -| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| samsilveira
samsilveira
| 01Rian
01Rian
| -| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| -| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| -| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| -| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| -| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| +| jr
jr
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| chrarnoldus
chrarnoldus
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| +| punkpeye
punkpeye
| wkordalski
wkordalski
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| +| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| PeterDaveHello
PeterDaveHello
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| +| ChuKhaLi
ChuKhaLi
| NaccOll
NaccOll
| aheizi
aheizi
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| +| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| +| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| +| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| +| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| benzntech
benzntech
| ross
ross
| mr-ryan-james
mr-ryan-james
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| +| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| +| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| QuinsZouls
QuinsZouls
| anton-otee
anton-otee
| +| axkirillov
axkirillov
| bramburn
bramburn
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| +| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| +| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| dqroid
dqroid
| dairui1
dairui1
| +| chris-garrett
chris-garrett
| bbenshalom
bbenshalom
| bannzai
bannzai
| ershang-fireworks
ershang-fireworks
| f14XuanLv
f14XuanLv
| janaki-sasidhar
janaki-sasidhar
| +| forestyoo
forestyoo
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| axmo
axmo
| +| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| +| vladstudio
vladstudio
| vivekfyi
vivekfyi
| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| +| tgfjt
tgfjt
| maekawataiki
maekawataiki
| DeXtroTip
DeXtroTip
| qingyuan1109
qingyuan1109
| refactorthis
refactorthis
| robertheadley
robertheadley
| +| samir-nimbly
samir-nimbly
| sensei-woo
sensei-woo
| shaybc
shaybc
| shivamd1810
shivamd1810
| shohei-ihaya
shohei-ihaya
| shubhamgupta731
shubhamgupta731
| +| student20880
student20880
| takakoutso
takakoutso
| user202729
user202729
| cdlliuy
cdlliuy
| zetaloop
zetaloop
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| jues
jues
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lhish
lhish
| +| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| mlopezr
mlopezr
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| village-way
village-way
| philipnext
philipnext
| pokutuna
pokutuna
| pfitz
pfitz
| +| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| ertan2002
ertan2002
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| +| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| +| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| +| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| abumalick
abumalick
| +| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| +| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| +| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| +| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| +| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| +| Jdo300
Jdo300
| hesara
hesara
| | | | | diff --git a/locales/ja/README.md b/locales/ja/README.md index 3650f18571..15cbde889e 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -182,46 +182,47 @@ Roo Codeの改善に貢献してくれたすべての貢献者に感謝します -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| -| joemanley201
joemanley201
| jr
jr
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| -| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| punkpeye
punkpeye
| -| wkordalski
wkordalski
| chrarnoldus
chrarnoldus
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| -| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| -| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| Szpadel
Szpadel
| lupuletic
lupuletic
| -| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| -| PeterDaveHello
PeterDaveHello
| aheizi
aheizi
| NaccOll
NaccOll
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| -| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| -| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| -| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| -| axkirillov
axkirillov
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| -| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| philfung
philfung
| axmo
axmo
| bannzai
bannzai
| bbenshalom
bbenshalom
| -| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| ershang-fireworks
ershang-fireworks
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| -| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| asychin
asychin
| amittell
amittell
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| -| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| -| AlexandruSmirnov
AlexandruSmirnov
| nevermorec
nevermorec
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| -| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| shaybc
shaybc
| -| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| pokutuna
pokutuna
| -| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| -| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| kohii
kohii
| -| kinandan
kinandan
| jwcraig
jwcraig
| jues
jues
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| ExactDoug
ExactDoug
| -| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| -| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| -| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| -| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| samsilveira
samsilveira
| 01Rian
01Rian
| -| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| -| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| -| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| -| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| -| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| +| jr
jr
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| chrarnoldus
chrarnoldus
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| +| punkpeye
punkpeye
| wkordalski
wkordalski
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| +| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| PeterDaveHello
PeterDaveHello
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| +| ChuKhaLi
ChuKhaLi
| NaccOll
NaccOll
| aheizi
aheizi
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| +| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| +| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| +| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| +| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| benzntech
benzntech
| ross
ross
| mr-ryan-james
mr-ryan-james
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| +| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| +| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| QuinsZouls
QuinsZouls
| anton-otee
anton-otee
| +| axkirillov
axkirillov
| bramburn
bramburn
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| +| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| +| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| dqroid
dqroid
| dairui1
dairui1
| +| chris-garrett
chris-garrett
| bbenshalom
bbenshalom
| bannzai
bannzai
| ershang-fireworks
ershang-fireworks
| f14XuanLv
f14XuanLv
| janaki-sasidhar
janaki-sasidhar
| +| forestyoo
forestyoo
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| axmo
axmo
| +| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| +| vladstudio
vladstudio
| vivekfyi
vivekfyi
| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| +| tgfjt
tgfjt
| maekawataiki
maekawataiki
| DeXtroTip
DeXtroTip
| qingyuan1109
qingyuan1109
| refactorthis
refactorthis
| robertheadley
robertheadley
| +| samir-nimbly
samir-nimbly
| sensei-woo
sensei-woo
| shaybc
shaybc
| shivamd1810
shivamd1810
| shohei-ihaya
shohei-ihaya
| shubhamgupta731
shubhamgupta731
| +| student20880
student20880
| takakoutso
takakoutso
| user202729
user202729
| cdlliuy
cdlliuy
| zetaloop
zetaloop
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| jues
jues
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lhish
lhish
| +| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| mlopezr
mlopezr
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| village-way
village-way
| philipnext
philipnext
| pokutuna
pokutuna
| pfitz
pfitz
| +| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| ertan2002
ertan2002
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| +| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| +| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| +| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| abumalick
abumalick
| +| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| +| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| +| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| +| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| +| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| +| Jdo300
Jdo300
| hesara
hesara
| | | | | diff --git a/locales/ko/README.md b/locales/ko/README.md index d5f26d1f4e..9453cdd389 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -182,46 +182,47 @@ Roo Code를 더 좋게 만드는 데 도움을 준 모든 기여자에게 감사 -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| -| joemanley201
joemanley201
| jr
jr
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| -| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| punkpeye
punkpeye
| -| wkordalski
wkordalski
| chrarnoldus
chrarnoldus
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| -| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| -| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| Szpadel
Szpadel
| lupuletic
lupuletic
| -| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| -| PeterDaveHello
PeterDaveHello
| aheizi
aheizi
| NaccOll
NaccOll
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| -| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| -| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| -| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| -| axkirillov
axkirillov
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| -| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| philfung
philfung
| axmo
axmo
| bannzai
bannzai
| bbenshalom
bbenshalom
| -| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| ershang-fireworks
ershang-fireworks
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| -| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| asychin
asychin
| amittell
amittell
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| -| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| -| AlexandruSmirnov
AlexandruSmirnov
| nevermorec
nevermorec
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| -| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| shaybc
shaybc
| -| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| pokutuna
pokutuna
| -| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| -| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| kohii
kohii
| -| kinandan
kinandan
| jwcraig
jwcraig
| jues
jues
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| ExactDoug
ExactDoug
| -| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| -| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| -| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| -| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| samsilveira
samsilveira
| 01Rian
01Rian
| -| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| -| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| -| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| -| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| -| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| +| jr
jr
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| chrarnoldus
chrarnoldus
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| +| punkpeye
punkpeye
| wkordalski
wkordalski
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| +| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| PeterDaveHello
PeterDaveHello
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| +| ChuKhaLi
ChuKhaLi
| NaccOll
NaccOll
| aheizi
aheizi
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| +| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| +| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| +| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| +| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| benzntech
benzntech
| ross
ross
| mr-ryan-james
mr-ryan-james
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| +| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| +| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| QuinsZouls
QuinsZouls
| anton-otee
anton-otee
| +| axkirillov
axkirillov
| bramburn
bramburn
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| +| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| +| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| dqroid
dqroid
| dairui1
dairui1
| +| chris-garrett
chris-garrett
| bbenshalom
bbenshalom
| bannzai
bannzai
| ershang-fireworks
ershang-fireworks
| f14XuanLv
f14XuanLv
| janaki-sasidhar
janaki-sasidhar
| +| forestyoo
forestyoo
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| axmo
axmo
| +| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| +| vladstudio
vladstudio
| vivekfyi
vivekfyi
| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| +| tgfjt
tgfjt
| maekawataiki
maekawataiki
| DeXtroTip
DeXtroTip
| qingyuan1109
qingyuan1109
| refactorthis
refactorthis
| robertheadley
robertheadley
| +| samir-nimbly
samir-nimbly
| sensei-woo
sensei-woo
| shaybc
shaybc
| shivamd1810
shivamd1810
| shohei-ihaya
shohei-ihaya
| shubhamgupta731
shubhamgupta731
| +| student20880
student20880
| takakoutso
takakoutso
| user202729
user202729
| cdlliuy
cdlliuy
| zetaloop
zetaloop
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| jues
jues
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lhish
lhish
| +| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| mlopezr
mlopezr
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| village-way
village-way
| philipnext
philipnext
| pokutuna
pokutuna
| pfitz
pfitz
| +| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| ertan2002
ertan2002
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| +| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| +| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| +| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| abumalick
abumalick
| +| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| +| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| +| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| +| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| +| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| +| Jdo300
Jdo300
| hesara
hesara
| | | | | diff --git a/locales/nl/README.md b/locales/nl/README.md index a167b102fb..ec4e34f69e 100644 --- a/locales/nl/README.md +++ b/locales/nl/README.md @@ -182,46 +182,47 @@ Dank aan alle bijdragers die Roo Code beter hebben gemaakt! -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| -| joemanley201
joemanley201
| jr
jr
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| -| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| punkpeye
punkpeye
| -| wkordalski
wkordalski
| chrarnoldus
chrarnoldus
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| -| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| -| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| Szpadel
Szpadel
| lupuletic
lupuletic
| -| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| -| PeterDaveHello
PeterDaveHello
| aheizi
aheizi
| NaccOll
NaccOll
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| -| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| -| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| -| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| -| axkirillov
axkirillov
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| -| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| philfung
philfung
| axmo
axmo
| bannzai
bannzai
| bbenshalom
bbenshalom
| -| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| ershang-fireworks
ershang-fireworks
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| -| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| asychin
asychin
| amittell
amittell
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| -| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| -| AlexandruSmirnov
AlexandruSmirnov
| nevermorec
nevermorec
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| -| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| shaybc
shaybc
| -| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| pokutuna
pokutuna
| -| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| -| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| kohii
kohii
| -| kinandan
kinandan
| jwcraig
jwcraig
| jues
jues
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| ExactDoug
ExactDoug
| -| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| -| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| -| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| -| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| samsilveira
samsilveira
| 01Rian
01Rian
| -| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| -| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| -| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| -| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| -| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| +| jr
jr
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| chrarnoldus
chrarnoldus
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| +| punkpeye
punkpeye
| wkordalski
wkordalski
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| +| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| PeterDaveHello
PeterDaveHello
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| +| ChuKhaLi
ChuKhaLi
| NaccOll
NaccOll
| aheizi
aheizi
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| +| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| +| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| +| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| +| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| benzntech
benzntech
| ross
ross
| mr-ryan-james
mr-ryan-james
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| +| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| +| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| QuinsZouls
QuinsZouls
| anton-otee
anton-otee
| +| axkirillov
axkirillov
| bramburn
bramburn
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| +| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| +| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| dqroid
dqroid
| dairui1
dairui1
| +| chris-garrett
chris-garrett
| bbenshalom
bbenshalom
| bannzai
bannzai
| ershang-fireworks
ershang-fireworks
| f14XuanLv
f14XuanLv
| janaki-sasidhar
janaki-sasidhar
| +| forestyoo
forestyoo
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| axmo
axmo
| +| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| +| vladstudio
vladstudio
| vivekfyi
vivekfyi
| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| +| tgfjt
tgfjt
| maekawataiki
maekawataiki
| DeXtroTip
DeXtroTip
| qingyuan1109
qingyuan1109
| refactorthis
refactorthis
| robertheadley
robertheadley
| +| samir-nimbly
samir-nimbly
| sensei-woo
sensei-woo
| shaybc
shaybc
| shivamd1810
shivamd1810
| shohei-ihaya
shohei-ihaya
| shubhamgupta731
shubhamgupta731
| +| student20880
student20880
| takakoutso
takakoutso
| user202729
user202729
| cdlliuy
cdlliuy
| zetaloop
zetaloop
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| jues
jues
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lhish
lhish
| +| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| mlopezr
mlopezr
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| village-way
village-way
| philipnext
philipnext
| pokutuna
pokutuna
| pfitz
pfitz
| +| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| ertan2002
ertan2002
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| +| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| +| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| +| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| abumalick
abumalick
| +| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| +| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| +| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| +| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| +| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| +| Jdo300
Jdo300
| hesara
hesara
| | | | | diff --git a/locales/pl/README.md b/locales/pl/README.md index f4e67900d6..4424ef18ad 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -182,46 +182,47 @@ Dziękujemy wszystkim naszym współtwórcom, którzy pomogli ulepszyć Roo Code -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| -| joemanley201
joemanley201
| jr
jr
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| -| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| punkpeye
punkpeye
| -| wkordalski
wkordalski
| chrarnoldus
chrarnoldus
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| -| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| -| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| Szpadel
Szpadel
| lupuletic
lupuletic
| -| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| -| PeterDaveHello
PeterDaveHello
| aheizi
aheizi
| NaccOll
NaccOll
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| -| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| -| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| -| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| -| axkirillov
axkirillov
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| -| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| philfung
philfung
| axmo
axmo
| bannzai
bannzai
| bbenshalom
bbenshalom
| -| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| ershang-fireworks
ershang-fireworks
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| -| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| asychin
asychin
| amittell
amittell
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| -| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| -| AlexandruSmirnov
AlexandruSmirnov
| nevermorec
nevermorec
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| -| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| shaybc
shaybc
| -| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| pokutuna
pokutuna
| -| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| -| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| kohii
kohii
| -| kinandan
kinandan
| jwcraig
jwcraig
| jues
jues
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| ExactDoug
ExactDoug
| -| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| -| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| -| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| -| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| samsilveira
samsilveira
| 01Rian
01Rian
| -| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| -| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| -| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| -| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| -| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| +| jr
jr
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| chrarnoldus
chrarnoldus
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| +| punkpeye
punkpeye
| wkordalski
wkordalski
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| +| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| PeterDaveHello
PeterDaveHello
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| +| ChuKhaLi
ChuKhaLi
| NaccOll
NaccOll
| aheizi
aheizi
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| +| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| +| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| +| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| +| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| benzntech
benzntech
| ross
ross
| mr-ryan-james
mr-ryan-james
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| +| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| +| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| QuinsZouls
QuinsZouls
| anton-otee
anton-otee
| +| axkirillov
axkirillov
| bramburn
bramburn
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| +| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| +| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| dqroid
dqroid
| dairui1
dairui1
| +| chris-garrett
chris-garrett
| bbenshalom
bbenshalom
| bannzai
bannzai
| ershang-fireworks
ershang-fireworks
| f14XuanLv
f14XuanLv
| janaki-sasidhar
janaki-sasidhar
| +| forestyoo
forestyoo
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| axmo
axmo
| +| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| +| vladstudio
vladstudio
| vivekfyi
vivekfyi
| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| +| tgfjt
tgfjt
| maekawataiki
maekawataiki
| DeXtroTip
DeXtroTip
| qingyuan1109
qingyuan1109
| refactorthis
refactorthis
| robertheadley
robertheadley
| +| samir-nimbly
samir-nimbly
| sensei-woo
sensei-woo
| shaybc
shaybc
| shivamd1810
shivamd1810
| shohei-ihaya
shohei-ihaya
| shubhamgupta731
shubhamgupta731
| +| student20880
student20880
| takakoutso
takakoutso
| user202729
user202729
| cdlliuy
cdlliuy
| zetaloop
zetaloop
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| jues
jues
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lhish
lhish
| +| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| mlopezr
mlopezr
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| village-way
village-way
| philipnext
philipnext
| pokutuna
pokutuna
| pfitz
pfitz
| +| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| ertan2002
ertan2002
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| +| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| +| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| +| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| abumalick
abumalick
| +| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| +| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| +| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| +| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| +| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| +| Jdo300
Jdo300
| hesara
hesara
| | | | | diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index 3b2042fcc1..a8ab2c3890 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -182,46 +182,47 @@ Obrigado a todos os nossos contribuidores que ajudaram a tornar o Roo Code melho -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| -| joemanley201
joemanley201
| jr
jr
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| -| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| punkpeye
punkpeye
| -| wkordalski
wkordalski
| chrarnoldus
chrarnoldus
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| -| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| -| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| Szpadel
Szpadel
| lupuletic
lupuletic
| -| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| -| PeterDaveHello
PeterDaveHello
| aheizi
aheizi
| NaccOll
NaccOll
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| -| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| -| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| -| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| -| axkirillov
axkirillov
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| -| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| philfung
philfung
| axmo
axmo
| bannzai
bannzai
| bbenshalom
bbenshalom
| -| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| ershang-fireworks
ershang-fireworks
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| -| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| asychin
asychin
| amittell
amittell
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| -| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| -| AlexandruSmirnov
AlexandruSmirnov
| nevermorec
nevermorec
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| -| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| shaybc
shaybc
| -| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| pokutuna
pokutuna
| -| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| -| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| kohii
kohii
| -| kinandan
kinandan
| jwcraig
jwcraig
| jues
jues
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| ExactDoug
ExactDoug
| -| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| -| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| -| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| -| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| samsilveira
samsilveira
| 01Rian
01Rian
| -| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| -| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| -| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| -| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| -| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| +| jr
jr
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| chrarnoldus
chrarnoldus
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| +| punkpeye
punkpeye
| wkordalski
wkordalski
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| +| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| PeterDaveHello
PeterDaveHello
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| +| ChuKhaLi
ChuKhaLi
| NaccOll
NaccOll
| aheizi
aheizi
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| +| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| +| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| +| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| +| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| benzntech
benzntech
| ross
ross
| mr-ryan-james
mr-ryan-james
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| +| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| +| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| QuinsZouls
QuinsZouls
| anton-otee
anton-otee
| +| axkirillov
axkirillov
| bramburn
bramburn
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| +| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| +| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| dqroid
dqroid
| dairui1
dairui1
| +| chris-garrett
chris-garrett
| bbenshalom
bbenshalom
| bannzai
bannzai
| ershang-fireworks
ershang-fireworks
| f14XuanLv
f14XuanLv
| janaki-sasidhar
janaki-sasidhar
| +| forestyoo
forestyoo
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| axmo
axmo
| +| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| +| vladstudio
vladstudio
| vivekfyi
vivekfyi
| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| +| tgfjt
tgfjt
| maekawataiki
maekawataiki
| DeXtroTip
DeXtroTip
| qingyuan1109
qingyuan1109
| refactorthis
refactorthis
| robertheadley
robertheadley
| +| samir-nimbly
samir-nimbly
| sensei-woo
sensei-woo
| shaybc
shaybc
| shivamd1810
shivamd1810
| shohei-ihaya
shohei-ihaya
| shubhamgupta731
shubhamgupta731
| +| student20880
student20880
| takakoutso
takakoutso
| user202729
user202729
| cdlliuy
cdlliuy
| zetaloop
zetaloop
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| jues
jues
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lhish
lhish
| +| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| mlopezr
mlopezr
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| village-way
village-way
| philipnext
philipnext
| pokutuna
pokutuna
| pfitz
pfitz
| +| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| ertan2002
ertan2002
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| +| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| +| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| +| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| abumalick
abumalick
| +| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| +| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| +| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| +| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| +| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| +| Jdo300
Jdo300
| hesara
hesara
| | | | | diff --git a/locales/ru/README.md b/locales/ru/README.md index cfa3a843ef..84f6830e52 100644 --- a/locales/ru/README.md +++ b/locales/ru/README.md @@ -182,46 +182,47 @@ code --install-extension bin/roo-cline-.vsix -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| -| joemanley201
joemanley201
| jr
jr
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| -| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| punkpeye
punkpeye
| -| wkordalski
wkordalski
| chrarnoldus
chrarnoldus
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| -| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| -| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| Szpadel
Szpadel
| lupuletic
lupuletic
| -| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| -| PeterDaveHello
PeterDaveHello
| aheizi
aheizi
| NaccOll
NaccOll
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| -| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| -| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| -| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| -| axkirillov
axkirillov
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| -| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| philfung
philfung
| axmo
axmo
| bannzai
bannzai
| bbenshalom
bbenshalom
| -| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| ershang-fireworks
ershang-fireworks
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| -| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| asychin
asychin
| amittell
amittell
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| -| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| -| AlexandruSmirnov
AlexandruSmirnov
| nevermorec
nevermorec
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| -| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| shaybc
shaybc
| -| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| pokutuna
pokutuna
| -| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| -| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| kohii
kohii
| -| kinandan
kinandan
| jwcraig
jwcraig
| jues
jues
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| ExactDoug
ExactDoug
| -| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| -| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| -| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| -| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| samsilveira
samsilveira
| 01Rian
01Rian
| -| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| -| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| -| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| -| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| -| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| +| jr
jr
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| chrarnoldus
chrarnoldus
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| +| punkpeye
punkpeye
| wkordalski
wkordalski
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| +| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| PeterDaveHello
PeterDaveHello
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| +| ChuKhaLi
ChuKhaLi
| NaccOll
NaccOll
| aheizi
aheizi
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| +| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| +| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| +| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| +| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| benzntech
benzntech
| ross
ross
| mr-ryan-james
mr-ryan-james
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| +| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| +| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| QuinsZouls
QuinsZouls
| anton-otee
anton-otee
| +| axkirillov
axkirillov
| bramburn
bramburn
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| +| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| +| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| dqroid
dqroid
| dairui1
dairui1
| +| chris-garrett
chris-garrett
| bbenshalom
bbenshalom
| bannzai
bannzai
| ershang-fireworks
ershang-fireworks
| f14XuanLv
f14XuanLv
| janaki-sasidhar
janaki-sasidhar
| +| forestyoo
forestyoo
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| axmo
axmo
| +| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| +| vladstudio
vladstudio
| vivekfyi
vivekfyi
| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| +| tgfjt
tgfjt
| maekawataiki
maekawataiki
| DeXtroTip
DeXtroTip
| qingyuan1109
qingyuan1109
| refactorthis
refactorthis
| robertheadley
robertheadley
| +| samir-nimbly
samir-nimbly
| sensei-woo
sensei-woo
| shaybc
shaybc
| shivamd1810
shivamd1810
| shohei-ihaya
shohei-ihaya
| shubhamgupta731
shubhamgupta731
| +| student20880
student20880
| takakoutso
takakoutso
| user202729
user202729
| cdlliuy
cdlliuy
| zetaloop
zetaloop
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| jues
jues
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lhish
lhish
| +| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| mlopezr
mlopezr
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| village-way
village-way
| philipnext
philipnext
| pokutuna
pokutuna
| pfitz
pfitz
| +| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| ertan2002
ertan2002
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| +| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| +| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| +| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| abumalick
abumalick
| +| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| +| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| +| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| +| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| +| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| +| Jdo300
Jdo300
| hesara
hesara
| | | | | diff --git a/locales/tr/README.md b/locales/tr/README.md index ed099e92c7..579b7da4fc 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -182,46 +182,47 @@ Roo Code'u daha iyi hale getirmeye yardımcı olan tüm katkıda bulunanlara te -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| -| joemanley201
joemanley201
| jr
jr
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| -| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| punkpeye
punkpeye
| -| wkordalski
wkordalski
| chrarnoldus
chrarnoldus
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| -| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| -| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| Szpadel
Szpadel
| lupuletic
lupuletic
| -| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| -| PeterDaveHello
PeterDaveHello
| aheizi
aheizi
| NaccOll
NaccOll
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| -| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| -| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| -| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| -| axkirillov
axkirillov
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| -| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| philfung
philfung
| axmo
axmo
| bannzai
bannzai
| bbenshalom
bbenshalom
| -| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| ershang-fireworks
ershang-fireworks
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| -| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| asychin
asychin
| amittell
amittell
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| -| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| -| AlexandruSmirnov
AlexandruSmirnov
| nevermorec
nevermorec
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| -| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| shaybc
shaybc
| -| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| pokutuna
pokutuna
| -| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| -| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| kohii
kohii
| -| kinandan
kinandan
| jwcraig
jwcraig
| jues
jues
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| ExactDoug
ExactDoug
| -| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| -| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| -| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| -| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| samsilveira
samsilveira
| 01Rian
01Rian
| -| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| -| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| -| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| -| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| -| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| +| jr
jr
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| chrarnoldus
chrarnoldus
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| +| punkpeye
punkpeye
| wkordalski
wkordalski
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| +| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| PeterDaveHello
PeterDaveHello
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| +| ChuKhaLi
ChuKhaLi
| NaccOll
NaccOll
| aheizi
aheizi
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| +| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| +| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| +| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| +| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| benzntech
benzntech
| ross
ross
| mr-ryan-james
mr-ryan-james
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| +| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| +| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| QuinsZouls
QuinsZouls
| anton-otee
anton-otee
| +| axkirillov
axkirillov
| bramburn
bramburn
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| +| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| +| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| dqroid
dqroid
| dairui1
dairui1
| +| chris-garrett
chris-garrett
| bbenshalom
bbenshalom
| bannzai
bannzai
| ershang-fireworks
ershang-fireworks
| f14XuanLv
f14XuanLv
| janaki-sasidhar
janaki-sasidhar
| +| forestyoo
forestyoo
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| axmo
axmo
| +| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| +| vladstudio
vladstudio
| vivekfyi
vivekfyi
| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| +| tgfjt
tgfjt
| maekawataiki
maekawataiki
| DeXtroTip
DeXtroTip
| qingyuan1109
qingyuan1109
| refactorthis
refactorthis
| robertheadley
robertheadley
| +| samir-nimbly
samir-nimbly
| sensei-woo
sensei-woo
| shaybc
shaybc
| shivamd1810
shivamd1810
| shohei-ihaya
shohei-ihaya
| shubhamgupta731
shubhamgupta731
| +| student20880
student20880
| takakoutso
takakoutso
| user202729
user202729
| cdlliuy
cdlliuy
| zetaloop
zetaloop
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| jues
jues
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lhish
lhish
| +| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| mlopezr
mlopezr
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| village-way
village-way
| philipnext
philipnext
| pokutuna
pokutuna
| pfitz
pfitz
| +| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| ertan2002
ertan2002
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| +| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| +| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| +| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| abumalick
abumalick
| +| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| +| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| +| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| +| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| +| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| +| Jdo300
Jdo300
| hesara
hesara
| | | | | diff --git a/locales/vi/README.md b/locales/vi/README.md index 0c37d84ce8..b6a133b5c7 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -182,46 +182,47 @@ Cảm ơn tất cả những người đóng góp đã giúp cải thiện Roo C -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| -| joemanley201
joemanley201
| jr
jr
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| -| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| punkpeye
punkpeye
| -| wkordalski
wkordalski
| chrarnoldus
chrarnoldus
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| -| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| -| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| Szpadel
Szpadel
| lupuletic
lupuletic
| -| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| -| PeterDaveHello
PeterDaveHello
| aheizi
aheizi
| NaccOll
NaccOll
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| -| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| -| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| -| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| -| axkirillov
axkirillov
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| -| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| philfung
philfung
| axmo
axmo
| bannzai
bannzai
| bbenshalom
bbenshalom
| -| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| ershang-fireworks
ershang-fireworks
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| -| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| asychin
asychin
| amittell
amittell
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| -| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| -| AlexandruSmirnov
AlexandruSmirnov
| nevermorec
nevermorec
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| -| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| shaybc
shaybc
| -| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| pokutuna
pokutuna
| -| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| -| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| kohii
kohii
| -| kinandan
kinandan
| jwcraig
jwcraig
| jues
jues
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| ExactDoug
ExactDoug
| -| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| -| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| -| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| -| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| samsilveira
samsilveira
| 01Rian
01Rian
| -| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| -| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| -| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| -| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| -| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| +| jr
jr
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| chrarnoldus
chrarnoldus
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| +| punkpeye
punkpeye
| wkordalski
wkordalski
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| +| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| PeterDaveHello
PeterDaveHello
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| +| ChuKhaLi
ChuKhaLi
| NaccOll
NaccOll
| aheizi
aheizi
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| +| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| +| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| +| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| +| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| benzntech
benzntech
| ross
ross
| mr-ryan-james
mr-ryan-james
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| +| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| +| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| QuinsZouls
QuinsZouls
| anton-otee
anton-otee
| +| axkirillov
axkirillov
| bramburn
bramburn
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| +| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| +| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| dqroid
dqroid
| dairui1
dairui1
| +| chris-garrett
chris-garrett
| bbenshalom
bbenshalom
| bannzai
bannzai
| ershang-fireworks
ershang-fireworks
| f14XuanLv
f14XuanLv
| janaki-sasidhar
janaki-sasidhar
| +| forestyoo
forestyoo
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| axmo
axmo
| +| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| +| vladstudio
vladstudio
| vivekfyi
vivekfyi
| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| +| tgfjt
tgfjt
| maekawataiki
maekawataiki
| DeXtroTip
DeXtroTip
| qingyuan1109
qingyuan1109
| refactorthis
refactorthis
| robertheadley
robertheadley
| +| samir-nimbly
samir-nimbly
| sensei-woo
sensei-woo
| shaybc
shaybc
| shivamd1810
shivamd1810
| shohei-ihaya
shohei-ihaya
| shubhamgupta731
shubhamgupta731
| +| student20880
student20880
| takakoutso
takakoutso
| user202729
user202729
| cdlliuy
cdlliuy
| zetaloop
zetaloop
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| jues
jues
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lhish
lhish
| +| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| mlopezr
mlopezr
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| village-way
village-way
| philipnext
philipnext
| pokutuna
pokutuna
| pfitz
pfitz
| +| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| ertan2002
ertan2002
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| +| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| +| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| +| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| abumalick
abumalick
| +| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| +| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| +| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| +| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| +| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| +| Jdo300
Jdo300
| hesara
hesara
| | | | | diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index d308eb0304..dd2e654dbe 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -182,46 +182,47 @@ code --install-extension bin/roo-cline-.vsix -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| -| joemanley201
joemanley201
| jr
jr
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| -| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| punkpeye
punkpeye
| -| wkordalski
wkordalski
| chrarnoldus
chrarnoldus
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| -| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| -| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| Szpadel
Szpadel
| lupuletic
lupuletic
| -| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| -| PeterDaveHello
PeterDaveHello
| aheizi
aheizi
| NaccOll
NaccOll
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| -| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| -| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| -| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| -| axkirillov
axkirillov
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| -| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| philfung
philfung
| axmo
axmo
| bannzai
bannzai
| bbenshalom
bbenshalom
| -| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| ershang-fireworks
ershang-fireworks
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| -| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| asychin
asychin
| amittell
amittell
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| -| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| -| AlexandruSmirnov
AlexandruSmirnov
| nevermorec
nevermorec
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| -| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| shaybc
shaybc
| -| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| pokutuna
pokutuna
| -| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| -| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| kohii
kohii
| -| kinandan
kinandan
| jwcraig
jwcraig
| jues
jues
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| ExactDoug
ExactDoug
| -| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| -| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| -| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| -| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| samsilveira
samsilveira
| 01Rian
01Rian
| -| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| -| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| -| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| -| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| -| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| +| jr
jr
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| chrarnoldus
chrarnoldus
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| +| punkpeye
punkpeye
| wkordalski
wkordalski
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| +| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| PeterDaveHello
PeterDaveHello
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| +| ChuKhaLi
ChuKhaLi
| NaccOll
NaccOll
| aheizi
aheizi
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| +| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| +| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| +| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| +| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| benzntech
benzntech
| ross
ross
| mr-ryan-james
mr-ryan-james
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| +| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| +| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| QuinsZouls
QuinsZouls
| anton-otee
anton-otee
| +| axkirillov
axkirillov
| bramburn
bramburn
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| +| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| +| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| dqroid
dqroid
| dairui1
dairui1
| +| chris-garrett
chris-garrett
| bbenshalom
bbenshalom
| bannzai
bannzai
| ershang-fireworks
ershang-fireworks
| f14XuanLv
f14XuanLv
| janaki-sasidhar
janaki-sasidhar
| +| forestyoo
forestyoo
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| axmo
axmo
| +| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| +| vladstudio
vladstudio
| vivekfyi
vivekfyi
| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| +| tgfjt
tgfjt
| maekawataiki
maekawataiki
| DeXtroTip
DeXtroTip
| qingyuan1109
qingyuan1109
| refactorthis
refactorthis
| robertheadley
robertheadley
| +| samir-nimbly
samir-nimbly
| sensei-woo
sensei-woo
| shaybc
shaybc
| shivamd1810
shivamd1810
| shohei-ihaya
shohei-ihaya
| shubhamgupta731
shubhamgupta731
| +| student20880
student20880
| takakoutso
takakoutso
| user202729
user202729
| cdlliuy
cdlliuy
| zetaloop
zetaloop
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| jues
jues
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lhish
lhish
| +| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| mlopezr
mlopezr
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| village-way
village-way
| philipnext
philipnext
| pokutuna
pokutuna
| pfitz
pfitz
| +| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| ertan2002
ertan2002
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| +| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| +| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| +| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| abumalick
abumalick
| +| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| +| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| +| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| +| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| +| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| +| Jdo300
Jdo300
| hesara
hesara
| | | | | diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index 9767d316ed..85bcf647bb 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -183,46 +183,47 @@ code --install-extension bin/roo-cline-.vsix -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| -| joemanley201
joemanley201
| jr
jr
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| -| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| punkpeye
punkpeye
| -| wkordalski
wkordalski
| chrarnoldus
chrarnoldus
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| -| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| -| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| Szpadel
Szpadel
| lupuletic
lupuletic
| -| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| ChuKhaLi
ChuKhaLi
| -| PeterDaveHello
PeterDaveHello
| aheizi
aheizi
| NaccOll
NaccOll
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| -| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| -| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| ross
ross
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| -| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| bramburn
bramburn
| anton-otee
anton-otee
| benzntech
benzntech
| -| axkirillov
axkirillov
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| -| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| philfung
philfung
| axmo
axmo
| bannzai
bannzai
| bbenshalom
bbenshalom
| -| chris-garrett
chris-garrett
| dairui1
dairui1
| dqroid
dqroid
| ershang-fireworks
ershang-fireworks
| janaki-sasidhar
janaki-sasidhar
| forestyoo
forestyoo
| -| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| asychin
asychin
| amittell
amittell
| -| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| vladstudio
vladstudio
| vivekfyi
vivekfyi
| -| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| tgfjt
tgfjt
| maekawataiki
maekawataiki
| -| AlexandruSmirnov
AlexandruSmirnov
| nevermorec
nevermorec
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| -| takakoutso
takakoutso
| student20880
student20880
| shubhamgupta731
shubhamgupta731
| shohei-ihaya
shohei-ihaya
| shivamd1810
shivamd1810
| shaybc
shaybc
| -| sensei-woo
sensei-woo
| samir-nimbly
samir-nimbly
| robertheadley
robertheadley
| refactorthis
refactorthis
| qingyuan1109
qingyuan1109
| pokutuna
pokutuna
| -| philipnext
philipnext
| village-way
village-way
| oprstchn
oprstchn
| nobu007
nobu007
| mosleyit
mosleyit
| moqimoqidea
moqimoqidea
| -| mlopezr
mlopezr
| mecab
mecab
| olup
olup
| lightrabbit
lightrabbit
| lhish
lhish
| kohii
kohii
| -| kinandan
kinandan
| jwcraig
jwcraig
| jues
jues
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| ExactDoug
ExactDoug
| -| celestial-vault
celestial-vault
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| -| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| -| alasano
alasano
| QuinsZouls
QuinsZouls
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| -| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| samsilveira
samsilveira
| 01Rian
01Rian
| -| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| -| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| -| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| -| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| -| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| Jdo300
Jdo300
| hesara
hesara
| | +| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| daniel-lxs
daniel-lxs
| samhvw8
samhvw8
| hannesrudolph
hannesrudolph
| +| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | +| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| MuriloFP
MuriloFP
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| +| jr
jr
| joemanley201
joemanley201
| System233
System233
| nissa-seru
nissa-seru
| jquanton
jquanton
| roomote-agent
roomote-agent
| +| NyxJae
NyxJae
| d-oit
d-oit
| elianiva
elianiva
| chrarnoldus
chrarnoldus
| qdaxb
qdaxb
| xyOz-dev
xyOz-dev
| +| punkpeye
punkpeye
| wkordalski
wkordalski
| SannidhyaSah
SannidhyaSah
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| monotykamary
monotykamary
| +| cannuri
cannuri
| feifei325
feifei325
| zhangtony239
zhangtony239
| shariqriazz
shariqriazz
| vigneshsubbiah16
vigneshsubbiah16
| pugazhendhi-m
pugazhendhi-m
| +| lloydchang
lloydchang
| liwilliam2021
liwilliam2021
| dtrugman
dtrugman
| hassoncs
hassoncs
| PeterDaveHello
PeterDaveHello
| Szpadel
Szpadel
| +| lupuletic
lupuletic
| kiwina
kiwina
| Premshay
Premshay
| psv2522
psv2522
| olweraltuve
olweraltuve
| diarmidmackenzie
diarmidmackenzie
| +| ChuKhaLi
ChuKhaLi
| NaccOll
NaccOll
| aheizi
aheizi
| nbihan-mediware
nbihan-mediware
| noritaka1166
noritaka1166
| RaySinner
RaySinner
| +| afshawnlotfi
afshawnlotfi
| dleffel
dleffel
| StevenTCramer
StevenTCramer
| Ruakij
Ruakij
| pdecat
pdecat
| kyle-apex
kyle-apex
| +| emshvac
emshvac
| brunobergher
brunobergher
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| +| dlab-anton
dlab-anton
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| +| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| benzntech
benzntech
| ross
ross
| mr-ryan-james
mr-ryan-james
| +| heyseth
heyseth
| taisukeoe
taisukeoe
| avtc
avtc
| eonghk
eonghk
| GOODBOY008
GOODBOY008
| kcwhite
kcwhite
| +| ronyblum
ronyblum
| teddyOOXX
teddyOOXX
| thill2323
thill2323
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| +| ashktn
ashktn
| franekp
franekp
| yt3trees
yt3trees
| seedlord
seedlord
| QuinsZouls
QuinsZouls
| anton-otee
anton-otee
| +| axkirillov
axkirillov
| bramburn
bramburn
| olearycrew
olearycrew
| catrielmuller
catrielmuller
| devxpain
devxpain
| snoyiatk
snoyiatk
| +| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| KanTakahiro
KanTakahiro
| kevint-cerebras
kevint-cerebras
| +| SplittyDev
SplittyDev
| mdp
mdp
| napter
napter
| philfung
philfung
| dqroid
dqroid
| dairui1
dairui1
| +| chris-garrett
chris-garrett
| bbenshalom
bbenshalom
| bannzai
bannzai
| ershang-fireworks
ershang-fireworks
| f14XuanLv
f14XuanLv
| janaki-sasidhar
janaki-sasidhar
| +| forestyoo
forestyoo
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| axmo
axmo
| +| asychin
asychin
| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| s97712
s97712
| +| vladstudio
vladstudio
| vivekfyi
vivekfyi
| HahaBill
HahaBill
| tmsjngx0
tmsjngx0
| TGlide
TGlide
| Githubguy132010
Githubguy132010
| +| tgfjt
tgfjt
| maekawataiki
maekawataiki
| DeXtroTip
DeXtroTip
| qingyuan1109
qingyuan1109
| refactorthis
refactorthis
| robertheadley
robertheadley
| +| samir-nimbly
samir-nimbly
| sensei-woo
sensei-woo
| shaybc
shaybc
| shivamd1810
shivamd1810
| shohei-ihaya
shohei-ihaya
| shubhamgupta731
shubhamgupta731
| +| student20880
student20880
| takakoutso
takakoutso
| user202729
user202729
| cdlliuy
cdlliuy
| zetaloop
zetaloop
| PretzelVector
PretzelVector
| +| nevermorec
nevermorec
| jues
jues
| jwcraig
jwcraig
| kinandan
kinandan
| kohii
kohii
| lhish
lhish
| +| lightrabbit
lightrabbit
| olup
olup
| mecab
mecab
| mlopezr
mlopezr
| moqimoqidea
moqimoqidea
| mosleyit
mosleyit
| +| nobu007
nobu007
| oprstchn
oprstchn
| village-way
village-way
| philipnext
philipnext
| pokutuna
pokutuna
| pfitz
pfitz
| +| ExactDoug
ExactDoug
| celestial-vault
celestial-vault
| linegel
linegel
| ertan2002
ertan2002
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| +| dbasclpy
dbasclpy
| dflatline
dflatline
| Deon588
Deon588
| dleen
dleen
| CW-B-W
CW-B-W
| chadgauth
chadgauth
| +| thecolorblue
thecolorblue
| bogdan0083
bogdan0083
| benashby
benashby
| Atlogit
Atlogit
| atlasgong
atlasgong
| AntiMoron
AntiMoron
| +| andrewshu2000
andrewshu2000
| andreastempsch
andreastempsch
| alasano
alasano
| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| +| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| AMHesch
AMHesch
| adambrand
adambrand
| abumalick
abumalick
| +| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| RandalSchwartz
RandalSchwartz
| SECKainersdorfer
SECKainersdorfer
| +| R-omk
R-omk
| pwilkin
pwilkin
| Sarke
Sarke
| PaperBoardOfficial
PaperBoardOfficial
| OlegOAndreev
OlegOAndreev
| niteshbalusu11
niteshbalusu11
| +| Naam
Naam
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| marvijo-code
marvijo-code
| markijbema
markijbema
| +| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| kevinvandijk
kevinvandijk
| +| KevinZhao
KevinZhao
| ksze
ksze
| AyazKaan
AyazKaan
| Juice10
Juice10
| snova-jorgep
snova-jorgep
| Fovty
Fovty
| +| Jdo300
Jdo300
| hesara
hesara
| | | | | From 62d023d016a4bea59f87c01a005680be3341ef92 Mon Sep 17 00:00:00 2001 From: Dicha Zelianivan Arkana <51877647+elianiva@users.noreply.github.com> Date: Thu, 14 Aug 2025 23:51:13 +0700 Subject: [PATCH 29/36] feat(web): fill missing SEO-related values (#7096) Co-authored-by: Matt Rubens --- apps/web-roo-code/src/app/enterprise/page.tsx | 48 +++++++++++++++++ apps/web-roo-code/src/app/evals/page.tsx | 42 +++++++++++---- apps/web-roo-code/src/app/layout.tsx | 52 ++++++++++++++++--- apps/web-roo-code/src/app/privacy/page.tsx | 40 ++++++++++++-- apps/web-roo-code/src/app/robots.ts | 13 +++++ apps/web-roo-code/src/app/terms/page.tsx | 40 ++++++++++++-- apps/web-roo-code/src/lib/seo.ts | 30 +++++++++++ 7 files changed, 240 insertions(+), 25 deletions(-) create mode 100644 apps/web-roo-code/src/app/robots.ts create mode 100644 apps/web-roo-code/src/lib/seo.ts diff --git a/apps/web-roo-code/src/app/enterprise/page.tsx b/apps/web-roo-code/src/app/enterprise/page.tsx index ca15857ffd..7a1d36f068 100644 --- a/apps/web-roo-code/src/app/enterprise/page.tsx +++ b/apps/web-roo-code/src/app/enterprise/page.tsx @@ -5,6 +5,54 @@ import { AnimatedText } from "@/components/animated-text" import { AnimatedBackground } from "@/components/homepage" import { ContactForm } from "@/components/enterprise/contact-form" import { EXTERNAL_LINKS } from "@/lib/constants" +import type { Metadata } from "next" +import { SEO } from "@/lib/seo" + +const TITLE = "Enterprise Solution" +const DESCRIPTION = + "The control-plane for AI-powered software development. Gain visibility, governance, and control over your AI coding initiatives." +const PATH = "/enterprise" +const OG_IMAGE = SEO.ogImage + +export const metadata: Metadata = { + title: TITLE, + description: DESCRIPTION, + alternates: { + canonical: `${SEO.url}${PATH}`, + }, + openGraph: { + title: TITLE, + description: DESCRIPTION, + url: `${SEO.url}${PATH}`, + siteName: SEO.name, + images: [ + { + url: OG_IMAGE.url, + width: OG_IMAGE.width, + height: OG_IMAGE.height, + alt: OG_IMAGE.alt, + }, + ], + locale: SEO.locale, + type: "website", + }, + twitter: { + card: SEO.twitterCard, + title: TITLE, + description: DESCRIPTION, + images: [OG_IMAGE.url], + }, + keywords: [ + ...SEO.keywords, + "Enterprise AI", + "AI governance", + "AI control-plane", + "developer productivity", + "SAML", + "SCIM", + "cost management", + ], +} export default async function Enterprise() { return ( diff --git a/apps/web-roo-code/src/app/evals/page.tsx b/apps/web-roo-code/src/app/evals/page.tsx index b97b025348..a6af30d70e 100644 --- a/apps/web-roo-code/src/app/evals/page.tsx +++ b/apps/web-roo-code/src/app/evals/page.tsx @@ -1,25 +1,45 @@ import type { Metadata } from "next" import { getEvalRuns } from "@/actions/evals" +import { SEO } from "@/lib/seo" import { Evals } from "./evals" export const revalidate = 300 export const dynamic = "force-dynamic" +const TITLE = "Evals" +const DESCRIPTION = "Explore quantitative evals of LLM coding skills across tasks and providers." +const PATH = "/evals" +const IMAGE = { + url: "https://i.imgur.com/ijP7aZm.png", + width: 1954, + height: 1088, + alt: "Roo Code Evals – LLM coding benchmarks", +} + export const metadata: Metadata = { - title: "Roo Code Evals", - openGraph: { - title: "Roo Code Evals", - description: "Quantitative evals of LLM coding skills.", - url: "https://roocode.com/evals", - siteName: "Roo Code", - images: { - url: "https://i.imgur.com/ijP7aZm.png", - width: 1954, - height: 1088, - }, + title: TITLE, + description: DESCRIPTION, + alternates: { + canonical: `${SEO.url}${PATH}`, }, + openGraph: { + title: TITLE, + description: DESCRIPTION, + url: `${SEO.url}${PATH}`, + siteName: SEO.name, + images: [IMAGE], + locale: SEO.locale, + type: "website", + }, + twitter: { + card: SEO.twitterCard, + title: TITLE, + description: DESCRIPTION, + images: [IMAGE.url], + }, + keywords: [...SEO.keywords, "benchmarks", "LLM evals", "coding evaluations", "model comparison"], } export default async function Page() { diff --git a/apps/web-roo-code/src/app/layout.tsx b/apps/web-roo-code/src/app/layout.tsx index 132a8b31d7..ac33c8920f 100644 --- a/apps/web-roo-code/src/app/layout.tsx +++ b/apps/web-roo-code/src/app/layout.tsx @@ -2,6 +2,7 @@ import React from "react" import type { Metadata } from "next" import { Inter } from "next/font/google" import Script from "next/script" +import { SEO } from "@/lib/seo" import { Providers } from "@/components/providers" @@ -12,11 +13,14 @@ import "./globals.css" const inter = Inter({ subsets: ["latin"] }) export const metadata: Metadata = { - title: "Roo Code – Your AI-Powered Dev Team in VS Code", - description: - "Roo Code puts an entire AI dev team right in your editor, outpacing closed tools with deep project-wide context, multi-step agentic coding, and unmatched developer-centric flexibility.", + metadataBase: new URL(SEO.url), + title: { + template: "%s | Roo Code", + default: SEO.title, + }, + description: SEO.description, alternates: { - canonical: "https://roocode.com", + canonical: SEO.url, }, icons: { icon: [ @@ -40,6 +44,42 @@ export const metadata: Metadata = { }, ], }, + openGraph: { + title: SEO.title, + description: SEO.description, + url: SEO.url, + siteName: SEO.name, + images: [ + { + url: SEO.ogImage.url, + width: SEO.ogImage.width, + height: SEO.ogImage.height, + alt: SEO.ogImage.alt, + }, + ], + locale: SEO.locale, + type: "website", + }, + twitter: { + card: SEO.twitterCard, + title: SEO.title, + description: SEO.description, + images: [SEO.ogImage.url], + }, + robots: { + index: true, + follow: true, + googleBot: { + index: true, + follow: true, + "max-snippet": -1, + "max-image-preview": "large", + "max-video-preview": -1, + }, + }, + keywords: [...SEO.keywords], + applicationName: SEO.name, + category: SEO.category, } export default function RootLayout({ children }: { children: React.ReactNode }) { @@ -64,8 +104,8 @@ export default function RootLayout({ children }: { children: React.ReactNode }) `}
- - + +
{children} diff --git a/apps/web-roo-code/src/app/privacy/page.tsx b/apps/web-roo-code/src/app/privacy/page.tsx index ea12094ebb..1812d18eff 100644 --- a/apps/web-roo-code/src/app/privacy/page.tsx +++ b/apps/web-roo-code/src/app/privacy/page.tsx @@ -1,9 +1,41 @@ -import { Metadata } from "next" +import type { Metadata } from "next" +import { SEO } from "@/lib/seo" + +const TITLE = "Privacy Policy" +const DESCRIPTION = + "Privacy policy for Roo Code Cloud and marketing website. Learn how we handle your data and protect your privacy." +const PATH = "/privacy" +const OG_IMAGE = SEO.ogImage export const metadata: Metadata = { - title: "Privacy Policy - Roo Code", - description: - "Privacy policy for Roo Code Cloud and marketing website. Learn how we handle your data and protect your privacy.", + title: TITLE, + description: DESCRIPTION, + alternates: { + canonical: `${SEO.url}${PATH}`, + }, + openGraph: { + title: TITLE, + description: DESCRIPTION, + url: `${SEO.url}${PATH}`, + siteName: SEO.name, + images: [ + { + url: OG_IMAGE.url, + width: OG_IMAGE.width, + height: OG_IMAGE.height, + alt: OG_IMAGE.alt, + }, + ], + locale: SEO.locale, + type: "article", + }, + twitter: { + card: SEO.twitterCard, + title: TITLE, + description: DESCRIPTION, + images: [OG_IMAGE.url], + }, + keywords: [...SEO.keywords, "privacy", "data protection", "GDPR", "security"], } export default function Privacy() { diff --git a/apps/web-roo-code/src/app/robots.ts b/apps/web-roo-code/src/app/robots.ts new file mode 100644 index 0000000000..fcdda5031e --- /dev/null +++ b/apps/web-roo-code/src/app/robots.ts @@ -0,0 +1,13 @@ +import type { MetadataRoute } from "next" +import { SEO } from "@/lib/seo" + +export default function robots(): MetadataRoute.Robots { + return { + rules: { + userAgent: "*", + allow: "/", + }, + sitemap: `${SEO.url}/sitemap.xml`, + host: SEO.url, + } +} diff --git a/apps/web-roo-code/src/app/terms/page.tsx b/apps/web-roo-code/src/app/terms/page.tsx index 545e577457..f5aea3d663 100644 --- a/apps/web-roo-code/src/app/terms/page.tsx +++ b/apps/web-roo-code/src/app/terms/page.tsx @@ -1,9 +1,41 @@ -import { Metadata } from "next" +import type { Metadata } from "next" +import { SEO } from "@/lib/seo" + +const TITLE = "Terms of Service" +const DESCRIPTION = + "Terms of Service for Roo Code Cloud. Learn about our service terms, commercial conditions, and legal framework." +const PATH = "/terms" +const OG_IMAGE = SEO.ogImage export const metadata: Metadata = { - title: "Terms of Service - Roo Code", - description: - "Terms of Service for Roo Code Cloud. Learn about our service terms, commercial conditions, and legal framework.", + title: TITLE, + description: DESCRIPTION, + alternates: { + canonical: `${SEO.url}${PATH}`, + }, + openGraph: { + title: TITLE, + description: DESCRIPTION, + url: `${SEO.url}${PATH}`, + siteName: SEO.name, + images: [ + { + url: OG_IMAGE.url, + width: OG_IMAGE.width, + height: OG_IMAGE.height, + alt: OG_IMAGE.alt, + }, + ], + locale: SEO.locale, + type: "article", + }, + twitter: { + card: SEO.twitterCard, + title: TITLE, + description: DESCRIPTION, + images: [OG_IMAGE.url], + }, + keywords: [...SEO.keywords, "terms of service", "legal", "agreement", "subscription"], } export default function Terms() { diff --git a/apps/web-roo-code/src/lib/seo.ts b/apps/web-roo-code/src/lib/seo.ts new file mode 100644 index 0000000000..962662bb22 --- /dev/null +++ b/apps/web-roo-code/src/lib/seo.ts @@ -0,0 +1,30 @@ +const SITE_URL = process.env.NEXT_PUBLIC_SITE_URL ?? "https://roocode.com" + +export const SEO = { + url: SITE_URL, + name: "Roo Code", + title: "Roo Code – Your AI-Powered Dev Team in VS Code", + description: + "Roo Code puts an entire AI dev team right in your editor, outpacing closed tools with deep project-wide context, multi-step agentic coding, and unmatched developer-centric flexibility.", + locale: "en_US", + ogImage: { + url: "/android-chrome-512x512.png", + width: 512, + height: 512, + alt: "Roo Code Logo", + }, + keywords: [ + "Roo Code", + "AI coding agent", + "VS Code extension", + "AI pair programmer", + "software development", + "agentic coding", + "code refactoring", + "debugging", + ], + category: "technology", + twitterCard: "summary_large_image" as const, +} as const + +export type SeoConfig = typeof SEO From 2a105a5881b59dbda29b3431a767e214697d1fac Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 14 Aug 2025 12:52:06 -0400 Subject: [PATCH 30/36] Changeset version bump (#7104) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Matt Rubens --- .changeset/v3.25.15.md | 8 -------- CHANGELOG.md | 7 +++++++ src/package.json | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) delete mode 100644 .changeset/v3.25.15.md diff --git a/.changeset/v3.25.15.md b/.changeset/v3.25.15.md deleted file mode 100644 index bd74530316..0000000000 --- a/.changeset/v3.25.15.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"roo-cline": patch ---- - -- Fix: Remove 500-message limit to prevent scrollbar jumping in long conversations (#7052, #7063 by @daniel-lxs, PR by @app/roomote) -- Fix: Reset condensing state when switching tasks (#6919 by @f14XuanLv, PR by @f14XuanLv) -- Fix: Implement sitemap generation in TypeScript and remove XML file (#5231 by @abumalick, PR by @abumalick) -- Fix: allowedMaxRequests and allowedMaxCost values not showing in the settings UI (thanks @chrarnoldus!) diff --git a/CHANGELOG.md b/CHANGELOG.md index bce3038f7b..1c97f6fcb2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Roo Code Changelog +## [3.25.15] - 2025-08-14 + +- Fix: Remove 500-message limit to prevent scrollbar jumping in long conversations (#7052, #7063 by @daniel-lxs, PR by @app/roomote) +- Fix: Reset condensing state when switching tasks (#6919 by @f14XuanLv, PR by @f14XuanLv) +- Fix: Implement sitemap generation in TypeScript and remove XML file (#5231 by @abumalick, PR by @abumalick) +- Fix: allowedMaxRequests and allowedMaxCost values not showing in the settings UI (thanks @chrarnoldus!) + ## [3.25.14] - 2025-08-13 - Fix: Only include verbosity parameter for models that support it (#7054 by @eastonmeth, PR by @app/roomote) diff --git a/src/package.json b/src/package.json index 14b534288b..084e42e08e 100644 --- a/src/package.json +++ b/src/package.json @@ -3,7 +3,7 @@ "displayName": "%extension.displayName%", "description": "%extension.description%", "publisher": "RooVeterinaryInc", - "version": "3.25.14", + "version": "3.25.15", "icon": "assets/icons/icon.png", "galleryBanner": { "color": "#617A91", From 342123d351eacbe6d4e20a334d0cfca1de60a840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Catriel=20M=C3=BCller?= Date: Thu, 14 Aug 2025 16:43:44 -0300 Subject: [PATCH 31/36] Refactor task execution system: improve call stack management (#7035) --- src/core/task/Task.ts | 1076 ++++++++++-------- src/core/task/__tests__/Task.dispose.test.ts | 201 ++++ 2 files changed, 830 insertions(+), 447 deletions(-) create mode 100644 src/core/task/__tests__/Task.dispose.test.ts diff --git a/src/core/task/Task.ts b/src/core/task/Task.ts index 659e7772d5..899ec41401 100644 --- a/src/core/task/Task.ts +++ b/src/core/task/Task.ts @@ -102,6 +102,7 @@ import { restoreTodoListForTask } from "../tools/updateTodoListTool" import { AutoApprovalHandler } from "./AutoApprovalHandler" const MAX_EXPONENTIAL_BACKOFF_SECONDS = 600 // 10 minutes +const DEFAULT_USAGE_COLLECTION_TIMEOUT_MS = 5000 // 5 seconds export type TaskOptions = { provider: ClineProvider @@ -1306,6 +1307,13 @@ export class Task extends EventEmitter implements TaskLike { public dispose(): void { console.log(`[Task] disposing task ${this.taskId}.${this.instanceId}`) + // Remove all event listeners to prevent memory leaks + try { + this.removeAllListeners() + } catch (error) { + console.error("Error removing event listeners:", error) + } + // Stop waiting for child task completion. if (this.pauseInterval) { clearInterval(this.pauseInterval) @@ -1449,465 +1457,639 @@ export class Task extends EventEmitter implements TaskLike { userContent: Anthropic.Messages.ContentBlockParam[], includeFileDetails: boolean = false, ): Promise { - if (this.abort) { - throw new Error(`[RooCode#recursivelyMakeRooRequests] task ${this.taskId}.${this.instanceId} aborted`) + interface StackItem { + userContent: Anthropic.Messages.ContentBlockParam[] + includeFileDetails: boolean } - if (this.consecutiveMistakeLimit > 0 && this.consecutiveMistakeCount >= this.consecutiveMistakeLimit) { - const { response, text, images } = await this.ask( - "mistake_limit_reached", - t("common:errors.mistake_limit_guidance"), - ) + const stack: StackItem[] = [{ userContent, includeFileDetails }] - if (response === "messageResponse") { - userContent.push( - ...[ - { type: "text" as const, text: formatResponse.tooManyMistakes(text) }, - ...formatResponse.imageBlocks(images), - ], - ) + while (stack.length > 0) { + const currentItem = stack.pop()! + const currentUserContent = currentItem.userContent + const currentIncludeFileDetails = currentItem.includeFileDetails - await this.say("user_feedback", text, images) - - // Track consecutive mistake errors in telemetry. - TelemetryService.instance.captureConsecutiveMistakeError(this.taskId) - } - - this.consecutiveMistakeCount = 0 - } - - // In this Cline request loop, we need to check if this task instance - // has been asked to wait for a subtask to finish before continuing. - const provider = this.providerRef.deref() - - if (this.isPaused && provider) { - provider.log(`[subtasks] paused ${this.taskId}.${this.instanceId}`) - await this.waitForResume() - provider.log(`[subtasks] resumed ${this.taskId}.${this.instanceId}`) - const currentMode = (await provider.getState())?.mode ?? defaultModeSlug - - if (currentMode !== this.pausedModeSlug) { - // The mode has changed, we need to switch back to the paused mode. - await provider.handleModeSwitch(this.pausedModeSlug) - - // Delay to allow mode change to take effect before next tool is executed. - await delay(500) - - provider.log( - `[subtasks] task ${this.taskId}.${this.instanceId} has switched back to '${this.pausedModeSlug}' from '${currentMode}'`, - ) - } - } - - // Getting verbose details is an expensive operation, it uses ripgrep to - // top-down build file structure of project which for large projects can - // take a few seconds. For the best UX we show a placeholder api_req_started - // message with a loading spinner as this happens. - - // Determine API protocol based on provider and model - const modelId = getModelId(this.apiConfiguration) - const apiProtocol = getApiProtocol(this.apiConfiguration.apiProvider, modelId) - - await this.say( - "api_req_started", - JSON.stringify({ - request: - userContent.map((block) => formatContentBlockToMarkdown(block)).join("\n\n") + "\n\nLoading...", - apiProtocol, - }), - ) - - const { - showRooIgnoredFiles = true, - includeDiagnosticMessages = true, - maxDiagnosticMessages = 50, - maxReadFileLine = -1, - } = (await this.providerRef.deref()?.getState()) ?? {} - - const parsedUserContent = await processUserContentMentions({ - userContent, - cwd: this.cwd, - urlContentFetcher: this.urlContentFetcher, - fileContextTracker: this.fileContextTracker, - rooIgnoreController: this.rooIgnoreController, - showRooIgnoredFiles, - includeDiagnosticMessages, - maxDiagnosticMessages, - maxReadFileLine, - }) - - const environmentDetails = await getEnvironmentDetails(this, includeFileDetails) - - // Add environment details as its own text block, separate from tool - // results. - const finalUserContent = [...parsedUserContent, { type: "text" as const, text: environmentDetails }] - - await this.addToApiConversationHistory({ role: "user", content: finalUserContent }) - TelemetryService.instance.captureConversationMessage(this.taskId, "user") - - // Since we sent off a placeholder api_req_started message to update the - // webview while waiting to actually start the API request (to load - // potential details for example), we need to update the text of that - // message. - const lastApiReqIndex = findLastIndex(this.clineMessages, (m) => m.say === "api_req_started") - - this.clineMessages[lastApiReqIndex].text = JSON.stringify({ - request: finalUserContent.map((block) => formatContentBlockToMarkdown(block)).join("\n\n"), - apiProtocol, - } satisfies ClineApiReqInfo) - - await this.saveClineMessages() - await provider?.postStateToWebview() - - try { - let cacheWriteTokens = 0 - let cacheReadTokens = 0 - let inputTokens = 0 - let outputTokens = 0 - let totalCost: number | undefined - - // We can't use `api_req_finished` anymore since it's a unique case - // where it could come after a streaming message (i.e. in the middle - // of being updated or executed). - // Fortunately `api_req_finished` was always parsed out for the GUI - // anyways, so it remains solely for legacy purposes to keep track - // of prices in tasks from history (it's worth removing a few months - // from now). - const updateApiReqMsg = (cancelReason?: ClineApiReqCancelReason, streamingFailedMessage?: string) => { - const existingData = JSON.parse(this.clineMessages[lastApiReqIndex].text || "{}") - this.clineMessages[lastApiReqIndex].text = JSON.stringify({ - ...existingData, - tokensIn: inputTokens, - tokensOut: outputTokens, - cacheWrites: cacheWriteTokens, - cacheReads: cacheReadTokens, - cost: - totalCost ?? - calculateApiCostAnthropic( - this.api.getModel().info, - inputTokens, - outputTokens, - cacheWriteTokens, - cacheReadTokens, - ), - cancelReason, - streamingFailedMessage, - } satisfies ClineApiReqInfo) - } - - const abortStream = async (cancelReason: ClineApiReqCancelReason, streamingFailedMessage?: string) => { - if (this.diffViewProvider.isEditing) { - await this.diffViewProvider.revertChanges() // closes diff view - } - - // if last message is a partial we need to update and save it - const lastMessage = this.clineMessages.at(-1) - - if (lastMessage && lastMessage.partial) { - // lastMessage.ts = Date.now() DO NOT update ts since it is used as a key for virtuoso list - lastMessage.partial = false - // instead of streaming partialMessage events, we do a save and post like normal to persist to disk - console.log("updating partial message", lastMessage) - // await this.saveClineMessages() - } - - // Let assistant know their response was interrupted for when task is resumed - await this.addToApiConversationHistory({ - role: "assistant", - content: [ - { - type: "text", - text: - assistantMessage + - `\n\n[${ - cancelReason === "streaming_failed" - ? "Response interrupted by API Error" - : "Response interrupted by user" - }]`, - }, - ], - }) - - // Update `api_req_started` to have cancelled and cost, so that - // we can display the cost of the partial stream. - updateApiReqMsg(cancelReason, streamingFailedMessage) - await this.saveClineMessages() - - // Signals to provider that it can retrieve the saved messages - // from disk, as abortTask can not be awaited on in nature. - this.didFinishAbortingStream = true - } - - // Reset streaming state. - this.currentStreamingContentIndex = 0 - this.currentStreamingDidCheckpoint = false - this.assistantMessageContent = [] - this.didCompleteReadingStream = false - this.userMessageContent = [] - this.userMessageContentReady = false - this.didRejectTool = false - this.didAlreadyUseTool = false - this.presentAssistantMessageLocked = false - this.presentAssistantMessageHasPendingUpdates = false - if (this.assistantMessageParser) { - this.assistantMessageParser.reset() - } - - await this.diffViewProvider.reset() - - // Yields only if the first chunk is successful, otherwise will - // allow the user to retry the request (most likely due to rate - // limit error, which gets thrown on the first chunk). - const stream = this.attemptApiRequest() - let assistantMessage = "" - let reasoningMessage = "" - this.isStreaming = true - - try { - for await (const chunk of stream) { - if (!chunk) { - // Sometimes chunk is undefined, no idea that can cause - // it, but this workaround seems to fix it. - continue - } - - switch (chunk.type) { - case "reasoning": - reasoningMessage += chunk.text - await this.say("reasoning", reasoningMessage, undefined, true) - break - case "usage": - inputTokens += chunk.inputTokens - outputTokens += chunk.outputTokens - cacheWriteTokens += chunk.cacheWriteTokens ?? 0 - cacheReadTokens += chunk.cacheReadTokens ?? 0 - totalCost = chunk.totalCost - break - case "text": { - assistantMessage += chunk.text - - // Parse raw assistant message chunk into content blocks. - const prevLength = this.assistantMessageContent.length - if (this.isAssistantMessageParserEnabled && this.assistantMessageParser) { - this.assistantMessageContent = this.assistantMessageParser.processChunk(chunk.text) - } else { - // Use the old parsing method when experiment is disabled - this.assistantMessageContent = parseAssistantMessage(assistantMessage) - } - - if (this.assistantMessageContent.length > prevLength) { - // New content we need to present, reset to - // false in case previous content set this to true. - this.userMessageContentReady = false - } - - // Present content to user. - presentAssistantMessage(this) - break - } - } - - if (this.abort) { - console.log(`aborting stream, this.abandoned = ${this.abandoned}`) - - if (!this.abandoned) { - // Only need to gracefully abort if this instance - // isn't abandoned (sometimes OpenRouter stream - // hangs, in which case this would affect future - // instances of Cline). - await abortStream("user_cancelled") - } - - break // Aborts the stream. - } - - if (this.didRejectTool) { - // `userContent` has a tool rejection, so interrupt the - // assistant's response to present the user's feedback. - assistantMessage += "\n\n[Response interrupted by user feedback]" - // Instead of setting this preemptively, we allow the - // present iterator to finish and set - // userMessageContentReady when its ready. - // this.userMessageContentReady = true - break - } - - // PREV: We need to let the request finish for openrouter to - // get generation details. - // UPDATE: It's better UX to interrupt the request at the - // cost of the API cost not being retrieved. - if (this.didAlreadyUseTool) { - assistantMessage += - "\n\n[Response interrupted by a tool use result. Only one tool may be used at a time and should be placed at the end of the message.]" - break - } - } - } catch (error) { - // Abandoned happens when extension is no longer waiting for the - // Cline instance to finish aborting (error is thrown here when - // any function in the for loop throws due to this.abort). - if (!this.abandoned) { - // If the stream failed, there's various states the task - // could be in (i.e. could have streamed some tools the user - // may have executed), so we just resort to replicating a - // cancel task. - - // Check if this was a user-initiated cancellation BEFORE calling abortTask - // If this.abort is already true, it means the user clicked cancel, so we should - // treat this as "user_cancelled" rather than "streaming_failed" - const cancelReason = this.abort ? "user_cancelled" : "streaming_failed" - - const streamingFailedMessage = this.abort - ? undefined - : (error.message ?? JSON.stringify(serializeError(error), null, 2)) - - // Now call abortTask after determining the cancel reason. - await this.abortTask() - await abortStream(cancelReason, streamingFailedMessage) - - const history = await provider?.getTaskWithId(this.taskId) - - if (history) { - await provider?.initClineWithHistoryItem(history.historyItem) - } - } - } finally { - this.isStreaming = false - } - - if (inputTokens > 0 || outputTokens > 0 || cacheWriteTokens > 0 || cacheReadTokens > 0) { - TelemetryService.instance.captureLlmCompletion(this.taskId, { - inputTokens, - outputTokens, - cacheWriteTokens, - cacheReadTokens, - cost: - totalCost ?? - calculateApiCostAnthropic( - this.api.getModel().info, - inputTokens, - outputTokens, - cacheWriteTokens, - cacheReadTokens, - ), - }) - } - - // Need to call here in case the stream was aborted. - if (this.abort || this.abandoned) { + if (this.abort) { throw new Error(`[RooCode#recursivelyMakeRooRequests] task ${this.taskId}.${this.instanceId} aborted`) } - this.didCompleteReadingStream = true - - // Set any blocks to be complete to allow `presentAssistantMessage` - // to finish and set `userMessageContentReady` to true. - // (Could be a text block that had no subsequent tool uses, or a - // text block at the very end, or an invalid tool use, etc. Whatever - // the case, `presentAssistantMessage` relies on these blocks either - // to be completed or the user to reject a block in order to proceed - // and eventually set userMessageContentReady to true.) - const partialBlocks = this.assistantMessageContent.filter((block) => block.partial) - partialBlocks.forEach((block) => (block.partial = false)) - - // Can't just do this b/c a tool could be in the middle of executing. - // this.assistantMessageContent.forEach((e) => (e.partial = false)) - - // Now that the stream is complete, finalize any remaining partial content blocks - if (this.isAssistantMessageParserEnabled && this.assistantMessageParser) { - this.assistantMessageParser.finalizeContentBlocks() - this.assistantMessageContent = this.assistantMessageParser.getContentBlocks() - } - // When using old parser, no finalization needed - parsing already happened during streaming - - if (partialBlocks.length > 0) { - // If there is content to update then it will complete and - // update `this.userMessageContentReady` to true, which we - // `pWaitFor` before making the next request. All this is really - // doing is presenting the last partial message that we just set - // to complete. - presentAssistantMessage(this) - } - - await this.persistGpt5Metadata(reasoningMessage) - - updateApiReqMsg() - await this.saveClineMessages() - await this.providerRef.deref()?.postStateToWebview() - - // Reset parser after each complete conversation round - if (this.assistantMessageParser) { - this.assistantMessageParser.reset() - } - - // Now add to apiConversationHistory. - // Need to save assistant responses to file before proceeding to - // tool use since user can exit at any moment and we wouldn't be - // able to save the assistant's response. - let didEndLoop = false - - if (assistantMessage.length > 0) { - await this.addToApiConversationHistory({ - role: "assistant", - content: [{ type: "text", text: assistantMessage }], - }) - - TelemetryService.instance.captureConversationMessage(this.taskId, "assistant") - - // NOTE: This comment is here for future reference - this was a - // workaround for `userMessageContent` not getting set to true. - // It was due to it not recursively calling for partial blocks - // when `didRejectTool`, so it would get stuck waiting for a - // partial block to complete before it could continue. - // In case the content blocks finished it may be the api stream - // finished after the last parsed content block was executed, so - // we are able to detect out of bounds and set - // `userMessageContentReady` to true (note you should not call - // `presentAssistantMessage` since if the last block i - // completed it will be presented again). - // const completeBlocks = this.assistantMessageContent.filter((block) => !block.partial) // If there are any partial blocks after the stream ended we can consider them invalid. - // if (this.currentStreamingContentIndex >= completeBlocks.length) { - // this.userMessageContentReady = true - // } - - await pWaitFor(() => this.userMessageContentReady) - - // If the model did not tool use, then we need to tell it to - // either use a tool or attempt_completion. - const didToolUse = this.assistantMessageContent.some((block) => block.type === "tool_use") - - if (!didToolUse) { - this.userMessageContent.push({ type: "text", text: formatResponse.noToolsUsed() }) - this.consecutiveMistakeCount++ - } - - const recDidEndLoop = await this.recursivelyMakeClineRequests(this.userMessageContent) - didEndLoop = recDidEndLoop - } else { - // If there's no assistant_responses, that means we got no text - // or tool_use content blocks from API which we should assume is - // an error. - await this.say( - "error", - "Unexpected API Response: The language model did not provide any assistant messages. This may indicate an issue with the API or the model's output.", + if (this.consecutiveMistakeLimit > 0 && this.consecutiveMistakeCount >= this.consecutiveMistakeLimit) { + const { response, text, images } = await this.ask( + "mistake_limit_reached", + t("common:errors.mistake_limit_guidance"), ) - await this.addToApiConversationHistory({ - role: "assistant", - content: [{ type: "text", text: "Failure: I did not provide a response." }], - }) + if (response === "messageResponse") { + currentUserContent.push( + ...[ + { type: "text" as const, text: formatResponse.tooManyMistakes(text) }, + ...formatResponse.imageBlocks(images), + ], + ) + + await this.say("user_feedback", text, images) + + // Track consecutive mistake errors in telemetry. + TelemetryService.instance.captureConsecutiveMistakeError(this.taskId) + } + + this.consecutiveMistakeCount = 0 } - return didEndLoop // Will always be false for now. - } catch (error) { - // This should never happen since the only thing that can throw an - // error is the attemptApiRequest, which is wrapped in a try catch - // that sends an ask where if noButtonClicked, will clear current - // task and destroy this instance. However to avoid unhandled - // promise rejection, we will end this loop which will end execution - // of this instance (see `startTask`). - return true // Needs to be true so parent loop knows to end task. + // In this Cline request loop, we need to check if this task instance + // has been asked to wait for a subtask to finish before continuing. + const provider = this.providerRef.deref() + + if (this.isPaused && provider) { + provider.log(`[subtasks] paused ${this.taskId}.${this.instanceId}`) + await this.waitForResume() + provider.log(`[subtasks] resumed ${this.taskId}.${this.instanceId}`) + const currentMode = (await provider.getState())?.mode ?? defaultModeSlug + + if (currentMode !== this.pausedModeSlug) { + // The mode has changed, we need to switch back to the paused mode. + await provider.handleModeSwitch(this.pausedModeSlug) + + // Delay to allow mode change to take effect before next tool is executed. + await delay(500) + + provider.log( + `[subtasks] task ${this.taskId}.${this.instanceId} has switched back to '${this.pausedModeSlug}' from '${currentMode}'`, + ) + } + } + + // Getting verbose details is an expensive operation, it uses ripgrep to + // top-down build file structure of project which for large projects can + // take a few seconds. For the best UX we show a placeholder api_req_started + // message with a loading spinner as this happens. + + // Determine API protocol based on provider and model + const modelId = getModelId(this.apiConfiguration) + const apiProtocol = getApiProtocol(this.apiConfiguration.apiProvider, modelId) + + await this.say( + "api_req_started", + JSON.stringify({ + request: + currentUserContent.map((block) => formatContentBlockToMarkdown(block)).join("\n\n") + + "\n\nLoading...", + apiProtocol, + }), + ) + + const { + showRooIgnoredFiles = true, + includeDiagnosticMessages = true, + maxDiagnosticMessages = 50, + maxReadFileLine = -1, + } = (await this.providerRef.deref()?.getState()) ?? {} + + const parsedUserContent = await processUserContentMentions({ + userContent: currentUserContent, + cwd: this.cwd, + urlContentFetcher: this.urlContentFetcher, + fileContextTracker: this.fileContextTracker, + rooIgnoreController: this.rooIgnoreController, + showRooIgnoredFiles, + includeDiagnosticMessages, + maxDiagnosticMessages, + maxReadFileLine, + }) + + const environmentDetails = await getEnvironmentDetails(this, currentIncludeFileDetails) + + // Add environment details as its own text block, separate from tool + // results. + const finalUserContent = [...parsedUserContent, { type: "text" as const, text: environmentDetails }] + + await this.addToApiConversationHistory({ role: "user", content: finalUserContent }) + TelemetryService.instance.captureConversationMessage(this.taskId, "user") + + // Since we sent off a placeholder api_req_started message to update the + // webview while waiting to actually start the API request (to load + // potential details for example), we need to update the text of that + // message. + const lastApiReqIndex = findLastIndex(this.clineMessages, (m) => m.say === "api_req_started") + + this.clineMessages[lastApiReqIndex].text = JSON.stringify({ + request: finalUserContent.map((block) => formatContentBlockToMarkdown(block)).join("\n\n"), + apiProtocol, + } satisfies ClineApiReqInfo) + + await this.saveClineMessages() + await provider?.postStateToWebview() + + try { + let cacheWriteTokens = 0 + let cacheReadTokens = 0 + let inputTokens = 0 + let outputTokens = 0 + let totalCost: number | undefined + + // We can't use `api_req_finished` anymore since it's a unique case + // where it could come after a streaming message (i.e. in the middle + // of being updated or executed). + // Fortunately `api_req_finished` was always parsed out for the GUI + // anyways, so it remains solely for legacy purposes to keep track + // of prices in tasks from history (it's worth removing a few months + // from now). + const updateApiReqMsg = (cancelReason?: ClineApiReqCancelReason, streamingFailedMessage?: string) => { + if (lastApiReqIndex < 0 || !this.clineMessages[lastApiReqIndex]) { + return + } + + const existingData = JSON.parse(this.clineMessages[lastApiReqIndex].text || "{}") + this.clineMessages[lastApiReqIndex].text = JSON.stringify({ + ...existingData, + tokensIn: inputTokens, + tokensOut: outputTokens, + cacheWrites: cacheWriteTokens, + cacheReads: cacheReadTokens, + cost: + totalCost ?? + calculateApiCostAnthropic( + this.api.getModel().info, + inputTokens, + outputTokens, + cacheWriteTokens, + cacheReadTokens, + ), + cancelReason, + streamingFailedMessage, + } satisfies ClineApiReqInfo) + } + + const abortStream = async (cancelReason: ClineApiReqCancelReason, streamingFailedMessage?: string) => { + if (this.diffViewProvider.isEditing) { + await this.diffViewProvider.revertChanges() // closes diff view + } + + // if last message is a partial we need to update and save it + const lastMessage = this.clineMessages.at(-1) + + if (lastMessage && lastMessage.partial) { + // lastMessage.ts = Date.now() DO NOT update ts since it is used as a key for virtuoso list + lastMessage.partial = false + // instead of streaming partialMessage events, we do a save and post like normal to persist to disk + console.log("updating partial message", lastMessage) + // await this.saveClineMessages() + } + + // Let assistant know their response was interrupted for when task is resumed + await this.addToApiConversationHistory({ + role: "assistant", + content: [ + { + type: "text", + text: + assistantMessage + + `\n\n[${ + cancelReason === "streaming_failed" + ? "Response interrupted by API Error" + : "Response interrupted by user" + }]`, + }, + ], + }) + + // Update `api_req_started` to have cancelled and cost, so that + // we can display the cost of the partial stream. + updateApiReqMsg(cancelReason, streamingFailedMessage) + await this.saveClineMessages() + + // Signals to provider that it can retrieve the saved messages + // from disk, as abortTask can not be awaited on in nature. + this.didFinishAbortingStream = true + } + + // Reset streaming state. + this.currentStreamingContentIndex = 0 + this.currentStreamingDidCheckpoint = false + this.assistantMessageContent = [] + this.didCompleteReadingStream = false + this.userMessageContent = [] + this.userMessageContentReady = false + this.didRejectTool = false + this.didAlreadyUseTool = false + this.presentAssistantMessageLocked = false + this.presentAssistantMessageHasPendingUpdates = false + if (this.assistantMessageParser) { + this.assistantMessageParser.reset() + } + + await this.diffViewProvider.reset() + + // Yields only if the first chunk is successful, otherwise will + // allow the user to retry the request (most likely due to rate + // limit error, which gets thrown on the first chunk). + const stream = this.attemptApiRequest() + let assistantMessage = "" + let reasoningMessage = "" + this.isStreaming = true + + try { + const iterator = stream[Symbol.asyncIterator]() + let item = await iterator.next() + while (!item.done) { + const chunk = item.value + item = await iterator.next() + if (!chunk) { + // Sometimes chunk is undefined, no idea that can cause + // it, but this workaround seems to fix it. + continue + } + + switch (chunk.type) { + case "reasoning": + reasoningMessage += chunk.text + await this.say("reasoning", reasoningMessage, undefined, true) + break + case "usage": + inputTokens += chunk.inputTokens + outputTokens += chunk.outputTokens + cacheWriteTokens += chunk.cacheWriteTokens ?? 0 + cacheReadTokens += chunk.cacheReadTokens ?? 0 + totalCost = chunk.totalCost + break + case "text": { + assistantMessage += chunk.text + + // Parse raw assistant message chunk into content blocks. + const prevLength = this.assistantMessageContent.length + if (this.isAssistantMessageParserEnabled && this.assistantMessageParser) { + this.assistantMessageContent = this.assistantMessageParser.processChunk(chunk.text) + } else { + // Use the old parsing method when experiment is disabled + this.assistantMessageContent = parseAssistantMessage(assistantMessage) + } + + if (this.assistantMessageContent.length > prevLength) { + // New content we need to present, reset to + // false in case previous content set this to true. + this.userMessageContentReady = false + } + + // Present content to user. + presentAssistantMessage(this) + break + } + } + + if (this.abort) { + console.log(`aborting stream, this.abandoned = ${this.abandoned}`) + + if (!this.abandoned) { + // Only need to gracefully abort if this instance + // isn't abandoned (sometimes OpenRouter stream + // hangs, in which case this would affect future + // instances of Cline). + await abortStream("user_cancelled") + } + + break // Aborts the stream. + } + + if (this.didRejectTool) { + // `userContent` has a tool rejection, so interrupt the + // assistant's response to present the user's feedback. + assistantMessage += "\n\n[Response interrupted by user feedback]" + // Instead of setting this preemptively, we allow the + // present iterator to finish and set + // userMessageContentReady when its ready. + // this.userMessageContentReady = true + break + } + + if (this.didAlreadyUseTool) { + assistantMessage += + "\n\n[Response interrupted by a tool use result. Only one tool may be used at a time and should be placed at the end of the message.]" + break + } + } + + // Create a copy of current token values to avoid race conditions + const currentTokens = { + input: inputTokens, + output: outputTokens, + cacheWrite: cacheWriteTokens, + cacheRead: cacheReadTokens, + total: totalCost, + } + + const drainStreamInBackgroundToFindAllUsage = async (apiReqIndex: number) => { + const timeoutMs = DEFAULT_USAGE_COLLECTION_TIMEOUT_MS + const startTime = Date.now() + const modelId = getModelId(this.apiConfiguration) + + // Local variables to accumulate usage data without affecting the main flow + let bgInputTokens = currentTokens.input + let bgOutputTokens = currentTokens.output + let bgCacheWriteTokens = currentTokens.cacheWrite + let bgCacheReadTokens = currentTokens.cacheRead + let bgTotalCost = currentTokens.total + + // Helper function to capture telemetry and update messages + const captureUsageData = async ( + tokens: { + input: number + output: number + cacheWrite: number + cacheRead: number + total?: number + }, + messageIndex: number = apiReqIndex, + ) => { + if ( + tokens.input > 0 || + tokens.output > 0 || + tokens.cacheWrite > 0 || + tokens.cacheRead > 0 + ) { + // Update the shared variables atomically + inputTokens = tokens.input + outputTokens = tokens.output + cacheWriteTokens = tokens.cacheWrite + cacheReadTokens = tokens.cacheRead + totalCost = tokens.total + + // Update the API request message with the latest usage data + updateApiReqMsg() + await this.saveClineMessages() + + // Update the specific message in the webview + const apiReqMessage = this.clineMessages[messageIndex] + if (apiReqMessage) { + await this.updateClineMessage(apiReqMessage) + } + + // Capture telemetry + TelemetryService.instance.captureLlmCompletion(this.taskId, { + inputTokens: tokens.input, + outputTokens: tokens.output, + cacheWriteTokens: tokens.cacheWrite, + cacheReadTokens: tokens.cacheRead, + cost: + tokens.total ?? + calculateApiCostAnthropic( + this.api.getModel().info, + tokens.input, + tokens.output, + tokens.cacheWrite, + tokens.cacheRead, + ), + }) + } + } + + try { + // Continue processing the original stream from where the main loop left off + let usageFound = false + let chunkCount = 0 + + // Use the same iterator that the main loop was using + while (!item.done) { + // Check for timeout + if (Date.now() - startTime > timeoutMs) { + console.warn( + `[Background Usage Collection] Timed out after ${timeoutMs}ms for model: ${modelId}, processed ${chunkCount} chunks`, + ) + // Clean up the iterator before breaking + if (iterator.return) { + await iterator.return(undefined) + } + break + } + + const chunk = item.value + item = await iterator.next() + chunkCount++ + + if (chunk && chunk.type === "usage") { + usageFound = true + bgInputTokens += chunk.inputTokens + bgOutputTokens += chunk.outputTokens + bgCacheWriteTokens += chunk.cacheWriteTokens ?? 0 + bgCacheReadTokens += chunk.cacheReadTokens ?? 0 + bgTotalCost = chunk.totalCost + } + } + + if ( + usageFound || + bgInputTokens > 0 || + bgOutputTokens > 0 || + bgCacheWriteTokens > 0 || + bgCacheReadTokens > 0 + ) { + // We have usage data either from a usage chunk or accumulated tokens + await captureUsageData( + { + input: bgInputTokens, + output: bgOutputTokens, + cacheWrite: bgCacheWriteTokens, + cacheRead: bgCacheReadTokens, + total: bgTotalCost, + }, + lastApiReqIndex, + ) + } else { + console.warn( + `[Background Usage Collection] Suspicious: request ${apiReqIndex} is complete, but no usage info was found. Model: ${modelId}`, + ) + } + } catch (error) { + console.error("Error draining stream for usage data:", error) + // Still try to capture whatever usage data we have collected so far + if ( + bgInputTokens > 0 || + bgOutputTokens > 0 || + bgCacheWriteTokens > 0 || + bgCacheReadTokens > 0 + ) { + await captureUsageData( + { + input: bgInputTokens, + output: bgOutputTokens, + cacheWrite: bgCacheWriteTokens, + cacheRead: bgCacheReadTokens, + total: bgTotalCost, + }, + lastApiReqIndex, + ) + } + } + } + + // Start the background task and handle any errors + drainStreamInBackgroundToFindAllUsage(lastApiReqIndex).catch((error) => { + console.error("Background usage collection failed:", error) + }) + } catch (error) { + // Abandoned happens when extension is no longer waiting for the + // Cline instance to finish aborting (error is thrown here when + // any function in the for loop throws due to this.abort). + if (!this.abandoned) { + // If the stream failed, there's various states the task + // could be in (i.e. could have streamed some tools the user + // may have executed), so we just resort to replicating a + // cancel task. + + // Check if this was a user-initiated cancellation BEFORE calling abortTask + // If this.abort is already true, it means the user clicked cancel, so we should + // treat this as "user_cancelled" rather than "streaming_failed" + const cancelReason = this.abort ? "user_cancelled" : "streaming_failed" + + const streamingFailedMessage = this.abort + ? undefined + : (error.message ?? JSON.stringify(serializeError(error), null, 2)) + + // Now call abortTask after determining the cancel reason. + await this.abortTask() + await abortStream(cancelReason, streamingFailedMessage) + + const history = await provider?.getTaskWithId(this.taskId) + + if (history) { + await provider?.initClineWithHistoryItem(history.historyItem) + } + } + } finally { + this.isStreaming = false + } + + // Need to call here in case the stream was aborted. + if (this.abort || this.abandoned) { + throw new Error( + `[RooCode#recursivelyMakeRooRequests] task ${this.taskId}.${this.instanceId} aborted`, + ) + } + + this.didCompleteReadingStream = true + + // Set any blocks to be complete to allow `presentAssistantMessage` + // to finish and set `userMessageContentReady` to true. + // (Could be a text block that had no subsequent tool uses, or a + // text block at the very end, or an invalid tool use, etc. Whatever + // the case, `presentAssistantMessage` relies on these blocks either + // to be completed or the user to reject a block in order to proceed + // and eventually set userMessageContentReady to true.) + const partialBlocks = this.assistantMessageContent.filter((block) => block.partial) + partialBlocks.forEach((block) => (block.partial = false)) + + // Can't just do this b/c a tool could be in the middle of executing. + // this.assistantMessageContent.forEach((e) => (e.partial = false)) + + // Now that the stream is complete, finalize any remaining partial content blocks + if (this.isAssistantMessageParserEnabled && this.assistantMessageParser) { + this.assistantMessageParser.finalizeContentBlocks() + this.assistantMessageContent = this.assistantMessageParser.getContentBlocks() + } + // When using old parser, no finalization needed - parsing already happened during streaming + + if (partialBlocks.length > 0) { + // If there is content to update then it will complete and + // update `this.userMessageContentReady` to true, which we + // `pWaitFor` before making the next request. All this is really + // doing is presenting the last partial message that we just set + // to complete. + presentAssistantMessage(this) + } + + // Note: updateApiReqMsg() is now called from within drainStreamInBackgroundToFindAllUsage + // to ensure usage data is captured even when the stream is interrupted. The background task + // uses local variables to accumulate usage data before atomically updating the shared state. + await this.persistGpt5Metadata(reasoningMessage) + await this.saveClineMessages() + await this.providerRef.deref()?.postStateToWebview() + + // Reset parser after each complete conversation round + if (this.assistantMessageParser) { + this.assistantMessageParser.reset() + } + + // Now add to apiConversationHistory. + // Need to save assistant responses to file before proceeding to + // tool use since user can exit at any moment and we wouldn't be + // able to save the assistant's response. + let didEndLoop = false + + if (assistantMessage.length > 0) { + await this.addToApiConversationHistory({ + role: "assistant", + content: [{ type: "text", text: assistantMessage }], + }) + + TelemetryService.instance.captureConversationMessage(this.taskId, "assistant") + + // NOTE: This comment is here for future reference - this was a + // workaround for `userMessageContent` not getting set to true. + // It was due to it not recursively calling for partial blocks + // when `didRejectTool`, so it would get stuck waiting for a + // partial block to complete before it could continue. + // In case the content blocks finished it may be the api stream + // finished after the last parsed content block was executed, so + // we are able to detect out of bounds and set + // `userMessageContentReady` to true (note you should not call + // `presentAssistantMessage` since if the last block i + // completed it will be presented again). + // const completeBlocks = this.assistantMessageContent.filter((block) => !block.partial) // If there are any partial blocks after the stream ended we can consider them invalid. + // if (this.currentStreamingContentIndex >= completeBlocks.length) { + // this.userMessageContentReady = true + // } + + await pWaitFor(() => this.userMessageContentReady) + + // If the model did not tool use, then we need to tell it to + // either use a tool or attempt_completion. + const didToolUse = this.assistantMessageContent.some((block) => block.type === "tool_use") + + if (!didToolUse) { + this.userMessageContent.push({ type: "text", text: formatResponse.noToolsUsed() }) + this.consecutiveMistakeCount++ + } + + if (this.userMessageContent.length > 0) { + stack.push({ + userContent: [...this.userMessageContent], // Create a copy to avoid mutation issues + includeFileDetails: false, // Subsequent iterations don't need file details + }) + + // Add periodic yielding to prevent blocking + await new Promise((resolve) => setImmediate(resolve)) + } + // Continue to next iteration instead of setting didEndLoop from recursive call + continue + } else { + // If there's no assistant_responses, that means we got no text + // or tool_use content blocks from API which we should assume is + // an error. + await this.say( + "error", + "Unexpected API Response: The language model did not provide any assistant messages. This may indicate an issue with the API or the model's output.", + ) + + await this.addToApiConversationHistory({ + role: "assistant", + content: [{ type: "text", text: "Failure: I did not provide a response." }], + }) + } + + // If we reach here without continuing, return false (will always be false for now) + return false + } catch (error) { + // This should never happen since the only thing that can throw an + // error is the attemptApiRequest, which is wrapped in a try catch + // that sends an ask where if noButtonClicked, will clear current + // task and destroy this instance. However to avoid unhandled + // promise rejection, we will end this loop which will end execution + // of this instance (see `startTask`). + return true // Needs to be true so parent loop knows to end task. + } } + + // If we exit the while loop normally (stack is empty), return false + return false } private async getSystemPrompt(): Promise { diff --git a/src/core/task/__tests__/Task.dispose.test.ts b/src/core/task/__tests__/Task.dispose.test.ts new file mode 100644 index 0000000000..1d93d148a4 --- /dev/null +++ b/src/core/task/__tests__/Task.dispose.test.ts @@ -0,0 +1,201 @@ +import { Task } from "../Task" +import { ClineProvider } from "../../webview/ClineProvider" +import { ProviderSettings } from "@roo-code/types" +import { vi, describe, test, expect, beforeEach, afterEach } from "vitest" + +// Mock dependencies +vi.mock("../../webview/ClineProvider") +vi.mock("../../../integrations/terminal/TerminalRegistry", () => ({ + TerminalRegistry: { + releaseTerminalsForTask: vi.fn(), + }, +})) +vi.mock("../../ignore/RooIgnoreController") +vi.mock("../../protect/RooProtectedController") +vi.mock("../../context-tracking/FileContextTracker") +vi.mock("../../../services/browser/UrlContentFetcher") +vi.mock("../../../services/browser/BrowserSession") +vi.mock("../../../integrations/editor/DiffViewProvider") +vi.mock("../../tools/ToolRepetitionDetector") +vi.mock("../../../api", () => ({ + buildApiHandler: vi.fn(() => ({ + getModel: () => ({ info: {}, id: "test-model" }), + })), +})) +vi.mock("./AutoApprovalHandler") + +// Mock TelemetryService +vi.mock("@roo-code/telemetry", () => ({ + TelemetryService: { + instance: { + captureTaskCreated: vi.fn(), + captureTaskRestarted: vi.fn(), + }, + }, +})) + +describe("Task dispose method", () => { + let mockProvider: any + let mockApiConfiguration: ProviderSettings + let task: Task + + beforeEach(() => { + // Reset all mocks + vi.clearAllMocks() + + // Mock provider + mockProvider = { + context: { + globalStorageUri: { fsPath: "/test/path" }, + }, + getState: vi.fn().mockResolvedValue({ mode: "code" }), + log: vi.fn(), + } + + // Mock API configuration + mockApiConfiguration = { + apiProvider: "anthropic", + apiKey: "test-key", + } as ProviderSettings + + // Create task instance without starting it + task = new Task({ + provider: mockProvider as ClineProvider, + apiConfiguration: mockApiConfiguration, + startTask: false, + }) + }) + + afterEach(() => { + // Clean up + if (task && !task.abort) { + task.dispose() + } + }) + + test("should remove all event listeners when dispose is called", () => { + // Add some event listeners using type assertion to bypass strict typing for testing + const listener1 = vi.fn(() => {}) + const listener2 = vi.fn(() => {}) + const listener3 = vi.fn((taskId: string) => {}) + + // Use type assertion to bypass strict event typing for testing + ;(task as any).on("TaskStarted", listener1) + ;(task as any).on("TaskAborted", listener2) + ;(task as any).on("TaskIdle", listener3) + + // Verify listeners are added + expect(task.listenerCount("TaskStarted")).toBe(1) + expect(task.listenerCount("TaskAborted")).toBe(1) + expect(task.listenerCount("TaskIdle")).toBe(1) + + // Spy on removeAllListeners method + const removeAllListenersSpy = vi.spyOn(task, "removeAllListeners") + + // Call dispose + task.dispose() + + // Verify removeAllListeners was called + expect(removeAllListenersSpy).toHaveBeenCalledOnce() + + // Verify all listeners are removed + expect(task.listenerCount("TaskStarted")).toBe(0) + expect(task.listenerCount("TaskAborted")).toBe(0) + expect(task.listenerCount("TaskIdle")).toBe(0) + }) + + test("should handle errors when removing event listeners", () => { + // Mock removeAllListeners to throw an error + const originalRemoveAllListeners = task.removeAllListeners + task.removeAllListeners = vi.fn(() => { + throw new Error("Test error") + }) + + // Spy on console.error + const consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => {}) + + // Call dispose - should not throw + expect(() => task.dispose()).not.toThrow() + + // Verify error was logged + expect(consoleErrorSpy).toHaveBeenCalledWith("Error removing event listeners:", expect.any(Error)) + + // Restore + task.removeAllListeners = originalRemoveAllListeners + consoleErrorSpy.mockRestore() + }) + + test("should clean up all resources in correct order", () => { + const removeAllListenersSpy = vi.spyOn(task, "removeAllListeners") + const consoleLogSpy = vi.spyOn(console, "log").mockImplementation(() => {}) + + // Call dispose + task.dispose() + + // Verify dispose was called and logged + expect(consoleLogSpy).toHaveBeenCalledWith( + expect.stringContaining(`[Task] disposing task ${task.taskId}.${task.instanceId}`), + ) + + // Verify removeAllListeners was called first (before other cleanup) + expect(removeAllListenersSpy).toHaveBeenCalledOnce() + + // Clean up + consoleLogSpy.mockRestore() + }) + + test("should prevent memory leaks by removing listeners before other cleanup", () => { + // Add multiple listeners of different types using type assertion for testing + const listeners = { + TaskStarted: vi.fn(() => {}), + TaskAborted: vi.fn(() => {}), + TaskIdle: vi.fn((taskId: string) => {}), + TaskActive: vi.fn((taskId: string) => {}), + TaskAskResponded: vi.fn(() => {}), + Message: vi.fn((data: { action: "created" | "updated"; message: any }) => {}), + TaskTokenUsageUpdated: vi.fn((taskId: string, tokenUsage: any) => {}), + TaskToolFailed: vi.fn((taskId: string, tool: any, error: string) => {}), + TaskUnpaused: vi.fn(() => {}), + } + + // Add all listeners using type assertion to bypass strict typing for testing + const taskAny = task as any + taskAny.on("TaskStarted", listeners.TaskStarted) + taskAny.on("TaskAborted", listeners.TaskAborted) + taskAny.on("TaskIdle", listeners.TaskIdle) + taskAny.on("TaskActive", listeners.TaskActive) + taskAny.on("TaskAskResponded", listeners.TaskAskResponded) + taskAny.on("Message", listeners.Message) + taskAny.on("TaskTokenUsageUpdated", listeners.TaskTokenUsageUpdated) + taskAny.on("TaskToolFailed", listeners.TaskToolFailed) + taskAny.on("TaskUnpaused", listeners.TaskUnpaused) + + // Verify all listeners are added + expect(task.listenerCount("TaskStarted")).toBe(1) + expect(task.listenerCount("TaskAborted")).toBe(1) + expect(task.listenerCount("TaskIdle")).toBe(1) + expect(task.listenerCount("TaskActive")).toBe(1) + expect(task.listenerCount("TaskAskResponded")).toBe(1) + expect(task.listenerCount("Message")).toBe(1) + expect(task.listenerCount("TaskTokenUsageUpdated")).toBe(1) + expect(task.listenerCount("TaskToolFailed")).toBe(1) + expect(task.listenerCount("TaskUnpaused")).toBe(1) + + // Call dispose + task.dispose() + + // Verify all listeners are removed + expect(task.listenerCount("TaskStarted")).toBe(0) + expect(task.listenerCount("TaskAborted")).toBe(0) + expect(task.listenerCount("TaskIdle")).toBe(0) + expect(task.listenerCount("TaskActive")).toBe(0) + expect(task.listenerCount("TaskAskResponded")).toBe(0) + expect(task.listenerCount("Message")).toBe(0) + expect(task.listenerCount("TaskTokenUsageUpdated")).toBe(0) + expect(task.listenerCount("TaskToolFailed")).toBe(0) + expect(task.listenerCount("TaskUnpaused")).toBe(0) + + // Verify total listener count is 0 + expect(task.eventNames().length).toBe(0) + }) +}) From 6540f2be5cf921eafafb329e080e7288563a8541 Mon Sep 17 00:00:00 2001 From: "roomote[bot]" <219738659+roomote[bot]@users.noreply.github.com> Date: Thu, 14 Aug 2025 17:46:52 -0400 Subject: [PATCH 32/36] fix: prevent XML entity decoding in diff tools (#7107) (#7108) * fix: prevent XML entity decoding in diff tools - Add parseXmlForDiff function with processEntities: false to preserve exact content - Update multiApplyDiffTool to use parseXmlForDiff instead of parseXml - Add comprehensive tests for entity handling in parseXmlForDiff This fixes the issue where fast-xml-parser was decoding HTML entities like & causing mismatches in diff tools when comparing against original file content. Fixes #7107 * refactor: eliminate code duplication between parseXml and parseXmlForDiff - Refactored parseXml to accept optional ParseXmlOptions parameter - parseXmlForDiff now delegates to parseXml with processEntities: false - Added explanatory comment in multiApplyDiffTool.ts about why parseXmlForDiff is used - Improved JSDoc documentation with specific use cases for parseXmlForDiff This maintains backward compatibility while eliminating code duplication. parseXml continues to be used for general XML parsing (file reads, follow-up questions), while parseXmlForDiff is specifically for diff operations where entity processing must be disabled. --------- Co-authored-by: Roo Code Co-authored-by: daniel-lxs --- src/core/tools/multiApplyDiffTool.ts | 7 +- src/utils/__tests__/xml.spec.ts | 125 ++++++++++++++++++++++++++- src/utils/xml.ts | 38 +++++++- 3 files changed, 166 insertions(+), 4 deletions(-) diff --git a/src/core/tools/multiApplyDiffTool.ts b/src/core/tools/multiApplyDiffTool.ts index db514d2b64..4cce2d1777 100644 --- a/src/core/tools/multiApplyDiffTool.ts +++ b/src/core/tools/multiApplyDiffTool.ts @@ -12,7 +12,7 @@ import { formatResponse } from "../prompts/responses" import { fileExistsAtPath } from "../../utils/fs" import { RecordSource } from "../context-tracking/FileContextTrackerTypes" import { unescapeHtmlEntities } from "../../utils/text-normalization" -import { parseXml } from "../../utils/xml" +import { parseXmlForDiff } from "../../utils/xml" import { EXPERIMENT_IDS, experiments } from "../../shared/experiments" import { applyDiffToolLegacy } from "./applyDiffTool" @@ -108,7 +108,10 @@ export async function applyDiffTool( if (argsXmlTag) { // Parse file entries from XML (new way) try { - const parsed = parseXml(argsXmlTag, ["file.diff.content"]) as ParsedXmlResult + // IMPORTANT: We use parseXmlForDiff here instead of parseXml to prevent HTML entity decoding + // This ensures exact character matching when comparing parsed content against original file content + // Without this, special characters like & would be decoded to & causing diff mismatches + const parsed = parseXmlForDiff(argsXmlTag, ["file.diff.content"]) as ParsedXmlResult const files = Array.isArray(parsed.file) ? parsed.file : [parsed.file].filter(Boolean) for (const file of files) { diff --git a/src/utils/__tests__/xml.spec.ts b/src/utils/__tests__/xml.spec.ts index 0e43cf04a1..f7a282b0c0 100644 --- a/src/utils/__tests__/xml.spec.ts +++ b/src/utils/__tests__/xml.spec.ts @@ -1,4 +1,4 @@ -import { parseXml } from "../xml" +import { parseXml, parseXmlForDiff } from "../xml" describe("parseXml", () => { describe("type conversion", () => { @@ -115,3 +115,126 @@ describe("parseXml", () => { }) }) }) + +describe("parseXmlForDiff", () => { + describe("HTML entity handling", () => { + it("should NOT decode HTML entities like &", () => { + const xml = ` + + Team Identity & Project Positioning + + ` + + const result = parseXmlForDiff(xml) as any + + // The & should remain as-is, not be decoded to & + expect(result.root.content).toBe("Team Identity & Project Positioning") + }) + + it("should preserve & character without encoding", () => { + const xml = ` + + Team Identity & Project Positioning + + ` + + const result = parseXmlForDiff(xml) as any + + // The & should remain as-is + expect(result.root.content).toBe("Team Identity & Project Positioning") + }) + + it("should NOT decode other HTML entities", () => { + const xml = ` + + <div> "Hello" 'World' + + ` + + const result = parseXmlForDiff(xml) as any + + // All HTML entities should remain as-is + expect(result.root.content).toBe("<div> "Hello" 'World'") + }) + + it("should handle mixed content with entities correctly", () => { + const xml = ` + + if (a < b && c > d) { return "test"; } + + ` + + const result = parseXmlForDiff(xml) as any + + // All entities should remain unchanged + expect(result.root.code).toBe("if (a < b && c > d) { return "test"; }") + }) + }) + + describe("basic functionality (same as parseXml)", () => { + it("should correctly parse a simple XML string", () => { + const xml = ` + + Test Name + Some description + + ` + + const result = parseXmlForDiff(xml) as any + + expect(result).toHaveProperty("root") + expect(result.root).toHaveProperty("name", "Test Name") + expect(result.root).toHaveProperty("description", "Some description") + }) + + it("should handle attributes correctly", () => { + const xml = ` + + Item content + + ` + + const result = parseXmlForDiff(xml) as any + + expect(result.root.item).toHaveProperty("@_id", "1") + expect(result.root.item).toHaveProperty("@_category", "test") + expect(result.root.item).toHaveProperty("#text", "Item content") + }) + + it("should support stopNodes parameter", () => { + const xml = ` + + + Should not parse this + + + ` + + const result = parseXmlForDiff(xml, ["nestedXml"]) as any + + expect(result.root.data.nestedXml).toBeTruthy() + expect(result.root.data.nestedXml).toHaveProperty("item", "Should not parse this") + }) + }) + + describe("diff-specific use case", () => { + it("should preserve exact content for diff matching", () => { + // This simulates the actual use case from the issue + const xml = ` + + + ./doc.md + + Team Identity & Project Positioning + + + + ` + + const result = parseXmlForDiff(xml, ["file.diff.content"]) as any + + // The & should remain as-is for exact matching with file content + expect(result.args.file.diff.content).toBe("Team Identity & Project Positioning") + }) + }) +}) diff --git a/src/utils/xml.ts b/src/utils/xml.ts index 0fd6ef574c..f183309d49 100644 --- a/src/utils/xml.ts +++ b/src/utils/xml.ts @@ -1,13 +1,28 @@ import { XMLParser } from "fast-xml-parser" +/** + * Options for XML parsing + */ +interface ParseXmlOptions { + /** + * Whether to process HTML entities (e.g., & to &). + * Default: true for general parsing, false for diff operations + */ + processEntities?: boolean +} + /** * Parses an XML string into a JavaScript object * @param xmlString The XML string to parse + * @param stopNodes Optional array of node names to stop parsing at + * @param options Optional parsing options * @returns Parsed JavaScript object representation of the XML * @throws Error if the XML is invalid or parsing fails */ -export function parseXml(xmlString: string, stopNodes?: string[]): unknown { +export function parseXml(xmlString: string, stopNodes?: string[], options?: ParseXmlOptions): unknown { const _stopNodes = stopNodes ?? [] + const processEntities = options?.processEntities ?? true + try { const parser = new XMLParser({ ignoreAttributes: false, @@ -15,6 +30,7 @@ export function parseXml(xmlString: string, stopNodes?: string[]): unknown { parseAttributeValue: false, parseTagValue: false, trimValues: true, + processEntities, stopNodes: _stopNodes, }) @@ -25,3 +41,23 @@ export function parseXml(xmlString: string, stopNodes?: string[]): unknown { throw new Error(`Failed to parse XML: ${errorMessage}`) } } + +/** + * Parses an XML string for diffing purposes, ensuring no HTML entities are decoded. + * This is a specialized version of parseXml to be used exclusively by diffing tools + * to prevent mismatches caused by entity processing. + * + * Use this instead of parseXml when: + * - Comparing parsed content against original file content + * - Performing diff operations where exact character matching is required + * - Processing XML that will be used in search/replace operations + * + * @param xmlString The XML string to parse + * @param stopNodes Optional array of node names to stop parsing at + * @returns Parsed JavaScript object representation of the XML + * @throws Error if the XML is invalid or parsing fails + */ +export function parseXmlForDiff(xmlString: string, stopNodes?: string[]): unknown { + // Delegate to parseXml with processEntities disabled + return parseXml(xmlString, stopNodes, { processEntities: false }) +} From 57389bff360315c1c8554bcb6f9c839271f3760e Mon Sep 17 00:00:00 2001 From: NaccOll Date: Fri, 15 Aug 2025 06:16:54 +0800 Subject: [PATCH 33/36] Hotfix multiple folder workspace checkpoint (#6903) --- src/core/checkpoints/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/checkpoints/index.ts b/src/core/checkpoints/index.ts index 05549be0f9..83aefe56b5 100644 --- a/src/core/checkpoints/index.ts +++ b/src/core/checkpoints/index.ts @@ -42,7 +42,7 @@ export async function getCheckpointService( console.log("[Task#getCheckpointService] initializing checkpoints service") try { - const workspaceDir = getWorkspacePath() + const workspaceDir = cline.cwd || getWorkspacePath() if (!workspaceDir) { log("[Task#getCheckpointService] workspace folder not found, disabling checkpoints") From 3f4af18bf7df4b78fd24c836649459d864270aa3 Mon Sep 17 00:00:00 2001 From: NaccOll Date: Fri, 15 Aug 2025 06:17:14 +0800 Subject: [PATCH 34/36] fix: Use cline.cwd as primary source for workspace path in codebaseSearchTool (#6902) Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com> Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com> --- src/core/tools/codebaseSearchTool.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/tools/codebaseSearchTool.ts b/src/core/tools/codebaseSearchTool.ts index 236b066306..700d1b7c7c 100644 --- a/src/core/tools/codebaseSearchTool.ts +++ b/src/core/tools/codebaseSearchTool.ts @@ -17,7 +17,7 @@ export async function codebaseSearchTool( removeClosingTag: RemoveClosingTag, ) { const toolName = "codebase_search" - const workspacePath = getWorkspacePath() + const workspacePath = (cline.cwd && cline.cwd.trim() !== '') ? cline.cwd : getWorkspacePath() if (!workspacePath) { // This case should ideally not happen if Cline is initialized correctly From bfdd1581292bba434e65f23b8d9b203ea25aa051 Mon Sep 17 00:00:00 2001 From: Daniel <57051444+daniel-lxs@users.noreply.github.com> Date: Thu, 14 Aug 2025 18:48:25 -0500 Subject: [PATCH 35/36] Fix: Enable save button for provider dropdown and checkbox changes (#7113) * fix: enable save button for provider dropdown and checkbox changes The save button wasn't enabling when users changed provider settings like dropdowns and checkboxes because setApiConfigurationField was treating all changes from undefined to a defined value as 'initial sync' and not marking the form as dirty. Added an optional isUserAction parameter (defaults to true) to distinguish: - User actions (should enable save button) - the default - Automatic initialization (shouldn't enable save button) - pass false This fixes the issue where changing provider dropdowns, checkboxes with default values, and other settings wouldn't enable the save button. * fix: remove incorrect isUserAction=false from apiModelId sync The useEffect that syncs apiModelId with selectedModelId was incorrectly passing isUserAction=false, which prevented the save button from enabling when users selected a different model. Since this effect responds to all selectedModelId changes (including user selections), it should use the default isUserAction=true behavior. * test: fix ThinkingBudget test to expect isUserAction parameter The test now correctly expects setApiConfigurationField to be called with three arguments including the isUserAction=false parameter for automatic thinking token adjustments. --- webview-ui/src/components/settings/ApiOptions.tsx | 8 ++++++-- webview-ui/src/components/settings/ModelPicker.tsx | 8 ++++++-- webview-ui/src/components/settings/SettingsView.tsx | 8 ++++---- webview-ui/src/components/settings/ThinkingBudget.tsx | 10 +++++++--- .../settings/__tests__/ThinkingBudget.spec.tsx | 2 +- .../src/components/settings/providers/HuggingFace.tsx | 8 ++++++-- .../src/components/settings/providers/Unbound.tsx | 8 ++++++-- 7 files changed, 36 insertions(+), 16 deletions(-) diff --git a/webview-ui/src/components/settings/ApiOptions.tsx b/webview-ui/src/components/settings/ApiOptions.tsx index dcdf072a11..b51b171354 100644 --- a/webview-ui/src/components/settings/ApiOptions.tsx +++ b/webview-ui/src/components/settings/ApiOptions.tsx @@ -105,7 +105,11 @@ import { buildDocLink } from "@src/utils/docLinks" export interface ApiOptionsProps { uriScheme: string | undefined apiConfiguration: ProviderSettings - setApiConfigurationField: (field: K, value: ProviderSettings[K]) => void + setApiConfigurationField: ( + field: K, + value: ProviderSettings[K], + isUserAction?: boolean, + ) => void fromWelcomeView?: boolean errorMessage: string | undefined setErrorMessage: React.Dispatch> @@ -280,7 +284,7 @@ const ApiOptions = ({ const shouldSetDefault = !modelId if (shouldSetDefault) { - setApiConfigurationField(field, defaultValue) + setApiConfigurationField(field, defaultValue, false) } } diff --git a/webview-ui/src/components/settings/ModelPicker.tsx b/webview-ui/src/components/settings/ModelPicker.tsx index 2160d4b3c5..0753f9fc2b 100644 --- a/webview-ui/src/components/settings/ModelPicker.tsx +++ b/webview-ui/src/components/settings/ModelPicker.tsx @@ -46,7 +46,11 @@ interface ModelPickerProps { serviceName: string serviceUrl: string apiConfiguration: ProviderSettings - setApiConfigurationField: (field: K, value: ProviderSettings[K]) => void + setApiConfigurationField: ( + field: K, + value: ProviderSettings[K], + isUserAction?: boolean, + ) => void organizationAllowList: OrganizationAllowList errorMessage?: string } @@ -124,7 +128,7 @@ export const ModelPicker = ({ useEffect(() => { if (!selectedModelId && !isInitialized.current) { const initialValue = modelIds.includes(selectedModelId) ? selectedModelId : defaultModelId - setApiConfigurationField(modelIdKey, initialValue) + setApiConfigurationField(modelIdKey, initialValue, false) // false = automatic initialization } isInitialized.current = true diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index 987d245105..9866c1e235 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -219,7 +219,7 @@ const SettingsView = forwardRef(({ onDone, t }, []) const setApiConfigurationField = useCallback( - (field: K, value: ProviderSettings[K]) => { + (field: K, value: ProviderSettings[K], isUserAction: boolean = true) => { setCachedState((prevState) => { if (prevState.apiConfiguration?.[field] === value) { return prevState @@ -227,9 +227,9 @@ const SettingsView = forwardRef(({ onDone, t const previousValue = prevState.apiConfiguration?.[field] - // Don't treat initial sync from undefined to a defined value as a user change - // This prevents the dirty state when the component initializes and auto-syncs the model ID - const isInitialSync = previousValue === undefined && value !== undefined + // Only skip change detection for automatic initialization (not user actions) + // This prevents the dirty state when the component initializes and auto-syncs values + const isInitialSync = !isUserAction && previousValue === undefined && value !== undefined if (!isInitialSync) { setChangeDetected(true) diff --git a/webview-ui/src/components/settings/ThinkingBudget.tsx b/webview-ui/src/components/settings/ThinkingBudget.tsx index c2aa234983..7a85e61e7a 100644 --- a/webview-ui/src/components/settings/ThinkingBudget.tsx +++ b/webview-ui/src/components/settings/ThinkingBudget.tsx @@ -20,7 +20,11 @@ import { useSelectedModel } from "@src/components/ui/hooks/useSelectedModel" interface ThinkingBudgetProps { apiConfiguration: ProviderSettings - setApiConfigurationField: (field: K, value: ProviderSettings[K]) => void + setApiConfigurationField: ( + field: K, + value: ProviderSettings[K], + isUserAction?: boolean, + ) => void modelInfo?: ModelInfo } @@ -71,7 +75,7 @@ export const ThinkingBudget = ({ apiConfiguration, setApiConfigurationField, mod // Set default reasoning effort when model supports it and no value is set useEffect(() => { if (isReasoningEffortSupported && !apiConfiguration.reasoningEffort && defaultReasoningEffort) { - setApiConfigurationField("reasoningEffort", defaultReasoningEffort) + setApiConfigurationField("reasoningEffort", defaultReasoningEffort, false) } }, [isReasoningEffortSupported, apiConfiguration.reasoningEffort, defaultReasoningEffort, setApiConfigurationField]) @@ -91,7 +95,7 @@ export const ThinkingBudget = ({ apiConfiguration, setApiConfigurationField, mod // appropriately. useEffect(() => { if (isReasoningBudgetSupported && customMaxThinkingTokens > modelMaxThinkingTokens) { - setApiConfigurationField("modelMaxThinkingTokens", modelMaxThinkingTokens) + setApiConfigurationField("modelMaxThinkingTokens", modelMaxThinkingTokens, false) } }, [isReasoningBudgetSupported, customMaxThinkingTokens, modelMaxThinkingTokens, setApiConfigurationField]) diff --git a/webview-ui/src/components/settings/__tests__/ThinkingBudget.spec.tsx b/webview-ui/src/components/settings/__tests__/ThinkingBudget.spec.tsx index fa7493edc6..9bc235e5f0 100644 --- a/webview-ui/src/components/settings/__tests__/ThinkingBudget.spec.tsx +++ b/webview-ui/src/components/settings/__tests__/ThinkingBudget.spec.tsx @@ -112,7 +112,7 @@ describe("ThinkingBudget", () => { ) // Effect should trigger and cap the value - expect(setApiConfigurationField).toHaveBeenCalledWith("modelMaxThinkingTokens", 8000) // 80% of 10000 + expect(setApiConfigurationField).toHaveBeenCalledWith("modelMaxThinkingTokens", 8000, false) // 80% of 10000 }) it("should use default thinking tokens if not provided", () => { diff --git a/webview-ui/src/components/settings/providers/HuggingFace.tsx b/webview-ui/src/components/settings/providers/HuggingFace.tsx index 8716739d80..94f60cc4c8 100644 --- a/webview-ui/src/components/settings/providers/HuggingFace.tsx +++ b/webview-ui/src/components/settings/providers/HuggingFace.tsx @@ -34,7 +34,11 @@ type HuggingFaceModel = { type HuggingFaceProps = { apiConfiguration: ProviderSettings - setApiConfigurationField: (field: keyof ProviderSettings, value: ProviderSettings[keyof ProviderSettings]) => void + setApiConfigurationField: ( + field: keyof ProviderSettings, + value: ProviderSettings[keyof ProviderSettings], + isUserAction?: boolean, + ) => void } export const HuggingFace = ({ apiConfiguration, setApiConfigurationField }: HuggingFaceProps) => { @@ -93,7 +97,7 @@ export const HuggingFace = ({ apiConfiguration, setApiConfigurationField }: Hugg // Set to "auto" as default const defaultProvider = "auto" setSelectedProvider(defaultProvider) - setApiConfigurationField("huggingFaceInferenceProvider", defaultProvider) + setApiConfigurationField("huggingFaceInferenceProvider", defaultProvider, false) // false = automatic default } } } diff --git a/webview-ui/src/components/settings/providers/Unbound.tsx b/webview-ui/src/components/settings/providers/Unbound.tsx index a242ee4b3f..2dd105a663 100644 --- a/webview-ui/src/components/settings/providers/Unbound.tsx +++ b/webview-ui/src/components/settings/providers/Unbound.tsx @@ -17,7 +17,11 @@ import { ModelPicker } from "../ModelPicker" type UnboundProps = { apiConfiguration: ProviderSettings - setApiConfigurationField: (field: keyof ProviderSettings, value: ProviderSettings[keyof ProviderSettings]) => void + setApiConfigurationField: ( + field: keyof ProviderSettings, + value: ProviderSettings[keyof ProviderSettings], + isUserAction?: boolean, + ) => void routerModels?: RouterModels organizationAllowList: OrganizationAllowList modelValidationError?: string @@ -110,7 +114,7 @@ export const Unbound = ({ if (!currentModelId || !modelExists) { const firstAvailableModelId = Object.keys(updatedModels)[0] - setApiConfigurationField("unboundModelId", firstAvailableModelId) + setApiConfigurationField("unboundModelId", firstAvailableModelId, false) // false = automatic model selection } } From 0d0bba2eb7cf1fc8a960988461524037867139fa Mon Sep 17 00:00:00 2001 From: "roomote[bot]" <219738659+roomote[bot]@users.noreply.github.com> Date: Thu, 14 Aug 2025 20:05:45 -0400 Subject: [PATCH 36/36] fix: add type check before calling .match() on diffItem.content (#6905) (#6906) * fix: add type check before calling .match() on diffItem.content Fixes #6905 - Error during diff application "v.content.match is not a function" - Added type check to ensure diffItem.content is a string before calling .match() - Added comprehensive tests for handling non-string content values - Prevents runtime errors when content is null, undefined, or other non-string types * fix: validate content type earlier in diff parsing - Move type check to where content is first extracted from XML - Remove redundant check since content is now guaranteed to be string - Add test for early content validation * chore: remove comments * fix: add TelemetryService mock to multiApplyDiffTool tests * fix: add captureDiffApplicationError to TelemetryService mock --------- Co-authored-by: Roo Code Co-authored-by: daniel-lxs Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com> --- .../__tests__/multiApplyDiffTool.spec.ts | 401 ++++++++++++++++++ src/core/tools/multiApplyDiffTool.ts | 14 +- 2 files changed, 410 insertions(+), 5 deletions(-) create mode 100644 src/core/tools/__tests__/multiApplyDiffTool.spec.ts diff --git a/src/core/tools/__tests__/multiApplyDiffTool.spec.ts b/src/core/tools/__tests__/multiApplyDiffTool.spec.ts new file mode 100644 index 0000000000..0bdedb9cd5 --- /dev/null +++ b/src/core/tools/__tests__/multiApplyDiffTool.spec.ts @@ -0,0 +1,401 @@ +import { applyDiffTool } from "../multiApplyDiffTool" +import { EXPERIMENT_IDS } from "../../../shared/experiments" +import * as fs from "fs/promises" +import * as fileUtils from "../../../utils/fs" +import * as pathUtils from "../../../utils/path" + +// Mock dependencies +vi.mock("fs/promises") +vi.mock("../../../utils/fs") +vi.mock("../../../utils/path") +vi.mock("../../../utils/xml") +vi.mock("../applyDiffTool", () => ({ + applyDiffToolLegacy: vi.fn(), +})) + +// Mock TelemetryService +vi.mock("@roo-code/telemetry", () => ({ + TelemetryService: { + get instance() { + return { + trackEvent: vi.fn(), + trackError: vi.fn(), + captureDiffApplicationError: vi.fn(), + } + }, + }, +})) + +describe("multiApplyDiffTool", () => { + let mockCline: any + let mockBlock: any + let mockAskApproval: any + let mockHandleError: any + let mockPushToolResult: any + let mockRemoveClosingTag: any + let mockProvider: any + + beforeEach(() => { + vi.clearAllMocks() + + mockProvider = { + getState: vi.fn().mockResolvedValue({ + experiments: { + [EXPERIMENT_IDS.MULTI_FILE_APPLY_DIFF]: true, + }, + diagnosticsEnabled: true, + writeDelayMs: 0, + }), + } + + mockCline = { + providerRef: { + deref: vi.fn().mockReturnValue(mockProvider), + }, + cwd: "/test", + taskId: "test-task", + consecutiveMistakeCount: 0, + consecutiveMistakeCountForApplyDiff: new Map(), + recordToolError: vi.fn(), + say: vi.fn().mockResolvedValue(undefined), + sayAndCreateMissingParamError: vi.fn().mockResolvedValue("Missing parameter error"), + ask: vi.fn().mockResolvedValue({ response: "yesButtonClicked", text: "", images: [] }), + diffStrategy: { + applyDiff: vi.fn().mockResolvedValue({ + success: true, + content: "modified content", + }), + getProgressStatus: vi.fn(), + }, + diffViewProvider: { + reset: vi.fn().mockResolvedValue(undefined), + editType: undefined, + originalContent: undefined, + open: vi.fn().mockResolvedValue(undefined), + update: vi.fn().mockResolvedValue(undefined), + scrollToFirstDiff: vi.fn(), + saveDirectly: vi.fn().mockResolvedValue(undefined), + saveChanges: vi.fn().mockResolvedValue(undefined), + pushToolWriteResult: vi.fn().mockResolvedValue("File modified successfully"), + }, + api: { + getModel: vi.fn().mockReturnValue({ id: "test-model" }), + }, + rooIgnoreController: { + validateAccess: vi.fn().mockReturnValue(true), + }, + rooProtectedController: { + isWriteProtected: vi.fn().mockReturnValue(false), + }, + fileContextTracker: { + trackFileContext: vi.fn().mockResolvedValue(undefined), + }, + didEditFile: false, + } as any + + mockAskApproval = vi.fn().mockResolvedValue(true) + mockHandleError = vi.fn() + mockPushToolResult = vi.fn() + mockRemoveClosingTag = vi.fn((tag, value) => value) + + // Mock file system operations + ;(fileUtils.fileExistsAtPath as any).mockResolvedValue(true) + ;(fs.readFile as any).mockResolvedValue("original content") + ;(pathUtils.getReadablePath as any).mockImplementation((cwd: string, path: string) => path) + }) + + describe("Early content validation", () => { + it("should filter out non-string content at parse time", async () => { + mockBlock = { + params: { + args: ` + test.ts + + valid string content + + `, + }, + partial: false, + } + + // Mock parseXml to return mixed content types + const parseXml = await import("../../../utils/xml") + ;(parseXml.parseXml as any).mockReturnValue({ + file: { + path: "test.ts", + diff: [ + { content: "<<<<<<< SEARCH\ntest\n=======\nreplaced\n>>>>>>> REPLACE" }, + { content: null }, + { content: undefined }, + { content: 42 }, + { content: "" }, // Empty string should also be filtered + { content: "<<<<<<< SEARCH\nmore\n=======\nchanges\n>>>>>>> REPLACE" }, + ], + }, + }) + + await applyDiffTool( + mockCline, + mockBlock, + mockAskApproval, + mockHandleError, + mockPushToolResult, + mockRemoveClosingTag, + ) + + // Should complete without error and only process valid string content + expect(mockPushToolResult).toHaveBeenCalled() + expect(mockHandleError).not.toHaveBeenCalled() + + // Verify that only valid diffs were processed + const resultCall = mockPushToolResult.mock.calls[0][0] + // Should not include the single block notice since we have 2 valid blocks + expect(resultCall).not.toContain("Making multiple related changes") + }) + }) + + describe("SEARCH block counting with non-string content", () => { + it("should handle diffItem.content being undefined", async () => { + mockBlock = { + params: { + path: "test.ts", + diff: undefined, // This will result in undefined content + }, + partial: false, + } + + await applyDiffTool( + mockCline, + mockBlock, + mockAskApproval, + mockHandleError, + mockPushToolResult, + mockRemoveClosingTag, + ) + + // Should complete without throwing an error + expect(mockPushToolResult).toHaveBeenCalled() + expect(mockHandleError).not.toHaveBeenCalled() + }) + + it("should handle diffItem.content being null", async () => { + mockBlock = { + params: { + args: ` + test.ts + + + + `, + }, + partial: false, + } + + // Mock parseXml to return null content + const parseXml = await import("../../../utils/xml") + ;(parseXml.parseXml as any).mockReturnValue({ + file: { + path: "test.ts", + diff: { + content: null, + }, + }, + }) + + await applyDiffTool( + mockCline, + mockBlock, + mockAskApproval, + mockHandleError, + mockPushToolResult, + mockRemoveClosingTag, + ) + + // Should complete without throwing an error + expect(mockPushToolResult).toHaveBeenCalled() + expect(mockHandleError).not.toHaveBeenCalled() + }) + + it("should handle diffItem.content being a number", async () => { + mockBlock = { + params: { + args: ` + test.ts + + 123 + + `, + }, + partial: false, + } + + // Mock parseXml to return number content + const parseXml = await import("../../../utils/xml") + ;(parseXml.parseXml as any).mockReturnValue({ + file: { + path: "test.ts", + diff: { + content: 123, // Number instead of string + }, + }, + }) + + await applyDiffTool( + mockCline, + mockBlock, + mockAskApproval, + mockHandleError, + mockPushToolResult, + mockRemoveClosingTag, + ) + + // Should complete without throwing an error + expect(mockPushToolResult).toHaveBeenCalled() + expect(mockHandleError).not.toHaveBeenCalled() + }) + + it("should correctly count SEARCH blocks when content is a valid string", async () => { + const diffContent = `<<<<<<< SEARCH +old content +======= +new content +>>>>>>> REPLACE + +<<<<<<< SEARCH +another old content +======= +another new content +>>>>>>> REPLACE` + + mockBlock = { + params: { + path: "test.ts", + diff: diffContent, + }, + partial: false, + } + + await applyDiffTool( + mockCline, + mockBlock, + mockAskApproval, + mockHandleError, + mockPushToolResult, + mockRemoveClosingTag, + ) + + // Should complete successfully + expect(mockPushToolResult).toHaveBeenCalled() + const resultCall = mockPushToolResult.mock.calls[0][0] + // Should not include the single block notice since we have 2 blocks + expect(resultCall).not.toContain("Making multiple related changes") + }) + + it("should show single block notice when only one SEARCH block exists", async () => { + const diffContent = `<<<<<<< SEARCH +old content +======= +new content +>>>>>>> REPLACE` + + mockBlock = { + params: { + path: "test.ts", + diff: diffContent, + }, + partial: false, + } + + await applyDiffTool( + mockCline, + mockBlock, + mockAskApproval, + mockHandleError, + mockPushToolResult, + mockRemoveClosingTag, + ) + + // Should complete successfully + expect(mockPushToolResult).toHaveBeenCalled() + const resultCall = mockPushToolResult.mock.calls[0][0] + // Should include the single block notice + expect(resultCall).toContain("Making multiple related changes") + }) + }) + + describe("Edge cases for diff content", () => { + it("should handle empty diff array", async () => { + mockBlock = { + params: { + args: ` + test.ts + + `, + }, + partial: false, + } + + const parseXml = await import("../../../utils/xml") + ;(parseXml.parseXml as any).mockReturnValue({ + file: { + path: "test.ts", + diff: [], + }, + }) + + await applyDiffTool( + mockCline, + mockBlock, + mockAskApproval, + mockHandleError, + mockPushToolResult, + mockRemoveClosingTag, + ) + + // Should complete without error + expect(mockPushToolResult).toHaveBeenCalled() + expect(mockHandleError).not.toHaveBeenCalled() + }) + + it("should handle mixed content types in diff array", async () => { + mockBlock = { + params: { + args: ` + test.ts + + valid string content + + `, + }, + partial: false, + } + + const parseXml = await import("../../../utils/xml") + ;(parseXml.parseXml as any).mockReturnValue({ + file: { + path: "test.ts", + diff: [ + { content: "<<<<<<< SEARCH\ntest\n=======\nreplaced\n>>>>>>> REPLACE" }, + { content: null }, + { content: undefined }, + { content: 42 }, + { content: "<<<<<<< SEARCH\nmore\n=======\nchanges\n>>>>>>> REPLACE" }, + ], + }, + }) + + await applyDiffTool( + mockCline, + mockBlock, + mockAskApproval, + mockHandleError, + mockPushToolResult, + mockRemoveClosingTag, + ) + + // Should complete without error and count only valid string SEARCH blocks + expect(mockPushToolResult).toHaveBeenCalled() + expect(mockHandleError).not.toHaveBeenCalled() + }) + }) +}) diff --git a/src/core/tools/multiApplyDiffTool.ts b/src/core/tools/multiApplyDiffTool.ts index 4cce2d1777..50695b1da7 100644 --- a/src/core/tools/multiApplyDiffTool.ts +++ b/src/core/tools/multiApplyDiffTool.ts @@ -135,13 +135,17 @@ export async function applyDiffTool( let diffContent: string let startLine: number | undefined - diffContent = diff.content + // Ensure content is a string before storing it + diffContent = typeof diff.content === "string" ? diff.content : "" startLine = diff.start_line ? parseInt(diff.start_line) : undefined - operationsMap[filePath].diff.push({ - content: diffContent, - startLine, - }) + // Only add to operations if we have valid content + if (diffContent) { + operationsMap[filePath].diff.push({ + content: diffContent, + startLine, + }) + } } } } catch (error) {