From f59a274d8a5d572a9ea6d2a7720ce0df44a74eff Mon Sep 17 00:00:00 2001 From: theQuert Date: Wed, 18 Mar 2026 12:04:01 +0800 Subject: [PATCH 01/24] feat: add Apertis provider to VS Code legacy migration mapping Move Apertis from UNSUPPORTED_PROVIDERS to PROVIDER_MAP with proper field mappings (apertisApiKey, apertisModelId, apertisBaseUrl) so legacy VS Code extension settings migrate correctly to the new CLI backend. --- .../kilo-vscode/src/legacy-migration/provider-mapping.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/kilo-vscode/src/legacy-migration/provider-mapping.ts b/packages/kilo-vscode/src/legacy-migration/provider-mapping.ts index 817cdeb9775..53de6773af5 100644 --- a/packages/kilo-vscode/src/legacy-migration/provider-mapping.ts +++ b/packages/kilo-vscode/src/legacy-migration/provider-mapping.ts @@ -240,6 +240,13 @@ export const PROVIDER_MAP: Record = { key: "syntheticApiKey", name: "Synthetic", }, + apertis: { + id: "apertis", + key: "apertisApiKey", + name: "Apertis", + modelField: "apertisModelId", + urlField: "apertisBaseUrl", + }, } /** Providers that have no equivalent in the new CLI backend */ @@ -256,7 +263,6 @@ export const UNSUPPORTED_PROVIDERS = new Set([ "nano-gpt", "poe", "aihubmix", - "apertis", "zenmux", ]) From 714e1f5acc349f4fa36cdc4f4d6997dbbd1f3b92 Mon Sep 17 00:00:00 2001 From: Christiaan Arnoldus Date: Mon, 23 Mar 2026 12:00:30 +0100 Subject: [PATCH 02/24] Fix merge --- .../kilo-vscode/src/legacy-migration/provider-mapping.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/kilo-vscode/src/legacy-migration/provider-mapping.ts b/packages/kilo-vscode/src/legacy-migration/provider-mapping.ts index 21bc0fd0a62..02c67a2357b 100644 --- a/packages/kilo-vscode/src/legacy-migration/provider-mapping.ts +++ b/packages/kilo-vscode/src/legacy-migration/provider-mapping.ts @@ -302,11 +302,6 @@ export const UNSUPPORTED_PROVIDERS = new Set([ "virtual-quota-fallback", "glama", "roo", - "nano-gpt", - "poe", - "aihubmix", - "zenmux", - "apertis", ]) /** Built-in default mode slugs that should not be migrated */ From b9fd360d925783b8124392dc0dc8d6e94183455e Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Mon, 23 Mar 2026 12:09:45 +0100 Subject: [PATCH 03/24] fix(vscode): remove beta label from welcome screen Remove the beta badge from the migration wizard's "What's New" screen, along with the associated CSS and i18n keys across all 17 locales. Closes #7182 --- .../src/components/migration/MigrationWizard.tsx | 5 +---- .../src/components/migration/migration.css | 12 ------------ packages/kilo-vscode/webview-ui/src/i18n/ar.ts | 1 - packages/kilo-vscode/webview-ui/src/i18n/br.ts | 1 - packages/kilo-vscode/webview-ui/src/i18n/bs.ts | 1 - packages/kilo-vscode/webview-ui/src/i18n/da.ts | 1 - packages/kilo-vscode/webview-ui/src/i18n/de.ts | 1 - packages/kilo-vscode/webview-ui/src/i18n/en.ts | 1 - packages/kilo-vscode/webview-ui/src/i18n/es.ts | 1 - packages/kilo-vscode/webview-ui/src/i18n/fr.ts | 1 - packages/kilo-vscode/webview-ui/src/i18n/ja.ts | 1 - packages/kilo-vscode/webview-ui/src/i18n/ko.ts | 1 - packages/kilo-vscode/webview-ui/src/i18n/nl.ts | 1 - packages/kilo-vscode/webview-ui/src/i18n/no.ts | 1 - packages/kilo-vscode/webview-ui/src/i18n/pl.ts | 1 - packages/kilo-vscode/webview-ui/src/i18n/ru.ts | 1 - packages/kilo-vscode/webview-ui/src/i18n/th.ts | 1 - packages/kilo-vscode/webview-ui/src/i18n/zh.ts | 1 - packages/kilo-vscode/webview-ui/src/i18n/zht.ts | 1 - 19 files changed, 1 insertion(+), 33 deletions(-) diff --git a/packages/kilo-vscode/webview-ui/src/components/migration/MigrationWizard.tsx b/packages/kilo-vscode/webview-ui/src/components/migration/MigrationWizard.tsx index 87a27fea7fb..1358048b543 100644 --- a/packages/kilo-vscode/webview-ui/src/components/migration/MigrationWizard.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/migration/MigrationWizard.tsx @@ -477,10 +477,7 @@ const MigrationWizard: Component = (props) => {
-

- {language.t("migration.whatsNew.title")}{" "} - {language.t("migration.whatsNew.badge")} -

+

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

{language.t("migration.whatsNew.subtitle")}

