From 6d783b3e2704cacc0c6c5adbeaa9f341474e1f4d Mon Sep 17 00:00:00 2001 From: Apoorv Saxena Date: Thu, 12 Mar 2026 17:20:35 +0530 Subject: [PATCH 001/238] feat(autocomplete): add Mercury Edit by Inception Labs as autocomplete model option Add support for selecting Mercury Edit (Inception Labs) as an alternative FIM autocomplete model alongside the existing Codestral (Mistral AI). Changes: - Gateway: route Mercury models to api.inceptionlabs.ai/v1/fim/completions using the Inception API key from auth.json - AutocompleteModel: make model configurable via settings instead of hardcoded - Settings UI: add model selector dropdown in the Autocomplete settings tab - Support both chat-style (delta.content) and text-completion-style (text) streaming response formats Notes: - Default remains Codestral (no behavior change for existing users) - Mercury requires an Inception API key configured in auth.json - Mercury only supports temperature 0 Co-Authored-By: Claude Opus 4.6 --- packages/kilo-gateway/src/server/routes.ts | 73 ++++++++++++++----- packages/kilo-vscode/package.json | 13 ++++ packages/kilo-vscode/src/KiloProvider.ts | 4 + .../autocomplete/AutocompleteModel.ts | 26 +++++-- .../AutocompleteServiceManager.ts | 5 ++ .../components/settings/AutocompleteTab.tsx | 30 ++++++++ .../kilo-vscode/webview-ui/src/i18n/en.ts | 2 + .../webview-ui/src/types/messages.ts | 5 +- packages/sdk/js/src/v2/gen/types.gen.ts | 1 + 9 files changed, 131 insertions(+), 28 deletions(-) diff --git a/packages/kilo-gateway/src/server/routes.ts b/packages/kilo-gateway/src/server/routes.ts index 79a27b7f5f5..7149ae0d55a 100644 --- a/packages/kilo-gateway/src/server/routes.ts +++ b/packages/kilo-gateway/src/server/routes.ts @@ -109,6 +109,7 @@ export function createKiloRoutes(deps: KiloRoutesDeps) { content: z.string().optional(), }) .optional(), + text: z.string().optional(), // Text-completion style streaming (Mercury) }), ) .optional(), @@ -330,29 +331,61 @@ export function createKiloRoutes(deps: KiloRoutesDeps) { const fimMaxTokens = maxTokens ?? 256 const fimTemperature = temperature ?? 0.2 - const baseApiUrl = KILO_API_BASE + "/api/" - const endpoint = new URL("fim/completions", baseApiUrl) + const isMercury = fimModel.toLowerCase().includes("mercury") - const headers = { - "Content-Type": "application/json", - Authorization: `Bearer ${token}`, - ...buildKiloHeaders(undefined, { kilocodeOrganizationId: organizationId }), - [HEADER_FEATURE]: "autocomplete", + let response: Response + if (isMercury) { + // Route Mercury models directly to Inception Labs API + const inceptionAuth = await Auth.get("inception") + if (!inceptionAuth || inceptionAuth.type !== "api" || !inceptionAuth.key) { + return c.json( + { error: "Inception API key not configured. Add an Inception provider in auth settings." }, + 401, + ) + } + + const endpoint = "https://api.inceptionlabs.ai/v1/fim/completions" + response = await fetch(endpoint, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${inceptionAuth.key}`, + }, + body: JSON.stringify({ + model: fimModel, + prompt: prefix, + suffix, + max_tokens: fimMaxTokens, + temperature: 0, // Mercury only supports temperature 0 + stream: true, + }), + }) + } else { + // Route to Kilo Gateway API (default path for Codestral etc.) + const baseApiUrl = KILO_API_BASE + "/api/" + const endpoint = new URL("fim/completions", baseApiUrl) + + const headers = { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + ...buildKiloHeaders(undefined, { kilocodeOrganizationId: organizationId }), + [HEADER_FEATURE]: "autocomplete", + } + + response = await fetch(endpoint, { + method: "POST", + headers, + body: JSON.stringify({ + model: fimModel, + prompt: prefix, + suffix, + max_tokens: fimMaxTokens, + temperature: fimTemperature, + stream: true, + }), + }) } - const response = await fetch(endpoint, { - method: "POST", - headers, - body: JSON.stringify({ - model: fimModel, - prompt: prefix, - suffix, - max_tokens: fimMaxTokens, - temperature: fimTemperature, - stream: true, - }), - }) - if (!response.ok) { const errorText = await response.text() return c.json({ error: `FIM request failed: ${response.status} ${errorText}` }, response.status as any) diff --git a/packages/kilo-vscode/package.json b/packages/kilo-vscode/package.json index 233cd852845..5a5f508c729 100644 --- a/packages/kilo-vscode/package.json +++ b/packages/kilo-vscode/package.json @@ -667,6 +667,19 @@ "default": "kilo-auto/free", "description": "Default model ID for new sessions" }, + "kilo-code.new.autocomplete.model": { + "type": "string", + "default": "mistralai/codestral-2508", + "enum": [ + "mistralai/codestral-2508", + "mercury-edit" + ], + "enumDescriptions": [ + "Codestral by Mistral AI (default)", + "Mercury Edit by Inception Labs" + ], + "description": "Model to use for inline autocomplete suggestions" + }, "kilo-code.new.autocomplete.enableAutoTrigger": { "type": "boolean", "default": true, diff --git a/packages/kilo-vscode/src/KiloProvider.ts b/packages/kilo-vscode/src/KiloProvider.ts index c6e1a046da1..5b4bcde2c9c 100644 --- a/packages/kilo-vscode/src/KiloProvider.ts +++ b/packages/kilo-vscode/src/KiloProvider.ts @@ -703,12 +703,15 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper "enableAutoTrigger", "enableSmartInlineTaskKeybinding", "enableChatAutocomplete", + "model", ]) if (allowedKeys.has(message.key)) { await vscode.workspace .getConfiguration("kilo-code.new.autocomplete") .update(message.key, message.value, vscode.ConfigurationTarget.Global) this.sendAutocompleteSettings() + // Reload autocomplete service to pick up model/setting changes + await vscode.commands.executeCommand("kilo-code.new.autocomplete.reload") } break } @@ -2584,6 +2587,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper enableAutoTrigger: config.get("enableAutoTrigger", true), enableSmartInlineTaskKeybinding: config.get("enableSmartInlineTaskKeybinding", false), enableChatAutocomplete: config.get("enableChatAutocomplete", false), + model: config.get("model", "mistralai/codestral-2508"), }, }) } diff --git a/packages/kilo-vscode/src/services/autocomplete/AutocompleteModel.ts b/packages/kilo-vscode/src/services/autocomplete/AutocompleteModel.ts index ea0570c216f..00dee235cfa 100644 --- a/packages/kilo-vscode/src/services/autocomplete/AutocompleteModel.ts +++ b/packages/kilo-vscode/src/services/autocomplete/AutocompleteModel.ts @@ -2,7 +2,11 @@ import { ResponseMetaData } from "./types" import type { KiloConnectionService } from "../cli-backend" const DEFAULT_MODEL = "mistralai/codestral-2508" -const PROVIDER_DISPLAY_NAME = "Kilo Gateway" + +const MODEL_PROVIDERS: Record = { + "mistralai/codestral-2508": "Kilo Gateway", + "mercury-edit": "Inception", +} /** Chunk from an LLM streaming response */ export type ApiStreamChunk = @@ -18,6 +22,7 @@ export type ApiStreamChunk = export class AutocompleteModel { private connectionService: KiloConnectionService | null = null + private currentModel: string = DEFAULT_MODEL public profileName: string | null = null public profileType: string | null = null @@ -27,6 +32,10 @@ export class AutocompleteModel { } } + public setModel(model: string): void { + this.currentModel = model + } + /** * Set the connection service (can be called after construction when service becomes available) */ @@ -69,13 +78,16 @@ export class AutocompleteModel { // client catches HTTP errors (402, 401, 429, 5xx) internally and silently // ends the stream. Without this, errors never reach ErrorBackoff. let sseError: Error | undefined + + const isMercury = this.currentModel.toLowerCase().includes("mercury") + const { stream } = await client.kilo.fim( { prefix, suffix, - model: DEFAULT_MODEL, + model: this.currentModel, maxTokens: 256, - temperature: 0.2, + temperature: isMercury ? 0 : 0.2, }, { signal, @@ -87,7 +99,9 @@ export class AutocompleteModel { ) for await (const chunk of stream) { - const content = chunk.choices?.[0]?.delta?.content + // Support both chat-style (delta.content) and text-completion-style (text) streaming formats + const choice = chunk.choices?.[0] as any + const content = choice?.delta?.content ?? choice?.text if (content) onChunk(content) if (chunk.usage) { inputTokens = chunk.usage.prompt_tokens ?? 0 @@ -122,11 +136,11 @@ export class AutocompleteModel { } public getModelName(): string { - return DEFAULT_MODEL + return this.currentModel } public getProviderDisplayName(): string { - return PROVIDER_DISPLAY_NAME + return MODEL_PROVIDERS[this.currentModel] ?? "Kilo Gateway" } /** diff --git a/packages/kilo-vscode/src/services/autocomplete/AutocompleteServiceManager.ts b/packages/kilo-vscode/src/services/autocomplete/AutocompleteServiceManager.ts index 329240445d5..318a91a7949 100644 --- a/packages/kilo-vscode/src/services/autocomplete/AutocompleteServiceManager.ts +++ b/packages/kilo-vscode/src/services/autocomplete/AutocompleteServiceManager.ts @@ -26,6 +26,7 @@ function readSettings(): AutocompleteServiceSettings { enableAutoTrigger: config.get("enableAutoTrigger") ?? true, enableSmartInlineTaskKeybinding: config.get("enableSmartInlineTaskKeybinding") ?? true, enableChatAutocomplete: config.get("enableChatAutocomplete") ?? true, + model: config.get("model") ?? "mistralai/codestral-2508", snoozeUntil: config.get("snoozeUntil"), } } @@ -118,6 +119,10 @@ export class AutocompleteServiceManager { public async load() { this.settings = readSettings() + if (this.settings.model) { + this.model.setModel(this.settings.model) + } + await this.updateGlobalContext() this.updateStatusBar() await this.ensureInlineCompletionProviderRegistration() diff --git a/packages/kilo-vscode/webview-ui/src/components/settings/AutocompleteTab.tsx b/packages/kilo-vscode/webview-ui/src/components/settings/AutocompleteTab.tsx index 072c5e0a925..2a11f2dc909 100644 --- a/packages/kilo-vscode/webview-ui/src/components/settings/AutocompleteTab.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/settings/AutocompleteTab.tsx @@ -1,11 +1,19 @@ import { Component, createSignal, onCleanup } from "solid-js" import { Switch } from "@kilocode/kilo-ui/switch" +import { Select } from "@kilocode/kilo-ui/select" import { Card } from "@kilocode/kilo-ui/card" import { useVSCode } from "../../context/vscode" import { useLanguage } from "../../context/language" import type { ExtensionMessage } from "../../types/messages" import SettingsRow from "./SettingsRow" +const AUTOCOMPLETE_MODELS = [ + { id: "mistralai/codestral-2508", label: "Codestral (Mistral AI)" }, + { id: "mercury-edit", label: "Mercury Edit (Inception Labs)" }, +] as const + +type ModelId = (typeof AUTOCOMPLETE_MODELS)[number]["id"] + const AutocompleteTab: Component = () => { const vscode = useVSCode() const language = useLanguage() @@ -13,6 +21,7 @@ const AutocompleteTab: Component = () => { const [enableAutoTrigger, setEnableAutoTrigger] = createSignal(true) const [enableSmartInlineTaskKeybinding, setEnableSmartInlineTaskKeybinding] = createSignal(false) const [enableChatAutocomplete, setEnableChatAutocomplete] = createSignal(false) + const [model, setModel] = createSignal("mistralai/codestral-2508") const unsubscribe = vscode.onMessage((message: ExtensionMessage) => { if (message.type !== "autocompleteSettingsLoaded") { @@ -21,6 +30,7 @@ const AutocompleteTab: Component = () => { setEnableAutoTrigger(message.settings.enableAutoTrigger) setEnableSmartInlineTaskKeybinding(message.settings.enableSmartInlineTaskKeybinding) setEnableChatAutocomplete(message.settings.enableChatAutocomplete) + setModel(message.settings.model) }) onCleanup(unsubscribe) @@ -37,6 +47,26 @@ const AutocompleteTab: Component = () => { return (
+ + m.id)} - current={model() as ModelId} - label={(opt: ModelId) => AUTOCOMPLETE_MODELS.find((m) => m.id === opt)?.label ?? opt} - value={(opt: ModelId) => opt} - onSelect={(opt) => { - if (opt !== undefined) { - setModel(opt) - vscode.postMessage({ type: "updateAutocompleteSetting", key: "model", value: opt }) - } - }} - variant="secondary" - size="large" - /> - - { const { config, updateConfig } = useConfig() const language = useLanguage() const session = useSession() + const vscode = useVSCode() + + const [autocompleteModel, setAutocompleteModel] = createSignal("mistralai/codestral-2508") + + const unsubscribe = vscode.onMessage((message: ExtensionMessage) => { + if (message.type === "autocompleteSettingsLoaded") { + setAutocompleteModel(message.settings.model) + } + }) + onCleanup(unsubscribe) + vscode.postMessage({ type: "requestAutocompleteSettings" }) function handleModelSelect(configKey: "model" | "small_model") { return (providerID: string, modelID: string) => { @@ -52,7 +73,6 @@ const ModelsTab: Component = () => { { includeAutoSmall /> + + m.id)} - current={autocompleteModel() as AutocompleteModelId} - label={(opt: AutocompleteModelId) => AUTOCOMPLETE_MODELS.find((m) => m.id === opt)?.label ?? opt} - value={(opt: AutocompleteModelId) => opt} + current={autocompleteModel()} + label={(opt: string) => AUTOCOMPLETE_MODELS.find((m) => m.id === opt)?.label ?? opt} + value={(opt: string) => opt} onSelect={(opt) => { if (opt !== undefined) { setAutocompleteModel(opt) From 54e76368d403e8ab537deda4f95c4adfa0bfcd2a Mon Sep 17 00:00:00 2001 From: "kiloconnect[bot]" <240665456+kiloconnect[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 15:55:28 +0000 Subject: [PATCH 156/238] docs(kilo-docs): document Mercury Edit autocomplete model (BYOK only) --- .../code-with-ai/features/autocomplete/index.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/kilo-docs/pages/code-with-ai/features/autocomplete/index.md b/packages/kilo-docs/pages/code-with-ai/features/autocomplete/index.md index bc485fcdda9..98f0606dd4a 100644 --- a/packages/kilo-docs/pages/code-with-ai/features/autocomplete/index.md +++ b/packages/kilo-docs/pages/code-with-ai/features/autocomplete/index.md @@ -12,7 +12,12 @@ Kilo Code's autocomplete feature provides intelligent code suggestions and compl ## How Autocomplete Works -The extension uses **Fill-in-the-Middle (FIM)** completion powered by Codestral (`mistralai/codestral-2508`) via the **Kilo Gateway**. It analyzes the code before and after your cursor to generate contextually accurate inline suggestions. +The extension uses **Fill-in-the-Middle (FIM)** completion routed through the **Kilo Gateway**. It analyzes the code before and after your cursor to generate contextually accurate inline suggestions. + +You can choose between two FIM models: + +- **Codestral** (`mistralai/codestral-2508`) by Mistral AI — the default, billed through your Kilo account. +- **Mercury Edit** (`inception/mercury-edit`) by Inception — available via **BYOK** (Bring Your Own Key) only. ## Triggering Options @@ -30,9 +35,14 @@ This keybinding requires `kilo-code.new.autocomplete.enableSmartInlineTaskKeybin ## Provider and Model -Autocomplete currently uses **Codestral** (`mistralai/codestral-2508`) routed through the **Kilo Gateway**. Codestral is optimized for Fill-in-the-Middle (FIM) completions, and there is no option to select a different model at this time. Support for additional FIM models is planned for future releases. +Autocomplete requests are routed through the **Kilo Gateway**. You can pick the FIM model under **Settings → Models → Autocomplete model**: -Requests are billed through your Kilo account. To use your own Mistral API key instead, see [Setting Up Mistral for Free Autocomplete](/docs/code-with-ai/features/autocomplete/mistral-setup). +- **Codestral** (`mistralai/codestral-2508`) — the default. Billed through your Kilo account, or free when you add your own Mistral Codestral key via BYOK. See [Setting Up Mistral for Free Autocomplete](/docs/code-with-ai/features/autocomplete/mistral-setup). +- **Mercury Edit** (`inception/mercury-edit`) — a fast diffusion-based FIM model by Inception. For now, Mercury Edit requires an **Inception BYOK key**. Add one from the [BYOK page](https://app.kilo.ai/byok) in the Kilo platform. See [Bring Your Own Key (BYOK)](/docs/getting-started/byok) for setup details. + +{% callout type="note" %} +Mercury Edit is only available through BYOK today. If you select Mercury Edit without a valid Inception BYOK key configured, autocomplete requests will fail — switch back to Codestral or add an Inception key to continue. +{% /callout %} ## Status Bar From 596145a71d2e8baa1ffb99894d8499b76d130f13 Mon Sep 17 00:00:00 2001 From: opencode Date: Thu, 23 Apr 2026 15:56:36 +0000 Subject: [PATCH 157/238] release: v1.14.22 --- bun.lock | 32 +++++++++++++------------- packages/app/package.json | 2 +- packages/console/app/package.json | 2 +- packages/console/core/package.json | 2 +- packages/console/function/package.json | 2 +- packages/console/mail/package.json | 2 +- packages/desktop-electron/package.json | 2 +- packages/desktop/package.json | 2 +- packages/enterprise/package.json | 2 +- packages/extensions/zed/extension.toml | 12 +++++----- packages/function/package.json | 2 +- packages/opencode/package.json | 2 +- packages/plugin/package.json | 2 +- packages/sdk/js/package.json | 2 +- packages/shared/package.json | 2 +- packages/slack/package.json | 2 +- packages/ui/package.json | 2 +- packages/web/package.json | 2 +- sdks/vscode/package.json | 2 +- 19 files changed, 39 insertions(+), 39 deletions(-) diff --git a/bun.lock b/bun.lock index addecfff270..06a5cfdb4c5 100644 --- a/bun.lock +++ b/bun.lock @@ -29,7 +29,7 @@ }, "packages/app": { "name": "@opencode-ai/app", - "version": "1.14.21", + "version": "1.14.22", "dependencies": { "@kobalte/core": "catalog:", "@opencode-ai/sdk": "workspace:*", @@ -83,7 +83,7 @@ }, "packages/console/app": { "name": "@opencode-ai/console-app", - "version": "1.14.21", + "version": "1.14.22", "dependencies": { "@cloudflare/vite-plugin": "1.15.2", "@ibm/plex": "6.4.1", @@ -117,7 +117,7 @@ }, "packages/console/core": { "name": "@opencode-ai/console-core", - "version": "1.14.21", + "version": "1.14.22", "dependencies": { "@aws-sdk/client-sts": "3.782.0", "@jsx-email/render": "1.1.1", @@ -144,7 +144,7 @@ }, "packages/console/function": { "name": "@opencode-ai/console-function", - "version": "1.14.21", + "version": "1.14.22", "dependencies": { "@ai-sdk/anthropic": "3.0.64", "@ai-sdk/openai": "3.0.48", @@ -168,7 +168,7 @@ }, "packages/console/mail": { "name": "@opencode-ai/console-mail", - "version": "1.14.21", + "version": "1.14.22", "dependencies": { "@jsx-email/all": "2.2.3", "@jsx-email/cli": "1.4.3", @@ -192,7 +192,7 @@ }, "packages/desktop": { "name": "@opencode-ai/desktop", - "version": "1.14.21", + "version": "1.14.22", "dependencies": { "@opencode-ai/app": "workspace:*", "@opencode-ai/ui": "workspace:*", @@ -225,7 +225,7 @@ }, "packages/desktop-electron": { "name": "@opencode-ai/desktop-electron", - "version": "1.14.21", + "version": "1.14.22", "dependencies": { "drizzle-orm": "catalog:", "effect": "catalog:", @@ -269,7 +269,7 @@ }, "packages/enterprise": { "name": "@opencode-ai/enterprise", - "version": "1.14.21", + "version": "1.14.22", "dependencies": { "@opencode-ai/shared": "workspace:*", "@opencode-ai/ui": "workspace:*", @@ -298,7 +298,7 @@ }, "packages/function": { "name": "@opencode-ai/function", - "version": "1.14.21", + "version": "1.14.22", "dependencies": { "@octokit/auth-app": "8.0.1", "@octokit/rest": "catalog:", @@ -314,7 +314,7 @@ }, "packages/opencode": { "name": "opencode", - "version": "1.14.21", + "version": "1.14.22", "bin": { "opencode": "./bin/opencode", }, @@ -459,7 +459,7 @@ }, "packages/plugin": { "name": "@opencode-ai/plugin", - "version": "1.14.21", + "version": "1.14.22", "dependencies": { "@opencode-ai/sdk": "workspace:*", "effect": "catalog:", @@ -494,7 +494,7 @@ }, "packages/sdk/js": { "name": "@opencode-ai/sdk", - "version": "1.14.21", + "version": "1.14.22", "dependencies": { "cross-spawn": "catalog:", }, @@ -509,7 +509,7 @@ }, "packages/shared": { "name": "@opencode-ai/shared", - "version": "1.14.21", + "version": "1.14.22", "bin": { "opencode": "./bin/opencode", }, @@ -533,7 +533,7 @@ }, "packages/slack": { "name": "@opencode-ai/slack", - "version": "1.14.21", + "version": "1.14.22", "dependencies": { "@opencode-ai/sdk": "workspace:*", "@slack/bolt": "^3.17.1", @@ -568,7 +568,7 @@ }, "packages/ui": { "name": "@opencode-ai/ui", - "version": "1.14.21", + "version": "1.14.22", "dependencies": { "@kobalte/core": "catalog:", "@opencode-ai/sdk": "workspace:*", @@ -617,7 +617,7 @@ }, "packages/web": { "name": "@opencode-ai/web", - "version": "1.14.21", + "version": "1.14.22", "dependencies": { "@astrojs/cloudflare": "12.6.3", "@astrojs/markdown-remark": "6.3.1", diff --git a/packages/app/package.json b/packages/app/package.json index 7572f0b2284..0ab5e304a2b 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/app", - "version": "1.14.21", + "version": "1.14.22", "description": "", "type": "module", "exports": { diff --git a/packages/console/app/package.json b/packages/console/app/package.json index 1182f179486..3d375275081 100644 --- a/packages/console/app/package.json +++ b/packages/console/app/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/console-app", - "version": "1.14.21", + "version": "1.14.22", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/console/core/package.json b/packages/console/core/package.json index f79ef3ecb0d..70d44b3820a 100644 --- a/packages/console/core/package.json +++ b/packages/console/core/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@opencode-ai/console-core", - "version": "1.14.21", + "version": "1.14.22", "private": true, "type": "module", "license": "MIT", diff --git a/packages/console/function/package.json b/packages/console/function/package.json index c3c549004d0..55791a3072c 100644 --- a/packages/console/function/package.json +++ b/packages/console/function/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/console-function", - "version": "1.14.21", + "version": "1.14.22", "$schema": "https://json.schemastore.org/package.json", "private": true, "type": "module", diff --git a/packages/console/mail/package.json b/packages/console/mail/package.json index f4c59c1967e..4966bf3e634 100644 --- a/packages/console/mail/package.json +++ b/packages/console/mail/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/console-mail", - "version": "1.14.21", + "version": "1.14.22", "dependencies": { "@jsx-email/all": "2.2.3", "@jsx-email/cli": "1.4.3", diff --git a/packages/desktop-electron/package.json b/packages/desktop-electron/package.json index 3f5ca841b01..a528a9a3ac3 100644 --- a/packages/desktop-electron/package.json +++ b/packages/desktop-electron/package.json @@ -1,7 +1,7 @@ { "name": "@opencode-ai/desktop-electron", "private": true, - "version": "1.14.21", + "version": "1.14.22", "type": "module", "license": "MIT", "homepage": "https://opencode.ai", diff --git a/packages/desktop/package.json b/packages/desktop/package.json index 0e349f81c3d..32b63fff13a 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -1,7 +1,7 @@ { "name": "@opencode-ai/desktop", "private": true, - "version": "1.14.21", + "version": "1.14.22", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/enterprise/package.json b/packages/enterprise/package.json index 77b0ec20024..e4428f0cb26 100644 --- a/packages/enterprise/package.json +++ b/packages/enterprise/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/enterprise", - "version": "1.14.21", + "version": "1.14.22", "private": true, "type": "module", "license": "MIT", diff --git a/packages/extensions/zed/extension.toml b/packages/extensions/zed/extension.toml index 5a9d2dc1ac5..6449b8df65d 100644 --- a/packages/extensions/zed/extension.toml +++ b/packages/extensions/zed/extension.toml @@ -1,7 +1,7 @@ id = "opencode" name = "OpenCode" description = "The open source coding agent." -version = "1.14.21" +version = "1.14.22" schema_version = 1 authors = ["Anomaly"] repository = "https://github.com/anomalyco/opencode" @@ -11,26 +11,26 @@ name = "OpenCode" icon = "./icons/opencode.svg" [agent_servers.opencode.targets.darwin-aarch64] -archive = "https://github.com/anomalyco/opencode/releases/download/v1.14.21/opencode-darwin-arm64.zip" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.14.22/opencode-darwin-arm64.zip" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.darwin-x86_64] -archive = "https://github.com/anomalyco/opencode/releases/download/v1.14.21/opencode-darwin-x64.zip" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.14.22/opencode-darwin-x64.zip" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.linux-aarch64] -archive = "https://github.com/anomalyco/opencode/releases/download/v1.14.21/opencode-linux-arm64.tar.gz" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.14.22/opencode-linux-arm64.tar.gz" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.linux-x86_64] -archive = "https://github.com/anomalyco/opencode/releases/download/v1.14.21/opencode-linux-x64.tar.gz" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.14.22/opencode-linux-x64.tar.gz" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.windows-x86_64] -archive = "https://github.com/anomalyco/opencode/releases/download/v1.14.21/opencode-windows-x64.zip" +archive = "https://github.com/anomalyco/opencode/releases/download/v1.14.22/opencode-windows-x64.zip" cmd = "./opencode.exe" args = ["acp"] diff --git a/packages/function/package.json b/packages/function/package.json index 925e458cf0f..5b06d03685e 100644 --- a/packages/function/package.json +++ b/packages/function/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/function", - "version": "1.14.21", + "version": "1.14.22", "$schema": "https://json.schemastore.org/package.json", "private": true, "type": "module", diff --git a/packages/opencode/package.json b/packages/opencode/package.json index cd9c0f0a834..ea8724ceb82 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "version": "1.14.21", + "version": "1.14.22", "name": "opencode", "type": "module", "license": "MIT", diff --git a/packages/plugin/package.json b/packages/plugin/package.json index d7190106615..ee8210ec144 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@opencode-ai/plugin", - "version": "1.14.21", + "version": "1.14.22", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json index 3d07efef498..62a50b7434b 100644 --- a/packages/sdk/js/package.json +++ b/packages/sdk/js/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@opencode-ai/sdk", - "version": "1.14.21", + "version": "1.14.22", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/shared/package.json b/packages/shared/package.json index 117c12b981c..48ae0fb78df 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "version": "1.14.21", + "version": "1.14.22", "name": "@opencode-ai/shared", "type": "module", "license": "MIT", diff --git a/packages/slack/package.json b/packages/slack/package.json index 2eb380dc74c..a3516932ab6 100644 --- a/packages/slack/package.json +++ b/packages/slack/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/slack", - "version": "1.14.21", + "version": "1.14.22", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/ui/package.json b/packages/ui/package.json index a15918dc859..ba0fb014949 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/ui", - "version": "1.14.21", + "version": "1.14.22", "type": "module", "license": "MIT", "exports": { diff --git a/packages/web/package.json b/packages/web/package.json index 9924f2e516c..818cdf721eb 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -2,7 +2,7 @@ "name": "@opencode-ai/web", "type": "module", "license": "MIT", - "version": "1.14.21", + "version": "1.14.22", "scripts": { "dev": "astro dev", "dev:remote": "VITE_API_URL=https://api.opencode.ai astro dev", diff --git a/sdks/vscode/package.json b/sdks/vscode/package.json index a43348670b0..e238b367022 100644 --- a/sdks/vscode/package.json +++ b/sdks/vscode/package.json @@ -2,7 +2,7 @@ "name": "opencode", "displayName": "opencode", "description": "opencode for VS Code", - "version": "1.14.21", + "version": "1.14.22", "publisher": "sst-dev", "repository": { "type": "git", From 73ab363f9a1592721d4ce4b92d1a083b7bc8176b Mon Sep 17 00:00:00 2001 From: Alex Alecu Date: Fri, 24 Apr 2026 06:17:02 +0300 Subject: [PATCH 158/238] fix(cli): include subagent costs in session total (#6321) When a session spawned subagents via the task tool, the displayed cost reflected only the parent's own LLM steps. Propagate each subagent's total up to the invoking assistant message so every UI sums the full tree. --- .changeset/fix-subagent-cost-propagation.md | 5 + .../src/kilocode/session/cost-propagation.ts | 40 +++ packages/opencode/src/session/prompt.ts | 19 ++ packages/opencode/src/tool/task.ts | 14 +- .../test/session/prompt-effect.test.ts | 59 +++++ packages/opencode/test/tool/task.test.ts | 230 +++++++++++++++++- 6 files changed, 360 insertions(+), 7 deletions(-) create mode 100644 .changeset/fix-subagent-cost-propagation.md create mode 100644 packages/opencode/src/kilocode/session/cost-propagation.ts diff --git a/.changeset/fix-subagent-cost-propagation.md b/.changeset/fix-subagent-cost-propagation.md new file mode 100644 index 00000000000..3f31f223c62 --- /dev/null +++ b/.changeset/fix-subagent-cost-propagation.md @@ -0,0 +1,5 @@ +--- +"@kilocode/cli": patch +--- + +Fix session cost display missing subagent costs. The TUI footer, sidebar, web context panel, and ACP usage reports now include the cost of every subagent the session spawned, including nested ones. diff --git a/packages/opencode/src/kilocode/session/cost-propagation.ts b/packages/opencode/src/kilocode/session/cost-propagation.ts new file mode 100644 index 00000000000..2aa16bca728 --- /dev/null +++ b/packages/opencode/src/kilocode/session/cost-propagation.ts @@ -0,0 +1,40 @@ +// kilocode_change - new file +import { Effect } from "effect" +import { Session } from "@/session" +import { MessageV2 } from "@/session/message-v2" +import { SessionID, MessageID } from "@/session/schema" + +export namespace KiloCostPropagation { + /** + * Total assistant-message cost in a session. Because each subagent propagates + * its own total into the parent assistant message when it finishes, this sum + * already reflects descendant sessions recursively — no tree walk needed. + */ + export const childCost = Effect.fn("KiloCostPropagation.childCost")(function* ( + sessions: Session.Interface, + id: SessionID, + ) { + const msgs = yield* sessions.messages({ sessionID: id }) + return msgs.reduce((sum, m) => sum + (m.info.role === "assistant" ? m.info.cost : 0), 0) + }) + + /** + * Add `amount` to the given parent assistant message's cost. No-op when + * `amount` is non-positive or the target is not an assistant message. + * + * Caller must guarantee serial access to the parent message — concurrent + * calls against the same `(sid, mid)` are not atomic (read-modify-write). + */ + export const propagate = Effect.fn("KiloCostPropagation.propagate")(function* ( + sessions: Session.Interface, + sid: SessionID, + mid: MessageID, + amount: number, + ) { + if (!(amount > 0)) return + const parent = yield* Effect.sync(() => MessageV2.get({ sessionID: sid, messageID: mid })) + if (parent.info.role !== "assistant") return + parent.info.cost += amount + yield* sessions.updateMessage(parent.info) + }) +} diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 0281aaf2816..7581ca7cbad 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -4,6 +4,7 @@ import fs from "fs/promises" import { KiloSessionPrompt } from "@/kilocode/session/prompt" // kilocode_change import { KiloSessionPromptQueue } from "@/kilocode/session/prompt-queue" // kilocode_change import { KiloSession } from "@/kilocode/session" // kilocode_change +import { KiloCostPropagation } from "@/kilocode/session/cost-propagation" // kilocode_change import { Suggestion } from "@/kilocode/suggestion" // kilocode_change import { Question } from "@/question" // kilocode_change import z from "zod" @@ -598,6 +599,12 @@ NOTE: At any point in time through this workflow you should feel free to ask the let error: Error | undefined const taskAbort = new AbortController() + // kilocode_change start - shared reader for the child session id written by task.ts ctx.metadata (#6321) + const childID = () => { + const meta = part.state.status !== "pending" ? part.state.metadata : undefined + return (meta as { sessionId?: string } | undefined)?.sessionId + } + // kilocode_change end const result = yield* taskTool .execute(taskArgs, { agent: task.agent, @@ -636,6 +643,12 @@ NOTE: At any point in time through this workflow you should feel free to ask the taskAbort.abort() assistantMessage.finish = "tool-calls" assistantMessage.time.completed = Date.now() + // kilocode_change start - propagate partial subagent cost on cancel (#6321) + const cid = childID() + if (cid) { + assistantMessage.cost = yield* KiloCostPropagation.childCost(sessions, SessionID.make(cid)) + } + // kilocode_change end yield* sessions.updateMessage(assistantMessage) if (part.state.status === "running") { yield* sessions.updatePart({ @@ -668,6 +681,12 @@ NOTE: At any point in time through this workflow you should feel free to ask the assistantMessage.finish = "tool-calls" assistantMessage.time.completed = Date.now() + // kilocode_change start - include subagent total cost on the wrapper message (#6321) + const cid = result?.metadata?.sessionId ?? childID() + if (cid) { + assistantMessage.cost = yield* KiloCostPropagation.childCost(sessions, SessionID.make(cid)) + } + // kilocode_change end yield* sessions.updateMessage(assistantMessage) if (result && part.state.status === "running") { diff --git a/packages/opencode/src/tool/task.ts b/packages/opencode/src/tool/task.ts index 2b678f04a31..69fb644331d 100644 --- a/packages/opencode/src/tool/task.ts +++ b/packages/opencode/src/tool/task.ts @@ -9,6 +9,7 @@ import type { SessionPrompt } from "../session/prompt" import { Config } from "../config" import { Effect } from "effect" import { KiloTask } from "../kilocode/tool/task" // kilocode_change +import { KiloCostPropagation } from "../kilocode/session/cost-propagation" // kilocode_change export interface TaskPromptOps { cancel(sessionID: SessionID): void @@ -135,9 +136,12 @@ export const TaskTool = Tool.define( } return yield* Effect.acquireUseRelease( - Effect.sync(() => { + // kilocode_change start - snapshot child cost so we propagate only the delta on resume (#6321) + Effect.gen(function* () { ctx.abort.addEventListener("abort", cancel) + return yield* KiloCostPropagation.childCost(sessions, nextSession.id) }), + // kilocode_change end () => Effect.gen(function* () { const parts = yield* ops.resolvePromptParts(params.prompt) @@ -172,10 +176,14 @@ export const TaskTool = Tool.define( ].join("\n"), } }), - () => - Effect.sync(() => { + // kilocode_change start - propagate subagent cost delta to parent on every exit path (#6321) + (costBefore) => + Effect.gen(function* () { ctx.abort.removeEventListener("abort", cancel) + const costAfter = yield* KiloCostPropagation.childCost(sessions, nextSession.id) + yield* KiloCostPropagation.propagate(sessions, ctx.sessionID, ctx.messageID, costAfter - costBefore) }), + // kilocode_change end ) }) diff --git a/packages/opencode/test/session/prompt-effect.test.ts b/packages/opencode/test/session/prompt-effect.test.ts index 1cf6abb779f..719b8712e74 100644 --- a/packages/opencode/test/session/prompt-effect.test.ts +++ b/packages/opencode/test/session/prompt-effect.test.ts @@ -812,6 +812,65 @@ it.live( 30_000, ) +// kilocode_change start - handleSubtask propagates child session cost to wrapper (#6321) +it.live( + "handleSubtask propagates subagent cost to wrapper message", + () => + provideTmpdirServer( + Effect.fnUntraced(function* ({ llm }) { + const prompt = yield* SessionPrompt.Service + const sessions = yield* Session.Service + const registry = yield* ToolRegistry.Service + const { task } = yield* registry.named() + const original = task.execute + // Simulate task tool: create a child session, persist an assistant with cost, return metadata. + task.execute = (_args, ctx) => + Effect.gen(function* () { + const child = yield* sessions.create({ parentID: ctx.sessionID, title: "subagent" }) + const childAssistant: MessageV2.Assistant = { + id: MessageID.ascending(), + role: "assistant", + parentID: ctx.messageID, + sessionID: child.id, + mode: "general", + agent: "general", + cost: 0.42, + path: { cwd: "/tmp", root: "/tmp" }, + tokens: { input: 0, output: 0, reasoning: 0, cache: { read: 0, write: 0 } }, + modelID: ref.modelID, + providerID: ref.providerID, + time: { created: Date.now(), completed: Date.now() }, + finish: "stop", + } + yield* sessions.updateMessage(childAssistant) + yield* ctx.metadata({ + title: "done", + metadata: { sessionId: child.id, model: ref }, + }) + return { title: "done", metadata: { sessionId: child.id, model: ref }, output: "done" } + }) + yield* Effect.addFinalizer(() => Effect.sync(() => void (task.execute = original))) + + const chat = yield* sessions.create({ title: "Pinned" }) + const msg = yield* user(chat.id, "hello") + yield* addSubtask(chat.id, msg.id) + // The loop continues past handleSubtask into a normal LLM step; provide one response to exit. + yield* llm.text("wrapped") + + yield* prompt.loop({ sessionID: chat.id }) + + const msgs = yield* MessageV2.filterCompactedEffect(chat.id) + const wrapper = msgs.find((item) => item.info.role === "assistant" && item.info.agent === "general") + expect(wrapper?.info.role).toBe("assistant") + if (!wrapper || wrapper.info.role !== "assistant") return + expect(wrapper.info.cost).toBeCloseTo(0.42, 6) + }), + { git: true, config: providerCfg }, + ), + 30_000, +) +// kilocode_change end + it.live( "cancel with queued callers resolves all cleanly", () => diff --git a/packages/opencode/test/tool/task.test.ts b/packages/opencode/test/tool/task.test.ts index b85279df755..5b264d43eea 100644 --- a/packages/opencode/test/tool/task.test.ts +++ b/packages/opencode/test/tool/task.test.ts @@ -7,7 +7,7 @@ import { Instance } from "../../src/project/instance" import { Session } from "../../src/session" import { MessageV2 } from "../../src/session/message-v2" import type { SessionPrompt } from "../../src/session/prompt" -import { MessageID, PartID } from "../../src/session/schema" +import { MessageID, PartID, SessionID } from "../../src/session/schema" // kilocode_change - SessionID used by cost propagation tests import { ModelID, ProviderID } from "../../src/provider/schema" import { TaskTool, type TaskPromptOps } from "../../src/tool/task" import { Truncate } from "../../src/tool" @@ -64,17 +64,28 @@ const seed = Effect.fn("TaskToolTest.seed")(function* (title = "Pinned") { return { chat, assistant } }) -function stubOps(opts?: { onPrompt?: (input: SessionPrompt.PromptInput) => void; text?: string }): TaskPromptOps { +// kilocode_change start - stub signature + prompt body extended to persist assistant cost for propagation tests +function stubOps(opts?: { + onPrompt?: (input: SessionPrompt.PromptInput) => void + text?: string + sessions?: Session.Interface + childCost?: number +}): TaskPromptOps { return { cancel() {}, resolvePromptParts: (template) => Effect.succeed([{ type: "text" as const, text: template }]), prompt: (input) => - Effect.sync(() => { + Effect.gen(function* () { opts?.onPrompt?.(input) - return reply(input, opts?.text ?? "done") + const rep = reply(input, opts?.text ?? "done") + if (opts?.sessions && opts?.childCost != null) { + yield* opts.sessions.updateMessage({ ...rep.info, cost: opts.childCost }) + } + return rep }), } } +// kilocode_change end function reply(input: SessionPrompt.PromptInput, text: string): MessageV2.WithParts { const id = MessageID.ascending() @@ -395,3 +406,214 @@ describe("tool.task", () => { ), ) }) + +// kilocode_change start - subagent cost propagation coverage (#6321) +const assistantCost = Effect.fn("TaskToolTest.assistantCost")(function* (sessionID: string) { + const sessions = yield* Session.Service + const msgs = yield* sessions.messages({ sessionID: SessionID.make(sessionID) }) + return msgs.reduce((sum, m) => sum + (m.info.role === "assistant" ? m.info.cost : 0), 0) +}) + +describe("tool.task cost propagation", () => { + it.live("propagates subagent cost to parent assistant message", () => + provideTmpdirInstance(() => + Effect.gen(function* () { + const sessions = yield* Session.Service + const { chat, assistant } = yield* seed() + const tool = yield* TaskTool + const def = yield* tool.init() + const promptOps = stubOps({ sessions, childCost: 0.25 }) + + yield* def.execute( + { + description: "inspect bug", + prompt: "look into the cache key path", + subagent_type: "general", + }, + { + sessionID: chat.id, + messageID: assistant.id, + agent: "build", + abort: new AbortController().signal, + extra: { promptOps }, + messages: [], + metadata: () => Effect.void, + ask: () => Effect.void, + }, + ) + const parent = yield* Effect.sync(() => MessageV2.get({ sessionID: chat.id, messageID: assistant.id })) + expect(parent.info.role).toBe("assistant") + if (parent.info.role !== "assistant") return + expect(parent.info.cost).toBeCloseTo(0.25, 6) + }), + ), + ) + + it.live("propagates recursively through nested subagent costs", () => + provideTmpdirInstance(() => + Effect.gen(function* () { + const sessions = yield* Session.Service + const { chat, assistant } = yield* seed() + // Pre-create a child with its own assistant already bearing a grandchild cost. + const child = yield* sessions.create({ parentID: chat.id, title: "grandchild-accumulated" }) + yield* sessions.updateMessage({ + id: MessageID.ascending(), + role: "assistant", + parentID: assistant.id, + sessionID: child.id, + mode: "build", + agent: "general", + cost: 0.4, + path: { cwd: "/tmp", root: "/tmp" }, + tokens: { input: 0, output: 0, reasoning: 0, cache: { read: 0, write: 0 } }, + modelID: ref.modelID, + providerID: ref.providerID, + time: { created: Date.now() }, + }) + + const tool = yield* TaskTool + const def = yield* tool.init() + // Resuming into the same child via task_id and the stub tacks on another 0.15. + const promptOps = stubOps({ sessions, childCost: 0.15 }) + + yield* def.execute( + { + description: "inspect bug", + prompt: "look into the cache key path", + subagent_type: "general", + task_id: child.id, + }, + { + sessionID: chat.id, + messageID: assistant.id, + agent: "build", + abort: new AbortController().signal, + extra: { promptOps }, + messages: [], + metadata: () => Effect.void, + ask: () => Effect.void, + }, + ) + const parent = yield* Effect.sync(() => MessageV2.get({ sessionID: chat.id, messageID: assistant.id })) + if (parent.info.role !== "assistant") return + // Only the delta since the start of this invocation propagates. + expect(parent.info.cost).toBeCloseTo(0.15, 6) + // Child session keeps the full cumulative total (0.4 pre-existing + 0.15 this run). + expect(yield* assistantCost(child.id)).toBeCloseTo(0.55, 6) + }), + ), + ) + + it.live("resumed task_id only propagates the delta", () => + provideTmpdirInstance(() => + Effect.gen(function* () { + const sessions = yield* Session.Service + const { chat, assistant } = yield* seed() + const child = yield* sessions.create({ parentID: chat.id, title: "resume target" }) + yield* sessions.updateMessage({ + id: MessageID.ascending(), + role: "assistant", + parentID: assistant.id, + sessionID: child.id, + mode: "build", + agent: "general", + cost: 0.1, + path: { cwd: "/tmp", root: "/tmp" }, + tokens: { input: 0, output: 0, reasoning: 0, cache: { read: 0, write: 0 } }, + modelID: ref.modelID, + providerID: ref.providerID, + time: { created: Date.now() }, + }) + + const tool = yield* TaskTool + const def = yield* tool.init() + const promptOps = stubOps({ sessions, childCost: 0.05 }) + + yield* def.execute( + { + description: "inspect bug", + prompt: "continue investigation", + subagent_type: "general", + task_id: child.id, + }, + { + sessionID: chat.id, + messageID: assistant.id, + agent: "build", + abort: new AbortController().signal, + extra: { promptOps }, + messages: [], + metadata: () => Effect.void, + ask: () => Effect.void, + }, + ) + const parent = yield* Effect.sync(() => MessageV2.get({ sessionID: chat.id, messageID: assistant.id })) + if (parent.info.role !== "assistant") return + // Delta-only: only the 0.05 from this run, not 0.15 including the pre-existing 0.10. + expect(parent.info.cost).toBeCloseTo(0.05, 6) + }), + ), + ) + + it.live("propagates partial cost on abort", () => + provideTmpdirInstance(() => + Effect.gen(function* () { + const sessions = yield* Session.Service + const { chat, assistant } = yield* seed() + const tool = yield* TaskTool + const def = yield* tool.init() + const abort = new AbortController() + // Stub that persists a partial cost, then aborts — mimics interrupted run after tokens billed. + const ops: TaskPromptOps = { + cancel() {}, + resolvePromptParts: (template) => Effect.succeed([{ type: "text" as const, text: template }]), + prompt: (input) => + Effect.gen(function* () { + const info: MessageV2.Assistant = { + id: MessageID.ascending(), + role: "assistant", + parentID: input.messageID ?? MessageID.ascending(), + sessionID: input.sessionID, + mode: "general", + agent: "general", + cost: 0.07, + path: { cwd: "/tmp", root: "/tmp" }, + tokens: { input: 0, output: 0, reasoning: 0, cache: { read: 0, write: 0 } }, + modelID: ref.modelID, + providerID: ref.providerID, + time: { created: Date.now() }, + } + yield* sessions.updateMessage(info) + abort.abort() + return yield* Effect.interrupt + }), + } + + yield* def + .execute( + { + description: "partial", + prompt: "will abort", + subagent_type: "general", + }, + { + sessionID: chat.id, + messageID: assistant.id, + agent: "build", + abort: abort.signal, + extra: { promptOps: ops }, + messages: [], + metadata: () => Effect.void, + ask: () => Effect.void, + }, + ) + .pipe(Effect.exit) + + const parent = yield* Effect.sync(() => MessageV2.get({ sessionID: chat.id, messageID: assistant.id })) + if (parent.info.role !== "assistant") return + expect(parent.info.cost).toBeCloseTo(0.07, 6) + }), + ), + ) +}) +// kilocode_change end From ae0c43779167b7d7d88d983cd147b60b782ed644 Mon Sep 17 00:00:00 2001 From: Alex Alecu Date: Fri, 24 Apr 2026 07:26:09 +0300 Subject: [PATCH 159/238] fix(cli): serialize concurrent subagent cost propagation --- .../src/kilocode/session/cost-propagation.ts | 41 ++++++-- .../test/kilocode/cost-propagation.test.ts | 94 +++++++++++++++++++ 2 files changed, 129 insertions(+), 6 deletions(-) create mode 100644 packages/opencode/test/kilocode/cost-propagation.test.ts diff --git a/packages/opencode/src/kilocode/session/cost-propagation.ts b/packages/opencode/src/kilocode/session/cost-propagation.ts index 2aa16bca728..107b56d56a7 100644 --- a/packages/opencode/src/kilocode/session/cost-propagation.ts +++ b/packages/opencode/src/kilocode/session/cost-propagation.ts @@ -5,6 +5,28 @@ import { MessageV2 } from "@/session/message-v2" import { SessionID, MessageID } from "@/session/schema" export namespace KiloCostPropagation { + /** + * Per-key promise chain that serializes concurrent `propagate` calls against + * the same parent message. Prevents lost updates when the LLM launches + * several `task` tool calls in parallel (each release stage races to + * read-modify-write the same parent cost field). + */ + const locks = new Map>() + + function acquire(key: string): Promise<() => void> { + const prev = locks.get(key) ?? Promise.resolve() + let release!: () => void + const current = new Promise((r) => (release = r)) + const chain = prev.catch(() => {}).then(() => current) + locks.set(key, chain) + return prev + .catch(() => {}) + .then(() => () => { + release() + if (locks.get(key) === chain) locks.delete(key) + }) + } + /** * Total assistant-message cost in a session. Because each subagent propagates * its own total into the parent assistant message when it finishes, this sum @@ -22,8 +44,8 @@ export namespace KiloCostPropagation { * Add `amount` to the given parent assistant message's cost. No-op when * `amount` is non-positive or the target is not an assistant message. * - * Caller must guarantee serial access to the parent message — concurrent - * calls against the same `(sid, mid)` are not atomic (read-modify-write). + * Concurrent calls against the same parent are serialized internally so the + * read-modify-write cannot lose updates when subagents complete in parallel. */ export const propagate = Effect.fn("KiloCostPropagation.propagate")(function* ( sessions: Session.Interface, @@ -32,9 +54,16 @@ export namespace KiloCostPropagation { amount: number, ) { if (!(amount > 0)) return - const parent = yield* Effect.sync(() => MessageV2.get({ sessionID: sid, messageID: mid })) - if (parent.info.role !== "assistant") return - parent.info.cost += amount - yield* sessions.updateMessage(parent.info) + yield* Effect.acquireUseRelease( + Effect.promise(() => acquire(`${sid}:${mid}`)), + () => + Effect.gen(function* () { + const parent = yield* Effect.sync(() => MessageV2.get({ sessionID: sid, messageID: mid })) + if (parent.info.role !== "assistant") return + parent.info.cost += amount + yield* sessions.updateMessage(parent.info) + }), + (release) => Effect.sync(() => release()), + ) }) } diff --git a/packages/opencode/test/kilocode/cost-propagation.test.ts b/packages/opencode/test/kilocode/cost-propagation.test.ts new file mode 100644 index 00000000000..343be816d00 --- /dev/null +++ b/packages/opencode/test/kilocode/cost-propagation.test.ts @@ -0,0 +1,94 @@ +// Verifies KiloCostPropagation.propagate() serializes concurrent writes to +// the same parent assistant message. Without the internal lock, parallel +// subagent completions race on read-modify-write and lose deltas (#6321). + +import { afterEach, describe, expect } from "bun:test" +import { Effect, Layer } from "effect" +import { Bus } from "../../src/bus" +import * as CrossSpawnSpawner from "../../src/effect/cross-spawn-spawner" +import { KiloCostPropagation } from "../../src/kilocode/session/cost-propagation" +import { Instance } from "../../src/project/instance" +import { ProviderID, ModelID } from "../../src/provider/schema" +import { Session } from "../../src/session" +import { MessageV2 } from "../../src/session/message-v2" +import { MessageID } from "../../src/session/schema" +import { Log } from "../../src/util" +import { provideTmpdirInstance } from "../fixture/fixture" +import { testEffect } from "../lib/effect" + +Log.init({ print: false }) + +afterEach(async () => { + await Instance.disposeAll() +}) + +const ref = { + providerID: ProviderID.make("test"), + modelID: ModelID.make("test-model"), +} + +const it = testEffect(Layer.mergeAll(Session.defaultLayer, Bus.layer, CrossSpawnSpawner.defaultLayer)) + +const seed = Effect.fn("CostPropagationTest.seed")(function* () { + const sessions = yield* Session.Service + const chat = yield* sessions.create({ title: "parent" }) + const user = yield* sessions.updateMessage({ + id: MessageID.ascending(), + role: "user", + sessionID: chat.id, + agent: "build", + model: ref, + time: { created: Date.now() }, + }) + const assistant: MessageV2.Assistant = { + id: MessageID.ascending(), + role: "assistant", + parentID: user.id, + sessionID: chat.id, + mode: "build", + agent: "build", + cost: 0, + path: { cwd: "/tmp", root: "/tmp" }, + tokens: { input: 0, output: 0, reasoning: 0, cache: { read: 0, write: 0 } }, + modelID: ref.modelID, + providerID: ref.providerID, + time: { created: Date.now() }, + } + yield* sessions.updateMessage(assistant) + return { chat, assistant } +}) + +describe("KiloCostPropagation.propagate", () => { + it.live("sums deltas correctly under parallel execution", () => + provideTmpdirInstance(() => + Effect.gen(function* () { + const sessions = yield* Session.Service + const { chat, assistant } = yield* seed() + const deltas = [0.01, 0.02, 0.04, 0.08, 0.16, 0.32, 0.64, 1.28] + yield* Effect.all( + deltas.map((d) => KiloCostPropagation.propagate(sessions, chat.id, assistant.id, d)), + { concurrency: "unbounded" }, + ) + const parent = yield* Effect.sync(() => MessageV2.get({ sessionID: chat.id, messageID: assistant.id })) + expect(parent.info.role).toBe("assistant") + if (parent.info.role !== "assistant") return + const total = deltas.reduce((a, b) => a + b, 0) + expect(parent.info.cost).toBeCloseTo(total, 6) + }), + ), + ) + + it.live("is a no-op when amount is non-positive", () => + provideTmpdirInstance(() => + Effect.gen(function* () { + const sessions = yield* Session.Service + const { chat, assistant } = yield* seed() + yield* KiloCostPropagation.propagate(sessions, chat.id, assistant.id, 0) + yield* KiloCostPropagation.propagate(sessions, chat.id, assistant.id, -1.5) + const parent = yield* Effect.sync(() => MessageV2.get({ sessionID: chat.id, messageID: assistant.id })) + if (parent.info.role !== "assistant") return + expect(parent.info.cost).toBe(0) + }), + ), + ) +}) From 5bd50c6fe21a72cf82eb0a7006a1d95e47d6a8fc Mon Sep 17 00:00:00 2001 From: Imanol Maiztegui Date: Fri, 24 Apr 2026 14:18:25 +0200 Subject: [PATCH 160/238] refactor: kilo compat for v1.14.22 --- README.ar.md | 4 +- README.bn.md | 4 +- README.br.md | 4 +- README.bs.md | 4 +- README.da.md | 4 +- README.de.md | 4 +- README.es.md | 4 +- README.fr.md | 4 +- README.gr.md | 4 +- README.it.md | 4 +- README.ja.md | 4 +- README.ko.md | 4 +- README.no.md | 4 +- README.pl.md | 4 +- README.ru.md | 4 +- README.th.md | 4 +- README.tr.md | 4 +- README.uk.md | 4 +- README.vi.md | 4 +- README.zh.md | 4 +- README.zht.md | 4 +- github/index.ts | 8 +- github/package.json | 5 +- infra/enterprise.ts | 10 +- package.json | 57 +++++--- packages/app/package.json | 11 +- packages/app/playwright.config.ts | 4 +- .../components/dialog-connect-provider.tsx | 2 +- .../src/components/dialog-custom-provider.tsx | 2 +- packages/app/src/components/dialog-fork.tsx | 2 +- packages/app/src/components/file-tree.tsx | 2 +- .../prompt-input/build-request-parts.ts | 2 +- .../components/prompt-input/submit.test.ts | 4 +- .../app/src/components/prompt-input/submit.ts | 2 +- .../session/session-context-breakdown.test.ts | 2 +- .../session/session-context-breakdown.ts | 2 +- .../session/session-context-metrics.test.ts | 2 +- .../session/session-context-metrics.ts | 2 +- .../session/session-context-tab.tsx | 2 +- .../src/components/session/session-header.tsx | 2 +- .../app/src/components/settings-general.tsx | 4 +- packages/app/src/components/titlebar.tsx | 6 +- .../app/src/context/file/content-cache.ts | 2 +- packages/app/src/context/file/tree-store.ts | 2 +- packages/app/src/context/file/types.ts | 2 +- packages/app/src/context/file/watcher.ts | 2 +- packages/app/src/context/global-sdk.tsx | 2 +- packages/app/src/context/global-sync.tsx | 6 +- .../app/src/context/global-sync/bootstrap.ts | 18 +-- .../src/context/global-sync/child-store.ts | 2 +- .../context/global-sync/event-reducer.test.ts | 2 +- .../src/context/global-sync/event-reducer.ts | 2 +- .../context/global-sync/session-cache.test.ts | 2 +- .../src/context/global-sync/session-cache.ts | 2 +- .../context/global-sync/session-trim.test.ts | 2 +- .../src/context/global-sync/session-trim.ts | 2 +- packages/app/src/context/global-sync/types.ts | 2 +- .../app/src/context/global-sync/utils.test.ts | 2 +- packages/app/src/context/global-sync/utils.ts | 2 +- packages/app/src/context/highlights.tsx | 2 +- packages/app/src/context/layout.tsx | 2 +- packages/app/src/context/notification.tsx | 2 +- .../context/permission-auto-respond.test.ts | 2 +- packages/app/src/context/permission.tsx | 2 +- packages/app/src/context/sdk.tsx | 2 +- .../app/src/context/sync-optimistic.test.ts | 2 +- packages/app/src/context/sync.tsx | 2 +- packages/app/src/entry.tsx | 2 +- packages/app/src/env.d.ts | 6 +- packages/app/src/i18n/ar.ts | 34 ++--- packages/app/src/i18n/br.ts | 34 ++--- packages/app/src/i18n/bs.ts | 34 ++--- packages/app/src/i18n/da.ts | 34 ++--- packages/app/src/i18n/de.ts | 34 ++--- packages/app/src/i18n/en.ts | 34 ++--- packages/app/src/i18n/es.ts | 34 ++--- packages/app/src/i18n/fr.ts | 34 ++--- packages/app/src/i18n/ja.ts | 34 ++--- packages/app/src/i18n/ko.ts | 34 ++--- packages/app/src/i18n/no.ts | 34 ++--- packages/app/src/i18n/pl.ts | 34 ++--- packages/app/src/i18n/ru.ts | 34 ++--- packages/app/src/i18n/th.ts | 34 ++--- packages/app/src/i18n/tr.ts | 34 ++--- packages/app/src/i18n/zh.ts | 34 ++--- packages/app/src/i18n/zht.ts | 34 ++--- packages/app/src/pages/error.tsx | 2 +- packages/app/src/pages/layout.tsx | 4 +- packages/app/src/pages/layout/helpers.test.ts | 2 +- packages/app/src/pages/layout/helpers.ts | 2 +- .../app/src/pages/layout/sidebar-items.tsx | 8 +- .../src/pages/layout/sidebar-workspace.tsx | 2 +- packages/app/src/pages/session.tsx | 2 +- .../composer/session-composer-state.test.ts | 2 +- .../composer/session-composer-state.ts | 2 +- .../composer/session-permission-dock.tsx | 2 +- .../composer/session-question-dock.tsx | 2 +- .../session/composer/session-request-tree.ts | 2 +- .../session/composer/session-todo-dock.tsx | 2 +- .../src/pages/session/message-timeline.tsx | 2 +- packages/app/src/pages/session/review-tab.tsx | 2 +- .../session/session-model-helpers.test.ts | 2 +- .../pages/session/session-model-helpers.ts | 2 +- .../src/pages/session/session-side-panel.tsx | 4 +- .../pages/session/use-session-commands.tsx | 4 +- .../pages/session/use-session-hash-scroll.ts | 2 +- packages/app/src/utils/diffs.test.ts | 4 +- packages/app/src/utils/diffs.ts | 4 +- packages/app/src/utils/prompt.test.ts | 2 +- packages/app/src/utils/prompt.ts | 2 +- packages/app/src/utils/server.ts | 6 +- packages/console/app/package.json | 2 +- packages/console/app/src/lib/language.ts | 2 +- .../app/src/routes/zen/util/handler.ts | 16 +-- .../zen/util/provider/openai-compatible.ts | 2 +- packages/console/core/package.json | 2 +- packages/console/function/package.json | 2 +- packages/console/mail/package.json | 2 +- packages/console/resource/package.json | 3 +- .../electron-builder.config.ts | 2 +- .../desktop-electron/electron.vite.config.ts | 14 +- packages/desktop-electron/package.json | 15 +- .../scripts/finalize-latest-yml.ts | 4 +- packages/desktop-electron/scripts/predev.ts | 2 +- packages/desktop-electron/scripts/utils.ts | 2 +- .../desktop-electron/src/main/constants.ts | 2 +- packages/desktop-electron/src/main/env.d.ts | 2 +- packages/desktop-electron/src/main/index.ts | 6 +- packages/desktop-electron/src/main/server.ts | 10 +- .../src/main/shell-env.test.ts | 4 +- .../desktop-electron/src/renderer/index.tsx | 6 +- packages/desktop/package.json | 2 +- .../desktop/scripts/finalize-latest-json.ts | 8 +- packages/desktop/scripts/prepare.ts | 2 +- packages/desktop/src-tauri/Cargo.toml | 4 +- packages/desktop/src-tauri/src/cli.rs | 32 ++--- packages/desktop/src-tauri/src/constants.rs | 2 +- packages/desktop/src-tauri/src/lib.rs | 8 +- .../desktop/src-tauri/src/linux_display.rs | 4 +- packages/desktop/src-tauri/src/main.rs | 2 +- packages/desktop/src-tauri/src/windows.rs | 6 +- packages/desktop/src-tauri/tauri.conf.json | 8 +- .../desktop/src-tauri/tauri.prod.conf.json | 6 +- packages/desktop/src/i18n/ar.ts | 10 +- packages/desktop/src/i18n/br.ts | 10 +- packages/desktop/src/i18n/bs.ts | 10 +- packages/desktop/src/i18n/da.ts | 10 +- packages/desktop/src/i18n/de.ts | 10 +- packages/desktop/src/i18n/en.ts | 10 +- packages/desktop/src/i18n/es.ts | 10 +- packages/desktop/src/i18n/fr.ts | 10 +- packages/desktop/src/i18n/ja.ts | 10 +- packages/desktop/src/i18n/ko.ts | 10 +- packages/desktop/src/i18n/no.ts | 10 +- packages/desktop/src/i18n/pl.ts | 10 +- packages/desktop/src/i18n/ru.ts | 10 +- packages/desktop/src/i18n/zh.ts | 10 +- packages/desktop/src/i18n/zht.ts | 10 +- packages/desktop/src/index.tsx | 12 +- packages/desktop/src/menu.ts | 6 +- packages/desktop/src/updater.ts | 2 +- packages/enterprise/package.json | 4 +- packages/enterprise/src/core/share.ts | 2 +- packages/enterprise/src/core/storage.ts | 18 +-- .../enterprise/src/routes/share/[shareID].tsx | 2 +- packages/enterprise/vite.config.ts | 4 +- packages/extensions/zed/extension.toml | 18 +-- packages/function/package.json | 2 +- packages/opencode/drizzle.config.ts | 2 +- packages/opencode/package.json | 36 +++-- packages/opencode/script/build-node.ts | 4 +- packages/opencode/script/build.ts | 10 +- packages/opencode/script/generate.ts | 2 +- packages/opencode/script/publish.ts | 18 +-- packages/opencode/script/trace-imports.ts | 2 +- packages/opencode/specs/effect/http-api.md | 14 +- .../opencode/specs/effect/server-package.md | 2 +- packages/opencode/specs/tui-plugins.md | 14 +- packages/opencode/src/acp/README.md | 2 +- packages/opencode/src/acp/agent.ts | 10 +- packages/opencode/src/acp/session.ts | 6 +- packages/opencode/src/acp/types.ts | 4 +- packages/opencode/src/auth/index.ts | 4 +- packages/opencode/src/cli/cmd/acp.ts | 6 +- packages/opencode/src/cli/cmd/generate.ts | 4 +- packages/opencode/src/cli/cmd/import.ts | 2 +- packages/opencode/src/cli/cmd/providers.ts | 2 +- packages/opencode/src/cli/cmd/run.ts | 20 +-- packages/opencode/src/cli/cmd/serve.ts | 4 +- packages/opencode/src/cli/cmd/session.ts | 4 +- packages/opencode/src/cli/cmd/tui/app.tsx | 12 +- packages/opencode/src/cli/cmd/tui/attach.ts | 4 +- .../cmd/tui/component/dialog-console-org.tsx | 2 +- .../cli/cmd/tui/component/dialog-provider.tsx | 2 +- .../cmd/tui/component/dialog-session-list.tsx | 4 +- .../tui/component/dialog-workspace-create.tsx | 4 +- .../cli/cmd/tui/component/prompt/history.tsx | 2 +- .../cli/cmd/tui/component/prompt/index.tsx | 2 +- .../src/cli/cmd/tui/config/tui-migrate.ts | 2 +- .../opencode/src/cli/cmd/tui/config/tui.ts | 18 +-- .../opencode/src/cli/cmd/tui/context/event.ts | 2 +- .../src/cli/cmd/tui/context/project.tsx | 2 +- .../src/cli/cmd/tui/context/route.tsx | 4 +- .../opencode/src/cli/cmd/tui/context/sdk.tsx | 10 +- .../opencode/src/cli/cmd/tui/context/sync.tsx | 4 +- .../src/cli/cmd/tui/context/theme.tsx | 2 +- .../cmd/tui/feature-plugins/home/footer.tsx | 2 +- .../cli/cmd/tui/feature-plugins/home/tips.tsx | 2 +- .../tui/feature-plugins/sidebar/context.tsx | 4 +- .../cmd/tui/feature-plugins/sidebar/files.tsx | 2 +- .../tui/feature-plugins/sidebar/footer.tsx | 2 +- .../cmd/tui/feature-plugins/sidebar/lsp.tsx | 2 +- .../cmd/tui/feature-plugins/sidebar/mcp.tsx | 2 +- .../cmd/tui/feature-plugins/sidebar/todo.tsx | 2 +- .../tui/feature-plugins/system/plugins.tsx | 2 +- .../opencode/src/cli/cmd/tui/plugin/api.tsx | 2 +- .../src/cli/cmd/tui/plugin/internal.ts | 2 +- .../src/cli/cmd/tui/plugin/runtime.ts | 6 +- .../opencode/src/cli/cmd/tui/plugin/slots.tsx | 2 +- .../session/dialog-fork-from-timeline.tsx | 2 +- .../tui/routes/session/dialog-timeline.tsx | 2 +- .../src/cli/cmd/tui/routes/session/index.tsx | 6 +- .../cli/cmd/tui/routes/session/permission.tsx | 2 +- .../cli/cmd/tui/routes/session/question.tsx | 2 +- .../tui/routes/session/subagent-footer.tsx | 2 +- packages/opencode/src/cli/cmd/tui/thread.ts | 14 +- .../opencode/src/cli/cmd/tui/ui/dialog.tsx | 4 +- .../opencode/src/cli/cmd/tui/util/model.ts | 2 +- .../src/cli/cmd/tui/util/transcript.ts | 2 +- .../src/cli/cmd/tui/validate-session.ts | 4 +- packages/opencode/src/cli/cmd/tui/worker.ts | 4 +- packages/opencode/src/cli/cmd/web.ts | 4 +- packages/opencode/src/cli/heap.ts | 2 +- packages/opencode/src/cli/upgrade.ts | 4 +- packages/opencode/src/config/config.ts | 38 ++--- packages/opencode/src/config/managed.ts | 2 +- packages/opencode/src/config/paths.ts | 4 +- .../dev/debug-workspace-plugin.ts | 2 +- .../opencode/src/control-plane/workspace.ts | 8 +- packages/opencode/src/effect/observability.ts | 2 +- packages/opencode/src/file/watcher.ts | 8 +- packages/opencode/src/flag/flag.ts | 132 +++++++++--------- packages/opencode/src/format/formatter.ts | 2 +- packages/opencode/src/global/index.ts | 4 +- packages/opencode/src/ide/index.ts | 2 +- packages/opencode/src/index.ts | 6 +- packages/opencode/src/installation/index.ts | 2 +- packages/opencode/src/installation/version.ts | 8 +- packages/opencode/src/lsp/lsp.ts | 4 +- packages/opencode/src/lsp/server.ts | 46 +++--- packages/opencode/src/plugin/cloudflare.ts | 2 +- packages/opencode/src/plugin/codex.ts | 2 +- .../src/plugin/github-copilot/copilot.ts | 4 +- .../src/plugin/github-copilot/models.ts | 2 +- packages/opencode/src/plugin/index.ts | 14 +- packages/opencode/src/plugin/meta.ts | 2 +- packages/opencode/src/project/project.ts | 4 +- packages/opencode/src/provider/auth.ts | 2 +- packages/opencode/src/provider/models.ts | 10 +- packages/opencode/src/provider/provider.ts | 2 +- packages/opencode/src/provider/transform.ts | 2 +- packages/opencode/src/pty/index.ts | 2 +- packages/opencode/src/server/fence.ts | 2 +- packages/opencode/src/server/middleware.ts | 4 +- packages/opencode/src/server/proxy.ts | 8 +- .../server/routes/instance/httpapi/server.ts | 10 +- .../src/server/routes/instance/index.ts | 2 +- .../src/server/routes/instance/middleware.ts | 2 +- packages/opencode/src/server/routes/ui.ts | 2 +- packages/opencode/src/server/server.ts | 4 +- packages/opencode/src/server/workspace.ts | 4 +- packages/opencode/src/session/instruction.ts | 18 +-- packages/opencode/src/session/llm.ts | 8 +- packages/opencode/src/session/prompt.ts | 2 +- packages/opencode/src/session/session.ts | 4 +- packages/opencode/src/share/session.ts | 2 +- packages/opencode/src/share/share-next.ts | 4 +- packages/opencode/src/shell/shell.ts | 2 +- packages/opencode/src/skill/index.ts | 6 +- packages/opencode/src/storage/db.ts | 20 +-- packages/opencode/src/sync/index.ts | 2 +- packages/opencode/src/tool/bash.ts | 2 +- packages/opencode/src/tool/registry.ts | 10 +- .../opencode/src/util/opencode-process.ts | 8 +- .../test/acp/event-subscription.test.ts | 2 +- packages/opencode/test/agent/agent.test.ts | 6 +- .../test/cli/plugin-auth-picker.test.ts | 2 +- .../opencode/test/cli/tui/plugin-add.test.ts | 8 +- .../test/cli/tui/plugin-install.test.ts | 4 +- .../cli/tui/plugin-loader-entrypoint.test.ts | 32 ++--- .../test/cli/tui/plugin-loader-pure.test.ts | 16 +-- .../test/cli/tui/plugin-loader.test.ts | 14 +- .../test/cli/tui/plugin-toggle.test.ts | 8 +- .../opencode/test/cli/tui/transcript.test.ts | 2 +- .../opencode/test/cli/tui/use-event.test.tsx | 2 +- packages/opencode/test/config/config.test.ts | 116 +++++++-------- packages/opencode/test/config/tui.test.ts | 16 +-- .../test/effect/cross-spawn-spawner.test.ts | 6 +- .../test/effect/observability.test.ts | 8 +- packages/opencode/test/file/watcher.test.ts | 4 +- .../test/fixture/plugin-meta-worker.ts | 2 +- packages/opencode/test/fixture/tui-plugin.ts | 4 +- packages/opencode/test/fixture/tui-runtime.ts | 4 +- packages/opencode/test/ide/ide.test.ts | 12 +- .../test/plugin/loader-shared.test.ts | 16 +-- packages/opencode/test/plugin/meta.test.ts | 14 +- packages/opencode/test/plugin/trigger.test.ts | 8 +- .../test/plugin/workspace-adaptor.test.ts | 14 +- packages/opencode/test/preload.ts | 14 +- .../test/server/project-init-git.test.ts | 8 +- .../test/server/session-messages.test.ts | 8 +- .../opencode/test/session/instruction.test.ts | 28 ++-- packages/opencode/test/session/system.test.ts | 6 +- packages/opencode/test/skill/skill.test.ts | 6 +- packages/opencode/test/storage/db.test.ts | 2 +- packages/opencode/test/sync/index.test.ts | 6 +- packages/opencode/test/tool/bash.test.ts | 2 +- packages/opencode/test/tool/registry.test.ts | 4 +- packages/opencode/test/tool/skill.test.ts | 6 +- packages/opencode/test/util/process.test.ts | 10 +- .../test/workspace/workspace-restore.test.ts | 6 +- packages/plugin/package.json | 15 +- packages/plugin/src/example-workspace.ts | 2 +- packages/plugin/src/index.ts | 8 +- packages/plugin/src/tui.ts | 6 +- packages/script/package.json | 4 +- packages/script/src/index.ts | 20 +-- packages/sdk/js/example/example.ts | 6 +- packages/sdk/js/package.json | 10 +- packages/sdk/js/script/build.ts | 2 +- packages/sdk/js/src/client.ts | 14 +- packages/sdk/js/src/gen/sdk.gen.ts | 2 +- packages/sdk/js/src/index.ts | 10 +- packages/sdk/js/src/process.ts | 2 +- packages/sdk/js/src/server.ts | 8 +- packages/sdk/js/src/v2/client.ts | 20 +-- packages/sdk/js/src/v2/gen/sdk.gen.ts | 8 +- packages/sdk/js/src/v2/index.ts | 10 +- packages/sdk/js/src/v2/server.ts | 8 +- packages/shared/package.json | 2 +- packages/shared/src/global.ts | 2 +- packages/slack/package.json | 4 +- packages/slack/src/index.ts | 4 +- packages/storybook/package.json | 5 +- packages/ui/package.json | 12 +- packages/ui/src/components/favicon.tsx | 2 +- packages/ui/src/components/file-media.tsx | 2 +- packages/ui/src/components/font.stories.tsx | 4 +- packages/ui/src/components/icon.stories.tsx | 2 +- packages/ui/src/components/logo.stories.tsx | 2 +- .../ui/src/components/message-file.test.ts | 2 +- packages/ui/src/components/message-file.ts | 2 +- packages/ui/src/components/message-nav.tsx | 2 +- packages/ui/src/components/message-part.tsx | 2 +- packages/ui/src/components/session-diff.ts | 2 +- packages/ui/src/components/session-retry.tsx | 2 +- packages/ui/src/components/session-review.tsx | 2 +- packages/ui/src/components/session-turn.tsx | 4 +- .../timeline-playground.stories.tsx | 2 +- .../components/todo-panel-motion.stories.tsx | 2 +- packages/ui/src/context/data.tsx | 2 +- packages/ui/src/context/marked.tsx | 12 +- packages/ui/src/pierre/media.ts | 2 +- packages/ui/vite.config.ts | 2 +- packages/web/package.json | 2 +- script/duplicate-pr.ts | 4 +- script/raw-changelog.ts | 2 +- script/stats.ts | 4 +- sdks/vscode/package.json | 8 +- sdks/vscode/src/extension.ts | 6 +- turbo.json | 4 +- 371 files changed, 1441 insertions(+), 1378 deletions(-) diff --git a/README.ar.md b/README.ar.md index beb44589e62..850c24b5122 100644 --- a/README.ar.md +++ b/README.ar.md @@ -86,14 +86,14 @@ scoop bucket add extras; scoop install extras/opencode-desktop يحترم سكربت التثبيت ترتيب الاولوية التالي لمسار التثبيت: -1. `$OPENCODE_INSTALL_DIR` - مجلد تثبيت مخصص +1. `$KILO_INSTALL_DIR` - مجلد تثبيت مخصص 2. `$XDG_BIN_DIR` - مسار متوافق مع مواصفات XDG Base Directory 3. `$HOME/bin` - مجلد الثنائيات القياسي للمستخدم (ان وجد او امكن انشاؤه) 4. `$HOME/.opencode/bin` - المسار الافتراضي الاحتياطي ```bash # امثلة -OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +KILO_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash ``` diff --git a/README.bn.md b/README.bn.md index c7abc7346a2..a59385ceb49 100644 --- a/README.bn.md +++ b/README.bn.md @@ -86,14 +86,14 @@ scoop bucket add extras; scoop install extras/opencode-desktop ইনস্টল স্ক্রিপ্টটি ইনস্টলেশন পাতের জন্য নিম্নলিখিত অগ্রাধিকার ক্রম মেনে চলে: -1. `$OPENCODE_INSTALL_DIR` - কাস্টম ইনস্টলেশন ডিরেক্টরি +1. `$KILO_INSTALL_DIR` - কাস্টম ইনস্টলেশন ডিরেক্টরি 2. `$XDG_BIN_DIR` - XDG বেস ডিরেক্টরি স্পেসিফিকেশন সমর্থিত পাথ 3. `$HOME/bin` - সাধারণ ব্যবহারকারী বাইনারি ডিরেক্টরি (যদি বিদ্যমান থাকে বা তৈরি করা যায়) 4. `$HOME/.opencode/bin` - ডিফল্ট ফলব্যাক ```bash # উদাহরণ -OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +KILO_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash ``` diff --git a/README.br.md b/README.br.md index 6d1de21562c..c2508f2b5d1 100644 --- a/README.br.md +++ b/README.br.md @@ -86,14 +86,14 @@ scoop bucket add extras; scoop install extras/opencode-desktop O script de instalação respeita a seguinte ordem de prioridade para o caminho de instalação: -1. `$OPENCODE_INSTALL_DIR` - Diretório de instalação personalizado +1. `$KILO_INSTALL_DIR` - Diretório de instalação personalizado 2. `$XDG_BIN_DIR` - Caminho compatível com a especificação XDG Base Directory 3. `$HOME/bin` - Diretório binário padrão do usuário (se existir ou puder ser criado) 4. `$HOME/.opencode/bin` - Fallback padrão ```bash # Exemplos -OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +KILO_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash ``` diff --git a/README.bs.md b/README.bs.md index 2cff8e0279c..a4923b82046 100644 --- a/README.bs.md +++ b/README.bs.md @@ -86,14 +86,14 @@ scoop bucket add extras; scoop install extras/opencode-desktop Instalacijska skripta koristi sljedeći redoslijed prioriteta za putanju instalacije: -1. `$OPENCODE_INSTALL_DIR` - Prilagođeni instalacijski direktorij +1. `$KILO_INSTALL_DIR` - Prilagođeni instalacijski direktorij 2. `$XDG_BIN_DIR` - Putanja usklađena sa XDG Base Directory specifikacijom 3. `$HOME/bin` - Standardni korisnički bin direktorij (ako postoji ili se može kreirati) 4. `$HOME/.opencode/bin` - Podrazumijevana rezervna lokacija ```bash # Primjeri -OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +KILO_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash ``` diff --git a/README.da.md b/README.da.md index ac522f29c49..47a9f41a05a 100644 --- a/README.da.md +++ b/README.da.md @@ -86,14 +86,14 @@ scoop bucket add extras; scoop install extras/opencode-desktop Installationsscriptet bruger følgende prioriteringsrækkefølge for installationsstien: -1. `$OPENCODE_INSTALL_DIR` - Tilpasset installationsmappe +1. `$KILO_INSTALL_DIR` - Tilpasset installationsmappe 2. `$XDG_BIN_DIR` - Sti der følger XDG Base Directory Specification 3. `$HOME/bin` - Standard bruger-bin-mappe (hvis den findes eller kan oprettes) 4. `$HOME/.opencode/bin` - Standard fallback ```bash # Eksempler -OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +KILO_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash ``` diff --git a/README.de.md b/README.de.md index 87a670f3fce..ee324385f5c 100644 --- a/README.de.md +++ b/README.de.md @@ -86,14 +86,14 @@ scoop bucket add extras; scoop install extras/opencode-desktop Das Installationsskript beachtet die folgende Prioritätsreihenfolge für den Installationspfad: -1. `$OPENCODE_INSTALL_DIR` - Benutzerdefiniertes Installationsverzeichnis +1. `$KILO_INSTALL_DIR` - Benutzerdefiniertes Installationsverzeichnis 2. `$XDG_BIN_DIR` - XDG Base Directory Specification-konformer Pfad 3. `$HOME/bin` - Standard-Binärverzeichnis des Users (falls vorhanden oder erstellbar) 4. `$HOME/.opencode/bin` - Standard-Fallback ```bash # Beispiele -OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +KILO_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash ``` diff --git a/README.es.md b/README.es.md index 9e456af1c0b..233cec3628a 100644 --- a/README.es.md +++ b/README.es.md @@ -86,14 +86,14 @@ scoop bucket add extras; scoop install extras/opencode-desktop El script de instalación respeta el siguiente orden de prioridad para la ruta de instalación: -1. `$OPENCODE_INSTALL_DIR` - Directorio de instalación personalizado +1. `$KILO_INSTALL_DIR` - Directorio de instalación personalizado 2. `$XDG_BIN_DIR` - Ruta compatible con la especificación XDG Base Directory 3. `$HOME/bin` - Directorio binario estándar del usuario (si existe o se puede crear) 4. `$HOME/.opencode/bin` - Alternativa por defecto ```bash # Ejemplos -OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +KILO_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash ``` diff --git a/README.fr.md b/README.fr.md index c1fca23376d..a147206047c 100644 --- a/README.fr.md +++ b/README.fr.md @@ -86,14 +86,14 @@ scoop bucket add extras; scoop install extras/opencode-desktop Le script d'installation respecte l'ordre de priorité suivant pour le chemin d'installation : -1. `$OPENCODE_INSTALL_DIR` - Répertoire d'installation personnalisé +1. `$KILO_INSTALL_DIR` - Répertoire d'installation personnalisé 2. `$XDG_BIN_DIR` - Chemin conforme à la spécification XDG Base Directory 3. `$HOME/bin` - Répertoire binaire utilisateur standard (s'il existe ou peut être créé) 4. `$HOME/.opencode/bin` - Repli par défaut ```bash # Exemples -OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +KILO_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash ``` diff --git a/README.gr.md b/README.gr.md index 2b2c2679d8e..2e047ac1253 100644 --- a/README.gr.md +++ b/README.gr.md @@ -86,14 +86,14 @@ scoop bucket add extras; scoop install extras/opencode-desktop Το script εγκατάστασης τηρεί την ακόλουθη σειρά προτεραιότητας για τη διαδρομή εγκατάστασης: -1. `$OPENCODE_INSTALL_DIR` - Προσαρμοσμένος κατάλογος εγκατάστασης +1. `$KILO_INSTALL_DIR` - Προσαρμοσμένος κατάλογος εγκατάστασης 2. `$XDG_BIN_DIR` - Διαδρομή συμβατή με τις προδιαγραφές XDG Base Directory 3. `$HOME/bin` - Τυπικός κατάλογος εκτελέσιμων αρχείων χρήστη (εάν υπάρχει ή μπορεί να δημιουργηθεί) 4. `$HOME/.opencode/bin` - Προεπιλεγμένη εφεδρική διαδρομή ```bash # Παραδείγματα -OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +KILO_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash ``` diff --git a/README.it.md b/README.it.md index 3e516a90270..d748c4346f4 100644 --- a/README.it.md +++ b/README.it.md @@ -86,14 +86,14 @@ scoop bucket add extras; scoop install extras/opencode-desktop Lo script di installazione rispetta il seguente ordine di priorità per il percorso di installazione: -1. `$OPENCODE_INSTALL_DIR` – Directory di installazione personalizzata +1. `$KILO_INSTALL_DIR` – Directory di installazione personalizzata 2. `$XDG_BIN_DIR` – Percorso conforme alla XDG Base Directory Specification 3. `$HOME/bin` – Directory binaria standard dell’utente (se esiste o può essere creata) 4. `$HOME/.opencode/bin` – Fallback predefinito ```bash # Esempi -OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +KILO_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash ``` diff --git a/README.ja.md b/README.ja.md index 144dc7b6f8a..a8325fc0ecc 100644 --- a/README.ja.md +++ b/README.ja.md @@ -86,14 +86,14 @@ scoop bucket add extras; scoop install extras/opencode-desktop インストールスクリプトは、インストール先パスを次の優先順位で決定します。 -1. `$OPENCODE_INSTALL_DIR` - カスタムのインストールディレクトリ +1. `$KILO_INSTALL_DIR` - カスタムのインストールディレクトリ 2. `$XDG_BIN_DIR` - XDG Base Directory Specification に準拠したパス 3. `$HOME/bin` - 標準のユーザー用バイナリディレクトリ(存在する場合、または作成できる場合) 4. `$HOME/.opencode/bin` - デフォルトのフォールバック ```bash # 例 -OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +KILO_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash ``` diff --git a/README.ko.md b/README.ko.md index 32defc0a5e0..edd3b96f12a 100644 --- a/README.ko.md +++ b/README.ko.md @@ -86,14 +86,14 @@ scoop bucket add extras; scoop install extras/opencode-desktop 설치 스크립트는 설치 경로를 다음 우선순위로 결정합니다. -1. `$OPENCODE_INSTALL_DIR` - 사용자 지정 설치 디렉터리 +1. `$KILO_INSTALL_DIR` - 사용자 지정 설치 디렉터리 2. `$XDG_BIN_DIR` - XDG Base Directory Specification 준수 경로 3. `$HOME/bin` - 표준 사용자 바이너리 디렉터리 (존재하거나 생성 가능할 경우) 4. `$HOME/.opencode/bin` - 기본 폴백 ```bash # 예시 -OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +KILO_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash ``` diff --git a/README.no.md b/README.no.md index c3348286b29..886ff57219d 100644 --- a/README.no.md +++ b/README.no.md @@ -86,14 +86,14 @@ scoop bucket add extras; scoop install extras/opencode-desktop Installasjonsskriptet bruker følgende prioritet for installasjonsstien: -1. `$OPENCODE_INSTALL_DIR` - Egendefinert installasjonsmappe +1. `$KILO_INSTALL_DIR` - Egendefinert installasjonsmappe 2. `$XDG_BIN_DIR` - Sti som følger XDG Base Directory Specification 3. `$HOME/bin` - Standard brukerbinar-mappe (hvis den finnes eller kan opprettes) 4. `$HOME/.opencode/bin` - Standard fallback ```bash # Eksempler -OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +KILO_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash ``` diff --git a/README.pl.md b/README.pl.md index 4c5a0766561..5a60e0b2870 100644 --- a/README.pl.md +++ b/README.pl.md @@ -86,14 +86,14 @@ scoop bucket add extras; scoop install extras/opencode-desktop Skrypt instalacyjny stosuje następujący priorytet wyboru ścieżki instalacji: -1. `$OPENCODE_INSTALL_DIR` - Własny katalog instalacji +1. `$KILO_INSTALL_DIR` - Własny katalog instalacji 2. `$XDG_BIN_DIR` - Ścieżka zgodna ze specyfikacją XDG Base Directory 3. `$HOME/bin` - Standardowy katalog binarny użytkownika (jeśli istnieje lub można go utworzyć) 4. `$HOME/.opencode/bin` - Domyślny fallback ```bash # Przykłady -OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +KILO_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash ``` diff --git a/README.ru.md b/README.ru.md index e507be70e65..b68a03907b2 100644 --- a/README.ru.md +++ b/README.ru.md @@ -86,14 +86,14 @@ scoop bucket add extras; scoop install extras/opencode-desktop Скрипт установки выбирает путь установки в следующем порядке приоритета: -1. `$OPENCODE_INSTALL_DIR` - Пользовательский каталог установки +1. `$KILO_INSTALL_DIR` - Пользовательский каталог установки 2. `$XDG_BIN_DIR` - Путь, совместимый со спецификацией XDG Base Directory 3. `$HOME/bin` - Стандартный каталог пользовательских бинарников (если существует или можно создать) 4. `$HOME/.opencode/bin` - Fallback по умолчанию ```bash # Примеры -OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +KILO_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash ``` diff --git a/README.th.md b/README.th.md index 4a4ea62c957..4b90a8b921c 100644 --- a/README.th.md +++ b/README.th.md @@ -86,14 +86,14 @@ scoop bucket add extras; scoop install extras/opencode-desktop สคริปต์การติดตั้งจะใช้ลำดับความสำคัญตามเส้นทางการติดตั้ง: -1. `$OPENCODE_INSTALL_DIR` - ไดเรกทอรีการติดตั้งที่กำหนดเอง +1. `$KILO_INSTALL_DIR` - ไดเรกทอรีการติดตั้งที่กำหนดเอง 2. `$XDG_BIN_DIR` - เส้นทางที่สอดคล้องกับ XDG Base Directory Specification 3. `$HOME/bin` - ไดเรกทอรีไบนารีผู้ใช้มาตรฐาน (หากมีอยู่หรือสามารถสร้างได้) 4. `$HOME/.opencode/bin` - ค่าสำรองเริ่มต้น ```bash # ตัวอย่าง -OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +KILO_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash ``` diff --git a/README.tr.md b/README.tr.md index e88b40f8751..d3b474a07bc 100644 --- a/README.tr.md +++ b/README.tr.md @@ -86,14 +86,14 @@ scoop bucket add extras; scoop install extras/opencode-desktop Kurulum betiği (install script), kurulum yolu (installation path) için aşağıdaki öncelik sırasını takip eder: -1. `$OPENCODE_INSTALL_DIR` - Özel kurulum dizini +1. `$KILO_INSTALL_DIR` - Özel kurulum dizini 2. `$XDG_BIN_DIR` - XDG Base Directory Specification uyumlu yol 3. `$HOME/bin` - Standart kullanıcı binary dizini (varsa veya oluşturulabiliyorsa) 4. `$HOME/.opencode/bin` - Varsayılan yedek konum ```bash # Örnekler -OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +KILO_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash ``` diff --git a/README.uk.md b/README.uk.md index a1a0259b6d0..1471aa6fdd8 100644 --- a/README.uk.md +++ b/README.uk.md @@ -86,14 +86,14 @@ scoop bucket add extras; scoop install extras/opencode-desktop Скрипт встановлення дотримується такого порядку пріоритету для шляху встановлення: -1. `$OPENCODE_INSTALL_DIR` - Користувацький каталог встановлення +1. `$KILO_INSTALL_DIR` - Користувацький каталог встановлення 2. `$XDG_BIN_DIR` - Шлях, сумісний зі специфікацією XDG Base Directory 3. `$HOME/bin` - Стандартний каталог користувацьких бінарників (якщо існує або його можна створити) 4. `$HOME/.opencode/bin` - Резервний варіант за замовчуванням ```bash # Приклади -OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +KILO_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash ``` diff --git a/README.vi.md b/README.vi.md index 0932c50f78a..a4eaf22301a 100644 --- a/README.vi.md +++ b/README.vi.md @@ -86,14 +86,14 @@ scoop bucket add extras; scoop install extras/opencode-desktop Tập lệnh cài đặt tuân theo thứ tự ưu tiên sau cho đường dẫn cài đặt: -1. `$OPENCODE_INSTALL_DIR` - Thư mục cài đặt tùy chỉnh +1. `$KILO_INSTALL_DIR` - Thư mục cài đặt tùy chỉnh 2. `$XDG_BIN_DIR` - Đường dẫn tuân thủ XDG Base Directory Specification 3. `$HOME/bin` - Thư mục nhị phân tiêu chuẩn của người dùng (nếu tồn tại hoặc có thể tạo) 4. `$HOME/.opencode/bin` - Mặc định dự phòng ```bash # Ví dụ -OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +KILO_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash ``` diff --git a/README.zh.md b/README.zh.md index 46d9f761cbd..928378213d2 100644 --- a/README.zh.md +++ b/README.zh.md @@ -86,14 +86,14 @@ scoop bucket add extras; scoop install extras/opencode-desktop 安装脚本按照以下优先级决定安装路径: -1. `$OPENCODE_INSTALL_DIR` - 自定义安装目录 +1. `$KILO_INSTALL_DIR` - 自定义安装目录 2. `$XDG_BIN_DIR` - 符合 XDG 基础目录规范的路径 3. `$HOME/bin` - 如果存在或可创建的用户二进制目录 4. `$HOME/.opencode/bin` - 默认备用路径 ```bash # 示例 -OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +KILO_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash ``` diff --git a/README.zht.md b/README.zht.md index 7ef51d8fdda..88c1c545651 100644 --- a/README.zht.md +++ b/README.zht.md @@ -86,14 +86,14 @@ scoop bucket add extras; scoop install extras/opencode-desktop 安裝腳本會依據以下優先順序決定安裝路徑: -1. `$OPENCODE_INSTALL_DIR` - 自定義安裝目錄 +1. `$KILO_INSTALL_DIR` - 自定義安裝目錄 2. `$XDG_BIN_DIR` - 符合 XDG 基礎目錄規範的路徑 3. `$HOME/bin` - 標準使用者執行檔目錄 (若存在或可建立) 4. `$HOME/.opencode/bin` - 預設備用路徑 ```bash # 範例 -OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash +KILO_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash ``` diff --git a/github/index.ts b/github/index.ts index 51ee2a46a53..38a61086a5f 100644 --- a/github/index.ts +++ b/github/index.ts @@ -6,7 +6,7 @@ import * as core from "@actions/core" import * as github from "@actions/github" import type { Context as GitHubContext } from "@actions/github/lib/context" import type { IssueCommentEvent, PullRequestReviewCommentEvent } from "@octokit/webhooks-types" -import { createOpencodeClient } from "@opencode-ai/sdk" +import { createKiloClient } from "@kilocode/sdk" import { spawn } from "node:child_process" import { setTimeout as sleep } from "node:timers/promises" @@ -113,7 +113,7 @@ type IssueQueryResponse = { } } -const { client, server } = createOpencode() +const { client, server } = createKilo() let accessToken: string let octoRest: Octokit let octoGraph: typeof graphql @@ -228,12 +228,12 @@ try { } process.exit(exitCode) -function createOpencode() { +function createKilo() { const host = "127.0.0.1" const port = 4096 const url = `http://${host}:${port}` const proc = spawn(`opencode`, [`serve`, `--hostname=${host}`, `--port=${port}`]) - const client = createOpencodeClient({ baseUrl: url }) + const client = createKiloClient({ baseUrl: url }) return { server: { url, close: () => proc.kill() }, diff --git a/github/package.json b/github/package.json index e1b913abedc..c7295ce4473 100644 --- a/github/package.json +++ b/github/package.json @@ -15,6 +15,7 @@ "@actions/github": "6.0.1", "@octokit/graphql": "9.0.1", "@octokit/rest": "catalog:", - "@opencode-ai/sdk": "workspace:*" - } + "@kilocode/sdk": "workspace:*" + }, + "version": "7.2.22" } diff --git a/infra/enterprise.ts b/infra/enterprise.ts index dc336a68431..c1c1ca68dea 100644 --- a/infra/enterprise.ts +++ b/infra/enterprise.ts @@ -8,10 +8,10 @@ new sst.cloudflare.x.SolidStart("Teams", { path: "packages/enterprise", buildCommand: "bun run build:cloudflare", environment: { - OPENCODE_STORAGE_ADAPTER: "r2", - OPENCODE_STORAGE_ACCOUNT_ID: sst.cloudflare.DEFAULT_ACCOUNT_ID, - OPENCODE_STORAGE_ACCESS_KEY_ID: SECRET.R2AccessKey.value, - OPENCODE_STORAGE_SECRET_ACCESS_KEY: SECRET.R2SecretKey.value, - OPENCODE_STORAGE_BUCKET: storage.name, + KILO_STORAGE_ADAPTER: "r2", + KILO_STORAGE_ACCOUNT_ID: sst.cloudflare.DEFAULT_ACCOUNT_ID, + KILO_STORAGE_ACCESS_KEY_ID: SECRET.R2AccessKey.value, + KILO_STORAGE_SECRET_ACCESS_KEY: SECRET.R2SecretKey.value, + KILO_STORAGE_BUCKET: storage.name, }, }) diff --git a/package.json b/package.json index f918bcd025f..260717f0dfe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "name": "opencode", + "name": "@kilocode/kilo", "description": "AI-powered development tool", "private": true, "type": "module", @@ -17,14 +17,13 @@ "prepare": "husky", "random": "echo 'Random script'", "hello": "echo 'Hello World!'", - "test": "echo 'do not run tests from root' && exit 1" + "test": "echo 'do not run tests from root' && exit 1", + "extension": "bun --cwd packages/kilo-vscode script/launch.ts" }, "workspaces": { "packages": [ "packages/*", - "packages/console/*", - "packages/sdk/js", - "packages/slack" + "packages/sdk/js" ], "catalog": { "@effect/opentelemetry": "4.0.0-beta.48", @@ -48,14 +47,14 @@ "@pierre/diffs": "1.1.0-beta.18", "@solid-primitives/storage": "4.3.3", "@tailwindcss/vite": "4.1.11", - "diff": "8.0.2", - "dompurify": "3.3.1", + "diff": "8.0.4", + "dompurify": "3.3.3", "drizzle-kit": "1.0.0-beta.19-d95b7a4", "drizzle-orm": "1.0.0-beta.19-d95b7a4", "effect": "4.0.0-beta.48", "ai": "6.0.168", "cross-spawn": "7.0.6", - "hono": "4.10.7", + "hono": "4.12.12", "hono-openapi": "1.1.2", "fuzzysort": "3.1.0", "luxon": "3.6.1", @@ -65,18 +64,18 @@ "@playwright/test": "1.59.1", "semver": "7.7.4", "typescript": "5.8.2", - "@typescript/native-preview": "7.0.0-dev.20251207.1", + "@typescript/native-preview": "7.0.0-dev.20260316.1", "zod": "4.1.8", "remeda": "2.26.0", "shiki": "3.20.0", "solid-list": "0.3.0", "tailwindcss": "4.1.11", "virtua": "0.42.3", - "vite": "7.1.4", + "vite": "7.3.2", "@solidjs/meta": "0.29.4", "@solidjs/router": "0.15.4", "@solidjs/start": "https://pkg.pr.new/@solidjs/start@dfb2020", - "solid-js": "1.9.10", + "solid-js": "1.9.12", "vite-plugin-solid": "2.11.10", "@lydell/node-pty": "1.2.0-beta.10" } @@ -93,19 +92,22 @@ "prettier": "3.6.2", "semver": "^7.6.0", "sst": "3.18.10", - "turbo": "2.8.13" + "turbo": "2.8.13", + "@changesets/changelog-github": "^0.5.1", + "@changesets/cli": "^2.27.10" }, "dependencies": { - "@aws-sdk/client-s3": "3.933.0", - "@opencode-ai/plugin": "workspace:*", + "@aws-sdk/client-s3": "3.1025.0", + "@kilocode/plugin": "workspace:*", "@opencode-ai/script": "workspace:*", - "@opencode-ai/sdk": "workspace:*", + "@kilocode/sdk": "workspace:*", "heap-snapshot-toolkit": "1.1.3", - "typescript": "catalog:" + "typescript": "catalog:", + "@morphllm/morphsdk": "0.2.166" }, "repository": { "type": "git", - "url": "https://github.com/anomalyco/opencode" + "url": "https://github.com/Kilo-Org/kilocode" }, "license": "MIT", "prettier": { @@ -124,11 +126,26 @@ ], "overrides": { "@types/bun": "catalog:", - "@types/node": "catalog:" + "@types/node": "catalog:", + "effect": "catalog:", + "@effect/platform-node-shared": "4.0.0-beta.46", + "path-to-regexp": ">=8.4.0", + "picomatch": ">=2.3.2", + "defu": "6.1.6", + "lodash": "4.18.1", + "@xmldom/xmldom": ">=0.8.12", + "smol-toml": ">=1.6.1", + "fastify": ">=5.8.3", + "diff": "8.0.4", + "dompurify": "3.3.3", + "happy-dom": ">=20.8.9" }, "patchedDependencies": { "@npmcli/agent@4.0.0": "patches/@npmcli%2Fagent@4.0.0.patch", "@standard-community/standard-openapi@0.2.9": "patches/@standard-community%2Fstandard-openapi@0.2.9.patch", - "solid-js@1.9.10": "patches/solid-js@1.9.10.patch" - } + "solid-js@1.9.10": "patches/solid-js@1.9.10.patch", + "stream-chat@9.38.0": "patches/stream-chat@9.38.0.patch" + }, + "version": "7.2.22", + "peerDependencies": {} } diff --git a/packages/app/package.json b/packages/app/package.json index 0ab5e304a2b..df757adb160 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/app", - "version": "1.14.22", + "version": "7.2.22", "description": "", "type": "module", "exports": { @@ -40,7 +40,7 @@ }, "dependencies": { "@kobalte/core": "catalog:", - "@opencode-ai/sdk": "workspace:*", + "@kilocode/sdk": "workspace:*", "@opencode-ai/ui": "workspace:*", "@opencode-ai/shared": "workspace:*", "@shikijs/transformers": "3.9.2", @@ -72,6 +72,9 @@ "solid-list": "catalog:", "tailwindcss": "catalog:", "virtua": "catalog:", - "zod": "catalog:" - } + "zod": "catalog:", + "@kilocode/kilo-ui": "workspace:*", + "@kilocode/kilo-i18n": "workspace:*" + }, + "peerDependencies": {} } diff --git a/packages/app/playwright.config.ts b/packages/app/playwright.config.ts index e9fb1cfe4ed..0a1e56bb4fa 100644 --- a/packages/app/playwright.config.ts +++ b/packages/app/playwright.config.ts @@ -31,8 +31,8 @@ export default defineConfig({ reuseExistingServer: reuse, timeout: 120_000, env: { - VITE_OPENCODE_SERVER_HOST: serverHost, - VITE_OPENCODE_SERVER_PORT: serverPort, + VITE_KILO_SERVER_HOST: serverHost, + VITE_KILO_SERVER_PORT: serverPort, }, }, use: { diff --git a/packages/app/src/components/dialog-connect-provider.tsx b/packages/app/src/components/dialog-connect-provider.tsx index e305743799a..1ed4786b988 100644 --- a/packages/app/src/components/dialog-connect-provider.tsx +++ b/packages/app/src/components/dialog-connect-provider.tsx @@ -1,4 +1,4 @@ -import type { ProviderAuthAuthorization, ProviderAuthMethod } from "@opencode-ai/sdk/v2/client" +import type { ProviderAuthAuthorization, ProviderAuthMethod } from "@kilocode/sdk/v2/client" import { Button } from "@opencode-ai/ui/button" import { useDialog } from "@opencode-ai/ui/context/dialog" import { Dialog } from "@opencode-ai/ui/dialog" diff --git a/packages/app/src/components/dialog-custom-provider.tsx b/packages/app/src/components/dialog-custom-provider.tsx index 53b66fb451d..6f38651e6d5 100644 --- a/packages/app/src/components/dialog-custom-provider.tsx +++ b/packages/app/src/components/dialog-custom-provider.tsx @@ -183,7 +183,7 @@ export function DialogCustomProvider(props: Props) {

{language.t("provider.custom.description.prefix")} - + {language.t("provider.custom.description.link")} {language.t("provider.custom.description.suffix")} diff --git a/packages/app/src/components/dialog-fork.tsx b/packages/app/src/components/dialog-fork.tsx index 710618c3016..4cdcca33ac1 100644 --- a/packages/app/src/components/dialog-fork.tsx +++ b/packages/app/src/components/dialog-fork.tsx @@ -8,7 +8,7 @@ import { Dialog } from "@opencode-ai/ui/dialog" import { List } from "@opencode-ai/ui/list" import { showToast } from "@opencode-ai/ui/toast" import { extractPromptFromParts } from "@/utils/prompt" -import type { TextPart as SDKTextPart } from "@opencode-ai/sdk/v2/client" +import type { TextPart as SDKTextPart } from "@kilocode/sdk/v2/client" import { base64Encode } from "@opencode-ai/shared/util/encode" import { useLanguage } from "@/context/language" diff --git a/packages/app/src/components/file-tree.tsx b/packages/app/src/components/file-tree.tsx index 211ce05ef06..f4148dfe4ed 100644 --- a/packages/app/src/components/file-tree.tsx +++ b/packages/app/src/components/file-tree.tsx @@ -17,7 +17,7 @@ import { type ParentProps, } from "solid-js" import { Dynamic } from "solid-js/web" -import type { FileNode } from "@opencode-ai/sdk/v2" +import type { FileNode } from "@kilocode/sdk/v2" const MAX_DEPTH = 128 diff --git a/packages/app/src/components/prompt-input/build-request-parts.ts b/packages/app/src/components/prompt-input/build-request-parts.ts index c268af35eef..9a62d0b71d1 100644 --- a/packages/app/src/components/prompt-input/build-request-parts.ts +++ b/packages/app/src/components/prompt-input/build-request-parts.ts @@ -1,5 +1,5 @@ import { getFilename } from "@opencode-ai/shared/util/path" -import { type AgentPartInput, type FilePartInput, type Part, type TextPartInput } from "@opencode-ai/sdk/v2/client" +import { type AgentPartInput, type FilePartInput, type Part, type TextPartInput } from "@kilocode/sdk/v2/client" import type { FileSelection } from "@/context/file" import { encodeFilePath } from "@/context/file/path" import type { AgentPart, FileAttachmentPart, ImageAttachmentPart, Prompt } from "@/context/prompt" diff --git a/packages/app/src/components/prompt-input/submit.test.ts b/packages/app/src/components/prompt-input/submit.test.ts index cf99497232d..e1b959e8dd7 100644 --- a/packages/app/src/components/prompt-input/submit.test.ts +++ b/packages/app/src/components/prompt-input/submit.test.ts @@ -63,8 +63,8 @@ beforeAll(async () => { useParams: () => params, })) - mock.module("@opencode-ai/sdk/v2/client", () => ({ - createOpencodeClient: (input: { directory: string }) => { + mock.module("@kilocode/sdk/v2/client", () => ({ + createKiloClient: (input: { directory: string }) => { createdClients.push(input.directory) return clientFor(input.directory) }, diff --git a/packages/app/src/components/prompt-input/submit.ts b/packages/app/src/components/prompt-input/submit.ts index 6805f619c19..fdd2889efa3 100644 --- a/packages/app/src/components/prompt-input/submit.ts +++ b/packages/app/src/components/prompt-input/submit.ts @@ -1,4 +1,4 @@ -import type { Message, Session } from "@opencode-ai/sdk/v2/client" +import type { Message, Session } from "@kilocode/sdk/v2/client" import { showToast } from "@opencode-ai/ui/toast" import { base64Encode } from "@opencode-ai/shared/util/encode" import { Binary } from "@opencode-ai/shared/util/binary" diff --git a/packages/app/src/components/session/session-context-breakdown.test.ts b/packages/app/src/components/session/session-context-breakdown.test.ts index f38aecb55da..36c43843453 100644 --- a/packages/app/src/components/session/session-context-breakdown.test.ts +++ b/packages/app/src/components/session/session-context-breakdown.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test" -import type { Message, Part } from "@opencode-ai/sdk/v2/client" +import type { Message, Part } from "@kilocode/sdk/v2/client" import { estimateSessionContextBreakdown } from "./session-context-breakdown" const user = (id: string) => { diff --git a/packages/app/src/components/session/session-context-breakdown.ts b/packages/app/src/components/session/session-context-breakdown.ts index e263b2957b3..1b11fadcceb 100644 --- a/packages/app/src/components/session/session-context-breakdown.ts +++ b/packages/app/src/components/session/session-context-breakdown.ts @@ -1,4 +1,4 @@ -import type { Message, Part } from "@opencode-ai/sdk/v2/client" +import type { Message, Part } from "@kilocode/sdk/v2/client" export type SessionContextBreakdownKey = "system" | "user" | "assistant" | "tool" | "other" diff --git a/packages/app/src/components/session/session-context-metrics.test.ts b/packages/app/src/components/session/session-context-metrics.test.ts index 0e109a71bda..be1bbca2585 100644 --- a/packages/app/src/components/session/session-context-metrics.test.ts +++ b/packages/app/src/components/session/session-context-metrics.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test" -import type { Message } from "@opencode-ai/sdk/v2/client" +import type { Message } from "@kilocode/sdk/v2/client" import { getSessionContextMetrics } from "./session-context-metrics" const assistant = ( diff --git a/packages/app/src/components/session/session-context-metrics.ts b/packages/app/src/components/session/session-context-metrics.ts index 0789b05f173..4bdcff52ebb 100644 --- a/packages/app/src/components/session/session-context-metrics.ts +++ b/packages/app/src/components/session/session-context-metrics.ts @@ -1,4 +1,4 @@ -import type { AssistantMessage, Message } from "@opencode-ai/sdk/v2/client" +import type { AssistantMessage, Message } from "@kilocode/sdk/v2/client" type Provider = { id: string diff --git a/packages/app/src/components/session/session-context-tab.tsx b/packages/app/src/components/session/session-context-tab.tsx index abf4c933462..2fa44f1c7e1 100644 --- a/packages/app/src/components/session/session-context-tab.tsx +++ b/packages/app/src/components/session/session-context-tab.tsx @@ -10,7 +10,7 @@ import { StickyAccordionHeader } from "@opencode-ai/ui/sticky-accordion-header" import { File } from "@opencode-ai/ui/file" import { Markdown } from "@opencode-ai/ui/markdown" import { ScrollView } from "@opencode-ai/ui/scroll-view" -import type { Message, Part, UserMessage } from "@opencode-ai/sdk/v2/client" +import type { Message, Part, UserMessage } from "@kilocode/sdk/v2/client" import { useLanguage } from "@/context/language" import { useProviders } from "@/hooks/use-providers" import { useSessionLayout } from "@/pages/session/session-layout" diff --git a/packages/app/src/components/session/session-header.tsx b/packages/app/src/components/session/session-header.tsx index 021e5be67e3..d61335d9f0d 100644 --- a/packages/app/src/components/session/session-header.tsx +++ b/packages/app/src/components/session/session-header.tsx @@ -153,7 +153,7 @@ export function SessionHeader() { }) const hotkey = createMemo(() => command.keybind("file.open")) const os = createMemo(() => detectOS(platform)) - const isDesktopBeta = platform.platform === "desktop" && import.meta.env.VITE_OPENCODE_CHANNEL === "beta" + const isDesktopBeta = platform.platform === "desktop" && import.meta.env.VITE_KILO_CHANNEL === "beta" const search = createMemo(() => !isDesktopBeta || settings.general.showSearch()) const tree = createMemo(() => !isDesktopBeta || settings.general.showFileTree()) const term = createMemo(() => !isDesktopBeta || settings.general.showTerminal()) diff --git a/packages/app/src/components/settings-general.tsx b/packages/app/src/components/settings-general.tsx index 13651aac062..62435251a1f 100644 --- a/packages/app/src/components/settings-general.tsx +++ b/packages/app/src/components/settings-general.tsx @@ -397,7 +397,7 @@ export const SettingsGeneral: Component = () => { description={ <> {language.t("settings.general.row.theme.description")}{" "} - {language.t("common.learnMore")} + {language.t("common.learnMore")} } > @@ -719,7 +719,7 @@ export const SettingsGeneral: Component = () => { }} - +

diff --git a/packages/app/src/components/titlebar.tsx b/packages/app/src/components/titlebar.tsx index 409fcbeff60..eb9bd3ebf1b 100644 --- a/packages/app/src/components/titlebar.tsx +++ b/packages/app/src/components/titlebar.tsx @@ -80,7 +80,7 @@ export function Titlebar() { const canBack = createMemo(() => history.index > 0) const canForward = createMemo(() => history.index < history.stack.length - 1) const hasProjects = createMemo(() => layout.projects.list().length > 0) - const nav = createMemo(() => import.meta.env.VITE_OPENCODE_CHANNEL !== "beta" || settings.general.showNavigation()) + const nav = createMemo(() => import.meta.env.VITE_KILO_CHANNEL !== "beta" || settings.general.showNavigation()) const back = () => { const next = backPath(history) @@ -288,9 +288,9 @@ export function Titlebar() {
- {["beta", "dev"].includes(import.meta.env.VITE_OPENCODE_CHANNEL) && ( + {["beta", "dev"].includes(import.meta.env.VITE_KILO_CHANNEL) && (
- {import.meta.env.VITE_OPENCODE_CHANNEL.toUpperCase()} + {import.meta.env.VITE_KILO_CHANNEL.toUpperCase()}
)}
diff --git a/packages/app/src/context/file/content-cache.ts b/packages/app/src/context/file/content-cache.ts index 4b724068834..98de196ab6f 100644 --- a/packages/app/src/context/file/content-cache.ts +++ b/packages/app/src/context/file/content-cache.ts @@ -1,4 +1,4 @@ -import type { FileContent } from "@opencode-ai/sdk/v2" +import type { FileContent } from "@kilocode/sdk/v2" const MAX_FILE_CONTENT_ENTRIES = 40 const MAX_FILE_CONTENT_BYTES = 20 * 1024 * 1024 diff --git a/packages/app/src/context/file/tree-store.ts b/packages/app/src/context/file/tree-store.ts index a86051d286e..dc4e58f7a25 100644 --- a/packages/app/src/context/file/tree-store.ts +++ b/packages/app/src/context/file/tree-store.ts @@ -1,5 +1,5 @@ import { createStore, produce, reconcile } from "solid-js/store" -import type { FileNode } from "@opencode-ai/sdk/v2" +import type { FileNode } from "@kilocode/sdk/v2" type DirectoryState = { expanded: boolean diff --git a/packages/app/src/context/file/types.ts b/packages/app/src/context/file/types.ts index 7ce8a37c25e..ee1cc49f311 100644 --- a/packages/app/src/context/file/types.ts +++ b/packages/app/src/context/file/types.ts @@ -1,4 +1,4 @@ -import type { FileContent } from "@opencode-ai/sdk/v2" +import type { FileContent } from "@kilocode/sdk/v2" export type FileSelection = { startLine: number diff --git a/packages/app/src/context/file/watcher.ts b/packages/app/src/context/file/watcher.ts index fbf71992791..57bc68edc9b 100644 --- a/packages/app/src/context/file/watcher.ts +++ b/packages/app/src/context/file/watcher.ts @@ -1,4 +1,4 @@ -import type { FileNode } from "@opencode-ai/sdk/v2" +import type { FileNode } from "@kilocode/sdk/v2" type WatcherEvent = { type: string diff --git a/packages/app/src/context/global-sdk.tsx b/packages/app/src/context/global-sdk.tsx index e53d60d5a0e..5c81174426f 100644 --- a/packages/app/src/context/global-sdk.tsx +++ b/packages/app/src/context/global-sdk.tsx @@ -1,4 +1,4 @@ -import type { Event } from "@opencode-ai/sdk/v2/client" +import type { Event } from "@kilocode/sdk/v2/client" import { createSimpleContext } from "@opencode-ai/ui/context" import { createGlobalEmitter } from "@solid-primitives/event-bus" import { makeEventListener } from "@solid-primitives/event-listener" diff --git a/packages/app/src/context/global-sync.tsx b/packages/app/src/context/global-sync.tsx index b742667d72c..edebef2b909 100644 --- a/packages/app/src/context/global-sync.tsx +++ b/packages/app/src/context/global-sync.tsx @@ -1,12 +1,12 @@ import type { Config, - OpencodeClient, + KiloClient, Path, Project, ProviderAuthResponse, ProviderListResponse, Todo, -} from "@opencode-ai/sdk/v2/client" +} from "@kilocode/sdk/v2/client" import { showToast } from "@opencode-ai/ui/toast" import { getFilename } from "@opencode-ai/shared/util/path" import { batch, createContext, getOwner, onCleanup, onMount, type ParentProps, untrack, useContext } from "solid-js" @@ -49,7 +49,7 @@ function createGlobalSync() { const owner = getOwner() if (!owner) throw new Error("GlobalSync must be created within owner") - const sdkCache = new Map() + const sdkCache = new Map() const booting = new Map>() const sessionLoads = new Map>() const sessionMeta = new Map() diff --git a/packages/app/src/context/global-sync/bootstrap.ts b/packages/app/src/context/global-sync/bootstrap.ts index be789a5e53a..0b4d843026a 100644 --- a/packages/app/src/context/global-sync/bootstrap.ts +++ b/packages/app/src/context/global-sync/bootstrap.ts @@ -1,6 +1,6 @@ import type { Config, - OpencodeClient, + KiloClient, Path, PermissionRequest, Project, @@ -9,7 +9,7 @@ import type { QuestionRequest, Session, Todo, -} from "@opencode-ai/sdk/v2/client" +} from "@kilocode/sdk/v2/client" import { showToast } from "@opencode-ai/ui/toast" import { getFilename } from "@opencode-ai/shared/util/path" import { retry } from "@opencode-ai/shared/util/retry" @@ -67,7 +67,7 @@ function runAll(list: Array<() => Promise>) { } export async function bootstrapGlobal(input: { - globalSDK: OpencodeClient + globalSDK: KiloClient requestFailedTitle: string translate: (key: string, vars?: Record) => string formatMoreCount: (count: number) => string @@ -163,7 +163,7 @@ function warmSessions(input: { ids: string[] store: Store setStore: SetStoreFunction - sdk: OpencodeClient + sdk: KiloClient }) { const known = new Set(input.store.session.map((item) => item.id)) const ids = [...new Set(input.ids)].filter((id) => !!id && !known.has(id)) @@ -184,8 +184,8 @@ export const loadProvidersQuery = (directory: string | null) => export const loadAgentsQuery = ( directory: string | null, - sdk?: OpencodeClient, - transform?: (x: Awaited>) => void, + sdk?: KiloClient, + transform?: (x: Awaited>) => void, ) => queryOptions({ queryKey: [directory, "agents"], @@ -203,8 +203,8 @@ export const loadAgentsQuery = ( export const loadPathQuery = ( directory: string | null, - sdk?: OpencodeClient, - transform?: (x: Awaited>) => void, + sdk?: KiloClient, + transform?: (x: Awaited>) => void, ) => queryOptions({ queryKey: [directory, "path"], @@ -222,7 +222,7 @@ export const loadPathQuery = ( export async function bootstrapDirectory(input: { directory: string - sdk: OpencodeClient + sdk: KiloClient store: Store setStore: SetStoreFunction vcsCache: VcsCache diff --git a/packages/app/src/context/global-sync/child-store.ts b/packages/app/src/context/global-sync/child-store.ts index f3b613a7f24..1545fb42089 100644 --- a/packages/app/src/context/global-sync/child-store.ts +++ b/packages/app/src/context/global-sync/child-store.ts @@ -1,7 +1,7 @@ import { createRoot, getOwner, onCleanup, runWithOwner, type Owner } from "solid-js" import { createStore, type SetStoreFunction, type Store } from "solid-js/store" import { Persist, persisted } from "@/utils/persist" -import type { VcsInfo } from "@opencode-ai/sdk/v2/client" +import type { VcsInfo } from "@kilocode/sdk/v2/client" import { DIR_IDLE_TTL_MS, MAX_DIR_STORES, diff --git a/packages/app/src/context/global-sync/event-reducer.test.ts b/packages/app/src/context/global-sync/event-reducer.test.ts index 892129788e6..f66e7ede312 100644 --- a/packages/app/src/context/global-sync/event-reducer.test.ts +++ b/packages/app/src/context/global-sync/event-reducer.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test" -import type { Message, Part, PermissionRequest, Project, QuestionRequest, Session } from "@opencode-ai/sdk/v2/client" +import type { Message, Part, PermissionRequest, Project, QuestionRequest, Session } from "@kilocode/sdk/v2/client" import { createStore } from "solid-js/store" import type { State } from "./types" import { applyDirectoryEvent, applyGlobalEvent, cleanupDroppedSessionCaches } from "./event-reducer" diff --git a/packages/app/src/context/global-sync/event-reducer.ts b/packages/app/src/context/global-sync/event-reducer.ts index 82408fdfe9e..9196d5b4f76 100644 --- a/packages/app/src/context/global-sync/event-reducer.ts +++ b/packages/app/src/context/global-sync/event-reducer.ts @@ -10,7 +10,7 @@ import type { SessionStatus, SnapshotFileDiff, Todo, -} from "@opencode-ai/sdk/v2/client" +} from "@kilocode/sdk/v2/client" import type { State, VcsCache } from "./types" import { trimSessions } from "./session-trim" import { dropSessionCaches } from "./session-cache" diff --git a/packages/app/src/context/global-sync/session-cache.test.ts b/packages/app/src/context/global-sync/session-cache.test.ts index 472ac219e9c..471c632d802 100644 --- a/packages/app/src/context/global-sync/session-cache.test.ts +++ b/packages/app/src/context/global-sync/session-cache.test.ts @@ -7,7 +7,7 @@ import type { SessionStatus, SnapshotFileDiff, Todo, -} from "@opencode-ai/sdk/v2/client" +} from "@kilocode/sdk/v2/client" import { dropSessionCaches, pickSessionCacheEvictions } from "./session-cache" const msg = (id: string, sessionID: string) => diff --git a/packages/app/src/context/global-sync/session-cache.ts b/packages/app/src/context/global-sync/session-cache.ts index 6f4d81062b1..b578997307c 100644 --- a/packages/app/src/context/global-sync/session-cache.ts +++ b/packages/app/src/context/global-sync/session-cache.ts @@ -6,7 +6,7 @@ import type { SessionStatus, SnapshotFileDiff, Todo, -} from "@opencode-ai/sdk/v2/client" +} from "@kilocode/sdk/v2/client" export const SESSION_CACHE_LIMIT = 40 diff --git a/packages/app/src/context/global-sync/session-trim.test.ts b/packages/app/src/context/global-sync/session-trim.test.ts index be12c074b5d..da9ef3498f5 100644 --- a/packages/app/src/context/global-sync/session-trim.test.ts +++ b/packages/app/src/context/global-sync/session-trim.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test" -import type { PermissionRequest, Session } from "@opencode-ai/sdk/v2/client" +import type { PermissionRequest, Session } from "@kilocode/sdk/v2/client" import { trimSessions } from "./session-trim" const session = (input: { id: string; parentID?: string; created: number; updated?: number; archived?: number }) => diff --git a/packages/app/src/context/global-sync/session-trim.ts b/packages/app/src/context/global-sync/session-trim.ts index 800ba74a684..8aa31400217 100644 --- a/packages/app/src/context/global-sync/session-trim.ts +++ b/packages/app/src/context/global-sync/session-trim.ts @@ -1,4 +1,4 @@ -import type { PermissionRequest, Session } from "@opencode-ai/sdk/v2/client" +import type { PermissionRequest, Session } from "@kilocode/sdk/v2/client" import { cmp } from "./utils" import { SESSION_RECENT_LIMIT, SESSION_RECENT_WINDOW } from "./types" diff --git a/packages/app/src/context/global-sync/types.ts b/packages/app/src/context/global-sync/types.ts index e3ec83c5eeb..a1a51842684 100644 --- a/packages/app/src/context/global-sync/types.ts +++ b/packages/app/src/context/global-sync/types.ts @@ -15,7 +15,7 @@ import type { SnapshotFileDiff, Todo, VcsInfo, -} from "@opencode-ai/sdk/v2/client" +} from "@kilocode/sdk/v2/client" import type { Accessor } from "solid-js" import type { SetStoreFunction, Store } from "solid-js/store" diff --git a/packages/app/src/context/global-sync/utils.test.ts b/packages/app/src/context/global-sync/utils.test.ts index 6d44ac9a892..24f1547c27f 100644 --- a/packages/app/src/context/global-sync/utils.test.ts +++ b/packages/app/src/context/global-sync/utils.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test" -import type { Agent } from "@opencode-ai/sdk/v2/client" +import type { Agent } from "@kilocode/sdk/v2/client" import { normalizeAgentList } from "./utils" const agent = (name = "build") => diff --git a/packages/app/src/context/global-sync/utils.ts b/packages/app/src/context/global-sync/utils.ts index cac58f3174e..e6fd6f64ba2 100644 --- a/packages/app/src/context/global-sync/utils.ts +++ b/packages/app/src/context/global-sync/utils.ts @@ -1,4 +1,4 @@ -import type { Agent, Project, ProviderListResponse } from "@opencode-ai/sdk/v2/client" +import type { Agent, Project, ProviderListResponse } from "@kilocode/sdk/v2/client" export const cmp = (a: string, b: string) => (a < b ? -1 : a > b ? 1 : 0) diff --git a/packages/app/src/context/highlights.tsx b/packages/app/src/context/highlights.tsx index 058f7cc4b6c..11ee613e643 100644 --- a/packages/app/src/context/highlights.tsx +++ b/packages/app/src/context/highlights.tsx @@ -7,7 +7,7 @@ import { useSettings } from "@/context/settings" import { persisted } from "@/utils/persist" import { DialogReleaseNotes, type Highlight } from "@/components/dialog-release-notes" -const CHANGELOG_URL = "https://opencode.ai/changelog.json" +const CHANGELOG_URL = "https://kilo.ai/changelog.json" type Store = { version?: string diff --git a/packages/app/src/context/layout.tsx b/packages/app/src/context/layout.tsx index 97d9cacbbe1..603c3c5961c 100644 --- a/packages/app/src/context/layout.tsx +++ b/packages/app/src/context/layout.tsx @@ -6,7 +6,7 @@ import { useGlobalSync } from "./global-sync" import { useGlobalSDK } from "./global-sdk" import { useServer } from "./server" import { usePlatform } from "./platform" -import { Project } from "@opencode-ai/sdk/v2" +import { Project } from "@kilocode/sdk/v2" import { Persist, persisted, removePersisted } from "@/utils/persist" import { decode64 } from "@/utils/base64" import { same } from "@/utils/same" diff --git a/packages/app/src/context/notification.tsx b/packages/app/src/context/notification.tsx index 251b67b06ce..9c30ed269d6 100644 --- a/packages/app/src/context/notification.tsx +++ b/packages/app/src/context/notification.tsx @@ -10,7 +10,7 @@ import { useSettings } from "@/context/settings" import { Binary } from "@opencode-ai/shared/util/binary" import { base64Encode } from "@opencode-ai/shared/util/encode" import { decode64 } from "@/utils/base64" -import { EventSessionError } from "@opencode-ai/sdk/v2" +import { EventSessionError } from "@kilocode/sdk/v2" import { Persist, persisted } from "@/utils/persist" import { playSoundById } from "@/utils/sound" diff --git a/packages/app/src/context/permission-auto-respond.test.ts b/packages/app/src/context/permission-auto-respond.test.ts index 2f8ca6265e6..cb927bbd317 100644 --- a/packages/app/src/context/permission-auto-respond.test.ts +++ b/packages/app/src/context/permission-auto-respond.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test" -import type { PermissionRequest, Session } from "@opencode-ai/sdk/v2/client" +import type { PermissionRequest, Session } from "@kilocode/sdk/v2/client" import { base64Encode } from "@opencode-ai/shared/util/encode" import { autoRespondsPermission, isDirectoryAutoAccepting } from "./permission-auto-respond" diff --git a/packages/app/src/context/permission.tsx b/packages/app/src/context/permission.tsx index 672f84f82a6..6f890da7c96 100644 --- a/packages/app/src/context/permission.tsx +++ b/packages/app/src/context/permission.tsx @@ -1,7 +1,7 @@ import { createEffect, createMemo, onCleanup } from "solid-js" import { createStore, produce } from "solid-js/store" import { createSimpleContext } from "@opencode-ai/ui/context" -import type { PermissionRequest } from "@opencode-ai/sdk/v2/client" +import type { PermissionRequest } from "@kilocode/sdk/v2/client" import { Persist, persisted } from "@/utils/persist" import { useGlobalSDK } from "@/context/global-sdk" import { useGlobalSync } from "./global-sync" diff --git a/packages/app/src/context/sdk.tsx b/packages/app/src/context/sdk.tsx index bc97ea13acc..2eaf4627c04 100644 --- a/packages/app/src/context/sdk.tsx +++ b/packages/app/src/context/sdk.tsx @@ -1,4 +1,4 @@ -import type { Event } from "@opencode-ai/sdk/v2/client" +import type { Event } from "@kilocode/sdk/v2/client" import { createSimpleContext } from "@opencode-ai/ui/context" import { createGlobalEmitter } from "@solid-primitives/event-bus" import { type Accessor, createEffect, createMemo, onCleanup } from "solid-js" diff --git a/packages/app/src/context/sync-optimistic.test.ts b/packages/app/src/context/sync-optimistic.test.ts index 94324f8a060..3c1b8f4644d 100644 --- a/packages/app/src/context/sync-optimistic.test.ts +++ b/packages/app/src/context/sync-optimistic.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test" -import type { Message, Part } from "@opencode-ai/sdk/v2/client" +import type { Message, Part } from "@kilocode/sdk/v2/client" import { applyOptimisticAdd, applyOptimisticRemove, mergeOptimisticPage } from "./sync" type Text = Extract diff --git a/packages/app/src/context/sync.tsx b/packages/app/src/context/sync.tsx index 29b7fe68c51..3fb37e4b26a 100644 --- a/packages/app/src/context/sync.tsx +++ b/packages/app/src/context/sync.tsx @@ -11,7 +11,7 @@ import { } from "./global-sync/session-prefetch" import { useGlobalSync } from "./global-sync" import { useSDK } from "./sdk" -import type { Message, Part } from "@opencode-ai/sdk/v2/client" +import type { Message, Part } from "@kilocode/sdk/v2/client" import { SESSION_CACHE_LIMIT, dropSessionCaches, pickSessionCacheEvictions } from "./global-sync/session-cache" import { diffs as list, message as clean } from "@/utils/diffs" diff --git a/packages/app/src/entry.tsx b/packages/app/src/entry.tsx index b5cbed6e75d..84b2b799dad 100644 --- a/packages/app/src/entry.tsx +++ b/packages/app/src/entry.tsx @@ -100,7 +100,7 @@ if (!(root instanceof HTMLElement) && import.meta.env.DEV) { const getCurrentUrl = () => { if (location.hostname.includes("opencode.ai")) return "http://localhost:4096" if (import.meta.env.DEV) - return `http://${import.meta.env.VITE_OPENCODE_SERVER_HOST ?? "localhost"}:${import.meta.env.VITE_OPENCODE_SERVER_PORT ?? "4096"}` + return `http://${import.meta.env.VITE_KILO_SERVER_HOST ?? "localhost"}:${import.meta.env.VITE_KILO_SERVER_PORT ?? "4096"}` return location.origin } diff --git a/packages/app/src/env.d.ts b/packages/app/src/env.d.ts index 9b03d336f9d..1197383a3cd 100644 --- a/packages/app/src/env.d.ts +++ b/packages/app/src/env.d.ts @@ -1,7 +1,7 @@ interface ImportMetaEnv { - readonly VITE_OPENCODE_SERVER_HOST: string - readonly VITE_OPENCODE_SERVER_PORT: string - readonly VITE_OPENCODE_CHANNEL?: "dev" | "beta" | "prod" + readonly VITE_KILO_SERVER_HOST: string + readonly VITE_KILO_SERVER_PORT: string + readonly VITE_KILO_CHANNEL?: "dev" | "beta" | "prod" } interface ImportMeta { diff --git a/packages/app/src/i18n/ar.ts b/packages/app/src/i18n/ar.ts index efb2919a5bf..5c76205f330 100644 --- a/packages/app/src/i18n/ar.ts +++ b/packages/app/src/i18n/ar.ts @@ -105,7 +105,7 @@ export const dict = { "dialog.model.manage": "إدارة النماذج", "dialog.model.manage.description": "تخصيص النماذج التي تظهر في محدد النماذج.", "dialog.model.manage.provider.toggle": "تبديل جميع نماذج {{provider}}", - "dialog.model.unpaid.freeModels.title": "نماذج مجانية مقدمة من OpenCode", + "dialog.model.unpaid.freeModels.title": "نماذج مجانية مقدمة من Kilo", "dialog.model.unpaid.addMore.title": "إضافة المزيد من النماذج من موفرين مشهورين", "dialog.provider.viewAll": "عرض المزيد من الموفرين", "provider.connect.title": "اتصال {{provider}}", @@ -116,7 +116,7 @@ export const dict = { "provider.connect.status.waiting": "في انتظار التفويض...", "provider.connect.status.failed": "فشل التفويض: {{error}}", "provider.connect.apiKey.description": - "أدخل مفتاح واجهة برمجة تطبيقات {{provider}} الخاص بك لتوصيل حسابك واستخدام نماذج {{provider}} في OpenCode.", + "أدخل مفتاح واجهة برمجة تطبيقات {{provider}} الخاص بك لتوصيل حسابك واستخدام نماذج {{provider}} في Kilo.", "provider.connect.apiKey.label": "مفتاح واجهة برمجة تطبيقات {{provider}}", "provider.connect.apiKey.placeholder": "مفتاح API", "provider.connect.apiKey.required": "مفتاح API مطلوب", @@ -130,7 +130,7 @@ export const dict = { "provider.connect.oauth.code.visit.prefix": "قم بزيارة ", "provider.connect.oauth.code.visit.link": "هذا الرابط", "provider.connect.oauth.code.visit.suffix": - " للحصول على رمز التفويض الخاص بك لتوصيل حسابك واستخدام نماذج {{provider}} في OpenCode.", + " للحصول على رمز التفويض الخاص بك لتوصيل حسابك واستخدام نماذج {{provider}} في Kilo.", "provider.connect.oauth.code.label": "رمز تفويض {{method}}", "provider.connect.oauth.code.placeholder": "رمز التفويض", "provider.connect.oauth.code.required": "رمز التفويض مطلوب", @@ -138,7 +138,7 @@ export const dict = { "provider.connect.oauth.auto.visit.prefix": "قم بزيارة ", "provider.connect.oauth.auto.visit.link": "هذا الرابط", "provider.connect.oauth.auto.visit.suffix": - " وأدخل الرمز أدناه لتوصيل حسابك واستخدام نماذج {{provider}} في OpenCode.", + " وأدخل الرمز أدناه لتوصيل حسابك واستخدام نماذج {{provider}} في Kilo.", "provider.connect.oauth.auto.confirmationCode": "رمز التأكيد", "provider.connect.toast.connected.title": "تم توصيل {{provider}}", "provider.connect.toast.connected.description": "نماذج {{provider}} متاحة الآن للاستخدام.", @@ -281,7 +281,7 @@ export const dict = { "dialog.directory.search.placeholder": "البحث في المجلدات", "dialog.directory.empty": "لم يتم العثور على مجلدات", "dialog.server.title": "الخوادم", - "dialog.server.description": "تبديل خادم OpenCode الذي يتصل به هذا التطبيق.", + "dialog.server.description": "تبديل خادم Kilo الذي يتصل به هذا التطبيق.", "dialog.server.search.placeholder": "البحث في الخوادم", "dialog.server.empty": "لا توجد خوادم بعد", "dialog.server.add.title": "إضافة خادم", @@ -395,7 +395,7 @@ export const dict = { "toast.session.unshare.failed.description": "حدث خطأ أثناء إلغاء مشاركة الجلسة", "toast.session.listFailed.title": "فشل تحميل الجلسات لـ {{project}}", "toast.update.title": "تحديث متاح", - "toast.update.description": "نسخة جديدة من OpenCode ({{version}}) متاحة الآن للتثبيت.", + "toast.update.description": "نسخة جديدة من Kilo ({{version}}) متاحة الآن للتثبيت.", "toast.update.action.installRestart": "تثبيت وإعادة تشغيل", "toast.update.action.notYet": "ليس الآن", "error.page.title": "حدث خطأ ما", @@ -405,7 +405,7 @@ export const dict = { "error.page.action.checking": "جارٍ التحقق...", "error.page.action.checkUpdates": "التحقق من وجود تحديثات", "error.page.action.updateTo": "تحديث إلى {{version}}", - "error.page.report.prefix": "يرجى الإبلاغ عن هذا الخطأ لفريق OpenCode", + "error.page.report.prefix": "يرجى الإبلاغ عن هذا الخطأ لفريق Kilo", "error.page.report.discord": "على Discord", "error.page.version": "الإصدار: {{version}}", "error.dev.rootNotFound": @@ -421,7 +421,7 @@ export const dict = { "error.chain.didYouMean": "هل كنت تعني: {{suggestions}}", "error.chain.modelNotFound": "النموذج غير موجود: {{provider}}/{{model}}", "error.chain.checkConfig": "تحقق من أسماء الموفر/النموذج في التكوين (opencode.json)", - "error.chain.mcpFailed": 'فشل خادم MCP "{{name}}". لاحظ أن OpenCode لا يدعم مصادقة MCP بعد.', + "error.chain.mcpFailed": 'فشل خادم MCP "{{name}}". لاحظ أن Kilo لا يدعم مصادقة MCP بعد.', "error.chain.providerAuthFailed": "فشلت مصادقة الموفر ({{provider}}): {{message}}", "error.chain.providerInitFailed": 'فشل تهيئة الموفر "{{provider}}". تحقق من بيانات الاعتماد والتكوين.', "error.chain.configJsonInvalid": "ملف التكوين في {{path}} ليس JSON(C) صالحًا", @@ -537,19 +537,19 @@ export const dict = { "sidebar.workspaces.enable": "تمكين مساحات العمل", "sidebar.workspaces.disable": "تعطيل مساحات العمل", "sidebar.gettingStarted.title": "البدء", - "sidebar.gettingStarted.line1": "يتضمن OpenCode نماذج مجانية حتى تتمكن من البدء فورًا.", + "sidebar.gettingStarted.line1": "يتضمن Kilo نماذج مجانية حتى تتمكن من البدء فورًا.", "sidebar.gettingStarted.line2": "قم بتوصيل أي موفر لاستخدام النماذج، بما في ذلك Claude و GPT و Gemini وما إلى ذلك.", "sidebar.project.recentSessions": "الجلسات الحديثة", "sidebar.project.viewAllSessions": "عرض جميع الجلسات", "sidebar.project.clearNotifications": "مسح الإشعارات", - "app.name.desktop": "OpenCode Desktop", + "app.name.desktop": "Kilo Desktop", "settings.section.desktop": "سطح المكتب", "settings.section.server": "الخادم", "settings.tab.general": "عام", "settings.tab.shortcuts": "اختصارات", "settings.desktop.section.wsl": "WSL", "settings.desktop.wsl.title": "تكامل WSL", - "settings.desktop.wsl.description": "تشغيل خادم OpenCode داخل WSL على Windows.", + "settings.desktop.wsl.description": "تشغيل خادم Kilo داخل WSL على Windows.", "settings.general.section.appearance": "المظهر", "settings.general.section.notifications": "إشعارات النظام", "settings.general.section.updates": "التحديثات", @@ -557,13 +557,13 @@ export const dict = { "settings.general.section.feed": "الخلاصة", "settings.general.section.display": "شاشة العرض", "settings.general.row.language.title": "اللغة", - "settings.general.row.language.description": "تغيير لغة العرض لـ OpenCode", + "settings.general.row.language.description": "تغيير لغة العرض لـ Kilo", "settings.general.row.appearance.title": "المظهر", - "settings.general.row.appearance.description": "تخصيص كيفية ظهور OpenCode على جهازك", + "settings.general.row.appearance.description": "تخصيص كيفية ظهور Kilo على جهازك", "settings.general.row.colorScheme.title": "مخطط الألوان", - "settings.general.row.colorScheme.description": "اختر ما إذا كان OpenCode يتبع سمة النظام أو الفاتح أو الداكن", + "settings.general.row.colorScheme.description": "اختر ما إذا كان Kilo يتبع سمة النظام أو الفاتح أو الداكن", "settings.general.row.theme.title": "السمة", - "settings.general.row.theme.description": "تخصيص سمة OpenCode.", + "settings.general.row.theme.description": "تخصيص سمة Kilo.", "settings.general.row.font.title": "خط الكود", "settings.general.row.font.description": "خصّص الخط المستخدم في كتل التعليمات البرمجية", "settings.general.row.terminalFont.title": "Terminal Font", @@ -591,13 +591,13 @@ export const dict = { "settings.general.row.releaseNotes.title": "ملاحظات الإصدار", "settings.general.row.releaseNotes.description": 'عرض نوافذ "ما الجديد" المنبثقة بعد التحديثات', "settings.updates.row.startup.title": "التحقق من التحديثات عند بدء التشغيل", - "settings.updates.row.startup.description": "التحقق تلقائيًا من التحديثات عند تشغيل OpenCode", + "settings.updates.row.startup.description": "التحقق تلقائيًا من التحديثات عند تشغيل Kilo", "settings.updates.row.check.title": "التحقق من التحديثات", "settings.updates.row.check.description": "التحقق يدويًا من التحديثات وتثبيتها إذا كانت متاحة", "settings.updates.action.checkNow": "تحقق الآن", "settings.updates.action.checking": "جارٍ التحقق...", "settings.updates.toast.latest.title": "أنت على آخر إصدار", - "settings.updates.toast.latest.description": "أنت تستخدم أحدث إصدار من OpenCode.", + "settings.updates.toast.latest.description": "أنت تستخدم أحدث إصدار من Kilo.", "sound.option.none": "بلا", "sound.option.alert01": "تنبيه 01", "sound.option.alert02": "تنبيه 02", diff --git a/packages/app/src/i18n/br.ts b/packages/app/src/i18n/br.ts index 022d012984d..23ab983bd65 100644 --- a/packages/app/src/i18n/br.ts +++ b/packages/app/src/i18n/br.ts @@ -105,7 +105,7 @@ export const dict = { "dialog.model.manage": "Gerenciar modelos", "dialog.model.manage.description": "Personalizar quais modelos aparecem no seletor de modelos.", "dialog.model.manage.provider.toggle": "Alternar todos os modelos {{provider}}", - "dialog.model.unpaid.freeModels.title": "Modelos gratuitos fornecidos pelo OpenCode", + "dialog.model.unpaid.freeModels.title": "Modelos gratuitos fornecidos pelo Kilo", "dialog.model.unpaid.addMore.title": "Adicionar mais modelos de provedores populares", "dialog.provider.viewAll": "Ver mais provedores", "provider.connect.title": "Conectar {{provider}}", @@ -116,7 +116,7 @@ export const dict = { "provider.connect.status.waiting": "Aguardando autorização...", "provider.connect.status.failed": "Autorização falhou: {{error}}", "provider.connect.apiKey.description": - "Digite sua chave de API do {{provider}} para conectar sua conta e usar modelos do {{provider}} no OpenCode.", + "Digite sua chave de API do {{provider}} para conectar sua conta e usar modelos do {{provider}} no Kilo.", "provider.connect.apiKey.label": "Chave de API do {{provider}}", "provider.connect.apiKey.placeholder": "Chave de API", "provider.connect.apiKey.required": "A chave de API é obrigatória", @@ -130,7 +130,7 @@ export const dict = { "provider.connect.oauth.code.visit.prefix": "Visite ", "provider.connect.oauth.code.visit.link": "este link", "provider.connect.oauth.code.visit.suffix": - " para obter seu código de autorização e conectar sua conta para usar modelos do {{provider}} no OpenCode.", + " para obter seu código de autorização e conectar sua conta para usar modelos do {{provider}} no Kilo.", "provider.connect.oauth.code.label": "Código de autorização {{method}}", "provider.connect.oauth.code.placeholder": "Código de autorização", "provider.connect.oauth.code.required": "O código de autorização é obrigatório", @@ -138,7 +138,7 @@ export const dict = { "provider.connect.oauth.auto.visit.prefix": "Visite ", "provider.connect.oauth.auto.visit.link": "este link", "provider.connect.oauth.auto.visit.suffix": - " e digite o código abaixo para conectar sua conta e usar modelos do {{provider}} no OpenCode.", + " e digite o código abaixo para conectar sua conta e usar modelos do {{provider}} no Kilo.", "provider.connect.oauth.auto.confirmationCode": "Código de confirmação", "provider.connect.toast.connected.title": "{{provider}} conectado", "provider.connect.toast.connected.description": "Modelos do {{provider}} agora estão disponíveis para uso.", @@ -281,7 +281,7 @@ export const dict = { "dialog.directory.search.placeholder": "Buscar pastas", "dialog.directory.empty": "Nenhuma pasta encontrada", "dialog.server.title": "Servidores", - "dialog.server.description": "Trocar para qual servidor OpenCode este aplicativo se conecta.", + "dialog.server.description": "Trocar para qual servidor Kilo este aplicativo se conecta.", "dialog.server.search.placeholder": "Buscar servidores", "dialog.server.empty": "Nenhum servidor ainda", "dialog.server.add.title": "Adicionar um servidor", @@ -396,7 +396,7 @@ export const dict = { "toast.session.unshare.failed.description": "Ocorreu um erro ao parar de compartilhar a sessão", "toast.session.listFailed.title": "Falha ao carregar sessões para {{project}}", "toast.update.title": "Atualização disponível", - "toast.update.description": "Uma nova versão do OpenCode ({{version}}) está disponível para instalação.", + "toast.update.description": "Uma nova versão do Kilo ({{version}}) está disponível para instalação.", "toast.update.action.installRestart": "Instalar e reiniciar", "toast.update.action.notYet": "Agora não", "error.page.title": "Algo deu errado", @@ -406,7 +406,7 @@ export const dict = { "error.page.action.checking": "Verificando...", "error.page.action.checkUpdates": "Verificar atualizações", "error.page.action.updateTo": "Atualizar para {{version}}", - "error.page.report.prefix": "Por favor, reporte este erro para a equipe do OpenCode", + "error.page.report.prefix": "Por favor, reporte este erro para a equipe do Kilo", "error.page.report.discord": "no Discord", "error.page.version": "Versão: {{version}}", "error.dev.rootNotFound": @@ -422,7 +422,7 @@ export const dict = { "error.chain.didYouMean": "Você quis dizer: {{suggestions}}", "error.chain.modelNotFound": "Modelo não encontrado: {{provider}}/{{model}}", "error.chain.checkConfig": "Verifique os nomes de provedor/modelo na sua configuração (opencode.json)", - "error.chain.mcpFailed": 'Servidor MCP "{{name}}" falhou. Nota: OpenCode ainda não suporta autenticação MCP.', + "error.chain.mcpFailed": 'Servidor MCP "{{name}}" falhou. Nota: Kilo ainda não suporta autenticação MCP.', "error.chain.providerAuthFailed": "Autenticação do provedor falhou ({{provider}}): {{message}}", "error.chain.providerInitFailed": 'Falha ao inicializar provedor "{{provider}}". Verifique credenciais e configuração.', @@ -544,19 +544,19 @@ export const dict = { "sidebar.workspaces.enable": "Habilitar espaços de trabalho", "sidebar.workspaces.disable": "Desabilitar espaços de trabalho", "sidebar.gettingStarted.title": "Começando", - "sidebar.gettingStarted.line1": "OpenCode inclui modelos gratuitos para você começar imediatamente.", + "sidebar.gettingStarted.line1": "Kilo inclui modelos gratuitos para você começar imediatamente.", "sidebar.gettingStarted.line2": "Conecte qualquer provedor para usar modelos, incluindo Claude, GPT, Gemini etc.", "sidebar.project.recentSessions": "Sessões recentes", "sidebar.project.viewAllSessions": "Ver todas as sessões", "sidebar.project.clearNotifications": "Limpar notificações", - "app.name.desktop": "OpenCode Desktop", + "app.name.desktop": "Kilo Desktop", "settings.section.desktop": "Desktop", "settings.section.server": "Servidor", "settings.tab.general": "Geral", "settings.tab.shortcuts": "Atalhos", "settings.desktop.section.wsl": "WSL", "settings.desktop.wsl.title": "WSL integration", - "settings.desktop.wsl.description": "Executar o servidor OpenCode dentro do WSL no Windows.", + "settings.desktop.wsl.description": "Executar o servidor Kilo dentro do WSL no Windows.", "settings.general.section.appearance": "Aparência", "settings.general.section.notifications": "Notificações do sistema", "settings.general.section.updates": "Atualizações", @@ -564,13 +564,13 @@ export const dict = { "settings.general.section.feed": "Feed", "settings.general.section.display": "Tela", "settings.general.row.language.title": "Idioma", - "settings.general.row.language.description": "Alterar o idioma de exibição do OpenCode", + "settings.general.row.language.description": "Alterar o idioma de exibição do Kilo", "settings.general.row.appearance.title": "Aparência", - "settings.general.row.appearance.description": "Personalize como o OpenCode aparece no seu dispositivo", + "settings.general.row.appearance.description": "Personalize como o Kilo aparece no seu dispositivo", "settings.general.row.colorScheme.title": "Esquema de cores", - "settings.general.row.colorScheme.description": "Escolha se o OpenCode segue o tema do sistema, claro ou escuro", + "settings.general.row.colorScheme.description": "Escolha se o Kilo segue o tema do sistema, claro ou escuro", "settings.general.row.theme.title": "Tema", - "settings.general.row.theme.description": "Personalize como o OpenCode é tematizado.", + "settings.general.row.theme.description": "Personalize como o Kilo é tematizado.", "settings.general.row.font.title": "Fonte de código", "settings.general.row.font.description": "Personalize a fonte usada em blocos de código", "settings.general.row.terminalFont.title": "Terminal Font", @@ -600,13 +600,13 @@ export const dict = { "settings.general.row.releaseNotes.title": "Notas da versão", "settings.general.row.releaseNotes.description": 'Mostrar pop-ups de "Novidades" após atualizações', "settings.updates.row.startup.title": "Verificar atualizações ao iniciar", - "settings.updates.row.startup.description": "Verificar atualizações automaticamente quando o OpenCode iniciar", + "settings.updates.row.startup.description": "Verificar atualizações automaticamente quando o Kilo iniciar", "settings.updates.row.check.title": "Verificar atualizações", "settings.updates.row.check.description": "Verificar atualizações manualmente e instalar se houver", "settings.updates.action.checkNow": "Verificar agora", "settings.updates.action.checking": "Verificando...", "settings.updates.toast.latest.title": "Você está atualizado", - "settings.updates.toast.latest.description": "Você está usando a versão mais recente do OpenCode.", + "settings.updates.toast.latest.description": "Você está usando a versão mais recente do Kilo.", "sound.option.none": "Nenhum", "sound.option.alert01": "Alerta 01", "sound.option.alert02": "Alerta 02", diff --git a/packages/app/src/i18n/bs.ts b/packages/app/src/i18n/bs.ts index 15d8376ab63..e8944d2406b 100644 --- a/packages/app/src/i18n/bs.ts +++ b/packages/app/src/i18n/bs.ts @@ -115,7 +115,7 @@ export const dict = { "dialog.model.manage.description": "Prilagodi koji se modeli prikazuju u izborniku modela.", "dialog.model.manage.provider.toggle": "Uključi/isključi sve {{provider}} modele", - "dialog.model.unpaid.freeModels.title": "Besplatni modeli koje obezbjeđuje OpenCode", + "dialog.model.unpaid.freeModels.title": "Besplatni modeli koje obezbjeđuje Kilo", "dialog.model.unpaid.addMore.title": "Dodaj još modela od popularnih provajdera", "dialog.provider.viewAll": "Prikaži više provajdera", @@ -128,7 +128,7 @@ export const dict = { "provider.connect.status.waiting": "Čekanje na autorizaciju...", "provider.connect.status.failed": "Autorizacija nije uspjela: {{error}}", "provider.connect.apiKey.description": - "Unesi svoj {{provider}} API ključ da povežeš račun i koristiš {{provider}} modele u OpenCode-u.", + "Unesi svoj {{provider}} API ključ da povežeš račun i koristiš {{provider}} modele u Kilo-u.", "provider.connect.apiKey.label": "{{provider}} API ključ", "provider.connect.apiKey.placeholder": "API ključ", "provider.connect.apiKey.required": "API ključ je obavezan", @@ -142,7 +142,7 @@ export const dict = { "provider.connect.oauth.code.visit.prefix": "Posjeti ", "provider.connect.oauth.code.visit.link": "ovaj link", "provider.connect.oauth.code.visit.suffix": - " da preuzmeš autorizacijski kod i povežeš račun te koristiš {{provider}} modele u OpenCode-u.", + " da preuzmeš autorizacijski kod i povežeš račun te koristiš {{provider}} modele u Kilo-u.", "provider.connect.oauth.code.label": "{{method}} autorizacijski kod", "provider.connect.oauth.code.placeholder": "Autorizacijski kod", "provider.connect.oauth.code.required": "Autorizacijski kod je obavezan", @@ -150,7 +150,7 @@ export const dict = { "provider.connect.oauth.auto.visit.prefix": "Posjeti ", "provider.connect.oauth.auto.visit.link": "ovaj link", "provider.connect.oauth.auto.visit.suffix": - " i unesi kod ispod da povežeš račun i koristiš {{provider}} modele u OpenCode-u.", + " i unesi kod ispod da povežeš račun i koristiš {{provider}} modele u Kilo-u.", "provider.connect.oauth.auto.confirmationCode": "Kod za potvrdu", "provider.connect.toast.connected.title": "{{provider}} povezan", "provider.connect.toast.connected.description": "{{provider}} modeli su sada dostupni za korištenje.", @@ -308,7 +308,7 @@ export const dict = { "dialog.directory.empty": "Nema pronađenih foldera", "dialog.server.title": "Serveri", - "dialog.server.description": "Promijeni na koji se OpenCode server ova aplikacija povezuje.", + "dialog.server.description": "Promijeni na koji se Kilo server ova aplikacija povezuje.", "dialog.server.search.placeholder": "Pretraži servere", "dialog.server.empty": "Još nema servera", "dialog.server.add.title": "Dodaj server", @@ -441,7 +441,7 @@ export const dict = { "toast.session.listFailed.title": "Neuspjelo učitavanje sesija za {{project}}", "toast.update.title": "Dostupno ažuriranje", - "toast.update.description": "Nova verzija OpenCode-a ({{version}}) je dostupna za instalaciju.", + "toast.update.description": "Nova verzija Kilo-a ({{version}}) je dostupna za instalaciju.", "toast.update.action.installRestart": "Instaliraj i restartuj", "toast.update.action.notYet": "Ne još", @@ -452,7 +452,7 @@ export const dict = { "error.page.action.checking": "Provjera...", "error.page.action.checkUpdates": "Provjeri ažuriranja", "error.page.action.updateTo": "Ažuriraj na {{version}}", - "error.page.report.prefix": "Molimo prijavi ovu grešku OpenCode timu", + "error.page.report.prefix": "Molimo prijavi ovu grešku Kilo timu", "error.page.report.discord": "na Discordu", "error.page.version": "Verzija: {{version}}", @@ -471,7 +471,7 @@ export const dict = { "error.chain.didYouMean": "Da li si mislio: {{suggestions}}", "error.chain.modelNotFound": "Model nije pronađen: {{provider}}/{{model}}", "error.chain.checkConfig": "Provjeri konfiguraciju (opencode.json) provider/model names", - "error.chain.mcpFailed": 'MCP server "{{name}}" nije uspio. Napomena: OpenCode još ne podržava MCP autentifikaciju.', + "error.chain.mcpFailed": 'MCP server "{{name}}" nije uspio. Napomena: Kilo još ne podržava MCP autentifikaciju.', "error.chain.providerAuthFailed": "Autentifikacija provajdera nije uspjela ({{provider}}): {{message}}", "error.chain.providerInitFailed": 'Neuspjelo inicijalizovanje provajdera "{{provider}}". Provjeri kredencijale i konfiguraciju.', @@ -605,13 +605,13 @@ export const dict = { "sidebar.workspaces.enable": "Omogući radne prostore", "sidebar.workspaces.disable": "Onemogući radne prostore", "sidebar.gettingStarted.title": "Početak", - "sidebar.gettingStarted.line1": "OpenCode uključuje besplatne modele, tako da možeš odmah početi.", + "sidebar.gettingStarted.line1": "Kilo uključuje besplatne modele, tako da možeš odmah početi.", "sidebar.gettingStarted.line2": "Poveži bilo kojeg provajdera da koristiš modele, npr. Claude, GPT, Gemini itd.", "sidebar.project.recentSessions": "Nedavne sesije", "sidebar.project.viewAllSessions": "Prikaži sve sesije", "sidebar.project.clearNotifications": "Očisti obavijesti", - "app.name.desktop": "OpenCode Desktop", + "app.name.desktop": "Kilo Desktop", "settings.section.desktop": "Desktop", "settings.section.server": "Server", @@ -619,7 +619,7 @@ export const dict = { "settings.tab.shortcuts": "Prečice", "settings.desktop.section.wsl": "WSL", "settings.desktop.wsl.title": "WSL integracija", - "settings.desktop.wsl.description": "Pokreni OpenCode server unutar WSL-a na Windowsu.", + "settings.desktop.wsl.description": "Pokreni Kilo server unutar WSL-a na Windowsu.", "settings.general.section.appearance": "Izgled", "settings.general.section.notifications": "Sistemske obavijesti", @@ -629,13 +629,13 @@ export const dict = { "settings.general.section.display": "Prikaz", "settings.general.row.language.title": "Jezik", - "settings.general.row.language.description": "Promijeni jezik prikaza u OpenCode-u", + "settings.general.row.language.description": "Promijeni jezik prikaza u Kilo-u", "settings.general.row.appearance.title": "Izgled", - "settings.general.row.appearance.description": "Prilagodi kako OpenCode izgleda na tvom uređaju", + "settings.general.row.appearance.description": "Prilagodi kako Kilo izgleda na tvom uređaju", "settings.general.row.colorScheme.title": "Šema boja", - "settings.general.row.colorScheme.description": "Odaberi da li OpenCode prati sistemsku, svijetlu ili tamnu temu", + "settings.general.row.colorScheme.description": "Odaberi da li Kilo prati sistemsku, svijetlu ili tamnu temu", "settings.general.row.theme.title": "Tema", - "settings.general.row.theme.description": "Prilagodi temu OpenCode-a.", + "settings.general.row.theme.description": "Prilagodi temu Kilo-a.", "settings.general.row.font.title": "Font za kod", "settings.general.row.font.description": "Prilagodi font koji se koristi u blokovima koda", "settings.general.row.terminalFont.title": "Terminal Font", @@ -667,13 +667,13 @@ export const dict = { "settings.general.row.releaseNotes.description": 'Prikaži iskačuće prozore "Šta je novo" nakon ažuriranja', "settings.updates.row.startup.title": "Provjeri ažuriranja pri pokretanju", - "settings.updates.row.startup.description": "Automatski provjerava ažuriranja kada se OpenCode pokrene", + "settings.updates.row.startup.description": "Automatski provjerava ažuriranja kada se Kilo pokrene", "settings.updates.row.check.title": "Provjeri ažuriranja", "settings.updates.row.check.description": "Ručno provjeri ažuriranja i instaliraj ako su dostupna", "settings.updates.action.checkNow": "Provjeri sada", "settings.updates.action.checking": "Provjera...", "settings.updates.toast.latest.title": "Sve je ažurno", - "settings.updates.toast.latest.description": "Koristiš najnoviju verziju OpenCode-a.", + "settings.updates.toast.latest.description": "Koristiš najnoviju verziju Kilo-a.", "sound.option.none": "Nijedan", "sound.option.alert01": "Upozorenje 01", "sound.option.alert02": "Upozorenje 02", diff --git a/packages/app/src/i18n/da.ts b/packages/app/src/i18n/da.ts index 03cfe2b7869..a6fb99eeac6 100644 --- a/packages/app/src/i18n/da.ts +++ b/packages/app/src/i18n/da.ts @@ -115,7 +115,7 @@ export const dict = { "dialog.model.manage.description": "Tilpas hvilke modeller der vises i modelvælgeren.", "dialog.model.manage.provider.toggle": "Skift alle {{provider}}-modeller", - "dialog.model.unpaid.freeModels.title": "Gratis modeller leveret af OpenCode", + "dialog.model.unpaid.freeModels.title": "Gratis modeller leveret af Kilo", "dialog.model.unpaid.addMore.title": "Tilføj flere modeller fra populære udbydere", "dialog.provider.viewAll": "Vis flere udbydere", @@ -128,7 +128,7 @@ export const dict = { "provider.connect.status.waiting": "Venter på godkendelse...", "provider.connect.status.failed": "Godkendelse mislykkedes: {{error}}", "provider.connect.apiKey.description": - "Indtast din {{provider}} API-nøgle for at forbinde din konto og bruge {{provider}} modeller i OpenCode.", + "Indtast din {{provider}} API-nøgle for at forbinde din konto og bruge {{provider}} modeller i Kilo.", "provider.connect.apiKey.label": "{{provider}} API-nøgle", "provider.connect.apiKey.placeholder": "API-nøgle", "provider.connect.apiKey.required": "API-nøgle er påkrævet", @@ -142,7 +142,7 @@ export const dict = { "provider.connect.oauth.code.visit.prefix": "Besøg ", "provider.connect.oauth.code.visit.link": "dette link", "provider.connect.oauth.code.visit.suffix": - " for at hente din godkendelseskode for at forbinde din konto og bruge {{provider}} modeller i OpenCode.", + " for at hente din godkendelseskode for at forbinde din konto og bruge {{provider}} modeller i Kilo.", "provider.connect.oauth.code.label": "{{method}} godkendelseskode", "provider.connect.oauth.code.placeholder": "Godkendelseskode", "provider.connect.oauth.code.required": "Godkendelseskode er påkrævet", @@ -150,7 +150,7 @@ export const dict = { "provider.connect.oauth.auto.visit.prefix": "Besøg ", "provider.connect.oauth.auto.visit.link": "dette link", "provider.connect.oauth.auto.visit.suffix": - " og indtast koden nedenfor for at forbinde din konto og bruge {{provider}} modeller i OpenCode.", + " og indtast koden nedenfor for at forbinde din konto og bruge {{provider}} modeller i Kilo.", "provider.connect.oauth.auto.confirmationCode": "Bekræftelseskode", "provider.connect.toast.connected.title": "{{provider}} forbundet", "provider.connect.toast.connected.description": "{{provider}} modeller er nu tilgængelige.", @@ -306,7 +306,7 @@ export const dict = { "dialog.directory.empty": "Ingen mapper fundet", "dialog.server.title": "Servere", - "dialog.server.description": "Skift hvilken OpenCode-server denne app forbinder til.", + "dialog.server.description": "Skift hvilken Kilo-server denne app forbinder til.", "dialog.server.search.placeholder": "Søg servere", "dialog.server.empty": "Ingen servere endnu", "dialog.server.add.title": "Tilføj en server", @@ -438,7 +438,7 @@ export const dict = { "toast.session.listFailed.title": "Kunne ikke indlæse sessioner for {{project}}", "toast.update.title": "Opdatering tilgængelig", - "toast.update.description": "En ny version af OpenCode ({{version}}) er nu tilgængelig til installation.", + "toast.update.description": "En ny version af Kilo ({{version}}) er nu tilgængelig til installation.", "toast.update.action.installRestart": "Installer og genstart", "toast.update.action.notYet": "Ikke endnu", @@ -449,7 +449,7 @@ export const dict = { "error.page.action.checking": "Tjekker...", "error.page.action.checkUpdates": "Tjek for opdateringer", "error.page.action.updateTo": "Opdater til {{version}}", - "error.page.report.prefix": "Rapporter venligst denne fejl til OpenCode-teamet", + "error.page.report.prefix": "Rapporter venligst denne fejl til Kilo-teamet", "error.page.report.discord": "på Discord", "error.page.version": "Version: {{version}}", @@ -468,7 +468,7 @@ export const dict = { "error.chain.didYouMean": "Mente du: {{suggestions}}", "error.chain.modelNotFound": "Model ikke fundet: {{provider}}/{{model}}", "error.chain.checkConfig": "Tjek dine konfigurations (opencode.json) udbyder/modelnavne", - "error.chain.mcpFailed": 'MCP-server "{{name}}" fejlede. Bemærk, OpenCode understøtter ikke MCP-godkendelse endnu.', + "error.chain.mcpFailed": 'MCP-server "{{name}}" fejlede. Bemærk, Kilo understøtter ikke MCP-godkendelse endnu.', "error.chain.providerAuthFailed": "Udbydergodkendelse mislykkedes ({{provider}}): {{message}}", "error.chain.providerInitFailed": 'Kunne ikke initialisere udbyder "{{provider}}". Tjek legitimationsoplysninger og konfiguration.', @@ -601,20 +601,20 @@ export const dict = { "sidebar.workspaces.enable": "Aktiver arbejdsområder", "sidebar.workspaces.disable": "Deaktiver arbejdsområder", "sidebar.gettingStarted.title": "Kom i gang", - "sidebar.gettingStarted.line1": "OpenCode inkluderer gratis modeller så du kan starte med det samme.", + "sidebar.gettingStarted.line1": "Kilo inkluderer gratis modeller så du kan starte med det samme.", "sidebar.gettingStarted.line2": "Forbind enhver udbyder for at bruge modeller, inkl. Claude, GPT, Gemini osv.", "sidebar.project.recentSessions": "Seneste sessioner", "sidebar.project.viewAllSessions": "Vis alle sessioner", "sidebar.project.clearNotifications": "Ryd notifikationer", - "app.name.desktop": "OpenCode Desktop", + "app.name.desktop": "Kilo Desktop", "settings.section.desktop": "Desktop", "settings.section.server": "Server", "settings.tab.general": "Generelt", "settings.tab.shortcuts": "Genveje", "settings.desktop.section.wsl": "WSL", "settings.desktop.wsl.title": "WSL integration", - "settings.desktop.wsl.description": "Kør OpenCode-serveren inde i WSL på Windows.", + "settings.desktop.wsl.description": "Kør Kilo-serveren inde i WSL på Windows.", "settings.general.section.appearance": "Udseende", "settings.general.section.notifications": "Systemmeddelelser", @@ -624,13 +624,13 @@ export const dict = { "settings.general.section.display": "Skærm", "settings.general.row.language.title": "Sprog", - "settings.general.row.language.description": "Ændr visningssproget for OpenCode", + "settings.general.row.language.description": "Ændr visningssproget for Kilo", "settings.general.row.appearance.title": "Udseende", - "settings.general.row.appearance.description": "Tilpas hvordan OpenCode ser ud på din enhed", + "settings.general.row.appearance.description": "Tilpas hvordan Kilo ser ud på din enhed", "settings.general.row.colorScheme.title": "Farveskema", - "settings.general.row.colorScheme.description": "Vælg om OpenCode følger systemets, lyst eller mørkt tema", + "settings.general.row.colorScheme.description": "Vælg om Kilo følger systemets, lyst eller mørkt tema", "settings.general.row.theme.title": "Tema", - "settings.general.row.theme.description": "Tilpas hvordan OpenCode er temabestemt.", + "settings.general.row.theme.description": "Tilpas hvordan Kilo er temabestemt.", "settings.general.row.font.title": "Kode-skrifttype", "settings.general.row.font.description": "Tilpas skrifttypen, der bruges i kodeblokke", "settings.general.row.terminalFont.title": "Terminal Font", @@ -661,13 +661,13 @@ export const dict = { "settings.general.row.releaseNotes.description": 'Vis "Hvad er nyt"-popups efter opdateringer', "settings.updates.row.startup.title": "Tjek for opdateringer ved opstart", - "settings.updates.row.startup.description": "Tjek automatisk for opdateringer, når OpenCode starter", + "settings.updates.row.startup.description": "Tjek automatisk for opdateringer, når Kilo starter", "settings.updates.row.check.title": "Tjek for opdateringer", "settings.updates.row.check.description": "Tjek manuelt for opdateringer og installer, hvis tilgængelig", "settings.updates.action.checkNow": "Tjek nu", "settings.updates.action.checking": "Tjekker...", "settings.updates.toast.latest.title": "Du er opdateret", - "settings.updates.toast.latest.description": "Du kører den nyeste version af OpenCode.", + "settings.updates.toast.latest.description": "Du kører den nyeste version af Kilo.", "sound.option.none": "Ingen", "sound.option.alert01": "Alarm 01", diff --git a/packages/app/src/i18n/de.ts b/packages/app/src/i18n/de.ts index ccb88e9f418..2ef97be5260 100644 --- a/packages/app/src/i18n/de.ts +++ b/packages/app/src/i18n/de.ts @@ -109,7 +109,7 @@ export const dict = { "dialog.model.manage": "Modelle verwalten", "dialog.model.manage.description": "Anpassen, welche Modelle in der Modellauswahl erscheinen.", "dialog.model.manage.provider.toggle": "Alle {{provider}}-Modelle umschalten", - "dialog.model.unpaid.freeModels.title": "Kostenlose Modelle von OpenCode", + "dialog.model.unpaid.freeModels.title": "Kostenlose Modelle von Kilo", "dialog.model.unpaid.addMore.title": "Weitere Modelle von beliebten Anbietern hinzufügen", "dialog.provider.viewAll": "Mehr Anbieter anzeigen", "provider.connect.title": "{{provider}} verbinden", @@ -120,7 +120,7 @@ export const dict = { "provider.connect.status.waiting": "Warten auf Autorisierung...", "provider.connect.status.failed": "Autorisierung fehlgeschlagen: {{error}}", "provider.connect.apiKey.description": - "Geben Sie Ihren {{provider}} API-Schlüssel ein, um Ihr Konto zu verbinden und {{provider}} Modelle in OpenCode zu nutzen.", + "Geben Sie Ihren {{provider}} API-Schlüssel ein, um Ihr Konto zu verbinden und {{provider}} Modelle in Kilo zu nutzen.", "provider.connect.apiKey.label": "{{provider}} API-Schlüssel", "provider.connect.apiKey.placeholder": "API-Schlüssel", "provider.connect.apiKey.required": "API-Schlüssel ist erforderlich", @@ -134,7 +134,7 @@ export const dict = { "provider.connect.oauth.code.visit.prefix": "Besuchen Sie ", "provider.connect.oauth.code.visit.link": "diesen Link", "provider.connect.oauth.code.visit.suffix": - ", um Ihren Autorisierungscode zu erhalten, Ihr Konto zu verbinden und {{provider}} Modelle in OpenCode zu nutzen.", + ", um Ihren Autorisierungscode zu erhalten, Ihr Konto zu verbinden und {{provider}} Modelle in Kilo zu nutzen.", "provider.connect.oauth.code.label": "{{method}} Autorisierungscode", "provider.connect.oauth.code.placeholder": "Autorisierungscode", "provider.connect.oauth.code.required": "Autorisierungscode ist erforderlich", @@ -142,7 +142,7 @@ export const dict = { "provider.connect.oauth.auto.visit.prefix": "Besuchen Sie ", "provider.connect.oauth.auto.visit.link": "diesen Link", "provider.connect.oauth.auto.visit.suffix": - " und geben Sie den untenstehenden Code ein, um Ihr Konto zu verbinden und {{provider}} Modelle in OpenCode zu nutzen.", + " und geben Sie den untenstehenden Code ein, um Ihr Konto zu verbinden und {{provider}} Modelle in Kilo zu nutzen.", "provider.connect.oauth.auto.confirmationCode": "Bestätigungscode", "provider.connect.toast.connected.title": "{{provider}} verbunden", "provider.connect.toast.connected.description": "{{provider}} Modelle sind jetzt verfügbar.", @@ -287,7 +287,7 @@ export const dict = { "dialog.directory.search.placeholder": "Ordner durchsuchen", "dialog.directory.empty": "Keine Ordner gefunden", "dialog.server.title": "Server", - "dialog.server.description": "Wechseln Sie den OpenCode-Server, mit dem sich diese App verbindet.", + "dialog.server.description": "Wechseln Sie den Kilo-Server, mit dem sich diese App verbindet.", "dialog.server.search.placeholder": "Server durchsuchen", "dialog.server.empty": "Noch keine Server", "dialog.server.add.title": "Server hinzufügen", @@ -403,7 +403,7 @@ export const dict = { "toast.session.unshare.failed.description": "Beim Aufheben des Teilens ist ein Fehler aufgetreten", "toast.session.listFailed.title": "Sitzungen für {{project}} konnten nicht geladen werden", "toast.update.title": "Update verfügbar", - "toast.update.description": "Eine neue Version von OpenCode ({{version}}) ist zur Installation verfügbar.", + "toast.update.description": "Eine neue Version von Kilo ({{version}}) ist zur Installation verfügbar.", "toast.update.action.installRestart": "Installieren und neu starten", "toast.update.action.notYet": "Noch nicht", "error.page.title": "Etwas ist schiefgelaufen", @@ -413,7 +413,7 @@ export const dict = { "error.page.action.checking": "Prüfen...", "error.page.action.checkUpdates": "Nach Updates suchen", "error.page.action.updateTo": "Auf {{version}} aktualisieren", - "error.page.report.prefix": "Bitte melden Sie diesen Fehler dem OpenCode-Team", + "error.page.report.prefix": "Bitte melden Sie diesen Fehler dem Kilo-Team", "error.page.report.discord": "auf Discord", "error.page.version": "Version: {{version}}", "error.dev.rootNotFound": @@ -430,7 +430,7 @@ export const dict = { "error.chain.modelNotFound": "Modell nicht gefunden: {{provider}}/{{model}}", "error.chain.checkConfig": "Überprüfen Sie Ihre Konfiguration (opencode.json) auf Anbieter-/Modellnamen", "error.chain.mcpFailed": - 'MCP-Server "{{name}}" fehlgeschlagen. Hinweis: OpenCode unterstützt noch keine MCP-Authentifizierung.', + 'MCP-Server "{{name}}" fehlgeschlagen. Hinweis: Kilo unterstützt noch keine MCP-Authentifizierung.', "error.chain.providerAuthFailed": "Anbieter-Authentifizierung fehlgeschlagen ({{provider}}): {{message}}", "error.chain.providerInitFailed": 'Anbieter "{{provider}}" konnte nicht initialisiert werden. Überprüfen Sie Anmeldeinformationen und Konfiguration.', @@ -552,20 +552,20 @@ export const dict = { "sidebar.workspaces.enable": "Arbeitsbereiche aktivieren", "sidebar.workspaces.disable": "Arbeitsbereiche deaktivieren", "sidebar.gettingStarted.title": "Erste Schritte", - "sidebar.gettingStarted.line1": "OpenCode enthält kostenlose Modelle, damit Sie sofort loslegen können.", + "sidebar.gettingStarted.line1": "Kilo enthält kostenlose Modelle, damit Sie sofort loslegen können.", "sidebar.gettingStarted.line2": "Verbinden Sie einen beliebigen Anbieter, um Modelle wie Claude, GPT, Gemini usw. zu nutzen.", "sidebar.project.recentSessions": "Letzte Sitzungen", "sidebar.project.viewAllSessions": "Alle Sitzungen anzeigen", "sidebar.project.clearNotifications": "Benachrichtigungen löschen", - "app.name.desktop": "OpenCode Desktop", + "app.name.desktop": "Kilo Desktop", "settings.section.desktop": "Desktop", "settings.section.server": "Server", "settings.tab.general": "Allgemein", "settings.tab.shortcuts": "Tastenkombinationen", "settings.desktop.section.wsl": "WSL", "settings.desktop.wsl.title": "WSL-Integration", - "settings.desktop.wsl.description": "OpenCode-Server innerhalb von WSL unter Windows ausführen.", + "settings.desktop.wsl.description": "Kilo-Server innerhalb von WSL unter Windows ausführen.", "settings.general.section.appearance": "Erscheinungsbild", "settings.general.section.notifications": "Systembenachrichtigungen", "settings.general.section.updates": "Updates", @@ -573,14 +573,14 @@ export const dict = { "settings.general.section.feed": "Feed", "settings.general.section.display": "Anzeige", "settings.general.row.language.title": "Sprache", - "settings.general.row.language.description": "Die Anzeigesprache für OpenCode ändern", + "settings.general.row.language.description": "Die Anzeigesprache für Kilo ändern", "settings.general.row.appearance.title": "Erscheinungsbild", - "settings.general.row.appearance.description": "Anpassen, wie OpenCode auf Ihrem Gerät aussieht", + "settings.general.row.appearance.description": "Anpassen, wie Kilo auf Ihrem Gerät aussieht", "settings.general.row.colorScheme.title": "Farbschema", "settings.general.row.colorScheme.description": - "Wählen Sie, ob OpenCode dem System-, hellen oder dunklen Thema folgt", + "Wählen Sie, ob Kilo dem System-, hellen oder dunklen Thema folgt", "settings.general.row.theme.title": "Thema", - "settings.general.row.theme.description": "Das Thema von OpenCode anpassen.", + "settings.general.row.theme.description": "Das Thema von Kilo anpassen.", "settings.general.row.font.title": "Code-Schriftart", "settings.general.row.font.description": "Die in Codeblöcken verwendete Schriftart anpassen", "settings.general.row.terminalFont.title": "Terminal Font", @@ -611,13 +611,13 @@ export const dict = { "settings.general.row.releaseNotes.title": "Versionshinweise", "settings.general.row.releaseNotes.description": '"Neuigkeiten"-Pop-ups nach Updates anzeigen', "settings.updates.row.startup.title": "Beim Start nach Updates suchen", - "settings.updates.row.startup.description": "Beim Start von OpenCode automatisch nach Updates suchen", + "settings.updates.row.startup.description": "Beim Start von Kilo automatisch nach Updates suchen", "settings.updates.row.check.title": "Nach Updates suchen", "settings.updates.row.check.description": "Manuell nach Updates suchen und installieren, wenn verfügbar", "settings.updates.action.checkNow": "Jetzt prüfen", "settings.updates.action.checking": "Wird geprüft...", "settings.updates.toast.latest.title": "Du bist auf dem neuesten Stand", - "settings.updates.toast.latest.description": "Du verwendest die aktuelle Version von OpenCode.", + "settings.updates.toast.latest.description": "Du verwendest die aktuelle Version von Kilo.", "sound.option.none": "Keine", "sound.option.alert01": "Alarm 01", "sound.option.alert02": "Alarm 02", diff --git a/packages/app/src/i18n/en.ts b/packages/app/src/i18n/en.ts index ed80b38ce4f..11c83dde208 100644 --- a/packages/app/src/i18n/en.ts +++ b/packages/app/src/i18n/en.ts @@ -117,7 +117,7 @@ export const dict = { "dialog.model.manage.description": "Customize which models appear in the model selector.", "dialog.model.manage.provider.toggle": "Toggle all {{provider}} models", - "dialog.model.unpaid.freeModels.title": "Free models provided by OpenCode", + "dialog.model.unpaid.freeModels.title": "Free models provided by Kilo", "dialog.model.unpaid.addMore.title": "Add more models from popular providers", "dialog.provider.viewAll": "Show more providers", @@ -130,7 +130,7 @@ export const dict = { "provider.connect.status.waiting": "Waiting for authorization...", "provider.connect.status.failed": "Authorization failed: {{error}}", "provider.connect.apiKey.description": - "Enter your {{provider}} API key to connect your account and use {{provider}} models in OpenCode.", + "Enter your {{provider}} API key to connect your account and use {{provider}} models in Kilo.", "provider.connect.apiKey.label": "{{provider}} API key", "provider.connect.apiKey.placeholder": "API key", "provider.connect.apiKey.required": "API key is required", @@ -144,7 +144,7 @@ export const dict = { "provider.connect.oauth.code.visit.prefix": "Visit ", "provider.connect.oauth.code.visit.link": "this link", "provider.connect.oauth.code.visit.suffix": - " to collect your authorization code to connect your account and use {{provider}} models in OpenCode.", + " to collect your authorization code to connect your account and use {{provider}} models in Kilo.", "provider.connect.oauth.code.label": "{{method}} authorization code", "provider.connect.oauth.code.placeholder": "Authorization code", "provider.connect.oauth.code.required": "Authorization code is required", @@ -152,7 +152,7 @@ export const dict = { "provider.connect.oauth.auto.visit.prefix": "Visit ", "provider.connect.oauth.auto.visit.link": "this link", "provider.connect.oauth.auto.visit.suffix": - " and enter the code below to connect your account and use {{provider}} models in OpenCode.", + " and enter the code below to connect your account and use {{provider}} models in Kilo.", "provider.connect.oauth.auto.confirmationCode": "Confirmation code", "provider.connect.toast.connected.title": "{{provider}} connected", "provider.connect.toast.connected.description": "{{provider}} models are now available to use.", @@ -316,7 +316,7 @@ export const dict = { "app.server.otherServers": "Other servers", "dialog.server.title": "Servers", - "dialog.server.description": "Switch which OpenCode server this app connects to.", + "dialog.server.description": "Switch which Kilo server this app connects to.", "dialog.server.search.placeholder": "Search servers", "dialog.server.empty": "No servers yet", "dialog.server.add.title": "Add server", @@ -457,7 +457,7 @@ export const dict = { "toast.project.reloadFailed.title": "Failed to reload {{project}}", "toast.update.title": "Update available", - "toast.update.description": "A new version of OpenCode ({{version}}) is now available to install.", + "toast.update.description": "A new version of Kilo ({{version}}) is now available to install.", "toast.update.action.installRestart": "Install and restart", "toast.update.action.notYet": "Not yet", @@ -469,7 +469,7 @@ export const dict = { "error.page.action.checkUpdates": "Check for updates", "error.page.action.updateTo": "Update to {{version}}", "error.page.circular": "[Circular]", - "error.page.report.prefix": "Please report this error to the OpenCode team", + "error.page.report.prefix": "Please report this error to the Kilo team", "error.page.report.discord": "on Discord", "error.page.version": "Version: {{version}}", @@ -495,7 +495,7 @@ export const dict = { "error.chain.didYouMean": "Did you mean: {{suggestions}}", "error.chain.modelNotFound": "Model not found: {{provider}}/{{model}}", "error.chain.checkConfig": "Check your config (opencode.json) provider/model names", - "error.chain.mcpFailed": 'MCP server "{{name}}" failed. Note, OpenCode does not support MCP authentication yet.', + "error.chain.mcpFailed": 'MCP server "{{name}}" failed. Note, Kilo does not support MCP authentication yet.', "error.chain.providerAuthFailed": "Provider authentication failed ({{provider}}): {{message}}", "error.chain.providerInitFailed": 'Failed to initialize provider "{{provider}}". Check credentials and configuration.', @@ -676,7 +676,7 @@ export const dict = { "sidebar.workspaces.enable": "Enable workspaces", "sidebar.workspaces.disable": "Disable workspaces", "sidebar.gettingStarted.title": "Getting started", - "sidebar.gettingStarted.line1": "OpenCode includes free models so you can start immediately.", + "sidebar.gettingStarted.line1": "Kilo includes free models so you can start immediately.", "sidebar.gettingStarted.line2": "Connect any provider to use models, inc. Claude, GPT, Gemini etc.", "sidebar.project.recentSessions": "Recent sessions", "sidebar.project.viewAllSessions": "View all sessions", @@ -708,7 +708,7 @@ export const dict = { "debugBar.mem.tipUnavailable": "Used JS heap vs heap limit. Chromium only.", "debugBar.mem.tip": "Used JS heap vs heap limit. {{used}} of {{limit}}.", - "app.name.desktop": "OpenCode Desktop", + "app.name.desktop": "Kilo Desktop", "settings.section.desktop": "Desktop", "settings.section.server": "Server", @@ -716,7 +716,7 @@ export const dict = { "settings.tab.shortcuts": "Shortcuts", "settings.desktop.section.wsl": "WSL", "settings.desktop.wsl.title": "WSL integration", - "settings.desktop.wsl.description": "Run the OpenCode server inside WSL on Windows.", + "settings.desktop.wsl.description": "Run the Kilo server inside WSL on Windows.", "settings.general.section.appearance": "Appearance", "settings.general.section.advanced": "Advanced", @@ -727,13 +727,13 @@ export const dict = { "settings.general.section.display": "Display", "settings.general.row.language.title": "Language", - "settings.general.row.language.description": "Change the display language for OpenCode", + "settings.general.row.language.description": "Change the display language for Kilo", "settings.general.row.appearance.title": "Appearance", - "settings.general.row.appearance.description": "Customise how OpenCode looks on your device", + "settings.general.row.appearance.description": "Customise how Kilo looks on your device", "settings.general.row.colorScheme.title": "Color scheme", - "settings.general.row.colorScheme.description": "Choose whether OpenCode follows the system, light, or dark theme", + "settings.general.row.colorScheme.description": "Choose whether Kilo follows the system, light, or dark theme", "settings.general.row.theme.title": "Theme", - "settings.general.row.theme.description": "Customise how OpenCode is themed.", + "settings.general.row.theme.description": "Customise how Kilo is themed.", "settings.general.row.font.title": "Code Font", "settings.general.row.font.description": "Customise the font used in code blocks", "settings.general.row.terminalFont.title": "Terminal Font", @@ -775,13 +775,13 @@ export const dict = { "settings.general.row.releaseNotes.description": "Show What's New popups after updates", "settings.updates.row.startup.title": "Check for updates on startup", - "settings.updates.row.startup.description": "Automatically check for updates when OpenCode launches", + "settings.updates.row.startup.description": "Automatically check for updates when Kilo launches", "settings.updates.row.check.title": "Check for updates", "settings.updates.row.check.description": "Manually check for updates and install if available", "settings.updates.action.checkNow": "Check now", "settings.updates.action.checking": "Checking...", "settings.updates.toast.latest.title": "You're up to date", - "settings.updates.toast.latest.description": "You're running the latest version of OpenCode.", + "settings.updates.toast.latest.description": "You're running the latest version of Kilo.", "sound.option.none": "None", "sound.option.alert01": "Alert 01", "sound.option.alert02": "Alert 02", diff --git a/packages/app/src/i18n/es.ts b/packages/app/src/i18n/es.ts index 0b4789c2aaa..bae6b6e3b18 100644 --- a/packages/app/src/i18n/es.ts +++ b/packages/app/src/i18n/es.ts @@ -115,7 +115,7 @@ export const dict = { "dialog.model.manage.description": "Personalizar qué modelos aparecen en el selector de modelos.", "dialog.model.manage.provider.toggle": "Alternar todos los modelos de {{provider}}", - "dialog.model.unpaid.freeModels.title": "Modelos gratuitos proporcionados por OpenCode", + "dialog.model.unpaid.freeModels.title": "Modelos gratuitos proporcionados por Kilo", "dialog.model.unpaid.addMore.title": "Añadir más modelos de proveedores populares", "dialog.provider.viewAll": "Ver más proveedores", @@ -128,7 +128,7 @@ export const dict = { "provider.connect.status.waiting": "Esperando autorización...", "provider.connect.status.failed": "Autorización fallida: {{error}}", "provider.connect.apiKey.description": - "Introduce tu clave API de {{provider}} para conectar tu cuenta y usar modelos de {{provider}} en OpenCode.", + "Introduce tu clave API de {{provider}} para conectar tu cuenta y usar modelos de {{provider}} en Kilo.", "provider.connect.apiKey.label": "Clave API de {{provider}}", "provider.connect.apiKey.placeholder": "Clave API", "provider.connect.apiKey.required": "La clave API es obligatoria", @@ -142,7 +142,7 @@ export const dict = { "provider.connect.oauth.code.visit.prefix": "Visita ", "provider.connect.oauth.code.visit.link": "este enlace", "provider.connect.oauth.code.visit.suffix": - " para obtener tu código de autorización para conectar tu cuenta y usar modelos de {{provider}} en OpenCode.", + " para obtener tu código de autorización para conectar tu cuenta y usar modelos de {{provider}} en Kilo.", "provider.connect.oauth.code.label": "Código de autorización {{method}}", "provider.connect.oauth.code.placeholder": "Código de autorización", "provider.connect.oauth.code.required": "El código de autorización es obligatorio", @@ -150,7 +150,7 @@ export const dict = { "provider.connect.oauth.auto.visit.prefix": "Visita ", "provider.connect.oauth.auto.visit.link": "este enlace", "provider.connect.oauth.auto.visit.suffix": - " e introduce el código a continuación para conectar tu cuenta y usar modelos de {{provider}} en OpenCode.", + " e introduce el código a continuación para conectar tu cuenta y usar modelos de {{provider}} en Kilo.", "provider.connect.oauth.auto.confirmationCode": "Código de confirmación", "provider.connect.toast.connected.title": "{{provider}} conectado", "provider.connect.toast.connected.description": "Los modelos de {{provider}} ahora están disponibles para usar.", @@ -307,7 +307,7 @@ export const dict = { "dialog.directory.empty": "No se encontraron carpetas", "dialog.server.title": "Servidores", - "dialog.server.description": "Cambiar a qué servidor de OpenCode se conecta esta app.", + "dialog.server.description": "Cambiar a qué servidor de Kilo se conecta esta app.", "dialog.server.search.placeholder": "Buscar servidores", "dialog.server.empty": "No hay servidores aún", "dialog.server.add.title": "Añadir un servidor", @@ -441,7 +441,7 @@ export const dict = { "toast.session.listFailed.title": "Fallo al cargar sesiones para {{project}}", "toast.update.title": "Actualización disponible", - "toast.update.description": "Una nueva versión de OpenCode ({{version}}) está disponible para instalar.", + "toast.update.description": "Una nueva versión de Kilo ({{version}}) está disponible para instalar.", "toast.update.action.installRestart": "Instalar y reiniciar", "toast.update.action.notYet": "Todavía no", @@ -452,7 +452,7 @@ export const dict = { "error.page.action.checking": "Comprobando...", "error.page.action.checkUpdates": "Buscar actualizaciones", "error.page.action.updateTo": "Actualizar a {{version}}", - "error.page.report.prefix": "Por favor reporta este error al equipo de OpenCode", + "error.page.report.prefix": "Por favor reporta este error al equipo de Kilo", "error.page.report.discord": "en Discord", "error.page.version": "Versión: {{version}}", @@ -471,7 +471,7 @@ export const dict = { "error.chain.didYouMean": "¿Quisiste decir: {{suggestions}}", "error.chain.modelNotFound": "Modelo no encontrado: {{provider}}/{{model}}", "error.chain.checkConfig": "Comprueba los nombres de proveedor/modelo en tu configuración (opencode.json)", - "error.chain.mcpFailed": 'El servidor MCP "{{name}}" falló. Nota, OpenCode no soporta autenticación MCP todavía.', + "error.chain.mcpFailed": 'El servidor MCP "{{name}}" falló. Nota, Kilo no soporta autenticación MCP todavía.', "error.chain.providerAuthFailed": "Autenticación de proveedor fallida ({{provider}}): {{message}}", "error.chain.providerInitFailed": 'Fallo al inicializar proveedor "{{provider}}". Comprueba credenciales y configuración.', @@ -608,13 +608,13 @@ export const dict = { "sidebar.workspaces.enable": "Habilitar espacios de trabajo", "sidebar.workspaces.disable": "Deshabilitar espacios de trabajo", "sidebar.gettingStarted.title": "Empezando", - "sidebar.gettingStarted.line1": "OpenCode incluye modelos gratuitos para que puedas empezar inmediatamente.", + "sidebar.gettingStarted.line1": "Kilo incluye modelos gratuitos para que puedas empezar inmediatamente.", "sidebar.gettingStarted.line2": "Conecta cualquier proveedor para usar modelos, inc. Claude, GPT, Gemini etc.", "sidebar.project.recentSessions": "Sesiones recientes", "sidebar.project.viewAllSessions": "Ver todas las sesiones", "sidebar.project.clearNotifications": "Borrar notificaciones", - "app.name.desktop": "OpenCode Desktop", + "app.name.desktop": "Kilo Desktop", "settings.section.desktop": "Escritorio", "settings.section.server": "Servidor", @@ -622,7 +622,7 @@ export const dict = { "settings.tab.shortcuts": "Atajos", "settings.desktop.section.wsl": "WSL", "settings.desktop.wsl.title": "Integración con WSL", - "settings.desktop.wsl.description": "Ejecutar el servidor OpenCode dentro de WSL en Windows.", + "settings.desktop.wsl.description": "Ejecutar el servidor Kilo dentro de WSL en Windows.", "settings.general.section.appearance": "Apariencia", "settings.general.section.notifications": "Notificaciones del sistema", @@ -632,13 +632,13 @@ export const dict = { "settings.general.section.display": "Pantalla", "settings.general.row.language.title": "Idioma", - "settings.general.row.language.description": "Cambiar el idioma de visualización para OpenCode", + "settings.general.row.language.description": "Cambiar el idioma de visualización para Kilo", "settings.general.row.appearance.title": "Apariencia", - "settings.general.row.appearance.description": "Personaliza cómo se ve OpenCode en tu dispositivo", + "settings.general.row.appearance.description": "Personaliza cómo se ve Kilo en tu dispositivo", "settings.general.row.colorScheme.title": "Esquema de color", - "settings.general.row.colorScheme.description": "Elige si OpenCode sigue el tema del sistema, claro u oscuro", + "settings.general.row.colorScheme.description": "Elige si Kilo sigue el tema del sistema, claro u oscuro", "settings.general.row.theme.title": "Tema", - "settings.general.row.theme.description": "Personaliza el tema de OpenCode.", + "settings.general.row.theme.description": "Personaliza el tema de Kilo.", "settings.general.row.font.title": "Fuente de código", "settings.general.row.font.description": "Personaliza la fuente usada en bloques de código", "settings.general.row.terminalFont.title": "Terminal Font", @@ -672,13 +672,13 @@ export const dict = { 'Mostrar ventanas emergentes de "Novedades" después de las actualizaciones', "settings.updates.row.startup.title": "Buscar actualizaciones al iniciar", - "settings.updates.row.startup.description": "Buscar actualizaciones automáticamente cuando se inicia OpenCode", + "settings.updates.row.startup.description": "Buscar actualizaciones automáticamente cuando se inicia Kilo", "settings.updates.row.check.title": "Buscar actualizaciones", "settings.updates.row.check.description": "Buscar actualizaciones manualmente e instalarlas si hay alguna", "settings.updates.action.checkNow": "Buscar ahora", "settings.updates.action.checking": "Buscando...", "settings.updates.toast.latest.title": "Estás al día", - "settings.updates.toast.latest.description": "Estás usando la última versión de OpenCode.", + "settings.updates.toast.latest.description": "Estás usando la última versión de Kilo.", "sound.option.none": "Ninguno", "sound.option.alert01": "Alerta 01", "sound.option.alert02": "Alerta 02", diff --git a/packages/app/src/i18n/fr.ts b/packages/app/src/i18n/fr.ts index 4d73f626b21..e73c54d2128 100644 --- a/packages/app/src/i18n/fr.ts +++ b/packages/app/src/i18n/fr.ts @@ -105,7 +105,7 @@ export const dict = { "dialog.model.manage": "Gérer les modèles", "dialog.model.manage.description": "Personnalisez les modèles qui apparaissent dans le sélecteur.", "dialog.model.manage.provider.toggle": "Basculer tous les modèles {{provider}}", - "dialog.model.unpaid.freeModels.title": "Modèles gratuits fournis par OpenCode", + "dialog.model.unpaid.freeModels.title": "Modèles gratuits fournis par Kilo", "dialog.model.unpaid.addMore.title": "Ajouter plus de modèles de fournisseurs populaires", "dialog.provider.viewAll": "Voir plus de fournisseurs", "provider.connect.title": "Connecter {{provider}}", @@ -116,7 +116,7 @@ export const dict = { "provider.connect.status.waiting": "En attente d'autorisation...", "provider.connect.status.failed": "Échec de l'autorisation : {{error}}", "provider.connect.apiKey.description": - "Entrez votre clé API {{provider}} pour connecter votre compte et utiliser les modèles {{provider}} dans OpenCode.", + "Entrez votre clé API {{provider}} pour connecter votre compte et utiliser les modèles {{provider}} dans Kilo.", "provider.connect.apiKey.label": "Clé API {{provider}}", "provider.connect.apiKey.placeholder": "Clé API", "provider.connect.apiKey.required": "La clé API est requise", @@ -130,7 +130,7 @@ export const dict = { "provider.connect.oauth.code.visit.prefix": "Visitez ", "provider.connect.oauth.code.visit.link": "ce lien", "provider.connect.oauth.code.visit.suffix": - " pour récupérer votre code d'autorisation afin de connecter votre compte et utiliser les modèles {{provider}} dans OpenCode.", + " pour récupérer votre code d'autorisation afin de connecter votre compte et utiliser les modèles {{provider}} dans Kilo.", "provider.connect.oauth.code.label": "Code d'autorisation {{method}}", "provider.connect.oauth.code.placeholder": "Code d'autorisation", "provider.connect.oauth.code.required": "Le code d'autorisation est requis", @@ -138,7 +138,7 @@ export const dict = { "provider.connect.oauth.auto.visit.prefix": "Visitez ", "provider.connect.oauth.auto.visit.link": "ce lien", "provider.connect.oauth.auto.visit.suffix": - " et entrez le code ci-dessous pour connecter votre compte et utiliser les modèles {{provider}} dans OpenCode.", + " et entrez le code ci-dessous pour connecter votre compte et utiliser les modèles {{provider}} dans Kilo.", "provider.connect.oauth.auto.confirmationCode": "Code de confirmation", "provider.connect.toast.connected.title": "{{provider}} connecté", "provider.connect.toast.connected.description": "Les modèles {{provider}} sont maintenant disponibles.", @@ -282,7 +282,7 @@ export const dict = { "dialog.directory.search.placeholder": "Rechercher des dossiers", "dialog.directory.empty": "Aucun dossier trouvé", "dialog.server.title": "Serveurs", - "dialog.server.description": "Changez le serveur OpenCode auquel cette application se connecte.", + "dialog.server.description": "Changez le serveur Kilo auquel cette application se connecte.", "dialog.server.search.placeholder": "Rechercher des serveurs", "dialog.server.empty": "Aucun serveur pour l'instant", "dialog.server.add.title": "Ajouter un serveur", @@ -399,7 +399,7 @@ export const dict = { "toast.session.listFailed.title": "Échec du chargement des sessions pour {{project}}", "toast.update.title": "Mise à jour disponible", "toast.update.description": - "Une nouvelle version d'OpenCode ({{version}}) est maintenant disponible pour installation.", + "Une nouvelle version d'Kilo ({{version}}) est maintenant disponible pour installation.", "toast.update.action.installRestart": "Installer et redémarrer", "toast.update.action.notYet": "Pas encore", "error.page.title": "Quelque chose s'est mal passé", @@ -409,7 +409,7 @@ export const dict = { "error.page.action.checking": "Vérification...", "error.page.action.checkUpdates": "Vérifier les mises à jour", "error.page.action.updateTo": "Mettre à jour vers {{version}}", - "error.page.report.prefix": "Veuillez signaler cette erreur à l'équipe OpenCode", + "error.page.report.prefix": "Veuillez signaler cette erreur à l'équipe Kilo", "error.page.report.discord": "sur Discord", "error.page.version": "Version : {{version}}", "error.dev.rootNotFound": @@ -427,7 +427,7 @@ export const dict = { "error.chain.modelNotFound": "Modèle introuvable : {{provider}}/{{model}}", "error.chain.checkConfig": "Vérifiez votre configuration (opencode.json) pour les noms de fournisseur/modèle", "error.chain.mcpFailed": - "Le serveur MCP \"{{name}}\" a échoué. Notez qu'OpenCode ne supporte pas encore l'authentification MCP.", + "Le serveur MCP \"{{name}}\" a échoué. Notez qu'Kilo ne supporte pas encore l'authentification MCP.", "error.chain.providerAuthFailed": "Échec de l'authentification du fournisseur ({{provider}}) : {{message}}", "error.chain.providerInitFailed": 'Échec de l\'initialisation du fournisseur "{{provider}}". Vérifiez les identifiants et la configuration.', @@ -550,20 +550,20 @@ export const dict = { "sidebar.workspaces.disable": "Désactiver les espaces de travail", "sidebar.gettingStarted.title": "Commencer", "sidebar.gettingStarted.line1": - "OpenCode inclut des modèles gratuits pour que vous puissiez commencer immédiatement.", + "Kilo inclut des modèles gratuits pour que vous puissiez commencer immédiatement.", "sidebar.gettingStarted.line2": "Connectez n'importe quel fournisseur pour utiliser des modèles, y compris Claude, GPT, Gemini etc.", "sidebar.project.recentSessions": "Sessions récentes", "sidebar.project.viewAllSessions": "Voir toutes les sessions", "sidebar.project.clearNotifications": "Effacer les notifications", - "app.name.desktop": "OpenCode Desktop", + "app.name.desktop": "Kilo Desktop", "settings.section.desktop": "Bureau", "settings.section.server": "Serveur", "settings.tab.general": "Général", "settings.tab.shortcuts": "Raccourcis", "settings.desktop.section.wsl": "WSL", "settings.desktop.wsl.title": "Intégration WSL", - "settings.desktop.wsl.description": "Exécuter le serveur OpenCode dans WSL sur Windows.", + "settings.desktop.wsl.description": "Exécuter le serveur Kilo dans WSL sur Windows.", "settings.general.section.appearance": "Apparence", "settings.general.section.notifications": "Notifications système", "settings.general.section.updates": "Mises à jour", @@ -571,13 +571,13 @@ export const dict = { "settings.general.section.feed": "Flux", "settings.general.section.display": "Affichage", "settings.general.row.language.title": "Langue", - "settings.general.row.language.description": "Changer la langue d'affichage pour OpenCode", + "settings.general.row.language.description": "Changer la langue d'affichage pour Kilo", "settings.general.row.appearance.title": "Apparence", - "settings.general.row.appearance.description": "Personnaliser l'apparence d'OpenCode sur votre appareil", + "settings.general.row.appearance.description": "Personnaliser l'apparence d'Kilo sur votre appareil", "settings.general.row.colorScheme.title": "Schéma de couleurs", - "settings.general.row.colorScheme.description": "Choisissez si OpenCode suit le thème système, clair ou sombre", + "settings.general.row.colorScheme.description": "Choisissez si Kilo suit le thème système, clair ou sombre", "settings.general.row.theme.title": "Thème", - "settings.general.row.theme.description": "Personnaliser le thème d'OpenCode.", + "settings.general.row.theme.description": "Personnaliser le thème d'Kilo.", "settings.general.row.font.title": "Police de code", "settings.general.row.font.description": "Personnaliser la police utilisée dans les blocs de code", "settings.general.row.terminalFont.title": "Terminal Font", @@ -608,13 +608,13 @@ export const dict = { "settings.general.row.releaseNotes.title": "Notes de version", "settings.general.row.releaseNotes.description": 'Afficher des pop-ups "Quoi de neuf" après les mises à jour', "settings.updates.row.startup.title": "Vérifier les mises à jour au démarrage", - "settings.updates.row.startup.description": "Vérifier automatiquement les mises à jour au lancement d'OpenCode", + "settings.updates.row.startup.description": "Vérifier automatiquement les mises à jour au lancement d'Kilo", "settings.updates.row.check.title": "Vérifier les mises à jour", "settings.updates.row.check.description": "Vérifier manuellement les mises à jour et installer si disponible", "settings.updates.action.checkNow": "Vérifier maintenant", "settings.updates.action.checking": "Vérification...", "settings.updates.toast.latest.title": "Vous êtes à jour", - "settings.updates.toast.latest.description": "Vous utilisez la dernière version d'OpenCode.", + "settings.updates.toast.latest.description": "Vous utilisez la dernière version d'Kilo.", "sound.option.none": "Aucun", "sound.option.alert01": "Alerte 01", "sound.option.alert02": "Alerte 02", diff --git a/packages/app/src/i18n/ja.ts b/packages/app/src/i18n/ja.ts index 493b1f17ff9..9d68b8975d4 100644 --- a/packages/app/src/i18n/ja.ts +++ b/packages/app/src/i18n/ja.ts @@ -105,7 +105,7 @@ export const dict = { "dialog.model.manage": "モデルを管理", "dialog.model.manage.description": "モデルセレクターに表示するモデルをカスタマイズします。", "dialog.model.manage.provider.toggle": "すべての{{provider}}モデルを切り替え", - "dialog.model.unpaid.freeModels.title": "OpenCodeが提供する無料モデル", + "dialog.model.unpaid.freeModels.title": "Kiloが提供する無料モデル", "dialog.model.unpaid.addMore.title": "人気のプロバイダーからモデルを追加", "dialog.provider.viewAll": "さらにプロバイダーを表示", "provider.connect.title": "{{provider}}を接続", @@ -116,7 +116,7 @@ export const dict = { "provider.connect.status.waiting": "認証を待機中...", "provider.connect.status.failed": "認証に失敗しました: {{error}}", "provider.connect.apiKey.description": - "{{provider}}のAPIキーを入力してアカウントを接続し、OpenCodeで{{provider}}モデルを使用します。", + "{{provider}}のAPIキーを入力してアカウントを接続し、Kiloで{{provider}}モデルを使用します。", "provider.connect.apiKey.label": "{{provider}} APIキー", "provider.connect.apiKey.placeholder": "APIキー", "provider.connect.apiKey.required": "APIキーが必要です", @@ -129,7 +129,7 @@ export const dict = { "provider.connect.oauth.code.visit.prefix": " ", "provider.connect.oauth.code.visit.link": "このリンク", "provider.connect.oauth.code.visit.suffix": - " にアクセスして認証コードを取得し、アカウントを接続してOpenCodeで{{provider}}モデルを使用してください。", + " にアクセスして認証コードを取得し、アカウントを接続してKiloで{{provider}}モデルを使用してください。", "provider.connect.oauth.code.label": "{{method}} 認証コード", "provider.connect.oauth.code.placeholder": "認証コード", "provider.connect.oauth.code.required": "認証コードが必要です", @@ -137,7 +137,7 @@ export const dict = { "provider.connect.oauth.auto.visit.prefix": " ", "provider.connect.oauth.auto.visit.link": "このリンク", "provider.connect.oauth.auto.visit.suffix": - " にアクセスし、以下のコードを入力してアカウントを接続し、OpenCodeで{{provider}}モデルを使用してください。", + " にアクセスし、以下のコードを入力してアカウントを接続し、Kiloで{{provider}}モデルを使用してください。", "provider.connect.oauth.auto.confirmationCode": "確認コード", "provider.connect.toast.connected.title": "{{provider}}が接続されました", "provider.connect.toast.connected.description": "{{provider}}モデルが使用可能になりました。", @@ -280,7 +280,7 @@ export const dict = { "dialog.directory.search.placeholder": "フォルダを検索", "dialog.directory.empty": "フォルダが見つかりません", "dialog.server.title": "サーバー", - "dialog.server.description": "このアプリが接続するOpenCodeサーバーを切り替えます。", + "dialog.server.description": "このアプリが接続するKiloサーバーを切り替えます。", "dialog.server.search.placeholder": "サーバーを検索", "dialog.server.empty": "サーバーはまだありません", "dialog.server.add.title": "サーバーを追加", @@ -395,7 +395,7 @@ export const dict = { "toast.session.unshare.failed.description": "セッションの共有解除中にエラーが発生しました", "toast.session.listFailed.title": "{{project}}のセッション読み込みに失敗しました", "toast.update.title": "アップデートが利用可能です", - "toast.update.description": "OpenCodeの新しいバージョン ({{version}}) がインストール可能です。", + "toast.update.description": "Kiloの新しいバージョン ({{version}}) がインストール可能です。", "toast.update.action.installRestart": "インストールして再起動", "toast.update.action.notYet": "今はしない", "error.page.title": "問題が発生しました", @@ -405,7 +405,7 @@ export const dict = { "error.page.action.checking": "確認中...", "error.page.action.checkUpdates": "アップデートを確認", "error.page.action.updateTo": "{{version}}にアップデート", - "error.page.report.prefix": "このエラーをOpenCodeチームに報告してください: ", + "error.page.report.prefix": "このエラーをKiloチームに報告してください: ", "error.page.report.discord": "Discord", "error.page.version": "バージョン: {{version}}", "error.dev.rootNotFound": @@ -421,7 +421,7 @@ export const dict = { "error.chain.didYouMean": "もしかして: {{suggestions}}", "error.chain.modelNotFound": "モデルが見つかりません: {{provider}}/{{model}}", "error.chain.checkConfig": "config (opencode.json) のプロバイダー/モデル名を確認してください", - "error.chain.mcpFailed": 'MCPサーバー "{{name}}" が失敗しました。注意: OpenCodeはまだMCP認証をサポートしていません。', + "error.chain.mcpFailed": 'MCPサーバー "{{name}}" が失敗しました。注意: KiloはまだMCP認証をサポートしていません。', "error.chain.providerAuthFailed": "プロバイダー認証に失敗しました ({{provider}}): {{message}}", "error.chain.providerInitFailed": 'プロバイダー "{{provider}}" の初期化に失敗しました。認証情報と設定を確認してください。', @@ -541,19 +541,19 @@ export const dict = { "sidebar.workspaces.enable": "ワークスペースを有効化", "sidebar.workspaces.disable": "ワークスペースを無効化", "sidebar.gettingStarted.title": "はじめに", - "sidebar.gettingStarted.line1": "OpenCodeには無料モデルが含まれているため、すぐに開始できます。", + "sidebar.gettingStarted.line1": "Kiloには無料モデルが含まれているため、すぐに開始できます。", "sidebar.gettingStarted.line2": "プロバイダーを接続して、Claude、GPT、Geminiなどのモデルを使用できます。", "sidebar.project.recentSessions": "最近のセッション", "sidebar.project.viewAllSessions": "すべてのセッションを表示", "sidebar.project.clearNotifications": "通知をクリア", - "app.name.desktop": "OpenCode Desktop", + "app.name.desktop": "Kilo Desktop", "settings.section.desktop": "デスクトップ", "settings.section.server": "サーバー", "settings.tab.general": "一般", "settings.tab.shortcuts": "ショートカット", "settings.desktop.section.wsl": "WSL", "settings.desktop.wsl.title": "WSL連携", - "settings.desktop.wsl.description": "WindowsのWSL環境でOpenCodeサーバーを実行します。", + "settings.desktop.wsl.description": "WindowsのWSL環境でKiloサーバーを実行します。", "settings.general.section.appearance": "外観", "settings.general.section.notifications": "システム通知", "settings.general.section.updates": "アップデート", @@ -561,13 +561,13 @@ export const dict = { "settings.general.section.feed": "フィード", "settings.general.section.display": "ディスプレイ", "settings.general.row.language.title": "言語", - "settings.general.row.language.description": "OpenCodeの表示言語を変更します", + "settings.general.row.language.description": "Kiloの表示言語を変更します", "settings.general.row.appearance.title": "外観", - "settings.general.row.appearance.description": "デバイスでのOpenCodeの表示をカスタマイズします", + "settings.general.row.appearance.description": "デバイスでのKiloの表示をカスタマイズします", "settings.general.row.colorScheme.title": "配色", - "settings.general.row.colorScheme.description": "OpenCodeがシステム、ライト、またはダークテーマに従うかを選択します", + "settings.general.row.colorScheme.description": "Kiloがシステム、ライト、またはダークテーマに従うかを選択します", "settings.general.row.theme.title": "テーマ", - "settings.general.row.theme.description": "OpenCodeのテーマをカスタマイズします。", + "settings.general.row.theme.description": "Kiloのテーマをカスタマイズします。", "settings.general.row.font.title": "コードフォント", "settings.general.row.font.description": "コードブロックで使用するフォントをカスタマイズします", "settings.general.row.terminalFont.title": "Terminal Font", @@ -597,13 +597,13 @@ export const dict = { "settings.general.row.releaseNotes.title": "リリースノート", "settings.general.row.releaseNotes.description": "アップデート後に「新機能」ポップアップを表示", "settings.updates.row.startup.title": "起動時にアップデートを確認", - "settings.updates.row.startup.description": "OpenCode の起動時に自動でアップデートを確認します", + "settings.updates.row.startup.description": "Kilo の起動時に自動でアップデートを確認します", "settings.updates.row.check.title": "アップデートを確認", "settings.updates.row.check.description": "手動でアップデートを確認し、利用可能ならインストールします", "settings.updates.action.checkNow": "今すぐ確認", "settings.updates.action.checking": "確認中...", "settings.updates.toast.latest.title": "最新です", - "settings.updates.toast.latest.description": "OpenCode は最新バージョンです。", + "settings.updates.toast.latest.description": "Kilo は最新バージョンです。", "sound.option.none": "なし", "sound.option.alert01": "アラート 01", "sound.option.alert02": "アラート 02", diff --git a/packages/app/src/i18n/ko.ts b/packages/app/src/i18n/ko.ts index 0218cc1a9e4..234980c1038 100644 --- a/packages/app/src/i18n/ko.ts +++ b/packages/app/src/i18n/ko.ts @@ -105,7 +105,7 @@ export const dict = { "dialog.model.manage": "모델 관리", "dialog.model.manage.description": "모델 선택기에 표시할 모델 사용자 지정", "dialog.model.manage.provider.toggle": "모든 {{provider}} 모델 토글", - "dialog.model.unpaid.freeModels.title": "OpenCode에서 제공하는 무료 모델", + "dialog.model.unpaid.freeModels.title": "Kilo에서 제공하는 무료 모델", "dialog.model.unpaid.addMore.title": "인기 공급자의 모델 추가", "dialog.provider.viewAll": "더 많은 공급자 보기", "provider.connect.title": "{{provider}} 연결", @@ -116,7 +116,7 @@ export const dict = { "provider.connect.status.waiting": "인증 대기 중...", "provider.connect.status.failed": "인증 실패: {{error}}", "provider.connect.apiKey.description": - "{{provider}} API 키를 입력하여 계정을 연결하고 OpenCode에서 {{provider}} 모델을 사용하세요.", + "{{provider}} API 키를 입력하여 계정을 연결하고 Kilo에서 {{provider}} 모델을 사용하세요.", "provider.connect.apiKey.label": "{{provider}} API 키", "provider.connect.apiKey.placeholder": "API 키", "provider.connect.apiKey.required": "API 키가 필요합니다", @@ -129,7 +129,7 @@ export const dict = { "provider.connect.oauth.code.visit.prefix": "다음 ", "provider.connect.oauth.code.visit.link": "이 링크", "provider.connect.oauth.code.visit.suffix": - "를 방문하여 인증 코드를 받아 계정을 연결하고 OpenCode에서 {{provider}} 모델을 사용하세요.", + "를 방문하여 인증 코드를 받아 계정을 연결하고 Kilo에서 {{provider}} 모델을 사용하세요.", "provider.connect.oauth.code.label": "{{method}} 인증 코드", "provider.connect.oauth.code.placeholder": "인증 코드", "provider.connect.oauth.code.required": "인증 코드가 필요합니다", @@ -137,7 +137,7 @@ export const dict = { "provider.connect.oauth.auto.visit.prefix": "다음 ", "provider.connect.oauth.auto.visit.link": "이 링크", "provider.connect.oauth.auto.visit.suffix": - "를 방문하고 아래 코드를 입력하여 계정을 연결하고 OpenCode에서 {{provider}} 모델을 사용하세요.", + "를 방문하고 아래 코드를 입력하여 계정을 연결하고 Kilo에서 {{provider}} 모델을 사용하세요.", "provider.connect.oauth.auto.confirmationCode": "확인 코드", "provider.connect.toast.connected.title": "{{provider}} 연결됨", "provider.connect.toast.connected.description": "이제 {{provider}} 모델을 사용할 수 있습니다.", @@ -280,7 +280,7 @@ export const dict = { "dialog.directory.search.placeholder": "폴더 검색", "dialog.directory.empty": "폴더 없음", "dialog.server.title": "서버", - "dialog.server.description": "이 앱이 연결할 OpenCode 서버를 전환합니다.", + "dialog.server.description": "이 앱이 연결할 Kilo 서버를 전환합니다.", "dialog.server.search.placeholder": "서버 검색", "dialog.server.empty": "서버 없음", "dialog.server.add.title": "서버 추가", @@ -394,7 +394,7 @@ export const dict = { "toast.session.unshare.failed.description": "세션 공유를 해제하는 동안 오류가 발생했습니다", "toast.session.listFailed.title": "{{project}}에 대한 세션을 로드하지 못했습니다", "toast.update.title": "업데이트 가능", - "toast.update.description": "OpenCode의 새 버전({{version}})을 설치할 수 있습니다.", + "toast.update.description": "Kilo의 새 버전({{version}})을 설치할 수 있습니다.", "toast.update.action.installRestart": "설치 및 다시 시작", "toast.update.action.notYet": "나중에", "error.page.title": "문제가 발생했습니다", @@ -404,7 +404,7 @@ export const dict = { "error.page.action.checking": "확인 중...", "error.page.action.checkUpdates": "업데이트 확인", "error.page.action.updateTo": "{{version}} 버전으로 업데이트", - "error.page.report.prefix": "이 오류를 OpenCode 팀에 제보해 주세요: ", + "error.page.report.prefix": "이 오류를 Kilo 팀에 제보해 주세요: ", "error.page.report.discord": "Discord", "error.page.version": "버전: {{version}}", "error.dev.rootNotFound": @@ -420,7 +420,7 @@ export const dict = { "error.chain.didYouMean": "혹시 {{suggestions}}을(를) 의미하셨나요?", "error.chain.modelNotFound": "모델을 찾을 수 없음: {{provider}}/{{model}}", "error.chain.checkConfig": "구성(opencode.json)의 공급자/모델 이름을 확인하세요", - "error.chain.mcpFailed": 'MCP 서버 "{{name}}" 실패. 참고: OpenCode는 아직 MCP 인증을 지원하지 않습니다.', + "error.chain.mcpFailed": 'MCP 서버 "{{name}}" 실패. 참고: Kilo는 아직 MCP 인증을 지원하지 않습니다.', "error.chain.providerAuthFailed": "공급자 인증 실패 ({{provider}}): {{message}}", "error.chain.providerInitFailed": '공급자 "{{provider}}" 초기화 실패. 자격 증명과 구성을 확인하세요.', "error.chain.configJsonInvalid": "{{path}}의 구성 파일이 유효한 JSON(C)가 아닙니다", @@ -538,19 +538,19 @@ export const dict = { "sidebar.workspaces.enable": "작업 공간 활성화", "sidebar.workspaces.disable": "작업 공간 비활성화", "sidebar.gettingStarted.title": "시작하기", - "sidebar.gettingStarted.line1": "OpenCode에는 무료 모델이 포함되어 있어 즉시 시작할 수 있습니다.", + "sidebar.gettingStarted.line1": "Kilo에는 무료 모델이 포함되어 있어 즉시 시작할 수 있습니다.", "sidebar.gettingStarted.line2": "Claude, GPT, Gemini 등을 포함한 모델을 사용하려면 공급자를 연결하세요.", "sidebar.project.recentSessions": "최근 세션", "sidebar.project.viewAllSessions": "모든 세션 보기", "sidebar.project.clearNotifications": "알림 지우기", - "app.name.desktop": "OpenCode Desktop", + "app.name.desktop": "Kilo Desktop", "settings.section.desktop": "데스크톱", "settings.section.server": "서버", "settings.tab.general": "일반", "settings.tab.shortcuts": "단축키", "settings.desktop.section.wsl": "WSL", "settings.desktop.wsl.title": "WSL 통합", - "settings.desktop.wsl.description": "Windows의 WSL 내부에서 OpenCode 서버를 실행합니다.", + "settings.desktop.wsl.description": "Windows의 WSL 내부에서 Kilo 서버를 실행합니다.", "settings.general.section.appearance": "모양", "settings.general.section.notifications": "시스템 알림", "settings.general.section.updates": "업데이트", @@ -558,13 +558,13 @@ export const dict = { "settings.general.section.feed": "피드", "settings.general.section.display": "디스플레이", "settings.general.row.language.title": "언어", - "settings.general.row.language.description": "OpenCode 표시 언어 변경", + "settings.general.row.language.description": "Kilo 표시 언어 변경", "settings.general.row.appearance.title": "모양", - "settings.general.row.appearance.description": "기기에서 OpenCode가 보이는 방식 사용자 지정", + "settings.general.row.appearance.description": "기기에서 Kilo가 보이는 방식 사용자 지정", "settings.general.row.colorScheme.title": "색상 테마", - "settings.general.row.colorScheme.description": "OpenCode가 시스템, 라이트 또는 다크 테마를 따를지 선택하세요", + "settings.general.row.colorScheme.description": "Kilo가 시스템, 라이트 또는 다크 테마를 따를지 선택하세요", "settings.general.row.theme.title": "테마", - "settings.general.row.theme.description": "OpenCode 테마 사용자 지정", + "settings.general.row.theme.description": "Kilo 테마 사용자 지정", "settings.general.row.font.title": "코드 글꼴", "settings.general.row.font.description": "코드 블록에 사용되는 글꼴을 사용자 지정", "settings.general.row.terminalFont.title": "Terminal Font", @@ -593,13 +593,13 @@ export const dict = { "settings.general.row.releaseNotes.title": "릴리스 노트", "settings.general.row.releaseNotes.description": "업데이트 후 '새 소식' 팝업 표시", "settings.updates.row.startup.title": "시작 시 업데이트 확인", - "settings.updates.row.startup.description": "OpenCode를 실행할 때 업데이트를 자동으로 확인합니다", + "settings.updates.row.startup.description": "Kilo를 실행할 때 업데이트를 자동으로 확인합니다", "settings.updates.row.check.title": "업데이트 확인", "settings.updates.row.check.description": "업데이트를 수동으로 확인하고, 사용 가능하면 설치합니다", "settings.updates.action.checkNow": "지금 확인", "settings.updates.action.checking": "확인 중...", "settings.updates.toast.latest.title": "최신 상태입니다", - "settings.updates.toast.latest.description": "현재 최신 버전의 OpenCode를 사용 중입니다.", + "settings.updates.toast.latest.description": "현재 최신 버전의 Kilo를 사용 중입니다.", "sound.option.none": "없음", "sound.option.alert01": "알림 01", "sound.option.alert02": "알림 02", diff --git a/packages/app/src/i18n/no.ts b/packages/app/src/i18n/no.ts index 43aa8442001..0dbf94e347c 100644 --- a/packages/app/src/i18n/no.ts +++ b/packages/app/src/i18n/no.ts @@ -118,7 +118,7 @@ export const dict = { "dialog.model.manage.description": "Tilpass hvilke modeller som vises i modellvelgeren.", "dialog.model.manage.provider.toggle": "Veksle alle {{provider}}-modeller", - "dialog.model.unpaid.freeModels.title": "Gratis modeller levert av OpenCode", + "dialog.model.unpaid.freeModels.title": "Gratis modeller levert av Kilo", "dialog.model.unpaid.addMore.title": "Legg til flere modeller fra populære leverandører", "dialog.provider.viewAll": "Vis flere leverandører", @@ -131,7 +131,7 @@ export const dict = { "provider.connect.status.waiting": "Venter på autorisering...", "provider.connect.status.failed": "Autorisering mislyktes: {{error}}", "provider.connect.apiKey.description": - "Skriv inn din {{provider}} API-nøkkel for å koble til kontoen din og bruke {{provider}}-modeller i OpenCode.", + "Skriv inn din {{provider}} API-nøkkel for å koble til kontoen din og bruke {{provider}}-modeller i Kilo.", "provider.connect.apiKey.label": "{{provider}} API-nøkkel", "provider.connect.apiKey.placeholder": "API-nøkkel", "provider.connect.apiKey.required": "API-nøkkel er påkrevd", @@ -145,7 +145,7 @@ export const dict = { "provider.connect.oauth.code.visit.prefix": "Besøk ", "provider.connect.oauth.code.visit.link": "denne lenken", "provider.connect.oauth.code.visit.suffix": - " for å hente autorisasjonskoden din for å koble til kontoen din og bruke {{provider}}-modeller i OpenCode.", + " for å hente autorisasjonskoden din for å koble til kontoen din og bruke {{provider}}-modeller i Kilo.", "provider.connect.oauth.code.label": "{{method}} autorisasjonskode", "provider.connect.oauth.code.placeholder": "Autorisasjonskode", "provider.connect.oauth.code.required": "Autorisasjonskode er påkrevd", @@ -153,7 +153,7 @@ export const dict = { "provider.connect.oauth.auto.visit.prefix": "Besøk ", "provider.connect.oauth.auto.visit.link": "denne lenken", "provider.connect.oauth.auto.visit.suffix": - " og skriv inn koden nedenfor for å koble til kontoen din og bruke {{provider}}-modeller i OpenCode.", + " og skriv inn koden nedenfor for å koble til kontoen din og bruke {{provider}}-modeller i Kilo.", "provider.connect.oauth.auto.confirmationCode": "Bekreftelseskode", "provider.connect.toast.connected.title": "{{provider}} tilkoblet", "provider.connect.toast.connected.description": "{{provider}}-modeller er nå tilgjengelige.", @@ -310,7 +310,7 @@ export const dict = { "dialog.directory.empty": "Ingen mapper funnet", "dialog.server.title": "Servere", - "dialog.server.description": "Bytt hvilken OpenCode-server denne appen kobler til.", + "dialog.server.description": "Bytt hvilken Kilo-server denne appen kobler til.", "dialog.server.search.placeholder": "Søk etter servere", "dialog.server.empty": "Ingen servere ennå", "dialog.server.add.title": "Legg til en server", @@ -442,7 +442,7 @@ export const dict = { "toast.session.listFailed.title": "Kunne ikke laste sesjoner for {{project}}", "toast.update.title": "Oppdatering tilgjengelig", - "toast.update.description": "En ny versjon av OpenCode ({{version}}) er nå tilgjengelig for installasjon.", + "toast.update.description": "En ny versjon av Kilo ({{version}}) er nå tilgjengelig for installasjon.", "toast.update.action.installRestart": "Installer og start på nytt", "toast.update.action.notYet": "Ikke nå", @@ -453,7 +453,7 @@ export const dict = { "error.page.action.checking": "Sjekker...", "error.page.action.checkUpdates": "Se etter oppdateringer", "error.page.action.updateTo": "Oppdater til {{version}}", - "error.page.report.prefix": "Vennligst rapporter denne feilen til OpenCode-teamet", + "error.page.report.prefix": "Vennligst rapporter denne feilen til Kilo-teamet", "error.page.report.discord": "på Discord", "error.page.version": "Versjon: {{version}}", @@ -472,7 +472,7 @@ export const dict = { "error.chain.didYouMean": "Mente du: {{suggestions}}", "error.chain.modelNotFound": "Modell ikke funnet: {{provider}}/{{model}}", "error.chain.checkConfig": "Sjekk leverandør-/modellnavnene i konfigurasjonen din (opencode.json)", - "error.chain.mcpFailed": 'MCP-server "{{name}}" mislyktes. Merk at OpenCode ikke støtter MCP-autentisering ennå.', + "error.chain.mcpFailed": 'MCP-server "{{name}}" mislyktes. Merk at Kilo ikke støtter MCP-autentisering ennå.', "error.chain.providerAuthFailed": "Leverandørautentisering mislyktes ({{provider}}): {{message}}", "error.chain.providerInitFailed": 'Kunne ikke initialisere leverandør "{{provider}}". Sjekk legitimasjon og konfigurasjon.', @@ -608,13 +608,13 @@ export const dict = { "sidebar.workspaces.enable": "Aktiver arbeidsområder", "sidebar.workspaces.disable": "Deaktiver arbeidsområder", "sidebar.gettingStarted.title": "Kom i gang", - "sidebar.gettingStarted.line1": "OpenCode inkluderer gratis modeller så du kan starte umiddelbart.", + "sidebar.gettingStarted.line1": "Kilo inkluderer gratis modeller så du kan starte umiddelbart.", "sidebar.gettingStarted.line2": "Koble til en leverandør for å bruke modeller, inkl. Claude, GPT, Gemini osv.", "sidebar.project.recentSessions": "Nylige sesjoner", "sidebar.project.viewAllSessions": "Vis alle sesjoner", "sidebar.project.clearNotifications": "Fjern varsler", - "app.name.desktop": "OpenCode Desktop", + "app.name.desktop": "Kilo Desktop", "settings.section.desktop": "Skrivebord", "settings.section.server": "Server", @@ -622,7 +622,7 @@ export const dict = { "settings.tab.shortcuts": "Snarveier", "settings.desktop.section.wsl": "WSL", "settings.desktop.wsl.title": "WSL-integrasjon", - "settings.desktop.wsl.description": "Kjør OpenCode-serveren i WSL på Windows.", + "settings.desktop.wsl.description": "Kjør Kilo-serveren i WSL på Windows.", "settings.general.section.appearance": "Utseende", "settings.general.section.notifications": "Systemvarsler", @@ -632,13 +632,13 @@ export const dict = { "settings.general.section.display": "Skjerm", "settings.general.row.language.title": "Språk", - "settings.general.row.language.description": "Endre visningsspråket for OpenCode", + "settings.general.row.language.description": "Endre visningsspråket for Kilo", "settings.general.row.appearance.title": "Utseende", - "settings.general.row.appearance.description": "Tilpass hvordan OpenCode ser ut på enheten din", + "settings.general.row.appearance.description": "Tilpass hvordan Kilo ser ut på enheten din", "settings.general.row.colorScheme.title": "Fargevalg", - "settings.general.row.colorScheme.description": "Velg om OpenCode skal følge systemets, lyst eller mørkt tema", + "settings.general.row.colorScheme.description": "Velg om Kilo skal følge systemets, lyst eller mørkt tema", "settings.general.row.theme.title": "Tema", - "settings.general.row.theme.description": "Tilpass hvordan OpenCode er tematisert.", + "settings.general.row.theme.description": "Tilpass hvordan Kilo er tematisert.", "settings.general.row.font.title": "Kodefont", "settings.general.row.font.description": "Tilpass skrifttypen som brukes i kodeblokker", "settings.general.row.terminalFont.title": "Terminal Font", @@ -668,13 +668,13 @@ export const dict = { "settings.general.row.releaseNotes.description": 'Vis "Hva er nytt"-vinduer etter oppdateringer', "settings.updates.row.startup.title": "Se etter oppdateringer ved oppstart", - "settings.updates.row.startup.description": "Se automatisk etter oppdateringer når OpenCode starter", + "settings.updates.row.startup.description": "Se automatisk etter oppdateringer når Kilo starter", "settings.updates.row.check.title": "Se etter oppdateringer", "settings.updates.row.check.description": "Se etter oppdateringer manuelt og installer hvis tilgjengelig", "settings.updates.action.checkNow": "Sjekk nå", "settings.updates.action.checking": "Sjekker...", "settings.updates.toast.latest.title": "Du er oppdatert", - "settings.updates.toast.latest.description": "Du bruker den nyeste versjonen av OpenCode.", + "settings.updates.toast.latest.description": "Du bruker den nyeste versjonen av Kilo.", "sound.option.none": "Ingen", "sound.option.alert01": "Varsel 01", "sound.option.alert02": "Varsel 02", diff --git a/packages/app/src/i18n/pl.ts b/packages/app/src/i18n/pl.ts index 6c6d4dddc1a..e0b11074339 100644 --- a/packages/app/src/i18n/pl.ts +++ b/packages/app/src/i18n/pl.ts @@ -105,7 +105,7 @@ export const dict = { "dialog.model.manage": "Zarządzaj modelami", "dialog.model.manage.description": "Dostosuj, które modele pojawiają się w wyborze modelu.", "dialog.model.manage.provider.toggle": "Przełącz wszystkie modele {{provider}}", - "dialog.model.unpaid.freeModels.title": "Darmowe modele dostarczane przez OpenCode", + "dialog.model.unpaid.freeModels.title": "Darmowe modele dostarczane przez Kilo", "dialog.model.unpaid.addMore.title": "Dodaj więcej modeli od popularnych dostawców", "dialog.provider.viewAll": "Zobacz więcej dostawców", "provider.connect.title": "Połącz {{provider}}", @@ -116,7 +116,7 @@ export const dict = { "provider.connect.status.waiting": "Oczekiwanie na autoryzację...", "provider.connect.status.failed": "Autoryzacja nie powiodła się: {{error}}", "provider.connect.apiKey.description": - "Wprowadź swój klucz API {{provider}}, aby połączyć konto i używać modeli {{provider}} w OpenCode.", + "Wprowadź swój klucz API {{provider}}, aby połączyć konto i używać modeli {{provider}} w Kilo.", "provider.connect.apiKey.label": "Klucz API {{provider}}", "provider.connect.apiKey.placeholder": "Klucz API", "provider.connect.apiKey.required": "Klucz API jest wymagany", @@ -130,7 +130,7 @@ export const dict = { "provider.connect.oauth.code.visit.prefix": "Odwiedź ", "provider.connect.oauth.code.visit.link": "ten link", "provider.connect.oauth.code.visit.suffix": - ", aby odebrać kod autoryzacyjny, połączyć konto i używać modeli {{provider}} w OpenCode.", + ", aby odebrać kod autoryzacyjny, połączyć konto i używać modeli {{provider}} w Kilo.", "provider.connect.oauth.code.label": "Kod autoryzacyjny {{method}}", "provider.connect.oauth.code.placeholder": "Kod autoryzacyjny", "provider.connect.oauth.code.required": "Kod autoryzacyjny jest wymagany", @@ -138,7 +138,7 @@ export const dict = { "provider.connect.oauth.auto.visit.prefix": "Odwiedź ", "provider.connect.oauth.auto.visit.link": "ten link", "provider.connect.oauth.auto.visit.suffix": - " i wprowadź poniższy kod, aby połączyć konto i używać modeli {{provider}} w OpenCode.", + " i wprowadź poniższy kod, aby połączyć konto i używać modeli {{provider}} w Kilo.", "provider.connect.oauth.auto.confirmationCode": "Kod potwierdzający", "provider.connect.toast.connected.title": "Połączono {{provider}}", "provider.connect.toast.connected.description": "Modele {{provider}} są teraz dostępne do użycia.", @@ -282,7 +282,7 @@ export const dict = { "dialog.directory.search.placeholder": "Szukaj folderów", "dialog.directory.empty": "Nie znaleziono folderów", "dialog.server.title": "Serwery", - "dialog.server.description": "Przełącz serwer OpenCode, z którym łączy się ta aplikacja.", + "dialog.server.description": "Przełącz serwer Kilo, z którym łączy się ta aplikacja.", "dialog.server.search.placeholder": "Szukaj serwerów", "dialog.server.empty": "Brak serwerów", "dialog.server.add.title": "Dodaj serwer", @@ -396,7 +396,7 @@ export const dict = { "toast.session.unshare.failed.description": "Wystąpił błąd podczas zatrzymywania udostępniania sesji", "toast.session.listFailed.title": "Nie udało się załadować sesji dla {{project}}", "toast.update.title": "Dostępna aktualizacja", - "toast.update.description": "Nowa wersja OpenCode ({{version}}) jest teraz dostępna do instalacji.", + "toast.update.description": "Nowa wersja Kilo ({{version}}) jest teraz dostępna do instalacji.", "toast.update.action.installRestart": "Zainstaluj i zrestartuj", "toast.update.action.notYet": "Jeszcze nie", "error.page.title": "Coś poszło nie tak", @@ -406,7 +406,7 @@ export const dict = { "error.page.action.checking": "Sprawdzanie...", "error.page.action.checkUpdates": "Sprawdź aktualizacje", "error.page.action.updateTo": "Zaktualizuj do {{version}}", - "error.page.report.prefix": "Proszę zgłosić ten błąd do zespołu OpenCode", + "error.page.report.prefix": "Proszę zgłosić ten błąd do zespołu Kilo", "error.page.report.discord": "na Discordzie", "error.page.version": "Wersja: {{version}}", "error.dev.rootNotFound": @@ -422,7 +422,7 @@ export const dict = { "error.chain.didYouMean": "Czy miałeś na myśli: {{suggestions}}", "error.chain.modelNotFound": "Model nie znaleziony: {{provider}}/{{model}}", "error.chain.checkConfig": "Sprawdź swoją konfigurację (opencode.json) nazwy dostawców/modeli", - "error.chain.mcpFailed": 'MCP server "{{name}}" failed. Note, OpenCode does not support MCP authentication yet.', + "error.chain.mcpFailed": 'MCP server "{{name}}" failed. Note, Kilo does not support MCP authentication yet.', "error.chain.providerAuthFailed": "Uwierzytelnianie dostawcy nie powiodło się ({{provider}}): {{message}}", "error.chain.providerInitFailed": 'Nie udało się zainicjować dostawcy "{{provider}}". Sprawdź poświadczenia i konfigurację.', @@ -542,19 +542,19 @@ export const dict = { "sidebar.workspaces.enable": "Włącz przestrzenie robocze", "sidebar.workspaces.disable": "Wyłącz przestrzenie robocze", "sidebar.gettingStarted.title": "Pierwsze kroki", - "sidebar.gettingStarted.line1": "OpenCode zawiera darmowe modele, więc możesz zacząć od razu.", + "sidebar.gettingStarted.line1": "Kilo zawiera darmowe modele, więc możesz zacząć od razu.", "sidebar.gettingStarted.line2": "Połącz dowolnego dostawcę, aby używać modeli, w tym Claude, GPT, Gemini itp.", "sidebar.project.recentSessions": "Ostatnie sesje", "sidebar.project.viewAllSessions": "Zobacz wszystkie sesje", "sidebar.project.clearNotifications": "Wyczyść powiadomienia", - "app.name.desktop": "OpenCode Desktop", + "app.name.desktop": "Kilo Desktop", "settings.section.desktop": "Pulpit", "settings.section.server": "Serwer", "settings.tab.general": "Ogólne", "settings.tab.shortcuts": "Skróty", "settings.desktop.section.wsl": "WSL", "settings.desktop.wsl.title": "WSL integration", - "settings.desktop.wsl.description": "Run the OpenCode server inside WSL on Windows.", + "settings.desktop.wsl.description": "Run the Kilo server inside WSL on Windows.", "settings.general.section.appearance": "Wygląd", "settings.general.section.notifications": "Powiadomienia systemowe", "settings.general.section.updates": "Aktualizacje", @@ -562,14 +562,14 @@ export const dict = { "settings.general.section.feed": "Kanał", "settings.general.section.display": "Ekran", "settings.general.row.language.title": "Język", - "settings.general.row.language.description": "Zmień język wyświetlania dla OpenCode", + "settings.general.row.language.description": "Zmień język wyświetlania dla Kilo", "settings.general.row.appearance.title": "Wygląd", - "settings.general.row.appearance.description": "Dostosuj wygląd OpenCode na swoim urządzeniu", + "settings.general.row.appearance.description": "Dostosuj wygląd Kilo na swoim urządzeniu", "settings.general.row.colorScheme.title": "Schemat kolorów", "settings.general.row.colorScheme.description": - "Wybierz, czy OpenCode ma używać motywu systemowego, jasnego czy ciemnego", + "Wybierz, czy Kilo ma używać motywu systemowego, jasnego czy ciemnego", "settings.general.row.theme.title": "Motyw", - "settings.general.row.theme.description": "Dostosuj motyw OpenCode.", + "settings.general.row.theme.description": "Dostosuj motyw Kilo.", "settings.general.row.font.title": "Czcionka kodu", "settings.general.row.font.description": "Dostosuj czcionkę używaną w blokach kodu", "settings.general.row.terminalFont.title": "Terminal Font", @@ -598,13 +598,13 @@ export const dict = { "settings.general.row.releaseNotes.title": "Informacje o wydaniu", "settings.general.row.releaseNotes.description": 'Pokazuj wyskakujące okna "Co nowego" po aktualizacjach', "settings.updates.row.startup.title": "Sprawdzaj aktualizacje przy uruchomieniu", - "settings.updates.row.startup.description": "Automatycznie sprawdzaj aktualizacje podczas uruchamiania OpenCode", + "settings.updates.row.startup.description": "Automatycznie sprawdzaj aktualizacje podczas uruchamiania Kilo", "settings.updates.row.check.title": "Sprawdź aktualizacje", "settings.updates.row.check.description": "Ręcznie sprawdź aktualizacje i zainstaluj, jeśli są dostępne", "settings.updates.action.checkNow": "Sprawdź teraz", "settings.updates.action.checking": "Sprawdzanie...", "settings.updates.toast.latest.title": "Masz najnowszą wersję", - "settings.updates.toast.latest.description": "Korzystasz z najnowszej wersji OpenCode.", + "settings.updates.toast.latest.description": "Korzystasz z najnowszej wersji Kilo.", "sound.option.none": "Brak", "sound.option.alert01": "Alert 01", "sound.option.alert02": "Alert 02", diff --git a/packages/app/src/i18n/ru.ts b/packages/app/src/i18n/ru.ts index e0b094877a7..7838dcd14be 100644 --- a/packages/app/src/i18n/ru.ts +++ b/packages/app/src/i18n/ru.ts @@ -115,7 +115,7 @@ export const dict = { "dialog.model.manage.description": "Настройте какие модели появляются в выборе модели", "dialog.model.manage.provider.toggle": "Переключить все модели {{provider}}", - "dialog.model.unpaid.freeModels.title": "Бесплатные модели от OpenCode", + "dialog.model.unpaid.freeModels.title": "Бесплатные модели от Kilo", "dialog.model.unpaid.addMore.title": "Добавьте больше моделей от популярных провайдеров", "dialog.provider.viewAll": "Показать больше провайдеров", @@ -128,7 +128,7 @@ export const dict = { "provider.connect.status.waiting": "Ожидание авторизации...", "provider.connect.status.failed": "Ошибка авторизации: {{error}}", "provider.connect.apiKey.description": - "Введите ваш API ключ {{provider}} для подключения аккаунта и использования моделей {{provider}} в OpenCode.", + "Введите ваш API ключ {{provider}} для подключения аккаунта и использования моделей {{provider}} в Kilo.", "provider.connect.apiKey.label": "{{provider}} API ключ", "provider.connect.apiKey.placeholder": "API ключ", "provider.connect.apiKey.required": "API ключ обязателен", @@ -142,7 +142,7 @@ export const dict = { "provider.connect.oauth.code.visit.prefix": "Посетите ", "provider.connect.oauth.code.visit.link": "эту ссылку", "provider.connect.oauth.code.visit.suffix": - " чтобы получить код авторизации для подключения аккаунта и использования моделей {{provider}} в OpenCode.", + " чтобы получить код авторизации для подключения аккаунта и использования моделей {{provider}} в Kilo.", "provider.connect.oauth.code.label": "{{method}} код авторизации", "provider.connect.oauth.code.placeholder": "Код авторизации", "provider.connect.oauth.code.required": "Код авторизации обязателен", @@ -150,7 +150,7 @@ export const dict = { "provider.connect.oauth.auto.visit.prefix": "Посетите ", "provider.connect.oauth.auto.visit.link": "эту ссылку", "provider.connect.oauth.auto.visit.suffix": - " и введите код ниже для подключения аккаунта и использования моделей {{provider}} в OpenCode.", + " и введите код ниже для подключения аккаунта и использования моделей {{provider}} в Kilo.", "provider.connect.oauth.auto.confirmationCode": "Код подтверждения", "provider.connect.toast.connected.title": "{{provider}} подключён", "provider.connect.toast.connected.description": "Модели {{provider}} теперь доступны.", @@ -307,7 +307,7 @@ export const dict = { "dialog.directory.empty": "Папки не найдены", "dialog.server.title": "Серверы", - "dialog.server.description": "Переключите сервер OpenCode к которому подключается приложение.", + "dialog.server.description": "Переключите сервер Kilo к которому подключается приложение.", "dialog.server.search.placeholder": "Поиск серверов", "dialog.server.empty": "Серверов пока нет", "dialog.server.add.title": "Добавить сервер", @@ -440,7 +440,7 @@ export const dict = { "toast.session.listFailed.title": "Не удалось загрузить сессии для {{project}}", "toast.update.title": "Доступно обновление", - "toast.update.description": "Новая версия OpenCode ({{version}}) доступна для установки.", + "toast.update.description": "Новая версия Kilo ({{version}}) доступна для установки.", "toast.update.action.installRestart": "Установить и перезапустить", "toast.update.action.notYet": "Пока нет", @@ -451,7 +451,7 @@ export const dict = { "error.page.action.checking": "Проверка...", "error.page.action.checkUpdates": "Проверить обновления", "error.page.action.updateTo": "Обновить до {{version}}", - "error.page.report.prefix": "Пожалуйста, сообщите об этой ошибке команде OpenCode", + "error.page.report.prefix": "Пожалуйста, сообщите об этой ошибке команде Kilo", "error.page.report.discord": "в Discord", "error.page.version": "Версия: {{version}}", @@ -471,7 +471,7 @@ export const dict = { "error.chain.modelNotFound": "Модель не найдена: {{provider}}/{{model}}", "error.chain.checkConfig": "Проверьте названия провайдера/модели в конфиге (opencode.json)", "error.chain.mcpFailed": - 'MCP сервер "{{name}}" завершился с ошибкой. Обратите внимание, что OpenCode пока не поддерживает MCP авторизацию.', + 'MCP сервер "{{name}}" завершился с ошибкой. Обратите внимание, что Kilo пока не поддерживает MCP авторизацию.', "error.chain.providerAuthFailed": "Ошибка аутентификации провайдера ({{provider}}): {{message}}", "error.chain.providerInitFailed": 'Не удалось инициализировать провайдера "{{provider}}". Проверьте учётные данные и конфигурацию.', @@ -605,21 +605,21 @@ export const dict = { "sidebar.workspaces.enable": "Включить рабочие пространства", "sidebar.workspaces.disable": "Отключить рабочие пространства", "sidebar.gettingStarted.title": "Начало работы", - "sidebar.gettingStarted.line1": "OpenCode включает бесплатные модели, чтобы вы могли начать сразу.", + "sidebar.gettingStarted.line1": "Kilo включает бесплатные модели, чтобы вы могли начать сразу.", "sidebar.gettingStarted.line2": "Подключите любого провайдера для использования моделей, включая Claude, GPT, Gemini и др.", "sidebar.project.recentSessions": "Недавние сессии", "sidebar.project.viewAllSessions": "Посмотреть все сессии", "sidebar.project.clearNotifications": "Очистить уведомления", - "app.name.desktop": "OpenCode Desktop", + "app.name.desktop": "Kilo Desktop", "settings.section.desktop": "Приложение", "settings.section.server": "Сервер", "settings.tab.general": "Основные", "settings.tab.shortcuts": "Горячие клавиши", "settings.desktop.section.wsl": "WSL", "settings.desktop.wsl.title": "Интеграция с WSL", - "settings.desktop.wsl.description": "Запускать сервер OpenCode внутри WSL на Windows.", + "settings.desktop.wsl.description": "Запускать сервер Kilo внутри WSL на Windows.", "settings.general.section.appearance": "Внешний вид", "settings.general.section.notifications": "Системные уведомления", @@ -629,13 +629,13 @@ export const dict = { "settings.general.section.display": "Дисплей", "settings.general.row.language.title": "Язык", - "settings.general.row.language.description": "Изменить язык отображения OpenCode", + "settings.general.row.language.description": "Изменить язык отображения Kilo", "settings.general.row.appearance.title": "Внешний вид", - "settings.general.row.appearance.description": "Настройте как OpenCode выглядит на вашем устройстве", + "settings.general.row.appearance.description": "Настройте как Kilo выглядит на вашем устройстве", "settings.general.row.colorScheme.title": "Цветовая схема", - "settings.general.row.colorScheme.description": "Выберите, следует ли OpenCode системной, светлой или тёмной теме", + "settings.general.row.colorScheme.description": "Выберите, следует ли Kilo системной, светлой или тёмной теме", "settings.general.row.theme.title": "Тема", - "settings.general.row.theme.description": "Настройте оформление OpenCode.", + "settings.general.row.theme.description": "Настройте оформление Kilo.", "settings.general.row.font.title": "Шрифт кода", "settings.general.row.font.description": "Настройте шрифт, используемый в блоках кода", "settings.general.row.terminalFont.title": "Terminal Font", @@ -668,13 +668,13 @@ export const dict = { "settings.general.row.releaseNotes.description": 'Показывать всплывающие окна "Что нового" после обновлений', "settings.updates.row.startup.title": "Проверять обновления при запуске", - "settings.updates.row.startup.description": "Автоматически проверять обновления при запуске OpenCode", + "settings.updates.row.startup.description": "Автоматически проверять обновления при запуске Kilo", "settings.updates.row.check.title": "Проверить обновления", "settings.updates.row.check.description": "Проверить обновления вручную и установить, если доступны", "settings.updates.action.checkNow": "Проверить сейчас", "settings.updates.action.checking": "Проверка...", "settings.updates.toast.latest.title": "У вас последняя версия", - "settings.updates.toast.latest.description": "Вы используете последнюю версию OpenCode.", + "settings.updates.toast.latest.description": "Вы используете последнюю версию Kilo.", "sound.option.none": "Нет", "sound.option.alert01": "Alert 01", "sound.option.alert02": "Alert 02", diff --git a/packages/app/src/i18n/th.ts b/packages/app/src/i18n/th.ts index 8a15f29c0b0..90f33affd5b 100644 --- a/packages/app/src/i18n/th.ts +++ b/packages/app/src/i18n/th.ts @@ -115,7 +115,7 @@ export const dict = { "dialog.model.manage.description": "ปรับแต่งโมเดลที่จะปรากฏในตัวเลือกโมเดล", "dialog.model.manage.provider.toggle": "สลับโมเดลทั้งหมดของ {{provider}}", - "dialog.model.unpaid.freeModels.title": "โมเดลฟรีที่จัดหาให้โดย OpenCode", + "dialog.model.unpaid.freeModels.title": "โมเดลฟรีที่จัดหาให้โดย Kilo", "dialog.model.unpaid.addMore.title": "เพิ่มโมเดลเพิ่มเติมจากผู้ให้บริการยอดนิยม", "dialog.provider.viewAll": "แสดงผู้ให้บริการเพิ่มเติม", @@ -128,7 +128,7 @@ export const dict = { "provider.connect.status.waiting": "รอการอนุญาต...", "provider.connect.status.failed": "การอนุญาตล้มเหลว: {{error}}", "provider.connect.apiKey.description": - "ป้อนคีย์ API ของ {{provider}} เพื่อเชื่อมต่อบัญชีและใช้โมเดล {{provider}} ใน OpenCode", + "ป้อนคีย์ API ของ {{provider}} เพื่อเชื่อมต่อบัญชีและใช้โมเดล {{provider}} ใน Kilo", "provider.connect.apiKey.label": "คีย์ API ของ {{provider}}", "provider.connect.apiKey.placeholder": "คีย์ API", "provider.connect.apiKey.required": "ต้องใช้คีย์ API", @@ -142,7 +142,7 @@ export const dict = { "provider.connect.oauth.code.visit.prefix": "เยี่ยมชม ", "provider.connect.oauth.code.visit.link": "ลิงก์นี้", "provider.connect.oauth.code.visit.suffix": - " เพื่อรวบรวมรหัสการอนุญาตของคุณเพื่อเชื่อมต่อบัญชีและใช้โมเดล {{provider}} ใน OpenCode", + " เพื่อรวบรวมรหัสการอนุญาตของคุณเพื่อเชื่อมต่อบัญชีและใช้โมเดล {{provider}} ใน Kilo", "provider.connect.oauth.code.label": "รหัสการอนุญาต {{method}}", "provider.connect.oauth.code.placeholder": "รหัสการอนุญาต", "provider.connect.oauth.code.required": "ต้องใช้รหัสการอนุญาต", @@ -150,7 +150,7 @@ export const dict = { "provider.connect.oauth.auto.visit.prefix": "เยี่ยมชม ", "provider.connect.oauth.auto.visit.link": "ลิงก์นี้", "provider.connect.oauth.auto.visit.suffix": - " และป้อนรหัสด้านล่างเพื่อเชื่อมต่อบัญชีและใช้โมเดล {{provider}} ใน OpenCode", + " และป้อนรหัสด้านล่างเพื่อเชื่อมต่อบัญชีและใช้โมเดล {{provider}} ใน Kilo", "provider.connect.oauth.auto.confirmationCode": "รหัสยืนยัน", "provider.connect.toast.connected.title": "{{provider}} ที่เชื่อมต่อแล้ว", "provider.connect.toast.connected.description": "โมเดล {{provider}} พร้อมใช้งานแล้ว", @@ -307,7 +307,7 @@ export const dict = { "dialog.directory.empty": "ไม่พบโฟลเดอร์", "dialog.server.title": "เซิร์ฟเวอร์", - "dialog.server.description": "สลับเซิร์ฟเวอร์ OpenCode ที่แอปนี้เชื่อมต่อด้วย", + "dialog.server.description": "สลับเซิร์ฟเวอร์ Kilo ที่แอปนี้เชื่อมต่อด้วย", "dialog.server.search.placeholder": "ค้นหาเซิร์ฟเวอร์", "dialog.server.empty": "ยังไม่มีเซิร์ฟเวอร์", "dialog.server.add.title": "เพิ่มเซิร์ฟเวอร์", @@ -439,7 +439,7 @@ export const dict = { "toast.session.listFailed.title": "ไม่สามารถโหลดเซสชันสำหรับ {{project}}", "toast.update.title": "มีการอัปเดต", - "toast.update.description": "เวอร์ชันใหม่ของ OpenCode ({{version}}) พร้อมใช้งานสำหรับติดตั้ง", + "toast.update.description": "เวอร์ชันใหม่ของ Kilo ({{version}}) พร้อมใช้งานสำหรับติดตั้ง", "toast.update.action.installRestart": "ติดตั้งและรีสตาร์ท", "toast.update.action.notYet": "ยังไม่", @@ -450,7 +450,7 @@ export const dict = { "error.page.action.checking": "กำลังตรวจสอบ...", "error.page.action.checkUpdates": "ตรวจสอบการอัปเดต", "error.page.action.updateTo": "อัปเดตเป็น {{version}}", - "error.page.report.prefix": "โปรดรายงานข้อผิดพลาดนี้ให้ทีม OpenCode", + "error.page.report.prefix": "โปรดรายงานข้อผิดพลาดนี้ให้ทีม Kilo", "error.page.report.discord": "บน Discord", "error.page.version": "เวอร์ชัน: {{version}}", @@ -468,7 +468,7 @@ export const dict = { "error.chain.didYouMean": "คุณหมายถึง: {{suggestions}}", "error.chain.modelNotFound": "ไม่พบโมเดล: {{provider}}/{{model}}", "error.chain.checkConfig": "ตรวจสอบการกำหนดค่าของคุณ (opencode.json) ชื่อผู้ให้บริการ/โมเดล", - "error.chain.mcpFailed": 'เซิร์ฟเวอร์ MCP "{{name}}" ล้มเหลว โปรดทราบว่า OpenCode ยังไม่รองรับการตรวจสอบสิทธิ์ MCP', + "error.chain.mcpFailed": 'เซิร์ฟเวอร์ MCP "{{name}}" ล้มเหลว โปรดทราบว่า Kilo ยังไม่รองรับการตรวจสอบสิทธิ์ MCP', "error.chain.providerAuthFailed": "การตรวจสอบสิทธิ์ผู้ให้บริการล้มเหลว ({{provider}}): {{message}}", "error.chain.providerInitFailed": 'ไม่สามารถเริ่มต้นผู้ให้บริการ "{{provider}}" ตรวจสอบข้อมูลรับรองและการกำหนดค่า', "error.chain.configJsonInvalid": "ไฟล์กำหนดค่าที่ {{path}} ไม่ใช่ JSON(C) ที่ถูกต้อง", @@ -599,13 +599,13 @@ export const dict = { "sidebar.workspaces.enable": "เปิดใช้งานพื้นที่ทำงาน", "sidebar.workspaces.disable": "ปิดใช้งานพื้นที่ทำงาน", "sidebar.gettingStarted.title": "เริ่มต้นใช้งาน", - "sidebar.gettingStarted.line1": "OpenCode รวมถึงโมเดลฟรีเพื่อให้คุณเริ่มต้นได้ทันที", + "sidebar.gettingStarted.line1": "Kilo รวมถึงโมเดลฟรีเพื่อให้คุณเริ่มต้นได้ทันที", "sidebar.gettingStarted.line2": "เชื่อมต่อผู้ให้บริการใด ๆ เพื่อใช้โมเดล รวมถึง Claude, GPT, Gemini ฯลฯ", "sidebar.project.recentSessions": "เซสชันล่าสุด", "sidebar.project.viewAllSessions": "ดูเซสชันทั้งหมด", "sidebar.project.clearNotifications": "ล้างการแจ้งเตือน", - "app.name.desktop": "OpenCode Desktop", + "app.name.desktop": "Kilo Desktop", "settings.section.desktop": "เดสก์ท็อป", "settings.section.server": "เซิร์ฟเวอร์", @@ -613,7 +613,7 @@ export const dict = { "settings.tab.shortcuts": "ทางลัด", "settings.desktop.section.wsl": "WSL", "settings.desktop.wsl.title": "การรวม WSL", - "settings.desktop.wsl.description": "เรียกใช้เซิร์ฟเวอร์ OpenCode ภายใน WSL บน Windows", + "settings.desktop.wsl.description": "เรียกใช้เซิร์ฟเวอร์ Kilo ภายใน WSL บน Windows", "settings.general.section.appearance": "รูปลักษณ์", "settings.general.section.notifications": "การแจ้งเตือนระบบ", @@ -623,13 +623,13 @@ export const dict = { "settings.general.section.display": "การแสดงผล", "settings.general.row.language.title": "ภาษา", - "settings.general.row.language.description": "เปลี่ยนภาษาที่แสดงสำหรับ OpenCode", + "settings.general.row.language.description": "เปลี่ยนภาษาที่แสดงสำหรับ Kilo", "settings.general.row.appearance.title": "รูปลักษณ์", - "settings.general.row.appearance.description": "ปรับแต่งวิธีการที่ OpenCode มีลักษณะบนอุปกรณ์ของคุณ", + "settings.general.row.appearance.description": "ปรับแต่งวิธีการที่ Kilo มีลักษณะบนอุปกรณ์ของคุณ", "settings.general.row.colorScheme.title": "โทนสี", - "settings.general.row.colorScheme.description": "เลือกว่าจะให้ OpenCode ใช้ธีมตามระบบ สว่าง หรือมืด", + "settings.general.row.colorScheme.description": "เลือกว่าจะให้ Kilo ใช้ธีมตามระบบ สว่าง หรือมืด", "settings.general.row.theme.title": "ธีม", - "settings.general.row.theme.description": "ปรับแต่งวิธีการที่ OpenCode มีธีม", + "settings.general.row.theme.description": "ปรับแต่งวิธีการที่ Kilo มีธีม", "settings.general.row.font.title": "ฟอนต์โค้ด", "settings.general.row.font.description": "ปรับแต่งฟอนต์ที่ใช้ในบล็อกโค้ด", "settings.general.row.terminalFont.title": "Terminal Font", @@ -658,13 +658,13 @@ export const dict = { "settings.general.row.releaseNotes.description": "แสดงป๊อปอัพ What's New หลังจากอัปเดต", "settings.updates.row.startup.title": "ตรวจสอบการอัปเดตเมื่อเริ่มต้น", - "settings.updates.row.startup.description": "ตรวจสอบการอัปเดตโดยอัตโนมัติเมื่อ OpenCode เปิดใช้งาน", + "settings.updates.row.startup.description": "ตรวจสอบการอัปเดตโดยอัตโนมัติเมื่อ Kilo เปิดใช้งาน", "settings.updates.row.check.title": "ตรวจสอบการอัปเดต", "settings.updates.row.check.description": "ตรวจสอบการอัปเดตด้วยตนเองและติดตั้งหากมี", "settings.updates.action.checkNow": "ตรวจสอบทันที", "settings.updates.action.checking": "กำลังตรวจสอบ...", "settings.updates.toast.latest.title": "คุณเป็นเวอร์ชันล่าสุดแล้ว", - "settings.updates.toast.latest.description": "คุณกำลังใช้งาน OpenCode เวอร์ชันล่าสุด", + "settings.updates.toast.latest.description": "คุณกำลังใช้งาน Kilo เวอร์ชันล่าสุด", "sound.option.none": "ไม่มี", "sound.option.alert01": "เสียงเตือน 01", diff --git a/packages/app/src/i18n/tr.ts b/packages/app/src/i18n/tr.ts index f20c05000de..267307ecd23 100644 --- a/packages/app/src/i18n/tr.ts +++ b/packages/app/src/i18n/tr.ts @@ -119,7 +119,7 @@ export const dict = { "dialog.model.manage.description": "Model seçicide hangi modellerin görüneceğini özelleştirin.", "dialog.model.manage.provider.toggle": "Tüm {{provider}} modellerini aç/kapat", - "dialog.model.unpaid.freeModels.title": "OpenCode tarafından sunulan ücretsiz modeller", + "dialog.model.unpaid.freeModels.title": "Kilo tarafından sunulan ücretsiz modeller", "dialog.model.unpaid.addMore.title": "Popüler sağlayıcılardan daha fazla model ekleyin", "dialog.provider.viewAll": "Daha fazla sağlayıcı göster", @@ -132,7 +132,7 @@ export const dict = { "provider.connect.status.waiting": "Yetkilendirme bekleniyor...", "provider.connect.status.failed": "Yetkilendirme başarısız: {{error}}", "provider.connect.apiKey.description": - "{{provider}} hesabınızı bağlamak ve OpenCode'da {{provider}} modellerini kullanmak için {{provider}} API anahtarınızı girin.", + "{{provider}} hesabınızı bağlamak ve Kilo'da {{provider}} modellerini kullanmak için {{provider}} API anahtarınızı girin.", "provider.connect.apiKey.label": "{{provider}} API anahtarı", "provider.connect.apiKey.placeholder": "API anahtarı", "provider.connect.apiKey.required": "API anahtarı gerekli", @@ -144,7 +144,7 @@ export const dict = { "provider.connect.opencodeZen.visit.link": "opencode.ai/zen", "provider.connect.opencodeZen.visit.suffix": " adresini ziyaret ederek API anahtarınızı alın.", "provider.connect.oauth.code.visit.prefix": - "Hesabınızı bağlamak ve OpenCode'da {{provider}} modellerini kullanmak için ", + "Hesabınızı bağlamak ve Kilo'da {{provider}} modellerini kullanmak için ", "provider.connect.oauth.code.visit.link": "bu bağlantıya", "provider.connect.oauth.code.visit.suffix": " tıklayarak yetkilendirme kodunuzu alın.", "provider.connect.oauth.code.label": "{{method}} yetkilendirme kodu", @@ -154,7 +154,7 @@ export const dict = { "provider.connect.oauth.auto.visit.prefix": "", "provider.connect.oauth.auto.visit.link": "Bu bağlantıya", "provider.connect.oauth.auto.visit.suffix": - " tıklayarak aşağıdaki kodu girin ve hesabınızı bağlayarak OpenCode'da {{provider}} modellerini kullanın.", + " tıklayarak aşağıdaki kodu girin ve hesabınızı bağlayarak Kilo'da {{provider}} modellerini kullanın.", "provider.connect.oauth.auto.confirmationCode": "Onay kodu", "provider.connect.toast.connected.title": "{{provider}} bağlandı", "provider.connect.toast.connected.description": "{{provider}} modelleri artık kullanımda.", @@ -312,7 +312,7 @@ export const dict = { "dialog.directory.empty": "Klasör bulunamadı", "dialog.server.title": "Sunucular", - "dialog.server.description": "Bu uygulamanın hangi OpenCode sunucusuna bağlanacağını değiştirin.", + "dialog.server.description": "Bu uygulamanın hangi Kilo sunucusuna bağlanacağını değiştirin.", "dialog.server.search.placeholder": "Sunucu ara", "dialog.server.empty": "Henüz sunucu yok", "dialog.server.add.title": "Sunucu ekle", @@ -444,7 +444,7 @@ export const dict = { "toast.session.listFailed.title": "{{project}} için oturumlar yüklenemedi", "toast.update.title": "Güncelleme mevcut", - "toast.update.description": "OpenCode'un yeni bir sürümü ({{version}}) yüklemeye hazır.", + "toast.update.description": "Kilo'un yeni bir sürümü ({{version}}) yüklemeye hazır.", "toast.update.action.installRestart": "Yükle ve yeniden başlat", "toast.update.action.notYet": "Şimdi değil", @@ -455,7 +455,7 @@ export const dict = { "error.page.action.checking": "Kontrol ediliyor...", "error.page.action.checkUpdates": "Güncellemeleri kontrol et", "error.page.action.updateTo": "{{version}} sürümüne güncelle", - "error.page.report.prefix": "Lütfen bu hatayı OpenCode ekibine bildirin", + "error.page.report.prefix": "Lütfen bu hatayı Kilo ekibine bildirin", "error.page.report.discord": "Discord üzerinden", "error.page.version": "Sürüm: {{version}}", @@ -475,7 +475,7 @@ export const dict = { "error.chain.modelNotFound": "Model bulunamadı: {{provider}}/{{model}}", "error.chain.checkConfig": "Yapılandırma dosyanızı (opencode.json) sağlayıcı/model adlarını kontrol edin", "error.chain.mcpFailed": - 'MCP sunucusu "{{name}}" başarısız oldu. Not: OpenCode henüz MCP kimlik doğrulamasını desteklemiyor.', + 'MCP sunucusu "{{name}}" başarısız oldu. Not: Kilo henüz MCP kimlik doğrulamasını desteklemiyor.', "error.chain.providerAuthFailed": "Sağlayıcı kimlik doğrulaması başarısız ({{provider}}): {{message}}", "error.chain.providerInitFailed": '"{{provider}}" sağlayıcısı başlatılamadı. Kimlik bilgilerini ve yapılandırmayı kontrol edin.', @@ -611,13 +611,13 @@ export const dict = { "sidebar.workspaces.enable": "Çalışma alanlarını etkinleştir", "sidebar.workspaces.disable": "Çalışma alanlarını devre dışı bırak", "sidebar.gettingStarted.title": "Başlarken", - "sidebar.gettingStarted.line1": "OpenCode ücretsiz modeller içerir, böylece hemen başlayabilirsiniz.", + "sidebar.gettingStarted.line1": "Kilo ücretsiz modeller içerir, böylece hemen başlayabilirsiniz.", "sidebar.gettingStarted.line2": "Claude, GPT, Gemini vb. modelleri kullanmak için herhangi bir sağlayıcı bağlayın.", "sidebar.project.recentSessions": "Son oturumlar", "sidebar.project.viewAllSessions": "Tüm oturumları görüntüle", "sidebar.project.clearNotifications": "Bildirimleri temizle", - "app.name.desktop": "OpenCode Masaüstü", + "app.name.desktop": "Kilo Masaüstü", "settings.section.desktop": "Masaüstü", "settings.section.server": "Sunucu", @@ -625,7 +625,7 @@ export const dict = { "settings.tab.shortcuts": "Kısayollar", "settings.desktop.section.wsl": "WSL", "settings.desktop.wsl.title": "WSL entegrasyonu", - "settings.desktop.wsl.description": "OpenCode sunucusunu Windows'ta WSL içinde çalıştırın.", + "settings.desktop.wsl.description": "Kilo sunucusunu Windows'ta WSL içinde çalıştırın.", "settings.general.section.appearance": "Görünüm", "settings.general.section.notifications": "Sistem bildirimleri", @@ -635,14 +635,14 @@ export const dict = { "settings.general.section.display": "Ekran", "settings.general.row.language.title": "Dil", - "settings.general.row.language.description": "OpenCode'un görünüm dilini değiştirin", + "settings.general.row.language.description": "Kilo'un görünüm dilini değiştirin", "settings.general.row.appearance.title": "Görünüm", - "settings.general.row.appearance.description": "OpenCode'un cihazınızdaki görünümünü özelleştirin", + "settings.general.row.appearance.description": "Kilo'un cihazınızdaki görünümünü özelleştirin", "settings.general.row.colorScheme.title": "Renk şeması", "settings.general.row.colorScheme.description": - "OpenCode'un sistem, açık veya koyu temayı takip etip etmeyeceğini seçin", + "Kilo'un sistem, açık veya koyu temayı takip etip etmeyeceğini seçin", "settings.general.row.theme.title": "Tema", - "settings.general.row.theme.description": "OpenCode'un temasını özelleştirin.", + "settings.general.row.theme.description": "Kilo'un temasını özelleştirin.", "settings.general.row.font.title": "Kod Yazı Tipi", "settings.general.row.font.description": "Kod bloklarında kullanılan yazı tipini özelleştirin", "settings.general.row.terminalFont.title": "Terminal Font", @@ -677,13 +677,13 @@ export const dict = { "settings.general.row.releaseNotes.description": "Güncellemelerden sonra Yenilikler bildirimlerini göster", "settings.updates.row.startup.title": "Başlangıçta güncellemeleri kontrol et", - "settings.updates.row.startup.description": "OpenCode başladığında otomatik güncelleme kontrolü yap", + "settings.updates.row.startup.description": "Kilo başladığında otomatik güncelleme kontrolü yap", "settings.updates.row.check.title": "Güncellemeleri kontrol et", "settings.updates.row.check.description": "Elle güncelleme kontrolü yap ve varsa yükle", "settings.updates.action.checkNow": "Şimdi kontrol et", "settings.updates.action.checking": "Kontrol ediliyor...", "settings.updates.toast.latest.title": "Güncelsiniz", - "settings.updates.toast.latest.description": "OpenCode'un en son sürümünü kullanıyorsunuz.", + "settings.updates.toast.latest.description": "Kilo'un en son sürümünü kullanıyorsunuz.", "sound.option.none": "Yok", "sound.option.alert01": "Uyarı 01", diff --git a/packages/app/src/i18n/zh.ts b/packages/app/src/i18n/zh.ts index 05310df9653..7c54b6d60bc 100644 --- a/packages/app/src/i18n/zh.ts +++ b/packages/app/src/i18n/zh.ts @@ -141,7 +141,7 @@ export const dict = { "dialog.model.manage": "管理模型", "dialog.model.manage.description": "自定义模型选择器中显示的模型。", "dialog.model.manage.provider.toggle": "切换所有 {{provider}} 模型", - "dialog.model.unpaid.freeModels.title": "OpenCode 提供的免费模型", + "dialog.model.unpaid.freeModels.title": "Kilo 提供的免费模型", "dialog.model.unpaid.addMore.title": "从热门提供商添加更多模型", "dialog.provider.viewAll": "查看更多提供商", @@ -154,7 +154,7 @@ export const dict = { "provider.connect.status.waiting": "等待授权...", "provider.connect.status.failed": "授权失败:{{error}}", "provider.connect.apiKey.description": - "输入你的 {{provider}} API 密钥以连接帐户,并在 OpenCode 中使用 {{provider}} 模型。", + "输入你的 {{provider}} API 密钥以连接帐户,并在 Kilo 中使用 {{provider}} 模型。", "provider.connect.apiKey.label": "{{provider}} API 密钥", "provider.connect.apiKey.placeholder": "API 密钥", "provider.connect.apiKey.required": "API 密钥为必填项", @@ -165,14 +165,14 @@ export const dict = { "provider.connect.opencodeZen.visit.suffix": " 获取你的 API 密钥。", "provider.connect.oauth.code.visit.prefix": "访问 ", "provider.connect.oauth.code.visit.link": "此链接", - "provider.connect.oauth.code.visit.suffix": " 获取授权码,以连接你的帐户并在 OpenCode 中使用 {{provider}} 模型。", + "provider.connect.oauth.code.visit.suffix": " 获取授权码,以连接你的帐户并在 Kilo 中使用 {{provider}} 模型。", "provider.connect.oauth.code.label": "{{method}} 授权码", "provider.connect.oauth.code.placeholder": "授权码", "provider.connect.oauth.code.required": "授权码为必填项", "provider.connect.oauth.code.invalid": "授权码无效", "provider.connect.oauth.auto.visit.prefix": "访问 ", "provider.connect.oauth.auto.visit.link": "此链接", - "provider.connect.oauth.auto.visit.suffix": " 并输入以下代码,以连接你的帐户并在 OpenCode 中使用 {{provider}} 模型。", + "provider.connect.oauth.auto.visit.suffix": " 并输入以下代码,以连接你的帐户并在 Kilo 中使用 {{provider}} 模型。", "provider.connect.oauth.auto.confirmationCode": "确认码", "provider.connect.toast.connected.title": "{{provider}} 已连接", "provider.connect.toast.connected.description": "现在可以使用 {{provider}} 模型了。", @@ -327,7 +327,7 @@ export const dict = { "dialog.directory.empty": "未找到文件夹", "dialog.server.title": "服务器", - "dialog.server.description": "切换此应用连接的 OpenCode 服务器。", + "dialog.server.description": "切换此应用连接的 Kilo 服务器。", "dialog.server.search.placeholder": "搜索服务器", "dialog.server.empty": "暂无服务器", "dialog.server.add.title": "添加服务器", @@ -444,7 +444,7 @@ export const dict = { "toast.session.unshare.failed.description": "取消分享会话时发生错误", "toast.session.listFailed.title": "无法加载 {{project}} 的会话", "toast.update.title": "有可用更新", - "toast.update.description": "OpenCode 有新版本 ({{version}}) 可安装。", + "toast.update.description": "Kilo 有新版本 ({{version}}) 可安装。", "toast.update.action.installRestart": "安装并重启", "toast.update.action.notYet": "稍后", @@ -455,7 +455,7 @@ export const dict = { "error.page.action.checking": "检查中...", "error.page.action.checkUpdates": "检查更新", "error.page.action.updateTo": "更新到 {{version}}", - "error.page.report.prefix": "请将此错误报告给 OpenCode 团队", + "error.page.report.prefix": "请将此错误报告给 Kilo 团队", "error.page.report.discord": "在 Discord 上", "error.page.version": "版本:{{version}}", "error.dev.rootNotFound": "未找到根元素。你是不是忘了把它添加到 index.html?或者 id 属性拼写错了?", @@ -472,7 +472,7 @@ export const dict = { "error.chain.didYouMean": "你是不是想输入:{{suggestions}}", "error.chain.modelNotFound": "未找到模型:{{provider}}/{{model}}", "error.chain.checkConfig": "请检查你的配置 (opencode.json) 中的 provider/model 名称", - "error.chain.mcpFailed": 'MCP 服务器 "{{name}}" 启动失败。注意: OpenCode 暂不支持 MCP 认证。', + "error.chain.mcpFailed": 'MCP 服务器 "{{name}}" 启动失败。注意: Kilo 暂不支持 MCP 认证。', "error.chain.providerAuthFailed": "提供商认证失败({{provider}}):{{message}}", "error.chain.providerInitFailed": '无法初始化提供商 "{{provider}}"。请检查凭据和配置。', "error.chain.configJsonInvalid": "配置文件 {{path}} 不是有效的 JSON(C)", @@ -598,13 +598,13 @@ export const dict = { "sidebar.workspaces.enable": "启用工作区", "sidebar.workspaces.disable": "禁用工作区", "sidebar.gettingStarted.title": "入门", - "sidebar.gettingStarted.line1": "OpenCode 提供免费模型,你可以立即开始使用。", + "sidebar.gettingStarted.line1": "Kilo 提供免费模型,你可以立即开始使用。", "sidebar.gettingStarted.line2": "连接任意提供商即可使用更多模型,如 Claude、GPT、Gemini 等。", "sidebar.project.recentSessions": "最近会话", "sidebar.project.viewAllSessions": "查看全部会话", "sidebar.project.clearNotifications": "清除通知", - "app.name.desktop": "OpenCode Desktop", + "app.name.desktop": "Kilo Desktop", "settings.section.desktop": "桌面", "settings.section.server": "服务器", @@ -614,7 +614,7 @@ export const dict = { "settings.desktop.section.wsl": "WSL", "settings.desktop.wsl.title": "WSL 集成", - "settings.desktop.wsl.description": "在 Windows 的 WSL 环境中运行 OpenCode 服务器。", + "settings.desktop.wsl.description": "在 Windows 的 WSL 环境中运行 Kilo 服务器。", "settings.general.section.appearance": "外观", "settings.general.section.notifications": "系统通知", @@ -623,13 +623,13 @@ export const dict = { "settings.general.section.feed": "动态", "settings.general.section.display": "显示", "settings.general.row.language.title": "语言", - "settings.general.row.language.description": "更改 OpenCode 的显示语言", + "settings.general.row.language.description": "更改 Kilo 的显示语言", "settings.general.row.appearance.title": "外观", - "settings.general.row.appearance.description": "自定义 OpenCode 在你的设备上的外观", + "settings.general.row.appearance.description": "自定义 Kilo 在你的设备上的外观", "settings.general.row.colorScheme.title": "配色方案", - "settings.general.row.colorScheme.description": "选择 OpenCode 跟随系统、浅色或深色主题", + "settings.general.row.colorScheme.description": "选择 Kilo 跟随系统、浅色或深色主题", "settings.general.row.theme.title": "主题", - "settings.general.row.theme.description": "自定义 OpenCode 的主题。", + "settings.general.row.theme.description": "自定义 Kilo 的主题。", "settings.general.row.font.title": "代码字体", "settings.general.row.font.description": "自定义代码块使用的字体", "settings.general.row.terminalFont.title": "Terminal Font", @@ -655,13 +655,13 @@ export const dict = { "settings.general.row.releaseNotes.description": "更新后显示“新功能”弹窗", "settings.updates.row.startup.title": "启动时检查更新", - "settings.updates.row.startup.description": "在 OpenCode 启动时自动检查更新", + "settings.updates.row.startup.description": "在 Kilo 启动时自动检查更新", "settings.updates.row.check.title": "检查更新", "settings.updates.row.check.description": "手动检查更新并在有更新时安装", "settings.updates.action.checkNow": "立即检查", "settings.updates.action.checking": "正在检查...", "settings.updates.toast.latest.title": "已是最新版本", - "settings.updates.toast.latest.description": "你正在使用最新版本的 OpenCode。", + "settings.updates.toast.latest.description": "你正在使用最新版本的 Kilo。", "sound.option.none": "无", "sound.option.alert01": "警报 01", diff --git a/packages/app/src/i18n/zht.ts b/packages/app/src/i18n/zht.ts index 43681c77930..1cc5cb521f8 100644 --- a/packages/app/src/i18n/zht.ts +++ b/packages/app/src/i18n/zht.ts @@ -119,7 +119,7 @@ export const dict = { "dialog.model.manage.description": "自訂模型選擇器中顯示的模型。", "dialog.model.manage.provider.toggle": "切換所有 {{provider}} 模型", - "dialog.model.unpaid.freeModels.title": "OpenCode 提供的免費模型", + "dialog.model.unpaid.freeModels.title": "Kilo 提供的免費模型", "dialog.model.unpaid.addMore.title": "從熱門提供者新增更多模型", "dialog.provider.viewAll": "查看更多提供者", @@ -132,7 +132,7 @@ export const dict = { "provider.connect.status.waiting": "等待授權...", "provider.connect.status.failed": "授權失敗: {{error}}", "provider.connect.apiKey.description": - "輸入你的 {{provider}} API 金鑰以連線帳戶,並在 OpenCode 中使用 {{provider}} 模型。", + "輸入你的 {{provider}} API 金鑰以連線帳戶,並在 Kilo 中使用 {{provider}} 模型。", "provider.connect.apiKey.label": "{{provider}} API 金鑰", "provider.connect.apiKey.placeholder": "API 金鑰", "provider.connect.apiKey.required": "API 金鑰為必填", @@ -143,7 +143,7 @@ export const dict = { "provider.connect.opencodeZen.visit.suffix": " 取得你的 API 金鑰。", "provider.connect.oauth.code.visit.prefix": "造訪 ", "provider.connect.oauth.code.visit.link": "此連結", - "provider.connect.oauth.code.visit.suffix": " 取得授權碼,以連線你的帳戶並在 OpenCode 中使用 {{provider}} 模型。", + "provider.connect.oauth.code.visit.suffix": " 取得授權碼,以連線你的帳戶並在 Kilo 中使用 {{provider}} 模型。", "provider.connect.oauth.code.label": "{{method}} 授權碼", "provider.connect.oauth.code.placeholder": "授權碼", "provider.connect.oauth.code.required": "授權碼為必填", @@ -151,7 +151,7 @@ export const dict = { "provider.connect.oauth.auto.visit.prefix": "造訪 ", "provider.connect.oauth.auto.visit.link": "此連結", "provider.connect.oauth.auto.visit.suffix": - " 並輸入以下程式碼,以連線你的帳戶並在 OpenCode 中使用 {{provider}} 模型。", + " 並輸入以下程式碼,以連線你的帳戶並在 Kilo 中使用 {{provider}} 模型。", "provider.connect.oauth.auto.confirmationCode": "確認碼", "provider.connect.toast.connected.title": "{{provider}} 已連線", "provider.connect.toast.connected.description": "現在可以使用 {{provider}} 模型了。", @@ -307,7 +307,7 @@ export const dict = { "dialog.directory.empty": "找不到資料夾", "dialog.server.title": "伺服器", - "dialog.server.description": "切換此應用程式連線的 OpenCode 伺服器。", + "dialog.server.description": "切換此應用程式連線的 Kilo 伺服器。", "dialog.server.search.placeholder": "搜尋伺服器", "dialog.server.empty": "暫無伺服器", "dialog.server.add.title": "新增伺服器", @@ -437,7 +437,7 @@ export const dict = { "toast.session.listFailed.title": "無法載入 {{project}} 的工作階段", "toast.update.title": "有可用更新", - "toast.update.description": "OpenCode 有新版本 ({{version}}) 可安裝。", + "toast.update.description": "Kilo 有新版本 ({{version}}) 可安裝。", "toast.update.action.installRestart": "安裝並重新啟動", "toast.update.action.notYet": "稍後", @@ -448,7 +448,7 @@ export const dict = { "error.page.action.checking": "檢查中...", "error.page.action.checkUpdates": "檢查更新", "error.page.action.updateTo": "更新到 {{version}}", - "error.page.report.prefix": "請將此錯誤回報給 OpenCode 團隊", + "error.page.report.prefix": "請將此錯誤回報給 Kilo 團隊", "error.page.report.discord": "在 Discord 上", "error.page.version": "版本: {{version}}", @@ -466,7 +466,7 @@ export const dict = { "error.chain.didYouMean": "你是不是想輸入: {{suggestions}}", "error.chain.modelNotFound": "找不到模型: {{provider}}/{{model}}", "error.chain.checkConfig": "請檢查你的設定 (opencode.json) 中的 provider/model 名稱", - "error.chain.mcpFailed": 'MCP 伺服器 "{{name}}" 啟動失敗。注意: OpenCode 暫不支援 MCP 認證。', + "error.chain.mcpFailed": 'MCP 伺服器 "{{name}}" 啟動失敗。注意: Kilo 暫不支援 MCP 認證。', "error.chain.providerAuthFailed": "提供者認證失敗 ({{provider}}): {{message}}", "error.chain.providerInitFailed": '無法初始化提供者 "{{provider}}"。請檢查憑證和設定。', "error.chain.configJsonInvalid": "設定檔 {{path}} 不是有效的 JSON(C)", @@ -595,20 +595,20 @@ export const dict = { "sidebar.workspaces.enable": "啟用工作區", "sidebar.workspaces.disable": "停用工作區", "sidebar.gettingStarted.title": "開始使用", - "sidebar.gettingStarted.line1": "OpenCode 提供免費模型,你可以立即開始使用。", + "sidebar.gettingStarted.line1": "Kilo 提供免費模型,你可以立即開始使用。", "sidebar.gettingStarted.line2": "連線任意提供者即可使用更多模型,如 Claude、GPT、Gemini 等。", "sidebar.project.recentSessions": "最近工作階段", "sidebar.project.viewAllSessions": "查看全部工作階段", "sidebar.project.clearNotifications": "清除通知", - "app.name.desktop": "OpenCode Desktop", + "app.name.desktop": "Kilo Desktop", "settings.section.desktop": "桌面", "settings.section.server": "伺服器", "settings.tab.general": "一般", "settings.tab.shortcuts": "快速鍵", "settings.desktop.section.wsl": "WSL", "settings.desktop.wsl.title": "WSL 整合", - "settings.desktop.wsl.description": "在 Windows 上的 WSL 中執行 OpenCode 伺服器。", + "settings.desktop.wsl.description": "在 Windows 上的 WSL 中執行 Kilo 伺服器。", "settings.general.section.appearance": "外觀", "settings.general.section.notifications": "系統通知", @@ -618,13 +618,13 @@ export const dict = { "settings.general.section.display": "顯示", "settings.general.row.language.title": "語言", - "settings.general.row.language.description": "變更 OpenCode 的顯示語言", + "settings.general.row.language.description": "變更 Kilo 的顯示語言", "settings.general.row.appearance.title": "外觀", - "settings.general.row.appearance.description": "自訂 OpenCode 在你的裝置上的外觀", + "settings.general.row.appearance.description": "自訂 Kilo 在你的裝置上的外觀", "settings.general.row.colorScheme.title": "配色方案", - "settings.general.row.colorScheme.description": "選擇 OpenCode 要跟隨系統、淺色或深色主題", + "settings.general.row.colorScheme.description": "選擇 Kilo 要跟隨系統、淺色或深色主題", "settings.general.row.theme.title": "主題", - "settings.general.row.theme.description": "自訂 OpenCode 的主題。", + "settings.general.row.theme.description": "自訂 Kilo 的主題。", "settings.general.row.font.title": "程式碼字型", "settings.general.row.font.description": "自訂程式碼區塊使用的字型", "settings.general.row.terminalFont.title": "Terminal Font", @@ -652,13 +652,13 @@ export const dict = { "settings.general.row.releaseNotes.description": "更新後顯示「新功能」彈出視窗", "settings.updates.row.startup.title": "啟動時檢查更新", - "settings.updates.row.startup.description": "在 OpenCode 啟動時自動檢查更新", + "settings.updates.row.startup.description": "在 Kilo 啟動時自動檢查更新", "settings.updates.row.check.title": "檢查更新", "settings.updates.row.check.description": "手動檢查更新並在有更新時安裝", "settings.updates.action.checkNow": "立即檢查", "settings.updates.action.checking": "檢查中...", "settings.updates.toast.latest.title": "已是最新版本", - "settings.updates.toast.latest.description": "你正在使用最新版本的 OpenCode。", + "settings.updates.toast.latest.description": "你正在使用最新版本的 Kilo。", "sound.option.none": "無", "sound.option.alert01": "警報 01", diff --git a/packages/app/src/pages/error.tsx b/packages/app/src/pages/error.tsx index 11284b3d2d7..9f12aa1cfcd 100644 --- a/packages/app/src/pages/error.tsx +++ b/packages/app/src/pages/error.tsx @@ -301,7 +301,7 @@ export const ErrorPage: Component = (props) => { + + +
+ + + + + + + + + + + + + {language.t("agentManager.worktree.new")} + + + + {language.t("agentManager.dialog.advanced")} + + + + +
+
+ + + 1 ? "s" : ""} into a dedicated worktree for isolated follow-up work.` + : "Move this conversation and your current local changes into a dedicated worktree for isolated follow-up work." + } + placement="top" + > + + + +
+ + + +
+ + + ) + return (
@@ -159,70 +284,8 @@ export const ChatView: Component = (props) => { /> )} - -
-
- - - - - - - - - - 1 ? "s" : ""} changed · +${session.worktreeStats()!.additions} -${session.worktreeStats()!.deletions}` - : "No file changes" - } - placement="top" - class="session-diff-wrapper" - > - - - -
-
+ + {renderActions(hasMessages())} .new-task-button-wrapper + .prompt-input-container { + margin-top: 0; +} + +:root { + --session-action-radius: 6px; +} + .session-actions-row { display: flex; gap: 4px; align-items: center; + flex-wrap: wrap; + min-height: 22px; } /* All direct children share extra space equally, but start from their content size */ @@ -24,14 +38,184 @@ .session-actions-row > [data-component="tooltip-trigger"] > [data-component="button"] { flex: 1; + border-radius: var(--session-action-radius); + min-height: 22px; + height: auto; + padding: 4px 6px; + background: transparent; + border: none; + box-shadow: none; + font-family: var(--font-family-sans); + font-size: 12px; + font-style: normal; + font-weight: var(--font-weight-medium); + line-height: normal; + letter-spacing: var(--letter-spacing-normal); + color: var(--vscode-descriptionForeground); + transition: + background-color 150ms ease, + color 150ms ease; +} + +.session-actions-row > [data-component="tooltip-trigger"] > [data-component="button"]:hover:not(:disabled), +.session-actions-row > [data-component="tooltip-trigger"] > [data-component="button"]:focus-visible:not(:disabled), +.session-actions-row > [data-component="tooltip-trigger"] > [data-component="button"]:active:not(:disabled) { + color: var(--vscode-foreground); +} + +.session-worktree-split { + display: flex; + flex: 1 1 auto; + min-width: 0; + align-items: stretch; + gap: 0; + border-radius: var(--session-action-radius); + background: transparent; + box-shadow: none; + overflow: hidden; + color: var(--vscode-descriptionForeground); + transition: + background-color 150ms ease, + color 150ms ease; +} + +.session-worktree-split:hover, +.session-worktree-split:focus-within { + background: var(--surface-base-hover); + color: var(--vscode-foreground); +} + +.session-worktree-split > [data-component="tooltip-trigger"] { + display: flex; + flex: 1 1 auto; +} + +.session-worktree-split > [data-component="tooltip-trigger"] > [data-component="button"] { + flex: 1 1 auto; + border-radius: 0; + background: transparent; + box-shadow: none; + color: inherit; +} + +.session-worktree-split > [data-component="tooltip-trigger"] > [data-component="button"]:hover:not(:disabled), +.session-worktree-split > [data-component="tooltip-trigger"] > [data-component="button"]:focus-visible:not(:disabled), +.session-worktree-split > [data-component="tooltip-trigger"] > [data-component="button"]:active:not(:disabled) { + background: transparent; + box-shadow: none; +} + +.session-worktree-split-arrow { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 22px; + padding: 0 4px 0 3px; + border: none; + border-radius: 0; + background: transparent; + color: inherit; + cursor: pointer; +} + +.session-worktree-split-arrow:focus-visible { + outline: none; + background: transparent; +} + +.session-worktree-split > [data-component="tooltip-trigger"] > [data-component="button"], +.session-worktree-split-arrow { + height: 24px; +} + +.session-worktree-main { + padding-right: 4px !important; +} + +.session-worktree-split-menu { + min-width: 180px; } /* Diff wrapper also stretches evenly (same flex as buttons) */ -.session-diff-wrapper { - display: flex !important; +.session-move-button { + display: flex; + flex: 1; + align-items: center; + justify-content: center; + gap: 5px; + border-radius: var(--session-action-radius); + color: var(--vscode-descriptionForeground); } -/* Diff stats badge — fills its flex slot, content centered */ +.session-move-button:hover:not(:disabled), +.session-move-button:focus-visible:not(:disabled), +.session-move-button:active:not(:disabled) { + color: var(--vscode-foreground); +} + +.session-move-label { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.session-move-tail { + display: inline-flex; + align-items: center; + gap: 5px; + flex-shrink: 0; + padding-left: 5px; +} + +.session-move-divider { + width: 1px; + height: 14px; + background: color-mix(in srgb, currentColor 25%, transparent); + opacity: 0.7; +} + +.session-move-stats { + display: inline-flex; + align-items: center; + gap: 3px; + flex-shrink: 0; + font-family: var(--font-family-sans); + font-size: 12px; + font-variant-numeric: tabular-nums; +} + +.session-agent-manager-slot { + flex: 0 0 auto; + min-width: auto; + overflow: visible; +} + +.session-agent-manager-slot > [data-component="tooltip-trigger"] { + display: flex; + flex: 0 0 auto; +} + +.session-agent-manager { + width: 24px; + padding: 0; + gap: 0; + flex: 0 0 auto; + border-radius: var(--session-action-radius); + color: var(--vscode-descriptionForeground); +} + +.session-agent-manager:hover:not(:disabled), +.session-agent-manager:focus-visible:not(:disabled), +.session-agent-manager:active:not(:disabled) { + color: var(--vscode-foreground); +} + +.session-move-stats [data-component="icon"] { + opacity: 0.7; +} + +/* Diff stats badge styles retained for the inline move button stats */ .session-diff-badge { display: flex; flex: 1; @@ -75,18 +259,30 @@ /* Collapse diff stats to icon-only when truly narrow */ @container (max-width: 300px) { + .session-actions-row { + gap: 6px; + } + + .session-actions-row > *, + .session-worktree-split { + flex-basis: calc(50% - 3px); + } + + .session-move-divider, .session-diff-add, .session-diff-del { display: none; } - .session-diff-badge { - padding: 4px 6px; - overflow: hidden; + .session-move-tail { + padding-left: 4px; } - /* Dot indicator on the icon when collapsed and there are changes */ - .session-diff-badge--has-changes [data-component="icon"]::after { + .session-move-stats { + position: relative; + } + + .session-move-button--has-changes .session-move-stats [data-component="icon"]::after { content: ""; position: absolute; top: -2px; diff --git a/packages/kilo-vscode/webview-ui/src/types/messages/webview-messages.ts b/packages/kilo-vscode/webview-ui/src/types/messages/webview-messages.ts index 6d67b01ab8d..f3627214d09 100644 --- a/packages/kilo-vscode/webview-ui/src/types/messages/webview-messages.ts +++ b/packages/kilo-vscode/webview-ui/src/types/messages/webview-messages.ts @@ -167,6 +167,14 @@ export interface OpenMarketplacePanelRequest { type: "openMarketplacePanel" } +export interface OpenAgentManagerRequest { + type: "openAgentManager" +} + +export interface OpenAdvancedWorktreeRequest { + type: "openAdvancedWorktree" +} + export interface RequestAgentsMessage { type: "requestAgents" } @@ -902,6 +910,8 @@ export type WebviewMessage = | OpenSettingsPanelRequest | OpenVSCodeSettingsRequest | OpenMarketplacePanelRequest + | OpenAgentManagerRequest + | OpenAdvancedWorktreeRequest | OpenFileRequest | CancelLoginRequest | SetOrganizationRequest diff --git a/packages/ui/src/components/icon.tsx b/packages/ui/src/components/icon.tsx index 1ccac8b1de8..ba6b0377961 100644 --- a/packages/ui/src/components/icon.tsx +++ b/packages/ui/src/components/icon.tsx @@ -33,6 +33,7 @@ const icons = { compress: ``, code: ``, "code-lines": ``, + "circuit-board": ``, "circle-ban-sign": ``, "edit-small-2": ``, eye: ``, @@ -119,7 +120,8 @@ export interface IconProps extends ComponentProps<"svg"> { export function Icon(props: IconProps) { const [local, others] = splitProps(props, ["name", "size", "class", "classList"]) - const viewBox = () => (local.name === "magnifying-glass" ? "0 0 16 16" : "0 0 20 20") + const viewBox = () => + local.name === "magnifying-glass" || local.name === "circuit-board" ? "0 0 16 16" : "0 0 20 20" return (
Date: Fri, 24 Apr 2026 19:15:13 +0200 Subject: [PATCH 168/238] refactor(snapshot): introduce SummaryFileDiff schema and tighten Kilo type annotations Add a lightweight SummaryFileDiff derived from FileDiff via Struct.omit(["patch"]) to keep session summary DB payloads small. Replace inline anonymous object types in session.sql.ts, revert.ts, and session.ts with the new schema. Cast SessionPrompt input in remote-sender to satisfy narrowed PromptInput type, guard against null in permission normalizeInput, and switch remaining bare .parse calls to .zod.parse for Effect Schema compatibility. Include unit tests verifying SummaryFileDiff field exclusion and round-trip parsing behavior. --- packages/opencode/src/config/permission.ts | 2 +- .../src/kilo-sessions/remote-sender.ts | 2 +- packages/opencode/src/session/revert.ts | 4 +-- packages/opencode/src/session/session.sql.ts | 6 +--- packages/opencode/src/session/session.ts | 6 ++-- packages/opencode/src/snapshot/index.ts | 9 +++++- .../test/kilocode/summary-file-diff.test.ts | 28 +++++++++++++++++++ 7 files changed, 44 insertions(+), 13 deletions(-) create mode 100644 packages/opencode/test/kilocode/summary-file-diff.test.ts diff --git a/packages/opencode/src/config/permission.ts b/packages/opencode/src/config/permission.ts index a8b64347cab..f2ced3112e2 100644 --- a/packages/opencode/src/config/permission.ts +++ b/packages/opencode/src/config/permission.ts @@ -58,7 +58,7 @@ const InputSchema = Schema.Union([Action, InputObject]) // Normalise the Action shorthand into `{ "*": action }`. Object inputs pass // through untouched. const normalizeInput = (input: Schema.Schema.Type): Schema.Schema.Type => - typeof input === "string" ? { "*": input } : input + input === null || typeof input === "string" ? { "*": input } : input // kilocode_change export const Info = InputSchema.pipe( Schema.decodeTo(InputObject, { diff --git a/packages/opencode/src/kilo-sessions/remote-sender.ts b/packages/opencode/src/kilo-sessions/remote-sender.ts index ee3141a6f88..40feff1afe5 100644 --- a/packages/opencode/src/kilo-sessions/remote-sender.ts +++ b/packages/opencode/src/kilo-sessions/remote-sender.ts @@ -277,7 +277,7 @@ export namespace RemoteSender { return } dispatchLongRunning(msg, directoryFor(input.data.sessionID), async () => { - await SessionPrompt.prompt(input.data) + await SessionPrompt.prompt(input.data as SessionPrompt.PromptInput) }) return } diff --git a/packages/opencode/src/session/revert.ts b/packages/opencode/src/session/revert.ts index 1448aa9f35c..bd84ae563dd 100644 --- a/packages/opencode/src/session/revert.ts +++ b/packages/opencode/src/session/revert.ts @@ -83,8 +83,8 @@ export const layer = Layer.effect( if (rev.snapshot) rev.diff = yield* snap.diff(rev.snapshot as string) yield* storage.write(["session_diff", input.sessionID], diffs).pipe(Effect.ignore) yield* bus.publish(Session.Event.Diff, { sessionID: input.sessionID, diff: diffs }) - // kilocode_change start - strip full file contents before persisting to DB - const summaryDiffs = diffs.map((d) => ({ + // kilocode_change start + const summaryDiffs: Snapshot.SummaryFileDiff[] = diffs.map((d) => ({ file: d.file, additions: d.additions, deletions: d.deletions, diff --git a/packages/opencode/src/session/session.sql.ts b/packages/opencode/src/session/session.sql.ts index 011ee5fd25c..b018db64fd5 100644 --- a/packages/opencode/src/session/session.sql.ts +++ b/packages/opencode/src/session/session.sql.ts @@ -30,11 +30,7 @@ export const SessionTable = sqliteTable( summary_additions: integer(), summary_deletions: integer(), summary_files: integer(), - // kilocode_change start - lightweight diff type (no file contents) - summary_diffs: text({ mode: "json" }).$type< - { file: string; additions: number; deletions: number; status?: "added" | "deleted" | "modified" }[] - >(), - // kilocode_change end + summary_diffs: text({ mode: "json" }).$type(), // kilocode_change revert: text({ mode: "json" }).$type<{ messageID: MessageID; partID?: PartID; snapshot?: string; diff?: string }>(), permission: text({ mode: "json" }).$type(), ...Timestamps, diff --git a/packages/opencode/src/session/session.ts b/packages/opencode/src/session/session.ts index b828baee003..b57c5660e02 100644 --- a/packages/opencode/src/session/session.ts +++ b/packages/opencode/src/session/session.ts @@ -130,7 +130,7 @@ export const Info = z additions: z.number(), deletions: z.number(), files: z.number(), - diffs: Snapshot.FileDiff.zod.array().optional(), + diffs: Snapshot.SummaryFileDiff.zod.array().optional(), // kilocode_change }) .optional(), share: z @@ -837,7 +837,7 @@ export const messages = fn(MessagesInput, (input) => runPromise((svc) => svc.mes export const children = fn(ChildrenInput, (id) => runPromise((svc) => svc.children(id))) export const remove = fn(RemoveInput, (id) => runPromise((svc) => svc.remove(id))) export async function updateMessage(msg: T): Promise { - MessageV2.Info.parse(msg) + MessageV2.Info.zod.parse(msg) // kilocode_change return runPromise((svc) => svc.updateMessage(msg)) } @@ -851,7 +851,7 @@ export const removePart = fn( ) export async function updatePart(part: T): Promise { - MessageV2.Part.parse(part) + MessageV2.Part.zod.parse(part) // kilocode_change return runPromise((svc) => svc.updatePart(part)) } diff --git a/packages/opencode/src/snapshot/index.ts b/packages/opencode/src/snapshot/index.ts index d9a3bce4c93..6ac5b5b633a 100644 --- a/packages/opencode/src/snapshot/index.ts +++ b/packages/opencode/src/snapshot/index.ts @@ -1,4 +1,4 @@ -import { Cause, Duration, Effect, Layer, Schedule, Schema, Semaphore, Context, Stream } from "effect" +import { Cause, Duration, Effect, Layer, Schedule, Schema, Semaphore, Struct, Context, Stream } from "effect" import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process" import { formatPatch, structuredPatch } from "diff" import path from "path" @@ -33,6 +33,13 @@ export const FileDiff = Schema.Struct({ .pipe(withStatics((s) => ({ zod: zod(s) }))) export type FileDiff = typeof FileDiff.Type +// kilocode_change start - lightweight FileDiff without `patch` for session.summary.diffs (keeps DB payload small) +export const SummaryFileDiff = FileDiff.mapFields(Struct.omit(["patch"])) + .annotate({ identifier: "SnapshotSummaryFileDiff" }) + .pipe(withStatics((s) => ({ zod: zod(s) }))) +export type SummaryFileDiff = typeof SummaryFileDiff.Type +// kilocode_change end + const log = Log.create({ service: "snapshot" }) const prune = "7.days" const limit = 2 * 1024 * 1024 diff --git a/packages/opencode/test/kilocode/summary-file-diff.test.ts b/packages/opencode/test/kilocode/summary-file-diff.test.ts new file mode 100644 index 00000000000..c481716553c --- /dev/null +++ b/packages/opencode/test/kilocode/summary-file-diff.test.ts @@ -0,0 +1,28 @@ +import { test, expect } from "bun:test" +import { Snapshot } from "../../src/snapshot" + +test("SummaryFileDiff does not contain the `patch` field", () => { + const keys = Object.keys(Snapshot.SummaryFileDiff.fields) + expect(keys).not.toContain("patch") + expect(keys.sort()).toEqual(["additions", "deletions", "file", "status"]) +}) + +test("SummaryFileDiff parse strips `patch` when present on input", () => { + const full = { + file: "a.txt", + patch: "@@ -1 +1 @@\n-old\n+new\n", + additions: 1, + deletions: 1, + status: "modified" as const, + } + const parsed = Snapshot.SummaryFileDiff.zod.parse(full) + expect(parsed).not.toHaveProperty("patch") + expect(parsed).toEqual({ file: "a.txt", additions: 1, deletions: 1, status: "modified" }) +}) + +test("SummaryFileDiff differs from FileDiff by exactly `patch`", () => { + const full = new Set(Object.keys(Snapshot.FileDiff.fields)) + const summary = new Set(Object.keys(Snapshot.SummaryFileDiff.fields)) + expect([...full].filter((k) => !summary.has(k))).toEqual(["patch"]) + expect([...summary].filter((k) => !full.has(k))).toEqual([]) +}) From 1da22b9ef22fbe495a63da106aa3adbafdeb1849 Mon Sep 17 00:00:00 2001 From: kirillk Date: Fri, 24 Apr 2026 13:17:44 -0400 Subject: [PATCH 169/238] fix(vscode): refine sidebar worktree controls --- packages/kilo-vscode/src/KiloProvider.ts | 10 +++ .../src/components/chat/ChatView.tsx | 31 ++++++-- .../webview-ui/src/styles/session-actions.css | 77 +++++++++++++++---- 3 files changed, 97 insertions(+), 21 deletions(-) diff --git a/packages/kilo-vscode/src/KiloProvider.ts b/packages/kilo-vscode/src/KiloProvider.ts index fc94b9341f0..a11b9d29fb8 100644 --- a/packages/kilo-vscode/src/KiloProvider.ts +++ b/packages/kilo-vscode/src/KiloProvider.ts @@ -713,6 +713,16 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper case "openAdvancedWorktree": vscode.commands.executeCommand("kilo-code.new.agentManager.advancedWorktree") break + case "agentManager.requestRepoInfo": { + const root = getWorkspaceRoot() + if (!root) break + const git = new GitOps({ log: () => {} }) + const branch = await git.currentBranch(root).catch(() => "") + git.dispose() + if (!branch || branch === "HEAD") break + this.postMessage({ type: "agentManager.repoInfo", branch }) + break + } case "agentManager.createWorktree": await this.createWorktreeHandler?.(message.baseBranch, message.branchName) break diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx index beb2fea8559..dbf4cea2a92 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx @@ -53,6 +53,7 @@ export const ChatView: Component = (props) => { // "Continue in Worktree" state const [transferring, setTransferring] = createSignal(false) const [transferDetail, setTransferDetail] = createSignal("") + const [repoBranch, setRepoBranch] = createSignal() // Permissions and questions scoped to this session's family (self + subagents). // Each ChatView only sees its own session tree — no cross-session leakage. @@ -108,6 +109,10 @@ export const ChatView: Component = (props) => { forking: "Starting session...", } const cleanup = vscode.onMessage((msg) => { + if (msg.type === "agentManager.repoInfo") { + setRepoBranch(msg.branch) + return + } if (msg.type !== "continueInWorktreeProgress") return const m = msg as { status: string; error?: string } if (m.status === "done") { @@ -136,6 +141,9 @@ export const ChatView: Component = (props) => { const startWorktree = () => vscode.postMessage({ type: "agentManager.createWorktree" }) + const startWorktreeFromBranch = () => + vscode.postMessage({ type: "agentManager.createWorktree", baseBranch: repoBranch() || undefined }) + const openAgentManager = () => vscode.postMessage({ type: "openAgentManager" }) const moveToWorktree = () => { @@ -149,11 +157,15 @@ export const ChatView: Component = (props) => { const worktreeTooltip = "Create an isolated git worktree to experiment safely, keep changes separated, and run parallel sessions without disrupting your current branch." - const advancedTooltip = - "Open the Agent Manager worktree dialog to choose advanced branch options before creating the worktree." + const advancedTooltip = "Open the Agent Manager worktree dialog to configure a new worktree before creating it." const showAdvancedWorktree = () => vscode.postMessage({ type: "openAdvancedWorktree" }) + createEffect(() => { + if (!isSidebar() || !server.gitInstalled()) return + vscode.postMessage({ type: "agentManager.requestRepoInfo" }) + }) + const renderActions = (hasChat: boolean) => (
@@ -175,7 +187,7 @@ export const ChatView: Component = (props) => { New Worktree - + @@ -183,12 +195,19 @@ export const ChatView: Component = (props) => { - - {language.t("agentManager.worktree.new")} + + - {language.t("agentManager.dialog.advanced")} + Configure New Worktree... diff --git a/packages/kilo-vscode/webview-ui/src/styles/session-actions.css b/packages/kilo-vscode/webview-ui/src/styles/session-actions.css index 517a684f670..a816c6914e8 100644 --- a/packages/kilo-vscode/webview-ui/src/styles/session-actions.css +++ b/packages/kilo-vscode/webview-ui/src/styles/session-actions.css @@ -22,26 +22,26 @@ align-items: center; flex-wrap: wrap; min-height: 22px; + justify-content: flex-start; } -/* All direct children share extra space equally, but start from their content size */ .session-actions-row > * { - flex: 1 1 auto; + flex: 0 0 auto; min-width: 0; overflow: hidden; } -/* Tooltip wrappers fill their flex slot, buttons fill the tooltip wrapper */ .session-actions-row > [data-component="tooltip-trigger"] { display: flex; + flex: 0 0 auto; } .session-actions-row > [data-component="tooltip-trigger"] > [data-component="button"] { - flex: 1; + flex: 0 0 auto; border-radius: var(--session-action-radius); min-height: 22px; height: auto; - padding: 4px 6px; + padding: 4px 6px !important; background: transparent; border: none; box-shadow: none; @@ -65,7 +65,7 @@ .session-worktree-split { display: flex; - flex: 1 1 auto; + flex: 0 0 auto; min-width: 0; align-items: stretch; gap: 0; @@ -80,22 +80,25 @@ } .session-worktree-split:hover, -.session-worktree-split:focus-within { +.session-worktree-split:has(.session-worktree-main:focus-visible), +.session-worktree-split:has(.session-worktree-split-arrow:focus-visible), +.session-worktree-split:has(.session-worktree-split-arrow[data-expanded]) { background: var(--surface-base-hover); color: var(--vscode-foreground); } .session-worktree-split > [data-component="tooltip-trigger"] { display: flex; - flex: 1 1 auto; + flex: 0 0 auto; } .session-worktree-split > [data-component="tooltip-trigger"] > [data-component="button"] { - flex: 1 1 auto; + flex: 0 0 auto; border-radius: 0; background: transparent; box-shadow: none; color: inherit; + padding: 4px 6px !important; } .session-worktree-split > [data-component="tooltip-trigger"] > [data-component="button"]:hover:not(:disabled), @@ -109,8 +112,9 @@ display: inline-flex; align-items: center; justify-content: center; - min-width: 22px; - padding: 0 4px 0 3px; + gap: 5px; + min-width: 20px; + padding: 0 6px 0 5px; border: none; border-radius: 0; background: transparent; @@ -118,6 +122,14 @@ cursor: pointer; } +.session-worktree-split-arrow::before { + content: ""; + width: 1px; + height: 14px; + background: color-mix(in srgb, currentColor 25%, transparent); + opacity: 0.7; +} + .session-worktree-split-arrow:focus-visible { outline: none; background: transparent; @@ -129,22 +141,52 @@ } .session-worktree-main { - padding-right: 4px !important; + padding-right: 6px !important; } .session-worktree-split-menu { - min-width: 180px; + min-width: 250px; +} + +.session-worktree-split-menu [data-slot="dropdown-menu-item"] { + padding: 6px 10px; +} + +.session-worktree-menu-gap { + display: inline-flex; + width: 16px; + height: 16px; + flex-shrink: 0; +} + +.session-worktree-menu-label { + display: inline-flex; + align-items: center; + gap: 6px; + min-width: 0; +} + +.session-worktree-menu-branch { + display: inline-flex; + align-items: center; + gap: 4px; + min-width: 0; +} + +.session-worktree-menu-branch strong { + font-weight: 600; } /* Diff wrapper also stretches evenly (same flex as buttons) */ .session-move-button { display: flex; - flex: 1; + flex: 0 0 auto; align-items: center; justify-content: center; gap: 5px; border-radius: var(--session-action-radius); color: var(--vscode-descriptionForeground); + padding: 4px 6px !important; } .session-move-button:hover:not(:disabled), @@ -187,6 +229,7 @@ .session-agent-manager-slot { flex: 0 0 auto; + margin-left: auto; min-width: auto; overflow: visible; } @@ -265,7 +308,11 @@ .session-actions-row > *, .session-worktree-split { - flex-basis: calc(50% - 3px); + flex-basis: auto; + } + + .session-agent-manager-slot { + margin-left: 0; } .session-move-divider, From 6e0e2783eb10ad95f444d106bcca0f135b22343d Mon Sep 17 00:00:00 2001 From: Imanol Maiztegui Date: Fri, 24 Apr 2026 19:23:40 +0200 Subject: [PATCH 170/238] build(sdk): regenerate SDK types and sort package.json dependencies Re-run code generation to emit the SnapshotSummaryFileDiff named type and replace inline anonymous diff objects across Session, SyncEventSessionUpdated, and GlobalSession. Alphabetically sort dependency entries in the opencode package.json and add previously appended Kilo-specific packages into their correct positions. --- packages/opencode/package.json | 26 +++++++++--------- packages/sdk/js/src/v2/gen/sdk.gen.ts | 2 +- packages/sdk/js/src/v2/gen/types.gen.ts | 36 ++++++++++--------------- 3 files changed, 28 insertions(+), 36 deletions(-) diff --git a/packages/opencode/package.json b/packages/opencode/package.json index 7d1806a29b7..9c76c30c650 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -103,21 +103,25 @@ "@clack/prompts": "1.0.0-alpha.1", "@effect/opentelemetry": "catalog:", "@effect/platform-node": "catalog:", + "@gitlab/gitlab-ai-provider": "3.6.0", "@gitlab/opencode-gitlab-auth": "1.3.3", "@hono/node-server": "1.19.11", "@hono/node-ws": "1.3.0", "@hono/standard-validator": "0.1.5", "@hono/zod-validator": "catalog:", + "@kilocode/kilo-gateway": "workspace:*", + "@kilocode/kilo-telemetry": "workspace:*", + "@kilocode/plugin": "workspace:*", + "@kilocode/sdk": "workspace:*", "@lydell/node-pty": "catalog:", "@modelcontextprotocol/sdk": "1.29.0", + "@morphllm/morphsdk": "0.2.166", "@npmcli/arborist": "9.4.0", "@npmcli/config": "10.8.1", "@octokit/graphql": "9.0.2", "@octokit/rest": "catalog:", "@openauthjs/openauth": "catalog:", - "@kilocode/plugin": "workspace:*", "@opencode-ai/script": "workspace:*", - "@kilocode/sdk": "workspace:*", "@openrouter/ai-sdk-provider": "2.5.1", "@opentelemetry/api": "1.9.0", "@opentelemetry/context-async-hooks": "2.6.1", @@ -151,8 +155,10 @@ "gray-matter": "4.0.3", "hono": "catalog:", "hono-openapi": "catalog:", + "iconv-lite": "0.7.2", "ignore": "7.0.5", "immer": "11.1.4", + "jschardet": "3.1.4", "jsonc-parser": "3.3.1", "mime-types": "3.0.2", "minimatch": "10.2.5", @@ -163,8 +169,12 @@ "opentui-spinner": "0.0.6", "partial-json": "0.1.7", "remeda": "catalog:", + "ripgrep": "0.3.1", + "rotating-file-stream": "3.2.9", "semver": "^7.6.3", + "simple-git": "3.35.2", "solid-js": "catalog:", + "stream-chat": "9.38.0", "strip-ansi": "7.1.2", "tree-sitter-bash": "0.25.0", "tree-sitter-powershell": "0.25.10", @@ -177,17 +187,7 @@ "xdg-basedir": "5.1.0", "yargs": "18.0.0", "zod": "catalog:", - "zod-to-json-schema": "3.24.5", - "@gitlab/gitlab-ai-provider": "3.6.0", - "@kilocode/kilo-gateway": "workspace:*", - "@kilocode/kilo-telemetry": "workspace:*", - "@morphllm/morphsdk": "0.2.166", - "iconv-lite": "0.7.2", - "jschardet": "3.1.4", - "ripgrep": "0.3.1", - "rotating-file-stream": "3.2.9", - "simple-git": "3.35.2", - "stream-chat": "9.38.0" + "zod-to-json-schema": "3.24.5" }, "overrides": { "drizzle-orm": "catalog:" diff --git a/packages/sdk/js/src/v2/gen/sdk.gen.ts b/packages/sdk/js/src/v2/gen/sdk.gen.ts index 88b761c96ee..d9d3bac64e4 100644 --- a/packages/sdk/js/src/v2/gen/sdk.gen.ts +++ b/packages/sdk/js/src/v2/gen/sdk.gen.ts @@ -217,9 +217,9 @@ import type { SyncHistoryListResponses, SyncReplayErrors, SyncReplayResponses, + SyncStartResponses, TelemetryCaptureErrors, TelemetryCaptureResponses, - SyncStartResponses, TextPartInput, ToolIdsErrors, ToolIdsResponses, diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index dc83cfb1ede..3be20d868e4 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -1079,6 +1079,13 @@ export type EventMessagePartRemoved = { } } +export type SnapshotSummaryFileDiff = { + file: string + additions: number + deletions: number + status?: "added" | "deleted" | "modified" +} + export type PermissionAction = "allow" | "deny" | "ask" export type PermissionRule = { @@ -1100,12 +1107,7 @@ export type Session = { additions: number deletions: number files: number - diffs?: Array<{ - file: string - additions: number - deletions: number - status?: "added" | "deleted" | "modified" - }> + diffs?: Array } share?: { url: string @@ -1232,12 +1234,7 @@ export type SyncEventSessionUpdated = { additions: number deletions: number files: number - diffs?: Array<{ - file: string - additions: number - deletions: number - status?: "added" | "deleted" | "modified" - }> + diffs?: Array } | null share?: { url: string | null @@ -1703,10 +1700,6 @@ export type Config = { * @deprecated Use 'share' field instead. Share newly created sessions automatically */ autoshare?: boolean - /** - * Enable remote control of sessions via Kilo Cloud. Equivalent to running /remote on startup. - */ - remote_control?: boolean /** * Automatically update to the latest version. Set to true to auto-update, false to disable, or 'notify' to show update notifications */ @@ -1719,6 +1712,10 @@ export type Config = { * When set, ONLY these providers will be enabled. All other providers will be ignored */ enabled_providers?: Array + /** + * Enable remote control of sessions via Kilo Cloud. Equivalent to running /remote on startup. + */ + remote_control?: boolean /** * Model to use in the format of provider/model, eg anthropic/claude-2 */ @@ -2090,12 +2087,7 @@ export type GlobalSession = { additions: number deletions: number files: number - diffs?: Array<{ - file: string - additions: number - deletions: number - status?: "added" | "deleted" | "modified" - }> + diffs?: Array } share?: { url: string From 7631e13945897652555a07d01b52c5cdb50478ab Mon Sep 17 00:00:00 2001 From: Imanol Maiztegui Date: Fri, 24 Apr 2026 19:29:38 +0200 Subject: [PATCH 171/238] docs(kilo-docs): add Mistral reasoning documentation URL to source links --- packages/kilo-docs/source-links.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/kilo-docs/source-links.md b/packages/kilo-docs/source-links.md index dd97d3bdfe3..dc51bd3d38d 100644 --- a/packages/kilo-docs/source-links.md +++ b/packages/kilo-docs/source-links.md @@ -1,7 +1,7 @@ # Source Code Links - + - @@ -33,6 +33,8 @@ - +- + - - From 696ed061e6b8921256540b7390ccc6bb3273d5dc Mon Sep 17 00:00:00 2001 From: kirillk Date: Fri, 24 Apr 2026 14:58:33 -0400 Subject: [PATCH 172/238] fix(vscode): polish sidebar worktree actions --- .../src/agent-manager/AgentManagerProvider.ts | 10 ++ .../kilo-vscode/src/agent-manager/host.ts | 6 + .../src/agent-manager/vscode-host.ts | 13 ++ packages/kilo-vscode/src/extension.ts | 6 +- .../agent-manager/AgentManagerApp.tsx | 6 +- .../agent-manager/NewWorktreeDialog.tsx | 15 ++- .../webview-ui/agent-manager/i18n/en.ts | 3 +- .../src/components/chat/ChatView.tsx | 115 +++++++++++------- .../src/components/chat/PromptInput.tsx | 2 +- .../webview-ui/src/styles/session-actions.css | 106 +++++++++++----- 10 files changed, 200 insertions(+), 82 deletions(-) diff --git a/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts b/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts index 6b786250950..5437543cb1a 100644 --- a/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts +++ b/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts @@ -1543,6 +1543,16 @@ export class AgentManagerProvider implements Disposable { await this.onCreateWorktree(baseBranch, branchName) } + public async openAdvancedWorktree(): Promise { + this.openPanel() + const panel = this.panel + if (!panel) return + await panel.waitForActive() + await panel.waitForReady() + await this.waitForStateReady("openAdvancedWorktree") + queueMicrotask(() => this.postToWebview({ type: "action", action: "advancedWorktree" })) + } + private handleSection(m: AgentManagerInMessage): boolean { return handleSection(this.state, m, () => this.pushState()) } diff --git a/packages/kilo-vscode/src/agent-manager/host.ts b/packages/kilo-vscode/src/agent-manager/host.ts index 1f86425194f..92970ecac71 100644 --- a/packages/kilo-vscode/src/agent-manager/host.ts +++ b/packages/kilo-vscode/src/agent-manager/host.ts @@ -56,6 +56,12 @@ export interface PanelContext { /** Send a message to the webview. */ postMessage(msg: unknown): void + /** Resolve once the panel webview is ready to receive messages. */ + waitForReady(): Promise + + /** Resolve once the panel is the active editor tab. */ + waitForActive(): Promise + /** Reveal the panel. */ reveal(preserveFocus?: boolean): void diff --git a/packages/kilo-vscode/src/agent-manager/vscode-host.ts b/packages/kilo-vscode/src/agent-manager/vscode-host.ts index 06370eae2fc..8b5ebfdc72b 100644 --- a/packages/kilo-vscode/src/agent-manager/vscode-host.ts +++ b/packages/kilo-vscode/src/agent-manager/vscode-host.ts @@ -110,6 +110,19 @@ export class VscodeHost implements Host { postMessage(msg) { void panel.webview.postMessage(msg) }, + waitForReady() { + return provider.waitForReady() + }, + waitForActive() { + if (panel.active) return Promise.resolve() + return new Promise((resolve) => { + const sub = panel.onDidChangeViewState((e) => { + if (!e.webviewPanel.active) return + sub.dispose() + resolve() + }) + }) + }, reveal(preserveFocus) { panel.reveal(vscode.ViewColumn.One, preserveFocus ?? false) }, diff --git a/packages/kilo-vscode/src/extension.ts b/packages/kilo-vscode/src/extension.ts index 2b6f5e8ba33..a6f4905c31d 100644 --- a/packages/kilo-vscode/src/extension.ts +++ b/packages/kilo-vscode/src/extension.ts @@ -338,9 +338,9 @@ export function activate(context: vscode.ExtensionContext) { vscode.commands.registerCommand("kilo-code.new.agentManager.closeWorktree", () => { agentManagerProvider.postMessage({ type: "action", action: "closeWorktree" }) }), - vscode.commands.registerCommand("kilo-code.new.agentManager.advancedWorktree", () => { - agentManagerProvider.postMessage({ type: "action", action: "advancedWorktree" }) - }), + vscode.commands.registerCommand("kilo-code.new.agentManager.advancedWorktree", () => + agentManagerProvider.openAdvancedWorktree(), + ), ...Array.from({ length: 9 }, (_, i) => vscode.commands.registerCommand(`kilo-code.new.agentManager.jumpTo${i + 1}`, () => { agentManagerProvider.postMessage({ type: "action", action: `jumpTo${i + 1}` }) diff --git a/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx b/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx index 401be6510a9..4239f4e7355 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx +++ b/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx @@ -1,7 +1,8 @@ // Agent Manager root component +/** @jsxImportSource solid-js */ + import { - Component, For, Show, createSignal, @@ -11,6 +12,7 @@ import { onMount, onCleanup, type Accessor, + type Component, } from "solid-js" import type { ExtensionMessage, @@ -2285,7 +2287,7 @@ const AgentManagerContent: Component = () => { - {t("agentManager.dialog.advanced")} + {t("agentManager.dialog.configureWorktree")} {parseBindingTokens(kb().advancedWorktree ?? "").map((token) => ( {token} diff --git a/packages/kilo-vscode/webview-ui/agent-manager/NewWorktreeDialog.tsx b/packages/kilo-vscode/webview-ui/agent-manager/NewWorktreeDialog.tsx index 13f5692bf68..3e54451f4e1 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/NewWorktreeDialog.tsx +++ b/packages/kilo-vscode/webview-ui/agent-manager/NewWorktreeDialog.tsx @@ -1,6 +1,8 @@ // New Worktree dialog — prompt, versions, model, mode, import tab -import { Component, For, Show, createSignal, createEffect, createMemo, onMount, onCleanup } from "solid-js" +/** @jsxImportSource solid-js */ + +import { type Component, For, Show, createSignal, createEffect, createMemo, onMount, onCleanup } from "solid-js" import type { AgentManagerBranchesMessage, AgentManagerImportResultMessage, BranchInfo } from "../src/types/messages" import { Dialog } from "@kilocode/kilo-ui/dialog" import { showToast } from "@kilocode/kilo-ui/toast" @@ -171,6 +173,17 @@ export const NewWorktreeDialog: Component<{ onClose: () => void; defaultBaseBran vscode.postMessage({ type: "agentManager.requestBranches" }) // Resize textarea if restoring a cached prompt if (prompt()) adjustHeight() + const focus = () => { + textareaRef?.focus({ preventScroll: true }) + const end = textareaRef?.value.length ?? 0 + textareaRef?.setSelectionRange(end, end) + } + requestAnimationFrame(() => { + focus() + requestAnimationFrame(focus) + setTimeout(focus, 0) + setTimeout(focus, 50) + }) }) const effectiveBaseBranch = () => baseBranch() ?? defaultBranch() diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/en.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/en.ts index bde300bd166..e564072f3a3 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/en.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/en.ts @@ -77,7 +77,7 @@ export const dict = { "agentManager.shortcuts.nextItem": "Next item", "agentManager.shortcuts.newWorktree": "New worktree", "agentManager.shortcuts.openWorktree": "Open worktree", - "agentManager.shortcuts.advancedWorktree": "Advanced worktree", + "agentManager.shortcuts.advancedWorktree": "Configure new worktree", "agentManager.shortcuts.deleteWorktree": "Delete worktree", "agentManager.shortcuts.previousTab": "Previous tab", "agentManager.shortcuts.nextTab": "Next tab", @@ -122,6 +122,7 @@ export const dict = { "agentManager.dialog.createWorktree": "Create Worktree", "agentManager.dialog.removeImage": "Remove image", "agentManager.dialog.advanced": "Advanced...", + "agentManager.dialog.configureWorktree": "Configure New Worktree...", "agentManager.diff.toggle": "Toggle diff", "agentManager.diff.openFile": "Open file", diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx index dbf4cea2a92..819b95eaa3e 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx @@ -54,6 +54,7 @@ export const ChatView: Component = (props) => { const [transferring, setTransferring] = createSignal(false) const [transferDetail, setTransferDetail] = createSignal("") const [repoBranch, setRepoBranch] = createSignal() + let worktreeRef: HTMLDivElement | undefined // Permissions and questions scoped to this session's family (self + subagents). // Each ChatView only sees its own session tree — no cross-session leakage. @@ -146,7 +147,10 @@ export const ChatView: Component = (props) => { const openAgentManager = () => vscode.postMessage({ type: "openAgentManager" }) + const openChanges = () => vscode.postMessage({ type: "openChanges" }) + const moveToWorktree = () => { + if (transferring()) return const sid = id() if (!sid) return setTransferring(true) @@ -159,6 +163,19 @@ export const ChatView: Component = (props) => { const advancedTooltip = "Open the Agent Manager worktree dialog to configure a new worktree before creating it." + const moveTooltip = () => { + const stats = session.worktreeStats() + if (!stats?.files) + return "Move this conversation and your current local changes into a dedicated worktree for isolated follow-up work." + return `Move this conversation and ${stats.files} changed file${stats.files > 1 ? "s" : ""} into a dedicated worktree for isolated follow-up work.` + } + + const changesTooltip = () => { + const stats = session.worktreeStats() + if (!stats?.files) return "Open the changes view to inspect the current working tree." + return `${stats.files} file${stats.files > 1 ? "s" : ""} changed · +${stats.additions} -${stats.deletions}. Open the changes view.` + } + const showAdvancedWorktree = () => vscode.postMessage({ type: "openAdvancedWorktree" }) createEffect(() => { @@ -169,13 +186,27 @@ export const ChatView: Component = (props) => { const renderActions = (hasChat: boolean) => (
- - -
+
- + worktreeRef?.getBoundingClientRect()}> @@ -207,7 +238,9 @@ export const ChatView: Component = (props) => { - Configure New Worktree... + + {language.t("agentManager.dialog.configureWorktree")} + @@ -216,42 +249,42 @@ export const ChatView: Component = (props) => { - 1 ? "s" : ""} into a dedicated worktree for isolated follow-up work.` - : "Move this conversation and your current local changes into a dedicated worktree for isolated follow-up work." - } - placement="top" - > - - +
+ + + + + + +
= (props) => { variant="ghost" size="small" onClick={() => void handleSend()} - disabled={!canSend()} + aria-disabled={!canSend()} aria-label={language.t("prompt.action.send")} > diff --git a/packages/kilo-vscode/webview-ui/src/styles/session-actions.css b/packages/kilo-vscode/webview-ui/src/styles/session-actions.css index a816c6914e8..901b8c04fa5 100644 --- a/packages/kilo-vscode/webview-ui/src/styles/session-actions.css +++ b/packages/kilo-vscode/webview-ui/src/styles/session-actions.css @@ -63,6 +63,10 @@ color: var(--vscode-foreground); } +.session-actions-row > [data-component="tooltip-trigger"] > [data-component="button"].session-new-button:disabled { + cursor: default; +} + .session-worktree-split { display: flex; flex: 0 0 auto; @@ -177,22 +181,57 @@ font-weight: 600; } -/* Diff wrapper also stretches evenly (same flex as buttons) */ -.session-move-button { +.session-move-group { + display: flex; + flex: 0 0 auto; + align-items: center; + gap: 2px; + border-radius: var(--session-action-radius); + color: var(--vscode-descriptionForeground); + transition: + background-color 150ms ease, + color 150ms ease; +} + +.session-move-group > [data-component="tooltip-trigger"] { + display: flex; + flex: 0 0 auto; +} + +.session-move-group:hover, +.session-move-group:has(.session-move-action:focus-visible), +.session-move-group:has(.session-move-changes:focus-visible) { + color: var(--vscode-foreground); +} + +.session-move-group:hover .session-move-action, +.session-move-group:hover .session-move-changes, +.session-move-group:has(.session-move-action:focus-visible) .session-move-action, +.session-move-group:has(.session-move-action:focus-visible) .session-move-changes, +.session-move-group:has(.session-move-changes:focus-visible) .session-move-action, +.session-move-group:has(.session-move-changes:focus-visible) .session-move-changes { + background: var(--surface-base-hover); +} + +.session-move-action { display: flex; flex: 0 0 auto; align-items: center; justify-content: center; gap: 5px; - border-radius: var(--session-action-radius); - color: var(--vscode-descriptionForeground); + border-radius: var(--session-action-radius) 0 0 var(--session-action-radius); + color: inherit; padding: 4px 6px !important; + background: transparent; + box-shadow: none; } -.session-move-button:hover:not(:disabled), -.session-move-button:focus-visible:not(:disabled), -.session-move-button:active:not(:disabled) { - color: var(--vscode-foreground); +.session-move-action:hover:not(:disabled), +.session-move-action:focus-visible:not(:disabled), +.session-move-action:active:not(:disabled) { + color: inherit; + background: inherit; + box-shadow: none; } .session-move-label { @@ -202,31 +241,41 @@ white-space: nowrap; } -.session-move-tail { - display: inline-flex; - align-items: center; - gap: 5px; - flex-shrink: 0; - padding-left: 5px; -} - -.session-move-divider { - width: 1px; - height: 14px; - background: color-mix(in srgb, currentColor 25%, transparent); +.session-move-action [data-component="icon"], +.session-move-changes [data-component="icon"] { opacity: 0.7; } -.session-move-stats { +.session-move-changes { display: inline-flex; align-items: center; gap: 3px; - flex-shrink: 0; + flex: 0 0 auto; + border-radius: 0 var(--session-action-radius) var(--session-action-radius) 0; + color: inherit; + padding: 4px 6px !important; + background: transparent; + box-shadow: none; +} + +.session-move-changes:hover:not(:disabled), +.session-move-changes:focus-visible:not(:disabled), +.session-move-changes:active:not(:disabled) { + color: inherit; + background: inherit; + box-shadow: none; +} + +.session-move-changes { font-family: var(--font-family-sans); font-size: 12px; font-variant-numeric: tabular-nums; } +.session-move-changes--empty { + opacity: 0.7; +} + .session-agent-manager-slot { flex: 0 0 auto; margin-left: auto; @@ -254,10 +303,6 @@ color: var(--vscode-foreground); } -.session-move-stats [data-component="icon"] { - opacity: 0.7; -} - /* Diff stats badge styles retained for the inline move button stats */ .session-diff-badge { display: flex; @@ -315,21 +360,16 @@ margin-left: 0; } - .session-move-divider, .session-diff-add, .session-diff-del { display: none; } - .session-move-tail { - padding-left: 4px; - } - - .session-move-stats { + .session-move-changes { position: relative; } - .session-move-button--has-changes .session-move-stats [data-component="icon"]::after { + .session-move-changes--has-changes [data-component="icon"]::after { content: ""; position: absolute; top: -2px; From 0a88997abbbdb0ad9b970d6337b25f4d2a6e1692 Mon Sep 17 00:00:00 2001 From: kirillk Date: Fri, 24 Apr 2026 15:15:25 -0400 Subject: [PATCH 173/238] fix(vscode): resolve sidebar chat typecheck --- packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx index 819b95eaa3e..923c4479377 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx @@ -247,7 +247,6 @@ export const ChatView: Component = (props) => {
-
From 4821038e4809a5aae530a2a3ad311531b3ab5e66 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 24 Apr 2026 19:19:06 +0000 Subject: [PATCH 174/238] chore: update kilo-vscode visual regression baselines --- .../visual-regression/chat/chat-view-idle-chromium-linux.png | 4 ++-- .../welcome-with-switcher-and-notification-chromium-linux.png | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-idle-chromium-linux.png b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-idle-chromium-linux.png index b3de7ce0a6b..32ab1dbd8c6 100644 --- a/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-idle-chromium-linux.png +++ b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-idle-chromium-linux.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:63c6e23a31f570031361db39105d4283e05da923bb50757e7583c9430f805c53 -size 16379 +oid sha256:6fbf2dc34c9c1ba549244a750a5ce828089fc378fa2352645c9a2267270a0c08 +size 18021 diff --git a/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/welcome-with-switcher-and-notification-chromium-linux.png b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/welcome-with-switcher-and-notification-chromium-linux.png index da8e320285b..96ce67cb9ae 100644 --- a/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/welcome-with-switcher-and-notification-chromium-linux.png +++ b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/welcome-with-switcher-and-notification-chromium-linux.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:024ac7b12c5c6455d30c349dbfde0faff8d8c864761d0d79f0f9e08dbf7144e0 -size 26331 +oid sha256:d2cdb6dfc9a907b8ff98bb1982f324efa6d19e4ee98f9f690b8adbc2a0a163de +size 28994 From 2a6c4294eb0b268818a2bc57f418db953dcd1536 Mon Sep 17 00:00:00 2001 From: Imanol Maiztegui Date: Fri, 24 Apr 2026 21:59:56 +0200 Subject: [PATCH 175/238] fix(opencode): remove mistral from reasoning model check and rebrand cache paths Remove mistral from the provider reasoning variant detection list and update bare repo test assertions to use "kilo" cache directory naming instead of "opencode". --- packages/opencode/src/provider/transform.ts | 1 - packages/opencode/test/project/project.test.ts | 14 ++++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index ac8f06bd352..4a394949521 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -428,7 +428,6 @@ export function variants(model: Provider.Model): Record { expect(project.id).not.toBe(ProjectID.global) expect(project.worktree).toBe(barePath) - const correctCache = path.join(barePath, "opencode") - const wrongCache = path.join(parentDir, ".git", "opencode") + const correctCache = path.join(barePath, "kilo") // kilocode_change + const wrongCache = path.join(parentDir, ".git", "kilo") // kilocode_change expect(await Bun.file(correctCache).exists()).toBe(true) expect(await Bun.file(wrongCache).exists()).toBe(false) @@ -564,9 +564,11 @@ describe("Project.fromDirectory with bare repos", () => { expect(projA.id).not.toBe(projB.id) - const cacheA = path.join(bareA, "opencode") - const cacheB = path.join(bareB, "opencode") - const wrongCache = path.join(parentDir, ".git", "opencode") + // kilocode_change start + const cacheA = path.join(bareA, "kilo") + const cacheB = path.join(bareB, "kilo") + const wrongCache = path.join(parentDir, ".git", "kilo") + // kilocode_change end expect(await Bun.file(cacheA).exists()).toBe(true) expect(await Bun.file(cacheB).exists()).toBe(true) @@ -592,7 +594,7 @@ describe("Project.fromDirectory with bare repos", () => { expect(project.id).not.toBe(ProjectID.global) expect(project.worktree).toBe(barePath) - const correctCache = path.join(barePath, "opencode") + const correctCache = path.join(barePath, "kilo") // kilocode_change expect(await Bun.file(correctCache).exists()).toBe(true) } finally { await $`rm -rf ${barePath} ${worktreePath}`.quiet().nothrow() From 04474986a02ede6b07155cbbe0e6581e20a11c9b Mon Sep 17 00:00:00 2001 From: kirillk Date: Fri, 24 Apr 2026 16:03:55 -0400 Subject: [PATCH 176/238] fix(vscode): localize sidebar worktree actions --- .../webview-ui/agent-manager/i18n/ar.ts | 3 +- .../webview-ui/agent-manager/i18n/br.ts | 3 +- .../webview-ui/agent-manager/i18n/bs.ts | 3 +- .../webview-ui/agent-manager/i18n/da.ts | 3 +- .../webview-ui/agent-manager/i18n/de.ts | 3 +- .../webview-ui/agent-manager/i18n/es.ts | 3 +- .../webview-ui/agent-manager/i18n/fr.ts | 3 +- .../webview-ui/agent-manager/i18n/ja.ts | 3 +- .../webview-ui/agent-manager/i18n/ko.ts | 3 +- .../webview-ui/agent-manager/i18n/nl.ts | 3 +- .../webview-ui/agent-manager/i18n/no.ts | 3 +- .../webview-ui/agent-manager/i18n/pl.ts | 3 +- .../webview-ui/agent-manager/i18n/ru.ts | 3 +- .../webview-ui/agent-manager/i18n/th.ts | 3 +- .../webview-ui/agent-manager/i18n/tr.ts | 3 +- .../webview-ui/agent-manager/i18n/uk.ts | 3 +- .../webview-ui/agent-manager/i18n/zh.ts | 3 +- .../webview-ui/agent-manager/i18n/zht.ts | 3 +- .../src/components/chat/ChatView.tsx | 75 +++++++++++-------- .../kilo-vscode/webview-ui/src/i18n/ar.ts | 31 +++++++- .../kilo-vscode/webview-ui/src/i18n/br.ts | 33 +++++++- .../kilo-vscode/webview-ui/src/i18n/bs.ts | 33 +++++++- .../kilo-vscode/webview-ui/src/i18n/da.ts | 32 +++++++- .../kilo-vscode/webview-ui/src/i18n/de.ts | 34 ++++++++- .../kilo-vscode/webview-ui/src/i18n/en.ts | 30 ++++++++ .../kilo-vscode/webview-ui/src/i18n/es.ts | 32 +++++++- .../kilo-vscode/webview-ui/src/i18n/fr.ts | 35 ++++++++- .../kilo-vscode/webview-ui/src/i18n/ja.ts | 33 +++++++- .../kilo-vscode/webview-ui/src/i18n/ko.ts | 31 +++++++- .../kilo-vscode/webview-ui/src/i18n/nl.ts | 34 ++++++++- .../kilo-vscode/webview-ui/src/i18n/no.ts | 32 +++++++- .../kilo-vscode/webview-ui/src/i18n/pl.ts | 31 +++++++- .../kilo-vscode/webview-ui/src/i18n/ru.ts | 32 +++++++- .../kilo-vscode/webview-ui/src/i18n/th.ts | 32 +++++++- .../kilo-vscode/webview-ui/src/i18n/tr.ts | 33 +++++++- .../kilo-vscode/webview-ui/src/i18n/uk.ts | 31 +++++++- .../kilo-vscode/webview-ui/src/i18n/zh.ts | 30 +++++++- .../kilo-vscode/webview-ui/src/i18n/zht.ts | 30 +++++++- 38 files changed, 670 insertions(+), 68 deletions(-) diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ar.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ar.ts index 8e86eca5d98..8fe7cc66eff 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ar.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ar.ts @@ -71,7 +71,7 @@ export const dict = { "agentManager.shortcuts.nextItem": "العنصر التالي", "agentManager.shortcuts.newWorktree": "Worktree جديد", "agentManager.shortcuts.openWorktree": "فتح Worktree", - "agentManager.shortcuts.advancedWorktree": "Worktree متقدم", + "agentManager.shortcuts.advancedWorktree": "تكوين worktree جديد", "agentManager.shortcuts.deleteWorktree": "حذف Worktree", "agentManager.shortcuts.previousTab": "علامة التبويب السابقة", "agentManager.shortcuts.nextTab": "علامة التبويب التالية", @@ -93,6 +93,7 @@ export const dict = { "agentManager.dialog.removeStaleWorktree.confirm": "إزالة Worktree القديم", "agentManager.dialog.openWorktree": "شجرة عمل جديدة", + "agentManager.dialog.configureWorktree": "تكوين Worktree جديد...", "agentManager.dialog.tab.new": "جديد", "agentManager.dialog.tab.import": "استيراد", "agentManager.dialog.namePlaceholder": "اسم Worktree (اختياري)", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/br.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/br.ts index cdaf64ae9e6..0403f4757c5 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/br.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/br.ts @@ -72,7 +72,7 @@ export const dict = { "agentManager.shortcuts.nextItem": "Próximo item", "agentManager.shortcuts.newWorktree": "Novo Worktree", "agentManager.shortcuts.openWorktree": "Abrir Worktree", - "agentManager.shortcuts.advancedWorktree": "Worktree avançado", + "agentManager.shortcuts.advancedWorktree": "Configurar novo worktree", "agentManager.shortcuts.deleteWorktree": "Excluir Worktree", "agentManager.shortcuts.previousTab": "Aba anterior", "agentManager.shortcuts.nextTab": "Próxima aba", @@ -94,6 +94,7 @@ export const dict = { "agentManager.dialog.removeStaleWorktree.confirm": "Remover Worktree obsoleto", "agentManager.dialog.openWorktree": "Novo Worktree", + "agentManager.dialog.configureWorktree": "Configurar Novo Worktree...", "agentManager.dialog.tab.new": "Novo", "agentManager.dialog.tab.import": "Importar", "agentManager.dialog.namePlaceholder": "Nome do Worktree (opcional)", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/bs.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/bs.ts index bedf7a05359..83d07a4300f 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/bs.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/bs.ts @@ -73,7 +73,7 @@ export const dict = { "agentManager.shortcuts.nextItem": "Sljedeći element", "agentManager.shortcuts.newWorktree": "Novi Worktree", "agentManager.shortcuts.openWorktree": "Otvori worktree", - "agentManager.shortcuts.advancedWorktree": "Napredni Worktree", + "agentManager.shortcuts.advancedWorktree": "Konfiguriši novi worktree", "agentManager.shortcuts.deleteWorktree": "Obriši Worktree", "agentManager.shortcuts.previousTab": "Prethodna kartica", "agentManager.shortcuts.nextTab": "Sljedeća kartica", @@ -95,6 +95,7 @@ export const dict = { "agentManager.dialog.removeStaleWorktree.confirm": "Ukloni zastarjeli Worktree", "agentManager.dialog.openWorktree": "Novi worktree", + "agentManager.dialog.configureWorktree": "Konfiguriši Novi Worktree...", "agentManager.dialog.tab.new": "Novo", "agentManager.dialog.tab.import": "Uvezi", "agentManager.dialog.namePlaceholder": "Naziv Worktree-a (opcionalno)", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/da.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/da.ts index beed91109b8..b922b7ad487 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/da.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/da.ts @@ -72,7 +72,7 @@ export const dict = { "agentManager.shortcuts.nextItem": "Næste element", "agentManager.shortcuts.newWorktree": "Nyt Worktree", "agentManager.shortcuts.openWorktree": "Åbn Worktree", - "agentManager.shortcuts.advancedWorktree": "Avanceret Worktree", + "agentManager.shortcuts.advancedWorktree": "Konfigurer nyt worktree", "agentManager.shortcuts.deleteWorktree": "Slet Worktree", "agentManager.shortcuts.previousTab": "Forrige fane", "agentManager.shortcuts.nextTab": "Næste fane", @@ -94,6 +94,7 @@ export const dict = { "agentManager.dialog.removeStaleWorktree.confirm": "Fjern forældet Worktree", "agentManager.dialog.openWorktree": "Ny Worktree", + "agentManager.dialog.configureWorktree": "Konfigurer Nyt Worktree...", "agentManager.dialog.tab.new": "Ny", "agentManager.dialog.tab.import": "Importér", "agentManager.dialog.namePlaceholder": "Worktree-navn (valgfrit)", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/de.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/de.ts index acc48640f06..056b3365ea9 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/de.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/de.ts @@ -73,7 +73,7 @@ export const dict = { "agentManager.shortcuts.nextItem": "Nächstes Element", "agentManager.shortcuts.newWorktree": "Neuer Worktree", "agentManager.shortcuts.openWorktree": "Worktree öffnen", - "agentManager.shortcuts.advancedWorktree": "Erweiterter Worktree", + "agentManager.shortcuts.advancedWorktree": "Neuen Worktree konfigurieren", "agentManager.shortcuts.deleteWorktree": "Worktree löschen", "agentManager.shortcuts.previousTab": "Vorheriger Tab", "agentManager.shortcuts.nextTab": "Nächster Tab", @@ -95,6 +95,7 @@ export const dict = { "agentManager.dialog.removeStaleWorktree.confirm": "Veralteten Worktree entfernen", "agentManager.dialog.openWorktree": "Neuer Worktree", + "agentManager.dialog.configureWorktree": "Neuen Worktree konfigurieren...", "agentManager.dialog.tab.new": "Neu", "agentManager.dialog.tab.import": "Importieren", "agentManager.dialog.namePlaceholder": "Worktree-Name (optional)", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/es.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/es.ts index 6319f590a9e..55fe7198a8f 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/es.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/es.ts @@ -72,7 +72,7 @@ export const dict = { "agentManager.shortcuts.nextItem": "Siguiente elemento", "agentManager.shortcuts.newWorktree": "Nuevo Worktree", "agentManager.shortcuts.openWorktree": "Abrir Worktree", - "agentManager.shortcuts.advancedWorktree": "Worktree avanzado", + "agentManager.shortcuts.advancedWorktree": "Configurar nuevo worktree", "agentManager.shortcuts.deleteWorktree": "Eliminar Worktree", "agentManager.shortcuts.previousTab": "Pestaña anterior", "agentManager.shortcuts.nextTab": "Siguiente pestaña", @@ -94,6 +94,7 @@ export const dict = { "agentManager.dialog.removeStaleWorktree.confirm": "Eliminar Worktree obsoleto", "agentManager.dialog.openWorktree": "Nuevo Worktree", + "agentManager.dialog.configureWorktree": "Configurar Nuevo Worktree...", "agentManager.dialog.tab.new": "Nuevo", "agentManager.dialog.tab.import": "Importar", "agentManager.dialog.namePlaceholder": "Nombre del Worktree (opcional)", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/fr.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/fr.ts index 840d96b4137..d61da449af9 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/fr.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/fr.ts @@ -72,7 +72,7 @@ export const dict = { "agentManager.shortcuts.nextItem": "Élément suivant", "agentManager.shortcuts.newWorktree": "Nouveau Worktree", "agentManager.shortcuts.openWorktree": "Ouvrir le worktree", - "agentManager.shortcuts.advancedWorktree": "Worktree avancé", + "agentManager.shortcuts.advancedWorktree": "Configurer un nouveau worktree", "agentManager.shortcuts.deleteWorktree": "Supprimer le Worktree", "agentManager.shortcuts.previousTab": "Onglet précédent", "agentManager.shortcuts.nextTab": "Onglet suivant", @@ -94,6 +94,7 @@ export const dict = { "agentManager.dialog.removeStaleWorktree.confirm": "Supprimer le Worktree obsolète", "agentManager.dialog.openWorktree": "Nouveau worktree", + "agentManager.dialog.configureWorktree": "Configurer un Nouveau Worktree...", "agentManager.dialog.tab.new": "Nouveau", "agentManager.dialog.tab.import": "Importer", "agentManager.dialog.namePlaceholder": "Nom du Worktree (optionnel)", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ja.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ja.ts index 965a2fdd6a9..4035c4ac951 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ja.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ja.ts @@ -72,7 +72,7 @@ export const dict = { "agentManager.shortcuts.nextItem": "次の項目", "agentManager.shortcuts.newWorktree": "新しいWorktree", "agentManager.shortcuts.openWorktree": "Worktreeを開く", - "agentManager.shortcuts.advancedWorktree": "詳細Worktree", + "agentManager.shortcuts.advancedWorktree": "新規 worktree の構成", "agentManager.shortcuts.deleteWorktree": "Worktreeを削除", "agentManager.shortcuts.previousTab": "前のタブ", "agentManager.shortcuts.nextTab": "次のタブ", @@ -94,6 +94,7 @@ export const dict = { "agentManager.dialog.removeStaleWorktree.confirm": "無効な Worktree を削除", "agentManager.dialog.openWorktree": "新規ワークツリー", + "agentManager.dialog.configureWorktree": "新規 Worktree の構成...", "agentManager.dialog.tab.new": "新規", "agentManager.dialog.tab.import": "インポート", "agentManager.dialog.namePlaceholder": "Worktree名(任意)", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ko.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ko.ts index 6580d9bfe73..3fa6207bd92 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ko.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ko.ts @@ -72,7 +72,7 @@ export const dict = { "agentManager.shortcuts.nextItem": "다음 항목", "agentManager.shortcuts.newWorktree": "새 Worktree", "agentManager.shortcuts.openWorktree": "Worktree 열기", - "agentManager.shortcuts.advancedWorktree": "고급 Worktree", + "agentManager.shortcuts.advancedWorktree": "새 worktree 구성", "agentManager.shortcuts.deleteWorktree": "Worktree 삭제", "agentManager.shortcuts.previousTab": "이전 탭", "agentManager.shortcuts.nextTab": "다음 탭", @@ -94,6 +94,7 @@ export const dict = { "agentManager.dialog.removeStaleWorktree.confirm": "오래된 Worktree 제거", "agentManager.dialog.openWorktree": "새 워크트리", + "agentManager.dialog.configureWorktree": "새 Worktree 구성...", "agentManager.dialog.tab.new": "새로 만들기", "agentManager.dialog.tab.import": "가져오기", "agentManager.dialog.namePlaceholder": "Worktree 이름 (선택사항)", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/nl.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/nl.ts index bf52dacc3ed..6d71eb72fb9 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/nl.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/nl.ts @@ -77,7 +77,7 @@ export const dict = { "agentManager.shortcuts.nextItem": "Volgend item", "agentManager.shortcuts.newWorktree": "Nieuwe worktree", "agentManager.shortcuts.openWorktree": "Worktree openen", - "agentManager.shortcuts.advancedWorktree": "Geavanceerde worktree", + "agentManager.shortcuts.advancedWorktree": "Nieuwe worktree configureren", "agentManager.shortcuts.deleteWorktree": "Worktree verwijderen", "agentManager.shortcuts.previousTab": "Vorig tabblad", "agentManager.shortcuts.nextTab": "Volgend tabblad", @@ -100,6 +100,7 @@ export const dict = { "agentManager.dialog.removeStaleWorktree.confirm": "Verouderde worktree verwijderen", "agentManager.dialog.openWorktree": "Nieuwe worktree", + "agentManager.dialog.configureWorktree": "Nieuwe Worktree Configureren...", "agentManager.dialog.tab.new": "Nieuw", "agentManager.dialog.tab.import": "Importeren", "agentManager.dialog.namePlaceholder": "Worktree naam (optioneel)", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/no.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/no.ts index 22ce0f348b6..bd0fe919656 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/no.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/no.ts @@ -72,7 +72,7 @@ export const dict = { "agentManager.shortcuts.nextItem": "Neste element", "agentManager.shortcuts.newWorktree": "Nytt Worktree", "agentManager.shortcuts.openWorktree": "Åpne Worktree", - "agentManager.shortcuts.advancedWorktree": "Avansert Worktree", + "agentManager.shortcuts.advancedWorktree": "Konfigurer nytt worktree", "agentManager.shortcuts.deleteWorktree": "Slett Worktree", "agentManager.shortcuts.previousTab": "Forrige fane", "agentManager.shortcuts.nextTab": "Neste fane", @@ -94,6 +94,7 @@ export const dict = { "agentManager.dialog.removeStaleWorktree.confirm": "Fjern utdatert Worktree", "agentManager.dialog.openWorktree": "Ny worktree", + "agentManager.dialog.configureWorktree": "Konfigurer Nytt Worktree...", "agentManager.dialog.tab.new": "Ny", "agentManager.dialog.tab.import": "Importer", "agentManager.dialog.namePlaceholder": "Worktree-navn (valgfritt)", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/pl.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/pl.ts index 84abc9b768b..d27b43d4c3a 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/pl.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/pl.ts @@ -72,7 +72,7 @@ export const dict = { "agentManager.shortcuts.nextItem": "Następny element", "agentManager.shortcuts.newWorktree": "Nowy Worktree", "agentManager.shortcuts.openWorktree": "Otwórz Worktree", - "agentManager.shortcuts.advancedWorktree": "Zaawansowany Worktree", + "agentManager.shortcuts.advancedWorktree": "Skonfiguruj nowe worktree", "agentManager.shortcuts.deleteWorktree": "Usuń Worktree", "agentManager.shortcuts.previousTab": "Poprzednia karta", "agentManager.shortcuts.nextTab": "Następna karta", @@ -94,6 +94,7 @@ export const dict = { "agentManager.dialog.removeStaleWorktree.confirm": "Usuń nieaktualny Worktree", "agentManager.dialog.openWorktree": "Nowy Worktree", + "agentManager.dialog.configureWorktree": "Skonfiguruj Nowe Worktree...", "agentManager.dialog.tab.new": "Nowy", "agentManager.dialog.tab.import": "Importuj", "agentManager.dialog.namePlaceholder": "Nazwa Worktree (opcjonalnie)", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ru.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ru.ts index 96a6117c1dd..c963c944c68 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ru.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ru.ts @@ -72,7 +72,7 @@ export const dict = { "agentManager.shortcuts.nextItem": "Следующий элемент", "agentManager.shortcuts.newWorktree": "Новый Worktree", "agentManager.shortcuts.openWorktree": "Открыть Worktree", - "agentManager.shortcuts.advancedWorktree": "Расширенный Worktree", + "agentManager.shortcuts.advancedWorktree": "Настроить новое worktree", "agentManager.shortcuts.deleteWorktree": "Удалить Worktree", "agentManager.shortcuts.previousTab": "Предыдущая вкладка", "agentManager.shortcuts.nextTab": "Следующая вкладка", @@ -94,6 +94,7 @@ export const dict = { "agentManager.dialog.removeStaleWorktree.confirm": "Удалить устаревший Worktree", "agentManager.dialog.openWorktree": "Новый worktree", + "agentManager.dialog.configureWorktree": "Настроить новое Worktree...", "agentManager.dialog.tab.new": "Новый", "agentManager.dialog.tab.import": "Импорт", "agentManager.dialog.namePlaceholder": "Имя Worktree (необязательно)", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/th.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/th.ts index 0494959ffc8..506f6ba0fa7 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/th.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/th.ts @@ -69,7 +69,7 @@ export const dict = { "agentManager.shortcuts.nextItem": "รายการถัดไป", "agentManager.shortcuts.newWorktree": "Worktree ใหม่", "agentManager.shortcuts.openWorktree": "เปิด Worktree", - "agentManager.shortcuts.advancedWorktree": "Worktree ขั้นสูง", + "agentManager.shortcuts.advancedWorktree": "กำหนดค่า worktree ใหม่", "agentManager.shortcuts.deleteWorktree": "ลบ Worktree", "agentManager.shortcuts.previousTab": "แท็บก่อนหน้า", "agentManager.shortcuts.nextTab": "แท็บถัดไป", @@ -91,6 +91,7 @@ export const dict = { "agentManager.dialog.removeStaleWorktree.confirm": "ลบ Worktree ที่ล้าสมัย", "agentManager.dialog.openWorktree": "Worktree ใหม่", + "agentManager.dialog.configureWorktree": "กำหนดค่า Worktree ใหม่...", "agentManager.dialog.tab.new": "ใหม่", "agentManager.dialog.tab.import": "นำเข้า", "agentManager.dialog.namePlaceholder": "ชื่อ Worktree (ไม่บังคับ)", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/tr.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/tr.ts index 63ced21e2c2..1dac84b5990 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/tr.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/tr.ts @@ -77,7 +77,7 @@ export const dict = { "agentManager.shortcuts.nextItem": "Sonraki öğe", "agentManager.shortcuts.newWorktree": "Yeni worktree", "agentManager.shortcuts.openWorktree": "Worktree aç", - "agentManager.shortcuts.advancedWorktree": "Gelişmiş worktree", + "agentManager.shortcuts.advancedWorktree": "Yeni worktree yapılandır", "agentManager.shortcuts.deleteWorktree": "Worktree'yi sil", "agentManager.shortcuts.previousTab": "Önceki sekme", "agentManager.shortcuts.nextTab": "Sonraki sekme", @@ -100,6 +100,7 @@ export const dict = { "agentManager.dialog.removeStaleWorktree.confirm": "Eskimiş worktree'yi kaldır", "agentManager.dialog.openWorktree": "Yeni Worktree", + "agentManager.dialog.configureWorktree": "Yeni Worktree Yapılandır...", "agentManager.dialog.tab.new": "Yeni", "agentManager.dialog.tab.import": "İçe Aktar", "agentManager.dialog.namePlaceholder": "Worktree adı (isteğe bağlı)", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/uk.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/uk.ts index c9038e02a94..d2d196c6604 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/uk.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/uk.ts @@ -78,7 +78,7 @@ export const dict = { "agentManager.shortcuts.nextItem": "Наступний елемент", "agentManager.shortcuts.newWorktree": "Нове робоче дерево", "agentManager.shortcuts.openWorktree": "Відкрити робоче дерево", - "agentManager.shortcuts.advancedWorktree": "Розширене робоче дерево", + "agentManager.shortcuts.advancedWorktree": "Налаштувати нове worktree", "agentManager.shortcuts.deleteWorktree": "Видалити робоче дерево", "agentManager.shortcuts.previousTab": "Попередня вкладка", "agentManager.shortcuts.nextTab": "Наступна вкладка", @@ -101,6 +101,7 @@ export const dict = { "agentManager.dialog.removeStaleWorktree.confirm": "Видалити застаріле робоче дерево", "agentManager.dialog.openWorktree": "Нове робоче дерево", + "agentManager.dialog.configureWorktree": "Налаштувати нове Worktree...", "agentManager.dialog.tab.new": "Нове", "agentManager.dialog.tab.import": "Імпортувати", "agentManager.dialog.namePlaceholder": "Назва робочого дерева (необов'язково)", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/zh.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/zh.ts index ba08ae225b1..c125c2e385a 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/zh.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/zh.ts @@ -69,7 +69,7 @@ export const dict = { "agentManager.shortcuts.nextItem": "下一项", "agentManager.shortcuts.newWorktree": "新建 Worktree", "agentManager.shortcuts.openWorktree": "打开 Worktree", - "agentManager.shortcuts.advancedWorktree": "高级 Worktree", + "agentManager.shortcuts.advancedWorktree": "配置新 worktree", "agentManager.shortcuts.deleteWorktree": "删除 Worktree", "agentManager.shortcuts.previousTab": "上一个标签页", "agentManager.shortcuts.nextTab": "下一个标签页", @@ -90,6 +90,7 @@ export const dict = { "agentManager.dialog.removeStaleWorktree.confirm": "移除失效 Worktree", "agentManager.dialog.openWorktree": "新建工作树", + "agentManager.dialog.configureWorktree": "配置新 Worktree...", "agentManager.dialog.tab.new": "新建", "agentManager.dialog.tab.import": "导入", "agentManager.dialog.namePlaceholder": "Worktree 名称(可选)", diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/zht.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/zht.ts index 57b281eb832..4fcdc1f355e 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/zht.ts +++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/zht.ts @@ -69,7 +69,7 @@ export const dict = { "agentManager.shortcuts.nextItem": "下一個項目", "agentManager.shortcuts.newWorktree": "新建 Worktree", "agentManager.shortcuts.openWorktree": "開啟 Worktree", - "agentManager.shortcuts.advancedWorktree": "進階 Worktree", + "agentManager.shortcuts.advancedWorktree": "配置新 worktree", "agentManager.shortcuts.deleteWorktree": "刪除 Worktree", "agentManager.shortcuts.previousTab": "上一個分頁", "agentManager.shortcuts.nextTab": "下一個分頁", @@ -90,6 +90,7 @@ export const dict = { "agentManager.dialog.removeStaleWorktree.confirm": "移除失效 Worktree", "agentManager.dialog.openWorktree": "新建工作樹", + "agentManager.dialog.configureWorktree": "配置新 Worktree...", "agentManager.dialog.tab.new": "新建", "agentManager.dialog.tab.import": "匯入", "agentManager.dialog.namePlaceholder": "Worktree 名稱(選填)", diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx index 923c4479377..79878380506 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx @@ -103,11 +103,11 @@ export const ChatView: Component = (props) => { // Listen for "Continue in Worktree" progress messages { const labels: Record = { - capturing: "Capturing changes...", - creating: "Creating worktree...", - setup: "Running setup...", - transferring: "Transferring changes...", - forking: "Starting session...", + capturing: language.t("sidebar.session.progress.capturing"), + creating: language.t("sidebar.session.progress.creating"), + setup: language.t("sidebar.session.progress.setup"), + transferring: language.t("sidebar.session.progress.transferring"), + forking: language.t("sidebar.session.progress.forking"), } const cleanup = vscode.onMessage((msg) => { if (msg.type === "agentManager.repoInfo") { @@ -124,10 +124,10 @@ export const ChatView: Component = (props) => { if (m.status === "error") { setTransferring(false) setTransferDetail("") - showToast({ title: m.error ?? "Failed to continue in worktree" }) + showToast({ title: m.error ?? language.t("sidebar.session.progress.failed") }) return } - setTransferDetail(labels[m.status] ?? "Working...") + setTransferDetail(labels[m.status] ?? language.t("session.status.working")) }) onCleanup(cleanup) } @@ -154,26 +154,35 @@ export const ChatView: Component = (props) => { const sid = id() if (!sid) return setTransferring(true) - setTransferDetail("Capturing changes...") + setTransferDetail(language.t("sidebar.session.progress.capturing")) vscode.postMessage({ type: "continueInWorktree", sessionId: sid }) } - const worktreeTooltip = - "Create an isolated git worktree to experiment safely, keep changes separated, and run parallel sessions without disrupting your current branch." + const worktreeTooltip = language.t("sidebar.session.newWorktree.tooltip") - const advancedTooltip = "Open the Agent Manager worktree dialog to configure a new worktree before creating it." + const advancedTooltip = language.t("sidebar.session.configureWorktree.tooltip") const moveTooltip = () => { const stats = session.worktreeStats() - if (!stats?.files) - return "Move this conversation and your current local changes into a dedicated worktree for isolated follow-up work." - return `Move this conversation and ${stats.files} changed file${stats.files > 1 ? "s" : ""} into a dedicated worktree for isolated follow-up work.` + if (!stats?.files) return language.t("sidebar.session.moveToWorktree.tooltip.empty") + if (stats.files === 1) return language.t("sidebar.session.moveToWorktree.tooltip.one") + return language.t("sidebar.session.moveToWorktree.tooltip.other", { files: stats.files }) } const changesTooltip = () => { const stats = session.worktreeStats() - if (!stats?.files) return "Open the changes view to inspect the current working tree." - return `${stats.files} file${stats.files > 1 ? "s" : ""} changed · +${stats.additions} -${stats.deletions}. Open the changes view.` + if (!stats?.files) return language.t("sidebar.session.showChanges.tooltip.empty") + if (stats.files === 1) { + return language.t("sidebar.session.showChanges.tooltip.one", { + additions: stats.additions, + deletions: stats.deletions, + }) + } + return language.t("sidebar.session.showChanges.tooltip.other", { + files: stats.files, + additions: stats.additions, + deletions: stats.deletions, + }) } const showAdvancedWorktree = () => vscode.postMessage({ type: "openAdvancedWorktree" }) @@ -189,8 +198,8 @@ export const ChatView: Component = (props) => { @@ -200,9 +209,9 @@ export const ChatView: Component = (props) => { class="session-new-button" onClick={startSession} disabled={!hasChat} - aria-label="New Session" + aria-label={language.t("sidebar.session.newSession")} > - New Session + {language.t("sidebar.session.newSession")} @@ -213,14 +222,17 @@ export const ChatView: Component = (props) => { size="small" class="session-worktree-main" onClick={startWorktree} - aria-label="New Worktree" + aria-label={language.t("sidebar.session.newWorktree")} > - New Worktree + {language.t("sidebar.session.newWorktree")} worktreeRef?.getBoundingClientRect()}> - + @@ -229,10 +241,10 @@ export const ChatView: Component = (props) => { @@ -256,12 +268,14 @@ export const ChatView: Component = (props) => { class="session-move-action" aria-disabled={transferring()} onClick={moveToWorktree} - aria-label="Move to Worktree" + aria-label={language.t("sidebar.session.moveToWorktree")} > }> - {transferring() ? transferDetail() : "Move to Worktree"} + + {transferring() ? transferDetail() : language.t("sidebar.session.moveToWorktree")} + @@ -286,16 +300,13 @@ export const ChatView: Component = (props) => {
- + diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts index 960f4dcd253..51be755a801 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts @@ -533,7 +533,36 @@ export const dict = { "session.new.worktree.mainWithBranch": "الفرع الرئيسي ({{branch}})", "session.new.worktree.create": "إنشاء شجرة عمل جديدة", "session.new.lastModified": "آخر تعديل", - + "sidebar.session.newSession": "جلسة جديدة", + "sidebar.session.newSession.tooltip": "ابدأ محادثة جديدة مع الاحتفاظ بالجلسة الحالية كما هي.", + "sidebar.session.newSession.disabled": "هذه الجلسة جديدة بالفعل. ابدأ الدردشة أو أنشئ worktree بدلاً من ذلك.", + "sidebar.session.newWorktree": "Worktree جديد", + "sidebar.session.newWorktree.tooltip": + "أنشئ git worktree معزول للتجربة بأمان، وفصل التغييرات، وتشغيل جلسات متوازية دون تعطيل فرعك الحالي.", + "sidebar.session.configureWorktree.tooltip": + "افتح مربع حوار worktree في Agent Manager لتكوين worktree جديد قبل إنشائه.", + "sidebar.session.newWorktree.from": "Worktree جديد من", + "sidebar.session.currentBranch": "الفرع الحالي", + "sidebar.session.moveToWorktree": "نقل إلى Worktree", + "sidebar.session.moveToWorktree.tooltip.empty": + "انقل هذه المحادثة وتغييراتك المحلية الحالية إلى worktree مخصص لمتابعة العمل في بيئة معزولة.", + "sidebar.session.moveToWorktree.tooltip.one": + "انقل هذه المحادثة وملفًا واحدًا معدلًا إلى worktree مخصص لمتابعة العمل في بيئة معزولة.", + "sidebar.session.moveToWorktree.tooltip.other": + "انقل هذه المحادثة و{{files}} ملفات معدلة إلى worktree مخصص لمتابعة العمل في بيئة معزولة.", + "sidebar.session.showChanges.tooltip.empty": "افتح عرض التغييرات لفحص شجرة العمل الحالية.", + "sidebar.session.showChanges.tooltip.one": "تم تعديل ملف واحد · +{{additions}} -{{deletions}}. افتح عرض التغييرات.", + "sidebar.session.showChanges.tooltip.other": + "تم تعديل {{files}} ملفات · +{{additions}} -{{deletions}}. افتح عرض التغييرات.", + "sidebar.session.agentManager.tooltip": + "افتح Agent Manager للحصول على نظرة عامة كاملة على الجلسات المتوازية و worktrees، لتتمكن من تنسيق المهام الطويلة في مكان واحد.", + "sidebar.session.openAgentManager": "فتح Agent Manager", + "sidebar.session.progress.capturing": "جاري التقاط التغييرات...", + "sidebar.session.progress.creating": "جاري إنشاء worktree...", + "sidebar.session.progress.setup": "جاري تشغيل الإعداد...", + "sidebar.session.progress.transferring": "جاري نقل التغييرات...", + "sidebar.session.progress.forking": "جاري بدء الجلسة...", + "sidebar.session.progress.failed": "فشلت المتابعة في worktree", "session.header.search.placeholder": "بحث {{project}}", "session.header.searchFiles": "بحث عن الملفات", "session.header.openIn": "فتح في", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/br.ts b/packages/kilo-vscode/webview-ui/src/i18n/br.ts index a32c6a96444..ef341c43552 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/br.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/br.ts @@ -535,7 +535,38 @@ export const dict = { "session.new.worktree.mainWithBranch": "Branch principal ({{branch}})", "session.new.worktree.create": "Criar novo worktree", "session.new.lastModified": "Última modificação", - + "sidebar.session.newSession": "Nova Sessão", + "sidebar.session.newSession.tooltip": "Inicie uma nova conversa mantendo a sessão atual intacta.", + "sidebar.session.newSession.disabled": "Esta sessão já é nova. Comece a conversar ou crie um worktree em vez disso.", + "sidebar.session.newWorktree": "Novo Worktree", + "sidebar.session.newWorktree.tooltip": + "Crie um git worktree isolado para experimentar com segurança, manter as alterações separadas e executar sessões paralelas sem interromper sua branch atual.", + "sidebar.session.configureWorktree.tooltip": + "Abra a caixa de diálogo de worktree do Agent Manager para configurar um novo worktree antes de criá-lo.", + "sidebar.session.newWorktree.from": "Novo Worktree de", + "sidebar.session.currentBranch": "branch atual", + "sidebar.session.moveToWorktree": "Mover para Worktree", + "sidebar.session.moveToWorktree.tooltip.empty": + "Mova esta conversa e suas alterações locais atuais para um worktree dedicado para trabalho de acompanhamento isolado.", + "sidebar.session.moveToWorktree.tooltip.one": + "Mover esta conversa e 1 arquivo alterado para um worktree dedicado para trabalho de acompanhamento isolado.", + "sidebar.session.moveToWorktree.tooltip.other": + "Mover esta conversa e {{files}} arquivos alterados para um worktree dedicado para trabalho de acompanhamento isolado.", + "sidebar.session.showChanges.tooltip.empty": + "Abra a visualização de alterações para inspecionar a árvore de trabalho atual.", + "sidebar.session.showChanges.tooltip.one": + "1 arquivo alterado · +{{additions}} -{{deletions}}. Abrir a visualização de alterações.", + "sidebar.session.showChanges.tooltip.other": + "{{files}} arquivos alterados · +{{additions}} -{{deletions}}. Abrir a visualização de alterações.", + "sidebar.session.agentManager.tooltip": + "Abra o Agent Manager para uma visão geral completa de sessões paralelas e worktrees, para que você possa coordenar tarefas longas em um só lugar.", + "sidebar.session.openAgentManager": "Abrir Agent Manager", + "sidebar.session.progress.capturing": "Capturando alterações...", + "sidebar.session.progress.creating": "Criando worktree...", + "sidebar.session.progress.setup": "Executando configuração...", + "sidebar.session.progress.transferring": "Transferindo alterações...", + "sidebar.session.progress.forking": "Iniciando sessão...", + "sidebar.session.progress.failed": "Falha ao continuar no worktree", "session.header.search.placeholder": "Buscar {{project}}", "session.header.searchFiles": "Buscar arquivos", "session.header.openIn": "Abrir em", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts index d6e930dc3c1..2ea58063490 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts @@ -541,7 +541,38 @@ export const dict = { "session.new.worktree.mainWithBranch": "Glavna grana ({{branch}})", "session.new.worktree.create": "Kreiraj novi worktree", "session.new.lastModified": "Posljednja izmjena", - + "sidebar.session.newSession": "Nova Sesija", + "sidebar.session.newSession.tooltip": "Započnite novi razgovor držeći trenutnu sesiju netaknutom.", + "sidebar.session.newSession.disabled": + "Ova sesija je već nova. Započnite razgovor ili umjesto toga kreirajte worktree.", + "sidebar.session.newWorktree": "Novi Worktree", + "sidebar.session.newWorktree.tooltip": + "Kreirajte izolovani git worktree za sigurno eksperimentisanje, odvojeno čuvanje izmjena i pokretanje paralelnih sesija bez prekidanja vaše trenutne grane.", + "sidebar.session.configureWorktree.tooltip": + "Otvorite Agent Manager worktree dijalog za konfigurisanje novog worktree-a prije kreiranja.", + "sidebar.session.newWorktree.from": "Novi Worktree od", + "sidebar.session.currentBranch": "trenutna grana", + "sidebar.session.moveToWorktree": "Premjesti u Worktree", + "sidebar.session.moveToWorktree.tooltip.empty": + "Premjestite ovaj razgovor i vaše trenutne lokalne izmjene u namjenski worktree za izolovani radni nastavak.", + "sidebar.session.moveToWorktree.tooltip.one": + "Premjesti ovaj razgovor i 1 izmijenjen fajl u namjenski worktree za izolovani naknadni rad.", + "sidebar.session.moveToWorktree.tooltip.other": + "Premjesti ovaj razgovor i {{files}} izmijenjenih fajlova u namjenski worktree za izolovani naknadni rad.", + "sidebar.session.showChanges.tooltip.empty": "Otvorite prikaz izmjena da pregledate trenutno radno stablo.", + "sidebar.session.showChanges.tooltip.one": + "1 fajl izmijenjen · +{{additions}} -{{deletions}}. Otvori pregled izmjena.", + "sidebar.session.showChanges.tooltip.other": + "{{files}} fajlova izmijenjeno · +{{additions}} -{{deletions}}. Otvori pregled izmjena.", + "sidebar.session.agentManager.tooltip": + "Otvorite Agent Manager za potpuni pregled paralelnih sesija i worktree-a, kako biste mogli koordinirati dugotrajne zadatke na jednom mjestu.", + "sidebar.session.openAgentManager": "Otvori Agent Manager", + "sidebar.session.progress.capturing": "Snimanje izmjena...", + "sidebar.session.progress.creating": "Kreiranje worktree-a...", + "sidebar.session.progress.setup": "Pokretanje podešavanja...", + "sidebar.session.progress.transferring": "Prijenos izmjena...", + "sidebar.session.progress.forking": "Pokretanje sesije...", + "sidebar.session.progress.failed": "Nije uspjelo nastavljanje u worktree-u", "session.header.search.placeholder": "Pretraži {{project}}", "session.header.searchFiles": "Pretraži datoteke", "session.header.openIn": "Otvori u", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/da.ts b/packages/kilo-vscode/webview-ui/src/i18n/da.ts index e250d36dd8f..2ebbcda0082 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/da.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/da.ts @@ -536,7 +536,37 @@ export const dict = { "session.new.worktree.mainWithBranch": "Hovedgren ({{branch}})", "session.new.worktree.create": "Opret nyt worktree", "session.new.lastModified": "Sidst ændret", - + "sidebar.session.newSession": "Ny Session", + "sidebar.session.newSession.tooltip": "Start en frisk samtale, mens den nuværende session holdes intakt.", + "sidebar.session.newSession.disabled": + "Denne session er allerede ny. Start med at chatte eller opret et worktree i stedet.", + "sidebar.session.newWorktree": "Nyt Worktree", + "sidebar.session.newWorktree.tooltip": + "Opret et isoleret git worktree for at eksperimentere sikkert, holde ændringer adskilt og køre parallelle sessioner uden at forstyrre din nuværende branch.", + "sidebar.session.configureWorktree.tooltip": + "Åbn Agent Manager worktree-dialogen for at konfigurere et nyt worktree før oprettelse.", + "sidebar.session.newWorktree.from": "Nyt Worktree fra", + "sidebar.session.currentBranch": "nuværende branch", + "sidebar.session.moveToWorktree": "Flyt til Worktree", + "sidebar.session.moveToWorktree.tooltip.empty": + "Flyt denne samtale og dine nuværende lokale ændringer til et dedikeret worktree for isoleret opfølgningsarbejde.", + "sidebar.session.moveToWorktree.tooltip.one": + "Flyt denne samtale og 1 ændret fil til et dedikeret worktree for isoleret opfølgende arbejde.", + "sidebar.session.moveToWorktree.tooltip.other": + "Flyt denne samtale og {{files}} ændrede filer til et dedikeret worktree for isoleret opfølgende arbejde.", + "sidebar.session.showChanges.tooltip.empty": "Åbn ændringsvisningen for at inspicere det nuværende worktree.", + "sidebar.session.showChanges.tooltip.one": "1 fil ændret · +{{additions}} -{{deletions}}. Åbn ændringsvisningen.", + "sidebar.session.showChanges.tooltip.other": + "{{files}} filer ændret · +{{additions}} -{{deletions}}. Åbn ændringsvisningen.", + "sidebar.session.agentManager.tooltip": + "Åbn Agent Manager for et komplet overblik over parallelle sessioner og worktrees, så du kan koordinere langvarige opgaver ét sted.", + "sidebar.session.openAgentManager": "Åbn Agent Manager", + "sidebar.session.progress.capturing": "Fanger ændringer...", + "sidebar.session.progress.creating": "Opretter worktree...", + "sidebar.session.progress.setup": "Kører opsætning...", + "sidebar.session.progress.transferring": "Overfører ændringer...", + "sidebar.session.progress.forking": "Starter session...", + "sidebar.session.progress.failed": "Kunne ikke fortsætte i worktree", "session.header.search.placeholder": "Søg {{project}}", "session.header.searchFiles": "Søg efter filer", "session.header.openIn": "Åbn i", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/de.ts b/packages/kilo-vscode/webview-ui/src/i18n/de.ts index 6a9e9e59a75..df864b52244 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/de.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/de.ts @@ -543,7 +543,39 @@ export const dict = { "session.new.worktree.mainWithBranch": "Haupt-Branch ({{branch}})", "session.new.worktree.create": "Neuen Worktree erstellen", "session.new.lastModified": "Zuletzt geändert", - + "sidebar.session.newSession": "Neue Sitzung", + "sidebar.session.newSession.tooltip": "Starte eine neue Unterhaltung, während die aktuelle Sitzung intakt bleibt.", + "sidebar.session.newSession.disabled": + "Diese Sitzung ist bereits neu. Beginne zu chatten oder erstelle stattdessen einen Worktree.", + "sidebar.session.newWorktree": "Neuer Worktree", + "sidebar.session.newWorktree.tooltip": + "Erstelle einen isolierten Git-Worktree, um sicher zu experimentieren, Änderungen getrennt zu halten und parallele Sitzungen auszuführen, ohne deinen aktuellen Branch zu stören.", + "sidebar.session.configureWorktree.tooltip": + "Öffne den Agent Manager Worktree-Dialog, um einen neuen Worktree vor der Erstellung zu konfigurieren.", + "sidebar.session.newWorktree.from": "Neuer Worktree von", + "sidebar.session.currentBranch": "aktueller Branch", + "sidebar.session.moveToWorktree": "In Worktree verschieben", + "sidebar.session.moveToWorktree.tooltip.empty": + "Verschiebe diese Unterhaltung und deine aktuellen lokalen Änderungen in einen dedizierten Worktree für isolierte Folgearbeiten.", + "sidebar.session.moveToWorktree.tooltip.one": + "Diese Unterhaltung und 1 geänderte Datei in einen dedizierten Worktree für isolierte Folgearbeiten verschieben.", + "sidebar.session.moveToWorktree.tooltip.other": + "Diese Unterhaltung und {{files}} geänderte Dateien in einen dedizierten Worktree für isolierte Folgearbeiten verschieben.", + "sidebar.session.showChanges.tooltip.empty": + "Öffne die Änderungsansicht, um den aktuellen Working Tree zu überprüfen.", + "sidebar.session.showChanges.tooltip.one": + "1 Datei geändert · +{{additions}} -{{deletions}}. Änderungsansicht öffnen.", + "sidebar.session.showChanges.tooltip.other": + "{{files}} Dateien geändert · +{{additions}} -{{deletions}}. Änderungsansicht öffnen.", + "sidebar.session.agentManager.tooltip": + "Öffne den Agent Manager für einen vollständigen Überblick über parallele Sitzungen und Worktrees, damit du langlaufende Aufgaben an einem Ort koordinieren kannst.", + "sidebar.session.openAgentManager": "Agent Manager öffnen", + "sidebar.session.progress.capturing": "Änderungen werden erfasst...", + "sidebar.session.progress.creating": "Worktree wird erstellt...", + "sidebar.session.progress.setup": "Setup wird ausgeführt...", + "sidebar.session.progress.transferring": "Änderungen werden übertragen...", + "sidebar.session.progress.forking": "Sitzung wird gestartet...", + "sidebar.session.progress.failed": "Fortsetzen im Worktree fehlgeschlagen", "session.header.search.placeholder": "{{project}} durchsuchen", "session.header.searchFiles": "Dateien suchen", "session.header.openIn": "Öffnen in", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/en.ts b/packages/kilo-vscode/webview-ui/src/i18n/en.ts index 0413b4ee0c3..a89ef7beeea 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/en.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/en.ts @@ -986,6 +986,36 @@ export const dict = { "session.status.retrying": "Retrying (attempt {{ attempt }})… {{ message }}", "session.status.working": "Working...", "session.status.offline": "Network disconnected — reconnecting...", + "sidebar.session.newSession": "New Session", + "sidebar.session.newSession.tooltip": "Start a fresh conversation while keeping the current session intact.", + "sidebar.session.newSession.disabled": "This session is already new. Start chatting or create a worktree instead.", + "sidebar.session.newWorktree": "New Worktree", + "sidebar.session.newWorktree.tooltip": + "Create an isolated git worktree to experiment safely, keep changes separated, and run parallel sessions without disrupting your current branch.", + "sidebar.session.configureWorktree.tooltip": + "Open the Agent Manager worktree dialog to configure a new worktree before creating it.", + "sidebar.session.newWorktree.from": "New Worktree from", + "sidebar.session.currentBranch": "current branch", + "sidebar.session.moveToWorktree": "Move to Worktree", + "sidebar.session.moveToWorktree.tooltip.empty": + "Move this conversation and your current local changes into a dedicated worktree for isolated follow-up work.", + "sidebar.session.moveToWorktree.tooltip.one": + "Move this conversation and 1 changed file into a dedicated worktree for isolated follow-up work.", + "sidebar.session.moveToWorktree.tooltip.other": + "Move this conversation and {{files}} changed files into a dedicated worktree for isolated follow-up work.", + "sidebar.session.showChanges.tooltip.empty": "Open the changes view to inspect the current working tree.", + "sidebar.session.showChanges.tooltip.one": "1 file changed · +{{additions}} -{{deletions}}. Open the changes view.", + "sidebar.session.showChanges.tooltip.other": + "{{files}} files changed · +{{additions}} -{{deletions}}. Open the changes view.", + "sidebar.session.agentManager.tooltip": + "Open Agent Manager for a full overview of parallel sessions and worktrees, so you can coordinate long-running tasks in one place.", + "sidebar.session.openAgentManager": "Open Agent Manager", + "sidebar.session.progress.capturing": "Capturing changes...", + "sidebar.session.progress.creating": "Creating worktree...", + "sidebar.session.progress.setup": "Running setup...", + "sidebar.session.progress.transferring": "Transferring changes...", + "sidebar.session.progress.forking": "Starting session...", + "sidebar.session.progress.failed": "Failed to continue in worktree", "ui.sessionTurn.cancel": "Cancel", "ui.sessionTurn.status.thinking": "Thinking...", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/es.ts b/packages/kilo-vscode/webview-ui/src/i18n/es.ts index 782eb7436ec..9982c43a821 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/es.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/es.ts @@ -538,7 +538,37 @@ export const dict = { "session.new.worktree.mainWithBranch": "Rama principal ({{branch}})", "session.new.worktree.create": "Crear nuevo árbol de trabajo", "session.new.lastModified": "Última modificación", - + "sidebar.session.newSession": "Nueva Sesión", + "sidebar.session.newSession.tooltip": "Inicia una nueva conversación manteniendo intacta la sesión actual.", + "sidebar.session.newSession.disabled": "Esta sesión ya es nueva. Empieza a chatear o crea un worktree en su lugar.", + "sidebar.session.newWorktree": "Nuevo Worktree", + "sidebar.session.newWorktree.tooltip": + "Crea un git worktree aislado para experimentar de forma segura, mantener los cambios separados y ejecutar sesiones paralelas sin interrumpir tu rama actual.", + "sidebar.session.configureWorktree.tooltip": + "Abre el diálogo de worktree en el Agent Manager para configurar un nuevo worktree antes de crearlo.", + "sidebar.session.newWorktree.from": "Nuevo Worktree desde", + "sidebar.session.currentBranch": "rama actual", + "sidebar.session.moveToWorktree": "Mover a Worktree", + "sidebar.session.moveToWorktree.tooltip.empty": + "Mueve esta conversación y tus cambios locales actuales a un worktree dedicado para un trabajo de seguimiento aislado.", + "sidebar.session.moveToWorktree.tooltip.one": + "Mover esta conversación y 1 archivo modificado a un worktree dedicado para trabajo de seguimiento aislado.", + "sidebar.session.moveToWorktree.tooltip.other": + "Mover esta conversación y {{files}} archivos modificados a un worktree dedicado para trabajo de seguimiento aislado.", + "sidebar.session.showChanges.tooltip.empty": "Abre la vista de cambios para inspeccionar el árbol de trabajo actual.", + "sidebar.session.showChanges.tooltip.one": + "1 archivo modificado · +{{additions}} -{{deletions}}. Abrir la vista de cambios.", + "sidebar.session.showChanges.tooltip.other": + "{{files}} archivos modificados · +{{additions}} -{{deletions}}. Abrir la vista de cambios.", + "sidebar.session.agentManager.tooltip": + "Abre el Agent Manager para obtener una vista general completa de las sesiones paralelas y los worktrees, para que puedas coordinar tareas de larga duración en un solo lugar.", + "sidebar.session.openAgentManager": "Abrir Agent Manager", + "sidebar.session.progress.capturing": "Capturando cambios...", + "sidebar.session.progress.creating": "Creando worktree...", + "sidebar.session.progress.setup": "Ejecutando configuración...", + "sidebar.session.progress.transferring": "Transfiriendo cambios...", + "sidebar.session.progress.forking": "Iniciando sesión...", + "sidebar.session.progress.failed": "No se pudo continuar en el worktree", "session.header.search.placeholder": "Buscar {{project}}", "session.header.searchFiles": "Buscar archivos", "session.header.openIn": "Abrir en", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts index 9d7fe4562ef..bd9aec2d999 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts @@ -543,7 +543,40 @@ export const dict = { "session.new.worktree.mainWithBranch": "Branche principale ({{branch}})", "session.new.worktree.create": "Créer un nouvel arbre de travail", "session.new.lastModified": "Dernière modification", - + "sidebar.session.newSession": "Nouvelle Session", + "sidebar.session.newSession.tooltip": + "Démarrer une nouvelle conversation tout en gardant la session actuelle intacte.", + "sidebar.session.newSession.disabled": + "Cette session est déjà nouvelle. Commencez à discuter ou créez plutôt un worktree.", + "sidebar.session.newWorktree": "Nouveau Worktree", + "sidebar.session.newWorktree.tooltip": + "Créer un git worktree isolé pour expérimenter en toute sécurité, séparer les modifications et exécuter des sessions parallèles sans perturber votre branche actuelle.", + "sidebar.session.configureWorktree.tooltip": + "Ouvrez la boîte de dialogue worktree du Agent Manager pour configurer un nouveau worktree avant de le créer.", + "sidebar.session.newWorktree.from": "Nouveau Worktree depuis", + "sidebar.session.currentBranch": "branche actuelle", + "sidebar.session.moveToWorktree": "Déplacer vers un Worktree", + "sidebar.session.moveToWorktree.tooltip.empty": + "Déplacez cette conversation et vos modifications locales actuelles dans un worktree dédié pour un travail de suivi isolé.", + "sidebar.session.moveToWorktree.tooltip.one": + "Déplacer cette conversation et 1 fichier modifié vers un worktree dédié pour un travail de suivi isolé.", + "sidebar.session.moveToWorktree.tooltip.other": + "Déplacer cette conversation et {{files}} fichiers modifiés vers un worktree dédié pour un travail de suivi isolé.", + "sidebar.session.showChanges.tooltip.empty": + "Ouvrez la vue des modifications pour inspecter l'arborescence de travail actuelle.", + "sidebar.session.showChanges.tooltip.one": + "1 fichier modifié · +{{additions}} -{{deletions}}. Ouvrir la vue des modifications.", + "sidebar.session.showChanges.tooltip.other": + "{{files}} fichiers modifiés · +{{additions}} -{{deletions}}. Ouvrir la vue des modifications.", + "sidebar.session.agentManager.tooltip": + "Ouvrez Agent Manager pour une vue d'ensemble complète des sessions parallèles et des worktrees, afin de coordonner les tâches longues en un seul endroit.", + "sidebar.session.openAgentManager": "Ouvrir Agent Manager", + "sidebar.session.progress.capturing": "Capture des modifications...", + "sidebar.session.progress.creating": "Création du worktree...", + "sidebar.session.progress.setup": "Exécution de la configuration...", + "sidebar.session.progress.transferring": "Transfert des modifications...", + "sidebar.session.progress.forking": "Démarrage de la session...", + "sidebar.session.progress.failed": "Échec de la poursuite dans le worktree", "session.header.search.placeholder": "Rechercher {{project}}", "session.header.searchFiles": "Rechercher des fichiers", "session.header.openIn": "Ouvrir dans", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts index dc5c465c5fc..f3f0f908afd 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts @@ -534,7 +534,38 @@ export const dict = { "session.new.worktree.mainWithBranch": "メインブランチ ({{branch}})", "session.new.worktree.create": "新しいワークツリーを作成", "session.new.lastModified": "最終更新", - + "sidebar.session.newSession": "新規セッション", + "sidebar.session.newSession.tooltip": "現在のセッションを維持したまま、新しい会話を開始します。", + "sidebar.session.newSession.disabled": + "このセッションは既に新規です。チャットを開始するか、代わりに worktree を作成してください。", + "sidebar.session.newWorktree": "新規 Worktree", + "sidebar.session.newWorktree.tooltip": + "隔離された git worktree を作成して、安全に実験し、変更を分離し、現在のブランチを中断することなく並行セッションを実行します。", + "sidebar.session.configureWorktree.tooltip": + "Agent Manager の worktree ダイアログを開き、作成する前に新しい worktree を構成します。", + "sidebar.session.newWorktree.from": "新規 Worktree の作成元", + "sidebar.session.currentBranch": "現在のブランチ", + "sidebar.session.moveToWorktree": "Worktree に移動", + "sidebar.session.moveToWorktree.tooltip.empty": + "この会話と現在のローカルの変更を専用の worktree に移動して、隔離された環境で作業を続行します。", + "sidebar.session.moveToWorktree.tooltip.one": + "この会話と1つの変更されたファイルを、分離されたフォローアップ作業用の専用 worktree に移動します。", + "sidebar.session.moveToWorktree.tooltip.other": + "この会話と{{files}}個の変更されたファイルを、分離されたフォローアップ作業用の専用 worktree に移動します。", + "sidebar.session.showChanges.tooltip.empty": "変更ビューを開いて、現在の作業ツリーを検査します。", + "sidebar.session.showChanges.tooltip.one": + "1つのファイルが変更されました · +{{additions}} -{{deletions}}。変更ビューを開きます。", + "sidebar.session.showChanges.tooltip.other": + "{{files}}個のファイルが変更されました · +{{additions}} -{{deletions}}。変更ビューを開きます。", + "sidebar.session.agentManager.tooltip": + "Agent Manager を開いて、並行セッションと worktree の全体像を把握し、時間のかかるタスクを 1 か所で調整できます。", + "sidebar.session.openAgentManager": "Agent Manager を開く", + "sidebar.session.progress.capturing": "変更をキャプチャ中...", + "sidebar.session.progress.creating": "worktree を作成中...", + "sidebar.session.progress.setup": "セットアップを実行中...", + "sidebar.session.progress.transferring": "変更を転送中...", + "sidebar.session.progress.forking": "セッションを開始中...", + "sidebar.session.progress.failed": "worktree での再開に失敗しました", "session.header.search.placeholder": "{{project}}を検索", "session.header.searchFiles": "ファイルを検索", "session.header.openIn": "で開く", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts index b042919779d..aeb71510d09 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts @@ -536,7 +536,36 @@ export const dict = { "session.new.worktree.mainWithBranch": "메인 브랜치 ({{branch}})", "session.new.worktree.create": "새 작업 트리 생성", "session.new.lastModified": "최근 수정", - + "sidebar.session.newSession": "새 세션", + "sidebar.session.newSession.tooltip": "현재 세션을 그대로 유지하면서 새로운 대화를 시작합니다.", + "sidebar.session.newSession.disabled": "이 세션은 이미 새 세션입니다. 채팅을 시작하거나 대신 worktree를 만드세요.", + "sidebar.session.newWorktree": "새 Worktree", + "sidebar.session.newWorktree.tooltip": + "격리된 git worktree를 만들어 안전하게 실험하고, 변경 사항을 분리하며, 현재 브랜치를 방해하지 않고 병렬 세션을 실행합니다.", + "sidebar.session.configureWorktree.tooltip": + "Agent Manager worktree 대화상자를 열어 생성하기 전에 새 worktree를 구성합니다.", + "sidebar.session.newWorktree.from": "다음에서 새 Worktree 생성:", + "sidebar.session.currentBranch": "현재 브랜치", + "sidebar.session.moveToWorktree": "Worktree로 이동", + "sidebar.session.moveToWorktree.tooltip.empty": + "이 대화 및 현재 로컬 변경 사항을 전용 worktree로 이동하여 격리된 후속 작업을 수행합니다.", + "sidebar.session.moveToWorktree.tooltip.one": + "이 대화와 변경된 파일 1개를 격리된 후속 작업을 위해 전용 worktree로 이동합니다.", + "sidebar.session.moveToWorktree.tooltip.other": + "이 대화와 변경된 파일 {{files}}개를 격리된 후속 작업을 위해 전용 worktree로 이동합니다.", + "sidebar.session.showChanges.tooltip.empty": "변경 사항 뷰를 열어 현재 작업 트리를 검사합니다.", + "sidebar.session.showChanges.tooltip.one": "파일 1개 변경됨 · +{{additions}} -{{deletions}}. 변경 사항 뷰 열기.", + "sidebar.session.showChanges.tooltip.other": + "파일 {{files}}개 변경됨 · +{{additions}} -{{deletions}}. 변경 사항 뷰 열기.", + "sidebar.session.agentManager.tooltip": + "Agent Manager를 열어 병렬 세션 및 worktree의 전체 개요를 확인하고, 장기 실행 작업을 한 곳에서 조정할 수 있습니다.", + "sidebar.session.openAgentManager": "Agent Manager 열기", + "sidebar.session.progress.capturing": "변경 사항 캡처 중...", + "sidebar.session.progress.creating": "worktree 생성 중...", + "sidebar.session.progress.setup": "설정 실행 중...", + "sidebar.session.progress.transferring": "변경 사항 전송 중...", + "sidebar.session.progress.forking": "세션 시작 중...", + "sidebar.session.progress.failed": "worktree에서 계속하지 못했습니다", "session.header.search.placeholder": "{{project}} 검색", "session.header.searchFiles": "파일 검색", "session.header.openIn": "열기", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts index 4c44e82911b..bf92c2a559c 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts @@ -540,7 +540,39 @@ export const dict = { "session.new.worktree.mainWithBranch": "Main-branch ({{branch}})", "session.new.worktree.create": "Nieuwe worktree aanmaken", "session.new.lastModified": "Laatst gewijzigd", - + "sidebar.session.newSession": "Nieuwe Sessie", + "sidebar.session.newSession.tooltip": "Start een nieuw gesprek terwijl je de huidige sessie intact houdt.", + "sidebar.session.newSession.disabled": + "Deze sessie is al nieuw. Begin met chatten of maak in plaats daarvan een worktree aan.", + "sidebar.session.newWorktree": "Nieuwe Worktree", + "sidebar.session.newWorktree.tooltip": + "Maak een geïsoleerde git worktree aan om veilig te experimenteren, wijzigingen gescheiden te houden en parallelle sessies uit te voeren zonder je huidige branch te verstoren.", + "sidebar.session.configureWorktree.tooltip": + "Open het Agent Manager worktree-dialoogvenster om een nieuwe worktree te configureren voordat je deze aanmaakt.", + "sidebar.session.newWorktree.from": "Nieuwe Worktree van", + "sidebar.session.currentBranch": "huidige branch", + "sidebar.session.moveToWorktree": "Verplaats naar Worktree", + "sidebar.session.moveToWorktree.tooltip.empty": + "Verplaats dit gesprek en je huidige lokale wijzigingen naar een toegewijde worktree voor geïsoleerd vervolgwerk.", + "sidebar.session.moveToWorktree.tooltip.one": + "Verplaats deze conversatie en 1 gewijzigd bestand naar een specifieke worktree voor geïsoleerd vervolgwerk.", + "sidebar.session.moveToWorktree.tooltip.other": + "Verplaats deze conversatie en {{files}} gewijzigde bestanden naar een specifieke worktree voor geïsoleerd vervolgwerk.", + "sidebar.session.showChanges.tooltip.empty": + "Open de weergave met wijzigingen om de huidige worktree te inspecteren.", + "sidebar.session.showChanges.tooltip.one": + "1 bestand gewijzigd · +{{additions}} -{{deletions}}. Open de wijzigingenweergave.", + "sidebar.session.showChanges.tooltip.other": + "{{files}} bestanden gewijzigd · +{{additions}} -{{deletions}}. Open de wijzigingenweergave.", + "sidebar.session.agentManager.tooltip": + "Open Agent Manager voor een compleet overzicht van parallelle sessies en worktrees, zodat je langlopende taken op één plek kunt coördineren.", + "sidebar.session.openAgentManager": "Open Agent Manager", + "sidebar.session.progress.capturing": "Wijzigingen vastleggen...", + "sidebar.session.progress.creating": "Worktree aanmaken...", + "sidebar.session.progress.setup": "Setup uitvoeren...", + "sidebar.session.progress.transferring": "Wijzigingen overzetten...", + "sidebar.session.progress.forking": "Sessie starten...", + "sidebar.session.progress.failed": "Kan niet doorgaan in worktree", "session.header.search.placeholder": "Zoek in {{project}}", "session.header.searchFiles": "Bestanden zoeken", "session.header.openIn": "Open in", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/no.ts b/packages/kilo-vscode/webview-ui/src/i18n/no.ts index be8327ccab6..47f14534f32 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/no.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/no.ts @@ -539,7 +539,37 @@ export const dict = { "session.new.worktree.mainWithBranch": "Hovedgren ({{branch}})", "session.new.worktree.create": "Opprett nytt worktree", "session.new.lastModified": "Sist endret", - + "sidebar.session.newSession": "Ny Økt", + "sidebar.session.newSession.tooltip": "Start en ny samtale mens den nåværende økten holdes intakt.", + "sidebar.session.newSession.disabled": + "Denne økten er allerede ny. Start en chat eller opprett et worktree i stedet.", + "sidebar.session.newWorktree": "Nytt Worktree", + "sidebar.session.newWorktree.tooltip": + "Opprett et isolert git worktree for å eksperimentere trygt, holde endringer adskilt og kjøre parallelle økter uten å forstyrre din nåværende branch.", + "sidebar.session.configureWorktree.tooltip": + "Åpne Agent Manager worktree-dialogen for å konfigurere et nytt worktree før opprettelse.", + "sidebar.session.newWorktree.from": "Nytt Worktree fra", + "sidebar.session.currentBranch": "nåværende branch", + "sidebar.session.moveToWorktree": "Flytt til Worktree", + "sidebar.session.moveToWorktree.tooltip.empty": + "Flytt denne samtalen og dine nåværende lokale endringer til et dedikert worktree for isolert oppfølgingsarbeid.", + "sidebar.session.moveToWorktree.tooltip.one": + "Flytt denne samtalen og 1 endret fil til en dedikert worktree for isolert oppfølgingsarbeid.", + "sidebar.session.moveToWorktree.tooltip.other": + "Flytt denne samtalen og {{files}} endrede filer til en dedikert worktree for isolert oppfølgingsarbeid.", + "sidebar.session.showChanges.tooltip.empty": "Åpne endringsvisningen for å inspisere det nåværende arbeidstreet.", + "sidebar.session.showChanges.tooltip.one": "1 fil endret · +{{additions}} -{{deletions}}. Åpne endringsvisningen.", + "sidebar.session.showChanges.tooltip.other": + "{{files}} filer endret · +{{additions}} -{{deletions}}. Åpne endringsvisningen.", + "sidebar.session.agentManager.tooltip": + "Åpne Agent Manager for full oversikt over parallelle økter og worktrees, slik at du kan koordinere langvarige oppgaver på ett sted.", + "sidebar.session.openAgentManager": "Åpne Agent Manager", + "sidebar.session.progress.capturing": "Fanger endringer...", + "sidebar.session.progress.creating": "Oppretter worktree...", + "sidebar.session.progress.setup": "Kjører oppsett...", + "sidebar.session.progress.transferring": "Overfører endringer...", + "sidebar.session.progress.forking": "Starter økt...", + "sidebar.session.progress.failed": "Kunne ikke fortsette i worktree", "session.header.search.placeholder": "Søk i {{project}}", "session.header.searchFiles": "Søk etter filer", "session.header.openIn": "Åpne i", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts index 61f95eb5961..a98a4a0f33a 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts @@ -537,7 +537,36 @@ export const dict = { "session.new.worktree.mainWithBranch": "Główna gałąź ({{branch}})", "session.new.worktree.create": "Utwórz nowe drzewo robocze", "session.new.lastModified": "Ostatnio zmodyfikowano", - + "sidebar.session.newSession": "Nowa Sesja", + "sidebar.session.newSession.tooltip": "Rozpocznij nową konwersację, zachowując obecną sesję bez zmian.", + "sidebar.session.newSession.disabled": "Ta sesja jest już nowa. Rozpocznij czat lub zamiast tego utwórz worktree.", + "sidebar.session.newWorktree": "Nowe Worktree", + "sidebar.session.newWorktree.tooltip": + "Utwórz odizolowane git worktree, aby bezpiecznie eksperymentować, oddzielać zmiany i uruchamiać równoległe sesje bez zakłócania obecnej gałęzi.", + "sidebar.session.configureWorktree.tooltip": + "Otwórz okno dialogowe worktree w Agent Manager, aby skonfigurować nowe worktree przed jego utworzeniem.", + "sidebar.session.newWorktree.from": "Nowe Worktree z", + "sidebar.session.currentBranch": "obecna gałąź", + "sidebar.session.moveToWorktree": "Przenieś do Worktree", + "sidebar.session.moveToWorktree.tooltip.empty": + "Przenieś tę konwersację i obecne lokalne zmiany do dedykowanego worktree w celu izolowanej dalszej pracy.", + "sidebar.session.moveToWorktree.tooltip.one": + "Przenieś tę rozmowę i 1 zmieniony plik do dedykowanego worktree w celu izolowanej dalszej pracy.", + "sidebar.session.moveToWorktree.tooltip.other": + "Przenieś tę rozmowę i {{files}} zmienionych plików do dedykowanego worktree w celu izolowanej dalszej pracy.", + "sidebar.session.showChanges.tooltip.empty": "Otwórz widok zmian, aby sprawdzić obecne drzewo robocze.", + "sidebar.session.showChanges.tooltip.one": "1 plik zmieniony · +{{additions}} -{{deletions}}. Otwórz widok zmian.", + "sidebar.session.showChanges.tooltip.other": + "{{files}} zmienionych plików · +{{additions}} -{{deletions}}. Otwórz widok zmian.", + "sidebar.session.agentManager.tooltip": + "Otwórz Agent Manager, aby uzyskać pełny przegląd równoległych sesji i worktree, ułatwiając koordynację długotrwałych zadań w jednym miejscu.", + "sidebar.session.openAgentManager": "Otwórz Agent Manager", + "sidebar.session.progress.capturing": "Przechwytywanie zmian...", + "sidebar.session.progress.creating": "Tworzenie worktree...", + "sidebar.session.progress.setup": "Uruchamianie konfiguracji...", + "sidebar.session.progress.transferring": "Przesyłanie zmian...", + "sidebar.session.progress.forking": "Uruchamianie sesji...", + "sidebar.session.progress.failed": "Nie udało się kontynuować w worktree", "session.header.search.placeholder": "Szukaj {{project}}", "session.header.searchFiles": "Szukaj plików", "session.header.openIn": "Otwórz w", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts index 63c152bab07..66dba19d866 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts @@ -538,7 +538,37 @@ export const dict = { "session.new.worktree.mainWithBranch": "Основная ветка ({{branch}})", "session.new.worktree.create": "Создать новый worktree", "session.new.lastModified": "Последнее изменение", - + "sidebar.session.newSession": "Новая сессия", + "sidebar.session.newSession.tooltip": "Начать новую беседу, сохранив текущую сессию нетронутой.", + "sidebar.session.newSession.disabled": "Эта сессия уже новая. Начните чат или создайте worktree.", + "sidebar.session.newWorktree": "Новое Worktree", + "sidebar.session.newWorktree.tooltip": + "Создайте изолированное git worktree для безопасных экспериментов, разделения изменений и запуска параллельных сессий без прерывания вашей текущей ветки.", + "sidebar.session.configureWorktree.tooltip": + "Откройте диалоговое окно worktree в Agent Manager, чтобы настроить новое worktree перед созданием.", + "sidebar.session.newWorktree.from": "Новое Worktree из", + "sidebar.session.currentBranch": "текущей ветки", + "sidebar.session.moveToWorktree": "Перенести в Worktree", + "sidebar.session.moveToWorktree.tooltip.empty": + "Перенесите эту беседу и ваши текущие локальные изменения в выделенное worktree для изолированной последующей работы.", + "sidebar.session.moveToWorktree.tooltip.one": + "Переместить этот разговор и 1 измененный файл в выделенный worktree для изолированной дальнейшей работы.", + "sidebar.session.moveToWorktree.tooltip.other": + "Переместить этот разговор и {{files}} измененных файлов в выделенный worktree для изолированной дальнейшей работы.", + "sidebar.session.showChanges.tooltip.empty": "Откройте просмотр изменений, чтобы изучить текущее рабочее дерево.", + "sidebar.session.showChanges.tooltip.one": + "1 файл изменен · +{{additions}} -{{deletions}}. Открыть просмотр изменений.", + "sidebar.session.showChanges.tooltip.other": + "{{files}} файлов изменено · +{{additions}} -{{deletions}}. Открыть просмотр изменений.", + "sidebar.session.agentManager.tooltip": + "Откройте Agent Manager для полного обзора параллельных сессий и worktree, чтобы координировать длительные задачи в одном месте.", + "sidebar.session.openAgentManager": "Открыть Agent Manager", + "sidebar.session.progress.capturing": "Захват изменений...", + "sidebar.session.progress.creating": "Создание worktree...", + "sidebar.session.progress.setup": "Выполнение настройки...", + "sidebar.session.progress.transferring": "Перенос изменений...", + "sidebar.session.progress.forking": "Запуск сессии...", + "sidebar.session.progress.failed": "Не удалось продолжить в worktree", "session.header.search.placeholder": "Поиск {{project}}", "session.header.searchFiles": "Поиск файлов", "session.header.openIn": "Открыть в", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/th.ts b/packages/kilo-vscode/webview-ui/src/i18n/th.ts index 3d992623d36..5124e637382 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/th.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/th.ts @@ -536,7 +536,37 @@ export const dict = { "session.new.worktree.mainWithBranch": "สาขาหลัก ({{branch}})", "session.new.worktree.create": "สร้าง worktree ใหม่", "session.new.lastModified": "แก้ไขล่าสุด", - + "sidebar.session.newSession": "เซสชันใหม่", + "sidebar.session.newSession.tooltip": "เริ่มการสนทนาใหม่โดยที่ยังคงเซสชันปัจจุบันไว้", + "sidebar.session.newSession.disabled": "เซสชันนี้เป็นเซสชันใหม่อยู่แล้ว เริ่มแชทหรือสร้าง worktree แทน", + "sidebar.session.newWorktree": "Worktree ใหม่", + "sidebar.session.newWorktree.tooltip": + "สร้าง git worktree ที่แยกออกมาต่างหากเพื่อทดลองอย่างปลอดภัย แยกการเปลี่ยนแปลงออกจากกัน และรันเซสชันคู่ขนานโดยไม่รบกวน branch ปัจจุบันของคุณ", + "sidebar.session.configureWorktree.tooltip": + "เปิดกล่องโต้ตอบ worktree ของ Agent Manager เพื่อกำหนดค่า worktree ใหม่ก่อนที่จะสร้าง", + "sidebar.session.newWorktree.from": "Worktree ใหม่จาก", + "sidebar.session.currentBranch": "branch ปัจจุบัน", + "sidebar.session.moveToWorktree": "ย้ายไปยัง Worktree", + "sidebar.session.moveToWorktree.tooltip.empty": + "ย้ายบทสนทนานี้และการเปลี่ยนแปลงในเครื่องปัจจุบันของคุณไปยัง worktree เฉพาะสำหรับการทำงานต่อเนื่องแบบแยกส่วน", + "sidebar.session.moveToWorktree.tooltip.one": + "ย้ายบทสนทนานี้และ 1 ไฟล์ที่ถูกแก้ไขไปยัง worktree เฉพาะสำหรับการทำงานต่อเนื่องแบบแยกส่วน", + "sidebar.session.moveToWorktree.tooltip.other": + "ย้ายบทสนทนานี้และ {{files}} ไฟล์ที่ถูกแก้ไขไปยัง worktree เฉพาะสำหรับการทำงานต่อเนื่องแบบแยกส่วน", + "sidebar.session.showChanges.tooltip.empty": "เปิดมุมมองการเปลี่ยนแปลงเพื่อตรวจสอบ working tree ปัจจุบัน", + "sidebar.session.showChanges.tooltip.one": + "เปลี่ยนแปลง 1 ไฟล์ · +{{additions}} -{{deletions}} เปิดมุมมองการเปลี่ยนแปลง", + "sidebar.session.showChanges.tooltip.other": + "เปลี่ยนแปลง {{files}} ไฟล์ · +{{additions}} -{{deletions}} เปิดมุมมองการเปลี่ยนแปลง", + "sidebar.session.agentManager.tooltip": + "เปิด Agent Manager เพื่อดูภาพรวมของเซสชันและ worktree คู่ขนาน เพื่อให้คุณสามารถประสานงานงานที่ใช้เวลานานได้ในที่เดียว", + "sidebar.session.openAgentManager": "เปิด Agent Manager", + "sidebar.session.progress.capturing": "กำลังบันทึกการเปลี่ยนแปลง...", + "sidebar.session.progress.creating": "กำลังสร้าง worktree...", + "sidebar.session.progress.setup": "กำลังรันการตั้งค่า...", + "sidebar.session.progress.transferring": "กำลังถ่ายโอนการเปลี่ยนแปลง...", + "sidebar.session.progress.forking": "กำลังเริ่มเซสชัน...", + "sidebar.session.progress.failed": "ดำเนินการต่อใน worktree ไม่สำเร็จ", "session.header.search.placeholder": "ค้นหา {{project}}", "session.header.searchFiles": "ค้นหาไฟล์", "session.header.openIn": "เปิดใน", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts index 3470e2c36b9..20ebd5e5407 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts @@ -541,7 +541,38 @@ export const dict = { "session.new.worktree.mainWithBranch": "Ana dal ({{branch}})", "session.new.worktree.create": "Yeni çalışma ağacı oluştur", "session.new.lastModified": "Son değişiklik", - + "sidebar.session.newSession": "Yeni Oturum", + "sidebar.session.newSession.tooltip": "Mevcut oturumu koruyarak yeni bir konuşma başlatın.", + "sidebar.session.newSession.disabled": + "Bu oturum zaten yeni. Sohbet etmeye başlayın veya bunun yerine bir worktree oluşturun.", + "sidebar.session.newWorktree": "Yeni Worktree", + "sidebar.session.newWorktree.tooltip": + "Güvenli bir şekilde deneme yapmak, değişiklikleri ayrı tutmak ve mevcut dalınızı kesintiye uğratmadan paralel oturumlar çalıştırmak için izole bir git worktree oluşturun.", + "sidebar.session.configureWorktree.tooltip": + "Oluşturmadan önce yeni bir worktree yapılandırmak için Agent Manager worktree iletişim kutusunu açın.", + "sidebar.session.newWorktree.from": "Şuradan Yeni Worktree:", + "sidebar.session.currentBranch": "mevcut dal", + "sidebar.session.moveToWorktree": "Worktree'ye Taşı", + "sidebar.session.moveToWorktree.tooltip.empty": + "İzole bir takip çalışması için bu konuşmayı ve mevcut yerel değişikliklerinizi özel bir worktree'ye taşıyın.", + "sidebar.session.moveToWorktree.tooltip.one": + "Bu konuşmayı ve değiştirilen 1 dosyayı, izole edilmiş takip çalışmaları için özel bir worktree'ye taşıyın.", + "sidebar.session.moveToWorktree.tooltip.other": + "Bu konuşmayı ve değiştirilen {{files}} dosyayı, izole edilmiş takip çalışmaları için özel bir worktree'ye taşıyın.", + "sidebar.session.showChanges.tooltip.empty": "Mevcut çalışma ağacını incelemek için değişiklikler görünümünü açın.", + "sidebar.session.showChanges.tooltip.one": + "1 dosya değiştirildi · +{{additions}} -{{deletions}}. Değişiklikler görünümünü aç.", + "sidebar.session.showChanges.tooltip.other": + "{{files}} dosya değiştirildi · +{{additions}} -{{deletions}}. Değişiklikler görünümünü aç.", + "sidebar.session.agentManager.tooltip": + "Paralel oturumların ve worktree'lerin tam bir genel görünümü için Agent Manager'ı açın, böylece uzun süren görevleri tek bir yerden koordine edebilirsiniz.", + "sidebar.session.openAgentManager": "Agent Manager'ı Aç", + "sidebar.session.progress.capturing": "Değişiklikler yakalanıyor...", + "sidebar.session.progress.creating": "Worktree oluşturuluyor...", + "sidebar.session.progress.setup": "Kurulum çalıştırılıyor...", + "sidebar.session.progress.transferring": "Değişiklikler aktarılıyor...", + "sidebar.session.progress.forking": "Oturum başlatılıyor...", + "sidebar.session.progress.failed": "Worktree'de devam edilemedi", "session.header.search.placeholder": "{{project}} ara", "session.header.searchFiles": "Dosya ara", "session.header.openIn": "Aç", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts index b352336b62f..766f146e80a 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts @@ -542,7 +542,36 @@ export const dict = { "session.new.worktree.mainWithBranch": "Основна гілка ({{branch}})", "session.new.worktree.create": "Створити нове робоче дерево", "session.new.lastModified": "Останнє змінення", - + "sidebar.session.newSession": "Нова сесія", + "sidebar.session.newSession.tooltip": "Почати нову розмову, зберігши поточну сесію незмінною.", + "sidebar.session.newSession.disabled": "Ця сесія вже нова. Почніть спілкуватися або створіть worktree.", + "sidebar.session.newWorktree": "Нове Worktree", + "sidebar.session.newWorktree.tooltip": + "Створіть ізольоване git worktree для безпечних експериментів, розділення змін та запуску паралельних сесій без переривання поточної гілки.", + "sidebar.session.configureWorktree.tooltip": + "Відкрийте діалогове вікно worktree в Agent Manager, щоб налаштувати нове worktree перед створенням.", + "sidebar.session.newWorktree.from": "Нове Worktree з", + "sidebar.session.currentBranch": "поточна гілка", + "sidebar.session.moveToWorktree": "Перенести у Worktree", + "sidebar.session.moveToWorktree.tooltip.empty": + "Перенесіть цю розмову та ваші поточні локальні зміни до виділеного worktree для ізольованої подальшої роботи.", + "sidebar.session.moveToWorktree.tooltip.one": + "Перемістити цю розмову та 1 змінений файл у виділений worktree для ізольованої подальшої роботи.", + "sidebar.session.moveToWorktree.tooltip.other": + "Перемістити цю розмову та {{files}} змінених файлів у виділений worktree для ізольованої подальшої роботи.", + "sidebar.session.showChanges.tooltip.empty": "Відкрийте перегляд змін, щоб оглянути поточне робоче дерево.", + "sidebar.session.showChanges.tooltip.one": "1 файл змінено · +{{additions}} -{{deletions}}. Відкрити перегляд змін.", + "sidebar.session.showChanges.tooltip.other": + "{{files}} файлів змінено · +{{additions}} -{{deletions}}. Відкрити перегляд змін.", + "sidebar.session.agentManager.tooltip": + "Відкрийте Agent Manager для повного огляду паралельних сесій та worktree, щоб координивати тривалі завдання в одному місці.", + "sidebar.session.openAgentManager": "Відкрити Agent Manager", + "sidebar.session.progress.capturing": "Захоплення змін...", + "sidebar.session.progress.creating": "Створення worktree...", + "sidebar.session.progress.setup": "Виконання налаштування...", + "sidebar.session.progress.transferring": "Перенесення змін...", + "sidebar.session.progress.forking": "Запуск сесії...", + "sidebar.session.progress.failed": "Не вдалося продовжити у worktree", "session.header.search.placeholder": "Пошук {{project}}", "session.header.searchFiles": "Пошук файлів", "session.header.openIn": "Відкрити в", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts index 0e1e39fe752..82e578f5876 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts @@ -529,7 +529,35 @@ export const dict = { "session.new.worktree.mainWithBranch": "主分支({{branch}})", "session.new.worktree.create": "创建新的 worktree", "session.new.lastModified": "最后修改", - + "sidebar.session.newSession": "新会话", + "sidebar.session.newSession.tooltip": "在保持当前会话完整的同时开始全新的对话。", + "sidebar.session.newSession.disabled": "此会话已经是新的。请开始聊天或创建一个 worktree。", + "sidebar.session.newWorktree": "新 Worktree", + "sidebar.session.newWorktree.tooltip": + "创建一个隔离的 git worktree 以安全地进行实验、保持更改分离并在不中断当前分支的情况下运行并行会话。", + "sidebar.session.configureWorktree.tooltip": + "打开 Agent Manager 的 worktree 对话框,以便在创建之前配置新的 worktree。", + "sidebar.session.newWorktree.from": "新 Worktree 来源:", + "sidebar.session.currentBranch": "当前分支", + "sidebar.session.moveToWorktree": "移动到 Worktree", + "sidebar.session.moveToWorktree.tooltip.empty": + "将此对话和您当前的本地更改移动到专用的 worktree 中,以便进行隔离的后续工作。", + "sidebar.session.moveToWorktree.tooltip.one": + "将此对话和 1 个更改的文件移动到专用的 worktree 中,以便进行隔离的后续工作。", + "sidebar.session.moveToWorktree.tooltip.other": + "将此对话和 {{files}} 个更改的文件移动到专用的 worktree 中,以便进行隔离的后续工作。", + "sidebar.session.showChanges.tooltip.empty": "打开更改视图以检查当前工作树。", + "sidebar.session.showChanges.tooltip.one": "1 个文件已更改 · +{{additions}} -{{deletions}}。打开更改视图。", + "sidebar.session.showChanges.tooltip.other": "{{files}} 个文件已更改 · +{{additions}} -{{deletions}}。打开更改视图。", + "sidebar.session.agentManager.tooltip": + "打开 Agent Manager 以全面了解并行会话和 worktree,让您可以在一个地方协调长期运行的任务。", + "sidebar.session.openAgentManager": "打开 Agent Manager", + "sidebar.session.progress.capturing": "正在捕获更改...", + "sidebar.session.progress.creating": "正在创建 worktree...", + "sidebar.session.progress.setup": "正在运行设置...", + "sidebar.session.progress.transferring": "正在传输更改...", + "sidebar.session.progress.forking": "正在启动会话...", + "sidebar.session.progress.failed": "在 worktree 中继续失败", "session.header.search.placeholder": "搜索 {{project}}", "session.header.searchFiles": "搜索文件", "session.header.openIn": "打开方式", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts index a281c20b0e8..a916a889103 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts @@ -530,7 +530,35 @@ export const dict = { "session.new.worktree.mainWithBranch": "主分支 ({{branch}})", "session.new.worktree.create": "建立新的 worktree", "session.new.lastModified": "最後修改", - + "sidebar.session.newSession": "新會話", + "sidebar.session.newSession.tooltip": "在保持當前會話完整的同時開始全新的對話。", + "sidebar.session.newSession.disabled": "此會話已經是新的。請開始聊天或建立一個 worktree。", + "sidebar.session.newWorktree": "新 Worktree", + "sidebar.session.newWorktree.tooltip": + "建立一個隔離的 git worktree 以安全地進行實驗、保持變更分離並在不中斷當前分支的情況下執行平行會話。", + "sidebar.session.configureWorktree.tooltip": + "打開 Agent Manager 的 worktree 對話框,以便在建立之前配置新的 worktree。", + "sidebar.session.newWorktree.from": "新 Worktree 來源:", + "sidebar.session.currentBranch": "當前分支", + "sidebar.session.moveToWorktree": "移動到 Worktree", + "sidebar.session.moveToWorktree.tooltip.empty": + "將此對話和您當前的本地變更移動到專用的 worktree 中,以便進行隔離的後續工作。", + "sidebar.session.moveToWorktree.tooltip.one": + "將此對話和 1 個變更的檔案移動到專用的 worktree 中,以便進行隔離的後續工作。", + "sidebar.session.moveToWorktree.tooltip.other": + "將此對話和 {{files}} 個變更的檔案移動到專用的 worktree 中,以便進行隔離的後續工作。", + "sidebar.session.showChanges.tooltip.empty": "打開變更檢視以檢查當前工作樹。", + "sidebar.session.showChanges.tooltip.one": "1 個檔案已變更 · +{{additions}} -{{deletions}}。開啟變更檢視。", + "sidebar.session.showChanges.tooltip.other": "{{files}} 個檔案已變更 · +{{additions}} -{{deletions}}。開啟變更檢視。", + "sidebar.session.agentManager.tooltip": + "打開 Agent Manager 以全面了解平行會話和 worktree,讓您可以在一個地方協調長期執行的任務。", + "sidebar.session.openAgentManager": "打開 Agent Manager", + "sidebar.session.progress.capturing": "正在捕獲變更...", + "sidebar.session.progress.creating": "正在建立 worktree...", + "sidebar.session.progress.setup": "正在執行設定...", + "sidebar.session.progress.transferring": "正在傳輸變更...", + "sidebar.session.progress.forking": "正在啟動會話...", + "sidebar.session.progress.failed": "在 worktree 中繼續失敗", "session.header.search.placeholder": "搜尋 {{project}}", "session.header.searchFiles": "搜尋檔案", "session.header.openIn": "開啟方式", From 236d09f33410cc6f4a12bfd8326fc34ef4406837 Mon Sep 17 00:00:00 2001 From: kirillk Date: Fri, 24 Apr 2026 16:14:09 -0400 Subject: [PATCH 177/238] fix(vscode): address sidebar worktree review feedback --- .../kilo-vscode/src/agent-manager/AgentManagerProvider.ts | 3 +++ .../kilo-vscode/webview-ui/src/components/chat/ChatView.tsx | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts b/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts index 5437543cb1a..788248d17db 100644 --- a/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts +++ b/packages/kilo-vscode/src/agent-manager/AgentManagerProvider.ts @@ -1539,6 +1539,9 @@ export class AgentManagerProvider implements Disposable { public async createFromSidebar(baseBranch?: string, branchName?: string): Promise { this.openPanel() + const panel = this.panel + if (!panel) return + await panel.waitForReady() await this.waitForStateReady("createFromSidebar") await this.onCreateWorktree(baseBranch, branchName) } diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx index 79878380506..3aff744b269 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx @@ -143,7 +143,7 @@ export const ChatView: Component = (props) => { const startWorktree = () => vscode.postMessage({ type: "agentManager.createWorktree" }) const startWorktreeFromBranch = () => - vscode.postMessage({ type: "agentManager.createWorktree", baseBranch: repoBranch() || undefined }) + vscode.postMessage({ type: "agentManager.createWorktree", baseBranch: repoBranch()! }) const openAgentManager = () => vscode.postMessage({ type: "openAgentManager" }) @@ -238,7 +238,7 @@ export const ChatView: Component = (props) => { - +
diff --git a/packages/ui/src/components/icon.tsx b/packages/ui/src/components/icon.tsx index ba6b0377961..8a04226fad3 100644 --- a/packages/ui/src/components/icon.tsx +++ b/packages/ui/src/components/icon.tsx @@ -34,6 +34,7 @@ const icons = { code: ``, "code-lines": ``, "circuit-board": ``, + organization: ``, "circle-ban-sign": ``, "edit-small-2": ``, eye: ``, @@ -121,15 +122,17 @@ export interface IconProps extends ComponentProps<"svg"> { export function Icon(props: IconProps) { const [local, others] = splitProps(props, ["name", "size", "class", "classList"]) const viewBox = () => - local.name === "magnifying-glass" || local.name === "circuit-board" ? "0 0 16 16" : "0 0 20 20" + local.name === "magnifying-glass" || local.name === "circuit-board" || local.name === "organization" + ? "0 0 16 16" + : "0 0 20 20" return (
Date: Sun, 26 Apr 2026 14:27:51 -0400 Subject: [PATCH 186/238] fix(vscode): tighten sidebar worktree actions --- .../src/components/chat/ChatView.tsx | 13 ---- .../webview-ui/src/styles/session-actions.css | 62 ++++--------------- 2 files changed, 13 insertions(+), 62 deletions(-) diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx index 5c0b0c01de0..b25e566cc0b 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx @@ -299,19 +299,6 @@ export const ChatView: Component = (props) => {
-
- - - -
) diff --git a/packages/kilo-vscode/webview-ui/src/styles/session-actions.css b/packages/kilo-vscode/webview-ui/src/styles/session-actions.css index 85ce3ff88b5..63080056b6c 100644 --- a/packages/kilo-vscode/webview-ui/src/styles/session-actions.css +++ b/packages/kilo-vscode/webview-ui/src/styles/session-actions.css @@ -132,8 +132,8 @@ display: inline-flex; align-items: center; justify-content: center; - min-width: 20px; - padding: 0 6px; + min-width: 12px; + padding: 0 3px; border: none; border-radius: 0 var(--session-action-radius) var(--session-action-radius) 0; background: transparent; @@ -283,37 +283,6 @@ opacity: 0.7; } -.session-agent-manager-slot { - flex: 0 0 auto; - margin-left: auto; - min-width: auto; - overflow: visible; -} - -.session-agent-manager-slot > [data-component="tooltip-trigger"] { - display: flex; - flex: 0 0 auto; -} - -.session-agent-manager { - width: 24px; - padding: 0; - gap: 0; - flex: 0 0 auto; - border-radius: var(--session-action-radius); - color: var(--vscode-descriptionForeground); - background: transparent; - border: none; - box-shadow: none; -} - -.session-agent-manager:hover:not(:disabled), -.session-agent-manager:focus-visible:not(:disabled), -.session-agent-manager:active:not(:disabled) { - background: var(--surface-interactive-hover, var(--vscode-list-hoverBackground)); - color: var(--vscode-foreground); -} - /* Diff stats badge styles retained for the inline move button stats */ .session-diff-badge { display: flex; @@ -359,7 +328,7 @@ /* Collapse diff stats to icon-only when truly narrow */ @container (max-width: 300px) { .session-actions-row { - gap: 6px; + gap: 4px; } .session-actions-row > *, @@ -367,27 +336,22 @@ flex-basis: auto; } - .session-agent-manager-slot { - margin-left: 0; + .session-move-action { + padding-right: 5px !important; + } + + .session-move-changes { + gap: 2px; + padding-left: 5px !important; + padding-right: 5px !important; } .session-diff-add, .session-diff-del { - display: none; - } - - .session-move-changes { position: relative; } - .session-move-changes--has-changes [data-component="icon"]::after { - content: ""; - position: absolute; - top: -2px; - right: -2px; - width: 6px; - height: 6px; - border-radius: 50%; - background: #34d399; + .session-move-label { + max-width: 116px; } } From e9b75ecb4b5e1bc4f69001812fac6d902e42b62f Mon Sep 17 00:00:00 2001 From: kirillk Date: Sun, 26 Apr 2026 14:33:51 -0400 Subject: [PATCH 187/238] fix(vscode): align agent manager worktree menu --- .../agent-manager/AgentManagerApp.tsx | 10 +++++-- .../agent-manager/agent-manager.css | 27 ++++++++++++++++--- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx b/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx index a978a86b988..a6f860d4f80 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx +++ b/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx @@ -2275,14 +2275,20 @@ const AgentManagerContent: Component = () => { - {t("agentManager.worktree.new")} + - {t("agentManager.dialog.configureWorktree")} diff --git a/packages/kilo-vscode/webview-ui/agent-manager/agent-manager.css b/packages/kilo-vscode/webview-ui/agent-manager/agent-manager.css index 368cd6863e5..c001212a07f 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/agent-manager.css +++ b/packages/kilo-vscode/webview-ui/agent-manager/agent-manager.css @@ -2029,15 +2029,36 @@ body.am-wt-dragging-active * { } .am-split-menu { - min-width: 210px; + min-width: 250px; } .am-split-menu [data-slot="dropdown-menu-item"] { padding: 6px 10px; } -.am-split-menu [data-slot="dropdown-menu-separator"] { - margin: 4px 0; +.am-worktree-menu-gap { + display: inline-flex; + width: 16px; + height: 16px; + flex-shrink: 0; +} + +.am-worktree-menu-label { + display: inline-flex; + align-items: center; + gap: 6px; + min-width: 0; +} + +.am-worktree-menu-branch { + display: inline-flex; + align-items: center; + gap: 4px; + min-width: 0; +} + +.am-worktree-menu-branch strong { + font-weight: 600; } /* New Versioned Session Dialog */ From 42bc5e332831ad43f1132f81857aeafa215a929f Mon Sep 17 00:00:00 2001 From: kirillk Date: Sun, 26 Apr 2026 15:47:23 -0400 Subject: [PATCH 188/238] fix(vscode): trim blank lines in AgentManagerApp to satisfy max-lines lint cap --- .../webview-ui/agent-manager/AgentManagerApp.tsx | 9 --------- 1 file changed, 9 deletions(-) diff --git a/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx b/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx index a6f860d4f80..03bc6e00172 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx +++ b/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx @@ -136,14 +136,10 @@ interface ApplyState { message: string conflicts: AgentManagerApplyWorktreeDiffConflict[] } - /** Sidebar selection: LOCAL for local repo, worktree ID for a worktree, or null for an unassigned session. */ type SidebarSelection = typeof LOCAL | string | null - type SidePanel = "diff" | "pr" | null - const isMac = typeof navigator !== "undefined" && /Mac|iPhone|iPad/.test(navigator.userAgent) - // Fallback keybindings before extension sends resolved ones const MAX_JUMP_INDEX = 9 @@ -178,7 +174,6 @@ function useTabScroll(activeTabs: Accessor, activeId: Accessor() const [showLeft, setShowLeft] = createSignal(false) const [showRight, setShowRight] = createSignal(false) - let scrollFrame: number | undefined const update = () => { if (scrollFrame !== undefined) return @@ -190,7 +185,6 @@ function useTabScroll(activeTabs: Accessor, activeId: Accessor { const el = ref() @@ -199,7 +193,6 @@ function useTabScroll(activeTabs: Accessor, activeId: Accessor 0 ? 60 : -60 } - // Recalculate on scroll, resize, or tab changes createEffect(() => { const el = ref() @@ -217,7 +210,6 @@ function useTabScroll(activeTabs: Accessor, activeId: Accessor { const id = activeId() const el = ref() @@ -236,7 +228,6 @@ function useTabScroll(activeTabs: Accessor, activeId: Accessor Date: Sun, 26 Apr 2026 16:51:47 -0400 Subject: [PATCH 189/238] fix(cli): preserve cwd for preferred shell commands --- packages/opencode/src/session/prompt.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 0281aaf2816..2990a31590a 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -838,7 +838,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the const cmd = ChildProcess.make(sh, args, { cwd, extendEnv: true, - env: { ...shellEnv.env, TERM: "dumb" }, + env: { ...shellEnv.env, TERM: "dumb", PWD: cwd }, // kilocode_change stdin: "ignore", forceKillAfter: "3 seconds", }) From a32f24b3ceddcc918cfb3865ee1389c942ccc234 Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Sun, 26 Apr 2026 17:52:01 -0400 Subject: [PATCH 190/238] docs: document custom model modalities --- .../code-with-ai/agents/custom-models.md | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/packages/kilo-docs/pages/code-with-ai/agents/custom-models.md b/packages/kilo-docs/pages/code-with-ai/agents/custom-models.md index db8dc74c645..20e11804322 100644 --- a/packages/kilo-docs/pages/code-with-ai/agents/custom-models.md +++ b/packages/kilo-docs/pages/code-with-ai/agents/custom-models.md @@ -84,6 +84,7 @@ All fields are optional. When a model ID matches one already in the built-in cat | `reasoning` | `boolean` | Whether the model supports extended thinking | | `temperature` | `boolean` | Whether the model supports the temperature parameter | | `attachment` | `boolean` | Whether the model supports file attachments | +| `modalities` | `object` | Supported input and output types: `{ input, output }` | | `limit` | `object` | Token limits: `{ context, output, input? }` | | `cost` | `object` | Pricing per million tokens: `{ input, output, cache_read?, cache_write? }` | | `options` | `object` | Arbitrary provider-specific model options | @@ -91,6 +92,26 @@ All fields are optional. When a model ID matches one already in the built-in cat | `provider` | `object` | Override `{ npm?, api? }` — the AI SDK package or base API URL for this model | | `variants` | `object` | Named variant configurations (e.g., different reasoning efforts) | +### Modalities (modalities) + +The `modalities` object declares which content types the model can receive and produce. Each array can include `text`, `image`, `audio`, `video`, or `pdf`. + +| Sub-field | Type | Required | Description | +| --------- | ------- | -------- | ------------------------------------------------ | +| `input` | `array` | No | Content types the model accepts from the user | +| `output` | `array` | No | Content types the model can generate in response | + +For a standard text model that can also inspect images, use: + +```jsonc +"modalities": { + "input": ["text", "image"], + "output": ["text"] +} +``` + +If `modalities` is omitted and the model ID matches a models.dev catalog entry for that provider, Kilo uses the catalog's modalities. For completely custom models with no catalog match, Kilo defaults to text input and text output only. Set `attachment: true` alongside image, audio, video, or PDF input modalities when the provider supports sending those files as attachments. + ### Token Limits (limit) The `limit` object controls how Kilo manages the model's context window and output length. These values are specified in **tokens**. From edae6e2aa879666e3e85ce098ef1394629c6eb68 Mon Sep 17 00:00:00 2001 From: kirillk Date: Sun, 26 Apr 2026 20:18:14 -0400 Subject: [PATCH 191/238] fix(cli): capture cwd before sourcing login shell config --- packages/opencode/src/session/prompt.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 2990a31590a..42415489cd2 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -800,7 +800,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the "-l", "-c", ` - __oc_cwd=$PWD + __oc_cwd="$(pwd)" # kilocode_change [[ -f ~/.zshenv ]] && source ~/.zshenv >/dev/null 2>&1 || true [[ -f "\${ZDOTDIR:-$HOME}/.zshrc" ]] && source "\${ZDOTDIR:-$HOME}/.zshrc" >/dev/null 2>&1 || true cd "$__oc_cwd" @@ -813,7 +813,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the "-l", "-c", ` - __oc_cwd=$PWD + __oc_cwd="$(pwd)" # kilocode_change shopt -s expand_aliases [[ -f ~/.bashrc ]] && source ~/.bashrc >/dev/null 2>&1 || true cd "$__oc_cwd" @@ -838,7 +838,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the const cmd = ChildProcess.make(sh, args, { cwd, extendEnv: true, - env: { ...shellEnv.env, TERM: "dumb", PWD: cwd }, // kilocode_change + env: { ...shellEnv.env, TERM: "dumb" }, stdin: "ignore", forceKillAfter: "3 seconds", }) From fd8a14ad9a4d44c53c6c1542d99fb46e26758995 Mon Sep 17 00:00:00 2001 From: kirillk Date: Sun, 26 Apr 2026 20:26:37 -0400 Subject: [PATCH 192/238] Revert "fix(cli): capture cwd before sourcing login shell config" This reverts commit edae6e2aa879666e3e85ce098ef1394629c6eb68. --- packages/opencode/src/session/prompt.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 42415489cd2..2990a31590a 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -800,7 +800,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the "-l", "-c", ` - __oc_cwd="$(pwd)" # kilocode_change + __oc_cwd=$PWD [[ -f ~/.zshenv ]] && source ~/.zshenv >/dev/null 2>&1 || true [[ -f "\${ZDOTDIR:-$HOME}/.zshrc" ]] && source "\${ZDOTDIR:-$HOME}/.zshrc" >/dev/null 2>&1 || true cd "$__oc_cwd" @@ -813,7 +813,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the "-l", "-c", ` - __oc_cwd="$(pwd)" # kilocode_change + __oc_cwd=$PWD shopt -s expand_aliases [[ -f ~/.bashrc ]] && source ~/.bashrc >/dev/null 2>&1 || true cd "$__oc_cwd" @@ -838,7 +838,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the const cmd = ChildProcess.make(sh, args, { cwd, extendEnv: true, - env: { ...shellEnv.env, TERM: "dumb" }, + env: { ...shellEnv.env, TERM: "dumb", PWD: cwd }, // kilocode_change stdin: "ignore", forceKillAfter: "3 seconds", }) From a0d415f26f987cb0da4518ea30e126eace2a2a79 Mon Sep 17 00:00:00 2001 From: kirillk Date: Sun, 26 Apr 2026 20:26:37 -0400 Subject: [PATCH 193/238] Revert "fix(cli): preserve cwd for preferred shell commands" This reverts commit 623c84a5e77877ab4d1e49fe95cf65148f92e4af. --- packages/opencode/src/session/prompt.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 2990a31590a..0281aaf2816 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -838,7 +838,7 @@ NOTE: At any point in time through this workflow you should feel free to ask the const cmd = ChildProcess.make(sh, args, { cwd, extendEnv: true, - env: { ...shellEnv.env, TERM: "dumb", PWD: cwd }, // kilocode_change + env: { ...shellEnv.env, TERM: "dumb" }, stdin: "ignore", forceKillAfter: "3 seconds", }) From 1eaf4091437b7e1336fa2558112885cf9b8d03f4 Mon Sep 17 00:00:00 2001 From: Alex Alecu Date: Mon, 27 Apr 2026 10:21:36 +0300 Subject: [PATCH 194/238] refactor(cli): simplify stats cost --- packages/opencode/src/cli/cmd/stats.ts | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/packages/opencode/src/cli/cmd/stats.ts b/packages/opencode/src/cli/cmd/stats.ts index a52e35f060c..0242f72f35b 100644 --- a/packages/opencode/src/cli/cmd/stats.ts +++ b/packages/opencode/src/cli/cmd/stats.ts @@ -1,5 +1,4 @@ import type { Argv } from "yargs" -import type { MessageV2 } from "../../session/message-v2" // kilocode_change import { cmd } from "./cmd" import { Session } from "../../session" import { bootstrap } from "../bootstrap" @@ -195,13 +194,8 @@ export async function aggregateSessionStats(days?: number, projectFilter?: strin for (const message of messages) { if (message.info.role === "assistant") { // kilocode_change start - count propagated subagent cost once but keep child model stats (#6321) - const cost = (() => { - const parts = message.parts.filter( - (part: MessageV2.Part): part is MessageV2.StepFinishPart => part.type === "step-finish", - ) - if (parts.length === 0) return message.info.cost || 0 - return parts.reduce((sum: number, part: MessageV2.StepFinishPart) => sum + part.cost, 0) - })() + const parts = message.parts.filter((part) => part.type === "step-finish") + const cost = parts.length ? parts.reduce((sum, part) => sum + part.cost, 0) : message.info.cost || 0 if (!session.parentID) sessionCost += message.info.cost || 0 // kilocode_change end From 778c5a84e03c536cdc6e76d65f8d5babe938ac27 Mon Sep 17 00:00:00 2001 From: Alex Alecu Date: Mon, 27 Apr 2026 10:15:43 +0300 Subject: [PATCH 195/238] test(cli): guard queued prompt request tail (#9492) Strengthen the Kilo queue integration test to capture each LLM request body and assert the second request ends with the queued user message, not a prior-turn assistant tail. Update the skipped upstream prompt-effect active-run test comment to reference #9492 and point at the Kilo-specific authoritative coverage. --- .../kilocode/session-prompt-queue.test.ts | 36 +++++++++++++++++-- .../test/session/prompt-effect.test.ts | 8 ++++- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/packages/opencode/test/kilocode/session-prompt-queue.test.ts b/packages/opencode/test/kilocode/session-prompt-queue.test.ts index 954f77234df..865b5749a3d 100644 --- a/packages/opencode/test/kilocode/session-prompt-queue.test.ts +++ b/packages/opencode/test/kilocode/session-prompt-queue.test.ts @@ -63,6 +63,21 @@ function hasText(msg: Awaited>, text: st return msg.parts.some((part) => part.type === "text" && part.text.includes(text)) } +// Find the last non-system message in an OpenAI-compatible request body. Kept +// tolerant: we only care about role invariants, not the exact content shape, +// because providers may serialize `content` as a string or as a parts array. +function lastConversational(body: Record): { role: string; content: unknown } | undefined { + const msgs = Array.isArray(body.messages) ? (body.messages as Array>) : [] + for (let i = msgs.length - 1; i >= 0; i--) { + const msg = msgs[i] + if (!msg || typeof msg !== "object") continue + const role = typeof msg.role === "string" ? msg.role : undefined + if (!role || role === "system") continue + return { role, content: msg.content } + } + return undefined +} + function user(sessionID: SessionID, id: MessageID): MessageV2.WithParts { return { info: { @@ -303,18 +318,21 @@ describe("session prompt queue", () => { const ready = Promise.withResolvers() const injected = Promise.withResolvers() const calls: number[] = [] + const bodies: Array> = [] const server = Bun.serve({ port: 0, - fetch(req) { + async fetch(req) { const url = new URL(req.url) if (!url.pathname.endsWith("/chat/completions")) return new Response("not found", { status: 404 }) + const body = (await req.json().catch(() => ({}))) as Record + bodies.push(body) calls.push(Date.now()) - const body = + const stream = calls.length === 1 ? reply({ text: "first reply", ready: ready.resolve }) : reply({ text: "second reply", ready: injected.resolve }) - return new Response(body, { + return new Response(stream, { status: 200, headers: { "Content-Type": "text/event-stream" }, }) @@ -408,6 +426,18 @@ describe("session prompt queue", () => { } expect(firstReply.info.parentID).toBe(firstUser.info.id) expect(secondReply.info.parentID).toBe(secondUser.info.id) + + // Regression for #9492: the second LLM request must end with the + // queued user prompt, not an assistant tail from the prior turn. + // Anthropic's API rejects requests whose final message is assistant + // (prefill), and scope() is supposed to partition the queued target + // turn to the end before the model request is built. + expect(bodies).toHaveLength(2) + const second2 = bodies[1] + expect(JSON.stringify(second2)).toContain("second prompt") + const tail = lastConversational(second2) + expect(tail?.role).toBe("user") + expect(JSON.stringify(tail?.content)).toContain("second prompt") }, }) } finally { diff --git a/packages/opencode/test/session/prompt-effect.test.ts b/packages/opencode/test/session/prompt-effect.test.ts index 1cf6abb779f..1314a6882a1 100644 --- a/packages/opencode/test/session/prompt-effect.test.ts +++ b/packages/opencode/test/session/prompt-effect.test.ts @@ -885,7 +885,13 @@ it.live( 10_000, // kilocode_change ) -// kilocode_change start - skip flaky test, tracked in #8990 +// kilocode_change start - #9492: the upstream fork-based shape of this test +// loses Instance AsyncLocalStorage context in the second forked prompt, which +// surfaces as a "No context found for instance" die before the queue behavior +// can be exercised. The Kilo queue semantics (in-flight stream drains, second +// LLM request ends with the queued user message) are covered end-to-end in +// packages/opencode/test/kilocode/session-prompt-queue.test.ts — keep this +// upstream scaffold skipped so future OpenCode merges remain friction-free. it.live.skip( "prompt submitted during an active run is included in the next LLM input", // kilocode_change end From 7ac2a01068521f2f099f91d96ae25eb510534618 Mon Sep 17 00:00:00 2001 From: "kiloconnect[bot]" <240665456+kiloconnect[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 08:54:51 +0000 Subject: [PATCH 196/238] test(vscode): cover autocomplete model selection --- .../__tests__/AutocompleteModel.spec.ts | 47 ++++++++++++++++++- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/packages/kilo-vscode/src/services/autocomplete/__tests__/AutocompleteModel.spec.ts b/packages/kilo-vscode/src/services/autocomplete/__tests__/AutocompleteModel.spec.ts index 6ab38e7ff42..cce80476b89 100644 --- a/packages/kilo-vscode/src/services/autocomplete/__tests__/AutocompleteModel.spec.ts +++ b/packages/kilo-vscode/src/services/autocomplete/__tests__/AutocompleteModel.spec.ts @@ -83,9 +83,16 @@ describe("AutocompleteModel", () => { }) describe("getProviderDisplayName", () => { - it("returns Kilo Gateway", () => { + it("returns the default provider", () => { const model = new AutocompleteModel() - expect(model.getProviderDisplayName()).toBe("Kilo Gateway") + expect(model.getProviderDisplayName()).toBe("Mistral AI") + }) + + it("returns the selected provider", () => { + const model = new AutocompleteModel() + model.setModel("inception/mercury-edit") + + expect(model.getProviderDisplayName()).toBe("Inception") }) }) @@ -136,6 +143,23 @@ describe("AutocompleteModel", () => { }) }) + it("streams text-completion chunks", async () => { + const chunks = [{ choices: [{ text: "hello" }] }, { choices: [{ text: " world" }] }] + + const connection = createMockConnectionService("connected") + mockClient.kilo.fim.mockResolvedValue({ + stream: (async function* () { + for (const chunk of chunks) yield chunk + })(), + }) + + const model = new AutocompleteModel(connection) + const received: string[] = [] + await model.generateFimResponse("prefix", "suffix", (text) => received.push(text)) + + expect(received).toEqual(["hello", " world"]) + }) + it("passes model parameters to fim call", async () => { const connection = createMockConnectionService("connected") mockClient.kilo.fim.mockResolvedValue({ @@ -157,5 +181,24 @@ describe("AutocompleteModel", () => { expect.objectContaining({ signal }), ) }) + + it("passes selected model parameters to fim call", async () => { + const connection = createMockConnectionService("connected") + mockClient.kilo.fim.mockResolvedValue({ + stream: (async function* () {})(), + }) + + const model = new AutocompleteModel(connection) + model.setModel("inception/mercury-edit") + await model.generateFimResponse("pre", "suf", vi.fn()) + + expect(mockClient.kilo.fim).toHaveBeenCalledWith( + expect.objectContaining({ + model: "inception/mercury-edit", + temperature: 0, + }), + expect.any(Object), + ) + }) }) }) From db1227da2ca0aa972243467750fffb0affac118d Mon Sep 17 00:00:00 2001 From: "kiloconnect[bot]" <240665456+kiloconnect[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 08:55:44 +0000 Subject: [PATCH 197/238] fix(vscode): validate autocomplete model settings --- .../autocomplete/__tests__/settings.spec.ts | 66 +++++++++++++++++++ .../src/services/autocomplete/settings.ts | 12 +++- 2 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 packages/kilo-vscode/src/services/autocomplete/__tests__/settings.spec.ts diff --git a/packages/kilo-vscode/src/services/autocomplete/__tests__/settings.spec.ts b/packages/kilo-vscode/src/services/autocomplete/__tests__/settings.spec.ts new file mode 100644 index 00000000000..51eccf7f3f2 --- /dev/null +++ b/packages/kilo-vscode/src/services/autocomplete/__tests__/settings.spec.ts @@ -0,0 +1,66 @@ +import { beforeEach, describe, expect, it, vi } from "vitest" + +const state = new Map() +const update = vi.fn(async (key: string, value: unknown) => { + state.set(key, value) +}) + +vi.mock("vscode", () => ({ + ConfigurationTarget: { + Global: 1, + }, + workspace: { + getConfiguration: vi.fn(() => ({ + get: vi.fn((key: string, fallback: unknown) => state.get(key) ?? fallback), + update, + })), + onDidChangeConfiguration: vi.fn(), + }, +})) + +describe("autocomplete settings", () => { + beforeEach(() => { + state.clear() + update.mockClear() + }) + + it("includes the configured model in loaded settings", async () => { + state.set("model", "inception/mercury-edit") + const { buildAutocompleteSettingsMessage } = await import("../settings") + + expect(buildAutocompleteSettingsMessage().settings.model).toBe("inception/mercury-edit") + }) + + it("persists supported model updates", async () => { + const post = vi.fn() + const { routeAutocompleteMessage } = await import("../settings") + + await routeAutocompleteMessage( + { type: "updateAutocompleteSetting", key: "model", value: "inception/mercury-edit" }, + post, + ) + + expect(update).toHaveBeenCalledWith("model", "inception/mercury-edit", 1) + expect(post).toHaveBeenCalledWith(expect.objectContaining({ type: "autocompleteSettingsLoaded" })) + }) + + it("rejects unsupported model updates", async () => { + const post = vi.fn() + const { routeAutocompleteMessage } = await import("../settings") + + await routeAutocompleteMessage({ type: "updateAutocompleteSetting", key: "model", value: "other/model" }, post) + + expect(update).not.toHaveBeenCalled() + expect(post).not.toHaveBeenCalled() + }) + + it("rejects non-boolean toggle updates", async () => { + const post = vi.fn() + const { routeAutocompleteMessage } = await import("../settings") + + await routeAutocompleteMessage({ type: "updateAutocompleteSetting", key: "enableAutoTrigger", value: "true" }, post) + + expect(update).not.toHaveBeenCalled() + expect(post).not.toHaveBeenCalled() + }) +}) diff --git a/packages/kilo-vscode/src/services/autocomplete/settings.ts b/packages/kilo-vscode/src/services/autocomplete/settings.ts index 288c4cb7f17..52f38839208 100644 --- a/packages/kilo-vscode/src/services/autocomplete/settings.ts +++ b/packages/kilo-vscode/src/services/autocomplete/settings.ts @@ -1,5 +1,5 @@ import * as vscode from "vscode" -import { DEFAULT_AUTOCOMPLETE_MODEL } from "../../shared/autocomplete-models" +import { AUTOCOMPLETE_MODELS, DEFAULT_AUTOCOMPLETE_MODEL } from "../../shared/autocomplete-models" const keys = new Set(["enableAutoTrigger", "enableSmartInlineTaskKeybinding", "enableChatAutocomplete", "model"]) @@ -52,6 +52,7 @@ export function watchAutocompleteConfig(post: Post): vscode.Disposable { async function update(key: unknown, value: unknown) { if (typeof key !== "string") return false if (!keys.has(key)) return false + if (!valid(key, value)) return false await vscode.workspace .getConfiguration("kilo-code.new.autocomplete") @@ -59,3 +60,12 @@ async function update(key: unknown, value: unknown) { return true } + +function valid(key: string, value: unknown) { + if (key === "model") { + if (typeof value !== "string") return false + return AUTOCOMPLETE_MODELS.some((m) => m.id === value) + } + + return typeof value === "boolean" +} From f067a908a9fe161cfb87298b593b73e7e9bdb0b6 Mon Sep 17 00:00:00 2001 From: "kiloconnect[bot]" <240665456+kiloconnect[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 08:56:03 +0000 Subject: [PATCH 198/238] docs: add mercury autocomplete changeset --- .changeset/mercury-autocomplete-model.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/mercury-autocomplete-model.md diff --git a/.changeset/mercury-autocomplete-model.md b/.changeset/mercury-autocomplete-model.md new file mode 100644 index 00000000000..65913f2b6e9 --- /dev/null +++ b/.changeset/mercury-autocomplete-model.md @@ -0,0 +1,5 @@ +--- +"kilo-code": minor +--- + +Support selecting Mercury Edit by Inception for autocomplete. From 6965d56918a49482dd019f0480f977be309581da Mon Sep 17 00:00:00 2001 From: "kilo-maintainer[bot]" Date: Mon, 27 Apr 2026 08:58:51 +0000 Subject: [PATCH 199/238] release: v7.2.25 --- .changeset/openrouter-deepseek-reasoning.md | 6 ---- bun.lock | 32 ++++++++++----------- package.json | 2 +- packages/app/package.json | 2 +- packages/desktop-electron/package.json | 2 +- packages/desktop/package.json | 2 +- packages/extensions/zed/extension.toml | 12 ++++---- packages/kilo-docs/package.json | 2 +- packages/kilo-gateway/package.json | 2 +- packages/kilo-i18n/package.json | 2 +- packages/kilo-telemetry/package.json | 2 +- packages/kilo-ui/package.json | 2 +- packages/kilo-vscode/CHANGELOG.md | 2 ++ packages/kilo-vscode/package.json | 2 +- packages/opencode/CHANGELOG.md | 10 +++++++ packages/opencode/package.json | 2 +- packages/plugin/package.json | 2 +- packages/script/package.json | 2 +- packages/sdk/js/package.json | 2 +- packages/shared/package.json | 2 +- packages/storybook/package.json | 2 +- packages/ui/package.json | 2 +- script/upstream/package.json | 2 +- sdks/vscode/package.json | 2 +- 24 files changed, 53 insertions(+), 47 deletions(-) delete mode 100644 .changeset/openrouter-deepseek-reasoning.md diff --git a/.changeset/openrouter-deepseek-reasoning.md b/.changeset/openrouter-deepseek-reasoning.md deleted file mode 100644 index ea67392d3e8..00000000000 --- a/.changeset/openrouter-deepseek-reasoning.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@kilocode/cli": patch -"@kilocode/kilo-gateway": patch ---- - -Fix multi-turn DeepSeek reasoning round-tripping on OpenRouter by bumping `@openrouter/ai-sdk-provider` to 2.8.1 in both the CLI and Kilo Gateway packages and letting the SDK handle reasoning details, plus pulling in upstream DeepSeek variant, reasoning-effort, and assistant-reasoning fixes. New DeepSeek conversations are fixed; existing sessions that already stored empty reasoning metadata may still need to be restarted. diff --git a/bun.lock b/bun.lock index e8a96176641..04f92ebe7ba 100644 --- a/bun.lock +++ b/bun.lock @@ -32,7 +32,7 @@ }, "packages/app": { "name": "@opencode-ai/app", - "version": "7.2.24", + "version": "7.2.25", "dependencies": { "@kilocode/kilo-i18n": "workspace:*", "@kilocode/kilo-ui": "workspace:*", @@ -88,7 +88,7 @@ }, "packages/desktop": { "name": "@opencode-ai/desktop", - "version": "7.2.24", + "version": "7.2.25", "dependencies": { "@opencode-ai/app": "workspace:*", "@opencode-ai/ui": "workspace:*", @@ -121,7 +121,7 @@ }, "packages/desktop-electron": { "name": "@opencode-ai/desktop-electron", - "version": "7.2.24", + "version": "7.2.25", "dependencies": { "@opencode-ai/app": "workspace:*", "@opencode-ai/ui": "workspace:*", @@ -172,7 +172,7 @@ }, "packages/kilo-docs": { "name": "@kilocode/kilo-docs", - "version": "7.2.24", + "version": "7.2.25", "dependencies": { "@docsearch/css": "^4", "@docsearch/js": "^4", @@ -201,7 +201,7 @@ }, "packages/kilo-gateway": { "name": "@kilocode/kilo-gateway", - "version": "7.2.24", + "version": "7.2.25", "dependencies": { "@ai-sdk/alibaba": "1.0.17", "@ai-sdk/anthropic": "3.0.71", @@ -237,7 +237,7 @@ }, "packages/kilo-i18n": { "name": "@kilocode/kilo-i18n", - "version": "7.2.24", + "version": "7.2.25", "devDependencies": { "@tsconfig/node22": "catalog:", "@types/bun": "catalog:", @@ -250,7 +250,7 @@ }, "packages/kilo-telemetry": { "name": "@kilocode/kilo-telemetry", - "version": "7.2.24", + "version": "7.2.25", "dependencies": { "@kilocode/kilo-gateway": "workspace:*", "@opentelemetry/api": "1.9.0", @@ -270,7 +270,7 @@ }, "packages/kilo-ui": { "name": "@kilocode/kilo-ui", - "version": "7.2.24", + "version": "7.2.25", "dependencies": { "@kobalte/core": "0.13.11", "@opencode-ai/shared": "workspace:*", @@ -305,7 +305,7 @@ }, "packages/kilo-vscode": { "name": "kilo-code", - "version": "7.2.24", + "version": "7.2.25", "dependencies": { "@anthropic-ai/sdk": "^0.39.0", "@kilocode/kilo-i18n": "workspace:*", @@ -365,7 +365,7 @@ }, "packages/opencode": { "name": "@kilocode/cli", - "version": "7.2.24", + "version": "7.2.25", "bin": { "kilo": "./bin/kilo", "kilocode": "./bin/kilo", @@ -520,7 +520,7 @@ }, "packages/plugin": { "name": "@kilocode/plugin", - "version": "7.2.24", + "version": "7.2.25", "dependencies": { "@kilocode/sdk": "workspace:*", "effect": "catalog:", @@ -545,7 +545,7 @@ }, "packages/script": { "name": "@opencode-ai/script", - "version": "7.2.24", + "version": "7.2.25", "dependencies": { "semver": "^7.6.3", }, @@ -556,7 +556,7 @@ }, "packages/sdk/js": { "name": "@kilocode/sdk", - "version": "7.2.24", + "version": "7.2.25", "dependencies": { "cross-spawn": "catalog:", }, @@ -571,7 +571,7 @@ }, "packages/shared": { "name": "@opencode-ai/shared", - "version": "7.2.24", + "version": "7.2.25", "bin": { "opencode": "./bin/opencode", }, @@ -595,7 +595,7 @@ }, "packages/storybook": { "name": "@opencode-ai/storybook", - "version": "7.2.24", + "version": "7.2.25", "devDependencies": { "@opencode-ai/ui": "workspace:*", "@solidjs/meta": "catalog:", @@ -618,7 +618,7 @@ }, "packages/ui": { "name": "@opencode-ai/ui", - "version": "7.2.24", + "version": "7.2.25", "dependencies": { "@kilocode/sdk": "workspace:*", "@kobalte/core": "catalog:", diff --git a/package.json b/package.json index aa556d9729b..fa52224a3c1 100644 --- a/package.json +++ b/package.json @@ -145,6 +145,6 @@ "solid-js@1.9.10": "patches/solid-js@1.9.10.patch", "stream-chat@9.38.0": "patches/stream-chat@9.38.0.patch" }, - "version": "7.2.24", + "version": "7.2.25", "peerDependencies": {} } diff --git a/packages/app/package.json b/packages/app/package.json index e45df199c81..25f5742850c 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/app", - "version": "7.2.24", + "version": "7.2.25", "description": "", "type": "module", "exports": { diff --git a/packages/desktop-electron/package.json b/packages/desktop-electron/package.json index f402c598167..7909d2fc11a 100644 --- a/packages/desktop-electron/package.json +++ b/packages/desktop-electron/package.json @@ -1,7 +1,7 @@ { "name": "@opencode-ai/desktop-electron", "private": true, - "version": "7.2.24", + "version": "7.2.25", "type": "module", "license": "MIT", "homepage": "https://opencode.ai", diff --git a/packages/desktop/package.json b/packages/desktop/package.json index 85d987041ed..976652c7a8d 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -1,7 +1,7 @@ { "name": "@opencode-ai/desktop", "private": true, - "version": "7.2.24", + "version": "7.2.25", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/extensions/zed/extension.toml b/packages/extensions/zed/extension.toml index 41c243835c0..122c484b5fd 100644 --- a/packages/extensions/zed/extension.toml +++ b/packages/extensions/zed/extension.toml @@ -1,7 +1,7 @@ id = "kilo" name = "Kilo" description = "The open source coding agent." -version = "7.2.24" +version = "7.2.25" schema_version = 1 authors = ["Anomaly"] repository = "https://github.com/Kilo-Org/kilocode" @@ -11,26 +11,26 @@ name = "Kilo" icon = "./icons/opencode.svg" [agent_servers.opencode.targets.darwin-aarch64] -archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.2.24/opencode-darwin-arm64.zip" +archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.2.25/opencode-darwin-arm64.zip" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.darwin-x86_64] -archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.2.24/opencode-darwin-x64.zip" +archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.2.25/opencode-darwin-x64.zip" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.linux-aarch64] -archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.2.24/opencode-linux-arm64.tar.gz" +archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.2.25/opencode-linux-arm64.tar.gz" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.linux-x86_64] -archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.2.24/opencode-linux-x64.tar.gz" +archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.2.25/opencode-linux-x64.tar.gz" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.windows-x86_64] -archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.2.24/opencode-windows-x64.zip" +archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.2.25/opencode-windows-x64.zip" cmd = "./opencode.exe" args = ["acp"] diff --git a/packages/kilo-docs/package.json b/packages/kilo-docs/package.json index 40d5bcf1ac7..7bed98a6579 100644 --- a/packages/kilo-docs/package.json +++ b/packages/kilo-docs/package.json @@ -1,6 +1,6 @@ { "name": "@kilocode/kilo-docs", - "version": "7.2.24", + "version": "7.2.25", "private": true, "scripts": { "dev": "next dev --webpack --port 3002", diff --git a/packages/kilo-gateway/package.json b/packages/kilo-gateway/package.json index 1a35b3cb9d8..228adaa9cb7 100644 --- a/packages/kilo-gateway/package.json +++ b/packages/kilo-gateway/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@kilocode/kilo-gateway", - "version": "7.2.24", + "version": "7.2.25", "type": "module", "license": "MIT", "description": "Unified Kilo Gateway package for OpenCode - authentication, provider, and API integration", diff --git a/packages/kilo-i18n/package.json b/packages/kilo-i18n/package.json index aa719502af5..885de6a55a2 100644 --- a/packages/kilo-i18n/package.json +++ b/packages/kilo-i18n/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@kilocode/kilo-i18n", - "version": "7.2.24", + "version": "7.2.25", "type": "module", "license": "MIT", "description": "Kilo-specific i18n translations and overrides", diff --git a/packages/kilo-telemetry/package.json b/packages/kilo-telemetry/package.json index 15696852343..0bb80eff183 100644 --- a/packages/kilo-telemetry/package.json +++ b/packages/kilo-telemetry/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@kilocode/kilo-telemetry", - "version": "7.2.24", + "version": "7.2.25", "type": "module", "license": "MIT", "description": "Telemetry for Kilo CLI - PostHog analytics integration", diff --git a/packages/kilo-ui/package.json b/packages/kilo-ui/package.json index 80cdfeccb86..093d0240189 100644 --- a/packages/kilo-ui/package.json +++ b/packages/kilo-ui/package.json @@ -1,6 +1,6 @@ { "name": "@kilocode/kilo-ui", - "version": "7.2.24", + "version": "7.2.25", "type": "module", "license": "MIT", "exports": { diff --git a/packages/kilo-vscode/CHANGELOG.md b/packages/kilo-vscode/CHANGELOG.md index 16ec7a7eac8..735b967fd9d 100644 --- a/packages/kilo-vscode/CHANGELOG.md +++ b/packages/kilo-vscode/CHANGELOG.md @@ -1,5 +1,7 @@ # kilo-code +## 7.2.25 + ## 7.2.23 ### Patch Changes diff --git a/packages/kilo-vscode/package.json b/packages/kilo-vscode/package.json index 72f3341a6b2..51fa784310b 100644 --- a/packages/kilo-vscode/package.json +++ b/packages/kilo-vscode/package.json @@ -2,7 +2,7 @@ "name": "kilo-code", "displayName": "Kilo Code: AI Coding Agent, Copilot, and Autocomplete", "description": "Open Source AI coding agent that generates code from natural language, automates tasks, and runs terminal commands. Features inline autocomplete, browser automation, automated refactoring, and custom modes for planning, coding, and debugging. Supports 500+ AI models including Claude (Anthropic), Gemini, Grok, GPT, Codex and GLM.", - "version": "7.2.24", + "version": "7.2.25", "icon": "assets/icons/logo-outline-black.png", "galleryBanner": { "color": "#FFFFFF", diff --git a/packages/opencode/CHANGELOG.md b/packages/opencode/CHANGELOG.md index 0142a44b2c3..7076eac3c6f 100644 --- a/packages/opencode/CHANGELOG.md +++ b/packages/opencode/CHANGELOG.md @@ -1,5 +1,15 @@ # @kilocode/cli +## 7.2.25 + +### Patch Changes + +- [#9526](https://github.com/Kilo-Org/kilocode/pull/9526) [`c8113f2`](https://github.com/Kilo-Org/kilocode/commit/c8113f27b190f5c08ce642da57d68646132e1828) - Fix multi-turn DeepSeek reasoning round-tripping on OpenRouter by bumping `@openrouter/ai-sdk-provider` to 2.8.1 in both the CLI and Kilo Gateway packages and letting the SDK handle reasoning details, plus pulling in upstream DeepSeek variant, reasoning-effort, and assistant-reasoning fixes. New DeepSeek conversations are fixed; existing sessions that already stored empty reasoning metadata may still need to be restarted. + +- Updated dependencies [[`c8113f2`](https://github.com/Kilo-Org/kilocode/commit/c8113f27b190f5c08ce642da57d68646132e1828)]: + - @kilocode/kilo-gateway@7.2.25 + - @kilocode/kilo-telemetry@7.2.25 + ## 7.2.23 ### Minor Changes diff --git a/packages/opencode/package.json b/packages/opencode/package.json index 5ff8e85338d..5d870f77dd7 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "version": "7.2.24", + "version": "7.2.25", "name": "@kilocode/cli", "type": "module", "license": "MIT", diff --git a/packages/plugin/package.json b/packages/plugin/package.json index a7966fe7129..4d7e985d58c 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@kilocode/plugin", - "version": "7.2.24", + "version": "7.2.25", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/script/package.json b/packages/script/package.json index a9e2925bd70..b235b82c123 100644 --- a/packages/script/package.json +++ b/packages/script/package.json @@ -12,6 +12,6 @@ "exports": { ".": "./src/index.ts" }, - "version": "7.2.24", + "version": "7.2.25", "peerDependencies": {} } diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json index 1ae921f6c24..42d3829791a 100644 --- a/packages/sdk/js/package.json +++ b/packages/sdk/js/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@kilocode/sdk", - "version": "7.2.24", + "version": "7.2.25", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/shared/package.json b/packages/shared/package.json index fd029c18c8f..7dbad997aa5 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "version": "7.2.24", + "version": "7.2.25", "name": "@opencode-ai/shared", "type": "module", "license": "MIT", diff --git a/packages/storybook/package.json b/packages/storybook/package.json index 30728022667..2281a90050a 100644 --- a/packages/storybook/package.json +++ b/packages/storybook/package.json @@ -26,7 +26,7 @@ "typescript": "catalog:", "vite": "catalog:" }, - "version": "7.2.24", + "version": "7.2.25", "dependencies": {}, "peerDependencies": {} } diff --git a/packages/ui/package.json b/packages/ui/package.json index c34d6a88c8d..a22ae4506d7 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/ui", - "version": "7.2.24", + "version": "7.2.25", "type": "module", "license": "MIT", "exports": { diff --git a/script/upstream/package.json b/script/upstream/package.json index e8de91d9246..d103722b5d0 100644 --- a/script/upstream/package.json +++ b/script/upstream/package.json @@ -1,6 +1,6 @@ { "name": "@kilocode/upstream-merge", - "version": "7.2.24", + "version": "7.2.25", "private": true, "type": "module", "description": "Scripts for automating upstream opencode merges into Kilo", diff --git a/sdks/vscode/package.json b/sdks/vscode/package.json index 3fc03b619b1..1c979cb0e93 100644 --- a/sdks/vscode/package.json +++ b/sdks/vscode/package.json @@ -2,7 +2,7 @@ "name": "opencode", "displayName": "opencode", "description": "opencode for VS Code", - "version": "7.2.24", + "version": "7.2.25", "publisher": "sst-dev", "repository": { "type": "git", From dbf113524ed27e2aaac9afc5441e70339edaa164 Mon Sep 17 00:00:00 2001 From: Marius Date: Mon, 27 Apr 2026 11:15:57 +0200 Subject: [PATCH 200/238] fix(cli): guard external directory boundaries (#9484) * fix(cli): guard external directory boundaries * test(cli): move boundary regressions to kilocode tests * fix(cli): scope root guard to permission prompts * test(cli): isolate boundary regression fixtures * test(cli): simplify boundary regression coverage --- .changeset/stale-lemons-protect.md | 5 + .../opencode/src/tool/external-directory.ts | 15 ++- packages/opencode/src/util/filesystem.ts | 9 +- .../external-directory-boundary.test.ts | 95 +++++++++++++++++++ packages/shared/src/filesystem.ts | 14 ++- .../kilocode/filesystem-containment.test.ts | 13 +++ 6 files changed, 145 insertions(+), 6 deletions(-) create mode 100644 .changeset/stale-lemons-protect.md create mode 100644 packages/opencode/test/kilocode/external-directory-boundary.test.ts create mode 100644 packages/shared/test/kilocode/filesystem-containment.test.ts diff --git a/.changeset/stale-lemons-protect.md b/.changeset/stale-lemons-protect.md new file mode 100644 index 00000000000..8f54eb79d5f --- /dev/null +++ b/.changeset/stale-lemons-protect.md @@ -0,0 +1,5 @@ +--- +"@kilocode/cli": patch +--- + +Prompt before agents access files outside the active directory when a workspace boundary resolves to a filesystem root. diff --git a/packages/opencode/src/tool/external-directory.ts b/packages/opencode/src/tool/external-directory.ts index 88b73da5096..c6518e20d2b 100644 --- a/packages/opencode/src/tool/external-directory.ts +++ b/packages/opencode/src/tool/external-directory.ts @@ -3,7 +3,6 @@ import { Effect } from "effect" import { EffectLogger } from "@/effect" import { InstanceState } from "@/effect" import type * as Tool from "./tool" -import { Instance } from "../project/instance" import { AppFileSystem } from "@opencode-ai/shared/filesystem" type Kind = "file" | "directory" @@ -13,6 +12,16 @@ type Options = { kind?: Kind } +// kilocode_change start - root boundaries must not auto-allow external_directory +function root(dir: string) { + return path.parse(dir).root === dir +} + +function inside(dir: string, file: string) { + return !root(dir) && AppFileSystem.contains(dir, file) +} +// kilocode_change end + export const assertExternalDirectoryEffect = Effect.fn("Tool.assertExternalDirectory")(function* ( ctx: Tool.Context, target?: string, @@ -24,7 +33,9 @@ export const assertExternalDirectoryEffect = Effect.fn("Tool.assertExternalDirec const ins = yield* InstanceState.context const full = process.platform === "win32" ? AppFileSystem.normalizePath(target) : target - if (Instance.containsPath(full, ins)) return + // kilocode_change start - keep root-workspace behavior intact outside permission prompts + if (inside(ins.directory, full) || inside(ins.worktree, full)) return + // kilocode_change end const kind = options?.kind ?? "file" const dir = kind === "directory" ? full : path.dirname(full) diff --git a/packages/opencode/src/util/filesystem.ts b/packages/opencode/src/util/filesystem.ts index 6c4d455224e..38b7e1b7ed8 100644 --- a/packages/opencode/src/util/filesystem.ts +++ b/packages/opencode/src/util/filesystem.ts @@ -1,7 +1,9 @@ import { chmod, mkdir, readFile, stat as statFile, writeFile } from "fs/promises" import { createWriteStream, existsSync, statSync } from "fs" import { realpathSync } from "fs" -import { dirname, join, relative, resolve as pathResolve, win32 } from "path" +// kilocode_change start - harden containment checks +import { dirname, isAbsolute, join, relative, resolve as pathResolve, sep, win32 } from "path" +// kilocode_change end import { Readable } from "stream" import { pipeline } from "stream/promises" import { Glob } from "@opencode-ai/shared/util/glob" @@ -162,7 +164,10 @@ export function overlaps(a: string, b: string) { } export function contains(parent: string, child: string) { - return !relative(parent, child).startsWith("..") + // kilocode_change start - reject cross-drive and escaped relative paths + const rel = relative(parent, child) + return rel === "" || (!isAbsolute(rel) && rel !== ".." && !rel.startsWith(`..${sep}`)) + // kilocode_change end } export async function findUp( diff --git a/packages/opencode/test/kilocode/external-directory-boundary.test.ts b/packages/opencode/test/kilocode/external-directory-boundary.test.ts new file mode 100644 index 00000000000..ea04fd71d53 --- /dev/null +++ b/packages/opencode/test/kilocode/external-directory-boundary.test.ts @@ -0,0 +1,95 @@ +import { describe, expect, test } from "bun:test" +import { Effect } from "effect" +import path from "path" +import type { Permission } from "../../src/permission" +import { Instance } from "../../src/project/instance" +import { SessionID, MessageID } from "../../src/session/schema" +import { assertExternalDirectory } from "../../src/tool/external-directory" +import type { Tool } from "../../src/tool" +import { Filesystem } from "../../src/util" +import { AppFileSystem } from "@opencode-ai/shared/filesystem" +import { tmpdir } from "../fixture/fixture" + +const base: Omit = { + sessionID: SessionID.make("ses_test-boundary-session"), + messageID: MessageID.make(""), + callID: "", + agent: "code", + abort: AbortSignal.any([]), + messages: [], + metadata: () => Effect.void, +} + +const glob = (p: string) => + process.platform === "win32" ? AppFileSystem.normalizePathPattern(p) : p.replaceAll("\\", "/") + +const asks = () => { + const items: Array> = [] + const ctx: Tool.Context = { + ...base, + ask: (req) => + Effect.sync(() => { + items.push(req) + }), + } + return { items, ctx } +} + +describe("kilocode external directory boundaries", () => { + test("asks before accessing outside a repo-root session", async () => { + await using repo = await tmpdir({ git: true }) + await using outer = await tmpdir() + const file = path.join(outer.path, "outside.txt") + const { items, ctx } = asks() + + await Instance.provide({ + directory: repo.path, + fn: async () => { + try { + await assertExternalDirectory(ctx, file) + } finally { + await Instance.dispose() + } + }, + }) + + const ext = items.find((item) => item.permission === "external_directory") + expect(ext).toBeDefined() + expect(ext!.patterns).toEqual([glob(path.join(outer.path, "*"))]) + expect(ext!.always).toEqual([glob(path.join(outer.path, "*"))]) + expect(ext!.metadata).toMatchObject({ filepath: file, parentDir: outer.path }) + }) + + test("asks when the instance directory is a filesystem root", async () => { + await using outer = await tmpdir() + const root = path.parse(outer.path).root + const file = path.join(outer.path, "outside-root.txt") + const { items, ctx } = asks() + + await Instance.provide({ + directory: root, + fn: async () => { + try { + await assertExternalDirectory(ctx, file) + } finally { + await Instance.dispose() + } + }, + }) + + const ext = items.find((item) => item.permission === "external_directory") + expect(ext).toBeDefined() + expect(ext!.patterns).toEqual([glob(path.join(outer.path, "*"))]) + expect(ext!.metadata).toMatchObject({ filepath: file, parentDir: outer.path }) + }) + + test("contains helpers keep dot-prefixed child names internal", () => { + expect(Filesystem.contains("/project", "/project/..cache/file")).toBe(true) + expect(AppFileSystem.contains("/a/b", "/a/b/..cache/file")).toBe(true) + }) + + test("AppFileSystem.contains rejects cross-drive paths on Windows", () => { + if (process.platform !== "win32") return + expect(AppFileSystem.contains("C:\\repo", "D:\\outside\\file.txt")).toBe(false) + }) +}) diff --git a/packages/shared/src/filesystem.ts b/packages/shared/src/filesystem.ts index 44346be8f94..da0af299cb3 100644 --- a/packages/shared/src/filesystem.ts +++ b/packages/shared/src/filesystem.ts @@ -1,5 +1,12 @@ import { NodeFileSystem } from "@effect/platform-node" -import { dirname, join, relative, resolve as pathResolve } from "path" +import { + dirname, + isAbsolute, + join, + relative, + resolve as pathResolve, + sep, +} from "path" // kilocode_change - harden containment checks import { realpathSync } from "fs" import * as NFS from "fs/promises" import { lookup } from "mime-types" @@ -231,6 +238,9 @@ export namespace AppFileSystem { } export function contains(parent: string, child: string) { - return !relative(parent, child).startsWith("..") + // kilocode_change start - reject cross-drive and escaped relative paths + const rel = relative(parent, child) + return rel === "" || (!isAbsolute(rel) && rel !== ".." && !rel.startsWith(`..${sep}`)) + // kilocode_change end } } diff --git a/packages/shared/test/kilocode/filesystem-containment.test.ts b/packages/shared/test/kilocode/filesystem-containment.test.ts new file mode 100644 index 00000000000..9f98b926002 --- /dev/null +++ b/packages/shared/test/kilocode/filesystem-containment.test.ts @@ -0,0 +1,13 @@ +import { describe, expect, test } from "bun:test" +import { AppFileSystem } from "@opencode-ai/shared/filesystem" + +describe("kilocode filesystem containment", () => { + test("keeps dot-prefixed child names internal", () => { + expect(AppFileSystem.contains("/a/b", "/a/b/..cache/file")).toBe(true) + }) + + test("rejects cross-drive paths on Windows", () => { + if (process.platform !== "win32") return + expect(AppFileSystem.contains("C:\\repo", "D:\\outside\\file.txt")).toBe(false) + }) +}) From a5bca011a16077d4394f9b5650a387f235cc77b2 Mon Sep 17 00:00:00 2001 From: Marius Date: Mon, 27 Apr 2026 11:17:04 +0200 Subject: [PATCH 201/238] Allow ChatGPT login over OpenAI provider config (#9549) * fix: allow ChatGPT login over OpenAI provider config Let users with inherited or globally configured OpenAI API keys sign in with ChatGPT for Codex without first removing their existing provider setup. * fix: satisfy provider login ci checks Annotate Kilo-specific shared CLI changes and apply webview formatting so the existing ChatGPT login flow passes CI. --- .changeset/calm-codex-env.md | 5 +++ packages/kilo-vscode/src/provider-actions.ts | 22 ++++++++- .../tests/unit/provider-actions-save.test.ts | 40 ++++++++++++++++- .../settings/ProviderConnectDialog.tsx | 6 ++- .../src/components/settings/ProvidersTab.tsx | 30 +++++++++---- .../kilo-vscode/webview-ui/src/i18n/ar.ts | 2 + .../kilo-vscode/webview-ui/src/i18n/br.ts | 2 + .../kilo-vscode/webview-ui/src/i18n/bs.ts | 2 + .../kilo-vscode/webview-ui/src/i18n/da.ts | 2 + .../kilo-vscode/webview-ui/src/i18n/de.ts | 2 + .../kilo-vscode/webview-ui/src/i18n/en.ts | 4 +- .../kilo-vscode/webview-ui/src/i18n/es.ts | 2 + .../kilo-vscode/webview-ui/src/i18n/fr.ts | 2 + .../kilo-vscode/webview-ui/src/i18n/ja.ts | 2 + .../kilo-vscode/webview-ui/src/i18n/ko.ts | 2 + .../kilo-vscode/webview-ui/src/i18n/nl.ts | 2 + .../kilo-vscode/webview-ui/src/i18n/no.ts | 2 + .../kilo-vscode/webview-ui/src/i18n/pl.ts | 2 + .../kilo-vscode/webview-ui/src/i18n/ru.ts | 2 + .../kilo-vscode/webview-ui/src/i18n/th.ts | 2 + .../kilo-vscode/webview-ui/src/i18n/tr.ts | 2 + .../kilo-vscode/webview-ui/src/i18n/uk.ts | 2 + .../kilo-vscode/webview-ui/src/i18n/zh.ts | 2 + .../kilo-vscode/webview-ui/src/i18n/zht.ts | 2 + packages/opencode/src/cli/cmd/providers.ts | 7 ++- .../cli/cmd/tui/component/dialog-provider.tsx | 2 +- .../cli/cmd/tui/component/dialog-provider.tsx | 6 ++- packages/opencode/src/provider/provider.ts | 18 +++++++- .../opencode/test/provider/provider.test.ts | 45 +++++++++++++++++++ 29 files changed, 203 insertions(+), 18 deletions(-) create mode 100644 .changeset/calm-codex-env.md diff --git a/.changeset/calm-codex-env.md b/.changeset/calm-codex-env.md new file mode 100644 index 00000000000..489efaceedb --- /dev/null +++ b/.changeset/calm-codex-env.md @@ -0,0 +1,5 @@ +--- +"@kilocode/cli": patch +--- + +Prefer ChatGPT OAuth credentials over inherited OpenAI environment variables and make ChatGPT sign-in easier to find. diff --git a/packages/kilo-vscode/src/provider-actions.ts b/packages/kilo-vscode/src/provider-actions.ts index 9db694dcee6..4f9cc90600c 100644 --- a/packages/kilo-vscode/src/provider-actions.ts +++ b/packages/kilo-vscode/src/provider-actions.ts @@ -17,6 +17,10 @@ import { KILO_AUTO, parseModelString } from "./shared/provider-model" */ type AuthState = "api" | "oauth" | "wellknown" +function disabledWithout(list: string[] | undefined, id: string) { + return (list ?? []).filter((item) => item !== id) +} + /** Fetch auth methods alongside the provider list. Auth states default to empty (endpoint not yet available). */ export async function fetchProviderData(client: KiloClient, dir: string) { const authRequest = @@ -232,6 +236,9 @@ export async function disconnectProvider( try { const globalConfig = (await ctx.client.global.config.get({ throwOnError: true })).data ?? {} const configured = !!globalConfig.provider?.[id] + const { response } = await fetchProviderData(ctx.client, ctx.workspaceDir) + const active = response.all.find((item) => item.id === id) + const oauth = active?.source === "custom" && configured // Remove auth store entry. Config-sourced providers may not have an auth // store entry (credentials come from config or env), so failure is non-fatal. @@ -251,7 +258,7 @@ export async function disconnectProvider( // server rebuilds state from config. Add to disabled_providers so the server // excludes them. The config entry is preserved (user may re-enable later). // This matches the desktop app's disableProvider() pattern. - if (configured) { + if (configured && !oauth) { const disabled = globalConfig.disabled_providers ?? [] if (!disabled.includes(id)) { const merged = ( @@ -267,6 +274,19 @@ export async function disconnectProvider( } } + if (oauth) { + const disabled = disabledWithout(globalConfig.disabled_providers, id) + if (disabled.length !== (globalConfig.disabled_providers ?? []).length) { + const merged = ( + await ctx.client.global.config.update({ config: { disabled_providers: disabled } }, { throwOnError: true }) + ).data + if (merged) { + setCachedConfig({ type: "configLoaded", config: merged }) + ctx.postMessage({ type: "configUpdated", config: merged }) + } + } + } + await ctx.disposeGlobal(`provider disconnect (${id})`) await ctx.fetchAndSendProviders() ctx.postMessage({ type: "providerDisconnected", requestId, providerID: id }) diff --git a/packages/kilo-vscode/tests/unit/provider-actions-save.test.ts b/packages/kilo-vscode/tests/unit/provider-actions-save.test.ts index 0f550492bf5..5a52a31510a 100644 --- a/packages/kilo-vscode/tests/unit/provider-actions-save.test.ts +++ b/packages/kilo-vscode/tests/unit/provider-actions-save.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "bun:test" -import { fetchProviderData, saveCustomProvider } from "../../src/provider-actions" +import { disconnectProvider, fetchProviderData, saveCustomProvider } from "../../src/provider-actions" type ExistingGlobal = { disabled_providers?: string[]; provider?: Record } @@ -26,6 +26,24 @@ function createCtx(existing: ExistingGlobal = { disabled_providers: [] }) { return { data: true } }, }, + provider: { + list: async () => ({ + data: { + all: [ + { + id: "openai", + name: "OpenAI", + source: "custom", + env: [], + models: {}, + }, + ], + connected: ["openai"], + default: {}, + }, + }), + auth: async () => ({ data: {} }), + }, global: { config: { get: async () => ({ data: existing }), @@ -64,6 +82,26 @@ function createProvider() { } } +describe("disconnectProvider", () => { + it("keeps configured provider enabled after disconnecting oauth override", async () => { + const existing = { + disabled_providers: ["openai", "groq"], + provider: { + openai: { + options: { apiKey: "sk-test" }, + }, + }, + } + const { ctx, calls, setCachedConfig } = createCtx(existing) + + await disconnectProvider(ctx, "req", "openai", null, setCachedConfig) + + expect(calls.remove).toEqual([{ providerID: "openai" }]) + expect(calls.config).toEqual([{ config: { disabled_providers: ["groq"] } }]) + expect(calls.refresh).toBe(1) + }) +}) + describe("saveCustomProvider", () => { it("preserves auth when the api key field is unchanged", async () => { const { ctx, calls, setCachedConfig } = createCtx() diff --git a/packages/kilo-vscode/webview-ui/src/components/settings/ProviderConnectDialog.tsx b/packages/kilo-vscode/webview-ui/src/components/settings/ProviderConnectDialog.tsx index 145580f7ab0..e0f4ace7e14 100644 --- a/packages/kilo-vscode/webview-ui/src/components/settings/ProviderConnectDialog.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/settings/ProviderConnectDialog.tsx @@ -14,6 +14,7 @@ import { createProviderAction } from "../../utils/provider-action" interface ProviderConnectDialogProps { providerID: string + oauthOnly?: boolean } interface ViewState { @@ -49,7 +50,10 @@ const ProviderConnectDialog: Component = (props) => const item = createMemo(() => provider.providers()[props.providerID]) const name = () => item()?.name ?? props.providerID const methods = createMemo(() => { - return provider.authMethods()[props.providerID] ?? fallbackMethods(language.t("provider.connect.method.apiKey")) + const list = + provider.authMethods()[props.providerID] ?? fallbackMethods(language.t("provider.connect.method.apiKey")) + if (props.oauthOnly) return list.filter((item) => item.type === "oauth") + return list }) const method = createMemo(() => { const index = state.methodIndex diff --git a/packages/kilo-vscode/webview-ui/src/components/settings/ProvidersTab.tsx b/packages/kilo-vscode/webview-ui/src/components/settings/ProvidersTab.tsx index 53738608898..217f845309f 100644 --- a/packages/kilo-vscode/webview-ui/src/components/settings/ProvidersTab.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/settings/ProvidersTab.tsx @@ -75,6 +75,7 @@ const ProvidersTab: Component = () => { if (cfg?.npm === "@ai-sdk/openai-compatible") return language.t("settings.providers.tag.custom") return language.t("settings.providers.tag.config") } + if (item.id === "openai" && current === "custom") return language.t("settings.providers.tag.chatgpt") if (current === "custom") return language.t("settings.providers.tag.custom") return language.t("settings.providers.tag.other") } @@ -121,6 +122,16 @@ const ProvidersTab: Component = () => { dialog.show(() => ) } + function connectChatGPT(item: Provider) { + dialog.show(() => ) + } + + function chatgpt(item: Provider) { + if (item.id !== "openai") return false + if (source(item) === "custom") return false + return (provider.authMethods()[item.id] ?? []).some((method) => method.type === "oauth") + } + return (
{/* Kilo Gateway — always at the top, not editable */} @@ -200,9 +211,8 @@ const ProvidersTab: Component = () => { {sourceTag(item)}
- + { > {language.t("settings.providers.connected.environmentDescription")} - } - > -
+ + + + + -
-
+
+
)} diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts index 960f4dcd253..be5ce50e020 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts @@ -734,10 +734,12 @@ export const dict = { "settings.providers.tag.gateway": "Gateway", "settings.providers.tag.environment": "البيئة", "settings.providers.tag.config": "التكوين", + "settings.providers.tag.chatgpt": "ChatGPT", "settings.providers.tag.custom": "مخصص", "settings.providers.tag.other": "أخرى", "settings.providers.tag.customProvider": "مزود مخصص", "settings.providers.connected.environmentDescription": "متصل من متغيرات البيئة الخاصة بك", + "settings.providers.action.signInChatGPT": "تسجيل الدخول باستخدام ChatGPT", "settings.providers.custom.description": "أضف مزوداً متوافقاً مع OpenAI عبر عنوان URL الأساسي.", "settings.providers.modeModels": "نموذج لكل وضع", "settings.providers.custom.note": "أضف موفرًا متوافقًا مع OpenAI عبر عنوان URL الأساسي.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/br.ts b/packages/kilo-vscode/webview-ui/src/i18n/br.ts index a32c6a96444..5389b1b5c9e 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/br.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/br.ts @@ -741,10 +741,12 @@ export const dict = { "settings.providers.tag.gateway": "Gateway", "settings.providers.tag.environment": "Ambiente", "settings.providers.tag.config": "Configuração", + "settings.providers.tag.chatgpt": "ChatGPT", "settings.providers.tag.custom": "Personalizado", "settings.providers.tag.other": "Outro", "settings.providers.tag.customProvider": "Provedor personalizado", "settings.providers.connected.environmentDescription": "Conectado a partir das suas variáveis de ambiente", + "settings.providers.action.signInChatGPT": "Entrar com ChatGPT", "settings.providers.custom.description": "Adicione um provedor compatível com OpenAI pela URL base.", "settings.providers.modeModels": "Modelo por Modo", "settings.providers.custom.note": "Adicione um provedor compatível com OpenAI por URL base.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts index d6e930dc3c1..3c038f654dd 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts @@ -745,10 +745,12 @@ export const dict = { "settings.providers.tag.gateway": "Gateway", "settings.providers.tag.environment": "Okruženje", "settings.providers.tag.config": "Konfiguracija", + "settings.providers.tag.chatgpt": "ChatGPT", "settings.providers.tag.custom": "Prilagođeno", "settings.providers.tag.other": "Ostalo", "settings.providers.tag.customProvider": "Prilagođeni provajder", "settings.providers.connected.environmentDescription": "Povezano iz vaših varijabli okruženja", + "settings.providers.action.signInChatGPT": "Prijavi se putem ChatGPT", "settings.providers.custom.description": "Dodaj OpenAI-kompatibilan provajder putem osnovnog URL-a.", "settings.providers.modeModels": "Model po režimu", "settings.providers.custom.note": "Dodajte provajdera kompatibilnog s OpenAI putem osnovnog URL-a.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/da.ts b/packages/kilo-vscode/webview-ui/src/i18n/da.ts index e250d36dd8f..ffcb52175df 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/da.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/da.ts @@ -740,10 +740,12 @@ export const dict = { "settings.providers.tag.gateway": "Gateway", "settings.providers.tag.environment": "Miljø", "settings.providers.tag.config": "Konfiguration", + "settings.providers.tag.chatgpt": "ChatGPT", "settings.providers.tag.custom": "Brugerdefineret", "settings.providers.tag.other": "Andet", "settings.providers.tag.customProvider": "Brugerdefineret udbyder", "settings.providers.connected.environmentDescription": "Forbundet fra dine miljøvariabler", + "settings.providers.action.signInChatGPT": "Log ind med ChatGPT", "settings.providers.custom.description": "Tilføj en OpenAI-kompatibel udbyder via basis-URL.", "settings.providers.modeModels": "Model pr. tilstand", "settings.providers.custom.note": "Tilføj en OpenAI-kompatibel udbyder via basis-URL.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/de.ts b/packages/kilo-vscode/webview-ui/src/i18n/de.ts index 6a9e9e59a75..9c949294e1a 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/de.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/de.ts @@ -750,10 +750,12 @@ export const dict = { "settings.providers.tag.gateway": "Gateway", "settings.providers.tag.environment": "Umgebung", "settings.providers.tag.config": "Konfiguration", + "settings.providers.tag.chatgpt": "ChatGPT", "settings.providers.tag.custom": "Benutzerdefiniert", "settings.providers.tag.other": "Andere", "settings.providers.tag.customProvider": "Benutzerdefinierter Anbieter", "settings.providers.connected.environmentDescription": "Verbunden über Ihre Umgebungsvariablen", + "settings.providers.action.signInChatGPT": "Mit ChatGPT anmelden", "settings.providers.custom.description": "Fügen Sie einen OpenAI-kompatiblen Anbieter über die Basis-URL hinzu.", "settings.providers.modeModels": "Modell pro Modus", "settings.providers.custom.note": "Fügen Sie einen OpenAI-kompatiblen Anbieter per Basis-URL hinzu.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/en.ts b/packages/kilo-vscode/webview-ui/src/i18n/en.ts index 0413b4ee0c3..24766d4bd49 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/en.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/en.ts @@ -106,7 +106,7 @@ export const dict = { "dialog.provider.opencode.note": "Curated models including Claude, GPT, Gemini and more", "dialog.provider.anthropic.note": "Direct access to Claude models, including Pro and Max", "dialog.provider.copilot.note": "Claude models for coding assistance", - "dialog.provider.openai.note": "GPT models for fast, capable general AI tasks", + "dialog.provider.openai.note": "GPT and Codex models with API key or ChatGPT login", "dialog.provider.google.note": "Gemini models for fast, structured responses", "dialog.provider.openrouter.note": "Access all supported models from one provider", "dialog.provider.vercel.note": "Unified access to AI models with smart routing", @@ -744,10 +744,12 @@ export const dict = { "settings.providers.tag.gateway": "Gateway", "settings.providers.tag.environment": "Environment", "settings.providers.tag.config": "Config", + "settings.providers.tag.chatgpt": "ChatGPT", "settings.providers.tag.custom": "Custom", "settings.providers.tag.customProvider": "Custom provider", "settings.providers.tag.other": "Other", "settings.providers.connected.environmentDescription": "Connected from your environment variables", + "settings.providers.action.signInChatGPT": "Sign in with ChatGPT", "settings.providers.custom.description": "Add an OpenAI-compatible provider by base URL.", "provider.custom.title": "Custom provider", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/es.ts b/packages/kilo-vscode/webview-ui/src/i18n/es.ts index 782eb7436ec..dbedbd02f99 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/es.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/es.ts @@ -746,10 +746,12 @@ export const dict = { "settings.providers.tag.gateway": "Gateway", "settings.providers.tag.environment": "Entorno", "settings.providers.tag.config": "Configuración", + "settings.providers.tag.chatgpt": "ChatGPT", "settings.providers.tag.custom": "Personalizado", "settings.providers.tag.other": "Otro", "settings.providers.tag.customProvider": "Proveedor personalizado", "settings.providers.connected.environmentDescription": "Conectado desde tus variables de entorno", + "settings.providers.action.signInChatGPT": "Iniciar sesión con ChatGPT", "settings.providers.custom.description": "Añade un proveedor compatible con OpenAI por URL base.", "settings.providers.modeModels": "Modelo por modo", "settings.providers.custom.note": "Agrega un proveedor compatible con OpenAI mediante URL base.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts index 9d7fe4562ef..5b996d033cf 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts @@ -750,10 +750,12 @@ export const dict = { "settings.providers.tag.gateway": "Gateway", "settings.providers.tag.environment": "Environnement", "settings.providers.tag.config": "Configuration", + "settings.providers.tag.chatgpt": "ChatGPT", "settings.providers.tag.custom": "Personnalisé", "settings.providers.tag.other": "Autre", "settings.providers.tag.customProvider": "Fournisseur personnalisé", "settings.providers.connected.environmentDescription": "Connecté depuis vos variables d'environnement", + "settings.providers.action.signInChatGPT": "Se connecter avec ChatGPT", "settings.providers.custom.description": "Ajoutez un fournisseur compatible OpenAI par URL de base.", "settings.providers.modeModels": "Modèle par mode", "settings.providers.custom.note": "Ajoutez un fournisseur compatible OpenAI par URL de base.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts index dc5c465c5fc..105b8b3e4ac 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts @@ -739,10 +739,12 @@ export const dict = { "settings.providers.tag.gateway": "Gateway", "settings.providers.tag.environment": "環境", "settings.providers.tag.config": "設定", + "settings.providers.tag.chatgpt": "ChatGPT", "settings.providers.tag.custom": "カスタム", "settings.providers.tag.other": "その他", "settings.providers.tag.customProvider": "カスタムプロバイダー", "settings.providers.connected.environmentDescription": "環境変数から接続されています", + "settings.providers.action.signInChatGPT": "ChatGPT でサインイン", "settings.providers.custom.description": "ベースURLでOpenAI互換プロバイダーを追加します。", "settings.providers.modeModels": "モードごとのモデル", "settings.providers.custom.note": "Base URL で OpenAI 互換プロバイダーを追加します。", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts index b042919779d..2930df9476f 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts @@ -739,10 +739,12 @@ export const dict = { "settings.providers.tag.gateway": "Gateway", "settings.providers.tag.environment": "환경", "settings.providers.tag.config": "구성", + "settings.providers.tag.chatgpt": "ChatGPT", "settings.providers.tag.custom": "사용자 지정", "settings.providers.tag.other": "기타", "settings.providers.tag.customProvider": "사용자 정의 공급자", "settings.providers.connected.environmentDescription": "환경 변수에서 연결됨", + "settings.providers.action.signInChatGPT": "ChatGPT로 로그인", "settings.providers.custom.description": "기본 URL로 OpenAI 호환 공급자를 추가합니다.", "settings.providers.modeModels": "모드별 모델", "settings.providers.custom.note": "Base URL로 OpenAI 호환 공급자를 추가합니다.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts index 4c44e82911b..d6d957996b0 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts @@ -743,10 +743,12 @@ export const dict = { "settings.providers.tag.gateway": "Gateway", "settings.providers.tag.environment": "Omgeving", "settings.providers.tag.config": "Config", + "settings.providers.tag.chatgpt": "ChatGPT", "settings.providers.tag.custom": "Aangepast", "settings.providers.tag.customProvider": "Aangepaste provider", "settings.providers.tag.other": "Overige", "settings.providers.connected.environmentDescription": "Gekoppeld via je omgevingsvariabelen", + "settings.providers.action.signInChatGPT": "Inloggen met ChatGPT", "settings.providers.custom.description": "Voeg een OpenAI-compatibele provider toe via basis-URL.", "provider.custom.title": "Aangepaste provider", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/no.ts b/packages/kilo-vscode/webview-ui/src/i18n/no.ts index be8327ccab6..0c2cff67787 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/no.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/no.ts @@ -744,10 +744,12 @@ export const dict = { "settings.providers.tag.gateway": "Gateway", "settings.providers.tag.environment": "Miljø", "settings.providers.tag.config": "Konfigurasjon", + "settings.providers.tag.chatgpt": "ChatGPT", "settings.providers.tag.custom": "Tilpasset", "settings.providers.tag.other": "Annet", "settings.providers.tag.customProvider": "Egendefinert leverandør", "settings.providers.connected.environmentDescription": "Koblet til fra dine miljøvariabler", + "settings.providers.action.signInChatGPT": "Logg inn med ChatGPT", "settings.providers.custom.description": "Legg til en OpenAI-kompatibel leverandør via basis-URL.", "settings.providers.modeModels": "Modell per modus", "settings.providers.custom.note": "Legg til en OpenAI-kompatibel leverandør via basis-URL.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts index 61f95eb5961..de4250f8520 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts @@ -743,10 +743,12 @@ export const dict = { "settings.providers.tag.gateway": "Gateway", "settings.providers.tag.environment": "Środowisko", "settings.providers.tag.config": "Konfiguracja", + "settings.providers.tag.chatgpt": "ChatGPT", "settings.providers.tag.custom": "Niestandardowe", "settings.providers.tag.other": "Inne", "settings.providers.tag.customProvider": "Niestandardowy dostawca", "settings.providers.connected.environmentDescription": "Połączony z twoich zmiennych środowiskowych", + "settings.providers.action.signInChatGPT": "Zaloguj przez ChatGPT", "settings.providers.custom.description": "Dodaj dostawcę kompatybilnego z OpenAI przez bazowy URL.", "settings.providers.modeModels": "Model na tryb", "settings.providers.custom.note": "Dodaj dostawcę kompatybilnego z OpenAI przez bazowy URL.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts index 63c152bab07..118ba47c57a 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts @@ -745,10 +745,12 @@ export const dict = { "settings.providers.tag.gateway": "Gateway", "settings.providers.tag.environment": "Среда", "settings.providers.tag.config": "Конфигурация", + "settings.providers.tag.chatgpt": "ChatGPT", "settings.providers.tag.custom": "Пользовательский", "settings.providers.tag.other": "Другое", "settings.providers.tag.customProvider": "Пользовательский провайдер", "settings.providers.connected.environmentDescription": "Подключён из ваших переменных окружения", + "settings.providers.action.signInChatGPT": "Войти через ChatGPT", "settings.providers.custom.description": "Добавьте OpenAI-совместимый провайдер по базовому URL.", "settings.providers.modeModels": "Модель для режима", "settings.providers.custom.note": "Добавьте OpenAI-совместимого провайдера по базовому URL.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/th.ts b/packages/kilo-vscode/webview-ui/src/i18n/th.ts index 3d992623d36..62334e9e109 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/th.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/th.ts @@ -737,10 +737,12 @@ export const dict = { "settings.providers.tag.gateway": "Gateway", "settings.providers.tag.environment": "สภาพแวดล้อม", "settings.providers.tag.config": "กำหนดค่า", + "settings.providers.tag.chatgpt": "ChatGPT", "settings.providers.tag.custom": "กำหนดเอง", "settings.providers.tag.other": "อื่น ๆ", "settings.providers.tag.customProvider": "ผู้ให้บริการที่กำหนดเอง", "settings.providers.connected.environmentDescription": "เชื่อมต่อจากตัวแปรสภาพแวดล้อมของคุณ", + "settings.providers.action.signInChatGPT": "ลงชื่อเข้าใช้ด้วย ChatGPT", "settings.providers.custom.description": "เพิ่มผู้ให้บริการที่เข้ากันได้กับ OpenAI ด้วย URL พื้นฐาน", "settings.providers.modeModels": "โมเดลต่อโหมด", "settings.providers.custom.note": "เพิ่มผู้ให้บริการที่รองรับ OpenAI ด้วย Base URL", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts index 3470e2c36b9..50f1ec6a10b 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts @@ -744,10 +744,12 @@ export const dict = { "settings.providers.tag.gateway": "Gateway", "settings.providers.tag.environment": "Ortam", "settings.providers.tag.config": "Yapılandırma", + "settings.providers.tag.chatgpt": "ChatGPT", "settings.providers.tag.custom": "Özel", "settings.providers.tag.customProvider": "Özel sağlayıcı", "settings.providers.tag.other": "Diğer", "settings.providers.connected.environmentDescription": "Ortam değişkenlerinizden bağlandı", + "settings.providers.action.signInChatGPT": "ChatGPT ile oturum aç", "settings.providers.custom.description": "Temel URL üzerinden OpenAI uyumlu bir sağlayıcı ekleyin.", "provider.custom.title": "Özel sağlayıcı", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts index b352336b62f..6b3451745b2 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts @@ -745,10 +745,12 @@ export const dict = { "settings.providers.tag.gateway": "Gateway", "settings.providers.tag.environment": "Середовище", "settings.providers.tag.config": "Конфігурація", + "settings.providers.tag.chatgpt": "ChatGPT", "settings.providers.tag.custom": "Власний", "settings.providers.tag.customProvider": "Власний провайдер", "settings.providers.tag.other": "Інші", "settings.providers.connected.environmentDescription": "Підключено зі змінних середовища", + "settings.providers.action.signInChatGPT": "Увійти через ChatGPT", "settings.providers.custom.description": "Додати OpenAI-сумісного провайдера через базовий URL.", "provider.custom.title": "Власний провайдер", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts index 0e1e39fe752..a19caa48c66 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts @@ -729,10 +729,12 @@ export const dict = { "settings.providers.tag.gateway": "Gateway", "settings.providers.tag.environment": "环境", "settings.providers.tag.config": "配置", + "settings.providers.tag.chatgpt": "ChatGPT", "settings.providers.tag.custom": "自定义", "settings.providers.tag.other": "其他", "settings.providers.tag.customProvider": "自定义提供商", "settings.providers.connected.environmentDescription": "从您的环境变量连接", + "settings.providers.action.signInChatGPT": "使用 ChatGPT 登录", "settings.providers.custom.description": "通过基础 URL 添加 OpenAI 兼容的提供商。", "settings.providers.modeModels": "按模式选择模型", "settings.providers.custom.note": "通过 Base URL 添加 OpenAI 兼容提供商。", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts index a281c20b0e8..a02b3ac96fc 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts @@ -731,10 +731,12 @@ export const dict = { "settings.providers.tag.gateway": "Gateway", "settings.providers.tag.environment": "環境", "settings.providers.tag.config": "設定", + "settings.providers.tag.chatgpt": "ChatGPT", "settings.providers.tag.custom": "自訂", "settings.providers.tag.other": "其他", "settings.providers.tag.customProvider": "自訂提供商", "settings.providers.connected.environmentDescription": "從您的環境變數連線", + "settings.providers.action.signInChatGPT": "使用 ChatGPT 登入", "settings.providers.custom.description": "透過基礎 URL 新增 OpenAI 相容的提供商。", "settings.providers.modeModels": "按模式選擇模型", "settings.providers.custom.note": "透過 Base URL 新增 OpenAI 相容供應商。", diff --git a/packages/opencode/src/cli/cmd/providers.ts b/packages/opencode/src/cli/cmd/providers.ts index 4e0bffcc8df..c2920e28866 100644 --- a/packages/opencode/src/cli/cmd/providers.ts +++ b/packages/opencode/src/cli/cmd/providers.ts @@ -391,7 +391,7 @@ export const ProvidersLoginCommand = cmd({ hint: { kilo: "recommended", // kilocode_change opencode: "recommended", - openai: "ChatGPT Plus/Pro or API key", + openai: "ChatGPT login or API key", // kilocode_change }[x.id], })), ), @@ -407,7 +407,10 @@ export const ProvidersLoginCommand = cmd({ const input = args.provider const byID = options.find((x) => x.value === input) const byName = options.find((x) => x.label.toLowerCase() === input.toLowerCase()) - const match = byID ?? byName + // kilocode_change start - accept codex as an alias for OpenAI ChatGPT auth + const alias = input.toLowerCase() === "codex" ? options.find((x) => x.value === "openai") : undefined + const match = byID ?? byName ?? alias + // kilocode_change end if (!match) { prompts.log.error(`Unknown provider "${input}"`) process.exit(1) diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx index 34a106cf35b..677dfd67adc 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx @@ -33,7 +33,7 @@ export function createDialogProviderOptions() { const connected = sync.data.provider_next.connected.includes(provider.id) return { - title: provider.name, + title: KiloProvider.PROVIDER_TITLES[provider.id] ?? provider.name, // kilocode_change value: provider.id, description: KiloProvider.PROVIDER_DESCRIPTIONS[provider.id], // kilocode_change footer: consoleManaged ? sync.data.console_state.activeOrgName : undefined, diff --git a/packages/opencode/src/kilocode/cli/cmd/tui/component/dialog-provider.tsx b/packages/opencode/src/kilocode/cli/cmd/tui/component/dialog-provider.tsx index 7f26418a121..53c837c7bca 100644 --- a/packages/opencode/src/kilocode/cli/cmd/tui/component/dialog-provider.tsx +++ b/packages/opencode/src/kilocode/cli/cmd/tui/component/dialog-provider.tsx @@ -30,7 +30,11 @@ export const PROVIDER_PRIORITY: Record = { export const PROVIDER_DESCRIPTIONS: Record = { kilo: "(Recommended)", anthropic: "(Claude Max or API key)", - openai: "(ChatGPT Plus/Pro or API key)", + openai: "(ChatGPT login or API key)", +} + +export const PROVIDER_TITLES: Record = { + openai: "OpenAI / Codex", } // --------------------------------------------------------------------------- diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index 060c55055df..6bff510093c 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -1217,12 +1217,22 @@ const layer: Layer.Layer< database[providerID] = parsed } + // kilocode_change start - load auths before env so OAuth plugins can override inherited credentials + const auths = yield* auth.all().pipe(Effect.orDie) // load env const envs = yield* env.all() for (const [id, provider] of Object.entries(database)) { const providerID = ProviderID.make(id) if (disabled.has(providerID)) continue + // kilocode_change start - prefer explicit OAuth auth over inherited env credentials + if ( + auths[providerID]?.type === "oauth" && + plugins.some((x) => x.auth?.provider === providerID && x.auth.loader) + ) { + continue + } const apiKey = provider.env.map((item) => envs[item]).find(Boolean) + // kilocode_change end if (!apiKey) continue mergeProvider(providerID, { source: "env", @@ -1231,7 +1241,6 @@ const layer: Layer.Layer< } // load apikeys - const auths = yield* auth.all().pipe(Effect.orDie) for (const [id, provider] of Object.entries(auths)) { const providerID = ProviderID.make(id) if (disabled.has(providerID)) continue @@ -1291,8 +1300,13 @@ const layer: Layer.Layer< // load config - re-apply with updated data for (const [id, provider] of configProviders) { const providerID = ProviderID.make(id) - const partial: Partial = { source: "config" } + // kilocode_change start - keep OAuth plugin source when config and Codex auth coexist + const oauth = + auths[providerID]?.type === "oauth" && + plugins.some((x) => x.auth?.provider === providerID && x.auth.loader) + const partial: Partial = oauth ? {} : { source: "config" } if (provider.env) partial.env = provider.env + // kilocode_change end if (provider.name) partial.name = provider.name if (provider.options) partial.options = provider.options mergeProvider(providerID, partial) diff --git a/packages/opencode/test/provider/provider.test.ts b/packages/opencode/test/provider/provider.test.ts index 812b5514fbc..d19ec611f64 100644 --- a/packages/opencode/test/provider/provider.test.ts +++ b/packages/opencode/test/provider/provider.test.ts @@ -14,6 +14,7 @@ import { Env } from "../../src/env" import { Effect } from "effect" import { AppRuntime } from "../../src/effect/app-runtime" import { makeRuntime } from "../../src/effect/run-service" +import { Auth } from "../../src/auth" // kilocode_change const env = makeRuntime(Env.Service, Env.defaultLayer) const set = (k: string, v: string) => env.runSync((svc) => svc.set(k, v)) @@ -88,6 +89,50 @@ test("provider loaded from env variable", async () => { }) }) +// kilocode_change start +test("provider OAuth auth overrides inherited env variable", async () => { + await Auth.remove("openai") + await Auth.set("openai", { + type: "oauth", + refresh: "test-refresh-token", + access: "test-access-token", + expires: Date.now() + 60_000, + }) + + try { + await using tmp = await tmpdir({ + init: async (dir) => { + await Bun.write( + path.join(dir, "opencode.json"), + JSON.stringify({ + $schema: "https://app.kilo.ai/config.json", + }), + ) + }, + }) + await Instance.provide({ + directory: tmp.path, + init: async () => { + set("OPENAI_API_KEY", "test-openai-key") + }, + fn: async () => { + const providers = await list() + const provider = providers[ProviderID.openai] + expect(provider).toBeDefined() + if (!provider) throw new Error("Expected OpenAI provider") + expect(provider.source).toBe("custom") + expect(provider.key).toBeUndefined() + expect(Object.values(provider.models).every((model) => model.cost.input === 0 && model.cost.output === 0)).toBe( + true, + ) + }, + }) + } finally { + await Auth.remove("openai") + } +}) +// kilocode_change end + test("provider loaded from config with apiKey option", async () => { await using tmp = await tmpdir({ init: async (dir) => { From 3f0bf322c1e2397cffaf22739df8d41e1957f5ba Mon Sep 17 00:00:00 2001 From: "kiloconnect[bot]" <240665456+kiloconnect[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 09:18:42 +0000 Subject: [PATCH 202/238] fix(vscode): allow clearing agent model override by sending null MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Clearing the Model Override field for native agents (e.g. Explore, General) sent the patch as `{ model: undefined }`. JSON.stringify drops undefined, so the backend received an empty patch, the override stayed in kilo.json, and the next configUpdated push repopulated the field. Send `null` instead — the backend's patchJsonc already treats null as a delete sentinel (matches the pattern already used in ModelsTab and AutoApproveTab). Fixes #9527. --- .changeset/clear-agent-model-override.md | 5 ++ .../tests/unit/config-utils.test.ts | 49 +++++++++++++++++++ .../src/components/settings/ModeEditView.tsx | 2 +- 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 .changeset/clear-agent-model-override.md diff --git a/.changeset/clear-agent-model-override.md b/.changeset/clear-agent-model-override.md new file mode 100644 index 00000000000..ca28b26e94b --- /dev/null +++ b/.changeset/clear-agent-model-override.md @@ -0,0 +1,5 @@ +--- +"kilo-code": patch +--- + +Fix clearing an agent's Model Override in Agent Behaviour settings. Previously, clearing the field and saving would repopulate the old value because the empty input was sent as `undefined` and dropped by `JSON.stringify`, so the backend never received a delete instruction. The field now reverts to the global default model as expected. diff --git a/packages/kilo-vscode/tests/unit/config-utils.test.ts b/packages/kilo-vscode/tests/unit/config-utils.test.ts index c8974427c11..15ae52b443e 100644 --- a/packages/kilo-vscode/tests/unit/config-utils.test.ts +++ b/packages/kilo-vscode/tests/unit/config-utils.test.ts @@ -155,4 +155,53 @@ describe("ConfigState", () => { expect(s.config.snapshot).toBe(true) expect(s.dirty).toBe(false) }) + + // ------------------------------------------------------------------------- + // Issue #9527: clearing an agent model override must unset it, not repopulate + // ------------------------------------------------------------------------- + describe("clearing an agent model override (issue #9527)", () => { + it("keeps null in the draft so the backend receives a delete sentinel", () => { + const s = new ConfigState() + s.handleConfigLoaded({ agent: { explore: { model: "anthropic/claude-sonnet-4-20250514" } } }) + + // User clears the Model Override field. ModeEditView now sends `null` + // instead of `undefined` (the fix). null is the delete sentinel that + // patchJsonc maps to jsonc-parser's remove operation. + s.updateConfig({ agent: { explore: { model: null } } }) + + // Optimistic UI: stripNulls removes the key so the field renders empty. + expect(s.config.agent?.explore?.model).toBeUndefined() + expect(s.dirty).toBe(true) + + // Draft must retain the null so it survives JSON.stringify on the wire + // and reaches patchJsonc as an explicit delete. + expect(s.draft.agent?.explore?.model).toBeNull() + expect(JSON.parse(JSON.stringify(s.draft))).toEqual({ + agent: { explore: { model: null } }, + }) + }) + + it("undefined (the old buggy behavior) is dropped by JSON.stringify", () => { + // Reproduction of the pre-fix bug: sending `undefined` results in an + // empty patch on the wire, so the backend never deletes the override + // and the next configUpdated pushes the stale model back into the UI. + const draft = { agent: { explore: { model: undefined } } } + expect(JSON.parse(JSON.stringify(draft))).toEqual({ agent: { explore: {} } }) + }) + + it("confirms the save and drops the draft once the backend acks", () => { + const s = new ConfigState() + s.handleConfigLoaded({ agent: { explore: { model: "anthropic/claude-sonnet-4-20250514" } } }) + s.updateConfig({ agent: { explore: { model: null } } }) + s.saveConfig() + + // Backend removed the override and pushes the stripped config back. + s.handleConfigUpdated({ agent: { explore: {} } }) + + expect(s.config.agent?.explore?.model).toBeUndefined() + expect(s.dirty).toBe(false) + expect(s.saving).toBe(false) + expect(Object.keys(s.draft).length).toBe(0) + }) + }) }) diff --git a/packages/kilo-vscode/webview-ui/src/components/settings/ModeEditView.tsx b/packages/kilo-vscode/webview-ui/src/components/settings/ModeEditView.tsx index c8570207367..2c436efd8ef 100644 --- a/packages/kilo-vscode/webview-ui/src/components/settings/ModeEditView.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/settings/ModeEditView.tsx @@ -145,7 +145,7 @@ const ModeEditView: Component = (props) => { update({ model: val || undefined })} + onChange={(val) => update({ model: val || null })} /> From 99493f42a7e64da1c1797b5ef928e5ce0f69a3de Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Mon, 27 Apr 2026 11:46:53 +0200 Subject: [PATCH 203/238] test(vscode): ensure autocomplete model enum and registry stay in sync --- .../unit/autocomplete-models-sync.test.ts | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 packages/kilo-vscode/tests/unit/autocomplete-models-sync.test.ts diff --git a/packages/kilo-vscode/tests/unit/autocomplete-models-sync.test.ts b/packages/kilo-vscode/tests/unit/autocomplete-models-sync.test.ts new file mode 100644 index 00000000000..fe97bb1fc99 --- /dev/null +++ b/packages/kilo-vscode/tests/unit/autocomplete-models-sync.test.ts @@ -0,0 +1,22 @@ +import { describe, it, expect } from "bun:test" +import { readFileSync } from "node:fs" +import { join } from "node:path" +import { AUTOCOMPLETE_MODELS, DEFAULT_AUTOCOMPLETE_MODEL } from "../../src/shared/autocomplete-models" + +describe("autocomplete model enum ↔ AUTOCOMPLETE_MODELS sync", () => { + const pkg = JSON.parse(readFileSync(join(__dirname, "../../package.json"), "utf8")) + const prop = pkg.contributes.configuration.properties["kilo-code.new.autocomplete.model"] + + it("package.json enum matches AUTOCOMPLETE_MODELS ids", () => { + const ids = AUTOCOMPLETE_MODELS.map((m) => m.id) + expect(prop.enum).toEqual(ids) + }) + + it("package.json enumDescriptions has one entry per model", () => { + expect(prop.enumDescriptions).toHaveLength(AUTOCOMPLETE_MODELS.length) + }) + + it("package.json default matches DEFAULT_AUTOCOMPLETE_MODEL", () => { + expect(prop.default).toBe(DEFAULT_AUTOCOMPLETE_MODEL.id) + }) +}) From c5614cc54ed16e90151cbe1ceed5213b472383ff Mon Sep 17 00:00:00 2001 From: Marius Date: Mon, 27 Apr 2026 12:00:14 +0200 Subject: [PATCH 204/238] feat(vscode): open config files from settings (#9548) * feat(vscode): open config files from settings * fix(vscode): localize config file picker * chore(kilo-docs): update source links * fix(vscode): reuse settings translations for config picker * chore: update kilo-vscode visual regression baselines --------- Co-authored-by: github-actions[bot] --- .changeset/open-config-files.md | 5 + .../settings-panel-chromium-linux.png | 4 +- packages/kilo-docs/source-links.md | 1 + packages/kilo-vscode/src/KiloProvider.ts | 4 + .../src/kilo-provider/config-file.ts | 117 ++++++++++++++++++ .../src/kilo-provider/open-config.ts | 72 +++++++++++ .../src/components/settings/Settings.tsx | 42 ++++++- .../kilo-vscode/webview-ui/src/i18n/ar.ts | 23 ++++ .../kilo-vscode/webview-ui/src/i18n/br.ts | 25 ++++ .../kilo-vscode/webview-ui/src/i18n/bs.ts | 24 ++++ .../kilo-vscode/webview-ui/src/i18n/da.ts | 24 ++++ .../kilo-vscode/webview-ui/src/i18n/de.ts | 25 ++++ .../kilo-vscode/webview-ui/src/i18n/en.ts | 23 ++++ .../kilo-vscode/webview-ui/src/i18n/es.ts | 25 ++++ .../kilo-vscode/webview-ui/src/i18n/fr.ts | 25 ++++ .../kilo-vscode/webview-ui/src/i18n/ja.ts | 24 ++++ .../kilo-vscode/webview-ui/src/i18n/ko.ts | 24 ++++ .../kilo-vscode/webview-ui/src/i18n/nl.ts | 24 ++++ .../kilo-vscode/webview-ui/src/i18n/no.ts | 24 ++++ .../kilo-vscode/webview-ui/src/i18n/pl.ts | 24 ++++ .../kilo-vscode/webview-ui/src/i18n/ru.ts | 25 ++++ .../kilo-vscode/webview-ui/src/i18n/th.ts | 24 ++++ .../kilo-vscode/webview-ui/src/i18n/tr.ts | 24 ++++ .../kilo-vscode/webview-ui/src/i18n/uk.ts | 24 ++++ .../kilo-vscode/webview-ui/src/i18n/zh.ts | 23 ++++ .../kilo-vscode/webview-ui/src/i18n/zht.ts | 23 ++++ .../src/types/messages/webview-messages.ts | 28 +++++ 27 files changed, 727 insertions(+), 3 deletions(-) create mode 100644 .changeset/open-config-files.md create mode 100644 packages/kilo-vscode/src/kilo-provider/config-file.ts create mode 100644 packages/kilo-vscode/src/kilo-provider/open-config.ts diff --git a/.changeset/open-config-files.md b/.changeset/open-config-files.md new file mode 100644 index 00000000000..48e9bbf1586 --- /dev/null +++ b/.changeset/open-config-files.md @@ -0,0 +1,5 @@ +--- +"kilo-code": minor +--- + +Add Settings header buttons to open the project and global Kilo config files directly in VS Code. diff --git a/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/settings/settings-panel-chromium-linux.png b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/settings/settings-panel-chromium-linux.png index 1f474da3485..2a9f410b3bb 100644 --- a/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/settings/settings-panel-chromium-linux.png +++ b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/settings/settings-panel-chromium-linux.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4524d1fe8b44cf2cce15bdf3ad100572b57fa479fefe456f1c141ebca8d5187d -size 28078 +oid sha256:16e602e6a870e4b66a466a0895f92e9df117f6137809c79ed797f24d2b6a1e88 +size 31028 diff --git a/packages/kilo-docs/source-links.md b/packages/kilo-docs/source-links.md index dd97d3bdfe3..15ae05f7e35 100644 --- a/packages/kilo-docs/source-links.md +++ b/packages/kilo-docs/source-links.md @@ -16,6 +16,7 @@ - + - diff --git a/packages/kilo-vscode/src/KiloProvider.ts b/packages/kilo-vscode/src/KiloProvider.ts index a37424bcb82..4c7f6a324f6 100644 --- a/packages/kilo-vscode/src/KiloProvider.ts +++ b/packages/kilo-vscode/src/KiloProvider.ts @@ -64,6 +64,7 @@ import { } from "./services/autocomplete/settings" import * as ModelState from "./kilo-provider/model-state" import { handleForkSession } from "./kilo-provider/fork-session" +import { openConfig } from "./kilo-provider/open-config" import { retryable, backoff, MAX_RETRIES } from "./util/retry" import { hasGit } from "./kilo-provider/git-status" // legacy-migration start @@ -697,6 +698,9 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper case "openVSCodeSettings": vscode.commands.executeCommand("workbench.action.openSettings", message.query) break + case "openConfigFile": + await openConfig(message.scope, message.labels, this.getProjectDirectory(this.currentSession?.id)) + break case "openMarketplacePanel": vscode.commands.executeCommand("kilo-code.new.marketplaceButtonClicked", this.projectDirectory) break diff --git a/packages/kilo-vscode/src/kilo-provider/config-file.ts b/packages/kilo-vscode/src/kilo-provider/config-file.ts new file mode 100644 index 00000000000..f943ebb5d78 --- /dev/null +++ b/packages/kilo-vscode/src/kilo-provider/config-file.ts @@ -0,0 +1,117 @@ +import { existsSync } from "fs" +import * as os from "os" +import * as path from "path" + +export type Scope = "global" | "local" + +export type Source = + | "sourceXdg" + | "sourceHomeKilo" + | "sourceHomeKilocode" + | "sourceHomeOpencode" + | "sourceEnvFile" + | "sourceEnvDir" + | "sourceEnvContent" + | "sourceProjectKilo" + | "sourceProjectRoot" + | "sourceProjectKilocode" + | "sourceProjectOpencode" + +export interface Entry { + file?: string + name: string + source: Source + exists: boolean + loaded: boolean + legacy?: boolean + recommended?: boolean + virtual?: boolean +} + +const SCHEMA = "https://app.kilo.ai/config.json" + +const MODERN = ["kilo.jsonc", "kilo.json"] +const LEGACY = ["opencode.jsonc", "opencode.json"] +const FILES = [...MODERN, ...LEGACY] +const GLOBAL = ["kilo.jsonc", "kilo.json", "opencode.jsonc", "opencode.json", "config.json"] +const HOME = [".kilo", ".kilocode", ".opencode"] +const SOURCES: Record = { + ".kilo": "sourceHomeKilo", + ".kilocode": "sourceHomeKilocode", + ".opencode": "sourceHomeOpencode", +} + +function row(file: string, source: Source, loaded = true, recommended = false): Entry { + const name = path.basename(file) + return { + file, + name, + source, + exists: existsSync(file), + loaded: loaded && existsSync(file), + legacy: name.startsWith("opencode") || name === "config.json" || file.includes(`${path.sep}.kilocode${path.sep}`), + recommended, + } +} + +function ensure(list: Entry[], file: string, source: Source) { + if (list.some((item) => item.file === file)) return list + return [...list, row(file, source, true, true)] +} + +export function globalFiles() { + const root = path.join(process.env.XDG_CONFIG_HOME || path.join(os.homedir(), ".config"), "kilo") + const base = GLOBAL.map((file) => row(path.join(root, file), "sourceXdg")).filter((item) => item.exists) + const dirs = HOME.flatMap((dir) => { + const base = path.join(os.homedir(), dir) + if (!existsSync(base)) return [] + return FILES.map((file) => row(path.join(base, file), SOURCES[dir])).filter((item) => item.exists) + }) + const env = process.env.KILO_CONFIG ? [row(process.env.KILO_CONFIG, "sourceEnvFile")] : [] + const extra = process.env.KILO_CONFIG_DIR + const dir = extra + ? ensure( + FILES.map((file) => row(path.join(extra, file), "sourceEnvDir")).filter((item) => item.exists), + path.join(extra, "kilo.jsonc"), + "sourceEnvDir", + ) + : [] + const virtual: Entry[] = process.env.KILO_CONFIG_CONTENT + ? [ + { + name: "KILO_CONFIG_CONTENT", + source: "sourceEnvContent", + exists: true, + loaded: true, + virtual: true, + }, + ] + : [] + + return ensure([...base, ...dirs, ...env, ...dir, ...virtual], path.join(root, "kilo.jsonc"), "sourceXdg") +} + +export function localFiles(root: string) { + const enabled = !process.env.KILO_DISABLE_PROJECT_CONFIG + const dirs = [path.join(root, ".kilo"), root, path.join(root, ".kilocode"), path.join(root, ".opencode")] + const list = dirs.flatMap((dir) => FILES.map((file) => row(path.join(dir, file), localSource(root, dir), enabled))) + return ensure( + list.filter((item) => item.exists), + path.join(root, ".kilo", "kilo.jsonc"), + "sourceProjectKilo", + ).map((item) => (enabled ? item : { ...item, loaded: false })) +} + +function localSource(root: string, dir: string) { + if (dir === root) return "sourceProjectRoot" + if (dir.endsWith(`${path.sep}.kilo`)) return "sourceProjectKilo" + if (dir.endsWith(`${path.sep}.kilocode`)) return "sourceProjectKilocode" + return "sourceProjectOpencode" +} + +export function content() { + return `{ + "$schema": "${SCHEMA}" +} +` +} diff --git a/packages/kilo-vscode/src/kilo-provider/open-config.ts b/packages/kilo-vscode/src/kilo-provider/open-config.ts new file mode 100644 index 00000000000..e30ee9d51bb --- /dev/null +++ b/packages/kilo-vscode/src/kilo-provider/open-config.ts @@ -0,0 +1,72 @@ +import * as path from "path" +import * as vscode from "vscode" +import { content, globalFiles, localFiles, type Entry, type Scope, type Source } from "./config-file" + +interface Labels extends Record { + scope: string + statusLoaded: string + statusLoadedLegacy: string + statusNotLoaded: string + statusCreate: string + title: string + placeholder: string + noWorkspace: string + openFailed: string +} + +export async function openConfig(scope: Scope, labels: Labels, root?: string): Promise { + if (scope === "local" && !root) { + void vscode.window.showWarningMessage(labels.noWorkspace) + return + } + + const list = scope === "global" ? globalFiles() : localFiles(root!) + const picked = await pick(list, labels) + if (!picked?.file) return + + await open(picked.file, labels) +} + +async function pick(list: Entry[], labels: Labels) { + const editable = list.filter((item) => !item.virtual) + if (editable.length === 1) return editable[0] + + const picked = await vscode.window.showQuickPick( + editable.map((item) => ({ + label: item.recommended && !item.exists ? `$(add) ${item.name}` : `$(json) ${item.name}`, + description: item.exists ? status(item, labels) : labels.statusCreate, + detail: `${labels[item.source]} - ${item.file}`, + item, + })), + { + title: labels.title, + placeHolder: labels.placeholder, + }, + ) + + return picked?.item +} + +function status(item: Entry, labels: Labels) { + if (!item.loaded) return labels.statusNotLoaded + if (item.legacy) return labels.statusLoadedLegacy + return labels.statusLoaded +} + +async function open(file: string, labels: Labels) { + const uri = vscode.Uri.file(file) + try { + await vscode.workspace.fs.createDirectory(vscode.Uri.file(path.dirname(file))) + const exists = await vscode.workspace.fs.stat(uri).then( + () => true, + () => false, + ) + if (!exists) await vscode.workspace.fs.writeFile(uri, Buffer.from(content())) + const doc = await vscode.workspace.openTextDocument(uri) + await vscode.window.showTextDocument(doc, { preview: false }) + } catch (err) { + const msg = err instanceof Error ? err.message : String(err) + console.error("[Kilo New] Failed to open config file:", file, err) + void vscode.window.showErrorMessage(labels.openFailed.replace("{{message}}", () => msg)) + } +} diff --git a/packages/kilo-vscode/webview-ui/src/components/settings/Settings.tsx b/packages/kilo-vscode/webview-ui/src/components/settings/Settings.tsx index 00baf09c9e3..a754532ed43 100644 --- a/packages/kilo-vscode/webview-ui/src/components/settings/Settings.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/settings/Settings.tsx @@ -59,6 +59,37 @@ const Settings: Component = (props) => { }) } + const open = (scope: "local" | "global") => { + const label = + scope === "global" ? language.t("settings.config.scope.global") : language.t("settings.config.scope.local") + vscode.postMessage({ + type: "openConfigFile", + scope, + labels: { + scope: label, + statusLoaded: language.t("settings.config.status.loaded"), + statusLoadedLegacy: language.t("settings.config.status.loadedLegacy"), + statusNotLoaded: language.t("settings.config.status.notLoaded"), + statusCreate: language.t("settings.config.status.create"), + title: language.t("settings.config.title", { scope: label }), + placeholder: language.t("settings.config.placeholder"), + noWorkspace: language.t("settings.config.noWorkspace"), + openFailed: language.t("settings.config.openFailed", { scope: label, message: "{{message}}" }), + sourceXdg: language.t("settings.config.source.xdg"), + sourceHomeKilo: language.t("settings.config.source.homeKilo"), + sourceHomeKilocode: language.t("settings.config.source.homeKilocode"), + sourceHomeOpencode: language.t("settings.config.source.homeOpencode"), + sourceEnvFile: language.t("settings.config.source.envFile"), + sourceEnvDir: language.t("settings.config.source.envDir"), + sourceEnvContent: language.t("settings.config.source.envContent"), + sourceProjectKilo: language.t("settings.config.source.projectKilo"), + sourceProjectRoot: language.t("settings.config.source.projectRoot"), + sourceProjectKilocode: language.t("settings.config.source.projectKilocode"), + sourceProjectOpencode: language.t("settings.config.source.projectOpencode"), + }, + }) + } + // Sync when the parent changes the tab prop (e.g. via navigate message) createEffect( on( @@ -84,10 +115,19 @@ const Settings: Component = (props) => { "border-bottom": "1px solid var(--border-weak-base)", display: "flex", "align-items": "center", + "flex-wrap": "wrap", gap: "8px", }} > -

{language.t("sidebar.settings")}

+

+ {language.t("sidebar.settings")} +

+ +
{/* Settings tabs */} diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts index be5ce50e020..9bc5cbe6ff1 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts @@ -822,6 +822,29 @@ export const dict = { "provider.custom.error.baseURL.format": "يجب أن يبدأ بـ http:// أو https://", "provider.custom.error.required": "مطلوب", "provider.custom.error.duplicate": "مكرر", + "settings.openLocalConfig": "تكوين محلي", + "settings.openGlobalConfig": "تكوين عام", + "settings.config.scope.local": "محلي", + "settings.config.scope.global": "عالمي", + "settings.config.status.loaded": "محمل", + "settings.config.status.loadedLegacy": "محمل تكوين قديم", + "settings.config.status.notLoaded": "غير محمل", + "settings.config.status.create": "غير موجود - قم بإنشاء هذا الملف", + "settings.config.title": "فتح ملف تكوين Kilo {{scope}}", + "settings.config.placeholder": "يتم دمج ملفات التكوين بالترتيب؛ الملفات المحددة كمحملة تؤثر حاليًا على الإعدادات.", + "settings.config.noWorkspace": "افتح مجلد مساحة عمل لتحرير ملف تكوين Kilo المحلي.", + "settings.config.openFailed": "فشل فتح ملف تكوين Kilo {{scope}}: {{message}}", + "settings.config.source.xdg": "تكوين XDG العالمي", + "settings.config.source.homeKilo": "تكوين .kilo في Home", + "settings.config.source.homeKilocode": "تكوين .kilocode في Home", + "settings.config.source.homeOpencode": "تكوين .opencode في Home", + "settings.config.source.envFile": "ملف بيئة KILO_CONFIG", + "settings.config.source.envDir": "KILO_CONFIG_DIR", + "settings.config.source.envContent": "تكوين البيئة المضمن", + "settings.config.source.projectKilo": "تكوين .kilo للمشروع", + "settings.config.source.projectRoot": "تكوين جذر المشروع", + "settings.config.source.projectKilocode": "تكوين .kilocode القديم", + "settings.config.source.projectOpencode": "تكوين .opencode القديم", "settings.models.title": "النماذج", "settings.models.description": "ستكون إعدادات النموذج قابلة للتكوين هنا.", "settings.agents.title": "الوكلاء", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/br.ts b/packages/kilo-vscode/webview-ui/src/i18n/br.ts index 5389b1b5c9e..689075b2d22 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/br.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/br.ts @@ -830,6 +830,31 @@ export const dict = { "provider.custom.error.baseURL.format": "Deve começar com http:// ou https://", "provider.custom.error.required": "Obrigatório", "provider.custom.error.duplicate": "Duplicado", + "settings.openLocalConfig": "Config Local", + "settings.openGlobalConfig": "Config Global", + "settings.config.scope.local": "Local", + "settings.config.scope.global": "Global", + "settings.config.status.loaded": "carregado", + "settings.config.status.loadedLegacy": "configuração legada carregada", + "settings.config.status.notLoaded": "não carregado", + "settings.config.status.create": "não encontrado - criar este arquivo", + "settings.config.title": "Abrir arquivo de configuração {{scope}} do Kilo", + "settings.config.placeholder": + "Os arquivos de configuração são mesclados em ordem; os arquivos marcados como carregados afetam atualmente as configurações.", + "settings.config.noWorkspace": + "Abra uma pasta de espaço de trabalho para editar o arquivo de configuração local do Kilo.", + "settings.config.openFailed": "Falha ao abrir o arquivo de configuração {{scope}} do Kilo: {{message}}", + "settings.config.source.xdg": "Configuração global do XDG", + "settings.config.source.homeKilo": "Configuração .kilo da Home", + "settings.config.source.homeKilocode": "Configuração .kilocode da Home", + "settings.config.source.homeOpencode": "Configuração .opencode da Home", + "settings.config.source.envFile": "Arquivo de ambiente KILO_CONFIG", + "settings.config.source.envDir": "KILO_CONFIG_DIR", + "settings.config.source.envContent": "Configuração de ambiente embutida", + "settings.config.source.projectKilo": "Configuração .kilo do projeto", + "settings.config.source.projectRoot": "Configuração raiz do projeto", + "settings.config.source.projectKilocode": "Configuração .kilocode legada", + "settings.config.source.projectOpencode": "Configuração .opencode legada", "settings.models.title": "Modelos", "settings.models.description": "Configurações de modelos estarão disponíveis aqui.", "settings.agents.title": "Agentes", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts index 3c038f654dd..6f062fca48c 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts @@ -836,6 +836,30 @@ export const dict = { "provider.custom.error.baseURL.format": "Mora početi sa http:// ili https://", "provider.custom.error.required": "Obavezno", "provider.custom.error.duplicate": "Duplikat", + "settings.openLocalConfig": "Lokalna konfig.", + "settings.openGlobalConfig": "Globalna konfig.", + "settings.config.scope.local": "Lokalno", + "settings.config.scope.global": "Globalno", + "settings.config.status.loaded": "učitano", + "settings.config.status.loadedLegacy": "učitana zastarjela konfiguracija", + "settings.config.status.notLoaded": "nije učitano", + "settings.config.status.create": "nije pronađeno - kreiraj ovu datoteku", + "settings.config.title": "Otvori {{scope}} Kilo konfiguracijsku datoteku", + "settings.config.placeholder": + "Konfiguracijske datoteke se spajaju po redu; datoteke označene kao učitane trenutno utiču na postavke.", + "settings.config.noWorkspace": "Otvorite fasciklu radnog prostora da uredite lokalnu Kilo konfiguracijsku datoteku.", + "settings.config.openFailed": "Nije uspjelo otvaranje {{scope}} Kilo konfiguracijske datoteke: {{message}}", + "settings.config.source.xdg": "XDG globalna konfiguracija", + "settings.config.source.homeKilo": "Home .kilo konfiguracija", + "settings.config.source.homeKilocode": "Home .kilocode konfiguracija", + "settings.config.source.homeOpencode": "Home .opencode konfiguracija", + "settings.config.source.envFile": "KILO_CONFIG datoteka okruženja", + "settings.config.source.envDir": "KILO_CONFIG_DIR", + "settings.config.source.envContent": "Ugrađena konfiguracija okruženja", + "settings.config.source.projectKilo": "Projektna .kilo konfiguracija", + "settings.config.source.projectRoot": "Konfiguracija korijena projekta", + "settings.config.source.projectKilocode": "Zastarjela .kilocode konfiguracija", + "settings.config.source.projectOpencode": "Zastarjela .opencode konfiguracija", "settings.models.title": "Modeli", "settings.models.description": "Postavke modela će se ovdje moći podešavati.", "settings.agents.title": "Agenti", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/da.ts b/packages/kilo-vscode/webview-ui/src/i18n/da.ts index ffcb52175df..c04fef2ea72 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/da.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/da.ts @@ -829,6 +829,30 @@ export const dict = { "provider.custom.error.baseURL.format": "Skal starte med http:// eller https://", "provider.custom.error.required": "Påkrævet", "provider.custom.error.duplicate": "Duplikat", + "settings.openLocalConfig": "Lokal konfig", + "settings.openGlobalConfig": "Global konfig", + "settings.config.scope.local": "Lokal", + "settings.config.scope.global": "Global", + "settings.config.status.loaded": "indlæst", + "settings.config.status.loadedLegacy": "indlæst forældet konfiguration", + "settings.config.status.notLoaded": "ikke indlæst", + "settings.config.status.create": "ikke fundet - opret denne fil", + "settings.config.title": "Åbn {{scope}} Kilo konfigurationsfil", + "settings.config.placeholder": + "Konfigurationsfiler flettes i rækkefølge; filer markeret som indlæst påvirker i øjeblikket indstillingerne.", + "settings.config.noWorkspace": "Åbn en arbejdsområdemappe for at redigere den lokale Kilo konfigurationsfil.", + "settings.config.openFailed": "Kunne ikke åbne {{scope}} Kilo konfigurationsfil: {{message}}", + "settings.config.source.xdg": "XDG global konfiguration", + "settings.config.source.homeKilo": "Home .kilo konfiguration", + "settings.config.source.homeKilocode": "Home .kilocode konfiguration", + "settings.config.source.homeOpencode": "Home .opencode konfiguration", + "settings.config.source.envFile": "KILO_CONFIG miljøfil", + "settings.config.source.envDir": "KILO_CONFIG_DIR", + "settings.config.source.envContent": "Indbygget miljøkonfiguration", + "settings.config.source.projectKilo": "Projekt .kilo konfiguration", + "settings.config.source.projectRoot": "Projekt rodkonfiguration", + "settings.config.source.projectKilocode": "Forældet .kilocode konfiguration", + "settings.config.source.projectOpencode": "Forældet .opencode konfiguration", "settings.models.title": "Modeller", "settings.models.description": "Modelindstillinger vil kunne konfigureres her.", "settings.agents.title": "Agenter", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/de.ts b/packages/kilo-vscode/webview-ui/src/i18n/de.ts index 9c949294e1a..a2d9e5e8350 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/de.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/de.ts @@ -841,6 +841,31 @@ export const dict = { "provider.custom.error.baseURL.format": "Muss mit http:// oder https:// beginnen", "provider.custom.error.required": "Erforderlich", "provider.custom.error.duplicate": "Duplikat", + "settings.openLocalConfig": "Lokale Config", + "settings.openGlobalConfig": "Globale Config", + "settings.config.scope.local": "Lokal", + "settings.config.scope.global": "Global", + "settings.config.status.loaded": "geladen", + "settings.config.status.loadedLegacy": "veraltete Konfiguration geladen", + "settings.config.status.notLoaded": "nicht geladen", + "settings.config.status.create": "nicht gefunden - diese Datei erstellen", + "settings.config.title": "{{scope}} Kilo-Konfigurationsdatei öffnen", + "settings.config.placeholder": + "Konfigurationsdateien werden der Reihe nach zusammengeführt; als geladen markierte Dateien wirken sich aktuell auf die Einstellungen aus.", + "settings.config.noWorkspace": + "Öffnen Sie einen Arbeitsbereichsordner, um die lokale Kilo-Konfigurationsdatei zu bearbeiten.", + "settings.config.openFailed": "Fehler beim Öffnen der {{scope}} Kilo-Konfigurationsdatei: {{message}}", + "settings.config.source.xdg": "Globale XDG-Konfiguration", + "settings.config.source.homeKilo": "Home .kilo-Konfiguration", + "settings.config.source.homeKilocode": "Home .kilocode-Konfiguration", + "settings.config.source.homeOpencode": "Home .opencode-Konfiguration", + "settings.config.source.envFile": "KILO_CONFIG Umgebungsdatei", + "settings.config.source.envDir": "KILO_CONFIG_DIR", + "settings.config.source.envContent": "Inline-Umgebungskonfiguration", + "settings.config.source.projectKilo": "Projekt .kilo-Konfiguration", + "settings.config.source.projectRoot": "Projektstamm-Konfiguration", + "settings.config.source.projectKilocode": "Veraltete .kilocode-Konfiguration", + "settings.config.source.projectOpencode": "Veraltete .opencode-Konfiguration", "settings.models.title": "Modelle", "settings.models.description": "Modelleinstellungen können hier konfiguriert werden.", "settings.agents.title": "Agenten", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/en.ts b/packages/kilo-vscode/webview-ui/src/i18n/en.ts index 24766d4bd49..7ba66354a2b 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/en.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/en.ts @@ -830,6 +830,29 @@ export const dict = { "provider.custom.error.baseURL.format": "Must start with http:// or https://", "provider.custom.error.required": "Required", "provider.custom.error.duplicate": "Duplicate", + "settings.openLocalConfig": "Local Config", + "settings.openGlobalConfig": "Global Config", + "settings.config.scope.local": "Local", + "settings.config.scope.global": "Global", + "settings.config.status.loaded": "loaded", + "settings.config.status.loadedLegacy": "loaded legacy config", + "settings.config.status.notLoaded": "not loaded", + "settings.config.status.create": "not found - create this file", + "settings.config.title": "Open {{scope}} Kilo config file", + "settings.config.placeholder": "Config files are merged in order; files marked loaded currently affect settings.", + "settings.config.noWorkspace": "Open a workspace folder to edit the local Kilo config file.", + "settings.config.openFailed": "Failed to open {{scope}} Kilo config file: {{message}}", + "settings.config.source.xdg": "XDG global config", + "settings.config.source.homeKilo": "Home .kilo config", + "settings.config.source.homeKilocode": "Home .kilocode config", + "settings.config.source.homeOpencode": "Home .opencode config", + "settings.config.source.envFile": "KILO_CONFIG environment file", + "settings.config.source.envDir": "KILO_CONFIG_DIR", + "settings.config.source.envContent": "Inline environment config", + "settings.config.source.projectKilo": "Project .kilo config", + "settings.config.source.projectRoot": "Project root config", + "settings.config.source.projectKilocode": "Legacy .kilocode config", + "settings.config.source.projectOpencode": "Legacy .opencode config", "settings.models.title": "Models", "settings.models.description": "Model settings will be configurable here.", "settings.agents.title": "Agents", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/es.ts b/packages/kilo-vscode/webview-ui/src/i18n/es.ts index dbedbd02f99..54ee3b50a6e 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/es.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/es.ts @@ -836,6 +836,31 @@ export const dict = { "provider.custom.error.baseURL.format": "Debe empezar con http:// o https://", "provider.custom.error.required": "Obligatorio", "provider.custom.error.duplicate": "Duplicado", + "settings.openLocalConfig": "Config local", + "settings.openGlobalConfig": "Config global", + "settings.config.scope.local": "Local", + "settings.config.scope.global": "Global", + "settings.config.status.loaded": "cargado", + "settings.config.status.loadedLegacy": "configuración heredada cargada", + "settings.config.status.notLoaded": "no cargado", + "settings.config.status.create": "no encontrado - crear este archivo", + "settings.config.title": "Abrir archivo de configuración Kilo {{scope}}", + "settings.config.placeholder": + "Los archivos de configuración se combinan en orden; los archivos marcados como cargados afectan actualmente a los ajustes.", + "settings.config.noWorkspace": + "Abre una carpeta de espacio de trabajo para editar el archivo de configuración Kilo local.", + "settings.config.openFailed": "Error al abrir el archivo de configuración Kilo {{scope}}: {{message}}", + "settings.config.source.xdg": "Configuración global XDG", + "settings.config.source.homeKilo": "Configuración .kilo de Home", + "settings.config.source.homeKilocode": "Configuración .kilocode de Home", + "settings.config.source.homeOpencode": "Configuración .opencode de Home", + "settings.config.source.envFile": "Archivo de entorno KILO_CONFIG", + "settings.config.source.envDir": "KILO_CONFIG_DIR", + "settings.config.source.envContent": "Configuración de entorno en línea", + "settings.config.source.projectKilo": "Configuración .kilo del proyecto", + "settings.config.source.projectRoot": "Configuración raíz del proyecto", + "settings.config.source.projectKilocode": "Configuración heredada .kilocode", + "settings.config.source.projectOpencode": "Configuración heredada .opencode", "settings.models.title": "Modelos", "settings.models.description": "La configuración de modelos estará disponible aquí.", "settings.agents.title": "Agentes", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts index 5b996d033cf..aa8fe2cc26a 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts @@ -841,6 +841,31 @@ export const dict = { "provider.custom.error.baseURL.format": "Doit commencer par http:// ou https://", "provider.custom.error.required": "Requis", "provider.custom.error.duplicate": "Doublon", + "settings.openLocalConfig": "Config locale", + "settings.openGlobalConfig": "Config globale", + "settings.config.scope.local": "Local", + "settings.config.scope.global": "Global", + "settings.config.status.loaded": "chargé", + "settings.config.status.loadedLegacy": "configuration obsolète chargée", + "settings.config.status.notLoaded": "non chargé", + "settings.config.status.create": "introuvable - créer ce fichier", + "settings.config.title": "Ouvrir le fichier de configuration Kilo {{scope}}", + "settings.config.placeholder": + "Les fichiers de configuration sont fusionnés dans l'ordre ; les fichiers marqués comme chargés affectent actuellement les paramètres.", + "settings.config.noWorkspace": + "Ouvrez un dossier d'espace de travail pour modifier le fichier de configuration Kilo local.", + "settings.config.openFailed": "Échec de l'ouverture du fichier de configuration Kilo {{scope}} : {{message}}", + "settings.config.source.xdg": "Configuration globale XDG", + "settings.config.source.homeKilo": "Configuration .kilo de Home", + "settings.config.source.homeKilocode": "Configuration .kilocode de Home", + "settings.config.source.homeOpencode": "Configuration .opencode de Home", + "settings.config.source.envFile": "Fichier d'environnement KILO_CONFIG", + "settings.config.source.envDir": "KILO_CONFIG_DIR", + "settings.config.source.envContent": "Configuration d'environnement en ligne", + "settings.config.source.projectKilo": "Configuration .kilo du projet", + "settings.config.source.projectRoot": "Configuration racine du projet", + "settings.config.source.projectKilocode": "Configuration obsolète .kilocode", + "settings.config.source.projectOpencode": "Configuration obsolète .opencode", "settings.models.title": "Modèles", "settings.models.description": "Les paramètres des modèles seront configurables ici.", "settings.agents.title": "Agents", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts index 105b8b3e4ac..7d9b53544e8 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts @@ -827,6 +827,30 @@ export const dict = { "provider.custom.error.baseURL.format": "http:// または https:// で始まる必要があります", "provider.custom.error.required": "必須", "provider.custom.error.duplicate": "重複", + "settings.openLocalConfig": "ローカル設定", + "settings.openGlobalConfig": "グローバル設定", + "settings.config.scope.local": "ローカル", + "settings.config.scope.global": "グローバル", + "settings.config.status.loaded": "読み込み済み", + "settings.config.status.loadedLegacy": "旧構成を読み込み済み", + "settings.config.status.notLoaded": "読み込まれていません", + "settings.config.status.create": "見つかりません - このファイルを作成する", + "settings.config.title": "{{scope}}のKilo構成ファイルを開く", + "settings.config.placeholder": + "構成ファイルは順番にマージされます。読み込み済みとしてマークされているファイルが現在設定に影響しています。", + "settings.config.noWorkspace": "ローカルのKilo構成ファイルを編集するには、ワークスペースフォルダーを開いてください。", + "settings.config.openFailed": "{{scope}}のKilo構成ファイルを開けませんでした: {{message}}", + "settings.config.source.xdg": "XDGグローバル構成", + "settings.config.source.homeKilo": "Homeの.kilo構成", + "settings.config.source.homeKilocode": "Homeの.kilocode構成", + "settings.config.source.homeOpencode": "Homeの.opencode構成", + "settings.config.source.envFile": "KILO_CONFIG環境ファイル", + "settings.config.source.envDir": "KILO_CONFIG_DIR", + "settings.config.source.envContent": "インライン環境構成", + "settings.config.source.projectKilo": "プロジェクトの.kilo構成", + "settings.config.source.projectRoot": "プロジェクトルート構成", + "settings.config.source.projectKilocode": "旧.kilocode構成", + "settings.config.source.projectOpencode": "旧.opencode構成", "settings.models.title": "モデル", "settings.models.description": "モデル設定はここで構成できます。", "settings.agents.title": "エージェント", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts index 2930df9476f..6ed9333c84e 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts @@ -827,6 +827,30 @@ export const dict = { "provider.custom.error.baseURL.format": "http:// 또는 https://로 시작해야 합니다", "provider.custom.error.required": "필수", "provider.custom.error.duplicate": "중복", + "settings.openLocalConfig": "로컬 설정", + "settings.openGlobalConfig": "전역 설정", + "settings.config.scope.local": "로컬", + "settings.config.scope.global": "글로벌", + "settings.config.status.loaded": "로드됨", + "settings.config.status.loadedLegacy": "레거시 구성 로드됨", + "settings.config.status.notLoaded": "로드되지 않음", + "settings.config.status.create": "찾을 수 없음 - 이 파일 만들기", + "settings.config.title": "{{scope}} Kilo 구성 파일 열기", + "settings.config.placeholder": + "구성 파일은 순서대로 병합됩니다. 로드됨으로 표시된 파일이 현재 설정에 영향을 미칩니다.", + "settings.config.noWorkspace": "로컬 Kilo 구성 파일을 편집하려면 작업 영역 폴더를 엽니다.", + "settings.config.openFailed": "{{scope}} Kilo 구성 파일을 열지 못했습니다: {{message}}", + "settings.config.source.xdg": "XDG 글로벌 구성", + "settings.config.source.homeKilo": "Home .kilo 구성", + "settings.config.source.homeKilocode": "Home .kilocode 구성", + "settings.config.source.homeOpencode": "Home .opencode 구성", + "settings.config.source.envFile": "KILO_CONFIG 환경 파일", + "settings.config.source.envDir": "KILO_CONFIG_DIR", + "settings.config.source.envContent": "인라인 환경 구성", + "settings.config.source.projectKilo": "프로젝트 .kilo 구성", + "settings.config.source.projectRoot": "프로젝트 루트 구성", + "settings.config.source.projectKilocode": "레거시 .kilocode 구성", + "settings.config.source.projectOpencode": "레거시 .opencode 구성", "settings.models.title": "모델", "settings.models.description": "모델 설정은 여기서 구성할 수 있습니다.", "settings.agents.title": "에이전트", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts index d6d957996b0..39d2c68d24d 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts @@ -830,6 +830,30 @@ export const dict = { "provider.custom.error.baseURL.format": "Moet beginnen met http:// of https://", "provider.custom.error.required": "Vereist", "provider.custom.error.duplicate": "Duplicaat", + "settings.openLocalConfig": "Lokale config", + "settings.openGlobalConfig": "Globale config", + "settings.config.scope.local": "Lokaal", + "settings.config.scope.global": "Globaal", + "settings.config.status.loaded": "geladen", + "settings.config.status.loadedLegacy": "verouderde configuratie geladen", + "settings.config.status.notLoaded": "niet geladen", + "settings.config.status.create": "niet gevonden - maak dit bestand", + "settings.config.title": "Open {{scope}} Kilo-configuratiebestand", + "settings.config.placeholder": + "Configuratiebestanden worden op volgorde samengevoegd; bestanden gemarkeerd als geladen hebben momenteel invloed op de instellingen.", + "settings.config.noWorkspace": "Open een werkruimtemap om het lokale Kilo-configuratiebestand te bewerken.", + "settings.config.openFailed": "Kan {{scope}} Kilo-configuratiebestand niet openen: {{message}}", + "settings.config.source.xdg": "XDG globale configuratie", + "settings.config.source.homeKilo": "Home .kilo-configuratie", + "settings.config.source.homeKilocode": "Home .kilocode-configuratie", + "settings.config.source.homeOpencode": "Home .opencode-configuratie", + "settings.config.source.envFile": "KILO_CONFIG omgevingsbestand", + "settings.config.source.envDir": "KILO_CONFIG_DIR", + "settings.config.source.envContent": "Inline omgevingsconfiguratie", + "settings.config.source.projectKilo": "Project .kilo-configuratie", + "settings.config.source.projectRoot": "Project root configuratie", + "settings.config.source.projectKilocode": "Verouderde .kilocode-configuratie", + "settings.config.source.projectOpencode": "Verouderde .opencode-configuratie", "settings.models.title": "Modellen", "settings.models.description": "Model-instellingen zullen hier configureerbaar zijn.", "settings.agents.title": "Agenten", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/no.ts b/packages/kilo-vscode/webview-ui/src/i18n/no.ts index 0c2cff67787..e10af3a4d16 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/no.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/no.ts @@ -833,6 +833,30 @@ export const dict = { "provider.custom.error.baseURL.format": "Må starte med http:// eller https://", "provider.custom.error.required": "Påkrevd", "provider.custom.error.duplicate": "Duplikat", + "settings.openLocalConfig": "Lokal konfig", + "settings.openGlobalConfig": "Global konfig", + "settings.config.scope.local": "Lokal", + "settings.config.scope.global": "Global", + "settings.config.status.loaded": "lastet", + "settings.config.status.loadedLegacy": "lastet inn eldre konfigurasjon", + "settings.config.status.notLoaded": "ikke lastet", + "settings.config.status.create": "ikke funnet - opprett denne filen", + "settings.config.title": "Åpne {{scope}} Kilo-konfigurasjonsfil", + "settings.config.placeholder": + "Konfigurasjonsfiler slås sammen i rekkefølge; filer merket som lastet påvirker for øyeblikket innstillingene.", + "settings.config.noWorkspace": "Åpne en arbeidsområdemappe for å redigere den lokale Kilo-konfigurasjonsfilen.", + "settings.config.openFailed": "Klarte ikke å åpne {{scope}} Kilo-konfigurasjonsfil: {{message}}", + "settings.config.source.xdg": "XDG global konfigurasjon", + "settings.config.source.homeKilo": "Home .kilo-konfigurasjon", + "settings.config.source.homeKilocode": "Home .kilocode-konfigurasjon", + "settings.config.source.homeOpencode": "Home .opencode-konfigurasjon", + "settings.config.source.envFile": "KILO_CONFIG miljøfil", + "settings.config.source.envDir": "KILO_CONFIG_DIR", + "settings.config.source.envContent": "Innebygd miljøkonfigurasjon", + "settings.config.source.projectKilo": "Prosjekt .kilo-konfigurasjon", + "settings.config.source.projectRoot": "Prosjektets rotkonfigurasjon", + "settings.config.source.projectKilocode": "Eldre .kilocode-konfigurasjon", + "settings.config.source.projectOpencode": "Eldre .opencode-konfigurasjon", "settings.models.title": "Modeller", "settings.models.description": "Modellinnstillinger vil kunne konfigureres her.", "settings.agents.title": "Agenter", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts index de4250f8520..87698039ded 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts @@ -834,6 +834,30 @@ export const dict = { "provider.custom.error.baseURL.format": "Musi zaczynać się od http:// lub https://", "provider.custom.error.required": "Wymagane", "provider.custom.error.duplicate": "Duplikat", + "settings.openLocalConfig": "Konfig. lokalna", + "settings.openGlobalConfig": "Konfig. globalna", + "settings.config.scope.local": "Lokalne", + "settings.config.scope.global": "Globalne", + "settings.config.status.loaded": "wczytano", + "settings.config.status.loadedLegacy": "wczytano przestarzałą konfigurację", + "settings.config.status.notLoaded": "nie wczytano", + "settings.config.status.create": "nie znaleziono - utwórz ten plik", + "settings.config.title": "Otwórz plik konfiguracyjny Kilo ({{scope}})", + "settings.config.placeholder": + "Pliki konfiguracyjne są scalane po kolei; pliki oznaczone jako wczytane mają obecnie wpływ na ustawienia.", + "settings.config.noWorkspace": "Otwórz folder obszaru roboczego, aby edytować lokalny plik konfiguracyjny Kilo.", + "settings.config.openFailed": "Nie udało się otworzyć pliku konfiguracyjnego Kilo ({{scope}}): {{message}}", + "settings.config.source.xdg": "Globalna konfiguracja XDG", + "settings.config.source.homeKilo": "Konfiguracja .kilo (Home)", + "settings.config.source.homeKilocode": "Konfiguracja .kilocode (Home)", + "settings.config.source.homeOpencode": "Konfiguracja .opencode (Home)", + "settings.config.source.envFile": "Plik środowiskowy KILO_CONFIG", + "settings.config.source.envDir": "KILO_CONFIG_DIR", + "settings.config.source.envContent": "Wbudowana konfiguracja środowiska", + "settings.config.source.projectKilo": "Konfiguracja .kilo projektu", + "settings.config.source.projectRoot": "Konfiguracja główna projektu", + "settings.config.source.projectKilocode": "Przestarzała konfiguracja .kilocode", + "settings.config.source.projectOpencode": "Przestarzała konfiguracja .opencode", "settings.models.title": "Modele", "settings.models.description": "Ustawienia modeli będą tutaj konfigurowalne.", "settings.agents.title": "Agenci", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts index 118ba47c57a..044f41c99de 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts @@ -835,6 +835,31 @@ export const dict = { "provider.custom.error.baseURL.format": "Должен начинаться с http:// или https://", "provider.custom.error.required": "Обязательно", "provider.custom.error.duplicate": "Дубликат", + "settings.openLocalConfig": "Локальный конфиг", + "settings.openGlobalConfig": "Глобальный конфиг", + "settings.config.scope.local": "Локальный", + "settings.config.scope.global": "Глобальный", + "settings.config.status.loaded": "загружено", + "settings.config.status.loadedLegacy": "загружена устаревшая конфигурация", + "settings.config.status.notLoaded": "не загружено", + "settings.config.status.create": "не найдено - создать этот файл", + "settings.config.title": "Открыть файл конфигурации Kilo ({{scope}})", + "settings.config.placeholder": + "Файлы конфигурации объединяются по порядку; файлы, отмеченные как загруженные, в данный момент влияют на настройки.", + "settings.config.noWorkspace": + "Откройте папку рабочей области для редактирования локального файла конфигурации Kilo.", + "settings.config.openFailed": "Не удалось открыть файл конфигурации Kilo ({{scope}}): {{message}}", + "settings.config.source.xdg": "Глобальная конфигурация XDG", + "settings.config.source.homeKilo": "Конфигурация .kilo (Home)", + "settings.config.source.homeKilocode": "Конфигурация .kilocode (Home)", + "settings.config.source.homeOpencode": "Конфигурация .opencode (Home)", + "settings.config.source.envFile": "Файл среды KILO_CONFIG", + "settings.config.source.envDir": "KILO_CONFIG_DIR", + "settings.config.source.envContent": "Встроенная конфигурация среды", + "settings.config.source.projectKilo": "Конфигурация .kilo проекта", + "settings.config.source.projectRoot": "Корневая конфигурация проекта", + "settings.config.source.projectKilocode": "Устаревшая конфигурация .kilocode", + "settings.config.source.projectOpencode": "Устаревшая конфигурация .opencode", "settings.models.title": "Модели", "settings.models.description": "Настройки моделей будут доступны здесь.", "settings.agents.title": "Агенты", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/th.ts b/packages/kilo-vscode/webview-ui/src/i18n/th.ts index 62334e9e109..2b6bd97efb6 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/th.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/th.ts @@ -826,6 +826,30 @@ export const dict = { "provider.custom.error.baseURL.format": "ต้องขึ้นต้นด้วย http:// หรือ https://", "provider.custom.error.required": "จำเป็น", "provider.custom.error.duplicate": "ซ้ำ", + "settings.openLocalConfig": "คอนฟิก Local", + "settings.openGlobalConfig": "คอนฟิก Global", + "settings.config.scope.local": "ภายใน", + "settings.config.scope.global": "ทั่วโลก", + "settings.config.status.loaded": "โหลดแล้ว", + "settings.config.status.loadedLegacy": "โหลดการตั้งค่าแบบเก่าแล้ว", + "settings.config.status.notLoaded": "ยังไม่ได้โหลด", + "settings.config.status.create": "ไม่พบ - สร้างไฟล์นี้", + "settings.config.title": "เปิดไฟล์การตั้งค่า Kilo ({{scope}})", + "settings.config.placeholder": + "ไฟล์การตั้งค่าจะถูกผสานตามลำดับ ไฟล์ที่ถูกทำเครื่องหมายว่าโหลดแล้วจะมีผลกับการตั้งค่าในปัจจุบัน", + "settings.config.noWorkspace": "เปิดโฟลเดอร์พื้นที่ทำงานเพื่อแก้ไขไฟล์การตั้งค่า Kilo ภายใน", + "settings.config.openFailed": "ไม่สามารถเปิดไฟล์การตั้งค่า Kilo ({{scope}}): {{message}}", + "settings.config.source.xdg": "การตั้งค่า XDG ทั่วโลก", + "settings.config.source.homeKilo": "การตั้งค่า .kilo ของ Home", + "settings.config.source.homeKilocode": "การตั้งค่า .kilocode ของ Home", + "settings.config.source.homeOpencode": "การตั้งค่า .opencode ของ Home", + "settings.config.source.envFile": "ไฟล์สภาพแวดล้อม KILO_CONFIG", + "settings.config.source.envDir": "KILO_CONFIG_DIR", + "settings.config.source.envContent": "การตั้งค่าสภาพแวดล้อมแบบอินไลน์", + "settings.config.source.projectKilo": "การตั้งค่า .kilo ของโปรเจกต์", + "settings.config.source.projectRoot": "การตั้งค่ารูทของโปรเจกต์", + "settings.config.source.projectKilocode": "การตั้งค่า .kilocode แบบเก่า", + "settings.config.source.projectOpencode": "การตั้งค่า .opencode แบบเก่า", "settings.models.title": "โมเดล", "settings.models.description": "การตั้งค่าโมเดลจะสามารถกำหนดค่าได้ที่นี่", "settings.agents.title": "เอเจนต์", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts index 50f1ec6a10b..d82eeed6aa4 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts @@ -832,6 +832,30 @@ export const dict = { "provider.custom.error.baseURL.format": "http:// veya https:// ile başlamalı", "provider.custom.error.required": "Gerekli", "provider.custom.error.duplicate": "Tekrar", + "settings.openLocalConfig": "Yerel Config", + "settings.openGlobalConfig": "Global Config", + "settings.config.scope.local": "Yerel", + "settings.config.scope.global": "Küresel", + "settings.config.status.loaded": "yüklendi", + "settings.config.status.loadedLegacy": "eski yapılandırma yüklendi", + "settings.config.status.notLoaded": "yüklenmedi", + "settings.config.status.create": "bulunamadı - bu dosyayı oluştur", + "settings.config.title": "{{scope}} Kilo yapılandırma dosyasını aç", + "settings.config.placeholder": + "Yapılandırma dosyaları sırayla birleştirilir; yüklendi olarak işaretlenen dosyalar şu anda ayarları etkiler.", + "settings.config.noWorkspace": "Yerel Kilo yapılandırma dosyasını düzenlemek için bir çalışma alanı klasörü açın.", + "settings.config.openFailed": "{{scope}} Kilo yapılandırma dosyası açılamadı: {{message}}", + "settings.config.source.xdg": "XDG küresel yapılandırma", + "settings.config.source.homeKilo": "Home .kilo yapılandırması", + "settings.config.source.homeKilocode": "Home .kilocode yapılandırması", + "settings.config.source.homeOpencode": "Home .opencode yapılandırması", + "settings.config.source.envFile": "KILO_CONFIG ortam dosyası", + "settings.config.source.envDir": "KILO_CONFIG_DIR", + "settings.config.source.envContent": "Satır içi ortam yapılandırması", + "settings.config.source.projectKilo": "Proje .kilo yapılandırması", + "settings.config.source.projectRoot": "Proje kök yapılandırması", + "settings.config.source.projectKilocode": "Eski .kilocode yapılandırması", + "settings.config.source.projectOpencode": "Eski .opencode yapılandırması", "settings.models.title": "Modeller", "settings.models.description": "Model ayarları burada yapılandırılabilecek.", "settings.agents.title": "Ajanlar", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts index 6b3451745b2..fc9df54b4d0 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts @@ -832,6 +832,30 @@ export const dict = { "provider.custom.error.baseURL.format": "Має починатися з http:// або https://", "provider.custom.error.required": "Обов'язкове поле", "provider.custom.error.duplicate": "Дублікат", + "settings.openLocalConfig": "Локальний конфіг", + "settings.openGlobalConfig": "Глобальний конфіг", + "settings.config.scope.local": "Локальний", + "settings.config.scope.global": "Глобальний", + "settings.config.status.loaded": "завантажено", + "settings.config.status.loadedLegacy": "завантажено застарілу конфігурацію", + "settings.config.status.notLoaded": "не завантажено", + "settings.config.status.create": "не знайдено - створити цей файл", + "settings.config.title": "Відкрити файл конфігурації Kilo ({{scope}})", + "settings.config.placeholder": + "Файли конфігурації об'єднуються по порядку; файли, позначені як завантажені, наразі впливають на налаштування.", + "settings.config.noWorkspace": "Відкрийте папку робочої області, щоб відредагувати локальний файл конфігурації Kilo.", + "settings.config.openFailed": "Не вдалося відкрити файл конфігурації Kilo ({{scope}}): {{message}}", + "settings.config.source.xdg": "Глобальна конфігурація XDG", + "settings.config.source.homeKilo": "Конфігурація .kilo (Home)", + "settings.config.source.homeKilocode": "Конфігурація .kilocode (Home)", + "settings.config.source.homeOpencode": "Конфігурація .opencode (Home)", + "settings.config.source.envFile": "Файл середовища KILO_CONFIG", + "settings.config.source.envDir": "KILO_CONFIG_DIR", + "settings.config.source.envContent": "Вбудована конфігурація середовища", + "settings.config.source.projectKilo": "Конфігурація .kilo проєкту", + "settings.config.source.projectRoot": "Коренева конфігурація проєкту", + "settings.config.source.projectKilocode": "Застаріла конфігурація .kilocode", + "settings.config.source.projectOpencode": "Застаріла конфігурація .opencode", "settings.models.title": "Моделі", "settings.models.description": "Тут можна буде налаштовувати параметри моделей.", "settings.agents.title": "Агенти", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts index a19caa48c66..9c94a897dd3 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts @@ -816,6 +816,29 @@ export const dict = { "provider.custom.error.baseURL.format": "必须以 http:// 或 https:// 开头", "provider.custom.error.required": "必填", "provider.custom.error.duplicate": "重复", + "settings.openLocalConfig": "本地配置", + "settings.openGlobalConfig": "全局配置", + "settings.config.scope.local": "本地", + "settings.config.scope.global": "全局", + "settings.config.status.loaded": "已加载", + "settings.config.status.loadedLegacy": "已加载旧版配置", + "settings.config.status.notLoaded": "未加载", + "settings.config.status.create": "未找到 - 创建此文件", + "settings.config.title": "打开 {{scope}} Kilo 配置文件", + "settings.config.placeholder": "配置文件按顺序合并;标记为已加载的文件目前会影响设置。", + "settings.config.noWorkspace": "打开工作区文件夹以编辑本地 Kilo 配置文件。", + "settings.config.openFailed": "无法打开 {{scope}} Kilo 配置文件:{{message}}", + "settings.config.source.xdg": "XDG 全局配置", + "settings.config.source.homeKilo": "主目录 .kilo 配置", + "settings.config.source.homeKilocode": "主目录 .kilocode 配置", + "settings.config.source.homeOpencode": "主目录 .opencode 配置", + "settings.config.source.envFile": "KILO_CONFIG 环境变量文件", + "settings.config.source.envDir": "KILO_CONFIG_DIR", + "settings.config.source.envContent": "内联环境配置", + "settings.config.source.projectKilo": "项目 .kilo 配置", + "settings.config.source.projectRoot": "项目根目录配置", + "settings.config.source.projectKilocode": "旧版 .kilocode 配置", + "settings.config.source.projectOpencode": "旧版 .opencode 配置", "settings.models.title": "模型", "settings.models.description": "模型设置将在此处可配置。", "settings.agents.title": "智能体", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts index a02b3ac96fc..636431ec80f 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts @@ -818,6 +818,29 @@ export const dict = { "provider.custom.error.baseURL.format": "必須以 http:// 或 https:// 開頭", "provider.custom.error.required": "必填", "provider.custom.error.duplicate": "重複", + "settings.openLocalConfig": "本機設定", + "settings.openGlobalConfig": "全域設定", + "settings.config.scope.local": "本地", + "settings.config.scope.global": "全域", + "settings.config.status.loaded": "已載入", + "settings.config.status.loadedLegacy": "已載入舊版設定", + "settings.config.status.notLoaded": "未載入", + "settings.config.status.create": "找不到 - 建立此檔案", + "settings.config.title": "開啟 {{scope}} Kilo 設定檔", + "settings.config.placeholder": "設定檔會按順序合併;標記為已載入的檔案目前會影響設定。", + "settings.config.noWorkspace": "開啟工作區資料夾以編輯本地 Kilo 設定檔。", + "settings.config.openFailed": "無法開啟 {{scope}} Kilo 設定檔:{{message}}", + "settings.config.source.xdg": "XDG 全域設定", + "settings.config.source.homeKilo": "主目錄 .kilo 設定", + "settings.config.source.homeKilocode": "主目錄 .kilocode 設定", + "settings.config.source.homeOpencode": "主目錄 .opencode 設定", + "settings.config.source.envFile": "KILO_CONFIG 環境變數檔案", + "settings.config.source.envDir": "KILO_CONFIG_DIR", + "settings.config.source.envContent": "內聯環境設定", + "settings.config.source.projectKilo": "專案 .kilo 設定", + "settings.config.source.projectRoot": "專案根目錄設定", + "settings.config.source.projectKilocode": "舊版 .kilocode 設定", + "settings.config.source.projectOpencode": "舊版 .opencode 設定", "settings.models.title": "模型", "settings.models.description": "可在此調整模型設定。", "settings.agents.title": "代理程式", diff --git a/packages/kilo-vscode/webview-ui/src/types/messages/webview-messages.ts b/packages/kilo-vscode/webview-ui/src/types/messages/webview-messages.ts index 6d67b01ab8d..2aeab467d7e 100644 --- a/packages/kilo-vscode/webview-ui/src/types/messages/webview-messages.ts +++ b/packages/kilo-vscode/webview-ui/src/types/messages/webview-messages.ts @@ -163,6 +163,33 @@ export interface OpenVSCodeSettingsRequest { query: string } +export interface OpenConfigFileRequest { + type: "openConfigFile" + scope: "local" | "global" + labels: { + scope: string + statusLoaded: string + statusLoadedLegacy: string + statusNotLoaded: string + statusCreate: string + title: string + placeholder: string + noWorkspace: string + openFailed: string + sourceXdg: string + sourceHomeKilo: string + sourceHomeKilocode: string + sourceHomeOpencode: string + sourceEnvFile: string + sourceEnvDir: string + sourceEnvContent: string + sourceProjectKilo: string + sourceProjectRoot: string + sourceProjectKilocode: string + sourceProjectOpencode: string + } +} + export interface OpenMarketplacePanelRequest { type: "openMarketplacePanel" } @@ -901,6 +928,7 @@ export type WebviewMessage = | OpenExternalRequest | OpenSettingsPanelRequest | OpenVSCodeSettingsRequest + | OpenConfigFileRequest | OpenMarketplacePanelRequest | OpenFileRequest | CancelLoginRequest From 16abe9679f57937318dd052d52c5bd51a168287c Mon Sep 17 00:00:00 2001 From: Alex Alecu Date: Mon, 27 Apr 2026 13:11:31 +0300 Subject: [PATCH 205/238] chore(cli): fix type error after main merge Add missing 'variant' property to task tool metadata in prompt-effect test, required after upstream added model variant support to the task tool's ExecuteResult type. --- packages/opencode/test/session/prompt-effect.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/opencode/test/session/prompt-effect.test.ts b/packages/opencode/test/session/prompt-effect.test.ts index 652a7e07eb1..c2633dfb482 100644 --- a/packages/opencode/test/session/prompt-effect.test.ts +++ b/packages/opencode/test/session/prompt-effect.test.ts @@ -845,9 +845,9 @@ it.live( yield* sessions.updateMessage(childAssistant) yield* ctx.metadata({ title: "done", - metadata: { sessionId: child.id, model: ref }, + metadata: { sessionId: child.id, model: ref, variant: undefined }, }) - return { title: "done", metadata: { sessionId: child.id, model: ref }, output: "done" } + return { title: "done", metadata: { sessionId: child.id, model: ref, variant: undefined }, output: "done" } }) yield* Effect.addFinalizer(() => Effect.sync(() => void (task.execute = original))) From b344ac97c6a2d7caecf85b43b8c6a07ccb352b6b Mon Sep 17 00:00:00 2001 From: Marius Date: Mon, 27 Apr 2026 12:22:43 +0200 Subject: [PATCH 206/238] fix(vscode): restore disabled provider management (#9551) * fix(vscode): restore disabled provider management * fix(vscode): allow disabling Kilo Gateway * fixup! fix(vscode): allow disabling Kilo Gateway * fixup! fixup! fix(vscode): allow disabling Kilo Gateway * chore: update kilo-vscode visual regression baselines --------- Co-authored-by: github-actions[bot] --- .changeset/quiet-pandas-hide.md | 5 + .../providers-configure-chromium-linux.png | 4 +- .../custom-provider-dialog-validate.test.ts | 12 ++ .../tests/unit/provider-actions-save.test.ts | 44 +++++ .../tests/unit/provider-visibility.test.ts | 58 +++++- .../src/components/settings/ProvidersTab.tsx | 172 +++++++++++++++--- .../settings/provider-visibility.ts | 16 +- 7 files changed, 277 insertions(+), 34 deletions(-) create mode 100644 .changeset/quiet-pandas-hide.md diff --git a/.changeset/quiet-pandas-hide.md b/.changeset/quiet-pandas-hide.md new file mode 100644 index 00000000000..98539741875 --- /dev/null +++ b/.changeset/quiet-pandas-hide.md @@ -0,0 +1,5 @@ +--- +"kilo-code": patch +--- + +Restore disabled provider management in the VS Code extension provider settings. diff --git a/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/settings/providers-configure-chromium-linux.png b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/settings/providers-configure-chromium-linux.png index df62efbf2c0..996569f48fb 100644 --- a/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/settings/providers-configure-chromium-linux.png +++ b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/settings/providers-configure-chromium-linux.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c67c86c68c4a07514db50c964668753c0a85ec410e55208b6e094f711c0bceb5 -size 20317 +oid sha256:9c87ac5179843ad5dadf73023f87d1f0b0589a81420e9ef406534a335598a0a2 +size 28082 diff --git a/packages/kilo-vscode/tests/unit/custom-provider-dialog-validate.test.ts b/packages/kilo-vscode/tests/unit/custom-provider-dialog-validate.test.ts index 337dd77a144..a045e2e1f76 100644 --- a/packages/kilo-vscode/tests/unit/custom-provider-dialog-validate.test.ts +++ b/packages/kilo-vscode/tests/unit/custom-provider-dialog-validate.test.ts @@ -28,6 +28,18 @@ function args(form: FormState) { } describe("validateCustomProvider – variant name validation", () => { + it("allows reconnecting a disabled provider id", () => { + const form = base() + const out = validateCustomProvider({ + ...args(form), + disabledProviders: ["my-provider"], + existingProviderIDs: new Set(["my-provider"]), + }) + + expect(out.result?.providerID).toBe("my-provider") + expect(out.errors.providerID).toBeUndefined() + }) + it("allows submit when reasoning is enabled with no variants", () => { const form = base() form.models[0].reasoning = true diff --git a/packages/kilo-vscode/tests/unit/provider-actions-save.test.ts b/packages/kilo-vscode/tests/unit/provider-actions-save.test.ts index 5a52a31510a..2e04caa3adf 100644 --- a/packages/kilo-vscode/tests/unit/provider-actions-save.test.ts +++ b/packages/kilo-vscode/tests/unit/provider-actions-save.test.ts @@ -229,6 +229,50 @@ describe("saveCustomProvider", () => { .models expect(Object.values(models).every((v) => v !== null)).toBe(true) }) + + it("removes saved custom providers from disabled_providers when reconnecting", async () => { + const { ctx, calls, setCachedConfig } = createCtx({ disabled_providers: ["myprovider", "openai"] }) + + await saveCustomProvider(ctx, "req", "myprovider", createProvider(), undefined, false, null, setCachedConfig) + + expect(calls.config).toHaveLength(1) + expect(calls.config[0].config.disabled_providers).toEqual(["openai"]) + }) +}) + +describe("disconnectProvider", () => { + it("adds configured providers to disabled_providers without deleting their config", async () => { + const existing = { + disabled_providers: ["openai"], + provider: { + myprovider: createProvider(), + }, + } + const { ctx, calls, setCachedConfig } = createCtx(existing) + + await disconnectProvider(ctx, "req", "myprovider", null, setCachedConfig) + + expect(calls.config).toHaveLength(1) + expect(calls.config[0].config).toEqual({ disabled_providers: ["openai", "myprovider"] }) + expect(calls.remove).toEqual([{ providerID: "myprovider" }]) + expect(calls.refresh).toBe(1) + expect(calls.posts).toContainEqual({ type: "providerDisconnected", requestId: "req", providerID: "myprovider" }) + }) + + it("does not duplicate configured providers already disabled", async () => { + const existing = { + disabled_providers: ["myprovider"], + provider: { + myprovider: createProvider(), + }, + } + const { ctx, calls, setCachedConfig } = createCtx(existing) + + await disconnectProvider(ctx, "req", "myprovider", null, setCachedConfig) + + expect(calls.config).toHaveLength(0) + expect(calls.refresh).toBe(1) + }) }) describe("fetchProviderData", () => { diff --git a/packages/kilo-vscode/tests/unit/provider-visibility.test.ts b/packages/kilo-vscode/tests/unit/provider-visibility.test.ts index 5b71ad7ef9b..3efd293f648 100644 --- a/packages/kilo-vscode/tests/unit/provider-visibility.test.ts +++ b/packages/kilo-vscode/tests/unit/provider-visibility.test.ts @@ -1,6 +1,10 @@ import { describe, expect, it } from "bun:test" -import { visibleConnectedIds } from "../../webview-ui/src/components/settings/provider-visibility" +import { + disabledProviderOptions, + providersWithKiloFallback, + visibleConnectedIds, +} from "../../webview-ui/src/components/settings/provider-visibility" describe("visibleConnectedIds", () => { it("hides Kilo from the connected list when auth is missing", () => { @@ -21,3 +25,55 @@ describe("visibleConnectedIds", () => { expect(ids).toEqual(["anthropic"]) }) }) + +describe("disabledProviderOptions", () => { + it("includes Kilo and excludes already disabled providers", () => { + const options = disabledProviderOptions( + { + kilo: { id: "kilo", name: "Kilo Gateway", env: [], models: {} }, + openai: { id: "openai", name: "OpenAI", env: [], models: {} }, + anthropic: { id: "anthropic", name: "Anthropic", env: [], models: {} }, + }, + ["openai"], + ) + + expect(options).toEqual([ + { value: "anthropic", label: "Anthropic" }, + { value: "kilo", label: "Kilo Gateway" }, + ]) + }) + + it("sorts options by provider name", () => { + const options = disabledProviderOptions( + { + zed: { id: "zed", name: "Zed", env: [], models: {} }, + alpha: { id: "alpha", name: "Alpha", env: [], models: {} }, + }, + [], + ) + + expect(options).toEqual([ + { value: "alpha", label: "Alpha" }, + { value: "zed", label: "Zed" }, + ]) + }) +}) + +describe("providersWithKiloFallback", () => { + it("adds Kilo when backend providers omit it", () => { + const providers = providersWithKiloFallback({ + anthropic: { id: "anthropic", name: "Anthropic", env: [], models: {} }, + }) + + expect(providers.kilo?.name).toBe("Kilo Gateway") + expect(providers.anthropic?.name).toBe("Anthropic") + }) + + it("keeps the backend Kilo provider when present", () => { + const providers = providersWithKiloFallback({ + kilo: { id: "kilo", name: "Custom Kilo Name", env: [], models: {} }, + }) + + expect(providers.kilo?.name).toBe("Custom Kilo Name") + }) +}) diff --git a/packages/kilo-vscode/webview-ui/src/components/settings/ProvidersTab.tsx b/packages/kilo-vscode/webview-ui/src/components/settings/ProvidersTab.tsx index 217f845309f..f43f8f7ea50 100644 --- a/packages/kilo-vscode/webview-ui/src/components/settings/ProvidersTab.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/settings/ProvidersTab.tsx @@ -1,11 +1,11 @@ import { Button } from "@kilocode/kilo-ui/button" import { Card } from "@kilocode/kilo-ui/card" import { useDialog } from "@kilocode/kilo-ui/context/dialog" -import { Icon } from "@kilocode/kilo-ui/icon" import { ProviderIcon } from "@kilocode/kilo-ui/provider-icon" +import { Select } from "@kilocode/kilo-ui/select" import { Tag } from "@kilocode/kilo-ui/tag" import { showToast } from "@kilocode/kilo-ui/toast" -import { Component, For, Show, createMemo, onCleanup } from "solid-js" +import { Component, For, Show, createMemo, createSignal, onCleanup } from "solid-js" import { useConfig } from "../../context/config" import { useLanguage } from "../../context/language" import { useProvider } from "../../context/provider" @@ -16,20 +16,22 @@ import CustomProviderDialog from "./CustomProviderDialog" import ProviderConnectDialog from "./ProviderConnectDialog" import ProviderSelectDialog from "./ProviderSelectDialog" import { CUSTOM_PROVIDER_ID, isPopularProvider, providerIcon, providerNoteKey, sortProviders } from "./provider-catalog" -import { visibleConnectedIds } from "./provider-visibility" +import { disabledProviderOptions, providersWithKiloFallback, visibleConnectedIds } from "./provider-visibility" import { KILO_PROVIDER_ID, CUSTOM_PROVIDER_PACKAGE } from "../../../../src/shared/provider-model" import { createProviderAction } from "../../utils/provider-action" type ProviderSource = "env" | "api" | "config" | "custom" +type ProviderOption = { value: string; label: string } const ProvidersTab: Component = () => { const dialog = useDialog() - const { config } = useConfig() + const { config, updateConfig } = useConfig() const provider = useProvider() const language = useLanguage() const server = useServer() const vscode = useVSCode() const action = createProviderAction(vscode) + const [disabled, setDisabled] = createSignal() onCleanup(action.dispose) @@ -59,6 +61,11 @@ const ProvidersTab: Component = () => { ) }) + const disabledProviders = createMemo(() => config().disabled_providers ?? []) + const disabledIds = createMemo(() => new Set(disabledProviders())) + const providers = createMemo(() => providersWithKiloFallback(provider.providers())) + const disabledOptions = createMemo(() => disabledProviderOptions(providers(), disabledProviders())) + function source(item: Provider): ProviderSource | undefined { if (!("source" in item)) return const value = (item as Provider & { source?: string }).source @@ -114,6 +121,23 @@ const ProvidersTab: Component = () => { ) } + function disableProvider(providerID: string) { + const current = disabledProviders() + if (!providerID || current.includes(providerID)) return + updateConfig({ disabled_providers: [...current, providerID] }) + } + + function enableProvider(index: number) { + const next = [...disabledProviders()] + next.splice(index, 1) + updateConfig({ disabled_providers: next }) + } + + function disabledName(id: string) { + const item = providers()[id] + return item?.name ?? id + } + function connectProvider(item: Provider) { if (item.id === KILO_PROVIDER_ID) { server.startLogin() @@ -134,33 +158,35 @@ const ProvidersTab: Component = () => { return (
- {/* Kilo Gateway — always at the top, not editable */} - -
- - - Kilo Gateway - - server.startLogin()}> - {language.t("common.signIn")} - - } + + {/* Kilo Gateway — always at the top, not editable */} + +
- {language.t("settings.providers.tag.gateway")} - -
-
+ + + Kilo Gateway + + server.startLogin()}> + {language.t("common.signIn")} + + } + > + {language.t("settings.providers.tag.gateway")} + +
+
+ {/* Connected providers (excluding Kilo) */}

@@ -342,6 +368,92 @@ const ProvidersTab: Component = () => { {language.t("dialog.provider.viewAll")}

+ + {/* Disabled providers */} +

{language.t("settings.providers.disabled")}

+ +
+ {language.t("settings.providers.disabled.description")} +
+
0 ? "1px solid var(--border-weak-base)" : "none", + }} + > +
+ item.value === provider())} + value={(item) => item.value} + label={(item) => item.label} + onSelect={(item) => updateIndexing({ provider: item?.value as ProviderId | undefined })} + variant="secondary" + size="small" + triggerVariant="settings" + placeholder={language.t("settings.providers.notSet")} + /> + + + updateIndexing({ model: value.trim() || undefined })} + /> + + + saveNumber("dimension", value, { integer: true, min: 1 })} + /> + + + {(group) => { + const fields = providerFields(group) + const label = providers.find((item) => item.value === group)?.label ?? group + return ( + + {(field, index) => ( + + { + const target = e.currentTarget as HTMLInputElement + setProviderDrafts((prev) => ({ ...prev, [`${group}.${field.key}`]: target.value })) + }} + onBlur={(e: FocusEvent) => { + const target = e.currentTarget as HTMLInputElement + saveProviderField(group, field.key, target.value) + }} + /> + + )} + + ) + }} + + + + + +