Commit Graph

4707 Commits

Author SHA1 Message Date
Imanol Maiztegui d6eeb00b7b Migration error handling (#8010)
* feat(vscode): detect sessions in old extension

* feat(vscode): added session types

* feat(cli): add endpoints for inserting a session

* feat(vscode): use session types from sdk for parsing

* feat(kilo-vscode): parsing session project

* feat(vscode): parse legacy session details

* feat(kilo-vscode): refactoring

* feat(vscode): parse legacy session messages

* feat(vscode): parse legacy session parts

* feat(vscode): added testing files and id creation

* feat(vscode): merge tool parts on imported session

* feat(vscode): session message part refactoring

* feat(vscode): cover provider-specific reasoning parts on session migration

* feat(kilo-vscode): handle completion result parts

* feat: type hardening on session migration

* feat(kilo-vscode): create tool part correctly

* feat(kilo-vscode): adjust session part processing

* feat(vscode): persist migrated session in kilo.db

* feat(vscode): add error handling to session migration

* feat(vscode): add directory field to session migration

* feat(kilo-vscode): display completion check on session migration

* feat(vscode): prevent migrating sessions twice

* feat(cli): use correct project id when inserting migrated session

* feat(kilo-vscode): Use correct project id for session migration

* feat(kilo-vscode): load sessions on migration complete

* feat(kilo-vscode): ignore environment details user part when migrating sessions

* feat(cli): create project details following current backend logic

* feat(kilo-vscode): cleaner messages without environment_details parts

* feat(kilo-vscode): refactoring

* feat(kilo-vscode): refactoring and organization

* feat(kilo-vscode): method renaming to improve clarity

* feat(kilo-vscode): added session migration test strategy

* test(kilo-vscode): implement legacy migration unit tests for all migration modules

Replace todo stubs with full test implementations across messages,
parts, tools, reasoning, parser, migrate, project, and session test
files. Add new project.test.ts and session.test.ts covering project
construction, session metadata, and deterministic ID generation.

* style(kilo-vscode): apply prettier formatting across legacy migration source and test files

* fix(legacy-migration): filter out non-user/assistant entries before parsing messages

Exclude system and other non-conversational roles from the conversation
array prior to mapping, ensuring parentID references remain consistent
across imported messages when skipped entries exist.

* refactor(parts): skip part generation for non-conversational message roles

Entries with roles other than user or assistant should not produce
parts, keeping part output consistent with the messages that are
actually imported during legacy migration.

* fix(ids): use semantic kind strings to prevent part ID collisions for reasoning entries

Replace numeric indices with descriptive kind strings ("reasoning",
"provider-reasoning") in extra part ID generation to avoid collisions
between reasoning parts and regular content parts within the same
message.

Introduce `createExtraPartID` to distinguish reasoning-specific IDs
from standard sequential part IDs produced by `createPartID`.

* refactor(session-import): guard against empty worktree in legacy project import

Prevent silent misattribution of migrated sessions by rejecting empty
worktree paths before resolving the project directory. Without this
check, an empty string would fall back to the current process directory,
causing the imported session to be attached to the wrong project.

* perf(cli): cache MCP listTools results to avoid redundant RPCs per loop step (#7922)

MCP.tools() called client.listTools() for every connected server on
every agent loop iteration. With multiple servers this added hundreds
of milliseconds of overhead per step (measured ~300-750ms for remote
servers like Vercel).

Cache listTools results in a module-level Map and return them on
subsequent calls. The cache is invalidated on:
- ToolListChangedNotification from the MCP server
- Server add/connect/disconnect
- Instance dispose (config change, project switch, shutdown)

* fix(agent-manager): add retries to worktree cleanup for macOS .app bundles (#7921)

* chore: hide non-English localization files in GitHub PR diffs

Mark all non-English i18n locale files as linguist-generated=true so
they are collapsed by default in GitHub PR diffs, reducing noise when
reviewing changes that touch translation files.

* feat(vscode): add Browse Marketplace button to MCP settings

Add a "Browse Marketplace" button to the MCP Servers subtab in Agent
Behaviour settings, guiding users to discover and install MCPs from the
marketplace rather than only configuring them manually.

- Add button above the MCP server list that opens the Marketplace panel
- Add openMarketplacePanel webview message type and handler
- Add translations for all 18 supported languages

* fix(vscode): preserve project directory when opening marketplace from settings

Pass the current panel's project directory through to the marketplace
panel so project-scoped MCP installs work correctly in multi-root
workspaces. Without this, the marketplace panel would fall back to
null project directory since there is no active text editor when
clicking from a webview.

* feat(vscode): add Browse Marketplace button to agents and skills tabs

Add the Browse Marketplace button to the Agents and Skills subtabs in
Agent Behaviour settings, matching the existing button in the MCP
Servers subtab. This lets users discover marketplace items from any
of the three configuration tabs.

- Agents tab: added as a ghost button in the header row alongside
  Import and Create Mode buttons
- Skills tab: added as a secondary button at the top-right, matching
  the MCP tab layout
- Extracted the browse handler to the component scope for reuse

* chore: update kilo-vscode visual regression baselines

* perf(agent-manager): extend slimPart to strip heavy tool metadata for faster session switching (#7927)

Extend slim-metadata.ts to handle apply_patch, multiedit, write, and bash
tools in addition to edit. Previously only edit tool parts had their heavy
metadata stripped before IPC serialization. apply_patch parts carried full
file before/after contents per file, write parts carried the entire written
file, and bash parts carried up to 30KB of output — all serialized on every
session switch.

This reduces session-switch time by ~2x for sessions with many tool calls.

* style(legacy-migration): reformat long reasoning push call for readability

* refactor(legacy-migration): filter non-user/assistant entries before indexing

Move the role filter from inside `parseParts` to `parsePartsFromConversation`
so that message indices are derived only from the filtered list. This ensures
part message IDs stay aligned with the imported messages and skipped entries
(e.g. system role) do not cause index gaps in the generated IDs.

* fix(legacy-migration): add `_migrated_` infix to generated IDs

Prefix all migrated entity IDs (sessions, messages, parts) with a
`_migrated_` segment so they are clearly distinguishable from IDs
produced by the regular runtime. Updates tests to assert the new
prefix format.

* refactor(legacy-migration): consolidate conversation parsing into `parseSession`

Remove the intermediate `createMessages` and `createParts` async
wrappers that each independently read and parsed the conversation
file. The file is now fetched and parsed once in `parseSession`,
with the resulting conversation passed directly to
`parseMessagesFromConversation` and `parsePartsFromConversation`,
eliminating redundant I/O.

* fix(parts-builder): remove `toTextWithinMessage` and use `toText` directly

`toTextWithinMessage` was a duplicate of `toText` with identical
behavior. Replace all call sites with `toText` and delete the
redundant function.

* fix(parts-builder): skip provider-specific reasoning when explicit reasoning entry exists

Guard `isProviderSpecificReasoning` with `!isReasoning` to prevent
duplicate reasoning parts when an entry carries both a `type:
"reasoning"` field and a provider-specific reasoning field (e.g.
`reasoning_content`). The explicit reasoning entry takes precedence.

* test(legacy-migration): add coverage for edge cases in parts and tools parsing

Add unit tests for two previously uncovered scenarios:

- Task block extraction: verify only the content inside `<task>` tags
  is kept when text exists outside the legacy task wrapper
- Empty tool result: verify the tool name is used as fallback output
  when `tool_result` carries no readable text content

Also replace the dynamic `FileType.Directory` workaround with the
direct `vscode.FileType.Directory` enum reference, and harden
`parseFile` to throw on non-array JSON instead of silently returning
an empty array.

* fix(migration): require all items to succeed before marking migration complete

Tighten the completion condition so migration is only marked "completed"
when every item succeeds, not just when at least one does. Introduce a
dedicated "error" phase in the wizard UI so partial failures are surfaced
clearly rather than silently collapsed into the "done" state.

- `handleStartLegacyMigration`: gate `setMigrationStatus("completed")` on
  `!failed && success` instead of `success` alone
- `migrate`: propagate the actual `Error.message` from a failed session
  migration instead of a generic fallback string
- `MigrationWizard`: add `"error"` phase, show per-group error messages
  inline, add a "Continue" button to proceed past the error screen, and
  trigger `loadSessions` on completion
- `migration.css`: add `.migration-wizard__error-text` style using
  `--vscode-errorForeground`

* fix(migration): defer disposeGlobal and loadSessions until after error check

Move `disposeGlobal` call inside the success-only branch so the
extension is not torn down when migration partially fails. Similarly,
defer the `loadSessions` webview message to the "Continue" button on
the error screen so sessions are only reloaded after the user
acknowledges the failure.

- `handleStartLegacyMigration`: move `disposeGlobal` inside the
  `!failed && success` guard to avoid disposing on partial failure
- `MigrationWizard`: skip `loadSessions` post-message when errors are
  present; send it from the "Continue" button instead

* refactor(migration): extract MigrationError component and error selector utilities

Replace inline error text rendering in MigrationWizard with a dedicated
MigrationError component that displays a structured error box with a
copy-to-clipboard action. Extract error parsing logic into reusable
selector functions in a separate module.

- Add `MigrationError` component with header, detail text, and
  preformatted error code block; copy button writes error to clipboard
  and shows a success toast
- Add `error-selectors.ts` with `getMigrationError` (strips error type
  prefix), `getSessionMigrationError`, and `getSessionMigrationErrorDetail`
- Replace `<Show>` + raw `error-text` div in MigrationWizard sessions
  row with `<MigrationError>` using the new selector-derived signals

* feat(migration): introduce view-model module for migration state derivations

Extract `ProgressEntry` type and inline derived-state functions from
`MigrationWizard` into a dedicated `migration-view-model.ts` module,
and update call sites to use the new public API.

- Add `migration-view-model.ts` exporting `ProgressEntry`, `getGroupStatus`,
  `getGroupMessage`, `getSuccessCount`, `getTotalCount`,
  `getCurrentSessionError`, and `getCurrentSessionErrorDetail`
- Remove duplicated logic from `MigrationWizard` and delegate to the
  new module, keeping the component focused on rendering concerns
- Consolidate the `getGroupMessage` resolver used by error selectors so
  it is derived from a single source of truth

* refactor(legacy-migration): split shared types into dedicated modules

Move `MigrationResultItem` out of `legacy-types.ts` into a new
`migration-types.ts` module, and introduce a `MigrationFailure`
typed error structure in `errors/migration-failure.ts`.

- Add `migration-types.ts` exporting `MigrationResultItem` to separate
  runtime migration result types from legacy configuration types
- Add `errors/migration-failure.ts` defining `MigrationFailure` and
  `MigrationFailureKind` for structured error classification
- Remove `MigrationResultItem` from `legacy-types.ts` to eliminate
  the coupling between legacy config shapes and migration output types
- Update `migration-service.ts` import to reference the new module

* feat(errors): add migration error normalization utilities

Introduce `migration-error.ts` with `normalizeMigrationError` and
`getMigrationErrorMessage` to convert arbitrary thrown values into
typed `MigrationFailure` objects.

- Classify errors by kind (`http`, `sdk`, `generic`, `unknown`) based
  on the presence of `status`, `data`, `body`, or `Error` instance
- Extract human-readable message from `message`, `body`, `data`, or
  raw string fallback, defaulting to "Unknown migration error"
- Compose a `detail` string from status code, body, and data fields
  when they differ from the primary message
- Propagate nested `cause` text for additional diagnostic context

* refactor(migrate): wrap migrate return in typed Result and normalize errors

* chore(migration): inline view-model helpers and remove extracted modules

Remove the separately extracted `migration-view-model.ts`, `error-selectors.ts`,
`MigrationError.tsx`, and `MigrationFailure` type in favour of inlined logic
directly in `MigrationWizard` and a simplified `getMigrationErrorMessage`
utility.

- Delete `MigrationFailure` type and `normalizeMigrationError`; replace with
  a flat `getMigrationErrorMessage` function
- Inline `ProgressEntry` interface, group-status logic, and count helpers
  into `MigrationWizard`
- Replace `MigrationError` component with inline clipboard copy handler
  using `showToast`
- Simplify session migrate result shape: drop structured `error` field,
  surface plain `message` string instead

* feat(i18n): add migration error copy-to-clipboard translations across all locales

* style(migration): add error box and copy button styles for migration wizard

Add CSS for the error display box and copy-to-clipboard button in the
migration wizard, including layout, typography, theming via VSCode CSS
variables, hover/active/focus-visible states, and high-contrast border
overrides. Also align wizard items to flex-start for multi-line content.

* fix: merge conflict issues resolved

* fix: formatting

* i18n(migration): add localized strings for session migration progress and errors

* fix:formatting

* feat(session-import): remove temporary test error from project import

* fix(vscode): remove unused migration progress translations

* fix: formatting

* fix(migration): track individual session progress instead of grouping all sessions

Replace the single "Chat sessions" progress item with per-session
tracking, passing the session ID directly to onProgress calls and
mapping each session to its own pending item in the wizard's progress
list.

* fix: formatting

---------

Co-authored-by: Marius <marius@kilocode.ai>
Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com>
Co-authored-by: Mark IJbema <mark@kilocode.ai>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-03-31 19:06:51 +02:00
Mark IJbema 39be9f9f1f Merge pull request #8001 from Kilo-Org/fix/skill-directory-precedence
fix(cli): fix global skills overriding project skills (precedence reversed)
2026-03-31 17:37:49 +02:00
Imanol Maiztegui 80f187ebba feat(kilo-vscode): migrate legacy sessions into new extension (#7924)
* feat(vscode): detect sessions in old extension

* feat(vscode): added session types

* feat(cli): add endpoints for inserting a session

* feat(vscode): use session types from sdk for parsing

* feat(kilo-vscode): parsing session project

* feat(vscode): parse legacy session details

* feat(kilo-vscode): refactoring

* feat(vscode): parse legacy session messages

* feat(vscode): parse legacy session parts

* feat(vscode): added testing files and id creation

* feat(vscode): merge tool parts on imported session

* feat(vscode): session message part refactoring

* feat(vscode): cover provider-specific reasoning parts on session migration

* feat(kilo-vscode): handle completion result parts

* feat: type hardening on session migration

* feat(kilo-vscode): create tool part correctly

* feat(kilo-vscode): adjust session part processing

* feat(vscode): persist migrated session in kilo.db

* feat(vscode): add error handling to session migration

* feat(vscode): add directory field to session migration

* feat(kilo-vscode): display completion check on session migration

* feat(vscode): prevent migrating sessions twice

* feat(cli): use correct project id when inserting migrated session

* feat(kilo-vscode): Use correct project id for session migration

* feat(kilo-vscode): load sessions on migration complete

* feat(kilo-vscode): ignore environment details user part when migrating sessions

* feat(cli): create project details following current backend logic

* feat(kilo-vscode): cleaner messages without environment_details parts

* feat(kilo-vscode): refactoring

* feat(kilo-vscode): refactoring and organization

* feat(kilo-vscode): method renaming to improve clarity

* feat(kilo-vscode): added session migration test strategy

* test(kilo-vscode): implement legacy migration unit tests for all migration modules

Replace todo stubs with full test implementations across messages,
parts, tools, reasoning, parser, migrate, project, and session test
files. Add new project.test.ts and session.test.ts covering project
construction, session metadata, and deterministic ID generation.

* style(kilo-vscode): apply prettier formatting across legacy migration source and test files

* fix(legacy-migration): filter out non-user/assistant entries before parsing messages

Exclude system and other non-conversational roles from the conversation
array prior to mapping, ensuring parentID references remain consistent
across imported messages when skipped entries exist.

* refactor(parts): skip part generation for non-conversational message roles

Entries with roles other than user or assistant should not produce
parts, keeping part output consistent with the messages that are
actually imported during legacy migration.

* fix(ids): use semantic kind strings to prevent part ID collisions for reasoning entries

Replace numeric indices with descriptive kind strings ("reasoning",
"provider-reasoning") in extra part ID generation to avoid collisions
between reasoning parts and regular content parts within the same
message.

Introduce `createExtraPartID` to distinguish reasoning-specific IDs
from standard sequential part IDs produced by `createPartID`.

* refactor(session-import): guard against empty worktree in legacy project import

Prevent silent misattribution of migrated sessions by rejecting empty
worktree paths before resolving the project directory. Without this
check, an empty string would fall back to the current process directory,
causing the imported session to be attached to the wrong project.

* perf(cli): cache MCP listTools results to avoid redundant RPCs per loop step (#7922)

MCP.tools() called client.listTools() for every connected server on
every agent loop iteration. With multiple servers this added hundreds
of milliseconds of overhead per step (measured ~300-750ms for remote
servers like Vercel).

Cache listTools results in a module-level Map and return them on
subsequent calls. The cache is invalidated on:
- ToolListChangedNotification from the MCP server
- Server add/connect/disconnect
- Instance dispose (config change, project switch, shutdown)

* fix(agent-manager): add retries to worktree cleanup for macOS .app bundles (#7921)

* chore: hide non-English localization files in GitHub PR diffs

Mark all non-English i18n locale files as linguist-generated=true so
they are collapsed by default in GitHub PR diffs, reducing noise when
reviewing changes that touch translation files.

* feat(vscode): add Browse Marketplace button to MCP settings

Add a "Browse Marketplace" button to the MCP Servers subtab in Agent
Behaviour settings, guiding users to discover and install MCPs from the
marketplace rather than only configuring them manually.

- Add button above the MCP server list that opens the Marketplace panel
- Add openMarketplacePanel webview message type and handler
- Add translations for all 18 supported languages

* fix(vscode): preserve project directory when opening marketplace from settings

Pass the current panel's project directory through to the marketplace
panel so project-scoped MCP installs work correctly in multi-root
workspaces. Without this, the marketplace panel would fall back to
null project directory since there is no active text editor when
clicking from a webview.

* feat(vscode): add Browse Marketplace button to agents and skills tabs

Add the Browse Marketplace button to the Agents and Skills subtabs in
Agent Behaviour settings, matching the existing button in the MCP
Servers subtab. This lets users discover marketplace items from any
of the three configuration tabs.

- Agents tab: added as a ghost button in the header row alongside
  Import and Create Mode buttons
- Skills tab: added as a secondary button at the top-right, matching
  the MCP tab layout
- Extracted the browse handler to the component scope for reuse

* chore: update kilo-vscode visual regression baselines

* perf(agent-manager): extend slimPart to strip heavy tool metadata for faster session switching (#7927)

Extend slim-metadata.ts to handle apply_patch, multiedit, write, and bash
tools in addition to edit. Previously only edit tool parts had their heavy
metadata stripped before IPC serialization. apply_patch parts carried full
file before/after contents per file, write parts carried the entire written
file, and bash parts carried up to 30KB of output — all serialized on every
session switch.

This reduces session-switch time by ~2x for sessions with many tool calls.

* style(legacy-migration): reformat long reasoning push call for readability

* refactor(legacy-migration): filter non-user/assistant entries before indexing

Move the role filter from inside `parseParts` to `parsePartsFromConversation`
so that message indices are derived only from the filtered list. This ensures
part message IDs stay aligned with the imported messages and skipped entries
(e.g. system role) do not cause index gaps in the generated IDs.

* fix(legacy-migration): add `_migrated_` infix to generated IDs

Prefix all migrated entity IDs (sessions, messages, parts) with a
`_migrated_` segment so they are clearly distinguishable from IDs
produced by the regular runtime. Updates tests to assert the new
prefix format.

* refactor(legacy-migration): consolidate conversation parsing into `parseSession`

Remove the intermediate `createMessages` and `createParts` async
wrappers that each independently read and parsed the conversation
file. The file is now fetched and parsed once in `parseSession`,
with the resulting conversation passed directly to
`parseMessagesFromConversation` and `parsePartsFromConversation`,
eliminating redundant I/O.

* fix(parts-builder): remove `toTextWithinMessage` and use `toText` directly

`toTextWithinMessage` was a duplicate of `toText` with identical
behavior. Replace all call sites with `toText` and delete the
redundant function.

* fix(parts-builder): skip provider-specific reasoning when explicit reasoning entry exists

Guard `isProviderSpecificReasoning` with `!isReasoning` to prevent
duplicate reasoning parts when an entry carries both a `type:
"reasoning"` field and a provider-specific reasoning field (e.g.
`reasoning_content`). The explicit reasoning entry takes precedence.

* test(legacy-migration): add coverage for edge cases in parts and tools parsing

Add unit tests for two previously uncovered scenarios:

- Task block extraction: verify only the content inside `<task>` tags
  is kept when text exists outside the legacy task wrapper
- Empty tool result: verify the tool name is used as fallback output
  when `tool_result` carries no readable text content

Also replace the dynamic `FileType.Directory` workaround with the
direct `vscode.FileType.Directory` enum reference, and harden
`parseFile` to throw on non-array JSON instead of silently returning
an empty array.

* feat(legacy-migration): remove session migration tracking from global state

Drop the `readSessionsToMigrate` filter and the post-migration
`globalState` flag that tracked which sessions had already been
migrated. Detection now returns all sessions found in global storage
without filtering by prior migration status.

* fix(session-import): skip duplicate session imports and child data

Check for an existing session row before inserting and return a
`skipped: true` flag when the session already exists. The migration
client honours this flag to bypass message and part imports, avoiding
redundant work when migration is re-run.

Replace `onConflictDoUpdate` with `onConflictDoNothing` on the session
insert path to align with the new pre-check behaviour. Propagate the
optional `skipped` field through the result types and generated SDK
types for project, session, message, and part responses.

* refactor(parts-builder): mark legacy system error text parts as ignored

Tag text parts whose content begins with `[ERROR]` with `ignored: true`
and a `legacy-system-error` metadata source. Introduces a new
`isLegacySystemErrorText` utility in `parts-util` to encapsulate the
detection logic.

* feat(parts-util): extract feedback text from tool_result content into visible parts

Parse `<feedback>` tags embedded in `tool_result` content and emit a
dedicated text part so user feedback is surfaced as a visible message
rather than buried inside tool result data.

Introduces `getFeedbackText` utility to extract and trim the inner
content of `<feedback>` blocks from arbitrary input.

* fix: formatting

---------

Co-authored-by: Marius <marius@kilocode.ai>
Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com>
Co-authored-by: Mark IJbema <mark@kilocode.ai>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-03-31 17:13:34 +02:00
Christiaan Arnoldus 52422a8dad Merge branch 'main' into fix/tool-call-without-tool-input-start 2026-03-31 16:19:07 +02:00
Marian Alexandru Alecu f6e751a645 Merge pull request #7963 from Kilo-Org/fix/cli-self-config-tips
fix(cli): simplify self-config tips
2026-03-31 17:06:35 +03:00
Christiaan Arnoldus 69bd0342c3 Merge branch 'main' into fix/tool-call-without-tool-input-start 2026-03-31 15:49:30 +02:00
Christiaan Arnoldus b0aa8acf1c Clarify comment 2026-03-31 15:47:45 +02:00
kiloconnect[bot] f318bc3258 fix(cli): fix global skills overriding project skills in skillDirectories()
Swap order in KilocodePaths.skillDirectories() so global dirs (~/.kilo,
~/.kilocode, VSCode storage) are pushed first, followed by project-level
dirs. Since addSkill uses last-write-wins, project-level skills now
correctly take precedence over global skills.

Fixes #7886
2026-03-31 12:54:15 +00:00
Mark IJbema 0578a23e99 Merge pull request #7205 from theQuert/feat/apertis-opencode-provider
feat: add Apertis to provider migration mapping
2026-03-31 14:41:48 +02:00
kiloconnect[bot] 7dcb26a76f fix(cli): handle tool-call without prior tool-input-start event
When a provider emits tool-call without a preceding tool-input-start
event, the tool call was silently dropped causing conversation history
corruption and 400 errors on subsequent API requests.

This change creates a fallback tool part in the tool-call handler when
tool-input-start was never emitted, ensuring the tool call is persisted
and included in conversation history.
2026-03-31 12:36:47 +00:00
kilo-maintainer[bot] 9fd9ffd8f0 release: v7.1.11 2026-03-31 11:02:44 +00:00
Mark IJbema ccd4574b93 Merge pull request #7978 from Kilo-Org/fix/windows-session-directory-casing
fix(cli): normalize directory path when listing sessions to fix Windows drive letter casing
2026-03-31 12:08:35 +02:00
kiloconnect[bot] 00e6252d38 fix(cli): normalize directory path when listing sessions to fix Windows case mismatch
On Windows, VS Code's uri.fsPath returns lowercase drive letters (e.g. c:\...)
while Filesystem.resolve() canonicalises them to uppercase (C:\...) via
realpathSync.native. Sessions are stored with the resolved path but queried
with the raw fsPath, so SQLite's binary equality check never matches and no
sessions are shown after restart.

Apply Filesystem.resolve() to the directory filter in Session.list and
Session.listGlobal so both sides use the same canonical form.
2026-03-31 09:55:20 +00:00
kilo-maintainer[bot] 64f6ca8962 release: v7.1.10 2026-03-31 09:49:05 +00:00
Evgeny Shurakov eb4e5705ac Merge pull request #7941 from Kilo-Org/eshurakov/eshurakov/websocket-hearbeat-monitor
KiloSessions - Add WebSocket activity watchdog with heartbeat ack
2026-03-31 11:13:29 +02:00
Evgeny Shurakov 227e53bc0d Merge pull request #7954 from Kilo-Org/eshurakov/eshurakov/remote-config
CLI - Add remote_control Config Option
2026-03-31 10:17:29 +02:00
Mark IJbema 9a23857265 Merge pull request #7906 from Kilo-Org/mark/fix-windows-hide-regression-7896
fix: add windowsHide:true to remaining spawn/exec calls to prevent CMD flash on Windows
2026-03-31 09:17:32 +02:00
Alex Alecu c4732a6c8c fix(cli): restore agent picker labels 2026-03-31 09:02:11 +03:00
Alex Alecu af83b19bec fix(cli): simplify self-config tips 2026-03-31 08:50:43 +03:00
Aarav 904b2d83d2 Merge branch 'main' into feat/deprecate-orchestrator-agent 2026-03-30 21:23:41 -06:00
Aarav Sharma 12d292ec08 fix: propagate deprecated field in agent merge and show description in dialog 2026-03-30 16:50:38 -06:00
Evgeny Shurakov 8c6d448117 fix(cli): read remote_control from global config only 2026-03-30 22:11:35 +02:00
Evgeny Shurakov 5d9ea38171 feat(cli): add remote_control config to auto-enable remote session relay
Add a `remote_control` boolean config field so users can enable remote
session relay by default without the KILO_REMOTE env var or /remote command.
2026-03-30 21:30:40 +02:00
kiloconnect[bot] 03691ebe4e fix(cli): restore directory tree in system prompt
Remove accidental `&& false` that was introduced in upstream commit
351ddeed91 ("Permission rework #6319") which disabled the filetree
from being included in the system prompt for git projects.

Upstream issue: https://github.com/anomalyco/opencode/issues/19263
2026-03-30 16:50:24 +00:00
Marian Alexandru Alecu 40d3a23af4 Merge pull request #7929 from Kilo-Org/feat/ask-agent-read-tools
feat(cli): add read-only bash and MCP to Ask agent
2026-03-30 18:06:36 +03:00
Alex Alecu 14438b9936 fix(cli): use git branch --list instead of -l 2026-03-30 18:01:12 +03:00
Evgeny Shurakov 23c7d053f2 feat(cli): add WebSocket activity watchdog with heartbeat_ack support
Add an inactivity watchdog to RemoteWS that force-closes and
reconnects the WebSocket when no inbound messages arrive within
a configurable timeout window (default 30s). Introduce a
heartbeat_ack inbound message type so the server can respond
to heartbeat pings, resetting the activity timer.
2026-03-30 16:39:33 +02:00
Alex Alecu 657296a08b fix(cli): clarify read-only wording in ask prompt 2026-03-30 16:39:48 +03:00
Alex Alecu b007fa2d92 fix(cli): restrict git branch/tag/remote to read-only flags 2026-03-30 16:39:13 +03:00
Alex Alecu ca92e63b0f fix(cli): use allowlist for read-only git cmds 2026-03-30 16:28:53 +03:00
Alex Alecu 6fadd9de99 fix(cli): user denies override MCP ask rules
Re-apply user deny rules after the ask-specific config so explicit
user denies for MCP servers are not overridden by the generated
mcpRules 'ask' defaults.
2026-03-30 15:31:47 +03:00
Alex Alecu a68cf47dac fix(cli): remove find from Ask allowlist, add git write denials
find has -exec/-execdir/-delete flags that execute arbitrary commands
or delete files, bypassing the prefix-based permission check. Also add
missing git write subcommand denials: config, clone, pull, init,
worktree, submodule, revert, bisect, filter-branch, fetch, restore.
2026-03-30 15:21:55 +03:00
Alex Alecu e64aba0b23 test(cli): add Ask agent permission tests
Verify readOnlyBash allowlist, git write denials, gh ask rules,
disabled() behavior for edit/task/bash tools, and dynamic MCP
permission generation with server name sanitization.
2026-03-30 15:06:36 +03:00
Alex Alecu 1d7bc41841 feat(cli): add MCP tool support to Ask agent
Dynamically build per-server permission rules from cfg.mcp at agent init
time using the same sanitization as mcp/index.ts. MCP tools get "ask"
permission so every call requires user approval. Rules are spread after
"*": "deny" to override via findLast() semantics.
2026-03-30 15:03:40 +03:00
Marius 2cdf6b61c7 perf(cli): cache MCP listTools results to avoid redundant RPCs per loop step (#7922)
MCP.tools() called client.listTools() for every connected server on
every agent loop iteration. With multiple servers this added hundreds
of milliseconds of overhead per step (measured ~300-750ms for remote
servers like Vercel).

Cache listTools results in a module-level Map and return them on
subsequent calls. The cache is invalidated on:
- ToolListChangedNotification from the MCP server
- Server add/connect/disconnect
- Instance dispose (config change, project switch, shutdown)
2026-03-30 14:02:57 +02:00
Alex Alecu 15ac71c5f0 feat(cli): add read-only bash commands to Ask agent
Define a readOnlyBash allowlist with deny-by-default semantics so the
Ask agent can run safe information-gathering commands (ls, cat, grep,
git log, find, jq, etc.) while blocking all write operations. Git write
subcommands (commit, push, merge, reset, etc.) are explicitly denied.
gh commands require user approval.
2026-03-30 15:02:23 +03:00
kiloconnect[bot] 482bf89b69 fix: add windowsHide:true to remaining spawn/exec calls to prevent CMD flash on Windows
Previous fixes in #6813 and subsequent PRs added windowsHide:true to most
spawn sites, but several call sites were missed or regressed:

- SDK server.ts (v1 + v2): kilo serve and TUI spawn
- ts-check.ts: Bun.spawn for tsc invocation
- github.ts: exec for browser open
- desktop-electron cli.ts: install script spawn and version check
- desktop-electron ipc.ts: open-path execFile
- desktop-electron apps.ts: wsl/where execFileSync calls

Without windowsHide:true, each of these subprocess invocations causes a
visible cmd.exe console window to briefly flash on Windows.

Closes #7896
2026-03-30 07:03:58 +00:00
Aarav Sharma e9060468a1 core: deprecate orchestrator agent with visual badge across UI
Mark the orchestrator agent as deprecated so users see a warning badge
in the mode switcher and agent settings, signaling they should migrate
to other agent configurations for task delegation.
2026-03-29 17:24:52 -06:00
kilo-maintainer[bot] 43811bfa03 release: v7.1.9 2026-03-28 07:57:17 +00:00
Marius 8102d801b9 fix(cli): gate Kilo API calls behind enabled_providers to prevent data leaks (#7813)
Skip Kilo provider injection, fetchDefaultModel, and ACP fallback when
enabled_providers is set and doesn't include kilo. Teams using only their
own models (e.g. LiteLLM) no longer make any external calls to api.kilo.ai.
New users without config are unaffected — Kilo free still works by default.
2026-03-27 17:19:31 +01:00
Marius 9cf83d8122 fix(cli): make FreeUsageLimitError non-retryable to prevent unrecoverable backoff loop (#7809)
* fix(cli): make FreeUsageLimitError non-retryable to prevent unrecoverable backoff loop

When a free model hits its usage cap, the retry loop would endlessly
retry with the same stale model reference. Switching models in the chat
selector could not break the loop because the processor captures the
model once at creation time. Making FreeUsageLimitError non-retryable
surfaces the error immediately so users can switch models and continue.

* chore(kilo-docs): update source links after removing FreeUsageLimitError URL
2026-03-27 17:19:30 +01:00
Evgeny Shurakov 49bb16ca31 Merge pull request #7733 from Kilo-Org/eshurakov/actually-afterthought
Cli - Include parentSessionId in heartbeat session info
2026-03-27 14:17:55 +01:00
Marian Alexandru Alecu 3445ce86b1 Merge pull request #7773 from Kilo-Org/fix/cli-empty-tool-calls-loop
fix(cli): infinite empty tool-calls loop when model returns tool_calls with no tools
2026-03-27 12:09:17 +02:00
Alex Alecu 05a82b37b8 fix(cli): prevent infinite loop on empty tool-calls (#7756)
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.
2026-03-27 12:02:57 +02:00
Alex Alecu a84edc3267 test(cli): add failing test for empty tool-calls loop (#7756)
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).
2026-03-27 11:59:55 +02:00
Marian Alexandru Alecu 536f7f9efb Merge pull request #7603 from Kilo-Org/feat/builtin-config-skill
feat(cli): add built-in kilo-config skill
2026-03-27 11:45:15 +02:00
Alex Alecu 38e0621b94 feat(cli): add TUI settings reference to kilo-config skill
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.
2026-03-27 10:26:26 +02:00
Alex Alecu d904bc7dc7 fix(cli): guard builtin skill removal after lookup 2026-03-27 09:53:51 +02:00
Alex Alecu 2485dc926c docs(cli): fix managed config paths for all platforms 2026-03-27 09:48:52 +02:00
Alex Alecu 61170cea0b fix(cli): reject removal of built-in skills 2026-03-27 09:48:24 +02:00