CI:
- Render the config console's active overlay target from its new object
shape instead of passing it to JSX.
- Make the config overlay `expected` revision optional in the schema,
writer, and handler so clients without a binding write unconditionally
instead of receiving a 400, and add the missing PUT /indexing/consent
exerciser scenario. Regenerate the SDK for the schema change.
- The multi-project Storybook story called useLanguage() outside its
provider and rendered nothing; it now uses the story translator.
- Scope indexing test select locators by row title, since the tab gained a
project selector that shifted positional lookups.
Review findings:
- Gate worktree creation, promotion, and multi-version creation on the
target project's state: waitForStateReady only tracked the active
project, so those handlers could mutate a background project's state
before it loaded.
- Re-check trust and enablement for every project-stamped message instead
of resolving contexts through the unchecked map lookup.
- Register projects through resolveProjectRoot so a folder inside a linked
worktree cannot duplicate an existing project, and fix that helper to
issue valid rev-parse commands.
- Validate the persisted activeTarget shape before applying it.
- Stop throwing from workspace/session directory resolution: it runs
eagerly per webview message, where a throw dropped the message.
- Evict superseded config bindings per scope and directory.
- Guard the multi-project rename against the blur that Escape triggers.
- Unregister routes when disabling secondary projects.
- Replace the section message substring test with an explicit type set.
- Match an open session tab in the project search's current item and scope
selection acks by project id.
- Filter untrusted projects out of indexing consent, and restore config
scope switching plus project-scoped indexing writes that the consent
rework had removed.
- Round-trip the sessions-collapsed mutation so multi-project bodies, which
render purely from pushed state, reflect the toggle.
Adds an experimental.websearch config flag that exposes the websearch
tool to models from any provider, not only the Kilo gateway. The flag
is editable from the VS Code Web Tools settings tab (renamed from
Browser) and the Kilo Console Tools page, with project/global overlay
inheritance and revert support. Environment flags KILO_ENABLE_EXA and
KILO_ENABLE_PARALLEL keep working as before.
Kilo Console was rendering the OS sans/mono fallback stack instead of
Inter / Roboto Mono / JetBrains Mono like Kilo Cloud. Kilo Cloud's web
app (apps/web/src/app/layout.tsx) loads these via `next/font/google`,
but Kilo Console is a Vite-built SolidJS SPA that can't fetch Google
Fonts at build time the same way.
Changes:
- Self-host Inter Variable, Roboto Mono Variable, and JetBrains Mono
Variable as woff2 under packages/kilo-web-ui/src/assets/fonts/.
All three are OFL-1.1; attribution added next to the files.
- Add @font-face blocks at the top of
packages/kilo-web-ui/src/styles/theme.css for the three variable
fonts. The blocks live outside the scoped [data-theme="kilo"]
selector so they're available everywhere Kilo Web UI styles load.
- Declare the three Cloud-mirror tokens in the same scoped block where
--font-family-sans/-mono are already overridden:
--font-sans-loaded -> "Inter Variable"
--font-mono-loaded -> "Roboto Mono Variable"
--font-jetbrains -> "JetBrains Mono Variable"
Re-alias --font-family-sans/-font-family-mono to point at the new
tokens, so all existing var(--font-family-*) consumers across the
200+ call sites in kilo-ui, kilo-web-ui, and kilo-console pick up the
new fonts with no per-site change.
- Drop three hard-coded inline fallbacks in kilo-console styles
(base.css, profile.css, resolved.css) that named "Inter" directly,
so the value flows through the cascade instead of short-circuiting it.
- No upstream changes: packages/ui/* (the @opencode-ai/ui fork) is
untouched, avoiding kilocode_change markers in shared files.
Verified with `bun run build` in packages/kilo-console (all four
@font-face blocks emitted to the bundled CSS with hashed woff2 URLs)
and `bun run typecheck` in both kilo-console and kilo-web-ui.
The Kilo Console navbar rendered a hardcoded capital "K" letter
inside a 1rem yellow badge instead of the actual Kilo logo. The base
.header-mark style in kilo-web-ui was designed for a single-letter
mark, which is why no image reference existed in the first place.
Swap the letter for the canonical Kilo logo (copied from the VS Code
extension's assets) and drop the redundant "Kilo" wordmark next to
it since the logo already carries the brand name. The new .header-mark-logo
override strips the badge chrome (background, color, font props) so the
SVG renders cleanly, and uses import.meta.env.BASE_URL so the asset
URL resolves correctly whether the console is served by Vite (base /)
or by the CLI's static server under /console/.
Also replace the brand link's plain <a> with the router's <A> component
so the home href is automatically prefixed with the configured router
base, keeping navigation aligned with the asset URL under /console/.
The Usage and Buy Credits items in the Kilo Console profile sidebar
open in a new tab but had no visual indicator, so users could not tell
they navigate out of the app. Add an external-link icon to those items
and to the Open Dashboard primary CTA in the profile header.
The shared console-shell sidebar style hides every [data-component=icon]
inside a config-top-option, so a new modifier class is introduced to
re-enable the icon and push it to the right of the label. The primary
CTA's inner SVG is forced to --primary-foreground via a higher-
specificity override so it remains readable on the yellow button.