Copy PNG called fetch() on a data URL, which VS Code webview CSP rejects,
so the copy silently did nothing. Decode the data URL locally instead.
Copy SVG used clipboard.writeText() with SVG markup, so paste targets got
source text instead of an image. Write SVG/PNG/text representations when
supported, and fall back to PNG on hosts that reject multi-type items.
Restore packages/ui/src/components/markdown.css. Upstream moved markdown
styling into the new session-ui package and deleted this file, but Kilo still
ships packages/ui's markdown component to the VS Code webview, so the rules
went missing while their consumer stayed. The copy button lost
position: absolute and opacity: 0, so it rendered below every code block
instead of in its corner, and showed the copy and check icons at once because
nothing hid the check state.
The palette showed "Enable auto-approve permissions" next to "Enable
auto-approve mode", which reads as the same command twice. They are not: one
lasts for the TUI run and is what --auto and --yolo seed, the other saves a
rule to global config. Both now say which they are and carry a desc, which
the palette already renders. The saved one is enforced server side, so its
desc says it covers every client. No behaviour change, and the command names
are untouched so the slash aliases still work.
Tests no longer depend on the developer's credential store. Credential
imports Global.data/auth.json on startup, and the catalog, plugin and
models-dev layers built Credential.node without overriding Global, so results
changed depending on whether the machine was logged in. They now use a temp
data directory, as the integration suite already did. That suite in turn set
KILO_AUTH_CONTENT at module scope; bun shares one process across test files,
so it leaked into credential.test.ts, whose auth.json cases then read "{}"
and found no credentials. Scoped with beforeAll/afterAll.
macOS-only failures, all merge gaps in Kilo tests:
- sandbox/state.test.ts runs a script in a subprocess; the LayerNode
migration put AppNodeBuilder.build in it without adding the import
- sandbox/session-tools.test.ts mocked MCP without clients(), which
upstream's resource tools now call
- sandbox/session.test.ts built SessionV2 without binding SessionExecution
Generated files: schema.gen.ts was formatted by an older prettier than the
one main's dependency bump resolves, so the generator no longer reproduced it
and the migration check called the schema stale. packages/client was missing
Pty.sessionID and the compaction include field. Both regenerated.
Also corrected the listener comment: it claimed application services still
come from AppRuntime, but the SessionV2 and MoveSession builds sit inside
KiloListener's Layer.fresh boundary and self-provide their subtrees, which is
deliberate since both bind this listener's own LocationServiceMap.
The package.json reconciliation dropped Kilo's test:ci scripts from the
six upstream-shared packages (core, effect-drizzle-sqlite,
http-recorder, llm, tui, ui), silently scheduling zero tests in the
non-CLI CI job, removed the dev:local root entrypoint, and adopted
upstream's tree-sitter-powershell native build permission. Restores all
of them to the Kilo base state.
* fix(ui): support bidirectional chat markdown
* fix(ui): address bidi markdown review feedback
* fix(ui): distinguish user message bubbles
* fix(ui): simplify markdown bidi direction
Mark the markdown container with one auto direction instead of
decorating each rendered block after parsing. Assistant replies usually
have one dominant natural language, but coding responses often start
list items and paragraphs with identifiers, method names, or HTTP terms.
Per-block auto direction lets those English tokens choose the direction
for whole lists even when the surrounding answer is right-to-left.
Keeping direction on the root makes the answer follow the dominant
prose direction more consistently, while code and pre elements keep their
own auto direction so code-like content does not decide the container
direction. This also removes the post-render bidi decoration pass.
* fix(ui): isolate markdown math direction
* fix(vscode): improve bidi text rendering
Match the chat user message bubble to the prompt input by using
plaintext unicode-bidi handling inside the Kilo UI message text.
Set automatic direction on session title labels in the task header,
recent sessions, history, cloud history, and Agent Manager so RTL and
mixed-direction titles render correctly without changing row layout.
* fix(ui): preserve code block direction while streaming
Keep dir on the existing pre element when streaming Shiki highlighting
updates it in place. The updater removes current attributes before
copying Shiki attributes, and Shiki does not emit dir, so RTL markdown
roots could briefly force code blocks to render right-to-left during
streaming.
Export the update helper for a focused behavior test that verifies the
in-place highlight update keeps direction, replaces stale attributes,
applies Shiki attributes, preserves scroll position, and updates the
source hash.
* chore(vscode): fix formatting issues
Format files after adding automatic direction attributes.
* test(ui): improve markdown bidi tests
Replace source-shape checks with an isolated Markdown component render
for the root dir contract.
Use happy-dom for the streaming highlight update test so innerHTML
parsing, attributes, connectivity, and HTMLPreElement checks use a real
DOM implementation. Restore patched globals in finally to avoid test
leakage.
* test(ui): address markdown bidi review comments
* fix(ui): revert user message bubble styles
* Revert "fix(ui): revert user message bubble styles"
This reverts commit 282264e25c.
* refactor(agent-manager): extract unassigned sessions section
---------
Co-authored-by: marius-kilocode <marius@kilocode.ai>
* feat(opencode): experimental SWE-Pruner for task-aware tool output pruning
Adds an experimental.swe_pruner config flag (default off). When enabled,
the read and grep tools advertise an optional context_focus_question
parameter; when the agent provides it, large outputs are skimmed by the
small model down to the lines relevant to the question, with omitted
sections marked inline. Failures fall back to the full output.
Based on SWE-Pruner (arXiv:2601.16746).
* chore: regenerate source-links for swe-pruner arxiv reference
* fix(opencode): address swe-pruner review suggestions
Harden the skimmer instruction against prompt injection from untrusted
tool output, and document that pruning runs before the tool.execute.after
hook so plugins observe the model-facing output.
* feat(ui): surface SWE-Pruner activity on read/grep tool rows
The read renderer hides tool output entirely, so pruning was invisible in
the webview even though the model received the pruned output. Show a
'SWE-Pruner · kept/total' row driven by the swePruner tool metadata.
* chore: retrigger CI (flaky windows/jetbrains tests, review service delivery error)
* feat(opencode): configurable SWE-Pruner skimming model
Adds experimental.swe_pruner_model (provider/model format) with a model
selector in the VS Code Experimental tab, shown when SWE-Pruner is
enabled. Falls back to the configured small model when unset or when the
configured model is unavailable.
* fix(ui): localize the SWE-Pruner pruning indicator
Replace the hardcoded label with a ui.tool.swePruned i18n key
(interpolated kept/total) added to all 20 shared UI locales.
* chore: retrigger CI (windows bun install network timeout on tree-sitter-powershell)
---------
Co-authored-by: marius-kilocode <marius@kilocode.ai>