Commit Graph

4749 Commits

Author SHA1 Message Date
Alex Alecu 5ddd2167fc fix: scope recall sessions to project worktrees
Keep recall and the all-sessions picker focused on the current repo while still surfacing sessions from sibling worktrees.
2026-04-03 22:07:11 +03:00
Alex Alecu e9fbf6b72a fix(cli): require recall permission prompts 2026-04-03 12:07:25 +03:00
Alex Alecu dd571e4b8b fix(cli): read full recall 2026-04-03 12:07:25 +03:00
Alex Alecu 29ec6e4017 fix(cli): block cross project open 2026-04-03 12:07:25 +03:00
Alex Alecu 75231b3254 fix(cli): gate recall search 2026-04-03 12:07:25 +03:00
Marian Alexandru Alecu 8bb6d0f9ee Merge branch 'main' into feat/local-recall-tool 2026-04-03 10:24:47 +03:00
Catriel Müller 73c4efe52d Merge pull request #8218 from Kilo-Org/catrielmuller/kiloclaw-chat-orgs
feat(cli): add org support for /kiloclaw command
2026-04-02 15:48:25 -03:00
kilo-maintainer[bot] b91653bf97 release: v7.1.20 2026-04-02 17:33:20 +00:00
Catriel Müller 09a1faf21e feat(cli): add org support for /kiloclaw command
Pass the selected organization context through to KiloClaw API
endpoints so the /kiloclaw command resolves the correct org-scoped
instance when a team is selected via /teams.
2026-04-02 14:22:40 -03:00
kilo-maintainer[bot] e45ddb41b4 release: v7.1.19 2026-04-02 14:00:55 +00:00
Alex Alecu 7d3f29953d fix(cli): show repo roots in global session list
Replace long absolute project paths in the all-project session picker so cross-project browsing stays readable in the TUI.
2026-04-02 16:34:03 +03:00
Alex Alecu 117479ccee fix(cli): always register local recall tool
Avoid hiding session recall behind an opt-in flag so agents can reliably find prior debugging context.
2026-04-02 16:03:33 +03:00
Alex Alecu 2e1ff4a482 fix(cli): address review findings for recall tool
- Add 200 message limit to read mode to prevent large memory allocation
- Improve not-found error to guide LLM to search first
- Gate RecallTool behind config.experimental.recall flag
- Replace `as any` with typed cast in TUI dialog
2026-04-02 15:47:22 +03:00
Alex Alecu 93ce148f33 feat(cli): add kilo_local_recall tool and cross-project session search
Add agent tool to search and read past conversations across all projects.
Add --all and --search flags to 'kilo session list' CLI command.
Add Ctrl+A toggle in TUI session list for all-projects view.
2026-04-02 15:39:36 +03:00
Catriel Müller 581f90f9ae Merge pull request #7800 from Kilo-Org/catrielmuller/kiloclaw-client
feat(cli): KiloClaw Chat on TUI
2026-04-02 07:39:54 -03:00
Marius f7b6c996dd fix: bound hung state disposal during provider auth refresh (#8090) 2026-04-02 12:25:44 +02:00
Marius 5187cb0fd4 fix(cli): guard against null theme in TUI resolveTheme and Proxy (#8112)
* fix(cli): guard against null theme in TUI resolveTheme and Proxy

Add null guards to prevent crashes when theme.theme is null/undefined:
- Add isValidTheme type guard with fallback to built-in kilo theme
- Wrap theme resolution memo in try/catch for resilience
- Use empty object as Proxy target instead of memo result
- Validate custom theme JSON and protect built-in theme keys

Closes #8109

* fix(cli): validate required theme keys in isValidTheme

Check for background, text, and primary keys to reject empty or
partial theme objects that would produce undefined field accesses.
2026-04-02 12:24:33 +02:00
Aarav 2e3b9a2432 fix: RevertBanner UI shows no changes after successful file revert (#8121)
* core: fix revert diff showing incorrect changes after file restore

When reverting a session, the diff was computed after files were already
reverted to their pre-change state, producing an empty or wrong diff.
By computing the diff before restoring files, the revert summary now
correctly reflects what was actually undone for the user.

* core: reduce revert diff size in DB to save storage

Full file contents were being stored in the session summary diffs,
causing unnecessary database bloat. The webview RevertBanner only
needs file path, line counts, and status — not the full diff content.

* chore(cli): add kilocode_change markers to revert diff changes

---------

Co-authored-by: Marius <marius@kilocode.ai>
2026-04-02 12:21:43 +02:00
kilo-maintainer[bot] 3b2db43a4b release: v7.1.18 2026-04-02 10:18:47 +00:00
Marius 3a86e15189 fix(cli): prevent unbounded log file growth with size-based rotation (#8136)
* fix(cli): prevent unbounded log file growth with size-based rotation

Fix two issues causing log files to grow to 50+ GB:

1. Server middleware leaked a "started" log line for skipped endpoints
   because log.time() was called unconditionally — only timer.stop()
   was gated by the skipLogging flag. Restructure to early-return for
   skipped paths so no logging occurs at all.

2. Log files had no size limit within a session. A long-running
   kilo serve process (e.g. VS Code extension) would write a single
   file indefinitely. Add rotating-file-stream (50 MB, maxFiles: 1)
   to cap log file size automatically.

* fix(cli): address review feedback on log rotation

- Revert server.ts changes (handled separately in #8141)
- Add error/warning event handlers on rotating-file-stream
- Increase maxFiles from 1 to 3 for better debug headroom
- Set explicit history file path to avoid .txt side-effect

* fix(cli): revert maxFiles back to 1

maxFiles: 1 is sufficient — we only need to cap disk usage, not retain
old rotated fragments. The existing cleanup() handles session-level
file retention separately.

* fix(cli): set maxFiles to 10 for log rotation
2026-04-02 11:54:49 +02:00
kilo-code-bot[bot] e09040fe45 fix(cli,vscode): import disabled MCPs with enabled: false instead of skipping them (#8098)
The MCP importer was silently ignoring disabled MCP servers during import.
Now imports all configured MCPs and preserves their disabled state by
setting enabled: false in the converted config.

Closes #8096

Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com>
Co-authored-by: Imanol Maiztegui <imanol.mzd@gmail.com>
Co-authored-by: Mark IJbema <mark@kilocode.ai>
2026-04-02 09:36:44 +00:00
Mark IJbema 2a9447c15d perf(server): skip logging for /log and /telemetry/capture via early return 2026-04-02 10:39:06 +02:00
Catriel Müller 32f670e1cc Merge branch 'main' into catrielmuller/kiloclaw-client 2026-04-01 16:20:14 -03:00
Catriel Müller f1075fc6a9 refactor: address issues 2026-04-01 16:15:51 -03:00
Catriel Müller a1abbc2b4d refactor: fix unmount 2026-04-01 16:08:14 -03:00
Catriel Müller 964cc74007 refactor: improve SDK claw types 2026-04-01 16:04:32 -03:00
kilo-maintainer[bot] 8f7a5f48b3 release: v7.1.17 2026-04-01 15:08:40 +00:00
kilo-maintainer[bot] 325a64eaca release: v7.1.16 2026-04-01 14:37:43 +00:00
Marius 18322e9eed fix(cli): inject plan file path into non-experimental plan mode prompt (#8065)
* fix(cli): inject plan file path into non-experimental plan mode prompt

The plan.txt prompt said 'STRICTLY FORBIDDEN: ANY file edits, ZERO
exceptions' without telling the agent where the plan file is. The agent
had to guess from the directory tree, often picking .kilocode/ (which
exists) over .kilo/ (which doesn't). Now the non-experimental path
computes Session.plan(), creates the directory, and injects the exact
path into the prompt — matching what the experimental plan mode already
does.

Fixes #6907

* fix(cli): use absolute plan path in prompt to match experimental mode

Addresses bot review: relative path resolves against Instance.directory,
not Instance.worktree, so subdirectory sessions would target the wrong
file. Use the absolute path from Session.plan() like the experimental
plan mode does.

* chore(cli): add kilocode_change markers to plan file path injection
2026-04-01 14:47:47 +02:00
kilo-maintainer[bot] a1c8e5d798 release: v7.1.15 2026-04-01 12:32:06 +00:00
Mark IJbema 6f7df50b45 Revert "fix(cli): prevent zombie kilo serve processes on extension host crash" 2026-04-01 14:16:01 +02:00
Marius a2fc2ad936 fix: keep plan follow-up sessions in the same worktree (#7945)
* fix: keep plan follow-up sessions in the same worktree

Route follow-up question replies by the owning session and create child implementation sessions from the planning session directory so "Start new session" stays visible and runs in the right worktree.

Refs #6339

* fix: keep worktree follow-up sessions reloadable

Adopt backend-created worktree sessions by normalized directory matching and keep plan follow-up sessions as roots so Agent Manager still restores them after reload.\n\nRefs #6339

* fix(vscode): track plan follow-up sessions in the sidebar

Record pending "Start new session" replies in single-session providers so the follow-up session.created event can be adopted and opened in the sidebar and regular tabs, while Agent Manager keeps using its own worktree adoption path.\n\nRefs #6339

* fix(vscode): forward pending follow-up session events

Allow pending plan follow-up session.created events through the KiloProvider SSE filter so sidebar and tab providers can adopt and open them before the new session is tracked.\n\nRefs #6339

* fix(agent-manager): open tab for adopted follow-up sessions

Navigate to the correct worktree or add a local tab when Agent Manager adopts a backend-created follow-up session, matching the existing sessionForked behavior.\n\nRefs #6339

* refactor(vscode): unify follow-up session adoption across all providers

Remove the separate adopt-session mechanism for Agent Manager and use the same KiloProvider follow-up path that sidebar and tabs use. The sessionCreated webview handler now works regardless of the current sidebar selection, so follow-up sessions appear as local tabs everywhere.\n\nRefs #6339

* test: align followup test with parentID field from main
2026-04-01 14:02:47 +02:00
kilo-maintainer[bot] c9d4d1ac87 release: v7.1.14 2026-04-01 10:39:53 +00:00
Mark IJbema 06b2c7a657 Merge pull request #8060 from Kilo-Org/mark/skip-telemetry-request-logging
fix: skip request logging for /telemetry/capture endpoint
2026-04-01 12:19:55 +02:00
Mark IJbema 645ad36303 fix: skip request logging for /telemetry/capture endpoint
The server middleware logs 3 lines per HTTP request (request, started,
completed). For /telemetry/capture this creates unnecessary log volume
since autocomplete telemetry can fire multiple events per keystroke
(Suggestion Requested, LLM Suggestion Returned, Unique Suggestion Shown).

Add /telemetry/capture to the skipLogging check alongside /log to reduce
noise in the kilo server log files at ~/.local/share/kilo/log/.
2026-04-01 12:06:26 +02:00
kiloconnect[bot] 2de6c363e3 fix(cli): prevent zombie kilo serve processes on extension host crash
When the VS Code extension host is hard-killed (crash, OOM, kill -9),
dispose() is never called and the kilo serve child process is orphaned.

Fix by using a stdin keepalive pipe: the extension keeps stdin open after
spawning the CLI. The CLI watches for EOF on stdin (only when
KILO_CLIENT=vscode) and triggers a clean shutdown. The OS closes the
write-end of the pipe on any parent death, so the CLI always exits
regardless of how the extension host terminates.

On clean dispose(), stdin is explicitly closed before sending SIGTERM,
so the shutdown path is consistent in both the crash and clean cases.

Closes #8050
2026-04-01 09:04:30 +00:00
kilo-maintainer[bot] 3cc4d38f12 release: v7.1.13 2026-04-01 07:35:46 +00:00
Mark IJbema 664bccc9aa Revert "fix(cli): restore directory tree in system prompt" 2026-04-01 08:50:46 +02:00
kilo-maintainer[bot] 1e8e07f9dc release: v7.1.12 2026-03-31 22:51:56 +00:00
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