Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/swe-pruner-experimental.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@kilocode/cli": minor
"@kilocode/sdk": minor
---

Add experimental SWE-Pruner support (disabled by default). When enabled via `experimental.swe_pruner` or the Experimental settings tab in VS Code, the read and grep tools accept an optional `context_focus_question` parameter; when the agent provides it, large tool outputs are pruned by a small model down to the lines relevant to that question, with omitted sections marked inline. Any pruning failure falls back to the full output.
2 changes: 2 additions & 0 deletions packages/kilo-docs/source-links.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
<!-- packages/opencode/src/cli/cmd/tui/config/tui-migrate.ts -->
- <https://app.kilo.ai/usage>
<!-- packages/opencode/src/kilocode/components/dialog-kilo-profile.tsx -->
- <https://arxiv.org/abs/2601.16746>
<!-- packages/opencode/src/kilocode/swe-pruner.ts -->
- <https://auth.x.ai>
<!-- packages/opencode/src/plugin/xai.ts -->
- <https://auth.x.ai/oauth2/authorize>
Expand Down
56 changes: 35 additions & 21 deletions packages/kilo-ui/src/components/message-part.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1627,6 +1627,14 @@ function ToolText(props: { text: string; delay?: number; animate?: boolean }) {
)
}

function swePruned(metadata: Record<string, unknown>) {
const value = metadata["swePruner"]
if (typeof value !== "object" || value === null) return undefined
const info = value as { kept?: unknown; total?: unknown }
if (typeof info.kept !== "number" || typeof info.total !== "number") return undefined
return `SWE-Pruner · ${info.kept}/${info.total}`
Comment thread
marius-kilocode marked this conversation as resolved.
Outdated
}

function ToolLoadedFile(props: { text: string; animate?: boolean; onClick?: () => void }) {
let ref: HTMLDivElement | undefined
useToolFade(() => ref, { delay: 0.02, wipe: true, animate: props.animate })
Expand Down Expand Up @@ -1754,6 +1762,7 @@ ToolRegistry.register({
if (!value || !Array.isArray(value)) return []
return value.filter((p): p is string => typeof p === "string")
})
const pruned = createMemo(() => swePruned(props.metadata))
const pending = createMemo(() => busy(props.status))
return (
<>
Expand Down Expand Up @@ -1783,6 +1792,7 @@ ToolRegistry.register({
/>
)}
</For>
<Show when={pruned()}>{(info) => <ToolLoadedFile text={info()} animate={props.reveal} />}</Show>
</>
)
},
Expand Down Expand Up @@ -1856,29 +1866,33 @@ ToolRegistry.register({
const args: string[] = []
if (props.input.pattern) args.push("pattern=" + props.input.pattern)
if (props.input.include) args.push("include=" + props.input.include)
const pruned = createMemo(() => swePruned(props.metadata))
const pending = createMemo(() => busy(props.status))
return (
<BasicTool
{...props}
icon="magnifying-glass-menu"
trigger={
<ToolTriggerRow
title={i18n.t("ui.tool.grep")}
pending={pending()}
subtitle={getDirectory(props.input.path)}
args={args}
animate={props.reveal}
/>
}
>
<Show when={props.output}>
{(output) => (
<div data-component="tool-output" data-variant="preview" data-scrollable>
<Markdown text={output()} />
</div>
)}
</Show>
</BasicTool>
<>
<BasicTool
{...props}
icon="magnifying-glass-menu"
trigger={
<ToolTriggerRow
title={i18n.t("ui.tool.grep")}
pending={pending()}
subtitle={getDirectory(props.input.path)}
args={args}
animate={props.reveal}
/>
}
>
<Show when={props.output}>
{(output) => (
<div data-component="tool-output" data-variant="preview" data-scrollable>
<Markdown text={output()} />
</div>
)}
</Show>
</BasicTool>
<Show when={pruned()}>{(info) => <ToolLoadedFile text={info()} animate={props.reveal} />}</Show>
</>
)
},
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,19 @@ const ExperimentalTab: Component = () => {
</Switch>
</SettingsRow>

<SettingsRow
title={language.t("settings.experimental.swePruner.title")}
description={language.t("settings.experimental.swePruner.description")}
>
<Switch
checked={experimental().swe_pruner ?? false}
onChange={(checked) => updateExperimental("swe_pruner", checked)}
hideLabel
>
{language.t("settings.experimental.swePruner.title")}
</Switch>
</SettingsRow>

{/* MCP timeout */}
<SettingsRow
title={language.t("settings.experimental.mcpTimeout.title")}
Expand Down
3 changes: 3 additions & 0 deletions packages/kilo-vscode/webview-ui/src/i18n/ar.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions packages/kilo-vscode/webview-ui/src/i18n/br.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions packages/kilo-vscode/webview-ui/src/i18n/bs.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions packages/kilo-vscode/webview-ui/src/i18n/da.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions packages/kilo-vscode/webview-ui/src/i18n/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1467,6 +1467,9 @@ export const dict = {
"settings.sandboxing.network.title": "Netzwerkzugriff einschränken",
"settings.sandboxing.network.description":
"Blockiert den ausgehenden Netzwerkzugriff für vom Modell initiierte Befehle und HTTP-Tools. Lokale MCP-Server und Plugin-Hooks sind von dieser Einschränkung ausgenommen. Anbieter- und Modellinferenzdatenverkehr bleibt verfügbar.",
"settings.experimental.swePruner.title": "SWE-Pruner",
"settings.experimental.swePruner.description":
"SWE-Pruner aktivieren: aufgabenbezogenes Kürzen großer Lese- und Suchausgaben, gesteuert durch eine Fokusfrage des Agenten",
"settings.experimental.mcpTimeout.title": "MCP-Zeitlimit (ms)",
"settings.experimental.mcpTimeout.description": "Zeitlimit für MCP-Server-Anfragen in Millisekunden",
"settings.experimental.remote.title": "Remote-Steuerung",
Expand Down
3 changes: 3 additions & 0 deletions packages/kilo-vscode/webview-ui/src/i18n/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1422,6 +1422,9 @@ export const dict = {
"settings.sandboxing.network.title": "Restrict Network Access",
"settings.sandboxing.network.description":
"Block outbound network access from model-originated commands and HTTP tools. Local MCP servers and plugin hooks run outside this restriction. Provider and model inference traffic remains available.",
"settings.experimental.swePruner.title": "SWE-Pruner",
"settings.experimental.swePruner.description":
"Enable SWE-Pruner: task-aware pruning of large read and search tool outputs, guided by a focus question from the agent",
"settings.experimental.mcpTimeout.title": "MCP Timeout (ms)",
"settings.experimental.mcpTimeout.description": "Timeout for MCP server requests in milliseconds",
"settings.experimental.remote.title": "Remote Control",
Expand Down
3 changes: 3 additions & 0 deletions packages/kilo-vscode/webview-ui/src/i18n/es.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions packages/kilo-vscode/webview-ui/src/i18n/fr.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions packages/kilo-vscode/webview-ui/src/i18n/it.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions packages/kilo-vscode/webview-ui/src/i18n/ja.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions packages/kilo-vscode/webview-ui/src/i18n/ko.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions packages/kilo-vscode/webview-ui/src/i18n/nl.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions packages/kilo-vscode/webview-ui/src/i18n/no.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions packages/kilo-vscode/webview-ui/src/i18n/pl.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions packages/kilo-vscode/webview-ui/src/i18n/ru.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions packages/kilo-vscode/webview-ui/src/i18n/th.ts

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading