From 44f13738a30668483a2cc5c22c6ba82a718cdb90 Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Sat, 18 Jul 2026 08:43:45 -0400 Subject: [PATCH 01/29] feat: configure web search availability for all providers Adds an experimental.websearch config flag that exposes the websearch tool to models from any provider, not only the Kilo gateway. The flag is editable from the VS Code Web Tools settings tab (renamed from Browser) and the Kilo Console Tools page, with project/global overlay inheritance and revert support. Environment flags KILO_ENABLE_EXA and KILO_ENABLE_PARALLEL keep working as before. --- .changeset/enable-websearch-config.md | 6 + packages/core/src/v1/config/config.ts | 3 + .../src/routes/config/ToolsRoute.tsx | 48 +++- .../src/components/settings/BrowserTab.tsx | 119 +++++--- .../src/components/settings/Settings.tsx | 6 +- .../kilo-vscode/webview-ui/src/i18n/en.ts | 8 + .../webview-ui/src/types/messages/config.ts | 1 + .../opencode/src/kilocode/config/overlay.ts | 1 + packages/opencode/src/tool/registry.ts | 2 + .../test/kilocode/config/config.test.ts | 6 + .../kilocode/server/config-overlay.test.ts | 36 +++ packages/sdk/js/src/v2/gen/types.gen.ts | 1 + packages/sdk/openapi.json | 258 +++++++++++++++++- 13 files changed, 458 insertions(+), 37 deletions(-) create mode 100644 .changeset/enable-websearch-config.md diff --git a/.changeset/enable-websearch-config.md b/.changeset/enable-websearch-config.md new file mode 100644 index 0000000000..ebbc4135f3 --- /dev/null +++ b/.changeset/enable-websearch-config.md @@ -0,0 +1,6 @@ +--- +"@kilocode/cli": patch +"kilo-code": patch +--- + +Configure web search for models from all providers through Kilo configuration, VS Code settings, and Kilo Console settings. diff --git a/packages/core/src/v1/config/config.ts b/packages/core/src/v1/config/config.ts index 97eb6bba35..b8ac33fef4 100644 --- a/packages/core/src/v1/config/config.ts +++ b/packages/core/src/v1/config/config.ts @@ -278,6 +278,9 @@ export const Info = Schema.Struct({ batch_tool: Schema.optional(Schema.Boolean).annotate({ description: "Enable the batch tool" }), // kilocode_change start codebase_search: Schema.optional(Schema.Boolean).annotate({ description: "Enable AI-powered codebase search" }), + websearch: Schema.optional(Schema.Boolean).annotate({ + description: "Enable web search for all model providers", + }), image_generation: Schema.optional(Schema.Boolean).annotate({ description: "Enable AI image generation" }), image_generation_model: Schema.optional(Schema.String).annotate({ description: "Model ID to use for image generation (default: openrouter/auto)", diff --git a/packages/kilo-console/src/routes/config/ToolsRoute.tsx b/packages/kilo-console/src/routes/config/ToolsRoute.tsx index 1aca8a16b8..5688e41084 100644 --- a/packages/kilo-console/src/routes/config/ToolsRoute.tsx +++ b/packages/kilo-console/src/routes/config/ToolsRoute.tsx @@ -1,14 +1,18 @@ import { createMemo, createSignal, For, Show } from "solid-js" import { ConfigRow, SectionTitle, StatusTag } from "@kilocode/kilo-web-ui/console" +import { Button } from "@kilocode/kilo-web-ui/button" +import { Card } from "@kilocode/kilo-web-ui/card" import { SearchField } from "../../components/SearchField" import { useConfig } from "../../context/config" import { toolCapabilities, toolName } from "../../shared/utils" -import { ConfigCountTag as CountTag, ConfigPage } from "./ConfigPage" +import { ConfigCountTag as CountTag, ConfigPage, ConfigTag as Tag, SourceBadge } from "./ConfigPage" export function ToolsRoute() { const ctx = useConfig() const [search, setSearch] = createSignal("") const snap = () => ctx.data() + const websearch = createMemo(() => snap()?.overlay.fields["experimental.websearch"]) + const searchEnabled = createMemo(() => websearch()?.value === true) const rows = createMemo(() => { const data = snap() if (!data) return [] @@ -52,6 +56,48 @@ export function ToolsRoute() { } description="Built-in tools available to agents, including file access, terminal execution, search, fetch, and orchestration tools." > + +
+
+

Web search

+

Control web search availability for models from providers that do not enable it by default.

+
+ + + +
+
+ +
+
+ = (props) => ( +

+ {props.title} +

+) + const BrowserTab: Component = () => { const { postMessage, onMessage } = useVSCode() const { t } = useLanguage() + const { config, updateConfig } = useConfig() const [settings, setSettings] = createSignal({ enabled: false, @@ -33,6 +51,10 @@ const BrowserTab: Component = () => { postMessage({ type: "updateSetting", key: `browserAutomation.${key}`, value }) } + const updateWebsearch = (checked: boolean) => { + updateConfig({ experimental: { ...config().experimental, websearch: checked } }) + } + return (
{/* Info text */} @@ -52,43 +74,78 @@ const BrowserTab: Component = () => { "line-height": "1.5", }} > - {t("settings.browser.description")} + {t("settings.webTools.description")}

- - {/* Enable toggle */} - - update("enabled", checked)} hideLabel> - {t("settings.browser.enable.title")} - - - - {/* Use System Chrome */} - - update("useSystemChrome", checked)} - hideLabel +
+
+ + - {t("settings.browser.systemChrome.title")} - - + + {t("settings.experimental.websearch.title")} + + + +
- {/* Headless mode */} - +
+

- update("headless", checked)} hideLabel> - {t("settings.browser.headless.title")} - - - + {t("settings.browser.description")} +

+ + {/* Enable toggle */} + + update("enabled", checked)} hideLabel> + {t("settings.browser.enable.title")} + + + + {/* Use System Chrome */} + + update("useSystemChrome", checked)} + hideLabel + > + {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/Settings.tsx b/packages/kilo-vscode/webview-ui/src/components/settings/Settings.tsx index 7e67d9df60..8bd39f14a4 100644 --- a/packages/kilo-vscode/webview-ui/src/components/settings/Settings.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/settings/Settings.tsx @@ -177,9 +177,9 @@ const Settings: Component = (props) => { {language.t("settings.autoApprove.title")} - + - {language.t("settings.browser.title")} + {language.t("settings.webTools.title")} @@ -249,7 +249,7 @@ const Settings: Component = (props) => { -

{language.t("settings.browser.title")}

+

{language.t("settings.webTools.title")}

diff --git a/packages/kilo-vscode/webview-ui/src/i18n/en.ts b/packages/kilo-vscode/webview-ui/src/i18n/en.ts index e1a53df79e..abe0350075 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/en.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/en.ts @@ -1177,6 +1177,7 @@ export const dict = { "settings.agentBehaviour.title": "Agent Behaviour", "settings.autoApprove.title": "Auto-Approve", "settings.browser.title": "Browser", + "settings.webTools.title": "Web Tools", "settings.checkpoints.title": "Checkpoints", "settings.display.title": "Display", "settings.autocomplete.title": "Autocomplete", @@ -1349,6 +1350,10 @@ export const dict = { "settings.browser.description": "When enabled, the AI agent can interact with web pages — navigating, clicking, typing, and taking screenshots. A Chrome window will open so you can watch the agent work.", + "settings.webTools.description": + "Configure web search and browser automation. Search requests connect directly to Exa or Parallel.", + "settings.webTools.websearchEnable": "Enable for All Providers", + "settings.webTools.browserAutomation": "Browser Automation", "settings.browser.enable.title": "Enable Browser Automation", "settings.browser.enable.description": "Register the Playwright MCP server with the CLI backend.", "settings.browser.systemChrome.title": "Use System Chrome", @@ -1409,6 +1414,9 @@ export const dict = { "settings.experimental.lsp.description": "Enable language server protocol integration", "settings.experimental.batch.title": "Batch Tool", "settings.experimental.batch.description": "Enable batching of multiple tool calls", + "settings.experimental.websearch.title": "Web Search", + "settings.experimental.websearch.description": + "Make web search available to models from all providers. Searches connect directly to Exa or Parallel.", "settings.experimental.codebaseSearch.title": "Codebase Search", "settings.experimental.codebaseSearch.description": "Enable AI-powered natural language search across your codebase", "settings.experimental.imageGeneration.title": "Image Generation", 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 c10943cecc..0dc2d05dc7 100644 --- a/packages/kilo-vscode/webview-ui/src/types/messages/config.ts +++ b/packages/kilo-vscode/webview-ui/src/types/messages/config.ts @@ -39,6 +39,7 @@ export interface WatcherConfig { export interface ExperimentalConfig { batch_tool?: boolean + websearch?: boolean codebase_search?: boolean image_generation?: boolean image_generation_model?: string diff --git a/packages/opencode/src/kilocode/config/overlay.ts b/packages/opencode/src/kilocode/config/overlay.ts index 2d576c3bce..b0cd42f88c 100644 --- a/packages/opencode/src/kilocode/config/overlay.ts +++ b/packages/opencode/src/kilocode/config/overlay.ts @@ -88,6 +88,7 @@ export namespace KilocodeConfigOverlay { ["disabled_providers"], ["watcher", "ignore"], ["instructions"], + ["experimental", "websearch"], ["indexing", "enabled"], ["indexing", "provider"], ["indexing", "model"], diff --git a/packages/opencode/src/tool/registry.ts b/packages/opencode/src/tool/registry.ts index bab5ff3c89..f8eb66469a 100644 --- a/packages/opencode/src/tool/registry.ts +++ b/packages/opencode/src/tool/registry.ts @@ -373,9 +373,11 @@ export const layer: Layer.Layer< }) const tools: Interface["tools"] = Effect.fn("ToolRegistry.tools")(function* (input) { + const cfg = yield* config.get() // kilocode_change const filtered = (yield* all()).filter((tool) => { if (!KiloToolRegistry.available(tool, input.agent)) return false // kilocode_change if (tool.id === WebSearchTool.id) { + if (cfg.experimental?.websearch === true) return true // kilocode_change return webSearchEnabled(input.providerID, { exa: flags.enableExa, parallel: flags.enableParallel }) } diff --git a/packages/opencode/test/kilocode/config/config.test.ts b/packages/opencode/test/kilocode/config/config.test.ts index dde6a6d707..50529c043f 100644 --- a/packages/opencode/test/kilocode/config/config.test.ts +++ b/packages/opencode/test/kilocode/config/config.test.ts @@ -152,6 +152,12 @@ describe("global config updates", () => { }) describe("kilocode indexing config", () => { + test("accepts the websearch availability setting", () => { + const config = Schema.decodeUnknownSync(Config.Info)({ experimental: { websearch: true } }) + + expect(config.experimental?.websearch).toBe(true) + }) + test("ignores retired semantic indexing flags in existing configs", async () => { await using tmp = await tmpdir({ git: true }) await writeConfig(tmp.path, { diff --git a/packages/opencode/test/kilocode/server/config-overlay.test.ts b/packages/opencode/test/kilocode/server/config-overlay.test.ts index d3351b0d50..e8a55f9ac7 100644 --- a/packages/opencode/test/kilocode/server/config-overlay.test.ts +++ b/packages/opencode/test/kilocode/server/config-overlay.test.ts @@ -201,6 +201,42 @@ describe("config overlay routes", () => { }) }) + test.serial("resolves and reverts project websearch overrides", async () => { + await using global = await tmpdir() + await using project = await tmpdir() + await setGlobal(global.path, { experimental: { websearch: true } }) + + await json( + await req(project.path, "/config/overlay", { + method: "PATCH", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ scope: "project", set: { experimental: { websearch: false } } }), + }), + ) + const overridden = await json(await req(project.path, "/config/overlay?scope=project")) + expect(overridden.fields["experimental.websearch"]).toMatchObject({ + source: "project", + inherited: false, + overridden: true, + value: false, + }) + + await json( + await req(project.path, "/config/overlay", { + method: "PATCH", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ scope: "project", unset: [["experimental", "websearch"]] }), + }), + ) + const inherited = await json(await req(project.path, "/config/overlay?scope=project")) + expect(inherited.fields["experimental.websearch"]).toMatchObject({ + source: "global", + inherited: true, + overridden: false, + value: true, + }) + }) + test.serial("marks global indexing values inherited in project scope", async () => { await using global = await tmpdir() await using project = await tmpdir() diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index 9bdf89a86c..0bd15820a7 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -1699,6 +1699,7 @@ export type Config = { disable_paste_summary?: boolean batch_tool?: boolean codebase_search?: boolean + websearch?: boolean image_generation?: boolean image_generation_model?: string agent_requirements?: boolean diff --git a/packages/sdk/openapi.json b/packages/sdk/openapi.json index 1c1f594374..7ea6d2387d 100644 --- a/packages/sdk/openapi.json +++ b/packages/sdk/openapi.json @@ -25850,8 +25850,7 @@ "items": { "type": "string", "pattern": "^\\s*\\.?[A-Za-z0-9][A-Za-z0-9_+-]*\\s*$" - }, - "minItems": 1 + } } }, "additionalProperties": false @@ -27001,6 +27000,9 @@ "codebase_search": { "type": "boolean" }, + "websearch": { + "type": "boolean" + }, "image_generation": { "type": "boolean" }, @@ -33543,6 +33545,52 @@ } ] }, + "added": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "removed": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, "skippedCount": { "anyOf": [ { @@ -33840,6 +33888,52 @@ } ] }, + "added": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "removed": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, "skippedCount": { "anyOf": [ { @@ -34137,6 +34231,52 @@ } ] }, + "added": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "removed": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, "skippedCount": { "anyOf": [ { @@ -41274,6 +41414,44 @@ } ] }, + "added": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + } + ] + }, + "removed": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + } + ] + }, "skippedCount": { "anyOf": [ { @@ -41535,6 +41713,44 @@ } ] }, + "added": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + } + ] + }, + "removed": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + } + ] + }, "skippedCount": { "anyOf": [ { @@ -41796,6 +42012,44 @@ } ] }, + "added": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + } + ] + }, + "removed": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + } + ] + }, "skippedCount": { "anyOf": [ { From 91d87588bf88af5b0e75780aab9637d23142dc76 Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Tue, 21 Jul 2026 09:11:20 -0400 Subject: [PATCH 02/29] fix: address web search review feedback --- packages/core/src/v1/config/config.ts | 6 +-- .../src/routes/config/ToolsRoute.tsx | 6 +-- .../tests/settings-accessibility.spec.ts | 2 +- .../src/components/settings/BrowserTab.tsx | 12 ++--- .../kilo-vscode/webview-ui/src/i18n/ar.ts | 8 ++- .../kilo-vscode/webview-ui/src/i18n/br.ts | 9 +++- .../kilo-vscode/webview-ui/src/i18n/bs.ts | 9 +++- .../kilo-vscode/webview-ui/src/i18n/da.ts | 9 +++- .../kilo-vscode/webview-ui/src/i18n/de.ts | 9 +++- .../kilo-vscode/webview-ui/src/i18n/en.ts | 15 +++--- .../kilo-vscode/webview-ui/src/i18n/es.ts | 9 +++- .../kilo-vscode/webview-ui/src/i18n/fr.ts | 9 +++- .../kilo-vscode/webview-ui/src/i18n/it.ts | 9 +++- .../kilo-vscode/webview-ui/src/i18n/ja.ts | 9 +++- .../kilo-vscode/webview-ui/src/i18n/ko.ts | 9 +++- .../kilo-vscode/webview-ui/src/i18n/nl.ts | 9 +++- .../kilo-vscode/webview-ui/src/i18n/no.ts | 9 +++- .../kilo-vscode/webview-ui/src/i18n/pl.ts | 9 +++- .../kilo-vscode/webview-ui/src/i18n/ru.ts | 9 +++- .../kilo-vscode/webview-ui/src/i18n/th.ts | 9 +++- .../kilo-vscode/webview-ui/src/i18n/tr.ts | 9 +++- .../kilo-vscode/webview-ui/src/i18n/uk.ts | 9 +++- .../kilo-vscode/webview-ui/src/i18n/zh.ts | 7 ++- .../kilo-vscode/webview-ui/src/i18n/zht.ts | 7 ++- .../webview-ui/src/types/messages/config.ts | 2 +- .../opencode/src/kilocode/config/overlay.ts | 2 +- packages/opencode/src/tool/registry.ts | 2 +- .../test/kilocode/config/config.test.ts | 8 +-- .../kilocode/server/config-overlay.test.ts | 10 ++-- packages/opencode/test/tool/registry.test.ts | 50 ++++++++++++++++++- packages/sdk/js/src/v2/gen/types.gen.ts | 2 +- packages/sdk/openapi.json | 6 +-- 32 files changed, 233 insertions(+), 56 deletions(-) diff --git a/packages/core/src/v1/config/config.ts b/packages/core/src/v1/config/config.ts index b8ac33fef4..bd9baab123 100644 --- a/packages/core/src/v1/config/config.ts +++ b/packages/core/src/v1/config/config.ts @@ -226,6 +226,9 @@ export const Info = Schema.Struct({ layout: Schema.optional(ConfigLayoutV1.Layout).annotate({ description: "@deprecated Always uses stretch layout." }), permission: Schema.optional(ConfigPermissionV1.Info), tools: Schema.optional(Schema.Record(Schema.String, Schema.Boolean)), + web_search: Schema.optional(Schema.Boolean).annotate({ + description: "Make web search available to models from all providers", + }), // kilocode_change attachment: Schema.optional(ConfigAttachmentV1.Info).annotate({ description: "Attachment processing configuration, including image size limits and resizing behavior", }), @@ -278,9 +281,6 @@ export const Info = Schema.Struct({ batch_tool: Schema.optional(Schema.Boolean).annotate({ description: "Enable the batch tool" }), // kilocode_change start codebase_search: Schema.optional(Schema.Boolean).annotate({ description: "Enable AI-powered codebase search" }), - websearch: Schema.optional(Schema.Boolean).annotate({ - description: "Enable web search for all model providers", - }), image_generation: Schema.optional(Schema.Boolean).annotate({ description: "Enable AI image generation" }), image_generation_model: Schema.optional(Schema.String).annotate({ description: "Model ID to use for image generation (default: openrouter/auto)", diff --git a/packages/kilo-console/src/routes/config/ToolsRoute.tsx b/packages/kilo-console/src/routes/config/ToolsRoute.tsx index 5688e41084..9dcb20b6e0 100644 --- a/packages/kilo-console/src/routes/config/ToolsRoute.tsx +++ b/packages/kilo-console/src/routes/config/ToolsRoute.tsx @@ -11,7 +11,7 @@ export function ToolsRoute() { const ctx = useConfig() const [search, setSearch] = createSignal("") const snap = () => ctx.data() - const websearch = createMemo(() => snap()?.overlay.fields["experimental.websearch"]) + const websearch = createMemo(() => snap()?.overlay.fields.web_search) const searchEnabled = createMemo(() => websearch()?.value === true) const rows = createMemo(() => { const data = snap() @@ -66,7 +66,7 @@ export function ToolsRoute() { @@ -79,7 +79,7 @@ export function ToolsRoute() { type="button" aria-pressed={searchEnabled()} disabled={Boolean(ctx.saving()) || websearch()?.editable === false} - onClick={() => ctx.save({ experimental: { websearch: !searchEnabled() } })} + onClick={() => ctx.save({ web_search: !searchEnabled() })} > Enable for all providers diff --git a/packages/kilo-vscode/tests/settings-accessibility.spec.ts b/packages/kilo-vscode/tests/settings-accessibility.spec.ts index 03073ea4c5..5e2b62082f 100644 --- a/packages/kilo-vscode/tests/settings-accessibility.spec.ts +++ b/packages/kilo-vscode/tests/settings-accessibility.spec.ts @@ -6,7 +6,7 @@ const NAMES = [ "Providers", "Agent Behaviour", "Auto-Approve", - "Browser", + "Web Tools", "Checkpoints", "Display", "Autocomplete", 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 1422752ff5..fabc7858b8 100644 --- a/packages/kilo-vscode/webview-ui/src/components/settings/BrowserTab.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/settings/BrowserTab.tsx @@ -52,7 +52,7 @@ const BrowserTab: Component = () => { } const updateWebsearch = (checked: boolean) => { - updateConfig({ experimental: { ...config().experimental, websearch: checked } }) + updateConfig({ web_search: checked }) } return ( @@ -79,15 +79,15 @@ const BrowserTab: Component = () => {
-
+
- - {t("settings.experimental.websearch.title")} + + {t("settings.webTools.webSearch.title")} diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts index f86fe517b0..02fc76303d 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts @@ -1203,7 +1203,13 @@ export const dict = { "settings.section.configuration": "الإعدادات", "settings.agentBehaviour.title": "سلوك الوكيل", "settings.autoApprove.title": "الموافقة التلقائية", - "settings.browser.title": "المتصفح", + "settings.webTools.title": "أدوات الويب", + "settings.webTools.description": "اضبط البحث على الويب وأتمتة المتصفح. تتصل طلبات البحث مباشرةً بـ Exa أو Parallel.", + "settings.webTools.webSearch.enable": "تمكين لجميع المزوّدين", + "settings.webTools.browserAutomation": "أتمتة المتصفح", + "settings.webTools.webSearch.title": "البحث على الويب", + "settings.webTools.webSearch.description": + "اجعل البحث على الويب متاحًا لنماذج جميع المزوّدين. تتصل عمليات البحث مباشرةً بـ Exa أو Parallel.", "settings.checkpoints.title": "نقاط التحقق", "settings.display.title": "العرض", "settings.autocomplete.title": "الإكمال التلقائي", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/br.ts b/packages/kilo-vscode/webview-ui/src/i18n/br.ts index 35a1450ea1..902114dd85 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/br.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/br.ts @@ -1224,7 +1224,14 @@ export const dict = { "settings.section.configuration": "Configuração", "settings.agentBehaviour.title": "Comportamento do Agente", "settings.autoApprove.title": "Aprovação Automática", - "settings.browser.title": "Navegador", + "settings.webTools.title": "Ferramentas da Web", + "settings.webTools.description": + "Configure a pesquisa na web e a automação do navegador. As solicitações de pesquisa se conectam diretamente ao Exa ou Parallel.", + "settings.webTools.webSearch.enable": "Ativar para todos os provedores", + "settings.webTools.browserAutomation": "Automação do navegador", + "settings.webTools.webSearch.title": "Pesquisa na Web", + "settings.webTools.webSearch.description": + "Disponibilize a pesquisa na web para modelos de todos os provedores. As pesquisas se conectam diretamente ao Exa ou Parallel.", "settings.checkpoints.title": "Pontos de Verificação", "settings.display.title": "Exibição", "settings.autocomplete.title": "Autocompletar", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts index c19e73262c..dbb2e7b923 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts @@ -1269,7 +1269,14 @@ export const dict = { "settings.section.configuration": "Konfiguracija", "settings.agentBehaviour.title": "Ponašanje agenta", "settings.autoApprove.title": "Automatsko odobravanje", - "settings.browser.title": "Preglednik", + "settings.webTools.title": "Web alati", + "settings.webTools.description": + "Konfigurišite web pretragu i automatizaciju preglednika. Zahtjevi za pretragu povezuju se direktno s Exa ili Parallel.", + "settings.webTools.webSearch.enable": "Omogući za sve pružaoce", + "settings.webTools.browserAutomation": "Automatizacija preglednika", + "settings.webTools.webSearch.title": "Web pretraga", + "settings.webTools.webSearch.description": + "Omogućite web pretragu modelima svih pružalaca. Pretrage se povezuju direktno s Exa ili Parallel.", "settings.checkpoints.title": "Kontrolne tačke", "settings.display.title": "Prikaz", "settings.autocomplete.title": "Automatsko dovršavanje", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/da.ts b/packages/kilo-vscode/webview-ui/src/i18n/da.ts index 8e9a593dd3..028595f859 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/da.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/da.ts @@ -1262,7 +1262,14 @@ export const dict = { "settings.section.configuration": "Konfiguration", "settings.agentBehaviour.title": "Agentadfærd", "settings.autoApprove.title": "Automatisk godkendelse", - "settings.browser.title": "Browser", + "settings.webTools.title": "Webværktøjer", + "settings.webTools.description": + "Konfigurer websøgning og browserautomatisering. Søgeanmodninger sendes direkte til Exa eller Parallel.", + "settings.webTools.webSearch.enable": "Aktivér for alle udbydere", + "settings.webTools.browserAutomation": "Browserautomatisering", + "settings.webTools.webSearch.title": "Websøgning", + "settings.webTools.webSearch.description": + "Gør websøgning tilgængelig for modeller fra alle udbydere. Søgninger sendes direkte til Exa eller Parallel.", "settings.checkpoints.title": "Kontrolpunkter", "settings.display.title": "Visning", "settings.autocomplete.title": "Autofuldførelse", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/de.ts b/packages/kilo-vscode/webview-ui/src/i18n/de.ts index 380e7d3db4..4adcf7b72f 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/de.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/de.ts @@ -1283,7 +1283,14 @@ export const dict = { "settings.section.configuration": "Konfiguration", "settings.agentBehaviour.title": "Agentenverhalten", "settings.autoApprove.title": "Automatisch genehmigen", - "settings.browser.title": "Browser", + "settings.webTools.title": "Web-Tools", + "settings.webTools.description": + "Konfigurieren Sie Websuche und Browserautomatisierung. Suchanfragen werden direkt an Exa oder Parallel gesendet.", + "settings.webTools.webSearch.enable": "Für alle Anbieter aktivieren", + "settings.webTools.browserAutomation": "Browserautomatisierung", + "settings.webTools.webSearch.title": "Websuche", + "settings.webTools.webSearch.description": + "Machen Sie die Websuche für Modelle aller Anbieter verfügbar. Suchanfragen werden direkt an Exa oder Parallel gesendet.", "settings.checkpoints.title": "Prüfpunkte", "settings.display.title": "Anzeige", "settings.autocomplete.title": "Autovervollständigung", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/en.ts b/packages/kilo-vscode/webview-ui/src/i18n/en.ts index abe0350075..e926699acc 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/en.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/en.ts @@ -1176,8 +1176,14 @@ export const dict = { "settings.section.configuration": "Configuration", "settings.agentBehaviour.title": "Agent Behaviour", "settings.autoApprove.title": "Auto-Approve", - "settings.browser.title": "Browser", "settings.webTools.title": "Web Tools", + "settings.webTools.description": + "Configure web search and browser automation. Search requests connect directly to Exa or Parallel.", + "settings.webTools.webSearch.enable": "Enable for All Providers", + "settings.webTools.browserAutomation": "Browser Automation", + "settings.webTools.webSearch.title": "Web Search", + "settings.webTools.webSearch.description": + "Make web search available to models from all providers. Searches connect directly to Exa or Parallel.", "settings.checkpoints.title": "Checkpoints", "settings.display.title": "Display", "settings.autocomplete.title": "Autocomplete", @@ -1350,10 +1356,6 @@ export const dict = { "settings.browser.description": "When enabled, the AI agent can interact with web pages — navigating, clicking, typing, and taking screenshots. A Chrome window will open so you can watch the agent work.", - "settings.webTools.description": - "Configure web search and browser automation. Search requests connect directly to Exa or Parallel.", - "settings.webTools.websearchEnable": "Enable for All Providers", - "settings.webTools.browserAutomation": "Browser Automation", "settings.browser.enable.title": "Enable Browser Automation", "settings.browser.enable.description": "Register the Playwright MCP server with the CLI backend.", "settings.browser.systemChrome.title": "Use System Chrome", @@ -1414,9 +1416,6 @@ export const dict = { "settings.experimental.lsp.description": "Enable language server protocol integration", "settings.experimental.batch.title": "Batch Tool", "settings.experimental.batch.description": "Enable batching of multiple tool calls", - "settings.experimental.websearch.title": "Web Search", - "settings.experimental.websearch.description": - "Make web search available to models from all providers. Searches connect directly to Exa or Parallel.", "settings.experimental.codebaseSearch.title": "Codebase Search", "settings.experimental.codebaseSearch.description": "Enable AI-powered natural language search across your codebase", "settings.experimental.imageGeneration.title": "Image Generation", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/es.ts b/packages/kilo-vscode/webview-ui/src/i18n/es.ts index e1cd429614..d66f4bd86f 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/es.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/es.ts @@ -1276,7 +1276,14 @@ export const dict = { "settings.section.configuration": "Configuración", "settings.agentBehaviour.title": "Comportamiento del agente", "settings.autoApprove.title": "Aprobación automática", - "settings.browser.title": "Navegador", + "settings.webTools.title": "Herramientas web", + "settings.webTools.description": + "Configura la búsqueda web y la automatización del navegador. Las solicitudes de búsqueda se conectan directamente a Exa o Parallel.", + "settings.webTools.webSearch.enable": "Habilitar para todos los proveedores", + "settings.webTools.browserAutomation": "Automatización del navegador", + "settings.webTools.webSearch.title": "Búsqueda web", + "settings.webTools.webSearch.description": + "Permite que los modelos de todos los proveedores usen la búsqueda web. Las búsquedas se conectan directamente a Exa o Parallel.", "settings.checkpoints.title": "Puntos de control", "settings.display.title": "Pantalla", "settings.autocomplete.title": "Autocompletado", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts index 71055c0d65..1ed7c73e8b 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts @@ -1287,7 +1287,14 @@ export const dict = { "settings.section.configuration": "Configuration", "settings.agentBehaviour.title": "Comportement de l'agent", "settings.autoApprove.title": "Approbation automatique", - "settings.browser.title": "Navigateur", + "settings.webTools.title": "Outils web", + "settings.webTools.description": + "Configurez la recherche web et l’automatisation du navigateur. Les requêtes de recherche se connectent directement à Exa ou Parallel.", + "settings.webTools.webSearch.enable": "Activer pour tous les fournisseurs", + "settings.webTools.browserAutomation": "Automatisation du navigateur", + "settings.webTools.webSearch.title": "Recherche web", + "settings.webTools.webSearch.description": + "Rendez la recherche web disponible pour les modèles de tous les fournisseurs. Les recherches se connectent directement à Exa ou Parallel.", "settings.checkpoints.title": "Points de contrôle", "settings.display.title": "Affichage", "settings.autocomplete.title": "Autocomplétion", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/it.ts b/packages/kilo-vscode/webview-ui/src/i18n/it.ts index 034276bb9c..b0c9a5f703 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/it.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/it.ts @@ -1023,7 +1023,14 @@ export const dict = { "settings.section.configuration": "Configurazione", "settings.agentBehaviour.title": "Comportamento agente", "settings.autoApprove.title": "Approvazione automatica", - "settings.browser.title": "Browser", + "settings.webTools.title": "Strumenti web", + "settings.webTools.description": + "Configura la ricerca web e l'automazione del browser. Le richieste di ricerca si connettono direttamente a Exa o Parallel.", + "settings.webTools.webSearch.enable": "Abilita per tutti i provider", + "settings.webTools.browserAutomation": "Automazione del browser", + "settings.webTools.webSearch.title": "Ricerca web", + "settings.webTools.webSearch.description": + "Rendi disponibile la ricerca web ai modelli di tutti i provider. Le ricerche si connettono direttamente a Exa o Parallel.", "settings.checkpoints.title": "Checkpoint", "settings.display.title": "Visualizzazione", "settings.autocomplete.title": "Autocompletamento", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts index 2c6bd6c9e3..fd60365ca9 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts @@ -1257,7 +1257,14 @@ export const dict = { "settings.section.configuration": "設定", "settings.agentBehaviour.title": "エージェントの動作", "settings.autoApprove.title": "自動承認", - "settings.browser.title": "ブラウザ", + "settings.webTools.title": "ウェブツール", + "settings.webTools.description": + "ウェブ検索とブラウザ自動化を設定します。検索リクエストは Exa または Parallel に直接接続されます。", + "settings.webTools.webSearch.enable": "すべてのプロバイダーで有効化", + "settings.webTools.browserAutomation": "ブラウザ自動化", + "settings.webTools.webSearch.title": "ウェブ検索", + "settings.webTools.webSearch.description": + "すべてのプロバイダーのモデルでウェブ検索を利用できるようにします。検索は Exa または Parallel に直接接続されます。", "settings.checkpoints.title": "チェックポイント", "settings.display.title": "表示", "settings.autocomplete.title": "オートコンプリート", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts index 990edeb5eb..9dd03144c2 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts @@ -1210,7 +1210,14 @@ export const dict = { "settings.section.configuration": "구성", "settings.agentBehaviour.title": "에이전트 동작", "settings.autoApprove.title": "자동 승인", - "settings.browser.title": "브라우저", + "settings.webTools.title": "웹 도구", + "settings.webTools.description": + "웹 검색 및 브라우저 자동화를 구성합니다. 검색 요청은 Exa 또는 Parallel에 직접 연결됩니다.", + "settings.webTools.webSearch.enable": "모든 제공업체에 사용", + "settings.webTools.browserAutomation": "브라우저 자동화", + "settings.webTools.webSearch.title": "웹 검색", + "settings.webTools.webSearch.description": + "모든 제공업체의 모델에서 웹 검색을 사용할 수 있도록 합니다. 검색은 Exa 또는 Parallel에 직접 연결됩니다.", "settings.checkpoints.title": "체크포인트", "settings.display.title": "디스플레이", "settings.autocomplete.title": "자동 완성", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts index 75d20e4f17..8158160380 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts @@ -1218,7 +1218,14 @@ export const dict = { "settings.section.configuration": "Configuratie", "settings.agentBehaviour.title": "Agent Gedrag", "settings.autoApprove.title": "Automatisch Goedkeuren", - "settings.browser.title": "Browser", + "settings.webTools.title": "Webtools", + "settings.webTools.description": + "Configureer zoeken op internet en browserautomatisering. Zoekopdrachten maken rechtstreeks verbinding met Exa of Parallel.", + "settings.webTools.webSearch.enable": "Inschakelen voor alle providers", + "settings.webTools.browserAutomation": "Browserautomatisering", + "settings.webTools.webSearch.title": "Zoeken op internet", + "settings.webTools.webSearch.description": + "Maak zoeken op internet beschikbaar voor modellen van alle providers. Zoekopdrachten maken rechtstreeks verbinding met Exa of Parallel.", "settings.checkpoints.title": "Controlepunten", "settings.display.title": "Weergave", "settings.autocomplete.title": "Automatisch Aanvullen", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/no.ts b/packages/kilo-vscode/webview-ui/src/i18n/no.ts index 68c4af800b..5e8b9faf1f 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/no.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/no.ts @@ -1222,7 +1222,14 @@ export const dict = { "settings.section.configuration": "Konfigurasjon", "settings.agentBehaviour.title": "Agentoppførsel", "settings.autoApprove.title": "Automatisk godkjenning", - "settings.browser.title": "Nettleser", + "settings.webTools.title": "Nettverktøy", + "settings.webTools.description": + "Konfigurer nettsøk og nettleserautomatisering. Søk sendes direkte til Exa eller Parallel.", + "settings.webTools.webSearch.enable": "Aktiver for alle leverandører", + "settings.webTools.browserAutomation": "Nettleserautomatisering", + "settings.webTools.webSearch.title": "Nettsøk", + "settings.webTools.webSearch.description": + "Gjør nettsøk tilgjengelig for modeller fra alle leverandører. Søk sendes direkte til Exa eller Parallel.", "settings.checkpoints.title": "Kontrollpunkter", "settings.display.title": "Visning", "settings.autocomplete.title": "Autofullfør", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts index f7238a444c..aa920ac5db 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts @@ -1221,7 +1221,14 @@ export const dict = { "settings.section.configuration": "Konfiguracja", "settings.agentBehaviour.title": "Zachowanie agenta", "settings.autoApprove.title": "Automatyczne zatwierdzanie", - "settings.browser.title": "Przeglądarka", + "settings.webTools.title": "Narzędzia internetowe", + "settings.webTools.description": + "Skonfiguruj wyszukiwanie w sieci i automatyzację przeglądarki. Żądania wyszukiwania łączą się bezpośrednio z Exa lub Parallel.", + "settings.webTools.webSearch.enable": "Włącz dla wszystkich dostawców", + "settings.webTools.browserAutomation": "Automatyzacja przeglądarki", + "settings.webTools.webSearch.title": "Wyszukiwanie w sieci", + "settings.webTools.webSearch.description": + "Udostępnij wyszukiwanie w sieci modelom wszystkich dostawców. Wyszukiwania łączą się bezpośrednio z Exa lub Parallel.", "settings.checkpoints.title": "Punkty kontrolne", "settings.display.title": "Wyświetlanie", "settings.autocomplete.title": "Autouzupełnianie", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts index 47a24933c3..68027826b8 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts @@ -1268,7 +1268,14 @@ export const dict = { "settings.section.configuration": "Конфигурация", "settings.agentBehaviour.title": "Поведение агента", "settings.autoApprove.title": "Автоодобрение", - "settings.browser.title": "Браузер", + "settings.webTools.title": "Веб-инструменты", + "settings.webTools.description": + "Настройте веб-поиск и автоматизацию браузера. Поисковые запросы отправляются напрямую в Exa или Parallel.", + "settings.webTools.webSearch.enable": "Включить для всех провайдеров", + "settings.webTools.browserAutomation": "Автоматизация браузера", + "settings.webTools.webSearch.title": "Веб-поиск", + "settings.webTools.webSearch.description": + "Сделайте веб-поиск доступным для моделей всех провайдеров. Поисковые запросы отправляются напрямую в Exa или Parallel.", "settings.checkpoints.title": "Контрольные точки", "settings.display.title": "Отображение", "settings.autocomplete.title": "Автодополнение", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/th.ts b/packages/kilo-vscode/webview-ui/src/i18n/th.ts index cac0eea7a9..c029e495b6 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/th.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/th.ts @@ -1250,7 +1250,14 @@ export const dict = { "settings.section.configuration": "การกำหนดค่า", "settings.agentBehaviour.title": "พฤติกรรมของเอเจนต์", "settings.autoApprove.title": "อนุมัติอัตโนมัติ", - "settings.browser.title": "เบราว์เซอร์", + "settings.webTools.title": "เครื่องมือเว็บ", + "settings.webTools.description": + "กำหนดค่าการค้นหาเว็บและระบบอัตโนมัติของเบราว์เซอร์ คำขอค้นหาจะเชื่อมต่อโดยตรงกับ Exa หรือ Parallel", + "settings.webTools.webSearch.enable": "เปิดใช้สำหรับผู้ให้บริการทั้งหมด", + "settings.webTools.browserAutomation": "ระบบอัตโนมัติของเบราว์เซอร์", + "settings.webTools.webSearch.title": "ค้นหาเว็บ", + "settings.webTools.webSearch.description": + "ทำให้โมเดลจากผู้ให้บริการทั้งหมดใช้การค้นหาเว็บได้ การค้นหาจะเชื่อมต่อโดยตรงกับ Exa หรือ Parallel", "settings.checkpoints.title": "จุดตรวจสอบ", "settings.display.title": "การแสดงผล", "settings.autocomplete.title": "เติมข้อความอัตโนมัติ", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts index e799d07141..a43c79880d 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts @@ -1215,7 +1215,14 @@ export const dict = { "settings.section.configuration": "Yapılandırma", "settings.agentBehaviour.title": "Ajan Davranışı", "settings.autoApprove.title": "Otomatik Onay", - "settings.browser.title": "Tarayıcı", + "settings.webTools.title": "Web Araçları", + "settings.webTools.description": + "Web aramasını ve tarayıcı otomasyonunu yapılandırın. Arama istekleri doğrudan Exa veya Parallel'e bağlanır.", + "settings.webTools.webSearch.enable": "Tüm Sağlayıcılar İçin Etkinleştir", + "settings.webTools.browserAutomation": "Tarayıcı Otomasyonu", + "settings.webTools.webSearch.title": "Web Araması", + "settings.webTools.webSearch.description": + "Web aramasını tüm sağlayıcıların modelleri için kullanılabilir hale getirin. Aramalar doğrudan Exa veya Parallel'e bağlanır.", "settings.checkpoints.title": "Kontrol Noktaları", "settings.display.title": "Görünüm", "settings.autocomplete.title": "Otomatik Tamamlama", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts index dfc15c248d..75783bc9e4 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts @@ -1213,7 +1213,14 @@ export const dict = { "settings.section.configuration": "Конфігурація", "settings.agentBehaviour.title": "Поведінка агента", "settings.autoApprove.title": "Автоматичне схвалення", - "settings.browser.title": "Браузер", + "settings.webTools.title": "Вебінструменти", + "settings.webTools.description": + "Налаштуйте вебпошук і автоматизацію браузера. Пошукові запити надсилаються безпосередньо до Exa або Parallel.", + "settings.webTools.webSearch.enable": "Увімкнути для всіх постачальників", + "settings.webTools.browserAutomation": "Автоматизація браузера", + "settings.webTools.webSearch.title": "Вебпошук", + "settings.webTools.webSearch.description": + "Зробіть вебпошук доступним для моделей усіх постачальників. Пошукові запити надсилаються безпосередньо до Exa або Parallel.", "settings.checkpoints.title": "Контрольні точки", "settings.display.title": "Відображення", "settings.autocomplete.title": "Автодоповнення", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts index 8432bbee90..9e1dd05729 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts @@ -1229,7 +1229,12 @@ export const dict = { "settings.section.configuration": "配置", "settings.agentBehaviour.title": "智能体行为", "settings.autoApprove.title": "自动审批", - "settings.browser.title": "浏览器", + "settings.webTools.title": "网络工具", + "settings.webTools.description": "配置网页搜索和浏览器自动化。搜索请求会直接连接到 Exa 或 Parallel。", + "settings.webTools.webSearch.enable": "为所有提供商启用", + "settings.webTools.browserAutomation": "浏览器自动化", + "settings.webTools.webSearch.title": "网页搜索", + "settings.webTools.webSearch.description": "让所有提供商的模型都可使用网页搜索。搜索会直接连接到 Exa 或 Parallel。", "settings.checkpoints.title": "检查点", "settings.display.title": "显示", "settings.autocomplete.title": "自动补全", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts index b69bb7054c..aed2a97179 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts @@ -1190,7 +1190,12 @@ export const dict = { "settings.section.configuration": "設定", "settings.agentBehaviour.title": "Agent 行為", "settings.autoApprove.title": "自動核准", - "settings.browser.title": "瀏覽器", + "settings.webTools.title": "網路工具", + "settings.webTools.description": "設定網頁搜尋和瀏覽器自動化。搜尋請求會直接連線至 Exa 或 Parallel。", + "settings.webTools.webSearch.enable": "為所有供應商啟用", + "settings.webTools.browserAutomation": "瀏覽器自動化", + "settings.webTools.webSearch.title": "網頁搜尋", + "settings.webTools.webSearch.description": "讓所有供應商的模型都可使用網頁搜尋。搜尋會直接連線至 Exa 或 Parallel。", "settings.checkpoints.title": "檢查點", "settings.display.title": "顯示", "settings.autocomplete.title": "自動完成", 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 0dc2d05dc7..89dcc0af83 100644 --- a/packages/kilo-vscode/webview-ui/src/types/messages/config.ts +++ b/packages/kilo-vscode/webview-ui/src/types/messages/config.ts @@ -39,7 +39,6 @@ export interface WatcherConfig { export interface ExperimentalConfig { batch_tool?: boolean - websearch?: boolean codebase_search?: boolean image_generation?: boolean image_generation_model?: string @@ -155,6 +154,7 @@ export interface Config { compaction?: CompactionConfig commit_message?: CommitMessageConfig tools?: Record + web_search?: boolean auto_collapse_reasoning?: boolean experimental?: ExperimentalConfig sandbox?: SandboxConfig diff --git a/packages/opencode/src/kilocode/config/overlay.ts b/packages/opencode/src/kilocode/config/overlay.ts index b0cd42f88c..ec806bf053 100644 --- a/packages/opencode/src/kilocode/config/overlay.ts +++ b/packages/opencode/src/kilocode/config/overlay.ts @@ -88,7 +88,7 @@ export namespace KilocodeConfigOverlay { ["disabled_providers"], ["watcher", "ignore"], ["instructions"], - ["experimental", "websearch"], + ["web_search"], ["indexing", "enabled"], ["indexing", "provider"], ["indexing", "model"], diff --git a/packages/opencode/src/tool/registry.ts b/packages/opencode/src/tool/registry.ts index f8eb66469a..4df567dd6b 100644 --- a/packages/opencode/src/tool/registry.ts +++ b/packages/opencode/src/tool/registry.ts @@ -377,7 +377,7 @@ export const layer: Layer.Layer< const filtered = (yield* all()).filter((tool) => { if (!KiloToolRegistry.available(tool, input.agent)) return false // kilocode_change if (tool.id === WebSearchTool.id) { - if (cfg.experimental?.websearch === true) return true // kilocode_change + if (cfg.web_search === true) return true // kilocode_change return webSearchEnabled(input.providerID, { exa: flags.enableExa, parallel: flags.enableParallel }) } diff --git a/packages/opencode/test/kilocode/config/config.test.ts b/packages/opencode/test/kilocode/config/config.test.ts index 50529c043f..51902e1514 100644 --- a/packages/opencode/test/kilocode/config/config.test.ts +++ b/packages/opencode/test/kilocode/config/config.test.ts @@ -151,13 +151,15 @@ describe("global config updates", () => { }) }) -describe("kilocode indexing config", () => { +describe("kilocode web search config", () => { test("accepts the websearch availability setting", () => { - const config = Schema.decodeUnknownSync(Config.Info)({ experimental: { websearch: true } }) + const config = Schema.decodeUnknownSync(Config.Info)({ web_search: true }) - expect(config.experimental?.websearch).toBe(true) + expect(config.web_search).toBe(true) }) +}) +describe("kilocode indexing config", () => { test("ignores retired semantic indexing flags in existing configs", async () => { await using tmp = await tmpdir({ git: true }) await writeConfig(tmp.path, { diff --git a/packages/opencode/test/kilocode/server/config-overlay.test.ts b/packages/opencode/test/kilocode/server/config-overlay.test.ts index e8a55f9ac7..a21deb1e5d 100644 --- a/packages/opencode/test/kilocode/server/config-overlay.test.ts +++ b/packages/opencode/test/kilocode/server/config-overlay.test.ts @@ -204,17 +204,17 @@ describe("config overlay routes", () => { test.serial("resolves and reverts project websearch overrides", async () => { await using global = await tmpdir() await using project = await tmpdir() - await setGlobal(global.path, { experimental: { websearch: true } }) + await setGlobal(global.path, { web_search: true }) await json( await req(project.path, "/config/overlay", { method: "PATCH", headers: { "content-type": "application/json" }, - body: JSON.stringify({ scope: "project", set: { experimental: { websearch: false } } }), + body: JSON.stringify({ scope: "project", set: { web_search: false } }), }), ) const overridden = await json(await req(project.path, "/config/overlay?scope=project")) - expect(overridden.fields["experimental.websearch"]).toMatchObject({ + expect(overridden.fields.web_search).toMatchObject({ source: "project", inherited: false, overridden: true, @@ -225,11 +225,11 @@ describe("config overlay routes", () => { await req(project.path, "/config/overlay", { method: "PATCH", headers: { "content-type": "application/json" }, - body: JSON.stringify({ scope: "project", unset: [["experimental", "websearch"]] }), + body: JSON.stringify({ scope: "project", unset: [["web_search"]] }), }), ) const inherited = await json(await req(project.path, "/config/overlay?scope=project")) - expect(inherited.fields["experimental.websearch"]).toMatchObject({ + expect(inherited.fields.web_search).toMatchObject({ source: "global", inherited: true, overridden: false, diff --git a/packages/opencode/test/tool/registry.test.ts b/packages/opencode/test/tool/registry.test.ts index 393bea6f25..97e4e6c51c 100644 --- a/packages/opencode/test/tool/registry.test.ts +++ b/packages/opencode/test/tool/registry.test.ts @@ -52,12 +52,13 @@ const configLayer = TestConfig.layer({ type RegistryLayerOptions = { flags?: Partial plugin?: Layer.Layer + config?: Parameters[0] // kilocode_change } const registryLayer = (opts: RegistryLayerOptions = {}) => ToolRegistry.layer .pipe( - Layer.provide(configLayer), + Layer.provide(opts.config ? TestConfig.layer(opts.config) : configLayer), // kilocode_change Layer.provide(opts.plugin ?? Plugin.defaultLayer), Layer.provide(Question.defaultLayer), Layer.provide(Todo.defaultLayer), @@ -118,6 +119,21 @@ const withBrokenPlugin = testEffect( Layer.mergeAll(registryLayer({ plugin: brokenPluginLayer }), node, Agent.defaultLayer), ) // kilocode_change start +const websearch = testEffect( + Layer.mergeAll( + registryLayer({ + config: { + get: () => + Effect.succeed({ + web_search: true, + provider: { openai: { options: { apiKey: "test-openai-key" } } }, + }), + }, + }), + node, + Agent.defaultLayer, + ), +) const sandboxed = testEffect( Layer.mergeAll(registryLayer({ flags: { experimentalLspTool: true } }), node, Agent.defaultLayer), ) @@ -139,6 +155,38 @@ function sandboxProfile(): Profile { describe("tool.registry", () => { // kilocode_change start + it.instance("hides websearch for a third-party provider by default", () => + Effect.gen(function* () { + const registry = yield* ToolRegistry.Service + const agent = yield* Agent.Service + const build = yield* agent.get("build") + if (!build) return yield* Effect.die(new Error("build agent not found")) + const tools = yield* registry.tools({ + providerID: ProviderV2.ID.openai, + modelID: ModelV2.ID.make("test"), + agent: build, + }) + + expect(tools.map((tool) => tool.id)).not.toContain("websearch") + }), + ) + + websearch.instance("shows websearch for a configured third-party provider when enabled", () => + Effect.gen(function* () { + const registry = yield* ToolRegistry.Service + const agent = yield* Agent.Service + const build = yield* agent.get("build") + if (!build) return yield* Effect.die(new Error("build agent not found")) + const tools = yield* registry.tools({ + providerID: ProviderV2.ID.openai, + modelID: ModelV2.ID.make("test"), + agent: build, + }) + + expect(tools.map((tool) => tool.id)).toContain("websearch") + }), + ) + sandboxed.instance("preserves built-in network classification through production tool definition processing", () => Effect.gen(function* () { const registry = yield* ToolRegistry.Service diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index 0bd15820a7..5f9963def0 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -1673,6 +1673,7 @@ export type Config = { tools?: { [key: string]: boolean } + web_search?: boolean attachment?: AttachmentConfig enterprise?: { url?: string @@ -1699,7 +1700,6 @@ export type Config = { disable_paste_summary?: boolean batch_tool?: boolean codebase_search?: boolean - websearch?: boolean image_generation?: boolean image_generation_model?: string agent_requirements?: boolean diff --git a/packages/sdk/openapi.json b/packages/sdk/openapi.json index 7ea6d2387d..1451c3a6b3 100644 --- a/packages/sdk/openapi.json +++ b/packages/sdk/openapi.json @@ -26905,6 +26905,9 @@ "type": "boolean" } }, + "web_search": { + "type": "boolean" + }, "attachment": { "$ref": "#/components/schemas/AttachmentConfig" }, @@ -27000,9 +27003,6 @@ "codebase_search": { "type": "boolean" }, - "websearch": { - "type": "boolean" - }, "image_generation": { "type": "boolean" }, From 25dcfb6cff23abe840f3a728ebe48deef6af9355 Mon Sep 17 00:00:00 2001 From: Kelly Sun Date: Thu, 23 Jul 2026 14:28:32 -0400 Subject: [PATCH 03/29] docs: add Mixlayer provider page Adds an AI-providers docs page for Mixlayer (OpenAI-compatible inference for open models like GLM and Qwen) and a nav entry, documenting the OpenAI-Compatible setup for both VS Code and the CLI. --- packages/kilo-docs/lib/nav/ai-providers.ts | 1 + .../kilo-docs/pages/ai-providers/mixlayer.md | 97 +++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 packages/kilo-docs/pages/ai-providers/mixlayer.md diff --git a/packages/kilo-docs/lib/nav/ai-providers.ts b/packages/kilo-docs/lib/nav/ai-providers.ts index f604826c7c..1a2dfe9ae3 100644 --- a/packages/kilo-docs/lib/nav/ai-providers.ts +++ b/packages/kilo-docs/lib/nav/ai-providers.ts @@ -46,6 +46,7 @@ export const AiProvidersNav: NavSection[] = [ { href: "/ai-providers/groq", children: "Groq" }, { href: "/ai-providers/cerebras", children: "Cerebras" }, { href: "/ai-providers/fireworks", children: "Fireworks AI" }, + { href: "/ai-providers/mixlayer", children: "Mixlayer" }, ], }, { diff --git a/packages/kilo-docs/pages/ai-providers/mixlayer.md b/packages/kilo-docs/pages/ai-providers/mixlayer.md new file mode 100644 index 0000000000..ac0221315a --- /dev/null +++ b/packages/kilo-docs/pages/ai-providers/mixlayer.md @@ -0,0 +1,97 @@ +--- +title: "Using Mixlayer with Kilo Code | Fast Open-Model Inference" +description: "Run open models like GLM and Qwen on Mixlayer's OpenAI-compatible API in Kilo Code. Setup guide for VS Code and the CLI." +--- + +# Using Mixlayer With Kilo Code + +Mixlayer is an inference platform for open models such as GLM and Qwen, with a serving stack built from scratch by core contributors to Candle. It exposes an OpenAI-compatible API, so you can use it in Kilo Code through the **OpenAI Compatible** provider. + +**Website:** [https://mixlayer.com/](https://mixlayer.com/) + +## Getting an API Key + +1. **Sign Up/Sign In:** Go to [Mixlayer](https://mixlayer.com/) and create an account or sign in. +2. **Navigate to API Keys:** Open the [Mixlayer console](https://console.mixlayer.com/) and go to the API Keys page. +3. **Create a Key:** Click **New Key**, give it a descriptive name (e.g., "Kilo Code"), and copy it. You will not be able to view it again. + +## Configuration in Kilo Code + +Mixlayer's API is OpenAI-compatible, with the base URL `https://models.mixlayer.ai/v1`. Configure it through Kilo Code's **OpenAI Compatible** provider. + +{% tabs %} +{% tab label="VSCode" %} + +1. Open **Settings** (gear icon) and go to the **Providers** tab. +2. Scroll to the bottom and click **Custom provider**. +3. Fill in the dialog: + - **Provider ID** — `mixlayer` + - **Display name** — `Mixlayer` + - **Provider API** — **OpenAI Compatible** + - **Base URL** — `https://models.mixlayer.ai/v1` + - **API key** — your Mixlayer API key +4. Kilo Code auto-fetches the available models from Mixlayer's `/v1/models` endpoint, so you can pick a model directly from the list. Click **Submit** to save. + +{% /tab %} +{% tab label="CLI" %} + +Set the API key as an environment variable and define an OpenAI-compatible provider in your `kilo.json` config file (`~/.config/kilo/kilo.json` or `./kilo.json`): + +**Environment variable:** + +```bash +export MIXLAYER_API_KEY="your-api-key" +``` + +**Config file:** + +```jsonc +{ + "provider": { + "mixlayer": { + "npm": "@ai-sdk/openai-compatible", + "env": ["MIXLAYER_API_KEY"], + "options": { + "baseURL": "https://models.mixlayer.ai/v1", + }, + "models": { + "z-ai/glm-5.2": { + "name": "GLM-5.2", + "limit": { "context": 262144, "output": 262144 }, + }, + "qwen/qwen3.5-397b-a17b": { + "name": "Qwen3.5 397B A17B", + "limit": { "context": 131072, "output": 131072 }, + }, + }, + }, + }, +} +``` + +Then set your default model using the `provider-id/model-id` format: + +```jsonc +{ + "model": "mixlayer/z-ai/glm-5.2", +} +``` + +{% /tab %} +{% /tabs %} + +## Models + +Mixlayer serves open models including: + +- `z-ai/glm-5.2` — 256K context +- `qwen/qwen3.5-397b-a17b` and the Qwen 3.5 / 3.6 line (vision-capable) +- `moonshotai/kimi-k2.7-code` + +Tool calling and reasoning are supported across the model line. See the [Mixlayer docs](https://docs.mixlayer.com) for the full, current model list and supported parameters. + +## Tips and Notes + +- **Model list:** Kilo Code auto-detects available models from Mixlayer's `/v1/models` endpoint, so the picker stays current with your account. +- **Pricing:** See the [Mixlayer console](https://console.mixlayer.com/) for current per-model pricing. +- **Reasoning:** Qwen models support a thinking mode; reasoning tokens count against the output budget, so allow enough `limit.output` when reasoning is enabled. From 34e787e5ac039b0d070ed186ee5979aba38c8576 Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Mon, 27 Jul 2026 11:48:09 -0400 Subject: [PATCH 04/29] fix: enable web search by default --- packages/core/src/v1/config/config.ts | 3 +- .../src/routes/config/ToolsRoute.tsx | 2 +- .../src/components/settings/BrowserTab.tsx | 2 +- packages/opencode/src/tool/registry.ts | 2 +- .../test/kilocode/config/config.test.ts | 6 +-- packages/opencode/test/tool/registry.test.ts | 50 ++++++++++++------- 6 files changed, 40 insertions(+), 25 deletions(-) diff --git a/packages/core/src/v1/config/config.ts b/packages/core/src/v1/config/config.ts index bd9baab123..0ef9d1ffc7 100644 --- a/packages/core/src/v1/config/config.ts +++ b/packages/core/src/v1/config/config.ts @@ -227,7 +227,8 @@ export const Info = Schema.Struct({ permission: Schema.optional(ConfigPermissionV1.Info), tools: Schema.optional(Schema.Record(Schema.String, Schema.Boolean)), web_search: Schema.optional(Schema.Boolean).annotate({ - description: "Make web search available to models from all providers", + description: + "Make web search available to models from all providers (default: true). Set to false to limit it to managed providers.", }), // kilocode_change attachment: Schema.optional(ConfigAttachmentV1.Info).annotate({ description: "Attachment processing configuration, including image size limits and resizing behavior", diff --git a/packages/kilo-console/src/routes/config/ToolsRoute.tsx b/packages/kilo-console/src/routes/config/ToolsRoute.tsx index 9dcb20b6e0..fae54f6b8c 100644 --- a/packages/kilo-console/src/routes/config/ToolsRoute.tsx +++ b/packages/kilo-console/src/routes/config/ToolsRoute.tsx @@ -12,7 +12,7 @@ export function ToolsRoute() { const [search, setSearch] = createSignal("") const snap = () => ctx.data() const websearch = createMemo(() => snap()?.overlay.fields.web_search) - const searchEnabled = createMemo(() => websearch()?.value === true) + const searchEnabled = createMemo(() => websearch()?.value !== false) const rows = createMemo(() => { const data = snap() if (!data) return [] 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 fabc7858b8..ca870fef21 100644 --- a/packages/kilo-vscode/webview-ui/src/components/settings/BrowserTab.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/settings/BrowserTab.tsx @@ -86,7 +86,7 @@ const BrowserTab: Component = () => { description={t("settings.webTools.webSearch.description")} last > - + {t("settings.webTools.webSearch.title")} diff --git a/packages/opencode/src/tool/registry.ts b/packages/opencode/src/tool/registry.ts index 4df567dd6b..4f7c275cfa 100644 --- a/packages/opencode/src/tool/registry.ts +++ b/packages/opencode/src/tool/registry.ts @@ -377,7 +377,7 @@ export const layer: Layer.Layer< const filtered = (yield* all()).filter((tool) => { if (!KiloToolRegistry.available(tool, input.agent)) return false // kilocode_change if (tool.id === WebSearchTool.id) { - if (cfg.web_search === true) return true // kilocode_change + if (cfg.web_search !== false) return true // kilocode_change return webSearchEnabled(input.providerID, { exa: flags.enableExa, parallel: flags.enableParallel }) } diff --git a/packages/opencode/test/kilocode/config/config.test.ts b/packages/opencode/test/kilocode/config/config.test.ts index 51902e1514..3938950306 100644 --- a/packages/opencode/test/kilocode/config/config.test.ts +++ b/packages/opencode/test/kilocode/config/config.test.ts @@ -152,10 +152,10 @@ describe("global config updates", () => { }) describe("kilocode web search config", () => { - test("accepts the websearch availability setting", () => { - const config = Schema.decodeUnknownSync(Config.Info)({ web_search: true }) + test("accepts explicitly limiting web search to managed providers", () => { + const config = Schema.decodeUnknownSync(Config.Info)({ web_search: false }) - expect(config.web_search).toBe(true) + expect(config.web_search).toBe(false) }) }) diff --git a/packages/opencode/test/tool/registry.test.ts b/packages/opencode/test/tool/registry.test.ts index 97e4e6c51c..2420506b9d 100644 --- a/packages/opencode/test/tool/registry.test.ts +++ b/packages/opencode/test/tool/registry.test.ts @@ -125,7 +125,21 @@ const websearch = testEffect( config: { get: () => Effect.succeed({ - web_search: true, + provider: { openai: { options: { apiKey: "test-openai-key" } } }, + }), + }, + }), + node, + Agent.defaultLayer, + ), +) +const websearchOff = testEffect( + Layer.mergeAll( + registryLayer({ + config: { + get: () => + Effect.succeed({ + web_search: false, provider: { openai: { options: { apiKey: "test-openai-key" } } }, }), }, @@ -155,23 +169,7 @@ function sandboxProfile(): Profile { describe("tool.registry", () => { // kilocode_change start - it.instance("hides websearch for a third-party provider by default", () => - Effect.gen(function* () { - const registry = yield* ToolRegistry.Service - const agent = yield* Agent.Service - const build = yield* agent.get("build") - if (!build) return yield* Effect.die(new Error("build agent not found")) - const tools = yield* registry.tools({ - providerID: ProviderV2.ID.openai, - modelID: ModelV2.ID.make("test"), - agent: build, - }) - - expect(tools.map((tool) => tool.id)).not.toContain("websearch") - }), - ) - - websearch.instance("shows websearch for a configured third-party provider when enabled", () => + websearch.instance("shows websearch by default for a configured third-party provider", () => Effect.gen(function* () { const registry = yield* ToolRegistry.Service const agent = yield* Agent.Service @@ -187,6 +185,22 @@ describe("tool.registry", () => { }), ) + websearchOff.instance("hides websearch for a configured third-party provider when disabled", () => + Effect.gen(function* () { + const registry = yield* ToolRegistry.Service + const agent = yield* Agent.Service + const build = yield* agent.get("build") + if (!build) return yield* Effect.die(new Error("build agent not found")) + const tools = yield* registry.tools({ + providerID: ProviderV2.ID.openai, + modelID: ModelV2.ID.make("test"), + agent: build, + }) + + expect(tools.map((tool) => tool.id)).not.toContain("websearch") + }), + ) + sandboxed.instance("preserves built-in network classification through production tool definition processing", () => Effect.gen(function* () { const registry = yield* ToolRegistry.Service From c5d3032118aa87cdecb3ae40f1117344762efd2b Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Mon, 27 Jul 2026 14:47:11 -0400 Subject: [PATCH 05/29] fix: keep third-party web search opt-in --- .changeset/enable-websearch-config.md | 2 +- packages/core/src/v1/config/config.ts | 3 +- .../src/routes/config/ToolsRoute.tsx | 2 +- .../src/components/settings/BrowserTab.tsx | 2 +- packages/opencode/src/tool/registry.ts | 2 +- .../test/kilocode/config/config.test.ts | 6 +-- packages/opencode/test/tool/registry.test.ts | 50 +++++++------------ 7 files changed, 26 insertions(+), 41 deletions(-) diff --git a/.changeset/enable-websearch-config.md b/.changeset/enable-websearch-config.md index ebbc4135f3..cd47a9e9fb 100644 --- a/.changeset/enable-websearch-config.md +++ b/.changeset/enable-websearch-config.md @@ -3,4 +3,4 @@ "kilo-code": patch --- -Configure web search for models from all providers through Kilo configuration, VS Code settings, and Kilo Console settings. +Allow users to enable web search for models from all providers through Kilo configuration, VS Code settings, and Kilo Console settings. diff --git a/packages/core/src/v1/config/config.ts b/packages/core/src/v1/config/config.ts index 0ef9d1ffc7..fea9a7f598 100644 --- a/packages/core/src/v1/config/config.ts +++ b/packages/core/src/v1/config/config.ts @@ -227,8 +227,7 @@ export const Info = Schema.Struct({ permission: Schema.optional(ConfigPermissionV1.Info), tools: Schema.optional(Schema.Record(Schema.String, Schema.Boolean)), web_search: Schema.optional(Schema.Boolean).annotate({ - description: - "Make web search available to models from all providers (default: true). Set to false to limit it to managed providers.", + description: "Make web search available to models from all providers (default: false)", }), // kilocode_change attachment: Schema.optional(ConfigAttachmentV1.Info).annotate({ description: "Attachment processing configuration, including image size limits and resizing behavior", diff --git a/packages/kilo-console/src/routes/config/ToolsRoute.tsx b/packages/kilo-console/src/routes/config/ToolsRoute.tsx index fae54f6b8c..9dcb20b6e0 100644 --- a/packages/kilo-console/src/routes/config/ToolsRoute.tsx +++ b/packages/kilo-console/src/routes/config/ToolsRoute.tsx @@ -12,7 +12,7 @@ export function ToolsRoute() { const [search, setSearch] = createSignal("") const snap = () => ctx.data() const websearch = createMemo(() => snap()?.overlay.fields.web_search) - const searchEnabled = createMemo(() => websearch()?.value !== false) + const searchEnabled = createMemo(() => websearch()?.value === true) const rows = createMemo(() => { const data = snap() if (!data) return [] 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 ca870fef21..fabc7858b8 100644 --- a/packages/kilo-vscode/webview-ui/src/components/settings/BrowserTab.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/settings/BrowserTab.tsx @@ -86,7 +86,7 @@ const BrowserTab: Component = () => { description={t("settings.webTools.webSearch.description")} last > - + {t("settings.webTools.webSearch.title")} diff --git a/packages/opencode/src/tool/registry.ts b/packages/opencode/src/tool/registry.ts index 4f7c275cfa..4df567dd6b 100644 --- a/packages/opencode/src/tool/registry.ts +++ b/packages/opencode/src/tool/registry.ts @@ -377,7 +377,7 @@ export const layer: Layer.Layer< const filtered = (yield* all()).filter((tool) => { if (!KiloToolRegistry.available(tool, input.agent)) return false // kilocode_change if (tool.id === WebSearchTool.id) { - if (cfg.web_search !== false) return true // kilocode_change + if (cfg.web_search === true) return true // kilocode_change return webSearchEnabled(input.providerID, { exa: flags.enableExa, parallel: flags.enableParallel }) } diff --git a/packages/opencode/test/kilocode/config/config.test.ts b/packages/opencode/test/kilocode/config/config.test.ts index 3938950306..c384d76dff 100644 --- a/packages/opencode/test/kilocode/config/config.test.ts +++ b/packages/opencode/test/kilocode/config/config.test.ts @@ -152,10 +152,10 @@ describe("global config updates", () => { }) describe("kilocode web search config", () => { - test("accepts explicitly limiting web search to managed providers", () => { - const config = Schema.decodeUnknownSync(Config.Info)({ web_search: false }) + test("accepts enabling web search for all providers", () => { + const config = Schema.decodeUnknownSync(Config.Info)({ web_search: true }) - expect(config.web_search).toBe(false) + expect(config.web_search).toBe(true) }) }) diff --git a/packages/opencode/test/tool/registry.test.ts b/packages/opencode/test/tool/registry.test.ts index 2420506b9d..97e4e6c51c 100644 --- a/packages/opencode/test/tool/registry.test.ts +++ b/packages/opencode/test/tool/registry.test.ts @@ -125,21 +125,7 @@ const websearch = testEffect( config: { get: () => Effect.succeed({ - provider: { openai: { options: { apiKey: "test-openai-key" } } }, - }), - }, - }), - node, - Agent.defaultLayer, - ), -) -const websearchOff = testEffect( - Layer.mergeAll( - registryLayer({ - config: { - get: () => - Effect.succeed({ - web_search: false, + web_search: true, provider: { openai: { options: { apiKey: "test-openai-key" } } }, }), }, @@ -169,23 +155,7 @@ function sandboxProfile(): Profile { describe("tool.registry", () => { // kilocode_change start - websearch.instance("shows websearch by default for a configured third-party provider", () => - Effect.gen(function* () { - const registry = yield* ToolRegistry.Service - const agent = yield* Agent.Service - const build = yield* agent.get("build") - if (!build) return yield* Effect.die(new Error("build agent not found")) - const tools = yield* registry.tools({ - providerID: ProviderV2.ID.openai, - modelID: ModelV2.ID.make("test"), - agent: build, - }) - - expect(tools.map((tool) => tool.id)).toContain("websearch") - }), - ) - - websearchOff.instance("hides websearch for a configured third-party provider when disabled", () => + it.instance("hides websearch for a third-party provider by default", () => Effect.gen(function* () { const registry = yield* ToolRegistry.Service const agent = yield* Agent.Service @@ -201,6 +171,22 @@ describe("tool.registry", () => { }), ) + websearch.instance("shows websearch for a configured third-party provider when enabled", () => + Effect.gen(function* () { + const registry = yield* ToolRegistry.Service + const agent = yield* Agent.Service + const build = yield* agent.get("build") + if (!build) return yield* Effect.die(new Error("build agent not found")) + const tools = yield* registry.tools({ + providerID: ProviderV2.ID.openai, + modelID: ModelV2.ID.make("test"), + agent: build, + }) + + expect(tools.map((tool) => tool.id)).toContain("websearch") + }), + ) + sandboxed.instance("preserves built-in network classification through production tool definition processing", () => Effect.gen(function* () { const registry = yield* ToolRegistry.Service From 605dc483e84fbbc3ff5e213e057f3791a14e9299 Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Mon, 27 Jul 2026 17:30:02 -0400 Subject: [PATCH 06/29] chore(sdk): minimize web search schema diff --- packages/sdk/openapi.json | 5637 +++++++++++++++++++++++++++---------- 1 file changed, 4111 insertions(+), 1526 deletions(-) diff --git a/packages/sdk/openapi.json b/packages/sdk/openapi.json index 1451c3a6b3..7bd369f6bb 100644 --- a/packages/sdk/openapi.json +++ b/packages/sdk/openapi.json @@ -4211,10 +4211,10 @@ ] } }, - "/experimental/project/{projectID}/copy": { + "/experimental/project/{projectID}/copy/generate-name": { "post": { "tags": ["projectCopy"], - "operationId": "experimental.projectCopy.create", + "operationId": "experimental.projectCopy.generateName", "parameters": [ { "name": "projectID", @@ -4224,6 +4224,14 @@ }, "required": true }, + { + "name": "directory", + "in": "query", + "schema": { + "type": "string" + }, + "required": false + }, { "name": "workspace", "in": "query", @@ -4235,56 +4243,45 @@ ], "responses": { "200": { - "description": "Project copy created", + "description": "Success", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ProjectCopyCopy" + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "required": ["name"], + "additionalProperties": false } } } }, "400": { - "description": "ProjectCopyError | InvalidRequestError", + "description": "Bad request", "content": { "application/json": { "schema": { - "anyOf": [ - { - "$ref": "#/components/schemas/ProjectCopyError" - }, - { - "$ref": "#/components/schemas/InvalidRequestError" - } - ] + "$ref": "#/components/schemas/BadRequestError" } } } } }, - "description": "Create a local physical copy of a project using the selected strategy.", - "summary": "Create project copy", + "description": "Generate a short name for a project copy from task context.", + "summary": "Generate project copy name", "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { - "strategy": { - "type": "string", - "enum": ["git_worktree"] - }, - "directory": { - "type": "string" - }, - "name": { - "type": "string" - }, "context": { "type": "string" } }, - "required": ["strategy", "directory"], "additionalProperties": false } } @@ -4293,145 +4290,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.experimental.projectCopy.create({\n ...\n})" - } - ] - }, - "delete": { - "tags": ["projectCopy"], - "operationId": "experimental.projectCopy.remove", - "parameters": [ - { - "name": "projectID", - "in": "path", - "schema": { - "type": "string" - }, - "required": true - }, - { - "name": "directory", - "in": "query", - "schema": { - "type": "string" - }, - "required": false - }, - { - "name": "workspace", - "in": "query", - "schema": { - "type": "string" - }, - "required": false - } - ], - "responses": { - "204": { - "description": "Project copy removed" - }, - "400": { - "description": "ProjectCopyError | InvalidRequestError", - "content": { - "application/json": { - "schema": { - "anyOf": [ - { - "$ref": "#/components/schemas/ProjectCopyError" - }, - { - "$ref": "#/components/schemas/InvalidRequestError" - } - ] - } - } - } - } - }, - "description": "Remove a local physical copy of a project using the selected strategy.", - "summary": "Remove project copy", - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "directory": { - "type": "string" - } - }, - "required": ["directory"], - "additionalProperties": false - } - } - } - }, - "x-codeSamples": [ - { - "lang": "js", - "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.experimental.projectCopy.remove({\n ...\n})" - } - ] - } - }, - "/experimental/project/{projectID}/copy/refresh": { - "post": { - "tags": ["projectCopy"], - "operationId": "experimental.projectCopy.refresh", - "parameters": [ - { - "name": "projectID", - "in": "path", - "schema": { - "type": "string" - }, - "required": true - }, - { - "name": "directory", - "in": "query", - "schema": { - "type": "string" - }, - "required": false - }, - { - "name": "workspace", - "in": "query", - "schema": { - "type": "string" - }, - "required": false - } - ], - "responses": { - "204": { - "description": "Project copies refreshed" - }, - "400": { - "description": "ProjectCopyError | InvalidRequestError", - "content": { - "application/json": { - "schema": { - "anyOf": [ - { - "$ref": "#/components/schemas/ProjectCopyError" - }, - { - "$ref": "#/components/schemas/InvalidRequestError" - } - ] - } - } - } - } - }, - "description": "Discover local project copies using one or all configured strategies.", - "summary": "Refresh project copies", - "x-codeSamples": [ - { - "lang": "js", - "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.experimental.projectCopy.refresh({\n ...\n})" + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.experimental.projectCopy.generateName({\n ...\n})" } ] } @@ -14735,6 +14594,16 @@ } } } + }, + "500": { + "description": "CloudSessionImportError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CloudSessionImportError" + } + } + } } }, "description": "Download a cloud-synced session and write it to local storage with fresh IDs.", @@ -16890,6 +16759,10 @@ }, "diff": { "type": "string" + }, + "workspace": { + "type": "string", + "enum": ["restored", "snapshots-disabled", "unavailable"] } }, "required": ["messageID"], @@ -19898,7 +19771,7 @@ }, "/api/health": { "get": { - "tags": ["kilo experimental HttpApi"], + "tags": ["Kilo HttpApi"], "operationId": "v2.health.get", "parameters": [], "security": [], @@ -19942,8 +19815,8 @@ } } }, - "description": "Check whether the v2 API server is ready to accept requests.", - "summary": "Check v2 server health", + "description": "Check whether the API server is ready to accept requests.", + "summary": "Check server health", "x-codeSamples": [ { "lang": "js", @@ -19952,9 +19825,77 @@ ] } }, + "/api/location": { + "get": { + "tags": ["Kilo HttpApi"], + "operationId": "v2.location.get", + "parameters": [ + { + "name": "location", + "in": "query", + "schema": { + "type": "object", + "properties": { + "directory": { + "type": "string" + }, + "workspace": { + "type": "string" + } + }, + "additionalProperties": false + }, + "required": false, + "style": "deepObject", + "explode": true + } + ], + "security": [], + "responses": { + "200": { + "description": "Location.Info", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/LocationInfo" + } + } + } + }, + "400": { + "description": "InvalidRequestError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvalidRequestError" + } + } + } + }, + "401": { + "description": "UnauthorizedError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnauthorizedError" + } + } + } + } + }, + "description": "Resolve the requested location or the server default location.", + "summary": "Get location", + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.location.get({\n ...\n})" + } + ] + } + }, "/api/agent": { "get": { - "tags": ["kilo experimental HttpApi"], + "tags": ["Kilo HttpApi"], "operationId": "v2.agent.list", "parameters": [ { @@ -20023,8 +19964,8 @@ } } }, - "description": "Retrieve currently registered v2 agents.", - "summary": "List v2 agents", + "description": "Retrieve currently registered agents.", + "summary": "List agents", "x-codeSamples": [ { "lang": "js", @@ -20035,7 +19976,7 @@ }, "/api/session": { "get": { - "tags": ["v2"], + "tags": ["sessions"], "operationId": "v2.session.list", "parameters": [ { @@ -20109,11 +20050,11 @@ "security": [], "responses": { "200": { - "description": "V2SessionsResponse", + "description": "SessionsResponse", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/V2SessionsResponse" + "$ref": "#/components/schemas/SessionsResponse" } } } @@ -20150,18 +20091,192 @@ } }, "description": "Retrieve sessions in the requested order. Items keep that order across pages; use cursor.next or cursor.previous to move through the ordered list.", - "summary": "List v2 sessions", + "summary": "List sessions", "x-codeSamples": [ { "lang": "js", "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.session.list({\n ...\n})" } ] + }, + "post": { + "tags": ["sessions"], + "operationId": "v2.session.create", + "parameters": [], + "security": [], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/SessionV2Info" + } + }, + "required": ["data"], + "additionalProperties": false + } + } + } + }, + "400": { + "description": "InvalidRequestError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvalidRequestError" + } + } + } + }, + "401": { + "description": "UnauthorizedError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnauthorizedError" + } + } + } + } + }, + "description": "Create a session at the requested location.", + "summary": "Create session", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "id": { + "type": "string", + "pattern": "^ses" + }, + "agent": { + "type": "string" + }, + "model": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "providerID": { + "type": "string" + }, + "variant": { + "type": "string" + } + }, + "required": ["id", "providerID"], + "additionalProperties": false + }, + "location": { + "$ref": "#/components/schemas/LocationRef" + } + }, + "additionalProperties": false + } + } + }, + "required": true + }, + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.session.create({\n ...\n})" + } + ] + } + }, + "/api/session/{sessionID}": { + "get": { + "tags": ["sessions"], + "operationId": "v2.session.get", + "parameters": [ + { + "name": "sessionID", + "in": "path", + "schema": { + "type": "string", + "pattern": "^ses.*" + }, + "required": true + } + ], + "security": [], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/SessionV2Info" + } + }, + "required": ["data"], + "additionalProperties": false + } + } + } + }, + "400": { + "description": "InvalidRequestError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvalidRequestError" + } + } + } + }, + "401": { + "description": "UnauthorizedError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnauthorizedError" + } + } + } + }, + "404": { + "description": "SessionNotFoundError", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/SessionNotFoundError" + }, + { + "$ref": "#/components/schemas/SessionNotFoundError" + } + ] + } + } + } + } + }, + "description": "Retrieve a session by ID.", + "summary": "Get session", + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.session.get({\n ...\n})" + } + ] } }, "/api/session/{sessionID}/prompt": { "post": { - "tags": ["v2"], + "tags": ["sessions"], "operationId": "v2.session.prompt", "parameters": [ { @@ -20218,7 +20333,14 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SessionNotFoundError" + "anyOf": [ + { + "$ref": "#/components/schemas/SessionNotFoundError" + }, + { + "$ref": "#/components/schemas/SessionNotFoundError" + } + ] } } } @@ -20234,8 +20356,8 @@ } } }, - "description": "Durably admit one v2 session input and schedule agent-loop execution unless resume is false.", - "summary": "Send v2 message", + "description": "Durably admit one session input and schedule agent-loop execution unless resume is false.", + "summary": "Send message", "requestBody": { "content": { "application/json": { @@ -20274,7 +20396,7 @@ }, "/api/session/{sessionID}/compact": { "post": { - "tags": ["v2"], + "tags": ["sessions"], "operationId": "v2.session.compact", "parameters": [ { @@ -20317,7 +20439,14 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SessionNotFoundError" + "anyOf": [ + { + "$ref": "#/components/schemas/SessionNotFoundError" + }, + { + "$ref": "#/components/schemas/SessionNotFoundError" + } + ] } } } @@ -20333,8 +20462,8 @@ } } }, - "description": "Compact a v2 session conversation.", - "summary": "Compact v2 session", + "description": "Compact a session conversation.", + "summary": "Compact session", "x-codeSamples": [ { "lang": "js", @@ -20345,7 +20474,7 @@ }, "/api/session/{sessionID}/wait": { "post": { - "tags": ["v2"], + "tags": ["sessions"], "operationId": "v2.session.wait", "parameters": [ { @@ -20388,7 +20517,14 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SessionNotFoundError" + "anyOf": [ + { + "$ref": "#/components/schemas/SessionNotFoundError" + }, + { + "$ref": "#/components/schemas/SessionNotFoundError" + } + ] } } } @@ -20404,8 +20540,8 @@ } } }, - "description": "Wait for a v2 session agent loop to become idle.", - "summary": "Wait for v2 session", + "description": "Wait for a session agent loop to become idle.", + "summary": "Wait for session", "x-codeSamples": [ { "lang": "js", @@ -20416,7 +20552,7 @@ }, "/api/session/{sessionID}/context": { "get": { - "tags": ["v2"], + "tags": ["sessions"], "operationId": "v2.session.context", "parameters": [ { @@ -20476,7 +20612,14 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SessionNotFoundError" + "anyOf": [ + { + "$ref": "#/components/schemas/SessionNotFoundError" + }, + { + "$ref": "#/components/schemas/SessionNotFoundError" + } + ] } } } @@ -20492,8 +20635,8 @@ } } }, - "description": "Retrieve the active context messages for a v2 session (all messages after the last compaction).", - "summary": "Get v2 session context", + "description": "Retrieve the active context messages for a session (all messages after the last compaction).", + "summary": "Get session context", "x-codeSamples": [ { "lang": "js", @@ -20504,7 +20647,7 @@ }, "/api/session/{sessionID}/message": { "get": { - "tags": ["v2 messages"], + "tags": ["messages"], "operationId": "v2.session.messages", "parameters": [ { @@ -20546,11 +20689,11 @@ "security": [], "responses": { "200": { - "description": "V2SessionMessagesResponse", + "description": "SessionMessagesResponse", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/V2SessionMessagesResponse" + "$ref": "#/components/schemas/SessionMessagesResponse" } } } @@ -20587,7 +20730,14 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/SessionNotFoundError" + "anyOf": [ + { + "$ref": "#/components/schemas/SessionNotFoundError" + }, + { + "$ref": "#/components/schemas/SessionNotFoundError" + } + ] } } } @@ -20603,8 +20753,8 @@ } } }, - "description": "Retrieve projected v2 messages for a session. Items keep the requested order across pages; use cursor.next or cursor.previous to move through the ordered timeline.", - "summary": "Get v2 session messages", + "description": "Retrieve projected messages for a session. Items keep the requested order across pages; use cursor.next or cursor.previous to move through the ordered timeline.", + "summary": "Get session messages", "x-codeSamples": [ { "lang": "js", @@ -20615,7 +20765,7 @@ }, "/api/model": { "get": { - "tags": ["v2 models"], + "tags": ["models"], "operationId": "v2.model.list", "parameters": [ { @@ -20694,8 +20844,8 @@ } } }, - "description": "Retrieve available v2 models ordered by release date.", - "summary": "List v2 models", + "description": "Retrieve available models ordered by release date.", + "summary": "List models", "x-codeSamples": [ { "lang": "js", @@ -20706,7 +20856,7 @@ }, "/api/provider": { "get": { - "tags": ["v2 providers"], + "tags": ["providers"], "operationId": "v2.provider.list", "parameters": [ { @@ -20785,8 +20935,8 @@ } } }, - "description": "Retrieve active v2 AI providers so clients can show provider availability and configuration.", - "summary": "List v2 providers", + "description": "Retrieve active AI providers so clients can show provider availability and configuration.", + "summary": "List providers", "x-codeSamples": [ { "lang": "js", @@ -20797,7 +20947,7 @@ }, "/api/provider/{providerID}": { "get": { - "tags": ["v2 providers"], + "tags": ["providers"], "operationId": "v2.provider.get", "parameters": [ { @@ -20891,8 +21041,8 @@ } } }, - "description": "Retrieve a single v2 AI provider so clients can inspect its availability and endpoint settings.", - "summary": "Get v2 provider", + "description": "Retrieve a single AI provider so clients can inspect its availability and endpoint settings.", + "summary": "Get provider", "x-codeSamples": [ { "lang": "js", @@ -20901,9 +21051,1011 @@ ] } }, + "/api/integration": { + "get": { + "tags": ["integrations"], + "operationId": "v2.integration.list", + "parameters": [ + { + "name": "location", + "in": "query", + "schema": { + "type": "object", + "properties": { + "directory": { + "type": "string" + }, + "workspace": { + "type": "string" + } + }, + "additionalProperties": false + }, + "required": false, + "style": "deepObject", + "explode": true + } + ], + "security": [], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "location": { + "$ref": "#/components/schemas/LocationInfo" + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IntegrationInfo" + } + } + }, + "required": ["location", "data"], + "additionalProperties": false + } + } + } + }, + "400": { + "description": "InvalidRequestError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvalidRequestError" + } + } + } + }, + "401": { + "description": "UnauthorizedError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnauthorizedError" + } + } + } + } + }, + "description": "Retrieve available integrations and their authentication methods.", + "summary": "List integrations", + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.integration.list({\n ...\n})" + } + ] + } + }, + "/api/integration/{integrationID}": { + "get": { + "tags": ["integrations"], + "operationId": "v2.integration.get", + "parameters": [ + { + "name": "integrationID", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "location", + "in": "query", + "schema": { + "type": "object", + "properties": { + "directory": { + "type": "string" + }, + "workspace": { + "type": "string" + } + }, + "additionalProperties": false + }, + "required": false, + "style": "deepObject", + "explode": true + } + ], + "security": [], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "location": { + "$ref": "#/components/schemas/LocationInfo" + }, + "data": { + "$ref": "#/components/schemas/IntegrationInfo" + } + }, + "required": ["location", "data"], + "additionalProperties": false + } + } + } + }, + "400": { + "description": "InvalidRequestError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvalidRequestError" + } + } + } + }, + "401": { + "description": "UnauthorizedError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnauthorizedError" + } + } + } + } + }, + "description": "Retrieve one integration and its authentication methods.", + "summary": "Get integration", + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.integration.get({\n ...\n})" + } + ] + } + }, + "/api/integration/{integrationID}/connect/key": { + "post": { + "tags": ["integrations"], + "operationId": "v2.integration.connect.key", + "parameters": [ + { + "name": "integrationID", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "location", + "in": "query", + "schema": { + "type": "object", + "properties": { + "directory": { + "type": "string" + }, + "workspace": { + "type": "string" + } + }, + "additionalProperties": false + }, + "required": false, + "style": "deepObject", + "explode": true + } + ], + "security": [], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "InvalidRequestError", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/InvalidRequestError" + }, + { + "$ref": "#/components/schemas/InvalidRequestError" + } + ] + } + } + } + }, + "401": { + "description": "UnauthorizedError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnauthorizedError" + } + } + } + } + }, + "description": "Run a key authentication method and store the resulting credential.", + "summary": "Connect with key", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "label": { + "type": "string" + } + }, + "required": ["key"], + "additionalProperties": false + } + } + }, + "required": true + }, + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.integration.connect.key({\n ...\n})" + } + ] + } + }, + "/api/integration/{integrationID}/connect/oauth": { + "post": { + "tags": ["integrations"], + "operationId": "v2.integration.connect.oauth", + "parameters": [ + { + "name": "integrationID", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "location", + "in": "query", + "schema": { + "type": "object", + "properties": { + "directory": { + "type": "string" + }, + "workspace": { + "type": "string" + } + }, + "additionalProperties": false + }, + "required": false, + "style": "deepObject", + "explode": true + } + ], + "security": [], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "location": { + "$ref": "#/components/schemas/LocationInfo" + }, + "data": { + "$ref": "#/components/schemas/IntegrationAttempt" + } + }, + "required": ["location", "data"], + "additionalProperties": false + } + } + } + }, + "400": { + "description": "InvalidRequestError", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/InvalidRequestError" + }, + { + "$ref": "#/components/schemas/InvalidRequestError" + } + ] + } + } + } + }, + "401": { + "description": "UnauthorizedError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnauthorizedError" + } + } + } + } + }, + "description": "Start an OAuth attempt and return the authorization details.", + "summary": "Begin OAuth connection", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "methodID": { + "type": "string" + }, + "inputs": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "label": { + "type": "string" + } + }, + "required": ["methodID", "inputs"], + "additionalProperties": false + } + } + }, + "required": true + }, + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.integration.connect.oauth({\n ...\n})" + } + ] + } + }, + "/api/integration/attempt/{attemptID}": { + "get": { + "tags": ["integrations"], + "operationId": "v2.integration.attempt.status", + "parameters": [ + { + "name": "attemptID", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "location", + "in": "query", + "schema": { + "type": "object", + "properties": { + "directory": { + "type": "string" + }, + "workspace": { + "type": "string" + } + }, + "additionalProperties": false + }, + "required": false, + "style": "deepObject", + "explode": true + } + ], + "security": [], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "location": { + "$ref": "#/components/schemas/LocationInfo" + }, + "data": { + "anyOf": [ + { + "type": "object", + "properties": { + "status": { + "type": "string", + "enum": ["pending"] + }, + "time": { + "type": "object", + "properties": { + "created": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "expires": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + } + }, + "required": ["created", "expires"], + "additionalProperties": false + } + }, + "required": ["status", "time"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "status": { + "type": "string", + "enum": ["complete"] + }, + "time": { + "type": "object", + "properties": { + "created": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "expires": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + } + }, + "required": ["created", "expires"], + "additionalProperties": false + } + }, + "required": ["status", "time"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "status": { + "type": "string", + "enum": ["failed"] + }, + "message": { + "type": "string" + }, + "time": { + "type": "object", + "properties": { + "created": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "expires": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + } + }, + "required": ["created", "expires"], + "additionalProperties": false + } + }, + "required": ["status", "message", "time"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "status": { + "type": "string", + "enum": ["expired"] + }, + "time": { + "type": "object", + "properties": { + "created": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "expires": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + } + }, + "required": ["created", "expires"], + "additionalProperties": false + } + }, + "required": ["status", "time"], + "additionalProperties": false + } + ] + } + }, + "required": ["location", "data"], + "additionalProperties": false + } + } + } + }, + "400": { + "description": "InvalidRequestError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvalidRequestError" + } + } + } + }, + "401": { + "description": "UnauthorizedError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnauthorizedError" + } + } + } + } + }, + "description": "Poll the current status of an OAuth attempt.", + "summary": "Get OAuth attempt status", + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.integration.attempt.status({\n ...\n})" + } + ] + }, + "delete": { + "tags": ["integrations"], + "operationId": "v2.integration.attempt.cancel", + "parameters": [ + { + "name": "attemptID", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "location", + "in": "query", + "schema": { + "type": "object", + "properties": { + "directory": { + "type": "string" + }, + "workspace": { + "type": "string" + } + }, + "additionalProperties": false + }, + "required": false, + "style": "deepObject", + "explode": true + } + ], + "security": [], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "InvalidRequestError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvalidRequestError" + } + } + } + }, + "401": { + "description": "UnauthorizedError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnauthorizedError" + } + } + } + } + }, + "description": "Cancel an OAuth attempt and release its resources.", + "summary": "Cancel OAuth connection", + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.integration.attempt.cancel({\n ...\n})" + } + ] + } + }, + "/api/integration/attempt/{attemptID}/complete": { + "post": { + "tags": ["integrations"], + "operationId": "v2.integration.attempt.complete", + "parameters": [ + { + "name": "attemptID", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "location", + "in": "query", + "schema": { + "type": "object", + "properties": { + "directory": { + "type": "string" + }, + "workspace": { + "type": "string" + } + }, + "additionalProperties": false + }, + "required": false, + "style": "deepObject", + "explode": true + } + ], + "security": [], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "InvalidRequestError", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/InvalidRequestError" + }, + { + "$ref": "#/components/schemas/InvalidRequestError" + } + ] + } + } + } + }, + "401": { + "description": "UnauthorizedError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnauthorizedError" + } + } + } + } + }, + "description": "Complete a code-based OAuth attempt and store the resulting credential.", + "summary": "Complete OAuth connection", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "code": { + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "required": true + }, + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.integration.attempt.complete({\n ...\n})" + } + ] + } + }, + "/api/credential/{credentialID}": { + "patch": { + "tags": ["Kilo HttpApi"], + "operationId": "v2.credential.update", + "parameters": [ + { + "name": "credentialID", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "security": [], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "InvalidRequestError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvalidRequestError" + } + } + } + }, + "401": { + "description": "UnauthorizedError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnauthorizedError" + } + } + } + } + }, + "description": "Update a stored credential label.", + "summary": "Update credential", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "label": { + "type": "string" + } + }, + "required": ["label"], + "additionalProperties": false + } + } + }, + "required": true + }, + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.credential.update({\n ...\n})" + } + ] + }, + "delete": { + "tags": ["Kilo HttpApi"], + "operationId": "v2.credential.remove", + "parameters": [ + { + "name": "credentialID", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "security": [], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "InvalidRequestError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvalidRequestError" + } + } + } + }, + "401": { + "description": "UnauthorizedError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnauthorizedError" + } + } + } + } + }, + "description": "Remove a stored integration credential.", + "summary": "Remove credential", + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.credential.remove({\n ...\n})" + } + ] + } + }, "/api/permission/request": { "get": { - "tags": ["v2 permissions"], + "tags": ["permissions"], "operationId": "v2.permission.request.list", "parameters": [ { @@ -20982,184 +22134,9 @@ ] } }, - "/api/session/{sessionID}/permission/request": { - "get": { - "tags": ["v2 session permissions"], - "operationId": "v2.session.permission.list", - "parameters": [ - { - "name": "sessionID", - "in": "path", - "schema": { - "type": "string", - "pattern": "^ses.*" - }, - "required": true - } - ], - "security": [], - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PermissionV2Request" - } - } - }, - "required": ["data"], - "additionalProperties": false - } - } - } - }, - "400": { - "description": "InvalidRequestError", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/InvalidRequestError" - } - } - } - }, - "401": { - "description": "UnauthorizedError", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UnauthorizedError" - } - } - } - }, - "404": { - "description": "SessionNotFoundError", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SessionNotFoundError" - } - } - } - } - }, - "description": "Retrieve pending permission requests owned by a session.", - "summary": "List session permission requests", - "x-codeSamples": [ - { - "lang": "js", - "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.session.permission.list({\n ...\n})" - } - ] - } - }, - "/api/session/{sessionID}/permission/request/{requestID}/reply": { - "post": { - "tags": ["v2 session permissions"], - "operationId": "v2.session.permission.reply", - "parameters": [ - { - "name": "sessionID", - "in": "path", - "schema": { - "type": "string", - "pattern": "^ses.*" - }, - "required": true - }, - { - "name": "requestID", - "in": "path", - "schema": { - "type": "string", - "pattern": "^per" - }, - "required": true - } - ], - "security": [], - "responses": { - "204": { - "description": "" - }, - "400": { - "description": "InvalidRequestError", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/InvalidRequestError" - } - } - } - }, - "401": { - "description": "UnauthorizedError", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UnauthorizedError" - } - } - } - }, - "404": { - "description": "SessionNotFoundError | PermissionNotFoundError", - "content": { - "application/json": { - "schema": { - "anyOf": [ - { - "$ref": "#/components/schemas/SessionNotFoundError" - }, - { - "$ref": "#/components/schemas/PermissionNotFoundError" - } - ] - } - } - } - } - }, - "description": "Respond to a pending permission request owned by a session.", - "summary": "Reply to pending permission request", - "requestBody": { - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "reply": { - "$ref": "#/components/schemas/PermissionV2Reply" - }, - "message": { - "type": "string" - } - }, - "required": ["reply"], - "additionalProperties": false - } - } - }, - "required": true - }, - "x-codeSamples": [ - { - "lang": "js", - "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.session.permission.reply({\n ...\n})" - } - ] - } - }, "/api/permission/saved": { "get": { - "tags": ["v2 saved permissions"], + "tags": ["permissions"], "operationId": "v2.permission.saved.list", "parameters": [ { @@ -21226,7 +22203,7 @@ }, "/api/permission/saved/{id}": { "delete": { - "tags": ["v2 saved permissions"], + "tags": ["permissions"], "operationId": "v2.permission.saved.remove", "parameters": [ { @@ -21274,9 +22251,194 @@ ] } }, - "/api/fs/read": { + "/api/session/{sessionID}/permission": { "get": { - "tags": ["v2 filesystem"], + "tags": ["permissions"], + "operationId": "v2.session.permission.list", + "parameters": [ + { + "name": "sessionID", + "in": "path", + "schema": { + "type": "string", + "pattern": "^ses.*" + }, + "required": true + } + ], + "security": [], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PermissionV2Request" + } + } + }, + "required": ["data"], + "additionalProperties": false + } + } + } + }, + "400": { + "description": "InvalidRequestError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvalidRequestError" + } + } + } + }, + "401": { + "description": "UnauthorizedError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnauthorizedError" + } + } + } + }, + "404": { + "description": "SessionNotFoundError", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/SessionNotFoundError" + }, + { + "$ref": "#/components/schemas/SessionNotFoundError" + } + ] + } + } + } + } + }, + "description": "Retrieve pending permission requests owned by a session.", + "summary": "List session permission requests", + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.session.permission.list({\n ...\n})" + } + ] + } + }, + "/api/session/{sessionID}/permission/{requestID}/reply": { + "post": { + "tags": ["permissions"], + "operationId": "v2.session.permission.reply", + "parameters": [ + { + "name": "sessionID", + "in": "path", + "schema": { + "type": "string", + "pattern": "^ses.*" + }, + "required": true + }, + { + "name": "requestID", + "in": "path", + "schema": { + "type": "string", + "pattern": "^per" + }, + "required": true + } + ], + "security": [], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "InvalidRequestError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvalidRequestError" + } + } + } + }, + "401": { + "description": "UnauthorizedError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnauthorizedError" + } + } + } + }, + "404": { + "description": "SessionNotFoundError | PermissionNotFoundError", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/PermissionNotFoundError" + }, + { + "$ref": "#/components/schemas/SessionNotFoundError" + }, + { + "$ref": "#/components/schemas/SessionNotFoundError" + } + ] + } + } + } + } + }, + "description": "Respond to a pending permission request owned by a session.", + "summary": "Reply to pending permission request", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "reply": { + "$ref": "#/components/schemas/PermissionV2Reply" + }, + "message": { + "type": "string" + } + }, + "required": ["reply"], + "additionalProperties": false + } + } + }, + "required": true + }, + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.session.permission.reply({\n ...\n})" + } + ] + } + }, + "/api/fs/read/*": { + "get": { + "tags": ["filesystem"], "operationId": "v2.fs.read", "parameters": [ { @@ -21304,14 +22466,6 @@ "schema": { "type": "string" }, - "required": true - }, - { - "name": "reference", - "in": "query", - "schema": { - "type": "string" - }, "required": false } ], @@ -21320,26 +22474,10 @@ "200": { "description": "Success", "content": { - "application/json": { + "application/octet-stream": { "schema": { - "type": "object", - "properties": { - "location": { - "$ref": "#/components/schemas/LocationInfo" - }, - "data": { - "anyOf": [ - { - "$ref": "#/components/schemas/FileSystemTextContent" - }, - { - "$ref": "#/components/schemas/FileSystemBinaryContent" - } - ] - } - }, - "required": ["location", "data"], - "additionalProperties": false + "type": "string", + "format": "binary" } } } @@ -21365,7 +22503,7 @@ } } }, - "description": "Read one file relative to the requested location.", + "description": "Serve one file relative to the requested location.", "summary": "Read file", "x-codeSamples": [ { @@ -21377,7 +22515,7 @@ }, "/api/fs/list": { "get": { - "tags": ["v2 filesystem"], + "tags": ["filesystem"], "operationId": "v2.fs.list", "parameters": [ { @@ -21406,14 +22544,6 @@ "type": "string" }, "required": false - }, - { - "name": "reference", - "in": "query", - "schema": { - "type": "string" - }, - "required": false } ], "security": [], @@ -21472,9 +22602,115 @@ ] } }, + "/api/fs/find": { + "get": { + "tags": ["filesystem"], + "operationId": "v2.fs.find", + "parameters": [ + { + "name": "location", + "in": "query", + "schema": { + "type": "object", + "properties": { + "directory": { + "type": "string" + }, + "workspace": { + "type": "string" + } + }, + "additionalProperties": false + }, + "required": false, + "style": "deepObject", + "explode": true + }, + { + "name": "query", + "in": "query", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "type", + "in": "query", + "schema": { + "type": "string", + "enum": ["file", "directory"] + }, + "required": false + }, + { + "name": "limit", + "in": "query", + "schema": { + "type": "string" + }, + "required": false + } + ], + "security": [], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "location": { + "$ref": "#/components/schemas/LocationInfo" + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FileSystemEntry" + } + } + }, + "required": ["location", "data"], + "additionalProperties": false + } + } + } + }, + "400": { + "description": "InvalidRequestError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvalidRequestError" + } + } + } + }, + "401": { + "description": "UnauthorizedError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnauthorizedError" + } + } + } + } + }, + "description": "Find recursively ranked filesystem entries relative to the requested location.", + "summary": "Find files", + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.fs.find({\n ...\n})" + } + ] + } + }, "/api/command": { "get": { - "tags": ["v2 commands"], + "tags": ["commands"], "operationId": "v2.command.list", "parameters": [ { @@ -21543,8 +22779,8 @@ } } }, - "description": "Retrieve currently registered v2 commands.", - "summary": "List v2 commands", + "description": "Retrieve currently registered commands.", + "summary": "List commands", "x-codeSamples": [ { "lang": "js", @@ -21555,7 +22791,7 @@ }, "/api/skill": { "get": { - "tags": ["v2 skills"], + "tags": ["skills"], "operationId": "v2.skill.list", "parameters": [ { @@ -21624,8 +22860,8 @@ } } }, - "description": "Retrieve currently registered v2 skills.", - "summary": "List v2 skills", + "description": "Retrieve currently registered skills.", + "summary": "List skills", "x-codeSamples": [ { "lang": "js", @@ -21636,7 +22872,7 @@ }, "/api/event": { "get": { - "tags": ["v2 events"], + "tags": ["events"], "operationId": "v2.event.subscribe", "parameters": [ { @@ -21692,8 +22928,8 @@ } } }, - "description": "Subscribe to native EventV2 payloads for a location.", - "summary": "Subscribe to v2 events", + "description": "Subscribe to native event payloads for a location.", + "summary": "Subscribe to events", "x-codeSamples": [ { "lang": "js", @@ -21704,7 +22940,7 @@ }, "/api/question/request": { "get": { - "tags": ["v2 questions"], + "tags": ["session questions"], "operationId": "v2.question.request.list", "parameters": [ { @@ -21783,9 +23019,94 @@ ] } }, - "/api/session/{sessionID}/question/request/{requestID}/reply": { + "/api/session/{sessionID}/question": { + "get": { + "tags": ["session questions"], + "operationId": "v2.session.question.list", + "parameters": [ + { + "name": "sessionID", + "in": "path", + "schema": { + "type": "string", + "pattern": "^ses.*" + }, + "required": true + } + ], + "security": [], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/QuestionV2Request" + } + } + }, + "required": ["data"], + "additionalProperties": false + } + } + } + }, + "400": { + "description": "InvalidRequestError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvalidRequestError" + } + } + } + }, + "401": { + "description": "UnauthorizedError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnauthorizedError" + } + } + } + }, + "404": { + "description": "SessionNotFoundError", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/SessionNotFoundError" + }, + { + "$ref": "#/components/schemas/SessionNotFoundError" + } + ] + } + } + } + } + }, + "description": "Retrieve pending question requests owned by a session.", + "summary": "List session question requests", + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.session.question.list({\n ...\n})" + } + ] + } + }, + "/api/session/{sessionID}/question/{requestID}/reply": { "post": { - "tags": ["v2 session questions"], + "tags": ["session questions"], "operationId": "v2.session.question.reply", "parameters": [ { @@ -21838,11 +23159,14 @@ "application/json": { "schema": { "anyOf": [ + { + "$ref": "#/components/schemas/QuestionNotFoundError" + }, { "$ref": "#/components/schemas/SessionNotFoundError" }, { - "$ref": "#/components/schemas/QuestionNotFoundError" + "$ref": "#/components/schemas/SessionNotFoundError" } ] } @@ -21870,9 +23194,9 @@ ] } }, - "/api/session/{sessionID}/question/request/{requestID}/reject": { + "/api/session/{sessionID}/question/{requestID}/reject": { "post": { - "tags": ["v2 session questions"], + "tags": ["session questions"], "operationId": "v2.session.question.reject", "parameters": [ { @@ -21925,11 +23249,14 @@ "application/json": { "schema": { "anyOf": [ + { + "$ref": "#/components/schemas/QuestionNotFoundError" + }, { "$ref": "#/components/schemas/SessionNotFoundError" }, { - "$ref": "#/components/schemas/QuestionNotFoundError" + "$ref": "#/components/schemas/SessionNotFoundError" } ] } @@ -21947,6 +23274,322 @@ ] } }, + "/api/reference": { + "get": { + "tags": ["reference"], + "operationId": "v2.reference.list", + "parameters": [ + { + "name": "location", + "in": "query", + "schema": { + "type": "object", + "properties": { + "directory": { + "type": "string" + }, + "workspace": { + "type": "string" + } + }, + "additionalProperties": false + }, + "required": false, + "style": "deepObject", + "explode": true + } + ], + "security": [], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "location": { + "$ref": "#/components/schemas/LocationInfo" + }, + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ReferenceInfo" + } + } + }, + "required": ["location", "data"], + "additionalProperties": false + } + } + } + }, + "400": { + "description": "InvalidRequestError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvalidRequestError" + } + } + } + }, + "401": { + "description": "UnauthorizedError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UnauthorizedError" + } + } + } + } + }, + "description": "List references available in the requested location.", + "summary": "List references", + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.reference.list({\n ...\n})" + } + ] + } + }, + "/experimental/project/{projectID}/copy": { + "post": { + "tags": ["projectCopy"], + "operationId": "v2.projectCopy.create", + "parameters": [ + { + "name": "projectID", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "location", + "in": "query", + "schema": { + "type": "object", + "properties": { + "directory": { + "type": "string" + }, + "workspace": { + "type": "string" + } + }, + "additionalProperties": false + }, + "required": false, + "style": "deepObject", + "explode": true + } + ], + "responses": { + "200": { + "description": "ProjectCopy.Copy", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProjectCopyCopy" + } + } + } + }, + "400": { + "description": "ProjectCopyError | InvalidRequestError", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/ProjectCopyError" + }, + { + "$ref": "#/components/schemas/InvalidRequestError" + } + ] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "strategy": { + "type": "string" + }, + "directory": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": ["strategy", "directory"], + "additionalProperties": false + } + } + } + }, + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.projectCopy.create({\n ...\n})" + } + ] + }, + "delete": { + "tags": ["projectCopy"], + "operationId": "v2.projectCopy.remove", + "parameters": [ + { + "name": "projectID", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "location", + "in": "query", + "schema": { + "type": "object", + "properties": { + "directory": { + "type": "string" + }, + "workspace": { + "type": "string" + } + }, + "additionalProperties": false + }, + "required": false, + "style": "deepObject", + "explode": true + } + ], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "ProjectCopyError | InvalidRequestError", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/ProjectCopyError" + }, + { + "$ref": "#/components/schemas/InvalidRequestError" + } + ] + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "directory": { + "type": "string" + }, + "force": { + "type": "boolean" + } + }, + "required": ["directory", "force"], + "additionalProperties": false + } + } + } + }, + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.projectCopy.remove({\n ...\n})" + } + ] + } + }, + "/experimental/project/{projectID}/copy/refresh": { + "post": { + "tags": ["projectCopy"], + "operationId": "v2.projectCopy.refresh", + "parameters": [ + { + "name": "projectID", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "location", + "in": "query", + "schema": { + "type": "object", + "properties": { + "directory": { + "type": "string" + }, + "workspace": { + "type": "string" + } + }, + "additionalProperties": false + }, + "required": false, + "style": "deepObject", + "explode": true + } + ], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "ProjectCopyError | InvalidRequestError", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/ProjectCopyError" + }, + { + "$ref": "#/components/schemas/InvalidRequestError" + } + ] + } + } + } + } + }, + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.v2.projectCopy.refresh({\n ...\n})" + } + ] + } + }, "/pty/{ptyID}/connect": { "get": { "tags": ["pty"], @@ -22176,6 +23819,9 @@ { "$ref": "#/components/schemas/EventSessionNextPromptPromoted" }, + { + "$ref": "#/components/schemas/EventSessionNextInterruptRequested" + }, { "$ref": "#/components/schemas/EventSessionNextContextUpdated" }, @@ -22300,61 +23946,10 @@ "$ref": "#/components/schemas/EventPermissionReplied" }, { - "$ref": "#/components/schemas/EventTodoUpdated" + "$ref": "#/components/schemas/EventReferenceUpdated" }, { - "$ref": "#/components/schemas/EventSessionStatus" - }, - { - "$ref": "#/components/schemas/EventSessionIdle" - }, - { - "$ref": "#/components/schemas/EventSessionCompacted" - }, - { - "$ref": "#/components/schemas/EventCommandExecuted" - }, - { - "$ref": "#/components/schemas/EventProjectDirectoriesUpdated" - }, - { - "$ref": "#/components/schemas/EventProjectUpdated" - }, - { - "$ref": "#/components/schemas/EventLspUpdated" - }, - { - "$ref": "#/components/schemas/EventFileEdited" - }, - { - "$ref": "#/components/schemas/EventFileWatcherUpdated" - }, - { - "$ref": "#/components/schemas/EventVcsBranchUpdated" - }, - { - "$ref": "#/components/schemas/EventWorkspaceReady" - }, - { - "$ref": "#/components/schemas/EventWorkspaceFailed" - }, - { - "$ref": "#/components/schemas/EventWorkspaceStatus" - }, - { - "$ref": "#/components/schemas/EventWorktreeReady" - }, - { - "$ref": "#/components/schemas/EventWorktreeFailed" - }, - { - "$ref": "#/components/schemas/EventAccountAdded" - }, - { - "$ref": "#/components/schemas/EventAccountRemoved" - }, - { - "$ref": "#/components/schemas/EventAccountSwitched" + "$ref": "#/components/schemas/EventIntegrationUpdated" }, { "$ref": "#/components/schemas/EventPermissionV2Asked" @@ -22362,6 +23957,15 @@ { "$ref": "#/components/schemas/EventPermissionV2Replied" }, + { + "$ref": "#/components/schemas/EventProjectDirectoriesUpdated" + }, + { + "$ref": "#/components/schemas/EventFileEdited" + }, + { + "$ref": "#/components/schemas/EventFileWatcherUpdated" + }, { "$ref": "#/components/schemas/EventPtyCreated" }, @@ -22383,6 +23987,45 @@ { "$ref": "#/components/schemas/EventQuestionV2Rejected" }, + { + "$ref": "#/components/schemas/EventTodoUpdated" + }, + { + "$ref": "#/components/schemas/EventSessionStatus" + }, + { + "$ref": "#/components/schemas/EventSessionIdle" + }, + { + "$ref": "#/components/schemas/EventSessionCompacted" + }, + { + "$ref": "#/components/schemas/EventCommandExecuted" + }, + { + "$ref": "#/components/schemas/EventProjectUpdated" + }, + { + "$ref": "#/components/schemas/EventLspUpdated" + }, + { + "$ref": "#/components/schemas/EventVcsBranchUpdated" + }, + { + "$ref": "#/components/schemas/EventWorkspaceReady" + }, + { + "$ref": "#/components/schemas/EventWorkspaceFailed" + }, + { + "$ref": "#/components/schemas/EventWorkspaceStatus" + }, + { + "$ref": "#/components/schemas/EventWorktreeReady" + }, + { + "$ref": "#/components/schemas/EventWorktreeFailed" + }, { "$ref": "#/components/schemas/EventServerInstanceDisposed" } @@ -23353,6 +24996,10 @@ }, "diff": { "type": "string" + }, + "workspace": { + "type": "string", + "enum": ["restored", "snapshots-disabled", "unavailable"] } }, "required": ["messageID"], @@ -23641,6 +25288,27 @@ "required": ["name", "data"], "additionalProperties": false }, + "ContentFilterError": { + "type": "object", + "properties": { + "name": { + "type": "string", + "enum": ["ContentFilterError"] + }, + "data": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + }, + "required": ["message"], + "additionalProperties": false + } + }, + "required": ["name", "data"], + "additionalProperties": false + }, "APIError": { "type": "object", "properties": { @@ -23734,6 +25402,9 @@ { "$ref": "#/components/schemas/ContextOverflowError" }, + { + "$ref": "#/components/schemas/ContentFilterError" + }, { "$ref": "#/components/schemas/APIError" } @@ -24350,6 +26021,17 @@ }, "snapshot": { "type": "string" + }, + "time": { + "type": "object", + "properties": { + "start": { + "type": "number", + "minimum": 0 + } + }, + "required": ["start"], + "additionalProperties": false } }, "required": ["id", "sessionID", "messageID", "type"], @@ -24393,6 +26075,47 @@ "required": ["providerID", "modelID"], "additionalProperties": false }, + "generationID": { + "type": "string" + }, + "vercelID": { + "type": "string" + }, + "metrics": { + "type": "object", + "properties": { + "prompt": { + "type": "number" + }, + "generation": { + "type": "number" + }, + "source": { + "type": "string", + "enum": ["provider", "computed"] + } + }, + "required": ["source"], + "additionalProperties": false + }, + "time": { + "type": "object", + "properties": { + "start": { + "type": "number", + "minimum": 0 + }, + "end": { + "type": "number", + "minimum": 0 + }, + "elapsed": { + "type": "number" + } + }, + "required": ["start", "end", "elapsed"], + "additionalProperties": false + }, "cost": { "type": "number" }, @@ -24665,12 +26388,6 @@ "items": { "$ref": "#/components/schemas/PromptAgentAttachment" } - }, - "references": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PromptReferenceAttachment" - } } }, "required": ["text"], @@ -24981,6 +26698,70 @@ "required": ["name", "data"], "additionalProperties": false }, + "Pty": { + "type": "object", + "properties": { + "id": { + "type": "string", + "pattern": "^pty" + }, + "title": { + "type": "string" + }, + "command": { + "type": "string" + }, + "args": { + "type": "array", + "items": { + "type": "string" + } + }, + "cwd": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["running", "exited"] + }, + "pid": { + "type": "integer", + "minimum": 0 + }, + "sessionID": { + "anyOf": [ + { + "type": "string", + "pattern": "^ses" + }, + { + "type": "null" + } + ] + } + }, + "required": ["id", "title", "command", "args", "cwd", "status", "pid"], + "additionalProperties": false + }, + "Todo": { + "type": "object", + "properties": { + "content": { + "type": "string", + "description": "Brief description of the task" + }, + "status": { + "type": "string", + "description": "Current status of the task: pending, in_progress, completed, cancelled" + }, + "priority": { + "type": "string", + "description": "Priority level of the task: high, medium, low" + } + }, + "required": ["content", "status", "priority"], + "additionalProperties": false + }, "SessionStatus": { "anyOf": [ { @@ -25072,51 +26853,6 @@ } ] }, - "Pty": { - "type": "object", - "properties": { - "id": { - "type": "string", - "pattern": "^pty" - }, - "title": { - "type": "string" - }, - "command": { - "type": "string" - }, - "args": { - "type": "array", - "items": { - "type": "string" - } - }, - "cwd": { - "type": "string" - }, - "status": { - "type": "string", - "enum": ["running", "exited"] - }, - "pid": { - "type": "integer", - "minimum": 0 - }, - "sessionID": { - "anyOf": [ - { - "type": "string", - "pattern": "^ses" - }, - { - "type": "null" - } - ] - } - }, - "required": ["id", "title", "command", "args", "cwd", "status", "pid"], - "additionalProperties": false - }, "GlobalEvent": { "type": "object", "properties": { @@ -25269,6 +27005,9 @@ { "$ref": "#/components/schemas/EventSessionNextPromptPromoted" }, + { + "$ref": "#/components/schemas/EventSessionNextInterruptRequested" + }, { "$ref": "#/components/schemas/EventSessionNextContextUpdated" }, @@ -25393,61 +27132,10 @@ "$ref": "#/components/schemas/EventPermissionReplied" }, { - "$ref": "#/components/schemas/EventTodoUpdated" + "$ref": "#/components/schemas/EventReferenceUpdated" }, { - "$ref": "#/components/schemas/EventSessionStatus" - }, - { - "$ref": "#/components/schemas/EventSessionIdle" - }, - { - "$ref": "#/components/schemas/EventSessionCompacted" - }, - { - "$ref": "#/components/schemas/EventCommandExecuted" - }, - { - "$ref": "#/components/schemas/EventProjectDirectoriesUpdated" - }, - { - "$ref": "#/components/schemas/EventProjectUpdated" - }, - { - "$ref": "#/components/schemas/EventLspUpdated" - }, - { - "$ref": "#/components/schemas/EventFileEdited" - }, - { - "$ref": "#/components/schemas/EventFileWatcherUpdated" - }, - { - "$ref": "#/components/schemas/EventVcsBranchUpdated" - }, - { - "$ref": "#/components/schemas/EventWorkspaceReady" - }, - { - "$ref": "#/components/schemas/EventWorkspaceFailed" - }, - { - "$ref": "#/components/schemas/EventWorkspaceStatus" - }, - { - "$ref": "#/components/schemas/EventWorktreeReady" - }, - { - "$ref": "#/components/schemas/EventWorktreeFailed" - }, - { - "$ref": "#/components/schemas/EventAccountAdded" - }, - { - "$ref": "#/components/schemas/EventAccountRemoved" - }, - { - "$ref": "#/components/schemas/EventAccountSwitched" + "$ref": "#/components/schemas/EventIntegrationUpdated" }, { "$ref": "#/components/schemas/EventPermissionV2Asked" @@ -25455,6 +27143,15 @@ { "$ref": "#/components/schemas/EventPermissionV2Replied" }, + { + "$ref": "#/components/schemas/EventProjectDirectoriesUpdated" + }, + { + "$ref": "#/components/schemas/EventFileEdited" + }, + { + "$ref": "#/components/schemas/EventFileWatcherUpdated" + }, { "$ref": "#/components/schemas/EventPtyCreated" }, @@ -25476,6 +27173,45 @@ { "$ref": "#/components/schemas/EventQuestionV2Rejected" }, + { + "$ref": "#/components/schemas/EventTodoUpdated" + }, + { + "$ref": "#/components/schemas/EventSessionStatus" + }, + { + "$ref": "#/components/schemas/EventSessionIdle" + }, + { + "$ref": "#/components/schemas/EventSessionCompacted" + }, + { + "$ref": "#/components/schemas/EventCommandExecuted" + }, + { + "$ref": "#/components/schemas/EventProjectUpdated" + }, + { + "$ref": "#/components/schemas/EventLspUpdated" + }, + { + "$ref": "#/components/schemas/EventVcsBranchUpdated" + }, + { + "$ref": "#/components/schemas/EventWorkspaceReady" + }, + { + "$ref": "#/components/schemas/EventWorkspaceFailed" + }, + { + "$ref": "#/components/schemas/EventWorkspaceStatus" + }, + { + "$ref": "#/components/schemas/EventWorktreeReady" + }, + { + "$ref": "#/components/schemas/EventWorktreeFailed" + }, { "$ref": "#/components/schemas/EventServerInstanceDisposed" }, @@ -25575,9 +27311,6 @@ { "$ref": "#/components/schemas/SyncEventSessionNextCompactionStarted" }, - { - "$ref": "#/components/schemas/SyncEventSessionNextCompactionDelta" - }, { "$ref": "#/components/schemas/SyncEventSessionNextCompactionEnded" } @@ -25618,44 +27351,6 @@ "additionalProperties": false, "description": "Server configuration for the kilo serve command" }, - "ReferenceConfigEntry": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object", - "properties": { - "repository": { - "type": "string", - "description": "Git repository URL, host/path reference, or GitHub owner/repo shorthand" - }, - "branch": { - "type": "string" - } - }, - "required": ["repository"], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "path": { - "type": "string", - "description": "Absolute path, ~/ path, or workspace-relative path to a local reference directory" - } - }, - "required": ["path"], - "additionalProperties": false - } - ] - }, - "ReferenceConfig": { - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/ReferenceConfigEntry" - } - }, "IndexingConfig": { "type": "object", "properties": { @@ -25850,7 +27545,8 @@ "items": { "type": "string", "pattern": "^\\s*\\.?[A-Za-z0-9][A-Za-z0-9_+-]*\\s*$" - } + }, + "minItems": 1 } }, "additionalProperties": false @@ -26213,7 +27909,7 @@ "properties": { "field": { "type": "string", - "enum": ["reasoning_content", "reasoning_details"] + "enum": ["reasoning", "reasoning_content", "reasoning_details"] } }, "required": ["field"], @@ -26539,8 +28235,37 @@ }, "additionalProperties": false }, + "references": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/components/schemas/ConfigV2ReferenceGit" + }, + { + "$ref": "#/components/schemas/ConfigV2ReferenceLocal" + } + ] + } + }, "reference": { - "$ref": "#/components/schemas/ReferenceConfig" + "type": "object", + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/components/schemas/ConfigV2ReferenceGit" + }, + { + "$ref": "#/components/schemas/ConfigV2ReferenceLocal" + } + ] + } }, "watcher": { "type": "object", @@ -26647,6 +28372,10 @@ "hide_prompt_training_models": { "type": "boolean" }, + "web_search": { + "type": "boolean", + "description": "Make web search available to models from all providers (default: false)" + }, "sandbox": { "type": "object", "properties": { @@ -26905,9 +28634,6 @@ "type": "boolean" } }, - "web_search": { - "type": "boolean" - }, "attachment": { "$ref": "#/components/schemas/AttachmentConfig" }, @@ -27164,7 +28890,7 @@ "properties": { "field": { "type": "string", - "enum": ["reasoning_content", "reasoning_details"] + "enum": ["reasoning", "reasoning_content", "reasoning_details"] } }, "required": ["field"], @@ -27809,6 +29535,10 @@ }, "diff": { "type": "string" + }, + "workspace": { + "type": "string", + "enum": ["restored", "snapshots-disabled", "unavailable"] } }, "required": ["messageID"], @@ -28494,27 +30224,6 @@ "required": ["_tag", "projectID", "message"], "additionalProperties": false }, - "ProjectCopyError": { - "type": "object", - "properties": { - "name": { - "type": "string", - "enum": ["ProjectCopyError"] - }, - "data": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - }, - "required": ["message"], - "additionalProperties": false - } - }, - "required": ["name", "data"], - "additionalProperties": false - }, "PtyNotFoundError": { "type": "object", "properties": { @@ -28977,6 +30686,10 @@ }, "diff": { "type": "string" + }, + "workspace": { + "type": "string", + "enum": ["restored", "snapshots-disabled", "unavailable"] } }, "required": ["messageID"], @@ -29146,6 +30859,10 @@ }, "diff": { "type": "string" + }, + "workspace": { + "type": "string", + "enum": ["restored", "snapshots-disabled", "unavailable"] } }, "required": ["messageID"], @@ -29174,25 +30891,6 @@ } } }, - "Todo": { - "type": "object", - "properties": { - "content": { - "type": "string", - "description": "Brief description of the task" - }, - "status": { - "type": "string", - "description": "Current status of the task: pending, in_progress, completed, cancelled" - }, - "priority": { - "type": "string", - "description": "Priority level of the task: high, medium, low" - } - }, - "required": ["content", "status", "priority"], - "additionalProperties": false - }, "Session3": { "type": "object", "properties": { @@ -29353,6 +31051,10 @@ }, "diff": { "type": "string" + }, + "workspace": { + "type": "string", + "enum": ["restored", "snapshots-disabled", "unavailable"] } }, "required": ["messageID"], @@ -29522,6 +31224,10 @@ }, "diff": { "type": "string" + }, + "workspace": { + "type": "string", + "enum": ["restored", "snapshots-disabled", "unavailable"] } }, "required": ["messageID"], @@ -29691,6 +31397,10 @@ }, "diff": { "type": "string" + }, + "workspace": { + "type": "string", + "enum": ["restored", "snapshots-disabled", "unavailable"] } }, "required": ["messageID"], @@ -29860,6 +31570,10 @@ }, "diff": { "type": "string" + }, + "workspace": { + "type": "string", + "enum": ["restored", "snapshots-disabled", "unavailable"] } }, "required": ["messageID"], @@ -30029,6 +31743,10 @@ }, "diff": { "type": "string" + }, + "workspace": { + "type": "string", + "enum": ["restored", "snapshots-disabled", "unavailable"] } }, "required": ["messageID"], @@ -30360,6 +32078,10 @@ }, "diff": { "type": "string" + }, + "workspace": { + "type": "string", + "enum": ["restored", "snapshots-disabled", "unavailable"] } }, "required": ["messageID"], @@ -30529,6 +32251,10 @@ }, "diff": { "type": "string" + }, + "workspace": { + "type": "string", + "enum": ["restored", "snapshots-disabled", "unavailable"] } }, "required": ["messageID"], @@ -31425,6 +33151,16 @@ "required": ["_tag"], "additionalProperties": false }, + "CloudSessionImportError": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + }, + "required": ["error"], + "additionalProperties": false + }, "AgentRequirementResult": { "type": "object", "properties": { @@ -32361,7 +34097,7 @@ "required": ["_tag", "message"], "additionalProperties": false }, - "V2SessionsResponse": { + "SessionsResponse": { "type": "object", "properties": { "data": { @@ -32451,7 +34187,7 @@ "required": ["_tag", "message"], "additionalProperties": false }, - "V2SessionMessagesResponse": { + "SessionMessagesResponse": { "type": "object", "properties": { "data": { @@ -32493,6 +34229,30 @@ "required": ["_tag", "providerID", "message"], "additionalProperties": false }, + "ProjectCopyError": { + "type": "object", + "properties": { + "name": { + "type": "string", + "enum": ["ProjectCopyError"] + }, + "data": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "forceRequired": { + "type": "boolean" + } + }, + "required": ["message"], + "additionalProperties": false + } + }, + "required": ["name", "data"], + "additionalProperties": false + }, "effect_HttpApiError_Forbidden": { "type": "object", "properties": { @@ -34539,6 +36299,182 @@ "body": { "type": "object" }, + "generation": { + "type": "object", + "properties": { + "maxTokens": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "temperature": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "topP": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "topK": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "frequencyPenalty": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "presencePenalty": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "seed": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "stop": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "options": { + "type": "object" + }, "variant": { "type": "string" } @@ -34562,6 +36498,182 @@ }, "body": { "type": "object" + }, + "generation": { + "type": "object", + "properties": { + "maxTokens": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "temperature": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "topP": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "topK": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "frequencyPenalty": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "presencePenalty": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "seed": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "stop": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "options": { + "type": "object" } }, "required": ["id", "headers", "body"], @@ -35092,41 +37204,6 @@ "required": ["name"], "additionalProperties": false }, - "PromptReferenceAttachment": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "kind": { - "type": "string", - "enum": ["local", "git", "invalid"] - }, - "uri": { - "type": "string" - }, - "repository": { - "type": "string" - }, - "branch": { - "type": "string" - }, - "target": { - "type": "string" - }, - "targetUri": { - "type": "string" - }, - "problem": { - "type": "string" - }, - "source": { - "$ref": "#/components/schemas/PromptSource" - } - }, - "required": ["name", "kind"], - "additionalProperties": false - }, "EventSessionNextPrompted": { "type": "object", "properties": { @@ -35243,6 +37320,34 @@ "required": ["id", "type", "properties"], "additionalProperties": false }, + "EventSessionNextInterruptRequested": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": ["session.next.interrupt.requested"] + }, + "properties": { + "type": "object", + "properties": { + "timestamp": { + "type": "number" + }, + "sessionID": { + "type": "string", + "pattern": "^ses" + } + }, + "required": ["timestamp", "sessionID"], + "additionalProperties": false + } + }, + "required": ["id", "type", "properties"], + "additionalProperties": false + }, "EventSessionNextContextUpdated": { "type": "object", "properties": { @@ -35984,51 +38089,8 @@ "type": "string", "enum": ["file"] }, - "source": { - "anyOf": [ - { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["data"] - }, - "data": { - "type": "string" - } - }, - "required": ["type", "data"], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["url"] - }, - "url": { - "type": "string" - } - }, - "required": ["type", "url"], - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["file"] - }, - "uri": { - "type": "string" - } - }, - "required": ["type", "uri"], - "additionalProperties": false - } - ] + "uri": { + "type": "string" }, "mime": { "type": "string" @@ -36037,7 +38099,7 @@ "type": "string" } }, - "required": ["type", "source", "mime"], + "required": ["type", "uri", "mime"], "additionalProperties": false }, "EventSessionNextToolProgress": { @@ -36134,6 +38196,12 @@ ] } }, + "outputPaths": { + "type": "array", + "items": { + "type": "string" + } + }, "result": {}, "provider": { "type": "object", @@ -36335,11 +38403,15 @@ "type": "string", "pattern": "^ses" }, + "messageID": { + "type": "string", + "pattern": "^msg_" + }, "text": { "type": "string" } }, - "required": ["timestamp", "sessionID", "text"], + "required": ["timestamp", "sessionID", "messageID", "text"], "additionalProperties": false } }, @@ -36366,9 +38438,20 @@ "type": "string", "pattern": "^ses" }, + "messageID": { + "type": "string", + "pattern": "^msg_" + }, + "reason": { + "type": "string", + "enum": ["auto", "manual"] + }, "text": { "type": "string" }, + "recent": { + "type": "string" + }, "include": { "type": "string" } @@ -36644,6 +38727,9 @@ { "$ref": "#/components/schemas/ContextOverflowError" }, + { + "$ref": "#/components/schemas/ContentFilterError" + }, { "$ref": "#/components/schemas/APIError" }, @@ -36818,26 +38904,7 @@ "required": ["id", "type", "properties"], "additionalProperties": false }, - "SessionTodoInfo": { - "type": "object", - "properties": { - "content": { - "type": "string", - "description": "Brief description of the task" - }, - "status": { - "type": "string", - "description": "Current status of the task: pending, in_progress, completed, cancelled" - }, - "priority": { - "type": "string", - "description": "Priority level of the task: high, medium, low" - } - }, - "required": ["content", "status", "priority"], - "additionalProperties": false - }, - "EventTodoUpdated": { + "EventReferenceUpdated": { "type": "object", "properties": { "id": { @@ -36845,259 +38912,7 @@ }, "type": { "type": "string", - "enum": ["todo.updated"] - }, - "properties": { - "type": "object", - "properties": { - "sessionID": { - "type": "string", - "pattern": "^ses" - }, - "todos": { - "type": "array", - "items": { - "$ref": "#/components/schemas/SessionTodoInfo" - } - } - }, - "required": ["sessionID", "todos"], - "additionalProperties": false - } - }, - "required": ["id", "type", "properties"], - "additionalProperties": false - }, - "EventSessionStatus": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["session.status"] - }, - "properties": { - "type": "object", - "properties": { - "sessionID": { - "type": "string", - "pattern": "^ses" - }, - "status": { - "$ref": "#/components/schemas/SessionStatus" - } - }, - "required": ["sessionID", "status"], - "additionalProperties": false - } - }, - "required": ["id", "type", "properties"], - "additionalProperties": false - }, - "EventSessionIdle": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["session.idle"] - }, - "properties": { - "type": "object", - "properties": { - "sessionID": { - "type": "string", - "pattern": "^ses" - } - }, - "required": ["sessionID"], - "additionalProperties": false - } - }, - "required": ["id", "type", "properties"], - "additionalProperties": false - }, - "EventSessionCompacted": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["session.compacted"] - }, - "properties": { - "type": "object", - "properties": { - "sessionID": { - "type": "string", - "pattern": "^ses" - } - }, - "required": ["sessionID"], - "additionalProperties": false - } - }, - "required": ["id", "type", "properties"], - "additionalProperties": false - }, - "EventCommandExecuted": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["command.executed"] - }, - "properties": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "sessionID": { - "type": "string", - "pattern": "^ses" - }, - "arguments": { - "type": "string" - }, - "messageID": { - "type": "string", - "pattern": "^msg" - } - }, - "required": ["name", "sessionID", "arguments", "messageID"], - "additionalProperties": false - } - }, - "required": ["id", "type", "properties"], - "additionalProperties": false - }, - "EventProjectDirectoriesUpdated": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["project.directories.updated"] - }, - "properties": { - "type": "object", - "properties": { - "projectID": { - "type": "string" - } - }, - "required": ["projectID"], - "additionalProperties": false - } - }, - "required": ["id", "type", "properties"], - "additionalProperties": false - }, - "EventProjectUpdated": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["project.updated"] - }, - "properties": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "worktree": { - "type": "string" - }, - "vcs": { - "type": "string", - "enum": ["git"] - }, - "name": { - "type": "string" - }, - "icon": { - "type": "object", - "properties": { - "url": { - "type": "string" - }, - "override": { - "type": "string" - }, - "color": { - "type": "string" - } - }, - "additionalProperties": false - }, - "commands": { - "type": "object", - "properties": { - "start": { - "type": "string", - "description": "Startup script to run when creating a new workspace (worktree)" - } - }, - "additionalProperties": false - }, - "time": { - "type": "object", - "properties": { - "created": { - "type": "integer", - "minimum": 0 - }, - "updated": { - "type": "integer", - "minimum": 0 - }, - "initialized": { - "type": "integer", - "minimum": 0 - } - }, - "required": ["created", "updated"], - "additionalProperties": false - }, - "sandboxes": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": ["id", "worktree", "time", "sandboxes"], - "additionalProperties": false - } - }, - "required": ["id", "type", "properties"], - "additionalProperties": false - }, - "EventLspUpdated": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["lsp.updated"] + "enum": ["reference.updated"] }, "properties": { "type": "object", @@ -37107,7 +38922,7 @@ "required": ["id", "type", "properties"], "additionalProperties": false }, - "EventFileEdited": { + "EventIntegrationUpdated": { "type": "object", "properties": { "id": { @@ -37115,347 +38930,11 @@ }, "type": { "type": "string", - "enum": ["file.edited"] + "enum": ["integration.updated"] }, "properties": { "type": "object", - "properties": { - "file": { - "type": "string" - } - }, - "required": ["file"], - "additionalProperties": false - } - }, - "required": ["id", "type", "properties"], - "additionalProperties": false - }, - "EventFileWatcherUpdated": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["file.watcher.updated"] - }, - "properties": { - "type": "object", - "properties": { - "file": { - "type": "string" - }, - "event": { - "type": "string", - "enum": ["add", "change", "unlink"] - } - }, - "required": ["file", "event"], - "additionalProperties": false - } - }, - "required": ["id", "type", "properties"], - "additionalProperties": false - }, - "EventVcsBranchUpdated": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["vcs.branch.updated"] - }, - "properties": { - "type": "object", - "properties": { - "branch": { - "type": "string" - } - }, - "additionalProperties": false - } - }, - "required": ["id", "type", "properties"], - "additionalProperties": false - }, - "EventWorkspaceReady": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["workspace.ready"] - }, - "properties": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - }, - "required": ["name"], - "additionalProperties": false - } - }, - "required": ["id", "type", "properties"], - "additionalProperties": false - }, - "EventWorkspaceFailed": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["workspace.failed"] - }, - "properties": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - }, - "required": ["message"], - "additionalProperties": false - } - }, - "required": ["id", "type", "properties"], - "additionalProperties": false - }, - "EventWorkspaceStatus": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["workspace.status"] - }, - "properties": { - "type": "object", - "properties": { - "workspaceID": { - "type": "string", - "pattern": "^wrk" - }, - "status": { - "type": "string", - "enum": ["connected", "connecting", "disconnected", "error"] - } - }, - "required": ["workspaceID", "status"], - "additionalProperties": false - } - }, - "required": ["id", "type", "properties"], - "additionalProperties": false - }, - "EventWorktreeReady": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["worktree.ready"] - }, - "properties": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "branch": { - "type": "string" - } - }, - "required": ["name"], - "additionalProperties": false - } - }, - "required": ["id", "type", "properties"], - "additionalProperties": false - }, - "EventWorktreeFailed": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["worktree.failed"] - }, - "properties": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - }, - "required": ["message"], - "additionalProperties": false - } - }, - "required": ["id", "type", "properties"], - "additionalProperties": false - }, - "AuthOAuthCredential": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["oauth"] - }, - "refresh": { - "type": "string" - }, - "access": { - "type": "string" - }, - "expires": { - "type": "integer", - "minimum": 0 - }, - "accountId": { - "type": "string" - } - }, - "required": ["type", "refresh", "access", "expires"], - "additionalProperties": false - }, - "AuthApiKeyCredential": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["api"] - }, - "key": { - "type": "string" - }, - "metadata": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - }, - "required": ["type", "key"], - "additionalProperties": false - }, - "AuthCredential": { - "anyOf": [ - { - "$ref": "#/components/schemas/AuthOAuthCredential" - }, - { - "$ref": "#/components/schemas/AuthApiKeyCredential" - } - ] - }, - "AuthInfo": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "serviceID": { - "type": "string" - }, - "description": { - "type": "string" - }, - "credential": { - "$ref": "#/components/schemas/AuthCredential" - } - }, - "required": ["id", "serviceID", "description", "credential"], - "additionalProperties": false - }, - "EventAccountAdded": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["account.added"] - }, - "properties": { - "type": "object", - "properties": { - "account": { - "$ref": "#/components/schemas/AuthInfo" - } - }, - "required": ["account"], - "additionalProperties": false - } - }, - "required": ["id", "type", "properties"], - "additionalProperties": false - }, - "EventAccountRemoved": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["account.removed"] - }, - "properties": { - "type": "object", - "properties": { - "account": { - "$ref": "#/components/schemas/AuthInfo" - } - }, - "required": ["account"], - "additionalProperties": false - } - }, - "required": ["id", "type", "properties"], - "additionalProperties": false - }, - "EventAccountSwitched": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["account.switched"] - }, - "properties": { - "type": "object", - "properties": { - "serviceID": { - "type": "string" - }, - "from": { - "type": "string" - }, - "to": { - "type": "string" - } - }, - "required": ["serviceID"], - "additionalProperties": false + "properties": {} } }, "required": ["id", "type", "properties"], @@ -37564,6 +39043,82 @@ "required": ["id", "type", "properties"], "additionalProperties": false }, + "EventProjectDirectoriesUpdated": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": ["project.directories.updated"] + }, + "properties": { + "type": "object", + "properties": { + "projectID": { + "type": "string" + } + }, + "required": ["projectID"], + "additionalProperties": false + } + }, + "required": ["id", "type", "properties"], + "additionalProperties": false + }, + "EventFileEdited": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": ["file.edited"] + }, + "properties": { + "type": "object", + "properties": { + "file": { + "type": "string" + } + }, + "required": ["file"], + "additionalProperties": false + } + }, + "required": ["id", "type", "properties"], + "additionalProperties": false + }, + "EventFileWatcherUpdated": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": ["file.watcher.updated"] + }, + "properties": { + "type": "object", + "properties": { + "file": { + "type": "string" + }, + "event": { + "type": "string", + "enum": ["add", "change", "unlink"] + } + }, + "required": ["file", "event"], + "additionalProperties": false + } + }, + "required": ["id", "type", "properties"], + "additionalProperties": false + }, "EventPtyCreated": { "type": "object", "properties": { @@ -37831,6 +39386,403 @@ "required": ["id", "type", "properties"], "additionalProperties": false }, + "EventTodoUpdated": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": ["todo.updated"] + }, + "properties": { + "type": "object", + "properties": { + "sessionID": { + "type": "string", + "pattern": "^ses" + }, + "todos": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Todo" + } + } + }, + "required": ["sessionID", "todos"], + "additionalProperties": false + } + }, + "required": ["id", "type", "properties"], + "additionalProperties": false + }, + "EventSessionStatus": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": ["session.status"] + }, + "properties": { + "type": "object", + "properties": { + "sessionID": { + "type": "string", + "pattern": "^ses" + }, + "status": { + "$ref": "#/components/schemas/SessionStatus" + } + }, + "required": ["sessionID", "status"], + "additionalProperties": false + } + }, + "required": ["id", "type", "properties"], + "additionalProperties": false + }, + "EventSessionIdle": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": ["session.idle"] + }, + "properties": { + "type": "object", + "properties": { + "sessionID": { + "type": "string", + "pattern": "^ses" + } + }, + "required": ["sessionID"], + "additionalProperties": false + } + }, + "required": ["id", "type", "properties"], + "additionalProperties": false + }, + "EventSessionCompacted": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": ["session.compacted"] + }, + "properties": { + "type": "object", + "properties": { + "sessionID": { + "type": "string", + "pattern": "^ses" + } + }, + "required": ["sessionID"], + "additionalProperties": false + } + }, + "required": ["id", "type", "properties"], + "additionalProperties": false + }, + "EventCommandExecuted": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": ["command.executed"] + }, + "properties": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "sessionID": { + "type": "string", + "pattern": "^ses" + }, + "arguments": { + "type": "string" + }, + "messageID": { + "type": "string", + "pattern": "^msg" + } + }, + "required": ["name", "sessionID", "arguments", "messageID"], + "additionalProperties": false + } + }, + "required": ["id", "type", "properties"], + "additionalProperties": false + }, + "EventProjectUpdated": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": ["project.updated"] + }, + "properties": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "worktree": { + "type": "string" + }, + "vcs": { + "type": "string", + "enum": ["git"] + }, + "name": { + "type": "string" + }, + "icon": { + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "override": { + "type": "string" + }, + "color": { + "type": "string" + } + }, + "additionalProperties": false + }, + "commands": { + "type": "object", + "properties": { + "start": { + "type": "string", + "description": "Startup script to run when creating a new workspace (worktree)" + } + }, + "additionalProperties": false + }, + "time": { + "type": "object", + "properties": { + "created": { + "type": "integer", + "minimum": 0 + }, + "updated": { + "type": "integer", + "minimum": 0 + }, + "initialized": { + "type": "integer", + "minimum": 0 + } + }, + "required": ["created", "updated"], + "additionalProperties": false + }, + "sandboxes": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["id", "worktree", "time", "sandboxes"], + "additionalProperties": false + } + }, + "required": ["id", "type", "properties"], + "additionalProperties": false + }, + "EventLspUpdated": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": ["lsp.updated"] + }, + "properties": { + "type": "object", + "properties": {} + } + }, + "required": ["id", "type", "properties"], + "additionalProperties": false + }, + "EventVcsBranchUpdated": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": ["vcs.branch.updated"] + }, + "properties": { + "type": "object", + "properties": { + "branch": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "required": ["id", "type", "properties"], + "additionalProperties": false + }, + "EventWorkspaceReady": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": ["workspace.ready"] + }, + "properties": { + "type": "object", + "properties": { + "name": { + "type": "string" + } + }, + "required": ["name"], + "additionalProperties": false + } + }, + "required": ["id", "type", "properties"], + "additionalProperties": false + }, + "EventWorkspaceFailed": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": ["workspace.failed"] + }, + "properties": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + }, + "required": ["message"], + "additionalProperties": false + } + }, + "required": ["id", "type", "properties"], + "additionalProperties": false + }, + "EventWorkspaceStatus": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": ["workspace.status"] + }, + "properties": { + "type": "object", + "properties": { + "workspaceID": { + "type": "string", + "pattern": "^wrk" + }, + "status": { + "type": "string", + "enum": ["connected", "connecting", "disconnected", "error"] + } + }, + "required": ["workspaceID", "status"], + "additionalProperties": false + } + }, + "required": ["id", "type", "properties"], + "additionalProperties": false + }, + "EventWorktreeReady": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": ["worktree.ready"] + }, + "properties": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "branch": { + "type": "string" + } + }, + "required": ["name"], + "additionalProperties": false + } + }, + "required": ["id", "type", "properties"], + "additionalProperties": false + }, + "EventWorktreeFailed": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": ["worktree.failed"] + }, + "properties": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + }, + "required": ["message"], + "additionalProperties": false + } + }, + "required": ["id", "type", "properties"], + "additionalProperties": false + }, "SyncEventSessionCreated": { "type": "object", "properties": { @@ -39589,6 +41541,12 @@ ] } }, + "outputPaths": { + "type": "array", + "items": { + "type": "string" + } + }, "result": {}, "provider": { "type": "object", @@ -39817,59 +41775,6 @@ "required": ["type", "id", "syncEvent"], "additionalProperties": false }, - "SyncEventSessionNextCompactionDelta": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["sync"] - }, - "id": { - "type": "string", - "pattern": "^evt_" - }, - "syncEvent": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["session.next.compaction.delta.1"] - }, - "id": { - "type": "string", - "pattern": "^evt_" - }, - "seq": { - "type": "number" - }, - "aggregateID": { - "type": "string" - }, - "data": { - "type": "object", - "properties": { - "timestamp": { - "type": "number" - }, - "sessionID": { - "type": "string", - "pattern": "^ses" - }, - "text": { - "type": "string" - } - }, - "required": ["timestamp", "sessionID", "text"], - "additionalProperties": false - } - }, - "required": ["type", "id", "seq", "aggregateID", "data"], - "additionalProperties": false - } - }, - "required": ["type", "id", "syncEvent"], - "additionalProperties": false - }, "SyncEventSessionNextCompactionEnded": { "type": "object", "properties": { @@ -39908,9 +41813,20 @@ "type": "string", "pattern": "^ses" }, + "messageID": { + "type": "string", + "pattern": "^msg_" + }, + "reason": { + "type": "string", + "enum": ["auto", "manual"] + }, "text": { "type": "string" }, + "recent": { + "type": "string" + }, "include": { "type": "string" } @@ -39926,6 +41842,41 @@ "required": ["type", "id", "syncEvent"], "additionalProperties": false }, + "ConfigV2ReferenceGit": { + "type": "object", + "properties": { + "repository": { + "type": "string" + }, + "branch": { + "type": "string" + }, + "description": { + "type": "string" + }, + "hidden": { + "type": "boolean" + } + }, + "required": ["repository"], + "additionalProperties": false + }, + "ConfigV2ReferenceLocal": { + "type": "object", + "properties": { + "path": { + "type": "string" + }, + "description": { + "type": "string" + }, + "hidden": { + "type": "boolean" + } + }, + "required": ["path"], + "additionalProperties": false + }, "PolicyEffect": { "type": "string", "enum": ["allow", "deny"] @@ -39950,19 +41901,19 @@ "ProjectDirectories": { "type": "array", "items": { - "type": "string" + "type": "object", + "properties": { + "directory": { + "type": "string" + }, + "strategy": { + "type": "string" + } + }, + "required": ["directory"], + "additionalProperties": false } }, - "ProjectCopyCopy": { - "type": "object", - "properties": { - "directory": { - "type": "string" - } - }, - "required": ["directory"], - "additionalProperties": false - }, "LocationInfo": { "type": "object", "properties": { @@ -40327,12 +42278,6 @@ "$ref": "#/components/schemas/PromptAgentAttachment" } }, - "references": { - "type": "array", - "items": { - "$ref": "#/components/schemas/PromptReferenceAttachment" - } - }, "type": { "type": "string", "enum": ["user"] @@ -40560,6 +42505,12 @@ ] } }, + "outputPaths": { + "type": "array", + "items": { + "type": "string" + } + }, "structured": { "type": "object" }, @@ -40806,7 +42757,7 @@ "summary": { "type": "string" }, - "include": { + "recent": { "type": "string" }, "id": { @@ -40827,7 +42778,7 @@ "additionalProperties": false } }, - "required": ["type", "reason", "summary", "id", "time"], + "required": ["type", "reason", "summary", "recent", "id", "time"], "additionalProperties": false }, "SessionMessage": { @@ -40892,13 +42843,13 @@ "properties": { "via": { "type": "string", - "enum": ["account"] + "enum": ["credential"] }, - "service": { + "credentialID": { "type": "string" } }, - "required": ["via", "service"], + "required": ["via", "credentialID"], "additionalProperties": false }, { @@ -40984,6 +42935,295 @@ "required": ["id", "name", "enabled", "env", "api", "request"], "additionalProperties": false }, + "IntegrationWhen": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "op": { + "type": "string", + "enum": ["eq", "neq"] + }, + "value": { + "type": "string" + } + }, + "required": ["key", "op", "value"], + "additionalProperties": false + }, + "IntegrationTextPrompt": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["text"] + }, + "key": { + "type": "string" + }, + "message": { + "type": "string" + }, + "placeholder": { + "type": "string" + }, + "when": { + "$ref": "#/components/schemas/IntegrationWhen" + } + }, + "required": ["type", "key", "message"], + "additionalProperties": false + }, + "IntegrationSelectPrompt": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["select"] + }, + "key": { + "type": "string" + }, + "message": { + "type": "string" + }, + "options": { + "type": "array", + "items": { + "type": "object", + "properties": { + "label": { + "type": "string" + }, + "value": { + "type": "string" + }, + "hint": { + "type": "string" + } + }, + "required": ["label", "value"], + "additionalProperties": false + } + }, + "when": { + "$ref": "#/components/schemas/IntegrationWhen" + } + }, + "required": ["type", "key", "message", "options"], + "additionalProperties": false + }, + "IntegrationOAuthMethod": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": ["oauth"] + }, + "label": { + "type": "string" + }, + "prompts": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/IntegrationTextPrompt" + }, + { + "$ref": "#/components/schemas/IntegrationSelectPrompt" + } + ] + } + } + }, + "required": ["id", "type", "label"], + "additionalProperties": false + }, + "IntegrationKeyMethod": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["key"] + }, + "label": { + "type": "string" + } + }, + "required": ["type"], + "additionalProperties": false + }, + "IntegrationEnvMethod": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["env"] + }, + "names": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": ["type", "names"], + "additionalProperties": false + }, + "ConnectionCredentialInfo": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["credential"] + }, + "id": { + "type": "string" + }, + "label": { + "type": "string" + } + }, + "required": ["type", "id", "label"], + "additionalProperties": false + }, + "ConnectionEnvInfo": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["env"] + }, + "name": { + "type": "string" + } + }, + "required": ["type", "name"], + "additionalProperties": false + }, + "ConnectionInfo": { + "anyOf": [ + { + "$ref": "#/components/schemas/ConnectionCredentialInfo" + }, + { + "$ref": "#/components/schemas/ConnectionEnvInfo" + } + ] + }, + "IntegrationInfo": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "methods": { + "type": "array", + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/IntegrationOAuthMethod" + }, + { + "$ref": "#/components/schemas/IntegrationKeyMethod" + }, + { + "$ref": "#/components/schemas/IntegrationEnvMethod" + } + ] + } + }, + "connections": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConnectionInfo" + } + } + }, + "required": ["id", "name", "methods", "connections"], + "additionalProperties": false + }, + "IntegrationAttempt": { + "type": "object", + "properties": { + "attemptID": { + "type": "string" + }, + "url": { + "type": "string" + }, + "instructions": { + "type": "string" + }, + "mode": { + "type": "string", + "enum": ["auto", "code"] + }, + "time": { + "type": "object", + "properties": { + "created": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + }, + "expires": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + }, + { + "type": "string", + "enum": ["Infinity", "-Infinity", "NaN"] + } + ] + } + }, + "required": ["created", "expires"], + "additionalProperties": false + } + }, + "required": ["attemptID", "url", "instructions", "mode", "time"], + "additionalProperties": false + }, "PermissionV2Request": { "type": "object", "properties": { @@ -41039,53 +43279,12 @@ "required": ["id", "projectID", "action", "resource"], "additionalProperties": false }, - "FileSystemTextContent": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["text"] - }, - "content": { - "type": "string" - }, - "mime": { - "type": "string" - } - }, - "required": ["type", "content", "mime"], - "additionalProperties": false - }, - "FileSystemBinaryContent": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["binary"] - }, - "content": { - "type": "string" - }, - "encoding": { - "type": "string", - "enum": ["base64"] - }, - "mime": { - "type": "string" - } - }, - "required": ["type", "content", "encoding", "mime"], - "additionalProperties": false - }, "FileSystemEntry": { "type": "object", "properties": { "path": { "type": "string" }, - "uri": { - "type": "string" - }, "type": { "type": "string", "enum": ["file", "directory"] @@ -41094,7 +43293,7 @@ "type": "string" } }, - "required": ["path", "uri", "type", "mime"], + "required": ["path", "type", "mime"], "additionalProperties": false }, "CommandV2Info": { @@ -41196,6 +43395,88 @@ "required": ["answers"], "additionalProperties": false }, + "ReferenceLocalSource": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["local"] + }, + "path": { + "type": "string" + }, + "description": { + "type": "string" + }, + "hidden": { + "type": "boolean" + } + }, + "required": ["type", "path"], + "additionalProperties": false + }, + "ReferenceGitSource": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["git"] + }, + "repository": { + "type": "string" + }, + "branch": { + "type": "string" + }, + "description": { + "type": "string" + }, + "hidden": { + "type": "boolean" + } + }, + "required": ["type", "repository"], + "additionalProperties": false + }, + "ReferenceInfo": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "path": { + "type": "string" + }, + "description": { + "type": "string" + }, + "hidden": { + "type": "boolean" + }, + "source": { + "anyOf": [ + { + "$ref": "#/components/schemas/ReferenceLocalSource" + }, + { + "$ref": "#/components/schemas/ReferenceGitSource" + } + ] + } + }, + "required": ["name", "path", "source"], + "additionalProperties": false + }, + "ProjectCopyCopy": { + "type": "object", + "properties": { + "directory": { + "type": "string" + } + }, + "required": ["directory"], + "additionalProperties": false + }, "EventMemoryStatus1": { "type": "object", "properties": { @@ -42189,6 +44470,154 @@ "body": { "type": "object" }, + "generation": { + "type": "object", + "properties": { + "maxTokens": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + } + ] + }, + "temperature": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + } + ] + }, + "topP": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + } + ] + }, + "topK": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + } + ] + }, + "frequencyPenalty": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + } + ] + }, + "presencePenalty": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + } + ] + }, + "seed": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + } + ] + }, + "stop": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "options": { + "type": "object" + }, "variant": { "type": "string" } @@ -42212,6 +44641,154 @@ }, "body": { "type": "object" + }, + "generation": { + "type": "object", + "properties": { + "maxTokens": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + } + ] + }, + "temperature": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + } + ] + }, + "topP": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + } + ] + }, + "topK": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + } + ] + }, + "frequencyPenalty": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + } + ] + }, + "presencePenalty": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + } + ] + }, + "seed": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": ["NaN"] + }, + { + "type": "string", + "enum": ["Infinity"] + }, + { + "type": "string", + "enum": ["-Infinity"] + } + ] + }, + "stop": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + }, + "options": { + "type": "object" } }, "required": ["id", "headers", "body"], @@ -42431,7 +45008,7 @@ }, { "name": "projectCopy", - "description": "Project copy management routes." + "description": "Project copy naming routes." }, { "name": "pty", @@ -42542,64 +45119,72 @@ "description": "Kilo memory routes." }, { - "name": "kilo experimental HttpApi", + "name": "Kilo HttpApi", "description": "Experimental HttpApi surface for selected instance routes." }, { - "name": "kilo experimental HttpApi", + "name": "Kilo HttpApi", "description": "Experimental HttpApi surface for selected instance routes." }, { - "name": "v2", - "description": "Experimental v2 routes." + "name": "Kilo HttpApi", + "description": "Experimental HttpApi surface for selected instance routes." }, { - "name": "v2 messages", - "description": "Experimental v2 message routes." + "name": "sessions", + "description": "Experimental session routes." }, { - "name": "v2 models", - "description": "Experimental v2 model routes." + "name": "messages", + "description": "Experimental message routes." }, { - "name": "v2 providers", - "description": "Experimental v2 provider routes." + "name": "models", + "description": "Experimental model routes." }, { - "name": "v2 permissions", - "description": "Experimental v2 permission routes." + "name": "providers", + "description": "Experimental provider routes." }, { - "name": "v2 session permissions", - "description": "Experimental v2 session permission routes." + "name": "integrations", + "description": "Integration discovery and authentication routes." }, { - "name": "v2 saved permissions", - "description": "Experimental v2 saved permission routes." + "name": "Kilo HttpApi", + "description": "Experimental HttpApi surface for selected instance routes." }, { - "name": "v2 filesystem", - "description": "Experimental v2 location-scoped filesystem routes." + "name": "permissions", + "description": "Experimental permission routes." }, { - "name": "v2 commands", - "description": "Experimental v2 command routes." + "name": "filesystem", + "description": "Experimental location-scoped filesystem routes." }, { - "name": "v2 skills", - "description": "Experimental v2 skill routes." + "name": "commands", + "description": "Experimental command routes." }, { - "name": "v2 events", - "description": "Experimental v2 event stream route." + "name": "skills", + "description": "Experimental skill routes." }, { - "name": "v2 questions", - "description": "Experimental v2 question routes." + "name": "events", + "description": "Experimental event stream route." }, { - "name": "v2 session questions", - "description": "Experimental v2 session question routes." + "name": "session questions", + "description": "Experimental session question routes." + }, + { + "name": "reference", + "description": "Location-scoped project references." + }, + { + "name": "projectCopy", + "description": "Project copy management routes." }, { "name": "pty", From b71a9c0c234cb2fbb55712e4e995e261dde9fab5 Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Mon, 27 Jul 2026 22:10:56 -0400 Subject: [PATCH 07/29] fix(vscode): include web search in config exports --- .../webview-ui/src/components/settings/settings-io.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/kilo-vscode/webview-ui/src/components/settings/settings-io.ts b/packages/kilo-vscode/webview-ui/src/components/settings/settings-io.ts index d4b1949d2a..be43b46284 100644 --- a/packages/kilo-vscode/webview-ui/src/components/settings/settings-io.ts +++ b/packages/kilo-vscode/webview-ui/src/components/settings/settings-io.ts @@ -34,6 +34,7 @@ export const KNOWN_KEYS: ReadonlyArray = [ "compaction", "commit_message", "tools", + "web_search", "auto_collapse_reasoning", "terminal_command_display", "code_edit_display", From b0a546049e7fcb212c8d1db344a48531ce65bed9 Mon Sep 17 00:00:00 2001 From: marius-kilocode Date: Tue, 28 Jul 2026 13:42:15 +0200 Subject: [PATCH 08/29] refactor(cli): remove provably unused kilocode code Delete code with zero references anywhere in the monorepo (including tests, docs, scripts, and dynamic import or string-based usage): - background-process/windows-job.ts: entire Windows Job Object FFI module left unreferenced after the background process runner refactor - session/prompt.ts: createShellDecoders helper, CODE_SWITCH_TEXT alias, and the now-unused StringDecoder import - text-stream.ts: openUtf8 wrapper - cli/cmd/tui/component/prompt/vim.ts: enterInsert helper - config/config.ts: KILO_CONFIG_FILES, AGENT_PATTERNS, COMMAND_PATTERNS - remote-attachments.ts: TEXT_PLAIN constant - plan-followup.ts: PLAN_PREFIX constant - server/httpapi/groups/background-process.ts: SessionParams schema - server/httpapi/groups/session-import.ts: SessionImportPayloads map - cloud/contracts.ts: RepositoryInput type alias --- .../background-process/windows-job.ts | 88 ------------------- .../cli/cmd/tui/component/prompt/vim.ts | 5 -- .../opencode/src/kilocode/cloud/contracts.ts | 1 - .../opencode/src/kilocode/config/config.ts | 14 --- .../opencode/src/kilocode/plan-followup.ts | 1 - .../src/kilocode/remote-attachments.ts | 1 - .../httpapi/groups/background-process.ts | 1 - .../server/httpapi/groups/session-import.ts | 7 -- .../opencode/src/kilocode/session/prompt.ts | 26 ------ packages/opencode/src/kilocode/text-stream.ts | 5 -- 10 files changed, 149 deletions(-) delete mode 100644 packages/opencode/src/kilocode/background-process/windows-job.ts diff --git a/packages/opencode/src/kilocode/background-process/windows-job.ts b/packages/opencode/src/kilocode/background-process/windows-job.ts deleted file mode 100644 index 85d05b38e6..0000000000 --- a/packages/opencode/src/kilocode/background-process/windows-job.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { dlopen, ptr } from "bun:ffi" - -export namespace WindowsJob { - const LIMITS = 9 - const MEMBERS = 3 - const KILL_ON_CLOSE = 0x00002000 - const PROCESS_TERMINATE = 0x0001 - const PROCESS_SET_QUOTA = 0x0100 - const MORE_DATA = 234 - - function kernel() { - return dlopen("kernel32.dll", { - CreateJobObjectW: { args: ["ptr", "ptr"], returns: "u64" }, - SetInformationJobObject: { args: ["u64", "u32", "ptr", "u32"], returns: "i32" }, - OpenProcess: { args: ["u32", "i32", "u32"], returns: "u64" }, - AssignProcessToJobObject: { args: ["u64", "u64"], returns: "i32" }, - QueryInformationJobObject: { args: ["u64", "u32", "ptr", "u32", "ptr"], returns: "i32" }, - TerminateJobObject: { args: ["u64", "u32"], returns: "i32" }, - CloseHandle: { args: ["u64"], returns: "i32" }, - GetLastError: { args: [], returns: "u32" }, - }) - } - - export function create() { - const lib = (() => { - try { - return kernel() - } catch { - return undefined - } - })() - if (!lib) return - const handle = lib.symbols.CreateJobObjectW(null, null) - if (handle === 0n) { - const code = lib.symbols.GetLastError() - lib.close() - throw new Error(`CreateJobObjectW failed with Windows error ${code}`) - } - const limits = new Uint8Array(144) - new DataView(limits.buffer).setUint32(16, KILL_ON_CLOSE, true) - if (lib.symbols.SetInformationJobObject(handle, LIMITS, ptr(limits), limits.byteLength) === 0) { - const code = lib.symbols.GetLastError() - lib.symbols.CloseHandle(handle) - lib.close() - throw new Error(`SetInformationJobObject failed with Windows error ${code}`) - } - let closed = false - return { - assign(pid: number) { - const proc = lib.symbols.OpenProcess(PROCESS_TERMINATE | PROCESS_SET_QUOTA, 0, pid) - if (proc === 0n) throw new Error(`OpenProcess failed with Windows error ${lib.symbols.GetLastError()}`) - const assigned = lib.symbols.AssignProcessToJobObject(handle, proc) - const code = assigned === 0 ? lib.symbols.GetLastError() : 0 - lib.symbols.CloseHandle(proc) - if (assigned === 0) throw new Error(`AssignProcessToJobObject failed with Windows error ${code}`) - }, - members() { - let size = 4 * 1024 - while (true) { - const info = new Uint8Array(size) - const ok = lib.symbols.QueryInformationJobObject(handle, MEMBERS, ptr(info), info.byteLength, null) - const code = ok === 0 ? lib.symbols.GetLastError() : 0 - const view = new DataView(info.buffer) - const assigned = view.getUint32(0, true) - const count = view.getUint32(4, true) - if (ok !== 0 && count === assigned) { - return Array.from({ length: count }, (_, index) => Number(view.getBigUint64(8 + index * 8, true))) - } - if (ok === 0 && code !== MORE_DATA) { - throw new Error(`QueryInformationJobObject failed with Windows error ${code}`) - } - size = Math.max(size * 2, 8 + assigned * 8) - } - }, - terminate() { - if (lib.symbols.TerminateJobObject(handle, 1) === 0) { - throw new Error(`TerminateJobObject failed with Windows error ${lib.symbols.GetLastError()}`) - } - }, - close() { - if (closed) return - closed = true - lib.symbols.CloseHandle(handle) - lib.close() - }, - } - } -} diff --git a/packages/opencode/src/kilocode/cli/cmd/tui/component/prompt/vim.ts b/packages/opencode/src/kilocode/cli/cmd/tui/component/prompt/vim.ts index 2b91606c86..020d0be379 100644 --- a/packages/opencode/src/kilocode/cli/cmd/tui/component/prompt/vim.ts +++ b/packages/opencode/src/kilocode/cli/cmd/tui/component/prompt/vim.ts @@ -877,8 +877,3 @@ export function handleVisualKey(doc: VimDoc, state: VimState, input: VimKey): Vi state.countDigits = "" return { handled: true } } - -export function enterInsert(state: VimState) { - state.mode = "insert" - resetPending(state) -} diff --git a/packages/opencode/src/kilocode/cloud/contracts.ts b/packages/opencode/src/kilocode/cloud/contracts.ts index a4716e547e..a78b846b8c 100644 --- a/packages/opencode/src/kilocode/cloud/contracts.ts +++ b/packages/opencode/src/kilocode/cloud/contracts.ts @@ -163,7 +163,6 @@ export const GetMessageResultOutputSchema = z } }) -export type RepositoryInput = z.infer export type AgentStartRequest = z.infer export type AgentSendRequest = z.infer export type GetMessageResultInput = z.infer diff --git a/packages/opencode/src/kilocode/config/config.ts b/packages/opencode/src/kilocode/config/config.ts index a33445494b..608386d4fa 100644 --- a/packages/opencode/src/kilocode/config/config.ts +++ b/packages/opencode/src/kilocode/config/config.ts @@ -37,26 +37,12 @@ export namespace KilocodeConfig { // ── Config file constants ──────────────────────────────────────────── - /** Kilo-specific config file names (highest-to-lowest precedence within kilo). */ - export const KILO_CONFIG_FILES = ["kilo.jsonc", "kilo.json"] as const - /** All config file names in precedence order (kilo + opencode). */ export const ALL_CONFIG_FILES = ["kilo.jsonc", "kilo.json", "opencode.jsonc", "opencode.json"] as const /** Config directory suffixes in update-target preference order. */ export const KILO_DIR_SUFFIXES = [".kilo", ".kilocode"] as const - /** Path patterns for resolving kilo agent names from file paths. */ - export const AGENT_PATTERNS = ["/.kilo/agent/", "/.kilo/agents/", "/.kilocode/agent/", "/.kilocode/agents/"] as const - - /** Path patterns for resolving kilo command names from file paths. */ - export const COMMAND_PATTERNS = [ - "/.kilo/command/", - "/.kilo/commands/", - "/.kilocode/command/", - "/.kilocode/commands/", - ] as const - /** * Choose the project config file that Config.update should patch. * diff --git a/packages/opencode/src/kilocode/plan-followup.ts b/packages/opencode/src/kilocode/plan-followup.ts index 01de704a54..a0c726f94c 100644 --- a/packages/opencode/src/kilocode/plan-followup.ts +++ b/packages/opencode/src/kilocode/plan-followup.ts @@ -157,7 +157,6 @@ export async function generateHandover(input: { export namespace PlanFollowup { const log = Log.create({ service: "plan.followup" }) - export const PLAN_PREFIX = "Implement the following plan:" export const ANSWER_NEW_SESSION = "Start new session" export const ANSWER_CONTINUE = "Continue here" export const ANSWER_KEEP_REFINING = "Keep refining" diff --git a/packages/opencode/src/kilocode/remote-attachments.ts b/packages/opencode/src/kilocode/remote-attachments.ts index 9008065cc9..b329dbb47d 100644 --- a/packages/opencode/src/kilocode/remote-attachments.ts +++ b/packages/opencode/src/kilocode/remote-attachments.ts @@ -66,7 +66,6 @@ export namespace RemoteAttachments { sql: "text/plain", } export const BINARY_MIME = "application/octet-stream" - export const TEXT_PLAIN = "text/plain" // Hard cap on attachment bytes (5 MB + 1 byte so the helper aborts // strictly when the body exceeds the agreed ceiling). export const MAX_BYTES = 5 * 1024 * 1024 + 1 diff --git a/packages/opencode/src/kilocode/server/httpapi/groups/background-process.ts b/packages/opencode/src/kilocode/server/httpapi/groups/background-process.ts index e5b0dbc2dc..208cd1f021 100644 --- a/packages/opencode/src/kilocode/server/httpapi/groups/background-process.ts +++ b/packages/opencode/src/kilocode/server/httpapi/groups/background-process.ts @@ -22,7 +22,6 @@ export const BackgroundProcessPaths = { } as const export const Params = Schema.Struct({ processID: BackgroundProcess.ID }) -export const SessionParams = Schema.Struct({ sessionID: SessionID }) export const BackgroundProcessApi = HttpApi.make("background-process") .add( diff --git a/packages/opencode/src/kilocode/server/httpapi/groups/session-import.ts b/packages/opencode/src/kilocode/server/httpapi/groups/session-import.ts index 596ca4f57d..9aca9d4581 100644 --- a/packages/opencode/src/kilocode/server/httpapi/groups/session-import.ts +++ b/packages/opencode/src/kilocode/server/httpapi/groups/session-import.ts @@ -219,13 +219,6 @@ export const SessionImportPaths = { part: `${root}/part`, } as const -export const SessionImportPayloads = { - Project: ProjectSchema, - Session: SessionSchema, - Message: MessageSchema, - Part: PartSchema, -} as const - export const SessionImportApi = HttpApi.make("session-import") .add( HttpApiGroup.make("session-import") diff --git a/packages/opencode/src/kilocode/session/prompt.ts b/packages/opencode/src/kilocode/session/prompt.ts index a1fa29b806..ee05f45358 100644 --- a/packages/opencode/src/kilocode/session/prompt.ts +++ b/packages/opencode/src/kilocode/session/prompt.ts @@ -1,7 +1,6 @@ // kilocode_change - new file import path from "path" import fs from "fs/promises" -import { StringDecoder } from "string_decoder" import { Cause, Effect, Exit, Fiber, Scope } from "effect" import { SessionID, PartID } from "@/session/schema" import { MessageV2 } from "@/session/message-v2" @@ -377,25 +376,6 @@ export namespace KiloSessionPrompt { } } - /** - * Creates StringDecoder-based helpers for shell stdout/stderr that correctly - * handle multi-byte UTF-8 characters split across chunks. - */ - export function createShellDecoders() { - const stdout = new StringDecoder("utf8") - const stderr = new StringDecoder("utf8") - return { - /** Decode a chunk from the given stream. */ - write(stream: "stdout" | "stderr", chunk: Buffer) { - return stream === "stdout" ? stdout.write(chunk) : stderr.write(chunk) - }, - /** Flush any trailing buffered bytes from both decoders. */ - flush() { - return stdout.end() + stderr.end() - }, - } - } - /** * Ensures the plan file directory exists. Pre-checks with `Filesystem.isDir` * because `fs.mkdir(recursive: true)` still throws `EEXIST` on Windows @@ -455,12 +435,6 @@ export namespace KiloSessionPrompt { add(`\n${body}\n`) } - /** - * Returns the CODE_SWITCH prompt text (plan-to-code transition). - * Used when switching from plan agent to code agent. - */ - export const CODE_SWITCH_TEXT = CODE_SWITCH - /** * Determines the close reason for a session turn. * Checks for an explicit reason first (e.g. set on error during runLoop), diff --git a/packages/opencode/src/kilocode/text-stream.ts b/packages/opencode/src/kilocode/text-stream.ts index 82f2f6cd7c..bfaabd164e 100644 --- a/packages/opencode/src/kilocode/text-stream.ts +++ b/packages/opencode/src/kilocode/text-stream.ts @@ -62,11 +62,6 @@ export function abortable(stream: Readable, signal?: AbortSignal) { return signal ? addAbortSignal(signal, stream) : stream } -/** UTF-8 text stream backed by an already-open file. */ -export function openUtf8(open: () => Readable, signal?: AbortSignal): Readable { - return utf8(open, signal).stream -} - export function safeSlice(text: string, end: number) { const sliced = text.slice(0, end) const last = sliced.charCodeAt(sliced.length - 1) From eeb8c40af8faf262100b1f1b7a982e2983eaa8f9 Mon Sep 17 00:00:00 2001 From: emilieschario <14057155+emilieschario@users.noreply.github.com> Date: Wed, 29 Jul 2026 16:00:02 +0000 Subject: [PATCH 09/29] docs(kilo-docs): add CLI usage section for Cloud Agents Add documentation on how to start tasks from the CLI using the `kilo cloud` command and clarify how skills are handled in Cloud Agent sessions. Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com> --- .../pages/code-with-ai/platforms/cloud-agent.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/kilo-docs/pages/code-with-ai/platforms/cloud-agent.md b/packages/kilo-docs/pages/code-with-ai/platforms/cloud-agent.md index 5a9fe22b84..294b8bdd02 100644 --- a/packages/kilo-docs/pages/code-with-ai/platforms/cloud-agent.md +++ b/packages/kilo-docs/pages/code-with-ai/platforms/cloud-agent.md @@ -36,6 +36,16 @@ Before using Cloud Agents: Your work is always pushed to GitHub, ensuring nothing is lost. +## Starting Tasks from the CLI + +Use the `kilo cloud` command to run Cloud Agent tasks without opening the browser: + +```bash +kilo cloud start --prompt "Fix the flaky login test" --repo Kilo-Org/kilocode +``` + +`kilo cloud` can start tasks, send follow-up prompts, and check task status and results. Repository, branch, model, mode, and organization are inferred from your local checkout and CLI defaults unless you pass the matching flags. Add `--stream` to `kilo cloud start` to print task events as JSONL until the task completes. See the [CLI reference](/docs/code-with-ai/platforms/cli-reference#kilo-cloud) for all commands and options. + ## How Cloud Agents Work - Each user receives an **isolated Linux container** with common dev tools preinstalled (Node.js, git, gh CLI, glab CLI, etc.). @@ -98,6 +108,8 @@ You can customize each Cloud Agent session by also defining env vars and startup Cloud Agents support project-level [skills](/docs/code-with-ai/platforms/cli#skills) stored in your repository. When your repo is cloned, any skills in `.kilocode/skills/` are automatically available. +- Skills (skill folders uploaded as `.zip` archives, with up to 40 companion files per skill) + {% callout type="note" %} Global skills (`~/.kilocode/skills/`) are not available in Cloud Agents since there is no persistent user home directory. {% /callout %} From 0912f94cb164cd117185e8fdbbceda9915b1365c Mon Sep 17 00:00:00 2001 From: "kiloconnect[bot]" <240665456+kiloconnect[bot]@users.noreply.github.com> Date: Wed, 29 Jul 2026 16:31:59 +0000 Subject: [PATCH 10/29] docs(kilo-docs): rewrite skill archive bullet as prose --- packages/kilo-docs/pages/code-with-ai/platforms/cloud-agent.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kilo-docs/pages/code-with-ai/platforms/cloud-agent.md b/packages/kilo-docs/pages/code-with-ai/platforms/cloud-agent.md index 294b8bdd02..40c573ce58 100644 --- a/packages/kilo-docs/pages/code-with-ai/platforms/cloud-agent.md +++ b/packages/kilo-docs/pages/code-with-ai/platforms/cloud-agent.md @@ -108,7 +108,7 @@ You can customize each Cloud Agent session by also defining env vars and startup Cloud Agents support project-level [skills](/docs/code-with-ai/platforms/cli#skills) stored in your repository. When your repo is cloned, any skills in `.kilocode/skills/` are automatically available. -- Skills (skill folders uploaded as `.zip` archives, with up to 40 companion files per skill) +You can also upload skills as `.zip` archives through the Cloud UI. Each skill archive can include up to 40 companion files. {% callout type="note" %} Global skills (`~/.kilocode/skills/`) are not available in Cloud Agents since there is no persistent user home directory. From cf9c9dc34979ba5c780aece9e0c6d562478638ff Mon Sep 17 00:00:00 2001 From: "kiloconnect[bot]" <240665456+kiloconnect[bot]@users.noreply.github.com> Date: Wed, 29 Jul 2026 16:32:12 +0000 Subject: [PATCH 11/29] docs(kilo-docs): fold orphaned skills bullet into paragraph --- .../kilo-docs/pages/code-with-ai/platforms/cloud-agent.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/kilo-docs/pages/code-with-ai/platforms/cloud-agent.md b/packages/kilo-docs/pages/code-with-ai/platforms/cloud-agent.md index 40c573ce58..bc21780063 100644 --- a/packages/kilo-docs/pages/code-with-ai/platforms/cloud-agent.md +++ b/packages/kilo-docs/pages/code-with-ai/platforms/cloud-agent.md @@ -106,9 +106,7 @@ You can customize each Cloud Agent session by also defining env vars and startup ## Skills -Cloud Agents support project-level [skills](/docs/code-with-ai/platforms/cli#skills) stored in your repository. When your repo is cloned, any skills in `.kilocode/skills/` are automatically available. - -You can also upload skills as `.zip` archives through the Cloud UI. Each skill archive can include up to 40 companion files. +Cloud Agents support project-level [skills](/docs/code-with-ai/platforms/cli#skills) stored in your repository. When your repo is cloned, any skills in `.kilocode/skills/` are automatically available. Skill folders are uploaded as `.zip` archives, with up to 40 companion files per skill. {% callout type="note" %} Global skills (`~/.kilocode/skills/`) are not available in Cloud Agents since there is no persistent user home directory. From 3a2309cff0987bf10066ea056346f2b94b8192dc Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Wed, 29 Jul 2026 21:57:51 -0400 Subject: [PATCH 12/29] fix(vscode): clarify web search config scope --- .../src/routes/config/ToolsRoute.tsx | 2 +- .../src/components/settings/BrowserTab.tsx | 24 +++++++++++++++---- .../kilo-vscode/webview-ui/src/i18n/ar.ts | 5 ++-- .../kilo-vscode/webview-ui/src/i18n/br.ts | 6 ++--- .../kilo-vscode/webview-ui/src/i18n/bs.ts | 6 ++--- .../kilo-vscode/webview-ui/src/i18n/da.ts | 6 ++--- .../kilo-vscode/webview-ui/src/i18n/de.ts | 6 ++--- .../kilo-vscode/webview-ui/src/i18n/en.ts | 6 ++--- .../kilo-vscode/webview-ui/src/i18n/es.ts | 6 ++--- .../kilo-vscode/webview-ui/src/i18n/fa.ts | 7 +++++- .../kilo-vscode/webview-ui/src/i18n/fr.ts | 5 ++-- .../kilo-vscode/webview-ui/src/i18n/it.ts | 6 ++--- .../kilo-vscode/webview-ui/src/i18n/ja.ts | 6 ++--- .../kilo-vscode/webview-ui/src/i18n/ko.ts | 6 ++--- .../kilo-vscode/webview-ui/src/i18n/nl.ts | 6 ++--- .../kilo-vscode/webview-ui/src/i18n/no.ts | 6 ++--- .../kilo-vscode/webview-ui/src/i18n/pl.ts | 6 ++--- .../kilo-vscode/webview-ui/src/i18n/ru.ts | 6 ++--- .../kilo-vscode/webview-ui/src/i18n/th.ts | 6 ++--- .../kilo-vscode/webview-ui/src/i18n/tr.ts | 5 ++-- .../kilo-vscode/webview-ui/src/i18n/uk.ts | 6 ++--- .../kilo-vscode/webview-ui/src/i18n/zh.ts | 4 ++-- .../kilo-vscode/webview-ui/src/i18n/zht.ts | 4 ++-- packages/sdk/openapi.json | 7 +++--- 24 files changed, 69 insertions(+), 84 deletions(-) diff --git a/packages/kilo-console/src/routes/config/ToolsRoute.tsx b/packages/kilo-console/src/routes/config/ToolsRoute.tsx index 9dcb20b6e0..1dd1001e66 100644 --- a/packages/kilo-console/src/routes/config/ToolsRoute.tsx +++ b/packages/kilo-console/src/routes/config/ToolsRoute.tsx @@ -83,7 +83,7 @@ export function ToolsRoute() { > Enable for all providers - Search requests connect directly to Exa or Parallel. + Search requests use Exa or Parallel. {(reason) => {reason()}} 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 fabc7858b8..eee016f3f5 100644 --- a/packages/kilo-vscode/webview-ui/src/components/settings/BrowserTab.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/settings/BrowserTab.tsx @@ -1,4 +1,4 @@ -import { Component, createSignal, onCleanup, onMount } from "solid-js" +import { Component, Show, createSignal, onCleanup, onMount } from "solid-js" import { Switch } from "@kilocode/kilo-ui/switch" import { Card } from "@kilocode/kilo-ui/card" import { useVSCode } from "../../context/vscode" @@ -26,7 +26,7 @@ const Header: Component<{ title: string }> = (props) => ( const BrowserTab: Component = () => { const { postMessage, onMessage } = useVSCode() const { t } = useLanguage() - const { config, updateConfig } = useConfig() + const { globalConfig, projectConfig, updateGlobalConfig } = useConfig() const [settings, setSettings] = createSignal({ enabled: false, @@ -52,9 +52,11 @@ const BrowserTab: Component = () => { } const updateWebsearch = (checked: boolean) => { - updateConfig({ web_search: checked }) + updateGlobalConfig({ web_search: checked }) } + const overridden = () => projectConfig().web_search !== undefined + return (
{/* Info text */} @@ -84,12 +86,24 @@ const BrowserTab: Component = () => { t("settings.config.scope.global")} + last={!overridden()} > - + {t("settings.webTools.webSearch.title")} + + t("settings.config.scope.local")} + last + > + + {`${t("settings.webTools.webSearch.title")} (${t("settings.config.scope.local")})`} + + +
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts index 3ac74a5dc5..3f5e3e6ce6 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts @@ -650,12 +650,11 @@ export const dict = { "settings.agentBehaviour.title": "سلوك الوكيل", "settings.autoApprove.title": "الموافقة التلقائية", "settings.webTools.title": "أدوات الويب", - "settings.webTools.description": "اضبط البحث على الويب وأتمتة المتصفح. تتصل طلبات البحث مباشرةً بـ Exa أو Parallel.", + "settings.webTools.description": "اضبط البحث على الويب وأتمتة المتصفح.", "settings.webTools.webSearch.enable": "تمكين لجميع المزوّدين", "settings.webTools.browserAutomation": "أتمتة المتصفح", "settings.webTools.webSearch.title": "البحث على الويب", - "settings.webTools.webSearch.description": - "اجعل البحث على الويب متاحًا لنماذج جميع المزوّدين. تتصل عمليات البحث مباشرةً بـ Exa أو Parallel.", + "settings.webTools.webSearch.description": "اجعل البحث على الويب متاحًا لنماذج جميع المزوّدين.", "settings.checkpoints.title": "نقاط التحقق", "settings.display.title": "العرض", "settings.autocomplete.title": "الإكمال التلقائي", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/br.ts b/packages/kilo-vscode/webview-ui/src/i18n/br.ts index 31a10d9a3d..494dabab5c 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/br.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/br.ts @@ -666,13 +666,11 @@ export const dict = { "settings.agentBehaviour.title": "Comportamento do Agente", "settings.autoApprove.title": "Aprovação Automática", "settings.webTools.title": "Ferramentas da Web", - "settings.webTools.description": - "Configure a pesquisa na web e a automação do navegador. As solicitações de pesquisa se conectam diretamente ao Exa ou Parallel.", + "settings.webTools.description": "Configure a pesquisa na web e a automação do navegador.", "settings.webTools.webSearch.enable": "Ativar para todos os provedores", "settings.webTools.browserAutomation": "Automação do navegador", "settings.webTools.webSearch.title": "Pesquisa na Web", - "settings.webTools.webSearch.description": - "Disponibilize a pesquisa na web para modelos de todos os provedores. As pesquisas se conectam diretamente ao Exa ou Parallel.", + "settings.webTools.webSearch.description": "Disponibilize a pesquisa na web para modelos de todos os provedores.", "settings.checkpoints.title": "Pontos de Verificação", "settings.display.title": "Exibição", "settings.autocomplete.title": "Autocompletar", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts index 98bdd64db1..59af81ddce 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts @@ -706,13 +706,11 @@ export const dict = { "settings.agentBehaviour.title": "Ponašanje agenta", "settings.autoApprove.title": "Automatsko odobravanje", "settings.webTools.title": "Web alati", - "settings.webTools.description": - "Konfigurišite web pretragu i automatizaciju preglednika. Zahtjevi za pretragu povezuju se direktno s Exa ili Parallel.", + "settings.webTools.description": "Konfigurišite web pretragu i automatizaciju preglednika.", "settings.webTools.webSearch.enable": "Omogući za sve pružaoce", "settings.webTools.browserAutomation": "Automatizacija preglednika", "settings.webTools.webSearch.title": "Web pretraga", - "settings.webTools.webSearch.description": - "Omogućite web pretragu modelima svih pružalaca. Pretrage se povezuju direktno s Exa ili Parallel.", + "settings.webTools.webSearch.description": "Omogućite web pretragu modelima svih pružalaca.", "settings.checkpoints.title": "Kontrolne tačke", "settings.display.title": "Prikaz", "settings.autocomplete.title": "Automatsko dovršavanje", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/da.ts b/packages/kilo-vscode/webview-ui/src/i18n/da.ts index cf802a1902..c89da39cc8 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/da.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/da.ts @@ -704,13 +704,11 @@ export const dict = { "settings.agentBehaviour.title": "Agentadfærd", "settings.autoApprove.title": "Automatisk godkendelse", "settings.webTools.title": "Webværktøjer", - "settings.webTools.description": - "Konfigurer websøgning og browserautomatisering. Søgeanmodninger sendes direkte til Exa eller Parallel.", + "settings.webTools.description": "Konfigurer websøgning og browserautomatisering.", "settings.webTools.webSearch.enable": "Aktivér for alle udbydere", "settings.webTools.browserAutomation": "Browserautomatisering", "settings.webTools.webSearch.title": "Websøgning", - "settings.webTools.webSearch.description": - "Gør websøgning tilgængelig for modeller fra alle udbydere. Søgninger sendes direkte til Exa eller Parallel.", + "settings.webTools.webSearch.description": "Gør websøgning tilgængelig for modeller fra alle udbydere.", "settings.checkpoints.title": "Kontrolpunkter", "settings.display.title": "Visning", "settings.autocomplete.title": "Autofuldførelse", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/de.ts b/packages/kilo-vscode/webview-ui/src/i18n/de.ts index 118f5bf286..755de779b5 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/de.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/de.ts @@ -717,13 +717,11 @@ export const dict = { "settings.agentBehaviour.title": "Agentenverhalten", "settings.autoApprove.title": "Automatisch genehmigen", "settings.webTools.title": "Web-Tools", - "settings.webTools.description": - "Konfigurieren Sie Websuche und Browserautomatisierung. Suchanfragen werden direkt an Exa oder Parallel gesendet.", + "settings.webTools.description": "Konfigurieren Sie Websuche und Browserautomatisierung.", "settings.webTools.webSearch.enable": "Für alle Anbieter aktivieren", "settings.webTools.browserAutomation": "Browserautomatisierung", "settings.webTools.webSearch.title": "Websuche", - "settings.webTools.webSearch.description": - "Machen Sie die Websuche für Modelle aller Anbieter verfügbar. Suchanfragen werden direkt an Exa oder Parallel gesendet.", + "settings.webTools.webSearch.description": "Machen Sie die Websuche für Modelle aller Anbieter verfügbar.", "settings.checkpoints.title": "Prüfpunkte", "settings.display.title": "Anzeige", "settings.autocomplete.title": "Autovervollständigung", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/en.ts b/packages/kilo-vscode/webview-ui/src/i18n/en.ts index 96ba232569..3f8a1b0186 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/en.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/en.ts @@ -623,13 +623,11 @@ export const dict = { "settings.agentBehaviour.title": "Agent Behaviour", "settings.autoApprove.title": "Auto-Approve", "settings.webTools.title": "Web Tools", - "settings.webTools.description": - "Configure web search and browser automation. Search requests connect directly to Exa or Parallel.", + "settings.webTools.description": "Configure web search and browser automation.", "settings.webTools.webSearch.enable": "Enable for All Providers", "settings.webTools.browserAutomation": "Browser Automation", "settings.webTools.webSearch.title": "Web Search", - "settings.webTools.webSearch.description": - "Make web search available to models from all providers. Searches connect directly to Exa or Parallel.", + "settings.webTools.webSearch.description": "Make web search available to models from all providers.", "settings.checkpoints.title": "Checkpoints", "settings.display.title": "Display", "settings.autocomplete.title": "Autocomplete", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/es.ts b/packages/kilo-vscode/webview-ui/src/i18n/es.ts index 90edf60e2a..815e038ced 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/es.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/es.ts @@ -711,13 +711,11 @@ export const dict = { "settings.agentBehaviour.title": "Comportamiento del agente", "settings.autoApprove.title": "Aprobación automática", "settings.webTools.title": "Herramientas web", - "settings.webTools.description": - "Configura la búsqueda web y la automatización del navegador. Las solicitudes de búsqueda se conectan directamente a Exa o Parallel.", + "settings.webTools.description": "Configura la búsqueda web y la automatización del navegador.", "settings.webTools.webSearch.enable": "Habilitar para todos los proveedores", "settings.webTools.browserAutomation": "Automatización del navegador", "settings.webTools.webSearch.title": "Búsqueda web", - "settings.webTools.webSearch.description": - "Permite que los modelos de todos los proveedores usen la búsqueda web. Las búsquedas se conectan directamente a Exa o Parallel.", + "settings.webTools.webSearch.description": "Permite que los modelos de todos los proveedores usen la búsqueda web.", "settings.checkpoints.title": "Puntos de control", "settings.display.title": "Pantalla", "settings.autocomplete.title": "Autocompletado", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/fa.ts b/packages/kilo-vscode/webview-ui/src/i18n/fa.ts index 02a2bf9ab5..47e6bc815c 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/fa.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/fa.ts @@ -624,7 +624,12 @@ export const dict = { "settings.agentBehaviour.title": "رفتار عامل", "settings.autoApprove.title": "تأیید خودکار", - "settings.browser.title": "مرورگر", + "settings.webTools.title": "ابزارهای وب", + "settings.webTools.description": "جستجوی وب و اتوماسیون مرورگر را پیکربندی کنید.", + "settings.webTools.webSearch.enable": "فعال‌سازی برای همه ارائه‌دهندگان", + "settings.webTools.browserAutomation": "اتوماسیون مرورگر", + "settings.webTools.webSearch.title": "جستجوی وب", + "settings.webTools.webSearch.description": "جستجوی وب را برای مدل‌های همه ارائه‌دهندگان در دسترس قرار دهید.", "settings.checkpoints.title": "نقاط بازیابی", "settings.display.title": "نمایش", "settings.autocomplete.title": "تکمیل خودکار", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts index 69a5692213..956fa4ba09 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts @@ -717,13 +717,12 @@ export const dict = { "settings.agentBehaviour.title": "Comportement de l'agent", "settings.autoApprove.title": "Approbation automatique", "settings.webTools.title": "Outils web", - "settings.webTools.description": - "Configurez la recherche web et l’automatisation du navigateur. Les requêtes de recherche se connectent directement à Exa ou Parallel.", + "settings.webTools.description": "Configurez la recherche web et l’automatisation du navigateur.", "settings.webTools.webSearch.enable": "Activer pour tous les fournisseurs", "settings.webTools.browserAutomation": "Automatisation du navigateur", "settings.webTools.webSearch.title": "Recherche web", "settings.webTools.webSearch.description": - "Rendez la recherche web disponible pour les modèles de tous les fournisseurs. Les recherches se connectent directement à Exa ou Parallel.", + "Rendez la recherche web disponible pour les modèles de tous les fournisseurs.", "settings.checkpoints.title": "Points de contrôle", "settings.display.title": "Affichage", "settings.autocomplete.title": "Autocomplétion", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/it.ts b/packages/kilo-vscode/webview-ui/src/i18n/it.ts index 2720738fbd..e299fc0a05 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/it.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/it.ts @@ -530,13 +530,11 @@ export const dict = { "settings.agentBehaviour.title": "Comportamento agente", "settings.autoApprove.title": "Approvazione automatica", "settings.webTools.title": "Strumenti web", - "settings.webTools.description": - "Configura la ricerca web e l'automazione del browser. Le richieste di ricerca si connettono direttamente a Exa o Parallel.", + "settings.webTools.description": "Configura la ricerca web e l'automazione del browser.", "settings.webTools.webSearch.enable": "Abilita per tutti i provider", "settings.webTools.browserAutomation": "Automazione del browser", "settings.webTools.webSearch.title": "Ricerca web", - "settings.webTools.webSearch.description": - "Rendi disponibile la ricerca web ai modelli di tutti i provider. Le ricerche si connettono direttamente a Exa o Parallel.", + "settings.webTools.webSearch.description": "Rendi disponibile la ricerca web ai modelli di tutti i provider.", "settings.checkpoints.title": "Checkpoint", "settings.display.title": "Visualizzazione", "settings.autocomplete.title": "Autocompletamento", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts index a911d6477c..668e6fe8ce 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts @@ -698,13 +698,11 @@ export const dict = { "settings.agentBehaviour.title": "エージェントの動作", "settings.autoApprove.title": "自動承認", "settings.webTools.title": "ウェブツール", - "settings.webTools.description": - "ウェブ検索とブラウザ自動化を設定します。検索リクエストは Exa または Parallel に直接接続されます。", + "settings.webTools.description": "ウェブ検索とブラウザ自動化を設定します。", "settings.webTools.webSearch.enable": "すべてのプロバイダーで有効化", "settings.webTools.browserAutomation": "ブラウザ自動化", "settings.webTools.webSearch.title": "ウェブ検索", - "settings.webTools.webSearch.description": - "すべてのプロバイダーのモデルでウェブ検索を利用できるようにします。検索は Exa または Parallel に直接接続されます。", + "settings.webTools.webSearch.description": "すべてのプロバイダーのモデルでウェブ検索を利用できるようにします。", "settings.checkpoints.title": "チェックポイント", "settings.display.title": "表示", "settings.autocomplete.title": "オートコンプリート", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts index a19ee0ddd0..2aad8394d5 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts @@ -658,13 +658,11 @@ export const dict = { "settings.agentBehaviour.title": "에이전트 동작", "settings.autoApprove.title": "자동 승인", "settings.webTools.title": "웹 도구", - "settings.webTools.description": - "웹 검색 및 브라우저 자동화를 구성합니다. 검색 요청은 Exa 또는 Parallel에 직접 연결됩니다.", + "settings.webTools.description": "웹 검색 및 브라우저 자동화를 구성합니다.", "settings.webTools.webSearch.enable": "모든 제공업체에 사용", "settings.webTools.browserAutomation": "브라우저 자동화", "settings.webTools.webSearch.title": "웹 검색", - "settings.webTools.webSearch.description": - "모든 제공업체의 모델에서 웹 검색을 사용할 수 있도록 합니다. 검색은 Exa 또는 Parallel에 직접 연결됩니다.", + "settings.webTools.webSearch.description": "모든 제공업체의 모델에서 웹 검색을 사용할 수 있도록 합니다.", "settings.checkpoints.title": "체크포인트", "settings.display.title": "디스플레이", "settings.autocomplete.title": "자동 완성", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts index 73af15b317..962fb6c92e 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts @@ -659,13 +659,11 @@ export const dict = { "settings.agentBehaviour.title": "Agent Gedrag", "settings.autoApprove.title": "Automatisch Goedkeuren", "settings.webTools.title": "Webtools", - "settings.webTools.description": - "Configureer zoeken op internet en browserautomatisering. Zoekopdrachten maken rechtstreeks verbinding met Exa of Parallel.", + "settings.webTools.description": "Configureer zoeken op internet en browserautomatisering.", "settings.webTools.webSearch.enable": "Inschakelen voor alle providers", "settings.webTools.browserAutomation": "Browserautomatisering", "settings.webTools.webSearch.title": "Zoeken op internet", - "settings.webTools.webSearch.description": - "Maak zoeken op internet beschikbaar voor modellen van alle providers. Zoekopdrachten maken rechtstreeks verbinding met Exa of Parallel.", + "settings.webTools.webSearch.description": "Maak zoeken op internet beschikbaar voor modellen van alle providers.", "settings.checkpoints.title": "Controlepunten", "settings.display.title": "Weergave", "settings.autocomplete.title": "Automatisch Aanvullen", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/no.ts b/packages/kilo-vscode/webview-ui/src/i18n/no.ts index f1e24a2656..e72c07b75c 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/no.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/no.ts @@ -666,13 +666,11 @@ export const dict = { "settings.agentBehaviour.title": "Agentoppførsel", "settings.autoApprove.title": "Automatisk godkjenning", "settings.webTools.title": "Nettverktøy", - "settings.webTools.description": - "Konfigurer nettsøk og nettleserautomatisering. Søk sendes direkte til Exa eller Parallel.", + "settings.webTools.description": "Konfigurer nettsøk og nettleserautomatisering.", "settings.webTools.webSearch.enable": "Aktiver for alle leverandører", "settings.webTools.browserAutomation": "Nettleserautomatisering", "settings.webTools.webSearch.title": "Nettsøk", - "settings.webTools.webSearch.description": - "Gjør nettsøk tilgjengelig for modeller fra alle leverandører. Søk sendes direkte til Exa eller Parallel.", + "settings.webTools.webSearch.description": "Gjør nettsøk tilgjengelig for modeller fra alle leverandører.", "settings.checkpoints.title": "Kontrollpunkter", "settings.display.title": "Visning", "settings.autocomplete.title": "Autofullfør", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts index 32c2384b34..435a35e6a9 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts @@ -662,13 +662,11 @@ export const dict = { "settings.agentBehaviour.title": "Zachowanie agenta", "settings.autoApprove.title": "Automatyczne zatwierdzanie", "settings.webTools.title": "Narzędzia internetowe", - "settings.webTools.description": - "Skonfiguruj wyszukiwanie w sieci i automatyzację przeglądarki. Żądania wyszukiwania łączą się bezpośrednio z Exa lub Parallel.", + "settings.webTools.description": "Skonfiguruj wyszukiwanie w sieci i automatyzację przeglądarki.", "settings.webTools.webSearch.enable": "Włącz dla wszystkich dostawców", "settings.webTools.browserAutomation": "Automatyzacja przeglądarki", "settings.webTools.webSearch.title": "Wyszukiwanie w sieci", - "settings.webTools.webSearch.description": - "Udostępnij wyszukiwanie w sieci modelom wszystkich dostawców. Wyszukiwania łączą się bezpośrednio z Exa lub Parallel.", + "settings.webTools.webSearch.description": "Udostępnij wyszukiwanie w sieci modelom wszystkich dostawców.", "settings.checkpoints.title": "Punkty kontrolne", "settings.display.title": "Wyświetlanie", "settings.autocomplete.title": "Autouzupełnianie", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts index 737da75a12..824ada6f69 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts @@ -703,13 +703,11 @@ export const dict = { "settings.agentBehaviour.title": "Поведение агента", "settings.autoApprove.title": "Автоодобрение", "settings.webTools.title": "Веб-инструменты", - "settings.webTools.description": - "Настройте веб-поиск и автоматизацию браузера. Поисковые запросы отправляются напрямую в Exa или Parallel.", + "settings.webTools.description": "Настройте веб-поиск и автоматизацию браузера.", "settings.webTools.webSearch.enable": "Включить для всех провайдеров", "settings.webTools.browserAutomation": "Автоматизация браузера", "settings.webTools.webSearch.title": "Веб-поиск", - "settings.webTools.webSearch.description": - "Сделайте веб-поиск доступным для моделей всех провайдеров. Поисковые запросы отправляются напрямую в Exa или Parallel.", + "settings.webTools.webSearch.description": "Сделайте веб-поиск доступным для моделей всех провайдеров.", "settings.checkpoints.title": "Контрольные точки", "settings.display.title": "Отображение", "settings.autocomplete.title": "Автодополнение", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/th.ts b/packages/kilo-vscode/webview-ui/src/i18n/th.ts index 18677db990..d0f653af10 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/th.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/th.ts @@ -696,13 +696,11 @@ export const dict = { "settings.agentBehaviour.title": "พฤติกรรมของเอเจนต์", "settings.autoApprove.title": "อนุมัติอัตโนมัติ", "settings.webTools.title": "เครื่องมือเว็บ", - "settings.webTools.description": - "กำหนดค่าการค้นหาเว็บและระบบอัตโนมัติของเบราว์เซอร์ คำขอค้นหาจะเชื่อมต่อโดยตรงกับ Exa หรือ Parallel", + "settings.webTools.description": "กำหนดค่าการค้นหาเว็บและระบบอัตโนมัติของเบราว์เซอร์", "settings.webTools.webSearch.enable": "เปิดใช้สำหรับผู้ให้บริการทั้งหมด", "settings.webTools.browserAutomation": "ระบบอัตโนมัติของเบราว์เซอร์", "settings.webTools.webSearch.title": "ค้นหาเว็บ", - "settings.webTools.webSearch.description": - "ทำให้โมเดลจากผู้ให้บริการทั้งหมดใช้การค้นหาเว็บได้ การค้นหาจะเชื่อมต่อโดยตรงกับ Exa หรือ Parallel", + "settings.webTools.webSearch.description": "ทำให้โมเดลจากผู้ให้บริการทั้งหมดใช้การค้นหาเว็บได้", "settings.checkpoints.title": "จุดตรวจสอบ", "settings.display.title": "การแสดงผล", "settings.autocomplete.title": "เติมข้อความอัตโนมัติ", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts index 1b2a6a3c70..6f6824da42 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts @@ -654,13 +654,12 @@ export const dict = { "settings.agentBehaviour.title": "Ajan Davranışı", "settings.autoApprove.title": "Otomatik Onay", "settings.webTools.title": "Web Araçları", - "settings.webTools.description": - "Web aramasını ve tarayıcı otomasyonunu yapılandırın. Arama istekleri doğrudan Exa veya Parallel'e bağlanır.", + "settings.webTools.description": "Web aramasını ve tarayıcı otomasyonunu yapılandırın.", "settings.webTools.webSearch.enable": "Tüm Sağlayıcılar İçin Etkinleştir", "settings.webTools.browserAutomation": "Tarayıcı Otomasyonu", "settings.webTools.webSearch.title": "Web Araması", "settings.webTools.webSearch.description": - "Web aramasını tüm sağlayıcıların modelleri için kullanılabilir hale getirin. Aramalar doğrudan Exa veya Parallel'e bağlanır.", + "Web aramasını tüm sağlayıcıların modelleri için kullanılabilir hale getirin.", "settings.checkpoints.title": "Kontrol Noktaları", "settings.display.title": "Görünüm", "settings.autocomplete.title": "Otomatik Tamamlama", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts index a9bca7db9e..f984d8f7a9 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts @@ -656,13 +656,11 @@ export const dict = { "settings.agentBehaviour.title": "Поведінка агента", "settings.autoApprove.title": "Автоматичне схвалення", "settings.webTools.title": "Вебінструменти", - "settings.webTools.description": - "Налаштуйте вебпошук і автоматизацію браузера. Пошукові запити надсилаються безпосередньо до Exa або Parallel.", + "settings.webTools.description": "Налаштуйте вебпошук і автоматизацію браузера.", "settings.webTools.webSearch.enable": "Увімкнути для всіх постачальників", "settings.webTools.browserAutomation": "Автоматизація браузера", "settings.webTools.webSearch.title": "Вебпошук", - "settings.webTools.webSearch.description": - "Зробіть вебпошук доступним для моделей усіх постачальників. Пошукові запити надсилаються безпосередньо до Exa або Parallel.", + "settings.webTools.webSearch.description": "Зробіть вебпошук доступним для моделей усіх постачальників.", "settings.checkpoints.title": "Контрольні точки", "settings.display.title": "Відображення", "settings.autocomplete.title": "Автодоповнення", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts index 35ca21a4fd..9d14ba7eda 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts @@ -680,11 +680,11 @@ export const dict = { "settings.agentBehaviour.title": "智能体行为", "settings.autoApprove.title": "自动审批", "settings.webTools.title": "网络工具", - "settings.webTools.description": "配置网页搜索和浏览器自动化。搜索请求会直接连接到 Exa 或 Parallel。", + "settings.webTools.description": "配置网页搜索和浏览器自动化。", "settings.webTools.webSearch.enable": "为所有提供商启用", "settings.webTools.browserAutomation": "浏览器自动化", "settings.webTools.webSearch.title": "网页搜索", - "settings.webTools.webSearch.description": "让所有提供商的模型都可使用网页搜索。搜索会直接连接到 Exa 或 Parallel。", + "settings.webTools.webSearch.description": "让所有提供商的模型都可使用网页搜索。", "settings.checkpoints.title": "检查点", "settings.display.title": "显示", "settings.autocomplete.title": "自动补全", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts index 57b018982b..afc051308a 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts @@ -640,11 +640,11 @@ export const dict = { "settings.agentBehaviour.title": "Agent 行為", "settings.autoApprove.title": "自動核准", "settings.webTools.title": "網路工具", - "settings.webTools.description": "設定網頁搜尋和瀏覽器自動化。搜尋請求會直接連線至 Exa 或 Parallel。", + "settings.webTools.description": "設定網頁搜尋和瀏覽器自動化。", "settings.webTools.webSearch.enable": "為所有供應商啟用", "settings.webTools.browserAutomation": "瀏覽器自動化", "settings.webTools.webSearch.title": "網頁搜尋", - "settings.webTools.webSearch.description": "讓所有供應商的模型都可使用網頁搜尋。搜尋會直接連線至 Exa 或 Parallel。", + "settings.webTools.webSearch.description": "讓所有供應商的模型都可使用網頁搜尋。", "settings.checkpoints.title": "檢查點", "settings.display.title": "顯示", "settings.autocomplete.title": "自動完成", diff --git a/packages/sdk/openapi.json b/packages/sdk/openapi.json index 3036985783..d201367cb8 100644 --- a/packages/sdk/openapi.json +++ b/packages/sdk/openapi.json @@ -29194,10 +29194,6 @@ "hide_prompt_training_models": { "type": "boolean" }, - "web_search": { - "type": "boolean", - "description": "Make web search available to models from all providers (default: false)" - }, "sandbox": { "type": "object", "properties": { @@ -29456,6 +29452,9 @@ "type": "boolean" } }, + "web_search": { + "type": "boolean" + }, "attachment": { "$ref": "#/components/schemas/AttachmentConfig" }, From ddd3557bf00fba99cbed389cbeffafa567a45c34 Mon Sep 17 00:00:00 2001 From: Kelly Sun Date: Wed, 29 Jul 2026 21:58:41 -0400 Subject: [PATCH 13/29] docs: address review - use built-in Mixlayer provider + /connect Per review feedback: Mixlayer is a built-in provider, so document the Connect-provider flow instead of manual custom-provider setup, and add the CLI /connect command as a method. --- .../kilo-docs/pages/ai-providers/mixlayer.md | 50 ++++++------------- 1 file changed, 16 insertions(+), 34 deletions(-) diff --git a/packages/kilo-docs/pages/ai-providers/mixlayer.md b/packages/kilo-docs/pages/ai-providers/mixlayer.md index ac0221315a..6d261849ba 100644 --- a/packages/kilo-docs/pages/ai-providers/mixlayer.md +++ b/packages/kilo-docs/pages/ai-providers/mixlayer.md @@ -17,62 +17,44 @@ Mixlayer is an inference platform for open models such as GLM and Qwen, with a s ## Configuration in Kilo Code -Mixlayer's API is OpenAI-compatible, with the base URL `https://models.mixlayer.ai/v1`. Configure it through Kilo Code's **OpenAI Compatible** provider. +Mixlayer is available as a **built-in provider** in Kilo Code, so you can connect it directly — no custom provider setup needed. {% tabs %} {% tab label="VSCode" %} 1. Open **Settings** (gear icon) and go to the **Providers** tab. -2. Scroll to the bottom and click **Custom provider**. -3. Fill in the dialog: - - **Provider ID** — `mixlayer` - - **Display name** — `Mixlayer` - - **Provider API** — **OpenAI Compatible** - - **Base URL** — `https://models.mixlayer.ai/v1` - - **API key** — your Mixlayer API key -4. Kilo Code auto-fetches the available models from Mixlayer's `/v1/models` endpoint, so you can pick a model directly from the list. Click **Submit** to save. +2. Click **Connect provider**, search for **Mixlayer**, and select it. +3. Enter your Mixlayer API key. +4. Pick a model — Kilo Code fetches the available models automatically. {% /tab %} {% tab label="CLI" %} -Set the API key as an environment variable and define an OpenAI-compatible provider in your `kilo.json` config file (`~/.config/kilo/kilo.json` or `./kilo.json`): +**Method 1 — `/connect` (recommended)** -**Environment variable:** +Run `kilo`, then use the `/connect` command, select **Mixlayer**, and paste your API key when prompted: + +```bash +kilo +# then, inside Kilo, run: +/connect +``` + +**Method 2 — config file** + +Set your API key and add Mixlayer in your `kilo.json` config file (`~/.config/kilo/kilo.json` or `./kilo.json`): ```bash export MIXLAYER_API_KEY="your-api-key" ``` -**Config file:** - ```jsonc { "provider": { "mixlayer": { - "npm": "@ai-sdk/openai-compatible", "env": ["MIXLAYER_API_KEY"], - "options": { - "baseURL": "https://models.mixlayer.ai/v1", - }, - "models": { - "z-ai/glm-5.2": { - "name": "GLM-5.2", - "limit": { "context": 262144, "output": 262144 }, - }, - "qwen/qwen3.5-397b-a17b": { - "name": "Qwen3.5 397B A17B", - "limit": { "context": 131072, "output": 131072 }, - }, - }, }, }, -} -``` - -Then set your default model using the `provider-id/model-id` format: - -```jsonc -{ "model": "mixlayer/z-ai/glm-5.2", } ``` From 21263db2cdc04e0bc8126987676e2be7abeba9cf Mon Sep 17 00:00:00 2001 From: Kelly Sun Date: Wed, 29 Jul 2026 22:27:03 -0400 Subject: [PATCH 14/29] docs: fix intro to reference built-in provider (not OpenAI Compatible) --- packages/kilo-docs/pages/ai-providers/mixlayer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kilo-docs/pages/ai-providers/mixlayer.md b/packages/kilo-docs/pages/ai-providers/mixlayer.md index 6d261849ba..1ae3e8e74e 100644 --- a/packages/kilo-docs/pages/ai-providers/mixlayer.md +++ b/packages/kilo-docs/pages/ai-providers/mixlayer.md @@ -5,7 +5,7 @@ description: "Run open models like GLM and Qwen on Mixlayer's OpenAI-compatible # Using Mixlayer With Kilo Code -Mixlayer is an inference platform for open models such as GLM and Qwen, with a serving stack built from scratch by core contributors to Candle. It exposes an OpenAI-compatible API, so you can use it in Kilo Code through the **OpenAI Compatible** provider. +Mixlayer is an inference platform for open models such as GLM and Qwen, with a serving stack built from scratch by core contributors to Candle. It exposes an OpenAI-compatible API and is available as a built-in provider in Kilo Code. **Website:** [https://mixlayer.com/](https://mixlayer.com/) From 2d2b73d74d0d0af7c076665ea898f406f27942e4 Mon Sep 17 00:00:00 2001 From: Kelly Sun Date: Wed, 29 Jul 2026 22:31:02 -0400 Subject: [PATCH 15/29] docs: remove stale limit.output reference in tips --- packages/kilo-docs/pages/ai-providers/mixlayer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kilo-docs/pages/ai-providers/mixlayer.md b/packages/kilo-docs/pages/ai-providers/mixlayer.md index 1ae3e8e74e..4f34abfaa1 100644 --- a/packages/kilo-docs/pages/ai-providers/mixlayer.md +++ b/packages/kilo-docs/pages/ai-providers/mixlayer.md @@ -76,4 +76,4 @@ Tool calling and reasoning are supported across the model line. See the [Mixlaye - **Model list:** Kilo Code auto-detects available models from Mixlayer's `/v1/models` endpoint, so the picker stays current with your account. - **Pricing:** See the [Mixlayer console](https://console.mixlayer.com/) for current per-model pricing. -- **Reasoning:** Qwen models support a thinking mode; reasoning tokens count against the output budget, so allow enough `limit.output` when reasoning is enabled. +- **Reasoning:** Qwen models support a thinking mode; reasoning tokens count against the output budget, so give responses enough room when reasoning is enabled. From 49223b3adecb891b185d7a21bac8d4993d3bee65 Mon Sep 17 00:00:00 2001 From: marius-kilocode Date: Thu, 30 Jul 2026 10:16:51 +0200 Subject: [PATCH 16/29] feat(agent-manager): run project scripts in the embedded side terminal --- .changeset/calm-run-terminals.md | 5 + .kilo/plans/agent-manager-script-terminals.md | 575 ++++++++++++++++++ packages/core/src/kilocode/pty/termination.ts | 164 +++++ packages/core/src/pty.ts | 59 +- .../test/kilocode/pty-termination.test.ts | 104 ++++ packages/core/test/pty/pty-session.test.ts | 61 ++ .../kilo-docs/pages/automate/agent-manager.md | 2 +- .../src/agent-manager/AgentManagerProvider.ts | 48 +- .../agent-manager/ScriptTerminalManager.ts | 390 ++++++++++++ .../__tests__/AgentManagerProvider.spec.ts | 6 + .../kilo-vscode/src/agent-manager/host.ts | 3 + .../src/agent-manager/run/controller.ts | 14 +- .../src/agent-manager/run/manager.ts | 56 +- .../kilo-vscode/src/agent-manager/run/task.ts | 73 --- .../src/agent-manager/script-terminal-url.ts | 16 + .../kilo-vscode/src/agent-manager/types.ts | 7 + .../src/agent-manager/vscode-host.ts | 4 + .../tests/unit/agent-manager-arch.test.ts | 27 +- .../agent-manager-terminal-chrome.test.ts | 22 + .../unit/agent-manager-terminal-state.test.ts | 94 ++- .../tests/unit/run-script-manager.test.ts | 4 +- .../unit/script-terminal-manager.test.ts | 338 ++++++++++ .../agent-manager/AgentManagerApp.tsx | 6 + .../agent-manager/agent-manager.css | 13 + .../terminal/SideTerminalPanel.tsx | 1 + .../terminal/SortableTerminalTab.tsx | 22 +- .../agent-manager/terminal/chrome.ts | 23 + .../agent-manager/terminal/render.tsx | 1 + .../agent-manager/terminal/state.ts | 143 ++++- .../src/types/messages/extension-messages.ts | 19 + packages/server/src/handlers/pty.ts | 1 + 31 files changed, 2171 insertions(+), 130 deletions(-) create mode 100644 .changeset/calm-run-terminals.md create mode 100644 .kilo/plans/agent-manager-script-terminals.md create mode 100644 packages/core/src/kilocode/pty/termination.ts create mode 100644 packages/core/test/kilocode/pty-termination.test.ts create mode 100644 packages/kilo-vscode/src/agent-manager/ScriptTerminalManager.ts delete mode 100644 packages/kilo-vscode/src/agent-manager/run/task.ts create mode 100644 packages/kilo-vscode/src/agent-manager/script-terminal-url.ts create mode 100644 packages/kilo-vscode/tests/unit/agent-manager-terminal-chrome.test.ts create mode 100644 packages/kilo-vscode/tests/unit/script-terminal-manager.test.ts create mode 100644 packages/kilo-vscode/webview-ui/agent-manager/terminal/chrome.ts diff --git a/.changeset/calm-run-terminals.md b/.changeset/calm-run-terminals.md new file mode 100644 index 0000000000..e1f1df7b1e --- /dev/null +++ b/.changeset/calm-run-terminals.md @@ -0,0 +1,5 @@ +--- +"kilo-code": minor +--- + +Run Agent Manager project scripts in a named side terminal without opening the bottom VS Code terminal panel. diff --git a/.kilo/plans/agent-manager-script-terminals.md b/.kilo/plans/agent-manager-script-terminals.md new file mode 100644 index 0000000000..98567058a0 --- /dev/null +++ b/.kilo/plans/agent-manager-script-terminals.md @@ -0,0 +1,575 @@ +# Agent Manager Script Terminals + +Status: implementation plan only + +Baseline researched: `main` at `a0364858a6e1b69a2e2dc5434a82d5cefbe79ea7` (`v7.4.17`) + +Related issues: + +- [#12595](https://github.com/Kilo-Org/kilocode/issues/12595), per-worktree session terminals in the embedded side panel +- [#11083](https://github.com/Kilo-Org/kilocode/issues/11083), setup blocks session start and disrupts the terminal layout +- [#7526](https://github.com/Kilo-Org/kilocode/issues/7526), original Agent Manager Run script feature +- [#12597](https://github.com/Kilo-Org/kilocode/issues/12597), multiple side terminals, already implemented +- [#12649](https://github.com/Kilo-Org/kilocode/issues/12649), setup-script migration split from this implementation + +## Goal + +Setup scripts and Run scripts must execute in first-class terminal tabs inside the Agent Manager right-side terminal panel. Neither action should reveal or require the bottom VS Code terminal panel. + +The result must: + +- run the existing platform-specific setup and Run script files on Windows, Linux, and macOS; +- preserve the current working directory, environment, exit status, timeout, and one-Run-per-context behavior; +- show live output, accept input for interactive scripts, and retain bounded scrollback after exit; +- stop the correct process and its descendants; +- survive Agent Manager webview reloads and context switching while the extension/backend remain alive; +- reject unsafe script paths and respect VS Code Workspace Trust; +- never construct a shell command string in the webview or inject a command through terminal input. + +## Issue Scope Correction + +Issue #12595 currently describes routing a plain session/worktree shell through the existing `terminalButtonDestination` preference. Implementing that issue literally does not migrate either script system: + +- setup scripts still use `vscode.tasks.executeTask()` through `task-runner.ts`; +- Run scripts still use `vscode.tasks.executeTask()` through `run/task.ts`; +- both task definitions use `TaskRevealKind.Always`, which opens the bottom terminal panel. + +Before implementation, revise #12595 or replace its acceptance criteria with this plan. The plain session-terminal routing can remain a small related change, but it is not sufficient for the stated product goal. + +This plan addresses only the terminal/output part of #11083. Setup remains awaited before the first worktree session starts in the initial implementation. Making setup asynchronous is a separate lifecycle change and should not be combined with the terminal migration. + +## Product Decisions + +### Script output always belongs to Agent Manager + +Setup and Run are Agent Manager operations, so they always use named side-panel terminals: + +- `Setup` for worktree setup +- `Run` for the selected Local or worktree context + +They do not follow `kilo-code.new.agentManager.terminalButtonDestination`. That setting continues to control only where an ordinary user-requested interactive shell opens. This keeps the meaning of the setting narrow and avoids adding another preference. + +### No automatic VS Code terminal fallback + +If script PTY creation fails, show an Agent Manager error and do not execute the script. Automatically falling back after an uncertain PTY failure could execute a setup or Run script twice. + +An explicit manual action may open an ordinary VS Code terminal, but it must not silently rerun the script. + +### Preserve current lifecycle semantics + +- Setup stays best-effort: nonzero exit is visible as a failure, but session creation continues as it does today. +- Setup keeps its five-minute timeout, but the timeout must now terminate the process tree instead of only rejecting the wait. +- Run remains a toggle: invoking Run while active requests Stop rather than starting a second process. +- One Run process exists per Local/worktree context. +- Run status remains in memory and continues to drive the existing Run/Stop button and worktree status badge. + +## Current Architecture + +### Setup + +`SetupScriptRunner` is already platform-neutral and receives an injected `RunTask` callback. It resolves: + +| Platform | Script | Executable and arguments | +|---|---|---| +| Linux/macOS | `.kilo/setup-script`, then `.sh` | `sh ` | +| Windows | `.ps1`, then `.cmd`, then `.bat` | `powershell.exe ... -File ` or `cmd.exe /d /s /c ` | + +The VS Code-specific adapter is `packages/kilo-vscode/src/agent-manager/task-runner.ts`. + +### Run + +`RunController` and `RunScriptManager` already separate discovery, lifecycle, and UI status from the execution adapter. `RunController` passes an explicit executable, argument array, cwd, environment, and completion callback to `startVscodeRunTask()`. + +The VS Code-specific adapter is `packages/kilo-vscode/src/agent-manager/run/task.ts`. + +### Embedded terminals + +Agent Manager already has: + +- xterm.js terminals in the right-side inspector; +- multiple side terminals per context; +- direct PTY WebSocket streaming; +- per-context tab selection and ordering; +- persistent mounting while switching terminal tabs, Agent Manager contexts, Diff, and PR views. + +The extension-side path is currently: + +```text +webview terminal.create + -> TerminalRouter + -> TerminalManager + -> legacy client.pty.create() + -> kilo serve PTY + -> WebSocket + -> xterm.js +``` + +It currently creates only default interactive shells. It does not expose command, args, or env. + +### Existing backend capability + +The canonical PTY service already accepts: + +```ts +{ + command?: string + args?: string[] + cwd?: string + title?: string + env?: Record +} +``` + +It also retains bounded output, publishes `pty.exited` with an exit code, and keeps exited PTY metadata until removal. The canonical SDK surface is `client.v2.pty` under `/api/pty`. + +## Proposed Architecture + +### One execution backend + +Use the existing `kilo serve` PTY service as the only new script execution backend. Do not add another `child_process`, `node-pty`, VS Code pseudoterminal, or webview process runner. + +The new flow is: + +```text +SetupScriptRunner or RunController + -> PTY-backed execution adapter + -> ScriptTerminalManager + -> client.v2.pty.create(command, args, cwd, env) + -> canonical PTY WebSocket + -> existing Agent Manager side terminal/xterm.js +``` + +The executable and argument array are resolved by trusted extension code using the existing platform-specific builders. The webview receives only terminal display and attachment metadata. + +### Separate system terminals from user terminals + +Add a provider-owned `ScriptTerminalManager` next to the current `TerminalManager`. + +Do not send setup or Run processes through the existing webview-created `terminal.created` flow. That flow requires a pending webview `createId` and correctly closes unsolicited terminals. Setup can begin before the webview requests a terminal, so it needs a separate synchronization path. + +Suggested record: + +```ts +type ScriptTerminalKind = "setup" | "run" +type ScriptTerminalState = "starting" | "running" | "stopping" | "exited" | "failed" + +interface ScriptTerminalRecord { + terminalId: string + ptyID: string + worktreeId: string | null + kind: ScriptTerminalKind + title: string + cwd: string + wsUrl: string + state: ScriptTerminalState + exitCode?: number + startedAt: number + endedAt?: number +} +``` + +Registry rules: + +- one active `Run` record per context; +- one `Setup` record per worktree setup attempt; +- a new Run replaces the previous exited Run record after removing its retained PTY; +- user-created `Terminal N` tabs remain independently managed by `TerminalRouter`; +- script records survive `TerminalRouter.dispose()` and webview reloads; +- extension/backend shutdown removes all remaining script PTYs. + +### Completion and race handling + +Subscribe to global `pty.exited` events through `KiloConnectionService` and map backend PTY IDs to script records. + +Account for a fast process that exits before the extension registers the returned PTY: + +1. Create the PTY. +2. Store the record and backend ID. +3. Immediately call canonical `pty.get()`. +4. If it is already exited, finish from the returned status and exit code. +5. Otherwise rely on `pty.exited`. + +On connection restoration, reconcile every running script record with `pty.get()`. A missing PTY is an execution failure, not a successful exit. + +### Webview synchronization + +Add an extension-to-webview script-terminal snapshot/update protocol, for example: + +```ts +type: "agentManager.scriptTerminals" +terminals: ScriptTerminalView[] +``` + +Send a full snapshot: + +- when a script terminal is created; +- when status or exit code changes; +- after `agentManager.requestState`; +- after the webview reloads or reattaches. + +The webview terminal state adds script terminals without requiring a pending `createId`. A script terminal is still rendered by the existing `TerminalTab` and side-terminal layer. + +Do not send executable paths, args, arbitrary env, or script contents to the webview. + +## Required PTY Hardening + +These are prerequisites for claiming behavior comparable to VS Code Tasks. + +### Do not mutate explicit command arguments + +`packages/core/src/pty.ts` currently appends `-l` whenever the executable looks like a login shell. With `command: "sh"` and `args: [scriptPath]`, that produces `sh scriptPath -l`, making `-l` a script argument. + +Only add login-shell arguments when the caller did not provide an explicit command. Explicit `command` plus `args` must reach the process unchanged. + +### Terminate the process tree + +PTY removal currently calls only the PTY process's `kill()`. That does not prove that child and grandchild processes are terminated. + +Reuse or generalize `packages/core/src/shell.ts` `killTree()` semantics: + +- Windows: `taskkill /pid /f /t`, hidden window; +- Linux/macOS: signal the process group, then escalate from `SIGTERM` to `SIGKILL`; +- retain the direct PTY kill as a fallback. + +Run Stop, worktree deletion, setup timeout, tab close, extension shutdown, and backend shutdown must all use the same tree-termination path. + +### Replay exited output + +Canonical PTYs retain up to 2 MiB of output and exited metadata, but `Pty.attach()` currently rejects exited sessions. A quick setup can finish before the webview attaches, and a webview reload can occur after a Run exits. + +Allow a read-only attachment to an exited retained PTY: + +1. replay the requested bounded buffer; +2. send cursor/status metadata; +3. close normally with the exit code available through the state protocol; +4. reject writes after exit. + +Keep legacy `/pty` behavior unchanged. Script terminals use canonical `/api/pty`. + +### Keep shared-file changes isolated + +The PTY hardening touches shared upstream-owned code. Keep the changes minimal, use `kilocode_change` annotations where required, and run the opencode annotation and Promise-facade guards. + +## Security Model + +### Workspace Trust + +Before setup or Run script execution, require `vscode.workspace.isTrusted`. If the workspace is restricted, show the standard trust-management action and do not create a PTY. + +VS Code blocks terminals and Tasks in Restricted Mode. Moving execution behind `kilo serve` must not bypass that boundary. + +### Script path validation + +Run scripts already require a regular file and reject symlinks that resolve outside the root `.kilo` directory. Extract and reuse this validation for setup scripts. + +Both script systems must: + +- accept only the existing fixed platform-specific filenames; +- require a regular file; +- reject directories, devices, and other special files; +- reject a symlink whose real target escapes the root `.kilo` directory; +- use an absolute script path and validated absolute cwd. + +### Command construction + +- Resolve executable and args in extension code. +- Pass args as an array to `pty.create()`. +- Never concatenate a POSIX/PowerShell command string. +- Keep the existing `cmd.exe` path quoting helper and add paths-with-spaces and quotes tests. +- Never send a script command by `sendText`, xterm paste, or WebSocket input. + +### Environment + +Use one environment builder for setup and Run: + +- Linux/macOS: cached login-shell environment, preserving user PATH tools such as Homebrew, nvm, pyenv, and Cargo; +- Windows: extension-host process environment; +- overlay `WORKTREE_PATH` and `REPO_PATH`; +- retain PTY-enforced stripping of `KILO_SERVER_PASSWORD` and `KILO_SERVER_USERNAME`; +- do not serialize the environment into webview messages or persisted Agent Manager state. + +This intentionally improves setup parity. Setup currently lacks the login-shell environment used by Run. + +### Failure behavior + +- A PTY create error does not trigger a second execution path. +- A missing exit code is not treated as success. +- A server disconnect marks the script indeterminate until canonical status reconciliation completes. +- If process-tree termination cannot be confirmed, keep the UI in an error/stopping state and log the failure. + +## UX + +### Run + +When the user clicks Run or presses `Cmd/Ctrl+E`: + +1. Keep current script discovery/configuration behavior. +2. Open the Agent Manager terminal inspector. +3. Create or replace the semantic `Run` side tab for the current context. +4. Activate and focus it so interactive scripts can accept input. +5. Keep the existing worktree card and toolbar status synchronized. + +While running: + +- the tab shows a spinner; +- Run changes to Stop as today; +- pressing Run/Stop requests process-tree termination; +- closing the running Run tab means Stop and close; +- hiding the inspector does not stop the process. + +After exit: + +- exit `0` shows success; +- nonzero exit shows failure and the exit code; +- output remains available until the tab is closed or a new Run replaces it. + +### Setup + +When setup begins: + +1. Add the new worktree context to the UI as today. +2. Open its `Setup` side tab and show live output. +3. Keep the existing setup/session sequencing unchanged. +4. Continue session creation after success or failure, preserving current best-effort behavior. + +While setup runs: + +- the tab shows a spinner; +- the terminal can accept input if the script prompts; +- the tab cannot be destroyed accidentally; users may hide the inspector; +- the five-minute timeout stops the process tree and marks the tab failed. + +After setup exits, the tab becomes closable and retains its output. + +### Rendering before a session exists + +Setup begins before the first session exists in a new worktree. Update Agent Manager's empty-context logic so a context with a side script terminal renders the detail/inspector host even without a session tab. + +Do not place the current blocking setup overlay above the terminal. Keep progress visible in the sidebar/worktree state and in the Setup tab itself. + +### Titles and ordering + +- Keep `Setup` and `Run` as semantic labels; do not replace them with OSC shell titles. +- User-created terminals continue to use OSC title updates. +- System terminals participate in the existing side tab strip and can retain stable positions. +- The `+` button always creates a user terminal and never another Run or Setup process. + +### Accessibility + +- Announce starting, running, stopped, succeeded, and failed state changes. +- Include the exit code in accessible status text. +- Preserve existing keyboard tab navigation and terminal focus restoration. +- A hidden terminal inspector remains inert and `aria-hidden` while the PTY continues running. + +## Cross-Platform Contract + +Use the extension host's platform. In WSL, Remote SSH, and Dev Containers this means the remote Linux environment and POSIX script names, not native Windows script names. + +| Environment | Script execution | Important checks | +|---|---|---| +| macOS | `sh