This workflow triggers a webhook when a pull request is closed and merged, specifically for branches containing 'feat'. It sends relevant PR data to a specified webhook URL.
The settingsButtonClicked command now accepts an optional tab argument,
and the autocomplete status bar passes "autocomplete" via the command
URI so clicking the settings link deep-links to the autocomplete tab.
The command URI (command:kilo-code.new.settingsButtonClicked) was hardcoded in all 23 i18n locale files, making it fragile and error-prone to update. This moves the command string to a single constant in AutocompleteStatusBar.ts and passes it as a {{command}} interpolation variable to the translation strings.
Track the active settings tab so it survives 'Reload Webviews' and can
be targeted from external navigation.
- Extend NavigateMessage with optional `tab` field
- Add settingsTabChanged webview→extension message
- Switch Settings Tabs to controlled mode with tab prop
- SettingsEditorProvider remembers the last active tab and re-sends it
on every webviewReady
- openPanel() accepts an optional tab param for deep-linking from
extension commands
The SettingsEditorProvider disposed its webviewReady listener after the
first fire, so when VS Code's 'Reload Webviews' command re-created the
JS context, no navigate message was re-sent and the panel fell back to
the default newTask view despite still being titled 'Kilo Settings'.
Keep the listener alive for the panel's lifetime so every webviewReady
(including reloads) re-sends the navigate message to the correct view.
* feat(vscode): replace message queuing with promptAsync and queued UI indicator
* ci: re-trigger Kilo Code Review
* fix: message ID monotonicity and image restoration on failed sends
- Extract Identifier.ascending() utility with proper monotonic counter
instead of hardcoded counter=1 that broke same-millisecond ordering
- Restore image attachments (not just text) when sendMessageFailed fires
- Add filename to FileAttachment type for round-trip preservation
- Add replace() to useImageAttachments hook
* fix: create optimistic file parts for image attachments in queued messages
Add FilePart type to Part union so optimistic messages include image
previews immediately. Previously, queued image messages only showed
text until the server echoed back the real parts.
* fix: clear optimistic parts when server confirms message
The server's message.updated SSE event does NOT include parts — they
arrive individually via part.updated events. Without clearing optimistic
parts on confirmation, both optimistic and real parts coexist, causing
duplicate images/text in the UI.
* fix: truncate message ID hex to 12 chars matching server's 6-byte format
The server's Identifier.ascending() writes 6 bytes big-endian (48 bits)
producing 12 hex chars. Our .toString(16) produced 14 hex chars (full
53-bit value), causing client IDs to sort BEFORE server assistant IDs
("18bdf..." < "f7b3..."). This triggered the server's loop exit
condition (lastUser.id < lastAssistant.id) after the first turn,
silently dropping all queued messages.
* fix: scope failed draft restore to the active session
Prevent sendMessageFailed from clobbering a new draft if the user
switched sessions between sending and the failure arriving.
- Add check-kilocode-change script in packages/kilo-vscode/package.json
- Update CI to use the script instead of inlined grep
- Document the check in root AGENTS.md alongside knip
Prevents re-filtering the model list on every keystroke by deferring
the filter until 250ms after the user stops typing. Uses SolidJS
onCleanup to cancel pending timers on each new keystroke.
- Replace O(n) indexOf per hover with a pre-computed flatIndexMap memo
- Use createSelector for fine-grained reactivity so only 2 items
re-render per hover instead of the entire list (fixes ~9 FPS issue)
- Rename: selectedModel→activeModel, activeIndex→selectedIndex,
CSS .active→.selected (hover highlight), CSS .selected→.active
(committed choice) for consistent semantics
Fixes#6997
The login flow had two browser-opening mechanisms firing simultaneously:
1. The backend's authenticateWithDeviceAuthTUI() opens the browser via the
'open' npm package during authorize()
2. handleLogin() called vscode.env.openExternal() which shows a VS Code
trust dialog AND opens a second browser tab
The trust dialog from vscode.env.openExternal() persisted after the user
completed authentication in the browser, since nothing dismissed it.
Remove the vscode.env.openExternal() call. The backend already opens the
browser, and the DeviceAuthCard webview provides an 'Open Browser' button
as a user-initiated fallback.
Closes#7026
* feat(vscode): add fork session context menu to Agent Manager tabs
Add right-click context menu on session tabs with Fork Session and Close
options. Forking creates a new session copying the full conversation
history via the CLI session.fork() API, supporting both worktree and
local sessions. Pending tabs only show Close (no fork).
* fix: address CI failures — remove unused CSS class, bump maxLines cap, add forkSession to routing test
* fix: bump AgentManagerProvider maxLines cap to 2000 (formatter adds lines in CI)
* refactor: extract fork logic into fork-session.ts, revert maxLines cap to 1900
Move session fork orchestration into a vscode-free module to keep
AgentManagerProvider under its maxLines cap. Improve the arch test
failure message to explicitly state the file needs modularization.
* refactor(vscode): extract keybinding map builder and share PLATFORM constant
- Extract buildKeybindingMap() from AgentManagerProvider into format-keybinding.ts
(pure data transformation, no vscode dependency)
- Import shared PLATFORM constant from constants.ts in both AgentManagerProvider
and fork-session.ts instead of duplicating the literal
- Reduces AgentManagerProvider.ts from 1922 to 1893 lines (under 1900 cap)
* docs(vscode): add maxLines policy to AGENTS.md
readMcpSettings() called JSON.parse() without try/catch. In migrate(),
if .kilocode/mcp.json existed but contained malformed JSON, the uncaught
exception propagated out of the dual-read loop, preventing .kilo/mcp.json
from ever being read. The outer loadMcpConfig() catch returned {} instead
of the valid config — silently losing MCP server configuration.
Wrap the file read + parse in try/catch, log a warning, and return null
so the loop continues to the next config directory.
Regression tests added for both readMcpSettings (unit) and migrate
(integration) to prove the bug and verify the fix.
Refs: #6881
Co-authored-by: marius-kiloclaw <marius-kiloclaw@users.noreply.github.com>
* fix(vscode): restore Agent Manager panel on VS Code restart
Register a WebviewPanelSerializer for the Agent Manager so VS Code
automatically reopens the panel when the window is restored. Extract
panel setup into a shared attachPanel() method used by both openPanel()
and the new deserializeWebviewPanel() entry point.
* fix: add activation event and reapply webview options for deserialized panels
Address review bot feedback:
- Add onWebviewPanel activation event to package.json so VS Code
activates the extension during window restore
- Reapply enableScripts and localResourceRoots in attachPanel() for
deserialized panels that don't carry over creation options
* fix: show localized error when git is not installed on Windows
* fix: add git pre-flight check to PR import flow
* chore: update kilo-vscode visual regression baselines
* fix: add errorCode to WorktreeSetupMessage type
* fix: add errorCode to import branch/PR error paths
* revert: remove unrelated package.json sorting changes
* Fix localization of error message
* fix: use typed errorCode in import result messages and dialog toast
---------
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>