diff --git a/README.md b/README.md
index e77e3fbbf7f..2199ffd41ad 100644
--- a/README.md
+++ b/README.md
@@ -18,7 +18,7 @@
- ⚡ Inline autocomplete suggestions
- 🤖 Latest AI models
- 🎁 API keys optional
-- 💡 **Get $20 in bonus credits when you top-up for the first time** Credits can be used with 500+ models like Gemini 3.1 Pro, Claude 4.6 Sonnet & Opus, and GPT-5.2
+- 💡 **Get $20 in bonus credits when you top-up for the first time** Credits can be used with 500+ models like Gemini 3.1 Pro, Claude 4.6 Sonnet & Opus, and GPT-5.4
## Quick Links
@@ -38,7 +38,7 @@
## Get Started in Visual Studio Code
1. Install the Kilo Code extension from the [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code).
-2. Create your account to access 500+ cutting-edge AI models including Gemini 3 Pro, Claude 4.5 Sonnet & Opus, and GPT-5 – with transparent pricing that matches provider rates exactly.
+2. Create your account to access 500+ cutting-edge AI models including Gemini 3.1 Pro, Claude 4.6 Sonnet & Opus, and GPT-5.4 – with transparent pricing that matches provider rates exactly.
3. Start coding with AI that adapts to your workflow. Watch our quick-start guide to see Kilo in action:
diff --git a/packages/kilo-vscode/src/KiloProvider.ts b/packages/kilo-vscode/src/KiloProvider.ts
index 9596d4a3920..481284eec01 100644
--- a/packages/kilo-vscode/src/KiloProvider.ts
+++ b/packages/kilo-vscode/src/KiloProvider.ts
@@ -126,6 +126,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
private cachedMcpStatusMessage: unknown = null
/** Ref-count of in-flight handleUpdateConfig calls; prevents fetchAndSendConfig from sending stale data */
private pending = 0
+ private configWarningsShown = false
/** Cached notificationsLoaded payload */
private cachedNotificationsMessage: unknown = null
private pendingReviewComments: { comments: unknown[]; autoSend: boolean }[] = []
@@ -1055,6 +1056,9 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
this.postMessage({ type: "connectionState", state })
if (state === "connected") {
+ // Fire config warnings independently so a failure in the
+ // sequential await chain doesn't prevent warnings from being shown
+ void this.checkConfigWarnings("state")
try {
// Profile fetch is best-effort — returns 401 when user isn't logged into gateway.
const sdkClient = this.client
@@ -1130,6 +1134,14 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
}
this.postMessage({ type: "connectionState", state: this.connectionState })
+
+ // connect() can resolve after SSE reaches "connected" but before this
+ // provider subscribes to onStateChange(). In that case the initial
+ // connected callback is missed, so run the warning check here too.
+ if (this.connectionState === "connected") {
+ void this.checkConfigWarnings("init")
+ }
+
await this.syncWebviewState("initializeConnection")
await this.flushPendingSessionRefresh("initializeConnection")
@@ -1965,6 +1977,49 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
}
}
+ /**
+ * Fetch config warnings from the server and display a single consolidated
+ * VS Code warning with a "Show Details" action button.
+ * Only shown once per provider lifecycle (flag resets on dispose/re-create, not on SSE reconnect).
+ */
+ private async checkConfigWarnings(from: string): Promise {
+ if (this.configWarningsShown) {
+ console.log("[Kilo New] KiloProvider: config warnings already shown", { from })
+ return
+ }
+ if (!this.client) {
+ console.log("[Kilo New] KiloProvider: config warnings skipped (no client)", { from })
+ return
+ }
+ try {
+ const dir = this.getWorkspaceDirectory()
+ console.log("[Kilo New] KiloProvider: checking config warnings", { from, dir })
+ const result = await this.client.config.warnings({ directory: dir })
+ const list = result?.data ?? []
+ console.log("[Kilo New] KiloProvider: config warnings fetched", { from, count: list.length })
+ if (list.length === 0) return
+ this.configWarningsShown = true
+
+ const first = list[0]!
+ const summary = list.length === 1 ? first.message : `${first.message} (and ${list.length - 1} more)`
+ console.warn("[Kilo New] KiloProvider: showing config warnings", { from, count: list.length, path: first.path })
+
+ const action = await vscode.window.showWarningMessage(`Config: ${summary}`, "Show Details")
+ if (action === "Show Details") {
+ const lines = list.map((w) => {
+ const base = `${w.path}\n ${w.message}`
+ return w.detail ? `${base}\n ${w.detail}` : base
+ })
+ const channel = vscode.window.createOutputChannel("Kilo Config Warnings")
+ channel.clear()
+ channel.appendLine(lines.join("\n\n"))
+ channel.show()
+ }
+ } catch (err) {
+ console.warn("[Kilo New] KiloProvider: checkConfigWarnings failed:", { from, err })
+ }
+ }
+
/**
* Fetch Kilo news/notifications and send to webview.
* Uses the cached message pattern so the webview gets data immediately on refresh.
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/DiffPanel.tsx b/packages/kilo-vscode/webview-ui/agent-manager/DiffPanel.tsx
index 3c00d20d5cd..af67780fe9a 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/DiffPanel.tsx
+++ b/packages/kilo-vscode/webview-ui/agent-manager/DiffPanel.tsx
@@ -307,6 +307,11 @@ export const DiffPanel: Component = (props) => {
sendAllToChat()
}
+ const handleExpandAll = () => {
+ const allOpen = open().length === props.diffs.length
+ setOpen(allOpen ? [] : props.diffs.map((d) => d.file))
+ }
+
const totals = createMemo(() => ({
files: props.diffs.length,
additions: props.diffs.reduce((sum, diff) => sum + diff.additions, 0),
@@ -354,6 +359,28 @@ export const DiffPanel: Component = (props) => {