From 81f9ad49e0edc5018769224bcad64671af974897 Mon Sep 17 00:00:00 2001 From: Chung Nguyen <15166543+ChuKhaLi@users.noreply.github.com> Date: Mon, 26 May 2025 01:43:44 +0700 Subject: [PATCH 01/21] feat: Add Gemini as an embedding provider for codebase indexing --- src/api/providers/gemini.ts | 2 +- src/services/code-index/config-manager.ts | 40 +++++++- src/services/code-index/embedders/gemini.ts | 96 +++++++++++++++++++ src/services/code-index/interfaces/config.ts | 3 + .../code-index/interfaces/embedder.ts | 2 +- src/services/code-index/interfaces/manager.ts | 2 +- src/services/code-index/service-factory.ts | 6 ++ src/shared/embeddingModels.ts | 10 +- .../components/settings/CodeIndexSettings.tsx | 79 ++++++++++++++- 9 files changed, 233 insertions(+), 7 deletions(-) create mode 100644 src/services/code-index/embedders/gemini.ts diff --git a/src/api/providers/gemini.ts b/src/api/providers/gemini.ts index 5addc07a92c..3882723f14d 100644 --- a/src/api/providers/gemini.ts +++ b/src/api/providers/gemini.ts @@ -25,7 +25,7 @@ type GeminiHandlerOptions = ApiHandlerOptions & { export class GeminiHandler extends BaseProvider implements SingleCompletionHandler { protected options: ApiHandlerOptions - private client: GoogleGenAI + protected client: GoogleGenAI constructor({ isVertex, ...options }: GeminiHandlerOptions) { super() diff --git a/src/services/code-index/config-manager.ts b/src/services/code-index/config-manager.ts index 730f43e3c59..18096ec0191 100644 --- a/src/services/code-index/config-manager.ts +++ b/src/services/code-index/config-manager.ts @@ -15,6 +15,7 @@ export class CodeIndexConfigManager { private modelId?: string private openAiOptions?: ApiHandlerOptions private ollamaOptions?: ApiHandlerOptions + private geminiOptions?: ApiHandlerOptions private qdrantUrl?: string = "http://localhost:6333" private qdrantApiKey?: string private searchMinScore?: number @@ -37,6 +38,7 @@ export class CodeIndexConfigManager { codebaseIndexEmbedderProvider: "openai", codebaseIndexEmbedderBaseUrl: "", codebaseIndexEmbedderModelId: "", + geminiEmbeddingTaskType: "CODE_RETRIEVAL_QUERY", } const { @@ -45,10 +47,12 @@ export class CodeIndexConfigManager { codebaseIndexEmbedderProvider, codebaseIndexEmbedderBaseUrl, codebaseIndexEmbedderModelId, + geminiEmbeddingTaskType, } = codebaseIndexConfig const openAiKey = this.contextProxy?.getSecret("codeIndexOpenAiKey") ?? "" const qdrantApiKey = this.contextProxy?.getSecret("codeIndexQdrantApiKey") ?? "" + const geminiApiKey = this.contextProxy?.getSecret("geminiApiKey") ?? "" // Update instance variables with configuration this.isEnabled = codebaseIndexEnabled || false @@ -57,12 +61,25 @@ export class CodeIndexConfigManager { this.openAiOptions = { openAiNativeApiKey: openAiKey } this.searchMinScore = SEARCH_MIN_SCORE - this.embedderProvider = codebaseIndexEmbedderProvider === "ollama" ? "ollama" : "openai" + if (codebaseIndexEmbedderProvider === "ollama") { + this.embedderProvider = "ollama" + } else if (codebaseIndexEmbedderProvider === "gemini") { + this.embedderProvider = "gemini" + } else { + this.embedderProvider = "openai" + } + this.modelId = codebaseIndexEmbedderModelId || undefined this.ollamaOptions = { ollamaBaseUrl: codebaseIndexEmbedderBaseUrl, } + + this.geminiOptions = { + geminiApiKey, + geminiEmbeddingTaskType: geminiEmbeddingTaskType || "CODE_RETRIEVAL_QUERY", + apiModelId: this.modelId, + } } /** @@ -77,6 +94,7 @@ export class CodeIndexConfigManager { modelId?: string openAiOptions?: ApiHandlerOptions ollamaOptions?: ApiHandlerOptions + geminiOptions?: ApiHandlerOptions qdrantUrl?: string qdrantApiKey?: string searchMinScore?: number @@ -91,6 +109,8 @@ export class CodeIndexConfigManager { modelId: this.modelId, openAiKey: this.openAiOptions?.openAiNativeApiKey ?? "", ollamaBaseUrl: this.ollamaOptions?.ollamaBaseUrl ?? "", + geminiApiKey: this.geminiOptions?.geminiApiKey, + geminiEmbeddingTaskType: this.geminiOptions?.geminiEmbeddingTaskType, qdrantUrl: this.qdrantUrl ?? "", qdrantApiKey: this.qdrantApiKey ?? "", } @@ -109,6 +129,7 @@ export class CodeIndexConfigManager { modelId: this.modelId, openAiOptions: this.openAiOptions, ollamaOptions: this.ollamaOptions, + geminiOptions: this.geminiOptions, qdrantUrl: this.qdrantUrl, qdrantApiKey: this.qdrantApiKey, searchMinScore: this.searchMinScore, @@ -133,6 +154,15 @@ export class CodeIndexConfigManager { const isConfigured = !!(ollamaBaseUrl && qdrantUrl) return isConfigured } + + if (this.embedderProvider === "gemini") { + // Gemini requires an API key and Qdrant URL + const geminiApiKey = this.geminiOptions?.geminiApiKey + const geminiEmbeddingTaskType = this.geminiOptions?.geminiEmbeddingTaskType + const qdrantUrl = this.qdrantUrl + const isConfigured = !!(geminiApiKey && geminiEmbeddingTaskType && qdrantUrl) + return isConfigured + } return false // Should not happen if embedderProvider is always set correctly } @@ -149,6 +179,7 @@ export class CodeIndexConfigManager { const prevModelId = prev?.modelId ?? undefined const prevOpenAiKey = prev?.openAiKey ?? "" const prevOllamaBaseUrl = prev?.ollamaBaseUrl ?? "" + const prevGeminiApiKey = prev?.geminiApiKey ?? "" const prevQdrantUrl = prev?.qdrantUrl ?? "" const prevQdrantApiKey = prev?.qdrantApiKey ?? "" @@ -193,6 +224,13 @@ export class CodeIndexConfigManager { } } + if (this.embedderProvider === "gemini") { + const currentGeminiApiKey = this.geminiOptions?.geminiApiKey ?? "" + if (prevGeminiApiKey !== currentGeminiApiKey) { + return true + } + } + // Qdrant configuration changes const currentQdrantUrl = this.qdrantUrl ?? "" const currentQdrantApiKey = this.qdrantApiKey ?? "" diff --git a/src/services/code-index/embedders/gemini.ts b/src/services/code-index/embedders/gemini.ts new file mode 100644 index 00000000000..453c9a362c6 --- /dev/null +++ b/src/services/code-index/embedders/gemini.ts @@ -0,0 +1,96 @@ +import { ApiHandlerOptions } from "../../../shared/api" +import { EmbedderInfo, EmbeddingResponse, IEmbedder } from "../interfaces" +import { GeminiHandler } from "../../../api/providers/gemini" + +/** + * Implements the IEmbedder interface using Google Gemini's embedding API. + */ +export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder { + private readonly defaultModelId: string + private readonly defaultTaskType: string + + /** + * Creates a new Gemini embedder instance. + * @param options API handler options containing Gemini configurations + */ + constructor(options: ApiHandlerOptions) { + super(options) + this.defaultModelId = options.apiModelId || "gemini-embedding-exp-03-07" + this.defaultTaskType = options.geminiEmbeddingTaskType || "CODE_RETRIEVAL_QUERY" + } + + /** + * Creates embeddings for the given texts using the Gemini API. + * @param texts - An array of strings to embed. + * @param model - Optional model ID to override the default. + * @returns A promise that resolves to an EmbeddingResponse containing the embeddings and usage data. + */ + async createEmbeddings(texts: string[], model?: string): Promise { + try { + // Use the enhanced GeminiHandler to generate embeddings + const result = await this.generateEmbeddings(texts, model, this.defaultTaskType) + + return { + embeddings: result.embeddings, + usage: result.usage, + } + } catch (error: any) { + // Log the original error for debugging purposes + console.error("Gemini embedding failed:", error) + // Re-throw a more specific error for the caller + throw new Error(`Gemini embedding failed: ${error.message}`) + } + } + + /** + * Generates embeddings for the provided texts using Gemini API + * @param texts - Array of text strings to create embeddings for + * @param model - Optional model ID to use for embeddings, defaults to the configured default model + * @param taskType - The task type to optimize embeddings for (e.g., 'CODE_RETRIEVAL_QUERY') + * @returns Promise resolving to an EmbeddingResponse with the embeddings and usage data + */ + private async generateEmbeddings( + texts: string[], + model?: string, + taskType: string = "CODE_RETRIEVAL_QUERY", + ): Promise<{ + embeddings: number[][] + usage?: { + promptTokens: number + totalTokens: number + } + }> { + try { + const modelId = model || this.defaultModelId + + // Use batchEmbedContents for multiple texts + const response = await this.client.models.embedContent({ + model: modelId, + contents: texts, + config: { + taskType, + }, + }) + + if (!response.embeddings) { + throw new Error("No embeddings returned from Gemini API") + } + + const embeddings = response.embeddings + .map((embedding) => embedding?.values) + .filter((values) => values !== undefined && values.length > 0) as number[][] + return { embeddings } + } catch (error) { + if (error instanceof Error) { + throw new Error(`Gemini embeddings error: ${error.message}`) + } + throw error + } + } + + get embedderInfo(): EmbedderInfo { + return { + name: "gemini", + } + } +} diff --git a/src/services/code-index/interfaces/config.ts b/src/services/code-index/interfaces/config.ts index 2d079117830..7a7705ec0fd 100644 --- a/src/services/code-index/interfaces/config.ts +++ b/src/services/code-index/interfaces/config.ts @@ -11,6 +11,7 @@ export interface CodeIndexConfig { modelId?: string openAiOptions?: ApiHandlerOptions ollamaOptions?: ApiHandlerOptions + geminiOptions?: ApiHandlerOptions qdrantUrl?: string qdrantApiKey?: string searchMinScore?: number @@ -26,6 +27,8 @@ export type PreviousConfigSnapshot = { modelId?: string openAiKey?: string ollamaBaseUrl?: string + geminiApiKey?: string + geminiEmbeddingTaskType?: string qdrantUrl?: string qdrantApiKey?: string } diff --git a/src/services/code-index/interfaces/embedder.ts b/src/services/code-index/interfaces/embedder.ts index de43255a65f..4ba1470c6f7 100644 --- a/src/services/code-index/interfaces/embedder.ts +++ b/src/services/code-index/interfaces/embedder.ts @@ -21,7 +21,7 @@ export interface EmbeddingResponse { } } -export type AvailableEmbedders = "openai" | "ollama" +export type AvailableEmbedders = "openai" | "ollama" | "gemini" export interface EmbedderInfo { name: AvailableEmbedders diff --git a/src/services/code-index/interfaces/manager.ts b/src/services/code-index/interfaces/manager.ts index 1d3ce92c95b..fb3d9f8cab7 100644 --- a/src/services/code-index/interfaces/manager.ts +++ b/src/services/code-index/interfaces/manager.ts @@ -70,7 +70,7 @@ export interface ICodeIndexManager { } export type IndexingState = "Standby" | "Indexing" | "Indexed" | "Error" -export type EmbedderProvider = "openai" | "ollama" +export type EmbedderProvider = "openai" | "ollama" | "gemini" export interface IndexProgressUpdate { systemStatus: IndexingState diff --git a/src/services/code-index/service-factory.ts b/src/services/code-index/service-factory.ts index 7a95fe95560..6bfbb1cb454 100644 --- a/src/services/code-index/service-factory.ts +++ b/src/services/code-index/service-factory.ts @@ -1,6 +1,7 @@ import * as vscode from "vscode" import { OpenAiEmbedder } from "./embedders/openai" import { CodeIndexOllamaEmbedder } from "./embedders/ollama" +import { CodeIndexGeminiEmbedder } from "./embedders/gemini" import { EmbedderProvider, getDefaultModelId, getModelDimension } from "../../shared/embeddingModels" import { QdrantVectorStore } from "./vector-store/qdrant-client" import { codeParser, DirectoryScanner, FileWatcher } from "./processors" @@ -43,6 +44,11 @@ export class CodeIndexServiceFactory { ...config.ollamaOptions, ollamaModelId: config.modelId, }) + } else if (provider === "gemini") { + if (!config.geminiOptions?.geminiApiKey) { + throw new Error("Gemini configuration missing for embedder creation") + } + return new CodeIndexGeminiEmbedder(config.geminiOptions) } throw new Error(`Invalid embedder type configured: ${config.embedderProvider}`) diff --git a/src/shared/embeddingModels.ts b/src/shared/embeddingModels.ts index abccd017d78..da49def0845 100644 --- a/src/shared/embeddingModels.ts +++ b/src/shared/embeddingModels.ts @@ -2,7 +2,7 @@ * Defines profiles for different embedding models, including their dimensions. */ -export type EmbedderProvider = "openai" | "ollama" // Add other providers as needed +export type EmbedderProvider = "openai" | "ollama" | "gemini" // Add other providers as needed export interface EmbeddingModelProfile { dimension: number @@ -29,6 +29,11 @@ export const EMBEDDING_MODEL_PROFILES: EmbeddingModelProfiles = { // Add default Ollama model if applicable, e.g.: // 'default': { dimension: 768 } // Assuming a default dimension }, + gemini: { + "gemini-embedding-exp-03-07": { dimension: 3072 }, + "models/text-embedding-004": { dimension: 768 }, + "models/embedding-001": { dimension: 768 }, + }, } /** @@ -79,6 +84,9 @@ export function getDefaultModelId(provider: EmbedderProvider): string { // Return a placeholder or throw an error, depending on desired behavior return "unknown-default" // Placeholder specific model ID } + if (provider === "gemini") { + return "gemini-embedding-exp-03-07" + } // Fallback for unknown providers console.warn(`Unknown provider for default model ID: ${provider}. Falling back to OpenAI default.`) diff --git a/webview-ui/src/components/settings/CodeIndexSettings.tsx b/webview-ui/src/components/settings/CodeIndexSettings.tsx index 45ed5a90878..c46201be5f8 100644 --- a/webview-ui/src/components/settings/CodeIndexSettings.tsx +++ b/webview-ui/src/components/settings/CodeIndexSettings.tsx @@ -71,7 +71,7 @@ export const CodeIndexSettings: React.FC = ({ // Safely calculate available models for current provider const currentProvider = codebaseIndexConfig?.codebaseIndexEmbedderProvider const modelsForProvider = - currentProvider === "openai" || currentProvider === "ollama" + currentProvider === "openai" || currentProvider === "ollama" || currentProvider === "gemini" ? codebaseIndexModels?.[currentProvider] : codebaseIndexModels?.openai const availableModelIds = Object.keys(modelsForProvider || {}) @@ -144,15 +144,26 @@ export const CodeIndexSettings: React.FC = ({ codebaseIndexEmbedderProvider: z.literal("ollama"), codebaseIndexEmbedderBaseUrl: z.string().url("Ollama URL must be a valid URL"), }), + gemini: baseSchema.extend({ + codebaseIndexEmbedderProvider: z.literal("gemini"), + geminiApiKey: z.string().min(1, "Gemini API key is required"), + codebaseIndexEmbedderModelId: z.string().min(1, "Gemini Model ID is required"), + geminiEmbeddingTaskType: z.string().min(1, "Gemini Task Type is required"), + }), } try { const schema = - config.codebaseIndexEmbedderProvider === "openai" ? providerSchemas.openai : providerSchemas.ollama + config.codebaseIndexEmbedderProvider === "openai" + ? providerSchemas.openai + : config.codebaseIndexEmbedderProvider === "ollama" + ? providerSchemas.ollama + : providerSchemas.gemini schema.parse({ ...config, codeIndexOpenAiKey: apiConfig.codeIndexOpenAiKey, + geminiApiKey: apiConfig.geminiApiKey, }) return true } catch { @@ -264,6 +275,7 @@ export const CodeIndexSettings: React.FC = ({ {t("settings:codeIndex.openaiProvider")} {t("settings:codeIndex.ollamaProvider")} + {t("settings:codeIndex.geminiProvider")} @@ -330,6 +342,69 @@ export const CodeIndexSettings: React.FC = ({ )} + {codebaseIndexConfig?.codebaseIndexEmbedderProvider === "gemini" && ( + <> +
+
+
{t("settings:codeIndex.geminiApiKey")}
+
+
+ setApiConfigurationField("geminiApiKey", e.target.value)} + placeholder={t("settings:codeIndex.apiKeyPlaceholder")} + style={{ width: "100%" }}> +
+
+
+
+
{t("settings:codeIndex.embeddingTaskType")}
+
+
+
+ +
+
+
+ + )} +
{t("settings:codeIndex.qdrantUrlLabel")}
From 8137b6d8f1da6373a0080cef18a78d407de116c0 Mon Sep 17 00:00:00 2001 From: Chung Nguyen <15166543+ChuKhaLi@users.noreply.github.com> Date: Mon, 26 May 2025 01:45:08 +0700 Subject: [PATCH 02/21] i18n: Update settings translations --- webview-ui/src/i18n/locales/ca/settings.json | 13 +++++++++++++ webview-ui/src/i18n/locales/de/settings.json | 13 +++++++++++++ webview-ui/src/i18n/locales/en/settings.json | 13 +++++++++++++ webview-ui/src/i18n/locales/es/settings.json | 13 +++++++++++++ webview-ui/src/i18n/locales/fr/settings.json | 13 +++++++++++++ webview-ui/src/i18n/locales/hi/settings.json | 13 +++++++++++++ webview-ui/src/i18n/locales/it/settings.json | 13 +++++++++++++ webview-ui/src/i18n/locales/ja/settings.json | 13 +++++++++++++ webview-ui/src/i18n/locales/ko/settings.json | 13 +++++++++++++ webview-ui/src/i18n/locales/nl/settings.json | 17 +++++++++++++++-- webview-ui/src/i18n/locales/pl/settings.json | 13 +++++++++++++ webview-ui/src/i18n/locales/pt-BR/settings.json | 17 +++++++++++++++-- webview-ui/src/i18n/locales/ru/settings.json | 13 +++++++++++++ webview-ui/src/i18n/locales/tr/settings.json | 17 +++++++++++++++-- webview-ui/src/i18n/locales/vi/settings.json | 13 +++++++++++++ webview-ui/src/i18n/locales/zh-CN/settings.json | 13 +++++++++++++ webview-ui/src/i18n/locales/zh-TW/settings.json | 13 +++++++++++++ 17 files changed, 227 insertions(+), 6 deletions(-) diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index c0e36ad2563..3b5214114e1 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -44,10 +44,23 @@ "selectProviderPlaceholder": "Seleccionar proveïdor", "openaiProvider": "OpenAI", "ollamaProvider": "Ollama", + "geminiProvider": "Gemini", "openaiKeyLabel": "Clau OpenAI:", "modelLabel": "Model", "selectModelPlaceholder": "Seleccionar model", "ollamaUrlLabel": "URL d'Ollama:", + "geminiApiKey": "Clau API Gemini:", + "apiKeyPlaceholder": "Introduïu la clau API...", + "embeddingTaskType": "Tipus de tasca d'incrustació", + "selectTaskTypePlaceholder": "Seleccioneu el tipus de tasca", + "selectTaskType": { + "codeRetrievalQuery": "Consulta de recuperació de codi", + "retrievalDocument": "Document de recuperació", + "retrievalQuery": "Consulta de recuperació", + "semanticSimilarity": "Similitud semàntica", + "classification": "Classificació", + "clustering": "Agrupació" + }, "qdrantUrlLabel": "URL de Qdrant", "qdrantKeyLabel": "Clau de Qdrant:", "startIndexingButton": "Iniciar indexació", diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index a3b87324adc..3f90a42e33b 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -44,10 +44,23 @@ "selectProviderPlaceholder": "Anbieter auswählen", "openaiProvider": "OpenAI", "ollamaProvider": "Ollama", + "geminiProvider": "Gemini", "openaiKeyLabel": "OpenAI-Schlüssel:", "modelLabel": "Modell", "selectModelPlaceholder": "Modell auswählen", "ollamaUrlLabel": "Ollama-URL:", + "geminiApiKey": "Gemini API-Schlüssel:", + "apiKeyPlaceholder": "API-Schlüssel eingeben...", + "embeddingTaskType": "Embedding-Aufgabentyp", + "selectTaskTypePlaceholder": "Aufgabentyp auswählen", + "selectTaskType": { + "codeRetrievalQuery": "Code-Abruf-Anfrage", + "retrievalDocument": "Abrufdokument", + "retrievalQuery": "Abrufanfrage", + "semanticSimilarity": "Semantische Ähnlichkeit", + "classification": "Klassifizierung", + "clustering": "Clustering" + }, "qdrantUrlLabel": "Qdrant-URL", "qdrantKeyLabel": "Qdrant-Schlüssel:", "startIndexingButton": "Indexierung starten", diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 18b0a467f0a..514c478aa73 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -44,10 +44,23 @@ "selectProviderPlaceholder": "Select provider", "openaiProvider": "OpenAI", "ollamaProvider": "Ollama", + "geminiProvider": "Gemini", "openaiKeyLabel": "OpenAI Key:", "modelLabel": "Model", "selectModelPlaceholder": "Select model", "ollamaUrlLabel": "Ollama URL:", + "geminiApiKey": "Gemini API Key:", + "apiKeyPlaceholder": "Enter API Key...", + "embeddingTaskType": "Embedding Task Type", + "selectTaskTypePlaceholder": "Select Task Type", + "selectTaskType": { + "codeRetrievalQuery": "Code Retrieval Query", + "retrievalDocument": "Retrieval Document", + "retrievalQuery": "Retrieval Query", + "semanticSimilarity": "Semantic Similarity", + "classification": "Classification", + "clustering": "Clustering" + }, "qdrantUrlLabel": "Qdrant URL", "qdrantKeyLabel": "Qdrant Key:", "startIndexingButton": "Start Indexing", diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index 3a1f5695c38..ef2e5f48a13 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -44,10 +44,23 @@ "selectProviderPlaceholder": "Seleccionar proveedor", "openaiProvider": "OpenAI", "ollamaProvider": "Ollama", + "geminiProvider": "Gemini", "openaiKeyLabel": "Clave de OpenAI:", "modelLabel": "Modelo", "selectModelPlaceholder": "Seleccionar modelo", "ollamaUrlLabel": "URL de Ollama:", + "geminiApiKey": "Clave API de Gemini:", + "apiKeyPlaceholder": "Introduce la clave API...", + "embeddingTaskType": "Tipo de tarea de incrustación", + "selectTaskTypePlaceholder": "Selecciona el tipo de tarea", + "selectTaskType": { + "codeRetrievalQuery": "Consulta de recuperación de código", + "retrievalDocument": "Documento de recuperación", + "retrievalQuery": "Consulta de recuperación", + "semanticSimilarity": "Similitud semántica", + "classification": "Clasificación", + "clustering": "Agrupación" + }, "qdrantUrlLabel": "URL de Qdrant", "qdrantKeyLabel": "Clave de Qdrant:", "startIndexingButton": "Iniciar indexación", diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index 77dc6275d6d..311217c9255 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -44,10 +44,23 @@ "selectProviderPlaceholder": "Sélectionner un fournisseur", "openaiProvider": "OpenAI", "ollamaProvider": "Ollama", + "geminiProvider": "Gemini", "openaiKeyLabel": "Clé OpenAI :", "modelLabel": "Modèle", "selectModelPlaceholder": "Sélectionner un modèle", "ollamaUrlLabel": "URL Ollama :", + "geminiApiKey": "Clé API Gemini :", + "apiKeyPlaceholder": "Saisir la clé API...", + "embeddingTaskType": "Type de tâche d'intégration", + "selectTaskTypePlaceholder": "Sélectionner le type de tâche", + "selectTaskType": { + "codeRetrievalQuery": "Requête de récupération de code", + "retrievalDocument": "Document de récupération", + "retrievalQuery": "Requête de récupération", + "semanticSimilarity": "Similarité sémantique", + "classification": "Classification", + "clustering": "Regroupement" + }, "qdrantUrlLabel": "URL Qdrant", "qdrantKeyLabel": "Clé Qdrant :", "startIndexingButton": "Démarrer l'indexation", diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index 5eebcaf9349..fd31512b945 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -44,10 +44,23 @@ "selectProviderPlaceholder": "प्रदाता चुनें", "openaiProvider": "OpenAI", "ollamaProvider": "Ollama", + "geminiProvider": "जेमिनी", "openaiKeyLabel": "OpenAI कुंजी:", "modelLabel": "मॉडल", "selectModelPlaceholder": "मॉडल चुनें", "ollamaUrlLabel": "Ollama URL:", + "geminiApiKey": "जेमिनी API कुंजी:", + "apiKeyPlaceholder": "API कुंजी दर्ज करें...", + "embeddingTaskType": "एम्बेडिंग कार्य प्रकार", + "selectTaskTypePlaceholder": "कार्य प्रकार चुनें", + "selectTaskType": { + "codeRetrievalQuery": "कोड पुनर्प्राप्ति क्वेरी", + "retrievalDocument": "पुनर्प्राप्ति दस्तावेज़", + "retrievalQuery": "पुनर्प्राप्ति क्वेरी", + "semanticSimilarity": "अर्थगत समानता", + "classification": "वर्गीकरण", + "clustering": "क्लस्टरिंग" + }, "qdrantUrlLabel": "Qdrant URL", "qdrantKeyLabel": "Qdrant कुंजी:", "startIndexingButton": "इंडेक्सिंग शुरू करें", diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index 98669e7c5ef..e5a13633115 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -44,10 +44,23 @@ "selectProviderPlaceholder": "Seleziona fornitore", "openaiProvider": "OpenAI", "ollamaProvider": "Ollama", + "geminiProvider": "Gemini", "openaiKeyLabel": "Chiave OpenAI:", "modelLabel": "Modello", "selectModelPlaceholder": "Seleziona modello", "ollamaUrlLabel": "URL Ollama:", + "geminiApiKey": "Chiave API Gemini:", + "apiKeyPlaceholder": "Inserisci chiave API...", + "embeddingTaskType": "Tipo di attività di embedding", + "selectTaskTypePlaceholder": "Seleziona tipo di attività", + "selectTaskType": { + "codeRetrievalQuery": "Query di recupero codice", + "retrievalDocument": "Documento di recupero", + "retrievalQuery": "Query di recupero", + "semanticSimilarity": "Similarità semantica", + "classification": "Classificazione", + "clustering": "Clustering" + }, "qdrantUrlLabel": "URL Qdrant", "qdrantKeyLabel": "Chiave Qdrant:", "startIndexingButton": "Avvia indicizzazione", diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index 2bacc6abafb..9b9a3d74f1d 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -44,10 +44,23 @@ "selectProviderPlaceholder": "プロバイダーを選択", "openaiProvider": "OpenAI", "ollamaProvider": "Ollama", + "geminiProvider": "Gemini", "openaiKeyLabel": "OpenAIキー:", "modelLabel": "モデル", "selectModelPlaceholder": "モデルを選択", "ollamaUrlLabel": "Ollama URL:", + "geminiApiKey": "Gemini APIキー:", + "apiKeyPlaceholder": "APIキーを入力...", + "embeddingTaskType": "埋め込みタスクタイプ", + "selectTaskTypePlaceholder": "タスクタイプを選択", + "selectTaskType": { + "codeRetrievalQuery": "コード検索クエリ", + "retrievalDocument": "検索ドキュメント", + "retrievalQuery": "検索クエリ", + "semanticSimilarity": "セマンティック類似性", + "classification": "分類", + "clustering": "クラスタリング" + }, "qdrantUrlLabel": "Qdrant URL", "qdrantKeyLabel": "Qdrantキー:", "startIndexingButton": "インデックス作成を開始", diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index c9955832a87..802c94da179 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -44,10 +44,23 @@ "selectProviderPlaceholder": "제공자 선택", "openaiProvider": "OpenAI", "ollamaProvider": "Ollama", + "geminiProvider": "Gemini", "openaiKeyLabel": "OpenAI 키:", "modelLabel": "모델", "selectModelPlaceholder": "모델 선택", "ollamaUrlLabel": "Ollama URL:", + "geminiApiKey": "Gemini API 키:", + "apiKeyPlaceholder": "API 키 입력...", + "embeddingTaskType": "임베딩 작업 유형", + "selectTaskTypePlaceholder": "작업 유형 선택", + "selectTaskType": { + "codeRetrievalQuery": "코드 검색 쿼리", + "retrievalDocument": "검색 문서", + "retrievalQuery": "검색 쿼리", + "semanticSimilarity": "의미론적 유사성", + "classification": "분류", + "clustering": "클러스터링" + }, "qdrantUrlLabel": "Qdrant URL", "qdrantKeyLabel": "Qdrant 키:", "startIndexingButton": "인덱싱 시작", diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index 83f057707b2..b0d1af8b3d1 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -44,11 +44,24 @@ "selectProviderPlaceholder": "Selecteer provider", "openaiProvider": "OpenAI", "ollamaProvider": "Ollama", + "geminiProvider": "Gemini", "openaiKeyLabel": "OpenAI-sleutel:", "modelLabel": "Model", "selectModelPlaceholder": "Selecteer model", - "ollamaUrlLabel": "Ollama URL:", - "qdrantUrlLabel": "Qdrant URL", + "ollamaUrlLabel": "Ollama-URL:", + "geminiApiKey": "Gemini API-sleutel:", + "apiKeyPlaceholder": "Voer API-sleutel in...", + "embeddingTaskType": "Type embeddingtaak", + "selectTaskTypePlaceholder": "Selecteer taaktype", + "selectTaskType": { + "codeRetrievalQuery": "Code ophaalquery", + "retrievalDocument": "Ophaaldocument", + "retrievalQuery": "Ophaalquery", + "semanticSimilarity": "Semantische overeenkomst", + "classification": "Classificatie", + "clustering": "Clustering" + }, + "qdrantUrlLabel": "Qdrant-URL", "qdrantKeyLabel": "Qdrant-sleutel:", "startIndexingButton": "Indexering starten", "clearIndexDataButton": "Indexgegevens wissen", diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index 5d7611b2fdf..e6d78f4052c 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -44,10 +44,23 @@ "selectProviderPlaceholder": "Wybierz dostawcę", "openaiProvider": "OpenAI", "ollamaProvider": "Ollama", + "geminiProvider": "Gemini", "openaiKeyLabel": "Klucz OpenAI:", "modelLabel": "Model", "selectModelPlaceholder": "Wybierz model", "ollamaUrlLabel": "URL Ollama:", + "geminiApiKey": "Klucz API Gemini:", + "apiKeyPlaceholder": "Wprowadź klucz API...", + "embeddingTaskType": "Typ zadania osadzania", + "selectTaskTypePlaceholder": "Wybierz typ zadania", + "selectTaskType": { + "codeRetrievalQuery": "Zapytanie o odzyskanie kodu", + "retrievalDocument": "Dokument odzyskiwania", + "retrievalQuery": "Zapytanie o odzyskanie", + "semanticSimilarity": "Podobieństwo semantyczne", + "classification": "Klasyfikacja", + "clustering": "Klastrowanie" + }, "qdrantUrlLabel": "URL Qdrant", "qdrantKeyLabel": "Klucz Qdrant:", "startIndexingButton": "Rozpocznij indeksowanie", diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index 0982fee7985..b3070875e5d 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -44,11 +44,24 @@ "selectProviderPlaceholder": "Selecionar provedor", "openaiProvider": "OpenAI", "ollamaProvider": "Ollama", + "geminiProvider": "Gemini", "openaiKeyLabel": "Chave OpenAI:", "modelLabel": "Modelo", "selectModelPlaceholder": "Selecionar modelo", - "ollamaUrlLabel": "URL Ollama:", - "qdrantUrlLabel": "URL Qdrant", + "ollamaUrlLabel": "URL do Ollama:", + "geminiApiKey": "Chave da API Gemini:", + "apiKeyPlaceholder": "Insira a chave da API...", + "embeddingTaskType": "Tipo de Tarefa de Embedding", + "selectTaskTypePlaceholder": "Selecione o Tipo de Tarefa", + "selectTaskType": { + "codeRetrievalQuery": "Consulta de Recuperação de Código", + "retrievalDocument": "Documento de Recuperação", + "retrievalQuery": "Consulta de Recuperação", + "semanticSimilarity": "Similaridade Semântica", + "classification": "Classificação", + "clustering": "Agrupamento" + }, + "qdrantUrlLabel": "URL do Qdrant", "qdrantKeyLabel": "Chave Qdrant:", "startIndexingButton": "Iniciar Indexação", "clearIndexDataButton": "Limpar Dados de Índice", diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index f427274cb0b..39994c61d2a 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -44,10 +44,23 @@ "selectProviderPlaceholder": "Выберите провайдера", "openaiProvider": "OpenAI", "ollamaProvider": "Ollama", + "geminiProvider": "Gemini", "openaiKeyLabel": "Ключ OpenAI:", "modelLabel": "Модель", "selectModelPlaceholder": "Выберите модель", "ollamaUrlLabel": "URL Ollama:", + "geminiApiKey": "Ключ API Gemini:", + "apiKeyPlaceholder": "Введите ключ API...", + "embeddingTaskType": "Тип задачи встраивания", + "selectTaskTypePlaceholder": "Выберите тип задачи", + "selectTaskType": { + "codeRetrievalQuery": "Запрос на поиск кода", + "retrievalDocument": "Документ для поиска", + "retrievalQuery": "Поисковый запрос", + "semanticSimilarity": "Семантическое сходство", + "classification": "Классификация", + "clustering": "Кластеризация" + }, "qdrantUrlLabel": "URL Qdrant", "qdrantKeyLabel": "Ключ Qdrant:", "startIndexingButton": "Начать индексацию", diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index 62dad574db6..e34f2b3f31e 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -44,11 +44,24 @@ "selectProviderPlaceholder": "Sağlayıcı seç", "openaiProvider": "OpenAI", "ollamaProvider": "Ollama", + "geminiProvider": "Gemini", "openaiKeyLabel": "OpenAI Anahtarı:", "modelLabel": "Model", "selectModelPlaceholder": "Model seç", - "ollamaUrlLabel": "Ollama URL:", - "qdrantUrlLabel": "Qdrant URL", + "ollamaUrlLabel": "Ollama URL'si:", + "geminiApiKey": "Gemini API Anahtarı:", + "apiKeyPlaceholder": "API Anahtarını Girin...", + "embeddingTaskType": "Gömme Görev Türü", + "selectTaskTypePlaceholder": "Görev Türü Seçin", + "selectTaskType": { + "codeRetrievalQuery": "Kod Alma Sorgusu", + "retrievalDocument": "Alma Belgesi", + "retrievalQuery": "Alma Sorgusu", + "semanticSimilarity": "Anlamsal Benzerlik", + "classification": "Sınıflandırma", + "clustering": "Kümeleme" + }, + "qdrantUrlLabel": "Qdrant URL'si", "qdrantKeyLabel": "Qdrant Anahtarı:", "startIndexingButton": "İndekslemeyi Başlat", "clearIndexDataButton": "İndeks Verilerini Temizle", diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index df6dc768b82..d16f974d3ef 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -44,10 +44,23 @@ "selectProviderPlaceholder": "Chọn nhà cung cấp", "openaiProvider": "OpenAI", "ollamaProvider": "Ollama", + "geminiProvider": "Gemini", "openaiKeyLabel": "Khóa OpenAI:", "modelLabel": "Mô hình", "selectModelPlaceholder": "Chọn mô hình", "ollamaUrlLabel": "URL Ollama:", + "geminiApiKey": "Khóa API Gemini:", + "apiKeyPlaceholder": "Nhập khóa API...", + "embeddingTaskType": "Loại tác vụ nhúng", + "selectTaskTypePlaceholder": "Chọn loại tác vụ", + "selectTaskType": { + "codeRetrievalQuery": "Truy vấn truy xuất mã", + "retrievalDocument": "Tài liệu truy xuất", + "retrievalQuery": "Truy vấn truy xuất", + "semanticSimilarity": "Tương đồng ngữ nghĩa", + "classification": "Phân loại", + "clustering": "Phân cụm" + }, "qdrantUrlLabel": "URL Qdrant", "qdrantKeyLabel": "Khóa Qdrant:", "startIndexingButton": "Bắt đầu lập chỉ mục", diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index 4f0a0e2e9cc..eae45a3a0b6 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -44,10 +44,23 @@ "selectProviderPlaceholder": "选择提供商", "openaiProvider": "OpenAI", "ollamaProvider": "Ollama", + "geminiProvider": "Gemini", "openaiKeyLabel": "OpenAI 密钥:", "modelLabel": "模型", "selectModelPlaceholder": "选择模型", "ollamaUrlLabel": "Ollama URL:", + "geminiApiKey": "Gemini API 密钥:", + "apiKeyPlaceholder": "输入 API 密钥...", + "embeddingTaskType": "嵌入任务类型", + "selectTaskTypePlaceholder": "选择任务类型", + "selectTaskType": { + "codeRetrievalQuery": "代码检索查询", + "retrievalDocument": "检索文档", + "retrievalQuery": "检索查询", + "semanticSimilarity": "语义相似度", + "classification": "分类", + "clustering": "聚类" + }, "qdrantUrlLabel": "Qdrant URL", "qdrantKeyLabel": "Qdrant 密钥:", "startIndexingButton": "开始索引", diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index bf4b50049af..17d84fc3f1a 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -44,10 +44,23 @@ "selectProviderPlaceholder": "選擇提供者", "openaiProvider": "OpenAI", "ollamaProvider": "Ollama", + "geminiProvider": "Gemini", "openaiKeyLabel": "OpenAI 金鑰:", "modelLabel": "模型", "selectModelPlaceholder": "選擇模型", "ollamaUrlLabel": "Ollama URL:", + "geminiApiKey": "Gemini API 金鑰:", + "apiKeyPlaceholder": "輸入 API 金鑰...", + "embeddingTaskType": "嵌入任務類型", + "selectTaskTypePlaceholder": "選取任務類型", + "selectTaskType": { + "codeRetrievalQuery": "程式碼擷取查詢", + "retrievalDocument": "擷取文件", + "retrievalQuery": "擷取查詢", + "semanticSimilarity": "語意相似度", + "classification": "分類", + "clustering": "分群" + }, "qdrantUrlLabel": "Qdrant URL", "qdrantKeyLabel": "Qdrant 金鑰:", "startIndexingButton": "開始索引", From 3738fc31476f0dc4105621aad02d4f494d9f75b6 Mon Sep 17 00:00:00 2001 From: Chung Nguyen <15166543+ChuKhaLi@users.noreply.github.com> Date: Wed, 28 May 2025 00:37:26 +0700 Subject: [PATCH 03/21] add missing type for gemini --- packages/types/src/codebase-index.ts | 4 +++- packages/types/src/provider-settings.ts | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/types/src/codebase-index.ts b/packages/types/src/codebase-index.ts index c9443e2fa7c..484f637df51 100644 --- a/packages/types/src/codebase-index.ts +++ b/packages/types/src/codebase-index.ts @@ -7,9 +7,10 @@ import { z } from "zod" export const codebaseIndexConfigSchema = z.object({ codebaseIndexEnabled: z.boolean().optional(), codebaseIndexQdrantUrl: z.string().optional(), - codebaseIndexEmbedderProvider: z.enum(["openai", "ollama"]).optional(), + codebaseIndexEmbedderProvider: z.enum(["openai", "ollama", "gemini"]).optional(), codebaseIndexEmbedderBaseUrl: z.string().optional(), codebaseIndexEmbedderModelId: z.string().optional(), + geminiEmbeddingTaskType: z.string().optional(), }) export type CodebaseIndexConfig = z.infer @@ -21,6 +22,7 @@ export type CodebaseIndexConfig = z.infer export const codebaseIndexModelsSchema = z.object({ openai: z.record(z.string(), z.object({ dimension: z.number() })).optional(), ollama: z.record(z.string(), z.object({ dimension: z.number() })).optional(), + gemini: z.record(z.string(), z.object({ dimension: z.number() })).optional(), }) export type CodebaseIndexModels = z.infer diff --git a/packages/types/src/provider-settings.ts b/packages/types/src/provider-settings.ts index 08a328379dd..879ae43bb9b 100644 --- a/packages/types/src/provider-settings.ts +++ b/packages/types/src/provider-settings.ts @@ -151,6 +151,7 @@ const lmStudioSchema = baseProviderSettingsSchema.extend({ const geminiSchema = apiModelIdProviderModelSchema.extend({ geminiApiKey: z.string().optional(), googleGeminiBaseUrl: z.string().optional(), + geminiEmbeddingTaskType: z.string().optional(), }) const openAiNativeSchema = apiModelIdProviderModelSchema.extend({ @@ -316,6 +317,7 @@ export const PROVIDER_SETTINGS_KEYS = keysOf()([ // Gemini "geminiApiKey", "googleGeminiBaseUrl", + "geminiEmbeddingTaskType", // OpenAI Native "openAiNativeApiKey", "openAiNativeBaseUrl", From d98378f13772a8663d9fec5f57c8f76b28c6b60e Mon Sep 17 00:00:00 2001 From: Chung Nguyen <15166543+ChuKhaLi@users.noreply.github.com> Date: Thu, 29 May 2025 01:21:53 +0700 Subject: [PATCH 04/21] feat: Add geminiOptions to configuration and remove redundant model ID requirement --- src/services/code-index/config-manager.ts | 1 + webview-ui/src/components/settings/CodeIndexSettings.tsx | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/code-index/config-manager.ts b/src/services/code-index/config-manager.ts index 18096ec0191..0cf8150d488 100644 --- a/src/services/code-index/config-manager.ts +++ b/src/services/code-index/config-manager.ts @@ -280,6 +280,7 @@ export class CodeIndexConfigManager { modelId: this.modelId, openAiOptions: this.openAiOptions, ollamaOptions: this.ollamaOptions, + geminiOptions: this.geminiOptions, qdrantUrl: this.qdrantUrl, qdrantApiKey: this.qdrantApiKey, searchMinScore: this.searchMinScore, diff --git a/webview-ui/src/components/settings/CodeIndexSettings.tsx b/webview-ui/src/components/settings/CodeIndexSettings.tsx index c46201be5f8..3e6d289a5e4 100644 --- a/webview-ui/src/components/settings/CodeIndexSettings.tsx +++ b/webview-ui/src/components/settings/CodeIndexSettings.tsx @@ -147,7 +147,6 @@ export const CodeIndexSettings: React.FC = ({ gemini: baseSchema.extend({ codebaseIndexEmbedderProvider: z.literal("gemini"), geminiApiKey: z.string().min(1, "Gemini API key is required"), - codebaseIndexEmbedderModelId: z.string().min(1, "Gemini Model ID is required"), geminiEmbeddingTaskType: z.string().min(1, "Gemini Task Type is required"), }), } From 43562bb51111b1c74bc727a873df8e38fc187174 Mon Sep 17 00:00:00 2001 From: Chung Nguyen <15166543+ChuKhaLi@users.noreply.github.com> Date: Thu, 29 May 2025 01:22:27 +0700 Subject: [PATCH 05/21] feat: Enhance Gemini embedder with token limit handling and model profile support --- src/services/code-index/constants/index.ts | 3 + src/services/code-index/embedders/gemini.ts | 199 ++++++++++++++++---- src/shared/embeddingModels.ts | 14 +- 3 files changed, 172 insertions(+), 44 deletions(-) diff --git a/src/services/code-index/constants/index.ts b/src/services/code-index/constants/index.ts index cbf69418178..84fa5dd317d 100644 --- a/src/services/code-index/constants/index.ts +++ b/src/services/code-index/constants/index.ts @@ -23,3 +23,6 @@ export const PARSING_CONCURRENCY = 10 export const MAX_BATCH_TOKENS = 100000 export const MAX_ITEM_TOKENS = 8191 export const BATCH_PROCESSING_CONCURRENCY = 10 + +/**Gemini Embedder */ +export const GEMINI_RATE_LIMIT_DELAY_MS = 6000 diff --git a/src/services/code-index/embedders/gemini.ts b/src/services/code-index/embedders/gemini.ts index 453c9a362c6..7bb1a80e874 100644 --- a/src/services/code-index/embedders/gemini.ts +++ b/src/services/code-index/embedders/gemini.ts @@ -1,7 +1,8 @@ import { ApiHandlerOptions } from "../../../shared/api" import { EmbedderInfo, EmbeddingResponse, IEmbedder } from "../interfaces" import { GeminiHandler } from "../../../api/providers/gemini" - +import { EMBEDDING_MODEL_PROFILES } from "../../../shared/embeddingModels" +import { GEMINI_RATE_LIMIT_DELAY_MS, MAX_BATCH_RETRIES, INITIAL_RETRY_DELAY_MS } from "../constants" /** * Implements the IEmbedder interface using Google Gemini's embedding API. */ @@ -25,67 +26,183 @@ export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder * @param model - Optional model ID to override the default. * @returns A promise that resolves to an EmbeddingResponse containing the embeddings and usage data. */ + // Removed async keyword from the method signature as it no longer uses await at the top level. + // It constructs and returns a promise. async createEmbeddings(texts: string[], model?: string): Promise { try { - // Use the enhanced GeminiHandler to generate embeddings - const result = await this.generateEmbeddings(texts, model, this.defaultTaskType) - + const modelId = model || this.defaultModelId + const result = await this.embedWithTokenLimit(texts, modelId, this.defaultTaskType) return { embeddings: result.embeddings, - usage: result.usage, } } catch (error: any) { - // Log the original error for debugging purposes - console.error("Gemini embedding failed:", error) - // Re-throw a more specific error for the caller - throw new Error(`Gemini embedding failed: ${error.message}`) + console.error("Gemini embedding task failed:", error) + throw error } } /** - * Generates embeddings for the provided texts using Gemini API + * Embeds texts while respecting the token limit of the model. + * Splits the input texts into batches that don't exceed the model's token limit. + * Also adds a delay between requests to respect Gemini's rate limits. + * * @param texts - Array of text strings to create embeddings for - * @param model - Optional model ID to use for embeddings, defaults to the configured default model - * @param taskType - The task type to optimize embeddings for (e.g., 'CODE_RETRIEVAL_QUERY') - * @returns Promise resolving to an EmbeddingResponse with the embeddings and usage data + * @param model - Model ID to use for embeddings + * @param taskType - The task type to optimize embeddings for + * @returns Promise resolving to an object with embeddings and usage data */ - private async generateEmbeddings( + private async embedWithTokenLimit( texts: string[], - model?: string, - taskType: string = "CODE_RETRIEVAL_QUERY", + model: string, + taskType: string, ): Promise<{ embeddings: number[][] - usage?: { - promptTokens: number - totalTokens: number - } + usage: { promptTokens: number; totalTokens: number } }> { - try { - const modelId = model || this.defaultModelId + // Get the model profile + const geminiProfiles = EMBEDDING_MODEL_PROFILES.gemini || {} + const modelProfile = geminiProfiles[model] + + // Default max tokens if not specified in the profile + const maxInputTokens = modelProfile?.maxInputTokens || 8192 - // Use batchEmbedContents for multiple texts - const response = await this.client.models.embedContent({ - model: modelId, - contents: texts, - config: { - taskType, - }, - }) - - if (!response.embeddings) { - throw new Error("No embeddings returned from Gemini API") + // Initialize result arrays + const allEmbeddings: number[][] = [] + const aggregatedUsage = { promptTokens: 0, totalTokens: 0 } + + // Process texts in batches + const remainingTexts = [...texts] + let isFirstBatch = true // Initialize isFirstBatch + + while (remainingTexts.length > 0) { + const currentBatch: string[] = [] + let currentBatchTokens = 0 + const processedIndices: number[] = [] + + // Simple token estimation (4 chars ≈ 1 token) + for (let i = 0; i < remainingTexts.length; i++) { + const text = remainingTexts[i] + // Estimate tokens (similar to OpenAI's implementation) + const estimatedTokens = Math.ceil(text.length / 4) + + // Skip texts that exceed the max token limit for a single item + if (estimatedTokens > maxInputTokens) { + console.warn( + `Text at index ${i} exceeds maximum token limit (${estimatedTokens} > ${maxInputTokens}). Skipping.`, + ) + processedIndices.push(i) + continue + } + + // Add text to batch if it fits within the token limit + if (currentBatchTokens + estimatedTokens <= maxInputTokens) { + currentBatch.push(text) + currentBatchTokens += estimatedTokens + processedIndices.push(i) + } else { + // This text would exceed the limit, so process the current batch first + break + } } - const embeddings = response.embeddings - .map((embedding) => embedding?.values) - .filter((values) => values !== undefined && values.length > 0) as number[][] - return { embeddings } - } catch (error) { - if (error instanceof Error) { - throw new Error(`Gemini embeddings error: ${error.message}`) + // Remove processed texts from the remaining texts + for (let i = processedIndices.length - 1; i >= 0; i--) { + remainingTexts.splice(processedIndices[i], 1) + } + + // Process the current batch if not empty + if (currentBatch.length > 0) { + // Add proactive delay for rate limiting, except for the very first batch. + if (!isFirstBatch) { + console.log(`Adding proactive delay of ${GEMINI_RATE_LIMIT_DELAY_MS}ms before Gemini batch`) + await new Promise((resolve) => setTimeout(resolve, GEMINI_RATE_LIMIT_DELAY_MS)) + } + isFirstBatch = false // Set to false after the first potential delay or first run + + try { + const batchResult = await this._embedBatchWithRetries(currentBatch, model, taskType) + allEmbeddings.push(...batchResult.embeddings) + aggregatedUsage.promptTokens += batchResult.usage.promptTokens + aggregatedUsage.totalTokens += batchResult.usage.totalTokens + } catch (error) { + console.error("Failed to process batch with retries:", error) + throw new Error(`Failed to create embeddings for batch: ${(error as Error).message}`) + } + } + } + + return { embeddings: allEmbeddings, usage: aggregatedUsage } + } + + /** + * Helper method to handle batch embedding with retries and exponential backoff for Gemini. + * @param batchTexts Array of texts to embed in this batch + * @param model Model identifier to use + * @param taskType The task type for the embedding + * @returns Promise resolving to embeddings and usage statistics + */ + private async _embedBatchWithRetries( + batchTexts: string[], + model: string, + taskType: string, + ): Promise<{ embeddings: number[][]; usage: { promptTokens: number; totalTokens: number } }> { + const modelId = model || this.defaultModelId + let lastError: any = null + + for (let attempts = 0; attempts < MAX_BATCH_RETRIES; attempts++) { + try { + const response = await this.client.models.embedContent({ + model: modelId, + contents: batchTexts, + config: { + taskType, + }, + }) + + if (!response.embeddings) { + throw new Error("No embeddings returned from Gemini API") + } + + const embeddings = response.embeddings + .map((embedding) => embedding?.values) + .filter((values) => values !== undefined && values.length > 0) as number[][] + + // Gemini API for embeddings doesn't directly return token usage per call in the same way some others do. + // The `generateEmbeddings` in the original file didn't populate usage. + // If usage needs to be calculated, it would require a separate token counting call. + // For now, returning empty usage, consistent with the original generateEmbeddings. + return { + embeddings, + usage: { promptTokens: 0, totalTokens: 0 }, // Placeholder usage + } + } catch (error: any) { + lastError = error + // Basic check for retryable errors (e.g., rate limits) + // Gemini might use 429 or specific error messages like "RESOURCE_EXHAUSTED" or "rate limit exceeded" + const isRateLimitError = + error?.status === 429 || + (error?.message && + (error.message.includes("rate limit") || error.message.includes("RESOURCE_EXHAUSTED"))) + + const hasMoreAttempts = attempts < MAX_BATCH_RETRIES - 1 + + if (isRateLimitError && hasMoreAttempts) { + const delayMs = INITIAL_RETRY_DELAY_MS * Math.pow(2, attempts) + console.warn( + `Gemini embedding attempt ${attempts + 1} failed due to rate limit. Retrying in ${delayMs}ms...`, + ) + await new Promise((resolve) => setTimeout(resolve, delayMs)) + continue + } + // Non-retryable error or last attempt failed + console.error(`Gemini embedding failed on attempt ${attempts + 1}:`, error) + throw error // Re-throw the last error if not retryable or out of attempts } - throw error } + // Should not be reached if throw error in loop works correctly, but as a fallback: + throw new Error( + `Failed to create embeddings for batch after ${MAX_BATCH_RETRIES} attempts. Last error: ${lastError?.message}`, + ) } get embedderInfo(): EmbedderInfo { diff --git a/src/shared/embeddingModels.ts b/src/shared/embeddingModels.ts index da49def0845..e3e8dda2a19 100644 --- a/src/shared/embeddingModels.ts +++ b/src/shared/embeddingModels.ts @@ -6,6 +6,14 @@ export type EmbedderProvider = "openai" | "ollama" | "gemini" // Add other provi export interface EmbeddingModelProfile { dimension: number + /** + * Specific dimensions supported by the model + */ + supportDimensions?: number[] + /** + * Optional maximum input tokens for the model. + */ + maxInputTokens?: number // Add other model-specific properties if needed, e.g., context window size } @@ -30,9 +38,9 @@ export const EMBEDDING_MODEL_PROFILES: EmbeddingModelProfiles = { // 'default': { dimension: 768 } // Assuming a default dimension }, gemini: { - "gemini-embedding-exp-03-07": { dimension: 3072 }, - "models/text-embedding-004": { dimension: 768 }, - "models/embedding-001": { dimension: 768 }, + "gemini-embedding-exp-03-07": { dimension: 3072, supportDimensions: [3072, 1536, 768], maxInputTokens: 8192 }, + "models/text-embedding-004": { dimension: 768, maxInputTokens: 2048 }, + "models/embedding-001": { dimension: 768, maxInputTokens: 2048 }, }, } From 8d48e727c2df1e034d383191842b14e4cb3ea671 Mon Sep 17 00:00:00 2001 From: Chung Nguyen <15166543+ChuKhaLi@users.noreply.github.com> Date: Thu, 29 May 2025 01:49:31 +0700 Subject: [PATCH 06/21] feat: Implement rate limit configuration for Gemini embedder and add control in settings --- src/services/code-index/embedders/gemini.ts | 12 ++++++------ .../src/components/settings/CodeIndexSettings.tsx | 7 +++++++ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/services/code-index/embedders/gemini.ts b/src/services/code-index/embedders/gemini.ts index 7bb1a80e874..cf7e8586307 100644 --- a/src/services/code-index/embedders/gemini.ts +++ b/src/services/code-index/embedders/gemini.ts @@ -112,12 +112,12 @@ export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder // Process the current batch if not empty if (currentBatch.length > 0) { - // Add proactive delay for rate limiting, except for the very first batch. - if (!isFirstBatch) { - console.log(`Adding proactive delay of ${GEMINI_RATE_LIMIT_DELAY_MS}ms before Gemini batch`) - await new Promise((resolve) => setTimeout(resolve, GEMINI_RATE_LIMIT_DELAY_MS)) - } - isFirstBatch = false // Set to false after the first potential delay or first run + const delayMs = + this.options.rateLimitSeconds !== undefined + ? this.options.rateLimitSeconds * 1000 + : GEMINI_RATE_LIMIT_DELAY_MS + console.log(`Adding proactive delay of ${delayMs}ms before Gemini batch`) + await new Promise((resolve) => setTimeout(resolve, delayMs)) try { const batchResult = await this._embedBatchWithRetries(currentBatch, model, taskType) diff --git a/webview-ui/src/components/settings/CodeIndexSettings.tsx b/webview-ui/src/components/settings/CodeIndexSettings.tsx index 3e6d289a5e4..ea210d7b55b 100644 --- a/webview-ui/src/components/settings/CodeIndexSettings.tsx +++ b/webview-ui/src/components/settings/CodeIndexSettings.tsx @@ -30,6 +30,7 @@ import { } from "@src/components/ui" import { SetCachedStateField } from "./types" +import { RateLimitSecondsControl } from "./RateLimitSecondsControl" interface CodeIndexSettingsProps { codebaseIndexModels: CodebaseIndexModels | undefined @@ -401,6 +402,12 @@ export const CodeIndexSettings: React.FC = ({
+
+ setApiConfigurationField("rateLimitSeconds", value)} + /> +
)} From 1cdfce0c2b95bcf561becea504d3bccf5a424a14 Mon Sep 17 00:00:00 2001 From: Chung Nguyen <15166543+ChuKhaLi@users.noreply.github.com> Date: Thu, 29 May 2025 02:49:19 +0700 Subject: [PATCH 07/21] feat: Add geminiEmbeddingDimension to configuration and update related components --- packages/types/src/codebase-index.ts | 1 + packages/types/src/provider-settings.ts | 1 + src/services/code-index/config-manager.ts | 57 ++++++++++++++--- src/services/code-index/embedders/gemini.ts | 63 +++++++++++++------ src/services/code-index/interfaces/config.ts | 2 + src/services/code-index/service-factory.ts | 8 ++- src/shared/embeddingModels.ts | 15 ++++- .../components/settings/CodeIndexSettings.tsx | 55 +++++++++++++++- 8 files changed, 173 insertions(+), 29 deletions(-) diff --git a/packages/types/src/codebase-index.ts b/packages/types/src/codebase-index.ts index 484f637df51..dccb944b36d 100644 --- a/packages/types/src/codebase-index.ts +++ b/packages/types/src/codebase-index.ts @@ -11,6 +11,7 @@ export const codebaseIndexConfigSchema = z.object({ codebaseIndexEmbedderBaseUrl: z.string().optional(), codebaseIndexEmbedderModelId: z.string().optional(), geminiEmbeddingTaskType: z.string().optional(), + geminiEmbeddingDimension: z.number().optional(), }) export type CodebaseIndexConfig = z.infer diff --git a/packages/types/src/provider-settings.ts b/packages/types/src/provider-settings.ts index 879ae43bb9b..9be756ac16d 100644 --- a/packages/types/src/provider-settings.ts +++ b/packages/types/src/provider-settings.ts @@ -152,6 +152,7 @@ const geminiSchema = apiModelIdProviderModelSchema.extend({ geminiApiKey: z.string().optional(), googleGeminiBaseUrl: z.string().optional(), geminiEmbeddingTaskType: z.string().optional(), + geminiEmbeddingDimension: z.number().optional(), }) const openAiNativeSchema = apiModelIdProviderModelSchema.extend({ diff --git a/src/services/code-index/config-manager.ts b/src/services/code-index/config-manager.ts index 0cf8150d488..7c3d8b93728 100644 --- a/src/services/code-index/config-manager.ts +++ b/src/services/code-index/config-manager.ts @@ -5,6 +5,18 @@ import { CodeIndexConfig, PreviousConfigSnapshot } from "./interfaces/config" import { SEARCH_MIN_SCORE } from "./constants" import { getDefaultModelId, getModelDimension } from "../../shared/embeddingModels" +// Define a type for the raw config state from globalState +interface RawCodebaseIndexConfigState { + codebaseIndexEnabled?: boolean + codebaseIndexQdrantUrl?: string + codebaseIndexSearchMinScore?: number // Assuming this is also from globalState based on default + codebaseIndexEmbedderProvider?: "openai" | "ollama" | "gemini" + codebaseIndexEmbedderBaseUrl?: string + codebaseIndexEmbedderModelId?: string + geminiEmbeddingTaskType?: string + geminiEmbeddingDimension?: number // Ensure this is part of the raw state type +} + /** * Manages configuration state and validation for the code indexing feature. * Handles loading, validating, and providing access to configuration values. @@ -31,7 +43,7 @@ export class CodeIndexConfigManager { */ private _loadAndSetConfiguration(): void { // Load configuration from storage - const codebaseIndexConfig = this.contextProxy?.getGlobalState("codebaseIndexConfig") ?? { + const rawConfig = (this.contextProxy?.getGlobalState("codebaseIndexConfig") ?? { codebaseIndexEnabled: false, codebaseIndexQdrantUrl: "http://localhost:6333", codebaseIndexSearchMinScore: 0.4, @@ -39,7 +51,8 @@ export class CodeIndexConfigManager { codebaseIndexEmbedderBaseUrl: "", codebaseIndexEmbedderModelId: "", geminiEmbeddingTaskType: "CODE_RETRIEVAL_QUERY", - } + geminiEmbeddingDimension: undefined, + }) as RawCodebaseIndexConfigState // Cast to our defined raw state type const { codebaseIndexEnabled, @@ -48,11 +61,13 @@ export class CodeIndexConfigManager { codebaseIndexEmbedderBaseUrl, codebaseIndexEmbedderModelId, geminiEmbeddingTaskType, - } = codebaseIndexConfig + geminiEmbeddingDimension, + } = rawConfig // Destructure from the typed rawConfig const openAiKey = this.contextProxy?.getSecret("codeIndexOpenAiKey") ?? "" const qdrantApiKey = this.contextProxy?.getSecret("codeIndexQdrantApiKey") ?? "" const geminiApiKey = this.contextProxy?.getSecret("geminiApiKey") ?? "" + const rateLimitSeconds = this.contextProxy?.getGlobalState("rateLimitSeconds") ?? undefined // Update instance variables with configuration this.isEnabled = codebaseIndexEnabled || false @@ -79,6 +94,8 @@ export class CodeIndexConfigManager { geminiApiKey, geminiEmbeddingTaskType: geminiEmbeddingTaskType || "CODE_RETRIEVAL_QUERY", apiModelId: this.modelId, + geminiEmbeddingDimension, + rateLimitSeconds, } } @@ -159,6 +176,7 @@ export class CodeIndexConfigManager { // Gemini requires an API key and Qdrant URL const geminiApiKey = this.geminiOptions?.geminiApiKey const geminiEmbeddingTaskType = this.geminiOptions?.geminiEmbeddingTaskType + const qdrantUrl = this.qdrantUrl const isConfigured = !!(geminiApiKey && geminiEmbeddingTaskType && qdrantUrl) return isConfigured @@ -180,6 +198,7 @@ export class CodeIndexConfigManager { const prevOpenAiKey = prev?.openAiKey ?? "" const prevOllamaBaseUrl = prev?.ollamaBaseUrl ?? "" const prevGeminiApiKey = prev?.geminiApiKey ?? "" + const prevGeminiEmbeddingDimension = prev?.geminiEmbeddingDimension // Access from prev const prevQdrantUrl = prev?.qdrantUrl ?? "" const prevQdrantApiKey = prev?.qdrantApiKey ?? "" @@ -205,7 +224,9 @@ export class CodeIndexConfigManager { return true } - if (this._hasVectorDimensionChanged(prevProvider, prevModelId)) { + // Check for dimension change, including the new geminiEmbeddingDimension + if (this._hasVectorDimensionChanged(prevProvider, prevModelId, prev.geminiEmbeddingDimension)) { + // Use prev.geminiEmbeddingDimension return true } @@ -229,6 +250,11 @@ export class CodeIndexConfigManager { if (prevGeminiApiKey !== currentGeminiApiKey) { return true } + + const currentGeminiEmbeddingDimension = this.geminiOptions?.geminiEmbeddingDimension + if (currentGeminiEmbeddingDimension !== prevGeminiEmbeddingDimension) { + return true + } } // Qdrant configuration changes @@ -246,19 +272,35 @@ export class CodeIndexConfigManager { /** * Checks if model changes result in vector dimension changes that require restart. */ - private _hasVectorDimensionChanged(prevProvider: EmbedderProvider, prevModelId?: string): boolean { + private _hasVectorDimensionChanged( + prevProvider: EmbedderProvider, + prevModelId?: string, + prevGeminiDimension?: number, + ): boolean { const currentProvider = this.embedderProvider const currentModelId = this.modelId ?? getDefaultModelId(currentProvider) const resolvedPrevModelId = prevModelId ?? getDefaultModelId(prevProvider) // If model IDs are the same and provider is the same, no dimension change if (prevProvider === currentProvider && resolvedPrevModelId === currentModelId) { + // If provider and model are same, check if gemini dimension changed + if (currentProvider === "gemini" && this.geminiOptions?.geminiEmbeddingDimension !== prevGeminiDimension) { + return true + } return false } // Get vector dimensions for both models - const prevDimension = getModelDimension(prevProvider, resolvedPrevModelId) - const currentDimension = getModelDimension(currentProvider, currentModelId) + const prevDimension = getModelDimension( + prevProvider, + resolvedPrevModelId, + prevProvider === "gemini" ? prevGeminiDimension : undefined, + ) + const currentDimension = getModelDimension( + currentProvider, + currentModelId, + currentProvider === "gemini" ? this.geminiOptions?.geminiEmbeddingDimension : undefined, + ) // If we can't determine dimensions, be safe and restart if (prevDimension === undefined || currentDimension === undefined) { @@ -284,6 +326,7 @@ export class CodeIndexConfigManager { qdrantUrl: this.qdrantUrl, qdrantApiKey: this.qdrantApiKey, searchMinScore: this.searchMinScore, + geminiEmbeddingDimension: this.geminiEmbeddingDimension, } } diff --git a/src/services/code-index/embedders/gemini.ts b/src/services/code-index/embedders/gemini.ts index cf7e8586307..cfc692214c0 100644 --- a/src/services/code-index/embedders/gemini.ts +++ b/src/services/code-index/embedders/gemini.ts @@ -9,6 +9,7 @@ import { GEMINI_RATE_LIMIT_DELAY_MS, MAX_BATCH_RETRIES, INITIAL_RETRY_DELAY_MS } export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder { private readonly defaultModelId: string private readonly defaultTaskType: string + private embeddingQueue: Promise = Promise.resolve() // Sequential queue for embedding operations /** * Creates a new Gemini embedder instance. @@ -21,24 +22,47 @@ export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder } /** - * Creates embeddings for the given texts using the Gemini API. + * Creates embeddings for the given texts using the Gemini API, ensuring sequential processing. * @param texts - An array of strings to embed. * @param model - Optional model ID to override the default. - * @returns A promise that resolves to an EmbeddingResponse containing the embeddings and usage data. + * @returns A promise that resolves to an EmbeddingResponse containing the embeddings. */ - // Removed async keyword from the method signature as it no longer uses await at the top level. - // It constructs and returns a promise. async createEmbeddings(texts: string[], model?: string): Promise { - try { - const modelId = model || this.defaultModelId - const result = await this.embedWithTokenLimit(texts, modelId, this.defaultTaskType) - return { - embeddings: result.embeddings, + // This function will be executed when it's this task's turn in the queue. + const taskExecution = async (): Promise => { + try { + const modelId = model || this.defaultModelId + // embedWithTokenLimit handles batching, internal delays, and retries for API calls. + const result = await this.embedWithTokenLimit(texts, modelId, this.defaultTaskType) + return { + embeddings: result.embeddings, + // If EmbeddingResponse is updated to include usage, and result.usage is reliable: + // usage: result.usage, + } + } catch (error: any) { + // Errors are logged within embedWithTokenLimit or _embedBatchWithRetries. + // This re-throws the error to be caught by the specific caller of createEmbeddings. + console.error("Error during Gemini embedding task execution in queue:", error.message) + throw error } - } catch (error: any) { - console.error("Gemini embedding task failed:", error) - throw error } + + // Chain this task onto the queue. + // The actual execution of taskExecution() is deferred until the previous promise in the queue resolves. + const taskPromise = this.embeddingQueue.then(taskExecution) + + // Update the queue to wait for the current task to complete (or fail). + // .catch(() => {}) ensures that an error in one task doesn't break the queue for subsequent tasks. + // Each task's success/failure is handled by its own promise (taskPromise), which is returned to the caller. + this.embeddingQueue = taskPromise + .catch(() => { + // This task failed, but the queue should proceed for the next one. + // The error from taskPromise will be handled by its specific awaiter below. + }) + .then(() => undefined) // Ensure the queue promise resolves to void for the next .then() in the chain. + + // Return the promise for this specific task. The caller will await this. + return taskPromise } /** @@ -112,12 +136,15 @@ export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder // Process the current batch if not empty if (currentBatch.length > 0) { - const delayMs = - this.options.rateLimitSeconds !== undefined - ? this.options.rateLimitSeconds * 1000 - : GEMINI_RATE_LIMIT_DELAY_MS - console.log(`Adding proactive delay of ${delayMs}ms before Gemini batch`) - await new Promise((resolve) => setTimeout(resolve, delayMs)) + if (!isFirstBatch) { + const delayMs = + this.options.rateLimitSeconds !== undefined + ? this.options.rateLimitSeconds * 1000 + : GEMINI_RATE_LIMIT_DELAY_MS + console.log(`Adding proactive delay of ${delayMs}ms before Gemini batch`) + await new Promise((resolve) => setTimeout(resolve, delayMs)) + isFirstBatch = false + } try { const batchResult = await this._embedBatchWithRetries(currentBatch, model, taskType) diff --git a/src/services/code-index/interfaces/config.ts b/src/services/code-index/interfaces/config.ts index 7a7705ec0fd..0efdd31dd20 100644 --- a/src/services/code-index/interfaces/config.ts +++ b/src/services/code-index/interfaces/config.ts @@ -15,6 +15,7 @@ export interface CodeIndexConfig { qdrantUrl?: string qdrantApiKey?: string searchMinScore?: number + geminiEmbeddingDimension?: number } /** @@ -29,6 +30,7 @@ export type PreviousConfigSnapshot = { ollamaBaseUrl?: string geminiApiKey?: string geminiEmbeddingTaskType?: string + geminiEmbeddingDimension?: number // Add here qdrantUrl?: string qdrantApiKey?: string } diff --git a/src/services/code-index/service-factory.ts b/src/services/code-index/service-factory.ts index 6bfbb1cb454..7a6f3a69b27 100644 --- a/src/services/code-index/service-factory.ts +++ b/src/services/code-index/service-factory.ts @@ -44,7 +44,7 @@ export class CodeIndexServiceFactory { ...config.ollamaOptions, ollamaModelId: config.modelId, }) - } else if (provider === "gemini") { + } else if (provider === "gemini") { if (!config.geminiOptions?.geminiApiKey) { throw new Error("Gemini configuration missing for embedder creation") } @@ -64,8 +64,12 @@ export class CodeIndexServiceFactory { const defaultModel = getDefaultModelId(provider) // Use the embedding model ID from config, not the chat model IDs const modelId = config.modelId ?? defaultModel + let requestedDimension: number | undefined + if (provider === "gemini") { + requestedDimension = config.geminiEmbeddingDimension + } - const vectorSize = getModelDimension(provider, modelId) + const vectorSize = getModelDimension(provider, modelId, requestedDimension) if (vectorSize === undefined) { throw new Error( diff --git a/src/shared/embeddingModels.ts b/src/shared/embeddingModels.ts index e3e8dda2a19..a30ec7e73f9 100644 --- a/src/shared/embeddingModels.ts +++ b/src/shared/embeddingModels.ts @@ -48,9 +48,14 @@ export const EMBEDDING_MODEL_PROFILES: EmbeddingModelProfiles = { * Retrieves the embedding dimension for a given provider and model ID. * @param provider The embedder provider (e.g., "openai"). * @param modelId The specific model ID (e.g., "text-embedding-3-small"). + * @param requestedDimension Optional dimension requested by the user. * @returns The dimension size or undefined if the model is not found. */ -export function getModelDimension(provider: EmbedderProvider, modelId: string): number | undefined { +export function getModelDimension( + provider: EmbedderProvider, + modelId: string, + requestedDimension?: number, +): number | undefined { const providerProfiles = EMBEDDING_MODEL_PROFILES[provider] if (!providerProfiles) { console.warn(`Provider not found in profiles: ${provider}`) @@ -64,6 +69,14 @@ export function getModelDimension(provider: EmbedderProvider, modelId: string): return undefined // Or potentially return a default/fallback dimension? } + if ( + requestedDimension && + modelProfile.supportDimensions && + modelProfile.supportDimensions.includes(requestedDimension) + ) { + return requestedDimension + } + return modelProfile.dimension } diff --git a/webview-ui/src/components/settings/CodeIndexSettings.tsx b/webview-ui/src/components/settings/CodeIndexSettings.tsx index ea210d7b55b..f753cf56293 100644 --- a/webview-ui/src/components/settings/CodeIndexSettings.tsx +++ b/webview-ui/src/components/settings/CodeIndexSettings.tsx @@ -6,7 +6,7 @@ import { Trans } from "react-i18next" import { CodebaseIndexConfig, CodebaseIndexModels, ProviderSettings } from "@roo-code/types" -import { EmbedderProvider } from "@roo/embeddingModels" +import { EmbedderProvider, EMBEDDING_MODEL_PROFILES } from "@roo/embeddingModels" import { vscode } from "@src/utils/vscode" import { useAppTranslation } from "@src/i18n/TranslationContext" @@ -77,6 +77,14 @@ export const CodeIndexSettings: React.FC = ({ : codebaseIndexModels?.openai const availableModelIds = Object.keys(modelsForProvider || {}) + // Logic for Gemini dimension selector + const selectedModelIdForGeminiDim = codebaseIndexConfig?.codebaseIndexEmbedderModelId + const geminiModelProfileForDim = + currentProvider === "gemini" && selectedModelIdForGeminiDim + ? EMBEDDING_MODEL_PROFILES.gemini?.[selectedModelIdForGeminiDim] + : undefined + const geminiSupportedDims = geminiModelProfileForDim?.supportDimensions + useEffect(() => { // Request initial indexing status from extension host vscode.postMessage({ type: "requestIndexingStatus" }) @@ -149,6 +157,11 @@ export const CodeIndexSettings: React.FC = ({ codebaseIndexEmbedderProvider: z.literal("gemini"), geminiApiKey: z.string().min(1, "Gemini API key is required"), geminiEmbeddingTaskType: z.string().min(1, "Gemini Task Type is required"), + geminiEmbeddingDimension: z + .number() + .int() + .positive("Embedding dimension must be a positive integer") + .optional(), }), } @@ -402,6 +415,46 @@ export const CodeIndexSettings: React.FC = ({ + {currentProvider === "gemini" && + geminiModelProfileForDim && + geminiSupportedDims && + geminiSupportedDims.length > 0 && ( +
+
+
{t("settings:codeIndex.embeddingDimension")}
+
+
+
+ +
+
+
+ )}
Date: Thu, 29 May 2025 02:50:08 +0700 Subject: [PATCH 08/21] feat: Add embedding dimension and select dimension placeholder to localization files --- webview-ui/src/i18n/locales/ca/settings.json | 2 ++ webview-ui/src/i18n/locales/de/settings.json | 2 ++ webview-ui/src/i18n/locales/en/settings.json | 2 ++ webview-ui/src/i18n/locales/es/settings.json | 2 ++ webview-ui/src/i18n/locales/fr/settings.json | 2 ++ webview-ui/src/i18n/locales/hi/settings.json | 2 ++ webview-ui/src/i18n/locales/it/settings.json | 2 ++ webview-ui/src/i18n/locales/ja/settings.json | 2 ++ webview-ui/src/i18n/locales/ko/settings.json | 2 ++ webview-ui/src/i18n/locales/nl/settings.json | 2 ++ webview-ui/src/i18n/locales/pl/settings.json | 2 ++ webview-ui/src/i18n/locales/pt-BR/settings.json | 2 ++ webview-ui/src/i18n/locales/ru/settings.json | 2 ++ webview-ui/src/i18n/locales/tr/settings.json | 2 ++ webview-ui/src/i18n/locales/vi/settings.json | 2 ++ webview-ui/src/i18n/locales/zh-CN/settings.json | 2 ++ webview-ui/src/i18n/locales/zh-TW/settings.json | 2 ++ 17 files changed, 34 insertions(+) diff --git a/webview-ui/src/i18n/locales/ca/settings.json b/webview-ui/src/i18n/locales/ca/settings.json index 3b5214114e1..991747523f3 100644 --- a/webview-ui/src/i18n/locales/ca/settings.json +++ b/webview-ui/src/i18n/locales/ca/settings.json @@ -61,6 +61,8 @@ "classification": "Classificació", "clustering": "Agrupació" }, + "embeddingDimension": "Dimensió d'embedding", + "selectDimensionPlaceholder": "Seleccionar dimensió", "qdrantUrlLabel": "URL de Qdrant", "qdrantKeyLabel": "Clau de Qdrant:", "startIndexingButton": "Iniciar indexació", diff --git a/webview-ui/src/i18n/locales/de/settings.json b/webview-ui/src/i18n/locales/de/settings.json index 3f90a42e33b..58134b25970 100644 --- a/webview-ui/src/i18n/locales/de/settings.json +++ b/webview-ui/src/i18n/locales/de/settings.json @@ -61,6 +61,8 @@ "classification": "Klassifizierung", "clustering": "Clustering" }, + "embeddingDimension": "Embedding-Dimension", + "selectDimensionPlaceholder": "Dimension auswählen", "qdrantUrlLabel": "Qdrant-URL", "qdrantKeyLabel": "Qdrant-Schlüssel:", "startIndexingButton": "Indexierung starten", diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 514c478aa73..2e2150ad594 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -61,6 +61,8 @@ "classification": "Classification", "clustering": "Clustering" }, + "embeddingDimension": "Embedding Dimension", + "selectDimensionPlaceholder": "Select Dimension", "qdrantUrlLabel": "Qdrant URL", "qdrantKeyLabel": "Qdrant Key:", "startIndexingButton": "Start Indexing", diff --git a/webview-ui/src/i18n/locales/es/settings.json b/webview-ui/src/i18n/locales/es/settings.json index ef2e5f48a13..e01e5341082 100644 --- a/webview-ui/src/i18n/locales/es/settings.json +++ b/webview-ui/src/i18n/locales/es/settings.json @@ -61,6 +61,8 @@ "classification": "Clasificación", "clustering": "Agrupación" }, + "embeddingDimension": "Dimensión del embedding", + "selectDimensionPlaceholder": "Seleccionar dimensión", "qdrantUrlLabel": "URL de Qdrant", "qdrantKeyLabel": "Clave de Qdrant:", "startIndexingButton": "Iniciar indexación", diff --git a/webview-ui/src/i18n/locales/fr/settings.json b/webview-ui/src/i18n/locales/fr/settings.json index 311217c9255..ca722648fc6 100644 --- a/webview-ui/src/i18n/locales/fr/settings.json +++ b/webview-ui/src/i18n/locales/fr/settings.json @@ -61,6 +61,8 @@ "classification": "Classification", "clustering": "Regroupement" }, + "embeddingDimension": "Dimension d'embedding", + "selectDimensionPlaceholder": "Sélectionner la dimension", "qdrantUrlLabel": "URL Qdrant", "qdrantKeyLabel": "Clé Qdrant :", "startIndexingButton": "Démarrer l'indexation", diff --git a/webview-ui/src/i18n/locales/hi/settings.json b/webview-ui/src/i18n/locales/hi/settings.json index fd31512b945..6500de36c0c 100644 --- a/webview-ui/src/i18n/locales/hi/settings.json +++ b/webview-ui/src/i18n/locales/hi/settings.json @@ -61,6 +61,8 @@ "classification": "वर्गीकरण", "clustering": "क्लस्टरिंग" }, + "embeddingDimension": "एम्बेडिंग आयाम", + "selectDimensionPlaceholder": "आयाम चुनें", "qdrantUrlLabel": "Qdrant URL", "qdrantKeyLabel": "Qdrant कुंजी:", "startIndexingButton": "इंडेक्सिंग शुरू करें", diff --git a/webview-ui/src/i18n/locales/it/settings.json b/webview-ui/src/i18n/locales/it/settings.json index e5a13633115..95afa1a3370 100644 --- a/webview-ui/src/i18n/locales/it/settings.json +++ b/webview-ui/src/i18n/locales/it/settings.json @@ -61,6 +61,8 @@ "classification": "Classificazione", "clustering": "Clustering" }, + "embeddingDimension": "Dimensione embedding", + "selectDimensionPlaceholder": "Seleziona dimensione", "qdrantUrlLabel": "URL Qdrant", "qdrantKeyLabel": "Chiave Qdrant:", "startIndexingButton": "Avvia indicizzazione", diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index 9b9a3d74f1d..20f2f076070 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -61,6 +61,8 @@ "classification": "分類", "clustering": "クラスタリング" }, + "embeddingDimension": "埋め込み次元", + "selectDimensionPlaceholder": "次元を選択", "qdrantUrlLabel": "Qdrant URL", "qdrantKeyLabel": "Qdrantキー:", "startIndexingButton": "インデックス作成を開始", diff --git a/webview-ui/src/i18n/locales/ko/settings.json b/webview-ui/src/i18n/locales/ko/settings.json index 802c94da179..ed578357a00 100644 --- a/webview-ui/src/i18n/locales/ko/settings.json +++ b/webview-ui/src/i18n/locales/ko/settings.json @@ -61,6 +61,8 @@ "classification": "분류", "clustering": "클러스터링" }, + "embeddingDimension": "임베딩 차원", + "selectDimensionPlaceholder": "차원 선택", "qdrantUrlLabel": "Qdrant URL", "qdrantKeyLabel": "Qdrant 키:", "startIndexingButton": "인덱싱 시작", diff --git a/webview-ui/src/i18n/locales/nl/settings.json b/webview-ui/src/i18n/locales/nl/settings.json index b0d1af8b3d1..0f3a5c3f41a 100644 --- a/webview-ui/src/i18n/locales/nl/settings.json +++ b/webview-ui/src/i18n/locales/nl/settings.json @@ -61,6 +61,8 @@ "classification": "Classificatie", "clustering": "Clustering" }, + "embeddingDimension": "Embedding dimensie", + "selectDimensionPlaceholder": "Selecteer dimensie", "qdrantUrlLabel": "Qdrant-URL", "qdrantKeyLabel": "Qdrant-sleutel:", "startIndexingButton": "Indexering starten", diff --git a/webview-ui/src/i18n/locales/pl/settings.json b/webview-ui/src/i18n/locales/pl/settings.json index e6d78f4052c..ebbf79ff81c 100644 --- a/webview-ui/src/i18n/locales/pl/settings.json +++ b/webview-ui/src/i18n/locales/pl/settings.json @@ -61,6 +61,8 @@ "classification": "Klasyfikacja", "clustering": "Klastrowanie" }, + "embeddingDimension": "Wymiar osadzania", + "selectDimensionPlaceholder": "Wybierz wymiar", "qdrantUrlLabel": "URL Qdrant", "qdrantKeyLabel": "Klucz Qdrant:", "startIndexingButton": "Rozpocznij indeksowanie", diff --git a/webview-ui/src/i18n/locales/pt-BR/settings.json b/webview-ui/src/i18n/locales/pt-BR/settings.json index b3070875e5d..4febd27c411 100644 --- a/webview-ui/src/i18n/locales/pt-BR/settings.json +++ b/webview-ui/src/i18n/locales/pt-BR/settings.json @@ -61,6 +61,8 @@ "classification": "Classificação", "clustering": "Agrupamento" }, + "embeddingDimension": "Dimensão do embedding", + "selectDimensionPlaceholder": "Selecionar dimensão", "qdrantUrlLabel": "URL do Qdrant", "qdrantKeyLabel": "Chave Qdrant:", "startIndexingButton": "Iniciar Indexação", diff --git a/webview-ui/src/i18n/locales/ru/settings.json b/webview-ui/src/i18n/locales/ru/settings.json index 39994c61d2a..68199d6b17f 100644 --- a/webview-ui/src/i18n/locales/ru/settings.json +++ b/webview-ui/src/i18n/locales/ru/settings.json @@ -61,6 +61,8 @@ "classification": "Классификация", "clustering": "Кластеризация" }, + "embeddingDimension": "Размерность эмбеддинга", + "selectDimensionPlaceholder": "Выберите размерность", "qdrantUrlLabel": "URL Qdrant", "qdrantKeyLabel": "Ключ Qdrant:", "startIndexingButton": "Начать индексацию", diff --git a/webview-ui/src/i18n/locales/tr/settings.json b/webview-ui/src/i18n/locales/tr/settings.json index e34f2b3f31e..63f86d9d1b0 100644 --- a/webview-ui/src/i18n/locales/tr/settings.json +++ b/webview-ui/src/i18n/locales/tr/settings.json @@ -61,6 +61,8 @@ "classification": "Sınıflandırma", "clustering": "Kümeleme" }, + "embeddingDimension": "Gömme Boyutu", + "selectDimensionPlaceholder": "Boyut Seçin", "qdrantUrlLabel": "Qdrant URL'si", "qdrantKeyLabel": "Qdrant Anahtarı:", "startIndexingButton": "İndekslemeyi Başlat", diff --git a/webview-ui/src/i18n/locales/vi/settings.json b/webview-ui/src/i18n/locales/vi/settings.json index d16f974d3ef..4bc9cf40179 100644 --- a/webview-ui/src/i18n/locales/vi/settings.json +++ b/webview-ui/src/i18n/locales/vi/settings.json @@ -61,6 +61,8 @@ "classification": "Phân loại", "clustering": "Phân cụm" }, + "embeddingDimension": "Kích thước nhúng", + "selectDimensionPlaceholder": "Chọn kích thước", "qdrantUrlLabel": "URL Qdrant", "qdrantKeyLabel": "Khóa Qdrant:", "startIndexingButton": "Bắt đầu lập chỉ mục", diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index eae45a3a0b6..2d711169ac1 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -61,6 +61,8 @@ "classification": "分类", "clustering": "聚类" }, + "embeddingDimension": "嵌入维度", + "selectDimensionPlaceholder": "选择维度", "qdrantUrlLabel": "Qdrant URL", "qdrantKeyLabel": "Qdrant 密钥:", "startIndexingButton": "开始索引", diff --git a/webview-ui/src/i18n/locales/zh-TW/settings.json b/webview-ui/src/i18n/locales/zh-TW/settings.json index 17d84fc3f1a..09fee3969be 100644 --- a/webview-ui/src/i18n/locales/zh-TW/settings.json +++ b/webview-ui/src/i18n/locales/zh-TW/settings.json @@ -61,6 +61,8 @@ "classification": "分類", "clustering": "分群" }, + "embeddingDimension": "嵌入維度", + "selectDimensionPlaceholder": "選取維度", "qdrantUrlLabel": "Qdrant URL", "qdrantKeyLabel": "Qdrant 金鑰:", "startIndexingButton": "開始索引", From b0a22b36aaa6bfbd82057886e66da69f398b5e9d Mon Sep 17 00:00:00 2001 From: Chung Nguyen <15166543+ChuKhaLi@users.noreply.github.com> Date: Thu, 29 May 2025 02:56:59 +0700 Subject: [PATCH 09/21] fix add missing type defined --- packages/types/src/provider-settings.ts | 1 + src/services/code-index/config-manager.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/types/src/provider-settings.ts b/packages/types/src/provider-settings.ts index 9be756ac16d..b3174957039 100644 --- a/packages/types/src/provider-settings.ts +++ b/packages/types/src/provider-settings.ts @@ -319,6 +319,7 @@ export const PROVIDER_SETTINGS_KEYS = keysOf()([ "geminiApiKey", "googleGeminiBaseUrl", "geminiEmbeddingTaskType", + "geminiEmbeddingDimension", // OpenAI Native "openAiNativeApiKey", "openAiNativeBaseUrl", diff --git a/src/services/code-index/config-manager.ts b/src/services/code-index/config-manager.ts index 7c3d8b93728..11ef10c314a 100644 --- a/src/services/code-index/config-manager.ts +++ b/src/services/code-index/config-manager.ts @@ -326,7 +326,7 @@ export class CodeIndexConfigManager { qdrantUrl: this.qdrantUrl, qdrantApiKey: this.qdrantApiKey, searchMinScore: this.searchMinScore, - geminiEmbeddingDimension: this.geminiEmbeddingDimension, + geminiEmbeddingDimension: this.geminiOptions?.geminiEmbeddingDimension, } } From 7604759214d4288ef92ebdba1ac7f88ab4c4a21d Mon Sep 17 00:00:00 2001 From: ChuKhaLi <15166543+ChuKhaLi@users.noreply.github.com> Date: Thu, 29 May 2025 03:01:31 +0700 Subject: [PATCH 10/21] Update webview-ui/src/i18n/locales/zh-CN/settings.json Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --- webview-ui/src/i18n/locales/zh-CN/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webview-ui/src/i18n/locales/zh-CN/settings.json b/webview-ui/src/i18n/locales/zh-CN/settings.json index 2d711169ac1..87d93095e2e 100644 --- a/webview-ui/src/i18n/locales/zh-CN/settings.json +++ b/webview-ui/src/i18n/locales/zh-CN/settings.json @@ -49,7 +49,7 @@ "modelLabel": "模型", "selectModelPlaceholder": "选择模型", "ollamaUrlLabel": "Ollama URL:", - "geminiApiKey": "Gemini API 密钥:", + "geminiApiKey": "Gemini API 密钥:", "apiKeyPlaceholder": "输入 API 密钥...", "embeddingTaskType": "嵌入任务类型", "selectTaskTypePlaceholder": "选择任务类型", From 9377f4e71237815bf075acfe30d04a0c12005094 Mon Sep 17 00:00:00 2001 From: ChuKhaLi <15166543+ChuKhaLi@users.noreply.github.com> Date: Thu, 29 May 2025 03:01:38 +0700 Subject: [PATCH 11/21] Update webview-ui/src/i18n/locales/ja/settings.json Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> --- webview-ui/src/i18n/locales/ja/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webview-ui/src/i18n/locales/ja/settings.json b/webview-ui/src/i18n/locales/ja/settings.json index 20f2f076070..b2ae5bd8876 100644 --- a/webview-ui/src/i18n/locales/ja/settings.json +++ b/webview-ui/src/i18n/locales/ja/settings.json @@ -49,7 +49,7 @@ "modelLabel": "モデル", "selectModelPlaceholder": "モデルを選択", "ollamaUrlLabel": "Ollama URL:", - "geminiApiKey": "Gemini APIキー:", + "geminiApiKey": "Gemini APIキー:", "apiKeyPlaceholder": "APIキーを入力...", "embeddingTaskType": "埋め込みタスクタイプ", "selectTaskTypePlaceholder": "タスクタイプを選択", From b855acf3dc24ccff68c0ee6b219bc215bc617e35 Mon Sep 17 00:00:00 2001 From: Chung Nguyen <15166543+ChuKhaLi@users.noreply.github.com> Date: Thu, 29 May 2025 03:39:51 +0700 Subject: [PATCH 12/21] feat: Add geminiOptions to configuration tests and update model dimension assertions --- .../__tests__/config-manager.test.ts | 33 +++++++++++++++++++ .../__tests__/service-factory.test.ts | 6 ++-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/services/code-index/__tests__/config-manager.test.ts b/src/services/code-index/__tests__/config-manager.test.ts index b0aa024248d..10f4178ac8d 100644 --- a/src/services/code-index/__tests__/config-manager.test.ts +++ b/src/services/code-index/__tests__/config-manager.test.ts @@ -37,6 +37,13 @@ describe("CodeIndexConfigManager", () => { modelId: undefined, openAiOptions: { openAiNativeApiKey: "" }, ollamaOptions: { ollamaBaseUrl: "" }, + geminiOptions: { + apiModelId: undefined, + geminiApiKey: "", + geminiEmbeddingDimension: undefined, + geminiEmbeddingTaskType: "CODE_RETRIEVAL_QUERY", + rateLimitSeconds: undefined, + }, qdrantUrl: "http://localhost:6333", qdrantApiKey: "", searchMinScore: 0.4, @@ -68,6 +75,19 @@ describe("CodeIndexConfigManager", () => { modelId: "text-embedding-3-large", openAiOptions: { openAiNativeApiKey: "test-openai-key" }, ollamaOptions: { ollamaBaseUrl: "" }, + geminiOptions: { + apiModelId: "text-embedding-3-large", + geminiApiKey: "", + geminiEmbeddingDimension: undefined, + geminiEmbeddingTaskType: "CODE_RETRIEVAL_QUERY", + rateLimitSeconds: { + codebaseIndexEnabled: true, + codebaseIndexQdrantUrl: "http://qdrant.local", + codebaseIndexEmbedderProvider: "openai", + codebaseIndexEmbedderBaseUrl: "", + codebaseIndexEmbedderModelId: "text-embedding-3-large", + }, + }, qdrantUrl: "http://qdrant.local", qdrantApiKey: "test-qdrant-key", searchMinScore: 0.4, @@ -485,6 +505,19 @@ describe("CodeIndexConfigManager", () => { modelId: "text-embedding-3-large", openAiOptions: { openAiNativeApiKey: "test-openai-key" }, ollamaOptions: { ollamaBaseUrl: undefined }, + geminiEmbeddingDimension: undefined, + geminiOptions: { + apiModelId: "text-embedding-3-large", + geminiApiKey: "", + geminiEmbeddingDimension: undefined, + geminiEmbeddingTaskType: "CODE_RETRIEVAL_QUERY", + rateLimitSeconds: { + codebaseIndexEnabled: true, + codebaseIndexQdrantUrl: "http://qdrant.local", + codebaseIndexEmbedderProvider: "openai", + codebaseIndexEmbedderModelId: "text-embedding-3-large", + }, + }, qdrantUrl: "http://qdrant.local", qdrantApiKey: "test-qdrant-key", searchMinScore: 0.4, diff --git a/src/services/code-index/__tests__/service-factory.test.ts b/src/services/code-index/__tests__/service-factory.test.ts index 90ce46b97f3..98fb29cb271 100644 --- a/src/services/code-index/__tests__/service-factory.test.ts +++ b/src/services/code-index/__tests__/service-factory.test.ts @@ -194,7 +194,7 @@ describe("CodeIndexServiceFactory", () => { factory.createVectorStore() // Assert - expect(mockGetModelDimension).toHaveBeenCalledWith("openai", testModelId) + expect(mockGetModelDimension).toHaveBeenCalledWith("openai", testModelId, undefined) expect(MockedQdrantVectorStore).toHaveBeenCalledWith( "/test/workspace", "http://localhost:6333", @@ -219,7 +219,7 @@ describe("CodeIndexServiceFactory", () => { factory.createVectorStore() // Assert - expect(mockGetModelDimension).toHaveBeenCalledWith("ollama", testModelId) + expect(mockGetModelDimension).toHaveBeenCalledWith("ollama", testModelId, undefined) expect(MockedQdrantVectorStore).toHaveBeenCalledWith( "/test/workspace", "http://localhost:6333", @@ -243,7 +243,7 @@ describe("CodeIndexServiceFactory", () => { factory.createVectorStore() // Assert - expect(mockGetModelDimension).toHaveBeenCalledWith("openai", "default-model") + expect(mockGetModelDimension).toHaveBeenCalledWith("openai", "default-model", undefined) expect(MockedQdrantVectorStore).toHaveBeenCalledWith( "/test/workspace", "http://localhost:6333", From 1b38421260dbb454537409ba1c1abb39e0c22d9b Mon Sep 17 00:00:00 2001 From: Chung Nguyen <15166543+ChuKhaLi@users.noreply.github.com> Date: Wed, 11 Jun 2025 00:13:32 +0700 Subject: [PATCH 13/21] Removes embedding queue Removes the embedding queue implementation from the Gemini embedder. This simplifies the embedding process by directly executing embedding tasks without queuing, potentially improving responsiveness. --- src/services/code-index/embedders/gemini.ts | 41 ++++----------------- 1 file changed, 8 insertions(+), 33 deletions(-) diff --git a/src/services/code-index/embedders/gemini.ts b/src/services/code-index/embedders/gemini.ts index cfc692214c0..3aa12d63bb9 100644 --- a/src/services/code-index/embedders/gemini.ts +++ b/src/services/code-index/embedders/gemini.ts @@ -28,41 +28,16 @@ export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder * @returns A promise that resolves to an EmbeddingResponse containing the embeddings. */ async createEmbeddings(texts: string[], model?: string): Promise { - // This function will be executed when it's this task's turn in the queue. - const taskExecution = async (): Promise => { - try { - const modelId = model || this.defaultModelId - // embedWithTokenLimit handles batching, internal delays, and retries for API calls. - const result = await this.embedWithTokenLimit(texts, modelId, this.defaultTaskType) - return { - embeddings: result.embeddings, - // If EmbeddingResponse is updated to include usage, and result.usage is reliable: - // usage: result.usage, - } - } catch (error: any) { - // Errors are logged within embedWithTokenLimit or _embedBatchWithRetries. - // This re-throws the error to be caught by the specific caller of createEmbeddings. - console.error("Error during Gemini embedding task execution in queue:", error.message) - throw error + try { + const modelId = model || this.defaultModelId + const result = await this.embedWithTokenLimit(texts, modelId, this.defaultTaskType) + return { + embeddings: result.embeddings, } + } catch (error: any) { + console.error("Error during Gemini embedding task execution in queue:", error.message) + throw error } - - // Chain this task onto the queue. - // The actual execution of taskExecution() is deferred until the previous promise in the queue resolves. - const taskPromise = this.embeddingQueue.then(taskExecution) - - // Update the queue to wait for the current task to complete (or fail). - // .catch(() => {}) ensures that an error in one task doesn't break the queue for subsequent tasks. - // Each task's success/failure is handled by its own promise (taskPromise), which is returned to the caller. - this.embeddingQueue = taskPromise - .catch(() => { - // This task failed, but the queue should proceed for the next one. - // The error from taskPromise will be handled by its specific awaiter below. - }) - .then(() => undefined) // Ensure the queue promise resolves to void for the next .then() in the chain. - - // Return the promise for this specific task. The caller will await this. - return taskPromise } /** From 3f67cc587bfbdb92d0d12fa1eab8e84bed782b47 Mon Sep 17 00:00:00 2001 From: Chung Nguyen <15166543+ChuKhaLi@users.noreply.github.com> Date: Wed, 11 Jun 2025 00:23:54 +0700 Subject: [PATCH 14/21] Removes unused embedding queue Removes the unused embedding queue property from the Gemini embedder class. This simplifies the class and removes potential confusion. The queue was initialized but never used, indicating it was likely a remnant of previous development. --- src/services/code-index/embedders/gemini.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/services/code-index/embedders/gemini.ts b/src/services/code-index/embedders/gemini.ts index 3aa12d63bb9..ecdb25ed32b 100644 --- a/src/services/code-index/embedders/gemini.ts +++ b/src/services/code-index/embedders/gemini.ts @@ -9,7 +9,6 @@ import { GEMINI_RATE_LIMIT_DELAY_MS, MAX_BATCH_RETRIES, INITIAL_RETRY_DELAY_MS } export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder { private readonly defaultModelId: string private readonly defaultTaskType: string - private embeddingQueue: Promise = Promise.resolve() // Sequential queue for embedding operations /** * Creates a new Gemini embedder instance. From 87a9bfc8300fa3d712263c13aaa5127ef2d9c4ce Mon Sep 17 00:00:00 2001 From: Chung Nguyen <15166543+ChuKhaLi@users.noreply.github.com> Date: Wed, 11 Jun 2025 00:53:05 +0700 Subject: [PATCH 15/21] Adds tests for CodeIndexConfigManager This commit introduces unit tests for the CodeIndexConfigManager, covering various configuration loading scenarios. It includes tests for: - Loading default configurations - Loading configurations from global state and secrets - Handling OpenAI Compatible configurations - Detecting restart requirements based on configuration changes (provider, vector dimensions, API keys, Qdrant URL, Ollama Base URL, modelDimension) - Preventing false restarts when configuration hasn't changed. - Validating configuration via isConfigured method The tests use a mock ContextProxy to simulate VS Code's global state and secret storage. --- ...manager.test.ts => config-manager.spec.ts} | 93 ++++++++++++------- 1 file changed, 62 insertions(+), 31 deletions(-) rename src/services/code-index/__tests__/{config-manager.test.ts => config-manager.spec.ts} (95%) diff --git a/src/services/code-index/__tests__/config-manager.test.ts b/src/services/code-index/__tests__/config-manager.spec.ts similarity index 95% rename from src/services/code-index/__tests__/config-manager.test.ts rename to src/services/code-index/__tests__/config-manager.spec.ts index 34dbab077b1..f31f3b96359 100644 --- a/src/services/code-index/__tests__/config-manager.test.ts +++ b/src/services/code-index/__tests__/config-manager.spec.ts @@ -1,16 +1,16 @@ -import { ContextProxy } from "../../../core/config/ContextProxy" +import { describe, it, expect, beforeEach, vi } from "vitest" import { CodeIndexConfigManager } from "../config-manager" describe("CodeIndexConfigManager", () => { - let mockContextProxy: jest.Mocked + let mockContextProxy: any let configManager: CodeIndexConfigManager beforeEach(() => { // Setup mock ContextProxy mockContextProxy = { - getGlobalState: jest.fn(), - getSecret: jest.fn().mockReturnValue(undefined), - } as unknown as jest.Mocked + getGlobalState: vi.fn(), + getSecret: vi.fn().mockReturnValue(undefined), + } as unknown as any configManager = new CodeIndexConfigManager(mockContextProxy) }) @@ -122,9 +122,17 @@ describe("CodeIndexConfigManager", () => { modelId: "text-embedding-3-large", openAiOptions: { openAiNativeApiKey: "" }, ollamaOptions: { ollamaBaseUrl: "" }, + geminiOptions: { + apiModelId: "text-embedding-3-large", + geminiApiKey: "", + geminiEmbeddingDimension: undefined, + geminiEmbeddingTaskType: "CODE_RETRIEVAL_QUERY", + rateLimitSeconds: undefined, + }, openAiCompatibleOptions: { baseUrl: "https://api.example.com/v1", apiKey: "test-openai-compatible-key", + modelDimension: undefined, }, qdrantUrl: "http://qdrant.local", qdrantApiKey: "test-qdrant-key", @@ -161,6 +169,13 @@ describe("CodeIndexConfigManager", () => { modelId: "custom-model", openAiOptions: { openAiNativeApiKey: "" }, ollamaOptions: { ollamaBaseUrl: "" }, + geminiOptions: { + apiModelId: "custom-model", + geminiApiKey: "", + geminiEmbeddingDimension: undefined, + geminiEmbeddingTaskType: "CODE_RETRIEVAL_QUERY", + rateLimitSeconds: undefined, + }, openAiCompatibleOptions: { baseUrl: "https://api.example.com/v1", apiKey: "test-openai-compatible-key", @@ -201,9 +216,17 @@ describe("CodeIndexConfigManager", () => { modelId: "custom-model", openAiOptions: { openAiNativeApiKey: "" }, ollamaOptions: { ollamaBaseUrl: "" }, + geminiOptions: { + apiModelId: "custom-model", + geminiApiKey: "", + geminiEmbeddingDimension: undefined, + geminiEmbeddingTaskType: "CODE_RETRIEVAL_QUERY", + rateLimitSeconds: undefined, + }, openAiCompatibleOptions: { baseUrl: "https://api.example.com/v1", apiKey: "test-openai-compatible-key", + modelDimension: undefined, }, qdrantUrl: "http://qdrant.local", qdrantApiKey: "test-qdrant-key", @@ -240,6 +263,13 @@ describe("CodeIndexConfigManager", () => { modelId: "custom-model", openAiOptions: { openAiNativeApiKey: "" }, ollamaOptions: { ollamaBaseUrl: "" }, + geminiOptions: { + apiModelId: "custom-model", + geminiApiKey: "", + geminiEmbeddingDimension: undefined, + geminiEmbeddingTaskType: "CODE_RETRIEVAL_QUERY", + rateLimitSeconds: undefined, + }, openAiCompatibleOptions: { baseUrl: "https://api.example.com/v1", apiKey: "test-openai-compatible-key", @@ -1001,69 +1031,70 @@ describe("CodeIndexConfigManager", () => { describe("initialization and restart prevention", () => { it("should not require restart when configuration hasn't changed between calls", async () => { - // Setup initial configuration - start with enabled and configured to avoid initial transition restart - mockContextProxy.getGlobalState.mockReturnValue({ + const config = { codebaseIndexEnabled: true, codebaseIndexQdrantUrl: "http://qdrant.local", codebaseIndexEmbedderProvider: "openai", codebaseIndexEmbedderModelId: "text-embedding-3-small", - }) + } + mockContextProxy.getGlobalState.mockReturnValue(config) mockContextProxy.getSecret.mockImplementation((key: string) => { if (key === "codeIndexOpenAiKey") return "test-key" return undefined }) - // First load - this will initialize the config manager with current state - await configManager.loadConfiguration() + // First load + const result1 = await configManager.loadConfiguration() + expect(result1.requiresRestart).toBe(true) // Restarts on first valid config - // Second load with same configuration - should not require restart - const secondResult = await configManager.loadConfiguration() - expect(secondResult.requiresRestart).toBe(false) + // Second load with same config + const result2 = await configManager.loadConfiguration() + expect(result2.requiresRestart).toBe(false) }) it("should properly initialize with current config to prevent false restarts", async () => { - // Setup configuration - mockContextProxy.getGlobalState.mockReturnValue({ - codebaseIndexEnabled: false, // Start disabled to avoid transition restart + const config = { + codebaseIndexEnabled: true, codebaseIndexQdrantUrl: "http://qdrant.local", codebaseIndexEmbedderProvider: "openai", codebaseIndexEmbedderModelId: "text-embedding-3-small", - }) + } + mockContextProxy.getGlobalState.mockReturnValue(config) mockContextProxy.getSecret.mockImplementation((key: string) => { if (key === "codeIndexOpenAiKey") return "test-key" return undefined }) - // Create a new config manager (simulating what happens in CodeIndexManager.initialize) - const newConfigManager = new CodeIndexConfigManager(mockContextProxy) + // Initialize with the current config + await configManager.loadConfiguration() - // Load configuration - should not require restart since the manager should be initialized with current config - const result = await newConfigManager.loadConfiguration() + // First load should not require restart + const result = await configManager.loadConfiguration() expect(result.requiresRestart).toBe(false) }) it("should not require restart when settings are saved but code indexing config unchanged", async () => { - // This test simulates the original issue: handleExternalSettingsChange() being called - // when other settings are saved, but code indexing settings haven't changed - - // Setup initial state - enabled and configured - mockContextProxy.getGlobalState.mockReturnValue({ + // Initial config + const initialConfig = { codebaseIndexEnabled: true, codebaseIndexQdrantUrl: "http://qdrant.local", codebaseIndexEmbedderProvider: "openai", codebaseIndexEmbedderModelId: "text-embedding-3-small", - }) + } + mockContextProxy.getGlobalState.mockReturnValue(initialConfig) mockContextProxy.getSecret.mockImplementation((key: string) => { if (key === "codeIndexOpenAiKey") return "test-key" return undefined }) - // First load to establish baseline await configManager.loadConfiguration() - // Simulate external settings change where code indexing config hasn't changed - // (this is what happens when other settings are saved) - const result = await configManager.loadConfiguration() + // Simulate saving settings by creating a new manager and initializing + const newConfigManager = new CodeIndexConfigManager(mockContextProxy) + await newConfigManager.loadConfiguration() + + // Load config again with the same settings + const result = await newConfigManager.loadConfiguration() expect(result.requiresRestart).toBe(false) }) }) From 92ab05a4a6635ebf8e4fe4eb633d303692f71506 Mon Sep 17 00:00:00 2001 From: Chung Nguyen <15166543+ChuKhaLi@users.noreply.github.com> Date: Sun, 22 Jun 2025 23:05:04 +0700 Subject: [PATCH 16/21] get locale from main branch --- locales/ca/README.md | 70 ++++++++++++++++++++--------------------- locales/de/README.md | 70 ++++++++++++++++++++--------------------- locales/es/README.md | 70 ++++++++++++++++++++--------------------- locales/fr/README.md | 70 ++++++++++++++++++++--------------------- locales/hi/README.md | 70 ++++++++++++++++++++--------------------- locales/id/README.md | 70 ++++++++++++++++++++--------------------- locales/it/README.md | 70 ++++++++++++++++++++--------------------- locales/ja/README.md | 70 ++++++++++++++++++++--------------------- locales/ko/README.md | 70 ++++++++++++++++++++--------------------- locales/nl/README.md | 70 ++++++++++++++++++++--------------------- locales/pl/README.md | 70 ++++++++++++++++++++--------------------- locales/pt-BR/README.md | 70 ++++++++++++++++++++--------------------- locales/ru/README.md | 70 ++++++++++++++++++++--------------------- locales/tr/README.md | 70 ++++++++++++++++++++--------------------- locales/vi/README.md | 70 ++++++++++++++++++++--------------------- locales/zh-CN/README.md | 70 ++++++++++++++++++++--------------------- locales/zh-TW/README.md | 70 ++++++++++++++++++++--------------------- 17 files changed, 578 insertions(+), 612 deletions(-) diff --git a/locales/ca/README.md b/locales/ca/README.md index 8ac9d5d76b9..c653f54fbbb 100644 --- a/locales/ca/README.md +++ b/locales/ca/README.md @@ -181,42 +181,40 @@ Ens encanten les contribucions de la comunitat! Comenceu llegint el nostre [CONT Gràcies a tots els nostres col·laboradors que han ajudat a millorar Roo Code! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| joemanley201
joemanley201
| -| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| jr
jr
| MuriloFP
MuriloFP
| -| elianiva
elianiva
| d-oit
d-oit
| punkpeye
punkpeye
| wkordalski
wkordalski
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -| monotykamary
monotykamary
| cannuri
cannuri
| xyOz-dev
xyOz-dev
| feifei325
feifei325
| zhangtony239
zhangtony239
| qdaxb
qdaxb
| -| shariqriazz
shariqriazz
| pugazhendhi-m
pugazhendhi-m
| vigneshsubbiah16
vigneshsubbiah16
| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| -| chrarnoldus
chrarnoldus
| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| psv2522
psv2522
| Premshay
Premshay
| lupuletic
lupuletic
| -| kiwina
kiwina
| aheizi
aheizi
| PeterDaveHello
PeterDaveHello
| afshawnlotfi
afshawnlotfi
| RaySinner
RaySinner
| nbihan-mediware
nbihan-mediware
| -| ChuKhaLi
ChuKhaLi
| hassoncs
hassoncs
| emshvac
emshvac
| kyle-apex
kyle-apex
| noritaka1166
noritaka1166
| pdecat
pdecat
| -| SannidhyaSah
SannidhyaSah
| StevenTCramer
StevenTCramer
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dleffel
dleffel
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| Ruakij
Ruakij
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| dlab-anton
dlab-anton
| eonghk
eonghk
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| -| yt3trees
yt3trees
| benzntech
benzntech
| axkirillov
axkirillov
| anton-otee
anton-otee
| bramburn
bramburn
| olearycrew
olearycrew
| -| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| ross
ross
| philfung
philfung
| dairui1
dairui1
| dqroid
dqroid
| -| forestyoo
forestyoo
| GOODBOY008
GOODBOY008
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| vladstudio
vladstudio
| tmsjngx0
tmsjngx0
| -| tgfjt
tgfjt
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| student20880
student20880
| -| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| seedlord
seedlord
| 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
| -| kohii
kohii
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| devxpain
devxpain
| chadgauth
chadgauth
| brunobergher
brunobergher
| thecolorblue
thecolorblue
| -| bogdan0083
bogdan0083
| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| -| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| -| AMHesch
AMHesch
| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| -| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| -| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| -| KanTakahiro
KanTakahiro
| ksze
ksze
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| -| celestial-vault
celestial-vault
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|hannesrudolph
hannesrudolph
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|canrobins13
canrobins13
|stea9499
stea9499
|joemanley201
joemanley201
| +|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
|NyxJae
NyxJae
|jr
jr
|MuriloFP
MuriloFP
| +|elianiva
elianiva
|d-oit
d-oit
|punkpeye
punkpeye
|wkordalski
wkordalski
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|monotykamary
monotykamary
|cannuri
cannuri
|xyOz-dev
xyOz-dev
|feifei325
feifei325
|zhangtony239
zhangtony239
|qdaxb
qdaxb
| +|shariqriazz
shariqriazz
|pugazhendhi-m
pugazhendhi-m
|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
| +|chrarnoldus
chrarnoldus
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|psv2522
psv2522
|Premshay
Premshay
|lupuletic
lupuletic
| +|kiwina
kiwina
|aheizi
aheizi
|PeterDaveHello
PeterDaveHello
|afshawnlotfi
afshawnlotfi
|RaySinner
RaySinner
|nbihan-mediware
nbihan-mediware
| +|ChuKhaLi
ChuKhaLi
|hassoncs
hassoncs
|emshvac
emshvac
|kyle-apex
kyle-apex
|noritaka1166
noritaka1166
|pdecat
pdecat
| +|SannidhyaSah
SannidhyaSah
|StevenTCramer
StevenTCramer
|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
| +|dleffel
dleffel
|arthurauffray
arthurauffray
|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
| +|Ruakij
Ruakij
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
| +|taisukeoe
taisukeoe
|avtc
avtc
|dlab-anton
dlab-anton
|eonghk
eonghk
|kcwhite
kcwhite
|ronyblum
ronyblum
| +|teddyOOXX
teddyOOXX
|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
| +|yt3trees
yt3trees
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
|bramburn
bramburn
|olearycrew
olearycrew
| +|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|julionav
julionav
|SplittyDev
SplittyDev
| +|mdp
mdp
|napter
napter
|ross
ross
|philfung
philfung
|dairui1
dairui1
|dqroid
dqroid
| +|forestyoo
forestyoo
|GOODBOY008
GOODBOY008
|hatsu38
hatsu38
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
| +|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
| +|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|vladstudio
vladstudio
|tmsjngx0
tmsjngx0
| +|tgfjt
tgfjt
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
|student20880
student20880
| +|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
|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
| +|kohii
kohii
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
| +|Deon588
Deon588
|dleen
dleen
|devxpain
devxpain
|chadgauth
chadgauth
|brunobergher
brunobergher
|thecolorblue
thecolorblue
| +|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
| +|HadesArchitect
HadesArchitect
|alarno
alarno
|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
| +|AMHesch
AMHesch
|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
| +|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|kvokka
kvokka
|ecmasx
ecmasx
|mollux
mollux
| +|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
| +|KanTakahiro
KanTakahiro
|ksze
ksze
|Jdo300
Jdo300
|hesara
hesara
|DeXtroTip
DeXtroTip
|pfitz
pfitz
| +|celestial-vault
celestial-vault
| | | | | | ## Llicència diff --git a/locales/de/README.md b/locales/de/README.md index 652f90c12d6..24f1e4d69e5 100644 --- a/locales/de/README.md +++ b/locales/de/README.md @@ -181,42 +181,40 @@ Wir lieben Community-Beiträge! Beginnen Sie mit dem Lesen unserer [CONTRIBUTING Danke an alle unsere Mitwirkenden, die geholfen haben, Roo Code zu verbessern! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| joemanley201
joemanley201
| -| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| jr
jr
| MuriloFP
MuriloFP
| -| elianiva
elianiva
| d-oit
d-oit
| punkpeye
punkpeye
| wkordalski
wkordalski
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -| monotykamary
monotykamary
| cannuri
cannuri
| xyOz-dev
xyOz-dev
| feifei325
feifei325
| zhangtony239
zhangtony239
| qdaxb
qdaxb
| -| shariqriazz
shariqriazz
| pugazhendhi-m
pugazhendhi-m
| vigneshsubbiah16
vigneshsubbiah16
| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| -| chrarnoldus
chrarnoldus
| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| psv2522
psv2522
| Premshay
Premshay
| lupuletic
lupuletic
| -| kiwina
kiwina
| aheizi
aheizi
| PeterDaveHello
PeterDaveHello
| afshawnlotfi
afshawnlotfi
| RaySinner
RaySinner
| nbihan-mediware
nbihan-mediware
| -| ChuKhaLi
ChuKhaLi
| hassoncs
hassoncs
| emshvac
emshvac
| kyle-apex
kyle-apex
| noritaka1166
noritaka1166
| pdecat
pdecat
| -| SannidhyaSah
SannidhyaSah
| StevenTCramer
StevenTCramer
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dleffel
dleffel
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| Ruakij
Ruakij
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| dlab-anton
dlab-anton
| eonghk
eonghk
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| -| yt3trees
yt3trees
| benzntech
benzntech
| axkirillov
axkirillov
| anton-otee
anton-otee
| bramburn
bramburn
| olearycrew
olearycrew
| -| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| ross
ross
| philfung
philfung
| dairui1
dairui1
| dqroid
dqroid
| -| forestyoo
forestyoo
| GOODBOY008
GOODBOY008
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| vladstudio
vladstudio
| tmsjngx0
tmsjngx0
| -| tgfjt
tgfjt
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| student20880
student20880
| -| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| seedlord
seedlord
| 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
| -| kohii
kohii
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| devxpain
devxpain
| chadgauth
chadgauth
| brunobergher
brunobergher
| thecolorblue
thecolorblue
| -| bogdan0083
bogdan0083
| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| -| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| -| AMHesch
AMHesch
| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| -| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| -| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| -| KanTakahiro
KanTakahiro
| ksze
ksze
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| -| celestial-vault
celestial-vault
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|hannesrudolph
hannesrudolph
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|canrobins13
canrobins13
|stea9499
stea9499
|joemanley201
joemanley201
| +|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
|NyxJae
NyxJae
|jr
jr
|MuriloFP
MuriloFP
| +|elianiva
elianiva
|d-oit
d-oit
|punkpeye
punkpeye
|wkordalski
wkordalski
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|monotykamary
monotykamary
|cannuri
cannuri
|xyOz-dev
xyOz-dev
|feifei325
feifei325
|zhangtony239
zhangtony239
|qdaxb
qdaxb
| +|shariqriazz
shariqriazz
|pugazhendhi-m
pugazhendhi-m
|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
| +|chrarnoldus
chrarnoldus
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|psv2522
psv2522
|Premshay
Premshay
|lupuletic
lupuletic
| +|kiwina
kiwina
|aheizi
aheizi
|PeterDaveHello
PeterDaveHello
|afshawnlotfi
afshawnlotfi
|RaySinner
RaySinner
|nbihan-mediware
nbihan-mediware
| +|ChuKhaLi
ChuKhaLi
|hassoncs
hassoncs
|emshvac
emshvac
|kyle-apex
kyle-apex
|noritaka1166
noritaka1166
|pdecat
pdecat
| +|SannidhyaSah
SannidhyaSah
|StevenTCramer
StevenTCramer
|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
| +|dleffel
dleffel
|arthurauffray
arthurauffray
|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
| +|Ruakij
Ruakij
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
| +|taisukeoe
taisukeoe
|avtc
avtc
|dlab-anton
dlab-anton
|eonghk
eonghk
|kcwhite
kcwhite
|ronyblum
ronyblum
| +|teddyOOXX
teddyOOXX
|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
| +|yt3trees
yt3trees
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
|bramburn
bramburn
|olearycrew
olearycrew
| +|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|julionav
julionav
|SplittyDev
SplittyDev
| +|mdp
mdp
|napter
napter
|ross
ross
|philfung
philfung
|dairui1
dairui1
|dqroid
dqroid
| +|forestyoo
forestyoo
|GOODBOY008
GOODBOY008
|hatsu38
hatsu38
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
| +|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
| +|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|vladstudio
vladstudio
|tmsjngx0
tmsjngx0
| +|tgfjt
tgfjt
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
|student20880
student20880
| +|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
|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
| +|kohii
kohii
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
| +|Deon588
Deon588
|dleen
dleen
|devxpain
devxpain
|chadgauth
chadgauth
|brunobergher
brunobergher
|thecolorblue
thecolorblue
| +|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
| +|HadesArchitect
HadesArchitect
|alarno
alarno
|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
| +|AMHesch
AMHesch
|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
| +|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|kvokka
kvokka
|ecmasx
ecmasx
|mollux
mollux
| +|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
| +|KanTakahiro
KanTakahiro
|ksze
ksze
|Jdo300
Jdo300
|hesara
hesara
|DeXtroTip
DeXtroTip
|pfitz
pfitz
| +|celestial-vault
celestial-vault
| | | | | | ## Lizenz diff --git a/locales/es/README.md b/locales/es/README.md index 9c29e1a169b..adeca0a876c 100644 --- a/locales/es/README.md +++ b/locales/es/README.md @@ -181,42 +181,40 @@ Usamos [changesets](https://github.com/changesets/changesets) para versionar y p ¡Gracias a todos nuestros colaboradores que han ayudado a mejorar Roo Code! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| joemanley201
joemanley201
| -| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| jr
jr
| MuriloFP
MuriloFP
| -| elianiva
elianiva
| d-oit
d-oit
| punkpeye
punkpeye
| wkordalski
wkordalski
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -| monotykamary
monotykamary
| cannuri
cannuri
| xyOz-dev
xyOz-dev
| feifei325
feifei325
| zhangtony239
zhangtony239
| qdaxb
qdaxb
| -| shariqriazz
shariqriazz
| pugazhendhi-m
pugazhendhi-m
| vigneshsubbiah16
vigneshsubbiah16
| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| -| chrarnoldus
chrarnoldus
| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| psv2522
psv2522
| Premshay
Premshay
| lupuletic
lupuletic
| -| kiwina
kiwina
| aheizi
aheizi
| PeterDaveHello
PeterDaveHello
| afshawnlotfi
afshawnlotfi
| RaySinner
RaySinner
| nbihan-mediware
nbihan-mediware
| -| ChuKhaLi
ChuKhaLi
| hassoncs
hassoncs
| emshvac
emshvac
| kyle-apex
kyle-apex
| noritaka1166
noritaka1166
| pdecat
pdecat
| -| SannidhyaSah
SannidhyaSah
| StevenTCramer
StevenTCramer
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dleffel
dleffel
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| Ruakij
Ruakij
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| dlab-anton
dlab-anton
| eonghk
eonghk
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| -| yt3trees
yt3trees
| benzntech
benzntech
| axkirillov
axkirillov
| anton-otee
anton-otee
| bramburn
bramburn
| olearycrew
olearycrew
| -| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| ross
ross
| philfung
philfung
| dairui1
dairui1
| dqroid
dqroid
| -| forestyoo
forestyoo
| GOODBOY008
GOODBOY008
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| vladstudio
vladstudio
| tmsjngx0
tmsjngx0
| -| tgfjt
tgfjt
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| student20880
student20880
| -| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| seedlord
seedlord
| 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
| -| kohii
kohii
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| devxpain
devxpain
| chadgauth
chadgauth
| brunobergher
brunobergher
| thecolorblue
thecolorblue
| -| bogdan0083
bogdan0083
| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| -| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| -| AMHesch
AMHesch
| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| -| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| -| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| -| KanTakahiro
KanTakahiro
| ksze
ksze
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| -| celestial-vault
celestial-vault
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|hannesrudolph
hannesrudolph
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|canrobins13
canrobins13
|stea9499
stea9499
|joemanley201
joemanley201
| +|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
|NyxJae
NyxJae
|jr
jr
|MuriloFP
MuriloFP
| +|elianiva
elianiva
|d-oit
d-oit
|punkpeye
punkpeye
|wkordalski
wkordalski
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|monotykamary
monotykamary
|cannuri
cannuri
|xyOz-dev
xyOz-dev
|feifei325
feifei325
|zhangtony239
zhangtony239
|qdaxb
qdaxb
| +|shariqriazz
shariqriazz
|pugazhendhi-m
pugazhendhi-m
|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
| +|chrarnoldus
chrarnoldus
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|psv2522
psv2522
|Premshay
Premshay
|lupuletic
lupuletic
| +|kiwina
kiwina
|aheizi
aheizi
|PeterDaveHello
PeterDaveHello
|afshawnlotfi
afshawnlotfi
|RaySinner
RaySinner
|nbihan-mediware
nbihan-mediware
| +|ChuKhaLi
ChuKhaLi
|hassoncs
hassoncs
|emshvac
emshvac
|kyle-apex
kyle-apex
|noritaka1166
noritaka1166
|pdecat
pdecat
| +|SannidhyaSah
SannidhyaSah
|StevenTCramer
StevenTCramer
|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
| +|dleffel
dleffel
|arthurauffray
arthurauffray
|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
| +|Ruakij
Ruakij
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
| +|taisukeoe
taisukeoe
|avtc
avtc
|dlab-anton
dlab-anton
|eonghk
eonghk
|kcwhite
kcwhite
|ronyblum
ronyblum
| +|teddyOOXX
teddyOOXX
|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
| +|yt3trees
yt3trees
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
|bramburn
bramburn
|olearycrew
olearycrew
| +|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|julionav
julionav
|SplittyDev
SplittyDev
| +|mdp
mdp
|napter
napter
|ross
ross
|philfung
philfung
|dairui1
dairui1
|dqroid
dqroid
| +|forestyoo
forestyoo
|GOODBOY008
GOODBOY008
|hatsu38
hatsu38
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
| +|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
| +|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|vladstudio
vladstudio
|tmsjngx0
tmsjngx0
| +|tgfjt
tgfjt
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
|student20880
student20880
| +|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
|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
| +|kohii
kohii
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
| +|Deon588
Deon588
|dleen
dleen
|devxpain
devxpain
|chadgauth
chadgauth
|brunobergher
brunobergher
|thecolorblue
thecolorblue
| +|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
| +|HadesArchitect
HadesArchitect
|alarno
alarno
|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
| +|AMHesch
AMHesch
|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
| +|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|kvokka
kvokka
|ecmasx
ecmasx
|mollux
mollux
| +|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
| +|KanTakahiro
KanTakahiro
|ksze
ksze
|Jdo300
Jdo300
|hesara
hesara
|DeXtroTip
DeXtroTip
|pfitz
pfitz
| +|celestial-vault
celestial-vault
| | | | | | ## Licencia diff --git a/locales/fr/README.md b/locales/fr/README.md index 0053e658352..80140b85fb1 100644 --- a/locales/fr/README.md +++ b/locales/fr/README.md @@ -181,42 +181,40 @@ Nous adorons les contributions de la communauté ! Commencez par lire notre [CON Merci à tous nos contributeurs qui ont aidé à améliorer Roo Code ! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| joemanley201
joemanley201
| -| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| jr
jr
| MuriloFP
MuriloFP
| -| elianiva
elianiva
| d-oit
d-oit
| punkpeye
punkpeye
| wkordalski
wkordalski
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -| monotykamary
monotykamary
| cannuri
cannuri
| xyOz-dev
xyOz-dev
| feifei325
feifei325
| zhangtony239
zhangtony239
| qdaxb
qdaxb
| -| shariqriazz
shariqriazz
| pugazhendhi-m
pugazhendhi-m
| vigneshsubbiah16
vigneshsubbiah16
| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| -| chrarnoldus
chrarnoldus
| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| psv2522
psv2522
| Premshay
Premshay
| lupuletic
lupuletic
| -| kiwina
kiwina
| aheizi
aheizi
| PeterDaveHello
PeterDaveHello
| afshawnlotfi
afshawnlotfi
| RaySinner
RaySinner
| nbihan-mediware
nbihan-mediware
| -| ChuKhaLi
ChuKhaLi
| hassoncs
hassoncs
| emshvac
emshvac
| kyle-apex
kyle-apex
| noritaka1166
noritaka1166
| pdecat
pdecat
| -| SannidhyaSah
SannidhyaSah
| StevenTCramer
StevenTCramer
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dleffel
dleffel
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| Ruakij
Ruakij
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| dlab-anton
dlab-anton
| eonghk
eonghk
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| -| yt3trees
yt3trees
| benzntech
benzntech
| axkirillov
axkirillov
| anton-otee
anton-otee
| bramburn
bramburn
| olearycrew
olearycrew
| -| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| ross
ross
| philfung
philfung
| dairui1
dairui1
| dqroid
dqroid
| -| forestyoo
forestyoo
| GOODBOY008
GOODBOY008
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| vladstudio
vladstudio
| tmsjngx0
tmsjngx0
| -| tgfjt
tgfjt
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| student20880
student20880
| -| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| seedlord
seedlord
| 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
| -| kohii
kohii
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| devxpain
devxpain
| chadgauth
chadgauth
| brunobergher
brunobergher
| thecolorblue
thecolorblue
| -| bogdan0083
bogdan0083
| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| -| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| -| AMHesch
AMHesch
| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| -| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| -| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| -| KanTakahiro
KanTakahiro
| ksze
ksze
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| -| celestial-vault
celestial-vault
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|hannesrudolph
hannesrudolph
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|canrobins13
canrobins13
|stea9499
stea9499
|joemanley201
joemanley201
| +|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
|NyxJae
NyxJae
|jr
jr
|MuriloFP
MuriloFP
| +|elianiva
elianiva
|d-oit
d-oit
|punkpeye
punkpeye
|wkordalski
wkordalski
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|monotykamary
monotykamary
|cannuri
cannuri
|xyOz-dev
xyOz-dev
|feifei325
feifei325
|zhangtony239
zhangtony239
|qdaxb
qdaxb
| +|shariqriazz
shariqriazz
|pugazhendhi-m
pugazhendhi-m
|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
| +|chrarnoldus
chrarnoldus
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|psv2522
psv2522
|Premshay
Premshay
|lupuletic
lupuletic
| +|kiwina
kiwina
|aheizi
aheizi
|PeterDaveHello
PeterDaveHello
|afshawnlotfi
afshawnlotfi
|RaySinner
RaySinner
|nbihan-mediware
nbihan-mediware
| +|ChuKhaLi
ChuKhaLi
|hassoncs
hassoncs
|emshvac
emshvac
|kyle-apex
kyle-apex
|noritaka1166
noritaka1166
|pdecat
pdecat
| +|SannidhyaSah
SannidhyaSah
|StevenTCramer
StevenTCramer
|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
| +|dleffel
dleffel
|arthurauffray
arthurauffray
|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
| +|Ruakij
Ruakij
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
| +|taisukeoe
taisukeoe
|avtc
avtc
|dlab-anton
dlab-anton
|eonghk
eonghk
|kcwhite
kcwhite
|ronyblum
ronyblum
| +|teddyOOXX
teddyOOXX
|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
| +|yt3trees
yt3trees
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
|bramburn
bramburn
|olearycrew
olearycrew
| +|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|julionav
julionav
|SplittyDev
SplittyDev
| +|mdp
mdp
|napter
napter
|ross
ross
|philfung
philfung
|dairui1
dairui1
|dqroid
dqroid
| +|forestyoo
forestyoo
|GOODBOY008
GOODBOY008
|hatsu38
hatsu38
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
| +|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
| +|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|vladstudio
vladstudio
|tmsjngx0
tmsjngx0
| +|tgfjt
tgfjt
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
|student20880
student20880
| +|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
|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
| +|kohii
kohii
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
| +|Deon588
Deon588
|dleen
dleen
|devxpain
devxpain
|chadgauth
chadgauth
|brunobergher
brunobergher
|thecolorblue
thecolorblue
| +|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
| +|HadesArchitect
HadesArchitect
|alarno
alarno
|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
| +|AMHesch
AMHesch
|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
| +|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|kvokka
kvokka
|ecmasx
ecmasx
|mollux
mollux
| +|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
| +|KanTakahiro
KanTakahiro
|ksze
ksze
|Jdo300
Jdo300
|hesara
hesara
|DeXtroTip
DeXtroTip
|pfitz
pfitz
| +|celestial-vault
celestial-vault
| | | | | | ## Licence diff --git a/locales/hi/README.md b/locales/hi/README.md index 4fc548e4b84..9f20242d899 100644 --- a/locales/hi/README.md +++ b/locales/hi/README.md @@ -181,42 +181,40 @@ code --install-extension bin/roo-cline-.vsix Roo Code को बेहतर बनाने में मदद करने वाले हमारे सभी योगदानकर्ताओं को धन्यवाद! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| joemanley201
joemanley201
| -| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| jr
jr
| MuriloFP
MuriloFP
| -| elianiva
elianiva
| d-oit
d-oit
| punkpeye
punkpeye
| wkordalski
wkordalski
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -| monotykamary
monotykamary
| cannuri
cannuri
| xyOz-dev
xyOz-dev
| feifei325
feifei325
| zhangtony239
zhangtony239
| qdaxb
qdaxb
| -| shariqriazz
shariqriazz
| pugazhendhi-m
pugazhendhi-m
| vigneshsubbiah16
vigneshsubbiah16
| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| -| chrarnoldus
chrarnoldus
| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| psv2522
psv2522
| Premshay
Premshay
| lupuletic
lupuletic
| -| kiwina
kiwina
| aheizi
aheizi
| PeterDaveHello
PeterDaveHello
| afshawnlotfi
afshawnlotfi
| RaySinner
RaySinner
| nbihan-mediware
nbihan-mediware
| -| ChuKhaLi
ChuKhaLi
| hassoncs
hassoncs
| emshvac
emshvac
| kyle-apex
kyle-apex
| noritaka1166
noritaka1166
| pdecat
pdecat
| -| SannidhyaSah
SannidhyaSah
| StevenTCramer
StevenTCramer
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dleffel
dleffel
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| Ruakij
Ruakij
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| dlab-anton
dlab-anton
| eonghk
eonghk
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| -| yt3trees
yt3trees
| benzntech
benzntech
| axkirillov
axkirillov
| anton-otee
anton-otee
| bramburn
bramburn
| olearycrew
olearycrew
| -| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| ross
ross
| philfung
philfung
| dairui1
dairui1
| dqroid
dqroid
| -| forestyoo
forestyoo
| GOODBOY008
GOODBOY008
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| vladstudio
vladstudio
| tmsjngx0
tmsjngx0
| -| tgfjt
tgfjt
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| student20880
student20880
| -| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| seedlord
seedlord
| 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
| -| kohii
kohii
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| devxpain
devxpain
| chadgauth
chadgauth
| brunobergher
brunobergher
| thecolorblue
thecolorblue
| -| bogdan0083
bogdan0083
| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| -| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| -| AMHesch
AMHesch
| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| -| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| -| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| -| KanTakahiro
KanTakahiro
| ksze
ksze
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| -| celestial-vault
celestial-vault
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|hannesrudolph
hannesrudolph
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|canrobins13
canrobins13
|stea9499
stea9499
|joemanley201
joemanley201
| +|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
|NyxJae
NyxJae
|jr
jr
|MuriloFP
MuriloFP
| +|elianiva
elianiva
|d-oit
d-oit
|punkpeye
punkpeye
|wkordalski
wkordalski
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|monotykamary
monotykamary
|cannuri
cannuri
|xyOz-dev
xyOz-dev
|feifei325
feifei325
|zhangtony239
zhangtony239
|qdaxb
qdaxb
| +|shariqriazz
shariqriazz
|pugazhendhi-m
pugazhendhi-m
|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
| +|chrarnoldus
chrarnoldus
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|psv2522
psv2522
|Premshay
Premshay
|lupuletic
lupuletic
| +|kiwina
kiwina
|aheizi
aheizi
|PeterDaveHello
PeterDaveHello
|afshawnlotfi
afshawnlotfi
|RaySinner
RaySinner
|nbihan-mediware
nbihan-mediware
| +|ChuKhaLi
ChuKhaLi
|hassoncs
hassoncs
|emshvac
emshvac
|kyle-apex
kyle-apex
|noritaka1166
noritaka1166
|pdecat
pdecat
| +|SannidhyaSah
SannidhyaSah
|StevenTCramer
StevenTCramer
|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
| +|dleffel
dleffel
|arthurauffray
arthurauffray
|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
| +|Ruakij
Ruakij
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
| +|taisukeoe
taisukeoe
|avtc
avtc
|dlab-anton
dlab-anton
|eonghk
eonghk
|kcwhite
kcwhite
|ronyblum
ronyblum
| +|teddyOOXX
teddyOOXX
|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
| +|yt3trees
yt3trees
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
|bramburn
bramburn
|olearycrew
olearycrew
| +|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|julionav
julionav
|SplittyDev
SplittyDev
| +|mdp
mdp
|napter
napter
|ross
ross
|philfung
philfung
|dairui1
dairui1
|dqroid
dqroid
| +|forestyoo
forestyoo
|GOODBOY008
GOODBOY008
|hatsu38
hatsu38
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
| +|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
| +|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|vladstudio
vladstudio
|tmsjngx0
tmsjngx0
| +|tgfjt
tgfjt
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
|student20880
student20880
| +|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
|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
| +|kohii
kohii
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
| +|Deon588
Deon588
|dleen
dleen
|devxpain
devxpain
|chadgauth
chadgauth
|brunobergher
brunobergher
|thecolorblue
thecolorblue
| +|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
| +|HadesArchitect
HadesArchitect
|alarno
alarno
|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
| +|AMHesch
AMHesch
|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
| +|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|kvokka
kvokka
|ecmasx
ecmasx
|mollux
mollux
| +|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
| +|KanTakahiro
KanTakahiro
|ksze
ksze
|Jdo300
Jdo300
|hesara
hesara
|DeXtroTip
DeXtroTip
|pfitz
pfitz
| +|celestial-vault
celestial-vault
| | | | | | ## लाइसेंस diff --git a/locales/id/README.md b/locales/id/README.md index c34b0c3f56b..3381b865b01 100644 --- a/locales/id/README.md +++ b/locales/id/README.md @@ -175,42 +175,40 @@ Kami menyukai kontribusi komunitas! Mulai dengan membaca [CONTRIBUTING.md](CONTR Terima kasih kepada semua kontributor kami yang telah membantu membuat Roo Code lebih baik! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| joemanley201
joemanley201
| -| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| jr
jr
| MuriloFP
MuriloFP
| -| elianiva
elianiva
| d-oit
d-oit
| punkpeye
punkpeye
| wkordalski
wkordalski
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -| monotykamary
monotykamary
| cannuri
cannuri
| xyOz-dev
xyOz-dev
| feifei325
feifei325
| zhangtony239
zhangtony239
| qdaxb
qdaxb
| -| shariqriazz
shariqriazz
| pugazhendhi-m
pugazhendhi-m
| vigneshsubbiah16
vigneshsubbiah16
| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| -| chrarnoldus
chrarnoldus
| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| psv2522
psv2522
| Premshay
Premshay
| lupuletic
lupuletic
| -| kiwina
kiwina
| aheizi
aheizi
| PeterDaveHello
PeterDaveHello
| afshawnlotfi
afshawnlotfi
| RaySinner
RaySinner
| nbihan-mediware
nbihan-mediware
| -| ChuKhaLi
ChuKhaLi
| hassoncs
hassoncs
| emshvac
emshvac
| kyle-apex
kyle-apex
| noritaka1166
noritaka1166
| pdecat
pdecat
| -| SannidhyaSah
SannidhyaSah
| StevenTCramer
StevenTCramer
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dleffel
dleffel
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| Ruakij
Ruakij
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| dlab-anton
dlab-anton
| eonghk
eonghk
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| -| yt3trees
yt3trees
| benzntech
benzntech
| axkirillov
axkirillov
| anton-otee
anton-otee
| bramburn
bramburn
| olearycrew
olearycrew
| -| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| ross
ross
| philfung
philfung
| dairui1
dairui1
| dqroid
dqroid
| -| forestyoo
forestyoo
| GOODBOY008
GOODBOY008
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| vladstudio
vladstudio
| tmsjngx0
tmsjngx0
| -| tgfjt
tgfjt
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| student20880
student20880
| -| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| seedlord
seedlord
| 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
| -| kohii
kohii
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| devxpain
devxpain
| chadgauth
chadgauth
| brunobergher
brunobergher
| thecolorblue
thecolorblue
| -| bogdan0083
bogdan0083
| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| -| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| -| AMHesch
AMHesch
| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| -| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| -| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| -| KanTakahiro
KanTakahiro
| ksze
ksze
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| -| celestial-vault
celestial-vault
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|hannesrudolph
hannesrudolph
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|canrobins13
canrobins13
|stea9499
stea9499
|joemanley201
joemanley201
| +|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
|NyxJae
NyxJae
|jr
jr
|MuriloFP
MuriloFP
| +|elianiva
elianiva
|d-oit
d-oit
|punkpeye
punkpeye
|wkordalski
wkordalski
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|monotykamary
monotykamary
|cannuri
cannuri
|xyOz-dev
xyOz-dev
|feifei325
feifei325
|zhangtony239
zhangtony239
|qdaxb
qdaxb
| +|shariqriazz
shariqriazz
|pugazhendhi-m
pugazhendhi-m
|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
| +|chrarnoldus
chrarnoldus
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|psv2522
psv2522
|Premshay
Premshay
|lupuletic
lupuletic
| +|kiwina
kiwina
|aheizi
aheizi
|PeterDaveHello
PeterDaveHello
|afshawnlotfi
afshawnlotfi
|RaySinner
RaySinner
|nbihan-mediware
nbihan-mediware
| +|ChuKhaLi
ChuKhaLi
|hassoncs
hassoncs
|emshvac
emshvac
|kyle-apex
kyle-apex
|noritaka1166
noritaka1166
|pdecat
pdecat
| +|SannidhyaSah
SannidhyaSah
|StevenTCramer
StevenTCramer
|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
| +|dleffel
dleffel
|arthurauffray
arthurauffray
|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
| +|Ruakij
Ruakij
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
| +|taisukeoe
taisukeoe
|avtc
avtc
|dlab-anton
dlab-anton
|eonghk
eonghk
|kcwhite
kcwhite
|ronyblum
ronyblum
| +|teddyOOXX
teddyOOXX
|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
| +|yt3trees
yt3trees
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
|bramburn
bramburn
|olearycrew
olearycrew
| +|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|julionav
julionav
|SplittyDev
SplittyDev
| +|mdp
mdp
|napter
napter
|ross
ross
|philfung
philfung
|dairui1
dairui1
|dqroid
dqroid
| +|forestyoo
forestyoo
|GOODBOY008
GOODBOY008
|hatsu38
hatsu38
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
| +|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
| +|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|vladstudio
vladstudio
|tmsjngx0
tmsjngx0
| +|tgfjt
tgfjt
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
|student20880
student20880
| +|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
|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
| +|kohii
kohii
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
| +|Deon588
Deon588
|dleen
dleen
|devxpain
devxpain
|chadgauth
chadgauth
|brunobergher
brunobergher
|thecolorblue
thecolorblue
| +|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
| +|HadesArchitect
HadesArchitect
|alarno
alarno
|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
| +|AMHesch
AMHesch
|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
| +|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|kvokka
kvokka
|ecmasx
ecmasx
|mollux
mollux
| +|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
| +|KanTakahiro
KanTakahiro
|ksze
ksze
|Jdo300
Jdo300
|hesara
hesara
|DeXtroTip
DeXtroTip
|pfitz
pfitz
| +|celestial-vault
celestial-vault
| | | | | | ## License diff --git a/locales/it/README.md b/locales/it/README.md index 9909d5142ab..964db4ff347 100644 --- a/locales/it/README.md +++ b/locales/it/README.md @@ -181,42 +181,40 @@ Amiamo i contributi della community! Inizia leggendo il nostro [CONTRIBUTING.md] Grazie a tutti i nostri contributori che hanno aiutato a migliorare Roo Code! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| joemanley201
joemanley201
| -| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| jr
jr
| MuriloFP
MuriloFP
| -| elianiva
elianiva
| d-oit
d-oit
| punkpeye
punkpeye
| wkordalski
wkordalski
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -| monotykamary
monotykamary
| cannuri
cannuri
| xyOz-dev
xyOz-dev
| feifei325
feifei325
| zhangtony239
zhangtony239
| qdaxb
qdaxb
| -| shariqriazz
shariqriazz
| pugazhendhi-m
pugazhendhi-m
| vigneshsubbiah16
vigneshsubbiah16
| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| -| chrarnoldus
chrarnoldus
| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| psv2522
psv2522
| Premshay
Premshay
| lupuletic
lupuletic
| -| kiwina
kiwina
| aheizi
aheizi
| PeterDaveHello
PeterDaveHello
| afshawnlotfi
afshawnlotfi
| RaySinner
RaySinner
| nbihan-mediware
nbihan-mediware
| -| ChuKhaLi
ChuKhaLi
| hassoncs
hassoncs
| emshvac
emshvac
| kyle-apex
kyle-apex
| noritaka1166
noritaka1166
| pdecat
pdecat
| -| SannidhyaSah
SannidhyaSah
| StevenTCramer
StevenTCramer
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dleffel
dleffel
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| Ruakij
Ruakij
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| dlab-anton
dlab-anton
| eonghk
eonghk
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| -| yt3trees
yt3trees
| benzntech
benzntech
| axkirillov
axkirillov
| anton-otee
anton-otee
| bramburn
bramburn
| olearycrew
olearycrew
| -| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| ross
ross
| philfung
philfung
| dairui1
dairui1
| dqroid
dqroid
| -| forestyoo
forestyoo
| GOODBOY008
GOODBOY008
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| vladstudio
vladstudio
| tmsjngx0
tmsjngx0
| -| tgfjt
tgfjt
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| student20880
student20880
| -| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| seedlord
seedlord
| 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
| -| kohii
kohii
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| devxpain
devxpain
| chadgauth
chadgauth
| brunobergher
brunobergher
| thecolorblue
thecolorblue
| -| bogdan0083
bogdan0083
| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| -| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| -| AMHesch
AMHesch
| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| -| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| -| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| -| KanTakahiro
KanTakahiro
| ksze
ksze
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| -| celestial-vault
celestial-vault
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|hannesrudolph
hannesrudolph
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|canrobins13
canrobins13
|stea9499
stea9499
|joemanley201
joemanley201
| +|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
|NyxJae
NyxJae
|jr
jr
|MuriloFP
MuriloFP
| +|elianiva
elianiva
|d-oit
d-oit
|punkpeye
punkpeye
|wkordalski
wkordalski
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|monotykamary
monotykamary
|cannuri
cannuri
|xyOz-dev
xyOz-dev
|feifei325
feifei325
|zhangtony239
zhangtony239
|qdaxb
qdaxb
| +|shariqriazz
shariqriazz
|pugazhendhi-m
pugazhendhi-m
|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
| +|chrarnoldus
chrarnoldus
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|psv2522
psv2522
|Premshay
Premshay
|lupuletic
lupuletic
| +|kiwina
kiwina
|aheizi
aheizi
|PeterDaveHello
PeterDaveHello
|afshawnlotfi
afshawnlotfi
|RaySinner
RaySinner
|nbihan-mediware
nbihan-mediware
| +|ChuKhaLi
ChuKhaLi
|hassoncs
hassoncs
|emshvac
emshvac
|kyle-apex
kyle-apex
|noritaka1166
noritaka1166
|pdecat
pdecat
| +|SannidhyaSah
SannidhyaSah
|StevenTCramer
StevenTCramer
|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
| +|dleffel
dleffel
|arthurauffray
arthurauffray
|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
| +|Ruakij
Ruakij
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
| +|taisukeoe
taisukeoe
|avtc
avtc
|dlab-anton
dlab-anton
|eonghk
eonghk
|kcwhite
kcwhite
|ronyblum
ronyblum
| +|teddyOOXX
teddyOOXX
|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
| +|yt3trees
yt3trees
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
|bramburn
bramburn
|olearycrew
olearycrew
| +|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|julionav
julionav
|SplittyDev
SplittyDev
| +|mdp
mdp
|napter
napter
|ross
ross
|philfung
philfung
|dairui1
dairui1
|dqroid
dqroid
| +|forestyoo
forestyoo
|GOODBOY008
GOODBOY008
|hatsu38
hatsu38
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
| +|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
| +|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|vladstudio
vladstudio
|tmsjngx0
tmsjngx0
| +|tgfjt
tgfjt
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
|student20880
student20880
| +|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
|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
| +|kohii
kohii
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
| +|Deon588
Deon588
|dleen
dleen
|devxpain
devxpain
|chadgauth
chadgauth
|brunobergher
brunobergher
|thecolorblue
thecolorblue
| +|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
| +|HadesArchitect
HadesArchitect
|alarno
alarno
|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
| +|AMHesch
AMHesch
|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
| +|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|kvokka
kvokka
|ecmasx
ecmasx
|mollux
mollux
| +|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
| +|KanTakahiro
KanTakahiro
|ksze
ksze
|Jdo300
Jdo300
|hesara
hesara
|DeXtroTip
DeXtroTip
|pfitz
pfitz
| +|celestial-vault
celestial-vault
| | | | | | ## Licenza diff --git a/locales/ja/README.md b/locales/ja/README.md index 010de90e9e2..90c32409fcc 100644 --- a/locales/ja/README.md +++ b/locales/ja/README.md @@ -181,42 +181,40 @@ code --install-extension bin/roo-cline-.vsix Roo Codeの改善に貢献してくれたすべての貢献者に感謝します! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| joemanley201
joemanley201
| -| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| jr
jr
| MuriloFP
MuriloFP
| -| elianiva
elianiva
| d-oit
d-oit
| punkpeye
punkpeye
| wkordalski
wkordalski
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -| monotykamary
monotykamary
| cannuri
cannuri
| xyOz-dev
xyOz-dev
| feifei325
feifei325
| zhangtony239
zhangtony239
| qdaxb
qdaxb
| -| shariqriazz
shariqriazz
| pugazhendhi-m
pugazhendhi-m
| vigneshsubbiah16
vigneshsubbiah16
| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| -| chrarnoldus
chrarnoldus
| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| psv2522
psv2522
| Premshay
Premshay
| lupuletic
lupuletic
| -| kiwina
kiwina
| aheizi
aheizi
| PeterDaveHello
PeterDaveHello
| afshawnlotfi
afshawnlotfi
| RaySinner
RaySinner
| nbihan-mediware
nbihan-mediware
| -| ChuKhaLi
ChuKhaLi
| hassoncs
hassoncs
| emshvac
emshvac
| kyle-apex
kyle-apex
| noritaka1166
noritaka1166
| pdecat
pdecat
| -| SannidhyaSah
SannidhyaSah
| StevenTCramer
StevenTCramer
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dleffel
dleffel
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| Ruakij
Ruakij
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| dlab-anton
dlab-anton
| eonghk
eonghk
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| -| yt3trees
yt3trees
| benzntech
benzntech
| axkirillov
axkirillov
| anton-otee
anton-otee
| bramburn
bramburn
| olearycrew
olearycrew
| -| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| ross
ross
| philfung
philfung
| dairui1
dairui1
| dqroid
dqroid
| -| forestyoo
forestyoo
| GOODBOY008
GOODBOY008
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| vladstudio
vladstudio
| tmsjngx0
tmsjngx0
| -| tgfjt
tgfjt
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| student20880
student20880
| -| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| seedlord
seedlord
| 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
| -| kohii
kohii
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| devxpain
devxpain
| chadgauth
chadgauth
| brunobergher
brunobergher
| thecolorblue
thecolorblue
| -| bogdan0083
bogdan0083
| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| -| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| -| AMHesch
AMHesch
| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| -| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| -| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| -| KanTakahiro
KanTakahiro
| ksze
ksze
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| -| celestial-vault
celestial-vault
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|hannesrudolph
hannesrudolph
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|canrobins13
canrobins13
|stea9499
stea9499
|joemanley201
joemanley201
| +|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
|NyxJae
NyxJae
|jr
jr
|MuriloFP
MuriloFP
| +|elianiva
elianiva
|d-oit
d-oit
|punkpeye
punkpeye
|wkordalski
wkordalski
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|monotykamary
monotykamary
|cannuri
cannuri
|xyOz-dev
xyOz-dev
|feifei325
feifei325
|zhangtony239
zhangtony239
|qdaxb
qdaxb
| +|shariqriazz
shariqriazz
|pugazhendhi-m
pugazhendhi-m
|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
| +|chrarnoldus
chrarnoldus
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|psv2522
psv2522
|Premshay
Premshay
|lupuletic
lupuletic
| +|kiwina
kiwina
|aheizi
aheizi
|PeterDaveHello
PeterDaveHello
|afshawnlotfi
afshawnlotfi
|RaySinner
RaySinner
|nbihan-mediware
nbihan-mediware
| +|ChuKhaLi
ChuKhaLi
|hassoncs
hassoncs
|emshvac
emshvac
|kyle-apex
kyle-apex
|noritaka1166
noritaka1166
|pdecat
pdecat
| +|SannidhyaSah
SannidhyaSah
|StevenTCramer
StevenTCramer
|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
| +|dleffel
dleffel
|arthurauffray
arthurauffray
|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
| +|Ruakij
Ruakij
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
| +|taisukeoe
taisukeoe
|avtc
avtc
|dlab-anton
dlab-anton
|eonghk
eonghk
|kcwhite
kcwhite
|ronyblum
ronyblum
| +|teddyOOXX
teddyOOXX
|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
| +|yt3trees
yt3trees
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
|bramburn
bramburn
|olearycrew
olearycrew
| +|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|julionav
julionav
|SplittyDev
SplittyDev
| +|mdp
mdp
|napter
napter
|ross
ross
|philfung
philfung
|dairui1
dairui1
|dqroid
dqroid
| +|forestyoo
forestyoo
|GOODBOY008
GOODBOY008
|hatsu38
hatsu38
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
| +|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
| +|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|vladstudio
vladstudio
|tmsjngx0
tmsjngx0
| +|tgfjt
tgfjt
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
|student20880
student20880
| +|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
|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
| +|kohii
kohii
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
| +|Deon588
Deon588
|dleen
dleen
|devxpain
devxpain
|chadgauth
chadgauth
|brunobergher
brunobergher
|thecolorblue
thecolorblue
| +|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
| +|HadesArchitect
HadesArchitect
|alarno
alarno
|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
| +|AMHesch
AMHesch
|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
| +|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|kvokka
kvokka
|ecmasx
ecmasx
|mollux
mollux
| +|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
| +|KanTakahiro
KanTakahiro
|ksze
ksze
|Jdo300
Jdo300
|hesara
hesara
|DeXtroTip
DeXtroTip
|pfitz
pfitz
| +|celestial-vault
celestial-vault
| | | | | | ## ライセンス diff --git a/locales/ko/README.md b/locales/ko/README.md index 21eedcb903a..dce892ffb9e 100644 --- a/locales/ko/README.md +++ b/locales/ko/README.md @@ -181,42 +181,40 @@ code --install-extension bin/roo-cline-.vsix Roo Code를 더 좋게 만드는 데 도움을 준 모든 기여자에게 감사드립니다! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| joemanley201
joemanley201
| -| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| jr
jr
| MuriloFP
MuriloFP
| -| elianiva
elianiva
| d-oit
d-oit
| punkpeye
punkpeye
| wkordalski
wkordalski
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -| monotykamary
monotykamary
| cannuri
cannuri
| xyOz-dev
xyOz-dev
| feifei325
feifei325
| zhangtony239
zhangtony239
| qdaxb
qdaxb
| -| shariqriazz
shariqriazz
| pugazhendhi-m
pugazhendhi-m
| vigneshsubbiah16
vigneshsubbiah16
| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| -| chrarnoldus
chrarnoldus
| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| psv2522
psv2522
| Premshay
Premshay
| lupuletic
lupuletic
| -| kiwina
kiwina
| aheizi
aheizi
| PeterDaveHello
PeterDaveHello
| afshawnlotfi
afshawnlotfi
| RaySinner
RaySinner
| nbihan-mediware
nbihan-mediware
| -| ChuKhaLi
ChuKhaLi
| hassoncs
hassoncs
| emshvac
emshvac
| kyle-apex
kyle-apex
| noritaka1166
noritaka1166
| pdecat
pdecat
| -| SannidhyaSah
SannidhyaSah
| StevenTCramer
StevenTCramer
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dleffel
dleffel
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| Ruakij
Ruakij
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| dlab-anton
dlab-anton
| eonghk
eonghk
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| -| yt3trees
yt3trees
| benzntech
benzntech
| axkirillov
axkirillov
| anton-otee
anton-otee
| bramburn
bramburn
| olearycrew
olearycrew
| -| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| ross
ross
| philfung
philfung
| dairui1
dairui1
| dqroid
dqroid
| -| forestyoo
forestyoo
| GOODBOY008
GOODBOY008
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| vladstudio
vladstudio
| tmsjngx0
tmsjngx0
| -| tgfjt
tgfjt
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| student20880
student20880
| -| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| seedlord
seedlord
| 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
| -| kohii
kohii
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| devxpain
devxpain
| chadgauth
chadgauth
| brunobergher
brunobergher
| thecolorblue
thecolorblue
| -| bogdan0083
bogdan0083
| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| -| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| -| AMHesch
AMHesch
| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| -| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| -| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| -| KanTakahiro
KanTakahiro
| ksze
ksze
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| -| celestial-vault
celestial-vault
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|hannesrudolph
hannesrudolph
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|canrobins13
canrobins13
|stea9499
stea9499
|joemanley201
joemanley201
| +|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
|NyxJae
NyxJae
|jr
jr
|MuriloFP
MuriloFP
| +|elianiva
elianiva
|d-oit
d-oit
|punkpeye
punkpeye
|wkordalski
wkordalski
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|monotykamary
monotykamary
|cannuri
cannuri
|xyOz-dev
xyOz-dev
|feifei325
feifei325
|zhangtony239
zhangtony239
|qdaxb
qdaxb
| +|shariqriazz
shariqriazz
|pugazhendhi-m
pugazhendhi-m
|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
| +|chrarnoldus
chrarnoldus
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|psv2522
psv2522
|Premshay
Premshay
|lupuletic
lupuletic
| +|kiwina
kiwina
|aheizi
aheizi
|PeterDaveHello
PeterDaveHello
|afshawnlotfi
afshawnlotfi
|RaySinner
RaySinner
|nbihan-mediware
nbihan-mediware
| +|ChuKhaLi
ChuKhaLi
|hassoncs
hassoncs
|emshvac
emshvac
|kyle-apex
kyle-apex
|noritaka1166
noritaka1166
|pdecat
pdecat
| +|SannidhyaSah
SannidhyaSah
|StevenTCramer
StevenTCramer
|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
| +|dleffel
dleffel
|arthurauffray
arthurauffray
|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
| +|Ruakij
Ruakij
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
| +|taisukeoe
taisukeoe
|avtc
avtc
|dlab-anton
dlab-anton
|eonghk
eonghk
|kcwhite
kcwhite
|ronyblum
ronyblum
| +|teddyOOXX
teddyOOXX
|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
| +|yt3trees
yt3trees
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
|bramburn
bramburn
|olearycrew
olearycrew
| +|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|julionav
julionav
|SplittyDev
SplittyDev
| +|mdp
mdp
|napter
napter
|ross
ross
|philfung
philfung
|dairui1
dairui1
|dqroid
dqroid
| +|forestyoo
forestyoo
|GOODBOY008
GOODBOY008
|hatsu38
hatsu38
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
| +|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
| +|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|vladstudio
vladstudio
|tmsjngx0
tmsjngx0
| +|tgfjt
tgfjt
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
|student20880
student20880
| +|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
|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
| +|kohii
kohii
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
| +|Deon588
Deon588
|dleen
dleen
|devxpain
devxpain
|chadgauth
chadgauth
|brunobergher
brunobergher
|thecolorblue
thecolorblue
| +|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
| +|HadesArchitect
HadesArchitect
|alarno
alarno
|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
| +|AMHesch
AMHesch
|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
| +|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|kvokka
kvokka
|ecmasx
ecmasx
|mollux
mollux
| +|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
| +|KanTakahiro
KanTakahiro
|ksze
ksze
|Jdo300
Jdo300
|hesara
hesara
|DeXtroTip
DeXtroTip
|pfitz
pfitz
| +|celestial-vault
celestial-vault
| | | | | | ## 라이선스 diff --git a/locales/nl/README.md b/locales/nl/README.md index 8025cb17018..7ca8251e73f 100644 --- a/locales/nl/README.md +++ b/locales/nl/README.md @@ -181,42 +181,40 @@ We houden van bijdragen uit de community! Begin met het lezen van onze [CONTRIBU Dank aan alle bijdragers die Roo Code beter hebben gemaakt! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| joemanley201
joemanley201
| -| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| jr
jr
| MuriloFP
MuriloFP
| -| elianiva
elianiva
| d-oit
d-oit
| punkpeye
punkpeye
| wkordalski
wkordalski
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -| monotykamary
monotykamary
| cannuri
cannuri
| xyOz-dev
xyOz-dev
| feifei325
feifei325
| zhangtony239
zhangtony239
| qdaxb
qdaxb
| -| shariqriazz
shariqriazz
| pugazhendhi-m
pugazhendhi-m
| vigneshsubbiah16
vigneshsubbiah16
| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| -| chrarnoldus
chrarnoldus
| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| psv2522
psv2522
| Premshay
Premshay
| lupuletic
lupuletic
| -| kiwina
kiwina
| aheizi
aheizi
| PeterDaveHello
PeterDaveHello
| afshawnlotfi
afshawnlotfi
| RaySinner
RaySinner
| nbihan-mediware
nbihan-mediware
| -| ChuKhaLi
ChuKhaLi
| hassoncs
hassoncs
| emshvac
emshvac
| kyle-apex
kyle-apex
| noritaka1166
noritaka1166
| pdecat
pdecat
| -| SannidhyaSah
SannidhyaSah
| StevenTCramer
StevenTCramer
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dleffel
dleffel
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| Ruakij
Ruakij
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| dlab-anton
dlab-anton
| eonghk
eonghk
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| -| yt3trees
yt3trees
| benzntech
benzntech
| axkirillov
axkirillov
| anton-otee
anton-otee
| bramburn
bramburn
| olearycrew
olearycrew
| -| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| ross
ross
| philfung
philfung
| dairui1
dairui1
| dqroid
dqroid
| -| forestyoo
forestyoo
| GOODBOY008
GOODBOY008
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| vladstudio
vladstudio
| tmsjngx0
tmsjngx0
| -| tgfjt
tgfjt
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| student20880
student20880
| -| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| seedlord
seedlord
| 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
| -| kohii
kohii
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| devxpain
devxpain
| chadgauth
chadgauth
| brunobergher
brunobergher
| thecolorblue
thecolorblue
| -| bogdan0083
bogdan0083
| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| -| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| -| AMHesch
AMHesch
| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| -| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| -| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| -| KanTakahiro
KanTakahiro
| ksze
ksze
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| -| celestial-vault
celestial-vault
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|hannesrudolph
hannesrudolph
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|canrobins13
canrobins13
|stea9499
stea9499
|joemanley201
joemanley201
| +|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
|NyxJae
NyxJae
|jr
jr
|MuriloFP
MuriloFP
| +|elianiva
elianiva
|d-oit
d-oit
|punkpeye
punkpeye
|wkordalski
wkordalski
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|monotykamary
monotykamary
|cannuri
cannuri
|xyOz-dev
xyOz-dev
|feifei325
feifei325
|zhangtony239
zhangtony239
|qdaxb
qdaxb
| +|shariqriazz
shariqriazz
|pugazhendhi-m
pugazhendhi-m
|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
| +|chrarnoldus
chrarnoldus
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|psv2522
psv2522
|Premshay
Premshay
|lupuletic
lupuletic
| +|kiwina
kiwina
|aheizi
aheizi
|PeterDaveHello
PeterDaveHello
|afshawnlotfi
afshawnlotfi
|RaySinner
RaySinner
|nbihan-mediware
nbihan-mediware
| +|ChuKhaLi
ChuKhaLi
|hassoncs
hassoncs
|emshvac
emshvac
|kyle-apex
kyle-apex
|noritaka1166
noritaka1166
|pdecat
pdecat
| +|SannidhyaSah
SannidhyaSah
|StevenTCramer
StevenTCramer
|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
| +|dleffel
dleffel
|arthurauffray
arthurauffray
|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
| +|Ruakij
Ruakij
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
| +|taisukeoe
taisukeoe
|avtc
avtc
|dlab-anton
dlab-anton
|eonghk
eonghk
|kcwhite
kcwhite
|ronyblum
ronyblum
| +|teddyOOXX
teddyOOXX
|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
| +|yt3trees
yt3trees
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
|bramburn
bramburn
|olearycrew
olearycrew
| +|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|julionav
julionav
|SplittyDev
SplittyDev
| +|mdp
mdp
|napter
napter
|ross
ross
|philfung
philfung
|dairui1
dairui1
|dqroid
dqroid
| +|forestyoo
forestyoo
|GOODBOY008
GOODBOY008
|hatsu38
hatsu38
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
| +|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
| +|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|vladstudio
vladstudio
|tmsjngx0
tmsjngx0
| +|tgfjt
tgfjt
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
|student20880
student20880
| +|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
|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
| +|kohii
kohii
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
| +|Deon588
Deon588
|dleen
dleen
|devxpain
devxpain
|chadgauth
chadgauth
|brunobergher
brunobergher
|thecolorblue
thecolorblue
| +|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
| +|HadesArchitect
HadesArchitect
|alarno
alarno
|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
| +|AMHesch
AMHesch
|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
| +|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|kvokka
kvokka
|ecmasx
ecmasx
|mollux
mollux
| +|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
| +|KanTakahiro
KanTakahiro
|ksze
ksze
|Jdo300
Jdo300
|hesara
hesara
|DeXtroTip
DeXtroTip
|pfitz
pfitz
| +|celestial-vault
celestial-vault
| | | | | | ## Licentie diff --git a/locales/pl/README.md b/locales/pl/README.md index 6b569ca4d37..351d755a295 100644 --- a/locales/pl/README.md +++ b/locales/pl/README.md @@ -181,42 +181,40 @@ Kochamy wkład społeczności! Zacznij od przeczytania naszego [CONTRIBUTING.md] Dziękujemy wszystkim naszym współtwórcom, którzy pomogli ulepszyć Roo Code! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| joemanley201
joemanley201
| -| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| jr
jr
| MuriloFP
MuriloFP
| -| elianiva
elianiva
| d-oit
d-oit
| punkpeye
punkpeye
| wkordalski
wkordalski
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -| monotykamary
monotykamary
| cannuri
cannuri
| xyOz-dev
xyOz-dev
| feifei325
feifei325
| zhangtony239
zhangtony239
| qdaxb
qdaxb
| -| shariqriazz
shariqriazz
| pugazhendhi-m
pugazhendhi-m
| vigneshsubbiah16
vigneshsubbiah16
| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| -| chrarnoldus
chrarnoldus
| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| psv2522
psv2522
| Premshay
Premshay
| lupuletic
lupuletic
| -| kiwina
kiwina
| aheizi
aheizi
| PeterDaveHello
PeterDaveHello
| afshawnlotfi
afshawnlotfi
| RaySinner
RaySinner
| nbihan-mediware
nbihan-mediware
| -| ChuKhaLi
ChuKhaLi
| hassoncs
hassoncs
| emshvac
emshvac
| kyle-apex
kyle-apex
| noritaka1166
noritaka1166
| pdecat
pdecat
| -| SannidhyaSah
SannidhyaSah
| StevenTCramer
StevenTCramer
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dleffel
dleffel
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| Ruakij
Ruakij
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| dlab-anton
dlab-anton
| eonghk
eonghk
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| -| yt3trees
yt3trees
| benzntech
benzntech
| axkirillov
axkirillov
| anton-otee
anton-otee
| bramburn
bramburn
| olearycrew
olearycrew
| -| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| ross
ross
| philfung
philfung
| dairui1
dairui1
| dqroid
dqroid
| -| forestyoo
forestyoo
| GOODBOY008
GOODBOY008
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| vladstudio
vladstudio
| tmsjngx0
tmsjngx0
| -| tgfjt
tgfjt
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| student20880
student20880
| -| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| seedlord
seedlord
| 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
| -| kohii
kohii
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| devxpain
devxpain
| chadgauth
chadgauth
| brunobergher
brunobergher
| thecolorblue
thecolorblue
| -| bogdan0083
bogdan0083
| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| -| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| -| AMHesch
AMHesch
| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| -| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| -| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| -| KanTakahiro
KanTakahiro
| ksze
ksze
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| -| celestial-vault
celestial-vault
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|hannesrudolph
hannesrudolph
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|canrobins13
canrobins13
|stea9499
stea9499
|joemanley201
joemanley201
| +|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
|NyxJae
NyxJae
|jr
jr
|MuriloFP
MuriloFP
| +|elianiva
elianiva
|d-oit
d-oit
|punkpeye
punkpeye
|wkordalski
wkordalski
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|monotykamary
monotykamary
|cannuri
cannuri
|xyOz-dev
xyOz-dev
|feifei325
feifei325
|zhangtony239
zhangtony239
|qdaxb
qdaxb
| +|shariqriazz
shariqriazz
|pugazhendhi-m
pugazhendhi-m
|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
| +|chrarnoldus
chrarnoldus
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|psv2522
psv2522
|Premshay
Premshay
|lupuletic
lupuletic
| +|kiwina
kiwina
|aheizi
aheizi
|PeterDaveHello
PeterDaveHello
|afshawnlotfi
afshawnlotfi
|RaySinner
RaySinner
|nbihan-mediware
nbihan-mediware
| +|ChuKhaLi
ChuKhaLi
|hassoncs
hassoncs
|emshvac
emshvac
|kyle-apex
kyle-apex
|noritaka1166
noritaka1166
|pdecat
pdecat
| +|SannidhyaSah
SannidhyaSah
|StevenTCramer
StevenTCramer
|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
| +|dleffel
dleffel
|arthurauffray
arthurauffray
|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
| +|Ruakij
Ruakij
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
| +|taisukeoe
taisukeoe
|avtc
avtc
|dlab-anton
dlab-anton
|eonghk
eonghk
|kcwhite
kcwhite
|ronyblum
ronyblum
| +|teddyOOXX
teddyOOXX
|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
| +|yt3trees
yt3trees
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
|bramburn
bramburn
|olearycrew
olearycrew
| +|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|julionav
julionav
|SplittyDev
SplittyDev
| +|mdp
mdp
|napter
napter
|ross
ross
|philfung
philfung
|dairui1
dairui1
|dqroid
dqroid
| +|forestyoo
forestyoo
|GOODBOY008
GOODBOY008
|hatsu38
hatsu38
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
| +|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
| +|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|vladstudio
vladstudio
|tmsjngx0
tmsjngx0
| +|tgfjt
tgfjt
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
|student20880
student20880
| +|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
|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
| +|kohii
kohii
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
| +|Deon588
Deon588
|dleen
dleen
|devxpain
devxpain
|chadgauth
chadgauth
|brunobergher
brunobergher
|thecolorblue
thecolorblue
| +|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
| +|HadesArchitect
HadesArchitect
|alarno
alarno
|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
| +|AMHesch
AMHesch
|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
| +|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|kvokka
kvokka
|ecmasx
ecmasx
|mollux
mollux
| +|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
| +|KanTakahiro
KanTakahiro
|ksze
ksze
|Jdo300
Jdo300
|hesara
hesara
|DeXtroTip
DeXtroTip
|pfitz
pfitz
| +|celestial-vault
celestial-vault
| | | | | | ## Licencja diff --git a/locales/pt-BR/README.md b/locales/pt-BR/README.md index 839a1338059..d773d8fcca5 100644 --- a/locales/pt-BR/README.md +++ b/locales/pt-BR/README.md @@ -181,42 +181,40 @@ Adoramos contribuições da comunidade! Comece lendo nosso [CONTRIBUTING.md](CON Obrigado a todos os nossos contribuidores que ajudaram a tornar o Roo Code melhor! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| joemanley201
joemanley201
| -| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| jr
jr
| MuriloFP
MuriloFP
| -| elianiva
elianiva
| d-oit
d-oit
| punkpeye
punkpeye
| wkordalski
wkordalski
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -| monotykamary
monotykamary
| cannuri
cannuri
| xyOz-dev
xyOz-dev
| feifei325
feifei325
| zhangtony239
zhangtony239
| qdaxb
qdaxb
| -| shariqriazz
shariqriazz
| pugazhendhi-m
pugazhendhi-m
| vigneshsubbiah16
vigneshsubbiah16
| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| -| chrarnoldus
chrarnoldus
| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| psv2522
psv2522
| Premshay
Premshay
| lupuletic
lupuletic
| -| kiwina
kiwina
| aheizi
aheizi
| PeterDaveHello
PeterDaveHello
| afshawnlotfi
afshawnlotfi
| RaySinner
RaySinner
| nbihan-mediware
nbihan-mediware
| -| ChuKhaLi
ChuKhaLi
| hassoncs
hassoncs
| emshvac
emshvac
| kyle-apex
kyle-apex
| noritaka1166
noritaka1166
| pdecat
pdecat
| -| SannidhyaSah
SannidhyaSah
| StevenTCramer
StevenTCramer
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dleffel
dleffel
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| Ruakij
Ruakij
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| dlab-anton
dlab-anton
| eonghk
eonghk
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| -| yt3trees
yt3trees
| benzntech
benzntech
| axkirillov
axkirillov
| anton-otee
anton-otee
| bramburn
bramburn
| olearycrew
olearycrew
| -| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| ross
ross
| philfung
philfung
| dairui1
dairui1
| dqroid
dqroid
| -| forestyoo
forestyoo
| GOODBOY008
GOODBOY008
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| vladstudio
vladstudio
| tmsjngx0
tmsjngx0
| -| tgfjt
tgfjt
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| student20880
student20880
| -| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| seedlord
seedlord
| 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
| -| kohii
kohii
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| devxpain
devxpain
| chadgauth
chadgauth
| brunobergher
brunobergher
| thecolorblue
thecolorblue
| -| bogdan0083
bogdan0083
| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| -| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| -| AMHesch
AMHesch
| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| -| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| -| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| -| KanTakahiro
KanTakahiro
| ksze
ksze
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| -| celestial-vault
celestial-vault
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|hannesrudolph
hannesrudolph
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|canrobins13
canrobins13
|stea9499
stea9499
|joemanley201
joemanley201
| +|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
|NyxJae
NyxJae
|jr
jr
|MuriloFP
MuriloFP
| +|elianiva
elianiva
|d-oit
d-oit
|punkpeye
punkpeye
|wkordalski
wkordalski
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|monotykamary
monotykamary
|cannuri
cannuri
|xyOz-dev
xyOz-dev
|feifei325
feifei325
|zhangtony239
zhangtony239
|qdaxb
qdaxb
| +|shariqriazz
shariqriazz
|pugazhendhi-m
pugazhendhi-m
|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
| +|chrarnoldus
chrarnoldus
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|psv2522
psv2522
|Premshay
Premshay
|lupuletic
lupuletic
| +|kiwina
kiwina
|aheizi
aheizi
|PeterDaveHello
PeterDaveHello
|afshawnlotfi
afshawnlotfi
|RaySinner
RaySinner
|nbihan-mediware
nbihan-mediware
| +|ChuKhaLi
ChuKhaLi
|hassoncs
hassoncs
|emshvac
emshvac
|kyle-apex
kyle-apex
|noritaka1166
noritaka1166
|pdecat
pdecat
| +|SannidhyaSah
SannidhyaSah
|StevenTCramer
StevenTCramer
|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
| +|dleffel
dleffel
|arthurauffray
arthurauffray
|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
| +|Ruakij
Ruakij
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
| +|taisukeoe
taisukeoe
|avtc
avtc
|dlab-anton
dlab-anton
|eonghk
eonghk
|kcwhite
kcwhite
|ronyblum
ronyblum
| +|teddyOOXX
teddyOOXX
|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
| +|yt3trees
yt3trees
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
|bramburn
bramburn
|olearycrew
olearycrew
| +|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|julionav
julionav
|SplittyDev
SplittyDev
| +|mdp
mdp
|napter
napter
|ross
ross
|philfung
philfung
|dairui1
dairui1
|dqroid
dqroid
| +|forestyoo
forestyoo
|GOODBOY008
GOODBOY008
|hatsu38
hatsu38
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
| +|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
| +|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|vladstudio
vladstudio
|tmsjngx0
tmsjngx0
| +|tgfjt
tgfjt
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
|student20880
student20880
| +|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
|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
| +|kohii
kohii
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
| +|Deon588
Deon588
|dleen
dleen
|devxpain
devxpain
|chadgauth
chadgauth
|brunobergher
brunobergher
|thecolorblue
thecolorblue
| +|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
| +|HadesArchitect
HadesArchitect
|alarno
alarno
|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
| +|AMHesch
AMHesch
|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
| +|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|kvokka
kvokka
|ecmasx
ecmasx
|mollux
mollux
| +|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
| +|KanTakahiro
KanTakahiro
|ksze
ksze
|Jdo300
Jdo300
|hesara
hesara
|DeXtroTip
DeXtroTip
|pfitz
pfitz
| +|celestial-vault
celestial-vault
| | | | | | ## Licença diff --git a/locales/ru/README.md b/locales/ru/README.md index 09cb15c22cb..368a70a9865 100644 --- a/locales/ru/README.md +++ b/locales/ru/README.md @@ -181,42 +181,40 @@ code --install-extension bin/roo-cline-.vsix Спасибо всем нашим участникам, которые помогли сделать Roo Code лучше! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| joemanley201
joemanley201
| -| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| jr
jr
| MuriloFP
MuriloFP
| -| elianiva
elianiva
| d-oit
d-oit
| punkpeye
punkpeye
| wkordalski
wkordalski
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -| monotykamary
monotykamary
| cannuri
cannuri
| xyOz-dev
xyOz-dev
| feifei325
feifei325
| zhangtony239
zhangtony239
| qdaxb
qdaxb
| -| shariqriazz
shariqriazz
| pugazhendhi-m
pugazhendhi-m
| vigneshsubbiah16
vigneshsubbiah16
| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| -| chrarnoldus
chrarnoldus
| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| psv2522
psv2522
| Premshay
Premshay
| lupuletic
lupuletic
| -| kiwina
kiwina
| aheizi
aheizi
| PeterDaveHello
PeterDaveHello
| afshawnlotfi
afshawnlotfi
| RaySinner
RaySinner
| nbihan-mediware
nbihan-mediware
| -| ChuKhaLi
ChuKhaLi
| hassoncs
hassoncs
| emshvac
emshvac
| kyle-apex
kyle-apex
| noritaka1166
noritaka1166
| pdecat
pdecat
| -| SannidhyaSah
SannidhyaSah
| StevenTCramer
StevenTCramer
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dleffel
dleffel
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| Ruakij
Ruakij
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| dlab-anton
dlab-anton
| eonghk
eonghk
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| -| yt3trees
yt3trees
| benzntech
benzntech
| axkirillov
axkirillov
| anton-otee
anton-otee
| bramburn
bramburn
| olearycrew
olearycrew
| -| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| ross
ross
| philfung
philfung
| dairui1
dairui1
| dqroid
dqroid
| -| forestyoo
forestyoo
| GOODBOY008
GOODBOY008
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| vladstudio
vladstudio
| tmsjngx0
tmsjngx0
| -| tgfjt
tgfjt
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| student20880
student20880
| -| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| seedlord
seedlord
| 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
| -| kohii
kohii
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| devxpain
devxpain
| chadgauth
chadgauth
| brunobergher
brunobergher
| thecolorblue
thecolorblue
| -| bogdan0083
bogdan0083
| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| -| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| -| AMHesch
AMHesch
| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| -| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| -| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| -| KanTakahiro
KanTakahiro
| ksze
ksze
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| -| celestial-vault
celestial-vault
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|hannesrudolph
hannesrudolph
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|canrobins13
canrobins13
|stea9499
stea9499
|joemanley201
joemanley201
| +|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
|NyxJae
NyxJae
|jr
jr
|MuriloFP
MuriloFP
| +|elianiva
elianiva
|d-oit
d-oit
|punkpeye
punkpeye
|wkordalski
wkordalski
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|monotykamary
monotykamary
|cannuri
cannuri
|xyOz-dev
xyOz-dev
|feifei325
feifei325
|zhangtony239
zhangtony239
|qdaxb
qdaxb
| +|shariqriazz
shariqriazz
|pugazhendhi-m
pugazhendhi-m
|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
| +|chrarnoldus
chrarnoldus
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|psv2522
psv2522
|Premshay
Premshay
|lupuletic
lupuletic
| +|kiwina
kiwina
|aheizi
aheizi
|PeterDaveHello
PeterDaveHello
|afshawnlotfi
afshawnlotfi
|RaySinner
RaySinner
|nbihan-mediware
nbihan-mediware
| +|ChuKhaLi
ChuKhaLi
|hassoncs
hassoncs
|emshvac
emshvac
|kyle-apex
kyle-apex
|noritaka1166
noritaka1166
|pdecat
pdecat
| +|SannidhyaSah
SannidhyaSah
|StevenTCramer
StevenTCramer
|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
| +|dleffel
dleffel
|arthurauffray
arthurauffray
|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
| +|Ruakij
Ruakij
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
| +|taisukeoe
taisukeoe
|avtc
avtc
|dlab-anton
dlab-anton
|eonghk
eonghk
|kcwhite
kcwhite
|ronyblum
ronyblum
| +|teddyOOXX
teddyOOXX
|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
| +|yt3trees
yt3trees
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
|bramburn
bramburn
|olearycrew
olearycrew
| +|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|julionav
julionav
|SplittyDev
SplittyDev
| +|mdp
mdp
|napter
napter
|ross
ross
|philfung
philfung
|dairui1
dairui1
|dqroid
dqroid
| +|forestyoo
forestyoo
|GOODBOY008
GOODBOY008
|hatsu38
hatsu38
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
| +|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
| +|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|vladstudio
vladstudio
|tmsjngx0
tmsjngx0
| +|tgfjt
tgfjt
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
|student20880
student20880
| +|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
|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
| +|kohii
kohii
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
| +|Deon588
Deon588
|dleen
dleen
|devxpain
devxpain
|chadgauth
chadgauth
|brunobergher
brunobergher
|thecolorblue
thecolorblue
| +|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
| +|HadesArchitect
HadesArchitect
|alarno
alarno
|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
| +|AMHesch
AMHesch
|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
| +|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|kvokka
kvokka
|ecmasx
ecmasx
|mollux
mollux
| +|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
| +|KanTakahiro
KanTakahiro
|ksze
ksze
|Jdo300
Jdo300
|hesara
hesara
|DeXtroTip
DeXtroTip
|pfitz
pfitz
| +|celestial-vault
celestial-vault
| | | | | | ## Лицензия diff --git a/locales/tr/README.md b/locales/tr/README.md index 41e443e7f7b..6a039e79b11 100644 --- a/locales/tr/README.md +++ b/locales/tr/README.md @@ -181,42 +181,40 @@ Topluluk katkılarını seviyoruz! [CONTRIBUTING.md](CONTRIBUTING.md) dosyasın Roo Code'u daha iyi hale getirmeye yardımcı olan tüm katkıda bulunanlara teşekkür ederiz! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| joemanley201
joemanley201
| -| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| jr
jr
| MuriloFP
MuriloFP
| -| elianiva
elianiva
| d-oit
d-oit
| punkpeye
punkpeye
| wkordalski
wkordalski
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -| monotykamary
monotykamary
| cannuri
cannuri
| xyOz-dev
xyOz-dev
| feifei325
feifei325
| zhangtony239
zhangtony239
| qdaxb
qdaxb
| -| shariqriazz
shariqriazz
| pugazhendhi-m
pugazhendhi-m
| vigneshsubbiah16
vigneshsubbiah16
| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| -| chrarnoldus
chrarnoldus
| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| psv2522
psv2522
| Premshay
Premshay
| lupuletic
lupuletic
| -| kiwina
kiwina
| aheizi
aheizi
| PeterDaveHello
PeterDaveHello
| afshawnlotfi
afshawnlotfi
| RaySinner
RaySinner
| nbihan-mediware
nbihan-mediware
| -| ChuKhaLi
ChuKhaLi
| hassoncs
hassoncs
| emshvac
emshvac
| kyle-apex
kyle-apex
| noritaka1166
noritaka1166
| pdecat
pdecat
| -| SannidhyaSah
SannidhyaSah
| StevenTCramer
StevenTCramer
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dleffel
dleffel
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| Ruakij
Ruakij
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| dlab-anton
dlab-anton
| eonghk
eonghk
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| -| yt3trees
yt3trees
| benzntech
benzntech
| axkirillov
axkirillov
| anton-otee
anton-otee
| bramburn
bramburn
| olearycrew
olearycrew
| -| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| ross
ross
| philfung
philfung
| dairui1
dairui1
| dqroid
dqroid
| -| forestyoo
forestyoo
| GOODBOY008
GOODBOY008
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| vladstudio
vladstudio
| tmsjngx0
tmsjngx0
| -| tgfjt
tgfjt
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| student20880
student20880
| -| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| seedlord
seedlord
| 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
| -| kohii
kohii
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| devxpain
devxpain
| chadgauth
chadgauth
| brunobergher
brunobergher
| thecolorblue
thecolorblue
| -| bogdan0083
bogdan0083
| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| -| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| -| AMHesch
AMHesch
| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| -| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| -| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| -| KanTakahiro
KanTakahiro
| ksze
ksze
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| -| celestial-vault
celestial-vault
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|hannesrudolph
hannesrudolph
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|canrobins13
canrobins13
|stea9499
stea9499
|joemanley201
joemanley201
| +|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
|NyxJae
NyxJae
|jr
jr
|MuriloFP
MuriloFP
| +|elianiva
elianiva
|d-oit
d-oit
|punkpeye
punkpeye
|wkordalski
wkordalski
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|monotykamary
monotykamary
|cannuri
cannuri
|xyOz-dev
xyOz-dev
|feifei325
feifei325
|zhangtony239
zhangtony239
|qdaxb
qdaxb
| +|shariqriazz
shariqriazz
|pugazhendhi-m
pugazhendhi-m
|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
| +|chrarnoldus
chrarnoldus
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|psv2522
psv2522
|Premshay
Premshay
|lupuletic
lupuletic
| +|kiwina
kiwina
|aheizi
aheizi
|PeterDaveHello
PeterDaveHello
|afshawnlotfi
afshawnlotfi
|RaySinner
RaySinner
|nbihan-mediware
nbihan-mediware
| +|ChuKhaLi
ChuKhaLi
|hassoncs
hassoncs
|emshvac
emshvac
|kyle-apex
kyle-apex
|noritaka1166
noritaka1166
|pdecat
pdecat
| +|SannidhyaSah
SannidhyaSah
|StevenTCramer
StevenTCramer
|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
| +|dleffel
dleffel
|arthurauffray
arthurauffray
|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
| +|Ruakij
Ruakij
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
| +|taisukeoe
taisukeoe
|avtc
avtc
|dlab-anton
dlab-anton
|eonghk
eonghk
|kcwhite
kcwhite
|ronyblum
ronyblum
| +|teddyOOXX
teddyOOXX
|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
| +|yt3trees
yt3trees
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
|bramburn
bramburn
|olearycrew
olearycrew
| +|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|julionav
julionav
|SplittyDev
SplittyDev
| +|mdp
mdp
|napter
napter
|ross
ross
|philfung
philfung
|dairui1
dairui1
|dqroid
dqroid
| +|forestyoo
forestyoo
|GOODBOY008
GOODBOY008
|hatsu38
hatsu38
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
| +|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
| +|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|vladstudio
vladstudio
|tmsjngx0
tmsjngx0
| +|tgfjt
tgfjt
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
|student20880
student20880
| +|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
|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
| +|kohii
kohii
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
| +|Deon588
Deon588
|dleen
dleen
|devxpain
devxpain
|chadgauth
chadgauth
|brunobergher
brunobergher
|thecolorblue
thecolorblue
| +|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
| +|HadesArchitect
HadesArchitect
|alarno
alarno
|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
| +|AMHesch
AMHesch
|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
| +|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|kvokka
kvokka
|ecmasx
ecmasx
|mollux
mollux
| +|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
| +|KanTakahiro
KanTakahiro
|ksze
ksze
|Jdo300
Jdo300
|hesara
hesara
|DeXtroTip
DeXtroTip
|pfitz
pfitz
| +|celestial-vault
celestial-vault
| | | | | | ## Lisans diff --git a/locales/vi/README.md b/locales/vi/README.md index c535e8b291d..2e59bb759f7 100644 --- a/locales/vi/README.md +++ b/locales/vi/README.md @@ -181,42 +181,40 @@ Chúng tôi rất hoan nghênh đóng góp từ cộng đồng! Bắt đầu b Cảm ơn tất cả những người đóng góp đã giúp cải thiện Roo Code! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| joemanley201
joemanley201
| -| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| jr
jr
| MuriloFP
MuriloFP
| -| elianiva
elianiva
| d-oit
d-oit
| punkpeye
punkpeye
| wkordalski
wkordalski
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -| monotykamary
monotykamary
| cannuri
cannuri
| xyOz-dev
xyOz-dev
| feifei325
feifei325
| zhangtony239
zhangtony239
| qdaxb
qdaxb
| -| shariqriazz
shariqriazz
| pugazhendhi-m
pugazhendhi-m
| vigneshsubbiah16
vigneshsubbiah16
| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| -| chrarnoldus
chrarnoldus
| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| psv2522
psv2522
| Premshay
Premshay
| lupuletic
lupuletic
| -| kiwina
kiwina
| aheizi
aheizi
| PeterDaveHello
PeterDaveHello
| afshawnlotfi
afshawnlotfi
| RaySinner
RaySinner
| nbihan-mediware
nbihan-mediware
| -| ChuKhaLi
ChuKhaLi
| hassoncs
hassoncs
| emshvac
emshvac
| kyle-apex
kyle-apex
| noritaka1166
noritaka1166
| pdecat
pdecat
| -| SannidhyaSah
SannidhyaSah
| StevenTCramer
StevenTCramer
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dleffel
dleffel
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| Ruakij
Ruakij
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| dlab-anton
dlab-anton
| eonghk
eonghk
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| -| yt3trees
yt3trees
| benzntech
benzntech
| axkirillov
axkirillov
| anton-otee
anton-otee
| bramburn
bramburn
| olearycrew
olearycrew
| -| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| ross
ross
| philfung
philfung
| dairui1
dairui1
| dqroid
dqroid
| -| forestyoo
forestyoo
| GOODBOY008
GOODBOY008
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| vladstudio
vladstudio
| tmsjngx0
tmsjngx0
| -| tgfjt
tgfjt
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| student20880
student20880
| -| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| seedlord
seedlord
| 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
| -| kohii
kohii
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| devxpain
devxpain
| chadgauth
chadgauth
| brunobergher
brunobergher
| thecolorblue
thecolorblue
| -| bogdan0083
bogdan0083
| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| -| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| -| AMHesch
AMHesch
| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| -| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| -| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| -| KanTakahiro
KanTakahiro
| ksze
ksze
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| -| celestial-vault
celestial-vault
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|hannesrudolph
hannesrudolph
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|canrobins13
canrobins13
|stea9499
stea9499
|joemanley201
joemanley201
| +|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
|NyxJae
NyxJae
|jr
jr
|MuriloFP
MuriloFP
| +|elianiva
elianiva
|d-oit
d-oit
|punkpeye
punkpeye
|wkordalski
wkordalski
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|monotykamary
monotykamary
|cannuri
cannuri
|xyOz-dev
xyOz-dev
|feifei325
feifei325
|zhangtony239
zhangtony239
|qdaxb
qdaxb
| +|shariqriazz
shariqriazz
|pugazhendhi-m
pugazhendhi-m
|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
| +|chrarnoldus
chrarnoldus
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|psv2522
psv2522
|Premshay
Premshay
|lupuletic
lupuletic
| +|kiwina
kiwina
|aheizi
aheizi
|PeterDaveHello
PeterDaveHello
|afshawnlotfi
afshawnlotfi
|RaySinner
RaySinner
|nbihan-mediware
nbihan-mediware
| +|ChuKhaLi
ChuKhaLi
|hassoncs
hassoncs
|emshvac
emshvac
|kyle-apex
kyle-apex
|noritaka1166
noritaka1166
|pdecat
pdecat
| +|SannidhyaSah
SannidhyaSah
|StevenTCramer
StevenTCramer
|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
| +|dleffel
dleffel
|arthurauffray
arthurauffray
|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
| +|Ruakij
Ruakij
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
| +|taisukeoe
taisukeoe
|avtc
avtc
|dlab-anton
dlab-anton
|eonghk
eonghk
|kcwhite
kcwhite
|ronyblum
ronyblum
| +|teddyOOXX
teddyOOXX
|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
| +|yt3trees
yt3trees
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
|bramburn
bramburn
|olearycrew
olearycrew
| +|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|julionav
julionav
|SplittyDev
SplittyDev
| +|mdp
mdp
|napter
napter
|ross
ross
|philfung
philfung
|dairui1
dairui1
|dqroid
dqroid
| +|forestyoo
forestyoo
|GOODBOY008
GOODBOY008
|hatsu38
hatsu38
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
| +|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
| +|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|vladstudio
vladstudio
|tmsjngx0
tmsjngx0
| +|tgfjt
tgfjt
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
|student20880
student20880
| +|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
|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
| +|kohii
kohii
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
| +|Deon588
Deon588
|dleen
dleen
|devxpain
devxpain
|chadgauth
chadgauth
|brunobergher
brunobergher
|thecolorblue
thecolorblue
| +|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
| +|HadesArchitect
HadesArchitect
|alarno
alarno
|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
| +|AMHesch
AMHesch
|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
| +|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|kvokka
kvokka
|ecmasx
ecmasx
|mollux
mollux
| +|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
| +|KanTakahiro
KanTakahiro
|ksze
ksze
|Jdo300
Jdo300
|hesara
hesara
|DeXtroTip
DeXtroTip
|pfitz
pfitz
| +|celestial-vault
celestial-vault
| | | | | | ## Giấy Phép diff --git a/locales/zh-CN/README.md b/locales/zh-CN/README.md index c8bc7147d9d..dc8b3389418 100644 --- a/locales/zh-CN/README.md +++ b/locales/zh-CN/README.md @@ -181,42 +181,40 @@ code --install-extension bin/roo-cline-.vsix 感谢所有帮助改进 Roo Code 的贡献者! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| joemanley201
joemanley201
| -| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| jr
jr
| MuriloFP
MuriloFP
| -| elianiva
elianiva
| d-oit
d-oit
| punkpeye
punkpeye
| wkordalski
wkordalski
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -| monotykamary
monotykamary
| cannuri
cannuri
| xyOz-dev
xyOz-dev
| feifei325
feifei325
| zhangtony239
zhangtony239
| qdaxb
qdaxb
| -| shariqriazz
shariqriazz
| pugazhendhi-m
pugazhendhi-m
| vigneshsubbiah16
vigneshsubbiah16
| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| -| chrarnoldus
chrarnoldus
| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| psv2522
psv2522
| Premshay
Premshay
| lupuletic
lupuletic
| -| kiwina
kiwina
| aheizi
aheizi
| PeterDaveHello
PeterDaveHello
| afshawnlotfi
afshawnlotfi
| RaySinner
RaySinner
| nbihan-mediware
nbihan-mediware
| -| ChuKhaLi
ChuKhaLi
| hassoncs
hassoncs
| emshvac
emshvac
| kyle-apex
kyle-apex
| noritaka1166
noritaka1166
| pdecat
pdecat
| -| SannidhyaSah
SannidhyaSah
| StevenTCramer
StevenTCramer
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dleffel
dleffel
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| Ruakij
Ruakij
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| dlab-anton
dlab-anton
| eonghk
eonghk
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| -| yt3trees
yt3trees
| benzntech
benzntech
| axkirillov
axkirillov
| anton-otee
anton-otee
| bramburn
bramburn
| olearycrew
olearycrew
| -| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| ross
ross
| philfung
philfung
| dairui1
dairui1
| dqroid
dqroid
| -| forestyoo
forestyoo
| GOODBOY008
GOODBOY008
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| vladstudio
vladstudio
| tmsjngx0
tmsjngx0
| -| tgfjt
tgfjt
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| student20880
student20880
| -| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| seedlord
seedlord
| 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
| -| kohii
kohii
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| devxpain
devxpain
| chadgauth
chadgauth
| brunobergher
brunobergher
| thecolorblue
thecolorblue
| -| bogdan0083
bogdan0083
| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| -| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| -| AMHesch
AMHesch
| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| -| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| -| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| -| KanTakahiro
KanTakahiro
| ksze
ksze
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| -| celestial-vault
celestial-vault
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|hannesrudolph
hannesrudolph
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|canrobins13
canrobins13
|stea9499
stea9499
|joemanley201
joemanley201
| +|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
|NyxJae
NyxJae
|jr
jr
|MuriloFP
MuriloFP
| +|elianiva
elianiva
|d-oit
d-oit
|punkpeye
punkpeye
|wkordalski
wkordalski
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|monotykamary
monotykamary
|cannuri
cannuri
|xyOz-dev
xyOz-dev
|feifei325
feifei325
|zhangtony239
zhangtony239
|qdaxb
qdaxb
| +|shariqriazz
shariqriazz
|pugazhendhi-m
pugazhendhi-m
|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
| +|chrarnoldus
chrarnoldus
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|psv2522
psv2522
|Premshay
Premshay
|lupuletic
lupuletic
| +|kiwina
kiwina
|aheizi
aheizi
|PeterDaveHello
PeterDaveHello
|afshawnlotfi
afshawnlotfi
|RaySinner
RaySinner
|nbihan-mediware
nbihan-mediware
| +|ChuKhaLi
ChuKhaLi
|hassoncs
hassoncs
|emshvac
emshvac
|kyle-apex
kyle-apex
|noritaka1166
noritaka1166
|pdecat
pdecat
| +|SannidhyaSah
SannidhyaSah
|StevenTCramer
StevenTCramer
|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
| +|dleffel
dleffel
|arthurauffray
arthurauffray
|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
| +|Ruakij
Ruakij
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
| +|taisukeoe
taisukeoe
|avtc
avtc
|dlab-anton
dlab-anton
|eonghk
eonghk
|kcwhite
kcwhite
|ronyblum
ronyblum
| +|teddyOOXX
teddyOOXX
|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
| +|yt3trees
yt3trees
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
|bramburn
bramburn
|olearycrew
olearycrew
| +|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|julionav
julionav
|SplittyDev
SplittyDev
| +|mdp
mdp
|napter
napter
|ross
ross
|philfung
philfung
|dairui1
dairui1
|dqroid
dqroid
| +|forestyoo
forestyoo
|GOODBOY008
GOODBOY008
|hatsu38
hatsu38
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
| +|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
| +|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|vladstudio
vladstudio
|tmsjngx0
tmsjngx0
| +|tgfjt
tgfjt
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
|student20880
student20880
| +|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
|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
| +|kohii
kohii
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
| +|Deon588
Deon588
|dleen
dleen
|devxpain
devxpain
|chadgauth
chadgauth
|brunobergher
brunobergher
|thecolorblue
thecolorblue
| +|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
| +|HadesArchitect
HadesArchitect
|alarno
alarno
|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
| +|AMHesch
AMHesch
|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
| +|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|kvokka
kvokka
|ecmasx
ecmasx
|mollux
mollux
| +|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
| +|KanTakahiro
KanTakahiro
|ksze
ksze
|Jdo300
Jdo300
|hesara
hesara
|DeXtroTip
DeXtroTip
|pfitz
pfitz
| +|celestial-vault
celestial-vault
| | | | | | ## 许可证 diff --git a/locales/zh-TW/README.md b/locales/zh-TW/README.md index 26447ae72ae..85dfce876b5 100644 --- a/locales/zh-TW/README.md +++ b/locales/zh-TW/README.md @@ -182,42 +182,40 @@ code --install-extension bin/roo-cline-.vsix 感謝所有幫助改進 Roo Code 的貢獻者! - -| mrubens
mrubens
| saoudrizwan
saoudrizwan
| cte
cte
| samhvw8
samhvw8
| daniel-lxs
daniel-lxs
| hannesrudolph
hannesrudolph
| -| :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | -| KJ7LNW
KJ7LNW
| a8trejo
a8trejo
| ColemanRoo
ColemanRoo
| canrobins13
canrobins13
| stea9499
stea9499
| joemanley201
joemanley201
| -| System233
System233
| jquanton
jquanton
| nissa-seru
nissa-seru
| NyxJae
NyxJae
| jr
jr
| MuriloFP
MuriloFP
| -| elianiva
elianiva
| d-oit
d-oit
| punkpeye
punkpeye
| wkordalski
wkordalski
| sachasayan
sachasayan
| Smartsheet-JB-Brown
Smartsheet-JB-Brown
| -| monotykamary
monotykamary
| cannuri
cannuri
| xyOz-dev
xyOz-dev
| feifei325
feifei325
| zhangtony239
zhangtony239
| qdaxb
qdaxb
| -| shariqriazz
shariqriazz
| pugazhendhi-m
pugazhendhi-m
| vigneshsubbiah16
vigneshsubbiah16
| lloydchang
lloydchang
| dtrugman
dtrugman
| Szpadel
Szpadel
| -| chrarnoldus
chrarnoldus
| diarmidmackenzie
diarmidmackenzie
| olweraltuve
olweraltuve
| psv2522
psv2522
| Premshay
Premshay
| lupuletic
lupuletic
| -| kiwina
kiwina
| aheizi
aheizi
| PeterDaveHello
PeterDaveHello
| afshawnlotfi
afshawnlotfi
| RaySinner
RaySinner
| nbihan-mediware
nbihan-mediware
| -| ChuKhaLi
ChuKhaLi
| hassoncs
hassoncs
| emshvac
emshvac
| kyle-apex
kyle-apex
| noritaka1166
noritaka1166
| pdecat
pdecat
| -| SannidhyaSah
SannidhyaSah
| StevenTCramer
StevenTCramer
| Lunchb0ne
Lunchb0ne
| SmartManoj
SmartManoj
| vagadiya
vagadiya
| slytechnical
slytechnical
| -| dleffel
dleffel
| arthurauffray
arthurauffray
| upamune
upamune
| NamesMT
NamesMT
| taylorwilsdon
taylorwilsdon
| sammcj
sammcj
| -| Ruakij
Ruakij
| p12tic
p12tic
| gtaylor
gtaylor
| aitoroses
aitoroses
| mr-ryan-james
mr-ryan-james
| heyseth
heyseth
| -| taisukeoe
taisukeoe
| avtc
avtc
| dlab-anton
dlab-anton
| eonghk
eonghk
| kcwhite
kcwhite
| ronyblum
ronyblum
| -| teddyOOXX
teddyOOXX
| vincentsong
vincentsong
| yongjer
yongjer
| zeozeozeo
zeozeozeo
| ashktn
ashktn
| franekp
franekp
| -| yt3trees
yt3trees
| benzntech
benzntech
| axkirillov
axkirillov
| anton-otee
anton-otee
| bramburn
bramburn
| olearycrew
olearycrew
| -| snoyiatk
snoyiatk
| GitlyHallows
GitlyHallows
| jcbdev
jcbdev
| Chenjiayuan195
Chenjiayuan195
| julionav
julionav
| SplittyDev
SplittyDev
| -| mdp
mdp
| napter
napter
| ross
ross
| philfung
philfung
| dairui1
dairui1
| dqroid
dqroid
| -| forestyoo
forestyoo
| GOODBOY008
GOODBOY008
| hatsu38
hatsu38
| hongzio
hongzio
| im47cn
im47cn
| shoopapa
shoopapa
| -| jwcraig
jwcraig
| kinandan
kinandan
| nevermorec
nevermorec
| bannzai
bannzai
| axmo
axmo
| asychin
asychin
| -| amittell
amittell
| Yoshino-Yukitaro
Yoshino-Yukitaro
| Yikai-Liao
Yikai-Liao
| zxdvd
zxdvd
| vladstudio
vladstudio
| tmsjngx0
tmsjngx0
| -| tgfjt
tgfjt
| PretzelVector
PretzelVector
| zetaloop
zetaloop
| cdlliuy
cdlliuy
| user202729
user202729
| student20880
student20880
| -| shohei-ihaya
shohei-ihaya
| shaybc
shaybc
| seedlord
seedlord
| 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
| -| kohii
kohii
| linegel
linegel
| edwin-truthsearch-io
edwin-truthsearch-io
| EamonNerbonne
EamonNerbonne
| dbasclpy
dbasclpy
| dflatline
dflatline
| -| Deon588
Deon588
| dleen
dleen
| devxpain
devxpain
| chadgauth
chadgauth
| brunobergher
brunobergher
| thecolorblue
thecolorblue
| -| bogdan0083
bogdan0083
| Atlogit
Atlogit
| atlasgong
atlasgong
| andreastempsch
andreastempsch
| alasano
alasano
| QuinsZouls
QuinsZouls
| -| HadesArchitect
HadesArchitect
| alarno
alarno
| nexon33
nexon33
| adilhafeez
adilhafeez
| adamwlarson
adamwlarson
| adamhill
adamhill
| -| AMHesch
AMHesch
| maekawataiki
maekawataiki
| AlexandruSmirnov
AlexandruSmirnov
| samsilveira
samsilveira
| 01Rian
01Rian
| RSO
RSO
| -| SECKainersdorfer
SECKainersdorfer
| R-omk
R-omk
| Sarke
Sarke
| kvokka
kvokka
| ecmasx
ecmasx
| mollux
mollux
| -| marvijo-code
marvijo-code
| mamertofabian
mamertofabian
| monkeyDluffy6017
monkeyDluffy6017
| libertyteeth
libertyteeth
| shtse8
shtse8
| Rexarrior
Rexarrior
| -| KanTakahiro
KanTakahiro
| ksze
ksze
| Jdo300
Jdo300
| hesara
hesara
| DeXtroTip
DeXtroTip
| pfitz
pfitz
| -| celestial-vault
celestial-vault
| | | | | | - +|mrubens
mrubens
|saoudrizwan
saoudrizwan
|cte
cte
|samhvw8
samhvw8
|daniel-lxs
daniel-lxs
|hannesrudolph
hannesrudolph
| +|:---:|:---:|:---:|:---:|:---:|:---:| +|KJ7LNW
KJ7LNW
|a8trejo
a8trejo
|ColemanRoo
ColemanRoo
|canrobins13
canrobins13
|stea9499
stea9499
|joemanley201
joemanley201
| +|System233
System233
|jquanton
jquanton
|nissa-seru
nissa-seru
|NyxJae
NyxJae
|jr
jr
|MuriloFP
MuriloFP
| +|elianiva
elianiva
|d-oit
d-oit
|punkpeye
punkpeye
|wkordalski
wkordalski
|sachasayan
sachasayan
|Smartsheet-JB-Brown
Smartsheet-JB-Brown
| +|monotykamary
monotykamary
|cannuri
cannuri
|xyOz-dev
xyOz-dev
|feifei325
feifei325
|zhangtony239
zhangtony239
|qdaxb
qdaxb
| +|shariqriazz
shariqriazz
|pugazhendhi-m
pugazhendhi-m
|vigneshsubbiah16
vigneshsubbiah16
|lloydchang
lloydchang
|dtrugman
dtrugman
|Szpadel
Szpadel
| +|chrarnoldus
chrarnoldus
|diarmidmackenzie
diarmidmackenzie
|olweraltuve
olweraltuve
|psv2522
psv2522
|Premshay
Premshay
|lupuletic
lupuletic
| +|kiwina
kiwina
|aheizi
aheizi
|PeterDaveHello
PeterDaveHello
|afshawnlotfi
afshawnlotfi
|RaySinner
RaySinner
|nbihan-mediware
nbihan-mediware
| +|ChuKhaLi
ChuKhaLi
|hassoncs
hassoncs
|emshvac
emshvac
|kyle-apex
kyle-apex
|noritaka1166
noritaka1166
|pdecat
pdecat
| +|SannidhyaSah
SannidhyaSah
|StevenTCramer
StevenTCramer
|Lunchb0ne
Lunchb0ne
|SmartManoj
SmartManoj
|vagadiya
vagadiya
|slytechnical
slytechnical
| +|dleffel
dleffel
|arthurauffray
arthurauffray
|upamune
upamune
|NamesMT
NamesMT
|taylorwilsdon
taylorwilsdon
|sammcj
sammcj
| +|Ruakij
Ruakij
|p12tic
p12tic
|gtaylor
gtaylor
|aitoroses
aitoroses
|mr-ryan-james
mr-ryan-james
|heyseth
heyseth
| +|taisukeoe
taisukeoe
|avtc
avtc
|dlab-anton
dlab-anton
|eonghk
eonghk
|kcwhite
kcwhite
|ronyblum
ronyblum
| +|teddyOOXX
teddyOOXX
|vincentsong
vincentsong
|yongjer
yongjer
|zeozeozeo
zeozeozeo
|ashktn
ashktn
|franekp
franekp
| +|yt3trees
yt3trees
|benzntech
benzntech
|axkirillov
axkirillov
|anton-otee
anton-otee
|bramburn
bramburn
|olearycrew
olearycrew
| +|snoyiatk
snoyiatk
|GitlyHallows
GitlyHallows
|jcbdev
jcbdev
|Chenjiayuan195
Chenjiayuan195
|julionav
julionav
|SplittyDev
SplittyDev
| +|mdp
mdp
|napter
napter
|ross
ross
|philfung
philfung
|dairui1
dairui1
|dqroid
dqroid
| +|forestyoo
forestyoo
|GOODBOY008
GOODBOY008
|hatsu38
hatsu38
|hongzio
hongzio
|im47cn
im47cn
|shoopapa
shoopapa
| +|jwcraig
jwcraig
|kinandan
kinandan
|nevermorec
nevermorec
|bannzai
bannzai
|axmo
axmo
|asychin
asychin
| +|amittell
amittell
|Yoshino-Yukitaro
Yoshino-Yukitaro
|Yikai-Liao
Yikai-Liao
|zxdvd
zxdvd
|vladstudio
vladstudio
|tmsjngx0
tmsjngx0
| +|tgfjt
tgfjt
|PretzelVector
PretzelVector
|zetaloop
zetaloop
|cdlliuy
cdlliuy
|user202729
user202729
|student20880
student20880
| +|shohei-ihaya
shohei-ihaya
|shaybc
shaybc
|seedlord
seedlord
|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
| +|kohii
kohii
|linegel
linegel
|edwin-truthsearch-io
edwin-truthsearch-io
|EamonNerbonne
EamonNerbonne
|dbasclpy
dbasclpy
|dflatline
dflatline
| +|Deon588
Deon588
|dleen
dleen
|devxpain
devxpain
|chadgauth
chadgauth
|brunobergher
brunobergher
|thecolorblue
thecolorblue
| +|bogdan0083
bogdan0083
|Atlogit
Atlogit
|atlasgong
atlasgong
|andreastempsch
andreastempsch
|alasano
alasano
|QuinsZouls
QuinsZouls
| +|HadesArchitect
HadesArchitect
|alarno
alarno
|nexon33
nexon33
|adilhafeez
adilhafeez
|adamwlarson
adamwlarson
|adamhill
adamhill
| +|AMHesch
AMHesch
|maekawataiki
maekawataiki
|AlexandruSmirnov
AlexandruSmirnov
|samsilveira
samsilveira
|01Rian
01Rian
|RSO
RSO
| +|SECKainersdorfer
SECKainersdorfer
|R-omk
R-omk
|Sarke
Sarke
|kvokka
kvokka
|ecmasx
ecmasx
|mollux
mollux
| +|marvijo-code
marvijo-code
|mamertofabian
mamertofabian
|monkeyDluffy6017
monkeyDluffy6017
|libertyteeth
libertyteeth
|shtse8
shtse8
|Rexarrior
Rexarrior
| +|KanTakahiro
KanTakahiro
|ksze
ksze
|Jdo300
Jdo300
|hesara
hesara
|DeXtroTip
DeXtroTip
|pfitz
pfitz
| +|celestial-vault
celestial-vault
| | | | | | ## 授權 From 867fa6eceac30687bf42f9993405998331947db6 Mon Sep 17 00:00:00 2001 From: Chung Nguyen <15166543+ChuKhaLi@users.noreply.github.com> Date: Mon, 23 Jun 2025 01:46:26 +0700 Subject: [PATCH 17/21] Implement Sliding Window Rate Limiter and Retry Handler for Gemini Embedder - Introduced SlidingWindowRateLimiter to manage request rates effectively, ensuring consistent request handling and memory efficiency. - Added RetryHandler with exponential backoff and jitter to handle transient failures during API calls. - Refactored CodeIndexGeminiEmbedder to utilize the new rate limiter and retry handler, improving error handling and request management. - Enhanced batch processing logic for embedding texts, ensuring better performance and reliability. --- src/services/code-index/embedders/gemini.ts | 277 ++++++++++++-------- src/utils/rate-limiter.ts | 203 ++++++++++++++ src/utils/retry-handler.ts | 159 +++++++++++ 3 files changed, 524 insertions(+), 115 deletions(-) create mode 100644 src/utils/rate-limiter.ts create mode 100644 src/utils/retry-handler.ts diff --git a/src/services/code-index/embedders/gemini.ts b/src/services/code-index/embedders/gemini.ts index ecdb25ed32b..8abf7549080 100644 --- a/src/services/code-index/embedders/gemini.ts +++ b/src/services/code-index/embedders/gemini.ts @@ -2,13 +2,19 @@ import { ApiHandlerOptions } from "../../../shared/api" import { EmbedderInfo, EmbeddingResponse, IEmbedder } from "../interfaces" import { GeminiHandler } from "../../../api/providers/gemini" import { EMBEDDING_MODEL_PROFILES } from "../../../shared/embeddingModels" -import { GEMINI_RATE_LIMIT_DELAY_MS, MAX_BATCH_RETRIES, INITIAL_RETRY_DELAY_MS } from "../constants" +import { GEMINI_RATE_LIMIT_DELAY_MS } from "../constants" +import { SlidingWindowRateLimiter, SlidingWindowRateLimiterOptions } from "../../../utils/rate-limiter" +import { RetryHandler } from "../../../utils/retry-handler" + /** * Implements the IEmbedder interface using Google Gemini's embedding API. */ export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder { private readonly defaultModelId: string private readonly defaultTaskType: string + private readonly rateLimiter: SlidingWindowRateLimiter + private readonly retryHandler: RetryHandler + private readonly id: string /** * Creates a new Gemini embedder instance. @@ -18,6 +24,26 @@ export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder super(options) this.defaultModelId = options.apiModelId || "gemini-embedding-exp-03-07" this.defaultTaskType = options.geminiEmbeddingTaskType || "CODE_RETRIEVAL_QUERY" + + // Calculate rate limit parameters based on rateLimitSeconds or default + const rateLimitSeconds = options.rateLimitSeconds || GEMINI_RATE_LIMIT_DELAY_MS / 1000 + + // Configure the rate limiter to use rateLimitSeconds for rate calculations + const limiterOptions: SlidingWindowRateLimiterOptions = { + rateLimitSeconds: rateLimitSeconds, + } + + // Get the singleton rate limiter instance + this.rateLimiter = new SlidingWindowRateLimiter(limiterOptions) + // Initialize retry handler with default options + this.retryHandler = new RetryHandler({ + initialDelay: rateLimitSeconds, + }) + this.id = Math.random().toString() + + console.log( + `Initialized Gemini rate limiter with id ${this.id} and ${rateLimitSeconds}s minimum delay between requests`, + ) } /** @@ -39,6 +65,38 @@ export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder } } + /** + * Processes a batch of texts and aggregates the embeddings and usage statistics. + * + * @param batch Array of texts to process + * @param model Model identifier to use + * @param taskType The task type for the embedding + * @param allEmbeddings Array to store all embeddings + * @param aggregatedUsage Object to track token usage + * @param isFinalBatch Whether this is the final batch (affects error messages) + */ + private async _processAndAggregateBatch( + batch: string[], + model: string, + taskType: string, + allEmbeddings: number[][], + aggregatedUsage: { promptTokens: number; totalTokens: number }, + isFinalBatch: boolean = false, + ): Promise { + if (batch.length === 0) return + + try { + const batchResult = await this._embedBatch(batch, model, taskType) + allEmbeddings.push(...batchResult.embeddings) + aggregatedUsage.promptTokens += batchResult.usage.promptTokens + aggregatedUsage.totalTokens += batchResult.usage.totalTokens + } catch (error) { + const batchType = isFinalBatch ? "final batch" : "batch" + console.error(`Failed to process ${batchType} with retries:`, error) + throw new Error(`Failed to create embeddings for ${batchType}: ${(error as Error).message}`) + } + } + /** * Embeds texts while respecting the token limit of the model. * Splits the input texts into batches that don't exceed the model's token limit. @@ -68,142 +126,131 @@ export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder const allEmbeddings: number[][] = [] const aggregatedUsage = { promptTokens: 0, totalTokens: 0 } - // Process texts in batches - const remainingTexts = [...texts] - let isFirstBatch = true // Initialize isFirstBatch - - while (remainingTexts.length > 0) { - const currentBatch: string[] = [] - let currentBatchTokens = 0 - const processedIndices: number[] = [] - - // Simple token estimation (4 chars ≈ 1 token) - for (let i = 0; i < remainingTexts.length; i++) { - const text = remainingTexts[i] - // Estimate tokens (similar to OpenAI's implementation) - const estimatedTokens = Math.ceil(text.length / 4) - - // Skip texts that exceed the max token limit for a single item - if (estimatedTokens > maxInputTokens) { - console.warn( - `Text at index ${i} exceeds maximum token limit (${estimatedTokens} > ${maxInputTokens}). Skipping.`, - ) - processedIndices.push(i) - continue - } - - // Add text to batch if it fits within the token limit - if (currentBatchTokens + estimatedTokens <= maxInputTokens) { - currentBatch.push(text) - currentBatchTokens += estimatedTokens - processedIndices.push(i) - } else { - // This text would exceed the limit, so process the current batch first - break - } - } + // Initialize the current batch + let currentBatch: string[] = [] + let currentBatchTokens = 0 - // Remove processed texts from the remaining texts - for (let i = processedIndices.length - 1; i >= 0; i--) { - remainingTexts.splice(processedIndices[i], 1) + // Process each text sequentially with for...of loop + for (const text of texts) { + // Estimate tokens (similar to OpenAI's implementation) + const estimatedTokens = Math.ceil(text.length / 4) + + // Skip texts that exceed the max token limit for a single item + if (estimatedTokens > maxInputTokens) { + console.warn(`Text exceeds maximum token limit (${estimatedTokens} > ${maxInputTokens}). Skipping.`) + continue } - // Process the current batch if not empty - if (currentBatch.length > 0) { - if (!isFirstBatch) { - const delayMs = - this.options.rateLimitSeconds !== undefined - ? this.options.rateLimitSeconds * 1000 - : GEMINI_RATE_LIMIT_DELAY_MS - console.log(`Adding proactive delay of ${delayMs}ms before Gemini batch`) - await new Promise((resolve) => setTimeout(resolve, delayMs)) - isFirstBatch = false - } - - try { - const batchResult = await this._embedBatchWithRetries(currentBatch, model, taskType) - allEmbeddings.push(...batchResult.embeddings) - aggregatedUsage.promptTokens += batchResult.usage.promptTokens - aggregatedUsage.totalTokens += batchResult.usage.totalTokens - } catch (error) { - console.error("Failed to process batch with retries:", error) - throw new Error(`Failed to create embeddings for batch: ${(error as Error).message}`) - } + // If adding this text would exceed the token limit, process the current batch first + if (currentBatchTokens + estimatedTokens > maxInputTokens) { + // Process the current batch + await this._processAndAggregateBatch(currentBatch, model, taskType, allEmbeddings, aggregatedUsage) + + // Reset the batch + currentBatch = [] + currentBatchTokens = 0 } + + // Add the current text to the batch + currentBatch.push(text) + currentBatchTokens += estimatedTokens } + // Process any remaining texts in the final batch + await this._processAndAggregateBatch(currentBatch, model, taskType, allEmbeddings, aggregatedUsage, true) + return { embeddings: allEmbeddings, usage: aggregatedUsage } } /** - * Helper method to handle batch embedding with retries and exponential backoff for Gemini. + * Makes the actual API call to Gemini's embedding service and processes the response. + * + * @param batchTexts Array of texts to embed + * @param modelId Model identifier to use for the API call + * @param taskType The task type for the embedding + * @returns Promise resolving to embeddings and usage statistics + */ + private async _callGeminiEmbeddingApi( + batchTexts: string[], + modelId: string, + taskType: string, + ): Promise<{ embeddings: number[][]; usage: { promptTokens: number; totalTokens: number } }> { + const now = new Date() + console.log(`_callGeminiEmbeddingApi ${now.toISOString()}`) + const response = await this.client.models.embedContent({ + model: modelId, + contents: batchTexts, + config: { + taskType, + }, + }) + + if (!response.embeddings) { + throw new Error("No embeddings returned from Gemini API") + } + + const embeddings = response.embeddings + .map((embedding) => embedding?.values) + .filter((values) => values !== undefined && values.length > 0) as number[][] + + // Gemini API for embeddings doesn't directly return token usage per call + return { + embeddings, + usage: { promptTokens: 0, totalTokens: 0 }, // Placeholder usage + } + } + + /** + * Creates embeddings for a batch of texts using the Gemini API. + * Rate limiting is handled by the SlidingWindowRateLimiter. + * * @param batchTexts Array of texts to embed in this batch * @param model Model identifier to use * @param taskType The task type for the embedding * @returns Promise resolving to embeddings and usage statistics */ - private async _embedBatchWithRetries( + private async _embedBatch( batchTexts: string[], model: string, taskType: string, ): Promise<{ embeddings: number[][]; usage: { promptTokens: number; totalTokens: number } }> { const modelId = model || this.defaultModelId - let lastError: any = null - - for (let attempts = 0; attempts < MAX_BATCH_RETRIES; attempts++) { - try { - const response = await this.client.models.embedContent({ - model: modelId, - contents: batchTexts, - config: { - taskType, - }, - }) - - if (!response.embeddings) { - throw new Error("No embeddings returned from Gemini API") - } - - const embeddings = response.embeddings - .map((embedding) => embedding?.values) - .filter((values) => values !== undefined && values.length > 0) as number[][] - - // Gemini API for embeddings doesn't directly return token usage per call in the same way some others do. - // The `generateEmbeddings` in the original file didn't populate usage. - // If usage needs to be calculated, it would require a separate token counting call. - // For now, returning empty usage, consistent with the original generateEmbeddings. - return { - embeddings, - usage: { promptTokens: 0, totalTokens: 0 }, // Placeholder usage - } - } catch (error: any) { - lastError = error - // Basic check for retryable errors (e.g., rate limits) - // Gemini might use 429 or specific error messages like "RESOURCE_EXHAUSTED" or "rate limit exceeded" - const isRateLimitError = - error?.status === 429 || - (error?.message && - (error.message.includes("rate limit") || error.message.includes("RESOURCE_EXHAUSTED"))) - - const hasMoreAttempts = attempts < MAX_BATCH_RETRIES - 1 - - if (isRateLimitError && hasMoreAttempts) { - const delayMs = INITIAL_RETRY_DELAY_MS * Math.pow(2, attempts) - console.warn( - `Gemini embedding attempt ${attempts + 1} failed due to rate limit. Retrying in ${delayMs}ms...`, - ) - await new Promise((resolve) => setTimeout(resolve, delayMs)) - continue - } - // Non-retryable error or last attempt failed - console.error(`Gemini embedding failed on attempt ${attempts + 1}:`, error) - throw error // Re-throw the last error if not retryable or out of attempts + + // Determine if an error is retryable (429 Too Many Requests or specific API errors) + const shouldRetry = (error: any): boolean => { + const retryable = + error.status === 429 || + error.message?.includes("RESOURCE_EXHAUSTED") || + error.message?.includes("rate limit") || + error.message?.includes("quota exceeded") + + if (retryable) { + console.log(`Retryable error detected: ${error.message}`) } + + return retryable + } + + try { + // Execute the API call with retry logic + return await this.retryHandler.execute(async () => { + // Acquire a slot from the rate limiter before making the API call + // This ensures each retry attempt also respects rate limits + await this.rateLimiter.acquire() + return await this._callGeminiEmbeddingApi(batchTexts, modelId, taskType) + }, shouldRetry) + } catch (error: any) { + // Log the error with context + console.error(`Gemini embedding request failed after all retry attempts:`, { + error: error.message, + status: error.status, + modelId, + batchSize: batchTexts.length, + }) + + // Rethrow the error + throw error } - // Should not be reached if throw error in loop works correctly, but as a fallback: - throw new Error( - `Failed to create embeddings for batch after ${MAX_BATCH_RETRIES} attempts. Last error: ${lastError?.message}`, - ) } get embedderInfo(): EmbedderInfo { diff --git a/src/utils/rate-limiter.ts b/src/utils/rate-limiter.ts new file mode 100644 index 00000000000..b52d2a7ff8e --- /dev/null +++ b/src/utils/rate-limiter.ts @@ -0,0 +1,203 @@ +/** + * Sliding Window Rate Limiter Implementation + * + * Justification for choosing the Sliding Window algorithm: + * + * 1. Accuracy: Unlike fixed window counters that can allow burst traffic at window + * boundaries, sliding window provides more consistent rate limiting by considering + * the actual time distribution of requests. + * + * 2. Memory Efficiency: Only stores timestamps within the current window period, + * automatically cleaning up old entries, making it memory-efficient for high-volume + * applications. + * + * 3. Fairness: Ensures a smooth rate of requests over time rather than allowing sudden + * spikes, which provides a more predictable system behavior and resource usage. + * + * 4. Adaptability: Can be easily adjusted to different time windows (minutes, seconds) + * while maintaining the same consistent behavior. + */ + +/** + * Configuration options for the SlidingWindowRateLimiter + */ +export interface SlidingWindowRateLimiterOptions { + /** + * The maximum number of requests allowed within the time window. + * If not provided, this will be calculated from rateLimitSeconds or default to 60. + */ + requestsPerWindow?: number + + /** + * The time window duration in milliseconds. Default is 60000 (1 minute). + * This is calculated from rateLimitSeconds if provided, otherwise uses this value directly. + */ + windowMs?: number + + /** + * The minimum time between requests in seconds. + * If provided, windowMs and requestsPerWindow will be calculated accordingly. + * For example, if rateLimitSeconds is 10, then it will allow 1 request per 10 seconds, + * or 6 requests per minute. + */ + rateLimitSeconds?: number +} + +export class SlidingWindowRateLimiter { + /** + * When `rateLimitSeconds` is supplied we want to guarantee a minimum spacing + * (a.k.a. cool-down) between consecutive requests. This value (in ms) + * represents that interval. If it is **undefined** we will fall back to the + * classic sliding-window algorithm that controls *average* throughput but can + * still allow bursts at the beginning of a window. + */ + private readonly minIntervalMs?: number + + private readonly requestsPerWindow: number + private readonly windowMs: number + private readonly requestTimestamps: number[] = [] + + /** + * The next timestamp (in ms) when a request is allowed if `minIntervalMs` is + * being enforced. + */ + private nextAvailableTime = 0 + + /** + * Internal chain used to serialize `acquire()` calls when a strict + * `minIntervalMs` is enforced. This guarantees that each caller observes the + * updated scheduling state (i.e. `nextAvailableTime`) and prevents the race + * condition where several concurrent calls all think a slot is immediately + * available. + */ + private serial: Promise = Promise.resolve() + + /** + * Creates a new instance of the SlidingWindowRateLimiter + * @param options Configuration options for the rate limiter + */ + constructor(options?: SlidingWindowRateLimiterOptions) { + if (options?.rateLimitSeconds) { + // When a strict minimum interval is required we will *also* keep the + // sliding-window counters so that extremely long-running burst scenarios + // are still prevented. + this.minIntervalMs = options.rateLimitSeconds * 1000 + + // Maintain a 2-minute window for additional protection against sustained + // high-traffic scenarios. This mirrors the previous behaviour while + // adding the per-request spacing guarantee. + const windowSizeInSeconds = 120 // 2 minutes + this.windowMs = windowSizeInSeconds * 1000 + this.requestsPerWindow = Math.floor(windowSizeInSeconds / options.rateLimitSeconds) + } else { + // Use provided values or defaults (pure sliding-window mode) + this.requestsPerWindow = options?.requestsPerWindow ?? 60 + this.windowMs = options?.windowMs ?? 60 * 1000 // Default: 1 minute in milliseconds + } + + // Validate final values + if (this.requestsPerWindow <= 0) { + throw new Error("Calculated requestsPerWindow must be a positive number") + } + } + + /** + * Acquires permission to proceed with a request + * + * @returns A promise that resolves when the request is permitted to proceed + */ + public async acquire(): Promise { + if (this.minIntervalMs !== undefined) { + // Capture to help TypeScript's control-flow analysis in the async body + const intervalMs = this.minIntervalMs! + + // Ensure **all** acquire() callers run through the following sequence one + // after another. + const nextInChain = this.serial.then(async () => { + const now = Date.now() + + // Calculate how long we need to wait so we keep at least minIntervalMs + // between *granted* requests. + const waitTime = Math.max(this.nextAvailableTime - now, 0) + if (waitTime > 0) { + await new Promise((r) => setTimeout(r, waitTime)) + } + + // Record when the next request is allowed *before* doing the heavy + // lifting so concurrent callers will see the updated schedule. + this.nextAvailableTime = Date.now() + intervalMs + + // Proceed with the regular sliding-window accounting. + await this.acquireWithoutMinInterval() + }) + + // Replace the promise chain but deliberately swallow errors in the chain + // so that a single failing acquire doesn't block others forever. The + // error is still propagated to the individual caller via `nextInChain`. + this.serial = nextInChain.catch(() => {}) + + return nextInChain + } + + // Fallback to pure sliding-window behaviour when no fixed interval is set. + return this.acquireWithoutMinInterval() + } + + /** + * The original acquire logic that only enforces the sliding-window quotas. It + * is extracted so that we can reuse it *after* satisfying the min-interval + * delay. + */ + private async acquireWithoutMinInterval(): Promise { + // Clean up expired timestamps that are outside the current window + this.cleanupExpiredTimestamps() + + if (this.requestTimestamps.length < this.requestsPerWindow) { + this.recordRequest() + + // Update the next allowed time if we have a min-interval configured. + if (this.minIntervalMs !== undefined) { + this.nextAvailableTime = Date.now() + this.minIntervalMs + } + + return + } + + // We are over the quota for the current window; wait until the oldest + // request timestamp exits the window. + return new Promise((resolve) => { + const oldestTimestamp = this.requestTimestamps[0] + const timeToWait = oldestTimestamp + this.windowMs - Date.now() + + setTimeout(() => { + this.cleanupExpiredTimestamps() + this.recordRequest() + + if (this.minIntervalMs !== undefined) { + this.nextAvailableTime = Date.now() + this.minIntervalMs + } + + resolve() + }, timeToWait + 1) + }) + } + + /** + * Records the current request timestamp and adds it to the sliding window + */ + private recordRequest(): void { + this.requestTimestamps.push(Date.now()) + } + + /** + * Removes timestamps that have fallen outside the current time window + */ + private cleanupExpiredTimestamps(): void { + const cutoffTime = Date.now() - this.windowMs + + // Remove all timestamps that are older than the cutoff time + while (this.requestTimestamps.length > 0 && this.requestTimestamps[0] <= cutoffTime) { + this.requestTimestamps.shift() + } + } +} diff --git a/src/utils/retry-handler.ts b/src/utils/retry-handler.ts new file mode 100644 index 00000000000..f025ea6092e --- /dev/null +++ b/src/utils/retry-handler.ts @@ -0,0 +1,159 @@ +/** + * Retry Handler with Exponential Backoff and Jitter + * + * This utility provides a configurable retry mechanism with exponential backoff strategy + * for handling transient failures in asynchronous operations. Key features include: + * + * 1. Exponential Backoff: Progressively increases the delay between retry attempts + * to reduce system load during recovery periods. + * + * 2. Maximum Delay Cap: Prevents retry delays from growing beyond a reasonable threshold. + * + * 3. Jitter: Optional randomization of delay times to prevent thundering herd problems + * when multiple clients retry simultaneously. + * + * 4. Selective Retry: Allows precise control over which errors should trigger a retry + * through a customizable predicate function. + */ + +/** + * Configuration options for the RetryHandler + */ +export interface RetryHandlerOptions { + /** + * The maximum number of retry attempts before giving up. + * Default: 5 + */ + maxRetries?: number + + /** + * The initial delay in milliseconds before the first retry. + * Default: 1000 (1 second) + */ + initialDelay?: number + + /** + * The maximum delay in milliseconds that the backoff is allowed to reach. + * Default: 30000 (30 seconds) + */ + maxDelay?: number + + /** + * The multiplier for the exponential backoff calculation. + * Each retry will wait approximately backoffFactor times longer than the previous attempt. + * Default: 2 + */ + backoffFactor?: number + + /** + * Whether to apply random jitter to the delay to prevent retry storms. + * When true, adds a random factor between 0.5 and 1.5 to the delay. + * Default: true + */ + jitter?: boolean +} + +export class RetryHandler { + private readonly maxRetries: number + private readonly initialDelay: number + private readonly maxDelay: number + private readonly backoffFactor: number + private readonly jitter: boolean + + /** + * Creates a new instance of the RetryHandler + * @param options Configuration options for the retry handler + */ + constructor(options?: RetryHandlerOptions) { + this.maxRetries = options?.maxRetries ?? 5 + this.initialDelay = options?.initialDelay ?? 1000 + this.maxDelay = options?.maxDelay ?? 30000 + this.backoffFactor = options?.backoffFactor ?? 2 + this.jitter = options?.jitter ?? true + + // Validate configuration values + if (this.maxRetries < 0) { + throw new Error("maxRetries must be a non-negative number") + } + if (this.initialDelay <= 0) { + throw new Error("initialDelay must be a positive number") + } + if (this.maxDelay <= 0) { + throw new Error("maxDelay must be a positive number") + } + if (this.maxDelay < this.initialDelay) { + throw new Error("maxDelay must be greater than or equal to initialDelay") + } + if (this.backoffFactor <= 0) { + throw new Error("backoffFactor must be a positive number") + } + } + + /** + * Executes the provided function with retry logic + * + * @param fn The asynchronous function to execute and retry on failure + * @param shouldRetry A predicate function that determines whether a given error should trigger a retry + * @returns A promise that resolves with the result of the function or rejects with the last error + */ + public async execute(fn: () => Promise, shouldRetry: (error: any) => boolean): Promise { + let lastError: any + + for (let attempt = 0; attempt <= this.maxRetries; attempt++) { + try { + // Attempt to execute the function + return await fn() + } catch (error) { + // Save the error for potential re-throw + lastError = error + + // If we've exhausted all retry attempts or shouldn't retry this error, give up + if (attempt >= this.maxRetries || !shouldRetry(error)) { + throw error + } + + // Calculate delay for the next retry + const delay = this.calculateDelay(attempt) + + // Wait before the next attempt + await this.wait(delay) + } + } + + // This should never be reached due to the throw in the loop, + // but TypeScript requires a return statement + throw lastError + } + + /** + * Calculates the delay for a specific retry attempt using exponential backoff + * and optional jitter + * + * @param attempt The current retry attempt (0-based) + * @returns The calculated delay in milliseconds + */ + private calculateDelay(attempt: number): number { + // Calculate base delay with exponential backoff: initialDelay * (backoffFactor ^ attempt) + let delay = this.initialDelay * Math.pow(this.backoffFactor, attempt) + + // Apply jitter if enabled + if (this.jitter) { + // Apply a random factor between 0.5 and 1.5 + const jitterFactor = 0.5 + Math.random() + delay *= jitterFactor + } + + // Ensure the delay doesn't exceed the maximum + return Math.min(delay, this.maxDelay) + } + + /** + * Returns a promise that resolves after the specified delay + * + * @param ms The delay in milliseconds + * @returns A promise that resolves after the delay + */ + private wait(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)) + } +} From 8f9043314af9979556e2fdda605e7b09a9fad7c8 Mon Sep 17 00:00:00 2001 From: Chung Nguyen <15166543+ChuKhaLi@users.noreply.github.com> Date: Mon, 23 Jun 2025 01:49:13 +0700 Subject: [PATCH 18/21] Remove unnecessary logging in CodeIndexGeminiEmbedder's embedding API call --- src/services/code-index/embedders/gemini.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/services/code-index/embedders/gemini.ts b/src/services/code-index/embedders/gemini.ts index 8abf7549080..ca11aad68b4 100644 --- a/src/services/code-index/embedders/gemini.ts +++ b/src/services/code-index/embedders/gemini.ts @@ -175,8 +175,6 @@ export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder modelId: string, taskType: string, ): Promise<{ embeddings: number[][]; usage: { promptTokens: number; totalTokens: number } }> { - const now = new Date() - console.log(`_callGeminiEmbeddingApi ${now.toISOString()}`) const response = await this.client.models.embedContent({ model: modelId, contents: batchTexts, From 14117b7921f513d26454eb24adb6979548b545cb Mon Sep 17 00:00:00 2001 From: Chung Nguyen <15166543+ChuKhaLi@users.noreply.github.com> Date: Mon, 23 Jun 2025 02:01:58 +0700 Subject: [PATCH 19/21] feat(i18n): Add missing Gemini related translations for Indonesian (id) locale --- src/services/code-index/embedders/gemini.ts | 6 ------ webview-ui/src/i18n/locales/id/settings.json | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/services/code-index/embedders/gemini.ts b/src/services/code-index/embedders/gemini.ts index ca11aad68b4..d6e4b908c5a 100644 --- a/src/services/code-index/embedders/gemini.ts +++ b/src/services/code-index/embedders/gemini.ts @@ -14,7 +14,6 @@ export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder private readonly defaultTaskType: string private readonly rateLimiter: SlidingWindowRateLimiter private readonly retryHandler: RetryHandler - private readonly id: string /** * Creates a new Gemini embedder instance. @@ -39,11 +38,6 @@ export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder this.retryHandler = new RetryHandler({ initialDelay: rateLimitSeconds, }) - this.id = Math.random().toString() - - console.log( - `Initialized Gemini rate limiter with id ${this.id} and ${rateLimitSeconds}s minimum delay between requests`, - ) } /** diff --git a/webview-ui/src/i18n/locales/id/settings.json b/webview-ui/src/i18n/locales/id/settings.json index afad7d8700f..1b17815fda9 100644 --- a/webview-ui/src/i18n/locales/id/settings.json +++ b/webview-ui/src/i18n/locales/id/settings.json @@ -45,6 +45,7 @@ "openaiProvider": "OpenAI", "ollamaProvider": "Ollama", "openaiCompatibleProvider": "OpenAI Compatible", + "geminiProvider": "Gemini", "openaiKeyLabel": "OpenAI Key:", "openaiCompatibleBaseUrlLabel": "Base URL:", "openaiCompatibleApiKeyLabel": "API Key:", @@ -54,6 +55,20 @@ "modelLabel": "Model", "selectModelPlaceholder": "Pilih model", "ollamaUrlLabel": "Ollama URL:", + "geminiApiKey": "Kunci API Gemini:", + "apiKeyPlaceholder": "Masukkan Kunci API...", + "embeddingTaskType": "Tipe Tugas Embedding", + "selectTaskTypePlaceholder": "Pilih Tipe Tugas", + "selectTaskType": { + "codeRetrievalQuery": "Kueri Pengambilan Kode", + "retrievalDocument": "Dokumen Pengambilan", + "retrievalQuery": "Kueri Pengambilan", + "semanticSimilarity": "Kemiripan Semantik", + "classification": "Klasifikasi", + "clustering": "Pengelompokan" + }, + "embeddingDimension": "Dimensi Embedding", + "selectDimensionPlaceholder": "Pilih Dimensi", "qdrantUrlLabel": "Qdrant URL", "qdrantKeyLabel": "Qdrant Key:", "startIndexingButton": "Mulai Pengindeksan", From 2149430b92b8291ab1d7f87d49088a98bd30c164 Mon Sep 17 00:00:00 2001 From: Chung Nguyen <15166543+ChuKhaLi@users.noreply.github.com> Date: Mon, 23 Jun 2025 02:46:13 +0700 Subject: [PATCH 20/21] feat(code-index): make taskType optional for Gemini embeddings depending on model support --- src/services/code-index/config-manager.ts | 19 +++- src/services/code-index/embedders/gemini.ts | 29 ++++-- src/shared/embeddingModels.ts | 16 +++- .../components/settings/CodeIndexSettings.tsx | 91 ++++++++++--------- 4 files changed, 93 insertions(+), 62 deletions(-) diff --git a/src/services/code-index/config-manager.ts b/src/services/code-index/config-manager.ts index 0dc6b167c1a..0817c57fbf7 100644 --- a/src/services/code-index/config-manager.ts +++ b/src/services/code-index/config-manager.ts @@ -3,7 +3,7 @@ import { ContextProxy } from "../../core/config/ContextProxy" import { EmbedderProvider } from "./interfaces/manager" import { CodeIndexConfig, PreviousConfigSnapshot } from "./interfaces/config" import { SEARCH_MIN_SCORE } from "./constants" -import { getDefaultModelId, getModelDimension } from "../../shared/embeddingModels" +import { getDefaultModelId, getModelDimension, EMBEDDING_MODEL_PROFILES } from "../../shared/embeddingModels" // Define a type for the raw config state from globalState interface RawCodebaseIndexConfigState { @@ -52,7 +52,7 @@ export class CodeIndexConfigManager { codebaseIndexEmbedderProvider: "openai", codebaseIndexEmbedderBaseUrl: "", codebaseIndexEmbedderModelId: "", - geminiEmbeddingTaskType: "CODE_RETRIEVAL_QUERY", + geminiEmbeddingTaskType: undefined, geminiEmbeddingDimension: undefined, }) as RawCodebaseIndexConfigState // Cast to our defined raw state type @@ -112,7 +112,7 @@ export class CodeIndexConfigManager { this.geminiOptions = { geminiApiKey, - geminiEmbeddingTaskType: geminiEmbeddingTaskType || "CODE_RETRIEVAL_QUERY", + geminiEmbeddingTaskType: geminiEmbeddingTaskType, apiModelId: this.modelId, geminiEmbeddingDimension, rateLimitSeconds, @@ -205,10 +205,19 @@ export class CodeIndexConfigManager { if (this.embedderProvider === "gemini") { // Gemini requires an API key and Qdrant URL const geminiApiKey = this.geminiOptions?.geminiApiKey + const modelId = this.modelId || getDefaultModelId("gemini") + const qdrantUrl = this.qdrantUrl + + // Check if the model supports taskType + const geminiProfiles = EMBEDDING_MODEL_PROFILES.gemini || {} + const modelProfile = geminiProfiles[modelId] + const supportsTaskType = modelProfile?.supportsTaskType || false + + // Only require taskType if the model supports it const geminiEmbeddingTaskType = this.geminiOptions?.geminiEmbeddingTaskType + const taskTypeValid = !supportsTaskType || (supportsTaskType && !!geminiEmbeddingTaskType) - const qdrantUrl = this.qdrantUrl - const isConfigured = !!(geminiApiKey && geminiEmbeddingTaskType && qdrantUrl) + const isConfigured = !!(geminiApiKey && taskTypeValid && qdrantUrl) return isConfigured } return false // Should not happen if embedderProvider is always set correctly diff --git a/src/services/code-index/embedders/gemini.ts b/src/services/code-index/embedders/gemini.ts index d6e4b908c5a..18be2bdc02f 100644 --- a/src/services/code-index/embedders/gemini.ts +++ b/src/services/code-index/embedders/gemini.ts @@ -11,7 +11,7 @@ import { RetryHandler } from "../../../utils/retry-handler" */ export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder { private readonly defaultModelId: string - private readonly defaultTaskType: string + private readonly defaultTaskType?: string private readonly rateLimiter: SlidingWindowRateLimiter private readonly retryHandler: RetryHandler @@ -22,7 +22,7 @@ export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder constructor(options: ApiHandlerOptions) { super(options) this.defaultModelId = options.apiModelId || "gemini-embedding-exp-03-07" - this.defaultTaskType = options.geminiEmbeddingTaskType || "CODE_RETRIEVAL_QUERY" + this.defaultTaskType = options.geminiEmbeddingTaskType // Calculate rate limit parameters based on rateLimitSeconds or default const rateLimitSeconds = options.rateLimitSeconds || GEMINI_RATE_LIMIT_DELAY_MS / 1000 @@ -49,7 +49,7 @@ export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder async createEmbeddings(texts: string[], model?: string): Promise { try { const modelId = model || this.defaultModelId - const result = await this.embedWithTokenLimit(texts, modelId, this.defaultTaskType) + const result = await this.embedWithTokenLimit(texts, modelId, this.defaultTaskType || "") return { embeddings: result.embeddings, } @@ -72,7 +72,7 @@ export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder private async _processAndAggregateBatch( batch: string[], model: string, - taskType: string, + taskType: string = "", allEmbeddings: number[][], aggregatedUsage: { promptTokens: number; totalTokens: number }, isFinalBatch: boolean = false, @@ -104,7 +104,7 @@ export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder private async embedWithTokenLimit( texts: string[], model: string, - taskType: string, + taskType: string = "", ): Promise<{ embeddings: number[][] usage: { promptTokens: number; totalTokens: number } @@ -161,7 +161,7 @@ export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder * * @param batchTexts Array of texts to embed * @param modelId Model identifier to use for the API call - * @param taskType The task type for the embedding + * @param taskType The task type for the embedding (only used if the model supports it) * @returns Promise resolving to embeddings and usage statistics */ private async _callGeminiEmbeddingApi( @@ -169,12 +169,21 @@ export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder modelId: string, taskType: string, ): Promise<{ embeddings: number[][]; usage: { promptTokens: number; totalTokens: number } }> { + // Check if the model supports taskType + const geminiProfiles = EMBEDDING_MODEL_PROFILES.gemini || {} + const modelProfile = geminiProfiles[modelId] + const supportsTaskType = modelProfile?.supportsTaskType || false + + // Only include taskType in the config if the model supports it + const config: { taskType?: string } = {} + if (supportsTaskType) { + config.taskType = taskType + } + const response = await this.client.models.embedContent({ model: modelId, contents: batchTexts, - config: { - taskType, - }, + config, }) if (!response.embeddings) { @@ -204,7 +213,7 @@ export class CodeIndexGeminiEmbedder extends GeminiHandler implements IEmbedder private async _embedBatch( batchTexts: string[], model: string, - taskType: string, + taskType: string = "", ): Promise<{ embeddings: number[][]; usage: { promptTokens: number; totalTokens: number } }> { const modelId = model || this.defaultModelId diff --git a/src/shared/embeddingModels.ts b/src/shared/embeddingModels.ts index 78a4df63e6f..50663b9aefe 100644 --- a/src/shared/embeddingModels.ts +++ b/src/shared/embeddingModels.ts @@ -14,6 +14,11 @@ export interface EmbeddingModelProfile { * Optional maximum input tokens for the model. */ maxInputTokens?: number + /** + * Whether the model supports the taskType parameter. + * Only some Gemini models support this parameter. + */ + supportsTaskType?: boolean // Add other model-specific properties if needed, e.g., context window size } @@ -43,9 +48,14 @@ export const EMBEDDING_MODEL_PROFILES: EmbeddingModelProfiles = { "text-embedding-ada-002": { dimension: 1536 }, }, gemini: { - "gemini-embedding-exp-03-07": { dimension: 3072, supportDimensions: [3072, 1536, 768], maxInputTokens: 8192 }, - "models/text-embedding-004": { dimension: 768, maxInputTokens: 2048 }, - "models/embedding-001": { dimension: 768, maxInputTokens: 2048 }, + "gemini-embedding-exp-03-07": { + dimension: 3072, + supportDimensions: [3072, 1536, 768], + maxInputTokens: 8192, + supportsTaskType: true, + }, + "models/text-embedding-004": { dimension: 768, maxInputTokens: 2048, supportsTaskType: false }, + "models/embedding-001": { dimension: 768, maxInputTokens: 2048, supportsTaskType: false }, }, } diff --git a/webview-ui/src/components/settings/CodeIndexSettings.tsx b/webview-ui/src/components/settings/CodeIndexSettings.tsx index 95f147f6bb4..3b12d32e333 100644 --- a/webview-ui/src/components/settings/CodeIndexSettings.tsx +++ b/webview-ui/src/components/settings/CodeIndexSettings.tsx @@ -160,7 +160,7 @@ export const CodeIndexSettings: React.FC = ({ gemini: baseSchema.extend({ codebaseIndexEmbedderProvider: z.literal("gemini"), geminiApiKey: z.string().min(1, "Gemini API key is required"), - geminiEmbeddingTaskType: z.string().min(1, "Gemini Task Type is required"), + geminiEmbeddingTaskType: z.string().optional(), geminiEmbeddingDimension: z .number() .int() @@ -460,51 +460,54 @@ export const CodeIndexSettings: React.FC = ({ style={{ width: "100%" }}>
-
-
-
{t("settings:codeIndex.embeddingTaskType")}
-
-
-
- + {geminiModelProfileForDim?.supportsTaskType && ( +
+
+
{t("settings:codeIndex.embeddingTaskType")}
+
+
+
+ +
-
+ )} {currentProvider === "gemini" && geminiModelProfileForDim && geminiSupportedDims && From f5f9257ea6cdc41fa188810d70690d9833101c96 Mon Sep 17 00:00:00 2001 From: Chung Nguyen <15166543+ChuKhaLi@users.noreply.github.com> Date: Mon, 23 Jun 2025 03:07:57 +0700 Subject: [PATCH 21/21] fix(tests): update config-manager tests to match new implementation --- .../code-index/__tests__/config-manager.spec.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/services/code-index/__tests__/config-manager.spec.ts b/src/services/code-index/__tests__/config-manager.spec.ts index 6a523a0b91d..dacde156d78 100644 --- a/src/services/code-index/__tests__/config-manager.spec.ts +++ b/src/services/code-index/__tests__/config-manager.spec.ts @@ -40,9 +40,10 @@ describe("CodeIndexConfigManager", () => { apiModelId: undefined, geminiApiKey: "", geminiEmbeddingDimension: undefined, - geminiEmbeddingTaskType: "CODE_RETRIEVAL_QUERY", + geminiEmbeddingTaskType: undefined, rateLimitSeconds: undefined, }, + openAiCompatibleOptions: undefined, qdrantUrl: "http://localhost:6333", qdrantApiKey: "", searchMinScore: 0.4, @@ -78,7 +79,7 @@ describe("CodeIndexConfigManager", () => { apiModelId: "text-embedding-3-large", geminiApiKey: "", geminiEmbeddingDimension: undefined, - geminiEmbeddingTaskType: "CODE_RETRIEVAL_QUERY", + geminiEmbeddingTaskType: undefined, rateLimitSeconds: { codebaseIndexEnabled: true, codebaseIndexQdrantUrl: "http://qdrant.local", @@ -87,6 +88,7 @@ describe("CodeIndexConfigManager", () => { codebaseIndexEmbedderModelId: "text-embedding-3-large", }, }, + openAiCompatibleOptions: undefined, qdrantUrl: "http://qdrant.local", qdrantApiKey: "test-qdrant-key", searchMinScore: 0.4, @@ -125,7 +127,7 @@ describe("CodeIndexConfigManager", () => { apiModelId: "text-embedding-3-large", geminiApiKey: "", geminiEmbeddingDimension: undefined, - geminiEmbeddingTaskType: "CODE_RETRIEVAL_QUERY", + geminiEmbeddingTaskType: undefined, rateLimitSeconds: undefined, }, openAiCompatibleOptions: { @@ -172,7 +174,7 @@ describe("CodeIndexConfigManager", () => { apiModelId: "custom-model", geminiApiKey: "", geminiEmbeddingDimension: undefined, - geminiEmbeddingTaskType: "CODE_RETRIEVAL_QUERY", + geminiEmbeddingTaskType: undefined, rateLimitSeconds: undefined, }, openAiCompatibleOptions: { @@ -219,7 +221,7 @@ describe("CodeIndexConfigManager", () => { apiModelId: "custom-model", geminiApiKey: "", geminiEmbeddingDimension: undefined, - geminiEmbeddingTaskType: "CODE_RETRIEVAL_QUERY", + geminiEmbeddingTaskType: undefined, rateLimitSeconds: undefined, }, openAiCompatibleOptions: { @@ -266,7 +268,7 @@ describe("CodeIndexConfigManager", () => { apiModelId: "custom-model", geminiApiKey: "", geminiEmbeddingDimension: undefined, - geminiEmbeddingTaskType: "CODE_RETRIEVAL_QUERY", + geminiEmbeddingTaskType: undefined, rateLimitSeconds: undefined, }, openAiCompatibleOptions: { @@ -994,7 +996,7 @@ describe("CodeIndexConfigManager", () => { apiModelId: "text-embedding-3-large", geminiApiKey: "", geminiEmbeddingDimension: undefined, - geminiEmbeddingTaskType: "CODE_RETRIEVAL_QUERY", + geminiEmbeddingTaskType: undefined, rateLimitSeconds: { codebaseIndexEnabled: true, codebaseIndexQdrantUrl: "http://qdrant.local",