diff --git a/packages/kilo-vscode/docs/ui-implementation-plan.md b/packages/kilo-vscode/docs/ui-implementation-plan.md
index 3308bb732c5..a5c1a3a9351 100644
--- a/packages/kilo-vscode/docs/ui-implementation-plan.md
+++ b/packages/kilo-vscode/docs/ui-implementation-plan.md
@@ -794,7 +794,7 @@ Each phase has specific acceptance criteria (listed above). The general verifica
| Phase 1.4: Cards | ✅ Complete | 2026-02-11 | Inline-styled card divs in ProfileView (profile + balance) and DeviceAuthCard (5 state cards) replaced with `Card` component. Removed `cardStyle` constant. |
| Phase 1.5: Icons | ✅ Complete | 2026-02-11 | All 15 lucide-solid icons replaced with kilo-ui `Icon`. `lucide-solid` dep removed. Many icons use approximate matches (see deviation #7). |
| Phase 2: Settings UI | ✅ Complete | 2026-02-11 | Settings shell uses kilo-ui `Tabs` with vertical orientation and `variant="settings"`. ~80 lines of inline styles removed. Tab content (stubs) unchanged. Back button in header kept with minimal CSS. |
-| Phase 3: Chat UI | ⬚ Not started | — | |
+| Phase 3: Chat UI | ✅ Complete | 2026-02-11 | MarkedProvider added. Assistant text renders as Markdown. Tool calls use BasicTool. Reasoning uses Collapsible. Removed ~150 lines of tool/reasoning CSS. Code/Diff providers deferred (not needed yet). |
| Phase 4: Advanced | ⬚ Not started | — | |
### Deviations from plan
diff --git a/packages/kilo-vscode/esbuild.js b/packages/kilo-vscode/esbuild.js
index 54b637ab915..c6541f031c3 100644
--- a/packages/kilo-vscode/esbuild.js
+++ b/packages/kilo-vscode/esbuild.js
@@ -1,9 +1,38 @@
const esbuild = require("esbuild")
+const path = require("path")
const { solidPlugin } = require("esbuild-plugin-solid")
const production = process.argv.includes("--production")
const watch = process.argv.includes("--watch")
+/**
+ * Force all solid-js imports (from kilo-ui and the webview) to resolve to
+ * the **same** copy so SolidJS contexts are shared across packages.
+ * Without this, the monorepo hoists separate copies (pnpm vs bun) and
+ * createContext / useContext can't see each other.
+ *
+ * @type {import('esbuild').Plugin}
+ */
+const solidDedupePlugin = {
+ name: "solid-dedupe",
+ setup(build) {
+ // Resolve these bare specifiers to the kilo-vscode-local copy
+ const solidRoot = path.dirname(require.resolve("solid-js/package.json"))
+ const aliases = {
+ "solid-js": path.join(solidRoot, "dist", "solid.js"),
+ "solid-js/web": path.join(solidRoot, "web", "dist", "web.js"),
+ "solid-js/store": path.join(solidRoot, "store", "dist", "store.js"),
+ }
+
+ build.onResolve({ filter: /^solid-js(\/web|\/store)?$/ }, (args) => {
+ const key = args.path
+ if (aliases[key]) {
+ return { path: aliases[key] }
+ }
+ })
+ },
+}
+
/**
* @type {import('esbuild').Plugin}
*/
@@ -72,7 +101,7 @@ async function main() {
".woff2": "file",
".ttf": "file",
},
- plugins: [cssPackageResolvePlugin, solidPlugin(), esbuildProblemMatcherPlugin],
+ plugins: [solidDedupePlugin, cssPackageResolvePlugin, solidPlugin(), esbuildProblemMatcherPlugin],
})
if (watch) {
diff --git a/packages/kilo-vscode/src/KiloProvider.ts b/packages/kilo-vscode/src/KiloProvider.ts
index bd8bb3a024c..c0d1c41a029 100644
--- a/packages/kilo-vscode/src/KiloProvider.ts
+++ b/packages/kilo-vscode/src/KiloProvider.ts
@@ -829,7 +829,7 @@ export class KiloProvider implements vscode.WebviewViewProvider {
const csp = [
"default-src 'none'",
`style-src 'unsafe-inline' ${webview.cspSource}`,
- `script-src 'nonce-${nonce}'`,
+ `script-src 'nonce-${nonce}' 'wasm-unsafe-eval'`,
`font-src ${webview.cspSource}`,
"connect-src http://127.0.0.1:* http://localhost:* ws://127.0.0.1:* ws://localhost:*",
`img-src ${webview.cspSource} data: https:`,
diff --git a/packages/kilo-vscode/webview-ui/src/App.tsx b/packages/kilo-vscode/webview-ui/src/App.tsx
index b03e610b2c4..d079ffe6b8d 100644
--- a/packages/kilo-vscode/webview-ui/src/App.tsx
+++ b/packages/kilo-vscode/webview-ui/src/App.tsx
@@ -2,6 +2,7 @@ import { Component, createSignal, Switch, Match, onMount, onCleanup } from "soli
import { ThemeProvider } from "@kilocode/kilo-ui/theme"
import { I18nProvider } from "@kilocode/kilo-ui/context"
import { DialogProvider } from "@kilocode/kilo-ui/context/dialog"
+import { MarkedProvider } from "@kilocode/kilo-ui/context/marked"
import Settings from "./components/Settings"
import ProfileView from "./components/ProfileView"
import { VSCodeProvider } from "./context/vscode"
@@ -116,15 +117,17 @@ const App: Component = () => {