From 1ac86e5c3608a4ce742e2686ab8fc7088c462879 Mon Sep 17 00:00:00 2001 From: Alex Alecu Date: Thu, 19 Mar 2026 14:28:59 +0200 Subject: [PATCH 1/6] feat(cli): show config and project paths in /status dialog Display global config path (from Global.Path.config) and project directory in the status dialog so users can quickly verify which config files are being loaded. Paths are shortened with ~ for readability, matching existing TUI conventions. --- .../src/cli/cmd/tui/component/dialog-status.tsx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-status.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-status.tsx index 6c67536598f..45ceea19f8f 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-status.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-status.tsx @@ -5,6 +5,7 @@ import { useDialog } from "@tui/ui/dialog" import { useSync } from "@tui/context/sync" import { For, Match, Switch, Show, createMemo } from "solid-js" import { Installation } from "../../../../installation" +import { Global } from "@/global" // kilocode_change export type DialogStatusProps = {} @@ -53,6 +54,21 @@ export function DialogStatus() { {/* kilocode_change start */} Kilo v{Installation.VERSION} {/* kilocode_change end */} + {/* kilocode_change start */} + + Paths + + Global config {" "} + {Global.Path.config.replace(Global.Path.home, "~")} + + + + Project {" "} + {sync.data.path.directory.replace(Global.Path.home, "~")} + + + + {/* kilocode_change end */} 0} fallback={No MCP Servers}> {Object.keys(sync.data.mcp).length} MCP Servers From 4c8df7d336085f7e796204bb51aedc74d8b68a95 Mon Sep 17 00:00:00 2001 From: Alex Alecu Date: Thu, 19 Mar 2026 14:31:54 +0200 Subject: [PATCH 2/6] feat(cli): show onboarding tip for first-time users on free model MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit First-time users with no connected provider now see a targeted tip on the home screen: 'Using a free model — run /connect to add your API key'. Once a provider is connected or the user has sessions, normal random tip behavior resumes. --- packages/opencode/src/cli/cmd/tui/routes/home.tsx | 14 +++++++++++++- packages/opencode/src/kilocode/components/tips.tsx | 4 ++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/routes/home.tsx b/packages/opencode/src/cli/cmd/tui/routes/home.tsx index eb86fc26515..c72a9e2eb2a 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/home.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/home.tsx @@ -15,6 +15,7 @@ import { Installation } from "@/installation" import { useKV } from "../context/kv" import { useCommandDialog } from "../component/dialog-command" import { KiloNews } from "@/kilocode/components/kilo-news" // kilocode_change +import { useConnected } from "../component/dialog-model" // kilocode_change // TODO: what is the best way to do this? let once = false @@ -38,7 +39,12 @@ export function Home() { const isFirstTimeUser = createMemo(() => sync.data.session.length === 0) const tipsHidden = createMemo(() => kv.get("tips_hidden", false)) const newsHidden = createMemo(() => kv.get("news_hidden", false)) // kilocode_change + // kilocode_change start + const connected = useConnected() + const onboarding = createMemo(() => isFirstTimeUser() && !connected()) + // kilocode_change end const showTips = createMemo(() => { + if (onboarding()) return true // kilocode_change // Don't show tips for first-time users if (isFirstTimeUser()) return false return !tipsHidden() @@ -129,7 +135,13 @@ export function Home() { - + diff --git a/packages/opencode/src/kilocode/components/tips.tsx b/packages/opencode/src/kilocode/components/tips.tsx index b31b9ab3257..d542aa6107d 100644 --- a/packages/opencode/src/kilocode/components/tips.tsx +++ b/packages/opencode/src/kilocode/components/tips.tsx @@ -30,9 +30,9 @@ function parse(tip: string): TipPart[] { return parts } -export function Tips() { +export function Tips(props: { tip?: string }) { const theme = useTheme().theme - const parts = parse(TIPS[Math.floor(Math.random() * TIPS.length)]) + const parts = parse(props.tip ?? TIPS[Math.floor(Math.random() * TIPS.length)]) return ( From 7dee800f97d052a25d3ed3f35825d9f9f4a5a098 Mon Sep 17 00:00:00 2001 From: Alex Alecu Date: Thu, 19 Mar 2026 14:32:22 +0200 Subject: [PATCH 3/6] feat(cli): mention config paths in /status tip Update the existing /status tip to mention config paths alongside MCP servers and system info, directing users to the newly added config section in the status dialog. --- packages/opencode/src/kilocode/components/tips.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opencode/src/kilocode/components/tips.tsx b/packages/opencode/src/kilocode/components/tips.tsx index d542aa6107d..e485afb3274 100644 --- a/packages/opencode/src/kilocode/components/tips.tsx +++ b/packages/opencode/src/kilocode/components/tips.tsx @@ -134,7 +134,7 @@ const TIPS = [ "Run {highlight}kilo debug config{/highlight} to troubleshoot configuration", "Use {highlight}--print-logs{/highlight} flag to see detailed logs in stderr", "Press {highlight}Ctrl+X G{/highlight} or {highlight}/timeline{/highlight} to jump to specific messages", - "Press {highlight}Ctrl+X S{/highlight} or {highlight}/status{/highlight} to see system status info", + "Press {highlight}Ctrl+X S{/highlight} or {highlight}/status{/highlight} to see config paths, MCP servers, and system info", "Enable {highlight}tui.scroll_acceleration{/highlight} for smooth macOS-style scrolling", "Toggle username display in chat via command palette ({highlight}Ctrl+P{/highlight})", "Commit your project's {highlight}AGENTS.md{/highlight} file to Git for team sharing", From c263032282f6ea2199c78579acba68d4d5054cce Mon Sep 17 00:00:00 2001 From: Alex Alecu Date: Thu, 19 Mar 2026 15:03:49 +0200 Subject: [PATCH 4/6] fix(cli): respect tips toggle during onboarding The onboarding tip now honors the tips_hidden setting so users can dismiss it via the command palette if they choose to. --- packages/opencode/src/cli/cmd/tui/routes/home.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/opencode/src/cli/cmd/tui/routes/home.tsx b/packages/opencode/src/cli/cmd/tui/routes/home.tsx index c72a9e2eb2a..039a43bf2f9 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/home.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/home.tsx @@ -44,7 +44,7 @@ export function Home() { const onboarding = createMemo(() => isFirstTimeUser() && !connected()) // kilocode_change end const showTips = createMemo(() => { - if (onboarding()) return true // kilocode_change + if (onboarding()) return !tipsHidden() // kilocode_change // Don't show tips for first-time users if (isFirstTimeUser()) return false return !tipsHidden() From 6d42e22a6eacd61f068c6e367671b66d8663cca7 Mon Sep 17 00:00:00 2001 From: Alex Alecu Date: Thu, 19 Mar 2026 16:01:59 +0200 Subject: [PATCH 5/6] fix(cli): show tips for connected first-time users --- packages/opencode/src/cli/cmd/tui/routes/home.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/routes/home.tsx b/packages/opencode/src/cli/cmd/tui/routes/home.tsx index 039a43bf2f9..9cf976e4da6 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/home.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/home.tsx @@ -44,9 +44,8 @@ export function Home() { const onboarding = createMemo(() => isFirstTimeUser() && !connected()) // kilocode_change end const showTips = createMemo(() => { - if (onboarding()) return !tipsHidden() // kilocode_change - // Don't show tips for first-time users - if (isFirstTimeUser()) return false + if (onboarding()) return !tipsHidden() // kilocode_change - show onboarding tip + // kilocode_change - don't hide tips for connected first-time users return !tipsHidden() }) From 4be714dbf9c497ad27ef3376be534cd97ab6f065 Mon Sep 17 00:00:00 2001 From: Alex Alecu Date: Thu, 19 Mar 2026 16:20:06 +0200 Subject: [PATCH 6/6] fix(cli): exclude anonymous kilo provider from connected check The kilo provider always autoloads with free models and apiKey="anonymous", causing useConnected() to return true even for first-time users without any API key. This prevented the onboarding tip from ever appearing. --- packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx | 5 ++++- packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx index 32ff7bc510a..5aba1eb096f 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-model.tsx @@ -10,8 +10,11 @@ import * as fuzzysort from "fuzzysort" export function useConnected() { const sync = useSync() + // kilocode_change - exclude "kilo" (anonymous autoload) alongside "opencode" return createMemo(() => - sync.data.provider.some((x) => x.id !== "opencode" || Object.values(x.models).some((y) => y.cost?.input !== 0)), + sync.data.provider.some( + (x) => (x.id !== "opencode" && x.id !== "kilo") || Object.values(x.models).some((y) => y.cost?.input !== 0), + ), ) } diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx index 5c5f87b078d..45824208bfe 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx @@ -64,7 +64,10 @@ export function Sidebar(props: { sessionID: string; overlay?: boolean }) { const kv = useKV() const hasProviders = createMemo(() => - sync.data.provider.some((x) => x.id !== "opencode" || Object.values(x.models).some((y) => y.cost?.input !== 0)), + // kilocode_change - exclude "kilo" (anonymous autoload) alongside "opencode" + sync.data.provider.some( + (x) => (x.id !== "opencode" && x.id !== "kilo") || Object.values(x.models).some((y) => y.cost?.input !== 0), + ), ) const gettingStartedDismissed = createMemo(() => kv.get("dismissed_getting_started", false))