From 46881d4c9797697e2deb3aed65a9d44b7bae01c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Catriel=20M=C3=BCller?= Date: Fri, 27 Feb 2026 10:58:15 -0300 Subject: [PATCH 01/48] feat: vscode legacy migration wip --- packages/kilo-vscode/package.json | 5 + packages/kilo-vscode/src/KiloProvider.ts | 96 +++ packages/kilo-vscode/src/extension.ts | 5 + .../kilo-vscode/src/legacy-migration/index.ts | 8 + .../src/legacy-migration/legacy-types.ts | 258 ++++++++ .../legacy-migration/migration-messages.ts | 69 +++ .../src/legacy-migration/migration-service.ts | 506 ++++++++++++++++ .../src/legacy-migration/provider-mapping.ts | 261 +++++++++ packages/kilo-vscode/webview-ui/src/App.tsx | 21 +- .../components/migration/MigrationWizard.tsx | 554 ++++++++++++++++++ .../src/components/migration/index.ts | 5 + .../src/components/migration/migration.css | 365 ++++++++++++ .../src/components/settings/Settings.tsx | 32 + .../kilo-vscode/webview-ui/src/i18n/en.ts | 26 + .../webview-ui/src/types/messages.ts | 85 ++- 15 files changed, 2292 insertions(+), 4 deletions(-) create mode 100644 packages/kilo-vscode/src/legacy-migration/index.ts create mode 100644 packages/kilo-vscode/src/legacy-migration/legacy-types.ts create mode 100644 packages/kilo-vscode/src/legacy-migration/migration-messages.ts create mode 100644 packages/kilo-vscode/src/legacy-migration/migration-service.ts create mode 100644 packages/kilo-vscode/src/legacy-migration/provider-mapping.ts create mode 100644 packages/kilo-vscode/webview-ui/src/components/migration/MigrationWizard.tsx create mode 100644 packages/kilo-vscode/webview-ui/src/components/migration/index.ts create mode 100644 packages/kilo-vscode/webview-ui/src/components/migration/migration.css diff --git a/packages/kilo-vscode/package.json b/packages/kilo-vscode/package.json index a31aad7d90c..aaa27a5f690 100644 --- a/packages/kilo-vscode/package.json +++ b/packages/kilo-vscode/package.json @@ -110,6 +110,11 @@ "dark": "assets/icons/kilo-dark.svg" } }, + { + "command": "kilo-code.new.openMigrationWizard", + "title": "Migrate Settings from Legacy Version", + "category": "Kilo Code" + }, { "command": "kilo-code.new.autocomplete.generateSuggestions", "title": "Generate Suggested Edits", diff --git a/packages/kilo-vscode/src/KiloProvider.ts b/packages/kilo-vscode/src/KiloProvider.ts index 68e78813db9..e3af7135f8b 100644 --- a/packages/kilo-vscode/src/KiloProvider.ts +++ b/packages/kilo-vscode/src/KiloProvider.ts @@ -12,6 +12,9 @@ import { handleChatCompletionRequest } from "./services/autocomplete/chat-autoco import { handleChatCompletionAccepted } from "./services/autocomplete/chat-autocomplete/handleChatCompletionAccepted" import { buildWebviewHtml } from "./utils" import { TelemetryProxy, type TelemetryPropertiesProvider } from "./services/telemetry" +// legacy-migration start +import * as MigrationService from "./legacy-migration/migration-service" +// legacy-migration end import { sessionToWebview, indexProvidersById, @@ -149,6 +152,12 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper data: profileData, }) } + + // legacy-migration start + if (reason === "webviewReady") { + void this.checkAndShowMigrationWizard() + } + // legacy-migration end } public resolveWebviewView( @@ -507,6 +516,20 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper this.postMessage({ type: "variantsLoaded", variants }) break } + // legacy-migration start + case "requestLegacyMigrationData": + void this.handleRequestLegacyMigrationData() + break + case "startLegacyMigration": + void this.handleStartLegacyMigration(message.selections) + break + case "skipLegacyMigration": + void this.handleSkipLegacyMigration() + break + case "clearLegacyData": + void this.handleClearLegacyData() + break + // legacy-migration end } }) } @@ -1968,6 +1991,79 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper }) } + // legacy-migration start ------------------------------------------------------- + + /** + * Checks for legacy data on first run and auto-navigates to the migration wizard + * if the user has not yet been prompted. + */ + private async checkAndShowMigrationWizard(): Promise { + if (!this.extensionContext) return + const status = MigrationService.getMigrationStatus(this.extensionContext) + if (status) return // already prompted (skipped or completed) + + const data = await MigrationService.detectLegacyData(this.extensionContext) + if (!data.hasData) return + + console.log("[Kilo New] KiloProvider: ๐Ÿ”„ Legacy data detected, showing migration wizard") + this.postMessage({ type: "navigate", view: "migration" }) + this.postMessage({ + type: "legacyMigrationData", + data: { + providers: data.providers, + mcpServers: data.mcpServers, + customModes: data.customModes, + defaultModel: data.defaultModel, + }, + }) + } + + /** Sends the detected legacy data to the webview on explicit request. */ + private async handleRequestLegacyMigrationData(): Promise { + if (!this.extensionContext) return + const data = await MigrationService.detectLegacyData(this.extensionContext) + this.postMessage({ + type: "legacyMigrationData", + data: { + providers: data.providers, + mcpServers: data.mcpServers, + customModes: data.customModes, + defaultModel: data.defaultModel, + }, + }) + } + + /** Runs the migration for the selected items. */ + private async handleStartLegacyMigration( + selections: import("./legacy-migration/legacy-types").MigrationSelections, + ): Promise { + if (!this.extensionContext || !this.httpClient) return + const results = await MigrationService.migrate( + this.extensionContext, + this.httpClient, + selections, + (item, status, message) => { + this.postMessage({ type: "legacyMigrationProgress", item, status, message }) + }, + ) + await MigrationService.setMigrationStatus(this.extensionContext, "completed") + this.postMessage({ type: "legacyMigrationComplete", results }) + } + + /** Records that the user skipped migration. */ + private async handleSkipLegacyMigration(): Promise { + if (!this.extensionContext) return + await MigrationService.setMigrationStatus(this.extensionContext, "skipped") + } + + /** Clears legacy data from SecretStorage and globalState after user opts in. */ + private async handleClearLegacyData(): Promise { + if (!this.extensionContext) return + await MigrationService.clearLegacyData(this.extensionContext) + } + + // legacy-migration end --------------------------------------------------------- + /** * Dispose of the provider and clean up subscriptions. * Does NOT kill the server โ€” that's the connection service's job. diff --git a/packages/kilo-vscode/src/extension.ts b/packages/kilo-vscode/src/extension.ts index ecd6e1069b9..e95d625f083 100644 --- a/packages/kilo-vscode/src/extension.ts +++ b/packages/kilo-vscode/src/extension.ts @@ -70,6 +70,11 @@ export function activate(context: vscode.ExtensionContext) { vscode.commands.registerCommand("kilo-code.new.settingsButtonClicked", () => { provider.postMessage({ type: "action", action: "settingsButtonClicked" }) }), + // legacy-migration start + vscode.commands.registerCommand("kilo-code.new.openMigrationWizard", () => { + provider.postMessage({ type: "navigate", view: "migration" }) + }), + // legacy-migration end vscode.commands.registerCommand("kilo-code.new.openInTab", () => { return openKiloInNewTab(context, connectionService) }), diff --git a/packages/kilo-vscode/src/legacy-migration/index.ts b/packages/kilo-vscode/src/legacy-migration/index.ts new file mode 100644 index 00000000000..03927ac174a --- /dev/null +++ b/packages/kilo-vscode/src/legacy-migration/index.ts @@ -0,0 +1,8 @@ +/** + * legacy-migration - Barrel export. + * Delete this entire directory when dropping legacy migration support. + */ +export * from "./legacy-types" +export * from "./provider-mapping" +export * from "./migration-messages" +export * from "./migration-service" diff --git a/packages/kilo-vscode/src/legacy-migration/legacy-types.ts b/packages/kilo-vscode/src/legacy-migration/legacy-types.ts new file mode 100644 index 00000000000..ab4c7623ea0 --- /dev/null +++ b/packages/kilo-vscode/src/legacy-migration/legacy-types.ts @@ -0,0 +1,258 @@ +/** + * legacy-migration - Types for legacy Kilo Code extension (v5.x) data structures. + * + * These types represent the shapes stored in VS Code SecretStorage and on disk + * by the legacy extension (kilocode.kilo-code v5.x, a Roo Code fork). + * They are intentionally loose (allowing [key: string]: unknown) to tolerate + * schema drift between legacy versions. + */ + +// --------------------------------------------------------------------------- +// Provider profiles (stored in SecretStorage under "roo_cline_config_api_config") +// --------------------------------------------------------------------------- + +export interface LegacyProviderProfiles { + currentApiConfigName: string + apiConfigs: Record + modeApiConfigs?: Record +} + +/** + * Flat union of every provider-specific field from the legacy extension. + * Only the fields we actually need for migration are explicitly typed; + * the rest are captured by the index signature. + */ +export interface LegacyProviderSettings { + id?: string + apiProvider?: string + apiModelId?: string + + // Anthropic + apiKey?: string + anthropicBaseUrl?: string + + // OpenRouter + openRouterApiKey?: string + openRouterModelId?: string + openRouterBaseUrl?: string + + // OpenAI (custom/compatible) + openAiApiKey?: string + openAiModelId?: string + openAiBaseUrl?: string + + // OpenAI Native + openAiNativeApiKey?: string + openAiNativeBaseUrl?: string + + // Gemini + geminiApiKey?: string + googleGeminiBaseUrl?: string + + // Vertex AI + vertexJsonCredentials?: string + vertexProjectId?: string + vertexRegion?: string + + // AWS Bedrock + awsAccessKey?: string + awsSecretKey?: string + awsSessionToken?: string + awsRegion?: string + awsApiKey?: string + + // DeepSeek + deepSeekApiKey?: string + deepSeekBaseUrl?: string + + // Mistral + mistralApiKey?: string + + // Groq + groqApiKey?: string + + // xAI + xaiApiKey?: string + + // Fireworks + fireworksApiKey?: string + + // Featherless + featherlessApiKey?: string + + // Cerebras + cerebrasApiKey?: string + + // SambaNova + sambaNovaApiKey?: string + + // Ollama + ollamaApiKey?: string + ollamaBaseUrl?: string + ollamaModelId?: string + + // LM Studio + lmStudioBaseUrl?: string + lmStudioModelId?: string + + // Kilocode + kilocodeToken?: string + kilocodeModel?: string + + // LiteLLM + litellmApiKey?: string + litellmBaseUrl?: string + litellmModelId?: string + + // DeepInfra + deepInfraApiKey?: string + deepInfraBaseUrl?: string + deepInfraModelId?: string + + // Chutes + chutesApiKey?: string + + // Baseten + basetenApiKey?: string + + // Corethink + corethinkApiKey?: string + + // Unbound + unboundApiKey?: string + unboundModelId?: string + + // Requesty + requestyApiKey?: string + requestyBaseUrl?: string + requestyModelId?: string + + // Hugging Face + huggingFaceApiKey?: string + huggingFaceModelId?: string + + // IO Intelligence + ioIntelligenceApiKey?: string + ioIntelligenceModelId?: string + + // Vercel AI Gateway + vercelAiGatewayApiKey?: string + vercelAiGatewayModelId?: string + + // Z.ai + zaiApiKey?: string + + // Moonshot + moonshotApiKey?: string + moonshotBaseUrl?: string + + // Doubao + doubaoApiKey?: string + doubaoBaseUrl?: string + + // MiniMax + minimaxApiKey?: string + minimaxBaseUrl?: string + + // OVHcloud + ovhCloudAiEndpointsApiKey?: string + ovhCloudAiEndpointsBaseUrl?: string + ovhCloudAiEndpointsModelId?: string + + // Inception Labs + inceptionLabsApiKey?: string + inceptionLabsBaseUrl?: string + inceptionLabsModelId?: string + + // SAP AI Core + sapAiCoreServiceKey?: string + + // Synthetic + syntheticApiKey?: string + + // Allow dynamic property access for provider-mapping lookups + [key: string]: unknown +} + +// --------------------------------------------------------------------------- +// MCP settings (stored on disk at /settings/mcp_settings.json) +// --------------------------------------------------------------------------- + +export interface LegacyMcpSettings { + mcpServers: Record +} + +export interface LegacyMcpServer { + type?: "stdio" | "sse" | "streamable-http" + command?: string + args?: string[] + cwd?: string + url?: string + env?: Record + headers?: Record + disabled?: boolean + timeout?: number +} + +// --------------------------------------------------------------------------- +// Custom modes (stored on disk at /settings/custom_modes.yaml) +// --------------------------------------------------------------------------- + +export interface LegacyCustomModesFile { + customModes: LegacyCustomMode[] +} + +export interface LegacyCustomMode { + slug: string + name: string + roleDefinition: string + customInstructions?: string + whenToUse?: string + description?: string + groups: Array]> +} + +// --------------------------------------------------------------------------- +// Migration data shapes +// --------------------------------------------------------------------------- + +export interface MigrationProviderInfo { + profileName: string + provider: string + model?: string + hasApiKey: boolean + supported: boolean + newProviderName?: string +} + +export interface MigrationMcpServerInfo { + name: string + type: string +} + +export interface MigrationCustomModeInfo { + name: string + slug: string +} + +export interface LegacyMigrationData { + providers: MigrationProviderInfo[] + mcpServers: MigrationMcpServerInfo[] + customModes: MigrationCustomModeInfo[] + defaultModel?: { provider: string; model: string } + hasData: boolean +} + +export interface MigrationSelections { + providers: string[] + mcpServers: string[] + customModes: string[] + defaultModel: boolean +} + +export interface MigrationResultItem { + item: string + category: "provider" | "mcpServer" | "customMode" | "defaultModel" + status: "success" | "warning" | "error" + message?: string +} diff --git a/packages/kilo-vscode/src/legacy-migration/migration-messages.ts b/packages/kilo-vscode/src/legacy-migration/migration-messages.ts new file mode 100644 index 00000000000..dc74e83ea0e --- /dev/null +++ b/packages/kilo-vscode/src/legacy-migration/migration-messages.ts @@ -0,0 +1,69 @@ +/** + * legacy-migration - Message type definitions for migration wizard communication. + * + * These types extend the extension โ†” webview message contract specifically for + * the legacy migration wizard. They are defined here to keep them isolated from + * the main messages.ts file and easy to remove. + */ + +import type { + MigrationProviderInfo, + MigrationMcpServerInfo, + MigrationCustomModeInfo, + MigrationSelections, + MigrationResultItem, +} from "./legacy-types" + +// --------------------------------------------------------------------------- +// Extension โ†’ Webview +// --------------------------------------------------------------------------- + +/** Sends detected legacy data to the wizard for display in the selection step. */ +export interface LegacyMigrationDataMessage { + type: "legacyMigrationData" + data: { + providers: MigrationProviderInfo[] + mcpServers: MigrationMcpServerInfo[] + customModes: MigrationCustomModeInfo[] + defaultModel?: { provider: string; model: string } + } +} + +/** Real-time progress update for a single item being migrated. */ +export interface LegacyMigrationProgressMessage { + type: "legacyMigrationProgress" + item: string + status: "migrating" | "success" | "warning" | "error" + message?: string +} + +/** Final results once all selected items have been processed. */ +export interface LegacyMigrationCompleteMessage { + type: "legacyMigrationComplete" + results: MigrationResultItem[] +} + +// --------------------------------------------------------------------------- +// Webview โ†’ Extension +// --------------------------------------------------------------------------- + +/** Webview requests the legacy data payload (e.g. on component mount). */ +export interface RequestLegacyMigrationDataMessage { + type: "requestLegacyMigrationData" +} + +/** User has confirmed selections and wants to start migration. */ +export interface StartLegacyMigrationMessage { + type: "startLegacyMigration" + selections: MigrationSelections +} + +/** User chose to skip migration entirely. */ +export interface SkipLegacyMigrationMessage { + type: "skipLegacyMigration" +} + +/** User opted to clear legacy data after successful migration. */ +export interface ClearLegacyDataMessage { + type: "clearLegacyData" +} diff --git a/packages/kilo-vscode/src/legacy-migration/migration-service.ts b/packages/kilo-vscode/src/legacy-migration/migration-service.ts new file mode 100644 index 00000000000..d0cedf3d81d --- /dev/null +++ b/packages/kilo-vscode/src/legacy-migration/migration-service.ts @@ -0,0 +1,506 @@ +/** + * legacy-migration - Core migration service. + * + * Reads legacy Kilo Code v5.x data from VS Code SecretStorage and the extension's + * global storage directory, then writes it to the new CLI backend via HTTP. + */ + +import * as vscode from "vscode" +import type { HttpClient } from "../services/cli-backend/http-client" +import type { McpServerConfig, AgentConfig } from "../services/cli-backend/types" +import { PROVIDER_MAP, UNSUPPORTED_PROVIDERS, DEFAULT_MODE_SLUGS } from "./provider-mapping" +import type { + LegacyProviderProfiles, + LegacyProviderSettings, + LegacyMcpSettings, + LegacyCustomMode, + LegacyMcpServer, + LegacyMigrationData, + MigrationSelections, + MigrationProviderInfo, + MigrationMcpServerInfo, + MigrationCustomModeInfo, + MigrationResultItem, +} from "./legacy-types" + +// --------------------------------------------------------------------------- +// Constants +// --------------------------------------------------------------------------- + +const SECRET_KEY = "roo_cline_config_api_config" +const MIGRATION_STATUS_KEY = "kilo.legacyMigrationStatus" + +type MigrationStatus = "completed" | "skipped" + +// --------------------------------------------------------------------------- +// Status helpers +// --------------------------------------------------------------------------- + +export function getMigrationStatus(context: vscode.ExtensionContext): MigrationStatus | undefined { + return context.globalState.get(MIGRATION_STATUS_KEY) +} + +export async function setMigrationStatus(context: vscode.ExtensionContext, status: MigrationStatus): Promise { + await context.globalState.update(MIGRATION_STATUS_KEY, status) +} + +// --------------------------------------------------------------------------- +// Detection +// --------------------------------------------------------------------------- + +/** + * Reads legacy data from SecretStorage and global storage files. + * Returns a structured summary for display in the migration wizard. + */ +export async function detectLegacyData(context: vscode.ExtensionContext): Promise { + const profiles = await readLegacyProviderProfiles(context) + const mcpSettings = await readLegacyMcpSettings(context) + const customModes = await readLegacyCustomModes(context) + + const providers = buildProviderList(profiles) + const mcpServers = buildMcpServerList(mcpSettings) + const modes = buildCustomModeList(customModes) + const defaultModel = resolveDefaultModel(profiles) + + const hasData = providers.length > 0 || mcpServers.length > 0 || modes.length > 0 + + return { providers, mcpServers, customModes: modes, defaultModel, hasData } +} + +// --------------------------------------------------------------------------- +// Migration +// --------------------------------------------------------------------------- + +export type ProgressCallback = ( + item: string, + status: "migrating" | "success" | "warning" | "error", + message?: string, +) => void + +/** + * Executes migration for the selected items. + * Calls onProgress for each item with real-time status updates. + */ +export async function migrate( + context: vscode.ExtensionContext, + httpClient: HttpClient, + selections: MigrationSelections, + onProgress: ProgressCallback, +): Promise { + const profiles = await readLegacyProviderProfiles(context) + const mcpSettings = await readLegacyMcpSettings(context) + const customModes = await readLegacyCustomModes(context) + + const results: MigrationResultItem[] = [] + + // Migrate provider API keys + for (const profileName of selections.providers) { + const settings = profiles?.apiConfigs[profileName] + if (!settings) { + results.push({ item: profileName, category: "provider", status: "error", message: "Profile not found" }) + continue + } + onProgress(profileName, "migrating") + const result = await migrateProvider(profileName, settings, httpClient) + results.push(result) + onProgress(profileName, result.status, result.message) + } + + // Migrate MCP servers + if (selections.mcpServers.length > 0 && mcpSettings) { + const mcpConfig: Record = {} + for (const name of selections.mcpServers) { + const server = mcpSettings.mcpServers[name] + if (!server) { + results.push({ item: name, category: "mcpServer", status: "error", message: "Server not found" }) + continue + } + onProgress(name, "migrating") + const converted = convertMcpServer(server) + if (converted) { + mcpConfig[name] = converted + results.push({ item: name, category: "mcpServer", status: "success" }) + onProgress(name, "success") + } else { + results.push({ + item: name, + category: "mcpServer", + status: "warning", + message: "Could not convert server config", + }) + onProgress(name, "warning", "Could not convert server config") + } + } + if (Object.keys(mcpConfig).length > 0) { + await httpClient.updateConfig({ mcp: mcpConfig }) + } + } + + // Migrate custom modes as agents + if (selections.customModes.length > 0 && customModes) { + const agentConfig: Record = {} + for (const slug of selections.customModes) { + const mode = customModes.find((m) => m.slug === slug) + if (!mode) { + results.push({ item: slug, category: "customMode", status: "error", message: "Mode not found" }) + continue + } + onProgress(mode.name, "migrating") + agentConfig[slug] = convertCustomMode(mode) + results.push({ item: mode.name, category: "customMode", status: "success" }) + onProgress(mode.name, "success") + } + if (Object.keys(agentConfig).length > 0) { + await httpClient.updateConfig({ agent: agentConfig }) + } + } + + // Migrate default model + if (selections.defaultModel && profiles) { + const activeName = profiles.currentApiConfigName + const active = profiles.apiConfigs[activeName] + if (active) { + onProgress("Default model", "migrating") + const result = await migrateDefaultModel(active, httpClient) + results.push(result) + onProgress("Default model", result.status, result.message) + } + } + + return results +} + +// --------------------------------------------------------------------------- +// Cleanup +// --------------------------------------------------------------------------- + +/** + * Removes legacy data from SecretStorage and relevant globalState keys. + */ +export async function clearLegacyData(context: vscode.ExtensionContext): Promise { + await context.secrets.delete(SECRET_KEY) + + const legacyStateKeys = [ + "kilo-code.allowedCommands", + "kilo-code.deniedCommands", + "kilo-code.autoApprovalEnabled", + "kilo-code.fuzzyMatchThreshold", + "kilo-code.diffEnabled", + "kilo-code.language", + "kilo-code.customModes", + "kilo-code.firstInstallCompleted", + "kilo-code.telemetrySetting", + ] + for (const key of legacyStateKeys) { + await context.globalState.update(key, undefined) + } +} + +// --------------------------------------------------------------------------- +// Internal โ€” provider migration +// --------------------------------------------------------------------------- + +async function migrateProvider( + profileName: string, + settings: LegacyProviderSettings, + httpClient: HttpClient, +): Promise { + const provider = settings.apiProvider + if (!provider) { + return { item: profileName, category: "provider", status: "error", message: "No provider type found" } + } + + if (UNSUPPORTED_PROVIDERS.has(provider)) { + return { + item: profileName, + category: "provider", + status: "warning", + message: `Provider "${provider}" is not supported in the new version`, + } + } + + const mapping = PROVIDER_MAP[provider] + if (!mapping) { + return { + item: profileName, + category: "provider", + status: "warning", + message: `Unknown provider "${provider}"`, + } + } + + const apiKey = settings[mapping.key] as string | undefined + if (!apiKey) { + return { item: profileName, category: "provider", status: "warning", message: "No API key found in profile" } + } + + await httpClient.setAuth(mapping.id, { type: "api", key: apiKey }) + + // If a custom base URL is configured, also persist it to the backend config + if (mapping.urlField) { + const url = settings[mapping.urlField] as string | undefined + if (url) { + await httpClient.updateConfig({ + provider: { [mapping.id]: { api_key: apiKey, base_url: url } }, + }) + } + } + + return { item: profileName, category: "provider", status: "success" } +} + +async function migrateDefaultModel( + settings: LegacyProviderSettings, + httpClient: HttpClient, +): Promise { + const provider = settings.apiProvider + if (!provider) { + return { item: "Default model", category: "defaultModel", status: "error", message: "No provider type found" } + } + + const mapping = PROVIDER_MAP[provider] + if (!mapping) { + return { + item: "Default model", + category: "defaultModel", + status: "warning", + message: `Provider "${provider}" is not supported in the new version`, + } + } + + const modelField = mapping.modelField ?? "apiModelId" + const modelId = settings[modelField] as string | undefined + if (!modelId) { + return { item: "Default model", category: "defaultModel", status: "warning", message: "No model ID found" } + } + + await httpClient.updateConfig({ model: `${mapping.id}/${modelId}` }) + return { item: "Default model", category: "defaultModel", status: "success" } +} + +// --------------------------------------------------------------------------- +// Internal โ€” MCP conversion (legacy โ†’ McpServerConfig) +// --------------------------------------------------------------------------- + +function convertMcpServer(server: LegacyMcpServer): McpServerConfig | null { + if (server.type === "sse" || server.type === "streamable-http") { + if (!server.url) return null + return { url: server.url, headers: server.headers } + } + // Default: stdio + if (!server.command) return null + return { + command: server.command, + args: server.args, + env: server.env, + } +} + +// --------------------------------------------------------------------------- +// Internal โ€” custom mode conversion (legacy โ†’ AgentConfig) +// --------------------------------------------------------------------------- + +function convertCustomMode(mode: LegacyCustomMode): AgentConfig { + const prompt = [mode.roleDefinition, mode.customInstructions].filter(Boolean).join("\n\n") + return { prompt } +} + +// --------------------------------------------------------------------------- +// Internal โ€” reading legacy data from storage +// --------------------------------------------------------------------------- + +async function readLegacyProviderProfiles(context: vscode.ExtensionContext): Promise { + const raw = await context.secrets.get(SECRET_KEY) + if (!raw) return null + const parsed = JSON.parse(raw) as Record + if (!parsed.apiConfigs || typeof parsed.apiConfigs !== "object") return null + return parsed as unknown as LegacyProviderProfiles +} + +async function readLegacyMcpSettings(context: vscode.ExtensionContext): Promise { + const filePath = vscode.Uri.joinPath(context.globalStorageUri, "settings", "mcp_settings.json") + const bytes = await vscode.workspace.fs.readFile(filePath).then( + (b) => b, + () => null, + ) + if (!bytes) return null + const parsed = JSON.parse(Buffer.from(bytes).toString("utf8")) as Record + if (!parsed.mcpServers || typeof parsed.mcpServers !== "object") return null + return parsed as unknown as LegacyMcpSettings +} + +async function readLegacyCustomModes(context: vscode.ExtensionContext): Promise { + const filePath = vscode.Uri.joinPath(context.globalStorageUri, "settings", "custom_modes.yaml") + const bytes = await vscode.workspace.fs.readFile(filePath).then( + (b) => b, + () => null, + ) + if (!bytes) return null + const text = Buffer.from(bytes).toString("utf8") + return parseCustomModesYaml(text) +} + +/** + * Minimal YAML parser for the custom_modes.yaml format. + * Tries JSON first (some legacy versions stored JSON), then parses the simple + * YAML structure manually to avoid a runtime dependency on a YAML library. + */ +function parseCustomModesYaml(text: string): LegacyCustomMode[] | null { + // Try JSON first + const jsonResult = (() => { + try { + const parsed = JSON.parse(text) as { customModes?: LegacyCustomMode[] } + return parsed.customModes ?? null + } catch { + return null + } + })() + if (jsonResult) return jsonResult + + // Parse the simple YAML shape: + // customModes: + // - slug: xxx + // name: xxx + // roleDefinition: | + // ... + // groups: + // - read + const modes: LegacyCustomMode[] = [] + const lines = text.split("\n") + let inModes = false + let current: Partial | null = null + let inRoleDefinition = false + let inGroups = false + let roleLines: string[] = [] + + const flush = () => { + if (current?.slug && current?.name) { + if (!current.roleDefinition && roleLines.length > 0) { + current.roleDefinition = roleLines.join("\n").trim() + } + modes.push({ groups: [], ...current } as LegacyCustomMode) + } + current = null + inRoleDefinition = false + inGroups = false + roleLines = [] + } + + for (const rawLine of lines) { + if (!inModes) { + if (rawLine.trim() === "customModes:") inModes = true + continue + } + + if (/^ - slug: /.test(rawLine)) { + flush() + current = { slug: rawLine.replace(/^ - slug: /, "").trim(), groups: [] } + continue + } + + if (!current) continue + + if (/^ name: /.test(rawLine)) { + current.name = rawLine.replace(/^ name: /, "").trim() + continue + } + + if (/^ roleDefinition: [|>]/.test(rawLine)) { + inRoleDefinition = true + inGroups = false + roleLines = [] + continue + } + + if (/^ roleDefinition: /.test(rawLine) && !inRoleDefinition) { + current.roleDefinition = rawLine.replace(/^ roleDefinition: /, "").trim() + continue + } + + if (inRoleDefinition) { + if (/^ /.test(rawLine)) { + roleLines.push(rawLine.replace(/^ /, "")) + continue + } + current.roleDefinition = roleLines.join("\n").trim() + inRoleDefinition = false + roleLines = [] + } + + if (/^ customInstructions: /.test(rawLine)) { + current.customInstructions = rawLine.replace(/^ customInstructions: /, "").trim() + continue + } + + if (/^ groups:/.test(rawLine)) { + inGroups = true + current.groups = [] + continue + } + + if (inGroups && /^ - /.test(rawLine)) { + const group = rawLine.replace(/^ - /, "").trim() + current.groups = [...(current.groups ?? []), group] + continue + } + + if (inGroups && !/^ /.test(rawLine)) { + inGroups = false + } + } + + flush() + return modes.length > 0 ? modes : null +} + +// --------------------------------------------------------------------------- +// Internal โ€” building display lists for the wizard +// --------------------------------------------------------------------------- + +function buildProviderList(profiles: LegacyProviderProfiles | null): MigrationProviderInfo[] { + if (!profiles?.apiConfigs) return [] + + return Object.entries(profiles.apiConfigs).map(([profileName, settings]) => { + const provider = settings.apiProvider ?? "unknown" + const mapping = PROVIDER_MAP[provider] + const unsupported = UNSUPPORTED_PROVIDERS.has(provider) + + const modelField = mapping?.modelField ?? "apiModelId" + const model = settings[modelField] as string | undefined + + const hasApiKey = mapping ? Boolean(settings[mapping.key]) : false + + return { + profileName, + provider, + model, + hasApiKey, + supported: Boolean(mapping) && !unsupported, + newProviderName: mapping?.name, + } + }) +} + +function buildMcpServerList(settings: LegacyMcpSettings | null): MigrationMcpServerInfo[] { + if (!settings?.mcpServers) return [] + return Object.entries(settings.mcpServers) + .filter(([, server]) => !server.disabled) + .map(([name, server]) => ({ name, type: server.type ?? "stdio" })) +} + +function buildCustomModeList(modes: LegacyCustomMode[] | null): MigrationCustomModeInfo[] { + if (!modes) return [] + return modes.filter((m) => !DEFAULT_MODE_SLUGS.has(m.slug)).map((m) => ({ name: m.name, slug: m.slug })) +} + +function resolveDefaultModel(profiles: LegacyProviderProfiles | null): { provider: string; model: string } | undefined { + if (!profiles?.currentApiConfigName) return undefined + const active = profiles.apiConfigs[profiles.currentApiConfigName] + if (!active?.apiProvider) return undefined + const mapping = PROVIDER_MAP[active.apiProvider] + if (!mapping) return undefined + const modelField = mapping.modelField ?? "apiModelId" + const model = active[modelField] as string | undefined + if (!model) return undefined + return { provider: mapping.name, model } +} diff --git a/packages/kilo-vscode/src/legacy-migration/provider-mapping.ts b/packages/kilo-vscode/src/legacy-migration/provider-mapping.ts new file mode 100644 index 00000000000..e5c82003263 --- /dev/null +++ b/packages/kilo-vscode/src/legacy-migration/provider-mapping.ts @@ -0,0 +1,261 @@ +/** + * legacy-migration - Maps legacy apiProvider values to new provider IDs and key fields. + * + * The legacy extension used flat per-provider key names (e.g. apiKey, openRouterApiKey). + * The new CLI backend uses a per-provider auth endpoint (PUT /auth/:providerId). + */ + +export interface ProviderMapping { + /** New provider ID for the auth endpoint (PUT /auth/:id) */ + id: string + /** Field name in LegacyProviderSettings holding the primary API key */ + key: string + /** Display name for the provider in the wizard UI */ + name: string + /** Field holding model ID (defaults to "apiModelId") */ + modelField?: string + /** Field holding custom base URL (to also store in config) */ + urlField?: string +} + +/** + * Maps legacy `apiProvider` values โ†’ new provider info. + * Providers absent from this map are flagged as unsupported. + */ +export const PROVIDER_MAP: Record = { + anthropic: { + id: "anthropic", + key: "apiKey", + name: "Anthropic", + }, + openrouter: { + id: "openrouter", + key: "openRouterApiKey", + name: "OpenRouter", + modelField: "openRouterModelId", + }, + openai: { + id: "openai-compatible", + key: "openAiApiKey", + name: "OpenAI (Compatible)", + modelField: "openAiModelId", + urlField: "openAiBaseUrl", + }, + "openai-native": { + id: "openai", + key: "openAiNativeApiKey", + name: "OpenAI", + urlField: "openAiNativeBaseUrl", + }, + "openai-responses": { + id: "openai", + key: "openAiApiKey", + name: "OpenAI", + modelField: "openAiModelId", + }, + gemini: { + id: "google", + key: "geminiApiKey", + name: "Google Gemini", + urlField: "googleGeminiBaseUrl", + }, + vertex: { + id: "google-vertex", + key: "vertexJsonCredentials", + name: "Google Vertex AI", + }, + bedrock: { + id: "amazon-bedrock", + key: "awsAccessKey", + name: "AWS Bedrock", + }, + deepseek: { + id: "deepseek", + key: "deepSeekApiKey", + name: "DeepSeek", + urlField: "deepSeekBaseUrl", + }, + mistral: { + id: "mistral", + key: "mistralApiKey", + name: "Mistral", + }, + groq: { + id: "groq", + key: "groqApiKey", + name: "Groq", + }, + xai: { + id: "xai", + key: "xaiApiKey", + name: "xAI", + }, + fireworks: { + id: "fireworks", + key: "fireworksApiKey", + name: "Fireworks", + }, + featherless: { + id: "featherless", + key: "featherlessApiKey", + name: "Featherless", + }, + cerebras: { + id: "cerebras", + key: "cerebrasApiKey", + name: "Cerebras", + }, + sambanova: { + id: "sambanova", + key: "sambaNovaApiKey", + name: "SambaNova", + }, + ollama: { + id: "ollama", + key: "ollamaApiKey", + name: "Ollama", + modelField: "ollamaModelId", + urlField: "ollamaBaseUrl", + }, + lmstudio: { + id: "lmstudio", + key: "lmStudioBaseUrl", + name: "LM Studio", + modelField: "lmStudioModelId", + urlField: "lmStudioBaseUrl", + }, + kilocode: { + id: "kilo", + key: "kilocodeToken", + name: "Kilo (Gateway)", + modelField: "kilocodeModel", + }, + litellm: { + id: "litellm", + key: "litellmApiKey", + name: "LiteLLM", + modelField: "litellmModelId", + urlField: "litellmBaseUrl", + }, + deepinfra: { + id: "deepinfra", + key: "deepInfraApiKey", + name: "DeepInfra", + modelField: "deepInfraModelId", + urlField: "deepInfraBaseUrl", + }, + chutes: { + id: "chutes", + key: "chutesApiKey", + name: "Chutes", + }, + baseten: { + id: "baseten", + key: "basetenApiKey", + name: "Baseten", + }, + corethink: { + id: "corethink", + key: "corethinkApiKey", + name: "Corethink", + }, + unbound: { + id: "unbound", + key: "unboundApiKey", + name: "Unbound", + modelField: "unboundModelId", + }, + requesty: { + id: "requesty", + key: "requestyApiKey", + name: "Requesty", + modelField: "requestyModelId", + urlField: "requestyBaseUrl", + }, + huggingface: { + id: "huggingface", + key: "huggingFaceApiKey", + name: "Hugging Face", + modelField: "huggingFaceModelId", + }, + "io-intelligence": { + id: "io-intelligence", + key: "ioIntelligenceApiKey", + name: "IO Intelligence", + modelField: "ioIntelligenceModelId", + }, + "vercel-ai-gateway": { + id: "vercel-ai-gateway", + key: "vercelAiGatewayApiKey", + name: "Vercel AI Gateway", + modelField: "vercelAiGatewayModelId", + }, + zai: { + id: "zai", + key: "zaiApiKey", + name: "Z.ai", + }, + moonshot: { + id: "moonshot", + key: "moonshotApiKey", + name: "Moonshot", + urlField: "moonshotBaseUrl", + }, + doubao: { + id: "doubao", + key: "doubaoApiKey", + name: "Doubao", + urlField: "doubaoBaseUrl", + }, + minimax: { + id: "minimax", + key: "minimaxApiKey", + name: "MiniMax", + urlField: "minimaxBaseUrl", + }, + ovhcloud: { + id: "ovhcloud", + key: "ovhCloudAiEndpointsApiKey", + name: "OVHcloud AI Endpoints", + modelField: "ovhCloudAiEndpointsModelId", + urlField: "ovhCloudAiEndpointsBaseUrl", + }, + inception: { + id: "inception", + key: "inceptionLabsApiKey", + name: "Inception Labs", + modelField: "inceptionLabsModelId", + urlField: "inceptionLabsBaseUrl", + }, + "sap-ai-core": { + id: "sap-ai-core", + key: "sapAiCoreServiceKey", + name: "SAP AI Core", + }, + synthetic: { + id: "synthetic", + key: "syntheticApiKey", + name: "Synthetic", + }, +} + +/** Providers that have no equivalent in the new CLI backend */ +export const UNSUPPORTED_PROVIDERS = new Set([ + "fake-ai", + "human-relay", + "vscode-lm", + "claude-code", + "openai-codex", + "qwen-code", + "virtual-quota-fallback", + "glama", + "roo", + "nano-gpt", + "poe", + "aihubmix", + "apertis", + "zenmux", +]) + +/** Built-in default mode slugs that should not be migrated */ +export const DEFAULT_MODE_SLUGS = new Set(["code", "build", "architect", "ask", "debug", "orchestrator", "review"]) diff --git a/packages/kilo-vscode/webview-ui/src/App.tsx b/packages/kilo-vscode/webview-ui/src/App.tsx index d466bb1960f..f93c9cdb459 100644 --- a/packages/kilo-vscode/webview-ui/src/App.tsx +++ b/packages/kilo-vscode/webview-ui/src/App.tsx @@ -28,12 +28,21 @@ registerExpandedTaskTool() registerVscodeToolOverrides() import SessionList from "./components/history/SessionList" import CloudSessionList from "./components/history/CloudSessionList" +import { MigrationWizard } from "./components/migration" // legacy-migration import { NotificationsProvider } from "./context/notifications" import type { Message as SDKMessage, Part as SDKPart } from "@kilocode/sdk/v2" import "./styles/chat.css" -type ViewType = "newTask" | "marketplace" | "history" | "cloudHistory" | "profile" | "settings" -const VALID_VIEWS = new Set(["newTask", "marketplace", "history", "cloudHistory", "profile", "settings"]) +type ViewType = "newTask" | "marketplace" | "history" | "cloudHistory" | "profile" | "settings" | "migration" // legacy-migration +const VALID_VIEWS = new Set([ + "newTask", + "marketplace", + "history", + "cloudHistory", + "profile", + "settings", + "migration", +]) // legacy-migration const DummyView: Component<{ title: string }> = (props) => { return ( @@ -240,8 +249,14 @@ const AppContent: Component = () => { /> - setCurrentView("newTask")} /> + setCurrentView("newTask")} onMigrateClick={() => setCurrentView("migration")} /> + {/* legacy-migration */} + {/* legacy-migration start */} + + setCurrentView("newTask")} onComplete={() => setCurrentView("newTask")} /> + + {/* legacy-migration end */} ) diff --git a/packages/kilo-vscode/webview-ui/src/components/migration/MigrationWizard.tsx b/packages/kilo-vscode/webview-ui/src/components/migration/MigrationWizard.tsx new file mode 100644 index 00000000000..bfbdfd822c4 --- /dev/null +++ b/packages/kilo-vscode/webview-ui/src/components/migration/MigrationWizard.tsx @@ -0,0 +1,554 @@ +/** + * legacy-migration - Multi-step migration wizard UI component. + * + * Steps: + * 1. Welcome โ€” informs the user about what can / cannot be migrated + * 2. Select โ€” checkboxes for providers, MCP servers, custom modes, default model + * 3. Progress โ€” live progress indicators during migration + * 4. Complete โ€” summary + optional cleanup checkbox + */ + +import { Component, For, Show, createSignal, onMount, onCleanup, JSX } from "solid-js" +import { useVSCode } from "../../context/vscode" +import { useLanguage } from "../../context/language" +import type { + MigrationProviderInfo, + MigrationMcpServerInfo, + MigrationCustomModeInfo, + MigrationResultItem, + LegacyMigrationDataMessage, + LegacyMigrationProgressMessage, + LegacyMigrationCompleteMessage, +} from "../../types/messages" +import "./migration.css" + +// --------------------------------------------------------------------------- +// KiloLogo โ€” replicates the pattern from MessageList.tsx +// --------------------------------------------------------------------------- + +const KiloLogo = (): JSX.Element => { + const iconsBaseUri = (window as { ICONS_BASE_URI?: string }).ICONS_BASE_URI || "" + const isLight = + document.body.classList.contains("vscode-light") || document.body.classList.contains("vscode-high-contrast-light") + const icon = isLight ? "kilo-light.svg" : "kilo-dark.svg" + return ( + + ) +} + +// --------------------------------------------------------------------------- +// Types +// --------------------------------------------------------------------------- + +type Step = "welcome" | "select" | "progress" | "complete" + +interface ProgressEntry { + item: string + status: "pending" | "migrating" | "success" | "warning" | "error" + message?: string +} + +// --------------------------------------------------------------------------- +// Component +// --------------------------------------------------------------------------- + +export interface MigrationWizardProps { + onBack: () => void + onComplete: () => void +} + +const MigrationWizard: Component = (props) => { + const vscode = useVSCode() + const language = useLanguage() + + const [step, setStep] = createSignal("welcome") + const [providers, setProviders] = createSignal([]) + const [mcpServers, setMcpServers] = createSignal([]) + const [customModes, setCustomModes] = createSignal([]) + const [defaultModel, setDefaultModel] = createSignal<{ provider: string; model: string } | undefined>(undefined) + + // Selections (profile names / server names / mode slugs) + const [selectedProviders, setSelectedProviders] = createSignal>(new Set()) + const [selectedMcpServers, setSelectedMcpServers] = createSignal>(new Set()) + const [selectedModes, setSelectedModes] = createSignal>(new Set()) + const [migrateDefaultModel, setMigrateDefaultModel] = createSignal(true) + + // Progress tracking + const [progressEntries, setProgressEntries] = createSignal([]) + const [results, setResults] = createSignal([]) + const [migrationDone, setMigrationDone] = createSignal(false) + + // Cleanup preference on the completion screen + const [clearLegacyData, setClearLegacyData] = createSignal(false) + + // --------------------------------------------------------------------------- + // Message handling + // --------------------------------------------------------------------------- + + onMount(() => { + const handler = (event: MessageEvent) => { + const msg = event.data + if (msg?.type === "legacyMigrationData") { + const data = (msg as LegacyMigrationDataMessage).data + setProviders(data.providers) + setMcpServers(data.mcpServers) + setCustomModes(data.customModes) + setDefaultModel(data.defaultModel) + + // Pre-select everything that is supported and has a key + setSelectedProviders( + new Set(data.providers.filter((p) => p.supported && p.hasApiKey).map((p) => p.profileName)), + ) + setSelectedMcpServers(new Set(data.mcpServers.map((s) => s.name))) + setSelectedModes(new Set(data.customModes.map((m) => m.slug))) + setMigrateDefaultModel(Boolean(data.defaultModel)) + } + + if (msg?.type === "legacyMigrationProgress") { + const update = msg as LegacyMigrationProgressMessage + setProgressEntries((prev) => { + const existing = prev.findIndex((e) => e.item === update.item) + const entry: ProgressEntry = { item: update.item, status: update.status, message: update.message } + return existing >= 0 ? prev.map((e, i) => (i === existing ? entry : e)) : [...prev, entry] + }) + } + + if (msg?.type === "legacyMigrationComplete") { + const complete = msg as LegacyMigrationCompleteMessage + setResults(complete.results) + setMigrationDone(true) + setStep("complete") + } + } + + window.addEventListener("message", handler) + // Request data immediately when the wizard mounts + vscode.postMessage({ type: "requestLegacyMigrationData" }) + onCleanup(() => window.removeEventListener("message", handler)) + }) + + // --------------------------------------------------------------------------- + // Actions + // --------------------------------------------------------------------------- + + const handleSkip = () => { + vscode.postMessage({ type: "skipLegacyMigration" }) + props.onBack() + } + + const handleStartMigration = () => { + const allItems: ProgressEntry[] = [ + ...Array.from(selectedProviders()).map((name) => ({ item: name, status: "pending" as const })), + ...Array.from(selectedMcpServers()).map((name) => ({ item: name, status: "pending" as const })), + ...Array.from(selectedModes()).map((slug) => { + const mode = customModes().find((m) => m.slug === slug) + return { item: mode?.name ?? slug, status: "pending" as const } + }), + ...(migrateDefaultModel() && defaultModel() ? [{ item: "Default model", status: "pending" as const }] : []), + ] + setProgressEntries(allItems) + setStep("progress") + vscode.postMessage({ + type: "startLegacyMigration", + selections: { + providers: Array.from(selectedProviders()), + mcpServers: Array.from(selectedMcpServers()), + customModes: Array.from(selectedModes()), + defaultModel: migrateDefaultModel(), + }, + }) + } + + const handleDone = () => { + if (clearLegacyData()) { + vscode.postMessage({ type: "clearLegacyData" }) + } + props.onComplete() + } + + // --------------------------------------------------------------------------- + // Selection helpers + // --------------------------------------------------------------------------- + + const toggleProvider = (name: string) => { + setSelectedProviders((prev) => { + const next = new Set(prev) + next.has(name) ? next.delete(name) : next.add(name) + return next + }) + } + + const toggleMcpServer = (name: string) => { + setSelectedMcpServers((prev) => { + const next = new Set(prev) + next.has(name) ? next.delete(name) : next.add(name) + return next + }) + } + + const toggleMode = (slug: string) => { + setSelectedModes((prev) => { + const next = new Set(prev) + next.has(slug) ? next.delete(slug) : next.add(slug) + return next + }) + } + + const hasAnySelection = () => + selectedProviders().size > 0 || + selectedMcpServers().size > 0 || + selectedModes().size > 0 || + (migrateDefaultModel() && Boolean(defaultModel())) + + // --------------------------------------------------------------------------- + // Result summary helpers + // --------------------------------------------------------------------------- + + const successCount = () => results().filter((r) => r.status === "success").length + const totalCount = () => results().length + const hasWarnings = () => results().some((r) => r.status === "warning" || r.status === "error") + + // --------------------------------------------------------------------------- + // Step indicator helper + // --------------------------------------------------------------------------- + + const STEPS: Step[] = ["welcome", "select", "progress", "complete"] + + const stepClass = (s: Step) => { + const current = STEPS.indexOf(step()) + const idx = STEPS.indexOf(s) + return ( + "migration-wizard__step" + + (step() === s ? " migration-wizard__step--active" : "") + + (current > idx ? " migration-wizard__step--done" : "") + ) + } + + // --------------------------------------------------------------------------- + // Render helpers + // --------------------------------------------------------------------------- + + const statusIcon = (status: ProgressEntry["status"]) => { + switch (status) { + case "pending": + return "โ—‹" + case "migrating": + return "โ—Œ" + case "success": + return "โœ“" + case "warning": + return "โš " + case "error": + return "โœ—" + } + } + + const statusColor = (status: ProgressEntry["status"]) => { + switch (status) { + case "success": + return "var(--vscode-testing-iconPassed, #89d185)" + case "warning": + return "var(--vscode-testing-iconQueued, #cca700)" + case "error": + return "var(--vscode-testing-iconFailed, #f14c4c)" + default: + return "var(--vscode-descriptionForeground)" + } + } + + // --------------------------------------------------------------------------- + // JSX + // --------------------------------------------------------------------------- + + return ( +
+ {/* Header โ€” only shown on steps 2-4 */} + +
+

{language.t("migration.welcome.title")}

+
+
+ +
+ {/* Step indicator โ€” only shown on steps 2-4 */} + +
+
1
+ +
2
+ +
3
+ +
4
+
+
+ + {/* ---- Step 1: Welcome ---- */} + +
+ +

{language.t("migration.welcome.title")}

+

{language.t("migration.welcome.detected")}

+ +
+
+ {language.t("migration.welcome.sessionsInfo")} +
+ +
+

{language.t("migration.welcome.canMigrate")}

+
    + 0}> +
  • + {language.t("migration.select.providers")} ({providers().filter((p) => p.supported).length}) +
  • +
    + 0}> +
  • + {language.t("migration.select.mcpServers")} ({mcpServers().length}) +
  • +
    + 0}> +
  • + {language.t("migration.select.customModes")} ({customModes().length}) +
  • +
    + +
  • {language.t("migration.select.defaultModel")}
  • +
    +
+
+
+
+ + +
+ + {/* ---- Step 2: Select ---- */} + +
+ {/* Provider API Keys */} + 0}> +
+

{language.t("migration.select.providers")}

+ + {(provider) => ( + + )} + +
+
+ + {/* MCP Servers */} + 0}> +
+

{language.t("migration.select.mcpServers")}

+ + {(server) => ( + + )} + +
+
+ + {/* Custom Modes */} + 0}> +
+

{language.t("migration.select.customModes")}

+ + {(mode) => ( + + )} + +
+
+ + {/* Default Model */} + +
+

{language.t("migration.select.defaultModel")}

+ +
+
+ + +

{language.t("migration.select.nothingToMigrate")}

+
+
+ + +
+ + {/* ---- Step 3: Progress ---- */} + +
+

{language.t("migration.progress.title")}

+
+ + {(entry) => ( +
+ + {statusIcon(entry.status)} + + {entry.item} + + {entry.message} + +
+ )} +
+
+
+ + +
+ + {/* ---- Step 4: Complete ---- */} + +
+
+ + {language.t("migration.complete.summary", { + success: String(successCount()), + total: String(totalCount()), + })} + +
+ + +
+ r.status !== "success")}> + {(result) => ( +
+ + {statusIcon(result.status)} + + {result.item} + + {result.message} + +
+ )} +
+
+
+ + +
+ + +
+
+
+ ) +} + +export default MigrationWizard diff --git a/packages/kilo-vscode/webview-ui/src/components/migration/index.ts b/packages/kilo-vscode/webview-ui/src/components/migration/index.ts new file mode 100644 index 00000000000..824db6d8440 --- /dev/null +++ b/packages/kilo-vscode/webview-ui/src/components/migration/index.ts @@ -0,0 +1,5 @@ +/** + * legacy-migration - Barrel export for the migration wizard webview components. + * Delete this entire directory when dropping legacy migration support. + */ +export { default as MigrationWizard } from "./MigrationWizard" diff --git a/packages/kilo-vscode/webview-ui/src/components/migration/migration.css b/packages/kilo-vscode/webview-ui/src/components/migration/migration.css new file mode 100644 index 00000000000..7eed287f71f --- /dev/null +++ b/packages/kilo-vscode/webview-ui/src/components/migration/migration.css @@ -0,0 +1,365 @@ +/* legacy-migration - Scoped styles for the migration wizard. */ + +.migration-wizard { + display: flex; + flex-direction: column; + height: 100%; + overflow: hidden; + font-size: 13px; + color: var(--vscode-foreground); +} + +/* Header */ +.migration-wizard__header { + padding: 12px 16px; + border-bottom: 1px solid var(--vscode-panel-border, var(--border-weak-base)); + flex-shrink: 0; +} + +.migration-wizard__title { + font-size: 16px; + font-weight: 600; + margin: 0; +} + +/* Body */ +.migration-wizard__body { + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; + padding: 16px; + gap: 12px; +} + +/* Welcome screen โ€” centered hero layout */ +.migration-wizard__welcome { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + overflow-y: auto; + padding: 24px 8px 8px; + gap: 0; + min-height: 0; +} + +.migration-wizard__logo { + width: 64px; + height: 64px; + opacity: 0.9; + margin-bottom: 16px; +} + +.migration-wizard__welcome-title { + font-size: 18px; + font-weight: 600; + margin: 0 0 8px; + color: var(--vscode-foreground); +} + +.migration-wizard__welcome-subtitle { + margin: 0 0 20px; + text-align: center; + color: var(--vscode-descriptionForeground); +} + +.migration-wizard__welcome-cards { + display: flex; + flex-direction: column; + gap: 10px; + width: 100%; + text-align: left; +} + +/* Step indicator */ +.migration-wizard__steps { + display: flex; + align-items: center; + gap: 0; + flex-shrink: 0; +} + +.migration-wizard__step { + display: flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + border-radius: 50%; + background: var(--vscode-input-background); + border: 1px solid var(--vscode-panel-border); + font-size: 11px; + color: var(--vscode-descriptionForeground); + flex-shrink: 0; +} + +/* Connector line rendered as a sibling element in the JSX */ +.migration-wizard__step-connector { + width: 24px; + height: 1px; + background: var(--vscode-panel-border); + flex-shrink: 0; +} + +.migration-wizard__step--active { + background: var(--vscode-button-background); + color: var(--vscode-button-foreground); + border-color: var(--vscode-button-background); +} + +.migration-wizard__step--done { + background: var(--vscode-testing-iconPassed, #89d185); + border-color: var(--vscode-testing-iconPassed, #89d185); + color: #fff; +} + +/* Scrollable content area */ +.migration-wizard__content { + flex: 1; + overflow-y: auto; + display: flex; + flex-direction: column; + gap: 12px; + min-height: 0; +} + +/* Lead paragraph */ +.migration-wizard__lead { + margin: 0; + color: var(--vscode-foreground); + line-height: 1.5; +} + +/* Info cards */ +.migration-wizard__info-card { + background: var(--vscode-editor-background); + border: 1px solid var(--vscode-panel-border); + border-radius: 4px; + padding: 12px; + font-size: 12px; + line-height: 1.5; + color: var(--vscode-descriptionForeground); +} + +.migration-wizard__info-card--warning { + border-color: var(--vscode-inputValidation-warningBorder, #cca700); + background: var(--vscode-inputValidation-warningBackground, rgba(204, 167, 0, 0.1)); + color: var(--vscode-foreground); +} + +.migration-wizard__info-card--success { + border-color: var(--vscode-testing-iconPassed, #89d185); + background: rgba(137, 209, 133, 0.08); + color: var(--vscode-foreground); +} + +.migration-wizard__list { + margin: 8px 0 0 0; + padding-left: 20px; +} + +.migration-wizard__list li { + margin-bottom: 4px; +} + +/* Section groups */ +.migration-wizard__section { + display: flex; + flex-direction: column; + gap: 4px; +} + +.migration-wizard__section-title { + font-size: 12px; + font-weight: 600; + color: var(--vscode-foreground); + margin: 0 0 4px 0; + padding-bottom: 4px; + border-bottom: 1px solid var(--vscode-panel-border); + text-transform: uppercase; + letter-spacing: 0.04em; +} + +/* Checkbox items */ +.migration-wizard__item { + display: flex; + align-items: flex-start; + gap: 8px; + padding: 6px 4px; + cursor: pointer; + border-radius: 3px; +} + +.migration-wizard__item:hover { + background: var(--vscode-list-hoverBackground); +} + +.migration-wizard__item--disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.migration-wizard__item input[type="checkbox"] { + margin-top: 2px; + flex-shrink: 0; +} + +.migration-wizard__item-info { + display: flex; + flex-direction: column; + gap: 2px; + min-width: 0; +} + +.migration-wizard__item-name { + font-size: 12px; + color: var(--vscode-foreground); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.migration-wizard__item-meta { + font-size: 11px; + color: var(--vscode-descriptionForeground); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.migration-wizard__item-tag { + display: inline-block; + font-size: 10px; + padding: 1px 5px; + border-radius: 10px; + margin-top: 2px; +} + +.migration-wizard__item-tag--warn { + background: rgba(204, 167, 0, 0.15); + color: var(--vscode-testing-iconQueued, #cca700); + border: 1px solid var(--vscode-inputValidation-warningBorder, #cca700); +} + +.migration-wizard__empty { + margin: 0; + color: var(--vscode-descriptionForeground); + font-style: italic; +} + +/* Progress list */ +.migration-wizard__progress-list { + display: flex; + flex-direction: column; + gap: 4px; +} + +.migration-wizard__progress-item { + display: flex; + align-items: baseline; + gap: 8px; + font-size: 12px; + padding: 4px 0; +} + +.migration-wizard__progress-icon { + font-size: 13px; + flex-shrink: 0; + width: 16px; + text-align: center; +} + +.migration-wizard__progress-name { + color: var(--vscode-foreground); + flex: 1; + min-width: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.migration-wizard__progress-msg { + color: var(--vscode-descriptionForeground); + font-size: 11px; + flex-shrink: 0; +} + +/* Cleanup checkbox on completion screen */ +.migration-wizard__cleanup { + display: flex; + align-items: flex-start; + gap: 8px; + padding: 12px; + background: var(--vscode-editor-background); + border: 1px solid var(--vscode-panel-border); + border-radius: 4px; + cursor: pointer; + margin-top: 4px; +} + +.migration-wizard__cleanup input[type="checkbox"] { + margin-top: 2px; + flex-shrink: 0; +} + +.migration-wizard__cleanup-label { + display: block; + font-size: 12px; + color: var(--vscode-foreground); + font-weight: 500; +} + +.migration-wizard__cleanup-desc { + display: block; + font-size: 11px; + color: var(--vscode-descriptionForeground); + margin-top: 2px; + line-height: 1.4; +} + +/* Footer with action buttons */ +.migration-wizard__footer { + display: flex; + justify-content: flex-end; + gap: 8px; + flex-shrink: 0; + padding-top: 8px; + border-top: 1px solid var(--vscode-panel-border); +} + +/* Buttons */ +.migration-wizard__btn { + padding: 6px 14px; + font-size: 12px; + border-radius: 2px; + border: none; + cursor: pointer; + font-family: var(--vscode-font-family); + transition: opacity 0.1s; +} + +.migration-wizard__btn:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.migration-wizard__btn--primary { + background: var(--vscode-button-background); + color: var(--vscode-button-foreground); +} + +.migration-wizard__btn--primary:not(:disabled):hover { + background: var(--vscode-button-hoverBackground); +} + +.migration-wizard__btn--ghost { + background: transparent; + color: var(--vscode-foreground); + border: 1px solid var(--vscode-panel-border); +} + +.migration-wizard__btn--ghost:hover { + background: var(--vscode-list-hoverBackground); +} diff --git a/packages/kilo-vscode/webview-ui/src/components/settings/Settings.tsx b/packages/kilo-vscode/webview-ui/src/components/settings/Settings.tsx index b4d527f245b..70da2a2d9e3 100644 --- a/packages/kilo-vscode/webview-ui/src/components/settings/Settings.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/settings/Settings.tsx @@ -22,6 +22,7 @@ import { useServer } from "../../context/server" export interface SettingsProps { onBack?: () => void + onMigrateClick?: () => void // legacy-migration } const Settings: Component = (props) => { @@ -107,6 +108,37 @@ const Settings: Component = (props) => { {language.t("settings.aboutKiloCode.title")} + {/* legacy-migration start */} +
+ +
+ {/* legacy-migration end */} diff --git a/packages/kilo-vscode/webview-ui/src/i18n/en.ts b/packages/kilo-vscode/webview-ui/src/i18n/en.ts index 5629e2a2b7a..8b4b1fbf8ae 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/en.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/en.ts @@ -1109,4 +1109,30 @@ export const dict = { "question.summary": "{{n}} of {{total}} questions", "common.review": "Review", + + // legacy-migration start + "settings.legacyMigration.link": "Migrate from Legacy Version", + "migration.welcome.title": "Welcome to the New Kilo Code", + "migration.welcome.detected": "We detected settings from a previous installation of Kilo Code.", + "migration.welcome.sessionsInfo": + "Chat sessions and history cannot be migrated โ€” the new version uses a different architecture.", + "migration.welcome.canMigrate": "The following settings can be migrated to the new version:", + "migration.welcome.continue": "Continue", + "migration.welcome.skip": "Skip Migration", + "migration.select.providers": "Provider API Keys", + "migration.select.mcpServers": "MCP Servers", + "migration.select.customModes": "Custom Modes / Agents", + "migration.select.defaultModel": "Default Model", + "migration.select.unsupported": "Not supported in new version", + "migration.select.nothingToMigrate": "Nothing to migrate was found in the legacy settings.", + "migration.select.migrate": "Migrate Selected", + "migration.select.back": "Back", + "migration.progress.title": "Migrating your settings...", + "migration.progress.done": "Done", + "migration.complete.summary": "{{success}} of {{total}} items migrated successfully.", + "migration.complete.cleanup": "Remove legacy settings data", + "migration.complete.cleanupDescription": + "This removes the old settings from VS Code storage. You will not be able to re-run this migration.", + "migration.complete.done": "Get Started", + // legacy-migration end } diff --git a/packages/kilo-vscode/webview-ui/src/types/messages.ts b/packages/kilo-vscode/webview-ui/src/types/messages.ts index 2e05d76db73..9968ced843b 100644 --- a/packages/kilo-vscode/webview-ui/src/types/messages.ts +++ b/packages/kilo-vscode/webview-ui/src/types/messages.ts @@ -500,7 +500,7 @@ export interface DeviceAuthCancelledMessage { export interface NavigateMessage { type: "navigate" - view: "newTask" | "marketplace" | "history" | "cloudHistory" | "profile" | "settings" + view: "newTask" | "marketplace" | "history" | "cloudHistory" | "profile" | "settings" | "migration" // legacy-migration } export interface ProvidersLoadedMessage { @@ -773,6 +773,78 @@ export interface AgentManagerSendInitialMessage { files?: Array<{ mime: string; url: string }> } +// legacy-migration start +export interface MigrationProviderInfo { + profileName: string + provider: string + model?: string + hasApiKey: boolean + supported: boolean + newProviderName?: string +} + +export interface MigrationMcpServerInfo { + name: string + type: string +} + +export interface MigrationCustomModeInfo { + name: string + slug: string +} + +export interface MigrationResultItem { + item: string + category: "provider" | "mcpServer" | "customMode" | "defaultModel" + status: "success" | "warning" | "error" + message?: string +} + +export interface LegacyMigrationDataMessage { + type: "legacyMigrationData" + data: { + providers: MigrationProviderInfo[] + mcpServers: MigrationMcpServerInfo[] + customModes: MigrationCustomModeInfo[] + defaultModel?: { provider: string; model: string } + } +} + +export interface LegacyMigrationProgressMessage { + type: "legacyMigrationProgress" + item: string + status: "migrating" | "success" | "warning" | "error" + message?: string +} + +export interface LegacyMigrationCompleteMessage { + type: "legacyMigrationComplete" + results: MigrationResultItem[] +} + +export interface RequestLegacyMigrationDataMessage { + type: "requestLegacyMigrationData" +} + +export interface StartLegacyMigrationMessage { + type: "startLegacyMigration" + selections: { + providers: string[] + mcpServers: string[] + customModes: string[] + defaultModel: boolean + } +} + +export interface SkipLegacyMigrationMessage { + type: "skipLegacyMigration" +} + +export interface ClearLegacyDataMessage { + type: "clearLegacyData" +} +// legacy-migration end + export type ExtensionMessage = | ReadyMessage | ConnectionStateMessage @@ -832,6 +904,11 @@ export type ExtensionMessage = | AgentManagerWorktreeDiffLoadingMessage | AgentManagerWorktreeStatsMessage | AgentManagerLocalStatsMessage + // legacy-migration start + | LegacyMigrationDataMessage + | LegacyMigrationProgressMessage + | LegacyMigrationCompleteMessage +// legacy-migration end // ============================================ // Messages FROM webview TO extension @@ -1315,6 +1392,12 @@ export type WebviewMessage = | RequestWorktreeDiffMessage | StartDiffWatchMessage | StopDiffWatchMessage + // legacy-migration start + | RequestLegacyMigrationDataMessage + | StartLegacyMigrationMessage + | SkipLegacyMigrationMessage + | ClearLegacyDataMessage +// legacy-migration end // ============================================ // VS Code API type From 325fa346ef16cf4358863d65015bf895c5541662 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Catriel=20M=C3=BCller?= Date: Mon, 2 Mar 2026 22:30:47 -0300 Subject: [PATCH 02/48] refactor: update migration ui --- packages/kilo-vscode/src/KiloProvider.ts | 9 + .../components/migration/MigrationWizard.tsx | 220 ++++++++++++------ .../src/components/migration/migration.css | 140 ++++++++--- .../components/settings/AboutKiloCodeTab.tsx | 34 ++- .../src/components/settings/Settings.tsx | 32 +-- .../kilo-vscode/webview-ui/src/i18n/en.ts | 16 +- packages/opencode/src/provider/auth.ts | 10 + packages/opencode/src/server/server.ts | 9 + 8 files changed, 324 insertions(+), 146 deletions(-) diff --git a/packages/kilo-vscode/src/KiloProvider.ts b/packages/kilo-vscode/src/KiloProvider.ts index e3af7135f8b..8a8bc3e47df 100644 --- a/packages/kilo-vscode/src/KiloProvider.ts +++ b/packages/kilo-vscode/src/KiloProvider.ts @@ -1812,6 +1812,13 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper return } + // Refresh provider and agent lists when the server signals a state disposal + if (event.type === "server.instance.disposed" || event.type === "global.disposed") { + void this.fetchAndSendProviders() + void this.fetchAndSendAgents() + return + } + // Forward relevant events to webview // Side effects that must happen before the webview message is sent if (event.type === "session.created" && !this.currentSession) { @@ -2047,6 +2054,8 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper }, ) await MigrationService.setMigrationStatus(this.extensionContext, "completed") + // Refresh providers so webview immediately sees the newly-migrated API keys + await this.fetchAndSendProviders() this.postMessage({ type: "legacyMigrationComplete", results }) } diff --git a/packages/kilo-vscode/webview-ui/src/components/migration/MigrationWizard.tsx b/packages/kilo-vscode/webview-ui/src/components/migration/MigrationWizard.tsx index bfbdfd822c4..f965e32f82b 100644 --- a/packages/kilo-vscode/webview-ui/src/components/migration/MigrationWizard.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/migration/MigrationWizard.tsx @@ -8,7 +8,7 @@ * 4. Complete โ€” summary + optional cleanup checkbox */ -import { Component, For, Show, createSignal, onMount, onCleanup, JSX } from "solid-js" +import { Component, For, Show, Switch, Match, createSignal, onMount, onCleanup, JSX } from "solid-js" import { useVSCode } from "../../context/vscode" import { useLanguage } from "../../context/language" import type { @@ -32,17 +32,61 @@ const KiloLogo = (): JSX.Element => { document.body.classList.contains("vscode-light") || document.body.classList.contains("vscode-high-contrast-light") const icon = isLight ? "kilo-light.svg" : "kilo-dark.svg" return ( - - -

{language.t("migration.select.nothingToMigrate")}

+ {/* Settings (auto-approval, language, autocomplete) */} + +
+

{language.t("migration.select.settings")}

+ + {/* Auto-Approval โ€” one row per permission group */} + +

{language.t("migration.select.autoApproval")}

+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
- {/* Approval settings info note */} -
- -

{language.t("migration.select.approvalNote")}

-
+ +

{language.t("migration.select.nothingToMigrate")}

+
- - - diff --git a/packages/kilo-vscode/webview-ui/src/i18n/en.ts b/packages/kilo-vscode/webview-ui/src/i18n/en.ts index 74dbcfed009..84779daa439 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/en.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/en.ts @@ -1144,8 +1144,6 @@ export const dict = { "migration.select.autoApproval.mcpPermissionDesc": "MCP tool usage", "migration.select.autoApproval.taskPermission": "Task Permission", "migration.select.autoApproval.taskPermissionDesc": "Mode switching and subtask creation", - "migration.select.autoApproval.questionPermission": "Question Permission", - "migration.select.autoApproval.questionPermissionDesc": "Follow-up questions to the user", "migration.select.language": "UI Language", "migration.select.languageDesc": "Your language preference will be applied to the new extension", "migration.select.autocomplete": "Autocomplete Settings", diff --git a/packages/kilo-vscode/webview-ui/src/types/messages.ts b/packages/kilo-vscode/webview-ui/src/types/messages.ts index 33b0974e592..17fb2a68929 100644 --- a/packages/kilo-vscode/webview-ui/src/types/messages.ts +++ b/packages/kilo-vscode/webview-ui/src/types/messages.ts @@ -797,7 +797,6 @@ export interface LegacyAutocompleteSettings { enableAutoTrigger?: boolean enableSmartInlineTaskKeybinding?: boolean enableChatAutocomplete?: boolean - snoozeUntil?: number } export interface LegacySettings { @@ -812,7 +811,6 @@ export interface LegacySettings { alwaysAllowMcp?: boolean alwaysAllowModeSwitch?: boolean alwaysAllowSubtasks?: boolean - alwaysAllowFollowupQuestions?: boolean language?: string autocomplete?: LegacyAutocompleteSettings } @@ -858,7 +856,6 @@ export interface MigrationAutoApprovalSelections { executePermission: boolean mcpPermission: boolean taskPermission: boolean - questionPermission: boolean } export interface StartLegacyMigrationMessage { From 9dc832f564d8806136989a061747fde9eb2848ba Mon Sep 17 00:00:00 2001 From: "kiloconnect[bot]" <240665456+kiloconnect[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 15:05:20 +0000 Subject: [PATCH 11/48] fix(opencode-provider): switch kilo default model to auto-small - update model priority to auto-small for kilo provider instead of gpt-5-nano - update availability check to look for auto-small instead of gpt-5-nano when selecting kilo model --- packages/opencode/src/provider/provider.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index f5ed0917631..d7566d924d5 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -1256,7 +1256,7 @@ export namespace Provider { ] // kilocode_change start if (providerID.startsWith("kilo")) { - priority = ["gpt-5-nano"] + priority = ["auto-small"] } // kilocode_change end if (providerID.startsWith("github-copilot")) { @@ -1297,8 +1297,8 @@ export namespace Provider { // kilocode_change start // Check if kilo provider is available before using it const kiloProvider = await state().then((state) => state.providers["kilo"]) - if (kiloProvider && kiloProvider.models["gpt-5-nano"]) { - return getModel("kilo", "gpt-5-nano") + if (kiloProvider && kiloProvider.models["auto-small"]) { + return getModel("kilo", "auto-small") } // kilocode_change end From cdac0d8dab9db835039bad650a7045ca2d14b71a Mon Sep 17 00:00:00 2001 From: "kiloconnect[bot]" <240665456+kiloconnect[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 15:18:42 +0000 Subject: [PATCH 12/48] feat(kilo-gateway): add KILOCODE_VERSION support to editor header - introduce ENV_VERSION constant in kilo-gateway and export it - modify getEditorNameHeader to append version when provided - export ENV_VERSION from gateway index for external use - initialize ENV_VERSION from Installation.VERSION in opencode startup - update tests to verify editor header with and without version --- packages/kilo-gateway/src/api/constants.ts | 3 +++ packages/kilo-gateway/src/headers.ts | 8 +++++-- packages/kilo-gateway/src/index.ts | 1 + packages/opencode/src/index.ts | 7 +++++- .../kilocode/kilo-gateway-headers.test.ts | 24 ++++++++++++++++++- 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/packages/kilo-gateway/src/api/constants.ts b/packages/kilo-gateway/src/api/constants.ts index a10781e6b49..5b78fa79931 100644 --- a/packages/kilo-gateway/src/api/constants.ts +++ b/packages/kilo-gateway/src/api/constants.ts @@ -58,6 +58,9 @@ export const DEFAULT_EDITOR_NAME = "Kilo CLI" /** Environment variable name for custom editor name */ export const ENV_EDITOR_NAME = "KILOCODE_EDITOR_NAME" +/** Environment variable name for version (set by CLI at startup) */ +export const ENV_VERSION = "KILOCODE_VERSION" + /** Tester header value for suppressing warnings */ export const TESTER_SUPPRESS_VALUE = "SUPPRESS" diff --git a/packages/kilo-gateway/src/headers.ts b/packages/kilo-gateway/src/headers.ts index c9767f3e1f8..7e0abdf5338 100644 --- a/packages/kilo-gateway/src/headers.ts +++ b/packages/kilo-gateway/src/headers.ts @@ -10,6 +10,7 @@ import { CONTENT_TYPE, DEFAULT_EDITOR_NAME, ENV_EDITOR_NAME, + ENV_VERSION, TESTER_SUPPRESS_VALUE, ENV_FEATURE, // kilocode_change } from "./api/constants.js" @@ -45,10 +46,13 @@ export const DEFAULT_HEADERS = { /** * Get editor name header value - * Defaults to "opencode" but can be customized + * Defaults to "Kilo CLI" but can be customized via KILOCODE_EDITOR_NAME. + * Appends the version from KILOCODE_VERSION when available. */ export function getEditorNameHeader(): string { - return process.env[ENV_EDITOR_NAME] ?? DEFAULT_EDITOR_NAME + const name = process.env[ENV_EDITOR_NAME] ?? DEFAULT_EDITOR_NAME + const version = process.env[ENV_VERSION] + return version ? `${name} ${version}` : name } /** diff --git a/packages/kilo-gateway/src/index.ts b/packages/kilo-gateway/src/index.ts index 9f10c75fb07..425c0a5962a 100644 --- a/packages/kilo-gateway/src/index.ts +++ b/packages/kilo-gateway/src/index.ts @@ -93,6 +93,7 @@ export { HEADER_FEATURE, DEFAULT_EDITOR_NAME, ENV_EDITOR_NAME, + ENV_VERSION, TESTER_SUPPRESS_VALUE, ENV_FEATURE, } from "./api/constants.js" diff --git a/packages/opencode/src/index.ts b/packages/opencode/src/index.ts index 825cecfd140..1eee58ad925 100644 --- a/packages/opencode/src/index.ts +++ b/packages/opencode/src/index.ts @@ -31,7 +31,7 @@ import { SessionCommand } from "./cli/cmd/session" // kilocode_change start - Import telemetry, instance disposal, and legacy migration import { Telemetry } from "@kilocode/kilo-telemetry" import { Instance } from "./project/instance" // kilocode_change -import { migrateLegacyKiloAuth, ENV_FEATURE } from "@kilocode/kilo-gateway" +import { migrateLegacyKiloAuth, ENV_FEATURE, ENV_VERSION } from "@kilocode/kilo-gateway" // kilocode_change - set feature for tracking. 'serve' is spawned by other services // (extension, cloud) which set their own KILOCODE_FEATURE env var. Direct CLI use @@ -41,6 +41,11 @@ if (!process.env[ENV_FEATURE]) { const isServe = process.argv.includes("serve") process.env[ENV_FEATURE] = isServe ? "unknown" : "cli" } + +// kilocode_change - set version so kilo-gateway can include it in the editor name header +if (!process.env[ENV_VERSION]) { + process.env[ENV_VERSION] = Installation.VERSION +} import { Config } from "./config/config" import { Auth } from "./auth" // kilocode_change end diff --git a/packages/opencode/test/kilocode/kilo-gateway-headers.test.ts b/packages/opencode/test/kilocode/kilo-gateway-headers.test.ts index 32050c74bf1..b245cd6bc5a 100644 --- a/packages/opencode/test/kilocode/kilo-gateway-headers.test.ts +++ b/packages/opencode/test/kilocode/kilo-gateway-headers.test.ts @@ -1,7 +1,7 @@ // kilocode_change - new file import { describe, it, expect, afterEach } from "bun:test" import { buildKiloHeaders, getFeatureHeader, getEditorNameHeader } from "@kilocode/kilo-gateway" -import { HEADER_FEATURE, ENV_FEATURE } from "@kilocode/kilo-gateway" +import { HEADER_FEATURE, ENV_FEATURE, ENV_VERSION, DEFAULT_EDITOR_NAME } from "@kilocode/kilo-gateway" describe("getFeatureHeader", () => { const original = process.env[ENV_FEATURE] @@ -30,6 +30,28 @@ describe("getFeatureHeader", () => { }) }) +describe("getEditorNameHeader", () => { + const originalVersion = process.env[ENV_VERSION] + + afterEach(() => { + if (originalVersion === undefined) { + delete process.env[ENV_VERSION] + } else { + process.env[ENV_VERSION] = originalVersion + } + }) + + it("returns default editor name without version when KILOCODE_VERSION is not set", () => { + delete process.env[ENV_VERSION] + expect(getEditorNameHeader()).toBe(DEFAULT_EDITOR_NAME) + }) + + it("appends version when KILOCODE_VERSION is set", () => { + process.env[ENV_VERSION] = "1.2.3" + expect(getEditorNameHeader()).toBe(`${DEFAULT_EDITOR_NAME} 1.2.3`) + }) +}) + describe("buildKiloHeaders", () => { const original = process.env[ENV_FEATURE] From ab1a57d76f7d525b93a92876ed963d725d24eb31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Catriel=20M=C3=BCller?= Date: Tue, 3 Mar 2026 13:16:24 -0300 Subject: [PATCH 13/48] =?UTF-8?q?fix(migration):=20add=20locale=20mapping?= =?UTF-8?q?=20for=20language=20migration=20(zh-CN=E2=86=92zh,=20zh-TW?= =?UTF-8?q?=E2=86=92zht,=20pt-BR=E2=86=92br)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/legacy-migration/migration-service.ts | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/packages/kilo-vscode/src/legacy-migration/migration-service.ts b/packages/kilo-vscode/src/legacy-migration/migration-service.ts index cde30ab1496..9a0ac62d40a 100644 --- a/packages/kilo-vscode/src/legacy-migration/migration-service.ts +++ b/packages/kilo-vscode/src/legacy-migration/migration-service.ts @@ -554,27 +554,33 @@ async function migrateAutocomplete(settings: LegacyAutocompleteSettings): Promis return { item: "Autocomplete settings", category: "settings", status: "success" } } -const SUPPORTED_LOCALES = new Set([ - "en", - "zh", - "zht", - "ko", - "de", - "es", - "fr", - "da", - "ja", - "pl", - "ru", - "ar", - "no", - "br", - "th", - "bs", -]) +// Maps legacy locale codes to their new-extension equivalents. +// Legacy used IETF BCP-47 tags (zh-CN, pt-BR) while the new extension uses short codes. +// Entries absent from this map have no equivalent in the new extension. +const LEGACY_LOCALE_MAP: Record = { + // Direct matches + en: "en", + de: "de", + es: "es", + fr: "fr", + ja: "ja", + ko: "ko", + pl: "pl", + ru: "ru", + ar: "ar", + th: "th", + da: "da", + no: "no", + bs: "bs", + // Format changes + "zh-CN": "zh", + "zh-TW": "zht", + "pt-BR": "br", +} async function migrateLanguage(language: string): Promise { - if (!SUPPORTED_LOCALES.has(language)) { + const mapped = LEGACY_LOCALE_MAP[language] + if (!mapped) { return { item: "Language preference", category: "settings", @@ -583,7 +589,7 @@ async function migrateLanguage(language: string): Promise { } } const config = vscode.workspace.getConfiguration("kilo-code.new") - await config.update("language", language, vscode.ConfigurationTarget.Global) + await config.update("language", mapped, vscode.ConfigurationTarget.Global) return { item: "Language preference", category: "settings", status: "success" } } From b3d25d19da81d574ee7a63cfc83b1950ac98c333 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Catriel=20M=C3=BCller?= Date: Tue, 3 Mar 2026 13:36:46 -0300 Subject: [PATCH 14/48] =?UTF-8?q?fix(migration):=20address=20bot=20review?= =?UTF-8?q?=20=E2=80=94=20partial=20failure=20handling,=20disposeAll=20deb?= =?UTF-8?q?ounce,=20error=20handling,=20YAML=20quotes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/kilo-vscode/src/KiloProvider.ts | 7 +- .../src/legacy-migration/migration-service.ts | 125 ++++++++++++------ packages/opencode/src/server/server.ts | 15 ++- 3 files changed, 103 insertions(+), 44 deletions(-) diff --git a/packages/kilo-vscode/src/KiloProvider.ts b/packages/kilo-vscode/src/KiloProvider.ts index 5794798070f..50d43ef82e6 100644 --- a/packages/kilo-vscode/src/KiloProvider.ts +++ b/packages/kilo-vscode/src/KiloProvider.ts @@ -2079,7 +2079,12 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper }, this.cachedLegacyData?.settings, ) - await MigrationService.setMigrationStatus(this.extensionContext, "completed") + // Only mark as completed if at least one item succeeded โ€” if everything failed + // the user can still re-run migration via Settings โ†’ About. + const anySuccess = results.some((r) => r.status === "success") + if (anySuccess) { + await MigrationService.setMigrationStatus(this.extensionContext, "completed") + } // Refresh providers so webview immediately sees the newly-migrated API keys await this.fetchAndSendProviders() this.postMessage({ type: "legacyMigrationComplete", results }) diff --git a/packages/kilo-vscode/src/legacy-migration/migration-service.ts b/packages/kilo-vscode/src/legacy-migration/migration-service.ts index 9a0ac62d40a..993df8256f7 100644 --- a/packages/kilo-vscode/src/legacy-migration/migration-service.ts +++ b/packages/kilo-vscode/src/legacy-migration/migration-service.ts @@ -537,21 +537,30 @@ async function migrateAutoApproval( } async function migrateAutocomplete(settings: LegacyAutocompleteSettings): Promise { - const config = vscode.workspace.getConfiguration("kilo-code.new.autocomplete") - if (settings.enableAutoTrigger !== undefined) { - await config.update("enableAutoTrigger", settings.enableAutoTrigger, vscode.ConfigurationTarget.Global) + try { + const config = vscode.workspace.getConfiguration("kilo-code.new.autocomplete") + if (settings.enableAutoTrigger !== undefined) { + await config.update("enableAutoTrigger", settings.enableAutoTrigger, vscode.ConfigurationTarget.Global) + } + if (settings.enableSmartInlineTaskKeybinding !== undefined) { + await config.update( + "enableSmartInlineTaskKeybinding", + settings.enableSmartInlineTaskKeybinding, + vscode.ConfigurationTarget.Global, + ) + } + if (settings.enableChatAutocomplete !== undefined) { + await config.update("enableChatAutocomplete", settings.enableChatAutocomplete, vscode.ConfigurationTarget.Global) + } + return { item: "Autocomplete settings", category: "settings", status: "success" } + } catch (err) { + return { + item: "Autocomplete settings", + category: "settings", + status: "error", + message: err instanceof Error ? err.message : String(err), + } } - if (settings.enableSmartInlineTaskKeybinding !== undefined) { - await config.update( - "enableSmartInlineTaskKeybinding", - settings.enableSmartInlineTaskKeybinding, - vscode.ConfigurationTarget.Global, - ) - } - if (settings.enableChatAutocomplete !== undefined) { - await config.update("enableChatAutocomplete", settings.enableChatAutocomplete, vscode.ConfigurationTarget.Global) - } - return { item: "Autocomplete settings", category: "settings", status: "success" } } // Maps legacy locale codes to their new-extension equivalents. @@ -588,9 +597,18 @@ async function migrateLanguage(language: string): Promise { message: `Language "${language}" is not supported in the new version`, } } - const config = vscode.workspace.getConfiguration("kilo-code.new") - await config.update("language", mapped, vscode.ConfigurationTarget.Global) - return { item: "Language preference", category: "settings", status: "success" } + try { + const config = vscode.workspace.getConfiguration("kilo-code.new") + await config.update("language", mapped, vscode.ConfigurationTarget.Global) + return { item: "Language preference", category: "settings", status: "success" } + } catch (err) { + return { + item: "Language preference", + category: "settings", + status: "error", + message: err instanceof Error ? err.message : String(err), + } + } } // --------------------------------------------------------------------------- @@ -740,6 +758,11 @@ function hasAutocompleteData(s: LegacyAutocompleteSettings | undefined): s is Le * Tries JSON first (some legacy versions stored JSON), then parses the simple * YAML structure manually to avoid a runtime dependency on a YAML library. */ +// Strip surrounding single or double quotes from a YAML scalar value +function stripYamlQuotes(value: string): string { + return value.replace(/^(['"])(.*)\1$/, "$2") +} + function parseCustomModesYaml(text: string): LegacyCustomMode[] | null { // Try JSON first const jsonResult = (() => { @@ -764,21 +787,22 @@ function parseCustomModesYaml(text: string): LegacyCustomMode[] | null { const lines = text.split("\n") let inModes = false let current: Partial | null = null - let inRoleDefinition = false + // Track which block scalar field is currently being collected + let blockField: "roleDefinition" | "customInstructions" | null = null let inGroups = false - let roleLines: string[] = [] + let blockLines: string[] = [] const flush = () => { if (current?.slug && current?.name) { - if (!current.roleDefinition && roleLines.length > 0) { - current.roleDefinition = roleLines.join("\n").trim() + if (blockField && blockLines.length > 0) { + current[blockField] = blockLines.join("\n").trim() } modes.push({ groups: [], ...current } as LegacyCustomMode) } current = null - inRoleDefinition = false + blockField = null inGroups = false - roleLines = [] + blockLines = [] } for (const rawLine of lines) { @@ -789,42 +813,61 @@ function parseCustomModesYaml(text: string): LegacyCustomMode[] | null { if (/^ - slug: /.test(rawLine)) { flush() - current = { slug: rawLine.replace(/^ - slug: /, "").trim(), groups: [] } + current = { slug: stripYamlQuotes(rawLine.replace(/^ - slug: /, "").trim()), groups: [] } continue } if (!current) continue if (/^ name: /.test(rawLine)) { - current.name = rawLine.replace(/^ name: /, "").trim() + current.name = stripYamlQuotes(rawLine.replace(/^ name: /, "").trim()) continue } - if (/^ roleDefinition: [|>]/.test(rawLine)) { - inRoleDefinition = true + // Block scalar fields (roleDefinition, customInstructions) with | or > + const blockMatch = rawLine.match(/^ (roleDefinition|customInstructions): [|>]/) + if (blockMatch) { + // Flush any previously open block + if (blockField && blockLines.length > 0) { + current[blockField] = blockLines.join("\n").trim() + } + blockField = blockMatch[1] as "roleDefinition" | "customInstructions" inGroups = false - roleLines = [] + blockLines = [] continue } - if (/^ roleDefinition: /.test(rawLine) && !inRoleDefinition) { - current.roleDefinition = rawLine.replace(/^ roleDefinition: /, "").trim() + // Single-line scalar fields + if (/^ roleDefinition: /.test(rawLine) && !blockField) { + current.roleDefinition = stripYamlQuotes(rawLine.replace(/^ roleDefinition: /, "").trim()) continue } - if (inRoleDefinition) { + if (/^ customInstructions: /.test(rawLine) && !blockField) { + current.customInstructions = stripYamlQuotes(rawLine.replace(/^ customInstructions: /, "").trim()) + continue + } + + if (/^ whenToUse: /.test(rawLine) && !blockField) { + current.whenToUse = stripYamlQuotes(rawLine.replace(/^ whenToUse: /, "").trim()) + continue + } + + if (/^ description: /.test(rawLine) && !blockField) { + current.description = stripYamlQuotes(rawLine.replace(/^ description: /, "").trim()) + continue + } + + // Continuation lines of an open block scalar + if (blockField) { if (/^ /.test(rawLine)) { - roleLines.push(rawLine.replace(/^ /, "")) + blockLines.push(rawLine.replace(/^ /, "")) continue } - current.roleDefinition = roleLines.join("\n").trim() - inRoleDefinition = false - roleLines = [] - } - - if (/^ customInstructions: /.test(rawLine)) { - current.customInstructions = rawLine.replace(/^ customInstructions: /, "").trim() - continue + // Block ended โ€” flush and fall through to process this line + current[blockField] = blockLines.join("\n").trim() + blockField = null + blockLines = [] } if (/^ groups:/.test(rawLine)) { @@ -834,7 +877,7 @@ function parseCustomModesYaml(text: string): LegacyCustomMode[] | null { } if (inGroups && /^ - /.test(rawLine)) { - const group = rawLine.replace(/^ - /, "").trim() + const group = stripYamlQuotes(rawLine.replace(/^ - /, "").trim()) current.groups = [...(current.groups ?? []), group] continue } diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts index 68c4805a06f..9ef9e0796b1 100644 --- a/packages/opencode/src/server/server.ts +++ b/packages/opencode/src/server/server.ts @@ -19,6 +19,17 @@ import { Agent } from "../agent/agent" import { Skill } from "../skill/skill" import { Auth } from "../auth" import { ModelCache } from "../provider/model-cache" // kilocode_change + +// kilocode_change start - debounce disposeAll so bulk auth changes (e.g. migration) only trigger one cycle +let disposeAllTimer: ReturnType | undefined +function scheduleDisposeAll() { + if (disposeAllTimer) clearTimeout(disposeAllTimer) + disposeAllTimer = setTimeout(() => { + disposeAllTimer = undefined + void Instance.disposeAll().catch(() => undefined) + }, 300) +} +// kilocode_change end import { Flag } from "../flag/flag" import { Command } from "../command" import { Global } from "../global" @@ -169,7 +180,7 @@ export namespace Server { await Auth.set(providerID, info) // kilocode_change start - invalidate provider/model cache after auth change ModelCache.clear(providerID) - void Instance.disposeAll().catch(() => undefined) + scheduleDisposeAll() // kilocode_change end return c.json(true) }, @@ -203,7 +214,7 @@ export namespace Server { await Auth.remove(providerID) // kilocode_change start - invalidate provider/model cache after auth removal ModelCache.clear(providerID) - void Instance.disposeAll().catch(() => undefined) + scheduleDisposeAll() // kilocode_change end return c.json(true) }, From d0b2b0624f60652e5c9cebb9cfc2949f1d9c6c7f Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Tue, 3 Mar 2026 11:06:39 +0100 Subject: [PATCH 15/48] fix(vscode): add cspSource to connect-src CSP directive Source map files (.js.map, .css.map) were blocked by CSP because connect-src didn't include the VS Code resource origin. The cspSource was already in style-src, font-src, and img-src but missing from connect-src. --- packages/kilo-vscode/src/webview-html-utils.ts | 2 +- packages/kilo-vscode/tests/unit/webview-html.test.ts | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/kilo-vscode/src/webview-html-utils.ts b/packages/kilo-vscode/src/webview-html-utils.ts index 629320dfa06..2acfb9b7f73 100644 --- a/packages/kilo-vscode/src/webview-html-utils.ts +++ b/packages/kilo-vscode/src/webview-html-utils.ts @@ -27,7 +27,7 @@ export function buildCspString(cspSource: string, nonce: string, port?: number): `style-src 'unsafe-inline' ${cspSource}`, `script-src 'nonce-${nonce}' 'wasm-unsafe-eval'`, `font-src ${cspSource}`, - `connect-src ${connectSrc}`, + `connect-src ${cspSource} ${connectSrc}`, `img-src ${cspSource} data: https:`, ] return joinCspDirectives(directives) diff --git a/packages/kilo-vscode/tests/unit/webview-html.test.ts b/packages/kilo-vscode/tests/unit/webview-html.test.ts index 2b930f163fb..465588e7cde 100644 --- a/packages/kilo-vscode/tests/unit/webview-html.test.ts +++ b/packages/kilo-vscode/tests/unit/webview-html.test.ts @@ -67,6 +67,11 @@ describe("buildCspString", () => { expect(result).not.toContain(":*") }) + it("includes cspSource in connect-src for source map loading", () => { + const result = buildCspString(cspSource, nonce) + expect(result).toMatch(new RegExp(`connect-src\\s+${cspSource.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}`)) + }) + it("joins directives with semicolons", () => { const result = buildCspString(cspSource, nonce) const parts = result.split(";") From 7711e85539b7dc1b8997238b54943a9d1f1d4850 Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Tue, 3 Mar 2026 11:18:45 +0100 Subject: [PATCH 16/48] fix(vscode): show permission dock for tool-associated permissions The !p.tool filter in permissionRequest() was filtering out all permissions that have a tool context (which is most of them). This caused blocked() to return true (hiding the PromptInput) while permissionRequest() returned undefined (hiding the permission dock), leaving no UI at the bottom. The upstream app (session-request-tree.ts) does not filter by tool presence. Align the extension behavior by removing the filter. --- .../kilo-vscode/webview-ui/src/components/chat/ChatView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx index 2075ee1b796..157e6761392 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx @@ -27,7 +27,7 @@ export const ChatView: Component = (props) => { const sessionPermissions = () => session.permissions().filter((p) => p.sessionID === id()) const questionRequest = () => sessionQuestions()[0] - const permissionRequest = () => sessionPermissions().find((p) => !p.tool) + const permissionRequest = () => sessionPermissions()[0] const blocked = () => sessionPermissions().length > 0 || sessionQuestions().length > 0 const [responding, setResponding] = createSignal(false) From cb15ccb499836aab3e27ea26b5407295a2606d27 Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Tue, 3 Mar 2026 11:42:30 +0100 Subject: [PATCH 17/48] fix(vscode): render permission prompts inline with tool calls Permissions with a tool context (messageID + callID) are now rendered inline below their associated tool part instead of in the bottom dock. - ChatView: restored !p.tool filter so only non-tool permissions go to the bottom dock - AssistantMessage: matches permissions to tool parts by callID and messageID, renders approve/deny buttons inline below the tool --- .../src/components/chat/AssistantMessage.tsx | 43 ++++++++++++++++++- .../src/components/chat/ChatView.tsx | 2 +- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/AssistantMessage.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/AssistantMessage.tsx index 4242dc89d37..dd66960b6f1 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/AssistantMessage.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/AssistantMessage.tsx @@ -5,10 +5,13 @@ * individually for maximum verbosity in the VS Code sidebar context. */ -import { Component, For, Show, createMemo } from "solid-js" +import { Component, For, Show, createMemo, createSignal } from "solid-js" import { Part, PART_MAPPING } from "@kilocode/kilo-ui/message-part" +import { Button } from "@kilocode/kilo-ui/button" import type { AssistantMessage as SDKAssistantMessage, Part as SDKPart, Message as SDKMessage } from "@kilocode/sdk/v2" import { useData } from "@kilocode/kilo-ui/context/data" +import { useSession } from "../../context/session" +import { useLanguage } from "../../context/language" const HIDDEN_TOOLS = new Set(["todowrite", "todoread"]) @@ -33,6 +36,8 @@ interface AssistantMessageProps { export const AssistantMessage: Component = (props) => { const data = useData() + const session = useSession() + const language = useLanguage() const parts = createMemo(() => { const stored = data.store.part?.[props.message.id] @@ -40,6 +45,24 @@ export const AssistantMessage: Component = (props) => { return (stored as SDKPart[]).filter(isRenderable) }) + const id = () => session.currentSessionID() + const permissions = () => session.permissions().filter((p) => p.sessionID === id() && p.tool) + + const permissionForPart = (part: SDKPart) => { + if (part.type !== "tool") return undefined + const callID = (part as SDKPart & { callID: string }).callID + return permissions().find((p) => p.tool!.callID === callID && p.tool!.messageID === props.message.id) + } + + const [responding, setResponding] = createSignal(false) + + const decide = (permissionId: string, response: "once" | "always" | "reject") => { + if (responding()) return + setResponding(true) + session.respondToPermission(permissionId, response) + setResponding(false) + } + return ( {(part) => ( @@ -50,6 +73,24 @@ export const AssistantMessage: Component = (props) => { showAssistantCopyPartID={props.showAssistantCopyPartID} turnDurationMs={props.turnDurationMs} /> + + {(perm) => ( +
+
+ + + +
+

{language.t("ui.permission.sessionHint")}

+
+ )} +
)} diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx index 157e6761392..2075ee1b796 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx @@ -27,7 +27,7 @@ export const ChatView: Component = (props) => { const sessionPermissions = () => session.permissions().filter((p) => p.sessionID === id()) const questionRequest = () => sessionQuestions()[0] - const permissionRequest = () => sessionPermissions()[0] + const permissionRequest = () => sessionPermissions().find((p) => !p.tool) const blocked = () => sessionPermissions().length > 0 || sessionQuestions().length > 0 const [responding, setResponding] = createSignal(false) From 0c78cb26efcf35075adb2d7ff8cc21b7b16ce0ec Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Tue, 3 Mar 2026 12:40:29 +0100 Subject: [PATCH 18/48] fix(vscode): add CSS styles for permission-prompt layout The permission-prompt data-component had no CSS rules, causing buttons and hint text to render without proper layout. Added flexbox styling for the actions row and proper font/color for the hint text. --- .../kilo-vscode/webview-ui/src/styles/chat.css | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/kilo-vscode/webview-ui/src/styles/chat.css b/packages/kilo-vscode/webview-ui/src/styles/chat.css index 821ebd623dd..b30f1d05de3 100644 --- a/packages/kilo-vscode/webview-ui/src/styles/chat.css +++ b/packages/kilo-vscode/webview-ui/src/styles/chat.css @@ -696,6 +696,23 @@ word-break: break-all; } +/* Permission Prompt (inline and dock) */ +[data-component="permission-prompt"] { + padding: 8px 12px; +} + +[data-component="permission-prompt"] [data-slot="permission-actions"] { + display: flex; + align-items: center; + gap: 6px; +} + +[data-component="permission-prompt"] [data-slot="permission-hint"] { + font-size: 11px; + color: var(--text-weak, var(--vscode-descriptionForeground)); + margin: 4px 0 0; +} + /* Dialog Confirmation */ .dialog-confirm-body { display: flex; From b420bac7b6db6993c6bda4a3884a668dfdf93356 Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Tue, 3 Mar 2026 12:50:41 +0100 Subject: [PATCH 19/48] fix(vscode): render permission prompt inside tool card border Wrap Part + permission in a tool-part-wrapper so the permission prompt appears visually inside the same card as the tool call. Inner Part's border is removed via CSS nesting to prevent double borders. A top border separates the permission buttons from the tool content. --- .../src/components/chat/AssistantMessage.tsx | 59 ++++++++++--------- .../webview-ui/src/styles/chat.css | 12 +++- 2 files changed, 43 insertions(+), 28 deletions(-) diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/AssistantMessage.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/AssistantMessage.tsx index dd66960b6f1..cc731a88262 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/AssistantMessage.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/AssistantMessage.tsx @@ -65,34 +65,39 @@ export const AssistantMessage: Component = (props) => { return ( - {(part) => ( - - - - {(perm) => ( -
-
- - - -
-

{language.t("ui.permission.sessionHint")}

-
- )} + {(part) => { + const perm = () => permissionForPart(part) + return ( + +
+ + + {(p) => ( +
+
+ + + +
+

{language.t("ui.permission.sessionHint")}

+
+ )} +
+
-
- )} + ) + }}
) } diff --git a/packages/kilo-vscode/webview-ui/src/styles/chat.css b/packages/kilo-vscode/webview-ui/src/styles/chat.css index b30f1d05de3..bc00739e73e 100644 --- a/packages/kilo-vscode/webview-ui/src/styles/chat.css +++ b/packages/kilo-vscode/webview-ui/src/styles/chat.css @@ -696,8 +696,18 @@ word-break: break-all; } -/* Permission Prompt (inline and dock) */ +/* Permission Prompt (inline with tool cards) */ +[data-component="tool-part-wrapper"][data-permission="true"] { + /* When wrapping a Part + permission, the outer wrapper provides the card border. + Remove the inner Part's tool-part-wrapper border so we don't get double borders. */ + > [data-component="tool-part-wrapper"] { + border: none; + border-radius: 0; + } +} + [data-component="permission-prompt"] { + border-top: 1px solid var(--border-weak-base, var(--vscode-panel-border)); padding: 8px 12px; } From 21ea0fe232f3765efcd5b7905859a2ae0f7ef07d Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Tue, 3 Mar 2026 12:53:55 +0100 Subject: [PATCH 20/48] fix(vscode): show permission patterns in inline permission prompt Display the permission's patterns (file globs, paths, commands) in the inline permission area so users can see what's being accessed. Uses the same permission-dock-patterns styling as the bottom dock. --- .../webview-ui/src/components/chat/AssistantMessage.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/AssistantMessage.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/AssistantMessage.tsx index cc731a88262..e6726053eab 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/AssistantMessage.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/AssistantMessage.tsx @@ -79,6 +79,13 @@ export const AssistantMessage: Component = (props) => { {(p) => (
+ 0}> +
+ + {(pattern) => {pattern}} + +
+
+ + +
+

Approval applies only to the current session

+
+ + + ) + }, +} + +// --------------------------------------------------------------------------- +// 4. Tool cards โ€” read, glob, grep, ls +// --------------------------------------------------------------------------- + +export const ToolCards: Story = { + name: "Tool Cards", + render: () => { + const data = dataWith([readCompleted, globCompleted, grepCompleted, lsCompleted]) + return ( + + + + ) + }, +} + +// --------------------------------------------------------------------------- +// 5. Chat idle โ€” prompt input placeholder +// --------------------------------------------------------------------------- + +export const ChatIdle: Story = { + name: "Chat Idle", + render: () => ( + +
+
+
+ Ask anythingโ€ฆ (โŒ˜ Enter) +
+
+
+
+ ), +} + +// --------------------------------------------------------------------------- +// 6. Chat busy โ€” working indicator, no prompt +// --------------------------------------------------------------------------- + +export const ChatBusy: Story = { + name: "Chat Busy", + render: () => { + const data = dataWith([textPart]) + return ( + +
+
+ +
+
+ + Thinkingโ€ฆ +
+
+
+ ) + }, +} + +// --------------------------------------------------------------------------- +// 7. Multiple tool calls in one assistant message +// --------------------------------------------------------------------------- + +export const MultipleToolCalls: Story = { + name: "Multiple Tool Calls", + render: () => { + const data = dataWith([readCompleted, globCompleted, textPart]) + return ( + + + + ) + }, +} From ea38f49d0e24ecaa665870998fc0489e2866f432 Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Tue, 3 Mar 2026 15:53:57 +0100 Subject: [PATCH 24/48] fix(vscode): avoid top-level await in visual regression spec Node.js v24 on CI rejects top-level await in files loaded via require(). Wrap story fetching in test.describe + beforeAll instead. --- .../tests/visual-regression.spec.ts | 42 +++++++++++-------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/packages/kilo-vscode/tests/visual-regression.spec.ts b/packages/kilo-vscode/tests/visual-regression.spec.ts index 468ce7a48a0..36e5f071725 100644 --- a/packages/kilo-vscode/tests/visual-regression.spec.ts +++ b/packages/kilo-vscode/tests/visual-regression.spec.ts @@ -48,22 +48,30 @@ async function disableAnimations(page: Page) { // Stories to skip from visual regression (add IDs here if needed) const SKIP = new Set([]) -// Generate one test() per story so Playwright's scheduler can distribute -// them freely across workers. -const stories = IS_DARWIN ? [] : (await fetchStories()).filter((s) => !SKIP.has(s.id)) +// Use test.describe + beforeAll to avoid top-level await which breaks +// on Node.js versions with strict ESM/CJS boundaries. +test.describe("Visual Regression", () => { + let stories: Story[] = [] -for (const story of stories) { - test(`${story.title} / ${story.name}`, async ({ page }) => { - // Use kilo-vscode theme by default (matched to the preview initialGlobals) - await page.goto( - `/iframe.html?id=${story.id}&viewMode=story&globals=colorScheme:dark;theme:kilo-vscode;vscodeTheme:dark-modern`, - { waitUntil: "load" }, - ) - await disableAnimations(page) - await page.waitForSelector("#storybook-root *", { state: "attached" }) - - const [component, variant] = story.id.split("--") - const root = page.locator("#storybook-root") - await expect(root).toHaveScreenshot([component, `${variant}.png`]) + test.beforeAll(async () => { + if (IS_DARWIN) return + stories = (await fetchStories()).filter((s) => !SKIP.has(s.id)) }) -} + + test("all stories", async ({ page }) => { + if (IS_DARWIN) return + for (const story of stories) { + // Use kilo-vscode theme by default (matched to the preview initialGlobals) + await page.goto( + `/iframe.html?id=${story.id}&viewMode=story&globals=colorScheme:dark;theme:kilo-vscode;vscodeTheme:dark-modern`, + { waitUntil: "load" }, + ) + await disableAnimations(page) + await page.waitForSelector("#storybook-root *", { state: "attached" }) + + const [component, variant] = story.id.split("--") + const root = page.locator("#storybook-root") + await expect(root).toHaveScreenshot([component!, `${variant}.png`]) + } + }) +}) From 188bc263f36c897e823ca0a66442048a4ff72b78 Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Tue, 3 Mar 2026 16:00:01 +0100 Subject: [PATCH 25/48] fix(vscode): use 420px viewport for visual regression screenshots VS Code sidebar is typically 350-450px wide. Set viewport to 420x720 and use fullscreen layout so stories fill the width naturally, matching the real sidebar appearance. --- packages/kilo-vscode/.storybook/preview.tsx | 2 +- packages/kilo-vscode/playwright.config.ts | 3 ++- packages/kilo-vscode/webview-ui/src/stories/StoryProviders.tsx | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/kilo-vscode/.storybook/preview.tsx b/packages/kilo-vscode/.storybook/preview.tsx index f8252384b59..d311b43c9cd 100644 --- a/packages/kilo-vscode/.storybook/preview.tsx +++ b/packages/kilo-vscode/.storybook/preview.tsx @@ -31,7 +31,7 @@ const preview: Preview = { date: /Date$/i, }, }, - layout: "centered", + layout: "fullscreen", }, decorators: [themeDecorator], globalTypes: { diff --git a/packages/kilo-vscode/playwright.config.ts b/packages/kilo-vscode/playwright.config.ts index c4a07f8bb27..c3bc956b63e 100644 --- a/packages/kilo-vscode/playwright.config.ts +++ b/packages/kilo-vscode/playwright.config.ts @@ -12,7 +12,8 @@ export default defineConfig({ reporter: [["html", { open: "never" }], ["list"]], use: { baseURL: "http://localhost:6007", - viewport: { width: 1280, height: 720 }, + // VS Code sidebar is typically 350-450px wide + viewport: { width: 420, height: 720 }, reducedMotion: "reduce", screenshot: "only-on-failure", }, diff --git a/packages/kilo-vscode/webview-ui/src/stories/StoryProviders.tsx b/packages/kilo-vscode/webview-ui/src/stories/StoryProviders.tsx index 31e546a60ed..93f43080023 100644 --- a/packages/kilo-vscode/webview-ui/src/stories/StoryProviders.tsx +++ b/packages/kilo-vscode/webview-ui/src/stories/StoryProviders.tsx @@ -148,7 +148,7 @@ export const StoryProviders: ParentComponent = (props) => { -
{props.children}
+
{props.children}
From 4b24935715110b52556699cc345a31e12895e5f4 Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Tue, 3 Mar 2026 16:09:46 +0100 Subject: [PATCH 26/48] chore: track kilo-vscode visual regression snapshots in Git LFS --- .gitattributes | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitattributes b/.gitattributes index 51298ca8a81..453ae820fe8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4,3 +4,4 @@ # Visual regression baseline snapshots packages/kilo-ui/tests/**/*.png filter=lfs diff=lfs merge=lfs -text +packages/kilo-vscode/tests/**/*.png filter=lfs diff=lfs merge=lfs -text From 9cc2a4f0bab32e27414ed36e07c69735b708bbe6 Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Tue, 3 Mar 2026 16:15:41 +0100 Subject: [PATCH 27/48] fix(vscode): override Desktop Chrome viewport to 420px in project config devices['Desktop Chrome'] includes viewport: 1280x720 which overrides the global use.viewport setting. Explicitly set 420x720 in the project config to match VS Code sidebar width. --- packages/kilo-vscode/playwright.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kilo-vscode/playwright.config.ts b/packages/kilo-vscode/playwright.config.ts index c3bc956b63e..30680574fc8 100644 --- a/packages/kilo-vscode/playwright.config.ts +++ b/packages/kilo-vscode/playwright.config.ts @@ -20,7 +20,7 @@ export default defineConfig({ projects: [ { name: "chromium", - use: { ...devices["Desktop Chrome"] }, + use: { ...devices["Desktop Chrome"], viewport: { width: 420, height: 720 } }, }, ], webServer: { From 647ad15be47c6778e24f6c15b314b2d722fc4114 Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Tue, 3 Mar 2026 16:52:20 +0100 Subject: [PATCH 28/48] chore(vscode): remove duplicate fonts.css, import from kilo-ui MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit No need to duplicate font-face declarations โ€” import kilo-ui's existing fonts.css directly. --- packages/kilo-vscode/.storybook/fonts.css | 49 --------------------- packages/kilo-vscode/.storybook/preview.tsx | 2 +- 2 files changed, 1 insertion(+), 50 deletions(-) delete mode 100644 packages/kilo-vscode/.storybook/fonts.css diff --git a/packages/kilo-vscode/.storybook/fonts.css b/packages/kilo-vscode/.storybook/fonts.css deleted file mode 100644 index ab32b78c9d3..00000000000 --- a/packages/kilo-vscode/.storybook/fonts.css +++ /dev/null @@ -1,49 +0,0 @@ -@font-face { - font-family: "Inter"; - src: url("@opencode-ai/ui/fonts/inter.woff2") format("woff2-variations"); - font-display: swap; - font-style: normal; - font-weight: 100 900; -} - -@font-face { - font-family: "Inter Fallback"; - src: local("Arial"); - size-adjust: 100%; - ascent-override: 97%; - descent-override: 25%; - line-gap-override: 1%; -} - -@font-face { - font-family: "IBM Plex Mono"; - src: url("@opencode-ai/ui/fonts/ibm-plex-mono.woff2") format("woff2"); - font-display: swap; - font-style: normal; - font-weight: 400; -} - -@font-face { - font-family: "IBM Plex Mono"; - src: url("@opencode-ai/ui/fonts/ibm-plex-mono-medium.woff2") format("woff2"); - font-display: swap; - font-style: normal; - font-weight: 500; -} - -@font-face { - font-family: "IBM Plex Mono"; - src: url("@opencode-ai/ui/fonts/ibm-plex-mono-bold.woff2") format("woff2"); - font-display: swap; - font-style: normal; - font-weight: 700; -} - -@font-face { - font-family: "IBM Plex Mono Fallback"; - src: local("Courier New"); - size-adjust: 100%; - ascent-override: 97%; - descent-override: 25%; - line-gap-override: 1%; -} diff --git a/packages/kilo-vscode/.storybook/preview.tsx b/packages/kilo-vscode/.storybook/preview.tsx index d311b43c9cd..f69d799def4 100644 --- a/packages/kilo-vscode/.storybook/preview.tsx +++ b/packages/kilo-vscode/.storybook/preview.tsx @@ -3,7 +3,7 @@ import type { Preview, SolidRenderer } from "storybook-solidjs-vite" import type { DecoratorFunction } from "storybook/internal/types" // Reference kilo-ui stories helpers directly โ€” not exported via package.json import { applyKiloTheme, applyVscodeTheme, clearVscodeTheme } from "../../kilo-ui/src/stories/theme-decorator" -import "./fonts.css" +import "../../kilo-ui/.storybook/fonts.css" import "@kilocode/kilo-ui/styles" import "../webview-ui/src/styles/chat.css" From 4f9e3ae0a87d17ee2f299022ae38c3c2b127c630 Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Tue, 3 Mar 2026 16:55:13 +0100 Subject: [PATCH 29/48] chore: remove planning doc from PR --- .../testing/composite-webview-visual-tests.md | 147 ------------------ 1 file changed, 147 deletions(-) delete mode 100644 packages/kilo-vscode/docs/testing/composite-webview-visual-tests.md diff --git a/packages/kilo-vscode/docs/testing/composite-webview-visual-tests.md b/packages/kilo-vscode/docs/testing/composite-webview-visual-tests.md deleted file mode 100644 index 8c685c89a76..00000000000 --- a/packages/kilo-vscode/docs/testing/composite-webview-visual-tests.md +++ /dev/null @@ -1,147 +0,0 @@ -# Composite Webview Visual Regression Tests - -## Problem - -The VS Code extension's webview UI combines components from `kilo-ui` with extension-specific logic (context providers, tool overrides, inline permissions, session management). While `kilo-ui` has Storybook + Playwright visual regression tests for individual components, there's no testing of the **composed** UI โ€” how these components look together in the actual extension webview context. - -This gap allowed issues like: -- Permission prompts missing styling (no CSS for `permission-prompt` data attributes) -- Inline permissions rendering outside the tool card border -- Tool cards (glob, read) not showing input details during pending state - -## Approach: Storybook Stories for Composite Extension Views - -Reuse the existing kilo-ui Storybook infrastructure but add **composite stories** in `packages/kilo-vscode` that render the extension's actual components (ChatView, AssistantMessage, PromptInput etc.) with mock data โ€” the same way `packages/kilo-ui/src/stories/message-part.stories.tsx` renders upstream message parts with mock providers. - -### Why Storybook (not VS Code extension host tests) - -- **Fast**: No VS Code process needed, just a browser -- **Deterministic**: Mock data, no real CLI backend or SSE connection -- **Reuses existing infra**: Same Playwright runner, same CI workflow pattern -- **VS Code theme support**: kilo-ui Storybook already has a `kilo-vscode` theme with real VS Code CSS variables - -## Architecture - -```mermaid -graph TD - A[kilo-vscode/stories/*.stories.tsx] -->|mock data| B[DataBridge / SessionProvider] - B --> C[ChatView] - C --> D[MessageList + VscodeSessionTurn] - C --> E[PromptInput] - C --> F[Permission Dock] - D --> G[AssistantMessage + inline permissions] - H[Playwright] -->|screenshot| A -``` - -## Implementation Plan - -### 1. Add Storybook to kilo-vscode - -Add a `.storybook/` config under `packages/kilo-vscode/` that extends kilo-ui's Storybook config: - -``` -packages/kilo-vscode/ - .storybook/ - main.ts โ† stories from webview-ui/src/stories/ - preview.tsx โ† import kilo-ui styles + chat.css + kilo-vscode theme - webview-ui/src/ - stories/ - chat-view.stories.tsx - permission-inline.stories.tsx - tool-cards.stories.tsx -``` - -The Storybook config uses `storybook-solidjs-vite` (same framework as kilo-ui) and resolves the same conditions. - -### 2. Create Mock Providers - -A `StoryProviders` wrapper that satisfies all the context requirements without a real CLI backend: - -```tsx -function StoryProviders(props: { - session?: Partial - data?: any - children: any -}) { - return ( - - - - {props.children} - - - - ) -} -``` - -The `SessionProvider` needs a mock mode that accepts pre-configured state (permissions, questions, status) without connecting to a real server. - -### 3. Composite Stories to Write - -| Story | Tests | -|-------|-------| -| **Glob with permission** | Tool card shows `pattern=**/*.md` + inline deny/allow buttons | -| **Bash with permission** | Expanded bash card + command + inline permission | -| **Permission dock (no tool)** | Bottom dock with patterns + buttons | -| **Question dock** | Bottom question UI with options | -| **Chat idle** | Empty state with prompt input visible | -| **Chat busy** | Spinner, no prompt input | -| **Tool error** | Error card rendering | -| **Multiple tool calls** | Assistant message with read + glob + text parts | - -### 4. Playwright Visual Regression - -Same pattern as kilo-ui: - -```ts -// packages/kilo-vscode/tests/visual-regression.spec.ts -const STORYBOOK_URL = "http://localhost:6007" // different port - -const stories = await fetchStories() -for (const story of stories) { - test(story.title + " / " + story.name, async ({ page }) => { - await page.goto(iframeUrl(story.id, "kilo-vscode", "dark")) - await disableAnimations(page) - const root = page.locator("#storybook-root") - await expect(root).toHaveScreenshot([component, variant + ".png"]) - }) -} -``` - -### 5. CI Integration - -Extend `.github/workflows/visual-regression.yml` to also trigger on `packages/kilo-vscode/webview-ui/**` changes and add a parallel job: - -```yaml -visual-regression-vscode: - name: Visual Regression (kilo-vscode webview) - runs-on: blacksmith-4vcpu-ubuntu-2404 - steps: - - # Same setup as kilo-ui job - - name: Build Storybook - run: bun run build-storybook - working-directory: packages/kilo-vscode - - name: Run visual regression - run: bun run test:visual - working-directory: packages/kilo-vscode -``` - -## Key Decisions - -1. **Separate Storybook instance** rather than adding stories to kilo-ui โ€” the extension's components depend on extension-specific contexts (SessionProvider, LanguageProvider) and styles (chat.css) that don't belong in the UI library - -2. **Mock session context** rather than running a real CLI server โ€” deterministic, fast, no side effects - -3. **Use kilo-vscode theme by default** โ€” screenshot the actual VS Code appearance since that's what users see - -4. **Test at the composite level** โ€” individual components are already tested in kilo-ui; we test the composition: ChatView with permission prompts, tool cards with inline buttons, etc. - -## Estimated Effort - -- Storybook setup: ~2h (config, build script, mock providers) -- Initial stories (8 scenarios): ~4h -- Playwright + CI integration: ~2h -- Baseline generation + review: ~1h - -Total: ~1 day of focused work. From 018ebee5462494dc23645a795a6b36f65e60b44b Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Tue, 3 Mar 2026 17:11:05 +0100 Subject: [PATCH 30/48] chore: remove kilocode_change markers from kilo-vscode Not needed in kilo-vscode files since the entire package is Kilo-specific. --- packages/kilo-vscode/webview-ui/src/context/language.tsx | 1 - packages/kilo-vscode/webview-ui/src/context/session.tsx | 1 - 2 files changed, 2 deletions(-) diff --git a/packages/kilo-vscode/webview-ui/src/context/language.tsx b/packages/kilo-vscode/webview-ui/src/context/language.tsx index 65e750d2f98..7e25c50fea4 100644 --- a/packages/kilo-vscode/webview-ui/src/context/language.tsx +++ b/packages/kilo-vscode/webview-ui/src/context/language.tsx @@ -193,7 +193,6 @@ interface LanguageContextValue { t: (key: string, params?: UiI18nParams) => string } -// kilocode_change - export context for Storybook mock providers export const LanguageContext = createContext() export function useLanguage() { diff --git a/packages/kilo-vscode/webview-ui/src/context/session.tsx b/packages/kilo-vscode/webview-ui/src/context/session.tsx index 280bd36dcc5..27f9cc6646b 100644 --- a/packages/kilo-vscode/webview-ui/src/context/session.tsx +++ b/packages/kilo-vscode/webview-ui/src/context/session.tsx @@ -138,7 +138,6 @@ interface SessionContextValue { selectCloudSession: (cloudSessionId: string) => void } -// kilocode_change - export context for Storybook mock providers export const SessionContext = createContext() export const SessionProvider: ParentComponent = (props) => { From 7f249104b50e30931120ea898dcbf1429971b038 Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Tue, 3 Mar 2026 17:22:06 +0100 Subject: [PATCH 31/48] fix(vscode): render tool-linked questions inline with message flow Questions with a tool context (messageID + callID) now render inline after the assistant message parts instead of in the bottom dock. - ChatView: filter !q.tool for bottom dock questions (same as permissions) - AssistantMessage: match questions to message by messageID, render QuestionDock inline after the last part - Added InlineQuestion storybook story with Dutch name options - StoryProviders: support mock questions prop --- .../src/components/chat/AssistantMessage.tsx | 94 +++++++++++-------- .../src/components/chat/ChatView.tsx | 2 +- .../webview-ui/src/stories/StoryProviders.tsx | 8 +- .../src/stories/composite.stories.tsx | 57 ++++++++++- 4 files changed, 117 insertions(+), 44 deletions(-) diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/AssistantMessage.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/AssistantMessage.tsx index e6726053eab..9abcc24eb37 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/AssistantMessage.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/AssistantMessage.tsx @@ -3,6 +3,9 @@ * Renders all parts of an assistant message as a flat list โ€” no context grouping. * Unlike the upstream AssistantParts, this renders each read/glob/grep/list tool * individually for maximum verbosity in the VS Code sidebar context. + * + * Permissions and questions with a tool context are rendered inline with their + * tool call rather than in the bottom dock. */ import { Component, For, Show, createMemo, createSignal } from "solid-js" @@ -12,6 +15,7 @@ import type { AssistantMessage as SDKAssistantMessage, Part as SDKPart, Message import { useData } from "@kilocode/kilo-ui/context/data" import { useSession } from "../../context/session" import { useLanguage } from "../../context/language" +import { QuestionDock } from "./QuestionDock" const HIDDEN_TOOLS = new Set(["todowrite", "todoread"]) @@ -47,6 +51,7 @@ export const AssistantMessage: Component = (props) => { const id = () => session.currentSessionID() const permissions = () => session.permissions().filter((p) => p.sessionID === id() && p.tool) + const questions = () => session.questions().filter((q) => q.sessionID === id() && q.tool) const permissionForPart = (part: SDKPart) => { if (part.type !== "tool") return undefined @@ -54,6 +59,10 @@ export const AssistantMessage: Component = (props) => { return permissions().find((p) => p.tool!.callID === callID && p.tool!.messageID === props.message.id) } + // Questions linked to this message (rendered after the last part) + const questionForMessage = () => + questions().find((q) => q.tool!.messageID === props.message.id) + const [responding, setResponding] = createSignal(false) const decide = (permissionId: string, response: "once" | "always" | "reject") => { @@ -64,47 +73,52 @@ export const AssistantMessage: Component = (props) => { } return ( - - {(part) => { - const perm = () => permissionForPart(part) - return ( - -
- - - {(p) => ( -
- 0}> -
- - {(pattern) => {pattern}} - + <> + + {(part) => { + const perm = () => permissionForPart(part) + return ( + +
+ + + {(p) => ( +
+ 0}> +
+ + {(pattern) => {pattern}} + +
+
+
+ + +
- -
- - - +

{language.t("ui.permission.sessionHint")}

-

{language.t("ui.permission.sessionHint")}

-
- )} -
-
-
- ) - }} -
+ )} + +
+
+ ) + }} + + + {(req) => } + + ) } diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx index 2075ee1b796..0f8ea5bf2d8 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx @@ -26,7 +26,7 @@ export const ChatView: Component = (props) => { const sessionQuestions = () => session.questions().filter((q) => q.sessionID === id()) const sessionPermissions = () => session.permissions().filter((p) => p.sessionID === id()) - const questionRequest = () => sessionQuestions()[0] + const questionRequest = () => sessionQuestions().find((q) => !q.tool) const permissionRequest = () => sessionPermissions().find((p) => !p.tool) const blocked = () => sessionPermissions().length > 0 || sessionQuestions().length > 0 diff --git a/packages/kilo-vscode/webview-ui/src/stories/StoryProviders.tsx b/packages/kilo-vscode/webview-ui/src/stories/StoryProviders.tsx index 93f43080023..2f55722e14e 100644 --- a/packages/kilo-vscode/webview-ui/src/stories/StoryProviders.tsx +++ b/packages/kilo-vscode/webview-ui/src/stories/StoryProviders.tsx @@ -21,7 +21,7 @@ import { LanguageContext } from "../context/language" import { dict as uiEn } from "@kilocode/kilo-ui/i18n/en" import { dict as appEn } from "../i18n/en" import { dict as kiloEn } from "@kilocode/kilo-i18n/en" -import type { PermissionRequest } from "../types/messages" +import type { PermissionRequest, QuestionRequest } from "../types/messages" // Merged English dictionary (same merge order as the real LanguageProvider) const dict: Record = { ...appEn, ...uiEn, ...kiloEn } @@ -54,10 +54,12 @@ function noop() {} export function mockSessionValue(overrides?: { id?: string permissions?: PermissionRequest[] + questions?: QuestionRequest[] status?: string }) { const id = overrides?.id ?? "story-session-001" const permissions = overrides?.permissions ?? [] + const qs = overrides?.questions ?? [] const status = (overrides?.status ?? "idle") as "idle" | "busy" return { @@ -78,7 +80,7 @@ export function mockSessionValue(overrides?: { getParts: () => [], todos: () => [], permissions: () => permissions, - questions: () => [], + questions: () => qs, questionErrors: () => new Set(), selected: () => ({ providerID: "anthropic", modelID: "claude-sonnet-4-20250514" }), selectModel: noop, @@ -119,6 +121,7 @@ export function mockSessionValue(overrides?: { interface StoryProvidersProps { data?: any permissions?: PermissionRequest[] + questions?: QuestionRequest[] status?: string sessionID?: string } @@ -128,6 +131,7 @@ export const StoryProviders: ParentComponent = (props) => { const session = mockSessionValue({ id: props.sessionID, permissions: props.permissions, + questions: props.questions, status: props.status, }) const [locale] = createSignal<"en">("en") diff --git a/packages/kilo-vscode/webview-ui/src/stories/composite.stories.tsx b/packages/kilo-vscode/webview-ui/src/stories/composite.stories.tsx index c9314fdd838..dea05ec17b1 100644 --- a/packages/kilo-vscode/webview-ui/src/stories/composite.stories.tsx +++ b/packages/kilo-vscode/webview-ui/src/stories/composite.stories.tsx @@ -22,7 +22,7 @@ import { StoryProviders, defaultMockData, mockSessionValue } from "./StoryProvid import { AssistantMessage } from "../components/chat/AssistantMessage" import { registerVscodeToolOverrides } from "../components/chat/VscodeToolOverrides" import { SessionContext } from "../context/session" -import type { PermissionRequest } from "../types/messages" +import type { PermissionRequest, QuestionRequest } from "../types/messages" // Register VS Code tool overrides (bash expanded by default, etc.) registerVscodeToolOverrides() @@ -193,6 +193,44 @@ const dockPermission: PermissionRequest = { // No `tool` field โ€” this is a non-tool (dock) permission } +// --------------------------------------------------------------------------- +// Question fixtures +// --------------------------------------------------------------------------- + +const questionRequest: QuestionRequest = { + id: "question-001", + sessionID: SESSION_ID, + questions: [ + { + question: "Kies een naam voor de hoofdpersoon van het verhaal:", + header: "Choose a name", + options: [ + { label: "Henk van der Berg", description: "Een klassieke Hollandse naam" }, + { label: "Gerrit Dijkstra", description: "Een degelijke Friese achternaam" }, + { label: "Piet Janssen", description: "Zo Nederlands als stroopwafels" }, + { label: "Koos Vermeer", description: "Klonkt als een schilder uit Delft" }, + ], + }, + ], + tool: { messageID: ASST_MSG_ID, callID: "call-question-001" }, +} + +const questionToolPart: ToolPart = { + id: "part-question-001", + sessionID: SESSION_ID, + messageID: ASST_MSG_ID, + type: "tool", + callID: "call-question-001", + tool: "question", + state: { + status: "running", + input: { question: "Kies een naam", options: [] }, + title: "Asking question", + metadata: {}, + time: { start: now - 1000 }, + }, +} + // --------------------------------------------------------------------------- // Data helpers // --------------------------------------------------------------------------- @@ -406,3 +444,20 @@ export const MultipleToolCalls: Story = { ) }, } + +// --------------------------------------------------------------------------- +// 8. Inline question (tool-linked question rendered in message flow) +// --------------------------------------------------------------------------- + +export const InlineQuestion: Story = { + name: "Inline Question", + render: () => { + const qs = [questionRequest] + const data = dataWith([textPart, questionToolPart]) + return ( + + + + ) + }, +} From 3549f6324f01d3a7114e0d75980132d674e15cbe Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Tue, 3 Mar 2026 17:31:10 +0100 Subject: [PATCH 32/48] chore: use English question in inline question story --- .../webview-ui/src/stories/composite.stories.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/kilo-vscode/webview-ui/src/stories/composite.stories.tsx b/packages/kilo-vscode/webview-ui/src/stories/composite.stories.tsx index dea05ec17b1..dca22dcd92c 100644 --- a/packages/kilo-vscode/webview-ui/src/stories/composite.stories.tsx +++ b/packages/kilo-vscode/webview-ui/src/stories/composite.stories.tsx @@ -202,13 +202,13 @@ const questionRequest: QuestionRequest = { sessionID: SESSION_ID, questions: [ { - question: "Kies een naam voor de hoofdpersoon van het verhaal:", - header: "Choose a name", + question: "Which testing framework should I use for this project?", + header: "Choose a framework", options: [ - { label: "Henk van der Berg", description: "Een klassieke Hollandse naam" }, - { label: "Gerrit Dijkstra", description: "Een degelijke Friese achternaam" }, - { label: "Piet Janssen", description: "Zo Nederlands als stroopwafels" }, - { label: "Koos Vermeer", description: "Klonkt als een schilder uit Delft" }, + { label: "Vitest", description: "Fast, Vite-native unit testing" }, + { label: "Jest", description: "Widely adopted, rich ecosystem" }, + { label: "Playwright", description: "End-to-end browser testing" }, + { label: "Bun test", description: "Built-in, zero config" }, ], }, ], @@ -224,7 +224,7 @@ const questionToolPart: ToolPart = { tool: "question", state: { status: "running", - input: { question: "Kies een naam", options: [] }, + input: { question: "Which testing framework?", options: [] }, title: "Asking question", metadata: {}, time: { start: now - 1000 }, From d8878895507b75e8eae1bf0983bf8450a78d4940 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 3 Mar 2026 17:44:11 +0000 Subject: [PATCH 33/48] chore: update kilo-vscode visual regression baselines --- .../composite-webview/bash-with-permission-chromium-linux.png | 3 +++ .../composite-webview/chat-busy-chromium-linux.png | 3 +++ .../composite-webview/chat-idle-chromium-linux.png | 3 +++ .../composite-webview/glob-with-permission-chromium-linux.png | 3 +++ .../composite-webview/inline-question-chromium-linux.png | 3 +++ .../composite-webview/multiple-tool-calls-chromium-linux.png | 3 +++ .../composite-webview/permission-dock-chromium-linux.png | 3 +++ .../composite-webview/tool-cards-chromium-linux.png | 3 +++ 8 files changed, 24 insertions(+) create mode 100644 packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/bash-with-permission-chromium-linux.png create mode 100644 packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/chat-busy-chromium-linux.png create mode 100644 packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/chat-idle-chromium-linux.png create mode 100644 packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/glob-with-permission-chromium-linux.png create mode 100644 packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/inline-question-chromium-linux.png create mode 100644 packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/multiple-tool-calls-chromium-linux.png create mode 100644 packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/permission-dock-chromium-linux.png create mode 100644 packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/tool-cards-chromium-linux.png diff --git a/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/bash-with-permission-chromium-linux.png b/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/bash-with-permission-chromium-linux.png new file mode 100644 index 00000000000..44ab459e0a2 --- /dev/null +++ b/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/bash-with-permission-chromium-linux.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:04332222bf7bf3680954f967414f93e9e3d03747961fada79cd32d4a5e2a1431 +size 10279 diff --git a/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/chat-busy-chromium-linux.png b/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/chat-busy-chromium-linux.png new file mode 100644 index 00000000000..116b32df4ce --- /dev/null +++ b/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/chat-busy-chromium-linux.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee4898a628110edf572fa27433bbb905d260225be0dd2154ccdfd4e4a2ea4c1e +size 4415 diff --git a/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/chat-idle-chromium-linux.png b/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/chat-idle-chromium-linux.png new file mode 100644 index 00000000000..bb29a832f34 --- /dev/null +++ b/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/chat-idle-chromium-linux.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b6d383088e69f94aeed3e9291092d1278f8346b2d50889bd83ecc72db5d13b7 +size 2846 diff --git a/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/glob-with-permission-chromium-linux.png b/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/glob-with-permission-chromium-linux.png new file mode 100644 index 00000000000..8b5892592b8 --- /dev/null +++ b/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/glob-with-permission-chromium-linux.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b1c5266bca40764f48d0cdefa3398083708ed7deb354acf8a5a296f9f9e0b2a6 +size 9005 diff --git a/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/inline-question-chromium-linux.png b/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/inline-question-chromium-linux.png new file mode 100644 index 00000000000..b0d7e63b64e --- /dev/null +++ b/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/inline-question-chromium-linux.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c13ea96b21def4f7359426d9d8900bab511938d4f71bc6635daaba44a2bbd133 +size 25078 diff --git a/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/multiple-tool-calls-chromium-linux.png b/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/multiple-tool-calls-chromium-linux.png new file mode 100644 index 00000000000..60ef12e51a0 --- /dev/null +++ b/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/multiple-tool-calls-chromium-linux.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd8a53356f0aa0df5c07246296dc20273f5380a012cd579885b1974e3aeb99e1 +size 8496 diff --git a/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/permission-dock-chromium-linux.png b/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/permission-dock-chromium-linux.png new file mode 100644 index 00000000000..ed03cefc81b --- /dev/null +++ b/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/permission-dock-chromium-linux.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa7bddaa15cf80565ef5b639bfe2de8d2f373019da4b72210c8ea82aaf47913f +size 10384 diff --git a/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/tool-cards-chromium-linux.png b/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/tool-cards-chromium-linux.png new file mode 100644 index 00000000000..5112b15c21e --- /dev/null +++ b/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/tool-cards-chromium-linux.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64ff66248b1c07209757eb6e27ccac4967650b144317ee21076ba82c129bc17b +size 8846 From 4db891dcc253b5ae898495114615caf327a30f35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Catriel=20M=C3=BCller?= Date: Tue, 3 Mar 2026 13:44:41 -0300 Subject: [PATCH 34/48] fix(migration): shared disposeAll debounce, MCP timeout, bash rule merge --- .../src/legacy-migration/migration-service.ts | 18 ++++++++++++++--- packages/opencode/src/kilocode/dispose.ts | 20 +++++++++++++++++++ packages/opencode/src/provider/auth.ts | 5 +++-- packages/opencode/src/server/server.ts | 12 +---------- 4 files changed, 39 insertions(+), 16 deletions(-) create mode 100644 packages/opencode/src/kilocode/dispose.ts diff --git a/packages/kilo-vscode/src/legacy-migration/migration-service.ts b/packages/kilo-vscode/src/legacy-migration/migration-service.ts index 993df8256f7..cfe16c64c5d 100644 --- a/packages/kilo-vscode/src/legacy-migration/migration-service.ts +++ b/packages/kilo-vscode/src/legacy-migration/migration-service.ts @@ -627,6 +627,7 @@ function convertMcpServer(server: LegacyMcpServer): McpLocalConfig | McpRemoteCo type: "local", command, environment: server.env, + ...(server.timeout !== undefined && { timeout: server.timeout }), } } @@ -654,10 +655,21 @@ function convertCustomModePermissions(groups: LegacyCustomMode["groups"]): Permi const permKey = GROUP_TO_PERMISSION[groupName] ?? groupName allowed.add(permKey) - if (groupConfig?.fileRegex) { - permission[permKey] = { [groupConfig.fileRegex]: "allow", "*": "deny" } - } else { + const newValue = groupConfig?.fileRegex ? { [groupConfig.fileRegex]: "allow", "*": "deny" } : "allow" + + // Multiple legacy groups can map to the same permission key (browser + command โ†’ bash). + // Merge rules so neither overwrites the other: + // - if either side is "allow", the key is fully allowed + // - if both sides are objects, merge their pattern maps + const existing = permission[permKey] + if (existing === undefined) { + permission[permKey] = newValue + } else if (existing === "allow" || newValue === "allow") { permission[permKey] = "allow" + } else if (typeof existing === "object" && typeof newValue === "object") { + permission[permKey] = { ...existing, ...newValue } + } else { + permission[permKey] = newValue } } diff --git a/packages/opencode/src/kilocode/dispose.ts b/packages/opencode/src/kilocode/dispose.ts new file mode 100644 index 00000000000..7f62dcbc494 --- /dev/null +++ b/packages/opencode/src/kilocode/dispose.ts @@ -0,0 +1,20 @@ +// kilocode_change - new file +/** + * Debounced Instance.disposeAll() helper. + * + * Bulk operations like legacy migration call client.auth.set() for each provider + * in rapid succession. Calling Instance.disposeAll() immediately on every auth + * change causes repeated disposal/recreation cycles. This module coalesces all + * dispose requests within a 300ms window into a single disposal call. + */ +import { Instance } from "../project/instance" + +let timer: ReturnType | undefined + +export function scheduleDisposeAll() { + if (timer) clearTimeout(timer) + timer = setTimeout(() => { + timer = undefined + void Instance.disposeAll().catch(() => undefined) + }, 300) +} diff --git a/packages/opencode/src/provider/auth.ts b/packages/opencode/src/provider/auth.ts index 94c8209b4a0..9cf665a801d 100644 --- a/packages/opencode/src/provider/auth.ts +++ b/packages/opencode/src/provider/auth.ts @@ -8,6 +8,7 @@ import { NamedError } from "@opencode-ai/util/error" import { Auth } from "@/auth" import { Telemetry } from "@kilocode/kilo-telemetry" // kilocode_change import { ModelCache } from "./model-cache" // kilocode_change +import { scheduleDisposeAll } from "../kilocode/dispose" // kilocode_change export namespace ProviderAuth { const state = Instance.state(async () => { @@ -124,7 +125,7 @@ export namespace ProviderAuth { // kilocode_change start - invalidate provider/model cache after auth change ModelCache.clear(input.providerID) - void Instance.disposeAll().catch(() => undefined) + scheduleDisposeAll() // kilocode_change end return @@ -146,7 +147,7 @@ export namespace ProviderAuth { }) // kilocode_change start - invalidate provider/model cache after auth change ModelCache.clear(input.providerID) - void Instance.disposeAll().catch(() => undefined) + scheduleDisposeAll() // kilocode_change end }, ) diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts index 968f6885f7d..a2049a7a39a 100644 --- a/packages/opencode/src/server/server.ts +++ b/packages/opencode/src/server/server.ts @@ -19,17 +19,7 @@ import { Agent } from "../agent/agent" import { Skill } from "../skill/skill" import { Auth } from "../auth" import { ModelCache } from "../provider/model-cache" // kilocode_change - -// kilocode_change start - debounce disposeAll so bulk auth changes (e.g. migration) only trigger one cycle -let disposeAllTimer: ReturnType | undefined -function scheduleDisposeAll() { - if (disposeAllTimer) clearTimeout(disposeAllTimer) - disposeAllTimer = setTimeout(() => { - disposeAllTimer = undefined - void Instance.disposeAll().catch(() => undefined) - }, 300) -} -// kilocode_change end +import { scheduleDisposeAll } from "../kilocode/dispose" // kilocode_change import { Flag } from "../flag/flag" import { Command } from "../command" import { Global } from "../global" From fc51e61f8e0b799a470d258adb29ec0880b70ba0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Catriel=20M=C3=BCller?= Date: Tue, 3 Mar 2026 14:37:24 -0300 Subject: [PATCH 35/48] fix(migration): global allow overwrite, JSON.parse error handling --- .../src/legacy-migration/migration-service.ts | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/packages/kilo-vscode/src/legacy-migration/migration-service.ts b/packages/kilo-vscode/src/legacy-migration/migration-service.ts index cfe16c64c5d..6ab8f576b49 100644 --- a/packages/kilo-vscode/src/legacy-migration/migration-service.ts +++ b/packages/kilo-vscode/src/legacy-migration/migration-service.ts @@ -421,6 +421,9 @@ async function migrateAutoApproval( const results: MigrationResultItem[] = [] // We collect all permission updates and apply them in one call at the end. const permission: PermissionConfig = {} + // Track if global "allow" was already written so we skip the per-tool object update + // that would otherwise overwrite it with a narrower permission set. + let globalAllowApplied = false // Command rules: master toggle + allowedCommands + deniedCommands if (sel.commandRules) { @@ -432,6 +435,7 @@ async function migrateAutoApproval( // PermissionConfig is "allow" | "ask" | "deny" | { read?: ..., ... }, so a global allow // must be the scalar string, not an object with a "*" key. await client.global.config.update({ config: { permission: "allow" } }) + globalAllowApplied = true } else if (hasCommandLists) { const bashRules: PermissionObjectConfig = {} // The legacy system matched commands as longest prefix (e.g. "npm run" matched "npm run dev"). @@ -529,7 +533,9 @@ async function migrateAutoApproval( onProgress(label, "success") } - if (Object.keys(permission).length > 0) { + // Only write the per-tool object form if global allow wasn't already applied โ€” + // writing an object after "allow" would narrow permissions to only the listed tools. + if (!globalAllowApplied && Object.keys(permission).length > 0) { await client.global.config.update({ config: { permission } }) } @@ -700,9 +706,13 @@ function convertCustomMode(mode: LegacyCustomMode): AgentConfig { async function readLegacyProviderProfiles(context: vscode.ExtensionContext): Promise { const raw = await context.secrets.get(SECRET_KEY) if (!raw) return null - const parsed = JSON.parse(raw) as Record - if (!parsed.apiConfigs || typeof parsed.apiConfigs !== "object") return null - return parsed as unknown as LegacyProviderProfiles + try { + const parsed = JSON.parse(raw) as Record + if (!parsed.apiConfigs || typeof parsed.apiConfigs !== "object") return null + return parsed as unknown as LegacyProviderProfiles + } catch { + return null + } } async function readLegacyMcpSettings(context: vscode.ExtensionContext): Promise { @@ -712,9 +722,13 @@ async function readLegacyMcpSettings(context: vscode.ExtensionContext): Promise< () => null, ) if (!bytes) return null - const parsed = JSON.parse(Buffer.from(bytes).toString("utf8")) as Record - if (!parsed.mcpServers || typeof parsed.mcpServers !== "object") return null - return parsed as unknown as LegacyMcpSettings + try { + const parsed = JSON.parse(Buffer.from(bytes).toString("utf8")) as Record + if (!parsed.mcpServers || typeof parsed.mcpServers !== "object") return null + return parsed as unknown as LegacyMcpSettings + } catch { + return null + } } async function readLegacyCustomModes(context: vscode.ExtensionContext): Promise { From 01615922b1217b182ba5514816dd7702ce112d8a Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Tue, 3 Mar 2026 19:05:38 +0100 Subject: [PATCH 36/48] chore: trigger CI rebuild From 088f11140c3c2395b1cb3f22ceecddbe7bcfe93f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 3 Mar 2026 18:08:59 +0000 Subject: [PATCH 37/48] chore: update visual regression baselines --- .../components-sessionturn/default-chromium-linux.png | 4 ++-- .../with-steps-expanded-chromium-linux.png | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionturn/default-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionturn/default-chromium-linux.png index f8d8fc65ab0..3ec89b92089 100644 --- a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionturn/default-chromium-linux.png +++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionturn/default-chromium-linux.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6c67c7cc21cd458c632228bdcee310615fae82c6d4c76e4d1170fa00224a9ac3 -size 29215 +oid sha256:1de30d219cd299acf26c9fe473c00f18cf057297db2e9b1ae44fb3116b0392f0 +size 31305 diff --git a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionturn/with-steps-expanded-chromium-linux.png b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionturn/with-steps-expanded-chromium-linux.png index f8d8fc65ab0..3ec89b92089 100644 --- a/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionturn/with-steps-expanded-chromium-linux.png +++ b/packages/kilo-ui/tests/visual-regression.spec.ts-snapshots/components-sessionturn/with-steps-expanded-chromium-linux.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6c67c7cc21cd458c632228bdcee310615fae82c6d4c76e4d1170fa00224a9ac3 -size 29215 +oid sha256:1de30d219cd299acf26c9fe473c00f18cf057297db2e9b1ae44fb3116b0392f0 +size 31305 From a5e7e071c31f64dce17796ef5930e62750092c39 Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Tue, 3 Mar 2026 19:11:05 +0100 Subject: [PATCH 38/48] chore: trigger CI rebuild From bc22f712f0f9630997476a710aaeb97638edfa00 Mon Sep 17 00:00:00 2001 From: "kilo-maintainer[bot]" Date: Tue, 3 Mar 2026 18:24:10 +0000 Subject: [PATCH 39/48] chore: update nix node_modules hashes --- nix/hashes.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nix/hashes.json b/nix/hashes.json index 847be80aa1a..745efd12c5a 100644 --- a/nix/hashes.json +++ b/nix/hashes.json @@ -1,8 +1,8 @@ { "nodeModules": { - "x86_64-linux": "sha256-NrbWpaXEMxKRZVMwSfn0Zt/iJ+/rAgdkeu8saQtPJWg=", - "aarch64-linux": "sha256-qwV7BBySUF2NpgFpPrYUAyEcOKOEHu0Su9HiDIoGlYk=", - "aarch64-darwin": "sha256-eHGuncX+swJvE3UNKCl6yy9AeWHMkpZK209oEsCOjnc=", - "x86_64-darwin": "sha256-jMqI1kJ/QVzPaOO8cVmm5dh5MFYSJ7YMkyAifgBO9KA=" + "x86_64-linux": "sha256-7YoMJRkLfE+49GuItkoTLj1nk8CxLAHGIdRtH2L5n4w=", + "aarch64-linux": "sha256-A+JUa7PI+ICd1+xCzQM11zZQMzsOWYFwULTo7sk4t5Q=", + "aarch64-darwin": "sha256-Pbh4id/Crsy6s6J2s7QlbDnUwtsdUXGjt+K5qz7o1mU=", + "x86_64-darwin": "sha256-hSdwk2LNlSr25p4YKb5Yh4K3L0CazFQ+SOXIfFY0jCY=" } } From 1aa9af4ac0db011f4efe3582b84512e9b99665d0 Mon Sep 17 00:00:00 2001 From: "kilo-maintainer[bot]" Date: Tue, 3 Mar 2026 18:59:43 +0000 Subject: [PATCH 40/48] release: v7.0.37 --- bun.lock | 28 +++++++++++++------------- package.json | 2 +- packages/app/package.json | 2 +- packages/desktop/package.json | 2 +- packages/extensions/zed/extension.toml | 12 +++++------ packages/kilo-docs/package.json | 2 +- packages/kilo-gateway/package.json | 2 +- packages/kilo-i18n/package.json | 2 +- packages/kilo-telemetry/package.json | 2 +- packages/kilo-ui/package.json | 2 +- packages/kilo-vscode/package.json | 2 +- packages/opencode/package.json | 2 +- packages/plugin/package.json | 2 +- packages/script/package.json | 2 +- packages/sdk/js/package.json | 2 +- packages/ui/package.json | 2 +- packages/util/package.json | 2 +- script/upstream/package.json | 2 +- sdks/vscode/package.json | 2 +- 19 files changed, 37 insertions(+), 37 deletions(-) diff --git a/bun.lock b/bun.lock index c4f5b241691..b83407285a6 100644 --- a/bun.lock +++ b/bun.lock @@ -25,7 +25,7 @@ }, "packages/app": { "name": "@opencode-ai/app", - "version": "7.0.36", + "version": "7.0.37", "dependencies": { "@kilocode/kilo-i18n": "workspace:*", "@kilocode/kilo-ui": "workspace:*", @@ -77,7 +77,7 @@ }, "packages/desktop": { "name": "@opencode-ai/desktop", - "version": "7.0.36", + "version": "7.0.37", "dependencies": { "@opencode-ai/app": "workspace:*", "@opencode-ai/ui": "workspace:*", @@ -110,7 +110,7 @@ }, "packages/kilo-docs": { "name": "@kilocode/kilo-docs", - "version": "7.0.36", + "version": "7.0.37", "dependencies": { "@docsearch/css": "^4", "@docsearch/js": "^4", @@ -139,7 +139,7 @@ }, "packages/kilo-gateway": { "name": "@kilocode/kilo-gateway", - "version": "7.0.36", + "version": "7.0.37", "dependencies": { "@clack/prompts": "1.0.0-alpha.1", "@kilocode/plugin": "workspace:*", @@ -171,7 +171,7 @@ }, "packages/kilo-i18n": { "name": "@kilocode/kilo-i18n", - "version": "7.0.36", + "version": "7.0.37", "devDependencies": { "@tsconfig/node22": "catalog:", "@types/bun": "catalog:", @@ -181,7 +181,7 @@ }, "packages/kilo-telemetry": { "name": "@kilocode/kilo-telemetry", - "version": "7.0.36", + "version": "7.0.37", "dependencies": { "@kilocode/kilo-gateway": "workspace:*", "@opentelemetry/api": "1.9.0", @@ -201,7 +201,7 @@ }, "packages/kilo-ui": { "name": "@kilocode/kilo-ui", - "version": "7.0.36", + "version": "7.0.37", "dependencies": { "@kobalte/core": "0.13.11", "lucide-solid": "0.576.0", @@ -226,7 +226,7 @@ }, "packages/kilo-vscode": { "name": "kilo-code", - "version": "7.0.36", + "version": "7.0.37", "dependencies": { "@anthropic-ai/sdk": "^0.39.0", "@kilocode/kilo-i18n": "workspace:*", @@ -276,7 +276,7 @@ }, "packages/opencode": { "name": "@kilocode/cli", - "version": "7.0.36", + "version": "7.0.37", "bin": { "opencode": "./bin/opencode", }, @@ -393,7 +393,7 @@ }, "packages/plugin": { "name": "@kilocode/plugin", - "version": "7.0.36", + "version": "7.0.37", "dependencies": { "@kilocode/sdk": "workspace:*", "zod": "catalog:", @@ -407,14 +407,14 @@ }, "packages/script": { "name": "@opencode-ai/script", - "version": "7.0.36", + "version": "7.0.37", "devDependencies": { "@types/bun": "catalog:", }, }, "packages/sdk/js": { "name": "@kilocode/sdk", - "version": "7.0.36", + "version": "7.0.37", "devDependencies": { "@hey-api/openapi-ts": "0.90.10", "@tsconfig/node22": "catalog:", @@ -425,7 +425,7 @@ }, "packages/ui": { "name": "@opencode-ai/ui", - "version": "7.0.36", + "version": "7.0.37", "dependencies": { "@kilocode/sdk": "workspace:*", "@kobalte/core": "catalog:", @@ -467,7 +467,7 @@ }, "packages/util": { "name": "@opencode-ai/util", - "version": "7.0.36", + "version": "7.0.37", "dependencies": { "zod": "catalog:", }, diff --git a/package.json b/package.json index 58e7769a6b2..31d0d8f4678 100644 --- a/package.json +++ b/package.json @@ -107,6 +107,6 @@ "@openrouter/ai-sdk-provider@1.5.4": "patches/@openrouter%2Fai-sdk-provider@1.5.4.patch", "ghostty-web@0.3.0": "patches/ghostty-web@0.3.0.patch" }, - "version": "7.0.36", + "version": "7.0.37", "peerDependencies": {} } diff --git a/packages/app/package.json b/packages/app/package.json index 52008cbd6a1..66bb1d50cf6 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/app", - "version": "7.0.36", + "version": "7.0.37", "description": "", "type": "module", "exports": { diff --git a/packages/desktop/package.json b/packages/desktop/package.json index 52fe5424607..b1242ed1eba 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -1,7 +1,7 @@ { "name": "@opencode-ai/desktop", "private": true, - "version": "7.0.36", + "version": "7.0.37", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/extensions/zed/extension.toml b/packages/extensions/zed/extension.toml index c3acdaeab1d..43a6c816c15 100644 --- a/packages/extensions/zed/extension.toml +++ b/packages/extensions/zed/extension.toml @@ -1,7 +1,7 @@ id = "kilo" name = "Kilo" description = "The open source coding agent." -version = "7.0.36" +version = "7.0.37" schema_version = 1 authors = ["Anomaly"] repository = "https://github.com/Kilo-Org/kilocode" @@ -11,26 +11,26 @@ name = "Kilo" icon = "./icons/opencode.svg" [agent_servers.opencode.targets.darwin-aarch64] -archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.36/opencode-darwin-arm64.zip" +archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.37/opencode-darwin-arm64.zip" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.darwin-x86_64] -archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.36/opencode-darwin-x64.zip" +archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.37/opencode-darwin-x64.zip" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.linux-aarch64] -archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.36/opencode-linux-arm64.tar.gz" +archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.37/opencode-linux-arm64.tar.gz" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.linux-x86_64] -archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.36/opencode-linux-x64.tar.gz" +archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.37/opencode-linux-x64.tar.gz" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.windows-x86_64] -archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.36/opencode-windows-x64.zip" +archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.37/opencode-windows-x64.zip" cmd = "./opencode.exe" args = ["acp"] diff --git a/packages/kilo-docs/package.json b/packages/kilo-docs/package.json index 11f515eddb4..74ca7116320 100644 --- a/packages/kilo-docs/package.json +++ b/packages/kilo-docs/package.json @@ -1,6 +1,6 @@ { "name": "@kilocode/kilo-docs", - "version": "7.0.36", + "version": "7.0.37", "private": true, "scripts": { "dev": "next dev --webpack --port 3002", diff --git a/packages/kilo-gateway/package.json b/packages/kilo-gateway/package.json index bcd1c8d71f7..6fcdabb6d24 100644 --- a/packages/kilo-gateway/package.json +++ b/packages/kilo-gateway/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@kilocode/kilo-gateway", - "version": "7.0.36", + "version": "7.0.37", "type": "module", "license": "MIT", "description": "Unified Kilo Gateway package for OpenCode - authentication, provider, and API integration", diff --git a/packages/kilo-i18n/package.json b/packages/kilo-i18n/package.json index e5196316760..112872239ad 100644 --- a/packages/kilo-i18n/package.json +++ b/packages/kilo-i18n/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@kilocode/kilo-i18n", - "version": "7.0.36", + "version": "7.0.37", "type": "module", "license": "MIT", "description": "Kilo-specific i18n translations and overrides", diff --git a/packages/kilo-telemetry/package.json b/packages/kilo-telemetry/package.json index e535eacea81..67b125fee70 100644 --- a/packages/kilo-telemetry/package.json +++ b/packages/kilo-telemetry/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@kilocode/kilo-telemetry", - "version": "7.0.36", + "version": "7.0.37", "type": "module", "license": "MIT", "description": "Telemetry for Kilo CLI - PostHog analytics integration", diff --git a/packages/kilo-ui/package.json b/packages/kilo-ui/package.json index 955396a36aa..e8be7458173 100644 --- a/packages/kilo-ui/package.json +++ b/packages/kilo-ui/package.json @@ -1,6 +1,6 @@ { "name": "@kilocode/kilo-ui", - "version": "7.0.36", + "version": "7.0.37", "type": "module", "license": "MIT", "exports": { diff --git a/packages/kilo-vscode/package.json b/packages/kilo-vscode/package.json index ad7079c060c..3014d523a87 100644 --- a/packages/kilo-vscode/package.json +++ b/packages/kilo-vscode/package.json @@ -2,7 +2,7 @@ "name": "kilo-code", "displayName": "Kilo Code: AI Coding Agent, Copilot, and Autocomplete", "description": "Open Source AI coding agent that generates code from natural language, automates tasks, and runs terminal commands. Features inline autocomplete, browser automation, automated refactoring, and custom modes for planning, coding, and debugging. Supports 500+ AI models including Claude (Anthropic), Gemini, Grok, GPT, Codex and GLM.", - "version": "7.0.36", + "version": "7.0.37", "icon": "assets/icons/logo-outline-black.png", "galleryBanner": { "color": "#FFFFFF", diff --git a/packages/opencode/package.json b/packages/opencode/package.json index 63db0727e25..e31fef6dbab 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "version": "7.0.36", + "version": "7.0.37", "name": "@kilocode/cli", "type": "module", "license": "MIT", diff --git a/packages/plugin/package.json b/packages/plugin/package.json index a551758e211..17b195104b9 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@kilocode/plugin", - "version": "7.0.36", + "version": "7.0.37", "type": "module", "license": "MIT", "repository": { diff --git a/packages/script/package.json b/packages/script/package.json index 1bc73d38075..35cc1cbd8f8 100644 --- a/packages/script/package.json +++ b/packages/script/package.json @@ -8,7 +8,7 @@ "exports": { ".": "./src/index.ts" }, - "version": "7.0.36", + "version": "7.0.37", "dependencies": {}, "peerDependencies": {} } diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json index 62b7fdaa81e..44d9ce7c2f0 100644 --- a/packages/sdk/js/package.json +++ b/packages/sdk/js/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@kilocode/sdk", - "version": "7.0.36", + "version": "7.0.37", "type": "module", "license": "MIT", "repository": { diff --git a/packages/ui/package.json b/packages/ui/package.json index 138f22ce1e8..63b90fa2ec9 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/ui", - "version": "7.0.36", + "version": "7.0.37", "type": "module", "license": "MIT", "exports": { diff --git a/packages/util/package.json b/packages/util/package.json index 7063db14cbf..610d32f428e 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/util", - "version": "7.0.36", + "version": "7.0.37", "private": true, "type": "module", "license": "MIT", diff --git a/script/upstream/package.json b/script/upstream/package.json index 2c20177c00c..524b82ee9cc 100644 --- a/script/upstream/package.json +++ b/script/upstream/package.json @@ -1,6 +1,6 @@ { "name": "@kilocode/upstream-merge", - "version": "7.0.36", + "version": "7.0.37", "private": true, "type": "module", "description": "Scripts for automating upstream opencode merges into Kilo", diff --git a/sdks/vscode/package.json b/sdks/vscode/package.json index 053c86a9234..efdaf05c2b8 100644 --- a/sdks/vscode/package.json +++ b/sdks/vscode/package.json @@ -2,7 +2,7 @@ "name": "opencode", "displayName": "opencode", "description": "opencode for VS Code", - "version": "7.0.36", + "version": "7.0.37", "publisher": "sst-dev", "repository": { "type": "git", From e5ded8a97a6470175a6c14d72c778ccce617e28e Mon Sep 17 00:00:00 2001 From: "kilo-code-bot[bot]" <240665456+kilo-code-bot[bot]@users.noreply.github.com> Date: Tue, 3 Mar 2026 14:39:33 -0500 Subject: [PATCH 41/48] fix: docs banner respects dark/light mode theme (#6576) Replace hardcoded dark-only colors in the announcement banner with CSS custom variables (--bg-secondary, --text-color, --border-color, --accent-color, --accent-hover) that automatically adapt to the site's light and dark themes. Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com> --- packages/kilo-docs/components/TopNav.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/kilo-docs/components/TopNav.tsx b/packages/kilo-docs/components/TopNav.tsx index ca41fbb7bfd..dbc0d077d3c 100644 --- a/packages/kilo-docs/components/TopNav.tsx +++ b/packages/kilo-docs/components/TopNav.tsx @@ -529,12 +529,12 @@ export function TopNav({ onMobileMenuToggle, isMobileMenuOpen = false, showMobil } .announcement-banner { - background: #1a1a18; - color: #a3a3a2; + background: var(--bg-secondary); + color: var(--text-color); padding: 0.5rem 1rem; text-align: center; font-size: 0.875rem; - border-bottom: 1px solid #3f3f3f; + border-bottom: 1px solid var(--border-color); } .announcement-banner p { @@ -542,13 +542,13 @@ export function TopNav({ onMobileMenuToggle, isMobileMenuOpen = false, showMobil } .announcement-banner :global(a) { - color: #f8f674; + color: var(--accent-color); text-decoration: underline; text-underline-offset: 2px; } .announcement-banner :global(a:hover) { - color: #ffff8d; + color: var(--accent-hover); } @media (max-width: 768px) { From 4c7b0396f3b549c1169a85d9bb98f0417bff1b58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Catriel=20M=C3=BCller?= Date: Tue, 3 Mar 2026 17:47:53 -0300 Subject: [PATCH 42/48] refactor: add i18n --- .../kilo-vscode/webview-ui/src/i18n/ar.ts | 48 +++++++++++++++++ .../kilo-vscode/webview-ui/src/i18n/br.ts | 50 ++++++++++++++++++ .../kilo-vscode/webview-ui/src/i18n/bs.ts | 51 ++++++++++++++++++ .../kilo-vscode/webview-ui/src/i18n/da.ts | 50 ++++++++++++++++++ .../kilo-vscode/webview-ui/src/i18n/de.ts | 51 ++++++++++++++++++ .../kilo-vscode/webview-ui/src/i18n/es.ts | 52 +++++++++++++++++++ .../kilo-vscode/webview-ui/src/i18n/fr.ts | 52 +++++++++++++++++++ .../kilo-vscode/webview-ui/src/i18n/ja.ts | 49 +++++++++++++++++ .../kilo-vscode/webview-ui/src/i18n/ko.ts | 49 +++++++++++++++++ .../kilo-vscode/webview-ui/src/i18n/no.ts | 50 ++++++++++++++++++ .../kilo-vscode/webview-ui/src/i18n/pl.ts | 52 +++++++++++++++++++ .../kilo-vscode/webview-ui/src/i18n/ru.ts | 51 ++++++++++++++++++ .../kilo-vscode/webview-ui/src/i18n/th.ts | 49 +++++++++++++++++ .../kilo-vscode/webview-ui/src/i18n/zh.ts | 47 +++++++++++++++++ .../kilo-vscode/webview-ui/src/i18n/zht.ts | 47 +++++++++++++++++ 15 files changed, 748 insertions(+) diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts index 28856d91efc..ef928a9d922 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts @@ -1084,4 +1084,52 @@ export const dict = { "question.summary": "{{n}} ู…ู† {{total}} ุฃุณุฆู„ุฉ", "common.review": "ู…ุฑุงุฌุนุฉ", + + // legacy-migration start + "settings.legacyMigration.link": "ุงู„ุชุฑุญูŠู„ ู…ู† ุงู„ุฅุตุฏุงุฑ ุงู„ู‚ุฏูŠู…", + "settings.aboutKiloCode.legacyMigration.title": "ุชุฑุญูŠู„ ุงู„ุฅุตุฏุงุฑ ุงู„ู‚ุฏูŠู…", + "settings.aboutKiloCode.legacyMigration.description": + "ุชุฑุญูŠู„ ุงู„ุฅุนุฏุงุฏุงุช ู…ู† ุชุซุจูŠุช ุณุงุจู‚ ู„ู€ Kilo CodeุŒ ุจู…ุง ููŠ ุฐู„ูƒ ู…ูุงุชูŠุญ API ู„ู…ู‚ุฏู…ูŠ ุงู„ุฎุฏู…ุฉ ูˆุงู„ู†ู…ูˆุฐุฌ ุงู„ุงูุชุฑุงุถูŠ.", + "migration.welcome.title": "ู…ุฑุญุจู‹ุง ุจูƒ ููŠ Kilo Code ุงู„ุฌุฏูŠุฏ", + "migration.welcome.detected": "ู„ู‚ุฏ ุงูƒุชุดูู†ุง ุฅุนุฏุงุฏุงุช ู…ู† ุชุซุจูŠุช ุณุงุจู‚ ู„ู€ Kilo Code.", + "migration.welcome.sessionsInfo": "ู„ุง ูŠู…ูƒู† ุชุฑุญูŠู„ ุฌู„ุณุงุช ุงู„ุฏุฑุฏุดุฉ ูˆุงู„ุณุฌู„ โ€” ุงู„ุฅุตุฏุงุฑ ุงู„ุฌุฏูŠุฏ ูŠุณุชุฎุฏู… ุจู†ูŠุฉ ู…ุฎุชู„ูุฉ.", + "migration.welcome.canMigrate": "ูŠู…ูƒู† ุชุฑุญูŠู„ ุงู„ุฅุนุฏุงุฏุงุช ุงู„ุชุงู„ูŠุฉ ุฅู„ู‰ ุงู„ุฅุตุฏุงุฑ ุงู„ุฌุฏูŠุฏ:", + "migration.welcome.start": "ุจุฏุก ุงู„ุชุฑุญูŠู„", + "migration.welcome.skip": "ุชุฎุทูŠ ุงู„ุชุฑุญูŠู„", + "migration.steps.title": "ุชุฑุญูŠู„ ุฅุนุฏุงุฏุงุชูƒ", + "migration.steps.subtitle": "ู„ู‚ุฏ ูˆุฌุฏู†ุง ุฅุนุฏุงุฏุงุช ู…ู† ุชุซุจูŠุช Kilo Code ุงู„ุณุงุจู‚. ุงุฎุชุฑ ู…ุง ุชุฑูŠุฏ ู†ู‚ู„ู‡.", + "migration.select.providers": "ู…ูุงุชูŠุญ API ู„ู…ู‚ุฏู…ูŠ ุงู„ุฎุฏู…ุฉ", + "migration.select.mcpServers": "ุฎูˆุงุฏู… MCP", + "migration.select.customModes": "ุงู„ุฃูˆุถุงุน ุงู„ู…ุฎุตุตุฉ / ุงู„ูˆูƒู„ุงุก", + "migration.select.defaultModel": "ุงู„ู†ู…ูˆุฐุฌ ุงู„ุงูุชุฑุงุถูŠ", + "migration.select.unsupported": "ุบูŠุฑ ู…ุฏุนูˆู… ููŠ ุงู„ุฅุตุฏุงุฑ ุงู„ุฌุฏูŠุฏ", + "migration.select.nothingToMigrate": "ู„ู… ูŠุชู… ุงู„ุนุซูˆุฑ ุนู„ู‰ ุฃูŠ ุดูŠุก ู„ุชุฑุญูŠู„ู‡ ููŠ ุงู„ุฅุนุฏุงุฏุงุช ุงู„ู‚ุฏูŠู…ุฉ.", + "migration.select.settings": "ุงู„ุฅุนุฏุงุฏุงุช", + "migration.select.autoApproval": "ุงู„ู…ูˆุงูู‚ุฉ ุงู„ุชู„ู‚ุงุฆูŠุฉ", + "migration.select.autoApproval.commandRules": "ู‚ูˆุงุนุฏ ุงู„ุฃูˆุงู…ุฑ", + "migration.select.autoApproval.commandRulesDesc": "ู…ูุชุงุญ ุงู„ุชุจุฏูŠู„ ุงู„ุฑุฆูŠุณูŠ ูˆู‚ูˆุงุฆู… ุงู„ุฃูˆุงู…ุฑ ุงู„ู…ุณู…ูˆุญ ุจู‡ุง/ุงู„ู…ุฑููˆุถุฉ", + "migration.select.autoApproval.readPermission": "ุตู„ุงุญูŠุฉ ุงู„ู‚ุฑุงุกุฉ", + "migration.select.autoApproval.readPermissionDesc": "ุงู„ูˆุตูˆู„ ู„ู‚ุฑุงุกุฉ ุงู„ู…ู„ูุงุช ุฏุงุฎู„ ูˆุฎุงุฑุฌ ู…ุณุงุญุฉ ุงู„ุนู…ู„", + "migration.select.autoApproval.writePermission": "ุตู„ุงุญูŠุฉ ุงู„ูƒุชุงุจุฉ", + "migration.select.autoApproval.writePermissionDesc": "ุงู„ูˆุตูˆู„ ู„ูƒุชุงุจุฉ ูˆุชุนุฏูŠู„ ุงู„ู…ู„ูุงุช", + "migration.select.autoApproval.executePermission": "ุตู„ุงุญูŠุฉ ุงู„ุชู†ููŠุฐ", + "migration.select.autoApproval.executePermissionDesc": "ุชู†ููŠุฐ ุฃูˆุงู…ุฑ ุงู„ูˆุญุฏุฉ ุงู„ุทุฑููŠุฉ", + "migration.select.autoApproval.mcpPermission": "ุตู„ุงุญูŠุฉ MCP", + "migration.select.autoApproval.mcpPermissionDesc": "ุงุณุชุฎุฏุงู… ุฃุฏูˆุงุช MCP", + "migration.select.autoApproval.taskPermission": "ุตู„ุงุญูŠุฉ ุงู„ู…ู‡ุงู…", + "migration.select.autoApproval.taskPermissionDesc": "ุชุจุฏูŠู„ ุงู„ูˆุถุน ูˆุฅู†ุดุงุก ุงู„ู…ู‡ุงู… ุงู„ูุฑุนูŠุฉ", + "migration.select.language": "ู„ุบุฉ ูˆุงุฌู‡ุฉ ุงู„ู…ุณุชุฎุฏู…", + "migration.select.languageDesc": "ุณูŠุชู… ุชุทุจูŠู‚ ู„ุบุชูƒ ุงู„ู…ูุถู„ุฉ ุนู„ู‰ ุงู„ุฅุถุงูุฉ ุงู„ุฌุฏูŠุฏุฉ", + "migration.select.autocomplete": "ุฅุนุฏุงุฏุงุช ุงู„ุฅูƒู…ุงู„ ุงู„ุชู„ู‚ุงุฆูŠ", + "migration.select.autocompleteDesc": "ุชูุถูŠู„ุงุช ุงู„ุชุดุบูŠู„ ุงู„ุชู„ู‚ุงุฆูŠุŒ ูˆุงุฎุชุตุงุฑุงุช ู„ูˆุญุฉ ุงู„ู…ูุงุชูŠุญุŒ ูˆุงู„ุฅูƒู…ุงู„ ุงู„ุชู„ู‚ุงุฆูŠ ู„ู„ุฏุฑุฏุดุฉ", + "migration.select.continue": "ู…ุชุงุจุนุฉ", + "migration.select.back": "ุฑุฌูˆุน", + "migration.progress.title": "ุฌุงุฑูŠ ุชุฑุญูŠู„ ุฅุนุฏุงุฏุงุชูƒโ€ฆ", + "migration.progress.done": "ู…ุชุงุจุนุฉ", + "migration.complete.summary": "ุชู… ุชุฑุญูŠู„ {{success}} ู…ู† {{total}} ุนู†ุงุตุฑ ุจู†ุฌุงุญ.", + "migration.complete.cleanup": "ุฅุฒุงู„ุฉ ุจูŠุงู†ุงุช ุงู„ุฅุนุฏุงุฏุงุช ุงู„ู‚ุฏูŠู…ุฉ", + "migration.complete.cleanupDescription": + "ู‡ุฐุง ูŠุฒูŠู„ ุงู„ุฅุนุฏุงุฏุงุช ุงู„ู‚ุฏูŠู…ุฉ ู…ู† ู…ุณุงุญุฉ ุชุฎุฒูŠู† VS Code. ู„ู† ุชุชู…ูƒู† ู…ู† ุฅุนุงุฏุฉ ุชุดุบูŠู„ ู‡ุฐุง ุงู„ุชุฑุญูŠู„.", + "migration.complete.done": "ุชู…", + // legacy-migration end } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/br.ts b/packages/kilo-vscode/webview-ui/src/i18n/br.ts index 90c732a676b..616989d6c1e 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/br.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/br.ts @@ -1098,4 +1098,54 @@ export const dict = { "question.summary": "{{n}} de {{total}} perguntas", "common.review": "Revisar", + + // legacy-migration start + "settings.legacyMigration.link": "Migrar da Versรฃo Legada", + "settings.aboutKiloCode.legacyMigration.title": "Migraรงรฃo Legada", + "settings.aboutKiloCode.legacyMigration.description": + "Migre as configuraรงรตes de uma instalaรงรฃo anterior do Kilo Code, incluindo chaves de API de provedor e modelo padrรฃo.", + "migration.welcome.title": "Bem-vindo ao Novo Kilo Code", + "migration.welcome.detected": "Detectamos configuraรงรตes de uma instalaรงรฃo anterior do Kilo Code.", + "migration.welcome.sessionsInfo": + "Sessรตes de chat e histรณrico nรฃo podem ser migrados โ€” a nova versรฃo usa uma arquitetura diferente.", + "migration.welcome.canMigrate": "As seguintes configuraรงรตes podem ser migradas para a nova versรฃo:", + "migration.welcome.start": "Iniciar Migraรงรฃo", + "migration.welcome.skip": "Pular Migraรงรฃo", + "migration.steps.title": "Migre suas configuraรงรตes", + "migration.steps.subtitle": + "Encontramos configuraรงรตes da sua instalaรงรฃo anterior do Kilo Code. Escolha o que trazer.", + "migration.select.providers": "Chaves de API de Provedor", + "migration.select.mcpServers": "Servidores MCP", + "migration.select.customModes": "Modos Personalizados / Agentes", + "migration.select.defaultModel": "Modelo Padrรฃo", + "migration.select.unsupported": "Nรฃo suportado na nova versรฃo", + "migration.select.nothingToMigrate": "Nada para migrar foi encontrado nas configuraรงรตes legadas.", + "migration.select.settings": "Configuraรงรตes", + "migration.select.autoApproval": "Aprovaรงรฃo Automรกtica", + "migration.select.autoApproval.commandRules": "Regras de Comando", + "migration.select.autoApproval.commandRulesDesc": "Alternador principal e listas de comandos permitidos/negados", + "migration.select.autoApproval.readPermission": "Permissรฃo de Leitura", + "migration.select.autoApproval.readPermissionDesc": "Acesso de leitura de arquivos dentro e fora do workspace", + "migration.select.autoApproval.writePermission": "Permissรฃo de Escrita", + "migration.select.autoApproval.writePermissionDesc": "Acesso de escrita e ediรงรฃo de arquivos", + "migration.select.autoApproval.executePermission": "Permissรฃo de Execuรงรฃo", + "migration.select.autoApproval.executePermissionDesc": "Execuรงรฃo de comandos de terminal", + "migration.select.autoApproval.mcpPermission": "Permissรฃo MCP", + "migration.select.autoApproval.mcpPermissionDesc": "Uso de ferramentas MCP", + "migration.select.autoApproval.taskPermission": "Permissรฃo de Tarefa", + "migration.select.autoApproval.taskPermissionDesc": "Troca de modo e criaรงรฃo de subtarefas", + "migration.select.language": "Idioma da Interface", + "migration.select.languageDesc": "Sua preferรชncia de idioma serรก aplicada ร  nova extensรฃo", + "migration.select.autocomplete": "Configuraรงรตes de Autocomplete", + "migration.select.autocompleteDesc": "Preferรชncias de gatilho automรกtico, atalhos de teclado e autocomplete do chat", + "migration.select.continue": "Continuar", + "migration.select.back": "Voltar", + "migration.progress.title": "Migrando suas configuraรงรตesโ€ฆ", + "migration.progress.done": "Continuar", + "migration.complete.summary": "{{success}} de {{total}} itens migrados com sucesso.", + "migration.complete.cleanup": "Remover dados de configuraรงรตes legadas", + "migration.complete.cleanupDescription": + "Isso remove as configuraรงรตes antigas do armazenamento do VS Code. Vocรช nรฃo poderรก executar esta migraรงรฃo novamente.", + "migration.complete.done": "Concluรญdo", + // legacy-migration end } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts index 73b750cdaa8..956ddd23047 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts @@ -1120,4 +1120,55 @@ export const dict = { "question.summary": "{{n}} od {{total}} pitanja", "common.review": "Pregled", + + // legacy-migration start + "settings.legacyMigration.link": "Migriraj sa prethodne verzije", + "settings.aboutKiloCode.legacyMigration.title": "Migracija sa prethodne verzije", + "settings.aboutKiloCode.legacyMigration.description": + "Migrirajte postavke iz prethodne instalacije Kilo Code, ukljuฤujuฤ‡i API kljuฤeve provajdera i podrazumijevani model.", + "migration.welcome.title": "Dobrodoลกli u novi Kilo Code", + "migration.welcome.detected": "Otkrili smo postavke iz prethodne instalacije Kilo Code.", + "migration.welcome.sessionsInfo": + "Sesije razgovora i historija se ne mogu migrirati โ€” nova verzija koristi drugaฤiju arhitekturu.", + "migration.welcome.canMigrate": "Sljedeฤ‡e postavke se mogu migrirati na novu verziju:", + "migration.welcome.start": "Zapoฤni migraciju", + "migration.welcome.skip": "Preskoฤi migraciju", + "migration.steps.title": "Migrirajte svoje postavke", + "migration.steps.subtitle": + "Pronaลกli smo postavke iz vaลกe prethodne instalacije Kilo Code. Odaberite ลกta ลพelite prenijeti.", + "migration.select.providers": "API kljuฤevi provajdera", + "migration.select.mcpServers": "MCP serveri", + "migration.select.customModes": "Prilagoฤ‘eni reลพimi / Agenti", + "migration.select.defaultModel": "Podrazumijevani model", + "migration.select.unsupported": "Nije podrลพano u novoj verziji", + "migration.select.nothingToMigrate": "U starim postavkama nije pronaฤ‘eno niลกta za migraciju.", + "migration.select.settings": "Postavke", + "migration.select.autoApproval": "Automatsko odobravanje", + "migration.select.autoApproval.commandRules": "Pravila za komande", + "migration.select.autoApproval.commandRulesDesc": "Glavni prekidaฤ i liste dozvoljenih/odbijenih komandi", + "migration.select.autoApproval.readPermission": "Dozvola za ฤitanje", + "migration.select.autoApproval.readPermissionDesc": "Pristup ฤitanju datoteka unutar i izvan radnog prostora", + "migration.select.autoApproval.writePermission": "Dozvola za pisanje", + "migration.select.autoApproval.writePermissionDesc": "Pristup za pisanje i ureฤ‘ivanje datoteka", + "migration.select.autoApproval.executePermission": "Dozvola za izvrลกavanje", + "migration.select.autoApproval.executePermissionDesc": "Izvrลกavanje komandi u terminalu", + "migration.select.autoApproval.mcpPermission": "MCP dozvola", + "migration.select.autoApproval.mcpPermissionDesc": "Koriลกtenje MCP alata", + "migration.select.autoApproval.taskPermission": "Dozvola za zadatke", + "migration.select.autoApproval.taskPermissionDesc": "Mijenjanje reลพima i kreiranje podzadataka", + "migration.select.language": "Jezik korisniฤkog interfejsa", + "migration.select.languageDesc": "Vaลกe ลพeljene postavke jezika ฤ‡e biti primijenjene na novu ekstenziju", + "migration.select.autocomplete": "Postavke automatskog dovrลกavanja", + "migration.select.autocompleteDesc": + "Postavke automatskog pokretanja, preฤica na tastaturi i automatskog dovrลกavanja u chatu", + "migration.select.continue": "Nastavi", + "migration.select.back": "Nazad", + "migration.progress.title": "Migriranje vaลกih postavkiโ€ฆ", + "migration.progress.done": "Nastavi", + "migration.complete.summary": "Uspjeลกno migrirano {{success}} od {{total}} stavki.", + "migration.complete.cleanup": "Ukloni stare podatke postavki", + "migration.complete.cleanupDescription": + "Ovo uklanja stare postavke iz VS Code pohrane. Neฤ‡ete moฤ‡i ponovo pokrenuti ovu migraciju.", + "migration.complete.done": "Zavrลกeno", + // legacy-migration end } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/da.ts b/packages/kilo-vscode/webview-ui/src/i18n/da.ts index bac9e388ea3..ceb3913e794 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/da.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/da.ts @@ -1093,4 +1093,54 @@ export const dict = { "question.summary": "{{n}} af {{total}} spรธrgsmรฅl", "common.review": "Gennemgรฅ", + + // legacy-migration start + "settings.legacyMigration.link": "Migrer fra legacy-version", + "settings.aboutKiloCode.legacyMigration.title": "Legacy-migrering", + "settings.aboutKiloCode.legacyMigration.description": + "Migrer indstillinger fra en tidligere installation af Kilo Code, herunder udbyder API-nรธgler og standardmodel.", + "migration.welcome.title": "Velkommen til det nye Kilo Code", + "migration.welcome.detected": "Vi har fundet indstillinger fra en tidligere installation af Kilo Code.", + "migration.welcome.sessionsInfo": + "Chatsessioner og historik kan ikke migreres โ€” den nye version bruger en anden arkitektur.", + "migration.welcome.canMigrate": "Fรธlgende indstillinger kan migreres til den nye version:", + "migration.welcome.start": "Start migrering", + "migration.welcome.skip": "Spring migrering over", + "migration.steps.title": "Migrer dine indstillinger", + "migration.steps.subtitle": + "Vi har fundet indstillinger fra din tidligere Kilo Code-installation. Vรฆlg, hvad der skal overfรธres.", + "migration.select.providers": "Udbyder API-nรธgler", + "migration.select.mcpServers": "MCP-servere", + "migration.select.customModes": "Brugerdefinerede tilstande / Agenter", + "migration.select.defaultModel": "Standardmodel", + "migration.select.unsupported": "Understรธttes ikke i den nye version", + "migration.select.nothingToMigrate": "Der blev ikke fundet noget at migrere i legacy-indstillingerne.", + "migration.select.settings": "Indstillinger", + "migration.select.autoApproval": "Automatisk godkendelse", + "migration.select.autoApproval.commandRules": "Kommandoregler", + "migration.select.autoApproval.commandRulesDesc": "Hovedafbryder og lister over tilladte/afviste kommandoer", + "migration.select.autoApproval.readPermission": "Lรฆsetilladelse", + "migration.select.autoApproval.readPermissionDesc": "Fillรฆseadgang inden for og uden for arbejdsomrรฅdet", + "migration.select.autoApproval.writePermission": "Skrivetilladelse", + "migration.select.autoApproval.writePermissionDesc": "Filskrive- og redigeringsadgang", + "migration.select.autoApproval.executePermission": "Udfรธrelsestilladelse", + "migration.select.autoApproval.executePermissionDesc": "Udfรธrelse af terminalkommandoer", + "migration.select.autoApproval.mcpPermission": "MCP-tilladelse", + "migration.select.autoApproval.mcpPermissionDesc": "Brug af MCP-vรฆrktรธjer", + "migration.select.autoApproval.taskPermission": "Opgavetilladelse", + "migration.select.autoApproval.taskPermissionDesc": "Skift af tilstand og oprettelse af underopgaver", + "migration.select.language": "UI-sprog", + "migration.select.languageDesc": "Din sprogprรฆference vil blive anvendt pรฅ den nye udvidelse", + "migration.select.autocomplete": "Indstillinger for autofuldfรธrelse", + "migration.select.autocompleteDesc": "Prรฆferencer for automatisk udlรธsning, genvejstaster og chat-autofuldfรธrelse", + "migration.select.continue": "Fortsรฆt", + "migration.select.back": "Tilbage", + "migration.progress.title": "Migrerer dine indstillingerโ€ฆ", + "migration.progress.done": "Fortsรฆt", + "migration.complete.summary": "{{success}} af {{total}} elementer blev migreret med succes.", + "migration.complete.cleanup": "Fjern legacy-indstillingsdata", + "migration.complete.cleanupDescription": + "Dette fjerner de gamle indstillinger fra VS Code-lageret. Du vil ikke kunne kรธre denne migrering igen.", + "migration.complete.done": "Fรฆrdig", + // legacy-migration end } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/de.ts b/packages/kilo-vscode/webview-ui/src/i18n/de.ts index b1f8d666274..99ee61e6cab 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/de.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/de.ts @@ -1107,4 +1107,55 @@ export const dict = { "question.summary": "{{n}} von {{total}} Fragen", "common.review": "รœberprรผfen", + + // legacy-migration start + "settings.legacyMigration.link": "Von der Legacy-Version migrieren", + "settings.aboutKiloCode.legacyMigration.title": "Legacy-Migration", + "settings.aboutKiloCode.legacyMigration.description": + "Migrieren Sie Einstellungen von einer frรผheren Installation von Kilo Code, einschlieรŸlich Anbieter-API-Schlรผsseln und dem Standardmodell.", + "migration.welcome.title": "Willkommen beim neuen Kilo Code", + "migration.welcome.detected": "Wir haben Einstellungen aus einer frรผheren Installation von Kilo Code erkannt.", + "migration.welcome.sessionsInfo": + "Chat-Sitzungen und Verlauf kรถnnen nicht migriert werden โ€” die neue Version verwendet eine andere Architektur.", + "migration.welcome.canMigrate": "Die folgenden Einstellungen kรถnnen in die neue Version migriert werden:", + "migration.welcome.start": "Migration starten", + "migration.welcome.skip": "Migration รผberspringen", + "migration.steps.title": "Ihre Einstellungen migrieren", + "migration.steps.subtitle": + "Wir haben Einstellungen aus Ihrer vorherigen Kilo Code-Installation gefunden. Wรคhlen Sie aus, was รผbernommen werden soll.", + "migration.select.providers": "Anbieter-API-Schlรผssel", + "migration.select.mcpServers": "MCP-Server", + "migration.select.customModes": "Benutzerdefinierte Modi / Agenten", + "migration.select.defaultModel": "Standardmodell", + "migration.select.unsupported": "Wird in der neuen Version nicht unterstรผtzt", + "migration.select.nothingToMigrate": "In den Legacy-Einstellungen wurde nichts gefunden, was migriert werden kรถnnte.", + "migration.select.settings": "Einstellungen", + "migration.select.autoApproval": "Automatische Genehmigung", + "migration.select.autoApproval.commandRules": "Befehlsregeln", + "migration.select.autoApproval.commandRulesDesc": "Hauptschalter und Listen fรผr erlaubte/verweigerte Befehle", + "migration.select.autoApproval.readPermission": "Leseberechtigung", + "migration.select.autoApproval.readPermissionDesc": "Dateilesezugriff innerhalb und auรŸerhalb des Arbeitsbereichs", + "migration.select.autoApproval.writePermission": "Schreibberechtigung", + "migration.select.autoApproval.writePermissionDesc": "Dateischreib- und Bearbeitungszugriff", + "migration.select.autoApproval.executePermission": "Ausfรผhrungsberechtigung", + "migration.select.autoApproval.executePermissionDesc": "Ausfรผhrung von Terminalbefehlen", + "migration.select.autoApproval.mcpPermission": "MCP-Berechtigung", + "migration.select.autoApproval.mcpPermissionDesc": "Nutzung von MCP-Tools", + "migration.select.autoApproval.taskPermission": "Aufgabenberechtigung", + "migration.select.autoApproval.taskPermissionDesc": "Wechsel des Modus und Erstellung von Teilaufgaben", + "migration.select.language": "UI-Sprache", + "migration.select.languageDesc": "Ihre Spracheinstellung wird auf die neue Erweiterung angewendet", + "migration.select.autocomplete": "Einstellungen fรผr Autovervollstรคndigung", + "migration.select.autocompleteDesc": + "Einstellungen fรผr automatische Auslรถsung, Tastenkombinationen und Chat-Autovervollstรคndigung", + "migration.select.continue": "Weiter", + "migration.select.back": "Zurรผck", + "migration.progress.title": "Ihre Einstellungen werden migriertโ€ฆ", + "migration.progress.done": "Weiter", + "migration.complete.summary": "{{success}} von {{total}} Elementen erfolgreich migriert.", + "migration.complete.cleanup": "Legacy-Einstellungsdaten entfernen", + "migration.complete.cleanupDescription": + "Dadurch werden die alten Einstellungen aus dem VS Code-Speicher entfernt. Sie kรถnnen diese Migration danach nicht erneut ausfรผhren.", + "migration.complete.done": "Fertig", + // legacy-migration end } satisfies Partial> diff --git a/packages/kilo-vscode/webview-ui/src/i18n/es.ts b/packages/kilo-vscode/webview-ui/src/i18n/es.ts index 4eade4ff144..b2cd22f4483 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/es.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/es.ts @@ -1101,4 +1101,56 @@ export const dict = { "question.summary": "{{n}} de {{total}} preguntas", "common.review": "Revisar", + + // legacy-migration start + "settings.legacyMigration.link": "Migrar desde la versiรณn heredada", + "settings.aboutKiloCode.legacyMigration.title": "Migraciรณn heredada", + "settings.aboutKiloCode.legacyMigration.description": + "Migra la configuraciรณn de una instalaciรณn anterior de Kilo Code, incluyendo las claves API de proveedores y el modelo predeterminado.", + "migration.welcome.title": "Bienvenido al nuevo Kilo Code", + "migration.welcome.detected": "Hemos detectado una configuraciรณn de una instalaciรณn anterior de Kilo Code.", + "migration.welcome.sessionsInfo": + "Las sesiones de chat y el historial no se pueden migrar โ€” la nueva versiรณn utiliza una arquitectura diferente.", + "migration.welcome.canMigrate": "Las siguientes configuraciones se pueden migrar a la nueva versiรณn:", + "migration.welcome.start": "Iniciar migraciรณn", + "migration.welcome.skip": "Omitir migraciรณn", + "migration.steps.title": "Migra tu configuraciรณn", + "migration.steps.subtitle": + "Encontramos configuraciones de tu instalaciรณn anterior de Kilo Code. Elige quรฉ deseas transferir.", + "migration.select.providers": "Claves API de proveedores", + "migration.select.mcpServers": "Servidores MCP", + "migration.select.customModes": "Modos personalizados / Agentes", + "migration.select.defaultModel": "Modelo predeterminado", + "migration.select.unsupported": "No compatible con la nueva versiรณn", + "migration.select.nothingToMigrate": "No se encontrรณ nada para migrar en la configuraciรณn heredada.", + "migration.select.settings": "Configuraciรณn", + "migration.select.autoApproval": "Aprobaciรณn automรกtica", + "migration.select.autoApproval.commandRules": "Reglas de comandos", + "migration.select.autoApproval.commandRulesDesc": "Interruptor principal y listas de comandos permitidos/denegados", + "migration.select.autoApproval.readPermission": "Permiso de lectura", + "migration.select.autoApproval.readPermissionDesc": + "Acceso de lectura de archivos dentro y fuera del espacio de trabajo", + "migration.select.autoApproval.writePermission": "Permiso de escritura", + "migration.select.autoApproval.writePermissionDesc": "Acceso de escritura y ediciรณn de archivos", + "migration.select.autoApproval.executePermission": "Permiso de ejecuciรณn", + "migration.select.autoApproval.executePermissionDesc": "Ejecuciรณn de comandos en terminal", + "migration.select.autoApproval.mcpPermission": "Permiso MCP", + "migration.select.autoApproval.mcpPermissionDesc": "Uso de herramientas MCP", + "migration.select.autoApproval.taskPermission": "Permiso de tareas", + "migration.select.autoApproval.taskPermissionDesc": "Cambio de modos y creaciรณn de subtareas", + "migration.select.language": "Idioma de la interfaz", + "migration.select.languageDesc": "Tu preferencia de idioma se aplicarรก a la nueva extensiรณn", + "migration.select.autocomplete": "Configuraciรณn de autocompletado", + "migration.select.autocompleteDesc": + "Preferencias de activaciรณn automรกtica, atajos de teclado y autocompletado del chat", + "migration.select.continue": "Continuar", + "migration.select.back": "Atrรกs", + "migration.progress.title": "Migrando tu configuraciรณnโ€ฆ", + "migration.progress.done": "Continuar", + "migration.complete.summary": "{{success}} de {{total}} elementos migrados con รฉxito.", + "migration.complete.cleanup": "Eliminar datos de la configuraciรณn heredada", + "migration.complete.cleanupDescription": + "Esto elimina la configuraciรณn antigua del almacenamiento de VS Code. No podrรกs volver a ejecutar esta migraciรณn.", + "migration.complete.done": "Hecho", + // legacy-migration end } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts index c1b5a7beadb..f1e2302edf5 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts @@ -1110,4 +1110,56 @@ export const dict = { "question.summary": "{{n}} sur {{total}} questions", "common.review": "Rรฉviser", + + // legacy-migration start + "settings.legacyMigration.link": "Migrer depuis l'ancienne version", + "settings.aboutKiloCode.legacyMigration.title": "Migration de l'ancienne version", + "settings.aboutKiloCode.legacyMigration.description": + "Migrer les paramรจtres d'une prรฉcรฉdente installation de Kilo Code, y compris les clรฉs d'API des fournisseurs et le modรจle par dรฉfaut.", + "migration.welcome.title": "Bienvenue dans le nouveau Kilo Code", + "migration.welcome.detected": "Nous avons dรฉtectรฉ des paramรจtres d'une prรฉcรฉdente installation de Kilo Code.", + "migration.welcome.sessionsInfo": + "Les sessions de discussion et l'historique ne peuvent pas รชtre migrรฉs โ€” la nouvelle version utilise une architecture diffรฉrente.", + "migration.welcome.canMigrate": "Les paramรจtres suivants peuvent รชtre migrรฉs vers la nouvelle version :", + "migration.welcome.start": "Dรฉmarrer la migration", + "migration.welcome.skip": "Ignorer la migration", + "migration.steps.title": "Migrer vos paramรจtres", + "migration.steps.subtitle": + "Nous avons trouvรฉ des paramรจtres de votre prรฉcรฉdente installation de Kilo Code. Choisissez ce que vous souhaitez transfรฉrer.", + "migration.select.providers": "Clรฉs d'API des fournisseurs", + "migration.select.mcpServers": "Serveurs MCP", + "migration.select.customModes": "Modes personnalisรฉs / Agents", + "migration.select.defaultModel": "Modรจle par dรฉfaut", + "migration.select.unsupported": "Non pris en charge dans la nouvelle version", + "migration.select.nothingToMigrate": "Rien ร  migrer n'a รฉtรฉ trouvรฉ dans les anciens paramรจtres.", + "migration.select.settings": "Paramรจtres", + "migration.select.autoApproval": "Approbation automatique", + "migration.select.autoApproval.commandRules": "Rรจgles de commande", + "migration.select.autoApproval.commandRulesDesc": "Bascule principale et listes de commandes autorisรฉes/refusรฉes", + "migration.select.autoApproval.readPermission": "Autorisation de lecture", + "migration.select.autoApproval.readPermissionDesc": + "Accรจs en lecture aux fichiers ร  l'intรฉrieur et ร  l'extรฉrieur de l'espace de travail", + "migration.select.autoApproval.writePermission": "Autorisation d'รฉcriture", + "migration.select.autoApproval.writePermissionDesc": "Accรจs en รฉcriture et modification de fichiers", + "migration.select.autoApproval.executePermission": "Autorisation d'exรฉcution", + "migration.select.autoApproval.executePermissionDesc": "Exรฉcution de commandes dans le terminal", + "migration.select.autoApproval.mcpPermission": "Autorisation MCP", + "migration.select.autoApproval.mcpPermissionDesc": "Utilisation d'outils MCP", + "migration.select.autoApproval.taskPermission": "Autorisation de tรขche", + "migration.select.autoApproval.taskPermissionDesc": "Changement de mode et crรฉation de sous-tรขches", + "migration.select.language": "Langue de l'interface", + "migration.select.languageDesc": "Votre prรฉfรฉrence de langue sera appliquรฉe ร  la nouvelle extension", + "migration.select.autocomplete": "Paramรจtres de saisie semi-automatique", + "migration.select.autocompleteDesc": + "Prรฉfรฉrences de dรฉclenchement automatique, de raccourcis clavier et de saisie semi-automatique du chat", + "migration.select.continue": "Continuer", + "migration.select.back": "Retour", + "migration.progress.title": "Migration de vos paramรจtresโ€ฆ", + "migration.progress.done": "Continuer", + "migration.complete.summary": "{{success}} รฉlรฉments sur {{total}} migrรฉs avec succรจs.", + "migration.complete.cleanup": "Supprimer les donnรฉes des anciens paramรจtres", + "migration.complete.cleanupDescription": + "Cela supprime les anciens paramรจtres du stockage de VS Code. Vous ne pourrez pas rรฉexรฉcuter cette migration.", + "migration.complete.done": "Terminรฉ", + // legacy-migration end } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts index a2ab83e3125..65fd78a17fe 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts @@ -1090,4 +1090,53 @@ export const dict = { "question.summary": "{{total}} ๅ•ไธญ {{n}} ๅ•็›ฎ", "common.review": "็ขบ่ช", + + // legacy-migration start + "settings.legacyMigration.link": "ใƒฌใ‚ฌใ‚ทใƒผใƒใƒผใ‚ธใƒงใƒณใ‹ใ‚‰ใฎ็งป่กŒ", + "settings.aboutKiloCode.legacyMigration.title": "ใƒฌใ‚ฌใ‚ทใƒผ็งป่กŒ", + "settings.aboutKiloCode.legacyMigration.description": + "ใƒ—ใƒญใƒใ‚คใƒ€ใƒผใฎAPIใ‚ญใƒผใ‚„ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใƒขใƒ‡ใƒซใชใฉใ€ไปฅๅ‰ใซใ‚คใƒณใ‚นใƒˆใƒผใƒซใ—ใŸKilo Codeใ‹ใ‚‰่จญๅฎšใ‚’็งป่กŒใ—ใพใ™ใ€‚", + "migration.welcome.title": "ๆ–ฐใ—ใ„Kilo Codeใธใ‚ˆใ†ใ“ใ", + "migration.welcome.detected": "ไปฅๅ‰ใซใ‚คใƒณใ‚นใƒˆใƒผใƒซใ•ใ‚ŒใŸKilo Codeใฎ่จญๅฎšใ‚’ๆคœๅ‡บใ—ใพใ—ใŸใ€‚", + "migration.welcome.sessionsInfo": + "ใƒใƒฃใƒƒใƒˆใ‚ปใƒƒใ‚ทใƒงใƒณใจๅฑฅๆญดใฏ็งป่กŒใงใใพใ›ใ‚“ โ€” ๆ–ฐใ—ใ„ใƒใƒผใ‚ธใƒงใƒณใงใฏ็•ฐใชใ‚‹ใ‚ขใƒผใ‚ญใƒ†ใ‚ฏใƒใƒฃใŒไฝฟ็”จใ•ใ‚Œใฆใ„ใพใ™ใ€‚", + "migration.welcome.canMigrate": "ไปฅไธ‹ใฎ่จญๅฎšใ‚’ๆ–ฐใ—ใ„ใƒใƒผใ‚ธใƒงใƒณใซ็งป่กŒใงใใพใ™๏ผš", + "migration.welcome.start": "็งป่กŒใ‚’้–‹ๅง‹", + "migration.welcome.skip": "็งป่กŒใ‚’ใ‚นใ‚ญใƒƒใƒ—", + "migration.steps.title": "่จญๅฎšใฎ็งป่กŒ", + "migration.steps.subtitle": "ไปฅๅ‰ใฎKilo Codeใ‚คใƒณใ‚นใƒˆใƒผใƒซใฎ่จญๅฎšใŒ่ฆ‹ใคใ‹ใ‚Šใพใ—ใŸใ€‚ๅผ•ใ็ถ™ใ้ …็›ฎใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„ใ€‚", + "migration.select.providers": "ใƒ—ใƒญใƒใ‚คใƒ€ใƒผใฎAPIใ‚ญใƒผ", + "migration.select.mcpServers": "MCPใ‚ตใƒผใƒใƒผ", + "migration.select.customModes": "ใ‚ซใ‚นใ‚ฟใƒ ใƒขใƒผใƒ‰ / ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆ", + "migration.select.defaultModel": "ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใƒขใƒ‡ใƒซ", + "migration.select.unsupported": "ๆ–ฐใ—ใ„ใƒใƒผใ‚ธใƒงใƒณใงใฏใ‚ตใƒใƒผใƒˆใ•ใ‚Œใฆใ„ใพใ›ใ‚“", + "migration.select.nothingToMigrate": "ใƒฌใ‚ฌใ‚ทใƒผ่จญๅฎšใซ็งป่กŒใ™ใ‚‹้ …็›ฎใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“ใงใ—ใŸใ€‚", + "migration.select.settings": "่จญๅฎš", + "migration.select.autoApproval": "่‡ชๅ‹•ๆ‰ฟ่ช", + "migration.select.autoApproval.commandRules": "ใ‚ณใƒžใƒณใƒ‰ใƒซใƒผใƒซ", + "migration.select.autoApproval.commandRulesDesc": "ใƒžใ‚นใ‚ฟใƒผใƒˆใ‚ฐใƒซใจ่จฑๅฏ/ๆ‹’ๅฆใ•ใ‚ŒใŸใ‚ณใƒžใƒณใƒ‰ใƒชใ‚นใƒˆ", + "migration.select.autoApproval.readPermission": "่ชญใฟๅ–ใ‚Šๆจฉ้™", + "migration.select.autoApproval.readPermissionDesc": "ใƒฏใƒผใ‚ฏใ‚นใƒšใƒผใ‚นๅ†…ๅค–ใฎใƒ•ใ‚กใ‚คใƒซ่ชญใฟๅ–ใ‚Šใ‚ขใ‚ฏใ‚ปใ‚น", + "migration.select.autoApproval.writePermission": "ๆ›ธใ่พผใฟๆจฉ้™", + "migration.select.autoApproval.writePermissionDesc": "ใƒ•ใ‚กใ‚คใƒซใฎๆ›ธใ่พผใฟใจ็ทจ้›†ใ‚ขใ‚ฏใ‚ปใ‚น", + "migration.select.autoApproval.executePermission": "ๅฎŸ่กŒๆจฉ้™", + "migration.select.autoApproval.executePermissionDesc": "ใ‚ฟใƒผใƒŸใƒŠใƒซใ‚ณใƒžใƒณใƒ‰ใฎๅฎŸ่กŒ", + "migration.select.autoApproval.mcpPermission": "MCPๆจฉ้™", + "migration.select.autoApproval.mcpPermissionDesc": "MCPใƒ„ใƒผใƒซใฎไฝฟ็”จ", + "migration.select.autoApproval.taskPermission": "ใ‚ฟใ‚นใ‚ฏๆจฉ้™", + "migration.select.autoApproval.taskPermissionDesc": "ใƒขใƒผใƒ‰ใฎๅˆ‡ใ‚Šๆ›ฟใˆใจใ‚ตใƒ–ใ‚ฟใ‚นใ‚ฏใฎไฝœๆˆ", + "migration.select.language": "UI่จ€่ชž", + "migration.select.languageDesc": "่จ€่ชž่จญๅฎšใฏๆ–ฐใ—ใ„ๆ‹กๅผตๆฉŸ่ƒฝใซ้ฉ็”จใ•ใ‚Œใพใ™", + "migration.select.autocomplete": "ใ‚ชใƒผใƒˆใ‚ณใƒณใƒ—ใƒชใƒผใƒˆ่จญๅฎš", + "migration.select.autocompleteDesc": "่‡ชๅ‹•ใƒˆใƒชใ‚ฌใƒผใ€ใ‚ญใƒผใƒใ‚คใƒณใƒ‰ใ€ใŠใ‚ˆใณใƒใƒฃใƒƒใƒˆใฎใ‚ชใƒผใƒˆใ‚ณใƒณใƒ—ใƒชใƒผใƒˆ่จญๅฎš", + "migration.select.continue": "็ถš่กŒ", + "migration.select.back": "ๆˆปใ‚‹", + "migration.progress.title": "่จญๅฎšใ‚’็งป่กŒใ—ใฆใ„ใพใ™โ€ฆ", + "migration.progress.done": "็ถš่กŒ", + "migration.complete.summary": "{{total}}ๅ€‹ไธญ{{success}}ๅ€‹ใฎ้ …็›ฎใŒๆญฃๅธธใซ็งป่กŒใ•ใ‚Œใพใ—ใŸใ€‚", + "migration.complete.cleanup": "ใƒฌใ‚ฌใ‚ทใƒผ่จญๅฎšใƒ‡ใƒผใ‚ฟใ‚’ๅ‰Š้™คใ™ใ‚‹", + "migration.complete.cleanupDescription": + "VS Codeใฎใ‚นใƒˆใƒฌใƒผใ‚ธใ‹ใ‚‰ๅคใ„่จญๅฎšใ‚’ๅ‰Š้™คใ—ใพใ™ใ€‚ใ“ใฎ็งป่กŒใ‚’ๅ†ๅบฆๅฎŸ่กŒใ™ใ‚‹ใ“ใจใฏใงใใชใใชใ‚Šใพใ™ใ€‚", + "migration.complete.done": "ๅฎŒไบ†", + // legacy-migration end } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts index 8bb29cab3a7..4efbdb4a0af 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts @@ -1090,4 +1090,53 @@ export const dict = { "question.summary": "{{total}}๊ฐœ ์งˆ๋ฌธ ์ค‘ {{n}}๋ฒˆ์งธ", "common.review": "๊ฒ€ํ† ", + + // legacy-migration start + "settings.legacyMigration.link": "๋ ˆ๊ฑฐ์‹œ ๋ฒ„์ „์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜", + "settings.aboutKiloCode.legacyMigration.title": "๋ ˆ๊ฑฐ์‹œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜", + "settings.aboutKiloCode.legacyMigration.description": + "๊ณต๊ธ‰์ž API ํ‚ค ๋ฐ ๊ธฐ๋ณธ ๋ชจ๋ธ์„ ํฌํ•จํ•˜์—ฌ ์ด์ „ Kilo Code ์„ค์น˜์—์„œ ์„ค์ •์„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.", + "migration.welcome.title": "์ƒˆ๋กœ์šด Kilo Code์— ์˜ค์‹  ๊ฒƒ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค", + "migration.welcome.detected": "์ด์ „ Kilo Code ์„ค์น˜์˜ ์„ค์ •์ด ๊ฐ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.", + "migration.welcome.sessionsInfo": + "์ฑ„ํŒ… ์„ธ์…˜ ๋ฐ ๊ธฐ๋ก์€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค โ€” ์ƒˆ ๋ฒ„์ „์€ ๋‹ค๋ฅธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.", + "migration.welcome.canMigrate": "๋‹ค์Œ ์„ค์ •์€ ์ƒˆ ๋ฒ„์ „์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:", + "migration.welcome.start": "๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹œ์ž‘", + "migration.welcome.skip": "๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฑด๋„ˆ๋›ฐ๊ธฐ", + "migration.steps.title": "์„ค์ • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜", + "migration.steps.subtitle": "์ด์ „ Kilo Code ์„ค์น˜์—์„œ ์„ค์ •์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ฌ ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜์„ธ์š”.", + "migration.select.providers": "๊ณต๊ธ‰์ž API ํ‚ค", + "migration.select.mcpServers": "MCP ์„œ๋ฒ„", + "migration.select.customModes": "์‚ฌ์šฉ์ž ์ง€์ • ๋ชจ๋“œ / ์—์ด์ „ํŠธ", + "migration.select.defaultModel": "๊ธฐ๋ณธ ๋ชจ๋ธ", + "migration.select.unsupported": "์ƒˆ ๋ฒ„์ „์—์„œ๋Š” ์ง€์›๋˜์ง€ ์•Š์Œ", + "migration.select.nothingToMigrate": "๋ ˆ๊ฑฐ์‹œ ์„ค์ •์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ํ•ญ๋ชฉ์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.", + "migration.select.settings": "์„ค์ •", + "migration.select.autoApproval": "์ž๋™ ์Šน์ธ", + "migration.select.autoApproval.commandRules": "๋ช…๋ น ๊ทœ์น™", + "migration.select.autoApproval.commandRulesDesc": "๋งˆ์Šคํ„ฐ ํ† ๊ธ€ ๋ฐ ํ—ˆ์šฉ/๊ฑฐ๋ถ€๋œ ๋ช…๋ น ๋ชฉ๋ก", + "migration.select.autoApproval.readPermission": "์ฝ๊ธฐ ๊ถŒํ•œ", + "migration.select.autoApproval.readPermissionDesc": "์ž‘์—… ๊ณต๊ฐ„ ๋‚ด๋ถ€ ๋ฐ ์™ธ๋ถ€์˜ ํŒŒ์ผ ์ฝ๊ธฐ ์•ก์„ธ์Šค", + "migration.select.autoApproval.writePermission": "์“ฐ๊ธฐ ๊ถŒํ•œ", + "migration.select.autoApproval.writePermissionDesc": "ํŒŒ์ผ ์“ฐ๊ธฐ ๋ฐ ํŽธ์ง‘ ์•ก์„ธ์Šค", + "migration.select.autoApproval.executePermission": "์‹คํ–‰ ๊ถŒํ•œ", + "migration.select.autoApproval.executePermissionDesc": "ํ„ฐ๋ฏธ๋„ ๋ช…๋ น ์‹คํ–‰", + "migration.select.autoApproval.mcpPermission": "MCP ๊ถŒํ•œ", + "migration.select.autoApproval.mcpPermissionDesc": "MCP ๋„๊ตฌ ์‚ฌ์šฉ", + "migration.select.autoApproval.taskPermission": "์ž‘์—… ๊ถŒํ•œ", + "migration.select.autoApproval.taskPermissionDesc": "๋ชจ๋“œ ์ „ํ™˜ ๋ฐ ํ•˜์œ„ ์ž‘์—… ์ƒ์„ฑ", + "migration.select.language": "UI ์–ธ์–ด", + "migration.select.languageDesc": "์–ธ์–ด ๊ธฐ๋ณธ ์„ค์ •์ด ์ƒˆ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค", + "migration.select.autocomplete": "์ž๋™ ์™„์„ฑ ์„ค์ •", + "migration.select.autocompleteDesc": "์ž๋™ ํŠธ๋ฆฌ๊ฑฐ, ํ‚ค ๋ฐ”์ธ๋”ฉ ๋ฐ ์ฑ„ํŒ… ์ž๋™ ์™„์„ฑ ๊ธฐ๋ณธ ์„ค์ •", + "migration.select.continue": "๊ณ„์†", + "migration.select.back": "๋’ค๋กœ", + "migration.progress.title": "์„ค์ •์„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ์ค‘โ€ฆ", + "migration.progress.done": "๊ณ„์†", + "migration.complete.summary": "{{total}}๊ฐœ ์ค‘ {{success}}๊ฐœ ํ•ญ๋ชฉ์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.", + "migration.complete.cleanup": "๋ ˆ๊ฑฐ์‹œ ์„ค์ • ๋ฐ์ดํ„ฐ ์ œ๊ฑฐ", + "migration.complete.cleanupDescription": + "์ด ์ž‘์—…์€ VS Code ์ €์žฅ์†Œ์—์„œ ์ด์ „ ์„ค์ •์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๋‹ค์‹œ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.", + "migration.complete.done": "์™„๋ฃŒ", + // legacy-migration end } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/no.ts b/packages/kilo-vscode/webview-ui/src/i18n/no.ts index 2c5dec88735..36b66707e22 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/no.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/no.ts @@ -1094,4 +1094,54 @@ export const dict = { "question.summary": "{{n}} av {{total}} spรธrsmรฅl", "common.review": "Gjennomgรฅ", + + // legacy-migration start + "settings.legacyMigration.link": "Migrer fra eldre versjon", + "settings.aboutKiloCode.legacyMigration.title": "Migrering fra eldre versjon", + "settings.aboutKiloCode.legacyMigration.description": + "Migrer innstillinger fra en tidligere installasjon av Kilo Code, inkludert API-nรธkler for leverandรธrer og standardmodell.", + "migration.welcome.title": "Velkommen til nye Kilo Code", + "migration.welcome.detected": "Vi oppdaget innstillinger fra en tidligere installasjon av Kilo Code.", + "migration.welcome.sessionsInfo": + "Chatรธkter og historikk kan ikke migreres โ€” den nye versjonen bruker en annen arkitektur.", + "migration.welcome.canMigrate": "Fรธlgende innstillinger kan migreres til den nye versjonen:", + "migration.welcome.start": "Start migrering", + "migration.welcome.skip": "Hopp over migrering", + "migration.steps.title": "Migrer innstillingene dine", + "migration.steps.subtitle": + "Vi fant innstillinger fra din tidligere Kilo Code-installasjon. Velg hva du vil ta med over.", + "migration.select.providers": "API-nรธkler for leverandรธrer", + "migration.select.mcpServers": "MCP-servere", + "migration.select.customModes": "Egendefinerte moduser / Agenter", + "migration.select.defaultModel": "Standardmodell", + "migration.select.unsupported": "Stรธttes ikke i ny versjon", + "migration.select.nothingToMigrate": "Ingenting รฅ migrere ble funnet i de eldre innstillingene.", + "migration.select.settings": "Innstillinger", + "migration.select.autoApproval": "Automatisk godkjenning", + "migration.select.autoApproval.commandRules": "Kommandoregler", + "migration.select.autoApproval.commandRulesDesc": "Hovedbryter og lister for tillatte/avviste kommandoer", + "migration.select.autoApproval.readPermission": "Lesetillatelse", + "migration.select.autoApproval.readPermissionDesc": "Lesetilgang for filer i og utenfor arbeidsomrรฅdet", + "migration.select.autoApproval.writePermission": "Skrivetillatelse", + "migration.select.autoApproval.writePermissionDesc": "Skrive- og redigeringstilgang for filer", + "migration.select.autoApproval.executePermission": "Utfรธrelsestillatelse", + "migration.select.autoApproval.executePermissionDesc": "Kjรธring av terminalkommandoer", + "migration.select.autoApproval.mcpPermission": "MCP-tillatelse", + "migration.select.autoApproval.mcpPermissionDesc": "Bruk av MCP-verktรธy", + "migration.select.autoApproval.taskPermission": "Oppgavetillatelse", + "migration.select.autoApproval.taskPermissionDesc": "Modusbytte og opprettelse av underoppgaver", + "migration.select.language": "UI-sprรฅk", + "migration.select.languageDesc": "Din sprรฅkpreferanse vil bli brukt i den nye utvidelsen", + "migration.select.autocomplete": "Innstillinger for autofullfรธring", + "migration.select.autocompleteDesc": "Preferanser for autoutlรธsing, hurtigtaster og autofullfรธring i chat", + "migration.select.continue": "Fortsett", + "migration.select.back": "Tilbake", + "migration.progress.title": "Migrerer innstillingene dineโ€ฆ", + "migration.progress.done": "Fortsett", + "migration.complete.summary": "{{success}} av {{total}} elementer ble migrert.", + "migration.complete.cleanup": "Fjern eldre innstillingsdata", + "migration.complete.cleanupDescription": + "Dette fjerner de gamle innstillingene fra VS Code-lagringen. Du vil ikke kunne kjรธre denne migreringen pรฅ nytt.", + "migration.complete.done": "Ferdig", + // legacy-migration end } satisfies Partial> diff --git a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts index c086160e201..668aa776529 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts @@ -1096,4 +1096,56 @@ export const dict = { "question.summary": "{{n}} z {{total}} pytaล„", "common.review": "Przejrzyj", + + // legacy-migration start + "settings.legacyMigration.link": "Migracja ze starszej wersji", + "settings.aboutKiloCode.legacyMigration.title": "Migracja starszej wersji", + "settings.aboutKiloCode.legacyMigration.description": + "Migruj ustawienia z poprzedniej instalacji Kilo Code, w tym klucze API dostawcรณw i domyล›lny model.", + "migration.welcome.title": "Witamy w nowym Kilo Code", + "migration.welcome.detected": "Wykryliล›my ustawienia z poprzedniej instalacji Kilo Code.", + "migration.welcome.sessionsInfo": + "Sesje czatu i historia nie mogฤ… zostaฤ‡ zmigrowane โ€” nowa wersja wykorzystuje innฤ… architekturฤ™.", + "migration.welcome.canMigrate": "Nastฤ™pujฤ…ce ustawienia mogฤ… zostaฤ‡ zmigrowane do nowej wersji:", + "migration.welcome.start": "Rozpocznij migracjฤ™", + "migration.welcome.skip": "Pomiล„ migracjฤ™", + "migration.steps.title": "Migruj swoje ustawienia", + "migration.steps.subtitle": + "Znaleลบliล›my ustawienia z poprzedniej instalacji Kilo Code. Wybierz, co chcesz przenieล›ฤ‡.", + "migration.select.providers": "Klucze API dostawcรณw", + "migration.select.mcpServers": "Serwery MCP", + "migration.select.customModes": "Niestandardowe tryby / Agenci", + "migration.select.defaultModel": "Domyล›lny model", + "migration.select.unsupported": "Nieobsล‚ugiwane w nowej wersji", + "migration.select.nothingToMigrate": "W starszych ustawieniach nie znaleziono niczego do zmigrowania.", + "migration.select.settings": "Ustawienia", + "migration.select.autoApproval": "Automatyczne zatwierdzanie", + "migration.select.autoApproval.commandRules": "Reguล‚y poleceล„", + "migration.select.autoApproval.commandRulesDesc": "Gล‚รณwny przeล‚ฤ…cznik oraz listy dozwolonych/zabronionych poleceล„", + "migration.select.autoApproval.readPermission": "Uprawnienia odczytu", + "migration.select.autoApproval.readPermissionDesc": + "Dostฤ™p do odczytu plikรณw wewnฤ…trz i na zewnฤ…trz obszaru roboczego", + "migration.select.autoApproval.writePermission": "Uprawnienia zapisu", + "migration.select.autoApproval.writePermissionDesc": "Dostฤ™p do zapisu i edycji plikรณw", + "migration.select.autoApproval.executePermission": "Uprawnienia wykonywania", + "migration.select.autoApproval.executePermissionDesc": "Wykonywanie poleceล„ terminala", + "migration.select.autoApproval.mcpPermission": "Uprawnienia MCP", + "migration.select.autoApproval.mcpPermissionDesc": "Korzystanie z narzฤ™dzi MCP", + "migration.select.autoApproval.taskPermission": "Uprawnienia zadaล„", + "migration.select.autoApproval.taskPermissionDesc": "Przeล‚ฤ…czanie trybรณw i tworzenie podzadaล„", + "migration.select.language": "Jฤ™zyk interfejsu", + "migration.select.languageDesc": "Twoje preferencje jฤ™zykowe zostanฤ… zastosowane w nowym rozszerzeniu", + "migration.select.autocomplete": "Ustawienia autouzupeล‚niania", + "migration.select.autocompleteDesc": + "Preferencje automatycznego wyzwalania, skrรณtรณw klawiszowych i autouzupeล‚niania na czacie", + "migration.select.continue": "Kontynuuj", + "migration.select.back": "Wstecz", + "migration.progress.title": "Migrowanie Twoich ustawieล„โ€ฆ", + "migration.progress.done": "Kontynuuj", + "migration.complete.summary": "Pomyล›lnie zmigrowano {{success}} z {{total}} elementรณw.", + "migration.complete.cleanup": "Usuล„ dane starszych ustawieล„", + "migration.complete.cleanupDescription": + "Spowoduje to usuniฤ™cie starych ustawieล„ z magazynu VS Code. Nie bฤ™dzie moลผna ponownie uruchomiฤ‡ tej migracji.", + "migration.complete.done": "Gotowe", + // legacy-migration end } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts index 3a773b47397..c37e1109069 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts @@ -1097,4 +1097,55 @@ export const dict = { "question.summary": "{{n}} ะธะท {{total}} ะฒะพะฟั€ะพัะพะฒ", "common.review": "ะŸั€ะพัะผะพั‚ั€", + + // legacy-migration start + "settings.legacyMigration.link": "ะœะธะณั€ะฐั†ะธั ั ัƒัั‚ะฐั€ะตะฒัˆะตะน ะฒะตั€ัะธะธ", + "settings.aboutKiloCode.legacyMigration.title": "ะœะธะณั€ะฐั†ะธั ั ัƒัั‚ะฐั€ะตะฒัˆะตะน ะฒะตั€ัะธะธ", + "settings.aboutKiloCode.legacyMigration.description": + "ะŸะตั€ะตะฝะพั ะฝะฐัั‚ั€ะพะตะบ ะธะท ะฟั€ะตะดั‹ะดัƒั‰ะตะน ัƒัั‚ะฐะฝะพะฒะบะธ Kilo Code, ะฒะบะปัŽั‡ะฐั API-ะบะปัŽั‡ะธ ะฟั€ะพะฒะฐะนะดะตั€ะพะฒ ะธ ะผะพะดะตะปัŒ ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ.", + "migration.welcome.title": "ะ”ะพะฑั€ะพ ะฟะพะถะฐะปะพะฒะฐั‚ัŒ ะฒ ะฝะพะฒั‹ะน Kilo Code", + "migration.welcome.detected": "ะœั‹ ะพะฑะฝะฐั€ัƒะถะธะปะธ ะฝะฐัั‚ั€ะพะนะบะธ ะพั‚ ะฟั€ะตะดั‹ะดัƒั‰ะตะน ัƒัั‚ะฐะฝะพะฒะบะธ Kilo Code.", + "migration.welcome.sessionsInfo": + "ะกะตััะธะธ ั‡ะฐั‚ะฐ ะธ ะธัั‚ะพั€ะธั ะฝะต ะผะพะณัƒั‚ ะฑั‹ั‚ัŒ ะฟะตั€ะตะฝะตัะตะฝั‹ โ€” ะฝะพะฒะฐั ะฒะตั€ัะธั ะธัะฟะพะปัŒะทัƒะตั‚ ะดั€ัƒะณัƒัŽ ะฐั€ั…ะธั‚ะตะบั‚ัƒั€ัƒ.", + "migration.welcome.canMigrate": "ะ’ ะฝะพะฒัƒัŽ ะฒะตั€ัะธัŽ ะผะพะถะฝะพ ะฟะตั€ะตะฝะตัั‚ะธ ัะปะตะดัƒัŽั‰ะธะต ะฝะฐัั‚ั€ะพะนะบะธ:", + "migration.welcome.start": "ะะฐั‡ะฐั‚ัŒ ะผะธะณั€ะฐั†ะธัŽ", + "migration.welcome.skip": "ะŸั€ะพะฟัƒัั‚ะธั‚ัŒ ะผะธะณั€ะฐั†ะธัŽ", + "migration.steps.title": "ะŸะตั€ะตะฝะพั ะฒะฐัˆะธั… ะฝะฐัั‚ั€ะพะตะบ", + "migration.steps.subtitle": + "ะœั‹ ะฝะฐัˆะปะธ ะฝะฐัั‚ั€ะพะนะบะธ ะพั‚ ะฒะฐัˆะตะน ะฟั€ะตะดั‹ะดัƒั‰ะตะน ัƒัั‚ะฐะฝะพะฒะบะธ Kilo Code. ะ’ั‹ะฑะตั€ะธั‚ะต, ั‡ั‚ะพ ะฝัƒะถะฝะพ ะฟะตั€ะตะฝะตัั‚ะธ.", + "migration.select.providers": "API-ะบะปัŽั‡ะธ ะฟั€ะพะฒะฐะนะดะตั€ะพะฒ", + "migration.select.mcpServers": "ะกะตั€ะฒะตั€ั‹ MCP", + "migration.select.customModes": "ะŸะพะปัŒะทะพะฒะฐั‚ะตะปัŒัะบะธะต ั€ะตะถะธะผั‹ / ะะณะตะฝั‚ั‹", + "migration.select.defaultModel": "ะœะพะดะตะปัŒ ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ", + "migration.select.unsupported": "ะะต ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ัั ะฒ ะฝะพะฒะพะน ะฒะตั€ัะธะธ", + "migration.select.nothingToMigrate": "ะ’ ัั‚ะฐั€ั‹ั… ะฝะฐัั‚ั€ะพะนะบะฐั… ะฝะต ะฝะฐะนะดะตะฝะพ ะดะฐะฝะฝั‹ั… ะดะปั ะฟะตั€ะตะฝะพัะฐ.", + "migration.select.settings": "ะะฐัั‚ั€ะพะนะบะธ", + "migration.select.autoApproval": "ะะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะพะต ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธะต", + "migration.select.autoApproval.commandRules": "ะŸั€ะฐะฒะธะปะฐ ะบะพะผะฐะฝะด", + "migration.select.autoApproval.commandRulesDesc": "ะ“ะปะฐะฒะฝั‹ะน ะฟะตั€ะตะบะปัŽั‡ะฐั‚ะตะปัŒ ะธ ัะฟะธัะบะธ ั€ะฐะทั€ะตัˆะตะฝะฝั‹ั…/ะทะฐะฟั€ะตั‰ะตะฝะฝั‹ั… ะบะพะผะฐะฝะด", + "migration.select.autoApproval.readPermission": "ะ ะฐะทั€ะตัˆะตะฝะธะต ะฝะฐ ั‡ั‚ะตะฝะธะต", + "migration.select.autoApproval.readPermissionDesc": "ะ”ะพัั‚ัƒะฟ ะบ ั‡ั‚ะตะฝะธัŽ ั„ะฐะนะปะพะฒ ะฒะฝัƒั‚ั€ะธ ะธ ะฒะฝะต ั€ะฐะฑะพั‡ะตะน ะพะฑะปะฐัั‚ะธ", + "migration.select.autoApproval.writePermission": "ะ ะฐะทั€ะตัˆะตะฝะธะต ะฝะฐ ะทะฐะฟะธััŒ", + "migration.select.autoApproval.writePermissionDesc": "ะ”ะพัั‚ัƒะฟ ะบ ะทะฐะฟะธัะธ ะธ ั€ะตะดะฐะบั‚ะธั€ะพะฒะฐะฝะธัŽ ั„ะฐะนะปะพะฒ", + "migration.select.autoApproval.executePermission": "ะ ะฐะทั€ะตัˆะตะฝะธะต ะฝะฐ ะฒั‹ะฟะพะปะฝะตะฝะธะต", + "migration.select.autoApproval.executePermissionDesc": "ะ’ั‹ะฟะพะปะฝะตะฝะธะต ะบะพะผะฐะฝะด ะฒ ั‚ะตั€ะผะธะฝะฐะปะต", + "migration.select.autoApproval.mcpPermission": "ะ ะฐะทั€ะตัˆะตะฝะธะต MCP", + "migration.select.autoApproval.mcpPermissionDesc": "ะ˜ัะฟะพะปัŒะทะพะฒะฐะฝะธะต ะธะฝัั‚ั€ัƒะผะตะฝั‚ะพะฒ MCP", + "migration.select.autoApproval.taskPermission": "ะ ะฐะทั€ะตัˆะตะฝะธะต ะฝะฐ ะทะฐะดะฐั‡ะธ", + "migration.select.autoApproval.taskPermissionDesc": "ะŸะตั€ะตะบะปัŽั‡ะตะฝะธะต ั€ะตะถะธะผะพะฒ ะธ ัะพะทะดะฐะฝะธะต ะฟะพะดะทะฐะดะฐั‡", + "migration.select.language": "ะฏะทั‹ะบ ะธะฝั‚ะตั€ั„ะตะนัะฐ", + "migration.select.languageDesc": "ะ’ะฐัˆะธ ัะทั‹ะบะพะฒั‹ะต ะฝะฐัั‚ั€ะพะนะบะธ ะฑัƒะดัƒั‚ ะฟั€ะธะผะตะฝะตะฝั‹ ะบ ะฝะพะฒะพะผัƒ ั€ะฐััˆะธั€ะตะฝะธัŽ", + "migration.select.autocomplete": "ะะฐัั‚ั€ะพะนะบะธ ะฐะฒั‚ะพะดะพะฟะพะปะฝะตะฝะธั", + "migration.select.autocompleteDesc": + "ะŸะฐั€ะฐะผะตั‚ั€ั‹ ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะพะณะพ ัั€ะฐะฑะฐั‚ั‹ะฒะฐะฝะธั, ะณะพั€ัั‡ะธะต ะบะปะฐะฒะธัˆะธ ะธ ะฐะฒั‚ะพะดะพะฟะพะปะฝะตะฝะธะต ะฒ ั‡ะฐั‚ะต", + "migration.select.continue": "ะŸั€ะพะดะพะปะถะธั‚ัŒ", + "migration.select.back": "ะะฐะทะฐะด", + "migration.progress.title": "ะŸะตั€ะตะฝะพั ะฒะฐัˆะธั… ะฝะฐัั‚ั€ะพะตะบโ€ฆ", + "migration.progress.done": "ะŸั€ะพะดะพะปะถะธั‚ัŒ", + "migration.complete.summary": "ะฃัะฟะตัˆะฝะพ ะฟะตั€ะตะฝะตัะตะฝะพ: {{success}} ะธะท {{total}} ัะปะตะผะตะฝั‚ะพะฒ.", + "migration.complete.cleanup": "ะฃะดะฐะปะธั‚ัŒ ะดะฐะฝะฝั‹ะต ัั‚ะฐั€ั‹ั… ะฝะฐัั‚ั€ะพะตะบ", + "migration.complete.cleanupDescription": + "ะญั‚ะพ ัƒะดะฐะปะธั‚ ัั‚ะฐั€ั‹ะต ะฝะฐัั‚ั€ะพะนะบะธ ะธะท ั…ั€ะฐะฝะธะปะธั‰ะฐ VS Code. ะ’ั‹ ะฝะต ัะผะพะถะตั‚ะต ะทะฐะฟัƒัั‚ะธั‚ัŒ ัั‚ัƒ ะผะธะณั€ะฐั†ะธัŽ ะฟะพะฒั‚ะพั€ะฝะพ.", + "migration.complete.done": "ะ“ะพั‚ะพะฒะพ", + // legacy-migration end } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/th.ts b/packages/kilo-vscode/webview-ui/src/i18n/th.ts index 32c2dd28e1b..551ea0ba907 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/th.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/th.ts @@ -1082,4 +1082,53 @@ export const dict = { "question.summary": "{{n}} เธˆเธฒเธ {{total}} เธ„เธณเธ–เธฒเธก", "common.review": "เธ•เธฃเธงเธˆเธชเธญเธš", + + // legacy-migration start + "settings.legacyMigration.link": "เธขเน‰เธฒเธขเธ‚เน‰เธญเธกเธนเธฅเธˆเธฒเธเน€เธงเธญเธฃเนŒเธŠเธฑเธ™เธ”เธฑเน‰เธ‡เน€เธ”เธดเธก", + "settings.aboutKiloCode.legacyMigration.title": "เธเธฒเธฃเธขเน‰เธฒเธขเธ‚เน‰เธญเธกเธนเธฅเธˆเธฒเธเน€เธงเธญเธฃเนŒเธŠเธฑเธ™เธ”เธฑเน‰เธ‡เน€เธ”เธดเธก", + "settings.aboutKiloCode.legacyMigration.description": + "เธขเน‰เธฒเธขเธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธˆเธฒเธเธเธฒเธฃเธ•เธดเธ”เธ•เธฑเน‰เธ‡ Kilo Code เธเนˆเธญเธ™เธซเธ™เน‰เธฒเธ™เธตเน‰ เธฃเธงเธกเธ–เธถเธ‡เธ„เธตเธขเนŒ API เธ‚เธญเธ‡เธœเธนเน‰เนƒเธซเน‰เธšเธฃเธดเธเธฒเธฃเนเธฅเธฐเน‚เธกเน€เธ”เธฅเน€เธฃเธดเนˆเธกเธ•เน‰เธ™", + "migration.welcome.title": "เธขเธดเธ™เธ”เธตเธ•เน‰เธญเธ™เธฃเธฑเธšเธชเธนเนˆ Kilo Code เน‚เธ‰เธกเนƒเธซเธกเนˆ", + "migration.welcome.detected": "เน€เธฃเธฒเธ•เธฃเธงเธˆเธžเธšเธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธˆเธฒเธเธเธฒเธฃเธ•เธดเธ”เธ•เธฑเน‰เธ‡ Kilo Code เธเนˆเธญเธ™เธซเธ™เน‰เธฒเธ™เธตเน‰", + "migration.welcome.sessionsInfo": "เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เธขเน‰เธฒเธขเน€เธ‹เธชเธŠเธฑเธ™เธเธฒเธฃเนเธŠเธ—เนเธฅเธฐเธ›เธฃเธฐเธงเธฑเธ•เธดเน„เธ”เน‰ โ€” เน€เธงเธญเธฃเนŒเธŠเธฑเธ™เนƒเธซเธกเนˆเนƒเธŠเน‰เธชเธ–เธฒเธ›เธฑเธ•เธขเธเธฃเธฃเธกเธ—เธตเนˆเนเธ•เธเธ•เนˆเธฒเธ‡เธเธฑเธ™", + "migration.welcome.canMigrate": "เธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธ•เนˆเธญเน„เธ›เธ™เธตเน‰เธชเธฒเธกเธฒเธฃเธ–เธขเน‰เธฒเธขเน„เธ›เธขเธฑเธ‡เน€เธงเธญเธฃเนŒเธŠเธฑเธ™เนƒเธซเธกเนˆเน„เธ”เน‰:", + "migration.welcome.start": "เน€เธฃเธดเนˆเธกเธเธฒเธฃเธขเน‰เธฒเธขเธ‚เน‰เธญเธกเธนเธฅ", + "migration.welcome.skip": "เธ‚เน‰เธฒเธกเธเธฒเธฃเธขเน‰เธฒเธขเธ‚เน‰เธญเธกเธนเธฅ", + "migration.steps.title": "เธขเน‰เธฒเธขเธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธ‚เธญเธ‡เธ„เธธเธ“", + "migration.steps.subtitle": "เน€เธฃเธฒเธžเธšเธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธˆเธฒเธเธเธฒเธฃเธ•เธดเธ”เธ•เธฑเน‰เธ‡ Kilo Code เธเนˆเธญเธ™เธซเธ™เน‰เธฒเธ™เธตเน‰เธ‚เธญเธ‡เธ„เธธเธ“ เน€เธฅเธทเธญเธเธชเธดเนˆเธ‡เธ—เธตเนˆเธˆเธฐเธ™เธณเน€เธ‚เน‰เธฒเธกเธฒเธ”เน‰เธงเธข", + "migration.select.providers": "เธ„เธตเธขเนŒ API เธ‚เธญเธ‡เธœเธนเน‰เนƒเธซเน‰เธšเธฃเธดเธเธฒเธฃ", + "migration.select.mcpServers": "เน€เธ‹เธดเธฃเนŒเธŸเน€เธงเธญเธฃเนŒ MCP", + "migration.select.customModes": "เน‚เธซเธกเธ”เธเธณเธซเธ™เธ”เน€เธญเธ‡ / Agents", + "migration.select.defaultModel": "เน‚เธกเน€เธ”เธฅเน€เธฃเธดเนˆเธกเธ•เน‰เธ™", + "migration.select.unsupported": "เน„เธกเนˆเธฃเธญเธ‡เธฃเธฑเธšเนƒเธ™เน€เธงเธญเธฃเนŒเธŠเธฑเธ™เนƒเธซเธกเนˆ", + "migration.select.nothingToMigrate": "เน„เธกเนˆเธžเธšเธชเธดเนˆเธ‡เธ—เธตเนˆเธˆเธฐเธขเน‰เธฒเธขเนƒเธ™เธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธ”เธฑเน‰เธ‡เน€เธ”เธดเธก", + "migration.select.settings": "เธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒ", + "migration.select.autoApproval": "เธเธฒเธฃเธญเธ™เธธเธกเธฑเธ•เธดเธญเธฑเธ•เน‚เธ™เธกเธฑเธ•เธด", + "migration.select.autoApproval.commandRules": "เธเธŽเธ„เธณเธชเธฑเนˆเธ‡", + "migration.select.autoApproval.commandRulesDesc": "เธชเธงเธดเธ•เธŠเนŒเธซเธฅเธฑเธเนเธฅเธฐเธฃเธฒเธขเธเธฒเธฃเธ„เธณเธชเธฑเนˆเธ‡เธ—เธตเนˆเธญเธ™เธธเธเธฒเธ•/เธ›เธเธดเน€เธชเธ˜", + "migration.select.autoApproval.readPermission": "เธชเธดเธ—เธ˜เธดเนŒเธเธฒเธฃเธญเนˆเธฒเธ™", + "migration.select.autoApproval.readPermissionDesc": "เธเธฒเธฃเน€เธ‚เน‰เธฒเธ–เธถเธ‡เธเธฒเธฃเธญเนˆเธฒเธ™เน„เธŸเธฅเนŒเธ เธฒเธขเนƒเธ™เนเธฅเธฐเธ เธฒเธขเธ™เธญเธเน€เธงเธดเธฃเนŒเธเธชเน€เธ›เธ‹", + "migration.select.autoApproval.writePermission": "เธชเธดเธ—เธ˜เธดเนŒเธเธฒเธฃเน€เธ‚เธตเธขเธ™", + "migration.select.autoApproval.writePermissionDesc": "เธเธฒเธฃเน€เธ‚เน‰เธฒเธ–เธถเธ‡เธเธฒเธฃเน€เธ‚เธตเธขเธ™เนเธฅเธฐเนเธเน‰เน„เธ‚เน„เธŸเธฅเนŒ", + "migration.select.autoApproval.executePermission": "เธชเธดเธ—เธ˜เธดเนŒเธเธฒเธฃเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃ", + "migration.select.autoApproval.executePermissionDesc": "เธเธฒเธฃเน€เธฃเธตเธขเธเนƒเธŠเน‰เธ‡เธฒเธ™เธ„เธณเธชเธฑเนˆเธ‡ Terminal", + "migration.select.autoApproval.mcpPermission": "เธชเธดเธ—เธ˜เธดเนŒ MCP", + "migration.select.autoApproval.mcpPermissionDesc": "เธเธฒเธฃเนƒเธŠเน‰เธ‡เธฒเธ™เน€เธ„เธฃเธทเนˆเธญเธ‡เธกเธทเธญ MCP", + "migration.select.autoApproval.taskPermission": "เธชเธดเธ—เธ˜เธดเนŒเธ‡เธฒเธ™", + "migration.select.autoApproval.taskPermissionDesc": "เธเธฒเธฃเธชเธฅเธฑเธšเน‚เธซเธกเธ”เนเธฅเธฐเธเธฒเธฃเธชเธฃเน‰เธฒเธ‡เธ‡เธฒเธ™เธขเนˆเธญเธข", + "migration.select.language": "เธ เธฒเธฉเธฒ UI", + "migration.select.languageDesc": "เธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธ เธฒเธฉเธฒเธ‚เธญเธ‡เธ„เธธเธ“เธˆเธฐเธ–เธนเธเธ™เธณเน„เธ›เนƒเธŠเน‰เธเธฑเธšเธชเนˆเธงเธ™เธ‚เธขเธฒเธขเนƒเธซเธกเนˆ", + "migration.select.autocomplete": "เธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเน€เธ•เธดเธกเธ‚เน‰เธญเธ„เธงเธฒเธกเธญเธฑเธ•เน‚เธ™เธกเธฑเธ•เธด", + "migration.select.autocompleteDesc": + "เธเธฒเธฃเน€เธฃเธตเธขเธเนƒเธŠเน‰เธญเธฑเธ•เน‚เธ™เธกเธฑเธ•เธด, เธเธฒเธฃเธœเธนเธเนเธ›เน‰เธ™เธžเธดเธกเธžเนŒ เนเธฅเธฐเธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธเธฒเธฃเน€เธ•เธดเธกเธ‚เน‰เธญเธ„เธงเธฒเธกเธญเธฑเธ•เน‚เธ™เธกเธฑเธ•เธดเนƒเธ™เธเธฒเธฃเนเธŠเธ—", + "migration.select.continue": "เธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธ•เนˆเธญ", + "migration.select.back": "เธขเน‰เธญเธ™เธเธฅเธฑเธš", + "migration.progress.title": "เธเธณเธฅเธฑเธ‡เธขเน‰เธฒเธขเธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธ‚เธญเธ‡เธ„เธธเธ“โ€ฆ", + "migration.progress.done": "เธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธ•เนˆเธญ", + "migration.complete.summary": "เธขเน‰เธฒเธขเธฃเธฒเธขเธเธฒเธฃเธชเธณเน€เธฃเน‡เธˆ {{success}} เธˆเธฒเธ {{total}} เธฃเธฒเธขเธเธฒเธฃ", + "migration.complete.cleanup": "เธฅเธšเธ‚เน‰เธญเธกเธนเธฅเธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธ”เธฑเน‰เธ‡เน€เธ”เธดเธก", + "migration.complete.cleanupDescription": + "เธเธฒเธฃเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธ™เธตเน‰เธˆเธฐเธฅเธšเธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเน€เธเนˆเธฒเธญเธญเธเธˆเธฒเธเธžเธทเน‰เธ™เธ—เธตเนˆเน€เธเน‡เธšเธ‚เน‰เธญเธกเธนเธฅเธ‚เธญเธ‡ VS Code เธ„เธธเธ“เธˆเธฐเน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เน€เธฃเธตเธขเธเนƒเธŠเน‰เธเธฒเธฃเธขเน‰เธฒเธขเธ‚เน‰เธญเธกเธนเธฅเธ™เธตเน‰เธ‹เน‰เธณเน„เธ”เน‰เธญเธตเธ", + "migration.complete.done": "เน€เธชเธฃเน‡เธˆเธชเธดเน‰เธ™", + // legacy-migration end } diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts index 2562c222ddc..2717d6f34f2 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts @@ -1083,4 +1083,51 @@ export const dict = { "question.summary": "็ฌฌ {{n}} / {{total}} ไธช้—ฎ้ข˜", "common.review": "ๅฎกๆŸฅ", + + // legacy-migration start + "settings.legacyMigration.link": "ไปŽๆ—ง็‰ˆๆœฌ่ฟ็งป", + "settings.aboutKiloCode.legacyMigration.title": "ๆ—ง็‰ˆๆœฌ่ฟ็งป", + "settings.aboutKiloCode.legacyMigration.description": + "ไปŽไน‹ๅ‰ๅฎ‰่ฃ…็š„ Kilo Code ่ฟ็งป่ฎพ็ฝฎ๏ผŒๅŒ…ๆ‹ฌๆไพ›ๅ•† API ๅฏ†้’ฅๅ’Œ้ป˜่ฎคๆจกๅž‹ใ€‚", + "migration.welcome.title": "ๆฌข่ฟŽไฝฟ็”จๅ…จๆ–ฐ Kilo Code", + "migration.welcome.detected": "ๆˆ‘ไปฌๆฃ€ๆต‹ๅˆฐไบ†ๆฅ่‡ชไน‹ๅ‰ๅฎ‰่ฃ…็š„ Kilo Code ็š„่ฎพ็ฝฎใ€‚", + "migration.welcome.sessionsInfo": "่Šๅคฉไผš่ฏๅ’Œๅކๅฒ่ฎฐๅฝ•ๆ— ๆณ•่ฟ็งป โ€” ๆ–ฐ็‰ˆๆœฌไฝฟ็”จไบ†ไธๅŒ็š„ๆžถๆž„ใ€‚", + "migration.welcome.canMigrate": "ไปฅไธ‹่ฎพ็ฝฎๅฏไปฅ่ฟ็งปๅˆฐๆ–ฐ็‰ˆๆœฌ๏ผš", + "migration.welcome.start": "ๅผ€ๅง‹่ฟ็งป", + "migration.welcome.skip": "่ทณ่ฟ‡่ฟ็งป", + "migration.steps.title": "่ฟ็งปๆ‚จ็š„่ฎพ็ฝฎ", + "migration.steps.subtitle": "ๆˆ‘ไปฌๅ‘็Žฐไบ†ๆ‚จไน‹ๅ‰ Kilo Code ๅฎ‰่ฃ…็š„่ฎพ็ฝฎใ€‚่ฏท้€‰ๆ‹ฉ่ฆๅผ•ๅ…ฅ็š„ๅ†…ๅฎนใ€‚", + "migration.select.providers": "ๆไพ›ๅ•† API ๅฏ†้’ฅ", + "migration.select.mcpServers": "MCP ๆœๅŠกๅ™จ", + "migration.select.customModes": "่‡ชๅฎšไน‰ๆจกๅผ / ๆ™บ่ƒฝไฝ“", + "migration.select.defaultModel": "้ป˜่ฎคๆจกๅž‹", + "migration.select.unsupported": "ๆ–ฐ็‰ˆๆœฌไธๆ”ฏๆŒ", + "migration.select.nothingToMigrate": "ๅœจๆ—ง็‰ˆ่ฎพ็ฝฎไธญๆœชๆ‰พๅˆฐ่ฆ่ฟ็งป็š„ๅ†…ๅฎนใ€‚", + "migration.select.settings": "่ฎพ็ฝฎ", + "migration.select.autoApproval": "่‡ชๅŠจๆ‰นๅ‡†", + "migration.select.autoApproval.commandRules": "ๅ‘ฝไปค่ง„ๅˆ™", + "migration.select.autoApproval.commandRulesDesc": "ไธปๅผ€ๅ…ณไปฅๅŠๅ…่ฎธ/ๆ‹’็ป็š„ๅ‘ฝไปคๅˆ—่กจ", + "migration.select.autoApproval.readPermission": "่ฏปๅ–ๆƒ้™", + "migration.select.autoApproval.readPermissionDesc": "ๅทฅไฝœๅŒบๅ†…ๅค–ๆ–‡ไปถ่ฏปๅ–่ฎฟ้—ฎๆƒ้™", + "migration.select.autoApproval.writePermission": "ๅ†™ๅ…ฅๆƒ้™", + "migration.select.autoApproval.writePermissionDesc": "ๆ–‡ไปถๅ†™ๅ…ฅๅ’Œ็ผ–่พ‘่ฎฟ้—ฎๆƒ้™", + "migration.select.autoApproval.executePermission": "ๆ‰ง่กŒๆƒ้™", + "migration.select.autoApproval.executePermissionDesc": "็ปˆ็ซฏๅ‘ฝไปคๆ‰ง่กŒ", + "migration.select.autoApproval.mcpPermission": "MCP ๆƒ้™", + "migration.select.autoApproval.mcpPermissionDesc": "MCP ๅทฅๅ…ทไฝฟ็”จ", + "migration.select.autoApproval.taskPermission": "ไปปๅŠกๆƒ้™", + "migration.select.autoApproval.taskPermissionDesc": "ๆจกๅผๅˆ‡ๆขๅ’ŒๅญไปปๅŠกๅˆ›ๅปบ", + "migration.select.language": "UI ่ฏญ่จ€", + "migration.select.languageDesc": "ๆ‚จ็š„่ฏญ่จ€ๅๅฅฝๅฐ†ๅบ”็”จไบŽๆ–ฐ็š„ๆ‰ฉๅฑ•", + "migration.select.autocomplete": "่‡ชๅŠจ่กฅๅ…จ่ฎพ็ฝฎ", + "migration.select.autocompleteDesc": "่‡ชๅŠจ่งฆๅ‘ใ€้”ฎ็ป‘ๅฎšๅ’Œ่Šๅคฉ่‡ชๅŠจ่กฅๅ…จๅๅฅฝ่ฎพ็ฝฎ", + "migration.select.continue": "็ปง็ปญ", + "migration.select.back": "่ฟ”ๅ›ž", + "migration.progress.title": "ๆญฃๅœจ่ฟ็งปๆ‚จ็š„่ฎพ็ฝฎโ€ฆ", + "migration.progress.done": "็ปง็ปญ", + "migration.complete.summary": "{{total}} ้กนไธญ็š„ {{success}} ้กนๅทฒๆˆๅŠŸ่ฟ็งปใ€‚", + "migration.complete.cleanup": "็งป้™คๆ—ง็‰ˆ่ฎพ็ฝฎๆ•ฐๆฎ", + "migration.complete.cleanupDescription": "่ฟ™ๅฐ†ไปŽ VS Code ๅญ˜ๅ‚จไธญ็งป้™คๆ—ง่ฎพ็ฝฎใ€‚ๆ‚จๅฐ†ๆ— ๆณ•ๅ†ๆฌก่ฟ่กŒๆญค่ฟ็งปใ€‚", + "migration.complete.done": "ๅฎŒๆˆ", + // legacy-migration end } satisfies Partial> diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts index 6f85476f733..249ed0ef1b1 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts @@ -1108,4 +1108,51 @@ export const dict = { "question.summary": "็ฌฌ {{n}} / {{total}} ๅ€‹ๅ•้กŒ", "common.review": "ๅฏฉๆŸฅ", + + // legacy-migration start + "settings.legacyMigration.link": "ๅพž่ˆŠ็‰ˆ่ฝ‰็งป", + "settings.aboutKiloCode.legacyMigration.title": "่ˆŠ็‰ˆ่ฝ‰็งป", + "settings.aboutKiloCode.legacyMigration.description": + "ๅพžๅ…ˆๅ‰ๅฎ‰่ฃ็š„ Kilo Code ่ฝ‰็งป่จญๅฎš๏ผŒๅŒ…ๅซไพ›ๆ‡‰ๅ•† API ้‡‘้‘ฐ่ˆ‡้ ่จญๆจกๅž‹ใ€‚", + "migration.welcome.title": "ๆญก่ฟŽไฝฟ็”จๅ…จๆ–ฐ็š„ Kilo Code", + "migration.welcome.detected": "ๆˆ‘ๅ€‘ๅตๆธฌๅˆฐๅ…ˆๅ‰ๅฎ‰่ฃ็š„ Kilo Code ่จญๅฎšใ€‚", + "migration.welcome.sessionsInfo": "่Šๅคฉๅฐ่ฉฑ่ˆ‡ๆญทๅฒ็ด€้Œ„็„กๆณ•่ฝ‰็งป โ€” ๆ–ฐ็‰ˆๆœฌไฝฟ็”จไบ†ไธๅŒ็š„ๆžถๆง‹ใ€‚", + "migration.welcome.canMigrate": "ไธ‹ๅˆ—่จญๅฎšๅฏไปฅ่ฝ‰็งป่‡ณๆ–ฐ็‰ˆๆœฌ๏ผš", + "migration.welcome.start": "้–‹ๅง‹่ฝ‰็งป", + "migration.welcome.skip": "็•ฅ้Ž่ฝ‰็งป", + "migration.steps.title": "่ฝ‰็งปๆ‚จ็š„่จญๅฎš", + "migration.steps.subtitle": "ๆˆ‘ๅ€‘ๆ‰พๅˆฐไบ†ๆ‚จๅ…ˆๅ‰ Kilo Code ๅฎ‰่ฃ็š„่จญๅฎšใ€‚่ซ‹้ธๆ“‡่ฆไฟ็•™็š„้ …็›ฎใ€‚", + "migration.select.providers": "ไพ›ๆ‡‰ๅ•† API ้‡‘้‘ฐ", + "migration.select.mcpServers": "MCP ไผบๆœๅ™จ", + "migration.select.customModes": "่‡ช่จ‚ๆจกๅผ / ไปฃ็†", + "migration.select.defaultModel": "้ ่จญๆจกๅž‹", + "migration.select.unsupported": "ๆ–ฐ็‰ˆๆœฌไธๆ”ฏๆด", + "migration.select.nothingToMigrate": "ๅœจ่ˆŠ็‰ˆ่จญๅฎšไธญๆ‰พไธๅˆฐๅฏ่ฝ‰็งป็š„้ …็›ฎใ€‚", + "migration.select.settings": "่จญๅฎš", + "migration.select.autoApproval": "่‡ชๅ‹•ๆ ธๅ‡†", + "migration.select.autoApproval.commandRules": "ๆŒ‡ไปค่ฆๅ‰‡", + "migration.select.autoApproval.commandRulesDesc": "ไธป่ฆ้–‹้—œ่ˆ‡ๅ…่จฑ/ๆ‹’็ต•็š„ๆŒ‡ไปคๆธ…ๅ–ฎ", + "migration.select.autoApproval.readPermission": "่ฎ€ๅ–ๆฌŠ้™", + "migration.select.autoApproval.readPermissionDesc": "ๅทฅไฝœๅ€ๅ…งๅค–็š„ๆช”ๆกˆ่ฎ€ๅ–ๅญ˜ๅ–ๆฌŠ", + "migration.select.autoApproval.writePermission": "ๅฏซๅ…ฅๆฌŠ้™", + "migration.select.autoApproval.writePermissionDesc": "ๆช”ๆกˆๅฏซๅ…ฅ่ˆ‡็ทจ่ผฏๅญ˜ๅ–ๆฌŠ", + "migration.select.autoApproval.executePermission": "ๅŸท่กŒๆฌŠ้™", + "migration.select.autoApproval.executePermissionDesc": "็ต‚็ซฏๆฉŸๆŒ‡ไปคๅŸท่กŒ", + "migration.select.autoApproval.mcpPermission": "MCP ๆฌŠ้™", + "migration.select.autoApproval.mcpPermissionDesc": "MCP ๅทฅๅ…ทไฝฟ็”จ", + "migration.select.autoApproval.taskPermission": "ไปปๅ‹™ๆฌŠ้™", + "migration.select.autoApproval.taskPermissionDesc": "ๆจกๅผๅˆ‡ๆ›่ˆ‡ๅญไปปๅ‹™ๅปบ็ซ‹", + "migration.select.language": "ไป‹้ข่ชž่จ€", + "migration.select.languageDesc": "ๆ‚จ็š„่ชž่จ€ๅๅฅฝๅฐ‡ๆœƒๅฅ—็”จ่‡ณๆ–ฐๆ“ดๅ……ๅŠŸ่ƒฝ", + "migration.select.autocomplete": "่‡ชๅ‹•ๅฎŒๆˆ่จญๅฎš", + "migration.select.autocompleteDesc": "่‡ชๅ‹•่งธ็™ผใ€ๆŒ‰้ต็ถๅฎš่ˆ‡่Šๅคฉ่‡ชๅ‹•ๅฎŒๆˆๅๅฅฝ่จญๅฎš", + "migration.select.continue": "็นผ็บŒ", + "migration.select.back": "่ฟ”ๅ›ž", + "migration.progress.title": "ๆญฃๅœจ่ฝ‰็งปๆ‚จ็š„่จญๅฎšโ€ฆ", + "migration.progress.done": "็นผ็บŒ", + "migration.complete.summary": "ๅทฒๆˆๅŠŸ่ฝ‰็งป {{total}} ๅ€‹้ …็›ฎไธญ็š„ {{success}} ๅ€‹ใ€‚", + "migration.complete.cleanup": "็งป้™ค่ˆŠ็‰ˆ่จญๅฎš่ณ‡ๆ–™", + "migration.complete.cleanupDescription": "้€™ๅฐ‡ๅพž VS Code ๅ„ฒๅญ˜็ฉบ้–“็งป้™ค่ˆŠ็š„่จญๅฎšใ€‚ๆ‚จๅฐ‡็„กๆณ•้‡ๆ–ฐๅŸท่กŒๆญค่ฝ‰็งป็จ‹ๅบใ€‚", + "migration.complete.done": "ๅฎŒๆˆ", + // legacy-migration end } satisfies Partial> From 71381e2c0c1a8a376e35e2e1d72114c59bf95f7b Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Wed, 4 Mar 2026 07:52:01 +0100 Subject: [PATCH 43/48] fix: add missing interactive styles for question options in VS Code extension The QuestionDock component uses [data-component='question-prompt'] but the upstream kilo-ui interactive styles (cursor, hover, picked state, checkbox/radio visuals) are scoped under [data-component='dock-prompt'][data-kind='question']. This adds the missing interactive button styles to the VS Code CSS overrides: - cursor: pointer and hover/active/disabled states on question-option - checkbox/radio visual styles (question-option-box, question-option-check) - picked state colors (surface-interactive-weak, icon-interactive-base) - option-main, option-label, option-description layout and typography - custom option overflow handling --- .../webview-ui/src/styles/chat.css | 115 +++++++++++++++++- 1 file changed, 113 insertions(+), 2 deletions(-) diff --git a/packages/kilo-vscode/webview-ui/src/styles/chat.css b/packages/kilo-vscode/webview-ui/src/styles/chat.css index bc00739e73e..68a10bfb789 100644 --- a/packages/kilo-vscode/webview-ui/src/styles/chat.css +++ b/packages/kilo-vscode/webview-ui/src/styles/chat.css @@ -1009,22 +1009,133 @@ } [data-slot="question-option"] { - padding: 6px 8px; - border-radius: var(--radius-lg); + display: flex; + align-items: flex-start; gap: 8px; + padding: 6px 8px; + background-color: var(--surface-raised-stronger-non-alpha); + border: 1px solid var(--border-weak-base); + border-radius: var(--radius-lg); + box-shadow: none; + text-align: left; + width: 100%; + cursor: pointer; + transition: + background-color 0.15s ease, + border-color 0.15s ease, + box-shadow 0.15s ease; + + &:hover:not([data-picked="true"]) { + background-color: var(--background-base); + } + + &[data-picked="true"] { + background-color: var(--surface-interactive-weak); + border-color: transparent; + box-shadow: var(--shadow-xs-border-hover); + } + + &:disabled { + cursor: not-allowed; + opacity: 0.6; + } + } + + [data-slot="question-option-check"] { + display: inline-flex; + transform: translateY(2px); + } + + [data-slot="question-option-box"] { + width: 16px; + height: 16px; + padding: 2px; + border-radius: var(--radius-sm); + border: 1px solid var(--border-weak-base); + display: inline-flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + background-color: transparent; + transition: + background-color 0.15s ease, + border-color 0.15s ease; + + [data-component="icon"] { + opacity: 0; + color: var(--icon-base); + } + + &[data-type="radio"] { + border-radius: 999px; + } + + [data-slot="question-option-radio-dot"] { + width: 6px; + height: 6px; + border-radius: 999px; + background-color: var(--background-stronger); + opacity: 0; + } + + &[data-picked="true"] { + border-color: var(--icon-interactive-base); + + [data-component="icon"] { + opacity: 1; + color: var(--icon-invert-base); + } + + &[data-type="checkbox"] { + background-color: var(--icon-interactive-base); + } + + &[data-type="radio"] { + background-color: var(--icon-interactive-base); + [data-slot="question-option-radio-dot"] { + opacity: 1; + } + } + } + } + + [data-slot="question-option-main"] { + display: flex; + flex-direction: column; + gap: 2px; + min-width: 0; + flex: 1; } [data-slot="option-label"] { + font-family: var(--font-family-sans); font-size: var(--font-size-base); + font-weight: var(--font-weight-medium); + line-height: var(--line-height-large); + color: var(--text-strong); } [data-slot="option-description"] { + font-family: var(--font-family-sans); font-size: var(--font-size-small); + font-weight: var(--font-weight-regular); + line-height: var(--line-height-large); + color: var(--text-base); + min-width: 0; white-space: normal; overflow: visible; text-overflow: clip; } + [data-slot="question-option"][data-custom="true"] { + [data-slot="option-description"] { + overflow: visible; + text-overflow: clip; + white-space: normal; + overflow-wrap: anywhere; + } + } + [data-slot="question-review"] { display: flex; flex-direction: column; From 4cccff8d7b48c52d3cfbdd189b5ed92c6dd69b8f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 4 Mar 2026 06:58:55 +0000 Subject: [PATCH 44/48] chore: update kilo-vscode visual regression baselines --- .../composite-webview/inline-question-chromium-linux.png | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/inline-question-chromium-linux.png b/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/inline-question-chromium-linux.png index b0d7e63b64e..544a3f13dd5 100644 --- a/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/inline-question-chromium-linux.png +++ b/packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/composite-webview/inline-question-chromium-linux.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c13ea96b21def4f7359426d9d8900bab511938d4f71bc6635daaba44a2bbd133 -size 25078 +oid sha256:e92994ecc3e78cc5dd1a465b93a049e877ca30cc00a285deb4628cff287eba7b +size 28275 From c807ec44e5d3b4b82ee9b83b10d43d691becdc35 Mon Sep 17 00:00:00 2001 From: Marius Date: Wed, 4 Mar 2026 10:40:56 +0100 Subject: [PATCH 45/48] fix: enforce agent manager locale parity and localize new strings (#6592) --- .../unit/agent-manager-i18n-split.test.ts | 35 +++++++++++++++++++ .../webview-ui/agent-manager/i18n/ar.ts | 4 ++- .../webview-ui/agent-manager/i18n/br.ts | 4 ++- .../webview-ui/agent-manager/i18n/bs.ts | 4 ++- .../webview-ui/agent-manager/i18n/da.ts | 4 ++- .../webview-ui/agent-manager/i18n/de.ts | 4 ++- .../webview-ui/agent-manager/i18n/es.ts | 4 ++- .../webview-ui/agent-manager/i18n/fr.ts | 4 ++- .../webview-ui/agent-manager/i18n/ja.ts | 4 ++- .../webview-ui/agent-manager/i18n/ko.ts | 4 ++- .../webview-ui/agent-manager/i18n/no.ts | 4 ++- .../webview-ui/agent-manager/i18n/pl.ts | 4 ++- .../webview-ui/agent-manager/i18n/ru.ts | 4 ++- .../webview-ui/agent-manager/i18n/th.ts | 4 ++- .../webview-ui/agent-manager/i18n/zh.ts | 4 ++- .../webview-ui/agent-manager/i18n/zht.ts | 4 ++- 16 files changed, 80 insertions(+), 15 deletions(-) diff --git a/packages/kilo-vscode/tests/unit/agent-manager-i18n-split.test.ts b/packages/kilo-vscode/tests/unit/agent-manager-i18n-split.test.ts index b66c809c6dc..b51354ae41a 100644 --- a/packages/kilo-vscode/tests/unit/agent-manager-i18n-split.test.ts +++ b/packages/kilo-vscode/tests/unit/agent-manager-i18n-split.test.ts @@ -72,6 +72,12 @@ const appLocales = { bs: appBs, } +function placeholders(text: string): string[] { + return Array.from(text.matchAll(/\{\{\s*([\w.]+)\s*\}\}/g)) + .flatMap((match) => (match[1] ? [match[1]] : [])) + .sort() +} + describe("Agent Manager i18n split", () => { it("keeps agent manager keys out of general locale dictionaries", () => { for (const [locale, dict] of Object.entries(appLocales)) { @@ -92,6 +98,35 @@ describe("Agent Manager i18n split", () => { } }) + it("keeps every agent manager locale keyset aligned with english", () => { + const baseKeys = Object.keys(amEn) + + for (const [locale, dict] of Object.entries(locales)) { + const keySet = new Set(Object.keys(dict)) + const missing = baseKeys.filter((key) => !keySet.has(key)) + const extra = Array.from(keySet).filter((key) => !(key in amEn)) + + expect(missing, `locale ${locale} is missing agent manager keys`).toEqual([]) + expect(extra, `locale ${locale} has unexpected agent manager keys`).toEqual([]) + } + }) + + it("keeps interpolation placeholders aligned with english", () => { + for (const [locale, dict] of Object.entries(locales)) { + if (locale === "en") continue + + for (const [key, value] of Object.entries(amEn)) { + const localized = (dict as Record)[key] + expect(localized, `missing key ${key} in locale ${locale}`).toBeDefined() + if (!localized) continue + + const baseVars = placeholders(value) + const localeVars = placeholders(localized) + expect(localeVars, `placeholder mismatch for ${key} in locale ${locale}`).toEqual(baseVars) + } + } + }) + it("contains required core keys in every locale", () => { const required = [ "agentManager.local", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ar.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ar.ts index b9aebc8dd21..6a2a346fbd9 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ar.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ar.ts @@ -127,8 +127,10 @@ export const dict = { "agentManager.review.sendToChat": "ุฅุฑุณุงู„ ุฅู„ู‰ ุงู„ุฏุฑุฏุดุฉ", "agentManager.review.collapsedOnly": "{{count}} ู…ุทูˆูŠ", "agentManager.review.collapsedWithLarge": "{{collapsed}} ู…ุทูˆูŠุŒ {{large}} ูƒุจูŠุฑ", + "agentManager.review.largeFileCollapsed": "ู…ู„ู ูƒุจูŠุฑ (ู…ุทูˆูŠ)", + "agentManager.review.endOfLongDiff": "ู„ู‚ุฏ ูˆุตู„ุช ุฅู„ู‰ ุงู„ู†ู‡ุงูŠุฉ!", - "agentManager.import.pullRequest": "Pull Request", + "agentManager.import.pullRequest": "ุทู„ุจ ุณุญุจ", "agentManager.import.pastePrUrl": "ุงู„ุตู‚ ุฑุงุจุท PR...", "agentManager.import.open": "ูุชุญ", "agentManager.import.branches": "ุงู„ูุฑูˆุน", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/br.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/br.ts index aefde201f8d..f3cef50bd71 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/br.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/br.ts @@ -127,8 +127,10 @@ export const dict = { "agentManager.review.sendToChat": "Enviar para o chat", "agentManager.review.collapsedOnly": "{{count}} recolhidos", "agentManager.review.collapsedWithLarge": "{{collapsed}} recolhidos, {{large}} grandes", + "agentManager.review.largeFileCollapsed": "Arquivo grande (recolhido)", + "agentManager.review.endOfLongDiff": "Vocรช chegou ao fim!", - "agentManager.import.pullRequest": "Pull Request", + "agentManager.import.pullRequest": "Solicitaรงรฃo de extraรงรฃo", "agentManager.import.pastePrUrl": "Cole a URL do PR...", "agentManager.import.open": "Abrir", "agentManager.import.branches": "Branches", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/bs.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/bs.ts index 34f8e3a8133..7f06827a885 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/bs.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/bs.ts @@ -127,8 +127,10 @@ export const dict = { "agentManager.review.sendToChat": "Poลกalji u chat", "agentManager.review.collapsedOnly": "{{count}} saลพeto", "agentManager.review.collapsedWithLarge": "{{collapsed}} saลพeto, {{large}} velikih", + "agentManager.review.largeFileCollapsed": "Velika datoteka (skupljeno)", + "agentManager.review.endOfLongDiff": "Stigli ste do kraja!", - "agentManager.import.pullRequest": "Pull Request", + "agentManager.import.pullRequest": "Zahtjev za povlaฤenje", "agentManager.import.pastePrUrl": "Zalijepite PR URL...", "agentManager.import.open": "Otvori", "agentManager.import.branches": "Branchevi", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/da.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/da.ts index 8237d1ace03..caa5984cb6d 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/da.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/da.ts @@ -127,8 +127,10 @@ export const dict = { "agentManager.review.sendToChat": "Send til chat", "agentManager.review.collapsedOnly": "{{count}} foldet sammen", "agentManager.review.collapsedWithLarge": "{{collapsed}} foldet sammen, {{large}} store", + "agentManager.review.largeFileCollapsed": "Stor fil (kollapset)", + "agentManager.review.endOfLongDiff": "Du er nรฅet til slutningen!", - "agentManager.import.pullRequest": "Pull Request", + "agentManager.import.pullRequest": "Fletteanmodning", "agentManager.import.pastePrUrl": "Indsรฆt PR URL...", "agentManager.import.open": "ร…bn", "agentManager.import.branches": "Branches", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/de.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/de.ts index 843b30aff75..fa60f42a776 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/de.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/de.ts @@ -128,8 +128,10 @@ export const dict = { "agentManager.review.sendToChat": "An Chat senden", "agentManager.review.collapsedOnly": "{{count}} eingeklappt", "agentManager.review.collapsedWithLarge": "{{collapsed}} eingeklappt, {{large}} groรŸ", + "agentManager.review.largeFileCollapsed": "GroรŸe Datei (zugeklappt)", + "agentManager.review.endOfLongDiff": "Du hast das Ende erreicht!", - "agentManager.import.pullRequest": "Pull Request", + "agentManager.import.pullRequest": "Zusammenfรผhrungsanfrage", "agentManager.import.pastePrUrl": "PR-URL einfรผgen...", "agentManager.import.open": "ร–ffnen", "agentManager.import.branches": "Branches", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/es.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/es.ts index 2cc665e3a02..be8727625b4 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/es.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/es.ts @@ -128,8 +128,10 @@ export const dict = { "agentManager.review.sendToChat": "Enviar al chat", "agentManager.review.collapsedOnly": "{{count}} contraรญdos", "agentManager.review.collapsedWithLarge": "{{collapsed}} contraรญdos, {{large}} grandes", + "agentManager.review.largeFileCollapsed": "Archivo grande (contraรญdo)", + "agentManager.review.endOfLongDiff": "ยกHas llegado al final!", - "agentManager.import.pullRequest": "Pull Request", + "agentManager.import.pullRequest": "Solicitud de extracciรณn", "agentManager.import.pastePrUrl": "Pegar URL del PR...", "agentManager.import.open": "Abrir", "agentManager.import.branches": "Branches", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/fr.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/fr.ts index 35beaf758df..9b9c84e594f 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/fr.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/fr.ts @@ -129,8 +129,10 @@ export const dict = { "agentManager.review.sendToChat": "Envoyer au chat", "agentManager.review.collapsedOnly": "{{count}} repliรฉs", "agentManager.review.collapsedWithLarge": "{{collapsed}} repliรฉs, {{large}} volumineux", + "agentManager.review.largeFileCollapsed": "Fichier volumineux (rรฉduit)", + "agentManager.review.endOfLongDiff": "Vous รชtes arrivรฉ ร  la fin !", - "agentManager.import.pullRequest": "Pull Request", + "agentManager.import.pullRequest": "Demande d'extraction", "agentManager.import.pastePrUrl": "Coller l'URL du PR...", "agentManager.import.open": "Ouvrir", "agentManager.import.branches": "Branches", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ja.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ja.ts index 7abf7d8872b..17060e4143c 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ja.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ja.ts @@ -129,8 +129,10 @@ export const dict = { "agentManager.review.sendToChat": "ใƒใƒฃใƒƒใƒˆใซ้€ไฟก", "agentManager.review.collapsedOnly": "{{count}} ไปถๆŠ˜ใ‚ŠใŸใŸใฟ", "agentManager.review.collapsedWithLarge": "{{collapsed}} ไปถๆŠ˜ใ‚ŠใŸใŸใฟใ€{{large}} ไปถใŒใ‚ตใ‚คใ‚บๅคง", + "agentManager.review.largeFileCollapsed": "ๅคงใใชใƒ•ใ‚กใ‚คใƒซ (ๆŠ˜ใ‚ŠใŸใŸใฟๆธˆใฟ)", + "agentManager.review.endOfLongDiff": "ๆœ€ๅพŒใพใงๅˆฐ้”ใ—ใพใ—ใŸ๏ผ", - "agentManager.import.pullRequest": "Pull Request", + "agentManager.import.pullRequest": "ใƒ—ใƒซใƒชใ‚ฏใ‚จใ‚นใƒˆ", "agentManager.import.pastePrUrl": "PR URLใ‚’่ฒผใ‚Šไป˜ใ‘...", "agentManager.import.open": "้–‹ใ", "agentManager.import.branches": "ใƒ–ใƒฉใƒณใƒ", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ko.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ko.ts index b526697468b..09102636015 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ko.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ko.ts @@ -128,8 +128,10 @@ export const dict = { "agentManager.review.sendToChat": "์ฑ„ํŒ…์œผ๋กœ ๋ณด๋‚ด๊ธฐ", "agentManager.review.collapsedOnly": "{{count}}๊ฐœ ์ ‘ํž˜", "agentManager.review.collapsedWithLarge": "{{collapsed}}๊ฐœ ์ ‘ํž˜, {{large}}๊ฐœ ๋Œ€์šฉ๋Ÿ‰", + "agentManager.review.largeFileCollapsed": "ํฐ ํŒŒ์ผ (์ ‘ํž˜)", + "agentManager.review.endOfLongDiff": "๋๊นŒ์ง€ ํ™•์ธํ•˜์…จ์Šต๋‹ˆ๋‹ค!", - "agentManager.import.pullRequest": "Pull Request", + "agentManager.import.pullRequest": "ํ’€ ๋ฆฌํ€˜์ŠคํŠธ", "agentManager.import.pastePrUrl": "PR URL ๋ถ™์—ฌ๋„ฃ๊ธฐ...", "agentManager.import.open": "์—ด๊ธฐ", "agentManager.import.branches": "๋ธŒ๋žœ์น˜", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/no.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/no.ts index 288a29d9f3d..3658a9e941a 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/no.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/no.ts @@ -127,8 +127,10 @@ export const dict = { "agentManager.review.sendToChat": "Send til chat", "agentManager.review.collapsedOnly": "{{count}} kollapset", "agentManager.review.collapsedWithLarge": "{{collapsed}} kollapset, {{large}} store", + "agentManager.review.largeFileCollapsed": "Stor fil (kollapset)", + "agentManager.review.endOfLongDiff": "Du har nรฅdd slutten!", - "agentManager.import.pullRequest": "Pull Request", + "agentManager.import.pullRequest": "Fletteforespรธrsel", "agentManager.import.pastePrUrl": "Lim inn PR URL...", "agentManager.import.open": "ร…pne", "agentManager.import.branches": "Branches", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/pl.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/pl.ts index 4e4f0b70e3f..e1f74a58ac8 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/pl.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/pl.ts @@ -128,8 +128,10 @@ export const dict = { "agentManager.review.sendToChat": "Wyล›lij do czatu", "agentManager.review.collapsedOnly": "{{count}} zwiniฤ™tych", "agentManager.review.collapsedWithLarge": "{{collapsed}} zwiniฤ™tych, {{large}} duลผych", + "agentManager.review.largeFileCollapsed": "Duลผy plik (zwiniฤ™ty)", + "agentManager.review.endOfLongDiff": "Dotarล‚eล› do koล„ca!", - "agentManager.import.pullRequest": "Pull Request", + "agentManager.import.pullRequest": "Proล›ba o scalenie", "agentManager.import.pastePrUrl": "Wklej URL PR...", "agentManager.import.open": "Otwรณrz", "agentManager.import.branches": "Branche", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ru.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ru.ts index dcd2d07b895..bef0e8f5e2a 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ru.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ru.ts @@ -127,8 +127,10 @@ export const dict = { "agentManager.review.sendToChat": "ะžั‚ะฟั€ะฐะฒะธั‚ัŒ ะฒ ั‡ะฐั‚", "agentManager.review.collapsedOnly": "{{count}} ัะฒะตั€ะฝัƒั‚ะพ", "agentManager.review.collapsedWithLarge": "{{collapsed}} ัะฒะตั€ะฝัƒั‚ะพ, {{large}} ะฑะพะปัŒัˆะธั…", + "agentManager.review.largeFileCollapsed": "ะ‘ะพะปัŒัˆะพะน ั„ะฐะนะป (ัะฒะตั€ะฝัƒั‚)", + "agentManager.review.endOfLongDiff": "ะ’ั‹ ะดะพัˆะปะธ ะดะพ ะบะพะฝั†ะฐ!", - "agentManager.import.pullRequest": "Pull Request", + "agentManager.import.pullRequest": "ะ—ะฐะฟั€ะพั ะฝะฐ ัะปะธัะฝะธะต", "agentManager.import.pastePrUrl": "ะ’ัั‚ะฐะฒัŒั‚ะต URL PR...", "agentManager.import.open": "ะžั‚ะบั€ั‹ั‚ัŒ", "agentManager.import.branches": "ะ’ะตั‚ะบะธ", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/th.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/th.ts index f57327b9f41..5e6db6e91b3 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/th.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/th.ts @@ -128,8 +128,10 @@ export const dict = { "agentManager.review.sendToChat": "เธชเนˆเธ‡เน„เธ›เธขเธฑเธ‡เนเธŠเธ—", "agentManager.review.collapsedOnly": "เธขเธธเธš {{count}} เธฃเธฒเธขเธเธฒเธฃ", "agentManager.review.collapsedWithLarge": "เธขเธธเธš {{collapsed}} เธฃเธฒเธขเธเธฒเธฃ, เธ‚เธ™เธฒเธ”เนƒเธซเธเนˆ {{large}} เธฃเธฒเธขเธเธฒเธฃ", + "agentManager.review.largeFileCollapsed": "เน„เธŸเธฅเนŒเธ‚เธ™เธฒเธ”เนƒเธซเธเนˆ (เธขเนˆเธญเน„เธงเน‰)", + "agentManager.review.endOfLongDiff": "เธ„เธธเธ“เธกเธฒเธ–เธถเธ‡เธชเนˆเธงเธ™เธ—เน‰เธฒเธขเนเธฅเน‰เธง!", - "agentManager.import.pullRequest": "Pull Request", + "agentManager.import.pullRequest": "เธ„เธณเธ‚เธญเธ”เธถเธ‡", "agentManager.import.pastePrUrl": "เธงเธฒเธ‡ URL เธ‚เธญเธ‡ PR...", "agentManager.import.open": "เน€เธ›เธดเธ”", "agentManager.import.branches": "Branches", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/zh.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/zh.ts index f7dc138c494..3ed6a0bd74f 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/zh.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/zh.ts @@ -126,8 +126,10 @@ export const dict = { "agentManager.review.sendToChat": "ๅ‘้€ๅˆฐ่Šๅคฉ", "agentManager.review.collapsedOnly": "{{count}} ไธชๅทฒๆŠ˜ๅ ", "agentManager.review.collapsedWithLarge": "{{collapsed}} ไธชๅทฒๆŠ˜ๅ ๏ผŒ{{large}} ไธช่ฟ‡ๅคง", + "agentManager.review.largeFileCollapsed": "ๅคงๆ–‡ไปถ๏ผˆๅทฒๆŠ˜ๅ ๏ผ‰", + "agentManager.review.endOfLongDiff": "ๆ‚จๅทฒๅˆฐ่พพๆœซๅฐพ๏ผ", - "agentManager.import.pullRequest": "Pull Request", + "agentManager.import.pullRequest": "ๆ‹‰ๅ–่ฏทๆฑ‚", "agentManager.import.pastePrUrl": "็ฒ˜่ดด PR URL...", "agentManager.import.open": "ๆ‰“ๅผ€", "agentManager.import.branches": "ๅˆ†ๆ”ฏ", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/zht.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/zht.ts index c36238dac12..279292eac94 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/zht.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/zht.ts @@ -126,8 +126,10 @@ export const dict = { "agentManager.review.sendToChat": "ๅ‚ณ้€ๅˆฐ่Šๅคฉ", "agentManager.review.collapsedOnly": "{{count}} ๅ€‹ๅทฒๆ‘บ็–Š", "agentManager.review.collapsedWithLarge": "{{collapsed}} ๅ€‹ๅทฒๆ‘บ็–Š๏ผŒ{{large}} ๅ€‹้Žๅคง", + "agentManager.review.largeFileCollapsed": "ๅคงๆช”ๆกˆ๏ผˆๅทฒๆ‘บ็–Š๏ผ‰", + "agentManager.review.endOfLongDiff": "ๆ‚จๅทฒๅˆฐ้”ๅบ•้ƒจ๏ผ", - "agentManager.import.pullRequest": "Pull Request", + "agentManager.import.pullRequest": "ๆ‹‰ๅ–่ซ‹ๆฑ‚", "agentManager.import.pastePrUrl": "่ฒผไธŠ PR URL...", "agentManager.import.open": "้–‹ๅ•Ÿ", "agentManager.import.branches": "ๅˆ†ๆ”ฏ", From e97348d7aacc37f9c71ed9767d07c23d38d52ddd Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Wed, 4 Mar 2026 11:39:53 +0100 Subject: [PATCH 46/48] Remove kilocode_change markers from kilo-specific packages These markers are only needed in shared upstream opencode files to prevent merge conflicts. In kilo-specific packages (kilocode/, kilo-gateway/, kilo-ui/, kilo-i18n/, kilo-vscode/, etc.) they serve no purpose. --- .husky/_/post-checkout | 3 +++ .husky/_/post-commit | 3 +++ .husky/_/post-merge | 3 +++ .husky/_/pre-push | 3 +++ packages/kilo-gateway/src/api/constants.ts | 2 -- packages/kilo-gateway/src/api/notifications.ts | 1 - packages/kilo-gateway/src/auth/legacy-migration.ts | 1 - packages/kilo-gateway/src/headers.ts | 4 +--- packages/kilo-gateway/src/index.ts | 2 +- packages/kilo-gateway/src/types.ts | 1 - packages/kilo-i18n/src/ar.ts | 1 - packages/kilo-i18n/src/br.ts | 1 - packages/kilo-i18n/src/bs.ts | 1 - packages/kilo-i18n/src/da.ts | 1 - packages/kilo-i18n/src/de.ts | 1 - packages/kilo-i18n/src/en.ts | 1 - packages/kilo-i18n/src/es.ts | 1 - packages/kilo-i18n/src/fr.ts | 1 - packages/kilo-i18n/src/ja.ts | 1 - packages/kilo-i18n/src/ko.ts | 1 - packages/kilo-i18n/src/no.ts | 1 - packages/kilo-i18n/src/pl.ts | 1 - packages/kilo-i18n/src/ru.ts | 1 - packages/kilo-i18n/src/th.ts | 1 - packages/kilo-i18n/src/zh.ts | 1 - packages/kilo-i18n/src/zht.ts | 1 - packages/kilo-ui/src/components/accordion.css | 1 - packages/kilo-ui/src/components/accordion.tsx | 1 - packages/kilo-ui/src/components/app-icon.tsx | 1 - packages/kilo-ui/src/components/app-icons/types.ts | 1 - packages/kilo-ui/src/components/auto-approve-bar.css | 1 - packages/kilo-ui/src/components/avatar.tsx | 1 - packages/kilo-ui/src/components/basic-tool.css | 1 - packages/kilo-ui/src/components/basic-tool.tsx | 1 - packages/kilo-ui/src/components/button.css | 1 - packages/kilo-ui/src/components/button.tsx | 1 - packages/kilo-ui/src/components/card.css | 1 - packages/kilo-ui/src/components/card.tsx | 1 - packages/kilo-ui/src/components/chat-input.css | 1 - packages/kilo-ui/src/components/checkbox.css | 1 - packages/kilo-ui/src/components/checkbox.tsx | 1 - packages/kilo-ui/src/components/code.css | 1 - packages/kilo-ui/src/components/code.tsx | 1 - packages/kilo-ui/src/components/collapsible.tsx | 1 - packages/kilo-ui/src/components/context-menu.css | 1 - packages/kilo-ui/src/components/context-menu.tsx | 1 - packages/kilo-ui/src/components/dialog.css | 1 - packages/kilo-ui/src/components/dialog.tsx | 1 - packages/kilo-ui/src/components/diff-changes.tsx | 1 - packages/kilo-ui/src/components/diff-ssr.tsx | 1 - packages/kilo-ui/src/components/diff.tsx | 1 - packages/kilo-ui/src/components/dock-prompt.tsx | 1 - packages/kilo-ui/src/components/dock-surface.tsx | 1 - packages/kilo-ui/src/components/dropdown-menu.css | 3 --- packages/kilo-ui/src/components/dropdown-menu.tsx | 1 - packages/kilo-ui/src/components/favicon.tsx | 1 - packages/kilo-ui/src/components/file-icon.tsx | 1 - packages/kilo-ui/src/components/file-icons/types.ts | 1 - packages/kilo-ui/src/components/font.tsx | 1 - packages/kilo-ui/src/components/hover-card.tsx | 1 - packages/kilo-ui/src/components/icon-button.css | 1 - packages/kilo-ui/src/components/icon-button.tsx | 1 - packages/kilo-ui/src/components/icon.tsx | 1 - packages/kilo-ui/src/components/image-preview.tsx | 1 - packages/kilo-ui/src/components/inline-input.css | 1 - packages/kilo-ui/src/components/inline-input.tsx | 1 - packages/kilo-ui/src/components/keybind.tsx | 1 - packages/kilo-ui/src/components/line-comment.tsx | 1 - packages/kilo-ui/src/components/list.css | 1 - packages/kilo-ui/src/components/list.tsx | 1 - packages/kilo-ui/src/components/logo.tsx | 1 - packages/kilo-ui/src/components/markdown.tsx | 1 - packages/kilo-ui/src/components/message-nav.tsx | 1 - packages/kilo-ui/src/components/message-part.css | 1 - packages/kilo-ui/src/components/message-part.tsx | 1 - packages/kilo-ui/src/components/message-row.css | 1 - packages/kilo-ui/src/components/model-info-card.css | 1 - packages/kilo-ui/src/components/model-selector.css | 1 - packages/kilo-ui/src/components/popover.css | 1 - packages/kilo-ui/src/components/popover.tsx | 1 - packages/kilo-ui/src/components/progress-circle.tsx | 1 - packages/kilo-ui/src/components/prompt-input.css | 1 - packages/kilo-ui/src/components/provider-icon.tsx | 1 - packages/kilo-ui/src/components/provider-icons/types.ts | 1 - packages/kilo-ui/src/components/radio-group.tsx | 1 - packages/kilo-ui/src/components/resize-handle.tsx | 1 - packages/kilo-ui/src/components/select.css | 1 - packages/kilo-ui/src/components/select.tsx | 1 - packages/kilo-ui/src/components/session-review.tsx | 1 - packages/kilo-ui/src/components/session-turn.tsx | 1 - packages/kilo-ui/src/components/settings-sidebar.css | 1 - packages/kilo-ui/src/components/spinner.tsx | 1 - packages/kilo-ui/src/components/status-indicator.css | 1 - .../kilo-ui/src/components/sticky-accordion-header.tsx | 1 - packages/kilo-ui/src/components/switch.css | 1 - packages/kilo-ui/src/components/switch.tsx | 1 - packages/kilo-ui/src/components/tabs.css | 1 - packages/kilo-ui/src/components/tabs.tsx | 1 - packages/kilo-ui/src/components/tag.css | 1 - packages/kilo-ui/src/components/tag.tsx | 1 - packages/kilo-ui/src/components/task-header.css | 1 - packages/kilo-ui/src/components/text-field.css | 1 - packages/kilo-ui/src/components/text-field.tsx | 1 - packages/kilo-ui/src/components/toast.css | 1 - packages/kilo-ui/src/components/toast.tsx | 1 - packages/kilo-ui/src/components/tooltip.css | 1 - packages/kilo-ui/src/components/tooltip.tsx | 1 - packages/kilo-ui/src/components/typewriter.tsx | 1 - packages/kilo-ui/src/context/code.tsx | 1 - packages/kilo-ui/src/context/data.tsx | 1 - packages/kilo-ui/src/context/dialog.tsx | 1 - packages/kilo-ui/src/context/diff.tsx | 1 - packages/kilo-ui/src/context/helper.tsx | 1 - packages/kilo-ui/src/context/i18n.tsx | 1 - packages/kilo-ui/src/context/index.ts | 1 - packages/kilo-ui/src/context/marked.tsx | 1 - packages/kilo-ui/src/context/worker-pool.tsx | 1 - packages/kilo-ui/src/hooks/index.ts | 1 - packages/kilo-ui/src/i18n/ar.ts | 1 - packages/kilo-ui/src/i18n/br.ts | 1 - packages/kilo-ui/src/i18n/bs.ts | 1 - packages/kilo-ui/src/i18n/da.ts | 1 - packages/kilo-ui/src/i18n/de.ts | 1 - packages/kilo-ui/src/i18n/en.ts | 1 - packages/kilo-ui/src/i18n/es.ts | 1 - packages/kilo-ui/src/i18n/fr.ts | 1 - packages/kilo-ui/src/i18n/ja.ts | 1 - packages/kilo-ui/src/i18n/ko.ts | 1 - packages/kilo-ui/src/i18n/no.ts | 1 - packages/kilo-ui/src/i18n/pl.ts | 1 - packages/kilo-ui/src/i18n/ru.ts | 1 - packages/kilo-ui/src/i18n/th.ts | 1 - packages/kilo-ui/src/i18n/zh.ts | 1 - packages/kilo-ui/src/i18n/zht.ts | 1 - packages/kilo-ui/src/index.ts | 1 - packages/kilo-ui/src/pierre/index.ts | 1 - packages/kilo-ui/src/pierre/worker.ts | 1 - packages/kilo-ui/src/styles/globals.css | 1 - packages/kilo-ui/src/styles/index.css | 1 - packages/kilo-ui/src/styles/tailwind/index.css | 1 - packages/kilo-ui/src/theme/color.ts | 1 - packages/kilo-ui/src/theme/context.tsx | 5 ++--- packages/kilo-ui/src/theme/default-themes.ts | 1 - packages/kilo-ui/src/theme/index.ts | 1 - packages/kilo-ui/src/theme/loader.ts | 1 - packages/kilo-ui/src/theme/resolve.ts | 1 - packages/kilo-ui/src/theme/types.ts | 1 - packages/kilo-vscode/src/KiloProvider.ts | 2 -- .../src/services/cli-backend/server-manager.ts | 4 ++-- .../src/kilocode/components/dialog-kilo-auto-method.tsx | 1 - .../src/kilocode/components/dialog-kilo-notifications.tsx | 1 - .../src/kilocode/components/dialog-kilo-organization.tsx | 1 - .../src/kilocode/components/dialog-kilo-profile.tsx | 1 - .../src/kilocode/components/dialog-kilo-team-select.tsx | 1 - packages/opencode/src/kilocode/components/kilo-news.tsx | 1 - .../src/kilocode/components/notification-banner.tsx | 1 - packages/opencode/src/kilocode/components/tips.tsx | 1 - packages/opencode/src/kilocode/config-injector.ts | 8 ++------ packages/opencode/src/kilocode/const.ts | 1 - packages/opencode/src/kilocode/enhance-prompt.ts | 1 - packages/opencode/src/kilocode/ignore-migrator.ts | 1 - packages/opencode/src/kilocode/index.ts | 2 +- packages/opencode/src/kilocode/modes-migrator.ts | 1 - packages/opencode/src/kilocode/project-id.ts | 1 - packages/opencode/src/kilocode/review/command.ts | 1 - packages/opencode/src/kilocode/review/review.ts | 1 - packages/opencode/src/kilocode/review/types.ts | 1 - packages/opencode/src/kilocode/rules-migrator.ts | 1 - packages/opencode/src/kilocode/workflows-migrator.ts | 1 - packages/opencode/test/kilocode/config-injector.test.ts | 4 ---- .../opencode/test/kilocode/kilo-gateway-headers.test.ts | 1 - packages/opencode/test/kilocode/model-cache-org.test.ts | 1 - 172 files changed, 21 insertions(+), 185 deletions(-) create mode 100755 .husky/_/post-checkout create mode 100755 .husky/_/post-commit create mode 100755 .husky/_/post-merge create mode 100755 .husky/_/pre-push diff --git a/.husky/_/post-checkout b/.husky/_/post-checkout new file mode 100755 index 00000000000..5abf8ed93f7 --- /dev/null +++ b/.husky/_/post-checkout @@ -0,0 +1,3 @@ +#!/bin/sh +command -v git-lfs >/dev/null 2>&1 || { printf >&2 "\n%s\n\n" "This repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting the 'post-checkout' file in the hooks directory (set by 'core.hookspath'; usually '.git/hooks')."; exit 2; } +git lfs post-checkout "$@" diff --git a/.husky/_/post-commit b/.husky/_/post-commit new file mode 100755 index 00000000000..b8b76c2c425 --- /dev/null +++ b/.husky/_/post-commit @@ -0,0 +1,3 @@ +#!/bin/sh +command -v git-lfs >/dev/null 2>&1 || { printf >&2 "\n%s\n\n" "This repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting the 'post-commit' file in the hooks directory (set by 'core.hookspath'; usually '.git/hooks')."; exit 2; } +git lfs post-commit "$@" diff --git a/.husky/_/post-merge b/.husky/_/post-merge new file mode 100755 index 00000000000..726f909891a --- /dev/null +++ b/.husky/_/post-merge @@ -0,0 +1,3 @@ +#!/bin/sh +command -v git-lfs >/dev/null 2>&1 || { printf >&2 "\n%s\n\n" "This repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting the 'post-merge' file in the hooks directory (set by 'core.hookspath'; usually '.git/hooks')."; exit 2; } +git lfs post-merge "$@" diff --git a/.husky/_/pre-push b/.husky/_/pre-push new file mode 100755 index 00000000000..5f26dc45523 --- /dev/null +++ b/.husky/_/pre-push @@ -0,0 +1,3 @@ +#!/bin/sh +command -v git-lfs >/dev/null 2>&1 || { printf >&2 "\n%s\n\n" "This repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting the 'pre-push' file in the hooks directory (set by 'core.hookspath'; usually '.git/hooks')."; exit 2; } +git lfs pre-push "$@" diff --git a/packages/kilo-gateway/src/api/constants.ts b/packages/kilo-gateway/src/api/constants.ts index a10781e6b49..cdaff49e391 100644 --- a/packages/kilo-gateway/src/api/constants.ts +++ b/packages/kilo-gateway/src/api/constants.ts @@ -61,10 +61,8 @@ export const ENV_EDITOR_NAME = "KILOCODE_EDITOR_NAME" /** Tester header value for suppressing warnings */ export const TESTER_SUPPRESS_VALUE = "SUPPRESS" -// kilocode_change start /** Header name for feature tracking */ export const HEADER_FEATURE = "X-KILOCODE-FEATURE" /** Environment variable name for feature override */ export const ENV_FEATURE = "KILOCODE_FEATURE" -// kilocode_change end diff --git a/packages/kilo-gateway/src/api/notifications.ts b/packages/kilo-gateway/src/api/notifications.ts index 2d0994e94bd..286686717eb 100644 --- a/packages/kilo-gateway/src/api/notifications.ts +++ b/packages/kilo-gateway/src/api/notifications.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file import { z } from "zod" import { KILO_API_BASE } from "./constants.js" diff --git a/packages/kilo-gateway/src/auth/legacy-migration.ts b/packages/kilo-gateway/src/auth/legacy-migration.ts index 1f53feb66d7..34944dbfb0d 100644 --- a/packages/kilo-gateway/src/auth/legacy-migration.ts +++ b/packages/kilo-gateway/src/auth/legacy-migration.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file /** * Legacy Kilo CLI migration module * diff --git a/packages/kilo-gateway/src/headers.ts b/packages/kilo-gateway/src/headers.ts index c9767f3e1f8..0ec36805854 100644 --- a/packages/kilo-gateway/src/headers.ts +++ b/packages/kilo-gateway/src/headers.ts @@ -11,7 +11,7 @@ import { DEFAULT_EDITOR_NAME, ENV_EDITOR_NAME, TESTER_SUPPRESS_VALUE, - ENV_FEATURE, // kilocode_change + ENV_FEATURE, } from "./api/constants.js" /** @@ -62,13 +62,11 @@ export function buildKiloHeaders( machineId?: string }, ): Record { - // kilocode_change start const feature = getFeatureHeader() const headers: Record = { [X_KILOCODE_EDITORNAME]: getEditorNameHeader(), ...(feature ? { [X_KILOCODE_FEATURE]: feature } : {}), } - // kilocode_change end if (metadata?.taskId) { headers[X_KILOCODE_TASKID] = metadata.taskId diff --git a/packages/kilo-gateway/src/index.ts b/packages/kilo-gateway/src/index.ts index 9f10c75fb07..76ba1f03306 100644 --- a/packages/kilo-gateway/src/index.ts +++ b/packages/kilo-gateway/src/index.ts @@ -9,7 +9,7 @@ export { KiloAuthPlugin, default } from "./plugin.js" export { createKilo } from "./provider.js" export { createKiloDebug } from "./provider-debug.js" export { kiloCustomLoader } from "./loader.js" -export { buildKiloHeaders, getEditorNameHeader, getFeatureHeader, DEFAULT_HEADERS } from "./headers.js" // kilocode_change - added getFeatureHeader +export { buildKiloHeaders, getEditorNameHeader, getFeatureHeader, DEFAULT_HEADERS } from "./headers.js" // ============================================================================ // Auth diff --git a/packages/kilo-gateway/src/types.ts b/packages/kilo-gateway/src/types.ts index d61c598f0d1..5afecffe09d 100644 --- a/packages/kilo-gateway/src/types.ts +++ b/packages/kilo-gateway/src/types.ts @@ -1,4 +1,3 @@ -// kilocode_change - Kilo Gateway types import type { Provider as SDK } from "ai" import type { LanguageModelV2 } from "@openrouter/ai-sdk-provider" diff --git a/packages/kilo-i18n/src/ar.ts b/packages/kilo-i18n/src/ar.ts index 27963894dcc..4a8cd1c79ff 100644 --- a/packages/kilo-i18n/src/ar.ts +++ b/packages/kilo-i18n/src/ar.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file export const dict = { // Kilo Gateway provider translations "provider.connect.kiloGateway.line1": diff --git a/packages/kilo-i18n/src/br.ts b/packages/kilo-i18n/src/br.ts index 5ac4369243e..4734a98d0f4 100644 --- a/packages/kilo-i18n/src/br.ts +++ b/packages/kilo-i18n/src/br.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file export const dict = { // Kilo Gateway provider translations "provider.connect.kiloGateway.line1": diff --git a/packages/kilo-i18n/src/bs.ts b/packages/kilo-i18n/src/bs.ts index e1400fc227c..28025010251 100644 --- a/packages/kilo-i18n/src/bs.ts +++ b/packages/kilo-i18n/src/bs.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file export const dict = { // Kilo Gateway provider translations "provider.connect.kiloGateway.line1": diff --git a/packages/kilo-i18n/src/da.ts b/packages/kilo-i18n/src/da.ts index d5c89a5bf4d..16f0c8f6828 100644 --- a/packages/kilo-i18n/src/da.ts +++ b/packages/kilo-i18n/src/da.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file export const dict = { // Kilo Gateway provider translations "provider.connect.kiloGateway.line1": diff --git a/packages/kilo-i18n/src/de.ts b/packages/kilo-i18n/src/de.ts index 97c12ef614a..b39b7eb4776 100644 --- a/packages/kilo-i18n/src/de.ts +++ b/packages/kilo-i18n/src/de.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file export const dict = { // Kilo Gateway provider translations "provider.connect.kiloGateway.line1": diff --git a/packages/kilo-i18n/src/en.ts b/packages/kilo-i18n/src/en.ts index 237a635c751..070c3d41cea 100644 --- a/packages/kilo-i18n/src/en.ts +++ b/packages/kilo-i18n/src/en.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file // Kilo-specific translations and overrides // Keys here will override any matching keys from upstream translations export const dict = { diff --git a/packages/kilo-i18n/src/es.ts b/packages/kilo-i18n/src/es.ts index 59165915854..25c5dba9f36 100644 --- a/packages/kilo-i18n/src/es.ts +++ b/packages/kilo-i18n/src/es.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file export const dict = { // Kilo Gateway provider translations "provider.connect.kiloGateway.line1": diff --git a/packages/kilo-i18n/src/fr.ts b/packages/kilo-i18n/src/fr.ts index 513ffc6ba1f..d593e4a2be3 100644 --- a/packages/kilo-i18n/src/fr.ts +++ b/packages/kilo-i18n/src/fr.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file export const dict = { // Kilo Gateway provider translations "provider.connect.kiloGateway.line1": diff --git a/packages/kilo-i18n/src/ja.ts b/packages/kilo-i18n/src/ja.ts index 676550a67e4..08eda7545aa 100644 --- a/packages/kilo-i18n/src/ja.ts +++ b/packages/kilo-i18n/src/ja.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file export const dict = { // Kilo Gateway provider translations "provider.connect.kiloGateway.line1": diff --git a/packages/kilo-i18n/src/ko.ts b/packages/kilo-i18n/src/ko.ts index 0f76b05155b..cbbd28aa1f3 100644 --- a/packages/kilo-i18n/src/ko.ts +++ b/packages/kilo-i18n/src/ko.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file export const dict = { // Kilo Gateway provider translations "provider.connect.kiloGateway.line1": diff --git a/packages/kilo-i18n/src/no.ts b/packages/kilo-i18n/src/no.ts index 3d6ede4b4b5..bd17fff9b59 100644 --- a/packages/kilo-i18n/src/no.ts +++ b/packages/kilo-i18n/src/no.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file export const dict = { // Kilo Gateway provider translations "provider.connect.kiloGateway.line1": diff --git a/packages/kilo-i18n/src/pl.ts b/packages/kilo-i18n/src/pl.ts index 327317ebb49..63aea01e6e3 100644 --- a/packages/kilo-i18n/src/pl.ts +++ b/packages/kilo-i18n/src/pl.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file export const dict = { // Kilo Gateway provider translations "provider.connect.kiloGateway.line1": diff --git a/packages/kilo-i18n/src/ru.ts b/packages/kilo-i18n/src/ru.ts index 182652dced8..7a0276ad710 100644 --- a/packages/kilo-i18n/src/ru.ts +++ b/packages/kilo-i18n/src/ru.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file export const dict = { // Kilo Gateway provider translations "provider.connect.kiloGateway.line1": diff --git a/packages/kilo-i18n/src/th.ts b/packages/kilo-i18n/src/th.ts index eaef9b0bde9..d6f88c10b10 100644 --- a/packages/kilo-i18n/src/th.ts +++ b/packages/kilo-i18n/src/th.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file export const dict = { // Kilo Gateway provider translations "provider.connect.kiloGateway.line1": diff --git a/packages/kilo-i18n/src/zh.ts b/packages/kilo-i18n/src/zh.ts index 6cbf5301ab3..93d0f4f6c0d 100644 --- a/packages/kilo-i18n/src/zh.ts +++ b/packages/kilo-i18n/src/zh.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file export const dict = { // Kilo Gateway provider translations "provider.connect.kiloGateway.line1": "Kilo Gateway ไธบๆ‚จๆไพ›ไธ€็ป„็ฒพ้€‰็š„ๅฏ้ ไผ˜ๅŒ–ๆจกๅž‹๏ผŒไธ“ไธบ็ผ–็ ไปฃ็†่ฎพ่ฎกใ€‚", diff --git a/packages/kilo-i18n/src/zht.ts b/packages/kilo-i18n/src/zht.ts index 69f93085439..a5b9a019f62 100644 --- a/packages/kilo-i18n/src/zht.ts +++ b/packages/kilo-i18n/src/zht.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file export const dict = { // Kilo Gateway provider translations "provider.connect.kiloGateway.line1": "Kilo Gateway ็‚บๆ‚จๆไพ›ไธ€็ต„็ฒพ้ธ็š„ๅฏ้ ๅ„ชๅŒ–ๆจกๅž‹๏ผŒๅฐˆ็‚บ็ทจ็ขผไปฃ็†่จญ่จˆใ€‚", diff --git a/packages/kilo-ui/src/components/accordion.css b/packages/kilo-ui/src/components/accordion.css index d7c70c5840a..aa522a7131f 100644 --- a/packages/kilo-ui/src/components/accordion.css +++ b/packages/kilo-ui/src/components/accordion.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Accordion overrides */ [data-component="accordion"] { diff --git a/packages/kilo-ui/src/components/accordion.tsx b/packages/kilo-ui/src/components/accordion.tsx index 24a9358ff78..5eac74c261a 100644 --- a/packages/kilo-ui/src/components/accordion.tsx +++ b/packages/kilo-ui/src/components/accordion.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/accordion" diff --git a/packages/kilo-ui/src/components/app-icon.tsx b/packages/kilo-ui/src/components/app-icon.tsx index 80de2ede11a..6ab39549824 100644 --- a/packages/kilo-ui/src/components/app-icon.tsx +++ b/packages/kilo-ui/src/components/app-icon.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/app-icon" diff --git a/packages/kilo-ui/src/components/app-icons/types.ts b/packages/kilo-ui/src/components/app-icons/types.ts index 0654a12f8fb..fe900620fc6 100644 --- a/packages/kilo-ui/src/components/app-icons/types.ts +++ b/packages/kilo-ui/src/components/app-icons/types.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/icons/app" diff --git a/packages/kilo-ui/src/components/auto-approve-bar.css b/packages/kilo-ui/src/components/auto-approve-bar.css index 14aa6a8fc19..517e05d0846 100644 --- a/packages/kilo-ui/src/components/auto-approve-bar.css +++ b/packages/kilo-ui/src/components/auto-approve-bar.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Auto-approve Bar overrides */ [data-component="auto-approve-bar"] { diff --git a/packages/kilo-ui/src/components/avatar.tsx b/packages/kilo-ui/src/components/avatar.tsx index 3deb6c05d66..1de760ad7ab 100644 --- a/packages/kilo-ui/src/components/avatar.tsx +++ b/packages/kilo-ui/src/components/avatar.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/avatar" diff --git a/packages/kilo-ui/src/components/basic-tool.css b/packages/kilo-ui/src/components/basic-tool.css index f440dd42da1..7891116b576 100644 --- a/packages/kilo-ui/src/components/basic-tool.css +++ b/packages/kilo-ui/src/components/basic-tool.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Prevent tool-trigger content from pushing the collapsible arrow off-screen */ [data-component="tool-trigger"] { [data-slot="basic-tool-tool-trigger-content"] { diff --git a/packages/kilo-ui/src/components/basic-tool.tsx b/packages/kilo-ui/src/components/basic-tool.tsx index 36c4fb31f42..66d15277b35 100644 --- a/packages/kilo-ui/src/components/basic-tool.tsx +++ b/packages/kilo-ui/src/components/basic-tool.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/basic-tool" diff --git a/packages/kilo-ui/src/components/button.css b/packages/kilo-ui/src/components/button.css index 09fc5c1a8ce..2aa86b2078c 100644 --- a/packages/kilo-ui/src/components/button.css +++ b/packages/kilo-ui/src/components/button.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Button overrides โ€“ sized to match @vscode/webview-ui-toolkit */ [data-component="button"] { diff --git a/packages/kilo-ui/src/components/button.tsx b/packages/kilo-ui/src/components/button.tsx index 780a9fffc2d..2623a711ca1 100644 --- a/packages/kilo-ui/src/components/button.tsx +++ b/packages/kilo-ui/src/components/button.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/button" diff --git a/packages/kilo-ui/src/components/card.css b/packages/kilo-ui/src/components/card.css index 3bfd65c7787..7e97fcf316a 100644 --- a/packages/kilo-ui/src/components/card.css +++ b/packages/kilo-ui/src/components/card.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Card overrides โ€“ harmonized with @vscode/webview-ui-toolkit */ [data-component="card"] { diff --git a/packages/kilo-ui/src/components/card.tsx b/packages/kilo-ui/src/components/card.tsx index f94fc8a57ed..e023f2946d2 100644 --- a/packages/kilo-ui/src/components/card.tsx +++ b/packages/kilo-ui/src/components/card.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/card" diff --git a/packages/kilo-ui/src/components/chat-input.css b/packages/kilo-ui/src/components/chat-input.css index 6761767332c..bfd29fc7028 100644 --- a/packages/kilo-ui/src/components/chat-input.css +++ b/packages/kilo-ui/src/components/chat-input.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Chat Input (Textarea with blue border) overrides โ€“ sized to match @vscode/webview-ui-toolkit */ [data-component="chat-input"], diff --git a/packages/kilo-ui/src/components/checkbox.css b/packages/kilo-ui/src/components/checkbox.css index a39f431419d..cde6fa89b6e 100644 --- a/packages/kilo-ui/src/components/checkbox.css +++ b/packages/kilo-ui/src/components/checkbox.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Checkbox overrides โ€“ sized to match @vscode/webview-ui-toolkit */ [data-component="checkbox"] { diff --git a/packages/kilo-ui/src/components/checkbox.tsx b/packages/kilo-ui/src/components/checkbox.tsx index b7645e7afa3..0338fe0c530 100644 --- a/packages/kilo-ui/src/components/checkbox.tsx +++ b/packages/kilo-ui/src/components/checkbox.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/checkbox" diff --git a/packages/kilo-ui/src/components/code.css b/packages/kilo-ui/src/components/code.css index a43012f109b..bfde26a279d 100644 --- a/packages/kilo-ui/src/components/code.css +++ b/packages/kilo-ui/src/components/code.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Code overrides */ [data-component="code"] { diff --git a/packages/kilo-ui/src/components/code.tsx b/packages/kilo-ui/src/components/code.tsx index afc131525e0..40b98cd70ed 100644 --- a/packages/kilo-ui/src/components/code.tsx +++ b/packages/kilo-ui/src/components/code.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/code" diff --git a/packages/kilo-ui/src/components/collapsible.tsx b/packages/kilo-ui/src/components/collapsible.tsx index 019afa844f5..190f3a16cd3 100644 --- a/packages/kilo-ui/src/components/collapsible.tsx +++ b/packages/kilo-ui/src/components/collapsible.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/collapsible" diff --git a/packages/kilo-ui/src/components/context-menu.css b/packages/kilo-ui/src/components/context-menu.css index 72d5402ab63..feeefc704c1 100644 --- a/packages/kilo-ui/src/components/context-menu.css +++ b/packages/kilo-ui/src/components/context-menu.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Context Menu overrides โ€“ sized to match @vscode/webview-ui-toolkit */ [data-component="context-menu-content"], diff --git a/packages/kilo-ui/src/components/context-menu.tsx b/packages/kilo-ui/src/components/context-menu.tsx index 8ab04ce1109..6657036b236 100644 --- a/packages/kilo-ui/src/components/context-menu.tsx +++ b/packages/kilo-ui/src/components/context-menu.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/context-menu" diff --git a/packages/kilo-ui/src/components/dialog.css b/packages/kilo-ui/src/components/dialog.css index e571f5cc7f8..742cd1690d7 100644 --- a/packages/kilo-ui/src/components/dialog.css +++ b/packages/kilo-ui/src/components/dialog.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Dialog overrides โ€“ harmonized with @vscode/webview-ui-toolkit */ [data-component="dialog-overlay"] { diff --git a/packages/kilo-ui/src/components/dialog.tsx b/packages/kilo-ui/src/components/dialog.tsx index 69329dcae3a..078bb487e82 100644 --- a/packages/kilo-ui/src/components/dialog.tsx +++ b/packages/kilo-ui/src/components/dialog.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/dialog" diff --git a/packages/kilo-ui/src/components/diff-changes.tsx b/packages/kilo-ui/src/components/diff-changes.tsx index 03b78b6fc43..a0c85321530 100644 --- a/packages/kilo-ui/src/components/diff-changes.tsx +++ b/packages/kilo-ui/src/components/diff-changes.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/diff-changes" diff --git a/packages/kilo-ui/src/components/diff-ssr.tsx b/packages/kilo-ui/src/components/diff-ssr.tsx index 6c99dd6dd2d..1c8c7f2dc79 100644 --- a/packages/kilo-ui/src/components/diff-ssr.tsx +++ b/packages/kilo-ui/src/components/diff-ssr.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/diff-ssr" diff --git a/packages/kilo-ui/src/components/diff.tsx b/packages/kilo-ui/src/components/diff.tsx index 5f5cfa6ab0d..256d5495f57 100644 --- a/packages/kilo-ui/src/components/diff.tsx +++ b/packages/kilo-ui/src/components/diff.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/diff" diff --git a/packages/kilo-ui/src/components/dock-prompt.tsx b/packages/kilo-ui/src/components/dock-prompt.tsx index b298a9de0f4..696987ecc56 100644 --- a/packages/kilo-ui/src/components/dock-prompt.tsx +++ b/packages/kilo-ui/src/components/dock-prompt.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/dock-prompt" diff --git a/packages/kilo-ui/src/components/dock-surface.tsx b/packages/kilo-ui/src/components/dock-surface.tsx index 926b78cb5bd..b8f4ae1a5a6 100644 --- a/packages/kilo-ui/src/components/dock-surface.tsx +++ b/packages/kilo-ui/src/components/dock-surface.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/dock-surface" diff --git a/packages/kilo-ui/src/components/dropdown-menu.css b/packages/kilo-ui/src/components/dropdown-menu.css index efda95ad8f3..00901bdca45 100644 --- a/packages/kilo-ui/src/components/dropdown-menu.css +++ b/packages/kilo-ui/src/components/dropdown-menu.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Dropdown Menu overrides โ€“ sized to match @vscode/webview-ui-toolkit */ [data-component="dropdown-menu-content"], @@ -21,12 +20,10 @@ color: var(--text-on-interactive-base, var(--text-strong)); } - /* kilocode_change start - preserve disabled state behavior from upstream */ &[data-disabled] { cursor: default; pointer-events: none; } - /* kilocode_change end */ } [data-slot="dropdown-menu-separator"] { diff --git a/packages/kilo-ui/src/components/dropdown-menu.tsx b/packages/kilo-ui/src/components/dropdown-menu.tsx index 6ba18963d4c..c20c829c47b 100644 --- a/packages/kilo-ui/src/components/dropdown-menu.tsx +++ b/packages/kilo-ui/src/components/dropdown-menu.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/dropdown-menu" diff --git a/packages/kilo-ui/src/components/favicon.tsx b/packages/kilo-ui/src/components/favicon.tsx index 14100f67bb2..a20f1586357 100644 --- a/packages/kilo-ui/src/components/favicon.tsx +++ b/packages/kilo-ui/src/components/favicon.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/favicon" diff --git a/packages/kilo-ui/src/components/file-icon.tsx b/packages/kilo-ui/src/components/file-icon.tsx index 94137149586..276f9c0bb83 100644 --- a/packages/kilo-ui/src/components/file-icon.tsx +++ b/packages/kilo-ui/src/components/file-icon.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/file-icon" diff --git a/packages/kilo-ui/src/components/file-icons/types.ts b/packages/kilo-ui/src/components/file-icons/types.ts index c04e859b953..3418f374888 100644 --- a/packages/kilo-ui/src/components/file-icons/types.ts +++ b/packages/kilo-ui/src/components/file-icons/types.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/icons/file-type" diff --git a/packages/kilo-ui/src/components/font.tsx b/packages/kilo-ui/src/components/font.tsx index 00973f31ce6..f2664c6e18a 100644 --- a/packages/kilo-ui/src/components/font.tsx +++ b/packages/kilo-ui/src/components/font.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/font" diff --git a/packages/kilo-ui/src/components/hover-card.tsx b/packages/kilo-ui/src/components/hover-card.tsx index 00abe9c09fb..e099c0bc298 100644 --- a/packages/kilo-ui/src/components/hover-card.tsx +++ b/packages/kilo-ui/src/components/hover-card.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/hover-card" diff --git a/packages/kilo-ui/src/components/icon-button.css b/packages/kilo-ui/src/components/icon-button.css index 3c971819876..6a0a08cfe02 100644 --- a/packages/kilo-ui/src/components/icon-button.css +++ b/packages/kilo-ui/src/components/icon-button.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Icon Button overrides โ€“ sized to match @vscode/webview-ui-toolkit */ [data-component="icon-button"] { diff --git a/packages/kilo-ui/src/components/icon-button.tsx b/packages/kilo-ui/src/components/icon-button.tsx index bcfc87d4699..52c1b666f8d 100644 --- a/packages/kilo-ui/src/components/icon-button.tsx +++ b/packages/kilo-ui/src/components/icon-button.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/icon-button" diff --git a/packages/kilo-ui/src/components/icon.tsx b/packages/kilo-ui/src/components/icon.tsx index d24cf0e8dfc..90f437ca620 100644 --- a/packages/kilo-ui/src/components/icon.tsx +++ b/packages/kilo-ui/src/components/icon.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/icon" diff --git a/packages/kilo-ui/src/components/image-preview.tsx b/packages/kilo-ui/src/components/image-preview.tsx index 1fa59a41ea4..eefd941abe0 100644 --- a/packages/kilo-ui/src/components/image-preview.tsx +++ b/packages/kilo-ui/src/components/image-preview.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/image-preview" diff --git a/packages/kilo-ui/src/components/inline-input.css b/packages/kilo-ui/src/components/inline-input.css index 377383066fa..a17e6b354b6 100644 --- a/packages/kilo-ui/src/components/inline-input.css +++ b/packages/kilo-ui/src/components/inline-input.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Inline Input overrides */ [data-component="inline-input"] { diff --git a/packages/kilo-ui/src/components/inline-input.tsx b/packages/kilo-ui/src/components/inline-input.tsx index 1824fb0ce7a..8d92fb70b88 100644 --- a/packages/kilo-ui/src/components/inline-input.tsx +++ b/packages/kilo-ui/src/components/inline-input.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/inline-input" diff --git a/packages/kilo-ui/src/components/keybind.tsx b/packages/kilo-ui/src/components/keybind.tsx index 3a03af48f14..091a3c16e68 100644 --- a/packages/kilo-ui/src/components/keybind.tsx +++ b/packages/kilo-ui/src/components/keybind.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/keybind" diff --git a/packages/kilo-ui/src/components/line-comment.tsx b/packages/kilo-ui/src/components/line-comment.tsx index 439c6e9776e..5d778dfcbdf 100644 --- a/packages/kilo-ui/src/components/line-comment.tsx +++ b/packages/kilo-ui/src/components/line-comment.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/line-comment" diff --git a/packages/kilo-ui/src/components/list.css b/packages/kilo-ui/src/components/list.css index cdf44c888a3..8722cc81d89 100644 --- a/packages/kilo-ui/src/components/list.css +++ b/packages/kilo-ui/src/components/list.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo List overrides โ€“ styled to match legacy SelectDropdown items */ [data-component="list"] { diff --git a/packages/kilo-ui/src/components/list.tsx b/packages/kilo-ui/src/components/list.tsx index 1e52535838e..f0a09cf8a5d 100644 --- a/packages/kilo-ui/src/components/list.tsx +++ b/packages/kilo-ui/src/components/list.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/list" diff --git a/packages/kilo-ui/src/components/logo.tsx b/packages/kilo-ui/src/components/logo.tsx index 06ed609630a..05614ed1ecc 100644 --- a/packages/kilo-ui/src/components/logo.tsx +++ b/packages/kilo-ui/src/components/logo.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/logo" diff --git a/packages/kilo-ui/src/components/markdown.tsx b/packages/kilo-ui/src/components/markdown.tsx index 84fa665cd46..b40570c287f 100644 --- a/packages/kilo-ui/src/components/markdown.tsx +++ b/packages/kilo-ui/src/components/markdown.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/markdown" diff --git a/packages/kilo-ui/src/components/message-nav.tsx b/packages/kilo-ui/src/components/message-nav.tsx index 17321685d9b..71ae819e25a 100644 --- a/packages/kilo-ui/src/components/message-nav.tsx +++ b/packages/kilo-ui/src/components/message-nav.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/message-nav" diff --git a/packages/kilo-ui/src/components/message-part.css b/packages/kilo-ui/src/components/message-part.css index 83e43050307..063a52330f8 100644 --- a/packages/kilo-ui/src/components/message-part.css +++ b/packages/kilo-ui/src/components/message-part.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Message Part overrides */ [data-component="text-part"] { diff --git a/packages/kilo-ui/src/components/message-part.tsx b/packages/kilo-ui/src/components/message-part.tsx index a7dedd50c45..5b83670bb08 100644 --- a/packages/kilo-ui/src/components/message-part.tsx +++ b/packages/kilo-ui/src/components/message-part.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/message-part" diff --git a/packages/kilo-ui/src/components/message-row.css b/packages/kilo-ui/src/components/message-row.css index 7afdcf77847..57cb7bdd442 100644 --- a/packages/kilo-ui/src/components/message-row.css +++ b/packages/kilo-ui/src/components/message-row.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Message Row overrides */ [data-component="message-row"] { diff --git a/packages/kilo-ui/src/components/model-info-card.css b/packages/kilo-ui/src/components/model-info-card.css index 53f1aada78b..b8cd8c5bbd5 100644 --- a/packages/kilo-ui/src/components/model-info-card.css +++ b/packages/kilo-ui/src/components/model-info-card.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Model Info Card overrides โ€“ harmonized with @vscode/webview-ui-toolkit */ [data-component="model-info-card"] { diff --git a/packages/kilo-ui/src/components/model-selector.css b/packages/kilo-ui/src/components/model-selector.css index 1ba023e1ab4..89cf891532e 100644 --- a/packages/kilo-ui/src/components/model-selector.css +++ b/packages/kilo-ui/src/components/model-selector.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Model Selector Popover overrides โ€“ styled to match VSCode look */ /* ModelSelectorPopover content panel */ diff --git a/packages/kilo-ui/src/components/popover.css b/packages/kilo-ui/src/components/popover.css index e7f68707ef8..396a0b59923 100644 --- a/packages/kilo-ui/src/components/popover.css +++ b/packages/kilo-ui/src/components/popover.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Popover overrides */ [data-component="popover-content"] { diff --git a/packages/kilo-ui/src/components/popover.tsx b/packages/kilo-ui/src/components/popover.tsx index 9b39440d009..ce3ce7e577c 100644 --- a/packages/kilo-ui/src/components/popover.tsx +++ b/packages/kilo-ui/src/components/popover.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/popover" diff --git a/packages/kilo-ui/src/components/progress-circle.tsx b/packages/kilo-ui/src/components/progress-circle.tsx index 7407415ec9a..20e60f51f06 100644 --- a/packages/kilo-ui/src/components/progress-circle.tsx +++ b/packages/kilo-ui/src/components/progress-circle.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/progress-circle" diff --git a/packages/kilo-ui/src/components/prompt-input.css b/packages/kilo-ui/src/components/prompt-input.css index 1d258ae35d8..32c70da1939 100644 --- a/packages/kilo-ui/src/components/prompt-input.css +++ b/packages/kilo-ui/src/components/prompt-input.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Prompt Input overrides โ€“ styled to match legacy ChatTextArea look */ /* Form wrapper: VS Code native input look instead of pill shape */ diff --git a/packages/kilo-ui/src/components/provider-icon.tsx b/packages/kilo-ui/src/components/provider-icon.tsx index 0eea53f910e..da73096897e 100644 --- a/packages/kilo-ui/src/components/provider-icon.tsx +++ b/packages/kilo-ui/src/components/provider-icon.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/provider-icon" diff --git a/packages/kilo-ui/src/components/provider-icons/types.ts b/packages/kilo-ui/src/components/provider-icons/types.ts index bebc368086d..9aecae767db 100644 --- a/packages/kilo-ui/src/components/provider-icons/types.ts +++ b/packages/kilo-ui/src/components/provider-icons/types.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/icons/provider" diff --git a/packages/kilo-ui/src/components/radio-group.tsx b/packages/kilo-ui/src/components/radio-group.tsx index 8015b496f6e..89acd568698 100644 --- a/packages/kilo-ui/src/components/radio-group.tsx +++ b/packages/kilo-ui/src/components/radio-group.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/radio-group" diff --git a/packages/kilo-ui/src/components/resize-handle.tsx b/packages/kilo-ui/src/components/resize-handle.tsx index 39ae38b86ab..d6211237adb 100644 --- a/packages/kilo-ui/src/components/resize-handle.tsx +++ b/packages/kilo-ui/src/components/resize-handle.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/resize-handle" diff --git a/packages/kilo-ui/src/components/select.css b/packages/kilo-ui/src/components/select.css index b4a8f691609..006ebc262ca 100644 --- a/packages/kilo-ui/src/components/select.css +++ b/packages/kilo-ui/src/components/select.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Select overrides โ€“ styled to match legacy SelectDropdown look */ /* Select trigger (renders as a Button, override the button sizing) */ diff --git a/packages/kilo-ui/src/components/select.tsx b/packages/kilo-ui/src/components/select.tsx index 7b4aa81efde..d4a6c72f2cb 100644 --- a/packages/kilo-ui/src/components/select.tsx +++ b/packages/kilo-ui/src/components/select.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/select" diff --git a/packages/kilo-ui/src/components/session-review.tsx b/packages/kilo-ui/src/components/session-review.tsx index 32526449841..ae260216c3d 100644 --- a/packages/kilo-ui/src/components/session-review.tsx +++ b/packages/kilo-ui/src/components/session-review.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/session-review" diff --git a/packages/kilo-ui/src/components/session-turn.tsx b/packages/kilo-ui/src/components/session-turn.tsx index 842d3ac7e67..b267a716e2d 100644 --- a/packages/kilo-ui/src/components/session-turn.tsx +++ b/packages/kilo-ui/src/components/session-turn.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/session-turn" diff --git a/packages/kilo-ui/src/components/settings-sidebar.css b/packages/kilo-ui/src/components/settings-sidebar.css index aca96b92346..607da9661ae 100644 --- a/packages/kilo-ui/src/components/settings-sidebar.css +++ b/packages/kilo-ui/src/components/settings-sidebar.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Settings Sidebar overrides */ [data-component="settings-sidebar"] { diff --git a/packages/kilo-ui/src/components/spinner.tsx b/packages/kilo-ui/src/components/spinner.tsx index 8163d16dd56..8c2a5867558 100644 --- a/packages/kilo-ui/src/components/spinner.tsx +++ b/packages/kilo-ui/src/components/spinner.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/spinner" diff --git a/packages/kilo-ui/src/components/status-indicator.css b/packages/kilo-ui/src/components/status-indicator.css index 669dd7c43ba..b8bdfec65dd 100644 --- a/packages/kilo-ui/src/components/status-indicator.css +++ b/packages/kilo-ui/src/components/status-indicator.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Status Indicators overrides */ [data-component="status-indicator"] { diff --git a/packages/kilo-ui/src/components/sticky-accordion-header.tsx b/packages/kilo-ui/src/components/sticky-accordion-header.tsx index 697618deb59..a5cc4ce3949 100644 --- a/packages/kilo-ui/src/components/sticky-accordion-header.tsx +++ b/packages/kilo-ui/src/components/sticky-accordion-header.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/sticky-accordion-header" diff --git a/packages/kilo-ui/src/components/switch.css b/packages/kilo-ui/src/components/switch.css index c53d02b2079..3317a530b91 100644 --- a/packages/kilo-ui/src/components/switch.css +++ b/packages/kilo-ui/src/components/switch.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Switch overrides */ [data-component="switch"] { diff --git a/packages/kilo-ui/src/components/switch.tsx b/packages/kilo-ui/src/components/switch.tsx index d8277299d6f..ffdc396d7df 100644 --- a/packages/kilo-ui/src/components/switch.tsx +++ b/packages/kilo-ui/src/components/switch.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/switch" diff --git a/packages/kilo-ui/src/components/tabs.css b/packages/kilo-ui/src/components/tabs.css index e6065e6c4c6..15835b78760 100644 --- a/packages/kilo-ui/src/components/tabs.css +++ b/packages/kilo-ui/src/components/tabs.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Tabs overrides โ€“ sized to match @vscode/webview-ui-toolkit panels */ [data-component="tabs"] { diff --git a/packages/kilo-ui/src/components/tabs.tsx b/packages/kilo-ui/src/components/tabs.tsx index 38b5db328f6..f65d4ee49df 100644 --- a/packages/kilo-ui/src/components/tabs.tsx +++ b/packages/kilo-ui/src/components/tabs.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/tabs" diff --git a/packages/kilo-ui/src/components/tag.css b/packages/kilo-ui/src/components/tag.css index a3fb79d4841..416c7a08072 100644 --- a/packages/kilo-ui/src/components/tag.css +++ b/packages/kilo-ui/src/components/tag.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Tag (maps to legacy Badge) overrides โ€“ sized to match @vscode/webview-ui-toolkit */ [data-component="tag"], diff --git a/packages/kilo-ui/src/components/tag.tsx b/packages/kilo-ui/src/components/tag.tsx index d88119b77de..7019bc03352 100644 --- a/packages/kilo-ui/src/components/tag.tsx +++ b/packages/kilo-ui/src/components/tag.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/tag" diff --git a/packages/kilo-ui/src/components/task-header.css b/packages/kilo-ui/src/components/task-header.css index e87afed2ff7..df7ddc96766 100644 --- a/packages/kilo-ui/src/components/task-header.css +++ b/packages/kilo-ui/src/components/task-header.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Task Header overrides */ [data-component="task-header"] { diff --git a/packages/kilo-ui/src/components/text-field.css b/packages/kilo-ui/src/components/text-field.css index 12be2757517..31f64c0ea89 100644 --- a/packages/kilo-ui/src/components/text-field.css +++ b/packages/kilo-ui/src/components/text-field.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Input / TextField overrides โ€“ sized to match @vscode/webview-ui-toolkit */ [data-component="input"] { diff --git a/packages/kilo-ui/src/components/text-field.tsx b/packages/kilo-ui/src/components/text-field.tsx index dc94f876621..f99db50c3c1 100644 --- a/packages/kilo-ui/src/components/text-field.tsx +++ b/packages/kilo-ui/src/components/text-field.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/text-field" diff --git a/packages/kilo-ui/src/components/toast.css b/packages/kilo-ui/src/components/toast.css index f45c7565830..3645b3b95c9 100644 --- a/packages/kilo-ui/src/components/toast.css +++ b/packages/kilo-ui/src/components/toast.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Toast overrides โ€“ harmonized with @vscode/webview-ui-toolkit */ [data-component="toast"] { diff --git a/packages/kilo-ui/src/components/toast.tsx b/packages/kilo-ui/src/components/toast.tsx index 8f077174133..7e65ea33d9e 100644 --- a/packages/kilo-ui/src/components/toast.tsx +++ b/packages/kilo-ui/src/components/toast.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/toast" diff --git a/packages/kilo-ui/src/components/tooltip.css b/packages/kilo-ui/src/components/tooltip.css index 90fd285f469..f2c6f81a133 100644 --- a/packages/kilo-ui/src/components/tooltip.css +++ b/packages/kilo-ui/src/components/tooltip.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Kilo Tooltip overrides โ€“ sized to match @vscode/webview-ui-toolkit */ [data-component="tooltip"] { diff --git a/packages/kilo-ui/src/components/tooltip.tsx b/packages/kilo-ui/src/components/tooltip.tsx index 3c9dc669c1e..a1479303c2b 100644 --- a/packages/kilo-ui/src/components/tooltip.tsx +++ b/packages/kilo-ui/src/components/tooltip.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/tooltip" diff --git a/packages/kilo-ui/src/components/typewriter.tsx b/packages/kilo-ui/src/components/typewriter.tsx index 410fe1832b8..3e96e08f51b 100644 --- a/packages/kilo-ui/src/components/typewriter.tsx +++ b/packages/kilo-ui/src/components/typewriter.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/typewriter" diff --git a/packages/kilo-ui/src/context/code.tsx b/packages/kilo-ui/src/context/code.tsx index 98f1e351394..587f40b77a6 100644 --- a/packages/kilo-ui/src/context/code.tsx +++ b/packages/kilo-ui/src/context/code.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/context/code" diff --git a/packages/kilo-ui/src/context/data.tsx b/packages/kilo-ui/src/context/data.tsx index bf4843765d0..3f06c8ee64c 100644 --- a/packages/kilo-ui/src/context/data.tsx +++ b/packages/kilo-ui/src/context/data.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/context/data" diff --git a/packages/kilo-ui/src/context/dialog.tsx b/packages/kilo-ui/src/context/dialog.tsx index 18338bd44e5..7c2d2e23628 100644 --- a/packages/kilo-ui/src/context/dialog.tsx +++ b/packages/kilo-ui/src/context/dialog.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/context/dialog" diff --git a/packages/kilo-ui/src/context/diff.tsx b/packages/kilo-ui/src/context/diff.tsx index be53aa52cf6..41103ee61ff 100644 --- a/packages/kilo-ui/src/context/diff.tsx +++ b/packages/kilo-ui/src/context/diff.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/context/diff" diff --git a/packages/kilo-ui/src/context/helper.tsx b/packages/kilo-ui/src/context/helper.tsx index 84de698a098..d5b5c7450d6 100644 --- a/packages/kilo-ui/src/context/helper.tsx +++ b/packages/kilo-ui/src/context/helper.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/context/helper" diff --git a/packages/kilo-ui/src/context/i18n.tsx b/packages/kilo-ui/src/context/i18n.tsx index 4f655945a5f..63588e2affa 100644 --- a/packages/kilo-ui/src/context/i18n.tsx +++ b/packages/kilo-ui/src/context/i18n.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/context/i18n" diff --git a/packages/kilo-ui/src/context/index.ts b/packages/kilo-ui/src/context/index.ts index a2f821520d7..87374300894 100644 --- a/packages/kilo-ui/src/context/index.ts +++ b/packages/kilo-ui/src/context/index.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/context" diff --git a/packages/kilo-ui/src/context/marked.tsx b/packages/kilo-ui/src/context/marked.tsx index e8adc0851ed..1ef709617c7 100644 --- a/packages/kilo-ui/src/context/marked.tsx +++ b/packages/kilo-ui/src/context/marked.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/context/marked" diff --git a/packages/kilo-ui/src/context/worker-pool.tsx b/packages/kilo-ui/src/context/worker-pool.tsx index babe6ea5a5b..263c05d9b4d 100644 --- a/packages/kilo-ui/src/context/worker-pool.tsx +++ b/packages/kilo-ui/src/context/worker-pool.tsx @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/context/worker-pool" diff --git a/packages/kilo-ui/src/hooks/index.ts b/packages/kilo-ui/src/hooks/index.ts index 8868ba7737c..c3b66ced39d 100644 --- a/packages/kilo-ui/src/hooks/index.ts +++ b/packages/kilo-ui/src/hooks/index.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/hooks" diff --git a/packages/kilo-ui/src/i18n/ar.ts b/packages/kilo-ui/src/i18n/ar.ts index 0e316b5369c..e0f874ac934 100644 --- a/packages/kilo-ui/src/i18n/ar.ts +++ b/packages/kilo-ui/src/i18n/ar.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/i18n/ar" diff --git a/packages/kilo-ui/src/i18n/br.ts b/packages/kilo-ui/src/i18n/br.ts index c44df1799aa..f3d4075c2fc 100644 --- a/packages/kilo-ui/src/i18n/br.ts +++ b/packages/kilo-ui/src/i18n/br.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/i18n/br" diff --git a/packages/kilo-ui/src/i18n/bs.ts b/packages/kilo-ui/src/i18n/bs.ts index a006a31d609..6e3a89546a2 100644 --- a/packages/kilo-ui/src/i18n/bs.ts +++ b/packages/kilo-ui/src/i18n/bs.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/i18n/bs" diff --git a/packages/kilo-ui/src/i18n/da.ts b/packages/kilo-ui/src/i18n/da.ts index ed2d8fdd367..42504eabefa 100644 --- a/packages/kilo-ui/src/i18n/da.ts +++ b/packages/kilo-ui/src/i18n/da.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/i18n/da" diff --git a/packages/kilo-ui/src/i18n/de.ts b/packages/kilo-ui/src/i18n/de.ts index d3bbfcae3f9..8e0b7feacce 100644 --- a/packages/kilo-ui/src/i18n/de.ts +++ b/packages/kilo-ui/src/i18n/de.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/i18n/de" diff --git a/packages/kilo-ui/src/i18n/en.ts b/packages/kilo-ui/src/i18n/en.ts index 62e59eb1ea7..ade8a9d7c05 100644 --- a/packages/kilo-ui/src/i18n/en.ts +++ b/packages/kilo-ui/src/i18n/en.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/i18n/en" diff --git a/packages/kilo-ui/src/i18n/es.ts b/packages/kilo-ui/src/i18n/es.ts index 97bb39cf0f6..20145b49382 100644 --- a/packages/kilo-ui/src/i18n/es.ts +++ b/packages/kilo-ui/src/i18n/es.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/i18n/es" diff --git a/packages/kilo-ui/src/i18n/fr.ts b/packages/kilo-ui/src/i18n/fr.ts index 4904a991439..1a1545020b4 100644 --- a/packages/kilo-ui/src/i18n/fr.ts +++ b/packages/kilo-ui/src/i18n/fr.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/i18n/fr" diff --git a/packages/kilo-ui/src/i18n/ja.ts b/packages/kilo-ui/src/i18n/ja.ts index 6cb87ad6c74..093bb1ff314 100644 --- a/packages/kilo-ui/src/i18n/ja.ts +++ b/packages/kilo-ui/src/i18n/ja.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/i18n/ja" diff --git a/packages/kilo-ui/src/i18n/ko.ts b/packages/kilo-ui/src/i18n/ko.ts index cc72b7202b1..872ef7b4ff0 100644 --- a/packages/kilo-ui/src/i18n/ko.ts +++ b/packages/kilo-ui/src/i18n/ko.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/i18n/ko" diff --git a/packages/kilo-ui/src/i18n/no.ts b/packages/kilo-ui/src/i18n/no.ts index 546d316f1a1..7f1ace59299 100644 --- a/packages/kilo-ui/src/i18n/no.ts +++ b/packages/kilo-ui/src/i18n/no.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/i18n/no" diff --git a/packages/kilo-ui/src/i18n/pl.ts b/packages/kilo-ui/src/i18n/pl.ts index 3b042cb4adc..9de3e796690 100644 --- a/packages/kilo-ui/src/i18n/pl.ts +++ b/packages/kilo-ui/src/i18n/pl.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/i18n/pl" diff --git a/packages/kilo-ui/src/i18n/ru.ts b/packages/kilo-ui/src/i18n/ru.ts index cd0f90ca5f9..2eb4a1d7421 100644 --- a/packages/kilo-ui/src/i18n/ru.ts +++ b/packages/kilo-ui/src/i18n/ru.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/i18n/ru" diff --git a/packages/kilo-ui/src/i18n/th.ts b/packages/kilo-ui/src/i18n/th.ts index e6e7e5b8bfb..78e4c8bc8d8 100644 --- a/packages/kilo-ui/src/i18n/th.ts +++ b/packages/kilo-ui/src/i18n/th.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/i18n/th" diff --git a/packages/kilo-ui/src/i18n/zh.ts b/packages/kilo-ui/src/i18n/zh.ts index e0e6e988680..5402471a979 100644 --- a/packages/kilo-ui/src/i18n/zh.ts +++ b/packages/kilo-ui/src/i18n/zh.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/i18n/zh" diff --git a/packages/kilo-ui/src/i18n/zht.ts b/packages/kilo-ui/src/i18n/zht.ts index 5a0328f9d7e..ba349b97d7e 100644 --- a/packages/kilo-ui/src/i18n/zht.ts +++ b/packages/kilo-ui/src/i18n/zht.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/i18n/zht" diff --git a/packages/kilo-ui/src/index.ts b/packages/kilo-ui/src/index.ts index 26c2b6a527d..3c6cc4b296c 100644 --- a/packages/kilo-ui/src/index.ts +++ b/packages/kilo-ui/src/index.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file // // @kilocode/kilo-ui // diff --git a/packages/kilo-ui/src/pierre/index.ts b/packages/kilo-ui/src/pierre/index.ts index 18f34e32023..ad2f1af9066 100644 --- a/packages/kilo-ui/src/pierre/index.ts +++ b/packages/kilo-ui/src/pierre/index.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/pierre" diff --git a/packages/kilo-ui/src/pierre/worker.ts b/packages/kilo-ui/src/pierre/worker.ts index 3c52cad72f1..31892568975 100644 --- a/packages/kilo-ui/src/pierre/worker.ts +++ b/packages/kilo-ui/src/pierre/worker.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/pierre/worker" diff --git a/packages/kilo-ui/src/styles/globals.css b/packages/kilo-ui/src/styles/globals.css index 15548a41e14..b995c31af2f 100644 --- a/packages/kilo-ui/src/styles/globals.css +++ b/packages/kilo-ui/src/styles/globals.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* * Kilo UI Global Overrides * diff --git a/packages/kilo-ui/src/styles/index.css b/packages/kilo-ui/src/styles/index.css index 575d6f05abe..70b0b2efb28 100644 --- a/packages/kilo-ui/src/styles/index.css +++ b/packages/kilo-ui/src/styles/index.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Wraps upstream styles and adds Kilo overrides */ @import "@opencode-ai/ui/styles"; diff --git a/packages/kilo-ui/src/styles/tailwind/index.css b/packages/kilo-ui/src/styles/tailwind/index.css index 5d62771ac66..c5e6aae4f02 100644 --- a/packages/kilo-ui/src/styles/tailwind/index.css +++ b/packages/kilo-ui/src/styles/tailwind/index.css @@ -1,4 +1,3 @@ -/* kilocode_change - new file */ /* Wraps upstream tailwind styles and adds Kilo overrides */ @import "@opencode-ai/ui/styles/tailwind"; diff --git a/packages/kilo-ui/src/theme/color.ts b/packages/kilo-ui/src/theme/color.ts index 7fda95ebe55..bd77d4fee4a 100644 --- a/packages/kilo-ui/src/theme/color.ts +++ b/packages/kilo-ui/src/theme/color.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/theme/color" diff --git a/packages/kilo-ui/src/theme/context.tsx b/packages/kilo-ui/src/theme/context.tsx index 79168f684cc..e54c99ead3b 100644 --- a/packages/kilo-ui/src/theme/context.tsx +++ b/packages/kilo-ui/src/theme/context.tsx @@ -1,4 +1,3 @@ -// kilocode_change - new file // Copy of @opencode-ai/ui/theme/context.tsx with two changes: // 1. Imports DEFAULT_THEMES from our local default-themes (which includes Kilo themes) // 2. Default theme changed from "oc-1" to "kilo" @@ -11,7 +10,7 @@ import { createSimpleContext } from "@opencode-ai/ui/context/helper" export type ColorScheme = "light" | "dark" | "system" -const DEFAULT_THEME_ID = "kilo" // kilocode_change: was "oc-1" +const DEFAULT_THEME_ID = "kilo" const STORAGE_KEYS = { THEME_ID: "opencode-theme-id", @@ -77,7 +76,7 @@ export const { use: useTheme, provider: ThemeProvider } = createSimpleContext({ init: (props: { defaultTheme?: string }) => { const [store, setStore] = createStore({ themes: DEFAULT_THEMES as Record, - themeId: props.defaultTheme ?? DEFAULT_THEME_ID, // kilocode_change: was "oc-1" + themeId: props.defaultTheme ?? DEFAULT_THEME_ID, colorScheme: "system" as ColorScheme, mode: getSystemMode(), previewThemeId: null as string | null, diff --git a/packages/kilo-ui/src/theme/default-themes.ts b/packages/kilo-ui/src/theme/default-themes.ts index 850777b4851..a048d4e5e4f 100644 --- a/packages/kilo-ui/src/theme/default-themes.ts +++ b/packages/kilo-ui/src/theme/default-themes.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file import type { DesktopTheme } from "@opencode-ai/ui/theme/types" import { DEFAULT_THEMES as UPSTREAM_THEMES } from "@opencode-ai/ui/theme/default-themes" import kiloJson from "./themes/kilo.json" diff --git a/packages/kilo-ui/src/theme/index.ts b/packages/kilo-ui/src/theme/index.ts index 23759871b77..995377cbe96 100644 --- a/packages/kilo-ui/src/theme/index.ts +++ b/packages/kilo-ui/src/theme/index.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file export type { DesktopTheme, ThemeSeedColors, diff --git a/packages/kilo-ui/src/theme/loader.ts b/packages/kilo-ui/src/theme/loader.ts index 6c9a4ab5683..6de61d80688 100644 --- a/packages/kilo-ui/src/theme/loader.ts +++ b/packages/kilo-ui/src/theme/loader.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/theme/loader" diff --git a/packages/kilo-ui/src/theme/resolve.ts b/packages/kilo-ui/src/theme/resolve.ts index 67036d92290..752e0dbaf66 100644 --- a/packages/kilo-ui/src/theme/resolve.ts +++ b/packages/kilo-ui/src/theme/resolve.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/theme/resolve" diff --git a/packages/kilo-ui/src/theme/types.ts b/packages/kilo-ui/src/theme/types.ts index 0f38e4b5cfe..d8620363576 100644 --- a/packages/kilo-ui/src/theme/types.ts +++ b/packages/kilo-ui/src/theme/types.ts @@ -1,2 +1 @@ -// kilocode_change - new file export * from "@opencode-ai/ui/theme/types" diff --git a/packages/kilo-vscode/src/KiloProvider.ts b/packages/kilo-vscode/src/KiloProvider.ts index 2dd78d3c777..b5f4c571c2d 100644 --- a/packages/kilo-vscode/src/KiloProvider.ts +++ b/packages/kilo-vscode/src/KiloProvider.ts @@ -1707,7 +1707,6 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper * settings from the previous version of the extension which shares the same * extension ID and "kilo-code.*" namespace. */ - // kilocode_change start private async handleResetAllSettings(): Promise { const confirmed = await vscode.window.showWarningMessage( "Reset all Kilo Code extension settings to defaults?", @@ -1735,7 +1734,6 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper this.sendBrowserSettings() this.sendNotificationSettings() } - // kilocode_change end /** * Read the current browser automation settings and push them to the webview. diff --git a/packages/kilo-vscode/src/services/cli-backend/server-manager.ts b/packages/kilo-vscode/src/services/cli-backend/server-manager.ts index 47bb423b927..3e1afb44612 100644 --- a/packages/kilo-vscode/src/services/cli-backend/server-manager.ts +++ b/packages/kilo-vscode/src/services/cli-backend/server-manager.ts @@ -68,7 +68,7 @@ export class ServerManager { KILO_SERVER_PASSWORD: password, KILO_CLIENT: "vscode", KILO_ENABLE_QUESTION_TOOL: "true", - KILOCODE_FEATURE: "vscode-extension", // kilocode_change - feature tracking + KILOCODE_FEATURE: "vscode-extension", KILO_TELEMETRY_LEVEL: vscode.env.isTelemetryEnabled ? "all" : "off", KILO_APP_NAME: "kilo-code", KILO_EDITOR_NAME: vscode.env.appName, @@ -130,7 +130,7 @@ export class ServerManager { private getCliPath(): string { // Always use the bundled binary from the extension directory - const binName = process.platform === "win32" ? "kilo.exe" : "kilo" // kilocode_change + const binName = process.platform === "win32" ? "kilo.exe" : "kilo" const cliPath = path.join(this.context.extensionPath, "bin", binName) console.log("[Kilo New] ServerManager: ๐Ÿ“ฆ Using CLI path:", cliPath) return cliPath diff --git a/packages/opencode/src/kilocode/components/dialog-kilo-auto-method.tsx b/packages/opencode/src/kilocode/components/dialog-kilo-auto-method.tsx index 12c3bf3057f..5d9643b8ef7 100644 --- a/packages/opencode/src/kilocode/components/dialog-kilo-auto-method.tsx +++ b/packages/opencode/src/kilocode/components/dialog-kilo-auto-method.tsx @@ -1,4 +1,3 @@ -// kilocode_change - Kilo Gateway TUI component /** * Custom OAuth handler for Kilo Gateway * diff --git a/packages/opencode/src/kilocode/components/dialog-kilo-notifications.tsx b/packages/opencode/src/kilocode/components/dialog-kilo-notifications.tsx index 6f7700d55ba..63657146ad5 100644 --- a/packages/opencode/src/kilocode/components/dialog-kilo-notifications.tsx +++ b/packages/opencode/src/kilocode/components/dialog-kilo-notifications.tsx @@ -1,4 +1,3 @@ -// kilocode_change - new file /** * Kilo Notifications Dialog * diff --git a/packages/opencode/src/kilocode/components/dialog-kilo-organization.tsx b/packages/opencode/src/kilocode/components/dialog-kilo-organization.tsx index 460062675b8..877ed17ddcf 100644 --- a/packages/opencode/src/kilocode/components/dialog-kilo-organization.tsx +++ b/packages/opencode/src/kilocode/components/dialog-kilo-organization.tsx @@ -1,4 +1,3 @@ -// kilocode_change - Kilo Gateway TUI component /** * Kilo Gateway Organization Selection Dialog * diff --git a/packages/opencode/src/kilocode/components/dialog-kilo-profile.tsx b/packages/opencode/src/kilocode/components/dialog-kilo-profile.tsx index 228be5a44a0..468484ed0ff 100644 --- a/packages/opencode/src/kilocode/components/dialog-kilo-profile.tsx +++ b/packages/opencode/src/kilocode/components/dialog-kilo-profile.tsx @@ -1,4 +1,3 @@ -// kilocode_change - new file /** * Kilo Gateway Profile Dialog * diff --git a/packages/opencode/src/kilocode/components/dialog-kilo-team-select.tsx b/packages/opencode/src/kilocode/components/dialog-kilo-team-select.tsx index a5868bdc2fe..2fe5c5fedac 100644 --- a/packages/opencode/src/kilocode/components/dialog-kilo-team-select.tsx +++ b/packages/opencode/src/kilocode/components/dialog-kilo-team-select.tsx @@ -1,4 +1,3 @@ -// kilocode_change - Kilo Gateway TUI component /** * Kilo Gateway Team Selection Dialog * diff --git a/packages/opencode/src/kilocode/components/kilo-news.tsx b/packages/opencode/src/kilocode/components/kilo-news.tsx index dc74da69131..6c5508de459 100644 --- a/packages/opencode/src/kilocode/components/kilo-news.tsx +++ b/packages/opencode/src/kilocode/components/kilo-news.tsx @@ -1,4 +1,3 @@ -// kilocode_change - new file /** * Kilo News Component * diff --git a/packages/opencode/src/kilocode/components/notification-banner.tsx b/packages/opencode/src/kilocode/components/notification-banner.tsx index d0df494b031..f03ddfa47a4 100644 --- a/packages/opencode/src/kilocode/components/notification-banner.tsx +++ b/packages/opencode/src/kilocode/components/notification-banner.tsx @@ -1,4 +1,3 @@ -// kilocode_change - new file /** * Kilo Notification Banner * diff --git a/packages/opencode/src/kilocode/components/tips.tsx b/packages/opencode/src/kilocode/components/tips.tsx index fcd1f3d4ae2..65218fe7043 100644 --- a/packages/opencode/src/kilocode/components/tips.tsx +++ b/packages/opencode/src/kilocode/components/tips.tsx @@ -1,4 +1,3 @@ -// kilocode_change - new file import { For } from "solid-js" import { DEFAULT_THEMES, useTheme } from "@tui/context/theme" diff --git a/packages/opencode/src/kilocode/config-injector.ts b/packages/opencode/src/kilocode/config-injector.ts index 43488791da5..9aadd7e8a3d 100644 --- a/packages/opencode/src/kilocode/config-injector.ts +++ b/packages/opencode/src/kilocode/config-injector.ts @@ -1,8 +1,8 @@ import { Config } from "../config/config" import { ModesMigrator } from "./modes-migrator" -import { RulesMigrator } from "./rules-migrator" // kilocode_change +import { RulesMigrator } from "./rules-migrator" import { WorkflowsMigrator } from "./workflows-migrator" -import { IgnoreMigrator } from "./ignore-migrator" // kilocode_change +import { IgnoreMigrator } from "./ignore-migrator" export namespace KilocodeConfigInjector { export interface InjectionResult { @@ -46,7 +46,6 @@ export namespace KilocodeConfigInjector { config.command = workflowsMigration.commands } - // kilocode_change start - Rules migration if (options.includeRules !== false) { const rulesMigration = await RulesMigrator.migrate({ projectDir: options.projectDir, @@ -60,9 +59,7 @@ export namespace KilocodeConfigInjector { config.instructions = rulesMigration.instructions } } - // kilocode_change end - // kilocode_change start - Ignore migration if (options.includeIgnore !== false) { const ignoreMigration = await IgnoreMigrator.migrate({ projectDir: options.projectDir, @@ -75,7 +72,6 @@ export namespace KilocodeConfigInjector { config.permission = mergePermissions(config.permission, ignoreMigration.permission) } } - // kilocode_change end return { configJson: JSON.stringify(config), diff --git a/packages/opencode/src/kilocode/const.ts b/packages/opencode/src/kilocode/const.ts index 8f499daee99..605c09e4f12 100644 --- a/packages/opencode/src/kilocode/const.ts +++ b/packages/opencode/src/kilocode/const.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file import { Installation } from "@/installation" diff --git a/packages/opencode/src/kilocode/enhance-prompt.ts b/packages/opencode/src/kilocode/enhance-prompt.ts index 72fd1a47d03..c6246a5a28e 100644 --- a/packages/opencode/src/kilocode/enhance-prompt.ts +++ b/packages/opencode/src/kilocode/enhance-prompt.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file import { Provider } from "@/provider/provider" import { LLM } from "@/session/llm" import { Agent } from "@/agent/agent" diff --git a/packages/opencode/src/kilocode/ignore-migrator.ts b/packages/opencode/src/kilocode/ignore-migrator.ts index 2898a94ac9d..9c1a7a8125d 100644 --- a/packages/opencode/src/kilocode/ignore-migrator.ts +++ b/packages/opencode/src/kilocode/ignore-migrator.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file import * as path from "path" import os from "os" diff --git a/packages/opencode/src/kilocode/index.ts b/packages/opencode/src/kilocode/index.ts index 261ff142c74..e1a741ca489 100644 --- a/packages/opencode/src/kilocode/index.ts +++ b/packages/opencode/src/kilocode/index.ts @@ -2,6 +2,6 @@ export { ModesMigrator } from "./modes-migrator" export { RulesMigrator } from "./rules-migrator" export { WorkflowsMigrator } from "./workflows-migrator" export { McpMigrator } from "./mcp-migrator" -export { IgnoreMigrator } from "./ignore-migrator" // kilocode_change +export { IgnoreMigrator } from "./ignore-migrator" export { KilocodeConfigInjector } from "./config-injector" export { KilocodePaths } from "./paths" diff --git a/packages/opencode/src/kilocode/modes-migrator.ts b/packages/opencode/src/kilocode/modes-migrator.ts index 8d73cb916b2..1060ec5a08f 100644 --- a/packages/opencode/src/kilocode/modes-migrator.ts +++ b/packages/opencode/src/kilocode/modes-migrator.ts @@ -23,7 +23,6 @@ export namespace ModesMigrator { } // Default modes to skip - these have native Opencode equivalents - // kilocode_change - added "build" for backward compatibility after renaming "build" to "code" const DEFAULT_MODE_SLUGS = new Set(["code", "build", "architect", "ask", "debug", "orchestrator"]) // Group to permission mapping diff --git a/packages/opencode/src/kilocode/project-id.ts b/packages/opencode/src/kilocode/project-id.ts index 0d58c246138..dee8e2e3021 100644 --- a/packages/opencode/src/kilocode/project-id.ts +++ b/packages/opencode/src/kilocode/project-id.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file import { Instance } from "@/project/instance" import path from "path" import { $ } from "bun" diff --git a/packages/opencode/src/kilocode/review/command.ts b/packages/opencode/src/kilocode/review/command.ts index 87baa024145..4022aa68272 100644 --- a/packages/opencode/src/kilocode/review/command.ts +++ b/packages/opencode/src/kilocode/review/command.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file import type { Command } from "@/command" import { Review } from "./review" diff --git a/packages/opencode/src/kilocode/review/review.ts b/packages/opencode/src/kilocode/review/review.ts index 3bf5072ef4b..4c84fbfa347 100644 --- a/packages/opencode/src/kilocode/review/review.ts +++ b/packages/opencode/src/kilocode/review/review.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file import { $ } from "bun" import { Log } from "@/util/log" import { Instance } from "@/project/instance" diff --git a/packages/opencode/src/kilocode/review/types.ts b/packages/opencode/src/kilocode/review/types.ts index f8ad7ff770d..eb4d919148a 100644 --- a/packages/opencode/src/kilocode/review/types.ts +++ b/packages/opencode/src/kilocode/review/types.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file import z from "zod" export const DiffHunk = z.object({ diff --git a/packages/opencode/src/kilocode/rules-migrator.ts b/packages/opencode/src/kilocode/rules-migrator.ts index ed5543e0497..49ee235a405 100644 --- a/packages/opencode/src/kilocode/rules-migrator.ts +++ b/packages/opencode/src/kilocode/rules-migrator.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file import * as fs from "fs/promises" import * as path from "path" diff --git a/packages/opencode/src/kilocode/workflows-migrator.ts b/packages/opencode/src/kilocode/workflows-migrator.ts index e3151e12c38..c5a709de2be 100644 --- a/packages/opencode/src/kilocode/workflows-migrator.ts +++ b/packages/opencode/src/kilocode/workflows-migrator.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file import * as fs from "fs/promises" import * as path from "path" diff --git a/packages/opencode/test/kilocode/config-injector.test.ts b/packages/opencode/test/kilocode/config-injector.test.ts index 5260e2bc90e..f762eee601f 100644 --- a/packages/opencode/test/kilocode/config-injector.test.ts +++ b/packages/opencode/test/kilocode/config-injector.test.ts @@ -109,7 +109,6 @@ describe("KilocodeConfigInjector", () => { expect(config.command["deploy"]).toBeDefined() }) - // kilocode_change start - Rules migration tests test("includes rules in config", async () => { await using tmp = await tmpdir({ init: async (dir) => { @@ -197,9 +196,7 @@ describe("KilocodeConfigInjector", () => { expect(result.warnings.some((w) => w.includes("Legacy"))).toBe(true) }) - // kilocode_change end - // kilocode_change start - Ignore migration tests test("includes ignore patterns in config", async () => { await using tmp = await tmpdir({ init: async (dir) => { @@ -283,7 +280,6 @@ describe("KilocodeConfigInjector", () => { expect(config.permission.read["*.env"]).toBe("deny") expect(config.permission.read[".env.example"]).toBe("allow") }) - // kilocode_change end }) describe("getEnvVars", () => { diff --git a/packages/opencode/test/kilocode/kilo-gateway-headers.test.ts b/packages/opencode/test/kilocode/kilo-gateway-headers.test.ts index 32050c74bf1..2700b363e52 100644 --- a/packages/opencode/test/kilocode/kilo-gateway-headers.test.ts +++ b/packages/opencode/test/kilocode/kilo-gateway-headers.test.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file import { describe, it, expect, afterEach } from "bun:test" import { buildKiloHeaders, getFeatureHeader, getEditorNameHeader } from "@kilocode/kilo-gateway" import { HEADER_FEATURE, ENV_FEATURE } from "@kilocode/kilo-gateway" diff --git a/packages/opencode/test/kilocode/model-cache-org.test.ts b/packages/opencode/test/kilocode/model-cache-org.test.ts index 9299cfa3ba5..7b70e0c8dfa 100644 --- a/packages/opencode/test/kilocode/model-cache-org.test.ts +++ b/packages/opencode/test/kilocode/model-cache-org.test.ts @@ -1,4 +1,3 @@ -// kilocode_change - new file // Regression test: OAuth accountId must flow into model fetch as kilocodeOrganizationId // When a user logs in via OAuth and selects an enterprise organization, the model fetch // should use the organization-specific endpoint, not the personal endpoint. From f1fdcc9f7e357663097c9e29785b288ff66c9eb1 Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Wed, 4 Mar 2026 11:51:29 +0100 Subject: [PATCH 47/48] Revert accidental addition of .husky/_ files --- .husky/_/post-checkout | 3 --- .husky/_/post-commit | 3 --- .husky/_/post-merge | 3 --- .husky/_/pre-push | 3 --- 4 files changed, 12 deletions(-) delete mode 100755 .husky/_/post-checkout delete mode 100755 .husky/_/post-commit delete mode 100755 .husky/_/post-merge delete mode 100755 .husky/_/pre-push diff --git a/.husky/_/post-checkout b/.husky/_/post-checkout deleted file mode 100755 index 5abf8ed93f7..00000000000 --- a/.husky/_/post-checkout +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -command -v git-lfs >/dev/null 2>&1 || { printf >&2 "\n%s\n\n" "This repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting the 'post-checkout' file in the hooks directory (set by 'core.hookspath'; usually '.git/hooks')."; exit 2; } -git lfs post-checkout "$@" diff --git a/.husky/_/post-commit b/.husky/_/post-commit deleted file mode 100755 index b8b76c2c425..00000000000 --- a/.husky/_/post-commit +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -command -v git-lfs >/dev/null 2>&1 || { printf >&2 "\n%s\n\n" "This repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting the 'post-commit' file in the hooks directory (set by 'core.hookspath'; usually '.git/hooks')."; exit 2; } -git lfs post-commit "$@" diff --git a/.husky/_/post-merge b/.husky/_/post-merge deleted file mode 100755 index 726f909891a..00000000000 --- a/.husky/_/post-merge +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -command -v git-lfs >/dev/null 2>&1 || { printf >&2 "\n%s\n\n" "This repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting the 'post-merge' file in the hooks directory (set by 'core.hookspath'; usually '.git/hooks')."; exit 2; } -git lfs post-merge "$@" diff --git a/.husky/_/pre-push b/.husky/_/pre-push deleted file mode 100755 index 5f26dc45523..00000000000 --- a/.husky/_/pre-push +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -command -v git-lfs >/dev/null 2>&1 || { printf >&2 "\n%s\n\n" "This repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting the 'pre-push' file in the hooks directory (set by 'core.hookspath'; usually '.git/hooks')."; exit 2; } -git lfs pre-push "$@" From 845f9b374d25dacde4b8ab2d1cdb53e2e9895615 Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Wed, 4 Mar 2026 11:54:59 +0100 Subject: [PATCH 48/48] chore: ignore .husky/_ directory --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b678f695639..6bd9245c08b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.husky/_ .DS_Store node_modules .worktrees