From 1b715c0416f07a771462ea9631f9a0572916a2f1 Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Thu, 29 Jan 2026 23:41:57 +0100 Subject: [PATCH 01/18] Add new welcome screen --- packages/types/src/global-settings.ts | 1 + packages/types/src/vscode-extension-host.ts | 2 + src/core/webview/ClineProvider.ts | 2 + src/core/webview/webviewMessageHandler.ts | 6 + webview-ui/src/App.tsx | 48 ++++++- .../kilocode/welcome/OnboardingView.tsx | 63 ++++++++++ .../welcome/__tests__/OnboardingView.spec.tsx | 118 ++++++++++++++++++ .../src/context/ExtensionStateContext.tsx | 6 + webview-ui/src/i18n/locales/en/kilocode.json | 15 +++ 9 files changed, 260 insertions(+), 1 deletion(-) create mode 100644 webview-ui/src/components/kilocode/welcome/OnboardingView.tsx create mode 100644 webview-ui/src/components/kilocode/welcome/__tests__/OnboardingView.spec.tsx diff --git a/packages/types/src/global-settings.ts b/packages/types/src/global-settings.ts index 1568bc2af92..3186b73783f 100644 --- a/packages/types/src/global-settings.ts +++ b/packages/types/src/global-settings.ts @@ -241,6 +241,7 @@ export const globalSettingsSchema = z.object({ enterBehavior: z.enum(["send", "newline"]).optional(), profileThresholds: z.record(z.string(), z.number()).optional(), hasOpenedModeSelector: z.boolean().optional(), + hasCompletedOnboarding: z.boolean().optional(), // kilocode_change: Track if user has completed onboarding flow lastModeExportPath: z.string().optional(), lastModeImportPath: z.string().optional(), appendSystemPrompt: z.string().optional(), // kilocode_change: Custom text to append to system prompt (CLI only) diff --git a/packages/types/src/vscode-extension-host.ts b/packages/types/src/vscode-extension-host.ts index bc118a4ed1d..cda87b683c5 100644 --- a/packages/types/src/vscode-extension-host.ts +++ b/packages/types/src/vscode-extension-host.ts @@ -639,6 +639,7 @@ export type ExtensionState = Pick< marketplaceInstalledMetadata?: { project: Record; global: Record } profileThresholds: Record hasOpenedModeSelector: boolean + hasCompletedOnboarding?: boolean // kilocode_change: Track if user has completed onboarding flow openRouterImageApiKey?: string kiloCodeImageApiKey?: string openRouterUseMiddleOutTransform?: boolean @@ -843,6 +844,7 @@ export interface WebviewMessage { | "searchFiles" | "toggleApiConfigPin" | "hasOpenedModeSelector" + | "hasCompletedOnboarding" // kilocode_change: Mark onboarding as completed | "clearCloudAuthSkipModel" | "cloudButtonClicked" | "rooCloudSignIn" diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 6aab446b655..428f2b0c597 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -2521,6 +2521,7 @@ export class ClineProvider profileThresholds: profileThresholds ?? {}, cloudApiUrl: getRooCodeApiUrl(), hasOpenedModeSelector: this.getGlobalState("hasOpenedModeSelector") ?? false, + hasCompletedOnboarding: this.getGlobalState("hasCompletedOnboarding"), // kilocode_change: Track onboarding completion - undefined means new user systemNotificationsEnabled: systemNotificationsEnabled ?? false, // kilocode_change dismissedNotificationIds: dismissedNotificationIds ?? [], // kilocode_change morphApiKey, // kilocode_change @@ -2589,6 +2590,7 @@ export class ClineProvider | "clineMessages" | "renderContext" | "hasOpenedModeSelector" + | "hasCompletedOnboarding" // kilocode_change | "version" | "shouldShowAnnouncement" | "hasSystemPromptOverride" diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 13dd8ef5edc..b35eb1ceca9 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -1908,6 +1908,12 @@ export const webviewMessageHandler = async ( await updateGlobalState("hasOpenedModeSelector", message.bool ?? true) await provider.postStateToWebview() break + // kilocode_change start: Handle onboarding completion + case "hasCompletedOnboarding": + await updateGlobalState("hasCompletedOnboarding", message.bool ?? true) + await provider.postStateToWebview() + break + // kilocode_change end // kilocode_change start case "kiloCodeImageApiKey": await provider.contextProxy.setValue("kiloCodeImageApiKey", message.text) diff --git a/webview-ui/src/App.tsx b/webview-ui/src/App.tsx index e7f42b80dbd..688cd3f9b57 100644 --- a/webview-ui/src/App.tsx +++ b/webview-ui/src/App.tsx @@ -15,6 +15,7 @@ import ChatView, { ChatViewRef } from "./components/chat/ChatView" import HistoryView from "./components/history/HistoryView" import SettingsView, { SettingsViewRef } from "./components/settings/SettingsView" import WelcomeView from "./components/kilocode/welcome/WelcomeView" // kilocode_change +import OnboardingView from "./components/kilocode/welcome/OnboardingView" // kilocode_change import ProfileView from "./components/kilocode/profile/ProfileView" // kilocode_change import McpView from "./components/mcp/McpView" // kilocode_change import AuthView from "./components/kilocode/auth/AuthView" // kilocode_change @@ -94,6 +95,8 @@ const App = () => { renderContext, mdmCompliant, apiConfiguration, // kilocode_change + hasCompletedOnboarding, // kilocode_change: Track onboarding state + taskHistoryFullLength, // kilocode_change: Used to detect existing users } = useExtensionState() // Create a persistent state manager @@ -314,16 +317,59 @@ const App = () => { } }, [tab]) + // kilocode_change start: Onboarding handlers + const handleSelectFreeModels = useCallback(() => { + // Mark onboarding as complete + vscode.postMessage({ type: "hasCompletedOnboarding", bool: true }) + // The default profile is already set up with a free model, so just close welcome + // This will trigger a state update that sets showWelcome to false + }, []) + + const handleSelectPremiumModels = useCallback(() => { + // Mark onboarding as complete + vscode.postMessage({ type: "hasCompletedOnboarding", bool: true }) + // Navigate to auth view which will show the device code and handle the OAuth flow + // The AuthView auto-starts device auth on mount + switchTab("auth") + setAuthReturnTo("chat") + }, [switchTab]) + + const handleSelectBYOK = useCallback(() => { + // Mark onboarding as complete + vscode.postMessage({ type: "hasCompletedOnboarding", bool: true }) + // Navigate to settings with providers section + switchTab("settings") + setCurrentSection("providers") + }, [switchTab]) + // kilocode_change end + if (!didHydrateState) { return null } + // kilocode_change start: Show OnboardingView for new users who haven't completed onboarding + // Show onboarding only if: + // 1. hasCompletedOnboarding is not true (undefined or false) + // 2. AND user has no task history (meaning they're truly new, not an existing user upgrading) + // + // This ensures existing users who upgrade don't see the onboarding screen, + // while new users who have never used the extension will see it. + const isExistingUser = (taskHistoryFullLength ?? 0) > 0 + const showOnboarding = hasCompletedOnboarding !== true && !isExistingUser + // Do not conditionally load ChatView, it's expensive and there's state we // don't want to lose (user input, disableInput, askResponse promise, etc.) // kilocode_change: no WelcomeViewProvider toggle - return showWelcome ? ( + return showOnboarding ? ( + + ) : showWelcome ? ( ) : ( + // kilocode_change end <> {/* kilocode_change start */} diff --git a/webview-ui/src/components/kilocode/welcome/OnboardingView.tsx b/webview-ui/src/components/kilocode/welcome/OnboardingView.tsx new file mode 100644 index 00000000000..910172deace --- /dev/null +++ b/webview-ui/src/components/kilocode/welcome/OnboardingView.tsx @@ -0,0 +1,63 @@ +// kilocode_change - new file +import React from "react" +import Logo from "../common/Logo" +import { useAppTranslation } from "@/i18n/TranslationContext" + +interface OnboardingOptionProps { + title: string + description: string + onClick: () => void +} + +const OnboardingOption: React.FC = ({ title, description, onClick }) => { + return ( + + ) +} + +interface OnboardingViewProps { + onSelectFreeModels: () => void + onSelectPremiumModels: () => void + onSelectBYOK: () => void +} + +const OnboardingView: React.FC = ({ onSelectFreeModels, onSelectPremiumModels, onSelectBYOK }) => { + const { t } = useAppTranslation() + + return ( +
+ + +

+ {t("kilocode:onboarding.title")} +

+ +
+ + + + + +
+
+ ) +} + +export default OnboardingView diff --git a/webview-ui/src/components/kilocode/welcome/__tests__/OnboardingView.spec.tsx b/webview-ui/src/components/kilocode/welcome/__tests__/OnboardingView.spec.tsx new file mode 100644 index 00000000000..318d24243a4 --- /dev/null +++ b/webview-ui/src/components/kilocode/welcome/__tests__/OnboardingView.spec.tsx @@ -0,0 +1,118 @@ +// kilocode_change - new file +// npx vitest src/components/kilocode/welcome/__tests__/OnboardingView.spec.tsx + +import { render, screen, fireEvent } from "@/utils/test-utils" +import OnboardingView from "../OnboardingView" + +// Mock Logo component +vi.mock("../../common/Logo", () => ({ + default: () =>
Kilo Logo
, +})) + +describe("OnboardingView", () => { + const mockOnSelectFreeModels = vi.fn() + const mockOnSelectPremiumModels = vi.fn() + const mockOnSelectBYOK = vi.fn() + + beforeEach(() => { + vi.clearAllMocks() + }) + + it("renders the Kilo logo", () => { + render( + , + ) + + expect(screen.getByTestId("kilo-logo")).toBeInTheDocument() + }) + + it("renders the title", () => { + render( + , + ) + + // The translation key is returned as-is by the test-utils mock + expect(screen.getByText("kilocode:onboarding.title")).toBeInTheDocument() + }) + + it("renders all three options", () => { + render( + , + ) + + expect(screen.getByText("kilocode:onboarding.freeModels.title")).toBeInTheDocument() + expect(screen.getByText("kilocode:onboarding.freeModels.description")).toBeInTheDocument() + + expect(screen.getByText("kilocode:onboarding.premiumModels.title")).toBeInTheDocument() + expect(screen.getByText("kilocode:onboarding.premiumModels.description")).toBeInTheDocument() + + expect(screen.getByText("kilocode:onboarding.byok.title")).toBeInTheDocument() + expect(screen.getByText("kilocode:onboarding.byok.description")).toBeInTheDocument() + }) + + it("calls onSelectFreeModels when Free models option is clicked", () => { + render( + , + ) + + const freeModelsButton = screen.getByText("kilocode:onboarding.freeModels.title").closest("button") + expect(freeModelsButton).toBeInTheDocument() + fireEvent.click(freeModelsButton!) + + expect(mockOnSelectFreeModels).toHaveBeenCalledTimes(1) + expect(mockOnSelectPremiumModels).not.toHaveBeenCalled() + expect(mockOnSelectBYOK).not.toHaveBeenCalled() + }) + + it("calls onSelectPremiumModels when Premium models option is clicked", () => { + render( + , + ) + + const premiumModelsButton = screen.getByText("kilocode:onboarding.premiumModels.title").closest("button") + expect(premiumModelsButton).toBeInTheDocument() + fireEvent.click(premiumModelsButton!) + + expect(mockOnSelectPremiumModels).toHaveBeenCalledTimes(1) + expect(mockOnSelectFreeModels).not.toHaveBeenCalled() + expect(mockOnSelectBYOK).not.toHaveBeenCalled() + }) + + it("calls onSelectBYOK when BYOK option is clicked", () => { + render( + , + ) + + const byokButton = screen.getByText("kilocode:onboarding.byok.title").closest("button") + expect(byokButton).toBeInTheDocument() + fireEvent.click(byokButton!) + + expect(mockOnSelectBYOK).toHaveBeenCalledTimes(1) + expect(mockOnSelectFreeModels).not.toHaveBeenCalled() + expect(mockOnSelectPremiumModels).not.toHaveBeenCalled() + }) +}) diff --git a/webview-ui/src/context/ExtensionStateContext.tsx b/webview-ui/src/context/ExtensionStateContext.tsx index c0e62b93a29..1612cf22b2a 100644 --- a/webview-ui/src/context/ExtensionStateContext.tsx +++ b/webview-ui/src/context/ExtensionStateContext.tsx @@ -95,6 +95,8 @@ export interface ExtensionStateContextType extends ExtensionState { mdmCompliant?: boolean hasOpenedModeSelector: boolean // New property to track if user has opened mode selector setHasOpenedModeSelector: (value: boolean) => void // Setter for the new property + hasCompletedOnboarding: boolean // kilocode_change: Track if user has completed onboarding flow + setHasCompletedOnboarding: (value: boolean) => void // kilocode_change alwaysAllowFollowupQuestions: boolean // New property for follow-up questions auto-approve setAlwaysAllowFollowupQuestions: (value: boolean) => void // Setter for the new property followupAutoApproveTimeoutMs: number | undefined // Timeout in ms for auto-approving follow-up questions @@ -292,6 +294,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode customCondensingPrompt: "", // Default empty string for custom condensing prompt yoloGatekeeperApiConfigId: "", // kilocode_change: Default empty string for gatekeeper API config ID hasOpenedModeSelector: false, // Default to false (not opened yet) + hasCompletedOnboarding: false, // kilocode_change: Default to false (not completed yet) autoApprovalEnabled: true, customModes: [], maxOpenTabsContext: 20, @@ -708,6 +711,9 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode enterBehavior: state.enterBehavior ?? "send", setEnterBehavior: (value) => setState((prevState) => ({ ...prevState, enterBehavior: value })), setHasOpenedModeSelector: (value) => setState((prevState) => ({ ...prevState, hasOpenedModeSelector: value })), + hasCompletedOnboarding: state.hasCompletedOnboarding ?? false, // kilocode_change + setHasCompletedOnboarding: (value) => + setState((prevState) => ({ ...prevState, hasCompletedOnboarding: value })), // kilocode_change setAutoCondenseContext: (value) => setState((prevState) => ({ ...prevState, autoCondenseContext: value })), setAutoCondenseContextPercent: (value) => setState((prevState) => ({ ...prevState, autoCondenseContextPercent: value })), diff --git a/webview-ui/src/i18n/locales/en/kilocode.json b/webview-ui/src/i18n/locales/en/kilocode.json index f63b2754950..c7e5a19edeb 100644 --- a/webview-ui/src/i18n/locales/en/kilocode.json +++ b/webview-ui/src/i18n/locales/en/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "How would you like to get started?", + "freeModels": { + "title": "Free models", + "description": "Start coding immediately" + }, + "premiumModels": { + "title": "Premium models", + "description": "Sign up and receive $5 in credits" + }, + "byok": { + "title": "Bring my own Key", + "description": "Advanced. Use your own account or subscription" + } + }, "welcome": { "greeting": "Welcome to Kilo Code!", "introText1": "Kilo Code is a free, open source AI coding agent.", From ff3955d8dfc88edecc2f6eac580dfc17afcc4161 Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Fri, 30 Jan 2026 00:02:42 +0100 Subject: [PATCH 02/18] Add translations --- webview-ui/src/i18n/locales/ar/kilocode.json | 15 +++++++++++++++ webview-ui/src/i18n/locales/ca/kilocode.json | 15 +++++++++++++++ webview-ui/src/i18n/locales/cs/kilocode.json | 15 +++++++++++++++ webview-ui/src/i18n/locales/de/kilocode.json | 15 +++++++++++++++ webview-ui/src/i18n/locales/es/kilocode.json | 15 +++++++++++++++ webview-ui/src/i18n/locales/fr/kilocode.json | 15 +++++++++++++++ webview-ui/src/i18n/locales/hi/kilocode.json | 15 +++++++++++++++ webview-ui/src/i18n/locales/id/kilocode.json | 15 +++++++++++++++ webview-ui/src/i18n/locales/it/kilocode.json | 15 +++++++++++++++ webview-ui/src/i18n/locales/ja/kilocode.json | 15 +++++++++++++++ webview-ui/src/i18n/locales/ko/kilocode.json | 15 +++++++++++++++ webview-ui/src/i18n/locales/nl/kilocode.json | 15 +++++++++++++++ webview-ui/src/i18n/locales/pl/kilocode.json | 15 +++++++++++++++ webview-ui/src/i18n/locales/pt-BR/kilocode.json | 15 +++++++++++++++ webview-ui/src/i18n/locales/ru/kilocode.json | 15 +++++++++++++++ webview-ui/src/i18n/locales/th/kilocode.json | 15 +++++++++++++++ webview-ui/src/i18n/locales/tr/kilocode.json | 15 +++++++++++++++ webview-ui/src/i18n/locales/uk/kilocode.json | 15 +++++++++++++++ webview-ui/src/i18n/locales/vi/kilocode.json | 15 +++++++++++++++ webview-ui/src/i18n/locales/zh-CN/kilocode.json | 15 +++++++++++++++ webview-ui/src/i18n/locales/zh-TW/kilocode.json | 15 +++++++++++++++ 21 files changed, 315 insertions(+) diff --git a/webview-ui/src/i18n/locales/ar/kilocode.json b/webview-ui/src/i18n/locales/ar/kilocode.json index aebe07a2a78..c0217e695c1 100644 --- a/webview-ui/src/i18n/locales/ar/kilocode.json +++ b/webview-ui/src/i18n/locales/ar/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "كيف تريد البدء؟", + "freeModels": { + "title": "نماذج مجانية", + "description": "ابدأ البرمجة فورًا" + }, + "premiumModels": { + "title": "نماذج متميزة", + "description": "سجّل واحصل على رصيد بقيمة 5 دولارات" + }, + "byok": { + "title": "استخدم مفتاحك الخاص", + "description": "متقدم. استخدم حسابك أو اشتراكك الخاص" + } + }, "welcome": { "greeting": "مرحبًا بك في Kilo Code!", "introText1": "Kilo Code وكيل برمجة مدعوم بالذكاء ومفتوح المصدر ومجاني.", diff --git a/webview-ui/src/i18n/locales/ca/kilocode.json b/webview-ui/src/i18n/locales/ca/kilocode.json index 1793eaffc58..7b3bcd1d5a4 100644 --- a/webview-ui/src/i18n/locales/ca/kilocode.json +++ b/webview-ui/src/i18n/locales/ca/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "Com vols començar?", + "freeModels": { + "title": "Models gratuïts", + "description": "Comença a programar immediatament" + }, + "premiumModels": { + "title": "Models premium", + "description": "Registra't i rep 5 $ en crèdits" + }, + "byok": { + "title": "Porta la teva pròpia clau", + "description": "Avançat. Utilitza el teu propi compte o subscripció" + } + }, "welcome": { "greeting": "Benvingut a Kilo Code!", "introText1": "Kilo Code és un agent de codificació d'IA gratuït i de codi obert.", diff --git a/webview-ui/src/i18n/locales/cs/kilocode.json b/webview-ui/src/i18n/locales/cs/kilocode.json index a45ce534c76..887c28c96f2 100644 --- a/webview-ui/src/i18n/locales/cs/kilocode.json +++ b/webview-ui/src/i18n/locales/cs/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "Jak chceš začít?", + "freeModels": { + "title": "Bezplatné modely", + "description": "Začni programovat ihned" + }, + "premiumModels": { + "title": "Prémiové modely", + "description": "Zaregistruj se a získej kredit 5 $" + }, + "byok": { + "title": "Použij vlastní klíč", + "description": "Pokročilé. Použij svůj vlastní účet nebo předplatné" + } + }, "welcome": { "greeting": "Vítej v Kilo Code!", "introText1": "Kilo Code je bezplatný open source AI coding agent.", diff --git a/webview-ui/src/i18n/locales/de/kilocode.json b/webview-ui/src/i18n/locales/de/kilocode.json index 6126544f3bd..0ad1cc6368c 100644 --- a/webview-ui/src/i18n/locales/de/kilocode.json +++ b/webview-ui/src/i18n/locales/de/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "Wie möchtest du beginnen?", + "freeModels": { + "title": "Kostenlose Modelle", + "description": "Sofort mit dem Programmieren beginnen" + }, + "premiumModels": { + "title": "Premium-Modelle", + "description": "Registrieren und 5 $ Guthaben erhalten" + }, + "byok": { + "title": "Eigenen Schlüssel verwenden", + "description": "Fortgeschritten. Eigenes Konto oder Abonnement nutzen" + } + }, "welcome": { "greeting": "Willkommen bei Kilo Code!", "introText1": "Kilo Code ist ein kostenloser Open-Source-KI-Coding-Agent.", diff --git a/webview-ui/src/i18n/locales/es/kilocode.json b/webview-ui/src/i18n/locales/es/kilocode.json index 40cfcb8a470..0f94c4007e8 100644 --- a/webview-ui/src/i18n/locales/es/kilocode.json +++ b/webview-ui/src/i18n/locales/es/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "¿Cómo te gustaría empezar?", + "freeModels": { + "title": "Modelos gratuitos", + "description": "Empieza a programar de inmediato" + }, + "premiumModels": { + "title": "Modelos premium", + "description": "Regístrate y recibe 5 $ en créditos" + }, + "byok": { + "title": "Usa tu propia clave", + "description": "Avanzado. Usa tu propia cuenta o suscripción" + } + }, "welcome": { "greeting": "¡Bienvenido a Kilo Code!", "introText1": "Kilo Code es un agente de codificación de IA gratuito y de código abierto.", diff --git a/webview-ui/src/i18n/locales/fr/kilocode.json b/webview-ui/src/i18n/locales/fr/kilocode.json index fb487b1d272..08c16dbaae2 100644 --- a/webview-ui/src/i18n/locales/fr/kilocode.json +++ b/webview-ui/src/i18n/locales/fr/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "Comment souhaitez-vous commencer ?", + "freeModels": { + "title": "Modèles gratuits", + "description": "Commencez à coder immédiatement" + }, + "premiumModels": { + "title": "Modèles premium", + "description": "Inscrivez-vous et recevez 5 $ de crédits" + }, + "byok": { + "title": "Apportez votre propre clé", + "description": "Avancé. Utilisez votre propre compte ou abonnement" + } + }, "welcome": { "greeting": "Bienvenue dans Kilo Code !", "introText1": "Kilo Code est un agent de codage IA gratuit et open source.", diff --git a/webview-ui/src/i18n/locales/hi/kilocode.json b/webview-ui/src/i18n/locales/hi/kilocode.json index 77affcafd22..a51e4b3fafd 100644 --- a/webview-ui/src/i18n/locales/hi/kilocode.json +++ b/webview-ui/src/i18n/locales/hi/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "आप कैसे शुरू करना चाहेंगे?", + "freeModels": { + "title": "मुफ्त मॉडल", + "description": "तुरंत कोडिंग शुरू करें" + }, + "premiumModels": { + "title": "प्रीमियम मॉडल", + "description": "साइन अप करें और $5 क्रेडिट पाएं" + }, + "byok": { + "title": "अपनी खुद की कुंजी लाएं", + "description": "उन्नत। अपना खुद का खाता या सदस्यता उपयोग करें" + } + }, "welcome": { "greeting": "Kilo Code में आपका स्वागत है!", "introText1": "Kilo Code एक मुफ्त, ओपन सोर्स AI कोडिंग एजेंट है।", diff --git a/webview-ui/src/i18n/locales/id/kilocode.json b/webview-ui/src/i18n/locales/id/kilocode.json index baa3b8ca4fb..9706145ace1 100644 --- a/webview-ui/src/i18n/locales/id/kilocode.json +++ b/webview-ui/src/i18n/locales/id/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "Bagaimana Anda ingin memulai?", + "freeModels": { + "title": "Model gratis", + "description": "Mulai coding segera" + }, + "premiumModels": { + "title": "Model premium", + "description": "Daftar dan dapatkan kredit $5" + }, + "byok": { + "title": "Gunakan kunci sendiri", + "description": "Lanjutan. Gunakan akun atau langganan Anda sendiri" + } + }, "welcome": { "greeting": "Selamat datang di Kilo Code!", "introText1": "Kilo Code adalah agen coding AI gratis dan open source.", diff --git a/webview-ui/src/i18n/locales/it/kilocode.json b/webview-ui/src/i18n/locales/it/kilocode.json index e69c07d3d5d..a36fcb4a03f 100644 --- a/webview-ui/src/i18n/locales/it/kilocode.json +++ b/webview-ui/src/i18n/locales/it/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "Come vorresti iniziare?", + "freeModels": { + "title": "Modelli gratuiti", + "description": "Inizia a programmare subito" + }, + "premiumModels": { + "title": "Modelli premium", + "description": "Registrati e ricevi 5 $ di crediti" + }, + "byok": { + "title": "Porta la tua chiave", + "description": "Avanzato. Usa il tuo account o abbonamento" + } + }, "welcome": { "greeting": "Benvenuto in Kilo Code!", "introText1": "Kilo Code è un agente di coding AI gratuito e open source.", diff --git a/webview-ui/src/i18n/locales/ja/kilocode.json b/webview-ui/src/i18n/locales/ja/kilocode.json index 0f908b0c24d..976babc3274 100644 --- a/webview-ui/src/i18n/locales/ja/kilocode.json +++ b/webview-ui/src/i18n/locales/ja/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "どのように始めますか?", + "freeModels": { + "title": "無料モデル", + "description": "すぐにコーディングを開始" + }, + "premiumModels": { + "title": "プレミアムモデル", + "description": "登録して5ドルのクレジットを獲得" + }, + "byok": { + "title": "自分のキーを使用", + "description": "上級者向け。自分のアカウントまたはサブスクリプションを使用" + } + }, "welcome": { "greeting": "Kilo Codeへようこそ!", "introText1": "Kilo Codeは無料のオープンソースAIコーディングエージェントです。", diff --git a/webview-ui/src/i18n/locales/ko/kilocode.json b/webview-ui/src/i18n/locales/ko/kilocode.json index 01148bafe83..955e6c06b4f 100644 --- a/webview-ui/src/i18n/locales/ko/kilocode.json +++ b/webview-ui/src/i18n/locales/ko/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "어떻게 시작하시겠습니까?", + "freeModels": { + "title": "무료 모델", + "description": "바로 코딩 시작" + }, + "premiumModels": { + "title": "프리미엄 모델", + "description": "가입하고 5달러 크레딧 받기" + }, + "byok": { + "title": "내 키 사용", + "description": "고급. 본인 계정 또는 구독 사용" + } + }, "welcome": { "greeting": "Kilo Code에 오신 것을 환영합니다!", "introText1": "Kilo Code는 무료 오픈소스 AI 코딩 에이전트입니다.", diff --git a/webview-ui/src/i18n/locales/nl/kilocode.json b/webview-ui/src/i18n/locales/nl/kilocode.json index 9b0ccaeea1a..5df2cd05563 100644 --- a/webview-ui/src/i18n/locales/nl/kilocode.json +++ b/webview-ui/src/i18n/locales/nl/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "Hoe wil je beginnen?", + "freeModels": { + "title": "Gratis modellen", + "description": "Begin direct met coderen" + }, + "premiumModels": { + "title": "Premium modellen", + "description": "Meld je aan en ontvang $5 tegoed" + }, + "byok": { + "title": "Gebruik je eigen sleutel", + "description": "Geavanceerd. Gebruik je eigen account of abonnement" + } + }, "welcome": { "greeting": "Welkom bij Kilo Code!", "introText1": "Kilo Code is een gratis, open source AI coding agent.", diff --git a/webview-ui/src/i18n/locales/pl/kilocode.json b/webview-ui/src/i18n/locales/pl/kilocode.json index b0fb589e6a0..7e6231f0560 100644 --- a/webview-ui/src/i18n/locales/pl/kilocode.json +++ b/webview-ui/src/i18n/locales/pl/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "Jak chcesz zacząć?", + "freeModels": { + "title": "Darmowe modele", + "description": "Zacznij kodować od razu" + }, + "premiumModels": { + "title": "Modele premium", + "description": "Zarejestruj się i otrzymaj 5 $ kredytu" + }, + "byok": { + "title": "Użyj własnego klucza", + "description": "Zaawansowane. Użyj własnego konta lub subskrypcji" + } + }, "welcome": { "greeting": "Witaj w Kilo Code!", "introText1": "Kilo Code to darmowy, otwartoźródłowy agent kodowania AI.", diff --git a/webview-ui/src/i18n/locales/pt-BR/kilocode.json b/webview-ui/src/i18n/locales/pt-BR/kilocode.json index 22f344b2dae..3d617fe109e 100644 --- a/webview-ui/src/i18n/locales/pt-BR/kilocode.json +++ b/webview-ui/src/i18n/locales/pt-BR/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "Como você gostaria de começar?", + "freeModels": { + "title": "Modelos gratuitos", + "description": "Comece a programar imediatamente" + }, + "premiumModels": { + "title": "Modelos premium", + "description": "Cadastre-se e receba US$ 5 em créditos" + }, + "byok": { + "title": "Traga sua própria chave", + "description": "Avançado. Use sua própria conta ou assinatura" + } + }, "welcome": { "greeting": "Bem-vindo ao Kilo Code!", "introText1": "Kilo Code é um agente de codificação AI gratuito e de código aberto.", diff --git a/webview-ui/src/i18n/locales/ru/kilocode.json b/webview-ui/src/i18n/locales/ru/kilocode.json index 60607d116c7..c9af549d751 100644 --- a/webview-ui/src/i18n/locales/ru/kilocode.json +++ b/webview-ui/src/i18n/locales/ru/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "Как вы хотите начать?", + "freeModels": { + "title": "Бесплатные модели", + "description": "Начните программировать сразу" + }, + "premiumModels": { + "title": "Премиум модели", + "description": "Зарегистрируйтесь и получите $5 кредитов" + }, + "byok": { + "title": "Используйте свой ключ", + "description": "Продвинутый. Используйте свой аккаунт или подписку" + } + }, "welcome": { "greeting": "Добро пожаловать в Kilo Code!", "introText1": "Kilo Code — это бесплатный агент кодирования ИИ с открытым исходным кодом.", diff --git a/webview-ui/src/i18n/locales/th/kilocode.json b/webview-ui/src/i18n/locales/th/kilocode.json index 5ec3373a3df..4f0ae37215f 100644 --- a/webview-ui/src/i18n/locales/th/kilocode.json +++ b/webview-ui/src/i18n/locales/th/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "คุณต้องการเริ่มต้นอย่างไร?", + "freeModels": { + "title": "โมเดลฟรี", + "description": "เริ่มเขียนโค้ดทันที" + }, + "premiumModels": { + "title": "โมเดลพรีเมียม", + "description": "สมัครและรับเครดิต $5" + }, + "byok": { + "title": "ใช้คีย์ของคุณเอง", + "description": "ขั้นสูง ใช้บัญชีหรือการสมัครสมาชิกของคุณเอง" + } + }, "welcome": { "greeting": "ยินดีต้อนรับสู่ Kilo Code!", "introText1": "Kilo Code เป็นเอเจนต์เขียนโค้ด AI แบบฟรีและโอเพ่นซอร์ส", diff --git a/webview-ui/src/i18n/locales/tr/kilocode.json b/webview-ui/src/i18n/locales/tr/kilocode.json index 100a137cda1..d16d8e9dca5 100644 --- a/webview-ui/src/i18n/locales/tr/kilocode.json +++ b/webview-ui/src/i18n/locales/tr/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "Nasıl başlamak istersiniz?", + "freeModels": { + "title": "Ücretsiz modeller", + "description": "Hemen kodlamaya başlayın" + }, + "premiumModels": { + "title": "Premium modeller", + "description": "Kaydolun ve 5 $ kredi kazanın" + }, + "byok": { + "title": "Kendi anahtarınızı kullanın", + "description": "Gelişmiş. Kendi hesabınızı veya aboneliğinizi kullanın" + } + }, "welcome": { "greeting": "Kilo Code'a hoş geldiniz!", "introText1": "Kilo Code ücretsiz, açık kaynaklı bir AI kodlama ajanıdır.", diff --git a/webview-ui/src/i18n/locales/uk/kilocode.json b/webview-ui/src/i18n/locales/uk/kilocode.json index 4d034a155aa..66e44483fb8 100644 --- a/webview-ui/src/i18n/locales/uk/kilocode.json +++ b/webview-ui/src/i18n/locales/uk/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "Як ви хочете почати?", + "freeModels": { + "title": "Безкоштовні моделі", + "description": "Почніть програмувати одразу" + }, + "premiumModels": { + "title": "Преміум моделі", + "description": "Зареєструйтесь і отримайте $5 кредитів" + }, + "byok": { + "title": "Використовуйте свій ключ", + "description": "Розширений. Використовуйте свій обліковий запис або підписку" + } + }, "welcome": { "greeting": "Ласкаво просимо до Kilo Code!", "introText1": "Kilo Code — це безкоштовний агент кодування AI з відкритим кодом.", diff --git a/webview-ui/src/i18n/locales/vi/kilocode.json b/webview-ui/src/i18n/locales/vi/kilocode.json index f65b36e4ab6..f657e811098 100644 --- a/webview-ui/src/i18n/locales/vi/kilocode.json +++ b/webview-ui/src/i18n/locales/vi/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "Bạn muốn bắt đầu như thế nào?", + "freeModels": { + "title": "Mô hình miễn phí", + "description": "Bắt đầu lập trình ngay" + }, + "premiumModels": { + "title": "Mô hình cao cấp", + "description": "Đăng ký và nhận $5 tín dụng" + }, + "byok": { + "title": "Sử dụng khóa của bạn", + "description": "Nâng cao. Sử dụng tài khoản hoặc đăng ký của bạn" + } + }, "welcome": { "greeting": "Chào mừng bạn đến với Kilo Code!", "introText1": "Kilo Code là một agent lập trình AI miễn phí và mã nguồn mở.", diff --git a/webview-ui/src/i18n/locales/zh-CN/kilocode.json b/webview-ui/src/i18n/locales/zh-CN/kilocode.json index fe0582446f1..ad66330eb13 100644 --- a/webview-ui/src/i18n/locales/zh-CN/kilocode.json +++ b/webview-ui/src/i18n/locales/zh-CN/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "你想如何开始?", + "freeModels": { + "title": "免费模型", + "description": "立即开始编程" + }, + "premiumModels": { + "title": "高级模型", + "description": "注册并获得 5 美元额度" + }, + "byok": { + "title": "使用自己的密钥", + "description": "高级选项。使用你自己的账户或订阅" + } + }, "welcome": { "greeting": "欢迎使用 Kilo Code!", "introText1": "Kilo Code 是一个免费的开源 AI 编程代理。", diff --git a/webview-ui/src/i18n/locales/zh-TW/kilocode.json b/webview-ui/src/i18n/locales/zh-TW/kilocode.json index f815aba6bdb..97e9808d20c 100644 --- a/webview-ui/src/i18n/locales/zh-TW/kilocode.json +++ b/webview-ui/src/i18n/locales/zh-TW/kilocode.json @@ -1,4 +1,19 @@ { + "onboarding": { + "title": "想要如何開始?", + "freeModels": { + "title": "免費模型", + "description": "立即開始撰寫程式" + }, + "premiumModels": { + "title": "進階模型", + "description": "註冊並獲得 5 美元額度" + }, + "byok": { + "title": "使用自有金鑰", + "description": "進階選項。使用自有帳戶或訂閱" + } + }, "welcome": { "greeting": "歡迎使用 Kilo Code!", "introText1": "Kilo Code 是一款免費、開放原始碼的 AI Coding Agent。", From f0842279d6251df4ee700bffb274d50797c2f224 Mon Sep 17 00:00:00 2001 From: Kevin van Dijk Date: Fri, 30 Jan 2026 00:50:29 +0100 Subject: [PATCH 03/18] Fix tests --- webview-ui/src/__tests__/App.spec.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/webview-ui/src/__tests__/App.spec.tsx b/webview-ui/src/__tests__/App.spec.tsx index e2454c64969..bfe4b7d7283 100644 --- a/webview-ui/src/__tests__/App.spec.tsx +++ b/webview-ui/src/__tests__/App.spec.tsx @@ -175,6 +175,10 @@ describe("App", () => { didHydrateState: true, showWelcome: false, shouldShowAnnouncement: false, + // kilocode_change start: avoid rendering onboarding screen in App tests + hasCompletedOnboarding: true, + taskHistoryFullLength: 1, + // kilocode_change end experiments: {}, language: "en", telemetrySetting: "enabled", From 66dbaf2dac3f0d1163b7a9409805d32a9a80af1c Mon Sep 17 00:00:00 2001 From: Kevin van Dijk Date: Fri, 30 Jan 2026 00:54:55 +0100 Subject: [PATCH 04/18] Add changeset --- .changeset/loud-jokes-send.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/loud-jokes-send.md diff --git a/.changeset/loud-jokes-send.md b/.changeset/loud-jokes-send.md new file mode 100644 index 00000000000..04c65d674f3 --- /dev/null +++ b/.changeset/loud-jokes-send.md @@ -0,0 +1,5 @@ +--- +"kilo-code": minor +--- + +Add new welcome screen for improved onboarding From 0e8481f625c155051812fe01ba547925c2a42e1d Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Fri, 30 Jan 2026 11:18:51 +0100 Subject: [PATCH 05/18] Apply feedback and remove old welcome screen --- webview-ui/src/App.tsx | 21 ++-- .../kilocode/welcome/WelcomeView.tsx | 96 ------------------- 2 files changed, 8 insertions(+), 109 deletions(-) delete mode 100644 webview-ui/src/components/kilocode/welcome/WelcomeView.tsx diff --git a/webview-ui/src/App.tsx b/webview-ui/src/App.tsx index 688cd3f9b57..0ef734fd995 100644 --- a/webview-ui/src/App.tsx +++ b/webview-ui/src/App.tsx @@ -14,7 +14,6 @@ import { ExtensionStateContextProvider, useExtensionState } from "./context/Exte import ChatView, { ChatViewRef } from "./components/chat/ChatView" import HistoryView from "./components/history/HistoryView" import SettingsView, { SettingsViewRef } from "./components/settings/SettingsView" -import WelcomeView from "./components/kilocode/welcome/WelcomeView" // kilocode_change import OnboardingView from "./components/kilocode/welcome/OnboardingView" // kilocode_change import ProfileView from "./components/kilocode/profile/ProfileView" // kilocode_change import McpView from "./components/mcp/McpView" // kilocode_change @@ -81,7 +80,6 @@ const defaultSectionByAction: Partial { const { didHydrateState, - showWelcome, shouldShowAnnouncement, telemetrySetting, telemetryKey, @@ -341,6 +339,13 @@ const App = () => { switchTab("settings") setCurrentSection("providers") }, [switchTab]) + + // One-time migration: mark existing users as having completed onboarding + useEffect(() => { + if (hasCompletedOnboarding !== true && (taskHistoryFullLength ?? 0) > 0) { + vscode.postMessage({ type: "hasCompletedOnboarding", bool: true }) + } + }, [hasCompletedOnboarding, taskHistoryFullLength]) // kilocode_change end if (!didHydrateState) { @@ -348,26 +353,16 @@ const App = () => { } // kilocode_change start: Show OnboardingView for new users who haven't completed onboarding - // Show onboarding only if: - // 1. hasCompletedOnboarding is not true (undefined or false) - // 2. AND user has no task history (meaning they're truly new, not an existing user upgrading) - // - // This ensures existing users who upgrade don't see the onboarding screen, - // while new users who have never used the extension will see it. - const isExistingUser = (taskHistoryFullLength ?? 0) > 0 - const showOnboarding = hasCompletedOnboarding !== true && !isExistingUser + const showOnboarding = hasCompletedOnboarding !== true // Do not conditionally load ChatView, it's expensive and there's state we // don't want to lose (user input, disableInput, askResponse promise, etc.) - // kilocode_change: no WelcomeViewProvider toggle return showOnboarding ? ( - ) : showWelcome ? ( - ) : ( // kilocode_change end <> diff --git a/webview-ui/src/components/kilocode/welcome/WelcomeView.tsx b/webview-ui/src/components/kilocode/welcome/WelcomeView.tsx deleted file mode 100644 index 8f7510ff999..00000000000 --- a/webview-ui/src/components/kilocode/welcome/WelcomeView.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import { useCallback, useState, useEffect, useRef } from "react" -import { useExtensionState } from "../../../context/ExtensionStateContext" -import { validateApiConfiguration } from "../../../utils/validate" -import { vscode } from "../../../utils/vscode" -import { Tab, TabContent } from "../../common/Tab" -import { useAppTranslation } from "../../../i18n/TranslationContext" -import { ButtonPrimary } from "../common/ButtonPrimary" -import { ButtonLink } from "../common/ButtonLink" -import ApiOptions from "../../settings/ApiOptions" -import KiloCodeAuth from "../common/KiloCodeAuth" -import { getKiloCodeBackendSignInUrl } from "../helpers" - -const WelcomeView = () => { - const { - apiConfiguration, - currentApiConfigName, - setApiConfiguration, - uriScheme, - uiKind, - kiloCodeWrapperProperties, - } = useExtensionState() - const [errorMessage, setErrorMessage] = useState() - const [manualConfig, setManualConfig] = useState(false) - const { t } = useAppTranslation() - const pendingActivation = useRef(null) - - // Listen for state updates to activate profile after save completes - useEffect(() => { - const handleMessage = (event: MessageEvent) => { - const message = event.data - // When we receive a state update and have a pending activation, activate the profile - if (message.type === "state" && pendingActivation.current) { - const profileToActivate = pendingActivation.current - pendingActivation.current = null - // Activate the profile now that it's been saved - vscode.postMessage({ type: "loadApiConfiguration", text: profileToActivate }) - } - } - - window.addEventListener("message", handleMessage) - return () => window.removeEventListener("message", handleMessage) - }, []) - - const handleSubmit = useCallback(() => { - const error = apiConfiguration ? validateApiConfiguration(apiConfiguration) : undefined - - if (error) { - setErrorMessage(error) - return - } - - setErrorMessage(undefined) - // Mark that we want to activate this profile after save completes - pendingActivation.current = currentApiConfigName - // Save the configuration - activation will happen when state update is received - vscode.postMessage({ type: "upsertApiConfiguration", text: currentApiConfigName, apiConfiguration }) - }, [apiConfiguration, currentApiConfigName]) - - const isSettingUpKiloCode = - !apiConfiguration?.apiProvider || - (apiConfiguration?.apiProvider === "kilocode" && !apiConfiguration?.kilocodeToken) - - return ( - - - {manualConfig ? ( - <> - setApiConfiguration({ [field]: value })} - errorMessage={errorMessage} - setErrorMessage={setErrorMessage} - hideKiloCodeButton - /> - {isSettingUpKiloCode ? ( - - {t("kilocode:settings.provider.login")} - - ) : ( - {t("welcome:start")} - )} - - ) : ( -
- setManualConfig(true)} /> -
- )} -
-
- ) -} - -export default WelcomeView From d5040cfe03a198dc39abb091db45901c66b4547e Mon Sep 17 00:00:00 2001 From: Joshua Lambert <25085430+lambertjosh@users.noreply.github.com> Date: Fri, 30 Jan 2026 05:27:15 -0500 Subject: [PATCH 06/18] Update webview-ui/src/i18n/locales/en/kilocode.json --- webview-ui/src/i18n/locales/en/kilocode.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webview-ui/src/i18n/locales/en/kilocode.json b/webview-ui/src/i18n/locales/en/kilocode.json index c7e5a19edeb..ff65a6c5902 100644 --- a/webview-ui/src/i18n/locales/en/kilocode.json +++ b/webview-ui/src/i18n/locales/en/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "Premium models", - "description": "Sign up and receive $5 in credits" + "description": "Sign up - new users receive $5 in credits" }, "byok": { "title": "Bring my own Key", From dd9ff725fcd16b0f0810035a42a1213fdd1f617e Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Fri, 30 Jan 2026 11:33:58 +0100 Subject: [PATCH 07/18] Refresh translations --- webview-ui/src/i18n/locales/ar/kilocode.json | 2 +- webview-ui/src/i18n/locales/ca/kilocode.json | 2 +- webview-ui/src/i18n/locales/cs/kilocode.json | 2 +- webview-ui/src/i18n/locales/de/kilocode.json | 2 +- webview-ui/src/i18n/locales/en/kilocode.json | 2 +- webview-ui/src/i18n/locales/es/kilocode.json | 2 +- webview-ui/src/i18n/locales/fr/kilocode.json | 2 +- webview-ui/src/i18n/locales/hi/kilocode.json | 2 +- webview-ui/src/i18n/locales/id/kilocode.json | 2 +- webview-ui/src/i18n/locales/it/kilocode.json | 2 +- webview-ui/src/i18n/locales/ja/kilocode.json | 2 +- webview-ui/src/i18n/locales/ko/kilocode.json | 2 +- webview-ui/src/i18n/locales/nl/kilocode.json | 2 +- webview-ui/src/i18n/locales/pl/kilocode.json | 2 +- webview-ui/src/i18n/locales/pt-BR/kilocode.json | 2 +- webview-ui/src/i18n/locales/ru/kilocode.json | 2 +- webview-ui/src/i18n/locales/th/kilocode.json | 2 +- webview-ui/src/i18n/locales/tr/kilocode.json | 2 +- webview-ui/src/i18n/locales/uk/kilocode.json | 2 +- webview-ui/src/i18n/locales/vi/kilocode.json | 2 +- webview-ui/src/i18n/locales/zh-CN/kilocode.json | 2 +- webview-ui/src/i18n/locales/zh-TW/kilocode.json | 2 +- 22 files changed, 22 insertions(+), 22 deletions(-) diff --git a/webview-ui/src/i18n/locales/ar/kilocode.json b/webview-ui/src/i18n/locales/ar/kilocode.json index c0217e695c1..e35a1a06658 100644 --- a/webview-ui/src/i18n/locales/ar/kilocode.json +++ b/webview-ui/src/i18n/locales/ar/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "نماذج متميزة", - "description": "سجّل واحصل على رصيد بقيمة 5 دولارات" + "description": "سجّل. المستخدمون الجدد يحصلون على رصيد بقيمة 5 دولارات" }, "byok": { "title": "استخدم مفتاحك الخاص", diff --git a/webview-ui/src/i18n/locales/ca/kilocode.json b/webview-ui/src/i18n/locales/ca/kilocode.json index 7b3bcd1d5a4..53928db72ac 100644 --- a/webview-ui/src/i18n/locales/ca/kilocode.json +++ b/webview-ui/src/i18n/locales/ca/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "Models premium", - "description": "Registra't i rep 5 $ en crèdits" + "description": "Registra't. Els nous usuaris reben 5 $ en crèdits" }, "byok": { "title": "Porta la teva pròpia clau", diff --git a/webview-ui/src/i18n/locales/cs/kilocode.json b/webview-ui/src/i18n/locales/cs/kilocode.json index 887c28c96f2..06c2e70bafd 100644 --- a/webview-ui/src/i18n/locales/cs/kilocode.json +++ b/webview-ui/src/i18n/locales/cs/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "Prémiové modely", - "description": "Zaregistruj se a získej kredit 5 $" + "description": "Zaregistruj se. Noví uživatelé získají kredit 5 $" }, "byok": { "title": "Použij vlastní klíč", diff --git a/webview-ui/src/i18n/locales/de/kilocode.json b/webview-ui/src/i18n/locales/de/kilocode.json index 0ad1cc6368c..0d3af5b76f9 100644 --- a/webview-ui/src/i18n/locales/de/kilocode.json +++ b/webview-ui/src/i18n/locales/de/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "Premium-Modelle", - "description": "Registrieren und 5 $ Guthaben erhalten" + "description": "Registrieren. Neue Nutzer erhalten 5 $ Guthaben" }, "byok": { "title": "Eigenen Schlüssel verwenden", diff --git a/webview-ui/src/i18n/locales/en/kilocode.json b/webview-ui/src/i18n/locales/en/kilocode.json index ff65a6c5902..13b12bc7258 100644 --- a/webview-ui/src/i18n/locales/en/kilocode.json +++ b/webview-ui/src/i18n/locales/en/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "Premium models", - "description": "Sign up - new users receive $5 in credits" + "description": "Sign up. New users get $5 in credits" }, "byok": { "title": "Bring my own Key", diff --git a/webview-ui/src/i18n/locales/es/kilocode.json b/webview-ui/src/i18n/locales/es/kilocode.json index 0f94c4007e8..d872fb2b7b9 100644 --- a/webview-ui/src/i18n/locales/es/kilocode.json +++ b/webview-ui/src/i18n/locales/es/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "Modelos premium", - "description": "Regístrate y recibe 5 $ en créditos" + "description": "Regístrate. Los nuevos usuarios reciben 5 $ en créditos" }, "byok": { "title": "Usa tu propia clave", diff --git a/webview-ui/src/i18n/locales/fr/kilocode.json b/webview-ui/src/i18n/locales/fr/kilocode.json index 08c16dbaae2..e5cd0d21d0a 100644 --- a/webview-ui/src/i18n/locales/fr/kilocode.json +++ b/webview-ui/src/i18n/locales/fr/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "Modèles premium", - "description": "Inscrivez-vous et recevez 5 $ de crédits" + "description": "Inscrivez-vous. Les nouveaux utilisateurs reçoivent 5 $ de crédits" }, "byok": { "title": "Apportez votre propre clé", diff --git a/webview-ui/src/i18n/locales/hi/kilocode.json b/webview-ui/src/i18n/locales/hi/kilocode.json index a51e4b3fafd..55b1b65fcd2 100644 --- a/webview-ui/src/i18n/locales/hi/kilocode.json +++ b/webview-ui/src/i18n/locales/hi/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "प्रीमियम मॉडल", - "description": "साइन अप करें और $5 क्रेडिट पाएं" + "description": "साइन अप करें। नए उपयोगकर्ताओं को $5 क्रेडिट मिलता है" }, "byok": { "title": "अपनी खुद की कुंजी लाएं", diff --git a/webview-ui/src/i18n/locales/id/kilocode.json b/webview-ui/src/i18n/locales/id/kilocode.json index 9706145ace1..659736e56d4 100644 --- a/webview-ui/src/i18n/locales/id/kilocode.json +++ b/webview-ui/src/i18n/locales/id/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "Model premium", - "description": "Daftar dan dapatkan kredit $5" + "description": "Daftar. Pengguna baru mendapatkan kredit $5" }, "byok": { "title": "Gunakan kunci sendiri", diff --git a/webview-ui/src/i18n/locales/it/kilocode.json b/webview-ui/src/i18n/locales/it/kilocode.json index a36fcb4a03f..ee4e62992f8 100644 --- a/webview-ui/src/i18n/locales/it/kilocode.json +++ b/webview-ui/src/i18n/locales/it/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "Modelli premium", - "description": "Registrati e ricevi 5 $ di crediti" + "description": "Registrati. I nuovi utenti ricevono 5 $ di crediti" }, "byok": { "title": "Porta la tua chiave", diff --git a/webview-ui/src/i18n/locales/ja/kilocode.json b/webview-ui/src/i18n/locales/ja/kilocode.json index 976babc3274..0b61f058c88 100644 --- a/webview-ui/src/i18n/locales/ja/kilocode.json +++ b/webview-ui/src/i18n/locales/ja/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "プレミアムモデル", - "description": "登録して5ドルのクレジットを獲得" + "description": "登録。新規ユーザーは5ドルのクレジットを獲得" }, "byok": { "title": "自分のキーを使用", diff --git a/webview-ui/src/i18n/locales/ko/kilocode.json b/webview-ui/src/i18n/locales/ko/kilocode.json index 955e6c06b4f..37fa0f6a4bc 100644 --- a/webview-ui/src/i18n/locales/ko/kilocode.json +++ b/webview-ui/src/i18n/locales/ko/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "프리미엄 모델", - "description": "가입하고 5달러 크레딧 받기" + "description": "가입하기. 신규 사용자는 5달러 크레딧 제공" }, "byok": { "title": "내 키 사용", diff --git a/webview-ui/src/i18n/locales/nl/kilocode.json b/webview-ui/src/i18n/locales/nl/kilocode.json index 5df2cd05563..c229e6ade86 100644 --- a/webview-ui/src/i18n/locales/nl/kilocode.json +++ b/webview-ui/src/i18n/locales/nl/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "Premium modellen", - "description": "Meld je aan en ontvang $5 tegoed" + "description": "Meld je aan. Nieuwe gebruikers ontvangen $5 tegoed" }, "byok": { "title": "Gebruik je eigen sleutel", diff --git a/webview-ui/src/i18n/locales/pl/kilocode.json b/webview-ui/src/i18n/locales/pl/kilocode.json index 7e6231f0560..71ff7db31c9 100644 --- a/webview-ui/src/i18n/locales/pl/kilocode.json +++ b/webview-ui/src/i18n/locales/pl/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "Modele premium", - "description": "Zarejestruj się i otrzymaj 5 $ kredytu" + "description": "Zarejestruj się. Nowi użytkownicy otrzymują 5 $ kredytu" }, "byok": { "title": "Użyj własnego klucza", diff --git a/webview-ui/src/i18n/locales/pt-BR/kilocode.json b/webview-ui/src/i18n/locales/pt-BR/kilocode.json index 3d617fe109e..272317ca87d 100644 --- a/webview-ui/src/i18n/locales/pt-BR/kilocode.json +++ b/webview-ui/src/i18n/locales/pt-BR/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "Modelos premium", - "description": "Cadastre-se e receba US$ 5 em créditos" + "description": "Cadastre-se. Novos usuários recebem US$ 5 em créditos" }, "byok": { "title": "Traga sua própria chave", diff --git a/webview-ui/src/i18n/locales/ru/kilocode.json b/webview-ui/src/i18n/locales/ru/kilocode.json index c9af549d751..51d239672f1 100644 --- a/webview-ui/src/i18n/locales/ru/kilocode.json +++ b/webview-ui/src/i18n/locales/ru/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "Премиум модели", - "description": "Зарегистрируйтесь и получите $5 кредитов" + "description": "Зарегистрируйтесь. Новые пользователи получают $5 кредитов" }, "byok": { "title": "Используйте свой ключ", diff --git a/webview-ui/src/i18n/locales/th/kilocode.json b/webview-ui/src/i18n/locales/th/kilocode.json index 4f0ae37215f..0f14ec0c414 100644 --- a/webview-ui/src/i18n/locales/th/kilocode.json +++ b/webview-ui/src/i18n/locales/th/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "โมเดลพรีเมียม", - "description": "สมัครและรับเครดิต $5" + "description": "สมัคร ผู้ใช้ใหม่จะได้รับเครดิต $5" }, "byok": { "title": "ใช้คีย์ของคุณเอง", diff --git a/webview-ui/src/i18n/locales/tr/kilocode.json b/webview-ui/src/i18n/locales/tr/kilocode.json index d16d8e9dca5..d93b05fedc2 100644 --- a/webview-ui/src/i18n/locales/tr/kilocode.json +++ b/webview-ui/src/i18n/locales/tr/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "Premium modeller", - "description": "Kaydolun ve 5 $ kredi kazanın" + "description": "Kaydolun. Yeni kullanıcılar 5 $ kredi alır" }, "byok": { "title": "Kendi anahtarınızı kullanın", diff --git a/webview-ui/src/i18n/locales/uk/kilocode.json b/webview-ui/src/i18n/locales/uk/kilocode.json index 66e44483fb8..f1ef2633690 100644 --- a/webview-ui/src/i18n/locales/uk/kilocode.json +++ b/webview-ui/src/i18n/locales/uk/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "Преміум моделі", - "description": "Зареєструйтесь і отримайте $5 кредитів" + "description": "Зареєструйтесь. Нові користувачі отримують $5 кредитів" }, "byok": { "title": "Використовуйте свій ключ", diff --git a/webview-ui/src/i18n/locales/vi/kilocode.json b/webview-ui/src/i18n/locales/vi/kilocode.json index f657e811098..82855b6ca8b 100644 --- a/webview-ui/src/i18n/locales/vi/kilocode.json +++ b/webview-ui/src/i18n/locales/vi/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "Mô hình cao cấp", - "description": "Đăng ký và nhận $5 tín dụng" + "description": "Đăng ký. Người dùng mới nhận $5 tín dụng" }, "byok": { "title": "Sử dụng khóa của bạn", diff --git a/webview-ui/src/i18n/locales/zh-CN/kilocode.json b/webview-ui/src/i18n/locales/zh-CN/kilocode.json index ad66330eb13..9b9d64e8d0d 100644 --- a/webview-ui/src/i18n/locales/zh-CN/kilocode.json +++ b/webview-ui/src/i18n/locales/zh-CN/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "高级模型", - "description": "注册并获得 5 美元额度" + "description": "注册。新用户可获得 5 美元额度" }, "byok": { "title": "使用自己的密钥", diff --git a/webview-ui/src/i18n/locales/zh-TW/kilocode.json b/webview-ui/src/i18n/locales/zh-TW/kilocode.json index 97e9808d20c..13a573d5dcc 100644 --- a/webview-ui/src/i18n/locales/zh-TW/kilocode.json +++ b/webview-ui/src/i18n/locales/zh-TW/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "進階模型", - "description": "註冊並獲得 5 美元額度" + "description": "註冊。新用戶可獲得 5 美元額度" }, "byok": { "title": "使用自有金鑰", From 3d63d9cb49222aefcb481a77a1587c77ecbfe4ec Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Fri, 30 Jan 2026 11:51:52 +0100 Subject: [PATCH 08/18] Fix erroneous comment --- webview-ui/src/App.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/webview-ui/src/App.tsx b/webview-ui/src/App.tsx index 0ef734fd995..f3fc40bc023 100644 --- a/webview-ui/src/App.tsx +++ b/webview-ui/src/App.tsx @@ -317,10 +317,8 @@ const App = () => { // kilocode_change start: Onboarding handlers const handleSelectFreeModels = useCallback(() => { - // Mark onboarding as complete + // Mark onboarding as complete - the default profile is already set up with a free model vscode.postMessage({ type: "hasCompletedOnboarding", bool: true }) - // The default profile is already set up with a free model, so just close welcome - // This will trigger a state update that sets showWelcome to false }, []) const handleSelectPremiumModels = useCallback(() => { From 29b02df01ce31156d955b8e6a157557184960baa Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Fri, 30 Jan 2026 11:59:10 +0100 Subject: [PATCH 09/18] Remove back to back change blocks --- src/core/webview/webviewMessageHandler.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index b35eb1ceca9..4d52de2967d 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -1908,13 +1908,11 @@ export const webviewMessageHandler = async ( await updateGlobalState("hasOpenedModeSelector", message.bool ?? true) await provider.postStateToWebview() break - // kilocode_change start: Handle onboarding completion + // kilocode_change start case "hasCompletedOnboarding": await updateGlobalState("hasCompletedOnboarding", message.bool ?? true) await provider.postStateToWebview() break - // kilocode_change end - // kilocode_change start case "kiloCodeImageApiKey": await provider.contextProxy.setValue("kiloCodeImageApiKey", message.text) await provider.postStateToWebview() @@ -1927,22 +1925,18 @@ export const webviewMessageHandler = async ( await updateGlobalState("showTaskTimeline", message.bool ?? false) await provider.postStateToWebview() break - // kilocode_change start case "sendMessageOnEnter": await updateGlobalState("sendMessageOnEnter", message.bool ?? false) await provider.postStateToWebview() break - // kilocode_change end case "showTimestamps": await updateGlobalState("showTimestamps", message.bool ?? false) await provider.postStateToWebview() break - // kilocode_change start case "showDiffStats": await updateGlobalState("showDiffStats", message.bool ?? true) await provider.postStateToWebview() break - // kilocode_change end case "hideCostBelowThreshold": await updateGlobalState("hideCostBelowThreshold", message.value) await provider.postStateToWebview() From 0701ceddf4f1b8d950d25f035b0ac36f69fc2557 Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Fri, 30 Jan 2026 12:31:32 +0100 Subject: [PATCH 10/18] Fix kilocode_change blocks --- src/core/webview/webviewMessageHandler.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 4d52de2967d..771756821d0 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -1929,14 +1929,17 @@ export const webviewMessageHandler = async ( await updateGlobalState("sendMessageOnEnter", message.bool ?? false) await provider.postStateToWebview() break + // kilocode_change end case "showTimestamps": await updateGlobalState("showTimestamps", message.bool ?? false) await provider.postStateToWebview() break + // kilocode_change start case "showDiffStats": await updateGlobalState("showDiffStats", message.bool ?? true) await provider.postStateToWebview() break + // kilocode_change end case "hideCostBelowThreshold": await updateGlobalState("hideCostBelowThreshold", message.value) await provider.postStateToWebview() @@ -1945,7 +1948,6 @@ export const webviewMessageHandler = async ( await updateGlobalState("allowVeryLargeReads", message.bool ?? false) await provider.postStateToWebview() break - // kilocode_change end case "setReasoningBlockCollapsed": await updateGlobalState("reasoningBlockCollapsed", message.bool ?? true) From 7b3ad0332de89d6145a2089d7afb23134f37752e Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Fri, 30 Jan 2026 17:22:43 +0100 Subject: [PATCH 11/18] fix kilocode change blocks --- src/core/webview/webviewMessageHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 771756821d0..1fb6e8dc9f5 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -1939,7 +1939,6 @@ export const webviewMessageHandler = async ( await updateGlobalState("showDiffStats", message.bool ?? true) await provider.postStateToWebview() break - // kilocode_change end case "hideCostBelowThreshold": await updateGlobalState("hideCostBelowThreshold", message.value) await provider.postStateToWebview() @@ -1948,6 +1947,7 @@ export const webviewMessageHandler = async ( await updateGlobalState("allowVeryLargeReads", message.bool ?? false) await provider.postStateToWebview() break + // kilocode_change end case "setReasoningBlockCollapsed": await updateGlobalState("reasoningBlockCollapsed", message.bool ?? true) From 91339a2bf91101e93b9b5fa35d1acf3b4f561f36 Mon Sep 17 00:00:00 2001 From: Joshua Lambert <25085430+lambertjosh@users.noreply.github.com> Date: Fri, 30 Jan 2026 12:49:42 -0500 Subject: [PATCH 12/18] Update webview-ui/src/i18n/locales/de/kilocode.json Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com> --- webview-ui/src/i18n/locales/de/kilocode.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webview-ui/src/i18n/locales/de/kilocode.json b/webview-ui/src/i18n/locales/de/kilocode.json index 0d3af5b76f9..1e7a8640de6 100644 --- a/webview-ui/src/i18n/locales/de/kilocode.json +++ b/webview-ui/src/i18n/locales/de/kilocode.json @@ -7,7 +7,7 @@ }, "premiumModels": { "title": "Premium-Modelle", - "description": "Registrieren. Neue Nutzer erhalten 5 $ Guthaben" + "description": "Registriere dich. Neue Nutzer erhalten 5 $ Guthaben" }, "byok": { "title": "Eigenen Schlüssel verwenden", From 5d2f26e5ee8bc8f6f597bd8733645caa6e7ce683 Mon Sep 17 00:00:00 2001 From: Joshua Lambert <25085430+lambertjosh@users.noreply.github.com> Date: Fri, 30 Jan 2026 12:50:47 -0500 Subject: [PATCH 13/18] Update webview-ui/src/context/ExtensionStateContext.tsx Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com> --- webview-ui/src/context/ExtensionStateContext.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webview-ui/src/context/ExtensionStateContext.tsx b/webview-ui/src/context/ExtensionStateContext.tsx index 1612cf22b2a..179fe2e47e0 100644 --- a/webview-ui/src/context/ExtensionStateContext.tsx +++ b/webview-ui/src/context/ExtensionStateContext.tsx @@ -711,7 +711,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode enterBehavior: state.enterBehavior ?? "send", setEnterBehavior: (value) => setState((prevState) => ({ ...prevState, enterBehavior: value })), setHasOpenedModeSelector: (value) => setState((prevState) => ({ ...prevState, hasOpenedModeSelector: value })), - hasCompletedOnboarding: state.hasCompletedOnboarding ?? false, // kilocode_change + hasCompletedOnboarding: state.hasCompletedOnboarding, // kilocode_change setHasCompletedOnboarding: (value) => setState((prevState) => ({ ...prevState, hasCompletedOnboarding: value })), // kilocode_change setAutoCondenseContext: (value) => setState((prevState) => ({ ...prevState, autoCondenseContext: value })), From e101e119374b3e0053b98a1006b4815bc803c818 Mon Sep 17 00:00:00 2001 From: Joshua Lambert <25085430+lambertjosh@users.noreply.github.com> Date: Fri, 30 Jan 2026 12:51:40 -0500 Subject: [PATCH 14/18] Update webview-ui/src/context/ExtensionStateContext.tsx Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com> --- webview-ui/src/context/ExtensionStateContext.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webview-ui/src/context/ExtensionStateContext.tsx b/webview-ui/src/context/ExtensionStateContext.tsx index 179fe2e47e0..8133b876354 100644 --- a/webview-ui/src/context/ExtensionStateContext.tsx +++ b/webview-ui/src/context/ExtensionStateContext.tsx @@ -95,7 +95,7 @@ export interface ExtensionStateContextType extends ExtensionState { mdmCompliant?: boolean hasOpenedModeSelector: boolean // New property to track if user has opened mode selector setHasOpenedModeSelector: (value: boolean) => void // Setter for the new property - hasCompletedOnboarding: boolean // kilocode_change: Track if user has completed onboarding flow + hasCompletedOnboarding?: boolean // kilocode_change: Track if user has completed onboarding flow setHasCompletedOnboarding: (value: boolean) => void // kilocode_change alwaysAllowFollowupQuestions: boolean // New property for follow-up questions auto-approve setAlwaysAllowFollowupQuestions: (value: boolean) => void // Setter for the new property From 22d09fe593baacd0b72b7995b1484e1f49d83406 Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Sat, 31 Jan 2026 14:09:02 +0100 Subject: [PATCH 15/18] Actually fix kilocode change blocks --- src/core/webview/webviewMessageHandler.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 1fb6e8dc9f5..4579431cd75 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -1925,6 +1925,7 @@ export const webviewMessageHandler = async ( await updateGlobalState("showTaskTimeline", message.bool ?? false) await provider.postStateToWebview() break + // kilocode_change start case "sendMessageOnEnter": await updateGlobalState("sendMessageOnEnter", message.bool ?? false) await provider.postStateToWebview() @@ -1939,6 +1940,7 @@ export const webviewMessageHandler = async ( await updateGlobalState("showDiffStats", message.bool ?? true) await provider.postStateToWebview() break + // kilocode_change end case "hideCostBelowThreshold": await updateGlobalState("hideCostBelowThreshold", message.value) await provider.postStateToWebview() From e0e6d033f362e8092265f6f0fb4bfcfaba05d6d4 Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Sat, 31 Jan 2026 14:32:25 +0100 Subject: [PATCH 16/18] Fix old kilocode change issue --- src/core/webview/webviewMessageHandler.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 4579431cd75..14adf0de353 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -1925,7 +1925,6 @@ export const webviewMessageHandler = async ( await updateGlobalState("showTaskTimeline", message.bool ?? false) await provider.postStateToWebview() break - // kilocode_change start case "sendMessageOnEnter": await updateGlobalState("sendMessageOnEnter", message.bool ?? false) await provider.postStateToWebview() From db04215a4493f4ad0883fff68f3d4eda6bef7ba5 Mon Sep 17 00:00:00 2001 From: Joshua Lambert <25085430+lambertjosh@users.noreply.github.com> Date: Sat, 31 Jan 2026 09:10:22 -0500 Subject: [PATCH 17/18] Apply suggestion from @kiloconnect[bot] Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com> --- webview-ui/src/context/ExtensionStateContext.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webview-ui/src/context/ExtensionStateContext.tsx b/webview-ui/src/context/ExtensionStateContext.tsx index 8133b876354..a51538a4e04 100644 --- a/webview-ui/src/context/ExtensionStateContext.tsx +++ b/webview-ui/src/context/ExtensionStateContext.tsx @@ -294,7 +294,7 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode customCondensingPrompt: "", // Default empty string for custom condensing prompt yoloGatekeeperApiConfigId: "", // kilocode_change: Default empty string for gatekeeper API config ID hasOpenedModeSelector: false, // Default to false (not opened yet) - hasCompletedOnboarding: false, // kilocode_change: Default to false (not completed yet) + hasCompletedOnboarding: undefined, // kilocode_change: Leave unset until extension sends value autoApprovalEnabled: true, customModes: [], maxOpenTabsContext: 20, From b7942ae9190fbe7a845a9a4e28e80e01e86999fa Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Sat, 31 Jan 2026 15:11:12 +0100 Subject: [PATCH 18/18] Add icons --- .../kilocode/welcome/OnboardingView.tsx | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/webview-ui/src/components/kilocode/welcome/OnboardingView.tsx b/webview-ui/src/components/kilocode/welcome/OnboardingView.tsx index 910172deace..8bf38366fcd 100644 --- a/webview-ui/src/components/kilocode/welcome/OnboardingView.tsx +++ b/webview-ui/src/components/kilocode/welcome/OnboardingView.tsx @@ -6,16 +6,23 @@ import { useAppTranslation } from "@/i18n/TranslationContext" interface OnboardingOptionProps { title: string description: string + icon: string onClick: () => void } -const OnboardingOption: React.FC = ({ title, description, onClick }) => { +const OnboardingOption: React.FC = ({ title, description, icon, onClick }) => { return ( ) } @@ -41,18 +48,21 @@ const OnboardingView: React.FC = ({ onSelectFreeModels, onS