From 3b21fdc576ba5b8b8409f354fb5ad66b834aee0f Mon Sep 17 00:00:00 2001 From: Suresh Sivasankaran Date: Tue, 27 Jan 2026 16:13:16 +0100 Subject: [PATCH 1/2] Add user notifications --- .../kilo-gateway/src/api/notifications.ts | 67 ++++++++++++++++++ packages/kilo-gateway/src/index.ts | 1 + packages/kilo-gateway/src/server/routes.ts | 35 ++++++++++ packages/kilo-gateway/src/tui.ts | 7 ++ .../components/dialog-kilo-notifications.tsx | 68 +++++++++++++++++++ .../tui/components/notification-banner.tsx | 52 ++++++++++++++ packages/kilo-gateway/src/types/jsx.d.ts | 1 + packages/kilo-gateway/src/types/tui.d.ts | 1 + .../opencode/src/cli/cmd/tui/routes/home.tsx | 49 ++++++++++++- .../opencode/src/kilocode/docs/migration.md | 50 ++++++++++++++ packages/sdk/js/src/v2/gen/sdk.gen.ts | 21 ++++++ packages/sdk/js/src/v2/gen/types.gen.ts | 36 ++++++++++ 12 files changed, 386 insertions(+), 2 deletions(-) create mode 100644 packages/kilo-gateway/src/api/notifications.ts create mode 100644 packages/kilo-gateway/src/tui/components/dialog-kilo-notifications.tsx create mode 100644 packages/kilo-gateway/src/tui/components/notification-banner.tsx diff --git a/packages/kilo-gateway/src/api/notifications.ts b/packages/kilo-gateway/src/api/notifications.ts new file mode 100644 index 0000000000..bd3c9585bf --- /dev/null +++ b/packages/kilo-gateway/src/api/notifications.ts @@ -0,0 +1,67 @@ +// kilocode_change - new file +import { z } from "zod" + +/** + * Kilo notification schema + */ +export const KilocodeNotificationSchema = z.object({ + id: z.string(), + title: z.string(), + message: z.string(), + action: z + .object({ + actionText: z.string(), + actionURL: z.string(), + }) + .optional(), + showIn: z.array(z.string()).optional(), +}) + +export type KilocodeNotification = z.infer + +const NotificationsResponseSchema = z.object({ + notifications: z.array(KilocodeNotificationSchema), +}) + +const NOTIFICATIONS_TIMEOUT_MS = 5000 + +/** + * Fetch notifications from Kilo API + * + * @param options - Configuration with token and optional organization ID + * @returns Array of notifications filtered for CLI display + */ +export async function fetchKilocodeNotifications(options: { + kilocodeToken?: string + kilocodeOrganizationId?: string +}): Promise { + const token = options.kilocodeToken + if (!token) return [] + + const url = "https://api.kilo.ai/api/users/notifications" + + try { + const response = await fetch(url, { + headers: { + Authorization: `Bearer ${token}`, + "Content-Type": "application/json", + }, + signal: AbortSignal.timeout(NOTIFICATIONS_TIMEOUT_MS), + }) + + if (!response.ok) return [] + + const json = await response.json() + const result = NotificationsResponseSchema.safeParse(json) + + if (!result.success) return [] + + // Filter to show notifications meant for CLI (or no specific target) + // Accept "cli", "extension", or no showIn field (matches old Kilo CLI behavior) + return result.data.notifications.filter( + ({ showIn }) => !showIn || showIn.includes("cli") || showIn.includes("extension"), + ) + } catch { + return [] + } +} diff --git a/packages/kilo-gateway/src/index.ts b/packages/kilo-gateway/src/index.ts index 9306c1598e..b23171f10d 100644 --- a/packages/kilo-gateway/src/index.ts +++ b/packages/kilo-gateway/src/index.ts @@ -33,6 +33,7 @@ export { promptOrganizationSelection, } from "./api/profile.js" export { fetchKiloModels } from "./api/models.js" +export { fetchKilocodeNotifications, type KilocodeNotification } from "./api/notifications.js" // ============================================================================ // Server Routes (optional - requires hono and OpenCode dependencies) diff --git a/packages/kilo-gateway/src/server/routes.ts b/packages/kilo-gateway/src/server/routes.ts index dd2ad11744..d8811e851e 100644 --- a/packages/kilo-gateway/src/server/routes.ts +++ b/packages/kilo-gateway/src/server/routes.ts @@ -7,6 +7,7 @@ */ import { fetchProfile, fetchBalance } from "../api/profile.js" +import { fetchKilocodeNotifications, KilocodeNotificationSchema } from "../api/notifications.js" // Type definitions for OpenCode dependencies (injected at runtime) type Hono = any @@ -161,4 +162,38 @@ export function createKiloRoutes(deps: KiloRoutesDeps) { return c.json(true) }, ) + .get( + "/notifications", + describeRoute({ + summary: "Get Kilo notifications", + description: "Fetch notifications from Kilo Gateway for CLI display", + operationId: "kilo.notifications", + responses: { + 200: { + description: "Notifications list", + content: { + "application/json": { + schema: resolver(z.array(KilocodeNotificationSchema)), + }, + }, + }, + ...errors(400, 401), + }, + }), + async (c: any) => { + const auth = await Auth.get("kilo") + if (!auth) return c.json([]) + + const token = auth.type === "api" ? auth.key : auth.type === "oauth" ? auth.access : undefined + if (!token) return c.json([]) + + const organizationId = auth.type === "oauth" ? auth.accountId : undefined + const notifications = await fetchKilocodeNotifications({ + kilocodeToken: token, + kilocodeOrganizationId: organizationId, + }) + + return c.json(notifications) + }, + ) } diff --git a/packages/kilo-gateway/src/tui.ts b/packages/kilo-gateway/src/tui.ts index b6c2ddff95..497b666121 100644 --- a/packages/kilo-gateway/src/tui.ts +++ b/packages/kilo-gateway/src/tui.ts @@ -25,3 +25,10 @@ export { registerKiloCommands } from "./tui/commands/kilo-commands.js" export { DialogKiloTeamSelect } from "./tui/components/dialog-kilo-team-select.js" export { DialogKiloOrganization } from "./tui/components/dialog-kilo-organization.js" export { KiloAutoMethod } from "./tui/components/dialog-kilo-auto-method.js" +export { NotificationBanner } from "./tui/components/notification-banner.js" +export { DialogKiloNotifications } from "./tui/components/dialog-kilo-notifications.js" + +// ============================================================================ +// Re-exported Types +// ============================================================================ +export type { KilocodeNotification } from "./api/notifications.js" diff --git a/packages/kilo-gateway/src/tui/components/dialog-kilo-notifications.tsx b/packages/kilo-gateway/src/tui/components/dialog-kilo-notifications.tsx new file mode 100644 index 0000000000..6e35dc32b1 --- /dev/null +++ b/packages/kilo-gateway/src/tui/components/dialog-kilo-notifications.tsx @@ -0,0 +1,68 @@ +// kilocode_change - new file +/** + * Kilo Notifications Dialog + * + * Displays all notifications from Kilo API in a scrollable dialog. + * Each notification shows title, message, and clickable action link. + */ + +import { For } from "solid-js" +import { getTUIDependencies } from "../context.js" +import type { KilocodeNotification } from "../../api/notifications.js" + +interface DialogKiloNotificationsProps { + notifications: KilocodeNotification[] +} + +export function DialogKiloNotifications(props: DialogKiloNotificationsProps) { + const deps = getTUIDependencies() + const Link = deps.Link + const TextAttributes = deps.TextAttributes + const dialog = deps.useDialog() + const { theme } = deps.useTheme() + + deps.useKeyboard((evt: any) => { + if (evt.name === "escape" || evt.name === "return") { + dialog.clear() + } + }) + + return ( + + + + Notifications + + esc + + + + + {(notification) => ( + + + * + + {notification.title} + + + + + {notification.message} + + {notification.action && ( + + + [{notification.action.actionText}] + + + )} + + + )} + + + + + ) +} diff --git a/packages/kilo-gateway/src/tui/components/notification-banner.tsx b/packages/kilo-gateway/src/tui/components/notification-banner.tsx new file mode 100644 index 0000000000..cc13e77bed --- /dev/null +++ b/packages/kilo-gateway/src/tui/components/notification-banner.tsx @@ -0,0 +1,52 @@ +// kilocode_change - new file +/** + * Kilo Notification Banner + * + * Displays a notification teaser on the home screen. + * Clicking opens the full notifications dialog. + * + * Layout: + * * Title (N new) + * Message text with word wrap... + */ + +import { Show } from "solid-js" +import { getTUIDependencies } from "../context.js" +import type { KilocodeNotification } from "../../api/notifications.js" + +interface NotificationBannerProps { + notification: KilocodeNotification + totalCount: number + onClick?: () => void +} + +export function NotificationBanner(props: NotificationBannerProps) { + const deps = getTUIDependencies() + const { theme } = deps.useTheme() + + return ( + + {/* Line 1: Icon + Title + Count */} + + + * + + + {props.notification.title} + + 0}> + + ({props.totalCount} new) + + + + + {/* Line 2: Message (indented to align under title) */} + + + {props.notification.message} + + + + ) +} diff --git a/packages/kilo-gateway/src/types/jsx.d.ts b/packages/kilo-gateway/src/types/jsx.d.ts index 8bb466ae17..4fcfaa1ffc 100644 --- a/packages/kilo-gateway/src/types/jsx.d.ts +++ b/packages/kilo-gateway/src/types/jsx.d.ts @@ -11,6 +11,7 @@ declare module "solid-js" { box: any text: any span: any + scrollbox: any } } } diff --git a/packages/kilo-gateway/src/types/tui.d.ts b/packages/kilo-gateway/src/types/tui.d.ts index ea4809f581..83a03f4a3e 100644 --- a/packages/kilo-gateway/src/types/tui.d.ts +++ b/packages/kilo-gateway/src/types/tui.d.ts @@ -49,5 +49,6 @@ declare namespace JSX { box: any text: any span: any + scrollbox: any } } diff --git a/packages/opencode/src/cli/cmd/tui/routes/home.tsx b/packages/opencode/src/cli/cmd/tui/routes/home.tsx index 59923c69d9..bb5c5c606b 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/home.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/home.tsx @@ -1,5 +1,5 @@ import { Prompt, type PromptRef } from "@tui/component/prompt" -import { createMemo, Match, onMount, Show, Switch } from "solid-js" +import { createMemo, createSignal, Match, onMount, Show, Switch } from "solid-js" import { useTheme } from "@tui/context/theme" import { useKeybind } from "@tui/context/keybind" import { Logo } from "../component/logo" @@ -14,6 +14,9 @@ import { usePromptRef } from "../context/prompt" import { Installation } from "@/installation" import { useKV } from "../context/kv" import { useCommandDialog } from "../component/dialog-command" +import { useSDK } from "../context/sdk" +import { useDialog } from "../ui/dialog" // kilocode_change +import { NotificationBanner, DialogKiloNotifications, type KilocodeNotification } from "@kilocode/kilo-gateway/tui" // kilocode_change // TODO: what is the best way to do this? let once = false @@ -21,6 +24,7 @@ let once = false export function Home() { const sync = useSync() const kv = useKV() + const sdk = useSDK() // kilocode_change const { theme } = useTheme() const route = useRouteData("home") const promptRef = usePromptRef() @@ -42,6 +46,38 @@ export function Home() { return !tipsHidden() }) + // kilocode_change start - Kilo notifications + const [notifications, setNotifications] = createSignal([]) + const isKiloConnected = createMemo(() => sync.data.provider_next.connected.includes("kilo")) + const dialog = useDialog() + + const openNotificationsDialog = () => { + const items = notifications() + if (items.length > 0) { + dialog.replace(() => ) + } + } + + onMount(async () => { + // Wait for sync to complete + await new Promise((resolve) => { + const check = () => { + if (sync.status === "complete") resolve() + else setTimeout(check, 100) + } + check() + }) + + if (!isKiloConnected()) return + + const result = await sdk.client.kilo.notifications() + const items = result.data + if (items && items.length > 0) { + setNotifications(items) + } + }) + // kilocode_change end + command.register(() => [ { title: tipsHidden() ? "Show tips" : "Hide tips", @@ -105,10 +141,19 @@ export function Home() { hint={Hint} /> - + + {/* kilocode_change start - Show notification banner and tips */} + 0}> + + + {/* kilocode_change end */} diff --git a/packages/opencode/src/kilocode/docs/migration.md b/packages/opencode/src/kilocode/docs/migration.md index 1de9d2b615..acdc92b0b9 100644 --- a/packages/opencode/src/kilocode/docs/migration.md +++ b/packages/opencode/src/kilocode/docs/migration.md @@ -9,6 +9,7 @@ This document explains how Kilocode configurations are automatically migrated to - [Rules Migration](#rules-migration) - [Workflows Migration](#workflows-migration) - [MCP Migration](#mcp-migration) +- [Kilo Notifications](#kilo-notifications) --- @@ -337,3 +338,52 @@ Kilocode MCP server configurations are migrated to Opencode's `mcp` config. See | Location | Description | | ----------------------------------------------------------- | ------------------------- | | VSCode extension storage `settings/cline_mcp_settings.json` | MCP server configurations | + +--- + +# Kilo Notifications + +When connected to Kilo Gateway, the CLI fetches and displays notifications from the Kilo API. This allows Kilo to communicate important announcements, feature updates, and tips to users. + +## How It Works + +1. **On startup**, if the user is authenticated with Kilo Gateway, the CLI fetches notifications from `https://api.kilo.ai/api/users/notifications` +2. **Filtering**: Only notifications with `showIn` containing `"cli"` (or no `showIn` restriction) are displayed +3. **Display**: The first notification is shown as a toast notification after a 2-second delay + +## Notification Data Structure + +```typescript +interface KilocodeNotification { + id: string // Unique identifier + title: string // Notification title (e.g., "Agent skills now supported!") + message: string // Description text + action?: { + actionText: string // Link text (e.g., "Learn More") + actionURL: string // URL destination + } + showIn?: string[] // Target platforms: ["cli", "vscode"] +} +``` + +## Example Notification + +``` +Title: Agent skills now supported! +Message: Define reusable skills and workflows for your AI agent. +Action: Learn More -> https://docs.kilo.ai/skills +``` + +## Display Conditions + +| Condition | Notifications Shown | +| ------------------------- | ------------------- | +| Connected to Kilo Gateway | Yes | +| Not connected to Kilo | No | +| No notifications from API | No | + +## Related Files + +- [`notifications.ts`](../../../../kilo-gateway/src/api/notifications.ts) - Fetch function and types +- [`routes.ts`](../../../../kilo-gateway/src/server/routes.ts) - Server endpoint `/kilo/notifications` +- [`app.tsx`](../../cli/cmd/tui/app.tsx) - TUI notification display logic diff --git a/packages/sdk/js/src/v2/gen/sdk.gen.ts b/packages/sdk/js/src/v2/gen/sdk.gen.ts index 2dd152ffde..74999cc24d 100644 --- a/packages/sdk/js/src/v2/gen/sdk.gen.ts +++ b/packages/sdk/js/src/v2/gen/sdk.gen.ts @@ -36,6 +36,8 @@ import type { GlobalEventResponses, GlobalHealthResponses, InstanceDisposeResponses, + KiloNotificationsErrors, + KiloNotificationsResponses, KiloOrganizationSetErrors, KiloOrganizationSetResponses, KiloProfileErrors, @@ -2120,6 +2122,25 @@ export class Kilo extends HeyApiClient { }) } + /** + * Get Kilo notifications + * + * Fetch notifications from Kilo Gateway for CLI display + */ + public notifications( + parameters?: { + directory?: string + }, + options?: Options, + ) { + const params = buildClientParams([parameters], [{ args: [{ in: "query", key: "directory" }] }]) + return (options?.client ?? this.client).get({ + url: "/kilo/notifications", + ...options, + ...params, + }) + } + private _organization?: Organization get organization(): Organization { return (this._organization ??= new Organization({ client: this.client })) diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index f2d7476955..094b89ade2 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -4085,6 +4085,42 @@ export type KiloOrganizationSetResponses = { export type KiloOrganizationSetResponse = KiloOrganizationSetResponses[keyof KiloOrganizationSetResponses] +export type KiloNotificationsData = { + body?: never + path?: never + query?: { + directory?: string + } + url: "/kilo/notifications" +} + +export type KiloNotificationsErrors = { + /** + * Bad request + */ + 400: BadRequestError +} + +export type KiloNotificationsError = KiloNotificationsErrors[keyof KiloNotificationsErrors] + +export type KiloNotificationsResponses = { + /** + * Notifications list + */ + 200: Array<{ + id: string + title: string + message: string + action?: { + actionText: string + actionURL: string + } + showIn?: Array + }> +} + +export type KiloNotificationsResponse = KiloNotificationsResponses[keyof KiloNotificationsResponses] + export type FindTextData = { body?: never path?: never From fd644bc23270077ed40d09839d737a618b0b9cdf Mon Sep 17 00:00:00 2001 From: Suresh Sivasankaran Date: Tue, 27 Jan 2026 18:46:20 +0100 Subject: [PATCH 2/2] refactor the news component --- packages/kilo-gateway/src/tui.ts | 3 +- .../components/dialog-kilo-notifications.tsx | 2 +- .../src/tui/components/kilo-news.tsx | 59 +++++++++++++++++++ packages/kilo-gateway/src/tui/types.ts | 1 + packages/opencode/src/cli/cmd/tui/app.tsx | 3 +- .../opencode/src/cli/cmd/tui/routes/home.tsx | 50 ++-------------- 6 files changed, 68 insertions(+), 50 deletions(-) create mode 100644 packages/kilo-gateway/src/tui/components/kilo-news.tsx diff --git a/packages/kilo-gateway/src/tui.ts b/packages/kilo-gateway/src/tui.ts index 497b666121..8784a0948f 100644 --- a/packages/kilo-gateway/src/tui.ts +++ b/packages/kilo-gateway/src/tui.ts @@ -25,8 +25,7 @@ export { registerKiloCommands } from "./tui/commands/kilo-commands.js" export { DialogKiloTeamSelect } from "./tui/components/dialog-kilo-team-select.js" export { DialogKiloOrganization } from "./tui/components/dialog-kilo-organization.js" export { KiloAutoMethod } from "./tui/components/dialog-kilo-auto-method.js" -export { NotificationBanner } from "./tui/components/notification-banner.js" -export { DialogKiloNotifications } from "./tui/components/dialog-kilo-notifications.js" +export { KiloNews } from "./tui/components/kilo-news.js" // ============================================================================ // Re-exported Types diff --git a/packages/kilo-gateway/src/tui/components/dialog-kilo-notifications.tsx b/packages/kilo-gateway/src/tui/components/dialog-kilo-notifications.tsx index 6e35dc32b1..4b2d75577d 100644 --- a/packages/kilo-gateway/src/tui/components/dialog-kilo-notifications.tsx +++ b/packages/kilo-gateway/src/tui/components/dialog-kilo-notifications.tsx @@ -31,7 +31,7 @@ export function DialogKiloNotifications(props: DialogKiloNotificationsProps) { - Notifications + News esc diff --git a/packages/kilo-gateway/src/tui/components/kilo-news.tsx b/packages/kilo-gateway/src/tui/components/kilo-news.tsx new file mode 100644 index 0000000000..7dedb702ca --- /dev/null +++ b/packages/kilo-gateway/src/tui/components/kilo-news.tsx @@ -0,0 +1,59 @@ +// kilocode_change - new file +/** + * Kilo News Component + * + * Self-contained component that fetches and displays Kilo news/notifications. + * Shows a banner on the home screen; clicking opens a dialog with all news items. + */ + +import { createMemo, createSignal, onMount, Show } from "solid-js" +import { getTUIDependencies } from "../context.js" +import type { KilocodeNotification } from "../../api/notifications.js" +import { NotificationBanner } from "./notification-banner.js" +import { DialogKiloNotifications } from "./dialog-kilo-notifications.js" + +export function KiloNews() { + const deps = getTUIDependencies() + const sync = deps.useSync() + const sdk = deps.useSDK() + const dialog = deps.useDialog() + + const [notifications, setNotifications] = createSignal([]) + const isKiloConnected = createMemo(() => sync.data.provider_next.connected.includes("kilo")) + + const openNewsDialog = () => { + const items = notifications() + if (items.length > 0) { + dialog.replace(() => ) + } + } + + onMount(async () => { + // Wait for sync to complete + await new Promise((resolve) => { + const check = () => { + if (sync.status === "complete") resolve() + else setTimeout(check, 100) + } + check() + }) + + if (!isKiloConnected()) return + + const result = await sdk.client.kilo.notifications() + const items = result.data + if (items && items.length > 0) { + setNotifications(items) + } + }) + + return ( + 0}> + + + ) +} diff --git a/packages/kilo-gateway/src/tui/types.ts b/packages/kilo-gateway/src/tui/types.ts index 6badaa8db0..d4a60d3196 100644 --- a/packages/kilo-gateway/src/tui/types.ts +++ b/packages/kilo-gateway/src/tui/types.ts @@ -10,6 +10,7 @@ export interface TUIDependencies { useDialog: () => any useToast: () => any useTheme: () => any + useSDK: () => any // UI Components DialogAlert: any diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index 7700a8e8e5..e1fbcde408 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -584,6 +584,7 @@ function App() { useDialog: useDialog, useToast: useToast, useTheme: useTheme, + useSDK: useSDK, DialogAlert: DialogAlert, DialogSelect: DialogSelect, Link: Link, @@ -594,7 +595,7 @@ function App() { registerKiloCommands(useSDK) // kilocode_change end -// kilocode_change - Delete OpenRouter Alert + // kilocode_change - Delete OpenRouter Alert sdk.event.on(TuiEvent.CommandExecute.type, (evt) => { command.trigger(evt.properties.command) }) diff --git a/packages/opencode/src/cli/cmd/tui/routes/home.tsx b/packages/opencode/src/cli/cmd/tui/routes/home.tsx index bb5c5c606b..ee9d188946 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/home.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/home.tsx @@ -1,5 +1,5 @@ import { Prompt, type PromptRef } from "@tui/component/prompt" -import { createMemo, createSignal, Match, onMount, Show, Switch } from "solid-js" +import { createMemo, Match, onMount, Show, Switch } from "solid-js" import { useTheme } from "@tui/context/theme" import { useKeybind } from "@tui/context/keybind" import { Logo } from "../component/logo" @@ -14,9 +14,7 @@ import { usePromptRef } from "../context/prompt" import { Installation } from "@/installation" import { useKV } from "../context/kv" import { useCommandDialog } from "../component/dialog-command" -import { useSDK } from "../context/sdk" -import { useDialog } from "../ui/dialog" // kilocode_change -import { NotificationBanner, DialogKiloNotifications, type KilocodeNotification } from "@kilocode/kilo-gateway/tui" // kilocode_change +import { KiloNews } from "@kilocode/kilo-gateway/tui" // kilocode_change // TODO: what is the best way to do this? let once = false @@ -24,7 +22,6 @@ let once = false export function Home() { const sync = useSync() const kv = useKV() - const sdk = useSDK() // kilocode_change const { theme } = useTheme() const route = useRouteData("home") const promptRef = usePromptRef() @@ -46,38 +43,6 @@ export function Home() { return !tipsHidden() }) - // kilocode_change start - Kilo notifications - const [notifications, setNotifications] = createSignal([]) - const isKiloConnected = createMemo(() => sync.data.provider_next.connected.includes("kilo")) - const dialog = useDialog() - - const openNotificationsDialog = () => { - const items = notifications() - if (items.length > 0) { - dialog.replace(() => ) - } - } - - onMount(async () => { - // Wait for sync to complete - await new Promise((resolve) => { - const check = () => { - if (sync.status === "complete") resolve() - else setTimeout(check, 100) - } - check() - }) - - if (!isKiloConnected()) return - - const result = await sdk.client.kilo.notifications() - const items = result.data - if (items && items.length > 0) { - setNotifications(items) - } - }) - // kilocode_change end - command.register(() => [ { title: tipsHidden() ? "Show tips" : "Hide tips", @@ -141,19 +106,12 @@ export function Home() { hint={Hint} /> + {/* kilocode_change - KiloNews added */} - {/* kilocode_change start - Show notification banner and tips */} - 0}> - - + - {/* kilocode_change end */}