diff --git a/packages/kilo-vscode/webview-ui/src/components/migration/migration.css b/packages/kilo-vscode/webview-ui/src/components/migration/migration.css index 5a18f5f1477..e4440e06796 100644 --- a/packages/kilo-vscode/webview-ui/src/components/migration/migration.css +++ b/packages/kilo-vscode/webview-ui/src/components/migration/migration.css @@ -67,18 +67,6 @@ width: 100%; } -.migration-wizard__badge { - font-size: 11px; - font-weight: 600; - letter-spacing: 0.5px; - padding: 3px 9px; - border-radius: 6px; - background: color-mix(in srgb, var(--vscode-button-background) 15%, transparent); - color: var(--vscode-button-background); - vertical-align: middle; - text-transform: uppercase; -} - .migration-wizard__header p { font-size: 13px; color: var(--vscode-descriptionForeground); diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts index 243bce11b44..bd748c59563 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts @@ -1127,7 +1127,6 @@ export const dict = { // Screen 1 — What's New "migration.whatsNew.title": "ما الجديد في Kilo Code", - "migration.whatsNew.badge": "Beta", "migration.whatsNew.subtitle": "لقد أعدنا بناء الإضافة على أساس أسرع وأكثر كفاءة.", "migration.whatsNew.features.performance.title": "أداء أسرع للوكيل", "migration.whatsNew.features.performance.detail": diff --git a/packages/kilo-vscode/webview-ui/src/i18n/br.ts b/packages/kilo-vscode/webview-ui/src/i18n/br.ts index f96f8903724..b45d6bda539 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/br.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/br.ts @@ -1150,7 +1150,6 @@ export const dict = { // Screen 1 — What's New "migration.whatsNew.title": "O Que Há de Novo no Kilo Code", - "migration.whatsNew.badge": "Beta", "migration.whatsNew.subtitle": "Reconstruímos a extensão sobre uma base mais rápida e eficiente.", "migration.whatsNew.features.performance.title": "Desempenho de Agente Mais Rápido", "migration.whatsNew.features.performance.detail": diff --git a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts index 8b42dea7a48..3b890673197 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts @@ -1149,7 +1149,6 @@ export const dict = { // Screen 1 — What's New "migration.whatsNew.title": "Šta je novo u Kilo Code", - "migration.whatsNew.badge": "Beta", "migration.whatsNew.subtitle": "Ponovo smo izgradili ekstenziju na bržem i efikasnijem temelju.", "migration.whatsNew.features.performance.title": "Brže performanse agenta", "migration.whatsNew.features.performance.detail": diff --git a/packages/kilo-vscode/webview-ui/src/i18n/da.ts b/packages/kilo-vscode/webview-ui/src/i18n/da.ts index 411a5b69802..1a97d97c7fa 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/da.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/da.ts @@ -1141,7 +1141,6 @@ export const dict = { // Screen 1 — What's New "migration.whatsNew.title": "Nyheder i Kilo Code", - "migration.whatsNew.badge": "Beta", "migration.whatsNew.subtitle": "Vi har genopbygget udvidelsen på et hurtigere og mere effektivt fundament.", "migration.whatsNew.features.performance.title": "Hurtigere agentydelse", "migration.whatsNew.features.performance.detail": diff --git a/packages/kilo-vscode/webview-ui/src/i18n/de.ts b/packages/kilo-vscode/webview-ui/src/i18n/de.ts index 4cc653db9b5..fe55ba18fd0 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/de.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/de.ts @@ -1162,7 +1162,6 @@ export const dict = { // Screen 1 — What's New "migration.whatsNew.title": "Neuigkeiten in Kilo Code", - "migration.whatsNew.badge": "Beta", "migration.whatsNew.subtitle": "Wir haben die Erweiterung auf einer schnelleren, effizienteren Grundlage neu aufgebaut.", "migration.whatsNew.features.performance.title": "Schnellere Agentenleistung", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/en.ts b/packages/kilo-vscode/webview-ui/src/i18n/en.ts index 50f7404f527..f8f3ff5c907 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/en.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/en.ts @@ -1154,7 +1154,6 @@ export const dict = { // Screen 1 — What's New "migration.whatsNew.title": "What's New in Kilo Code", - "migration.whatsNew.badge": "Beta", "migration.whatsNew.subtitle": "We've rebuilt the extension on a faster, more efficient foundation.", "migration.whatsNew.features.performance.title": "Faster Agent Performance", "migration.whatsNew.features.performance.detail": diff --git a/packages/kilo-vscode/webview-ui/src/i18n/es.ts b/packages/kilo-vscode/webview-ui/src/i18n/es.ts index 7e6f5e350ff..12835933b5a 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/es.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/es.ts @@ -1152,7 +1152,6 @@ export const dict = { // Screen 1 — What's New "migration.whatsNew.title": "Novedades en Kilo Code", - "migration.whatsNew.badge": "Beta", "migration.whatsNew.subtitle": "Hemos reconstruido la extensión sobre una base más rápida y eficiente.", "migration.whatsNew.features.performance.title": "Rendimiento de agente más rápido", "migration.whatsNew.features.performance.detail": diff --git a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts index dca7e206262..e2c33aaf51e 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts @@ -1164,7 +1164,6 @@ export const dict = { // Screen 1 — What's New "migration.whatsNew.title": "Nouveautés de Kilo Code", - "migration.whatsNew.badge": "Beta", "migration.whatsNew.subtitle": "Nous avons reconstruit l'extension sur une base plus rapide et plus efficace.", "migration.whatsNew.features.performance.title": "Performance accélérée de l'agent", "migration.whatsNew.features.performance.detail": diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts index 3a24e4cbd49..fa1364c4c1d 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts @@ -1139,7 +1139,6 @@ export const dict = { // Screen 1 — What's New "migration.whatsNew.title": "Kilo Codeの新機能", - "migration.whatsNew.badge": "Beta", "migration.whatsNew.subtitle": "より高速で効率的な基盤上に拡張機能を再構築しました。", "migration.whatsNew.features.performance.title": "高速なエージェントパフォーマンス", "migration.whatsNew.features.performance.detail": diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts index b8517874f0b..a662c8d9a22 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts @@ -1130,7 +1130,6 @@ export const dict = { // Screen 1 — What's New "migration.whatsNew.title": "Kilo Code의 새로운 기능", - "migration.whatsNew.badge": "Beta", "migration.whatsNew.subtitle": "더 빠르고 효율적인 기반 위에 확장 프로그램을 재구축했습니다.", "migration.whatsNew.features.performance.title": "더 빠른 에이전트 성능", "migration.whatsNew.features.performance.detail": diff --git a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts index 73605307b10..a214ee18010 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts @@ -1170,7 +1170,6 @@ export const dict = { // Screen 1 — What's New "migration.whatsNew.title": "Wat is er Nieuw in Kilo Code", - "migration.whatsNew.badge": "Bèta", "migration.whatsNew.subtitle": "We hebben de extensie opnieuw opgebouwd op een snellere, efficiëntere basis.", "migration.whatsNew.features.performance.title": "Snellere Agent Prestaties", "migration.whatsNew.features.performance.detail": diff --git a/packages/kilo-vscode/webview-ui/src/i18n/no.ts b/packages/kilo-vscode/webview-ui/src/i18n/no.ts index aa4bbd50ed2..d359eca1d64 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/no.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/no.ts @@ -1142,7 +1142,6 @@ export const dict = { // Screen 1 — What's New "migration.whatsNew.title": "Hva er nytt i Kilo Code", - "migration.whatsNew.badge": "Beta", "migration.whatsNew.subtitle": "Vi har bygget utvidelsen på nytt med et raskere og mer effektivt grunnlag.", "migration.whatsNew.features.performance.title": "Raskere agentytelse", "migration.whatsNew.features.performance.detail": diff --git a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts index c44109ed9f3..3b7ae37a87b 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts @@ -1147,7 +1147,6 @@ export const dict = { // Screen 1 — What's New "migration.whatsNew.title": "Co nowego w Kilo Code", - "migration.whatsNew.badge": "Beta", "migration.whatsNew.subtitle": "Przebudowaliśmy rozszerzenie na szybszym i wydajniejszym fundamencie.", "migration.whatsNew.features.performance.title": "Szybsza wydajność agenta", "migration.whatsNew.features.performance.detail": diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts index 854fdf704eb..7aae962324d 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts @@ -1146,7 +1146,6 @@ export const dict = { // Screen 1 — What's New "migration.whatsNew.title": "Что нового в Kilo Code", - "migration.whatsNew.badge": "Beta", "migration.whatsNew.subtitle": "Мы перестроили расширение на более быстрой и эффективной основе.", "migration.whatsNew.features.performance.title": "Более быстрая работа агента", "migration.whatsNew.features.performance.detail": diff --git a/packages/kilo-vscode/webview-ui/src/i18n/th.ts b/packages/kilo-vscode/webview-ui/src/i18n/th.ts index 4365eaffe02..a0ed2c579c4 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/th.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/th.ts @@ -1126,7 +1126,6 @@ export const dict = { // Screen 1 — What's New "migration.whatsNew.title": "มีอะไรใหม่ใน Kilo Code", - "migration.whatsNew.badge": "Beta", "migration.whatsNew.subtitle": "เราได้สร้างส่วนขยายใหม่บนรากฐานที่เร็วและมีประสิทธิภาพมากขึ้น", "migration.whatsNew.features.performance.title": "ประสิทธิภาพเอเจนต์ที่เร็วขึ้น", "migration.whatsNew.features.performance.detail": diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts index 9a1ec2d5b38..d8b0a452ba5 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts @@ -1111,7 +1111,6 @@ export const dict = { // Screen 1 — What's New "migration.whatsNew.title": "Kilo Code 新功能", - "migration.whatsNew.badge": "Beta", "migration.whatsNew.subtitle": "我们在更快、更高效的基础上重新构建了扩展。", "migration.whatsNew.features.performance.title": "更快的智能体性能", "migration.whatsNew.features.performance.detail": diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts index 2cb4d97de5f..124a0a59670 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts @@ -1112,7 +1112,6 @@ export const dict = { // Screen 1 — What's New "migration.whatsNew.title": "Kilo Code 新功能", - "migration.whatsNew.badge": "Beta", "migration.whatsNew.subtitle": "我們在更快、更高效的基礎上重新建構了擴充功能。", "migration.whatsNew.features.performance.title": "更快的 Agent 效能", "migration.whatsNew.features.performance.detail": From 1a7b6f9fbcea0409ba20cafd940081234de27829 Mon Sep 17 00:00:00 2001 From: theQuert Date: Tue, 24 Mar 2026 00:23:20 +0800 Subject: [PATCH 04/24] feat: register Apertis as CLI provider with dynamic model fetching Add Apertis provider to the CLI backend so the migration mapping (id: "apertis") has a matching provider to consume the stored API key. - Inject apertis in ModelsDev.get() using @ai-sdk/openai-compatible - Add model fetching from api.apertis.ai/v1/models (OpenAI format) - Add auth resolution: Config > Auth store > APERTIS_API_KEY env var --- packages/opencode/src/provider/model-cache.ts | 90 +++++++++++++++++++ packages/opencode/src/provider/models.ts | 22 +++++ 2 files changed, 112 insertions(+) diff --git a/packages/opencode/src/provider/model-cache.ts b/packages/opencode/src/provider/model-cache.ts index 1d1a2d4e129..d902a40e881 100644 --- a/packages/opencode/src/provider/model-cache.ts +++ b/packages/opencode/src/provider/model-cache.ts @@ -164,11 +164,69 @@ export namespace ModelCache { return fetchKiloModels(options) } + // kilocode_change start + if (providerID === "apertis") { + return fetchApertisModels(options) + } + // kilocode_change end + // Other providers not implemented yet log.debug("provider not implemented", { providerID }) return {} } + // kilocode_change start + const APERTIS_BASE_URL = "https://api.apertis.ai/v1" + + async function fetchApertisModels(options: any): Promise> { + const baseURL = options.baseURL ?? APERTIS_BASE_URL + const apiKey = options.apiKey + + if (!apiKey) { + log.debug("no API key for apertis, skipping model fetch") + return {} + } + + const url = `${baseURL.replace(/\/+$/, "")}/models` + const response = await fetch(url, { + headers: { + Authorization: `Bearer ${apiKey}`, + }, + signal: AbortSignal.timeout(10_000), + }) + + if (!response.ok) { + log.error("apertis model fetch failed", { status: response.status }) + return {} + } + + const json = (await response.json()) as { data?: Array<{ id: string; owned_by?: string }> } + const models: Record = {} + + for (const model of json.data ?? []) { + models[model.id] = { + id: model.id, + name: model.id, + family: model.owned_by ?? "", + release_date: "", + attachment: false, + reasoning: false, + temperature: true, + tool_call: true, + cost: { input: 0, output: 0 }, + limit: { context: 128000, output: 4096 }, + options: {}, + modalities: { + input: ["text"], + output: ["text"], + }, + } + } + + return models + } + // kilocode_change end + /** * Get authentication options from multiple sources * Priority: Config > Auth > Env @@ -223,6 +281,38 @@ export namespace ModelCache { }) } + // kilocode_change start + if (providerID === "apertis") { + const config = await Config.get() + const providerConfig = config.provider?.[providerID] + if (providerConfig?.options?.apiKey) { + options.apiKey = providerConfig.options.apiKey + } + if (providerConfig?.options?.baseURL) { + options.baseURL = providerConfig.options.baseURL + } + + const auth = await Auth.get(providerID) + if (auth && auth.type === "api") { + options.apiKey = auth.key + } + + const env = Env.all() + if (env.APERTIS_API_KEY) { + options.apiKey = env.APERTIS_API_KEY + } + if (env.APERTIS_BASE_URL) { + options.baseURL = env.APERTIS_BASE_URL + } + + log.debug("apertis auth options resolved", { + providerID, + hasKey: !!options.apiKey, + hasBaseURL: !!options.baseURL, + }) + } + // kilocode_change end + return options } } diff --git a/packages/opencode/src/provider/models.ts b/packages/opencode/src/provider/models.ts index 2751547c675..3044d97f853 100644 --- a/packages/opencode/src/provider/models.ts +++ b/packages/opencode/src/provider/models.ts @@ -168,6 +168,28 @@ export namespace ModelsDev { } } + // Inject Apertis provider with dynamic model fetching + if (!providers["apertis"]) { + const apertisConfigObj = await Config.get() + const apertisConfig = apertisConfigObj.provider?.apertis?.options + const apertisBaseURL = apertisConfig?.baseURL ?? "https://api.apertis.ai/v1" + const apertisFetchOptions = { + ...(apertisConfig?.baseURL ? { baseURL: apertisConfig.baseURL } : {}), + } + const apertisModels = await ModelCache.fetch("apertis", apertisFetchOptions).catch(() => ({})) + providers["apertis"] = { + id: "apertis", + name: "Apertis", + env: ["APERTIS_API_KEY"], + api: apertisBaseURL, + npm: "@ai-sdk/openai-compatible", + models: apertisModels, + } + if (Object.keys(apertisModels).length === 0) { + ModelCache.refresh("apertis", apertisFetchOptions).catch(() => {}) + } + } + return providers // kilocode_change end } From 8304cf44dc082393f962ff30a5aa82fcb492584a Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Tue, 24 Mar 2026 05:29:32 -0400 Subject: [PATCH 05/24] docs(kilo-docs): add platform tabs to MCP and shell integration pages Add VSCode (Pre-release) and CLI tabs to 3 automate pages: - mcp/using-in-kilo-code.md: Tabbed config tables, CLI commands (including logout and debug), transport types, troubleshooting - extending/shell-integration.md: Platform-specific shell integration - automate/index.md: Fix stale link to deleted using-in-cli page MCP timeout correctly shown as 30000ms (verified against mcp/index.ts:29 DEFAULT_TIMEOUT = 30_000). Part of the docs platform tabs effort (PR 7 of 8). Depends on #7497 for infrastructure. --- packages/kilo-docs/lib/nav/automate.ts | 5 +- .../automate/extending/shell-integration.md | 77 +++++ packages/kilo-docs/pages/automate/index.md | 2 +- .../pages/automate/mcp/using-in-kilo-code.md | 319 +++++++++++++++--- 4 files changed, 362 insertions(+), 41 deletions(-) diff --git a/packages/kilo-docs/lib/nav/automate.ts b/packages/kilo-docs/lib/nav/automate.ts index e8ae1c02a8d..d4d9bb487e8 100644 --- a/packages/kilo-docs/lib/nav/automate.ts +++ b/packages/kilo-docs/lib/nav/automate.ts @@ -29,6 +29,7 @@ export const AutomateNav: NavSection[] = [ { href: "/automate/extending/auto-launch", children: "Auto-launch Configuration", + platform: "legacy", }, { href: "/automate/mcp/overview", @@ -53,8 +54,8 @@ export const AutomateNav: NavSection[] = [ { title: "Tools", links: [ - { href: "/automate/how-tools-work", children: "How Tools Work" }, - { href: "/automate/tools", children: "Tools Details" }, + { href: "/automate/how-tools-work", children: "How Tools Work", platform: "legacy" }, + { href: "/automate/tools", children: "Tools Details", platform: "legacy" }, ], }, ] diff --git a/packages/kilo-docs/pages/automate/extending/shell-integration.md b/packages/kilo-docs/pages/automate/extending/shell-integration.md index 5c7a88187ac..c88399a1f61 100644 --- a/packages/kilo-docs/pages/automate/extending/shell-integration.md +++ b/packages/kilo-docs/pages/automate/extending/shell-integration.md @@ -7,6 +7,9 @@ description: "Integrate Kilo Code with your shell environment" Terminal Shell Integration is a key feature that enables Kilo Code to execute commands in your terminal and intelligently process their output. This bidirectional communication between the AI and your development environment unlocks powerful automation capabilities. +{% tabs %} +{% tab label="VSCode (Legacy)" %} + ## What is Shell Integration? Shell integration is automatically enabled in Kilo Code and connects directly to your terminal's command execution lifecycle without requiring any setup from you. This built-in feature allows Kilo Code to: @@ -340,6 +343,80 @@ The [VS Code Terminal Integration Test Extension](https://github.com/KJ7LNW/vsce - Note your environment (OS, VS Code version, shell, and any shell prompt customization) - Open an issue with these details to help improve shell integration +{% /tab %} +{% tab label="VSCode & CLI" %} + +## How Shell Execution Works + +The new CLI and extension take a fundamentally different approach to shell execution. Instead of relying on VS Code's terminal shell integration, the CLI spawns and manages shell processes directly using the `bash` tool. + +This means: + +- **No VS Code shell integration required** — the CLI handles shell execution independently +- **No shell integration setup or troubleshooting** — it works out of the box +- **Consistent behavior** across environments — the same shell execution logic runs whether you use the CLI directly or through the VS Code extension + +## The `bash` Tool + +The `bash` tool is the primary way the agent executes shell commands. It spawns a persistent shell session and runs commands within it. + +### Key Features + +- **Working directory control**: Use the `workdir` parameter to run commands in a specific directory, instead of `cd && ` patterns +- **Configurable timeout**: Set a per-command timeout in milliseconds (defaults to 2 minutes) +- **Real-time output streaming**: Command output is streamed back as it's produced +- **Process tree management**: The tool manages the full process tree, ensuring child processes are properly cleaned up + +### Security Analysis + +Commands are parsed using **Tree-sitter** before execution, enabling: + +- Path resolution to detect file access patterns +- External directory detection to flag commands that reach outside the project +- Structured analysis of command intent for safer auto-approval decisions + +### Shell Detection + +The CLI automatically detects the appropriate shell for your platform using `Shell.acceptable()`. This selects a compatible shell (bash, zsh, etc.) without requiring manual configuration. + +## Agent Manager Terminals (VS Code Extension) + +When using the Kilo Code VS Code extension with the Agent Manager, each agent session gets its own dedicated VS Code terminal. + +### Per-Session Terminals + +- Each session creates a terminal named **`Agent: {branch}`**, where `{branch}` is the git branch or worktree the session is working in +- The terminal's working directory is automatically set to the session's worktree directory +- Terminals are standard VS Code integrated terminals — you can interact with them directly + +### Keyboard Shortcuts + +| Shortcut | Action | +| --------------------------- | --------------------------------------- | +| Cmd+/ | Focus the session's terminal | +| Cmd+. | Return focus to the Agent Manager panel | + +### Terminal Context Menu Actions + +Right-click in an Agent Manager terminal to access these actions: + +- **Add Terminal Content to Context** — sends the terminal's visible output to the agent as context +- **Fix This Command** — asks the agent to diagnose and fix the last failed command +- **Explain This Command** — asks the agent to explain what a command does + +## Troubleshooting + +Shell execution in the new CLI is significantly simpler than the **VSCode** version's terminal integration. Most issues are resolved by ensuring: + +1. **A supported shell is installed**: bash or zsh on macOS/Linux, PowerShell on Windows +2. **The shell is on your PATH**: The CLI needs to find the shell binary +3. **File permissions are correct**: The CLI needs execute permission on the shell binary + +If commands fail to execute, check the CLI's log output for error details. The CLI logs the shell it detected and any errors during command execution. + +{% /tab %} +{% /tabs %} + ## Support If you've followed these steps and are still experiencing problems, please: diff --git a/packages/kilo-docs/pages/automate/index.md b/packages/kilo-docs/pages/automate/index.md index 453f0163c50..9616faf4a7e 100644 --- a/packages/kilo-docs/pages/automate/index.md +++ b/packages/kilo-docs/pages/automate/index.md @@ -36,7 +36,7 @@ Connect Kilo Code to external tools and services: - [**Using MCP in Kilo Code**](/docs/automate/mcp/using-in-kilo-code) — Configuration guide - [**STDIO & SSE Transports**](/docs/automate/mcp/server-transports) — Local and remote server options - [**MCP vs API**](/docs/automate/mcp/mcp-vs-api) — When to use MCP -- [**Using MCP in CLI**](/docs/automate/mcp/using-in-cli) — CLI-specific MCP setup +- [**Using MCP in Kilo Code**](/docs/automate/mcp/using-in-kilo-code) — Configure MCP servers ## Integrations diff --git a/packages/kilo-docs/pages/automate/mcp/using-in-kilo-code.md b/packages/kilo-docs/pages/automate/mcp/using-in-kilo-code.md index 43dd907c755..f0ef4d68a98 100644 --- a/packages/kilo-docs/pages/automate/mcp/using-in-kilo-code.md +++ b/packages/kilo-docs/pages/automate/mcp/using-in-kilo-code.md @@ -7,31 +7,46 @@ description: "How to use MCP servers in Kilo Code" Model Context Protocol (MCP) extends Kilo Code's capabilities by connecting to external tools and services. This guide covers everything you need to know about using MCP with Kilo Code. -{% youtube url="https://youtu.be/6O9RQoQRX8A" caption="Demostrating MCP installation in Kilo Code" /%} +{% youtube url="https://youtu.be/6O9RQoQRX8A" caption="Demonstrating MCP installation in Kilo Code" /%} ## Configuring MCP Servers -MCP server configurations can be managed at two levels: +MCP server configurations can be managed at two levels: **global** (applies across all workspaces) and **project-level** (specific to a single project). Project-level configuration takes precedence over global settings. -1. **Global Configuration**: Stored in the `mcp_settings.json` file, accessible via VS Code settings (see below). These settings apply across all your workspaces unless overridden by a project-level configuration. -2. **Project-level Configuration**: Defined in a `.kilocode/mcp.json` file within your project's root directory. This allows you to set up project-specific servers and share configurations with your team by committing the file to version control. Kilo Code automatically detects and loads this file if it exists. +{% tabs %} +{% tab label="VSCode (Legacy)" %} -**Precedence**: If a server name exists in both global and project configurations, the **project-level configuration takes precedence**. +| Scope | Path | Description | +| ----------- | -------------------- | --------------------------------------------------------------- | +| **Global** | `mcp_settings.json` | Accessible via VS Code settings. Applies across all workspaces. | +| **Project** | `.kilocode/mcp.json` | In your project root. Auto-detected by Kilo Code. | -### Editing MCP Settings Files +Project-level configs can be committed to version control to share with your team. -You can edit both global and project-level MCP configuration files directly from the Kilo Code settings. +{% /tab %} +{% tab label="VSCode" %} -1. Click the {% codicon name="gear" /%} icon in the top navigation of the Kilo Code pane to open `Settings`. -2. Click the `Agent Behaviour` tab on the left side -3. Select the `MCP Servers` sub-tab -4. Click the appropriate button: - - **`Edit Global MCP`**: Opens the global `mcp_settings.json` file. - - **`Edit Project MCP`**: Opens the project-specific `.kilocode/mcp.json` file. If this file doesn't exist, Kilo Code will create it for you. +In the VS Code extension, open **Settings → MCP** to add and manage MCP servers through the UI. Under the hood the extension reads the same config files as the CLI — see the **CLI** tab for file paths and format. -{% image src="/docs/img/using-mcp-in-kilo-code/mcp-installed-config.png" alt="Edit Global MCP and Edit Project MCP buttons" width="600" caption="Edit Global MCP and Edit Project MCP buttons" /%} +{% /tab %} +{% tab label="CLI" %} -Both files use a JSON format with a `mcpServers` object containing named server configurations: +The CLI accepts several config filenames. The recommended file is `kilo.json`: + +| Scope | Recommended Path | Also supported | +| ----------- | ------------------------------------ | -------------------------------------------------------------- | +| **Global** | `~/.config/kilo/kilo.json` | `kilo.jsonc`, `opencode.json`, `opencode.jsonc`, `config.json` | +| **Project** | `./kilo.json` or `./.kilo/kilo.json` | `kilo.jsonc`, `opencode.jsonc`, `opencode.json` | + +{% /tab %} +{% /tabs %} + +## Configuration Format + +{% tabs %} +{% tab label="VSCode (Legacy)" %} + +Both global and project-level files use a JSON format with a `mcpServers` object containing named server configurations: ```json { @@ -51,6 +66,33 @@ Both files use a JSON format with a `mcpServers` object containing named server _Example of MCP Server config in Kilo Code (STDIO Transport)_ +{% /tab %} +{% tab label="VSCode" %} + +In the VS Code extension, open **Settings → MCP** and click **Add Server** to configure a new server through the UI. You can also edit the config files directly — see the **CLI** tab for the JSON format. + +{% /tab %} +{% tab label="CLI" %} + +Add MCP servers under the `mcp` key in your config file. Each server has a unique name that you can reference in prompts. + +```json +{ + "mcp": { + "my-server": { + "type": "local", + "command": ["npx", "-y", "my-mcp-command"], + "enabled": true + } + } +} +``` + +You can disable a server by setting `enabled` to `false` without removing it from your config. + +{% /tab %} +{% /tabs %} + ### Understanding Transport Types MCP supports three transport types for server communication: @@ -69,6 +111,9 @@ For more in-depth information about how STDIO transport works, see [STDIO Transp STDIO configuration example: +{% tabs %} +{% tab label="VSCode (Legacy)" %} + ```json { "mcpServers": { @@ -85,6 +130,42 @@ STDIO configuration example: } ``` +{% /tab %} +{% tab label="VSCode" %} + +In the VS Code extension, open **Settings → MCP**, click **Add Server**, and choose **Local (stdio)**. Fill in the command, arguments, and optional environment variables through the UI. You can also edit the config files directly — see the **CLI** tab for the JSON format. + +{% /tab %} +{% tab label="CLI" %} + +```json +{ + "mcp": { + "my-local-server": { + "type": "local", + "command": ["npx", "-y", "my-mcp-command"], + "enabled": true, + "environment": { + "API_KEY": "your_api_key" + } + } + } +} +``` + +#### Local Server Options + +| Option | Type | Required | Description | +| ------------- | ------- | -------- | --------------------------------------------------------------------- | +| `type` | String | Yes | Must be `"local"`. | +| `command` | Array | Yes | Command and arguments to run the MCP server. | +| `environment` | Object | No | Environment variables to set when running the server. | +| `enabled` | Boolean | No | Enable or disable the MCP server on startup. | +| `timeout` | Number | No | Timeout in ms for fetching tools from the MCP server. Default: 30000. | + +{% /tab %} +{% /tabs %} + #### Streamable HTTP Transport Used for remote servers accessed over HTTP/HTTPS: @@ -94,7 +175,8 @@ Used for remote servers accessed over HTTP/HTTPS: - Requires network access - Allows centralized deployment and management -Streamable HTTP transport configuration example: +{% tabs %} +{% tab label="VSCode (Legacy)" %} ```json { @@ -112,7 +194,43 @@ Streamable HTTP transport configuration example: } ``` -#### SSE Transport +{% /tab %} +{% tab label="VSCode" %} + +In the VS Code extension, open **Settings → MCP**, click **Add Server**, and choose **Remote (HTTP)**. Enter the server URL and optional headers through the UI. You can also edit the config files directly — see the **CLI** tab for the JSON format. + +{% /tab %} +{% tab label="CLI" %} + +```json +{ + "mcp": { + "my-remote-server": { + "type": "remote", + "url": "https://my-mcp-server.com/mcp", + "enabled": true, + "headers": { + "Authorization": "Bearer MY_API_KEY" + } + } + } +} +``` + +#### Remote Server Options + +| Option | Type | Required | Description | +| --------- | ------- | -------- | --------------------------------------------------------------------- | +| `type` | String | Yes | Must be `"remote"`. | +| `url` | String | Yes | URL of the remote MCP server. | +| `enabled` | Boolean | No | Enable or disable the MCP server on startup. | +| `headers` | Object | No | HTTP headers to send with requests. | +| `timeout` | Number | No | Timeout in ms for fetching tools from the MCP server. Default: 30000. | + +{% /tab %} +{% /tabs %} + +### SSE Transport ⚠️ DEPRECATED: The SSE Transport has been deprecated as of MCP specification version 2025-03-26. Please use the HTTP Stream Transport instead, which implements the new Streamable HTTP transport specification. @@ -143,6 +261,24 @@ SSE configuration example: } ``` +## Managing MCP Servers + +{% tabs %} +{% tab label="VSCode (Legacy)" %} + +### Editing MCP Settings Files + +You can edit both global and project-level MCP configuration files directly from the Kilo Code settings. + +1. Click the {% codicon name="gear" /%} icon in the top navigation of the Kilo Code pane to open `Settings`. +2. Click the `Agent Behaviour` tab on the left side +3. Select the `MCP Servers` sub-tab +4. Click the appropriate button: + - **`Edit Global MCP`**: Opens the global `mcp_settings.json` file. + - **`Edit Project MCP`**: Opens the project-specific `.kilocode/mcp.json` file. If this file doesn't exist, Kilo Code will create it for you. + +{% image src="/docs/img/using-mcp-in-kilo-code/mcp-installed-config.png" alt="Edit Global MCP and Edit Project MCP buttons" width="600" caption="Edit Global MCP and Edit Project MCP buttons" /%} + ### Deleting a Server 1. Press the {% codicon name="trash" /%} next to the MCP server you would like to delete @@ -178,41 +314,58 @@ MCP tool auto-approval works on a per-tool basis and is disabled by default. To When enabled, Kilo Code will automatically approve this specific tool without prompting. Note that the global "Use MCP servers" setting takes precedence - if it's disabled, no MCP tools will be auto-approved. -## Finding and Installing MCP Servers +{% /tab %} +{% tab label="VSCode" %} -Kilo Code does not come with any pre-installed MCP servers. You'll need to find and install them separately. +In the VS Code extension, manage MCP servers from **Settings → MCP**: -- **Community Repositories:** Check for community-maintained lists of MCP servers on GitHub -- **Ask Kilo Code:** You can ask Kilo Code to help you find or even create MCP servers -- **Build Your Own:** Create custom MCP servers using the SDK to extend Kilo Code with your own tools +- **Add a server**: Click **Add Server** and fill in the details +- **Enable/disable**: Toggle a server on or off without removing its configuration +- **Delete**: Remove a server from the list -For full SDK documentation, visit the [MCP GitHub repository](https://github.com/modelcontextprotocol/). +The extension also supports the `{env:VARIABLE_NAME}` syntax in config files to reference environment variables (see the **CLI** tab for details). -## Using MCP Tools in Your Workflow +{% /tab %} +{% tab label="CLI" %} -After configuring an MCP server, Kilo Code will automatically detect available tools and resources. To use them: +### CLI Commands -1. Type your request in the Kilo Code chat interface -2. Kilo Code will identify when an MCP tool can help with your task -3. Approve the tool use when prompted (or use auto-approval) +| Command | Description | +| ----------------- | ------------------------------- | +| `kilo mcp list` | List all configured MCP servers | +| `kilo mcp add` | Add an MCP server | +| `kilo mcp auth` | Authenticate with an MCP server | +| `kilo mcp logout` | Log out from an MCP server | +| `kilo mcp debug` | Debug an MCP server connection | -Example: "Analyze the performance of my API" might use an MCP tool that tests API endpoints. +Inside the interactive TUI, use the `/mcps` slash command to toggle MCP servers on or off. -## Troubleshooting MCP Servers +### Environment Variables -Common issues and solutions: +Use `{env:VARIABLE_NAME}` syntax in config files to reference environment variables: -- **Server Not Responding:** Check if the server process is running and verify network connectivity -- **Permission Errors:** Ensure proper API keys and credentials are configured in your `mcp_settings.json` (for global settings) or `.kilocode/mcp.json` (for project settings). -- **Tool Not Available:** Confirm the server is properly implementing the tool and it's not disabled in settings -- **Slow Performance:** Try adjusting the network timeout value for the specific MCP server +```json +{ + "mcp": { + "my-server": { + "type": "remote", + "url": "https://mcp.example.com/mcp", + "headers": { + "Authorization": "Bearer {env:MY_API_KEY}" + } + } + } +} +``` -{% callout type="tip" %} -**Reduce system prompt size:** If you're not using MCP, turn it off in Settings > Agent Behaviour > MCP Servers to significantly cut down the size of the system prompt and improve performance. -{% /callout %} +{% /tab %} +{% /tabs %} ## Platform-Specific MCP Configuration Examples +{% tabs %} +{% tab label="VSCode (Legacy)" %} + ### Windows Configuration Example When setting up MCP servers on Windows, you'll need to use the Windows Command Prompt (`cmd`) to execute commands. Here's an example of configuring a Puppeteer MCP server on Windows: @@ -253,3 +406,93 @@ For macOS or Linux, you would use a different configuration: {% /callout %} The same approach can be used for other MCP servers on Windows, adjusting the package name as needed for different server types. + +{% /tab %} +{% tab label="VSCode" %} + +In the VS Code extension, use **Settings → MCP → Add Server** to add any of the examples below through the UI. You can also edit the config files directly — see the **CLI** tab for the JSON format. + +{% /tab %} +{% tab label="CLI" %} + +### Figma Desktop + +Connect to the Figma Desktop app's MCP server: + +```json +{ + "mcp": { + "Figma Desktop": { + "type": "remote", + "url": "http://127.0.0.1:3845/mcp" + } + } +} +``` + +### Context7 + +Add the [Context7](https://github.com/upstash/context7) MCP server for documentation search: + +```json +{ + "mcp": { + "context7": { + "type": "remote", + "url": "https://mcp.context7.com/mcp" + } + } +} +``` + +### Everything Test Server + +Add the test MCP server for development: + +```json +{ + "mcp": { + "mcp_everything": { + "type": "local", + "command": ["npx", "-y", "@modelcontextprotocol/server-everything"] + } + } +} +``` + +{% /tab %} +{% /tabs %} + +## Finding and Installing MCP Servers + +Kilo Code does not come with any pre-installed MCP servers. You'll need to find and install them separately. + +- **Kilo Marketplace:** Browse community-contributed MCP server configurations and agent skills in the [Kilo Marketplace](https://github.com/Kilo-Org/kilo-marketplace). The marketplace includes ready-to-use configs for popular tools like Figma, Sentry, and more. +- **Community Repositories:** Check for community-maintained lists of MCP servers on GitHub +- **Ask Kilo Code:** You can ask Kilo Code to help you find or even create MCP servers +- **Build Your Own:** Create custom MCP servers using the SDK to extend Kilo Code with your own tools + +For full SDK documentation, visit the [MCP GitHub repository](https://github.com/modelcontextprotocol/). + +## Using MCP Tools in Your Workflow + +After configuring an MCP server, Kilo Code will automatically detect available tools and resources. To use them: + +1. Type your request in the Kilo Code chat interface +2. Kilo Code will identify when an MCP tool can help with your task +3. Approve the tool use when prompted (or use auto-approval) + +Example: "Analyze the performance of my API" might use an MCP tool that tests API endpoints. + +## Troubleshooting MCP Servers + +Common issues and solutions: + +- **Server Not Responding:** Check if the server process is running and verify network connectivity +- **Permission Errors:** Ensure proper API keys and credentials are configured in your `mcp_settings.json` (for global settings) or `.kilocode/mcp.json` (for project settings). +- **Tool Not Available:** Confirm the server is properly implementing the tool and it's not disabled in settings +- **Slow Performance:** Try adjusting the network timeout value for the specific MCP server + +{% callout type="tip" %} +**Reduce system prompt size:** If you're not using MCP, turn it off in Settings > Agent Behaviour > MCP Servers to significantly cut down the size of the system prompt and improve performance. +{% /callout %} From e9060468a1f1d11b06aa69e57645d3843c05edee Mon Sep 17 00:00:00 2001 From: Aarav Sharma Date: Sun, 29 Mar 2026 17:11:27 -0600 Subject: [PATCH 06/24] core: deprecate orchestrator agent with visual badge across UI Mark the orchestrator agent as deprecated so users see a warning badge in the mode switcher and agent settings, signaling they should migrate to other agent configurations for task delegation. --- packages/kilo-vscode/src/KiloProvider.ts | 1 + .../components/settings/AgentBehaviourTab.tsx | 14 ++++++++++++++ .../src/components/shared/ModeSwitcher.tsx | 19 ++++++++++++++++++- .../kilo-vscode/webview-ui/src/i18n/ar.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/br.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/bs.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/da.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/de.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/en.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/es.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/fr.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/ja.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/ko.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/nl.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/no.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/pl.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/ru.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/th.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/tr.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/zh.ts | 1 + .../kilo-vscode/webview-ui/src/i18n/zht.ts | 1 + .../webview-ui/src/types/messages.ts | 1 + packages/opencode/src/agent/agent.ts | 4 +++- .../cli/cmd/tui/component/dialog-agent.tsx | 3 ++- packages/sdk/js/src/v2/gen/types.gen.ts | 1 + packages/sdk/openapi.json | 3 +++ 26 files changed, 61 insertions(+), 3 deletions(-) diff --git a/packages/kilo-vscode/src/KiloProvider.ts b/packages/kilo-vscode/src/KiloProvider.ts index ba24906f0f9..9ce3ae749bf 100644 --- a/packages/kilo-vscode/src/KiloProvider.ts +++ b/packages/kilo-vscode/src/KiloProvider.ts @@ -1500,6 +1500,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper mode: a.mode, native: a.native, color: a.color, + deprecated: a.deprecated, })), defaultAgent, } diff --git a/packages/kilo-vscode/webview-ui/src/components/settings/AgentBehaviourTab.tsx b/packages/kilo-vscode/webview-ui/src/components/settings/AgentBehaviourTab.tsx index 9245f7bd014..ec039f1d37d 100644 --- a/packages/kilo-vscode/webview-ui/src/components/settings/AgentBehaviourTab.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/settings/AgentBehaviourTab.tsx @@ -342,6 +342,7 @@ const AgentBehaviourTab: Component = () => { const agentCfg = () => config().agent?.[name] ?? {} const disabled = () => agentCfg().disable ?? false const hidden = () => agentCfg().hidden ?? false + const deprecated = () => agent()?.deprecated ?? false return (
{ {language.t("settings.agentBehaviour.badge.disabled")} + + + {language.t("settings.agentBehaviour.badge.deprecated")} + +
= (props) => { const [open, setOpen] = createSignal(false) const [focused, setFocused] = createSignal(-1) + const language = useLanguage() let listRef: HTMLDivElement | undefined // Listen for slash command trigger @@ -132,7 +134,22 @@ export const ModeSwitcherBase: Component = (props) => { onClick={() => pick(agent.name)} onFocus={() => setFocused(i())} > - {formatAgentLabel(agent)} +
+ {formatAgentLabel(agent)} + + + {language.t("settings.agentBehaviour.badge.deprecated")} + + +
{agent.description} diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts index ac8b73e92e1..26a797b8ae7 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts @@ -1065,6 +1065,7 @@ export const dict = { "settings.agentBehaviour.disable.description": "تعطيل هذا الوكيل بالكامل — لن يظهر في أي مكان", "settings.agentBehaviour.badge.hidden": "مخفي", "settings.agentBehaviour.badge.disabled": "معطل", + "settings.agentBehaviour.badge.deprecated": "مُهمَل", "settings.agentBehaviour.discoveredSkills": "المهارات المكتشفة", "settings.agentBehaviour.noSkillsFound": "لم يتم العثور على مهارات. أضف مسارات مجلدات أو عناوين URL أدناه لإتاحة المهارات.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/br.ts b/packages/kilo-vscode/webview-ui/src/i18n/br.ts index b2edcbca372..5c221c581a8 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/br.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/br.ts @@ -1083,6 +1083,7 @@ export const dict = { "Desativar completamente este agente — ele não aparecerá em nenhum lugar", "settings.agentBehaviour.badge.hidden": "oculto", "settings.agentBehaviour.badge.disabled": "desativado", + "settings.agentBehaviour.badge.deprecated": "Descontinuado", "settings.agentBehaviour.discoveredSkills": "Habilidades descobertas", "settings.agentBehaviour.noSkillsFound": "Nenhuma habilidade encontrada. Adicione caminhos de pastas ou URLs abaixo para disponibilizar habilidades.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts index 2f989657a50..176a16e9255 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts @@ -1081,6 +1081,7 @@ export const dict = { "settings.agentBehaviour.disable.description": "Potpuno onemogući ovog agenta — neće se pojaviti nigdje", "settings.agentBehaviour.badge.hidden": "skriveno", "settings.agentBehaviour.badge.disabled": "onemogućeno", + "settings.agentBehaviour.badge.deprecated": "Zastarjelo", "settings.agentBehaviour.discoveredSkills": "Otkrivene vještine", "settings.agentBehaviour.noSkillsFound": "Nisu pronađene vještine. Dodajte putanje mapa ili URL-ove ispod kako biste učinili vještine dostupnim.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/da.ts b/packages/kilo-vscode/webview-ui/src/i18n/da.ts index d0cc455b133..a1b480586d9 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/da.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/da.ts @@ -1075,6 +1075,7 @@ export const dict = { "settings.agentBehaviour.disable.description": "Deaktiver denne agent fuldstændigt — den vises ingen steder", "settings.agentBehaviour.badge.hidden": "skjult", "settings.agentBehaviour.badge.disabled": "deaktiveret", + "settings.agentBehaviour.badge.deprecated": "Udfaset", "settings.agentBehaviour.discoveredSkills": "Opdagede skills", "settings.agentBehaviour.noSkillsFound": "Ingen skills fundet. Tilføj skill-mappestier eller URL'er nedenfor for at gøre skills tilgængelige.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/de.ts b/packages/kilo-vscode/webview-ui/src/i18n/de.ts index 8ff2588e346..db80f651478 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/de.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/de.ts @@ -1095,6 +1095,7 @@ export const dict = { "settings.agentBehaviour.disable.description": "Diesen Agent vollständig deaktivieren — er wird nirgends angezeigt", "settings.agentBehaviour.badge.hidden": "versteckt", "settings.agentBehaviour.badge.disabled": "deaktiviert", + "settings.agentBehaviour.badge.deprecated": "Veraltet", "settings.agentBehaviour.discoveredSkills": "Erkannte Skills", "settings.agentBehaviour.noSkillsFound": "Keine Skills gefunden. Fügen Sie unten Skill-Ordnerpfade oder URLs hinzu, um Skills verfügbar zu machen.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/en.ts b/packages/kilo-vscode/webview-ui/src/i18n/en.ts index 213bded0966..60bfc371722 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/en.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/en.ts @@ -1077,6 +1077,7 @@ export const dict = { "settings.agentBehaviour.disable.description": "Fully disable this agent — it will not appear anywhere", "settings.agentBehaviour.badge.hidden": "hidden", "settings.agentBehaviour.badge.disabled": "disabled", + "settings.agentBehaviour.badge.deprecated": "deprecated", "settings.agentBehaviour.discoveredSkills": "Discovered Skills", "settings.agentBehaviour.noSkillsFound": "No skills discovered. Add skill folder paths or URLs below to make skills available.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/es.ts b/packages/kilo-vscode/webview-ui/src/i18n/es.ts index 4302c5187b9..6d83e805e41 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/es.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/es.ts @@ -1086,6 +1086,7 @@ export const dict = { "settings.agentBehaviour.disable.description": "Desactivar completamente este agente — no aparecerá en ningún lugar", "settings.agentBehaviour.badge.hidden": "oculto", "settings.agentBehaviour.badge.disabled": "desactivado", + "settings.agentBehaviour.badge.deprecated": "Obsoleto", "settings.agentBehaviour.discoveredSkills": "Habilidades descubiertas", "settings.agentBehaviour.noSkillsFound": "No se encontraron habilidades. Agregue rutas de carpetas o URLs abajo para hacer disponibles las habilidades.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts index fb74537fbdb..c5f351ba1d6 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts @@ -1097,6 +1097,7 @@ export const dict = { "settings.agentBehaviour.disable.description": "Désactiver complètement cet agent — il n'apparaîtra nulle part", "settings.agentBehaviour.badge.hidden": "masqué", "settings.agentBehaviour.badge.disabled": "désactivé", + "settings.agentBehaviour.badge.deprecated": "Déprécié", "settings.agentBehaviour.discoveredSkills": "Compétences découvertes", "settings.agentBehaviour.noSkillsFound": "Aucune compétence découverte. Ajoutez des chemins de dossiers ou des URLs ci-dessous pour rendre les compétences disponibles.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts index a8e298ef97e..028d0364c30 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts @@ -1075,6 +1075,7 @@ export const dict = { "settings.agentBehaviour.disable.description": "このエージェントを完全に無効にする — どこにも表示されなくなります", "settings.agentBehaviour.badge.hidden": "非表示", "settings.agentBehaviour.badge.disabled": "無効", + "settings.agentBehaviour.badge.deprecated": "非推奨", "settings.agentBehaviour.discoveredSkills": "検出されたスキル", "settings.agentBehaviour.noSkillsFound": "スキルが見つかりません。スキルを利用可能にするには、以下にスキルフォルダパスまたはURLを追加してください。", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts index 31b562e318b..09c03950f3c 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts @@ -1072,6 +1072,7 @@ export const dict = { "settings.agentBehaviour.disable.description": "이 에이전트를 완전히 비활성화 — 어디에도 표시되지 않습니다", "settings.agentBehaviour.badge.hidden": "숨김", "settings.agentBehaviour.badge.disabled": "비활성화됨", + "settings.agentBehaviour.badge.deprecated": "비권장", "settings.agentBehaviour.discoveredSkills": "검색된 스킬", "settings.agentBehaviour.noSkillsFound": "스킬을 찾을 수 없습니다. 스킬을 사용하려면 아래에 스킬 폴더 경로 또는 URL을 추가하세요.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts index f7818d373f2..a4ae0ad6f45 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts @@ -1085,6 +1085,7 @@ export const dict = { "settings.agentBehaviour.disable.description": "Schakel deze agent volledig uit — deze verschijnt nergens", "settings.agentBehaviour.badge.hidden": "verborgen", "settings.agentBehaviour.badge.disabled": "uitgeschakeld", + "settings.agentBehaviour.badge.deprecated": "Verouderd", "settings.agentBehaviour.discoveredSkills": "Ontdekte Skills", "settings.agentBehaviour.noSkillsFound": "Geen skills ontdekt. Voeg hieronder skill mappaden of URL's toe om skills beschikbaar te maken.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/no.ts b/packages/kilo-vscode/webview-ui/src/i18n/no.ts index 485a1d0b668..c1152d9ba34 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/no.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/no.ts @@ -1078,6 +1078,7 @@ export const dict = { "settings.agentBehaviour.disable.description": "Deaktiver denne agenten fullstendig — den vises ikke noe sted", "settings.agentBehaviour.badge.hidden": "skjult", "settings.agentBehaviour.badge.disabled": "deaktivert", + "settings.agentBehaviour.badge.deprecated": "Utdatert", "settings.agentBehaviour.discoveredSkills": "Oppdagede ferdigheter", "settings.agentBehaviour.noSkillsFound": "Ingen ferdigheter funnet. Legg til ferdighetsmappestier eller URLer nedenfor for å gjøre ferdigheter tilgjengelige.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts index 5db2913b2cf..9eaf50713cf 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts @@ -1079,6 +1079,7 @@ export const dict = { "settings.agentBehaviour.disable.description": "Całkowicie wyłącz tego agenta — nie pojawi się nigdzie", "settings.agentBehaviour.badge.hidden": "ukryty", "settings.agentBehaviour.badge.disabled": "wyłączony", + "settings.agentBehaviour.badge.deprecated": "Przestarzały", "settings.agentBehaviour.discoveredSkills": "Wykryte umiejętności", "settings.agentBehaviour.noSkillsFound": "Nie znaleziono umiejętności. Dodaj ścieżki folderów lub adresy URL poniżej, aby udostępnić umiejętności.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts index c9b42fbe0a4..0a2ca396fd8 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts @@ -1081,6 +1081,7 @@ export const dict = { "settings.agentBehaviour.disable.description": "Полностью отключить этого агента — он не будет отображаться нигде", "settings.agentBehaviour.badge.hidden": "скрытый", "settings.agentBehaviour.badge.disabled": "отключён", + "settings.agentBehaviour.badge.deprecated": "Устаревший", "settings.agentBehaviour.discoveredSkills": "Обнаруженные навыки", "settings.agentBehaviour.noSkillsFound": "Навыки не обнаружены. Добавьте пути к папкам навыков или URL-адреса ниже, чтобы сделать навыки доступными.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/th.ts b/packages/kilo-vscode/webview-ui/src/i18n/th.ts index 7d812f4fb1a..2b1be15ed01 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/th.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/th.ts @@ -1067,6 +1067,7 @@ export const dict = { "settings.agentBehaviour.disable.description": "ปิดใช้งานเอเจนต์นี้อย่างสมบูรณ์ — จะไม่ปรากฏที่ใดเลย", "settings.agentBehaviour.badge.hidden": "ซ่อน", "settings.agentBehaviour.badge.disabled": "ปิดใช้งาน", + "settings.agentBehaviour.badge.deprecated": "เลิกใช้", "settings.agentBehaviour.discoveredSkills": "ทักษะที่ค้นพบ", "settings.agentBehaviour.noSkillsFound": "ไม่พบทักษะ เพิ่มเส้นทางโฟลเดอร์หรือ URL ด้านล่างเพื่อทำให้ทักษะพร้อมใช้งาน", "settings.agentBehaviour.availableModes": "โหมดกำหนดเองที่ใช้ได้", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts index 07ffb9711bd..041985a6d51 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts @@ -1082,6 +1082,7 @@ export const dict = { "settings.agentBehaviour.disable.description": "Bu ajanı tamamen devre dışı bırak — hiçbir yerde görünmeyecek", "settings.agentBehaviour.badge.hidden": "gizli", "settings.agentBehaviour.badge.disabled": "devre dışı", + "settings.agentBehaviour.badge.deprecated": "Kullanımdan kaldırılmış", "settings.agentBehaviour.discoveredSkills": "Keşfedilen Beceriler", "settings.agentBehaviour.noSkillsFound": "Keşfedilen beceri yok. Becerileri kullanılabilir kılmak için aşağıya beceri klasör yolları veya URL'ler ekleyin.", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts index ca2b27cb8ff..252e943497d 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts @@ -1057,6 +1057,7 @@ export const dict = { "settings.agentBehaviour.disable.description": "完全禁用此智能体 — 它将不会出现在任何地方", "settings.agentBehaviour.badge.hidden": "隐藏", "settings.agentBehaviour.badge.disabled": "已禁用", + "settings.agentBehaviour.badge.deprecated": "弃用", "settings.agentBehaviour.discoveredSkills": "已发现的技能", "settings.agentBehaviour.noSkillsFound": "未发现任何技能。请在下方添加技能文件夹路径或 URL 以使技能可用。", "settings.agentBehaviour.availableModes": "可用自定义模式", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts index 635328ba589..3a3eaf67e37 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts @@ -1059,6 +1059,7 @@ export const dict = { "settings.agentBehaviour.disable.description": "完全停用此 Agent — 它將不會出現在任何地方", "settings.agentBehaviour.badge.hidden": "隱藏", "settings.agentBehaviour.badge.disabled": "已停用", + "settings.agentBehaviour.badge.deprecated": "棄用", "settings.agentBehaviour.discoveredSkills": "已發現的 Skill", "settings.agentBehaviour.noSkillsFound": "未發現任何 Skill。請在下方新增 Skill 資料夾路徑或 URL 以使 Skill 可用。", "settings.agentBehaviour.availableModes": "可用自訂模式", diff --git a/packages/kilo-vscode/webview-ui/src/types/messages.ts b/packages/kilo-vscode/webview-ui/src/types/messages.ts index 63e633994e0..1734a94395d 100644 --- a/packages/kilo-vscode/webview-ui/src/types/messages.ts +++ b/packages/kilo-vscode/webview-ui/src/types/messages.ts @@ -219,6 +219,7 @@ export interface AgentInfo { mode: "subagent" | "primary" | "all" native?: boolean hidden?: boolean + deprecated?: boolean color?: string } diff --git a/packages/opencode/src/agent/agent.ts b/packages/opencode/src/agent/agent.ts index 16305db1286..7886a5ee534 100644 --- a/packages/opencode/src/agent/agent.ts +++ b/packages/opencode/src/agent/agent.ts @@ -37,6 +37,7 @@ export namespace Agent { mode: z.enum(["subagent", "primary", "all"]), native: z.boolean().optional(), hidden: z.boolean().optional(), + deprecated: z.boolean().optional(), topP: z.number().optional(), temperature: z.number().optional(), color: z.string().optional(), @@ -193,7 +194,7 @@ export namespace Agent { }, orchestrator: { name: "orchestrator", - description: "Coordinate complex tasks by delegating to specialized agents in parallel.", + description: "Deprecated. Coordinate complex tasks by delegating to specialized agents in parallel.", prompt: PROMPT_ORCHESTRATOR, options: {}, permission: PermissionNext.merge( @@ -226,6 +227,7 @@ export namespace Agent { ), mode: "primary", native: true, + deprecated: true, }, ask: { name: "ask", diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-agent.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-agent.tsx index 24be2167d2b..6a8aa1f3f62 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-agent.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-agent.tsx @@ -12,7 +12,8 @@ export function DialogAgent() { return { value: item.name, title: item.displayName ?? item.name, // kilocode_change - description: item.native ? "native" : item.description, + description: + [item.deprecated && "deprecated", item.native && "native"].filter(Boolean).join(", ") || item.description, } }), ) diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index af5ae1d6b6d..be71a41d7c8 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -1940,6 +1940,7 @@ export type Agent = { mode: "subagent" | "primary" | "all" native?: boolean hidden?: boolean + deprecated?: boolean topP?: number temperature?: number color?: string diff --git a/packages/sdk/openapi.json b/packages/sdk/openapi.json index 8393d52605d..3f4f142364e 100644 --- a/packages/sdk/openapi.json +++ b/packages/sdk/openapi.json @@ -14773,6 +14773,9 @@ "hidden": { "type": "boolean" }, + "deprecated": { + "type": "boolean" + }, "topP": { "type": "number" }, From 482bf89b6905c16ebc85bc53871b1884e00f4349 Mon Sep 17 00:00:00 2001 From: "kiloconnect[bot]" <240665456+kiloconnect[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2026 07:03:58 +0000 Subject: [PATCH 07/24] fix: add windowsHide:true to remaining spawn/exec calls to prevent CMD flash on Windows Previous fixes in #6813 and subsequent PRs added windowsHide:true to most spawn sites, but several call sites were missed or regressed: - SDK server.ts (v1 + v2): kilo serve and TUI spawn - ts-check.ts: Bun.spawn for tsc invocation - github.ts: exec for browser open - desktop-electron cli.ts: install script spawn and version check - desktop-electron ipc.ts: open-path execFile - desktop-electron apps.ts: wsl/where execFileSync calls Without windowsHide:true, each of these subprocess invocations causes a visible cmd.exe console window to briefly flash on Windows. Closes #7896 --- packages/desktop-electron/src/main/apps.ts | 6 +++--- packages/desktop-electron/src/main/cli.ts | 4 ++-- packages/desktop-electron/src/main/ipc.ts | 2 +- packages/opencode/src/cli/cmd/github.ts | 2 +- packages/opencode/src/kilocode/ts-check.ts | 1 + packages/sdk/js/src/server.ts | 2 ++ packages/sdk/js/src/v2/server.ts | 2 ++ 7 files changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/desktop-electron/src/main/apps.ts b/packages/desktop-electron/src/main/apps.ts index 2b460378948..16a0783067c 100644 --- a/packages/desktop-electron/src/main/apps.ts +++ b/packages/desktop-electron/src/main/apps.ts @@ -21,11 +21,11 @@ export function wslPath(path: string, mode: "windows" | "linux" | null): string if (path.startsWith("~")) { const suffix = path.slice(1) const cmd = `wslpath ${flag} \"$HOME${suffix.replace(/\"/g, '\\"')}\"` - const output = execFileSync("wsl", ["-e", "sh", "-lc", cmd]) + const output = execFileSync("wsl", ["-e", "sh", "-lc", cmd], { windowsHide: true }) return output.toString().trim() } - const output = execFileSync("wsl", ["-e", "wslpath", flag, path]) + const output = execFileSync("wsl", ["-e", "wslpath", flag, path], { windowsHide: true }) return output.toString().trim() } catch (error) { throw new Error(`Failed to run wslpath: ${String(error)}`) @@ -51,7 +51,7 @@ function checkMacosApp(appName: string) { function resolveWindowsAppPath(appName: string): string | null { let output: string try { - output = execFileSync("where", [appName]).toString() + output = execFileSync("where", [appName], { windowsHide: true }).toString() } catch { return null } diff --git a/packages/desktop-electron/src/main/cli.ts b/packages/desktop-electron/src/main/cli.ts index e338d39138e..4b2d9447175 100644 --- a/packages/desktop-electron/src/main/cli.ts +++ b/packages/desktop-electron/src/main/cli.ts @@ -84,7 +84,7 @@ export async function installCli(): Promise { writeFileSync(tempScript, script, "utf8") chmodSync(tempScript, 0o755) - const cmd = spawn(tempScript, ["--binary", sidecar], { stdio: "pipe" }) + const cmd = spawn(tempScript, ["--binary", sidecar], { stdio: "pipe", windowsHide: true }) return await new Promise((resolve, reject) => { cmd.on("exit", (code: number | null) => { try { @@ -107,7 +107,7 @@ export function syncCli() { let version = "" try { - version = execFileSync(installPath, ["--version"]).toString().trim() + version = execFileSync(installPath, ["--version"], { windowsHide: true }).toString().trim() } catch { return } diff --git a/packages/desktop-electron/src/main/ipc.ts b/packages/desktop-electron/src/main/ipc.ts index bbb5379bb7a..a27302e4b73 100644 --- a/packages/desktop-electron/src/main/ipc.ts +++ b/packages/desktop-electron/src/main/ipc.ts @@ -123,7 +123,7 @@ export function registerIpcHandlers(deps: Deps) { await new Promise((resolve, reject) => { const [cmd, args] = process.platform === "darwin" ? (["open", ["-a", app, path]] as const) : ([app, [path]] as const) - execFile(cmd, args, (err) => (err ? reject(err) : resolve())) + execFile(cmd, args, { windowsHide: true }, (err) => (err ? reject(err) : resolve())) }) }) diff --git a/packages/opencode/src/cli/cmd/github.ts b/packages/opencode/src/cli/cmd/github.ts index df03d61b91a..bc0d83e9532 100644 --- a/packages/opencode/src/cli/cmd/github.ts +++ b/packages/opencode/src/cli/cmd/github.ts @@ -330,7 +330,7 @@ export const GithubInstallCommand = cmd({ ? `start "" "${url}"` : `xdg-open "${url}"` - exec(command, (error) => { + exec(command, { windowsHide: true }, (error) => { if (error) { prompts.log.warn(`Could not open browser. Please visit: ${url}`) } diff --git a/packages/opencode/src/kilocode/ts-check.ts b/packages/opencode/src/kilocode/ts-check.ts index 449609df830..9deb9506929 100644 --- a/packages/opencode/src/kilocode/ts-check.ts +++ b/packages/opencode/src/kilocode/ts-check.ts @@ -29,6 +29,7 @@ export namespace TsCheck { cwd: root, stdout: "pipe", stderr: "pipe", + windowsHide: true, env: { ...process.env }, }) diff --git a/packages/sdk/js/src/server.ts b/packages/sdk/js/src/server.ts index f878f832f9f..bace9a3b05d 100644 --- a/packages/sdk/js/src/server.ts +++ b/packages/sdk/js/src/server.ts @@ -68,6 +68,7 @@ export async function createKiloServer(options?: ServerOptions) { const proc = spawn(`kilo`, args, { // kilocode_change end signal: options.signal, + windowsHide: true, env: { ...process.env, KILO_CONFIG_CONTENT: buildConfigEnv(options.config), // kilocode_change @@ -148,6 +149,7 @@ export function createKiloTui(options?: TuiOptions) { // kilocode_change end signal: options?.signal, stdio: "inherit", + windowsHide: true, env: { ...process.env, KILO_CONFIG_CONTENT: buildConfigEnv(options?.config), // kilocode_change diff --git a/packages/sdk/js/src/v2/server.ts b/packages/sdk/js/src/v2/server.ts index f878f832f9f..bace9a3b05d 100644 --- a/packages/sdk/js/src/v2/server.ts +++ b/packages/sdk/js/src/v2/server.ts @@ -68,6 +68,7 @@ export async function createKiloServer(options?: ServerOptions) { const proc = spawn(`kilo`, args, { // kilocode_change end signal: options.signal, + windowsHide: true, env: { ...process.env, KILO_CONFIG_CONTENT: buildConfigEnv(options.config), // kilocode_change @@ -148,6 +149,7 @@ export function createKiloTui(options?: TuiOptions) { // kilocode_change end signal: options?.signal, stdio: "inherit", + windowsHide: true, env: { ...process.env, KILO_CONFIG_CONTENT: buildConfigEnv(options?.config), // kilocode_change From 6e8da6ead4ca952a28d20729123ea99bcff5cbfa Mon Sep 17 00:00:00 2001 From: "kiloconnect[bot]" <240665456+kiloconnect[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2026 07:48:34 +0000 Subject: [PATCH 08/24] revert: restore desktop-electron spawn calls to upstream state desktop-electron is not actively maintained and is synced from upstream. Reverting windowsHide changes in apps.ts, cli.ts, and ipc.ts to keep the diff from upstream minimal and avoid merge conflicts. --- packages/desktop-electron/src/main/apps.ts | 6 +++--- packages/desktop-electron/src/main/cli.ts | 4 ++-- packages/desktop-electron/src/main/ipc.ts | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/desktop-electron/src/main/apps.ts b/packages/desktop-electron/src/main/apps.ts index 16a0783067c..2b460378948 100644 --- a/packages/desktop-electron/src/main/apps.ts +++ b/packages/desktop-electron/src/main/apps.ts @@ -21,11 +21,11 @@ export function wslPath(path: string, mode: "windows" | "linux" | null): string if (path.startsWith("~")) { const suffix = path.slice(1) const cmd = `wslpath ${flag} \"$HOME${suffix.replace(/\"/g, '\\"')}\"` - const output = execFileSync("wsl", ["-e", "sh", "-lc", cmd], { windowsHide: true }) + const output = execFileSync("wsl", ["-e", "sh", "-lc", cmd]) return output.toString().trim() } - const output = execFileSync("wsl", ["-e", "wslpath", flag, path], { windowsHide: true }) + const output = execFileSync("wsl", ["-e", "wslpath", flag, path]) return output.toString().trim() } catch (error) { throw new Error(`Failed to run wslpath: ${String(error)}`) @@ -51,7 +51,7 @@ function checkMacosApp(appName: string) { function resolveWindowsAppPath(appName: string): string | null { let output: string try { - output = execFileSync("where", [appName], { windowsHide: true }).toString() + output = execFileSync("where", [appName]).toString() } catch { return null } diff --git a/packages/desktop-electron/src/main/cli.ts b/packages/desktop-electron/src/main/cli.ts index 4b2d9447175..e338d39138e 100644 --- a/packages/desktop-electron/src/main/cli.ts +++ b/packages/desktop-electron/src/main/cli.ts @@ -84,7 +84,7 @@ export async function installCli(): Promise { writeFileSync(tempScript, script, "utf8") chmodSync(tempScript, 0o755) - const cmd = spawn(tempScript, ["--binary", sidecar], { stdio: "pipe", windowsHide: true }) + const cmd = spawn(tempScript, ["--binary", sidecar], { stdio: "pipe" }) return await new Promise((resolve, reject) => { cmd.on("exit", (code: number | null) => { try { @@ -107,7 +107,7 @@ export function syncCli() { let version = "" try { - version = execFileSync(installPath, ["--version"], { windowsHide: true }).toString().trim() + version = execFileSync(installPath, ["--version"]).toString().trim() } catch { return } diff --git a/packages/desktop-electron/src/main/ipc.ts b/packages/desktop-electron/src/main/ipc.ts index a27302e4b73..bbb5379bb7a 100644 --- a/packages/desktop-electron/src/main/ipc.ts +++ b/packages/desktop-electron/src/main/ipc.ts @@ -123,7 +123,7 @@ export function registerIpcHandlers(deps: Deps) { await new Promise((resolve, reject) => { const [cmd, args] = process.platform === "darwin" ? (["open", ["-a", app, path]] as const) : ([app, [path]] as const) - execFile(cmd, args, { windowsHide: true }, (err) => (err ? reject(err) : resolve())) + execFile(cmd, args, (err) => (err ? reject(err) : resolve())) }) }) From a5c3a9567810268246608cea394ec343202104e3 Mon Sep 17 00:00:00 2001 From: "kiloconnect[bot]" <240665456+kiloconnect[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2026 13:46:10 +0000 Subject: [PATCH 09/24] feat(vscode): center profile screen with max-width --- .../webview-ui/src/components/profile/ProfileView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kilo-vscode/webview-ui/src/components/profile/ProfileView.tsx b/packages/kilo-vscode/webview-ui/src/components/profile/ProfileView.tsx index f1f29cade1b..56a0cecb27f 100644 --- a/packages/kilo-vscode/webview-ui/src/components/profile/ProfileView.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/profile/ProfileView.tsx @@ -110,7 +110,7 @@ const ProfileView: Component = (props) => { >

{language.t("profile.title")}

-
+
Date: Mon, 30 Mar 2026 13:53:19 +0000 Subject: [PATCH 10/24] fix(vscode): add box-sizing border-box to prevent overflow on narrow panels --- .../webview-ui/src/components/profile/ProfileView.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/kilo-vscode/webview-ui/src/components/profile/ProfileView.tsx b/packages/kilo-vscode/webview-ui/src/components/profile/ProfileView.tsx index 56a0cecb27f..83f55ca0fbf 100644 --- a/packages/kilo-vscode/webview-ui/src/components/profile/ProfileView.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/profile/ProfileView.tsx @@ -110,7 +110,9 @@ const ProfileView: Component = (props) => { >

{language.t("profile.title")}

-
+
Date: Mon, 30 Mar 2026 16:39:33 +0200 Subject: [PATCH 11/24] feat(cli): add WebSocket activity watchdog with heartbeat_ack support Add an inactivity watchdog to RemoteWS that force-closes and reconnects the WebSocket when no inbound messages arrive within a configurable timeout window (default 30s). Introduce a heartbeat_ack inbound message type so the server can respond to heartbeat pings, resetting the activity timer. --- .../src/kilo-sessions/remote-protocol.ts | 7 +- .../opencode/src/kilo-sessions/remote-ws.ts | 30 +++++++ .../kilo-sessions/remote-protocol.test.ts | 18 +++++ .../test/kilo-sessions/remote-ws.test.ts | 80 +++++++++++++++++++ 4 files changed, 134 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/kilo-sessions/remote-protocol.ts b/packages/opencode/src/kilo-sessions/remote-protocol.ts index ed8e19348e5..6500319fa81 100644 --- a/packages/opencode/src/kilo-sessions/remote-protocol.ts +++ b/packages/opencode/src/kilo-sessions/remote-protocol.ts @@ -71,7 +71,12 @@ export namespace RemoteProtocol { }) export type System = z.infer - export const Inbound = z.discriminatedUnion("type", [Subscribe, Unsubscribe, Command, System]) + export const HeartbeatAck = z.object({ + type: z.literal("heartbeat_ack"), + }) + export type HeartbeatAck = z.infer + + export const Inbound = z.discriminatedUnion("type", [Subscribe, Unsubscribe, Command, System, HeartbeatAck]) export type Inbound = z.infer /** Lightweight schema for diagnostic logging before full parse. */ diff --git a/packages/opencode/src/kilo-sessions/remote-ws.ts b/packages/opencode/src/kilo-sessions/remote-ws.ts index 88a1f2f36db..0232ec27785 100644 --- a/packages/opencode/src/kilo-sessions/remote-ws.ts +++ b/packages/opencode/src/kilo-sessions/remote-ws.ts @@ -18,6 +18,8 @@ export namespace RemoteWS { withContext?: (fn: () => R) => Promise | R /** Called when the server permanently closes the connection (e.g. auth failure, conflict) */ onClose?: (code: number, reason: string) => void + /** Inactivity timeout in ms — force-close if no inbound message within this window */ + timeout?: number } export type Connection = { @@ -56,6 +58,29 @@ export namespace RemoteWS { beat = undefined } + let activity = Date.now() + let watchdog: Timer | undefined + const timeout = options.timeout ?? 30_000 + + function startWatchdog() { + stopWatchdog() + watchdog = setInterval( + () => { + if (Date.now() - activity > timeout) { + options.log.warn("remote-ws activity timeout, forcing reconnect") + stopWatchdog() + ws?.close(4000, "activity timeout") + } + }, + Math.min(interval, timeout), + ) + } + + function stopWatchdog() { + if (watchdog) clearInterval(watchdog) + watchdog = undefined + } + async function open() { if (closed) return const token = await options.getToken() @@ -73,10 +98,13 @@ export namespace RemoteWS { backoff = 1000 for (const msg of buffer) ws!.send(msg) buffer.length = 0 + activity = Date.now() startHeartbeat() + startWatchdog() } ws.onmessage = (event) => { + activity = Date.now() const raw = String(event.data) let json: unknown try { @@ -99,6 +127,7 @@ export namespace RemoteWS { options.log.info("remote-ws closed", { code: event.code, reason: event.reason }) ws = undefined stopHeartbeat() + stopWatchdog() if (event.code === 4401 || event.code === 4403 || event.code === 4409) { options.log.warn("remote-ws closed permanently", { code: event.code, @@ -134,6 +163,7 @@ export namespace RemoteWS { function close() { closed = true stopHeartbeat() + stopWatchdog() if (timer) clearTimeout(timer) if (ws) ws.close() } diff --git a/packages/opencode/test/kilo-sessions/remote-protocol.test.ts b/packages/opencode/test/kilo-sessions/remote-protocol.test.ts index f61f3f40886..354662dae5e 100644 --- a/packages/opencode/test/kilo-sessions/remote-protocol.test.ts +++ b/packages/opencode/test/kilo-sessions/remote-protocol.test.ts @@ -237,4 +237,22 @@ describe("RemoteProtocol", () => { const result = RemoteProtocol.SessionInfo.safeParse({ id: "x" }) expect(result.success).toBe(false) }) + + test("valid heartbeat_ack parses", () => { + const msg = { type: "heartbeat_ack" } + const result = RemoteProtocol.HeartbeatAck.safeParse(msg) + expect(result.success).toBe(true) + if (result.success) { + expect(result.data.type).toBe("heartbeat_ack") + } + }) + + test("inbound union picks heartbeat_ack", () => { + const msg = { type: "heartbeat_ack" } + const result = RemoteProtocol.Inbound.safeParse(msg) + expect(result.success).toBe(true) + if (result.success) { + expect(result.data.type).toBe("heartbeat_ack") + } + }) }) diff --git a/packages/opencode/test/kilo-sessions/remote-ws.test.ts b/packages/opencode/test/kilo-sessions/remote-ws.test.ts index f6c1a83cdf1..7fe6152b23a 100644 --- a/packages/opencode/test/kilo-sessions/remote-ws.test.ts +++ b/packages/opencode/test/kilo-sessions/remote-ws.test.ts @@ -284,4 +284,84 @@ describe("RemoteWS", () => { expect(server.clients.length).toBe(0) expect(server.messages.length).toBe(0) }) + + test("force-reconnects on activity timeout", async () => { + server = createServer() + const ws1 = server.waitForConnect() + + conn = RemoteWS.connect({ + url: server.url, + getToken: async () => "tok", + getSessions: () => [], + log: nolog(), + heartbeat: 60_000, + timeout: 200, + }) + + await ws1 + await settled() + expect(conn.connected).toBe(true) + + // Don't send any server messages — timeout should fire + const ws2 = server.waitForConnect() + await Bun.sleep(450) + + // Should have reconnected + await ws2 + await settled() + expect(conn.connected).toBe(true) + }) + + test("resets activity timer on incoming messages", async () => { + server = createServer() + const ws1p = server.waitForConnect() + + conn = RemoteWS.connect({ + url: server.url, + getToken: async () => "tok", + getSessions: () => [], + log: nolog(), + heartbeat: 60_000, + timeout: 300, + }) + + const ws1 = await ws1p + await settled() + + // Send server messages at 100ms intervals — each resets the timer + for (let i = 0; i < 4; i++) { + await Bun.sleep(100) + ws1.send(JSON.stringify({ type: "subscribe", sessionId: `s${i}` })) + } + + await settled() + // Connection should still be alive — activity kept resetting the timer + expect(conn.connected).toBe(true) + expect(server.clients.length).toBe(1) + }) + + test("activity timeout uses custom timeout option", async () => { + server = createServer() + const ws1 = server.waitForConnect() + + conn = RemoteWS.connect({ + url: server.url, + getToken: async () => "tok", + getSessions: () => [], + log: nolog(), + heartbeat: 60_000, + timeout: 100, + }) + + await ws1 + await settled() + + // With 100ms timeout, should reconnect faster than default 30s + const ws2 = server.waitForConnect() + await Bun.sleep(250) + + await ws2 + await settled() + expect(conn.connected).toBe(true) + }) }) From 76d8415ff1669be2ece3e46cf5731f7930b82310 Mon Sep 17 00:00:00 2001 From: "kiloconnect[bot]" <240665456+kiloconnect[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2026 16:57:55 +0000 Subject: [PATCH 12/24] docs(kilo-docs): fix issues flagged by kilo-code-bot review --- .../pages/automate/extending/shell-integration.md | 8 ++++---- packages/kilo-docs/pages/automate/index.md | 1 - .../kilo-docs/pages/automate/mcp/using-in-kilo-code.md | 8 ++++++++ 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/kilo-docs/pages/automate/extending/shell-integration.md b/packages/kilo-docs/pages/automate/extending/shell-integration.md index c88399a1f61..4f1e3312846 100644 --- a/packages/kilo-docs/pages/automate/extending/shell-integration.md +++ b/packages/kilo-docs/pages/automate/extending/shell-integration.md @@ -391,10 +391,10 @@ When using the Kilo Code VS Code extension with the Agent Manager, each agent se ### Keyboard Shortcuts -| Shortcut | Action | -| --------------------------- | --------------------------------------- | -| Cmd+/ | Focus the session's terminal | -| Cmd+. | Return focus to the Agent Manager panel | +| Shortcut | Action | +| --------------------------- | ---------------------------- | +| Cmd+/ | Focus the session's terminal | +| Cmd+. | Cycle agent mode | ### Terminal Context Menu Actions diff --git a/packages/kilo-docs/pages/automate/index.md b/packages/kilo-docs/pages/automate/index.md index 9616faf4a7e..d71a6dce541 100644 --- a/packages/kilo-docs/pages/automate/index.md +++ b/packages/kilo-docs/pages/automate/index.md @@ -36,7 +36,6 @@ Connect Kilo Code to external tools and services: - [**Using MCP in Kilo Code**](/docs/automate/mcp/using-in-kilo-code) — Configuration guide - [**STDIO & SSE Transports**](/docs/automate/mcp/server-transports) — Local and remote server options - [**MCP vs API**](/docs/automate/mcp/mcp-vs-api) — When to use MCP -- [**Using MCP in Kilo Code**](/docs/automate/mcp/using-in-kilo-code) — Configure MCP servers ## Integrations diff --git a/packages/kilo-docs/pages/automate/mcp/using-in-kilo-code.md b/packages/kilo-docs/pages/automate/mcp/using-in-kilo-code.md index b89df65d57a..72f9994d1db 100644 --- a/packages/kilo-docs/pages/automate/mcp/using-in-kilo-code.md +++ b/packages/kilo-docs/pages/automate/mcp/using-in-kilo-code.md @@ -615,6 +615,14 @@ Example: "Analyze the performance of my API" might use an MCP tool that tests AP - **Tool Not Available:** Confirm the server is properly implementing the tool and it's not disabled in settings - **Slow Performance:** Try adjusting the network timeout value for the specific MCP server +{% /tab %} +{% tab label="CLI" %} + +- **Server Not Responding:** Check if the server process is running. Use `kilo mcp debug ` to inspect the connection. +- **Permission Errors:** Ensure API keys and credentials are set in your `kilo.jsonc` config or via `{env:VARIABLE_NAME}` references. +- **Tool Not Available:** Confirm the server is properly implementing the tool and it is not disabled (`"enabled": false`) in your config. +- **Slow Performance:** Increase the `timeout` value for the specific MCP server in your config. + {% /tab %} {% /tabs %} From 5d9ea38171d3a38fce7ca628589899e659f5d530 Mon Sep 17 00:00:00 2001 From: Evgeny Shurakov Date: Mon, 30 Mar 2026 21:30:40 +0200 Subject: [PATCH 13/24] feat(cli): add remote_control config to auto-enable remote session relay Add a `remote_control` boolean config field so users can enable remote session relay by default without the KILO_REMOTE env var or /remote command. --- packages/opencode/src/config/config.ts | 4 ++++ packages/opencode/src/kilo-sessions/kilo-sessions.ts | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index eff231452e0..5b3e3b28de4 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -1159,6 +1159,10 @@ export namespace Config { .boolean() .optional() .describe("@deprecated Use 'share' field instead. Share newly created sessions automatically"), + remote_control: z // kilocode_change + .boolean() + .optional() + .describe("Enable remote control of sessions via Kilo Cloud. Equivalent to running /remote on startup."), autoupdate: z .union([z.boolean(), z.literal("notify")]) .optional() diff --git a/packages/opencode/src/kilo-sessions/kilo-sessions.ts b/packages/opencode/src/kilo-sessions/kilo-sessions.ts index 28c1f4f94e7..2a586ad43f7 100644 --- a/packages/opencode/src/kilo-sessions/kilo-sessions.ts +++ b/packages/opencode/src/kilo-sessions/kilo-sessions.ts @@ -10,6 +10,7 @@ import { clearInFlightCache, withInFlightCache } from "@/kilo-sessions/inflight- import type * as SDK from "@kilocode/sdk/v2" import z from "zod" import { KILO_API_BASE } from "@kilocode/kilo-gateway" +import { Config } from "@/config/config" import { Instance } from "@/project/instance" import { Vcs } from "@/project/vcs" import simpleGit from "simple-git" @@ -205,7 +206,9 @@ export namespace KiloSessions { await ingest.sync(evt.properties.sessionID, [{ type: "session_close", data: { reason: evt.properties.reason } }]) }) - if (remoteEnabled) enableRemote().catch((err) => log.warn("remote not enabled", { error: String(err) })) + const cfg = await Config.get() + if (remoteEnabled || cfg.remote_control) + enableRemote().catch((err) => log.warn("remote not enabled", { error: String(err) })) Bus.subscribe(Bus.InstanceDisposed, () => disableRemote()) } From 8c6d4481171637ce639aff7cd0c8f1f34a7efa79 Mon Sep 17 00:00:00 2001 From: Evgeny Shurakov Date: Mon, 30 Mar 2026 22:11:35 +0200 Subject: [PATCH 14/24] fix(cli): read remote_control from global config only --- packages/opencode/src/kilo-sessions/kilo-sessions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opencode/src/kilo-sessions/kilo-sessions.ts b/packages/opencode/src/kilo-sessions/kilo-sessions.ts index 2a586ad43f7..76249cf9d5f 100644 --- a/packages/opencode/src/kilo-sessions/kilo-sessions.ts +++ b/packages/opencode/src/kilo-sessions/kilo-sessions.ts @@ -206,7 +206,7 @@ export namespace KiloSessions { await ingest.sync(evt.properties.sessionID, [{ type: "session_close", data: { reason: evt.properties.reason } }]) }) - const cfg = await Config.get() + const cfg = await Config.getGlobal() if (remoteEnabled || cfg.remote_control) enableRemote().catch((err) => log.warn("remote not enabled", { error: String(err) })) Bus.subscribe(Bus.InstanceDisposed, () => disableRemote()) From 12d292ec08d8a1c412cb50f59882ab07cbf22b34 Mon Sep 17 00:00:00 2001 From: Aarav Sharma Date: Mon, 30 Mar 2026 16:50:38 -0600 Subject: [PATCH 15/24] fix: propagate deprecated field in agent merge and show description in dialog --- packages/opencode/src/agent/agent.ts | 1 + packages/opencode/src/cli/cmd/tui/component/dialog-agent.tsx | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/agent/agent.ts b/packages/opencode/src/agent/agent.ts index 7886a5ee534..3e790f5b31c 100644 --- a/packages/opencode/src/agent/agent.ts +++ b/packages/opencode/src/agent/agent.ts @@ -383,6 +383,7 @@ export namespace Agent { item.mode = value.mode ?? item.mode item.color = value.color ?? item.color item.hidden = value.hidden ?? item.hidden + item.deprecated = value.deprecated ?? item.deprecated item.name = value.name ?? item.name item.steps = value.steps ?? item.steps item.options = mergeDeep(item.options, value.options ?? {}) diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-agent.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-agent.tsx index 6a8aa1f3f62..68ea2f4c432 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-agent.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-agent.tsx @@ -13,7 +13,8 @@ export function DialogAgent() { value: item.name, title: item.displayName ?? item.name, // kilocode_change description: - [item.deprecated && "deprecated", item.native && "native"].filter(Boolean).join(", ") || item.description, + [item.deprecated && "deprecated", item.native && "native", item.description].filter(Boolean).join(", ") || + undefined, } }), ) From c4732a6c8c850b5dc9a68c74887e0e53cee015ab Mon Sep 17 00:00:00 2001 From: Alex Alecu Date: Tue, 31 Mar 2026 09:02:11 +0300 Subject: [PATCH 16/24] fix(cli): restore agent picker labels --- packages/opencode/src/agent/agent.ts | 2 +- packages/opencode/src/cli/cmd/tui/component/dialog-agent.tsx | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/opencode/src/agent/agent.ts b/packages/opencode/src/agent/agent.ts index 5773244ba45..8bfbe786a21 100644 --- a/packages/opencode/src/agent/agent.ts +++ b/packages/opencode/src/agent/agent.ts @@ -265,7 +265,7 @@ export namespace Agent { }, orchestrator: { name: "orchestrator", - description: "Deprecated. Coordinate complex tasks by delegating to specialized agents in parallel.", + description: "Coordinate complex tasks by delegating to specialized agents in parallel.", prompt: PROMPT_ORCHESTRATOR, options: {}, permission: PermissionNext.merge( diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-agent.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-agent.tsx index 68ea2f4c432..6a8aa1f3f62 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-agent.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-agent.tsx @@ -13,8 +13,7 @@ export function DialogAgent() { value: item.name, title: item.displayName ?? item.name, // kilocode_change description: - [item.deprecated && "deprecated", item.native && "native", item.description].filter(Boolean).join(", ") || - undefined, + [item.deprecated && "deprecated", item.native && "native"].filter(Boolean).join(", ") || item.description, } }), ) From 3558f5e84b143343864b1b9c9955b947d8a7dc29 Mon Sep 17 00:00:00 2001 From: "kiloconnect[bot]" <240665456+kiloconnect[bot]@users.noreply.github.com> Date: Tue, 31 Mar 2026 07:47:59 +0000 Subject: [PATCH 17/24] fix(vscode): show friendly model name in notification "Try model" button Replace static "Try model" text with "Try " using the model catalog display name. The i18n template now uses {{model}} interpolation across all 18 locales. --- .../src/components/chat/KiloNotifications.tsx | 11 ++++++++++- packages/kilo-vscode/webview-ui/src/i18n/ar.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/br.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/bs.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/da.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/de.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/en.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/es.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/fr.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/ja.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/ko.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/nl.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/no.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/pl.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/ru.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/th.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/tr.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/zh.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/zht.ts | 2 +- 19 files changed, 28 insertions(+), 19 deletions(-) diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/KiloNotifications.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/KiloNotifications.tsx index 7beffc2fc00..db18bcce517 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/KiloNotifications.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/KiloNotifications.tsx @@ -6,6 +6,7 @@ import { useProvider } from "../../context/provider" import { useLanguage } from "../../context/language" import { KILO_PROVIDER_ID } from "../../../../src/shared/provider-model" import { TelemetryEventName } from "../../../../src/services/telemetry/types" +import { sanitizeName, stripSubProviderPrefix } from "../shared/model-selector-utils" export const KiloNotifications: Component = () => { const { filteredNotifications, dismiss } = useNotifications() @@ -61,6 +62,14 @@ export const KiloNotifications: Component = () => { return true }) + const suggestedName = createMemo(() => { + const suggestion = suggestedModel() + if (!suggestion) return undefined + const model = provider.findModel(suggestion) + if (!model?.name) return undefined + return stripSubProviderPrefix(sanitizeName(model.name)) + }) + const handleTryModel = () => { const suggestion = suggestedModel() if (!suggestion) return @@ -88,7 +97,7 @@ export const KiloNotifications: Component = () => {