When the model returns finish_reason "tool-calls" but emits zero tool call
parts, the prompt loop spins indefinitely. Detect this degenerate case in the
processor after the stream completes: if finish is "tool-calls" but no tool
parts exist, convert finish to "stop" so the loop's exit checks terminate
normally.
Reproduces the infinite loop when the model returns finish_reason: "tool-calls"
but emits zero actual tool call parts. Test 1 asserts the processor converts
finish to "stop" (currently fails). Test 2 verifies valid tool-calls flows
are preserved (passes).
The Kobalte Tabs component handles unknown values gracefully — an
unrecognized tab simply shows no content until the user clicks a
valid one. The maintained allowlist added in #7763 is not worth the
upkeep.
* fix(vscode): remove unimplemented Terminal and Prompts settings tabs
Remove placeholder-only TerminalTab and PromptsTab components, their
sidebar entries, and all related "not implemented" i18n strings across
18 language files. Also remove unused Placeholder component from
AgentBehaviourTab.
* fix(vscode): guard against stale tab values after removing settings tabs
Validate props.tab against known tab IDs so stale "terminal" or
"prompts" values from SettingsEditorProvider replay fall back to
"models" instead of leaving the panel with no content selected.
The agent had no knowledge of ctrl+p commands, themes, or appearance
toggling, so it told users to change their terminal settings instead.
Add a TUI Settings section covering all command palette actions,
keybinds, and slash commands, and widen the skill description to
trigger on settings/appearance questions.
Plan files (.kilo/plans/*.md) were incorrectly flagged as config files
by isRelative(), causing permission prompts for the plan agent. Add
EXCLUDED_SUBDIRS to skip non-config subdirectories under config dirs.
Extend isRequest() to also check external_directory permissions against
global config paths (~/.config/kilo/), preventing 'Always allow' from
granting permanent directory access to config directories.
Use cfg().type instead of inferring transport from the url field,
preventing invalid state when clearing a remote URL. Hide the
environment variables editor for remote servers since the backend
schema does not support environment on remote configs.
The edit view reuses addMcp.command, addMcp.args, and addMcp.url
keys from the add flow. These keys must exist in all locale files
for the i18n validation tests to pass.
Add McpEditView component with editable command/args for local
servers, URL for remote servers, and environment variable management.
MCP server list items are now clickable, navigating to the edit view
with a back button. Follows the same list-to-edit pattern as agent
modes.
Closes#7596
Edit, apply_patch, and user message summary were storing full before/after
file contents in metadata — causing sessions to balloon to 90+ MB and crash
the VS Code extension on load.
Strip before/after from edit filediff, apply_patch files[], and
summary.diffs both at write time (new data) and read time (existing data).
introduce OpenUrlFn and expose openUrl in the data store
wire DataBridge to accept onOpenUrl and forward to UI
update message-part to call data.openUrl for web URLs and enable clickable tool-action
Address kilo-code-bot review feedback:
- Guard against JSON.parse returning non-object values (null, arrays,
strings, numbers) which would crash on property access
- Support nested per-pattern permission rules like
bash: { "*": "ask", uname: "allow" } which PermissionRule allows
but were previously silently dropped
Add 5 tests for non-object JSON rejection and nested permission
round-trip.