Merge pull request #13605 from Kilo-Org/investigate-code-keychain-storage-error

fix(vscode): remove unsupported legacy migration
This commit is contained in:
Marius
2026-08-31 16:09:22 +02:00
committed by GitHub
53 changed files with 594 additions and 4603 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"kilo-code": patch
---
Stop checking for unsupported legacy Kilo migrations at startup while keeping Roo Code session import available.
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:06c6cd2c2c63745d3cbaec756ae852db3ef0749c005926b75fe3eb03f06b0495
size 22169
oid sha256:1326d61e6113da8874f9c836a4d105783a8b050a4ff9648e73120a66b371fc92
size 21173
-4
View File
@@ -42,8 +42,6 @@
<!-- packages/opencode/src/plugin/xai.ts -->
- <https://blog.kilo.ai/p/kilo-gateway-now-supports-byok-20-providers>
<!-- packages/kilo-vscode/webview-ui/src/components/settings/ProviderConnectDialog.tsx -->
- <https://blog.kilo.ai/p/new-kilo-for-vs-code-is-live>
<!-- packages/kilo-vscode/webview-ui/src/components/migration/MigrationWizard.tsx -->
- <https://chatgpt.com/explore/plus>
<!-- packages/opencode/src/provider/error.ts -->
- <https://cli.github.com/>
@@ -138,8 +136,6 @@
<!-- packages/kilo-vscode/webview-ui/src/components/marketplace/InstallModal.tsx -->
- <https://kilo.ai/docs/code-with-ai/platforms/github>
<!-- packages/opencode/src/cli/cmd/github.handler.ts -->
- <https://kilo.ai/docs/code-with-ai/platforms/vscode/whats-new>
<!-- packages/kilo-vscode/webview-ui/src/components/migration/MigrationWizard.tsx -->
- <https://kilo.ai/docs/customize/marketplace>
<!-- packages/kilo-vscode/webview-ui/src/components/marketplace/InstallModal.tsx -->
<!-- packages/kilo-vscode/webview-ui/src/components/marketplace/MarketplaceListView.tsx -->
-5
View File
@@ -196,11 +196,6 @@
"title": "Show Changes",
"category": "Kilo Code"
},
{
"command": "kilo-code.new.openMigrationWizard",
"title": "Migrate Settings from Legacy Version",
"category": "Kilo Code"
},
{
"command": "kilo-code.new.showMemory",
"title": "Show Project Memory",
+3 -58
View File
@@ -104,19 +104,13 @@ import {
import * as McpOAuth from "./kilo-provider/mcp-oauth"
import { retryable, backoff, MAX_RETRIES } from "./util/retry"
import { hasGit } from "./kilo-provider/git-status"
// legacy-migration start
import {
checkAndShowMigrationWizard,
handleRequestMigrationData,
handleStartMigration,
handleFinalizeLegacyMigration,
handleSkipLegacyMigration,
handleClearLegacyData,
type MigrationContext,
type MigrationSource,
} from "./kilo-provider/handlers/migration"
import type { MigrationSelections } from "./legacy-migration/legacy-types"
// legacy-migration end
import {
handleLogin,
handleLogout,
@@ -445,16 +439,12 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
})
private unsubscribeEvent: (() => void) | null = null
private unsubscribeState: (() => void) | null = null
/** Cached migration data so migration doesn't re-read from disk/SecretStorage. */ // legacy-migration
private migrationCache: MigrationContext["migrationCache"] = new Map()
/** Guard to prevent checkAndShowMigrationWizard running concurrently. */ // legacy-migration
private migrationCheckInFlight = false // legacy-migration
private unsubscribeNotificationDismiss: (() => void) | null = null
private unsubscribeLanguageChange: (() => void) | null = null
private unsubscribeProfileChange: (() => void) | null = null
private unsubscribeFavoritesChange: (() => void) | null = null
private unsubscribeModelSelectorExpanded: (() => void) | null = null
private unsubscribeMigrationComplete: (() => void) | null = null // legacy-migration
private unsubscribeClearPendingPrompts: (() => void) | null = null
private unsubscribeDirectoryProvider: (() => void) | null = null
private unsubscribeSandboxPreference: (() => void) | null = null
@@ -760,18 +750,6 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
this.sendRemoteStatus()
}
// legacy-migration start
// Show the migration wizard once the CLI connection is established.
// Three triggers cover all timing scenarios:
// "webviewReady" + connected — webview loaded after SSE was already up
// "sse-connected" — SSE connected after webview was ready
// "initializeConnection" — sidebar path where connect() resolves before
// onStateChange is subscribed, so sse-connected never fires
if (this.connectionState === "connected") {
void checkAndShowMigrationWizard(this.migrationCtx)
}
// legacy-migration end
}
public resolveWebviewView(
@@ -1126,7 +1104,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
if (this.handleChildSyncMessage(message)) return
if (await this.handleMemoryMessage(message)) return
if (await this.handleProfileDataMessage(message)) return
if (this.handleLegacyMigrationMessage(message)) return
if (this.handleMigrationMessage(message)) return
switch (message.type) {
case "webviewReady":
console.log("[Kilo New] KiloProvider: ✅ webviewReady received")
@@ -1708,8 +1686,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
return false
}
// legacy-migration start
private handleLegacyMigrationMessage(message: { type: string }): boolean {
private handleMigrationMessage(message: { type: string }): boolean {
switch (message.type) {
case "requestMigrationData": {
const msg = message as unknown as { source: MigrationSource; operationId: string }
@@ -1725,21 +1702,11 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
void handleStartMigration(this.migrationCtx, msg.source, msg.operationId, msg.selections)
break
}
case "skipLegacyMigration":
void handleSkipLegacyMigration(this.migrationCtx)
break
case "clearLegacyData":
void handleClearLegacyData(this.migrationCtx)
break
case "finalizeLegacyMigration":
void handleFinalizeLegacyMigration(this.migrationCtx)
break
default:
return false
}
return true
}
// legacy-migration end
private async toggleFavorite(message: {
action: "add" | "remove"
@@ -1904,13 +1871,6 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
this.postMessage({ type: "modelSelectorExpandedLoaded", value })
})
// legacy-migration start
// Subscribe to migration-complete broadcast from any KiloProvider instance
this.unsubscribeMigrationComplete = this.connectionService.onMigrationComplete(() => {
this.postMessage({ type: "migrationState", needed: false, source: "legacy" })
})
// legacy-migration end
// Subscribe to clear-pending-prompts broadcast (fired after config save drains prompts)
this.unsubscribeClearPendingPrompts = this.connectionService.onClearPendingPrompts(() => {
this.postMessage({ type: "clearPendingPrompts" })
@@ -5427,30 +5387,16 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
})
}
// legacy-migration start -------------------------------------------------------
// Migration handlers extracted to kilo-provider/handlers/migration.ts
private get migrationCtx(): MigrationContext {
const self = this
return {
client: this.client,
extensionContext: this.extensionContext,
postMessage: (msg) => this.postMessage(msg),
migrationCache: self.migrationCache,
get migrationCheckInFlight() {
return self.migrationCheckInFlight
},
set migrationCheckInFlight(val) {
self.migrationCheckInFlight = val
},
migrationCache: this.migrationCache,
refreshSessions: () => this.refreshSessions(),
disposeGlobal: () => this.disposeGlobal(),
broadcastComplete: () => this.connectionService.notifyMigrationComplete(),
}
}
// legacy-migration end ---------------------------------------------------------
// ── Worktree stats polling (sidebar diff badge) ──────────────────
private startStatsPolling(): void {
if (this.opts.disableStatsPolling) return
@@ -5502,7 +5448,6 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
this.unsubscribeProfileChange?.()
this.unsubscribeFavoritesChange?.()
this.unsubscribeModelSelectorExpanded?.()
this.unsubscribeMigrationComplete?.()
this.unsubscribeClearPendingPrompts?.()
this.unsubscribeDirectoryProvider?.()
this.unsubscribeSandboxPreference?.()
-5
View File
@@ -472,11 +472,6 @@ export async function activate(context: vscode.ExtensionContext) {
await target.waitForReady()
await target.toggleMemory()
}),
// legacy-migration start
vscode.commands.registerCommand("kilo-code.new.openMigrationWizard", () => {
provider.postMessage({ type: "migrationState", needed: true, source: "legacy" })
}),
// legacy-migration end
vscode.commands.registerCommand("kilo-code.new.generateTerminalCommand", async () => {
const input = await vscode.window.showInputBox({
prompt: "Describe the terminal command you want to generate",
@@ -1,54 +1,27 @@
/**
* Legacy migration handlers — extracted from KiloProvider.
*
* Manages the migration wizard for users upgrading from Kilo Code v5.x.
* VS Code access is limited to migration service helpers and injected context.
*/
import type { KiloClient } from "@kilocode/sdk/v2/client"
import type {
LegacyMigrationData,
MigrationSelections,
MigrationSessionProgress,
MigrationSessionSelection,
} from "../../legacy-migration/legacy-types"
import * as MigrationService from "../../legacy-migration/migration-service"
import { runSessionBatch } from "../../legacy-migration/session-batch"
import { migrate as migrateSession } from "../../legacy-migration/sessions/migrate"
import { resolveSession } from "../../legacy-migration/task-store"
import { detectRooCodeSessions, type RooImportSource } from "../../roo-import/service"
/** Subset of vscode.ExtensionContext needed by migration handlers. */
interface MigrationExtensionContext {
globalState: {
get<T>(key: string): T | undefined
get<T>(key: string, defaultValue: T): T
update(key: string, value: unknown): PromiseLike<void>
}
secrets: {
get(key: string): PromiseLike<string | undefined>
store(key: string, value: string): PromiseLike<void>
delete(key: string): PromiseLike<void>
}
globalStorageUri: { fsPath: string }
}
export type MigrationSource = "legacy" | "roo"
export type MigrationCacheEntry =
| { operationId: string; source: "legacy"; data: LegacyMigrationData }
| { operationId: string; source: "roo"; data: RooImportSource | null }
export type MigrationSource = "roo"
export type MigrationCacheEntry = { operationId: string; source: "roo"; data: RooImportSource | null }
export type MigrationCache = Map<string, MigrationCacheEntry>
export function getMigrationCache(
cache: MigrationCache,
source: "legacy",
operationId: string,
): Extract<MigrationCacheEntry, { source: "legacy" }> | undefined
export function getMigrationCache(
cache: MigrationCache,
source: "roo",
operationId: string,
): Extract<MigrationCacheEntry, { source: "roo" }> | undefined
export function getMigrationCache(cache: MigrationCache, source: MigrationSource, operationId: string) {
const entry = cache.get(operationId)
return entry?.source === source ? entry : undefined
@@ -60,31 +33,12 @@ export interface MigrationContext {
postMessage(msg: unknown): void
refreshSessions(): void
migrationCache: MigrationCache
migrationCheckInFlight: boolean
lastMigrationHadErrors?: boolean
disposeGlobal(): Promise<void>
broadcastComplete(): void
}
function emptyData(sessions: LegacyMigrationData["sessions"] = []): LegacyMigrationData {
return {
hasData: sessions.length > 0,
providers: [],
mcpServers: [],
customModes: [],
sessions,
}
}
function postSessionProgress(
ctx: MigrationContext,
source: MigrationSource,
operationId: string,
progress: MigrationSessionProgress,
): void {
function postSessionProgress(ctx: MigrationContext, operationId: string, progress: MigrationSessionProgress): void {
ctx.postMessage({
type: "migrationSessionProgress",
source,
source: "roo",
operationId,
session: progress.session,
index: progress.index,
@@ -94,74 +48,22 @@ function postSessionProgress(
})
}
/**
* Check for legacy data on first run and send migration state to the webview
* if the user has not yet been prompted.
*
* Uses a state-based approach (migrationState message) instead of navigate
* to avoid race conditions with SettingsEditorProvider's view navigation.
*/
export async function checkAndShowMigrationWizard(ctx: MigrationContext): Promise<void> {
if (!ctx.extensionContext) return
if (ctx.migrationCheckInFlight) return
// MigrationService.getMigrationStatus accepts the full ExtensionContext shape
const status = MigrationService.getMigrationStatus(
ctx.extensionContext as Parameters<typeof MigrationService.getMigrationStatus>[0],
)
if (status) return // already prompted (skipped or completed)
ctx.migrationCheckInFlight = true
const data = await MigrationService.detectLegacyData(
ctx.extensionContext as Parameters<typeof MigrationService.detectLegacyData>[0],
)
ctx.migrationCheckInFlight = false
if (!data.hasData) return
console.log("[Kilo New] KiloProvider: 🔄 Legacy data detected, showing migration wizard")
// The wizard re-requests the data via requestMigrationData on mount, so only the flag is sent here.
ctx.postMessage({
type: "migrationState",
needed: true,
source: "legacy",
})
}
/** Send migration data for the requested source to the webview. */
export async function handleRequestMigrationData(
ctx: MigrationContext,
source: MigrationSource,
operationId: string,
): Promise<void> {
if (!ctx.extensionContext) return
// A new request means a new wizard session; drop any entry from an abandoned one.
if (source !== "roo" || !ctx.extensionContext) return
for (const key of ctx.migrationCache.keys()) {
if (key !== operationId) ctx.migrationCache.delete(key)
}
const data = await (async () => {
if (source === "roo") {
const roo = await detectRooCodeSessions(ctx.extensionContext as Parameters<typeof detectRooCodeSessions>[0])
ctx.migrationCache.set(operationId, { operationId, source, data: roo })
return emptyData(roo?.sessions ?? [])
}
const legacy = await MigrationService.detectLegacyData(
ctx.extensionContext as Parameters<typeof MigrationService.detectLegacyData>[0],
)
ctx.migrationCache.set(operationId, { operationId, source, data: legacy })
return legacy
})()
const roo = await detectRooCodeSessions(ctx.extensionContext as Parameters<typeof detectRooCodeSessions>[0])
ctx.migrationCache.set(operationId, { operationId, source, data: roo })
ctx.postMessage({
type: "migrationData",
source,
operationId,
data: {
providers: data.providers,
mcpServers: data.mcpServers,
customModes: data.customModes,
sessions: data.sessions,
defaultModel: data.defaultModel,
settings: data.settings,
},
data: { sessions: roo?.sessions ?? [] },
})
}
@@ -203,98 +105,22 @@ async function startRooMigration(
onProgress: (item, status, message) => {
ctx.postMessage({ type: "migrationProgress", source: "roo", operationId, item, status, message })
},
onSessionProgress: (progress) => postSessionProgress(ctx, "roo", operationId, progress),
onSessionProgress: (progress) => postSessionProgress(ctx, operationId, progress),
})
ctx.lastMigrationHadErrors = results.some((item) => item.status === "error")
ctx.postMessage({ type: "migrationComplete", source: "roo", operationId, results })
}
/** Run the migration for the selected items. */
async function startLegacyMigration(
ctx: MigrationContext,
operationId: string,
selections: MigrationSelections,
): Promise<void> {
if (!ctx.extensionContext || !ctx.client) return
try {
const cached = getMigrationCache(ctx.migrationCache, "legacy", operationId)
const results = await MigrationService.migrate(
ctx.extensionContext as Parameters<typeof MigrationService.migrate>[0],
ctx.client,
selections,
(item, status, message) => {
ctx.postMessage({ type: "migrationProgress", source: "legacy", operationId, item, status, message })
},
(progress: MigrationSessionProgress) => {
postSessionProgress(ctx, "legacy", operationId, progress)
},
cached?.data.settings,
cached?.data.sessions,
)
ctx.lastMigrationHadErrors = results.some((item) => item.status === "error")
ctx.postMessage({ type: "migrationComplete", source: "legacy", operationId, results })
} catch (error) {
ctx.lastMigrationHadErrors = true
console.error("[Kilo New] KiloProvider: ❌ Migration failed", error)
ctx.postMessage({
type: "migrationComplete",
source: "legacy",
operationId,
results: [
{
item: "Migration",
category: "settings",
status: "error",
message: error instanceof Error ? error.message : String(error),
},
],
})
}
}
export async function handleStartMigration(
ctx: MigrationContext,
source: MigrationSource,
operationId: string,
selections: MigrationSelections,
): Promise<void> {
if (source !== "roo") return
try {
if (source === "roo") {
await startRooMigration(ctx, operationId, selections)
return
}
await startLegacyMigration(ctx, operationId, selections)
await startRooMigration(ctx, operationId, selections)
} finally {
// The operation has finished (or thrown); its cached discovery is no longer needed.
ctx.migrationCache.delete(operationId)
}
}
export async function handleFinalizeLegacyMigration(ctx: MigrationContext): Promise<void> {
if (!ctx.extensionContext) return
await ctx.disposeGlobal()
await MigrationService.setMigrationStatus(
ctx.extensionContext as Parameters<typeof MigrationService.setMigrationStatus>[0],
ctx.lastMigrationHadErrors ? "completed_with_errors" : "completed",
)
ctx.broadcastComplete()
ctx.refreshSessions()
}
/** Record that the user skipped migration and broadcast to all instances. */
export async function handleSkipLegacyMigration(ctx: MigrationContext): Promise<void> {
if (!ctx.extensionContext) return
await MigrationService.setMigrationStatus(
ctx.extensionContext as Parameters<typeof MigrationService.setMigrationStatus>[0],
"skipped",
)
ctx.broadcastComplete()
}
/** Clear legacy data from SecretStorage and globalState after user opts in. */
export async function handleClearLegacyData(ctx: MigrationContext): Promise<void> {
if (!ctx.extensionContext) return
await MigrationService.clearLegacyData(ctx.extensionContext as Parameters<typeof MigrationService.clearLegacyData>[0])
}
@@ -1,304 +1,3 @@
/**
* 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<string, LegacyProviderSettings>
modeApiConfigs?: Record<string, string>
}
/**
* 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
kilocodeOrganizationId?: 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
// NanoGPT
nanoGptApiKey?: string
nanoGptModelId?: string
// Poe
poeApiKey?: string
poeModelId?: string
// AiHubMix
aihubmixApiKey?: string
aihubmixModelId?: string
aihubmixBaseUrl?: string
// ZenMux
zenmuxApiKey?: string
zenmuxModelId?: string
zenmuxBaseUrl?: string
// Allow dynamic property access for provider-mapping lookups
[key: string]: unknown
}
// ---------------------------------------------------------------------------
// MCP settings (stored on disk at <globalStorage>/settings/mcp_settings.json)
// ---------------------------------------------------------------------------
export interface LegacyMcpSettings {
mcpServers: Record<string, LegacyMcpServer>
}
export interface LegacyMcpServer {
type?: "stdio" | "sse" | "streamable-http"
command?: string
args?: string[]
cwd?: string
url?: string
env?: Record<string, string>
headers?: Record<string, string>
disabled?: boolean
timeout?: number
}
// ---------------------------------------------------------------------------
// Autocomplete settings (stored in globalState under "ghostServiceSettings")
// ---------------------------------------------------------------------------
export interface LegacyAutocompleteSettings {
enableAutoTrigger?: boolean
enableSmartInlineTaskKeybinding?: boolean
enableChatAutocomplete?: boolean
}
// ---------------------------------------------------------------------------
// Settings (stored in VS Code globalState under "kilo-code.*" keys)
// ---------------------------------------------------------------------------
export interface LegacySettings {
autoApprovalEnabled?: boolean
allowedCommands?: string[]
deniedCommands?: string[]
// Fine-grained auto-approval (legacy globalState keys — no prefix)
alwaysAllowReadOnly?: boolean
alwaysAllowReadOnlyOutsideWorkspace?: boolean
alwaysAllowWrite?: boolean
alwaysAllowExecute?: boolean
alwaysAllowMcp?: boolean
alwaysAllowModeSwitch?: boolean
alwaysAllowSubtasks?: boolean
language?: string
autocomplete?: LegacyAutocompleteSettings
}
// ---------------------------------------------------------------------------
// Custom modes (stored on disk at <globalStorage>/settings/custom_modes.yaml)
// ---------------------------------------------------------------------------
interface LegacyCustomModesFile {
customModes: LegacyCustomMode[]
}
export interface LegacyCustomMode {
slug: string
name: string
roleDefinition: string
customInstructions?: string
whenToUse?: string
description?: string
groups: Array<string | [string, Record<string, string>]>
}
// ---------------------------------------------------------------------------
// Custom mode prompts (stored in VS Code globalState under "customModePrompts")
// ---------------------------------------------------------------------------
/** Partial prompt overrides the legacy extension stored per-mode in globalState */
export interface LegacyPromptComponent {
roleDefinition?: string
customInstructions?: string
whenToUse?: string
description?: string
}
// ---------------------------------------------------------------------------
// 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
disabled?: boolean
}
export interface MigrationCustomModeInfo {
name: string
slug: string
/** Original slug when migrating a modified native mode under a new slug */
nativeSlug?: string
}
export interface MigrationSessionInfo {
id: string
title: string
@@ -306,49 +5,13 @@ export interface MigrationSessionInfo {
time: number
}
export interface LegacyMigrationData {
providers: MigrationProviderInfo[]
mcpServers: MigrationMcpServerInfo[]
customModes: MigrationCustomModeInfo[]
sessions?: MigrationSessionInfo[]
defaultModel?: { provider: string; model: string }
settings?: LegacySettings
hasData: boolean
}
export interface MigrationAutoApprovalSelections {
/** Master toggle + command allowlist/denylist */
commandRules: boolean
/** Read permission (alwaysAllowReadOnly / alwaysAllowReadOnlyOutsideWorkspace) */
readPermission: boolean
/** Write permission (alwaysAllowWrite) */
writePermission: boolean
/** Execute permission (alwaysAllowExecute) */
executePermission: boolean
/** MCP tool permission (alwaysAllowMcp) */
mcpPermission: boolean
/** Task/subtask permission (alwaysAllowModeSwitch / alwaysAllowSubtasks) */
taskPermission: boolean
}
export interface MigrationSettingsSelections {
autoApproval: MigrationAutoApprovalSelections
language: boolean
autocomplete: boolean
}
export interface MigrationSessionSelection {
id: string
force?: boolean
}
export interface MigrationSelections {
providers: string[]
mcpServers: string[]
customModes: string[]
sessions?: MigrationSessionSelection[]
defaultModel: boolean
settings: MigrationSettingsSelections
}
export type MigrationSessionPhase = "preparing" | "storing" | "skipped" | "done" | "summary" | "error"
File diff suppressed because it is too large Load Diff
@@ -1,5 +1,5 @@
import type { MigrationSessionInfo, MigrationSessionProgress } from "./legacy-types"
import type { SessionProgressCallback } from "./migration-service"
type SessionProgressCallback = (progress: MigrationSessionProgress) => void
export interface MigrationSessionMeta {
session: MigrationSessionInfo
@@ -1,6 +1,6 @@
export interface MigrationResultItem {
item: string
category: "provider" | "mcpServer" | "customMode" | "defaultModel" | "settings" | "session"
category: "session"
status: "success" | "warning" | "error"
message?: string
}
@@ -1,91 +0,0 @@
/**
* legacy-migration - Default values for native modes from the legacy Kilo Code v5.x extension.
*
* These are the exact built-in mode definitions shipped with the legacy extension.
* They are frozen references used to detect whether a user has actually modified a
* native mode's prompts before migrating it as a custom agent.
*/
import type { LegacyCustomMode } from "./legacy-types"
/** Prompt-level fields we compare against to detect modifications */
export interface NativeModeDefaults {
name: string
roleDefinition: string
customInstructions?: string
whenToUse?: string
/** Short description shown in the UI (e.g., "Write, modify, and refactor code") */
description?: string
groups: LegacyCustomMode["groups"]
}
/**
* Built-in default values for each native mode slug from legacy Kilo Code v5.x.
* "build" is excluded because it does not exist as a legacy built-in mode.
*/
export const NATIVE_MODE_DEFAULTS: Record<string, NativeModeDefaults> = {
architect: {
name: "Architect",
roleDefinition:
"You are Kilo Code, an experienced technical leader who is inquisitive and an excellent planner. Your goal is to gather information and get context to create a detailed plan for accomplishing the user's task, which the user will review and approve before they switch into another mode to implement the solution.",
whenToUse:
"Use this mode when you need to plan, design, or strategize before implementation. Perfect for breaking down complex problems, creating technical specifications, designing system architecture, or brainstorming solutions before coding.",
description: "Plan and design before implementation",
customInstructions:
"1. Do some information gathering (using provided tools) to get more context about the task.\n\n2. You should also ask the user clarifying questions to get a better understanding of the task.\n\n3. Once you've gained more context about the user's request, break down the task into clear, actionable steps and create a todo list using the `update_todo_list` tool. Each todo item should be:\n - Specific and actionable\n - Listed in logical execution order\n - Focused on a single, well-defined outcome\n - Clear enough that another mode could execute it independently\n\n **Note:** If the `update_todo_list` tool is not available, write the plan to a markdown file (e.g., `plan.md` or `todo.md`) instead.\n\n4. As you gather more information or discover new requirements, update the todo list to reflect the current understanding of what needs to be accomplished.\n\n5. Ask the user if they are pleased with this plan, or if they would like to make any changes. Think of this as a brainstorming session where you can discuss the task and refine the todo list.\n\n6. Include Mermaid diagrams if they help clarify complex workflows or system architecture. Please avoid using double quotes (\"\") and parentheses () inside square brackets ([]) in Mermaid diagrams, as this can cause parsing errors.\n\n7. Use the switch_mode tool to request switching to another mode when you need to edit non-markdown files (like source code files: .ts, .js, .py, .java, etc.) or execute commands. You CAN directly create and edit markdown files (.md) without switching modes.\n\n**IMPORTANT: Focus on creating clear, actionable todo lists rather than lengthy markdown documents. Use the todo list as your primary planning tool to track and organize the work that needs to be done.**\n\n**CRITICAL: Never provide level of effort time estimates (e.g., hours, days, weeks) for tasks. Focus solely on breaking down the work into clear, actionable steps without estimating how long they will take.**\n\nUnless told otherwise, if you want to save a plan file, put it in the /plans directory",
groups: ["read", ["edit", { fileRegex: "\\.md$", description: "Markdown files only" }], "browser", "mcp"],
},
code: {
name: "Code",
roleDefinition:
"You are Kilo Code, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices.",
whenToUse:
"Use this mode when you need to write, modify, or refactor code. Ideal for implementing features, fixing bugs, creating new files, or making code improvements across any programming language or framework.",
description: "Write, modify, and refactor code",
groups: ["read", "edit", "browser", "command", "mcp"],
},
ask: {
name: "Ask",
roleDefinition:
"You are Kilo Code, a knowledgeable technical assistant focused on answering questions and providing information about software development, technology, and related topics.",
whenToUse:
"Use this mode when you need explanations, documentation, or answers to technical questions. Best for understanding concepts, analyzing existing code, getting recommendations, or learning about technologies without making changes.",
description: "Get answers and explanations",
customInstructions:
"You can analyze code, explain concepts, and access external resources. Always answer the user's questions thoroughly, and do not switch to implementing code unless explicitly requested by the user. Include Mermaid diagrams when they clarify your response.",
groups: ["read", "browser", "mcp"],
},
debug: {
name: "Debug",
roleDefinition:
"You are Kilo Code, an expert software debugger specializing in systematic problem diagnosis and resolution.",
whenToUse:
"Use this mode when you're troubleshooting issues, investigating errors, or diagnosing problems. Specialized in systematic debugging, adding logging, analyzing stack traces, and identifying root causes before applying fixes.",
description: "Diagnose and fix software issues",
customInstructions:
"Reflect on 5-7 different possible sources of the problem, distill those down to 1-2 most likely sources, and then add logs to validate your assumptions. Explicitly ask the user to confirm the diagnosis before fixing the problem.",
groups: ["read", "edit", "browser", "command", "mcp"],
},
orchestrator: {
name: "Orchestrator",
roleDefinition:
"You are Kilo Code, a strategic workflow orchestrator who coordinates complex tasks by delegating them to appropriate specialized modes. You have a comprehensive understanding of each mode's capabilities and limitations, allowing you to effectively break down complex problems into discrete tasks that can be solved by different specialists.",
whenToUse:
"Use this mode for complex, multi-step projects that require coordination across different specialties. Ideal when you need to break down large tasks into subtasks, manage workflows, or coordinate work that spans multiple domains or expertise areas.",
description: "Coordinate tasks across multiple modes",
customInstructions:
"Your role is to coordinate complex workflows by delegating tasks to specialized modes. As an orchestrator, you should:\n\n1. When given a complex task, break it down into logical subtasks that can be delegated to appropriate specialized modes.\n\n2. For each subtask, use the `new_task` tool to delegate. Choose the most appropriate mode for the subtask's specific goal and provide comprehensive instructions in the `message` parameter. These instructions must include:\n * All necessary context from the parent task or previous subtasks required to complete the work.\n * A clearly defined scope, specifying exactly what the subtask should accomplish.\n * An explicit statement that the subtask should *only* perform the work outlined in these instructions and not deviate.\n * An instruction for the subtask to signal completion by using the `attempt_completion` tool, providing a concise yet thorough summary of the outcome in the `result` parameter, keeping in mind that this summary will be the source of truth used to keep track of what was completed on this project.\n * A statement that these specific instructions supersede any conflicting general instructions the subtask's mode might have.\n\n3. Track and manage the progress of all subtasks. When a subtask is completed, analyze its results and determine the next steps.\n\n4. Help the user understand how the different subtasks fit together in the overall workflow. Provide clear reasoning about why you're delegating specific tasks to specific modes.\n\n5. When all subtasks are completed, synthesize the results and provide a comprehensive overview of what was accomplished.\n\n6. Ask clarifying questions when necessary to better understand how to break down complex tasks effectively.\n\n7. Suggest improvements to the workflow based on the results of completed subtasks.\n\nUse subtasks to maintain clarity. If a request significantly shifts focus or requires a different expertise (mode), consider creating a subtask rather than overloading the current one.",
groups: [],
},
review: {
name: "Review",
roleDefinition:
"You are Kilo Code, an expert code reviewer with deep expertise in software engineering best practices, security vulnerabilities, performance optimization, and code quality. Your role is advisory - provide clear, actionable feedback on code quality and potential issues.",
whenToUse:
"Use this mode when you need to review code changes. Ideal for reviewing uncommitted work before committing, comparing your branch against main/develop, or analyzing changes before merging.",
description: "Review code changes locally",
customInstructions:
'When you enter Review mode, you will receive a list of changed files. Use tools to explore the changes dynamically.\n\n## How to Review\n\n1. **Start with git diff**: Use `execute_command` to run `git diff` (for uncommitted) or `git diff <base>..HEAD` (for branch) to see the actual changes.\n\n2. **Examine specific files**: For complex changes, use `read_file` to see the full file context, not just the diff.\n\n3. **Gather history context**: Use `git log`, `git blame`, or `git show` when you need to understand why code was written a certain way.\n\n4. **Be confident**: Only flag issues where you have high confidence. Use these thresholds:\n - **CRITICAL (95%+)**: Security vulnerabilities, data loss risks, crashes, authentication bypasses\n - **WARNING (85%+)**: Bugs, logic errors, performance issues, unhandled errors\n - **SUGGESTION (75%+)**: Code quality improvements, best practices, maintainability\n - **Below 75%**: Don\'t comment - gather more context first\n\n5. **Focus on what matters**:\n - Security: Injection, auth issues, data exposure\n - Bugs: Logic errors, null handling, race conditions\n - Performance: Inefficient algorithms, memory leaks\n - Error handling: Missing try-catch, unhandled promises\n\n6. **Don\'t flag**:\n - Style preferences that don\'t affect functionality\n - Minor naming suggestions\n - Patterns that match existing codebase conventions\n\n## Output Format\n\n### Summary\n2-3 sentences describing what this change does and your overall assessment.\n\n### Issues Found\n| Severity | File:Line | Issue |\n|----------|-----------|-------|\n| CRITICAL | path/file.ts:42 | Brief description |\n| WARNING | path/file.ts:78 | Brief description |\n\nIf no issues: "No issues found."\n\n### Detailed Findings\nFor each issue:\n- **File:** `path/to/file.ts:line`\n- **Confidence:** X%\n- **Problem:** What\'s wrong and why it matters\n- **Suggestion:** Recommended fix with code snippet\n\n### Recommendation\nOne of: **APPROVE** | **APPROVE WITH SUGGESTIONS** | **NEEDS CHANGES**\n\n## Presenting Your Review\n\nAfter completing your review analysis and formatting your findings:\n\n- If your recommendation is **APPROVE** with no issues found, use `attempt_completion` to present your clean review.\n- If your recommendation is **APPROVE WITH SUGGESTIONS** or **NEEDS CHANGES**, use `ask_followup_question` instead of `attempt_completion`. Present your full review as the question text and include fix suggestions with mode switching so the user can apply fixes with one click.\n\nWhen using `ask_followup_question`, always provide exactly 1-3 suggestions in the `follow_up` array (never more than 3). Tailor them based on what you found. Choose the appropriate mode for each suggestion:\n- `mode="code"` for direct code fixes (bugs, missing error handling, clear improvements)\n- `mode="debug"` for issues needing investigation before fixing (race conditions, unclear root causes, intermittent failures)\n- `mode="orchestrator"` when there are many issues (3+) spanning different categories that need coordinated, planned fixes\n\nSuggestion patterns based on review findings:\n- **Few clear fixes (1-4 issues, same category):** offer mode="code" fixes\n- **Many issues across categories (3+, mixed security/performance/quality):** offer mode="orchestrator" to plan fixes and mode="code" for quick wins\n- **Issues needing investigation:** include a mode="debug" option to investigate root causes\n- **Suggestions only:** offer mode="code" to apply improvements\n\nExample with complex findings across multiple categories:\nUse `ask_followup_question` with:\n- question: Your full review (Summary, Issues Found table, Detailed Findings, and Recommendation)\n- follow_up:\n - { text: "Plan and coordinate fixes across all issue categories", mode: "orchestrator" }\n - { text: "Fix critical and warning issues only", mode: "code" }\n\nExample with straightforward fixes:\nUse `ask_followup_question` with:\n- question: Your full review (Summary, Issues Found table, Detailed Findings, and Recommendation)\n- follow_up:\n - { text: "Fix all issues found in this review", mode: "code" }\n - { text: "Fix critical issues only", mode: "code" }',
groups: ["read", "browser", "mcp", "command"],
},
}
@@ -1,308 +0,0 @@
/**
* 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
/** Field holding an organization/account ID (used for OAuth-style auth) */
organizationIdField?: string
/** VS Code secret key holding OAuth credentials stored separately from the provider profile */
oauthSecretKey?: string
/** If true, skip auth.set entirely — provider uses env/ADC-based auth (e.g. Vertex AI) */
skipAuth?: boolean
/** Legacy settings fields to write as provider config options (e.g. project/location for Vertex) */
configFields?: Array<{ from: string; option: string }>
}
/**
* Maps legacy `apiProvider` values → new provider info.
* Providers absent from this map are flagged as unsupported.
*/
export const PROVIDER_MAP: Record<string, ProviderMapping> = {
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",
skipAuth: true,
configFields: [
{ from: "vertexProjectId", option: "project" },
{ from: "vertexRegion", option: "location" },
],
},
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",
organizationIdField: "kilocodeOrganizationId",
},
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",
},
apertis: {
id: "apertis",
key: "apertisApiKey",
name: "Apertis",
modelField: "apertisModelId",
urlField: "apertisBaseUrl",
},
"openai-codex": {
id: "openai",
key: "",
name: "OpenAI (ChatGPT Plus/Pro)",
oauthSecretKey: "openai-codex-oauth-credentials",
},
"nano-gpt": {
id: "nano-gpt",
key: "nanoGptApiKey",
name: "NanoGPT",
modelField: "nanoGptModelId",
},
poe: {
id: "poe",
key: "poeApiKey",
name: "Poe",
modelField: "poeModelId",
},
aihubmix: {
id: "aihubmix",
key: "aihubmixApiKey",
name: "AiHubMix",
modelField: "aihubmixModelId",
urlField: "aihubmixBaseUrl",
},
zenmux: {
id: "zenmux",
key: "zenmuxApiKey",
name: "ZenMux",
modelField: "zenmuxModelId",
urlField: "zenmuxBaseUrl",
},
}
/** Providers that have no equivalent in the new CLI backend */
export const UNSUPPORTED_PROVIDERS = new Set([
"fake-ai",
"human-relay",
"vscode-lm",
"claude-code",
"qwen-code",
"virtual-quota-fallback",
"glama",
"roo",
])
/** Built-in default mode slugs that should not be migrated */
export const DEFAULT_MODE_SLUGS = new Set(["code", "build", "architect", "ask", "debug", "orchestrator", "review"])
@@ -14,7 +14,6 @@ type SSEEventFilter = (event: SSEPayload, directory?: string) => boolean
type NotificationDismissListener = (notificationId: string) => void
type LanguageChangeListener = (locale: string) => void
type ProfileChangeListener = (data: unknown) => void
type MigrationCompleteListener = () => void
type FavoritesChangeListener = (favorites: Array<{ providerID: string; modelID: string }>) => void
type ModelSelectorExpandedListener = (value: boolean) => void
type ClearPendingPromptsListener = () => void
@@ -103,7 +102,6 @@ export class KiloConnectionService {
private readonly notificationDismissListeners: Set<NotificationDismissListener> = new Set()
private readonly languageChangeListeners: Set<LanguageChangeListener> = new Set()
private readonly profileChangeListeners: Set<ProfileChangeListener> = new Set()
private readonly migrationCompleteListeners: Set<MigrationCompleteListener> = new Set()
private readonly favoritesChangeListeners: Set<FavoritesChangeListener> = new Set()
private readonly modelSelectorExpandedListeners: Set<ModelSelectorExpandedListener> = new Set()
private readonly clearPendingPromptsListeners: Set<ClearPendingPromptsListener> = new Set()
@@ -465,25 +463,6 @@ export class KiloConnectionService {
}
}
/**
* Subscribe to migration-complete events broadcast from any KiloProvider. Returns unsubscribe function.
*/
onMigrationComplete(listener: MigrationCompleteListener): () => void {
this.migrationCompleteListeners.add(listener)
return () => {
this.migrationCompleteListeners.delete(listener)
}
}
/**
* Broadcast a migration-complete event to all subscribed KiloProvider instances.
*/
notifyMigrationComplete(): void {
for (const listener of this.migrationCompleteListeners) {
listener()
}
}
/**
* Subscribe to favorites change events broadcast from any KiloProvider. Returns unsubscribe function.
*/
@@ -705,7 +684,6 @@ export class KiloConnectionService {
this.stateListeners.clear()
this.notificationDismissListeners.clear()
this.profileChangeListeners.clear()
this.migrationCompleteListeners.clear()
this.favoritesChangeListeners.clear()
this.clearPendingPromptsListeners.clear()
this.directoryProviders.clear()
@@ -84,7 +84,6 @@ function connection() {
onClearPendingPrompts: () => () => undefined,
onLanguageChanged: () => () => undefined,
onProfileChanged: () => () => undefined,
onMigrationComplete: () => () => undefined,
onFavoritesChanged: () => () => undefined,
onModelSelectorExpandedChanged: () => () => undefined,
registerDirectoryProvider: () => () => undefined,
@@ -213,7 +213,6 @@ function createConnection(client: ReturnType<typeof createClient> | null) {
onNotificationDismissed: () => () => undefined,
onLanguageChanged: () => () => undefined,
onProfileChanged: () => () => undefined,
onMigrationComplete: () => () => undefined,
onFavoritesChanged: () => () => undefined,
onModelSelectorExpandedChanged: () => () => undefined,
onClearPendingPrompts: () => () => undefined,
@@ -73,7 +73,6 @@ function mockConnection(getImpl?: (p: SessionGetParams) => Promise<unknown>, vcs
onNotificationDismissed: () => () => undefined,
onLanguageChanged: () => () => undefined,
onProfileChanged: () => () => undefined,
onMigrationComplete: () => () => undefined,
onFavoritesChanged: () => () => undefined,
onModelSelectorExpandedChanged: () => () => undefined,
onClearPendingPrompts: () => () => undefined,
@@ -13,6 +13,9 @@ type ProviderInternals = {
webview: { postMessage: (message: unknown) => Promise<unknown> } | null
initializeConnection: () => Promise<void>
handleLoadSessions: () => Promise<void>
isWebviewReady: boolean
syncWebviewState: (reason: string) => Promise<void>
handleMigrationMessage: (message: { type: string }) => boolean
}
function deferred<T>() {
@@ -51,6 +54,7 @@ function createClient() {
return {
calls,
session: {
status: async () => ({ data: {} }),
list: async (params: { directory: string }) => {
calls.push(params.directory)
return { data: [] }
@@ -93,7 +97,6 @@ function createConnection(client: ReturnType<typeof createClient>) {
onNotificationDismissed: () => () => undefined,
onLanguageChanged: () => () => undefined,
onProfileChanged: () => () => undefined,
onMigrationComplete: () => () => undefined,
onFavoritesChanged: () => () => undefined,
onModelSelectorExpandedChanged: () => () => undefined,
onClearPendingPrompts: () => () => undefined,
@@ -109,6 +112,40 @@ function createConnection(client: ReturnType<typeof createClient>) {
}
describe("KiloProvider pending session refresh", () => {
it("syncs startup state without reading legacy credentials or exposing legacy actions", async () => {
const client = createClient()
const connection = createConnection(client)
await connection.connect()
const reads: string[] = []
const ctx = {
globalStorageUri: { fsPath: "/storage/kilocode.kilo-code" },
globalState: { get: (_key: string, fallback?: unknown) => fallback },
secrets: {
get: async (key: string) => {
reads.push(key)
return undefined
},
},
}
const provider = new KiloProvider({} as never, connection as never, ctx as never)
const internal = provider as unknown as ProviderInternals
const sent: unknown[] = []
internal.connectionState = "connected"
internal.isWebviewReady = true
internal.webview = { postMessage: async (message) => sent.push(message) }
for (const reason of ["initializeConnection", "sse-connected", "webviewReady"]) {
await internal.syncWebviewState(reason)
}
expect(reads).toEqual([])
expect(sent).toContainEqual(expect.objectContaining({ type: "ready" }))
expect(sent).not.toContainEqual(expect.objectContaining({ type: "migrationState" }))
for (const type of ["skipLegacyMigration", "clearLegacyData", "finalizeLegacyMigration"]) {
expect(internal.handleMigrationMessage({ type })).toBe(false)
}
})
it("does not let a late listing restore the previous project's identity", async () => {
const client = createClient()
const pending = new Map<string, ReturnType<typeof deferred<{ data: unknown[] }>>>()
@@ -8,35 +8,29 @@ import {
type MigrationContext,
} from "../../../src/kilo-provider/handlers/migration"
const legacy = {
hasData: false,
providers: [],
mcpServers: [],
customModes: [],
}
function makeContext(cache: MigrationCache): MigrationContext {
function makeContext(cache: MigrationCache, sent: unknown[] = []): MigrationContext {
return {
client: null,
extensionContext: { globalStorageUri: { fsPath: "/storage/kilocode.kilo-code" } },
postMessage: () => {},
extensionContext: {
globalStorageUri: { fsPath: "/storage/kilocode.kilo-code" },
get secrets() {
throw new Error("Roo import must not access SecretStorage")
},
},
postMessage: (message) => sent.push(message),
refreshSessions: () => {},
migrationCache: cache,
migrationCheckInFlight: false,
disposeGlobal: async () => {},
broadcastComplete: () => {},
} as unknown as MigrationContext
}
describe("migration cache", () => {
it("isolates entries by operation and source", () => {
it("isolates Roo entries by operation", () => {
const cache: MigrationCache = new Map()
const entry: MigrationCacheEntry = { operationId: "new", source: "legacy", data: legacy }
const entry: MigrationCacheEntry = { operationId: "new", source: "roo", data: null }
cache.set("new", entry)
expect(getMigrationCache(cache, "legacy", "new")).toBe(entry)
expect(getMigrationCache(cache, "roo", "new")).toBeUndefined()
expect(getMigrationCache(cache, "legacy", "stale")).toBeUndefined()
expect(getMigrationCache(cache, "roo", "new")).toBe(entry)
expect(getMigrationCache(cache, "roo", "stale")).toBeUndefined()
})
it("retains an empty Roo discovery for its operation", () => {
@@ -48,39 +42,40 @@ describe("migration cache", () => {
expect(getMigrationCache(cache, "roo", "empty")?.data).toBeNull()
})
it("drops entries from abandoned operations when a new request arrives", async () => {
it("discovers Roo sessions without accessing secrets and drops abandoned operations", async () => {
const cache: MigrationCache = new Map()
const sent: unknown[] = []
cache.set("abandoned", { operationId: "abandoned", source: "roo", data: null })
await handleRequestMigrationData(makeContext(cache), "roo", "fresh")
await handleRequestMigrationData(makeContext(cache, sent), "roo", "fresh")
expect(cache.has("abandoned")).toBe(false)
expect(getMigrationCache(cache, "roo", "fresh")).toBeDefined()
expect(sent).toEqual([{ type: "migrationData", source: "roo", operationId: "fresh", data: { sessions: [] } }])
})
it("ignores obsolete migration requests without accessing extension storage", async () => {
const cache: MigrationCache = new Map()
const sent: unknown[] = []
const ctx = makeContext(cache, sent)
Object.defineProperty(ctx, "extensionContext", {
get() {
throw new Error("Unsupported migrations must not access extension storage")
},
})
await handleRequestMigrationData(ctx, "legacy" as never, "old")
await handleStartMigration(ctx, "legacy" as never, "old", { sessions: [] })
expect(cache.size).toBe(0)
expect(sent).toEqual([])
})
it("evicts an operation's entry once the migration completes", async () => {
const cache: MigrationCache = new Map()
cache.set("op", { operationId: "op", source: "roo", data: null })
await handleStartMigration(makeContext(cache), "roo", "op", {
providers: [],
mcpServers: [],
customModes: [],
sessions: [],
defaultModel: false,
settings: {
autoApproval: {
commandRules: false,
readPermission: false,
writePermission: false,
executePermission: false,
mcpPermission: false,
taskPermission: false,
},
language: false,
autocomplete: false,
},
})
await handleStartMigration(makeContext(cache), "roo", "op", { sessions: [] })
expect(cache.has("op")).toBe(false)
})
@@ -1,322 +0,0 @@
import { describe, expect, it } from "bun:test"
import {
buildCustomModeList,
isNativeModeModified,
buildMergedNativeMode,
} from "../../../src/legacy-migration/migration-service"
import { NATIVE_MODE_DEFAULTS } from "../../../src/legacy-migration/native-mode-defaults"
import type { LegacyCustomMode, LegacyPromptComponent } from "../../../src/legacy-migration/legacy-types"
// ---------------------------------------------------------------------------
// isNativeModeModified
// ---------------------------------------------------------------------------
describe("isNativeModeModified", () => {
const defaults = NATIVE_MODE_DEFAULTS["code"]!
it("returns true when a YAML override exists", () => {
const yaml: LegacyCustomMode = {
slug: "code",
name: "My Code",
roleDefinition: "custom role",
groups: ["read"],
}
expect(isNativeModeModified(yaml, undefined, defaults)).toBe(true)
})
it("returns false when no YAML and no prompts exist", () => {
expect(isNativeModeModified(undefined, undefined, defaults)).toBe(false)
})
it("returns false when prompts match the defaults exactly", () => {
const prompt: LegacyPromptComponent = {
roleDefinition: defaults.roleDefinition,
}
expect(isNativeModeModified(undefined, prompt, defaults)).toBe(false)
})
it("returns true when roleDefinition differs from default", () => {
const prompt: LegacyPromptComponent = {
roleDefinition: "You are a Python specialist.",
}
expect(isNativeModeModified(undefined, prompt, defaults)).toBe(true)
})
it("returns true when customInstructions differs from default", () => {
const prompt: LegacyPromptComponent = {
customInstructions: "Always use type hints.",
}
// code mode has no default customInstructions, so any non-empty value is different
expect(isNativeModeModified(undefined, prompt, defaults)).toBe(true)
})
it("returns true when whenToUse differs from default", () => {
const prompt: LegacyPromptComponent = {
whenToUse: "Use for Python only.",
}
expect(isNativeModeModified(undefined, prompt, defaults)).toBe(true)
})
it("returns false when prompts have empty strings", () => {
const prompt: LegacyPromptComponent = {
roleDefinition: "",
customInstructions: "",
whenToUse: "",
}
expect(isNativeModeModified(undefined, prompt, defaults)).toBe(false)
})
it("returns false when customInstructions matches default (ask mode)", () => {
const ask = NATIVE_MODE_DEFAULTS["ask"]!
const prompt: LegacyPromptComponent = {
customInstructions: ask.customInstructions,
}
expect(isNativeModeModified(undefined, prompt, ask)).toBe(false)
})
it("returns true when customInstructions differs from default (ask mode)", () => {
const ask = NATIVE_MODE_DEFAULTS["ask"]!
const prompt: LegacyPromptComponent = {
customInstructions: "Different instructions.",
}
expect(isNativeModeModified(undefined, prompt, ask)).toBe(true)
})
it("returns true when description differs from default", () => {
const prompt: LegacyPromptComponent = {
description: "My custom short description",
}
expect(isNativeModeModified(undefined, prompt, defaults)).toBe(true)
})
it("returns false when description matches default", () => {
const prompt: LegacyPromptComponent = {
description: defaults.description,
}
expect(isNativeModeModified(undefined, prompt, defaults)).toBe(false)
})
})
// ---------------------------------------------------------------------------
// buildCustomModeList
// ---------------------------------------------------------------------------
describe("buildCustomModeList", () => {
it("returns non-native custom modes as before", () => {
const modes: LegacyCustomMode[] = [
{ slug: "translate", name: "Translate", roleDefinition: "translator", groups: ["read"] },
]
const result = buildCustomModeList(modes, null)
expect(result).toEqual([{ name: "Translate", slug: "translate" }])
})
it("still filters out unmodified native modes from YAML", () => {
// A mode list with only non-native entries + an exact-slug match that is not a YAML
// override (just a non-matching slug that happens to be native) — this shouldn't happen
// in practice because custom_modes.yaml would only have a native slug if the user put it there
const result = buildCustomModeList(null, null)
expect(result).toEqual([])
})
it("includes a modified native mode from YAML with -custom slug", () => {
const modes: LegacyCustomMode[] = [
{
slug: "code",
name: "My Code Mode",
roleDefinition: "You are a specialized engineer.",
groups: ["read", "edit"],
},
]
const result = buildCustomModeList(modes, null)
expect(result).toEqual([{ name: "My Code Mode (Custom)", slug: "code-custom", nativeSlug: "code" }])
})
it("includes a modified native mode from customModePrompts with -custom slug", () => {
const prompts: Record<string, LegacyPromptComponent> = {
code: { roleDefinition: "You are a Python expert." },
}
const result = buildCustomModeList(null, prompts)
expect(result).toEqual([{ name: "Code (Custom)", slug: "code-custom", nativeSlug: "code" }])
})
it("does not include a native mode when prompts match defaults", () => {
const defaults = NATIVE_MODE_DEFAULTS["code"]!
const prompts: Record<string, LegacyPromptComponent> = {
code: { roleDefinition: defaults.roleDefinition },
}
const result = buildCustomModeList(null, prompts)
expect(result).toEqual([])
})
it("combines non-native custom modes and modified native modes", () => {
const modes: LegacyCustomMode[] = [
{ slug: "translate", name: "Translate", roleDefinition: "translator", groups: ["read"] },
{ slug: "code", name: "Custom Code", roleDefinition: "specialized", groups: ["read", "edit"] },
]
const result = buildCustomModeList(modes, null)
expect(result).toHaveLength(2)
expect(result[0]).toEqual({ name: "Translate", slug: "translate" })
expect(result[1]).toEqual({ name: "Custom Code (Custom)", slug: "code-custom", nativeSlug: "code" })
})
it("produces only one entry when both YAML and prompts exist for same native slug", () => {
const modes: LegacyCustomMode[] = [
{ slug: "code", name: "Custom Code", roleDefinition: "from yaml", groups: ["read"] },
]
const prompts: Record<string, LegacyPromptComponent> = {
code: { roleDefinition: "from prompts" },
}
const result = buildCustomModeList(modes, prompts)
const native = result.filter((m) => m.nativeSlug === "code")
expect(native).toHaveLength(1)
expect(native[0]!.slug).toBe("code-custom")
})
it("excludes 'build' since it is a native slug with no legacy defaults", () => {
const modes: LegacyCustomMode[] = [{ slug: "build", name: "Build", roleDefinition: "builder", groups: ["read"] }]
// "build" is in DEFAULT_MODE_SLUGS (so filtered from non-native pass) but has no
// entry in NATIVE_MODE_DEFAULTS (so skipped in the native-modification pass)
const result = buildCustomModeList(modes, null)
expect(result).toEqual([])
})
it("detects multiple modified native modes", () => {
const prompts: Record<string, LegacyPromptComponent> = {
code: { roleDefinition: "Custom code role" },
debug: { roleDefinition: "Custom debug role" },
}
const result = buildCustomModeList(null, prompts)
const slugs = result.map((m) => m.slug)
expect(slugs).toContain("code-custom")
expect(slugs).toContain("debug-custom")
})
})
// ---------------------------------------------------------------------------
// buildMergedNativeMode
// ---------------------------------------------------------------------------
describe("buildMergedNativeMode", () => {
it("returns null for unknown slugs", () => {
expect(buildMergedNativeMode(undefined, undefined, "nonexistent")).toBeNull()
})
it("uses YAML mode as base when present", () => {
const yaml: LegacyCustomMode = {
slug: "code",
name: "My Code",
roleDefinition: "custom role from yaml",
groups: ["read"],
}
const result = buildMergedNativeMode(yaml, undefined, "code")
expect(result).not.toBeNull()
expect(result!.roleDefinition).toBe("custom role from yaml")
expect(result!.groups).toEqual(["read"])
})
it("uses native defaults as base when no YAML", () => {
const prompt: LegacyPromptComponent = {
roleDefinition: "custom role from prompts",
}
const result = buildMergedNativeMode(undefined, prompt, "code")
expect(result).not.toBeNull()
expect(result!.roleDefinition).toBe("custom role from prompts")
expect(result!.name).toBe("Code")
expect(result!.groups).toEqual(NATIVE_MODE_DEFAULTS["code"]!.groups)
})
it("overlays prompts on top of YAML", () => {
const yaml: LegacyCustomMode = {
slug: "code",
name: "My Code",
roleDefinition: "yaml role",
customInstructions: "yaml instructions",
groups: ["read"],
}
const prompt: LegacyPromptComponent = {
roleDefinition: "prompt role",
}
const result = buildMergedNativeMode(yaml, prompt, "code")
expect(result).not.toBeNull()
expect(result!.roleDefinition).toBe("prompt role")
expect(result!.customInstructions).toBe("yaml instructions")
})
it("preserves default groups when only prompts are present", () => {
const prompt: LegacyPromptComponent = {
customInstructions: "extra instructions",
}
const result = buildMergedNativeMode(undefined, prompt, "architect")
expect(result).not.toBeNull()
expect(result!.groups).toEqual(NATIVE_MODE_DEFAULTS["architect"]!.groups)
})
it("does not mutate the YAML input", () => {
const yaml: LegacyCustomMode = {
slug: "code",
name: "My Code",
roleDefinition: "original",
groups: ["read"],
}
const prompt: LegacyPromptComponent = {
roleDefinition: "overridden",
}
buildMergedNativeMode(yaml, prompt, "code")
expect(yaml.roleDefinition).toBe("original")
})
it("does not overlay empty prompt strings", () => {
const yaml: LegacyCustomMode = {
slug: "code",
name: "My Code",
roleDefinition: "yaml role",
groups: ["read"],
}
const prompt: LegacyPromptComponent = {
roleDefinition: "",
customInstructions: "",
}
const result = buildMergedNativeMode(yaml, prompt, "code")
expect(result!.roleDefinition).toBe("yaml role")
expect(result!.customInstructions).toBeUndefined()
})
it("includes whenToUse from prompts", () => {
const prompt: LegacyPromptComponent = {
whenToUse: "Use for special tasks",
}
const result = buildMergedNativeMode(undefined, prompt, "code")
expect(result!.whenToUse).toBe("Use for special tasks")
})
it("overlays description from prompts", () => {
const prompt: LegacyPromptComponent = {
description: "My custom description",
}
const result = buildMergedNativeMode(undefined, prompt, "code")
expect(result!.description).toBe("My custom description")
})
it("preserves default description when prompt description is empty", () => {
const prompt: LegacyPromptComponent = {
description: "",
}
const result = buildMergedNativeMode(undefined, prompt, "code")
expect(result!.description).toBe(NATIVE_MODE_DEFAULTS["code"]!.description)
})
it("overlays description from prompts on top of YAML", () => {
const yaml: LegacyCustomMode = {
slug: "code",
name: "My Code",
roleDefinition: "yaml role",
description: "yaml description",
groups: ["read"],
}
const prompt: LegacyPromptComponent = {
description: "prompt description",
}
const result = buildMergedNativeMode(yaml, prompt, "code")
expect(result!.description).toBe("prompt description")
})
})
@@ -0,0 +1,261 @@
import assert from "node:assert/strict"
import { Window } from "happy-dom"
import type { MigrationSessionInfo, WebviewMessage } from "../../webview-ui/src/types/messages"
const window = new Window({ url: "http://localhost" })
Object.defineProperty(window, "origin", { value: window.location.origin })
const style = window.getComputedStyle.bind(window)
const sent: WebviewMessage[] = []
Object.assign(globalThis, {
window,
document: window.document,
navigator: window.navigator,
Node: window.Node,
NodeFilter: window.NodeFilter,
Element: window.Element,
HTMLElement: window.HTMLElement,
HTMLHeadElement: window.HTMLHeadElement,
HTMLInputElement: window.HTMLInputElement,
SVGElement: window.SVGElement,
MutationObserver: window.MutationObserver,
ResizeObserver: window.ResizeObserver,
CustomEvent: window.CustomEvent,
Event: window.Event,
MouseEvent: window.MouseEvent,
MessageEvent: window.MessageEvent,
getComputedStyle: (node: Element) => {
const value = style(node)
Object.defineProperty(value, "animationName", { configurable: true, value: "none" })
return value
},
requestAnimationFrame: window.requestAnimationFrame.bind(window),
cancelAnimationFrame: window.cancelAnimationFrame.bind(window),
acquireVsCodeApi: () => ({
postMessage: (message: WebviewMessage) => sent.push(message),
getState: () => undefined,
setState: () => {},
}),
})
const { Show, createSignal } = await import("solid-js")
const { render } = await import("solid-js/web")
const { DialogProvider } = await import("@kilocode/kilo-ui/context/dialog")
const { VSCodeProvider } = await import("../../webview-ui/src/context/vscode")
const { LanguageProvider } = await import("../../webview-ui/src/context/language")
const { ConfigProvider } = await import("../../webview-ui/src/context/config")
const { default: AboutKiloCodeTab } = await import("../../webview-ui/src/components/settings/AboutKiloCodeTab")
const { default: MigrationWizard } = await import("../../webview-ui/src/components/migration/MigrationWizard")
const root = document.createElement("div")
document.body.append(root)
const [open, setOpen] = createSignal(false)
const closed: string[] = []
const close = (reason: string) => {
closed.push(reason)
setOpen(false)
}
const dispose = render(
() => (
<VSCodeProvider>
<LanguageProvider languageOverride={() => "en"}>
<ConfigProvider>
<DialogProvider>
<Show
when={open()}
fallback={
<AboutKiloCodeTab
port={null}
connectionState="disconnected"
onMigrationClick={(source) => {
assert.equal(source, "roo")
setOpen(true)
}}
/>
}
>
<MigrationWizard onBack={() => close("back")} onComplete={() => close("complete")} />
</Show>
</DialogProvider>
</ConfigProvider>
</LanguageProvider>
</VSCodeProvider>
),
root,
)
const button = (text: string) => {
const node = [...document.querySelectorAll<HTMLButtonElement>("button")].find(
(item) => item.textContent?.trim() === text,
)
assert(node, `Missing button: ${text}`)
return node
}
const query = (selector: string) => {
const node = document.querySelector(selector)
assert(node, `Missing element: ${selector}`)
return node
}
const { post: emit } = await import("../../webview-ui/src/utils/webview-message")
const settle = async () => {
await Promise.resolve()
await window.happyDOM.waitUntilComplete()
}
const requests = () => sent.filter((item) => item.type === "requestMigrationData")
const starts = () => sent.filter((item) => item.type === "startMigration")
const sessions: MigrationSessionInfo[] = [
{ id: "roo-a", title: "First Roo session", directory: "/workspace/test", time: 1 },
{ id: "roo-b", title: "Skipped Roo session", directory: "/workspace/test", time: 2 },
{ id: "roo-c", title: "Failed Roo session", directory: "/workspace/test", time: 3 },
]
const catalog = {
sessions,
providers: [{ profileName: "Unsupported provider", supported: true, hasApiKey: true }],
mcpServers: [{ name: "Unsupported server", type: "stdio" }],
customModes: [{ name: "Unsupported mode", slug: "unsupported" }],
defaultModel: { provider: "unsupported", model: "unsupported" },
settings: { language: "de", autoApprovalEnabled: true, autocomplete: { enableAutoTrigger: true } },
}
assert.equal(requests().length, 0)
assert.doesNotMatch(root.textContent ?? "", /Legacy Migration|Migrate from Legacy Version/)
button("Import Sessions from Roo Code").click()
const first = requests().at(-1)!
assert.equal(first.source, "roo")
assert(first.operationId)
assert.equal(button("Import Sessions").disabled, true)
assert.match(root.textContent ?? "", /No Roo Code sessions found/)
button("Back").click()
assert.deepEqual(closed, ["back"])
assert.equal(starts().length, 0)
button("Import Sessions from Roo Code").click()
const request = requests().at(-1)!
assert.notEqual(request.operationId, first.operationId)
const scope = { source: "roo", operationId: request.operationId }
for (const stale of [
{ ...scope, source: "legacy" },
{ ...scope, operationId: first.operationId },
]) {
emit({ ...stale, type: "migrationData", data: catalog })
}
assert.equal(button("Import Sessions").disabled, true)
emit({ ...scope, type: "migrationData", data: catalog })
assert.equal(root.querySelectorAll('input[type="checkbox"]').length, 1)
assert.doesNotMatch(
root.textContent ?? "",
/Migrate Your Settings|Provider API Keys|MCP Servers|Custom Modes|UI Language/,
)
assert.match(root.textContent ?? "", /3 sessions detected/)
const checkbox = query('input[aria-label="Chat Sessions & History"]') as HTMLInputElement
checkbox.click()
assert.equal(button("Import Sessions").disabled, true)
checkbox.click()
button("Import Sessions").click()
const started = starts().at(-1)!
assert.equal(started.source, "roo")
assert.equal(started.operationId, request.operationId)
assert.deepEqual(started.selections, {
sessions: sessions.map((session) => ({ id: session.id })),
})
const update = (index: number, phase: string, error?: string) =>
emit({
...scope,
type: "migrationSessionProgress",
session: sessions.at(index),
index: index + 1,
total: 3,
phase,
error,
})
update(0, "preparing")
assert.match(query(".migration-session-progress__header").textContent ?? "", /Migrating 1 of 3/)
update(0, "storing")
assert.equal(root.querySelectorAll(".migration-session-progress__dot--active").length, 1)
for (const stale of [
{ ...scope, source: "legacy" },
{ ...scope, operationId: first.operationId },
]) {
emit({ ...stale, type: "migrationProgress", item: "roo-a", status: "error", message: "Stale error" })
emit({
...stale,
type: "migrationSessionProgress",
session: sessions.at(0),
index: 1,
total: 3,
phase: "error",
error: "Stale error",
})
emit({ ...stale, type: "migrationComplete", results: [{ item: "roo-a", category: "session", status: "error" }] })
}
assert.equal(button("Import Sessions").disabled, true)
assert.doesNotMatch(root.textContent ?? "", /Stale error/)
button("Back").click()
await settle()
assert.match(query('[data-component="dialog"]').textContent ?? "", /Migration in Progress/)
button("Stay").click()
await settle()
assert.deepEqual(closed, ["back"])
assert.equal(button("Import Sessions").disabled, true)
update(0, "done")
update(1, "skipped")
update(2, "error", "Could not import test session")
update(2, "summary")
emit({
...scope,
type: "migrationComplete",
results: [
{ item: "roo-a", category: "session", status: "success" },
{ item: "roo-b", category: "session", status: "warning" },
{ item: "roo-c", category: "session", status: "error" },
],
})
assert.match(query(".migration-session-summary__list--success").textContent ?? "", /First Roo session/)
assert.match(query(".migration-session-summary__list--skipped").textContent ?? "", /Skipped Roo session/)
assert.match(query(".migration-session-summary__list--errored").textContent ?? "", /Could not import test session/)
button("Continue").click()
assert.match(query(".migration-wizard__summary").textContent ?? "", /1 of 3 items migrated successfully/)
;(query(".migration-session-summary__pick input") as HTMLInputElement).click()
button("Force Re-import").click()
await settle()
assert.match(query('[data-component="dialog"]').textContent ?? "", /overwrite them and delete any new messages/)
button("Cancel").click()
await settle()
assert.equal(starts().length, 1)
button("Force Re-import").click()
await settle()
button("Proceed").click()
await settle()
const forced = starts().at(-1)!
assert.equal(forced.operationId, request.operationId)
assert.equal(forced.source, "roo")
assert.deepEqual(forced.selections.sessions, [{ id: "roo-b", force: true }])
assert.deepEqual({ ...forced.selections, sessions: started.selections.sessions }, started.selections)
emit({ ...scope, type: "migrationProgress", item: "roo-b", status: "success" })
update(1, "done")
update(1, "summary")
emit({ ...scope, type: "migrationComplete", results: [{ item: "roo-b", category: "session", status: "success" }] })
assert.match(query(".migration-session-summary__list--success").textContent ?? "", /First Roo session/)
assert.match(query(".migration-session-summary__list--success").textContent ?? "", /Skipped Roo session/)
assert.equal(root.querySelector(".migration-session-summary__list--skipped"), null)
assert(root.querySelector(".migration-wizard__status-icon--success"))
button("Done").click()
assert.deepEqual(closed, ["back", "complete"])
assert.equal(sent.at(-1)?.type, "loadSessions")
button("Import Sessions from Roo Code").click()
const latest = requests().at(-1)!
emit({ source: "roo", operationId: latest.operationId, type: "migrationData", data: { sessions } })
button("Import Sessions").click()
button("Back").click()
await settle()
button("Proceed").click()
await settle()
assert.deepEqual(closed, ["back", "complete", "back"])
assert.equal(root.querySelector(".migration-wizard"), null)
assert.equal(
sent.some((item) => /Legacy/.test(item.type)),
false,
)
dispose()
await window.happyDOM.close()
@@ -0,0 +1,63 @@
import { describe, expect, it } from "bun:test"
import path from "node:path"
import { build } from "esbuild"
import { solidPlugin } from "esbuild-plugin-solid"
const root = path.resolve(import.meta.dir, "../..")
const webview = path.join(root, "webview-ui")
describe("Roo migration UI", () => {
it("does not handle startup migration state or expose legacy actions", async () => {
const files = [
"src/App.tsx",
"src/types/messages/migration.ts",
"src/types/messages/extension-messages.ts",
"src/types/messages/webview-messages.ts",
]
for (const file of files) {
const text = await Bun.file(path.join(webview, file)).text()
for (const action of ["migrationState", "clearLegacyData", "skipLegacyMigration", "finalizeLegacyMigration"]) {
expect(text).not.toContain(action)
}
}
})
it("imports only Roo sessions with scoped progress, results, and confirmation dialogs", async () => {
const solid = path.dirname(Bun.resolveSync("solid-js/package.json", webview))
const aliases: Record<string, string> = {
"solid-js": path.join(solid, "dist/solid.js"),
"solid-js/web": path.join(solid, "web/dist/web.js"),
"solid-js/store": path.join(solid, "store/dist/store.js"),
}
const result = await build({
entryPoints: [path.join(import.meta.dir, "roo-migration-ui.fixture.tsx")],
bundle: true,
conditions: ["browser"],
external: ["happy-dom"],
format: "esm",
logLevel: "silent",
loader: { ".css": "empty" },
platform: "node",
plugins: [
{
name: "solid-dedupe",
setup(ctx) {
ctx.onResolve({ filter: /^solid-js(\/web|\/store)?$/ }, (args) => ({ path: aliases[args.path] }))
},
},
solidPlugin(),
],
target: "es2022",
write: false,
})
const file = path.join(import.meta.dir, `.roo-migration-ui-${crypto.randomUUID()}.mjs`)
await Bun.write(file, result.outputFiles.at(0)!.contents)
try {
const child = Bun.spawnSync(["bun", file], { cwd: webview, stdout: "pipe", stderr: "pipe" })
const output = child.stdout.toString() + child.stderr.toString()
expect(child.exitCode, output).toBe(0)
} finally {
await Bun.file(file).delete()
}
})
})
+5 -23
View File
@@ -26,7 +26,7 @@ registerExpandedTaskTool()
// Apply VS Code sidebar preferences to other tools (e.g. bash expanded by default).
registerVscodeToolOverrides()
import HistoryView from "./components/history/HistoryView"
import { MigrationWizard } from "./components/migration" // legacy-migration
import { MigrationWizard } from "./components/migration"
import type { Message as SDKMessage, Part as SDKPart } from "@kilocode/sdk/v2"
import { cycleAgent as cycle } from "./context/session-agent"
import "./styles/chat.css"
@@ -222,10 +222,7 @@ const AppContent: Component = () => {
const [currentView, setCurrentView] = createSignal<ViewType>("newTask")
const [settingsTab, setSettingsTab] = createSignal<string | undefined>()
const [agentManagerProjectId, setAgentManagerProjectId] = createSignal<string | undefined>()
// legacy-migration: state-driven flag independent of currentView to avoid
// race conditions with SettingsEditorProvider's navigate messages.
const [migrationNeeded, setMigrationNeeded] = createSignal(false)
const [migrationSource, setMigrationSource] = createSignal<"legacy" | "roo">("legacy")
const [migration, setMigration] = createSignal(false)
const session = useSession()
const tabs = useLocalTabs()
const server = useServer()
@@ -316,12 +313,6 @@ const AppContent: Component = () => {
session.setCurrentSessionID(message.sessionID)
setCurrentView("subAgentViewer")
}
// legacy-migration: state-driven migration wizard
if (message?.type === "migrationState") {
console.log("[Kilo New] App: 🔄 migrationState:", message.needed)
setMigrationSource(message.source)
setMigrationNeeded(message.needed)
}
}
window.addEventListener("message", handler)
onCleanup(() => window.removeEventListener("message", handler))
@@ -365,9 +356,8 @@ const AppContent: Component = () => {
surface={topBarSurface}
/>
</Show>
{/* legacy-migration start — state-driven overlay, independent of currentView */}
<Show
when={migrationNeeded()}
when={migration()}
fallback={
<Switch
fallback={
@@ -410,10 +400,7 @@ const AppContent: Component = () => {
agentManagerProjectId={agentManagerProjectId()}
agentManagerSettings={host.KILO_AGENT_MANAGER_SETTINGS === true}
onTabChange={setSettingsTab}
onMigrationClick={(source) => {
setMigrationSource(source)
setMigrationNeeded(true)
}}
onMigrationClick={() => setMigration(true)}
/>
</Match>
<Match when={currentView() === "subAgentViewer"}>
@@ -422,13 +409,8 @@ const AppContent: Component = () => {
</Switch>
}
>
<MigrationWizard
source={migrationSource()}
onBack={() => setMigrationNeeded(false)}
onComplete={() => setMigrationNeeded(false)}
/>
<MigrationWizard onBack={() => setMigration(false)} onComplete={() => setMigration(false)} />
</Show>
{/* legacy-migration end */}
</div>
)
}
File diff suppressed because it is too large Load Diff
@@ -1,7 +1,3 @@
/**
* 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"
export { default as SessionMigrationCard } from "./SessionMigrationCard"
export { default as SessionMigrationProgress } from "./SessionMigrationProgress"
@@ -1,5 +1,3 @@
/* legacy-migration - Scoped styles for the migration wizard. */
.migration-wizard {
display: flex;
align-items: center;
@@ -18,10 +16,6 @@
}
/* Screen transitions */
.migration-wizard__screen--hidden {
display: none;
}
.migration-wizard__screen--active {
display: block;
animation: mw-screen-enter 0.28s ease-out;
@@ -76,84 +70,6 @@
margin: 0 auto;
}
/* Feature cards — What's New */
.migration-wizard__features {
display: flex;
flex-direction: column;
gap: 10px;
margin-bottom: 8px;
}
.migration-wizard__feature {
background: var(--vscode-editor-background);
border: 1px solid var(--vscode-panel-border);
border-radius: 12px;
padding: 16px 18px;
display: flex;
gap: 14px;
align-items: flex-start;
}
.migration-wizard__feature-icon {
width: 36px;
height: 36px;
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
background: color-mix(in srgb, var(--vscode-button-background) 15%, transparent);
color: var(--vscode-button-background);
}
.migration-wizard__feature-icon svg {
width: 18px;
height: 18px;
}
.migration-wizard__feature-text {
flex: 1;
}
.migration-wizard__feature-text .title {
font-size: var(--kilo-font-size-13);
font-weight: 600;
line-height: 1.3;
margin-bottom: 3px;
}
.migration-wizard__feature-text .detail {
font-size: var(--kilo-font-size-12);
color: var(--vscode-descriptionForeground);
line-height: 1.45;
}
/* Blog link */
.migration-wizard__blog-link {
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
margin-top: 16px;
}
.migration-wizard__blog-link a {
font-size: var(--kilo-font-size-12);
color: var(--vscode-descriptionForeground);
opacity: 0.65;
text-decoration: none;
transition: opacity 0.15s;
}
.migration-wizard__blog-link a:hover {
opacity: 1;
}
.migration-wizard__blog-link a span {
text-decoration: underline;
text-underline-offset: 2px;
}
/* Migration card */
.migration-wizard__card {
background: var(--vscode-editor-background);
@@ -622,18 +538,6 @@
outline-offset: 2px;
}
/* Clickable item (cleanup row) — text area triggers checkbox */
.migration-wizard__item--clickable .migration-wizard__item-text {
cursor: pointer;
user-select: none;
}
/* Divider */
.migration-wizard__divider {
height: 1px;
background: var(--vscode-panel-border);
}
/* Summary badge */
.migration-wizard__summary {
text-align: center;
@@ -716,10 +620,6 @@
body.vscode-high-contrast,
body.vscode-high-contrast-light {
.migration-wizard__feature {
border-color: var(--vscode-contrastBorder, var(--vscode-panel-border));
}
.migration-wizard__card {
border-color: var(--vscode-contrastBorder, var(--vscode-panel-border));
}
@@ -736,10 +636,6 @@ body.vscode-high-contrast-light {
border-color: var(--vscode-contrastBorder, var(--vscode-foreground));
}
.migration-wizard__divider {
background: var(--vscode-contrastBorder, var(--vscode-panel-border));
}
.migration-wizard__copy-btn {
border-color: var(--vscode-contrastBorder, var(--vscode-errorForeground));
}
@@ -12,7 +12,7 @@ export interface AboutKiloCodeTabProps {
port: number | null
connectionState: ConnectionState
extensionVersion?: string
onMigrationClick?: (source: MigrationSource) => void // legacy-migration
onMigrationClick?: (source: MigrationSource) => void
}
const AboutKiloCodeTab: Component<AboutKiloCodeTabProps> = (props) => {
@@ -315,9 +315,8 @@ const AboutKiloCodeTab: Component<AboutKiloCodeTabProps> = (props) => {
</div>
</div>
{/* legacy-migration start */}
<div style={{ ...sectionStyle, "margin-bottom": "0" }}>
<h4 style={headingStyle}>{language.t("settings.aboutKiloCode.legacyMigration.title")}</h4>
<div style={sectionStyle}>
<h4 style={headingStyle}>{language.t("settings.aboutKiloCode.rooImport.button")}</h4>
<p
style={{
"font-size": "var(--kilo-font-size-12)",
@@ -326,23 +325,12 @@ const AboutKiloCodeTab: Component<AboutKiloCodeTabProps> = (props) => {
"line-height": "1.5",
}}
>
{language.t("settings.aboutKiloCode.legacyMigration.description")}
{language.t("settings.aboutKiloCode.rooImport.description")}
</p>
<div style={{ display: "flex", gap: "8px", "flex-wrap": "wrap" }}>
<Button variant="secondary" size="small" onClick={() => props.onMigrationClick?.("legacy")}>
{language.t("settings.legacyMigration.link")}
</Button>
<Button
variant="secondary"
size="small"
onClick={() => props.onMigrationClick?.("roo")}
title={language.t("settings.aboutKiloCode.rooImport.description")}
>
{language.t("settings.aboutKiloCode.rooImport.button")}
</Button>
</div>
<Button variant="secondary" size="small" onClick={() => props.onMigrationClick?.("roo")}>
{language.t("settings.aboutKiloCode.rooImport.button")}
</Button>
</div>
{/* legacy-migration end */}
{/* Reset Settings */}
<div style={sectionStyle}>
@@ -47,7 +47,7 @@ export interface SettingsProps {
agentManagerProjectId?: string
agentManagerSettings?: boolean
onTabChange?: (tab: string) => void
onMigrationClick?: (source: MigrationSource) => void // legacy-migration
onMigrationClick?: (source: MigrationSource) => void
}
const AgentManagerTab: Component<{ projectId?: string }> = (props) => {
+2 -45
View File
@@ -1141,58 +1141,16 @@ 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 لمقدمي الخدمة والنموذج الافتراضي.",
"settings.aboutKiloCode.rooImport.description": "استيراد سجل المحادثات من تثبيت Roo Code.",
"settings.aboutKiloCode.rooImport.button": "استيراد الجلسات من Roo Code",
// Screen 1 — What's New
"migration.whatsNew.title": "ما الجديد في Kilo Code",
"migration.whatsNew.subtitle": "لقد أعدنا بناء الإضافة على أساس أسرع وأكثر كفاءة.",
"migration.whatsNew.features.performance.title": "أداء أسرع للوكيل",
"migration.whatsNew.features.performance.detail":
"استدعاءات الأدوات المتوازية والوكلاء الفرعيون يتيحون لوكيلك إنجاز المزيد في وقت واحد — فتقضي وقتًا أقل في الانتظار ووقتًا أكثر في الإنجاز.",
"migration.whatsNew.features.interface.title": "واجهة مبسّطة",
"migration.whatsNew.features.interface.detail": "أقل تشتيتًا، أسهل وأسرع في القراءة.",
"migration.whatsNew.features.agentManager.title": "مدير الوكلاء",
"migration.whatsNew.features.agentManager.detail":
"واجهة موحدة لتشغيل عدة وكلاء بالتوازي، كل منهم في شجرة عمل خاصة — راقب التقدم، وبدّل السياق، وراجع التغييرات في مكان واحد.",
"migration.whatsNew.features.foundation.title": "أساس مشترك",
"migration.whatsNew.features.foundation.detail":
"نواة صغيرة وفعالة واحدة عبر كل منتجات Kilo. تجربة مألوفة بغض النظر عن طريقة عملك.",
"migration.whatsNew.blogLink": "اقرأ الإعلان الكامل",
"migration.whatsNew.docsLink": "الجديد والأسئلة الشائعة",
"migration.whatsNew.continue": "متابعة",
// Screen 2 — Migrate Settings
"migration.migrate.title": "ترحيل إعداداتك",
"migration.migrate.subtitle": "لقد وجدنا إعدادات من تثبيتك السابق. إليك ما يمكننا نقله.",
"migration.roo.button": "استيراد الجلسات",
"migration.roo.empty": "لم يتم العثور على جلسات Roo Code.",
"migration.migrate.selectLabel": "اختر ما تريد ترحيله",
"migration.migrate.chatHistory": "جلسات الدردشة والسجل",
"migration.migrate.button": "ترحيل الإعدادات",
"migration.migrate.skip": "تخطي",
"migration.migrate.keysDetected": "تم اكتشاف {{count}} مفاتيح",
"migration.migrate.serversConfigured": "تم تكوين {{count}} خادم(خوادم)",
"migration.migrate.modesFound": "تم العثور على {{count}} وضع(أوضاع)",
"migration.migrate.nothingToMigrate": "لم يتم العثور على أي شيء لترحيله في الإعدادات القديمة.",
// Migrate — item labels (reused from old select keys)
"migration.select.providers": "مفاتيح API لمقدمي الخدمة",
"migration.select.mcpServers": "خوادم MCP",
"migration.select.customModes": "الأوضاع المخصصة / الوكلاء",
"migration.select.defaultModel": "النموذج الافتراضي",
"migration.select.autoApproval": "الموافقة التلقائية",
"migration.select.language": "لغة واجهة المستخدم",
"migration.select.autocomplete": "إعدادات الإكمال التلقائي",
// Migrate — completion
"migration.complete.summary": "تم ترحيل {{success}} من {{total}} عناصر بنجاح.",
"migration.complete.cleanup": "إزالة بيانات الإعدادات القديمة",
"migration.complete.cleanupDescription":
"هذا يزيل الإعدادات القديمة من مساحة تخزين VS Code. لن تتمكن من إعادة تشغيل هذا الترحيل.",
"migration.complete.done": "تم",
"migration.migrate.sessionsDetected": "تم اكتشاف {{count}} جلسة",
"migration.error.continue": "متابعة",
@@ -1226,7 +1184,6 @@ export const dict = {
"migration.sessionFormat.unknownDate": "تاريخ غير معروف",
"migration.sessionFormat.unknown": "غير معروف",
"migration.sessionFormat.unknownError": "خطأ غير معروف",
// legacy-migration end
"error.details.show": "التفاصيل",
+2 -45
View File
@@ -1184,58 +1184,16 @@ 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.",
"settings.aboutKiloCode.rooImport.description": "Importe o histórico de conversas de uma instalação do Roo Code.",
"settings.aboutKiloCode.rooImport.button": "Importar sessões do Roo Code",
// Screen 1 — What's New
"migration.whatsNew.title": "O Que Há de Novo no Kilo Code",
"migration.whatsNew.subtitle": "Reconstruímos a extensão sobre uma base mais rápida e eficiente.",
"migration.whatsNew.features.performance.title": "Desempenho de Agente Mais Rápido",
"migration.whatsNew.features.performance.detail":
"Chamadas de ferramentas paralelas e subagentes permitem que seu agente faça mais de uma vez — assim você gasta menos tempo esperando e mais tempo entregando.",
"migration.whatsNew.features.interface.title": "Interface Simplificada",
"migration.whatsNew.features.interface.detail": "Menos distrações, mais fácil e rápido de ler.",
"migration.whatsNew.features.agentManager.title": "Gerenciador de Agentes",
"migration.whatsNew.features.agentManager.detail":
"Uma interface unificada para executar múltiplos agentes em paralelo, cada um em sua própria worktree — monitore o progresso, troque de contexto e revise alterações em um só lugar.",
"migration.whatsNew.features.foundation.title": "Base Compartilhada",
"migration.whatsNew.features.foundation.detail":
"Um núcleo pequeno e eficiente em todos os produtos Kilo. Uma experiência familiar independentemente de como você escolha trabalhar.",
"migration.whatsNew.blogLink": "Leia o anúncio completo",
"migration.whatsNew.docsLink": "Novidades e perguntas frequentes",
"migration.whatsNew.continue": "Continuar",
// Screen 2 — Migrate Settings
"migration.migrate.title": "Migre Suas Configurações",
"migration.migrate.subtitle": "Encontramos configurações da sua instalação anterior. Veja o que podemos trazer.",
"migration.roo.button": "Importar sessões",
"migration.roo.empty": "Nenhuma sessão do Roo Code encontrada.",
"migration.migrate.selectLabel": "Selecione o que migrar",
"migration.migrate.chatHistory": "Sessões de Chat e Histórico",
"migration.migrate.button": "Migrar Configurações",
"migration.migrate.skip": "Pular",
"migration.migrate.keysDetected": "{{count}} chaves detectadas",
"migration.migrate.serversConfigured": "{{count}} servidor(es) configurado(s)",
"migration.migrate.modesFound": "{{count}} modo(s) encontrado(s)",
"migration.migrate.nothingToMigrate": "Nada para migrar foi encontrado nas configurações legadas.",
// Migrate — item labels (reused from old select keys)
"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.autoApproval": "Aprovação Automática",
"migration.select.language": "Idioma da Interface",
"migration.select.autocomplete": "Configurações de Autocomplete",
// Migrate — completion
"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",
"migration.migrate.sessionsDetected": "{{count}} sessões detectadas",
"migration.error.continue": "Continuar",
@@ -1269,7 +1227,6 @@ export const dict = {
"migration.sessionFormat.unknownDate": "Data desconhecida",
"migration.sessionFormat.unknown": "Desconhecido",
"migration.sessionFormat.unknownError": "Erro desconhecido",
// legacy-migration end
"error.details.show": "Detalhes",
+2 -45
View File
@@ -1175,58 +1175,16 @@ 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.",
"settings.aboutKiloCode.rooImport.description": "Uvezite historiju razgovora iz instalacije Roo Code.",
"settings.aboutKiloCode.rooImport.button": "Uvezi sesije iz Roo Code",
// Screen 1 — What's New
"migration.whatsNew.title": "Šta je novo u Kilo Code",
"migration.whatsNew.subtitle": "Ponovo smo izgradili ekstenziju na bržem i efikasnijem temelju.",
"migration.whatsNew.features.performance.title": "Brže performanse agenta",
"migration.whatsNew.features.performance.detail":
"Paralelni pozivi alata i podagenti omogućavaju vašem agentu da radi više odjednom — tako trošite manje vremena čekajući, a više isporučujući.",
"migration.whatsNew.features.interface.title": "Pojednostavljeni interfejs",
"migration.whatsNew.features.interface.detail": "Manje distrakcija, lakše i brže za čitanje.",
"migration.whatsNew.features.agentManager.title": "Upravljač agentima",
"migration.whatsNew.features.agentManager.detail":
"Jedinstveni interfejs za pokretanje više agenata paralelno, svaki na svom worktree-u — pratite napredak, mijenjajte kontekst i pregledajte promjene na jednom mjestu.",
"migration.whatsNew.features.foundation.title": "Zajednički temelj",
"migration.whatsNew.features.foundation.detail":
"Jedno malo, efikasno jezgro kroz sve Kilo proizvode. Poznato iskustvo bez obzira na to kako odaberete raditi.",
"migration.whatsNew.blogLink": "Pročitajte cijeli oglas",
"migration.whatsNew.docsLink": "Novosti i često postavljana pitanja",
"migration.whatsNew.continue": "Nastavi",
// Screen 2 — Migrate Settings
"migration.migrate.title": "Migrirajte svoje postavke",
"migration.migrate.subtitle": "Pronašli smo postavke iz vaše prethodne instalacije. Evo šta možemo prenijeti.",
"migration.roo.button": "Uvezi sesije",
"migration.roo.empty": "Nisu pronađene sesije iz Roo Code.",
"migration.migrate.selectLabel": "Odaberite šta želite migrirati",
"migration.migrate.chatHistory": "Sesije razgovora i historija",
"migration.migrate.button": "Migriraj postavke",
"migration.migrate.skip": "Preskoči",
"migration.migrate.keysDetected": "{{count}} ključeva otkriveno",
"migration.migrate.serversConfigured": "{{count}} server(a) konfigurisano",
"migration.migrate.modesFound": "{{count}} režim(a) pronađeno",
"migration.migrate.nothingToMigrate": "U starim postavkama nije pronađeno ništa za migraciju.",
// Migrate — item labels (reused from old select keys)
"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.autoApproval": "Automatsko odobravanje",
"migration.select.language": "Jezik korisničkog interfejsa",
"migration.select.autocomplete": "Postavke automatskog dovršavanja",
// Migrate — completion
"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",
"migration.migrate.sessionsDetected": "Otkrivene {{count}} sesije",
"migration.error.continue": "Nastavi",
@@ -1260,7 +1218,6 @@ export const dict = {
"migration.sessionFormat.unknownDate": "Nepoznat datum",
"migration.sessionFormat.unknown": "Nepoznato",
"migration.sessionFormat.unknownError": "Nepoznata greška",
// legacy-migration end
"error.details.show": "Detalji",
+2 -46
View File
@@ -1169,59 +1169,16 @@ 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.",
"settings.aboutKiloCode.rooImport.description": "Importer samtalehistorik fra en installation af Roo Code.",
"settings.aboutKiloCode.rooImport.button": "Importer sessioner fra Roo Code",
// Screen 1 — What's New
"migration.whatsNew.title": "Nyheder i Kilo Code",
"migration.whatsNew.subtitle": "Vi har genopbygget udvidelsen på et hurtigere og mere effektivt fundament.",
"migration.whatsNew.features.performance.title": "Hurtigere agentydelse",
"migration.whatsNew.features.performance.detail":
"Parallelle værktøjskald og underagenter lader din agent tackle mere på én gang — så du bruger mindre tid på at vente og mere tid på at levere.",
"migration.whatsNew.features.interface.title": "Strømlinet brugerflade",
"migration.whatsNew.features.interface.detail": "Færre distraktioner, nemmere og hurtigere at læse.",
"migration.whatsNew.features.agentManager.title": "Agentstyring",
"migration.whatsNew.features.agentManager.detail":
"En samlet brugerflade til at køre flere agenter parallelt, hver på sit eget worktree — overvåg fremskridt, skift kontekst og gennemgå ændringer ét sted.",
"migration.whatsNew.features.foundation.title": "Fælles fundament",
"migration.whatsNew.features.foundation.detail":
"Én lille, effektiv kerne på tværs af alle Kilo-produkter. En velkendt oplevelse uanset hvordan du vælger at arbejde.",
"migration.whatsNew.blogLink": "Læs den fulde meddelelse",
"migration.whatsNew.docsLink": "Nyheder og ofte stillede spørgsmål",
"migration.whatsNew.continue": "Fortsæt",
// Screen 2 — Migrate Settings
"migration.migrate.title": "Migrer dine indstillinger",
"migration.migrate.subtitle":
"Vi har fundet indstillinger fra din tidligere installation. Her er, hvad vi kan overføre.",
"migration.roo.button": "Importér sessioner",
"migration.roo.empty": "Ingen Roo Code-sessioner fundet.",
"migration.migrate.selectLabel": "Vælg hvad der skal migreres",
"migration.migrate.chatHistory": "Chatsessioner og historik",
"migration.migrate.button": "Migrer indstillinger",
"migration.migrate.skip": "Spring over",
"migration.migrate.keysDetected": "{{count}} nøgler fundet",
"migration.migrate.serversConfigured": "{{count}} server(e) konfigureret",
"migration.migrate.modesFound": "{{count}} tilstand(e) fundet",
"migration.migrate.nothingToMigrate": "Der blev ikke fundet noget at migrere i legacy-indstillingerne.",
// Migrate — item labels (reused from old select keys)
"migration.select.providers": "Udbyder API-nøgler",
"migration.select.mcpServers": "MCP-servere",
"migration.select.customModes": "Brugerdefinerede tilstande / Agenter",
"migration.select.defaultModel": "Standardmodel",
"migration.select.autoApproval": "Automatisk godkendelse",
"migration.select.language": "UI-sprog",
"migration.select.autocomplete": "Indstillinger for autofuldførelse",
// Migrate — completion
"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",
"migration.migrate.sessionsDetected": "{{count}} sessioner fundet",
"migration.error.continue": "Fortsæt",
@@ -1255,7 +1212,6 @@ export const dict = {
"migration.sessionFormat.unknownDate": "Ukendt dato",
"migration.sessionFormat.unknown": "Ukendt",
"migration.sessionFormat.unknownError": "Ukendt fejl",
// legacy-migration end
"error.details.show": "Detaljer",
+2 -47
View File
@@ -1196,61 +1196,17 @@ 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.",
"settings.aboutKiloCode.rooImport.description":
"Importieren Sie den Konversationsverlauf von einer Installation von Roo Code.",
"settings.aboutKiloCode.rooImport.button": "Sitzungen aus Roo Code importieren",
// Screen 1 — What's New
"migration.whatsNew.title": "Neuigkeiten in Kilo Code",
"migration.whatsNew.subtitle":
"Wir haben die Erweiterung auf einer schnelleren, effizienteren Grundlage neu aufgebaut.",
"migration.whatsNew.features.performance.title": "Schnellere Agentenleistung",
"migration.whatsNew.features.performance.detail":
"Parallele Werkzeugaufrufe und Unteragenten lassen Ihren Agenten mehr gleichzeitig erledigen — so verbringen Sie weniger Zeit mit Warten und mehr Zeit mit Ergebnissen.",
"migration.whatsNew.features.interface.title": "Optimierte Oberfläche",
"migration.whatsNew.features.interface.detail": "Weniger Ablenkungen, einfacher und schneller zu lesen.",
"migration.whatsNew.features.agentManager.title": "Agentenverwaltung",
"migration.whatsNew.features.agentManager.detail":
"Eine einheitliche Oberfläche zum parallelen Ausführen mehrerer Agenten, jeweils in einem eigenen Worktree — Fortschritt überwachen, Kontext wechseln und Änderungen an einem Ort überprüfen.",
"migration.whatsNew.features.foundation.title": "Gemeinsame Grundlage",
"migration.whatsNew.features.foundation.detail":
"Ein kleiner, effizienter Kern über alle Kilo-Produkte hinweg. Ein vertrautes Erlebnis, egal wie Sie arbeiten.",
"migration.whatsNew.blogLink": "Die vollständige Ankündigung lesen",
"migration.whatsNew.docsLink": "Neuigkeiten & häufige Fragen",
"migration.whatsNew.continue": "Weiter",
// Screen 2 — Migrate Settings
"migration.migrate.title": "Ihre Einstellungen migrieren",
"migration.migrate.subtitle":
"Wir haben Einstellungen aus Ihrer vorherigen Installation gefunden. Hier ist, was wir übernehmen können.",
"migration.roo.button": "Sitzungen importieren",
"migration.roo.empty": "Keine Roo Code-Sitzungen gefunden.",
"migration.migrate.selectLabel": "Auswählen, was migriert werden soll",
"migration.migrate.chatHistory": "Chat-Sitzungen & Verlauf",
"migration.migrate.button": "Einstellungen migrieren",
"migration.migrate.skip": "Überspringen",
"migration.migrate.keysDetected": "{{count}} Schlüssel erkannt",
"migration.migrate.serversConfigured": "{{count}} Server konfiguriert",
"migration.migrate.modesFound": "{{count}} Modus/Modi gefunden",
"migration.migrate.nothingToMigrate": "In den Legacy-Einstellungen wurde nichts zum Migrieren gefunden.",
// Migrate — item labels (reused from old select keys)
"migration.select.providers": "Anbieter-API-Schlüssel",
"migration.select.mcpServers": "MCP-Server",
"migration.select.customModes": "Benutzerdefinierte Modi / Agenten",
"migration.select.defaultModel": "Standardmodell",
"migration.select.autoApproval": "Automatische Genehmigung",
"migration.select.language": "UI-Sprache",
"migration.select.autocomplete": "Einstellungen für Autovervollständigung",
// Migrate — completion
"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",
"migration.migrate.sessionsDetected": "{{count}} Sitzungen erkannt",
"migration.error.continue": "Weiter",
@@ -1284,7 +1240,6 @@ export const dict = {
"migration.sessionFormat.unknownDate": "Unbekanntes Datum",
"migration.sessionFormat.unknown": "Unbekannt",
"migration.sessionFormat.unknownError": "Unbekannter Fehler",
// legacy-migration end
"error.details.show": "Details",
+2 -48
View File
@@ -1155,59 +1155,14 @@ export const dict = {
"question.summary": "{{n}} of {{total}} questions",
"common.review": "Review",
// legacy-migration start
"settings.legacyMigration.link": "Migrate from Legacy Version",
"settings.aboutKiloCode.legacyMigration.title": "Legacy Migration",
"settings.aboutKiloCode.legacyMigration.description":
"Migrate settings from a previous installation of Kilo Code, including provider API keys and default model.",
"settings.aboutKiloCode.rooImport.description": "Import conversation history from a Roo Code installation.",
"settings.aboutKiloCode.rooImport.button": "Import Sessions from Roo Code",
// Screen 1 — What's New
"migration.whatsNew.title": "What's New in Kilo Code",
"migration.whatsNew.subtitle": "We've rebuilt the extension on a faster, more efficient foundation.",
"migration.whatsNew.features.performance.title": "Faster Agent Performance",
"migration.whatsNew.features.performance.detail":
"Parallel tool calls and subagents let your agent tackle more at once — so you spend less time watching and more time shipping.",
"migration.whatsNew.features.interface.title": "Streamlined Interface",
"migration.whatsNew.features.interface.detail": "Fewer distractions, easier and quicker to read.",
"migration.whatsNew.features.agentManager.title": "Agent Manager",
"migration.whatsNew.features.agentManager.detail":
"A unified interface for running multiple agents in parallel, each on its own worktree — monitor progress, switch context, and review changes in one place.",
"migration.whatsNew.features.foundation.title": "Shared Foundation",
"migration.whatsNew.features.foundation.detail":
"One small, efficient core across every Kilo product. A familiar experience however you choose to work.",
"migration.whatsNew.blogLink": "Read the full announcement",
"migration.whatsNew.docsLink": "What's new & FAQ",
"migration.whatsNew.continue": "Continue",
// Screen 2 — Migrate Settings
"migration.migrate.title": "Migrate Your Settings",
"migration.migrate.subtitle": "We found settings from your previous installation. Here's what we can bring over.",
"migration.roo.button": "Import Sessions",
"migration.roo.empty": "No Roo Code sessions found.",
"migration.migrate.selectLabel": "Select what to migrate",
"migration.migrate.chatHistory": "Chat Sessions & History",
"migration.migrate.button": "Migrate Settings",
"migration.migrate.skip": "Skip",
"migration.migrate.keysDetected": "{{count}} keys detected",
"migration.migrate.serversConfigured": "{{count}} server(s) configured",
"migration.migrate.modesFound": "{{count}} mode(s) found",
"migration.migrate.sessionsDetected": "{{count}} sessions detected",
"migration.migrate.nothingToMigrate": "Nothing to migrate was found in the legacy settings.",
// Migrate — item labels (reused from old select keys)
"migration.select.providers": "Provider API Keys",
"migration.select.mcpServers": "MCP Servers",
"migration.select.customModes": "Custom Modes / Agents",
"migration.select.defaultModel": "Default Model",
"migration.select.autoApproval": "Auto-Approval",
"migration.select.language": "UI Language",
"migration.select.autocomplete": "Autocomplete Settings",
// Migrate — completion
"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": "Done",
"migration.error.continue": "Continue",
"migration.sessionSummary.title": "Summary:",
@@ -1239,7 +1194,6 @@ export const dict = {
"migration.sessionFormat.unknownDate": "Unknown date",
"migration.sessionFormat.unknown": "Unknown",
"migration.sessionFormat.unknownError": "Unknown error",
// legacy-migration end
"error.details.show": "Details",
+2 -46
View File
@@ -1185,61 +1185,18 @@ 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.",
"settings.aboutKiloCode.rooImport.description":
"Importa el historial de conversaciones de una instalación de Roo Code.",
"settings.aboutKiloCode.rooImport.button": "Importar sesiones desde Roo Code",
// Screen 1 — What's New
"migration.whatsNew.title": "Novedades en Kilo Code",
"migration.whatsNew.subtitle": "Hemos reconstruido la extensión sobre una base más rápida y eficiente.",
"migration.whatsNew.features.performance.title": "Rendimiento de agente más rápido",
"migration.whatsNew.features.performance.detail":
"Las llamadas a herramientas en paralelo y los subagentes permiten que tu agente aborde más a la vez — así pasas menos tiempo esperando y más tiempo entregando.",
"migration.whatsNew.features.interface.title": "Interfaz optimizada",
"migration.whatsNew.features.interface.detail": "Menos distracciones, más fácil y rápido de leer.",
"migration.whatsNew.features.agentManager.title": "Administrador de agentes",
"migration.whatsNew.features.agentManager.detail":
"Una interfaz unificada para ejecutar múltiples agentes en paralelo, cada uno en su propio worktree — supervisa el progreso, cambia de contexto y revisa cambios en un solo lugar.",
"migration.whatsNew.features.foundation.title": "Base compartida",
"migration.whatsNew.features.foundation.detail":
"Un núcleo pequeño y eficiente en todos los productos Kilo. Una experiencia familiar sin importar cómo elijas trabajar.",
"migration.whatsNew.blogLink": "Leer el anuncio completo",
"migration.whatsNew.docsLink": "Novedades y preguntas frecuentes",
"migration.whatsNew.continue": "Continuar",
// Screen 2 — Migrate Settings
"migration.migrate.title": "Migra tu configuración",
"migration.migrate.subtitle":
"Encontramos configuraciones de tu instalación anterior. Esto es lo que podemos transferir.",
"migration.roo.button": "Importar sesiones",
"migration.roo.empty": "No se encontraron sesiones de Roo Code.",
"migration.migrate.selectLabel": "Selecciona qué migrar",
"migration.migrate.chatHistory": "Sesiones de chat e historial",
"migration.migrate.button": "Migrar configuración",
"migration.migrate.skip": "Omitir",
"migration.migrate.keysDetected": "{{count}} claves detectadas",
"migration.migrate.serversConfigured": "{{count}} servidor(es) configurado(s)",
"migration.migrate.modesFound": "{{count}} modo(s) encontrado(s)",
"migration.migrate.sessionsDetected": "{{count}} sesiones detectadas",
"migration.migrate.nothingToMigrate": "No se encontró nada para migrar en la configuración heredada.",
// Migrate — item labels (reused from old select keys)
"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.autoApproval": "Aprobación automática",
"migration.select.language": "Idioma de la interfaz",
"migration.select.autocomplete": "Configuración de autocompletado",
// Migrate — completion
"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",
"migration.error.continue": "Continuar",
"migration.sessionSummary.title": "Resumen:",
@@ -1271,7 +1228,6 @@ export const dict = {
"migration.sessionFormat.unknownDate": "Fecha desconocida",
"migration.sessionFormat.unknown": "Desconocido",
"migration.sessionFormat.unknownError": "Error desconocido",
// legacy-migration end
"error.details.show": "Detalles",
+2 -45
View File
@@ -1167,59 +1167,17 @@ 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 ارائه‌دهنده و مدل پیش‌فرض.",
"settings.aboutKiloCode.rooImport.description": "تاریخچه مکالمات را از یک نصب Roo Code وارد کنید.",
"settings.aboutKiloCode.rooImport.button": "وارد کردن جلسات از Roo Code",
// Screen 1 — What's New
"migration.whatsNew.title": "تازه‌های Kilo Code",
"migration.whatsNew.subtitle": "افزونه را بر پایه‌ای سریع‌تر و کارآمدتر بازسازی کرده‌ایم.",
"migration.whatsNew.features.performance.title": "عملکرد سریع‌تر عامل",
"migration.whatsNew.features.performance.detail":
"فراخوانی ابزارهای موازی و زیرعامل‌ها به عامل شما امکان می‌دهند کارهای بیشتری را همزمان انجام دهد — تا زمان کمتری صرف نظارت کنید و زمان بیشتری برای ارسال داشته باشید.",
"migration.whatsNew.features.interface.title": "رابط کاربری ساده‌تر",
"migration.whatsNew.features.interface.detail": "حواس‌پرتی کمتر، خواندن آسان‌تر و سریع‌تر.",
"migration.whatsNew.features.agentManager.title": "Agent Manager",
"migration.whatsNew.features.agentManager.detail":
"یک رابط یکپارچه برای اجرای چندین عامل به‌صورت موازی، هر کدام در worktree مخصوص خود — پیشرفت را رصد کنید، بین زمینه‌ها جابه‌جا شوید و تغییرات را در یک مکان بررسی کنید.",
"migration.whatsNew.features.foundation.title": "پایه مشترک",
"migration.whatsNew.features.foundation.detail":
"یک هسته کوچک و کارآمد در تمام محصولات Kilo. تجربه‌ای آشنا، هر طور که انتخاب کنید کار کنید.",
"migration.whatsNew.blogLink": "خواندن اعلامیه کامل",
"migration.whatsNew.docsLink": "چه چیزی جدید است و سؤالات متداول",
"migration.whatsNew.continue": "ادامه",
// Screen 2 — Migrate Settings
"migration.migrate.title": "تنظیمات خود را منتقل کنید",
"migration.migrate.subtitle": "تنظیماتی از نصب قبلی شما یافتیم. این‌ها چیزهایی هستند که می‌توانیم منتقل کنیم.",
"migration.roo.button": "وارد کردن جلسات",
"migration.roo.empty": "هیچ جلسه‌ای از Roo Code یافت نشد.",
"migration.migrate.selectLabel": "انتخاب موارد برای انتقال",
"migration.migrate.chatHistory": "جلسات و تاریخچه چت",
"migration.migrate.button": "انتقال تنظیمات",
"migration.migrate.skip": "رد کردن",
"migration.migrate.keysDetected": "{{count}} کلید شناسایی شد",
"migration.migrate.serversConfigured": "{{count}} سرور پیکربندی شده",
"migration.migrate.modesFound": "{{count}} حالت یافت شد",
"migration.migrate.sessionsDetected": "{{count}} نشست شناسایی شد",
"migration.migrate.nothingToMigrate": "هیچ موردی برای انتقال در تنظیمات قدیمی یافت نشد.",
// Migrate — item labels (reused from old select keys)
"migration.select.providers": "کلیدهای API ارائه‌دهنده",
"migration.select.mcpServers": "سرورهای MCP",
"migration.select.customModes": "حالت‌ها / عوامل سفارشی",
"migration.select.defaultModel": "مدل پیش‌فرض",
"migration.select.autoApproval": "تأیید خودکار",
"migration.select.language": "زبان رابط کاربری",
"migration.select.autocomplete": "تنظیمات تکمیل خودکار",
// Migrate — completion
"migration.complete.summary": "{{success}} از {{total}} مورد با موفقیت منتقل شد.",
"migration.complete.cleanup": "حذف داده‌های تنظیمات قدیمی",
"migration.complete.cleanupDescription":
"این گزینه تنظیمات قدیمی را از حافظه VS Code حذف می‌کند. پس از این کار، امکان اجرای مجدد این انتقال وجود نخواهد داشت.",
"migration.complete.done": "انجام شد",
"migration.error.continue": "ادامه",
"migration.sessionSummary.title": "خلاصه:",
@@ -1251,7 +1209,6 @@ export const dict = {
"migration.sessionFormat.unknownDate": "تاریخ نامشخص",
"migration.sessionFormat.unknown": "نامشخص",
"migration.sessionFormat.unknownError": "خطای نامشخص",
// legacy-migration end
"error.details.show": "جزئیات",
+2 -46
View File
@@ -1203,60 +1203,17 @@ 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.",
"settings.aboutKiloCode.rooImport.description":
"Importer l'historique des conversations depuis une installation de Roo Code.",
"settings.aboutKiloCode.rooImport.button": "Importer les sessions depuis Roo Code",
// Screen 1 — What's New
"migration.whatsNew.title": "Nouveautés de Kilo Code",
"migration.whatsNew.subtitle": "Nous avons reconstruit l'extension sur une base plus rapide et plus efficace.",
"migration.whatsNew.features.performance.title": "Performance accélérée de l'agent",
"migration.whatsNew.features.performance.detail":
"Les appels d'outils en parallèle et les sous-agents permettent à votre agent de traiter plus de tâches simultanément — vous passez moins de temps à attendre et plus de temps à livrer.",
"migration.whatsNew.features.interface.title": "Interface simplifiée",
"migration.whatsNew.features.interface.detail": "Moins de distractions, plus facile et plus rapide à lire.",
"migration.whatsNew.features.agentManager.title": "Gestionnaire d'agents",
"migration.whatsNew.features.agentManager.detail":
"Une interface unifiée pour exécuter plusieurs agents en parallèle, chacun sur son propre arbre de travail — surveillez la progression, changez de contexte et examinez les modifications depuis un seul endroit.",
"migration.whatsNew.features.foundation.title": "Base partagée",
"migration.whatsNew.features.foundation.detail":
"Un noyau petit et efficace partagé par tous les produits Kilo. Une expérience familière quelle que soit votre façon de travailler.",
"migration.whatsNew.blogLink": "Lire l'annonce complète",
"migration.whatsNew.docsLink": "Nouveautés & questions fréquentes",
"migration.whatsNew.continue": "Continuer",
// Screen 2 — Migrate Settings
"migration.migrate.title": "Migrer vos paramètres",
"migration.migrate.subtitle":
"Nous avons trouvé des paramètres de votre précédente installation. Voici ce que nous pouvons récupérer.",
"migration.roo.button": "Importer les sessions",
"migration.roo.empty": "Aucune session Roo Code trouvée.",
"migration.migrate.selectLabel": "Sélectionnez ce que vous souhaitez migrer",
"migration.migrate.chatHistory": "Sessions de discussion et historique",
"migration.migrate.button": "Migrer les paramètres",
"migration.migrate.skip": "Ignorer",
"migration.migrate.keysDetected": "{{count}} clés détectées",
"migration.migrate.serversConfigured": "{{count}} serveur(s) configuré(s)",
"migration.migrate.modesFound": "{{count}} mode(s) trouvé(s)",
"migration.migrate.nothingToMigrate": "Rien à migrer n'a été trouvé dans les anciens paramètres.",
// Migrate — item labels (reused from old select keys)
"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.autoApproval": "Approbation automatique",
"migration.select.language": "Langue de l'interface",
"migration.select.autocomplete": "Paramètres de saisie semi-automatique",
// Migrate — completion
"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é",
"migration.migrate.sessionsDetected": "{{count}} sessions détectées",
"migration.error.continue": "Continuer",
@@ -1292,7 +1249,6 @@ export const dict = {
"migration.sessionFormat.unknownDate": "Date inconnue",
"migration.sessionFormat.unknown": "Inconnu",
"migration.sessionFormat.unknownError": "Erreur inconnue",
// legacy-migration end
"error.details.show": "Détails",
+2 -39
View File
@@ -1052,52 +1052,15 @@ export const dict = {
"profile.switchingAccount": "Cambio account...",
"question.summary": "{{n}} di {{total}} domande",
"common.review": "Revisione",
"settings.legacyMigration.link": "Migra dalla versione legacy",
"settings.aboutKiloCode.legacyMigration.title": "Migrazione legacy",
"settings.aboutKiloCode.legacyMigration.description":
"Migra le impostazioni da una precedente installazione di Kilo Code, incluse API key dei provider e modello predefinito.",
"settings.aboutKiloCode.rooImport.description":
"Importa la cronologia delle conversazioni da una installazione di Roo Code.",
"settings.aboutKiloCode.rooImport.button": "Importa sessioni da Roo Code",
"migration.whatsNew.title": "Novità in Kilo Code",
"migration.whatsNew.subtitle": "Abbiamo ricostruito l'estensione su fondamenta più veloci ed efficienti.",
"migration.whatsNew.features.performance.title": "Prestazioni agente più rapide",
"migration.whatsNew.features.performance.detail":
"Chiamate tool parallele e sub-agent permettono all'agente di gestire più cose insieme, così passi meno tempo ad aspettare e più tempo a lavorare.",
"migration.whatsNew.features.interface.title": "Interfaccia semplificata",
"migration.whatsNew.features.interface.detail": "Meno distrazioni, lettura più semplice e rapida.",
"migration.whatsNew.features.agentManager.title": "Agent Manager",
"migration.whatsNew.features.agentManager.detail":
"Un'interfaccia unificata per eseguire più agenti in parallelo, ognuno nel proprio worktree: monitora avanzamento, cambia contesto e rivedi modifiche in un unico posto.",
"migration.whatsNew.features.foundation.title": "Fondamenta condivise",
"migration.whatsNew.features.foundation.detail":
"Un core piccolo ed efficiente per ogni prodotto Kilo. Un'esperienza familiare comunque tu scelga di lavorare.",
"migration.whatsNew.blogLink": "Leggi l'annuncio completo",
"migration.whatsNew.docsLink": "Novità e FAQ",
"migration.whatsNew.continue": "Continua",
"migration.migrate.title": "Migra le impostazioni",
"migration.migrate.subtitle":
"Abbiamo trovato impostazioni dalla precedente installazione. Ecco cosa possiamo importare.",
"migration.roo.button": "Importa sessioni",
"migration.roo.empty": "Nessuna sessione di Roo Code trovata.",
"migration.migrate.selectLabel": "Seleziona cosa migrare",
"migration.migrate.chatHistory": "Sessioni chat e cronologia",
"migration.migrate.button": "Migra impostazioni",
"migration.migrate.skip": "Salta",
"migration.migrate.keysDetected": "{{count}} chiavi rilevate",
"migration.migrate.serversConfigured": "{{count}} server configurati",
"migration.migrate.modesFound": "{{count}} modalità trovate",
"migration.migrate.sessionsDetected": "{{count}} sessioni rilevate",
"migration.migrate.nothingToMigrate": "Non è stato trovato nulla da migrare nelle impostazioni legacy.",
"migration.select.providers": "API key provider",
"migration.select.mcpServers": "Server MCP",
"migration.select.customModes": "Modalità / agenti personalizzati",
"migration.select.defaultModel": "Modello predefinito",
"migration.select.autoApproval": "Approvazione automatica",
"migration.select.language": "Lingua UI",
"migration.select.autocomplete": "Impostazioni autocompletamento",
"migration.complete.summary": "{{success}} di {{total}} elementi migrati correttamente.",
"migration.complete.cleanup": "Rimuovi dati impostazioni legacy",
"migration.complete.cleanupDescription":
"Rimuove le vecchie impostazioni dallo storage di VS Code. Non potrai rieseguire questa migrazione.",
"migration.complete.done": "Fine",
"migration.error.continue": "Continua",
"migration.sessionSummary.title": "Riepilogo:",
+2 -45
View File
@@ -1162,58 +1162,16 @@ 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から設定を移行します。",
"settings.aboutKiloCode.rooImport.description": "インストールしたRoo Codeから会話履歴を移行します。",
"settings.aboutKiloCode.rooImport.button": "Roo Codeからセッションをインポート",
// Screen 1 — What's New
"migration.whatsNew.title": "Kilo Codeの新機能",
"migration.whatsNew.subtitle": "より高速で効率的な基盤上に拡張機能を再構築しました。",
"migration.whatsNew.features.performance.title": "高速なエージェントパフォーマンス",
"migration.whatsNew.features.performance.detail":
"並列ツール呼び出しとサブエージェントにより、エージェントがより多くのタスクを同時に処理できます — 待ち時間が減り、作業効率が向上します。",
"migration.whatsNew.features.interface.title": "洗練されたインターフェース",
"migration.whatsNew.features.interface.detail": "不要な要素を排除し、より読みやすく素早く操作できます。",
"migration.whatsNew.features.agentManager.title": "エージェントマネージャー",
"migration.whatsNew.features.agentManager.detail":
"複数のエージェントを並列実行するための統合インターフェース。それぞれ独自のワークツリー上で動作し、進捗の確認、コンテキストの切り替え、変更のレビューを一箇所で行えます。",
"migration.whatsNew.features.foundation.title": "共通基盤",
"migration.whatsNew.features.foundation.detail":
"すべてのKilo製品で共有される小さく効率的なコア。どのような作業スタイルでも馴染みのある体験を提供します。",
"migration.whatsNew.blogLink": "完全なアナウンスを読む",
"migration.whatsNew.docsLink": "新機能とよくある質問",
"migration.whatsNew.continue": "続行",
// Screen 2 — Migrate Settings
"migration.migrate.title": "設定の移行",
"migration.migrate.subtitle": "以前のインストールから設定が見つかりました。移行可能な項目は以下の通りです。",
"migration.roo.button": "セッションをインポート",
"migration.roo.empty": "Roo Codeのセッションが見つかりませんでした。",
"migration.migrate.selectLabel": "移行する項目を選択",
"migration.migrate.chatHistory": "チャットセッションと履歴",
"migration.migrate.button": "設定を移行",
"migration.migrate.skip": "スキップ",
"migration.migrate.keysDetected": "{{count}}個のキーを検出",
"migration.migrate.serversConfigured": "{{count}}個のサーバーが設定済み",
"migration.migrate.modesFound": "{{count}}個のモードが見つかりました",
"migration.migrate.nothingToMigrate": "レガシー設定に移行する項目が見つかりませんでした。",
// Migrate — item labels (reused from old select keys)
"migration.select.providers": "プロバイダーのAPIキー",
"migration.select.mcpServers": "MCPサーバー",
"migration.select.customModes": "カスタムモード / エージェント",
"migration.select.defaultModel": "デフォルトモデル",
"migration.select.autoApproval": "自動承認",
"migration.select.language": "UI言語",
"migration.select.autocomplete": "オートコンプリート設定",
// Migrate — completion
"migration.complete.summary": "{{total}}個中{{success}}個の項目が正常に移行されました。",
"migration.complete.cleanup": "レガシー設定データを削除する",
"migration.complete.cleanupDescription":
"VS Codeのストレージから古い設定を削除します。この移行を再度実行することはできなくなります。",
"migration.complete.done": "完了",
"migration.migrate.sessionsDetected": "{{count}} 件のセッションが見つかりました",
"migration.error.continue": "続行",
@@ -1247,7 +1205,6 @@ export const dict = {
"migration.sessionFormat.unknownDate": "不明な日付",
"migration.sessionFormat.unknown": "不明",
"migration.sessionFormat.unknownError": "不明なエラー",
// legacy-migration end
"error.details.show": "詳細",
+2 -45
View File
@@ -1149,58 +1149,16 @@ 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 설치에서 설정을 마이그레이션합니다.",
"settings.aboutKiloCode.rooImport.description": "Roo Code 설치에서 대화 기록을 가져옵니다.",
"settings.aboutKiloCode.rooImport.button": "Roo Code에서 세션 가져오기",
// Screen 1 — What's New
"migration.whatsNew.title": "Kilo Code의 새로운 기능",
"migration.whatsNew.subtitle": "더 빠르고 효율적인 기반 위에 확장 프로그램을 재구축했습니다.",
"migration.whatsNew.features.performance.title": "더 빠른 에이전트 성능",
"migration.whatsNew.features.performance.detail":
"병렬 도구 호출과 하위 에이전트를 통해 에이전트가 더 많은 작업을 동시에 처리할 수 있습니다 — 대기 시간은 줄이고 작업 효율은 높입니다.",
"migration.whatsNew.features.interface.title": "간소화된 인터페이스",
"migration.whatsNew.features.interface.detail": "불필요한 요소를 줄여 더 쉽고 빠르게 읽을 수 있습니다.",
"migration.whatsNew.features.agentManager.title": "에이전트 관리자",
"migration.whatsNew.features.agentManager.detail":
"여러 에이전트를 각자의 작업 트리에서 병렬로 실행할 수 있는 통합 인터페이스 — 진행 상황 모니터링, 컨텍스트 전환, 변경 사항 검토를 한 곳에서 수행합니다.",
"migration.whatsNew.features.foundation.title": "공유 기반",
"migration.whatsNew.features.foundation.detail":
"모든 Kilo 제품에 걸쳐 하나의 작고 효율적인 코어. 어떤 방식으로 작업하든 익숙한 경험을 제공합니다.",
"migration.whatsNew.blogLink": "전체 공지 읽기",
"migration.whatsNew.docsLink": "새로운 기능 및 자주 묻는 질문",
"migration.whatsNew.continue": "계속",
// Screen 2 — Migrate Settings
"migration.migrate.title": "설정 마이그레이션",
"migration.migrate.subtitle": "이전 설치에서 설정을 찾았습니다. 가져올 수 있는 항목은 다음과 같습니다.",
"migration.roo.button": "세션 가져오기",
"migration.roo.empty": "Roo Code 세션을 찾을 수 없습니다.",
"migration.migrate.selectLabel": "마이그레이션할 항목 선택",
"migration.migrate.chatHistory": "채팅 세션 및 기록",
"migration.migrate.button": "설정 마이그레이션",
"migration.migrate.skip": "건너뛰기",
"migration.migrate.keysDetected": "{{count}}개의 키 감지됨",
"migration.migrate.serversConfigured": "{{count}}개의 서버 구성됨",
"migration.migrate.modesFound": "{{count}}개의 모드 발견됨",
"migration.migrate.nothingToMigrate": "레거시 설정에서 마이그레이션할 항목을 찾지 못했습니다.",
// Migrate — item labels (reused from old select keys)
"migration.select.providers": "공급자 API 키",
"migration.select.mcpServers": "MCP 서버",
"migration.select.customModes": "사용자 지정 모드 / 에이전트",
"migration.select.defaultModel": "기본 모델",
"migration.select.autoApproval": "자동 승인",
"migration.select.language": "UI 언어",
"migration.select.autocomplete": "자동 완성 설정",
// Migrate — completion
"migration.complete.summary": "{{total}}개 중 {{success}}개 항목이 성공적으로 마이그레이션되었습니다.",
"migration.complete.cleanup": "레거시 설정 데이터 제거",
"migration.complete.cleanupDescription":
"이 작업은 VS Code 저장소에서 이전 설정을 제거합니다. 이 마이그레이션을 다시 실행할 수 없게 됩니다.",
"migration.complete.done": "완료",
"migration.migrate.sessionsDetected": "{{count}}개의 세션이 감지되었습니다",
"migration.error.continue": "계속",
@@ -1234,7 +1192,6 @@ export const dict = {
"migration.sessionFormat.unknownDate": "알 수 없는 날짜",
"migration.sessionFormat.unknown": "알 수 없음",
"migration.sessionFormat.unknownError": "알 수 없는 오류",
// legacy-migration end
"error.details.show": "상세 정보",
+2 -46
View File
@@ -1155,59 +1155,16 @@ export const dict = {
"question.summary": "{{n}} van de {{total}} vragen",
"common.review": "Beoordelen",
// legacy-migration start
"settings.legacyMigration.link": "Migreer van Legacy Versie",
"settings.aboutKiloCode.legacyMigration.title": "Legacy Migratie",
"settings.aboutKiloCode.legacyMigration.description":
"Migreer instellingen van een eerdere installatie van Kilo Code, inclusief provider API-sleutels en standaard model.",
"settings.aboutKiloCode.rooImport.description": "Importeer gespreksgeschiedenis van een Roo Code installatie.",
"settings.aboutKiloCode.rooImport.button": "Sessies importeren uit Roo Code",
// Screen 1 — What's New
"migration.whatsNew.title": "Wat is er Nieuw in Kilo Code",
"migration.whatsNew.subtitle": "We hebben de extensie opnieuw opgebouwd op een snellere, efficiëntere basis.",
"migration.whatsNew.features.performance.title": "Snellere Agent Prestaties",
"migration.whatsNew.features.performance.detail":
"Parallelle tool calls en subagents laten je agent meer tegelijk aanpakken — zodat je minder tijd besteedt aan wachten en meer tijd aan releasen.",
"migration.whatsNew.features.interface.title": "Gestroomlijnde Interface",
"migration.whatsNew.features.interface.detail": "Minder afleiding, makkelijker en sneller te lezen.",
"migration.whatsNew.features.agentManager.title": "Agentenbeheer",
"migration.whatsNew.features.agentManager.detail":
"Een uniforme interface voor het parallel uitvoeren van meerdere agents, elk op zijn eigen worktree — monitor de voortgang, wissel van context en bekijk wijzigingen op één plek.",
"migration.whatsNew.features.foundation.title": "Gedeelde Basis",
"migration.whatsNew.features.foundation.detail":
"Één kleine, efficiënte kern voor elk Kilo-product. Een vertrouwde ervaring, hoe je ook wilt werken.",
"migration.whatsNew.blogLink": "Lees de volledige aankondiging",
"migration.whatsNew.docsLink": "Wat is er nieuw & veelgestelde vragen",
"migration.whatsNew.continue": "Doorgaan",
// Screen 2 — Migrate Settings
"migration.migrate.title": "Migreer Je Instellingen",
"migration.migrate.subtitle":
"We hebben instellingen gevonden van je vorige installatie. Hier is wat we kunnen overzetten.",
"migration.roo.button": "Sessies importeren",
"migration.roo.empty": "Geen Roo Code-sessies gevonden.",
"migration.migrate.selectLabel": "Selecteer wat je wilt migreren",
"migration.migrate.chatHistory": "Chatsessies & Geschiedenis",
"migration.migrate.button": "Migreer Instellingen",
"migration.migrate.skip": "Overslaan",
"migration.migrate.keysDetected": "{{count}} sleutels gedetecteerd",
"migration.migrate.serversConfigured": "{{count}} server(s) geconfigureerd",
"migration.migrate.modesFound": "{{count}} modus(sen) gevonden",
"migration.migrate.nothingToMigrate": "Er is niets om te migreren gevonden in de oude instellingen.",
// Migrate — item labels (reused from old select keys)
"migration.select.providers": "Provider API-sleutels",
"migration.select.mcpServers": "MCP Servers",
"migration.select.customModes": "Aangepaste Modi / Agents",
"migration.select.defaultModel": "Standaard Model",
"migration.select.autoApproval": "Automatische Goedkeuring",
"migration.select.language": "UI Taal",
"migration.select.autocomplete": "Automatisch Aanvullen Instellingen",
// Migrate — completion
"migration.complete.summary": "{{success}} van de {{total}} items succesvol gemigreerd.",
"migration.complete.cleanup": "Verwijder oude instellingendata",
"migration.complete.cleanupDescription":
"Dit verwijdert de oude instellingen uit de VS Code-opslag. U zult deze migratie niet opnieuw kunnen uitvoeren.",
"migration.complete.done": "Klaar",
"migration.migrate.sessionsDetected": "{{count}} sessies gedetecteerd",
"migration.error.continue": "Doorgaan",
@@ -1241,7 +1198,6 @@ export const dict = {
"migration.sessionFormat.unknownDate": "Onbekende datum",
"migration.sessionFormat.unknown": "Onbekend",
"migration.sessionFormat.unknownError": "Onbekende fout",
// legacy-migration end
"error.details.show": "Details",
+2 -45
View File
@@ -1168,58 +1168,16 @@ 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.",
"settings.aboutKiloCode.rooImport.description": "Importer samtalehistorikk fra en installasjon av Roo Code.",
"settings.aboutKiloCode.rooImport.button": "Importer økter fra Roo Code",
// Screen 1 — What's New
"migration.whatsNew.title": "Hva er nytt i Kilo Code",
"migration.whatsNew.subtitle": "Vi har bygget utvidelsen på nytt med et raskere og mer effektivt grunnlag.",
"migration.whatsNew.features.performance.title": "Raskere agentytelse",
"migration.whatsNew.features.performance.detail":
"Parallelle verktøykall og underagenter lar agenten din håndtere mer samtidig — slik at du bruker mindre tid på å vente og mer tid på å levere.",
"migration.whatsNew.features.interface.title": "Strømlinjeformet grensesnitt",
"migration.whatsNew.features.interface.detail": "Færre forstyrrelser, enklere og raskere å lese.",
"migration.whatsNew.features.agentManager.title": "Agentbehandling",
"migration.whatsNew.features.agentManager.detail":
"Et samlet grensesnitt for å kjøre flere agenter parallelt, hver på sitt eget worktree — overvåk fremdrift, bytt kontekst og gjennomgå endringer på ett sted.",
"migration.whatsNew.features.foundation.title": "Delt grunnlag",
"migration.whatsNew.features.foundation.detail":
"Én liten, effektiv kjerne på tvers av alle Kilo-produkter. En kjent opplevelse uansett hvordan du velger å jobbe.",
"migration.whatsNew.blogLink": "Les hele kunngjøringen",
"migration.whatsNew.docsLink": "Nyheter og ofte stilte spørsmål",
"migration.whatsNew.continue": "Fortsett",
// Screen 2 — Migrate Settings
"migration.migrate.title": "Migrer innstillingene dine",
"migration.migrate.subtitle": "Vi fant innstillinger fra din tidligere installasjon. Her er hva vi kan ta med over.",
"migration.roo.button": "Importer økter",
"migration.roo.empty": "Ingen Roo Code-økter funnet.",
"migration.migrate.selectLabel": "Velg hva som skal migreres",
"migration.migrate.chatHistory": "Chatøkter og historikk",
"migration.migrate.button": "Migrer innstillinger",
"migration.migrate.skip": "Hopp over",
"migration.migrate.keysDetected": "{{count}} nøkler oppdaget",
"migration.migrate.serversConfigured": "{{count}} server(e) konfigurert",
"migration.migrate.modesFound": "{{count}} modus(er) funnet",
"migration.migrate.nothingToMigrate": "Ingenting å migrere ble funnet i de eldre innstillingene.",
// Migrate — item labels (reused from old select keys)
"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.autoApproval": "Automatisk godkjenning",
"migration.select.language": "UI-språk",
"migration.select.autocomplete": "Innstillinger for autofullføring",
// Migrate — completion
"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",
"migration.migrate.sessionsDetected": "{{count}} økter oppdaget",
"migration.error.continue": "Fortsett",
@@ -1253,7 +1211,6 @@ export const dict = {
"migration.sessionFormat.unknownDate": "Ukjent dato",
"migration.sessionFormat.unknown": "Ukjent",
"migration.sessionFormat.unknownError": "Ukjent feil",
// legacy-migration end
"task.todos.progress": "{{done}}/{{total}} oppgaver fullført",
"task.todos.allDone": "{{count}} oppgaver fullført",
+2 -45
View File
@@ -1175,58 +1175,16 @@ 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.",
"settings.aboutKiloCode.rooImport.description": "Importuj historię rozmów z instalacji Roo Code.",
"settings.aboutKiloCode.rooImport.button": "Importuj sesje z Roo Code",
// Screen 1 — What's New
"migration.whatsNew.title": "Co nowego w Kilo Code",
"migration.whatsNew.subtitle": "Przebudowaliśmy rozszerzenie na szybszym i wydajniejszym fundamencie.",
"migration.whatsNew.features.performance.title": "Szybsza wydajność agenta",
"migration.whatsNew.features.performance.detail":
"Równoległe wywołania narzędzi i podagenci pozwalają agentowi robić więcej naraz — mniej czekania, więcej działania.",
"migration.whatsNew.features.interface.title": "Uproszczony interfejs",
"migration.whatsNew.features.interface.detail": "Mniej rozpraszaczy, łatwiejszy i szybszy do czytania.",
"migration.whatsNew.features.agentManager.title": "Menedżer agentów",
"migration.whatsNew.features.agentManager.detail":
"Zunifikowany interfejs do uruchamiania wielu agentów równolegle, każdy na własnym drzewie roboczym — monitoruj postęp, przełączaj kontekst i przeglądaj zmiany w jednym miejscu.",
"migration.whatsNew.features.foundation.title": "Wspólny fundament",
"migration.whatsNew.features.foundation.detail":
"Jedno małe, wydajne jądro we wszystkich produktach Kilo. Znajome doświadczenie niezależnie od sposobu pracy.",
"migration.whatsNew.blogLink": "Przeczytaj pełne ogłoszenie",
"migration.whatsNew.docsLink": "Nowości i często zadawane pytania",
"migration.whatsNew.continue": "Kontynuuj",
// Screen 2 — Migrate Settings
"migration.migrate.title": "Migruj swoje ustawienia",
"migration.migrate.subtitle": "Znaleźliśmy ustawienia z poprzedniej instalacji. Oto co możemy przenieść.",
"migration.roo.button": "Importuj sesje",
"migration.roo.empty": "Nie znaleziono sesji Roo Code.",
"migration.migrate.selectLabel": "Wybierz, co zmigrować",
"migration.migrate.chatHistory": "Sesje czatu i historia",
"migration.migrate.button": "Migruj ustawienia",
"migration.migrate.skip": "Pomiń",
"migration.migrate.keysDetected": "Wykryto {{count}} kluczy",
"migration.migrate.serversConfigured": "Skonfigurowano {{count}} serwer(ów)",
"migration.migrate.modesFound": "Znaleziono {{count}} tryb(ów)",
"migration.migrate.nothingToMigrate": "W starszych ustawieniach nie znaleziono niczego do zmigrowania.",
// Migrate — item labels (reused from old select keys)
"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.autoApproval": "Automatyczne zatwierdzanie",
"migration.select.language": "Język interfejsu",
"migration.select.autocomplete": "Ustawienia autouzupełniania",
// Migrate — completion
"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",
"migration.migrate.sessionsDetected": "Wykryto {{count}} sesji",
"migration.error.continue": "Kontynuuj",
@@ -1260,7 +1218,6 @@ export const dict = {
"migration.sessionFormat.unknownDate": "Nieznana data",
"migration.sessionFormat.unknown": "Nieznane",
"migration.sessionFormat.unknownError": "Nieznany błąd",
// legacy-migration end
"error.details.show": "Szczegóły",
+2 -45
View File
@@ -1169,58 +1169,16 @@ 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-ключи провайдеров и модель по умолчанию.",
"settings.aboutKiloCode.rooImport.description": "Импорт истории переписки из установки Roo Code.",
"settings.aboutKiloCode.rooImport.button": "Импортировать сеансы из Roo Code",
// Screen 1 — What's New
"migration.whatsNew.title": "Что нового в Kilo Code",
"migration.whatsNew.subtitle": "Мы перестроили расширение на более быстрой и эффективной основе.",
"migration.whatsNew.features.performance.title": "Более быстрая работа агента",
"migration.whatsNew.features.performance.detail":
"Параллельные вызовы инструментов и подагенты позволяют вашему агенту делать больше одновременно — меньше ожидания, больше результатов.",
"migration.whatsNew.features.interface.title": "Упрощённый интерфейс",
"migration.whatsNew.features.interface.detail": "Меньше отвлекающих факторов, проще и быстрее для чтения.",
"migration.whatsNew.features.agentManager.title": "Менеджер агентов",
"migration.whatsNew.features.agentManager.detail":
"Единый интерфейс для запуска нескольких агентов параллельно, каждый в своём worktree — отслеживайте прогресс, переключайте контекст и просматривайте изменения в одном месте.",
"migration.whatsNew.features.foundation.title": "Общая основа",
"migration.whatsNew.features.foundation.detail":
"Одно компактное и эффективное ядро для всех продуктов Kilo. Знакомый опыт независимо от выбранного способа работы.",
"migration.whatsNew.blogLink": "Читать полный анонс",
"migration.whatsNew.docsLink": "Что нового и часто задаваемые вопросы",
"migration.whatsNew.continue": "Продолжить",
// Screen 2 — Migrate Settings
"migration.migrate.title": "Перенос ваших настроек",
"migration.migrate.subtitle": "Мы нашли настройки от вашей предыдущей установки. Вот что можно перенести.",
"migration.roo.button": "Импортировать сеансы",
"migration.roo.empty": "Сеансы Roo Code не найдены.",
"migration.migrate.selectLabel": "Выберите, что перенести",
"migration.migrate.chatHistory": "Сессии чата и история",
"migration.migrate.button": "Перенести настройки",
"migration.migrate.skip": "Пропустить",
"migration.migrate.keysDetected": "Обнаружено ключей: {{count}}",
"migration.migrate.serversConfigured": "Настроено серверов: {{count}}",
"migration.migrate.modesFound": "Найдено режимов: {{count}}",
"migration.migrate.nothingToMigrate": "В старых настройках не найдено данных для переноса.",
// Migrate — item labels (reused from old select keys)
"migration.select.providers": "API-ключи провайдеров",
"migration.select.mcpServers": "Серверы MCP",
"migration.select.customModes": "Пользовательские режимы / Агенты",
"migration.select.defaultModel": "Модель по умолчанию",
"migration.select.autoApproval": "Автоматическое подтверждение",
"migration.select.language": "Язык интерфейса",
"migration.select.autocomplete": "Настройки автодополнения",
// Migrate — completion
"migration.complete.summary": "Успешно перенесено: {{success}} из {{total}} элементов.",
"migration.complete.cleanup": "Удалить данные старых настроек",
"migration.complete.cleanupDescription":
"Это удалит старые настройки из хранилища VS Code. Вы не сможете запустить эту миграцию повторно.",
"migration.complete.done": "Готово",
"migration.migrate.sessionsDetected": "Обнаружено {{count}} сеансов",
"migration.error.continue": "Продолжить",
@@ -1254,7 +1212,6 @@ export const dict = {
"migration.sessionFormat.unknownDate": "Неизвестная дата",
"migration.sessionFormat.unknown": "Неизвестно",
"migration.sessionFormat.unknownError": "Неизвестная ошибка",
// legacy-migration end
"error.details.show": "Подробности",
+2 -45
View File
@@ -1146,58 +1146,16 @@ 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 ของผู้ให้บริการและโมเดลเริ่มต้น",
"settings.aboutKiloCode.rooImport.description": "นำเข้าประวัติการสนทนาจากการติดตั้ง Roo Code",
"settings.aboutKiloCode.rooImport.button": "นำเข้าเซสชันจาก Roo Code",
// Screen 1 — What's New
"migration.whatsNew.title": "มีอะไรใหม่ใน Kilo Code",
"migration.whatsNew.subtitle": "เราได้สร้างส่วนขยายใหม่บนรากฐานที่เร็วและมีประสิทธิภาพมากขึ้น",
"migration.whatsNew.features.performance.title": "ประสิทธิภาพเอเจนต์ที่เร็วขึ้น",
"migration.whatsNew.features.performance.detail":
"การเรียกเครื่องมือแบบขนานและเอเจนต์ย่อยช่วยให้เอเจนต์ของคุณจัดการได้มากขึ้นในครั้งเดียว — คุณจึงใช้เวลารอน้อยลงและส่งงานได้มากขึ้น",
"migration.whatsNew.features.interface.title": "อินเทอร์เฟซที่กระชับ",
"migration.whatsNew.features.interface.detail": "สิ่งรบกวนน้อยลง อ่านง่ายและรวดเร็วขึ้น",
"migration.whatsNew.features.agentManager.title": "ตัวจัดการตัวแทน",
"migration.whatsNew.features.agentManager.detail":
"อินเทอร์เฟซรวมสำหรับการเรียกใช้เอเจนต์หลายตัวพร้อมกัน แต่ละตัวบน worktree ของตัวเอง — ติดตามความคืบหน้า สลับบริบท และตรวจสอบการเปลี่ยนแปลงได้ในที่เดียว",
"migration.whatsNew.features.foundation.title": "รากฐานที่ใช้ร่วมกัน",
"migration.whatsNew.features.foundation.detail":
"แกนหลักขนาดเล็กและมีประสิทธิภาพเดียวกันในทุกผลิตภัณฑ์ Kilo ประสบการณ์ที่คุ้นเคยไม่ว่าคุณจะเลือกทำงานอย่างไร",
"migration.whatsNew.blogLink": "อ่านประกาศฉบับเต็ม",
"migration.whatsNew.docsLink": "มีอะไรใหม่และคำถามที่พบบ่อย",
"migration.whatsNew.continue": "ดำเนินการต่อ",
// Screen 2 — Migrate Settings
"migration.migrate.title": "ย้ายการตั้งค่าของคุณ",
"migration.migrate.subtitle": "เราพบการตั้งค่าจากการติดตั้งก่อนหน้านี้ของคุณ นี่คือสิ่งที่เราสามารถนำมาได้",
"migration.roo.button": "นำเข้าเซสชัน",
"migration.roo.empty": "ไม่พบเซสชัน Roo Code",
"migration.migrate.selectLabel": "เลือกสิ่งที่จะย้าย",
"migration.migrate.chatHistory": "เซสชันแชทและประวัติ",
"migration.migrate.button": "ย้ายการตั้งค่า",
"migration.migrate.skip": "ข้าม",
"migration.migrate.keysDetected": "ตรวจพบ {{count}} คีย์",
"migration.migrate.serversConfigured": "กำหนดค่า {{count}} เซิร์ฟเวอร์",
"migration.migrate.modesFound": "พบ {{count}} โหมด",
"migration.migrate.nothingToMigrate": "ไม่พบสิ่งที่จะย้ายในการตั้งค่าดั้งเดิม",
// Migrate — item labels (reused from old select keys)
"migration.select.providers": "คีย์ API ของผู้ให้บริการ",
"migration.select.mcpServers": "เซิร์ฟเวอร์ MCP",
"migration.select.customModes": "โหมดที่กำหนดเอง / เอเจนต์",
"migration.select.defaultModel": "โมเดลเริ่มต้น",
"migration.select.autoApproval": "การอนุมัติอัตโนมัติ",
"migration.select.language": "ภาษาของ UI",
"migration.select.autocomplete": "การตั้งค่าการเติมข้อความอัตโนมัติ",
// Migrate — completion
"migration.complete.summary": "ย้ายข้อมูลสำเร็จ {{success}} จาก {{total}} รายการ",
"migration.complete.cleanup": "ลบข้อมูลการตั้งค่าเดิม",
"migration.complete.cleanupDescription":
"การดำเนินการนี้จะลบการตั้งค่าเดิมจากที่เก็บข้อมูล VS Code คุณจะไม่สามารถเรียกใช้การย้ายข้อมูลนี้ได้อีก",
"migration.complete.done": "เสร็จสิ้น",
"migration.migrate.sessionsDetected": "ตรวจพบ {{count}} เซสชัน",
"migration.error.continue": "ดำเนินการต่อ",
@@ -1231,7 +1189,6 @@ export const dict = {
"migration.sessionFormat.unknownDate": "ไม่ทราบวันที่",
"migration.sessionFormat.unknown": "ไม่ทราบ",
"migration.sessionFormat.unknownError": "ข้อผิดพลาดที่ไม่ทราบสาเหตุ",
// legacy-migration end
"error.details.show": "รายละเอียด",
+2 -46
View File
@@ -1142,59 +1142,16 @@ export const dict = {
"question.summary": "{{total}} sorudan {{n}} tanesi",
"common.review": "İncele",
// legacy-migration start
"settings.legacyMigration.link": "Eski Sürümden Taşı",
"settings.aboutKiloCode.legacyMigration.title": "Eski Sürüm Taşıma",
"settings.aboutKiloCode.legacyMigration.description":
"Sağlayıcı API anahtarları ve varsayılan model dahil olmak üzere Kilo Code'un önceki yüklemesinden ayarları taşıyın.",
"settings.aboutKiloCode.rooImport.description": "Bir Roo Code yüklemesinden konuşma geçmişini içe aktarın.",
"settings.aboutKiloCode.rooImport.button": "Roo Code'dan Oturumları İçe Aktar",
// Screen 1 — What's New
"migration.whatsNew.title": "Kilo Code'daki Yenilikler",
"migration.whatsNew.badge": "Beta",
"migration.whatsNew.subtitle": "Uzantıyı daha hızlı ve daha verimli bir temel üzerine yeniden inşa ettik.",
"migration.whatsNew.features.performance.title": "Daha Hızlı Ajan Performansı",
"migration.whatsNew.features.performance.detail":
"Paralel araç çağrıları ve alt ajanlar, ajanınızın aynı anda daha fazlasını yapmasını sağlar — böylece izlemek yerine daha fazla üretirsiniz.",
"migration.whatsNew.features.interface.title": "Basitleştirilmiş Arayüz",
"migration.whatsNew.features.interface.detail": "Daha az dikkat dağıtıcı, daha kolay ve hızlı okuma.",
"migration.whatsNew.features.agentManager.title": "Ajan Yöneticisi",
"migration.whatsNew.features.agentManager.detail":
"Birden fazla ajanı paralel olarak çalıştırmak için birleşik bir arayüz, her biri kendi worktree'sinde — ilerlemeyi izleyin, bağlam değiştirin ve değişiklikleri tek bir yerden inceleyin.",
"migration.whatsNew.features.foundation.title": "Paylaşılan Temel",
"migration.whatsNew.features.foundation.detail":
"Her Kilo ürününde küçük ve verimli bir çekirdek. Nasıl çalışmayı tercih ederseniz edin, tanıdık bir deneyim.",
"migration.whatsNew.blogLink": "Tam duyuruyu oku",
"migration.whatsNew.docsLink": "Yenilikler ve sık sorulan sorular",
"migration.whatsNew.continue": "Devam",
// Screen 2 — Migrate Settings
"migration.migrate.title": "Ayarlarınızı Taşıyın",
"migration.migrate.subtitle": "Önceki yüklemenizden ayarlar bulduk. İşte taşıyabileceğimiz ayarlar.",
"migration.roo.button": "Oturumları İçe Aktar",
"migration.roo.empty": "Roo Code oturumu bulunamadı.",
"migration.migrate.selectLabel": "Taşınacakları seçin",
"migration.migrate.chatHistory": "Sohbet Oturumları ve Geçmiş",
"migration.migrate.button": "Ayarları Taşı",
"migration.migrate.skip": "Atla",
"migration.migrate.keysDetected": "{{count}} anahtar algılandı",
"migration.migrate.serversConfigured": "{{count}} sunucu yapılandırıldı",
"migration.migrate.modesFound": "{{count}} mod bulundu",
"migration.migrate.nothingToMigrate": "Eski ayarlarda taşınacak bir şey bulunamadı.",
// Migrate — item labels
"migration.select.providers": "Sağlayıcı API Anahtarları",
"migration.select.mcpServers": "MCP Sunucuları",
"migration.select.customModes": "Özel Modlar / Ajanlar",
"migration.select.defaultModel": "Varsayılan Model",
"migration.select.autoApproval": "Otomatik Onay",
"migration.select.language": "Arayüz Dili",
"migration.select.autocomplete": "Otomatik Tamamlama Ayarları",
// Migrate — completion
"migration.complete.summary": "{{total}} öğeden {{success}} tanesi başarıyla taşındı.",
"migration.complete.cleanup": "Eski ayar verilerini kaldır",
"migration.complete.cleanupDescription":
"Bu, VS Code depolamasından eski ayarları kaldırır. Bu taşımayı yeniden çalıştıramazsınız.",
"migration.complete.done": "Bitti",
"migration.migrate.sessionsDetected": "{{count}} oturum bulundu",
"migration.error.continue": "Devam et",
@@ -1228,7 +1185,6 @@ export const dict = {
"migration.sessionFormat.unknownDate": "Bilinmeyen tarih",
"migration.sessionFormat.unknown": "Bilinmiyor",
"migration.sessionFormat.unknownError": "Bilinmeyen hata",
// legacy-migration end
"error.details.show": "Ayrıntılar",
+2 -46
View File
@@ -1141,59 +1141,16 @@ 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-ключі провайдерів та стандартну модель.",
"settings.aboutKiloCode.rooImport.description": "Імпортувати історію розмов з інсталяції Roo Code.",
"settings.aboutKiloCode.rooImport.button": "Імпортувати сесії з Roo Code",
// Screen 1 — What's New
"migration.whatsNew.title": "Що нового в Kilo Code",
"migration.whatsNew.badge": "Бета",
"migration.whatsNew.subtitle": "Ми відбудували розширення на більш швидкій та ефективній основі.",
"migration.whatsNew.features.performance.title": "Швидша продуктивність агента",
"migration.whatsNew.features.performance.detail":
"Паралельні виклики інструментів і підагенти дозволяють агенту робити більше одночасно — щоб ви більше створювали, а менше спостерігали.",
"migration.whatsNew.features.interface.title": "Спрощений інтерфейс",
"migration.whatsNew.features.interface.detail": "Менше відволікань, легше і швидше читати.",
"migration.whatsNew.features.agentManager.title": "Менеджер агентів",
"migration.whatsNew.features.agentManager.detail":
"Єдиний інтерфейс для запуску кількох агентів паралельно, кожен у власному робочому дереві — стежте за прогресом, перемикайте контекст і переглядайте зміни з одного місця.",
"migration.whatsNew.features.foundation.title": "Спільна основа",
"migration.whatsNew.features.foundation.detail":
"Малий та ефективний ядерний модуль у кожному продукті Kilo. Знайомий досвід незалежно від того, як ви вважаєте за краще працювати.",
"migration.whatsNew.blogLink": "Читати повне оголошення",
"migration.whatsNew.docsLink": "Що нового та часті запитання",
"migration.whatsNew.continue": "Продовжити",
// Screen 2 — Migrate Settings
"migration.migrate.title": "Перенесіть свої налаштування",
"migration.migrate.subtitle": "Ми знайшли налаштування з попередньої версії. Ось що можна перенести.",
"migration.roo.button": "Імпортувати сесії",
"migration.roo.empty": "Сесій Roo Code не знайдено.",
"migration.migrate.selectLabel": "Вибрати для перенесення",
"migration.migrate.chatHistory": "Сесії чату та історія",
"migration.migrate.button": "Перенести налаштування",
"migration.migrate.skip": "Пропустити",
"migration.migrate.keysDetected": "Виявлено {{count}} ключів",
"migration.migrate.serversConfigured": "Налаштовано {{count}} серверів",
"migration.migrate.modesFound": "Знайдено {{count}} режимів",
"migration.migrate.nothingToMigrate": "У старих налаштуваннях нічого для перенесення не знайдено.",
// Migrate — item labels
"migration.select.providers": "API-ключі провайдерів",
"migration.select.mcpServers": "MCP-сервери",
"migration.select.customModes": "Власні режими / агенти",
"migration.select.defaultModel": "Стандартна модель",
"migration.select.autoApproval": "Автоматичне схвалення",
"migration.select.language": "Мова інтерфейсу",
"migration.select.autocomplete": "Налаштування автодоповнення",
// Migrate — completion
"migration.complete.summary": "{{success}} з {{total}} елементів успішно перенесено.",
"migration.complete.cleanup": "Видалити старі дані налаштувань",
"migration.complete.cleanupDescription":
"Це видалить старі налаштування зі сховища VS Code. Ви не зможете повторно запустити це перенесення.",
"migration.complete.done": "Готово",
"migration.migrate.sessionsDetected": "Знайдено {{count}} сесій",
"migration.error.continue": "Продовжити",
@@ -1227,7 +1184,6 @@ export const dict = {
"migration.sessionFormat.unknownDate": "Невідома дата",
"migration.sessionFormat.unknown": "Невідомо",
"migration.sessionFormat.unknownError": "Невідома помилка",
// legacy-migration end
"error.details.show": "Деталі",
+2 -44
View File
@@ -1106,57 +1106,16 @@ 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 密钥和默认模型。",
"settings.aboutKiloCode.rooImport.description": "从 Roo Code 安装导入对话历史记录。",
"settings.aboutKiloCode.rooImport.button": "从 Roo Code 导入会话",
// Screen 1 — What's New
"migration.whatsNew.title": "Kilo Code 新功能",
"migration.whatsNew.subtitle": "我们在更快、更高效的基础上重新构建了扩展。",
"migration.whatsNew.features.performance.title": "更快的智能体性能",
"migration.whatsNew.features.performance.detail":
"并行工具调用和子智能体让你的智能体可以同时处理更多任务——减少等待时间,更快交付成果。",
"migration.whatsNew.features.interface.title": "简洁的界面",
"migration.whatsNew.features.interface.detail": "更少干扰,更易阅读,更快上手。",
"migration.whatsNew.features.agentManager.title": "代理管理器",
"migration.whatsNew.features.agentManager.detail":
"一个统一的界面,可以并行运行多个智能体,每个智能体各自使用独立的 worktree——在同一个地方监控进度、切换上下文和审查变更。",
"migration.whatsNew.features.foundation.title": "共享基础",
"migration.whatsNew.features.foundation.detail":
"所有 Kilo 产品共享一个小巧高效的核心。无论你选择哪种方式工作,都能获得熟悉的体验。",
"migration.whatsNew.blogLink": "阅读完整公告",
"migration.whatsNew.docsLink": "新功能与常见问题",
"migration.whatsNew.continue": "继续",
// Screen 2 — Migrate Settings
"migration.migrate.title": "迁移你的设置",
"migration.migrate.subtitle": "我们发现了你之前安装的设置。以下是可以迁移的内容。",
"migration.roo.button": "导入会话",
"migration.roo.empty": "未找到 Roo Code 会话。",
"migration.migrate.selectLabel": "选择要迁移的内容",
"migration.migrate.chatHistory": "聊天会话和历史记录",
"migration.migrate.button": "迁移设置",
"migration.migrate.skip": "跳过",
"migration.migrate.keysDetected": "检测到 {{count}} 个密钥",
"migration.migrate.serversConfigured": "已配置 {{count}} 个服务器",
"migration.migrate.modesFound": "发现 {{count}} 个模式",
"migration.migrate.nothingToMigrate": "在旧版设置中未找到要迁移的内容。",
// Migrate — item labels (reused from old select keys)
"migration.select.providers": "提供商 API 密钥",
"migration.select.mcpServers": "MCP 服务器",
"migration.select.customModes": "自定义模式 / 代理",
"migration.select.defaultModel": "默认模型",
"migration.select.autoApproval": "自动审批",
"migration.select.language": "界面语言",
"migration.select.autocomplete": "自动补全设置",
// Migrate — completion
"migration.complete.summary": "成功迁移 {{success}}/{{total}} 项。",
"migration.complete.cleanup": "清除旧版设置数据",
"migration.complete.cleanupDescription": "此操作将从 VS Code 存储中删除旧版设置。您将无法再次运行此迁移。",
"migration.complete.done": "完成",
"migration.migrate.sessionsDetected": "检测到 {{count}} 个会话",
"migration.error.continue": "继续",
@@ -1189,7 +1148,6 @@ export const dict = {
"migration.sessionFormat.unknownDate": "未知日期",
"migration.sessionFormat.unknown": "未知",
"migration.sessionFormat.unknownError": "未知错误",
// legacy-migration end
"error.details.show": "详细信息",
+2 -44
View File
@@ -1110,57 +1110,16 @@ 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 金鑰和預設模型。",
"settings.aboutKiloCode.rooImport.description": "從 Roo Code 安裝匯入對話歷史記錄。",
"settings.aboutKiloCode.rooImport.button": "從 Roo Code 匯入工作階段",
// Screen 1 — What's New
"migration.whatsNew.title": "Kilo Code 新功能",
"migration.whatsNew.subtitle": "我們在更快、更高效的基礎上重新建構了擴充功能。",
"migration.whatsNew.features.performance.title": "更快的 Agent 效能",
"migration.whatsNew.features.performance.detail":
"平行工具呼叫和子 Agent 讓你的 Agent 可以同時處理更多任務——減少等待時間,更快交付成果。",
"migration.whatsNew.features.interface.title": "簡潔的介面",
"migration.whatsNew.features.interface.detail": "更少干擾,更易閱讀,更快上手。",
"migration.whatsNew.features.agentManager.title": "代理程式管理員",
"migration.whatsNew.features.agentManager.detail":
"一個統一的介面,可以平行執行多個 Agent,每個 Agent 各自使用獨立的 worktree——在同一個地方監控進度、切換上下文和審查變更。",
"migration.whatsNew.features.foundation.title": "共享基礎",
"migration.whatsNew.features.foundation.detail":
"所有 Kilo 產品共享一個小巧高效的核心。無論你選擇哪種方式工作,都能獲得熟悉的體驗。",
"migration.whatsNew.blogLink": "閱讀完整公告",
"migration.whatsNew.docsLink": "新功能與常見問題",
"migration.whatsNew.continue": "繼續",
// Screen 2 — Migrate Settings
"migration.migrate.title": "遷移你的設定",
"migration.migrate.subtitle": "我們發現了你之前安裝的設定。以下是可以遷移的內容。",
"migration.roo.button": "匯入工作階段",
"migration.roo.empty": "找不到 Roo Code 工作階段。",
"migration.migrate.selectLabel": "選擇要遷移的內容",
"migration.migrate.chatHistory": "聊天工作階段與歷史紀錄",
"migration.migrate.button": "遷移設定",
"migration.migrate.skip": "略過",
"migration.migrate.keysDetected": "偵測到 {{count}} 個金鑰",
"migration.migrate.serversConfigured": "已設定 {{count}} 個伺服器",
"migration.migrate.modesFound": "發現 {{count}} 個模式",
"migration.migrate.nothingToMigrate": "在舊版設定中找不到可遷移的項目。",
// Migrate — item labels (reused from old select keys)
"migration.select.providers": "供應商 API 金鑰",
"migration.select.mcpServers": "MCP 伺服器",
"migration.select.customModes": "自訂模式 / 代理",
"migration.select.defaultModel": "預設模型",
"migration.select.autoApproval": "自動核准",
"migration.select.language": "介面語言",
"migration.select.autocomplete": "自動補全設定",
// Migrate — completion
"migration.complete.summary": "成功遷移 {{success}}/{{total}} 項。",
"migration.complete.cleanup": "清除舊版設定資料",
"migration.complete.cleanupDescription": "此操作將從 VS Code 儲存中刪除舊版設定。您將無法再次執行此遷移。",
"migration.complete.done": "完成",
"migration.migrate.sessionsDetected": "偵測到 {{count}} 個工作階段",
"migration.error.continue": "繼續",
@@ -1193,7 +1152,6 @@ export const dict = {
"migration.sessionFormat.unknownDate": "未知日期",
"migration.sessionFormat.unknown": "未知",
"migration.sessionFormat.unknownError": "未知錯誤",
// legacy-migration end
"error.details.show": "詳細資訊",
@@ -26,9 +26,6 @@ const RooWizard: Component = () => {
source: "roo",
operationId,
data: {
providers: [],
mcpServers: [],
customModes: [],
sessions: [
{
id: "roo-1",
@@ -82,7 +82,6 @@ import type {
MigrationDataMessage,
MigrationProgressMessage,
MigrationSessionProgressMessage,
MigrationStateMessage,
} from "./migration"
import type { MemoryEventMessage, MemoryLoadedMessage, MemoryOperationResultMessage } from "./memory"
@@ -1636,13 +1635,10 @@ export type ExtensionMessage =
| AgentManagerTerminalErrorMessage
| AgentManagerTerminalDestinationChangedMessage
| AgentManagerScriptTerminalsMessage
// legacy-migration start
| MigrationStateMessage
| MigrationDataMessage
| MigrationProgressMessage
| MigrationSessionProgressMessage
| MigrationCompleteMessage
// legacy-migration end
| EnhancePromptResultMessage
| EnhancePromptErrorMessage
| ViewSubAgentSessionMessage
@@ -1,45 +1,3 @@
// 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 LegacyAutocompleteSettings {
enableAutoTrigger?: boolean
enableSmartInlineTaskKeybinding?: boolean
enableChatAutocomplete?: boolean
}
export interface LegacySettings {
autoApprovalEnabled?: boolean
allowedCommands?: string[]
deniedCommands?: string[]
// Fine-grained auto-approval (legacy globalState keys — no prefix)
alwaysAllowReadOnly?: boolean
alwaysAllowReadOnlyOutsideWorkspace?: boolean
alwaysAllowWrite?: boolean
alwaysAllowExecute?: boolean
alwaysAllowMcp?: boolean
alwaysAllowModeSwitch?: boolean
alwaysAllowSubtasks?: boolean
language?: string
autocomplete?: LegacyAutocompleteSettings
}
export interface MigrationSessionInfo {
id: string
title: string
@@ -49,30 +7,19 @@ export interface MigrationSessionInfo {
export interface MigrationResultItem {
item: string
category: "provider" | "mcpServer" | "customMode" | "session" | "defaultModel" | "settings"
category: "session"
status: "success" | "warning" | "error"
message?: string
}
export type MigrationSource = "legacy" | "roo"
export interface MigrationStateMessage {
type: "migrationState"
needed: boolean
source: "legacy"
}
export type MigrationSource = "roo"
export interface MigrationDataMessage {
type: "migrationData"
source: MigrationSource
operationId: string
data: {
providers: MigrationProviderInfo[]
mcpServers: MigrationMcpServerInfo[]
customModes: MigrationCustomModeInfo[]
sessions?: MigrationSessionInfo[]
defaultModel?: { provider: string; model: string }
settings?: LegacySettings
}
}
@@ -111,15 +58,6 @@ export interface RequestMigrationDataMessage {
operationId: string
}
export interface MigrationAutoApprovalSelections {
commandRules: boolean
readPermission: boolean
writePermission: boolean
executePermission: boolean
mcpPermission: boolean
taskPermission: boolean
}
export interface MigrationSessionSelection {
id: string
force?: boolean
@@ -130,28 +68,6 @@ export interface StartMigrationMessage {
source: MigrationSource
operationId: string
selections: {
providers: string[]
mcpServers: string[]
customModes: string[]
sessions?: MigrationSessionSelection[]
defaultModel: boolean
settings: {
autoApproval: MigrationAutoApprovalSelections
language: boolean
autocomplete: boolean
}
}
}
export interface SkipLegacyMigrationMessage {
type: "skipLegacyMigration"
}
export interface ClearLegacyDataMessage {
type: "clearLegacyData"
}
export interface FinalizeLegacyMigrationMessage {
type: "finalizeLegacyMigration"
}
// legacy-migration end
@@ -10,13 +10,7 @@ import type { BrowserFeedbackData } from "../../../../src/shared/browser-feedbac
import type { WorkStyle, WorkStyleState } from "../../../../src/shared/work-style-presets"
import type { RefreshProviderUsageMessage, RequestProviderUsageMessage } from "./provider-usage"
import type { AnacondaDesktopWebviewMessage } from "../../../../src/shared/anaconda-desktop-messages"
import type {
ClearLegacyDataMessage,
FinalizeLegacyMigrationMessage,
RequestMigrationDataMessage,
SkipLegacyMigrationMessage,
StartMigrationMessage,
} from "./migration"
import type { RequestMigrationDataMessage, StartMigrationMessage } from "./migration"
import type { MemoryShowMessage, MemoryOperationMessage, RequestMemoryMessage } from "./memory"
import type { Activity } from "../../utils/session-activity"
@@ -1694,13 +1688,8 @@ export type WebviewMessage =
| RefreshPRMessage
| OpenPRMessage
| CommentActionMessage
// legacy-migration start
| RequestMigrationDataMessage
| StartMigrationMessage
| SkipLegacyMigrationMessage
| ClearLegacyDataMessage
| FinalizeLegacyMigrationMessage
// legacy-migration end
| ApplyWorktreeDiffMessage
| RevertWorktreeFileMessage
| EnhancePromptRequest