diff --git a/.changeset/restore-playwright-browser-tools.md b/.changeset/restore-playwright-browser-tools.md
new file mode 100644
index 00000000000..831bdb323c3
--- /dev/null
+++ b/.changeset/restore-playwright-browser-tools.md
@@ -0,0 +1,5 @@
+---
+"kilo-code": patch
+---
+
+Restore built-in Playwright browser automation and its settings under Web Tools. Keep the experimental Integrated Browser independent and allow its panel to open before selecting a session.
diff --git a/packages/kilo-docs/pages/automate/tools/index.md b/packages/kilo-docs/pages/automate/tools/index.md
index 385c0d7dfea..5869ce46801 100644
--- a/packages/kilo-docs/pages/automate/tools/index.md
+++ b/packages/kilo-docs/pages/automate/tools/index.md
@@ -94,7 +94,9 @@ Set the `KILO_WEBSEARCH_PROVIDER` environment variable to force a provider:
### Browser Tools
-The VS Code extension's experimental `browser_open` tool opens a local application in Agent Manager's Browser panel and returns a screenshot and diagnostics. Enable **Browser Automation** under **Settings > Experimental**. It requires installed Chrome or compatible Playwright Chromium.
+The VS Code extension has a built-in browser automation tool powered by [Playwright MCP](https://www.npmjs.com/package/@playwright/mcp). Enable it in **Settings → Web Tools → Browser Automation**. When enabled, it registers an MCP server named `kilo-playwright` and exposes browser tools that follow the same permission model as all MCP tools.
+
+The VS Code extension's experimental `browser_open` tool opens a local application in Agent Manager's Integrated Browser panel and returns a screenshot and diagnostics. Enable **Integrated Browser** under **Settings > Experimental**. It requires installed Chrome or compatible Playwright Chromium. It is independent from Playwright MCP.
The `browser_open` automation browser accepts HTTP URLs on `localhost` or `127.0.0.1` only, and blocks resources from other origins. See [Browser previews](/docs/automate/agent-manager#browser-previews) for setup and element feedback.
diff --git a/packages/kilo-docs/pages/code-with-ai/features/browser-use.md b/packages/kilo-docs/pages/code-with-ai/features/browser-use.md
index 5130e40ad18..d1a39d2b984 100644
--- a/packages/kilo-docs/pages/code-with-ai/features/browser-use.md
+++ b/packages/kilo-docs/pages/code-with-ai/features/browser-use.md
@@ -18,6 +18,10 @@ Browser Use requires an advanced agentic model. It is typically most reliable wi
Browser automation is built into the extension and requires no manual setup. Enable it from **Settings → Web Tools → Browser Automation** and Kilo handles the rest automatically.
+{% callout type="note" title="Integrated Browser Is Separate" %}
+The experimental **Integrated Browser** under **Settings → Experimental** is a different feature. It shows local application previews inside Agent Manager and does not replace Playwright browser automation. The two features have independent settings.
+{% /callout %}
+
{% /tab %}
{% tab label="CLI" %}
diff --git a/packages/kilo-vscode/package.json b/packages/kilo-vscode/package.json
index 232a835eb17..8ab2fa5fa7e 100644
--- a/packages/kilo-vscode/package.json
+++ b/packages/kilo-vscode/package.json
@@ -1091,7 +1091,7 @@
"type": "boolean",
"default": false,
"scope": "application",
- "description": "Enable the experimental Agent Manager browser panel and browser_open tool."
+ "description": "Enable the experimental Integrated Browser panel and browser_open tool in Agent Manager."
},
"kilo-code.new.experimental.claudeMigration": {
"type": "boolean",
@@ -1147,10 +1147,26 @@
"maximum": 24,
"description": "Font size in pixels for the Kilo Code webview UI."
},
+ "kilo-code.new.browserAutomation.enabled": {
+ "type": "boolean",
+ "default": false,
+ "description": "Enable browser automation powered by Playwright. When enabled, the AI agent can interact with web pages in a visible Chrome window."
+ },
"kilo-code.new.browserAutomation.useSystemChrome": {
"type": "boolean",
"default": true,
- "description": "Use system-installed Google Chrome. Disable only when a compatible Playwright Chromium browser is already installed."
+ "description": "Use your system's installed Chrome browser instead of downloading a separate Chromium instance."
+ },
+ "kilo-code.new.browserAutomation.headless": {
+ "type": "boolean",
+ "default": false,
+ "description": "Run browser automation in headless mode (no visible window). When disabled, you can watch the agent interact with the browser."
+ },
+ "kilo-code.new.agentManager.browser.useSystemChrome": {
+ "type": "boolean",
+ "default": true,
+ "scope": "application",
+ "description": "Use system-installed Google Chrome for the Integrated Browser. Disable only when a compatible Playwright Chromium browser is already installed."
},
"kilo-code.new.attention.enabled": {
"type": "boolean",
diff --git a/packages/kilo-vscode/src/KiloProvider.ts b/packages/kilo-vscode/src/KiloProvider.ts
index 48e0f64dd92..5ef9a9ef344 100644
--- a/packages/kilo-vscode/src/KiloProvider.ts
+++ b/packages/kilo-vscode/src/KiloProvider.ts
@@ -58,6 +58,7 @@ import { resolveProjectDirectory } from "./project-directory"
import { seedSessionStatuses } from "./session-status"
import { normalizeEnhancePromptErrorMessage } from "./enhance-prompt-error"
import { retry } from "./services/cli-backend/retry"
+import { integratedBrowserUseSystemChrome } from "./services/browser-automation/chrome-setting"
import { removeAgent } from "./services/agent-removal"
import { normalize, type SSEPayload, type SyncPayload, type WirePayload } from "./services/cli-backend/sdk-sse-adapter"
import { slimInfo, slimPart, slimParts } from "./kilo-provider/slim-metadata"
@@ -4078,6 +4079,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
multiProject: this.multiProjectSetting(),
claudeMigration: this.claudeMigrationSetting(),
browserAutomation: this.browserAutomationSetting(),
+ agentManagerBrowserUseSystemChrome: integratedBrowserUseSystemChrome(),
"agentManager.autoBranchNaming": naming.get("autoBranchNaming", true),
"agentManager.branchPrefix": naming.get("branchPrefix", ""),
"agentManager.worktreePool": naming.get("worktreePool", true),
@@ -4349,6 +4351,10 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
}
await this.checkpoints.get(sid)
+ // Wait for Playwright MCP before the prompt so its tools are advertised.
+ // Kept outside withRetry so retryable prompt errors keep their backoff.
+ // The Integrated Browser does not use Playwright and is not affected.
+ await this.connectionService.prepareTools(dir)
await runWithMessageConfirmation(this.confirmations, messageID, "KiloProvider: Message request", () =>
this.withRetry(
() =>
@@ -4435,7 +4441,10 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
source: f.source,
}))
- if (!control) await this.checkpoints.get(sid)
+ if (!control) {
+ await this.checkpoints.get(sid)
+ await this.connectionService.prepareTools(dir)
+ }
const send = () =>
this.client!.session.command({
sessionID: sid,
@@ -4830,7 +4839,9 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
this.postMessage({
type: "browserSettingsLoaded",
settings: {
+ enabled: config.get("enabled", false),
useSystemChrome: config.get("useSystemChrome", true),
+ headless: config.get("headless", false),
},
})
}
diff --git a/packages/kilo-vscode/src/extension.ts b/packages/kilo-vscode/src/extension.ts
index 67e204f456e..a797b44251b 100644
--- a/packages/kilo-vscode/src/extension.ts
+++ b/packages/kilo-vscode/src/extension.ts
@@ -21,7 +21,11 @@ import { AttentionService, showOSNotification } from "./services/attention"
import { CaffeinationService } from "./services/caffeination"
import { confirmCaffeination } from "./services/caffeination/confirm"
import { createCaffeinationDriver } from "./services/caffeination/inhibitor"
-import { BrowserBroker } from "./services/browser-automation"
+import { BrowserAutomationService, BrowserBroker } from "./services/browser-automation"
+import {
+ integratedBrowserUseSystemChrome,
+ migrateIntegratedBrowserUseSystemChrome,
+} from "./services/browser-automation/chrome-setting"
import { TelemetryEventName, TelemetryProxy } from "./services/telemetry"
import { registerCommitMessageService } from "./services/commit-message"
import { registerCodeActions, registerTerminalActions, KiloCodeActionProvider } from "./services/code-actions"
@@ -62,16 +66,28 @@ export async function activate(context: vscode.ExtensionContext) {
const telemetry = TelemetryProxy.getInstance()
+ await migrateIntegratedBrowserUseSystemChrome().catch((error: unknown) =>
+ console.warn("[Kilo New] Integrated Browser Chrome preference migration failed:", error),
+ )
+
const browserBroker = new BrowserBroker({
log: (...args) => console.warn("[Kilo New] BrowserBroker:", ...args),
enabled: () => vscode.workspace.getConfiguration("kilo-code.new.experimental").get("browserAutomation", false),
trusted: () => vscode.workspace.isTrusted,
- useSystemChrome: () =>
- vscode.workspace.getConfiguration("kilo-code.new.browserAutomation").get("useSystemChrome", true),
+ useSystemChrome: () => integratedBrowserUseSystemChrome(),
})
// Create shared connection service (one server for all webviews)
- const connectionService = new KiloConnectionService(context, () => browserBroker.env())
+ const connectionService = new KiloConnectionService(
+ context,
+ () => browserBroker.env(),
+ (dir): Promise => browserAutomationService.ready(dir),
+ )
+
+ // Manages the built-in Playwright MCP server for ordinary sessions. This is
+ // independent from the Agent Manager browser broker above.
+ const browserAutomationService = new BrowserAutomationService(connectionService)
+ void browserAutomationService.syncWithSettings()
const notebookBridge = createNotebookBridge(connectionService)
let restore = context.workspaceState.get(RESTORE_KEY) ?? {}
const remember = (patch: RestoreState) => {
@@ -88,6 +104,9 @@ export async function activate(context: vscode.ExtensionContext) {
const unsubscribeStateChange = connectionService.onStateChange((state) => {
if (state === "connected") {
+ void browserAutomationService
+ .reregisterIfEnabled()
+ .catch((error) => console.warn("[Kilo New] Playwright MCP re-registration failed:", error))
const config = connectionService.getServerConfig()
if (config) {
telemetry.configure(config.baseUrl, config.password)
@@ -747,6 +766,7 @@ export async function activate(context: vscode.ExtensionContext) {
unsubscribeStateChange()
attention.dispose()
browserBroker.dispose()
+ browserAutomationService.dispose()
provider.dispose()
notebookBridge.dispose()
connectionService.dispose()
diff --git a/packages/kilo-vscode/src/services/browser-automation/browser-automation-service.ts b/packages/kilo-vscode/src/services/browser-automation/browser-automation-service.ts
new file mode 100644
index 00000000000..056d9148849
--- /dev/null
+++ b/packages/kilo-vscode/src/services/browser-automation/browser-automation-service.ts
@@ -0,0 +1,258 @@
+import * as vscode from "vscode"
+import type { KiloClient } from "@kilocode/sdk/v2/client"
+import type { KiloConnectionService } from "../cli-backend"
+import { playwrightCommand } from "./settings"
+import { canonicalizePath, samePath } from "../../agent-manager/project/paths"
+
+type BrowserAutomationState = "disabled" | "registering" | "connected" | "failed" | "disconnected"
+
+/**
+ * Manages the built-in Playwright MCP browser server for ordinary Kilo sessions.
+ *
+ * This is independent from the Agent Manager browser broker. It must not read
+ * Agent Manager settings, and Agent Manager must not read its settings.
+ */
+export class BrowserAutomationService implements vscode.Disposable {
+ // MCP server name used when registering with the CLI backend
+ private static readonly MCP_SERVER_NAME = "kilo-playwright"
+ private readonly disposables: vscode.Disposable[] = []
+ private readonly registered = new Set()
+ private queue: Promise = Promise.resolve()
+ private disposed = false
+ private state: BrowserAutomationState = "disabled"
+
+ constructor(
+ private readonly connectionService: KiloConnectionService,
+ private readonly wait = 15_000,
+ ) {
+ this.disposables.push(
+ vscode.workspace.onDidChangeConfiguration((event) => {
+ if (!event.affectsConfiguration("kilo-code.new.browserAutomation")) return
+ void this.syncWithSettings()
+ }),
+ vscode.workspace.onDidChangeWorkspaceFolders(() => this.enqueue(() => this.apply(true))),
+ {
+ dispose: connectionService.onEvent((event) => {
+ if (event.type !== "server.instance.disposed") return
+ return this.enqueue(async () => {
+ if (this.disposed) return
+ const root = canonicalizePath(event.properties.directory)
+ const dirs = [...new Set([...this.registered, ...this.directories()])].filter((dir) =>
+ samePath(canonicalizePath(dir), root),
+ )
+ if (!dirs.length) return
+ // Config saves and Reload discard MCP state without reconnecting SSE.
+ for (const dir of dirs) this.registered.delete(dir)
+ await this.apply(true)
+ })
+ }),
+ },
+ )
+ }
+
+ /**
+ * Read the Playwright settings and enable or disable the MCP server.
+ * Called on construction and when Playwright settings change.
+ */
+ syncWithSettings(): Promise {
+ return this.enqueue(() => this.apply())
+ }
+
+ /**
+ * Re-register the MCP server after the CLI backend reconnects.
+ */
+ reregisterIfEnabled(): Promise {
+ return this.enqueue(() => this.apply())
+ }
+
+ ready(directory: string): Promise {
+ const task = this.enqueue(async () => {
+ if (this.disposed || !this.enabled() || !vscode.workspace.isTrusted) return
+ const dir = this.directories().find((dir) => samePath(canonicalizePath(dir), canonicalizePath(directory)))
+ if (!dir) return
+ const client = this.getClient()
+ if (!client) throw new Error("Playwright browser automation is waiting for the CLI connection.")
+ // A prompt can arrive before the disposal event or before MCP startup finishes.
+ const { data: status } = await client.mcp.status({ directory: dir }, { throwOnError: true })
+ const server = status[BrowserAutomationService.MCP_SERVER_NAME]
+ if (server?.status === "connected") return
+ // A failed server stays failed until settings change, reconnect, or
+ // disposal. Do not spawn another npx attempt on every prompt.
+ if (server?.status === "failed") throw BrowserAutomationService.failure((server as { error?: string }).error)
+ this.registered.delete(dir)
+ if (!this.enabled()) return
+ await this.register([dir])
+ if (this.enabled() && !this.registered.has(dir)) throw BrowserAutomationService.failure()
+ })
+ return BrowserAutomationService.bounded(task, this.wait)
+ }
+
+ /**
+ * Cap how long a prompt waits for Playwright MCP. A cold `npx` start can hold
+ * the shared queue for up to the MCP timeout, and a prompt should not stall
+ * that long; its tools arrive on a later turn instead.
+ */
+ private static async bounded(task: Promise, wait: number): Promise {
+ const limit = Promise.withResolvers<"timeout">()
+ const timer = setTimeout(() => limit.resolve("timeout"), wait)
+ const outcome = task.then(
+ () => undefined,
+ (error) => {
+ console.warn("[Kilo New] BrowserAutomationService: readiness failed:", error)
+ return { error }
+ },
+ )
+ void outcome.then(() => clearTimeout(timer))
+ const result = await Promise.race([outcome, limit.promise])
+ if (result === "timeout") {
+ console.warn(
+ "[Kilo New] BrowserAutomationService: readiness timed out, submitting without waiting for Playwright MCP",
+ )
+ return
+ }
+ if (result) throw result.error
+ }
+
+ private static failure(detail?: string): Error {
+ return new Error(
+ `Playwright browser automation could not connect${detail ? ` (${detail})` : ""}. Check the Extension Host output, or disable Browser Automation in Web Tools to continue without it.`,
+ )
+ }
+
+ /**
+ * Run one settings transition at a time. Each transition reads the current
+ * settings when it runs, so a queued change cannot restore stale state.
+ */
+ private enqueue(task: () => Promise): Promise {
+ const next = this.queue.then(task, task)
+ this.queue = next.then(
+ () => undefined,
+ () => undefined,
+ )
+ return next
+ }
+
+ private async apply(reconcile = false): Promise {
+ if (this.disposed) return
+ if (!this.enabled()) {
+ await this.unregister()
+ return
+ }
+ if (!vscode.workspace.isTrusted) {
+ console.warn("[Kilo New] BrowserAutomationService: Workspace is not trusted, skipping Playwright MCP")
+ this.setState("disabled")
+ return
+ }
+ const dirs = this.directories()
+ const removed = [...this.registered].filter((dir) => !dirs.includes(dir))
+ if (removed.length) await this.unregister(removed)
+ await this.register(reconcile ? dirs.filter((dir) => !this.registered.has(dir)) : dirs)
+ }
+
+ private enabled(): boolean {
+ return vscode.workspace.getConfiguration("kilo-code.new.browserAutomation").get("enabled", false) === true
+ }
+
+ private command(): string[] {
+ const config = vscode.workspace.getConfiguration("kilo-code.new.browserAutomation")
+ return playwrightCommand({
+ headless: config.get("headless", false),
+ useSystemChrome: config.get("useSystemChrome", true),
+ })
+ }
+
+ private directories(): string[] {
+ const folders = vscode.workspace.workspaceFolders ?? []
+ const dirs = folders.length > 0 ? folders.map((folder) => folder.uri.fsPath) : [process.cwd()]
+ return [...new Set(dirs)]
+ }
+
+ private async register(dirs: string[]): Promise {
+ const client = this.getClient()
+ if (!client) {
+ this.setState("failed")
+ return
+ }
+ const command = this.command()
+ this.setState("registering")
+ let failure: unknown
+ for (const directory of dirs) {
+ try {
+ const { data: status } = await client.mcp.add(
+ {
+ name: BrowserAutomationService.MCP_SERVER_NAME,
+ config: {
+ type: "local",
+ command,
+ enabled: true,
+ timeout: 60000,
+ },
+ directory,
+ },
+ { throwOnError: true },
+ )
+ const server = status[BrowserAutomationService.MCP_SERVER_NAME]
+ if (server?.status === "connected") {
+ this.registered.add(directory)
+ continue
+ }
+ this.registered.delete(directory)
+ if (server?.status === "failed") {
+ const detail = (server as { error?: string }).error
+ failure = new Error(`Playwright MCP failed to start${detail ? `: ${detail}` : ""}`)
+ }
+ } catch (error) {
+ this.registered.delete(directory)
+ failure = error
+ }
+ }
+ if (this.registered.size > 0) {
+ this.setState("connected")
+ return
+ }
+ if (failure) {
+ console.error("[Kilo New] BrowserAutomationService: Failed to register MCP server:", failure)
+ this.setState("failed")
+ return
+ }
+ this.setState("disconnected")
+ }
+
+ private async unregister(dirs = [...this.registered]): Promise {
+ const client = this.getClient()
+ if (client) {
+ for (const directory of dirs) {
+ try {
+ await client.mcp.disconnect(
+ { name: BrowserAutomationService.MCP_SERVER_NAME, directory },
+ { throwOnError: true },
+ )
+ this.registered.delete(directory)
+ } catch (error) {
+ console.error("[Kilo New] BrowserAutomationService: Failed to disconnect MCP server:", error)
+ }
+ }
+ }
+ this.setState("disabled")
+ }
+
+ private getClient(): KiloClient | null {
+ try {
+ return this.connectionService.getClient()
+ } catch {
+ return null
+ }
+ }
+
+ private setState(state: BrowserAutomationState): void {
+ if (this.state === state) return
+ console.log(`[Kilo New] BrowserAutomationService: State ${this.state} -> ${state}`)
+ this.state = state
+ }
+
+ dispose(): void {
+ this.disposed = true
+ for (const disposable of this.disposables) disposable.dispose()
+ this.disposables.length = 0
+ }
+}
diff --git a/packages/kilo-vscode/src/services/browser-automation/browser-broker.ts b/packages/kilo-vscode/src/services/browser-automation/browser-broker.ts
index 7556fd28c65..fd533634577 100644
--- a/packages/kilo-vscode/src/services/browser-automation/browser-broker.ts
+++ b/packages/kilo-vscode/src/services/browser-automation/browser-broker.ts
@@ -475,8 +475,8 @@ export class BrowserBroker {
const detail = error instanceof Error ? error.message : String(error)
const action =
this.opts.useSystemChrome?.() === false
- ? "Install a compatible Playwright Chromium browser or enable Use System Chrome in Kilo Settings > Web Tools."
- : "Install Google Chrome or select an existing Playwright Chromium browser in Kilo Settings > Web Tools."
+ ? "Install a compatible Playwright Chromium browser or enable Use System Chrome in Kilo Settings > Experimental for the Integrated Browser."
+ : "Install Google Chrome or disable Use System Chrome in Kilo Settings > Experimental for the Integrated Browser to use an installed Playwright Chromium browser."
throw new Error(`${action} ${detail}`.slice(0, 1000), { cause: error })
} finally {
this.browserStarting = undefined
diff --git a/packages/kilo-vscode/src/services/browser-automation/chrome-setting.ts b/packages/kilo-vscode/src/services/browser-automation/chrome-setting.ts
new file mode 100644
index 00000000000..d60ec7f66bd
--- /dev/null
+++ b/packages/kilo-vscode/src/services/browser-automation/chrome-setting.ts
@@ -0,0 +1,32 @@
+import * as vscode from "vscode"
+
+const INTEGRATED_BROWSER = "kilo-code.new.agentManager.browser"
+const BROWSER_AUTOMATION = "kilo-code.new.browserAutomation"
+
+/**
+ * Read the Chrome preference for the Agent Manager Integrated Browser.
+ *
+ * The broker and the settings payload both use this so the toggle in Settings
+ * and the effective value stay in sync. The Playwright setting under Web Tools
+ * stays independent.
+ */
+export function integratedBrowserUseSystemChrome(): boolean {
+ return vscode.workspace.getConfiguration(INTEGRATED_BROWSER).get("useSystemChrome", true)
+}
+
+/**
+ * Copy a user-level Chrome preference that was stored before this setting had
+ * its own key.
+ *
+ * Runs once on activation and only when the current key has no explicit value,
+ * so the old Playwright preference is preserved without aliasing the two
+ * features afterwards. Workspace-scoped legacy values are left alone because
+ * the current key is application-scoped and cannot store them.
+ */
+export async function migrateIntegratedBrowserUseSystemChrome(): Promise {
+ const browser = vscode.workspace.getConfiguration(INTEGRATED_BROWSER)
+ if (browser.inspect?.("useSystemChrome")?.globalValue !== undefined) return
+ const value = vscode.workspace.getConfiguration(BROWSER_AUTOMATION).inspect?.("useSystemChrome")?.globalValue
+ if (value === undefined) return
+ await browser.update("useSystemChrome", value, vscode.ConfigurationTarget.Global)
+}
diff --git a/packages/kilo-vscode/src/services/browser-automation/index.ts b/packages/kilo-vscode/src/services/browser-automation/index.ts
index 2e2b283357d..27cd74ff024 100644
--- a/packages/kilo-vscode/src/services/browser-automation/index.ts
+++ b/packages/kilo-vscode/src/services/browser-automation/index.ts
@@ -1,3 +1,4 @@
+export { BrowserAutomationService } from "./browser-automation-service"
export { BrowserBroker, diagnostic } from "./browser-broker"
export type {
BrowserContextFactory,
diff --git a/packages/kilo-vscode/src/services/browser-automation/settings.ts b/packages/kilo-vscode/src/services/browser-automation/settings.ts
new file mode 100644
index 00000000000..b0e49cca4bb
--- /dev/null
+++ b/packages/kilo-vscode/src/services/browser-automation/settings.ts
@@ -0,0 +1,18 @@
+import * as os from "os"
+import * as path from "path"
+
+export const PLAYWRIGHT_OUTPUT_DIR = path.join(os.tmpdir(), "kilo-playwright-mcp")
+
+/**
+ * Build the Playwright MCP launch command.
+ *
+ * Default artifacts go outside the workspace. Explicit screenshot paths can
+ * bypass this directory, so this is not a guarantee against staging artifacts.
+ */
+export function playwrightCommand(input: { headless: boolean; useSystemChrome: boolean }): string[] {
+ const command = ["npx", "@playwright/mcp@latest"]
+ if (input.headless) command.push("--headless")
+ if (input.useSystemChrome) command.push("--browser", "chrome")
+ command.push("--output-dir", PLAYWRIGHT_OUTPUT_DIR)
+ return command
+}
diff --git a/packages/kilo-vscode/src/services/cli-backend/connection-service.ts b/packages/kilo-vscode/src/services/cli-backend/connection-service.ts
index bb22b928936..f2d797df547 100644
--- a/packages/kilo-vscode/src/services/cli-backend/connection-service.ts
+++ b/packages/kilo-vscode/src/services/cli-backend/connection-service.ts
@@ -149,7 +149,11 @@ export class KiloConnectionService {
private viewedDirty = false
private unsubRemote: (() => void) | null = null
- constructor(context: vscode.ExtensionContext, env?: () => Promise>) {
+ constructor(
+ context: vscode.ExtensionContext,
+ env?: () => Promise>,
+ private readonly prepare?: (directory: string) => Promise,
+ ) {
const state =
context.workspaceState ??
({
@@ -202,6 +206,10 @@ export class KiloConnectionService {
return this.client
}
+ async prepareTools(directory: string): Promise {
+ await this.prepare?.(directory)
+ }
+
/**
* Get the shared SDK client, auto-connecting if not yet started.
* Accepts an optional directory to use as the workspace root; falls back
diff --git a/packages/kilo-vscode/tests/setup/vscode-mock.ts b/packages/kilo-vscode/tests/setup/vscode-mock.ts
index 05cfb52e829..6ad4979e4bf 100644
--- a/packages/kilo-vscode/tests/setup/vscode-mock.ts
+++ b/packages/kilo-vscode/tests/setup/vscode-mock.ts
@@ -60,6 +60,7 @@ const mockVscode = {
}),
getConfiguration: () => ({
get: (_key: string, value?: T) => value,
+ inspect: () => ({}),
update: async () => {},
}),
asRelativePath: (pathOrUri: string | { fsPath?: string }) => {
diff --git a/packages/kilo-vscode/tests/unit/browser-automation-chrome-setting.test.ts b/packages/kilo-vscode/tests/unit/browser-automation-chrome-setting.test.ts
new file mode 100644
index 00000000000..1347b386f33
--- /dev/null
+++ b/packages/kilo-vscode/tests/unit/browser-automation-chrome-setting.test.ts
@@ -0,0 +1,68 @@
+import { afterEach, describe, expect, test } from "bun:test"
+import * as vscode from "vscode"
+import {
+ integratedBrowserUseSystemChrome,
+ migrateIntegratedBrowserUseSystemChrome,
+} from "../../src/services/browser-automation/chrome-setting"
+
+const INTEGRATED_BROWSER = "kilo-code.new.agentManager.browser"
+const BROWSER_AUTOMATION = "kilo-code.new.browserAutomation"
+
+describe("Integrated Browser Chrome preference", () => {
+ const descriptors = Object.getOwnPropertyDescriptors(vscode.workspace)
+ let writes: Array<{ key: string; value: unknown; target: unknown }> = []
+
+ function config(input: { current?: boolean; previous?: boolean; previousWorkspace?: boolean }) {
+ writes = []
+ vscode.workspace.getConfiguration = ((section: string) =>
+ ({
+ get: (_key: string, fallback?: unknown) =>
+ section === INTEGRATED_BROWSER ? (input.current ?? fallback) : fallback,
+ inspect: () =>
+ section === INTEGRATED_BROWSER
+ ? { globalValue: input.current }
+ : { globalValue: input.previous, workspaceValue: input.previousWorkspace },
+ update: async (key: string, value: unknown, target: unknown) => {
+ writes.push({ key, value, target })
+ },
+ }) as unknown as vscode.WorkspaceConfiguration) as typeof vscode.workspace.getConfiguration
+ }
+
+ afterEach(() => {
+ Object.defineProperties(vscode.workspace, descriptors)
+ })
+
+ test("reads the preference from the Integrated Browser key", () => {
+ config({ current: false, previous: true })
+ expect(integratedBrowserUseSystemChrome()).toBe(false)
+ })
+
+ test("defaults to system Chrome when the key is unset", () => {
+ config({})
+ expect(integratedBrowserUseSystemChrome()).toBe(true)
+ })
+
+ test("copies a legacy preference once when the key is unset", async () => {
+ config({ previous: false })
+ await migrateIntegratedBrowserUseSystemChrome()
+ expect(writes).toEqual([{ key: "useSystemChrome", value: false, target: vscode.ConfigurationTarget.Global }])
+ })
+
+ test("keeps an existing Integrated Browser preference", async () => {
+ config({ current: true, previous: false })
+ await migrateIntegratedBrowserUseSystemChrome()
+ expect(writes).toEqual([])
+ })
+
+ test("does not write when no legacy preference exists", async () => {
+ config({})
+ await migrateIntegratedBrowserUseSystemChrome()
+ expect(writes).toEqual([])
+ })
+
+ test("does not promote a workspace-scoped legacy preference", async () => {
+ config({ previousWorkspace: false })
+ await migrateIntegratedBrowserUseSystemChrome()
+ expect(writes).toEqual([])
+ })
+})
diff --git a/packages/kilo-vscode/tests/unit/browser-automation-lifecycle.test.ts b/packages/kilo-vscode/tests/unit/browser-automation-lifecycle.test.ts
new file mode 100644
index 00000000000..3ce3d895e14
--- /dev/null
+++ b/packages/kilo-vscode/tests/unit/browser-automation-lifecycle.test.ts
@@ -0,0 +1,300 @@
+import { afterEach, beforeEach, describe, expect, test } from "bun:test"
+import * as vscode from "vscode"
+import { realpathSync } from "node:fs"
+import { tmpdir } from "node:os"
+import type { KiloClient } from "@kilocode/sdk/v2/client"
+import type { KiloConnectionService } from "../../src/services/cli-backend"
+import { BrowserAutomationService } from "../../src/services/browser-automation/browser-automation-service"
+
+describe("Playwright MCP lifecycle", () => {
+ const descriptors = Object.getOwnPropertyDescriptors(vscode.workspace)
+ const listeners = new Set<() => Promise>()
+ const events = new Set[0]>()
+ let service: BrowserAutomationService
+ let connection: KiloConnectionService
+ let enabled: boolean
+ let connected: boolean
+ let failed: boolean
+ let pending: Promise | undefined
+ let additions: string[]
+ let removals: string[]
+ let active: Set
+ let down: Set
+ let started: ReturnType>
+
+ function folders(dirs: string[]) {
+ Object.defineProperty(vscode.workspace, "workspaceFolders", {
+ configurable: true,
+ value: dirs.map((dir, index) => ({ uri: vscode.Uri.file(dir), name: dir, index })),
+ })
+ }
+
+ beforeEach(() => {
+ enabled = true
+ connected = true
+ failed = false
+ pending = undefined
+ additions = []
+ removals = []
+ active = new Set()
+ down = new Set()
+ started = Promise.withResolvers()
+ folders(["/repo"])
+ Object.defineProperty(vscode.workspace, "isTrusted", { configurable: true, value: true })
+ vscode.workspace.getConfiguration = (() => ({
+ get: (key: string, fallback: unknown) => (key === "enabled" ? enabled : fallback),
+ })) as typeof vscode.workspace.getConfiguration
+ Object.defineProperty(vscode.workspace, "onDidChangeWorkspaceFolders", {
+ configurable: true,
+ value: (listener: () => Promise) => {
+ listeners.add(listener)
+ return { dispose: () => listeners.delete(listener) }
+ },
+ })
+ const client = {
+ mcp: {
+ status: async ({ directory }: { directory: string }) => ({
+ data: active.has(directory)
+ ? { "kilo-playwright": { status: "connected" } }
+ : down.has(directory)
+ ? { "kilo-playwright": { status: "failed", error: "MCP startup failed" } }
+ : {},
+ }),
+ add: async ({ name, directory }: { name: string; directory: string }) => {
+ additions.push(directory)
+ started.resolve()
+ await pending
+ if (failed) {
+ down.add(directory)
+ return { data: { [name]: { status: "failed", error: "MCP startup failed" } } }
+ }
+ down.delete(directory)
+ active.add(directory)
+ return { data: { [name]: { status: "connected" } } }
+ },
+ disconnect: async ({ directory }: { directory: string }) => {
+ removals.push(directory)
+ active.delete(directory)
+ down.delete(directory)
+ },
+ },
+ } as unknown as KiloClient
+ connection = {
+ onEvent: (listener: Parameters[0]) => {
+ events.add(listener)
+ return () => events.delete(listener)
+ },
+ getClient: () => {
+ if (!connected) throw new Error("Disconnected")
+ return client
+ },
+ } as KiloConnectionService
+ service = new BrowserAutomationService(connection)
+ })
+
+ afterEach(() => {
+ service.dispose()
+ listeners.clear()
+ events.clear()
+ for (const key of Object.getOwnPropertyNames(vscode.workspace)) {
+ if (!(key in descriptors)) Reflect.deleteProperty(vscode.workspace, key)
+ }
+ Object.defineProperties(vscode.workspace, descriptors)
+ })
+
+ test("re-registers the same directory after a backend restart", async () => {
+ await service.syncWithSettings()
+ active.clear()
+ await service.reregisterIfEnabled()
+ expect(additions).toEqual(["/repo", "/repo"])
+ expect([...active]).toEqual(["/repo"])
+ })
+
+ test("prompt readiness waits for in-flight MCP startup without restarting it", async () => {
+ const gate = Promise.withResolvers()
+ pending = gate.promise
+ const registration = service.syncWithSettings()
+ await started.promise
+ let sent = false
+ const prompt = service.ready("/repo").then(() => {
+ sent = true
+ })
+ await Promise.resolve()
+ expect(sent).toBe(false)
+ gate.resolve()
+ await Promise.all([registration, prompt])
+ expect(sent).toBe(true)
+ expect(additions).toEqual(["/repo"])
+ })
+
+ test("prompt readiness gives up after the wait instead of stalling on startup", async () => {
+ const gate = Promise.withResolvers()
+ pending = gate.promise
+ service.dispose()
+ service = new BrowserAutomationService(connection, 5)
+ const registration = service.syncWithSettings()
+ await started.promise
+ await service.ready("/repo")
+ expect(active.size).toBe(0)
+ gate.resolve()
+ await registration
+ expect(active.has("/repo")).toBe(true)
+ })
+
+ test("prompt readiness repairs lost registration before the disposal event arrives", async () => {
+ await service.syncWithSettings()
+ active.clear()
+ await service.ready("/repo")
+ expect(additions).toEqual(["/repo", "/repo"])
+ expect(active.has("/repo")).toBe(true)
+ })
+
+ test("prompt readiness surfaces startup failures rather than submitting without tools", async () => {
+ failed = true
+ await expect(service.ready("/repo")).rejects.toThrow("Playwright browser automation could not connect")
+ expect(active.size).toBe(0)
+ })
+
+ test("a failed server is not respawned on every prompt", async () => {
+ failed = true
+ await expect(service.ready("/repo")).rejects.toThrow("could not connect")
+ await expect(service.ready("/repo")).rejects.toThrow("MCP startup failed")
+ expect(additions).toEqual(["/repo"])
+ failed = false
+ await service.syncWithSettings()
+ await service.ready("/repo")
+ expect(additions).toEqual(["/repo", "/repo"])
+ expect(active.has("/repo")).toBe(true)
+ })
+
+ test("disabled Playwright and unrelated worktrees do not block prompts", async () => {
+ await service.ready("/worktree")
+ enabled = false
+ await service.ready("/repo")
+ expect(additions).toEqual([])
+ })
+
+ async function invalidate(directory: string) {
+ active.delete(directory)
+ await Promise.all(
+ [...events].map((listener) =>
+ listener(
+ {
+ type: "server.instance.disposed",
+ properties: { directory },
+ },
+ directory,
+ ),
+ ),
+ )
+ }
+
+ test("restores registrations after config disposal without an SSE reconnect", async () => {
+ folders(["/repo", "/second"])
+ await service.syncWithSettings()
+ await invalidate("/repo")
+ expect(additions).toEqual(["/repo", "/second", "/repo"])
+ expect(active.has("/repo")).toBe(true)
+ expect(removals).toEqual([])
+ await invalidate("/second")
+ expect(active.size).toBe(2)
+ expect(additions).toEqual(["/repo", "/second", "/repo", "/second"])
+ })
+
+ test("ignores disposal for unrelated Agent Manager directories", async () => {
+ await service.syncWithSettings()
+ expect(events.size).toBe(1)
+ await invalidate("/worktree")
+ expect(additions).toEqual(["/repo"])
+ expect(removals).toEqual([])
+ })
+
+ test("matches canonical disposal paths to workspace aliases", async () => {
+ const dir = tmpdir()
+ folders([dir])
+ await service.syncWithSettings()
+ await invalidate(realpathSync(dir))
+ expect(additions).toEqual([dir, dir])
+ })
+
+ test("does not restore after disposal of the service", async () => {
+ await service.syncWithSettings()
+ service.dispose()
+ await invalidate("/repo")
+ expect(events.size).toBe(0)
+ expect(additions).toEqual(["/repo"])
+ })
+
+ test("does not restore a disposed registration when disabled", async () => {
+ await service.syncWithSettings()
+ enabled = false
+ expect(events.size).toBe(1)
+ await invalidate("/repo")
+ expect(additions).toEqual(["/repo"])
+ expect(removals).toEqual([])
+ expect(active.size).toBe(0)
+ // The handler ran: it dropped the directory, so a reconcile registers it again.
+ enabled = true
+ await Promise.all([...listeners].map((listener) => listener()))
+ expect(additions).toEqual(["/repo", "/repo"])
+ })
+
+ test("queues disposal behind an in-flight registration", async () => {
+ const gate = Promise.withResolvers()
+ pending = gate.promise
+ const registration = service.syncWithSettings()
+ await started.promise
+ const reset = invalidate("/repo")
+ gate.resolve()
+ await Promise.all([registration, reset])
+ expect(additions).toEqual(["/repo", "/repo"])
+ expect(active.has("/repo")).toBe(true)
+ })
+
+ test("a queued disable wins over in-flight registration and reconnect", async () => {
+ const gate = Promise.withResolvers()
+ pending = gate.promise
+ const registration = service.syncWithSettings()
+ await started.promise
+ const reconnect = service.reregisterIfEnabled()
+ enabled = false
+ const disable = service.syncWithSettings()
+ gate.resolve()
+ await Promise.all([registration, reconnect, disable])
+ expect(additions).toEqual(["/repo"])
+ expect(removals).toEqual(["/repo"])
+ expect(active.size).toBe(0)
+ })
+
+ test("retries a disable on reconnect without losing its directory", async () => {
+ await service.syncWithSettings()
+ connected = false
+ enabled = false
+ await service.syncWithSettings()
+ expect([...active]).toEqual(["/repo"])
+ connected = true
+ await service.reregisterIfEnabled()
+ expect(removals).toEqual(["/repo"])
+ expect(active.size).toBe(0)
+ })
+
+ test("reconciles added and removed folders without restarting retained registrations", async () => {
+ folders(["/repo", "/old"])
+ await service.syncWithSettings()
+ folders(["/repo", "/new"])
+ await Promise.all([...listeners].map((listener) => listener()))
+ expect(additions).toEqual(["/repo", "/old", "/new"])
+ expect(removals).toEqual(["/old"])
+ expect([...active]).toEqual(["/repo", "/new"])
+
+ enabled = false
+ await service.syncWithSettings()
+ folders(["/repo", "/disabled"])
+ await Promise.all([...listeners].map((listener) => listener()))
+ expect(additions).toEqual(["/repo", "/old", "/new"])
+ expect(active.size).toBe(0)
+ service.dispose()
+ expect(listeners.size).toBe(0)
+ expect(events.size).toBe(0)
+ })
+})
diff --git a/packages/kilo-vscode/tests/unit/browser-automation-recovery.test.ts b/packages/kilo-vscode/tests/unit/browser-automation-recovery.test.ts
new file mode 100644
index 00000000000..a122dba1203
--- /dev/null
+++ b/packages/kilo-vscode/tests/unit/browser-automation-recovery.test.ts
@@ -0,0 +1,31 @@
+import { describe, expect, it } from "bun:test"
+import { PLAYWRIGHT_OUTPUT_DIR, playwrightCommand } from "../../src/services/browser-automation/settings"
+
+describe("Playwright MCP command", () => {
+ it("uses system Chrome and a temp output directory by default", () => {
+ expect(playwrightCommand({ headless: false, useSystemChrome: true })).toEqual([
+ "npx",
+ "@playwright/mcp@latest",
+ "--browser",
+ "chrome",
+ "--output-dir",
+ PLAYWRIGHT_OUTPUT_DIR,
+ ])
+ })
+
+ it("adds headless and drops the Chrome channel", () => {
+ expect(playwrightCommand({ headless: true, useSystemChrome: false })).toEqual([
+ "npx",
+ "@playwright/mcp@latest",
+ "--headless",
+ "--output-dir",
+ PLAYWRIGHT_OUTPUT_DIR,
+ ])
+ })
+
+ it("keeps artifacts outside the workspace", () => {
+ const command = playwrightCommand({ headless: false, useSystemChrome: false })
+ const index = command.indexOf("--output-dir")
+ expect(command.at(index + 1)).not.toContain(process.cwd())
+ })
+})
diff --git a/packages/kilo-vscode/tests/unit/browser-broker.test.ts b/packages/kilo-vscode/tests/unit/browser-broker.test.ts
index 8fbd650eed6..1ee50beadba 100644
--- a/packages/kilo-vscode/tests/unit/browser-broker.test.ts
+++ b/packages/kilo-vscode/tests/unit/browser-broker.test.ts
@@ -495,20 +495,25 @@ describe("BrowserBroker", () => {
expect(untrusted.sessions()).toEqual([])
})
- test("explains how to recover when the selected browser runtime is missing", async () => {
- const broker = new BrowserBroker({
- log: () => {},
- useSystemChrome: () => false,
- launch: async () => {
- throw new Error("Browser executable does not exist")
- },
- })
- brokers.push(broker)
- await expect(
- broker.open({ sessionId: "missing-runtime", directory: "/tmp/project" }, "http://localhost:3000/"),
- ).rejects.toThrow("enable Use System Chrome")
- expect(broker.sessions()).toEqual([])
- })
+ test.each([false, true])(
+ "points at Agent Manager settings when the browser is missing (Chrome: %s)",
+ async (chrome) => {
+ const broker = new BrowserBroker({
+ log: () => {},
+ useSystemChrome: () => chrome,
+ launch: async () => {
+ throw new Error("Browser executable does not exist")
+ },
+ })
+ brokers.push(broker)
+ await expect(
+ broker.open({ sessionId: "missing-runtime", directory: "/tmp/project" }, "http://localhost:3000/"),
+ ).rejects.toThrow(
+ `${chrome ? "disable" : "enable"} Use System Chrome in Kilo Settings > Experimental for the Integrated Browser`,
+ )
+ expect(broker.sessions()).toEqual([])
+ },
+ )
test("rejects unregistered browser sessions before launching Chrome", async () => {
const broker = new BrowserBroker({ log: () => {} })
diff --git a/packages/kilo-vscode/tests/unit/kilo-provider-load-messages.test.ts b/packages/kilo-vscode/tests/unit/kilo-provider-load-messages.test.ts
index 4babcd3dddd..21169330e6b 100644
--- a/packages/kilo-vscode/tests/unit/kilo-provider-load-messages.test.ts
+++ b/packages/kilo-vscode/tests/unit/kilo-provider-load-messages.test.ts
@@ -226,6 +226,7 @@ function createConnection(client: ReturnType | null) {
getConnectionError: () => null,
resolveEventSessionId: () => undefined,
recordMessageSessionId: () => undefined,
+ prepareTools: async (_dir: string) => {},
notifyNotificationDismissed: () => undefined,
pruneSession: () => undefined,
registerVisible: () => undefined,
@@ -294,7 +295,7 @@ function makeProvider(
sent.push(message)
},
}
- return { provider, internal, sent }
+ return { provider, internal, sent, connection }
}
function status(internal: ProviderInternals, type: "busy" | "idle", directory = "/repo", sessionID = "s1") {
@@ -1595,6 +1596,74 @@ describe("KiloProvider.handleLoadMessages / slim payload", () => {
expect(client.prompted).toHaveLength(1)
})
+ it("waits for browser tool readiness before submitting the prompt", async () => {
+ const client = createClient()
+ const { internal, connection } = makeProvider(client)
+ internal.currentSession = mkSession()
+ internal.gatherEditorContext = async () => ({})
+ const started = Promise.withResolvers()
+ const ready = Promise.withResolvers()
+ connection.prepareTools = async (dir) => {
+ expect(dir).toBe("/repo")
+ started.resolve()
+ await ready.promise
+ }
+ const send = internal.handleSendMessage("browser test", "m1", "s1")
+ await started.promise
+ expect(client.prompted).toHaveLength(0)
+ ready.resolve()
+ await send
+ expect(client.prompted).toHaveLength(1)
+ })
+
+ it("waits for browser tool readiness for Agent Manager worktree prompts too", async () => {
+ const client = createClient()
+ const { internal, connection } = makeProvider(client)
+ internal.gatherEditorContext = async () => ({})
+ const order: string[] = []
+ connection.prepareTools = async (dir) => {
+ order.push(`prepare:${dir}`)
+ }
+ client.session.promptAsync = async (params: Record) => {
+ order.push(`prompt:${String(params.directory)}`)
+ return { data: undefined }
+ }
+ await internal.handleSendMessage(
+ "browser test",
+ "m1",
+ undefined,
+ "draft-1",
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ undefined,
+ "worktree-ctx",
+ "/worktree",
+ )
+ expect(client.created).toEqual([expect.objectContaining({ directory: "/worktree" })])
+ expect(order).toEqual(["prepare:/worktree", "prompt:/worktree"])
+ })
+
+ it("reports a browser readiness failure instead of submitting without tools", async () => {
+ const client = createClient()
+ const { internal, connection, sent } = makeProvider(client)
+ internal.currentSession = mkSession()
+ internal.gatherEditorContext = async () => ({})
+ connection.prepareTools = async () => {
+ throw new Error("Playwright browser automation could not connect")
+ }
+ await internal.handleSendMessage("browser test", "m1", "s1")
+ expect(client.prompted).toHaveLength(0)
+ expect(sent).toContainEqual(
+ expect.objectContaining({
+ type: "sendMessageFailed",
+ error: "Playwright browser automation could not connect",
+ }),
+ )
+ })
+
it("aborts when the cost alert is stopped", async () => {
const client = createClient()
const { internal, sent } = makeProvider(client)
diff --git a/packages/kilo-vscode/tests/unit/kilo-provider-route-integration.test.ts b/packages/kilo-vscode/tests/unit/kilo-provider-route-integration.test.ts
index cee9dd9747f..65186ccc425 100644
--- a/packages/kilo-vscode/tests/unit/kilo-provider-route-integration.test.ts
+++ b/packages/kilo-vscode/tests/unit/kilo-provider-route-integration.test.ts
@@ -88,6 +88,7 @@ function mockConnection(getImpl?: (p: SessionGetParams) => Promise, vcs
getConnectionError: () => null,
resolveEventSessionId: () => undefined,
recordMessageSessionId: () => undefined,
+ prepareTools: async () => {},
notifyNotificationDismissed: () => undefined,
} as unknown as ConstructorParameters[1],
}
diff --git a/packages/kilo-vscode/tests/unit/side-panel-state.test.ts b/packages/kilo-vscode/tests/unit/side-panel-state.test.ts
index 488275970c5..2f55c02a305 100644
--- a/packages/kilo-vscode/tests/unit/side-panel-state.test.ts
+++ b/packages/kilo-vscode/tests/unit/side-panel-state.test.ts
@@ -6,6 +6,76 @@ import { createProjectStore } from "../../webview-ui/agent-manager/project/store
import { setupVisible, updateSetup } from "../../webview-ui/agent-manager/project/progress"
describe("Agent Manager panel ownership", () => {
+ it("opens and closes the Integrated Browser before a session exists", () => {
+ createRoot((dispose) => {
+ const panels = createSidePanel({ project: () => "project", selection: () => "local", current: () => undefined })
+ panels.toggle(SidePanel.Browser)
+ expect(panels.panel()).toBe(SidePanel.Browser)
+ expect(panels.session()).toBeUndefined()
+ panels.toggle(SidePanel.Browser)
+ expect(panels.panel()).toBeNull()
+ panels.open(SidePanel.Browser)
+ panels.open(SidePanel.Documents)
+ expect(panels.panel()).toBe(SidePanel.Documents)
+ dispose()
+ })
+ })
+
+ it("keeps the empty browser separate from real sessions, projects, and worktrees", () => {
+ createRoot((dispose) => {
+ const [project, activate] = createSignal("project")
+ const [selection, select] = createSignal("local")
+ const [current, session] = createSignal()
+ const panels = createSidePanel({ project, selection, current })
+ panels.open(SidePanel.Browser)
+ select("worktree")
+ expect(panels.panel()).toBeNull()
+ select("local")
+ activate("other")
+ expect(panels.panel()).toBeNull()
+ activate("project")
+ expect(panels.panel()).toBe(SidePanel.Browser)
+ session("real-session")
+ expect(panels.panel()).toBeNull()
+ panels.open(SidePanel.Browser)
+ session("sibling")
+ expect(panels.panel()).toBeNull()
+ session("real-session")
+ expect(panels.panel()).toBe(SidePanel.Browser)
+ panels.close()
+ session(undefined)
+ expect(panels.panel()).toBe(SidePanel.Browser)
+ dispose()
+ })
+ })
+
+ it("does not let a closed draft browser hide a worktree panel after the session ends", () => {
+ createRoot((dispose) => {
+ const [current, session] = createSignal()
+ const panels = createSidePanel({ project: () => "project", selection: () => "local", current })
+ panels.open(SidePanel.Browser)
+ panels.close()
+ expect(panels.panel()).toBeNull()
+ session("real-session")
+ panels.open(SidePanel.Diff)
+ expect(panels.panel()).toBe(SidePanel.Diff)
+ session(undefined)
+ expect(panels.panel()).toBe(SidePanel.Diff)
+ dispose()
+ })
+ })
+
+ it("still requires a real session for other session-owned panels", () => {
+ createRoot((dispose) => {
+ const panels = createSidePanel({ project: () => "project", selection: () => "local", current: () => undefined })
+ panels.open(SidePanel.Subagents)
+ expect(panels.panel()).toBeNull()
+ panels.open(SidePanel.EditPreview)
+ expect(panels.panel()).toBeNull()
+ dispose()
+ })
+ })
+
it("restores Local Diff and session panels independently, including explicit closes", () => {
createRoot((dispose) => {
const [project, activate] = createSignal("project")
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ar.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ar.ts
index 94bdba02b00..2b16eb0b887 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ar.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ar.ts
@@ -422,7 +422,7 @@ export const dict = {
"agentManager.caffeination.armed": "تم تفعيل وضع إبقاء الكمبيوتر مستيقظًا لوكلاء Kilo؛ انقر لتعطيله",
"agentManager.caffeination.active": "يتم إبقاء الكمبيوتر مستيقظًا أثناء عمل وكلاء Kilo",
"agentManager.caffeination.unavailable": "وضع إبقاء الكمبيوتر مستيقظًا غير متاح على هذا النظام الأساسي",
- "agentManager.browser.title": "المتصفح",
+ "agentManager.browser.title": "المتصفح المدمج",
"agentManager.browser.url": "URL التطبيق المحلي",
"agentManager.browser.urlPlaceholder": "http://localhost:3000",
"agentManager.browser.open": "فتح",
@@ -431,7 +431,7 @@ export const dict = {
"agentManager.browser.inspect": "تحديد عنصر",
"agentManager.browser.devtoolsTitle": "أدوات المطوّرين",
"agentManager.browser.empty": "افتح تطبيقًا محليًا لمعاينته هنا.",
- "agentManager.browser.noSession": "اختر جلسة Agent Manager أولًا.",
+ "agentManager.browser.noSession": "ابدأ جلسة أو اختر جلسة في Agent Manager لاستعراض تطبيق محلي.",
"agentManager.browser.screenshotAlt": "صفحة المتصفح الحالية",
"agentManager.browser.errors": "مشكلات المتصفح: {{count}}",
"agentManager.browser.diagnostics": "تشخيص المتصفح",
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/br.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/br.ts
index 1a4bcaba030..ba1f83f2298 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/br.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/br.ts
@@ -431,7 +431,7 @@ export const dict = {
"agentManager.caffeination.active": "Mantendo o computador acordado enquanto os agentes Kilo trabalham",
"agentManager.caffeination.unavailable":
"O modo de manter o computador acordado não está disponível nesta plataforma",
- "agentManager.browser.title": "Navegador",
+ "agentManager.browser.title": "Navegador Integrado",
"agentManager.browser.url": "URL da aplicação local",
"agentManager.browser.urlPlaceholder": "http://localhost:3000",
"agentManager.browser.open": "Abrir",
@@ -440,7 +440,8 @@ export const dict = {
"agentManager.browser.refresh": "Atualizar navegador",
"agentManager.browser.close": "Fechar navegador",
"agentManager.browser.empty": "Abra uma aplicação local para visualizá-la aqui.",
- "agentManager.browser.noSession": "Selecione primeiro uma sessão do Agent Manager.",
+ "agentManager.browser.noSession":
+ "Inicie ou selecione uma sessão no Agent Manager para navegar em um aplicativo local.",
"agentManager.browser.screenshotAlt": "Página atual do navegador",
"agentManager.browser.errors": "Problemas do navegador: {{count}}",
"agentManager.browser.diagnostics": "Diagnóstico do navegador",
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/bs.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/bs.ts
index a1dafd775b0..7a8ab06bbd9 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/bs.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/bs.ts
@@ -427,7 +427,7 @@ export const dict = {
"Režim održavanja računara budnim je uključen za Kilo agente; kliknite da ga isključite",
"agentManager.caffeination.active": "Računar se održava budnim dok Kilo agenti rade",
"agentManager.caffeination.unavailable": "Režim održavanja računara budnim nije dostupan na ovoj platformi",
- "agentManager.browser.title": "Preglednik",
+ "agentManager.browser.title": "Integrirani preglednik",
"agentManager.browser.url": "URL lokalne aplikacije",
"agentManager.browser.urlPlaceholder": "http://localhost:3000",
"agentManager.browser.open": "Otvori",
@@ -436,7 +436,8 @@ export const dict = {
"agentManager.browser.refresh": "Osvježi preglednik",
"agentManager.browser.close": "Zatvori preglednik",
"agentManager.browser.empty": "Otvorite lokalnu aplikaciju da biste je ovdje pregledali.",
- "agentManager.browser.noSession": "Najprije odaberite sesiju aplikacije Agent Manager.",
+ "agentManager.browser.noSession":
+ "Pokrenite ili odaberite sesiju u Agent Manageru da biste pregledali lokalnu aplikaciju.",
"agentManager.browser.screenshotAlt": "Trenutna stranica preglednika",
"agentManager.browser.errors": "Problemi preglednika: {{count}}",
"agentManager.browser.diagnostics": "Dijagnostika preglednika",
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/da.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/da.ts
index 5eb4a11933b..2f19020fba3 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/da.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/da.ts
@@ -429,7 +429,7 @@ export const dict = {
"agentManager.caffeination.active": "Holder computeren vågen, mens Kilo-agenterne arbejder",
"agentManager.caffeination.unavailable":
"Tilstanden til at holde computeren vågen er ikke tilgængelig på denne platform",
- "agentManager.browser.title": "Browser",
+ "agentManager.browser.title": "Integreret browser",
"agentManager.browser.url": "URL til lokal applikation",
"agentManager.browser.urlPlaceholder": "http://localhost:3000",
"agentManager.browser.open": "Åbn",
@@ -438,7 +438,7 @@ export const dict = {
"agentManager.browser.refresh": "Opdater browser",
"agentManager.browser.close": "Luk browser",
"agentManager.browser.empty": "Åbn en lokal applikation for at få vist en forhåndsvisning her.",
- "agentManager.browser.noSession": "Vælg først en session i Agent Manager.",
+ "agentManager.browser.noSession": "Start eller vælg en session i Agent Manager for at gennemse en lokal applikation.",
"agentManager.browser.screenshotAlt": "Aktuel browserside",
"agentManager.browser.errors": "Browserproblemer: {{count}}",
"agentManager.browser.diagnostics": "Browserdiagnostik",
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/de.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/de.ts
index adfa1ee89af..891d0a41143 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/de.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/de.ts
@@ -434,7 +434,7 @@ export const dict = {
"agentManager.caffeination.armed": "Wachhaltemodus für Kilo-Agenten aktiviert; zum Deaktivieren klicken",
"agentManager.caffeination.active": "Computer wird wach gehalten, während Kilo-Agenten arbeiten",
"agentManager.caffeination.unavailable": "Der Wachhaltemodus ist auf dieser Plattform nicht verfügbar",
- "agentManager.browser.title": "Browser",
+ "agentManager.browser.title": "Integrierter Browser",
"agentManager.browser.url": "URL der lokalen Anwendung",
"agentManager.browser.urlPlaceholder": "http://localhost:3000",
"agentManager.browser.open": "Öffnen",
@@ -443,7 +443,8 @@ export const dict = {
"agentManager.browser.refresh": "Browser aktualisieren",
"agentManager.browser.close": "Browser schließen",
"agentManager.browser.empty": "Öffnen Sie eine lokale Anwendung, um sie hier in der Vorschau anzuzeigen.",
- "agentManager.browser.noSession": "Wählen Sie zuerst eine Sitzung im Agent Manager aus.",
+ "agentManager.browser.noSession":
+ "Starten oder wählen Sie eine Sitzung im Agent Manager, um eine lokale Anwendung zu öffnen.",
"agentManager.browser.screenshotAlt": "Aktuelle Browserseite",
"agentManager.browser.errors": "Browserprobleme: {{count}}",
"agentManager.browser.diagnostics": "Browserdiagnose",
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/en.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/en.ts
index 987bf859207..5618aef5fde 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/en.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/en.ts
@@ -435,7 +435,7 @@ export const dict = {
"agentManager.documents.preview": "Preview document",
"agentManager.documents.source": "Show source",
"agentManager.documents.comments": "{{count}} comments",
- "agentManager.browser.title": "Browser",
+ "agentManager.browser.title": "Integrated Browser",
"agentManager.browser.url": "Local application URL",
"agentManager.browser.urlPlaceholder": "http://localhost:3000",
"agentManager.browser.open": "Open",
@@ -444,7 +444,7 @@ export const dict = {
"agentManager.browser.refresh": "Refresh browser",
"agentManager.browser.close": "Close browser",
"agentManager.browser.empty": "Open a local application to preview it here.",
- "agentManager.browser.noSession": "Select an Agent Manager session first.",
+ "agentManager.browser.noSession": "Start or select a session in Agent Manager to browse a local application.",
"agentManager.browser.screenshotAlt": "Current browser page",
"agentManager.browser.errors": "Browser issues: {{count}}",
"agentManager.browser.diagnostics": "Browser diagnostics",
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/es.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/es.ts
index 89c8ac24c7a..790d8bec842 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/es.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/es.ts
@@ -434,7 +434,7 @@ export const dict = {
"agentManager.caffeination.active": "Manteniendo el equipo activo mientras trabajan los agentes de Kilo",
"agentManager.caffeination.unavailable":
"El modo para mantener el equipo activo no está disponible en esta plataforma",
- "agentManager.browser.title": "Navegador",
+ "agentManager.browser.title": "Navegador integrado",
"agentManager.browser.url": "URL de la aplicación local",
"agentManager.browser.urlPlaceholder": "http://localhost:3000",
"agentManager.browser.open": "Abrir",
@@ -443,7 +443,8 @@ export const dict = {
"agentManager.browser.refresh": "Actualizar navegador",
"agentManager.browser.close": "Cerrar navegador",
"agentManager.browser.empty": "Abre una aplicación local para previsualizarla aquí.",
- "agentManager.browser.noSession": "Selecciona primero una sesión de Agent Manager.",
+ "agentManager.browser.noSession":
+ "Inicia o selecciona una sesión en Agent Manager para navegar por una aplicación local.",
"agentManager.browser.screenshotAlt": "Página actual del navegador",
"agentManager.browser.errors": "Problemas del navegador: {{count}}",
"agentManager.browser.diagnostics": "Diagnóstico del navegador",
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/fa.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/fa.ts
index e19c2035009..f0aaa9db908 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/fa.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/fa.ts
@@ -430,7 +430,7 @@ export const dict = {
"حالت بیدار نگه داشتن رایانه برای عاملهای Kilo فعال است؛ برای غیرفعال کردن کلیک کنید",
"agentManager.caffeination.active": "رایانه هنگام کار عاملهای Kilo بیدار نگه داشته میشود",
"agentManager.caffeination.unavailable": "حالت بیدار نگه داشتن رایانه در این پلتفرم در دسترس نیست",
- "agentManager.browser.title": "مرورگر",
+ "agentManager.browser.title": "مرورگر یکپارچه",
"agentManager.browser.url": "URL برنامه محلی",
"agentManager.browser.urlPlaceholder": "http://localhost:3000",
"agentManager.browser.open": "باز کردن",
@@ -439,7 +439,7 @@ export const dict = {
"agentManager.browser.inspect": "انتخاب عنصر",
"agentManager.browser.devtoolsTitle": "ابزارهای توسعه",
"agentManager.browser.empty": "برای پیشنمایش، یک برنامه محلی را باز کنید.",
- "agentManager.browser.noSession": "ابتدا یک جلسه Agent Manager را انتخاب کنید.",
+ "agentManager.browser.noSession": "برای مرور یک برنامه محلی، یک جلسه در Agent Manager شروع یا انتخاب کنید.",
"agentManager.browser.screenshotAlt": "صفحه فعلی مرورگر",
"agentManager.browser.errors": "مشکلات مرورگر: {{count}}",
"agentManager.browser.diagnostics": "عیبیابی مرورگر",
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/fr.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/fr.ts
index 466d66f656d..a76a2f5f7dc 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/fr.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/fr.ts
@@ -434,7 +434,7 @@ export const dict = {
"agentManager.caffeination.armed": "Mode anti-veille activé pour les agents Kilo ; cliquez pour désactiver",
"agentManager.caffeination.active": "Ordinateur maintenu éveillé pendant que les agents Kilo travaillent",
"agentManager.caffeination.unavailable": "Le mode veille active n'est pas disponible sur cette plateforme",
- "agentManager.browser.title": "Navigateur",
+ "agentManager.browser.title": "Navigateur intégré",
"agentManager.browser.url": "URL de l'application locale",
"agentManager.browser.urlPlaceholder": "http://localhost:3000",
"agentManager.browser.open": "Ouvrir",
@@ -443,7 +443,8 @@ export const dict = {
"agentManager.browser.refresh": "Actualiser le navigateur",
"agentManager.browser.close": "Fermer le navigateur",
"agentManager.browser.empty": "Ouvrez une application locale pour l'afficher ici en aperçu.",
- "agentManager.browser.noSession": "Sélectionnez d'abord une session dans Agent Manager.",
+ "agentManager.browser.noSession":
+ "Démarrez ou sélectionnez une session dans Agent Manager pour parcourir une application locale.",
"agentManager.browser.screenshotAlt": "Page actuelle du navigateur",
"agentManager.browser.errors": "Problèmes du navigateur : {{count}}",
"agentManager.browser.diagnostics": "Diagnostics du navigateur",
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/it.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/it.ts
index 3e64d2042f4..34a455488f4 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/it.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/it.ts
@@ -440,7 +440,7 @@ export const dict = {
"agentManager.caffeination.active": "Computer mantenuto attivo mentre gli agenti Kilo lavorano",
"agentManager.caffeination.unavailable":
"La modalità per mantenere il computer attivo non è disponibile su questa piattaforma",
- "agentManager.browser.title": "Browser",
+ "agentManager.browser.title": "Browser integrato",
"agentManager.browser.url": "URL dell'applicazione locale",
"agentManager.browser.urlPlaceholder": "http://localhost:3000",
"agentManager.browser.open": "Apri",
@@ -449,7 +449,8 @@ export const dict = {
"agentManager.browser.refresh": "Aggiorna browser",
"agentManager.browser.close": "Chiudi browser",
"agentManager.browser.empty": "Apri un'applicazione locale per visualizzarla qui.",
- "agentManager.browser.noSession": "Seleziona prima una sessione di Agent Manager.",
+ "agentManager.browser.noSession":
+ "Avvia o seleziona una sessione in Agent Manager per navigare in un'applicazione locale.",
"agentManager.browser.screenshotAlt": "Pagina corrente del browser",
"agentManager.browser.errors": "Problemi del browser: {{count}}",
"agentManager.browser.diagnostics": "Diagnostica del browser",
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ja.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ja.ts
index b8752911bd1..290dc0cf256 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ja.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ja.ts
@@ -427,7 +427,7 @@ export const dict = {
"agentManager.caffeination.armed": "Kilo エージェント用のスリープ防止モードが有効です。クリックして無効にします",
"agentManager.caffeination.active": "Kilo エージェントの作業中もコンピューターをスリープさせません",
"agentManager.caffeination.unavailable": "このプラットフォームではスリープ防止モードを利用できません",
- "agentManager.browser.title": "ブラウザー",
+ "agentManager.browser.title": "統合ブラウザー",
"agentManager.browser.url": "ローカルアプリケーション URL",
"agentManager.browser.urlPlaceholder": "http://localhost:3000",
"agentManager.browser.open": "開く",
@@ -436,7 +436,8 @@ export const dict = {
"agentManager.browser.inspect": "要素を選択",
"agentManager.browser.devtoolsTitle": "開発者ツール",
"agentManager.browser.empty": "ローカルアプリケーションを開くと、ここでプレビューできます。",
- "agentManager.browser.noSession": "先に Agent Manager セッションを選択してください。",
+ "agentManager.browser.noSession":
+ "ローカルアプリケーションを表示するには、Agent Manager でセッションを開始または選択してください。",
"agentManager.browser.screenshotAlt": "現在のブラウザーページ",
"agentManager.browser.errors": "ブラウザーの問題: {{count}} 件",
"agentManager.browser.diagnostics": "ブラウザー診断",
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ko.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ko.ts
index c15ea6fca7a..eef8a8516de 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ko.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ko.ts
@@ -425,7 +425,7 @@ export const dict = {
"agentManager.caffeination.armed": "Kilo 에이전트용 절전 방지 모드가 활성화되었습니다. 클릭하여 비활성화",
"agentManager.caffeination.active": "Kilo 에이전트가 작업하는 동안 컴퓨터를 절전 모드로 전환하지 않습니다",
"agentManager.caffeination.unavailable": "이 플랫폼에서는 절전 방지 모드를 사용할 수 없습니다",
- "agentManager.browser.title": "브라우저",
+ "agentManager.browser.title": "통합 브라우저",
"agentManager.browser.url": "로컬 애플리케이션 URL",
"agentManager.browser.urlPlaceholder": "http://localhost:3000",
"agentManager.browser.open": "열기",
@@ -434,7 +434,7 @@ export const dict = {
"agentManager.browser.inspect": "요소 선택",
"agentManager.browser.devtoolsTitle": "개발자 도구",
"agentManager.browser.empty": "로컬 애플리케이션을 열어 여기에서 미리 보세요.",
- "agentManager.browser.noSession": "먼저 Agent Manager 세션을 선택하세요.",
+ "agentManager.browser.noSession": "로컬 애플리케이션을 탐색하려면 Agent Manager에서 세션을 시작하거나 선택하세요.",
"agentManager.browser.screenshotAlt": "현재 브라우저 페이지",
"agentManager.browser.errors": "브라우저 문제: {{count}}개",
"agentManager.browser.diagnostics": "브라우저 진단",
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/nl.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/nl.ts
index 2d47eb747ac..6fe7140b679 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/nl.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/nl.ts
@@ -436,7 +436,7 @@ export const dict = {
"agentManager.caffeination.active": "Computer wordt wakker gehouden terwijl Kilo-agents werken",
"agentManager.caffeination.unavailable":
"De modus om de computer wakker te houden is niet beschikbaar op dit platform",
- "agentManager.browser.title": "Browser",
+ "agentManager.browser.title": "Geïntegreerde browser",
"agentManager.browser.url": "URL van lokale applicatie",
"agentManager.browser.urlPlaceholder": "http://localhost:3000",
"agentManager.browser.open": "Openen",
@@ -445,7 +445,8 @@ export const dict = {
"agentManager.browser.refresh": "Browser vernieuwen",
"agentManager.browser.close": "Browser sluiten",
"agentManager.browser.empty": "Open een lokale applicatie om deze hier te bekijken.",
- "agentManager.browser.noSession": "Selecteer eerst een sessie in Agent Manager.",
+ "agentManager.browser.noSession":
+ "Start of selecteer een sessie in Agent Manager om een lokale applicatie te bekijken.",
"agentManager.browser.screenshotAlt": "Huidige browserpagina",
"agentManager.browser.errors": "Browserproblemen: {{count}}",
"agentManager.browser.diagnostics": "Browserdiagnostiek",
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/no.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/no.ts
index cd3d19d5bb1..857cccf4e59 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/no.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/no.ts
@@ -427,7 +427,7 @@ export const dict = {
"agentManager.caffeination.active": "Holder datamaskinen våken mens Kilo-agentene arbeider",
"agentManager.caffeination.unavailable":
"Modus for å holde datamaskinen våken er ikke tilgjengelig på denne plattformen",
- "agentManager.browser.title": "Nettleser",
+ "agentManager.browser.title": "Integrert nettleser",
"agentManager.browser.url": "URL for lokal applikasjon",
"agentManager.browser.urlPlaceholder": "http://localhost:3000",
"agentManager.browser.open": "Åpne",
@@ -436,7 +436,7 @@ export const dict = {
"agentManager.browser.refresh": "Oppdater nettleser",
"agentManager.browser.close": "Lukk nettleser",
"agentManager.browser.empty": "Åpne en lokal applikasjon for å forhåndsvise den her.",
- "agentManager.browser.noSession": "Velg en økt i Agent Manager først.",
+ "agentManager.browser.noSession": "Start eller velg en økt i Agent Manager for å bla i en lokal applikasjon.",
"agentManager.browser.screenshotAlt": "Gjeldende nettleserside",
"agentManager.browser.errors": "Nettleserproblemer: {{count}}",
"agentManager.browser.diagnostics": "Nettleserdiagnostikk",
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/pl.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/pl.ts
index e4a322f8c7d..28f8f9c7609 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/pl.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/pl.ts
@@ -428,7 +428,7 @@ export const dict = {
"Tryb zapobiegania uśpieniu komputera włączony dla agentów Kilo; kliknij, aby wyłączyć",
"agentManager.caffeination.active": "Komputer pozostaje aktywny, gdy agenci Kilo pracują",
"agentManager.caffeination.unavailable": "Tryb utrzymywania komputera aktywnego jest niedostępny na tej platformie",
- "agentManager.browser.title": "Przeglądarka",
+ "agentManager.browser.title": "Zintegrowana przeglądarka",
"agentManager.browser.url": "URL lokalnej aplikacji",
"agentManager.browser.urlPlaceholder": "http://localhost:3000",
"agentManager.browser.open": "Otwórz",
@@ -437,7 +437,7 @@ export const dict = {
"agentManager.browser.refresh": "Odśwież przeglądarkę",
"agentManager.browser.close": "Zamknij przeglądarkę",
"agentManager.browser.empty": "Otwórz lokalną aplikację, aby wyświetlić ją tutaj.",
- "agentManager.browser.noSession": "Najpierw wybierz sesję aplikacji Agent Manager.",
+ "agentManager.browser.noSession": "Uruchom lub wybierz sesję w Agent Manager, aby przeglądać lokalną aplikację.",
"agentManager.browser.screenshotAlt": "Bieżąca strona przeglądarki",
"agentManager.browser.errors": "Problemy przeglądarki: {{count}}",
"agentManager.browser.diagnostics": "Diagnostyka przeglądarki",
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ru.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ru.ts
index fd68e293a37..46a8d63e066 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/ru.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/ru.ts
@@ -430,7 +430,7 @@ export const dict = {
"agentManager.caffeination.armed": "Режим предотвращения сна включён для агентов Kilo; нажмите для отключения",
"agentManager.caffeination.active": "Компьютер не переходит в спящий режим, пока работают агенты Kilo",
"agentManager.caffeination.unavailable": "Режим предотвращения сна недоступен на этой платформе",
- "agentManager.browser.title": "Браузер",
+ "agentManager.browser.title": "Встроенный браузер",
"agentManager.browser.url": "URL локального приложения",
"agentManager.browser.urlPlaceholder": "http://localhost:3000",
"agentManager.browser.open": "Открыть",
@@ -439,7 +439,7 @@ export const dict = {
"agentManager.browser.inspect": "Выбрать элемент",
"agentManager.browser.devtoolsTitle": "Инструменты разработчика",
"agentManager.browser.empty": "Откройте локальное приложение, чтобы просмотреть его здесь.",
- "agentManager.browser.noSession": "Сначала выберите сеанс Agent Manager.",
+ "agentManager.browser.noSession": "Запустите или выберите сеанс в Agent Manager, чтобы открыть локальное приложение.",
"agentManager.browser.screenshotAlt": "Текущая страница браузера",
"agentManager.browser.errors": "Проблемы браузера: {{count}}",
"agentManager.browser.diagnostics": "Диагностика браузера",
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/th.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/th.ts
index 3a448fcb81d..1928b7f9738 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/th.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/th.ts
@@ -419,7 +419,7 @@ export const dict = {
"agentManager.caffeination.armed": "เปิดโหมดป้องกันการพักเครื่องสำหรับเอเจนต์ Kilo แล้ว คลิกเพื่อปิดใช้งาน",
"agentManager.caffeination.active": "กำลังป้องกันคอมพิวเตอร์เข้าสู่โหมดพักขณะเอเจนต์ Kilo ทำงาน",
"agentManager.caffeination.unavailable": "โหมดป้องกันการพักเครื่องไม่พร้อมใช้งานบนแพลตฟอร์มนี้",
- "agentManager.browser.title": "เบราว์เซอร์",
+ "agentManager.browser.title": "เบราว์เซอร์ในตัว",
"agentManager.browser.url": "URL ของแอปพลิเคชันในเครื่อง",
"agentManager.browser.urlPlaceholder": "http://localhost:3000",
"agentManager.browser.open": "เปิด",
@@ -428,7 +428,7 @@ export const dict = {
"agentManager.browser.inspect": "เลือกองค์ประกอบ",
"agentManager.browser.devtoolsTitle": "เครื่องมือสำหรับนักพัฒนา",
"agentManager.browser.empty": "เปิดแอปพลิเคชันในเครื่องเพื่อดูตัวอย่างที่นี่",
- "agentManager.browser.noSession": "เลือกเซสชัน Agent Manager ก่อน",
+ "agentManager.browser.noSession": "เริ่มหรือเลือกเซสชันใน Agent Manager เพื่อเรียกดูแอปพลิเคชันในเครื่อง",
"agentManager.browser.screenshotAlt": "หน้าปัจจุบันของเบราว์เซอร์",
"agentManager.browser.errors": "ปัญหาเบราว์เซอร์: {{count}} รายการ",
"agentManager.browser.diagnostics": "การวินิจฉัยเบราว์เซอร์",
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/tr.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/tr.ts
index 2ac8d91377e..8c712dc179e 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/tr.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/tr.ts
@@ -436,7 +436,7 @@ export const dict = {
"Kilo ajanları için bilgisayarı uyanık tutma modu etkin; devre dışı bırakmak için tıklayın",
"agentManager.caffeination.active": "Kilo ajanları çalışırken bilgisayar uyanık tutuluyor",
"agentManager.caffeination.unavailable": "Bilgisayarı uyanık tutma modu bu platformda kullanılamıyor",
- "agentManager.browser.title": "Tarayıcı",
+ "agentManager.browser.title": "Entegre Tarayıcı",
"agentManager.browser.url": "Yerel uygulama URL'si",
"agentManager.browser.urlPlaceholder": "http://localhost:3000",
"agentManager.browser.open": "Aç",
@@ -445,7 +445,8 @@ export const dict = {
"agentManager.browser.inspect": "Öğeyi seç",
"agentManager.browser.devtoolsTitle": "Geliştirici araçları",
"agentManager.browser.empty": "Burada önizlemek için yerel bir uygulama açın.",
- "agentManager.browser.noSession": "Önce bir Agent Manager oturumu seçin.",
+ "agentManager.browser.noSession":
+ "Yerel bir uygulamada gezinmek için Agent Manager'da bir oturum başlatın veya seçin.",
"agentManager.browser.screenshotAlt": "Geçerli tarayıcı sayfası",
"agentManager.browser.errors": "Tarayıcı sorunları: {{count}}",
"agentManager.browser.diagnostics": "Tarayıcı tanılaması",
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/uk.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/uk.ts
index f9ffce7e927..0f233a8021a 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/uk.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/uk.ts
@@ -438,7 +438,7 @@ export const dict = {
"agentManager.caffeination.armed": "Режим запобігання сну ввімкнено для агентів Kilo; натисніть, щоб вимкнути",
"agentManager.caffeination.active": "Комп'ютер не переходить у режим сну, доки працюють агенти Kilo",
"agentManager.caffeination.unavailable": "Режим запобігання сну недоступний на цій платформі",
- "agentManager.browser.title": "Браузер",
+ "agentManager.browser.title": "Вбудований браузер",
"agentManager.browser.url": "URL локальної програми",
"agentManager.browser.urlPlaceholder": "http://localhost:3000",
"agentManager.browser.open": "Відкрити",
@@ -447,7 +447,7 @@ export const dict = {
"agentManager.browser.inspect": "Вибрати елемент",
"agentManager.browser.devtoolsTitle": "Інструменти розробника",
"agentManager.browser.empty": "Відкрийте локальну програму, щоб переглянути її тут.",
- "agentManager.browser.noSession": "Спочатку виберіть сесію Agent Manager.",
+ "agentManager.browser.noSession": "Запустіть або виберіть сесію в Agent Manager, щоб відкрити локальний застосунок.",
"agentManager.browser.screenshotAlt": "Поточна сторінка браузера",
"agentManager.browser.errors": "Проблеми браузера: {{count}}",
"agentManager.browser.diagnostics": "Діагностика браузера",
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/zh.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/zh.ts
index e77914ef864..fce7cd524d0 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/zh.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/zh.ts
@@ -415,7 +415,7 @@ export const dict = {
"agentManager.caffeination.active": "Kilo 代理工作期间保持电脑唤醒",
"agentManager.caffeination.unavailable": "此平台不支持保持唤醒模式",
- "agentManager.browser.title": "浏览器",
+ "agentManager.browser.title": "集成浏览器",
"agentManager.browser.url": "本地应用 URL",
"agentManager.browser.urlPlaceholder": "http://localhost:3000",
"agentManager.browser.open": "打开",
@@ -424,7 +424,7 @@ export const dict = {
"agentManager.browser.inspect": "选择元素",
"agentManager.browser.devtoolsTitle": "开发者工具",
"agentManager.browser.empty": "打开本地应用以在此处预览。",
- "agentManager.browser.noSession": "请先选择 Agent Manager 会话。",
+ "agentManager.browser.noSession": "请在 Agent Manager 中启动或选择会话以浏览本地应用。",
"agentManager.browser.screenshotAlt": "当前浏览器页面",
"agentManager.browser.errors": "浏览器问题:{{count}}",
"agentManager.browser.diagnostics": "浏览器诊断",
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/i18n/zht.ts b/packages/kilo-vscode/webview-ui/agent-manager/i18n/zht.ts
index 0d1fa2f8351..8f3f201dfc1 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/i18n/zht.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/i18n/zht.ts
@@ -414,7 +414,7 @@ export const dict = {
"agentManager.caffeination.armed": "已為 Kilo 代理啟用保持喚醒模式;點擊以停用",
"agentManager.caffeination.active": "Kilo 代理工作期間保持電腦喚醒",
"agentManager.caffeination.unavailable": "此平台無法使用保持喚醒模式",
- "agentManager.browser.title": "瀏覽器",
+ "agentManager.browser.title": "整合瀏覽器",
"agentManager.browser.url": "本機應用程式 URL",
"agentManager.browser.urlPlaceholder": "http://localhost:3000",
"agentManager.browser.open": "開啟",
@@ -423,7 +423,7 @@ export const dict = {
"agentManager.browser.inspect": "選取元素",
"agentManager.browser.devtoolsTitle": "開發人員工具",
"agentManager.browser.empty": "開啟本機應用程式,即可在此處預覽。",
- "agentManager.browser.noSession": "請先選取 Agent Manager 工作階段。",
+ "agentManager.browser.noSession": "請在 Agent Manager 中啟動或選取工作階段以瀏覽本機應用程式。",
"agentManager.browser.screenshotAlt": "目前的瀏覽器頁面",
"agentManager.browser.errors": "瀏覽器問題:{{count}}",
"agentManager.browser.diagnostics": "瀏覽器診斷",
diff --git a/packages/kilo-vscode/webview-ui/agent-manager/side-panel-state.ts b/packages/kilo-vscode/webview-ui/agent-manager/side-panel-state.ts
index c413128d4dd..78e3d045424 100644
--- a/packages/kilo-vscode/webview-ui/agent-manager/side-panel-state.ts
+++ b/packages/kilo-vscode/webview-ui/agent-manager/side-panel-state.ts
@@ -24,9 +24,10 @@ export function createSidePanel(opts: {
const id = opts.current()
return id ? JSON.stringify([opts.project() ?? "single", id]) : undefined
}
+ // A draft can show the browser's no-session guidance without creating a backend session.
+ const owner = () => session() ?? JSON.stringify([opts.project() ?? "single", opts.selection(), null])
const selected = () => {
- const id = session()
- const override = id ? sessions()[id] : undefined
+ const override = sessions()[owner()]
return override !== undefined ? override : (worktrees()[worktree()] ?? null)
}
const panel = () => {
@@ -36,21 +37,22 @@ export function createSidePanel(opts: {
const open = (value: SidePanel) => {
const id = session()
if (ownership[value] === "session") {
- if (id) setSessions((prev) => ({ ...prev, [id]: value }))
+ if (id || value === SidePanel.Browser) setSessions((prev) => ({ ...prev, [owner()]: value }))
return
}
const key = worktree()
batch(() => {
setWorktrees((prev) => ({ ...prev, [key]: value }))
- if (id) setSessions((prev) => ({ ...prev, [id]: undefined }))
+ setSessions((prev) => ({ ...prev, [owner()]: undefined }))
})
}
const close = (expected?: SidePanel) => {
const value = selected()
if (!value || (expected && value !== expected)) return
- const id = session()
- if (ownership[value] === "session" && id) {
- setSessions((prev) => ({ ...prev, [id]: null }))
+ if (ownership[value] === "session") {
+ // A draft has no worktree panel to mask, so drop its entry instead of
+ // storing an authoritative null that would hide later worktree panels.
+ setSessions((prev) => ({ ...prev, [owner()]: session() ? null : undefined }))
return
}
setWorktrees((prev) => ({ ...prev, [worktree()]: null }))
diff --git a/packages/kilo-vscode/webview-ui/src/components/settings/BrowserTab.tsx b/packages/kilo-vscode/webview-ui/src/components/settings/BrowserTab.tsx
index 8accb87ce87..eee016f3f51 100644
--- a/packages/kilo-vscode/webview-ui/src/components/settings/BrowserTab.tsx
+++ b/packages/kilo-vscode/webview-ui/src/components/settings/BrowserTab.tsx
@@ -29,7 +29,9 @@ const BrowserTab: Component = () => {
const { globalConfig, projectConfig, updateGlobalConfig } = useConfig()
const [settings, setSettings] = createSignal({
+ enabled: false,
useSystemChrome: true,
+ headless: false,
})
onMount(() => {
@@ -118,6 +120,16 @@ const BrowserTab: Component = () => {
{t("settings.browser.description")}
+ {/* Enable toggle */}
+
+ update("enabled", checked)} hideLabel>
+ {t("settings.browser.enable.title")}
+
+
+
{/* Use System Chrome */}
{
{t("settings.browser.systemChrome.title")}
+
+ {/* Headless mode */}
-
+ update("headless", checked)}
+ hideLabel
+ >
{t("settings.browser.headless.title")}
diff --git a/packages/kilo-vscode/webview-ui/src/components/settings/ExperimentalTab.tsx b/packages/kilo-vscode/webview-ui/src/components/settings/ExperimentalTab.tsx
index af63fcaa66b..9084c0d0b6f 100644
--- a/packages/kilo-vscode/webview-ui/src/components/settings/ExperimentalTab.tsx
+++ b/packages/kilo-vscode/webview-ui/src/components/settings/ExperimentalTab.tsx
@@ -231,15 +231,30 @@ const ExperimentalTab: Component = () => {
applySetting("browserAutomation", checked, "experimental.browserAutomation")}
hideLabel
>
- {language.t("settings.browser.enable.title")}
+ {language.t("settings.experimental.browserAutomation.title")}
+
+
+
+
+
+ applySetting("agentManagerBrowserUseSystemChrome", checked, "agentManager.browser.useSystemChrome")
+ }
+ hideLabel
+ >
+ {language.t("settings.experimental.browserAutomation.systemChrome.title")}
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts
index b00dc1a3117..c470d7912ef 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts
@@ -827,7 +827,7 @@ export const dict = {
"settings.agentBehaviour.subtab.skills": "المهارات",
"settings.browser.description":
- "عند التفعيل، يمكن لوكيل الذكاء الاصطناعي التفاعل مع صفحات الويب — التنقل والنقر والكتابة والتقاط لقطات الشاشة. سيتم فتح نافذة Chrome حتى تتمكن من مشاهدة الوكيل أثناء العمل.",
+ "تكوين أتمتة المتصفح المدمجة المدعومة من Playwright. يمكن لـ Kilo التنقل والتفاعل مع صفحات الويب والتقاط لقطات شاشة لها في جلساتك.",
"settings.browser.enable.title": "تفعيل أتمتة المتصفح",
"settings.browser.enable.description": "تسجيل خادم Playwright MCP مع الواجهة الخلفية لـ CLI.",
"settings.browser.systemChrome.title": "استخدام Chrome النظام",
@@ -1325,5 +1325,11 @@ export const dict = {
"chat.search.close": "إغلاق البحث",
"chat.search.invalidRegex": "تعبير عادي غير صالح",
"chat.search.noResults": "لا توجد نتائج",
+ "settings.experimental.browserAutomation.title": "المتصفح المدمج",
+ "settings.experimental.browserAutomation.description":
+ "عرض معاينات التطبيقات المحلية في Agent Manager وإتاحة أداة browser_open لجلسات Agent Manager.",
+ "settings.experimental.browserAutomation.systemChrome.title": "استخدام Chrome النظام",
+ "settings.experimental.browserAutomation.systemChrome.description":
+ "استخدام Google Chrome المثبّت للمتصفح المدمج. عطّله فقط عند تثبيت متصفح Playwright Chromium متوافق.",
"chat.search.searchingHistory": "جارٍ البحث في الرسائل السابقة…",
}
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/br.ts b/packages/kilo-vscode/webview-ui/src/i18n/br.ts
index ef074abbe9c..8787ea2f5ab 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/br.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/br.ts
@@ -850,7 +850,7 @@ export const dict = {
"settings.agentBehaviour.subtab.skills": "Habilidades",
"settings.browser.description":
- "Quando ativado, o agente de IA pode interagir com páginas da web — navegar, clicar, digitar e capturar telas. Uma janela do Chrome será aberta para que você possa acompanhar o trabalho do agente.",
+ "Configure a automação de navegador integrada com tecnologia Playwright. O Kilo pode navegar, interagir e capturar telas de páginas da web nas suas sessões.",
"settings.browser.enable.title": "Ativar Automação do Navegador",
"settings.browser.enable.description": "Registrar o servidor Playwright MCP no backend CLI.",
"settings.browser.systemChrome.title": "Usar Chrome do Sistema",
@@ -1370,5 +1370,11 @@ export const dict = {
"chat.search.close": "Fechar pesquisa",
"chat.search.invalidRegex": "Expressão regular inválida",
"chat.search.noResults": "Nenhum resultado",
+ "settings.experimental.browserAutomation.title": "Navegador Integrado",
+ "settings.experimental.browserAutomation.description":
+ "Mostre pré-visualizações de aplicativos locais no Agent Manager e exponha a ferramenta browser_open para sessões do Agent Manager.",
+ "settings.experimental.browserAutomation.systemChrome.title": "Usar Chrome do Sistema",
+ "settings.experimental.browserAutomation.systemChrome.description":
+ "Use o Google Chrome instalado para o Navegador Integrado. Desative apenas quando um navegador Playwright Chromium compatível já estiver instalado.",
"chat.search.searchingHistory": "Pesquisando mensagens anteriores…",
}
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts
index 640d08d867d..08fd58a4a00 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts
@@ -847,7 +847,7 @@ export const dict = {
"settings.agentBehaviour.subtab.skills": "Vještine",
"settings.browser.description":
- "Kada je omogućeno, AI agent može komunicirati s web stranicama — navigirati, klikati, tipkati i snimati ekran. Chrome prozor će se otvoriti kako biste mogli pratiti rad agenta.",
+ "Konfigurirajte ugrađenu automatizaciju preglednika koju pokreće Playwright. Kilo može navigirati, komunicirati sa web stranicama i snimati ekran u vašim sesijama.",
"settings.browser.enable.title": "Omogući automatizaciju preglednika",
"settings.browser.enable.description": "Registriraj Playwright MCP server s CLI pozadinom.",
"settings.browser.systemChrome.title": "Koristi sistemski Chrome",
@@ -1361,5 +1361,11 @@ export const dict = {
"chat.search.close": "Zatvori pretragu",
"chat.search.invalidRegex": "Nevažeći regularni izraz",
"chat.search.noResults": "Nema rezultata",
+ "settings.experimental.browserAutomation.title": "Integrirani preglednik",
+ "settings.experimental.browserAutomation.description":
+ "Prikažite preglede lokalnih aplikacija u Agent Manageru i omogućite alat browser_open sesijama Agent Managera.",
+ "settings.experimental.browserAutomation.systemChrome.title": "Koristi sistemski Chrome",
+ "settings.experimental.browserAutomation.systemChrome.description":
+ "Koristite instalirani Google Chrome za Integrirani preglednik. Onemogućite samo kada je kompatibilni Playwright Chromium preglednik već instaliran.",
"chat.search.searchingHistory": "Pretraživanje ranijih poruka…",
}
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/da.ts b/packages/kilo-vscode/webview-ui/src/i18n/da.ts
index a380e59f781..82245b2e90e 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/da.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/da.ts
@@ -846,7 +846,7 @@ export const dict = {
"settings.agentBehaviour.subtab.skills": "Færdigheder",
"settings.browser.description":
- "Når aktiveret kan AI-agenten interagere med websider — navigere, klikke, skrive og tage skærmbilleder. Et Chrome-vindue åbnes, så du kan se agenten arbejde.",
+ "Konfigurér indbygget browserautomatisering drevet af Playwright. Kilo kan navigere, interagere med og tage skærmbilleder af websider i dine sessioner.",
"settings.browser.enable.title": "Aktivér browserautomatisering",
"settings.browser.enable.description": "Registrér Playwright MCP-serveren hos CLI-backend'en.",
"settings.browser.systemChrome.title": "Brug system-Chrome",
@@ -1355,5 +1355,11 @@ export const dict = {
"chat.search.close": "Luk søgning",
"chat.search.invalidRegex": "Ugyldigt regulært udtryk",
"chat.search.noResults": "Ingen resultater",
+ "settings.experimental.browserAutomation.title": "Integreret browser",
+ "settings.experimental.browserAutomation.description":
+ "Vis forhåndsvisninger af lokale applikationer i Agent Manager, og gør værktøjet browser_open tilgængeligt for Agent Manager-sessioner.",
+ "settings.experimental.browserAutomation.systemChrome.title": "Brug system-Chrome",
+ "settings.experimental.browserAutomation.systemChrome.description":
+ "Brug den installerede Google Chrome til den integrerede browser. Deaktivér kun, når en kompatibel Playwright Chromium-browser allerede er installeret.",
"chat.search.searchingHistory": "Søger i tidligere beskeder…",
}
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/de.ts b/packages/kilo-vscode/webview-ui/src/i18n/de.ts
index 3a06f898173..d4540389377 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/de.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/de.ts
@@ -861,7 +861,7 @@ export const dict = {
"settings.agentBehaviour.subtab.skills": "Fähigkeiten",
"settings.browser.description":
- "Wenn aktiviert, kann der KI-Agent mit Webseiten interagieren — navigieren, klicken, tippen und Screenshots erstellen. Ein Chrome-Fenster wird geöffnet, damit Sie dem Agenten bei der Arbeit zusehen können.",
+ "Integrierte Browser-Automatisierung auf Basis von Playwright konfigurieren. Kilo kann in Ihren Sitzungen Webseiten aufrufen, mit ihnen interagieren und Screenshots erstellen.",
"settings.browser.enable.title": "Browser-Automatisierung aktivieren",
"settings.browser.enable.description": "Den Playwright-MCP-Server beim CLI-Backend registrieren.",
"settings.browser.systemChrome.title": "System-Chrome verwenden",
@@ -1383,5 +1383,11 @@ export const dict = {
"chat.search.close": "Suche schließen",
"chat.search.invalidRegex": "Ungültiger regulärer Ausdruck",
"chat.search.noResults": "Keine Ergebnisse",
+ "settings.experimental.browserAutomation.title": "Integrierter Browser",
+ "settings.experimental.browserAutomation.description":
+ "Lokale Anwendungsvorschauen im Agent Manager anzeigen und das Tool browser_open für Agent Manager-Sitzungen bereitstellen.",
+ "settings.experimental.browserAutomation.systemChrome.title": "System-Chrome verwenden",
+ "settings.experimental.browserAutomation.systemChrome.description":
+ "Das installierte Google Chrome für den integrierten Browser verwenden. Nur deaktivieren, wenn bereits ein kompatibler Playwright-Chromium-Browser installiert ist.",
"chat.search.searchingHistory": "Frühere Nachrichten werden durchsucht…",
} satisfies Partial>
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/en.ts b/packages/kilo-vscode/webview-ui/src/i18n/en.ts
index c8b369ed901..5cf864cd056 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/en.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/en.ts
@@ -820,15 +820,14 @@ export const dict = {
"settings.agentBehaviour.subtab.skills": "Skills",
"settings.browser.description":
- "Configure the browser runtime used by the experimental Agent Manager browser. The page preview stays in Agent Manager.",
+ "Configure built-in browser automation powered by Playwright. Kilo can navigate, interact with, and screenshot web pages in your sessions.",
"settings.browser.enable.title": "Enable Browser Automation",
- "settings.browser.enable.description": "Enable the session-scoped Agent Manager browser for local applications.",
+ "settings.browser.enable.description": "Register the Playwright MCP server with the CLI backend.",
"settings.browser.systemChrome.title": "Use System Chrome",
"settings.browser.systemChrome.description":
"Use installed Google Chrome. Disable only when a compatible Playwright Chromium browser is already installed.",
"settings.browser.headless.title": "Headless Mode",
- "settings.browser.headless.description":
- "Agent Manager always runs the browser headlessly. The page preview appears in the Browser panel.",
+ "settings.browser.headless.description": "Run in headless mode (no visible browser window).",
"settings.language.description":
'Choose the language for the Kilo Code UI. "Auto" uses your VS Code display language.',
@@ -924,6 +923,12 @@ export const dict = {
"settings.experimental.multiProject.title": "Multi-Project Agent Manager",
"settings.experimental.multiProject.description":
"Enable managing sessions and worktrees across multiple repositories in Agent Manager. The current workspace repository is always the default project.",
+ "settings.experimental.browserAutomation.title": "Integrated Browser",
+ "settings.experimental.browserAutomation.description":
+ "Show local application previews in Agent Manager and expose the browser_open tool to Agent Manager sessions.",
+ "settings.experimental.browserAutomation.systemChrome.title": "Use System Chrome",
+ "settings.experimental.browserAutomation.systemChrome.description":
+ "Use installed Google Chrome for the Integrated Browser. Disable only when a compatible Playwright Chromium browser is already installed.",
"settings.experimental.claudeMigration.title": "Claude Code Migration",
"settings.experimental.claudeMigration.description":
"On the next backend start, import supported global CLAUDE.md instructions, simple skills, and disabled MCP definitions. This runs once with no automatic retry; global Claude instructions and skills are then handed off to Kilo. Claude files stay unchanged; keep them if you still use Claude Code.",
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/es.ts b/packages/kilo-vscode/webview-ui/src/i18n/es.ts
index 2dd781245f2..f9e6088af5b 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/es.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/es.ts
@@ -853,7 +853,7 @@ export const dict = {
"settings.agentBehaviour.subtab.skills": "Habilidades",
"settings.browser.description":
- "Cuando está activado, el agente de IA puede interactuar con páginas web: navegar, hacer clic, escribir y capturar pantallas. Se abrirá una ventana de Chrome para que puedas ver al agente trabajar.",
+ "Configura la automatización de navegador integrada basada en Playwright. Kilo puede navegar, interactuar y capturar pantallas de páginas web en tus sesiones.",
"settings.browser.enable.title": "Activar automatización del navegador",
"settings.browser.enable.description": "Registrar el servidor Playwright MCP con el backend CLI.",
"settings.browser.systemChrome.title": "Usar Chrome del sistema",
@@ -1371,5 +1371,11 @@ export const dict = {
"chat.search.close": "Cerrar búsqueda",
"chat.search.invalidRegex": "Expresión regular no válida",
"chat.search.noResults": "Sin resultados",
+ "settings.experimental.browserAutomation.title": "Navegador integrado",
+ "settings.experimental.browserAutomation.description":
+ "Muestra vistas previas de aplicaciones locales en Agent Manager y expone la herramienta browser_open a las sesiones de Agent Manager.",
+ "settings.experimental.browserAutomation.systemChrome.title": "Usar Chrome del sistema",
+ "settings.experimental.browserAutomation.systemChrome.description":
+ "Usa el Google Chrome instalado para el Navegador integrado. Desactívalo solo si ya hay instalado un navegador Playwright Chromium compatible.",
"chat.search.searchingHistory": "Buscando en mensajes anteriores…",
}
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/fa.ts b/packages/kilo-vscode/webview-ui/src/i18n/fa.ts
index 920c17128fb..ea47a8a3403 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/fa.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/fa.ts
@@ -827,7 +827,7 @@ export const dict = {
"settings.agentBehaviour.subtab.skills": "مهارتها",
"settings.browser.description":
- "وقتی فعال است، عامل هوش مصنوعی میتواند با صفحات وب تعامل داشته باشد — پیمایش، کلیک، تایپ و گرفتن اسکرینشات. یک پنجره Chrome باز میشود تا بتوانید عملکرد عامل را مشاهده کنید.",
+ "پیکربندی اتوماسیون مرورگر داخلی با پشتیبانی Playwright. Kilo میتواند در جلسات شما در صفحات وب پیمایش کند، با آنها تعامل داشته باشد و اسکرینشات بگیرد.",
"settings.browser.enable.title": "فعالسازی اتوماسیون مرورگر",
"settings.browser.enable.description": "سرور Playwright MCP را با بکاند CLI ثبت کنید.",
"settings.browser.systemChrome.title": "استفاده از Chrome سیستم",
@@ -1355,5 +1355,11 @@ export const dict = {
"chat.search.close": "بستن جستجو",
"chat.search.invalidRegex": "عبارت منظم نامعتبر",
"chat.search.noResults": "نتیجهای یافت نشد",
+ "settings.experimental.browserAutomation.title": "مرورگر یکپارچه",
+ "settings.experimental.browserAutomation.description":
+ "پیشنمایش برنامههای محلی را در Agent Manager نشان دهید و ابزار browser_open را در اختیار جلسات Agent Manager قرار دهید.",
+ "settings.experimental.browserAutomation.systemChrome.title": "استفاده از Chrome سیستم",
+ "settings.experimental.browserAutomation.systemChrome.description":
+ "از Google Chrome نصبشده برای مرورگر یکپارچه استفاده کنید. فقط زمانی غیرفعال کنید که مرورگر Playwright Chromium سازگار از قبل نصب شده باشد.",
"chat.search.searchingHistory": "در حال جستجو در پیامهای قبلی…",
}
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts
index 26501175941..45852926cf3 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts
@@ -863,7 +863,7 @@ export const dict = {
"settings.agentBehaviour.subtab.skills": "Compétences",
"settings.browser.description":
- "Lorsqu'il est activé, l'agent IA peut interagir avec les pages web — naviguer, cliquer, saisir du texte et prendre des captures d'écran. Une fenêtre Chrome s'ouvrira pour que vous puissiez observer l'agent travailler.",
+ "Configurez l'automatisation de navigateur intégrée propulsée par Playwright. Kilo peut naviguer, interagir et prendre des captures d'écran de pages web dans vos sessions.",
"settings.browser.enable.title": "Activer l'automatisation du navigateur",
"settings.browser.enable.description": "Enregistrer le serveur Playwright MCP auprès du backend CLI.",
"settings.browser.systemChrome.title": "Utiliser le Chrome système",
@@ -1392,5 +1392,11 @@ export const dict = {
"chat.search.close": "Fermer la recherche",
"chat.search.invalidRegex": "Expression régulière non valide",
"chat.search.noResults": "Aucun résultat",
+ "settings.experimental.browserAutomation.title": "Navigateur intégré",
+ "settings.experimental.browserAutomation.description":
+ "Affichez des aperçus d'applications locales dans Agent Manager et exposez l'outil browser_open aux sessions Agent Manager.",
+ "settings.experimental.browserAutomation.systemChrome.title": "Utiliser le Chrome système",
+ "settings.experimental.browserAutomation.systemChrome.description":
+ "Utilisez le Google Chrome installé pour le Navigateur intégré. Désactivez uniquement lorsqu'un navigateur Playwright Chromium compatible est déjà installé.",
"chat.search.searchingHistory": "Recherche dans les messages précédents…",
}
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/it.ts b/packages/kilo-vscode/webview-ui/src/i18n/it.ts
index 19eb27fb387..ef82bc3504d 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/it.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/it.ts
@@ -711,7 +711,7 @@ export const dict = {
"settings.agentBehaviour.subtab.workflows": "Workflow",
"settings.agentBehaviour.subtab.skills": "Skill",
"settings.browser.description":
- "Quando è abilitato, l'agente AI può interagire con pagine web: navigare, fare clic, scrivere e acquisire screenshot. Si aprirà una finestra Chrome così puoi osservare il lavoro dell'agente.",
+ "Configura l'automazione del browser integrata basata su Playwright. Kilo può navigare, interagire e acquisire screenshot delle pagine web nelle tue sessioni.",
"settings.browser.enable.title": "Abilita automazione browser",
"settings.browser.enable.description": "Registra il server MCP Playwright con il backend CLI.",
"settings.browser.systemChrome.title": "Usa Chrome di sistema",
@@ -1337,5 +1337,11 @@ export const dict = {
"chat.search.close": "Chiudi ricerca",
"chat.search.invalidRegex": "Espressione regolare non valida",
"chat.search.noResults": "Nessun risultato",
+ "settings.experimental.browserAutomation.title": "Browser integrato",
+ "settings.experimental.browserAutomation.description":
+ "Mostra le anteprime delle applicazioni locali in Agent Manager ed esponi lo strumento browser_open alle sessioni di Agent Manager.",
+ "settings.experimental.browserAutomation.systemChrome.title": "Usa Chrome di sistema",
+ "settings.experimental.browserAutomation.systemChrome.description":
+ "Usa il Google Chrome installato per il Browser integrato. Disattivalo solo se è già installato un browser Playwright Chromium compatibile.",
"chat.search.searchingHistory": "Ricerca nei messaggi precedenti…",
} as const
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts
index 25a119714c8..9614c8439b5 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts
@@ -841,7 +841,7 @@ export const dict = {
"settings.agentBehaviour.subtab.skills": "スキル",
"settings.browser.description":
- "有効にすると、AIエージェントがWebページを操作できるようになります — ナビゲーション、クリック、入力、スクリーンショットの撮影。Chromeウィンドウが開き、エージェントの作業を確認できます。",
+ "Playwrightを利用した組み込みブラウザ自動化を設定します。Kiloはセッション内でWebページのナビゲーション、操作、スクリーンショット撮影を行えます。",
"settings.browser.enable.title": "ブラウザ自動化を有効にする",
"settings.browser.enable.description": "Playwright MCPサーバーをCLIバックエンドに登録します。",
"settings.browser.systemChrome.title": "システムChromeを使用",
@@ -1347,5 +1347,11 @@ export const dict = {
"chat.search.close": "検索を閉じる",
"chat.search.invalidRegex": "正規表現が無効です",
"chat.search.noResults": "見つかりませんでした",
+ "settings.experimental.browserAutomation.title": "統合ブラウザー",
+ "settings.experimental.browserAutomation.description":
+ "Agent Manager でローカルアプリケーションのプレビューを表示し、browser_open ツールを Agent Manager セッションに公開します。",
+ "settings.experimental.browserAutomation.systemChrome.title": "システムChromeを使用",
+ "settings.experimental.browserAutomation.systemChrome.description":
+ "統合ブラウザーにインストール済みの Google Chrome を使用します。互換性のある Playwright Chromium ブラウザーが既にインストールされている場合にのみ無効にしてください。",
"chat.search.searchingHistory": "以前のメッセージを検索しています…",
}
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts
index 61d0c191ab4..3486c002e32 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts
@@ -839,7 +839,7 @@ export const dict = {
"settings.agentBehaviour.subtab.skills": "스킬",
"settings.browser.description":
- "활성화하면 AI 에이전트가 웹 페이지와 상호작용할 수 있습니다 — 탐색, 클릭, 입력, 스크린샷 촬영. Chrome 창이 열려 에이전트의 작업을 확인할 수 있습니다.",
+ "Playwright 기반의 내장 브라우저 자동화를 구성합니다. Kilo는 세션에서 웹 페이지를 탐색하고 상호 작용하며 스크린샷을 찍을 수 있습니다.",
"settings.browser.enable.title": "브라우저 자동화 활성화",
"settings.browser.enable.description": "Playwright MCP 서버를 CLI 백엔드에 등록합니다.",
"settings.browser.systemChrome.title": "시스템 Chrome 사용",
@@ -1334,5 +1334,11 @@ export const dict = {
"chat.search.close": "검색 닫기",
"chat.search.invalidRegex": "정규식이 잘못되었습니다",
"chat.search.noResults": "검색 결과 없음",
+ "settings.experimental.browserAutomation.title": "통합 브라우저",
+ "settings.experimental.browserAutomation.description":
+ "Agent Manager에서 로컬 애플리케이션 미리보기를 표시하고 browser_open 도구를 Agent Manager 세션에 노출합니다.",
+ "settings.experimental.browserAutomation.systemChrome.title": "시스템 Chrome 사용",
+ "settings.experimental.browserAutomation.systemChrome.description":
+ "통합 브라우저에 설치된 Google Chrome을 사용합니다. 호환되는 Playwright Chromium 브라우저가 이미 설치된 경우에만 비활성화하세요.",
"chat.search.searchingHistory": "이전 메시지를 검색하는 중…",
}
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts
index 5b34682e0f9..0f2764bb7a3 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts
@@ -839,7 +839,7 @@ export const dict = {
"settings.agentBehaviour.subtab.skills": "Skills",
"settings.browser.description":
- "Indien ingeschakeld kan de AI agent interactie hebben met webpagina's — navigeren, klikken, typen en screenshots maken. Er wordt een Chrome-venster geopend zodat je de agent aan het werk kunt zien.",
+ "Configureer ingebouwde browserautomatisering mogelijk gemaakt door Playwright. Kilo kan in je sessies door webpagina's navigeren, ermee werken en schermafbeeldingen maken.",
"settings.browser.enable.title": "Browserautomatisering inschakelen",
"settings.browser.enable.description": "Registreer de Playwright MCP-server bij de CLI backend.",
"settings.browser.systemChrome.title": "Gebruik Systeem Chrome",
@@ -1383,5 +1383,11 @@ export const dict = {
"chat.search.close": "Zoeken sluiten",
"chat.search.invalidRegex": "Ongeldige reguliere expressie",
"chat.search.noResults": "Geen resultaten",
+ "settings.experimental.browserAutomation.title": "Geïntegreerde browser",
+ "settings.experimental.browserAutomation.description":
+ "Toon voorbeelden van lokale applicaties in Agent Manager en stel de tool browser_open beschikbaar aan Agent Manager-sessies.",
+ "settings.experimental.browserAutomation.systemChrome.title": "Gebruik Systeem Chrome",
+ "settings.experimental.browserAutomation.systemChrome.description":
+ "Gebruik de geïnstalleerde Google Chrome voor de geïntegreerde browser. Schakel dit alleen uit als er al een compatibele Playwright Chromium-browser is geïnstalleerd.",
"chat.search.searchingHistory": "Eerdere berichten doorzoeken…",
}
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/no.ts b/packages/kilo-vscode/webview-ui/src/i18n/no.ts
index 5bf5c3ea1f3..74cefc89c60 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/no.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/no.ts
@@ -807,7 +807,7 @@ export const dict = {
"settings.agentBehaviour.subtab.skills": "Ferdigheter",
"settings.browser.description":
- "Når aktivert kan AI-agenten samhandle med nettsider — navigere, klikke, skrive og ta skjermbilder. Et Chrome-vindu åpnes slik at du kan se agenten jobbe.",
+ "Konfigurer innebygd nettleserautomatisering drevet av Playwright. Kilo kan navigere, samhandle med og ta skjermbilder av nettsider i øktene dine.",
"settings.browser.enable.title": "Aktiver nettleserautomatisering",
"settings.browser.enable.description": "Registrer Playwright MCP-serveren med CLI-backend.",
"settings.browser.systemChrome.title": "Bruk system-Chrome",
@@ -1352,5 +1352,11 @@ export const dict = {
"chat.search.close": "Lukk søk",
"chat.search.invalidRegex": "Ugyldig regulært uttrykk",
"chat.search.noResults": "Ingen resultater",
+ "settings.experimental.browserAutomation.title": "Integrert nettleser",
+ "settings.experimental.browserAutomation.description":
+ "Vis forhåndsvisninger av lokale applikasjoner i Agent Manager, og gjør verktøyet browser_open tilgjengelig for Agent Manager-økter.",
+ "settings.experimental.browserAutomation.systemChrome.title": "Bruk system-Chrome",
+ "settings.experimental.browserAutomation.systemChrome.description":
+ "Bruk den installerte Google Chrome for den integrerte nettleseren. Deaktiver bare når en kompatibel Playwright Chromium-nettleser allerede er installert.",
"chat.search.searchingHistory": "Søker i tidligere meldinger…",
} satisfies Partial>
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts
index e4974605865..44c1aabf08d 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts
@@ -804,7 +804,7 @@ export const dict = {
"settings.agentBehaviour.subtab.skills": "Umiejętności",
"settings.browser.description":
- "Po włączeniu agent AI może wchodzić w interakcję ze stronami internetowymi — nawigować, klikać, pisać i robić zrzuty ekranu. Otworzy się okno Chrome, abyś mógł obserwować pracę agenta.",
+ "Skonfiguruj wbudowaną automatyzację przeglądarki opartą na Playwright. Kilo może nawigować po stronach internetowych, wchodzić z nimi w interakcję i robić zrzuty ekranu w Twoich sesjach.",
"settings.browser.enable.title": "Włącz automatyzację przeglądarki",
"settings.browser.enable.description": "Zarejestruj serwer Playwright MCP w backendzie CLI.",
"settings.browser.systemChrome.title": "Użyj systemowego Chrome",
@@ -1360,5 +1360,11 @@ export const dict = {
"chat.search.close": "Zamknij wyszukiwanie",
"chat.search.invalidRegex": "Nieprawidłowe wyrażenie regularne",
"chat.search.noResults": "Brak wyników",
+ "settings.experimental.browserAutomation.title": "Zintegrowana przeglądarka",
+ "settings.experimental.browserAutomation.description":
+ "Wyświetlaj podglądy lokalnych aplikacji w Agent Manager i udostępniaj narzędzie browser_open sesjom Agent Manager.",
+ "settings.experimental.browserAutomation.systemChrome.title": "Użyj systemowego Chrome",
+ "settings.experimental.browserAutomation.systemChrome.description":
+ "Użyj zainstalowanej przeglądarki Google Chrome dla zintegrowanej przeglądarki. Wyłącz tylko wtedy, gdy zgodna przeglądarka Playwright Chromium jest już zainstalowana.",
"chat.search.searchingHistory": "Wyszukiwanie we wcześniejszych wiadomościach…",
}
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts
index d73491a2333..a25bbbc55d3 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts
@@ -844,7 +844,7 @@ export const dict = {
"settings.agentBehaviour.subtab.skills": "Навыки",
"settings.browser.description":
- "При включении ИИ-агент может взаимодействовать с веб-страницами — переходить по ссылкам, нажимать, вводить текст и делать скриншоты. Откроется окно Chrome, чтобы вы могли наблюдать за работой агента.",
+ "Настройте встроенную автоматизацию браузера на основе Playwright. Kilo может переходить по веб-страницам, взаимодействовать с ними и делать скриншоты в ваших сессиях.",
"settings.browser.enable.title": "Включить автоматизацию браузера",
"settings.browser.enable.description": "Зарегистрировать сервер Playwright MCP в CLI-бэкенде.",
"settings.browser.systemChrome.title": "Использовать системный Chrome",
@@ -1354,5 +1354,11 @@ export const dict = {
"chat.search.close": "Закрыть поиск",
"chat.search.invalidRegex": "Недопустимое регулярное выражение",
"chat.search.noResults": "Нет результатов",
+ "settings.experimental.browserAutomation.title": "Встроенный браузер",
+ "settings.experimental.browserAutomation.description":
+ "Показывайте предпросмотр локальных приложений в Agent Manager и предоставляйте инструмент browser_open сеансам Agent Manager.",
+ "settings.experimental.browserAutomation.systemChrome.title": "Использовать системный Chrome",
+ "settings.experimental.browserAutomation.systemChrome.description":
+ "Использовать установленный Google Chrome для встроенного браузера. Отключайте только если совместимый браузер Playwright Chromium уже установлен.",
"chat.search.searchingHistory": "Поиск в более ранних сообщениях…",
}
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/th.ts b/packages/kilo-vscode/webview-ui/src/i18n/th.ts
index 763bf85940d..b219949fa49 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/th.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/th.ts
@@ -834,7 +834,7 @@ export const dict = {
"settings.agentBehaviour.subtab.skills": "ทักษะ",
"settings.browser.description":
- "เมื่อเปิดใช้งาน ตัวแทน AI สามารถโต้ตอบกับหน้าเว็บได้ — นำทาง คลิก พิมพ์ และจับภาพหน้าจอ หน้าต่าง Chrome จะเปิดขึ้นเพื่อให้คุณดูการทำงานของตัวแทน",
+ "กำหนดค่าการทำงานอัตโนมัติของเบราว์เซอร์ในตัวที่ขับเคลื่อนโดย Playwright Kilo สามารถนำทาง โต้ตอบ และจับภาพหน้าจอของหน้าเว็บในเซสชันของคุณได้",
"settings.browser.enable.title": "เปิดใช้งานการทำงานอัตโนมัติของเบราว์เซอร์",
"settings.browser.enable.description": "ลงทะเบียนเซิร์ฟเวอร์ Playwright MCP กับ CLI backend",
"settings.browser.systemChrome.title": "ใช้ Chrome ของระบบ",
@@ -1331,5 +1331,11 @@ export const dict = {
"chat.search.close": "ปิดการค้นหา",
"chat.search.invalidRegex": "นิพจน์ทั่วไปไม่ถูกต้อง",
"chat.search.noResults": "ไม่มีผลลัพธ์",
+ "settings.experimental.browserAutomation.title": "เบราว์เซอร์ในตัว",
+ "settings.experimental.browserAutomation.description":
+ "แสดงตัวอย่างแอปพลิเคชันในเครื่องใน Agent Manager และเปิดเผยเครื่องมือ browser_open ให้กับเซสชัน Agent Manager",
+ "settings.experimental.browserAutomation.systemChrome.title": "ใช้ Chrome ของระบบ",
+ "settings.experimental.browserAutomation.systemChrome.description":
+ "ใช้ Google Chrome ที่ติดตั้งไว้สำหรับเบราว์เซอร์ในตัว ปิดใช้งานเฉพาะเมื่อติดตั้งเบราว์เซอร์ Playwright Chromium ที่เข้ากันได้ไว้แล้วเท่านั้น",
"chat.search.searchingHistory": "กำลังค้นหาข้อความก่อนหน้า…",
}
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts
index d5cc0235bab..7931e8770b5 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts
@@ -834,7 +834,7 @@ export const dict = {
"settings.agentBehaviour.subtab.skills": "Beceriler",
"settings.browser.description":
- "Etkinleştirildiğinde, yapay zeka ajanı web sayfalarıyla etkileşime girebilir — gezinme, tıklama, yazma ve ekran görüntüsü alma. Ajanın çalışmasını izleyebilmeniz için bir Chrome penceresi açılacak.",
+ "Playwright ile çalışan yerleşik tarayıcı otomasyonunu yapılandırın. Kilo, oturumlarınızda web sayfalarında gezinebilir, bunlarla etkileşime girebilir ve ekran görüntüsü alabilir.",
"settings.browser.enable.title": "Tarayıcı Otomasyonunu Etkinleştir",
"settings.browser.enable.description": "Playwright MCP sunucusunu CLI arka ucuyla kaydet.",
"settings.browser.systemChrome.title": "Sistem Chrome'unu Kullan",
@@ -1370,5 +1370,11 @@ export const dict = {
"chat.search.close": "Aramayı kapat",
"chat.search.invalidRegex": "Geçersiz normal ifade",
"chat.search.noResults": "Sonuç yok",
+ "settings.experimental.browserAutomation.title": "Entegre Tarayıcı",
+ "settings.experimental.browserAutomation.description":
+ "Agent Manager'da yerel uygulama önizlemelerini gösterin ve browser_open aracını Agent Manager oturumlarına sunun.",
+ "settings.experimental.browserAutomation.systemChrome.title": "Sistem Chrome'unu Kullan",
+ "settings.experimental.browserAutomation.systemChrome.description":
+ "Entegre Tarayıcı için yüklü Google Chrome'u kullanın. Yalnızca uyumlu bir Playwright Chromium tarayıcısı zaten yüklüyse devre dışı bırakın.",
"chat.search.searchingHistory": "Önceki mesajlarda aranıyor…",
}
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts
index e4d1221bc4b..881d772e0dc 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts
@@ -834,7 +834,7 @@ export const dict = {
"settings.agentBehaviour.subtab.skills": "Навички",
"settings.browser.description":
- "Після увімкнення агент ШІ може взаємодіяти з веб-сторінками — навігація, натискання, введення тексту та знімки екрана. Відкриється вікно Chrome, щоб ви могли стежити за роботою агента.",
+ "Налаштуйте вбудовану автоматизацію браузера на основі Playwright. Kilo може переходити веб-сторінками, взаємодіяти з ними та робити знімки екрана у ваших сесіях.",
"settings.browser.enable.title": "Увімкнути автоматизацію браузера",
"settings.browser.enable.description": "Зареєструвати MCP-сервер Playwright з CLI-бекендом.",
"settings.browser.systemChrome.title": "Використовувати системний Chrome",
@@ -1370,5 +1370,11 @@ export const dict = {
"chat.search.close": "Закрити пошук",
"chat.search.invalidRegex": "Недійсний регулярний вираз",
"chat.search.noResults": "Немає результатів",
+ "settings.experimental.browserAutomation.title": "Вбудований браузер",
+ "settings.experimental.browserAutomation.description":
+ "Показуйте попередній перегляд локальних застосунків в Agent Manager і надавайте інструмент browser_open сесіям Agent Manager.",
+ "settings.experimental.browserAutomation.systemChrome.title": "Використовувати системний Chrome",
+ "settings.experimental.browserAutomation.systemChrome.description":
+ "Використовувати встановлений Google Chrome для вбудованого браузера. Вимкніть лише якщо сумісний браузер Playwright Chromium уже встановлено.",
"chat.search.searchingHistory": "Пошук у попередніх повідомленнях…",
}
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts
index cf49928ba72..9ac506cffef 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts
@@ -814,7 +814,7 @@ export const dict = {
"settings.agentBehaviour.subtab.skills": "技能",
"settings.browser.description":
- "启用后,AI 代理可以与网页交互 — 导航、点击、输入和截取屏幕截图。Chrome 窗口将打开,以便您观察代理的工作。",
+ "配置由 Playwright 提供支持的内置浏览器自动化。Kilo 可在你的会话中浏览网页、与网页交互并截取屏幕截图。",
"settings.browser.enable.title": "启用浏览器自动化",
"settings.browser.enable.description": "将 Playwright MCP 服务器注册到 CLI 后端。",
"settings.browser.systemChrome.title": "使用系统 Chrome",
@@ -1283,5 +1283,11 @@ export const dict = {
"chat.search.close": "关闭搜索",
"chat.search.invalidRegex": "正则表达式无效",
"chat.search.noResults": "无结果",
+ "settings.experimental.browserAutomation.title": "集成浏览器",
+ "settings.experimental.browserAutomation.description":
+ "在 Agent Manager 中显示本地应用预览,并向 Agent Manager 会话公开 browser_open 工具。",
+ "settings.experimental.browserAutomation.systemChrome.title": "使用系统 Chrome",
+ "settings.experimental.browserAutomation.systemChrome.description":
+ "为集成浏览器使用已安装的 Google Chrome。仅在已安装兼容的 Playwright Chromium 浏览器时才禁用。",
"chat.search.searchingHistory": "正在搜索更早的消息…",
} satisfies Partial>
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts
index 5b81cb7d4c0..da7beda0a3b 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts
@@ -774,7 +774,7 @@ export const dict = {
"settings.agentBehaviour.subtab.skills": "Skills",
"settings.browser.description":
- "啟用後,AI Agent 可以與網頁互動,可導覽、點選、輸入並擷取螢幕截圖。Chrome 視窗將開啟,方便觀察 Agent 的工作。",
+ "設定由 Playwright 提供支援的內建瀏覽器自動化。Kilo 可以在你的工作階段中瀏覽網頁、與網頁互動,並擷取螢幕截圖。",
"settings.browser.enable.title": "啟用瀏覽器自動化",
"settings.browser.enable.description": "將 Playwright MCP 伺服器註冊到 CLI 後端。",
"settings.browser.systemChrome.title": "使用系統 Chrome",
@@ -1286,5 +1286,11 @@ export const dict = {
"chat.search.close": "關閉搜尋",
"chat.search.invalidRegex": "規則運算式無效",
"chat.search.noResults": "無結果",
+ "settings.experimental.browserAutomation.title": "整合瀏覽器",
+ "settings.experimental.browserAutomation.description":
+ "在 Agent Manager 中顯示本機應用程式預覽,並向 Agent Manager 工作階段公開 browser_open 工具。",
+ "settings.experimental.browserAutomation.systemChrome.title": "使用系統 Chrome",
+ "settings.experimental.browserAutomation.systemChrome.description":
+ "為整合瀏覽器使用已安裝的 Google Chrome。僅在已安裝相容的 Playwright Chromium 瀏覽器時才停用。",
"chat.search.searchingHistory": "正在搜尋較早的訊息…",
} satisfies Partial>
diff --git a/packages/kilo-vscode/webview-ui/src/types/messages/config.ts b/packages/kilo-vscode/webview-ui/src/types/messages/config.ts
index ca9eb5c3dab..9002ed7b523 100644
--- a/packages/kilo-vscode/webview-ui/src/types/messages/config.ts
+++ b/packages/kilo-vscode/webview-ui/src/types/messages/config.ts
@@ -128,7 +128,9 @@ export type KiloEmbeddingModelCatalog = {
export type IndexingStatus = SdkIndexingStatus
export interface BrowserSettings {
+ enabled: boolean
useSystemChrome: boolean
+ headless: boolean
}
export type TerminalCommandDisplay = "expanded" | "collapsed"
diff --git a/packages/opencode/src/kilocode/tool/browser-open.ts b/packages/opencode/src/kilocode/tool/browser-open.ts
index ad5addfdb16..bea8af60ea0 100644
--- a/packages/opencode/src/kilocode/tool/browser-open.ts
+++ b/packages/opencode/src/kilocode/tool/browser-open.ts
@@ -67,7 +67,7 @@ export const BrowserOpenTool = Tool.define<
) {
return {
title: "Browser unavailable",
- output: "The Agent Manager browser is not available in this session.",
+ output: "The Integrated Browser is not available in this session.",
metadata: { status: "error", errors: 0 } satisfies Meta,
}
}
@@ -134,7 +134,7 @@ export const BrowserOpenTool = Tool.define<
state.logs?.length
? `Console diagnostics:\n${state.logs.map((line) => `- ${line}`).join("\n")}`
: undefined,
- "The user can inspect this page in the Agent Manager Browser panel.",
+ "The user can inspect this page in the Integrated Browser panel in Agent Manager.",
]
.filter(Boolean)
.join("\n"),
diff --git a/packages/opencode/src/kilocode/tool/browser-open.txt b/packages/opencode/src/kilocode/tool/browser-open.txt
index 0701cca7893..95075c911de 100644
--- a/packages/opencode/src/kilocode/tool/browser-open.txt
+++ b/packages/opencode/src/kilocode/tool/browser-open.txt
@@ -1,4 +1,4 @@
-Open the local application in the Browser panel for the current Agent Manager session.
+Open the local application in the Integrated Browser panel for the current Agent Manager session.
Use this tool when the user asks you to inspect or verify a local web application.
The user can see the same browser page in Agent Manager. Reuse this browser instead