Merge remote-tracking branch 'origin/main' into feat/encoding-preservation

This commit is contained in:
kiloconnect[bot]
2026-04-21 16:02:33 +00:00
58 changed files with 589 additions and 210 deletions
-5
View File
@@ -1,5 +0,0 @@
---
"@kilocode/kilo-gateway": minor
---
Add Alibaba as a supported AI SDK provider for routing Qwen model requests via the native `@ai-sdk/alibaba` adapter.
-5
View File
@@ -1,5 +0,0 @@
---
"kilo-code": minor
---
Support forking Agent Manager sessions from a specific user message.
-5
View File
@@ -1,5 +0,0 @@
---
"@kilocode/cli": patch
---
Add Alibaba to `kiloProviderOptions` so thinking is enabled correctly when routing through the Kilo gateway with `ai_sdk_provider: "alibaba"`.
-5
View File
@@ -1,5 +0,0 @@
---
"@kilocode/cli": patch
---
Make the `description` parameter of the bash tool optional.
@@ -1,6 +0,0 @@
---
"kilo-code": patch
"@kilocode/cli": patch
---
Fix custom provider model and variant deletions being silently reverted on save. Removing a model or reasoning variant from a custom provider now actually removes it from your config.
@@ -1,5 +0,0 @@
---
"kilo-code": patch
---
Fix custom provider variant name validation showing inline errors correctly when a variant name is left empty
@@ -1,5 +0,0 @@
---
"kilo-code": patch
---
Fixed Agent Manager incorrectly duplicating worktree sessions into the Local tab when forking a session or using "Continue in Worktree".
-5
View File
@@ -1,5 +0,0 @@
---
"kilo-code": patch
---
Add KiloClaw chat panel to the VS Code extension
@@ -1,5 +0,0 @@
---
"kilo-code": patch
---
Fix the "Continue here" button not submitting after a plan is finished. Picking an option on a single-question prompt now sends the reply immediately — matching the CLI behaviour — and the redundant "Type your own answer" row no longer appears on the plan follow-up question.
@@ -0,0 +1,5 @@
---
"@kilocode/cli": patch
---
Fix the "Start new session" button on the plan follow-up prompt not switching the VS Code Agent Manager to the new session when handover generation is slow. The new session now opens immediately, shows the plan text right away, stays visibly busy while the handover summary is being prepared, and appends that summary once it finishes generating.
-5
View File
@@ -1,5 +0,0 @@
---
"kilo-code": patch
---
Translate the follow-up prompt shown after finishing a plan. The "Ready to implement?" question, "Start new session" and "Continue here" buttons, and their descriptions now respect the language configured in the VS Code sidebar.
@@ -1,5 +0,0 @@
---
"kilo-code": patch
---
Fix duplicate text shown when typing a custom answer in the question tool. The preview text above the input field is now hidden while editing, so only the input value is visible.
@@ -1,5 +0,0 @@
---
"kilo-code": patch
---
Fix queued follow-up messages so they stay stacked at the bottom of the chat while the previous turn is still being processed, instead of getting interleaved with tool output.
-5
View File
@@ -1,5 +0,0 @@
---
"@kilocode/cli": patch
---
Clarify suggest tool guidance so the assistant writes its final summary before offering a local review.
-5
View File
@@ -1,5 +0,0 @@
---
"kilo-code": patch
---
Restore earlier chat history when scrolling through virtualized message lists.
-5
View File
@@ -1,5 +0,0 @@
---
"kilo-code": patch
---
Fix chat scroll jumping back to the bottom while the session is busy — you can now scroll up to read earlier context while a response is streaming or while a question is waiting for your answer.
-5
View File
@@ -1,5 +0,0 @@
---
"kilo-code": minor
---
Support forking sidebar conversations from any user message.
-5
View File
@@ -1,5 +0,0 @@
---
"kilo-code": patch
---
Fix a stuck session state when the suggest tool was left open. If the suggestion was never accepted or dismissed (for example, because VS Code was closed while it was showing), the session stayed marked as busy and any follow-up messages appeared queued forever. The session is now marked idle while waiting for a response to a suggestion.
-6
View File
@@ -1,6 +0,0 @@
---
"@kilocode/cli": patch
"@kilocode/kilo-gateway": patch
---
Update `@ai-sdk/anthropic` to 3.0.71, adding `xhigh` effort for Opus 4.7 adaptive thinking (3.0.70) and fixing fine-grained tool streaming beta header for Opus 4.7 (3.0.71)
@@ -1,5 +0,0 @@
---
"@kilocode/cli": patch
---
Update `@ai-sdk/amazon-bedrock` to 4.0.96 and `@ai-sdk/google-vertex` to 4.0.112, both of which include Opus 4.7 support with `xhigh` adaptive thinking effort
-5
View File
@@ -1,5 +0,0 @@
---
"kilo-code": patch
---
Restore spacing between sub-agent output and the following user message in the VS Code chat.
+1 -8
View File
@@ -40,19 +40,12 @@ permissions:
jobs:
smoke-test:
name: Smoke Test
runs-on: ubuntu-24.04
runs-on: blacksmith-2vcpu-ubuntu-2404
timeout-minutes: 30
env:
KILO_API_KEY: ${{ secrets.KILO_API_KEY }}
KILO_ORG_ID: ${{ secrets.KILO_ORG_ID }}
steps:
- name: Free disk space
continue-on-error: true
run: |
sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc \
/usr/local/share/boost /opt/hostedtoolcache
sudo docker image prune --all --force
- name: Checkout kilo-bench
uses: actions/checkout@v4
with:
+18 -17
View File
@@ -30,7 +30,7 @@
},
"packages/app": {
"name": "@opencode-ai/app",
"version": "7.2.14",
"version": "7.2.17",
"dependencies": {
"@kilocode/kilo-i18n": "workspace:*",
"@kilocode/kilo-ui": "workspace:*",
@@ -86,7 +86,7 @@
},
"packages/desktop": {
"name": "@opencode-ai/desktop",
"version": "7.2.14",
"version": "7.2.17",
"dependencies": {
"@opencode-ai/app": "workspace:*",
"@opencode-ai/ui": "workspace:*",
@@ -119,7 +119,7 @@
},
"packages/desktop-electron": {
"name": "@opencode-ai/desktop-electron",
"version": "7.2.14",
"version": "7.2.17",
"dependencies": {
"@opencode-ai/app": "workspace:*",
"@opencode-ai/ui": "workspace:*",
@@ -170,7 +170,7 @@
},
"packages/kilo-docs": {
"name": "@kilocode/kilo-docs",
"version": "7.2.14",
"version": "7.2.17",
"dependencies": {
"@docsearch/css": "^4",
"@docsearch/js": "^4",
@@ -199,7 +199,7 @@
},
"packages/kilo-gateway": {
"name": "@kilocode/kilo-gateway",
"version": "7.2.14",
"version": "7.2.17",
"dependencies": {
"@ai-sdk/alibaba": "1.0.17",
"@ai-sdk/anthropic": "3.0.71",
@@ -235,7 +235,7 @@
},
"packages/kilo-i18n": {
"name": "@kilocode/kilo-i18n",
"version": "7.2.14",
"version": "7.2.17",
"devDependencies": {
"@tsconfig/node22": "catalog:",
"@types/bun": "catalog:",
@@ -248,7 +248,7 @@
},
"packages/kilo-telemetry": {
"name": "@kilocode/kilo-telemetry",
"version": "7.2.14",
"version": "7.2.17",
"dependencies": {
"@kilocode/kilo-gateway": "workspace:*",
"@opentelemetry/api": "1.9.0",
@@ -268,7 +268,7 @@
},
"packages/kilo-ui": {
"name": "@kilocode/kilo-ui",
"version": "7.2.14",
"version": "7.2.17",
"dependencies": {
"@kobalte/core": "0.13.11",
"@opencode-ai/util": "workspace:*",
@@ -303,7 +303,7 @@
},
"packages/kilo-vscode": {
"name": "kilo-code",
"version": "7.2.14",
"version": "7.2.17",
"dependencies": {
"@anthropic-ai/sdk": "^0.39.0",
"@kilocode/kilo-i18n": "workspace:*",
@@ -358,7 +358,7 @@
},
"packages/opencode": {
"name": "@kilocode/cli",
"version": "7.2.14",
"version": "7.2.17",
"bin": {
"kilo": "./bin/kilo",
"kilocode": "./bin/kilo",
@@ -512,7 +512,7 @@
},
"packages/plugin": {
"name": "@kilocode/plugin",
"version": "7.2.14",
"version": "7.2.17",
"dependencies": {
"@kilocode/sdk": "workspace:*",
"effect": "catalog:",
@@ -537,7 +537,7 @@
},
"packages/script": {
"name": "@opencode-ai/script",
"version": "7.2.14",
"version": "7.2.17",
"dependencies": {
"semver": "^7.6.3",
},
@@ -548,7 +548,7 @@
},
"packages/sdk/js": {
"name": "@kilocode/sdk",
"version": "7.2.14",
"version": "7.2.17",
"dependencies": {
"cross-spawn": "catalog:",
},
@@ -563,7 +563,7 @@
},
"packages/server": {
"name": "@opencode-ai/server",
"version": "7.2.14",
"version": "7.2.17",
"dependencies": {
"effect": "catalog:",
},
@@ -573,7 +573,7 @@
},
"packages/storybook": {
"name": "@opencode-ai/storybook",
"version": "7.2.14",
"version": "7.2.17",
"devDependencies": {
"@opencode-ai/ui": "workspace:*",
"@solidjs/meta": "catalog:",
@@ -596,7 +596,7 @@
},
"packages/ui": {
"name": "@opencode-ai/ui",
"version": "7.2.14",
"version": "7.2.17",
"dependencies": {
"@kilocode/sdk": "workspace:*",
"@kobalte/core": "catalog:",
@@ -646,7 +646,7 @@
},
"packages/util": {
"name": "@opencode-ai/util",
"version": "7.2.14",
"version": "7.2.17",
"dependencies": {
"zod": "catalog:",
},
@@ -666,6 +666,7 @@
],
"patchedDependencies": {
"@standard-community/standard-openapi@0.2.9": "patches/@standard-community%2Fstandard-openapi@0.2.9.patch",
"stream-chat@9.38.0": "patches/stream-chat@9.38.0.patch",
},
"overrides": {
"@effect/platform-node-shared": "4.0.0-beta.46",
+4 -4
View File
@@ -1,8 +1,8 @@
{
"nodeModules": {
"x86_64-linux": "sha256-XbN+85hGFq53RxAaksXBwD4n2PYrcVimDyJGsyi4IW0=",
"aarch64-linux": "sha256-F6lWJh3J2vdRv+gfYFa8kNPNHgBRhjlwtQdFKHNjaZo=",
"aarch64-darwin": "sha256-3oURfnhyuvj86o4TCH9vCnIoNVcwwRFE6wcc4xG2qLY=",
"x86_64-darwin": "sha256-pQUBadkJdkqPKpi5sgJsEGw40ZeASDK1xG/XpcfnECo="
"x86_64-linux": "sha256-ReAVmBtIE8Et9mDuzCWuB/ExtqaEQRXYPYoMEJ604Qw=",
"aarch64-linux": "sha256-4Ce94KfjrppSRLrF6ogA1nZCBIqo3RvRjPd4Y+Xrcrg=",
"aarch64-darwin": "sha256-RBqhQJclQc71cR9Aby8HQncYMadIpL//pE+QnF8og5w=",
"x86_64-darwin": "sha256-WrYlAn5cjrlBVcPzGg+ysrzWXjsM6bDQhu9lUIPe8cs="
}
}
+3 -2
View File
@@ -135,8 +135,9 @@
},
"patchedDependencies": {
"@standard-community/standard-openapi@0.2.9": "patches/@standard-community%2Fstandard-openapi@0.2.9.patch",
"solid-js@1.9.10": "patches/solid-js@1.9.10.patch"
"solid-js@1.9.10": "patches/solid-js@1.9.10.patch",
"stream-chat@9.38.0": "patches/stream-chat@9.38.0.patch"
},
"version": "7.2.14",
"version": "7.2.17",
"peerDependencies": {}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/app",
"version": "7.2.14",
"version": "7.2.17",
"description": "",
"type": "module",
"exports": {
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@opencode-ai/desktop-electron",
"private": true,
"version": "7.2.14",
"version": "7.2.17",
"type": "module",
"license": "MIT",
"homepage": "https://opencode.ai",
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@opencode-ai/desktop",
"private": true,
"version": "7.2.14",
"version": "7.2.17",
"type": "module",
"license": "MIT",
"scripts": {
+6 -6
View File
@@ -1,7 +1,7 @@
id = "kilo"
name = "Kilo"
description = "The open source coding agent."
version = "1.4.6"
version = "7.2.17"
schema_version = 1
authors = ["Anomaly"]
repository = "https://github.com/Kilo-Org/kilocode"
@@ -11,26 +11,26 @@ name = "Kilo"
icon = "./icons/opencode.svg"
[agent_servers.opencode.targets.darwin-aarch64]
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v1.4.6/opencode-darwin-arm64.zip"
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.2.17/opencode-darwin-arm64.zip"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.darwin-x86_64]
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v1.4.6/opencode-darwin-x64.zip"
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.2.17/opencode-darwin-x64.zip"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.linux-aarch64]
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v1.4.6/opencode-linux-arm64.tar.gz"
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.2.17/opencode-linux-arm64.tar.gz"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.linux-x86_64]
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v1.4.6/opencode-linux-x64.tar.gz"
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.2.17/opencode-linux-x64.tar.gz"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.windows-x86_64]
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v1.4.6/opencode-windows-x64.zip"
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.2.17/opencode-windows-x64.zip"
cmd = "./opencode.exe"
args = ["acp"]
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@kilocode/kilo-docs",
"version": "7.2.14",
"version": "7.2.17",
"private": true,
"scripts": {
"dev": "next dev --webpack --port 3002",
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@kilocode/kilo-gateway",
"version": "7.2.14",
"version": "7.2.17",
"type": "module",
"license": "MIT",
"description": "Unified Kilo Gateway package for OpenCode - authentication, provider, and API integration",
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@kilocode/kilo-i18n",
"version": "7.2.14",
"version": "7.2.17",
"type": "module",
"license": "MIT",
"description": "Kilo-specific i18n translations and overrides",
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@kilocode/kilo-telemetry",
"version": "7.2.14",
"version": "7.2.17",
"type": "module",
"license": "MIT",
"description": "Telemetry for Kilo CLI - PostHog analytics integration",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@kilocode/kilo-ui",
"version": "7.2.14",
"version": "7.2.17",
"type": "module",
"license": "MIT",
"exports": {
+40
View File
@@ -1,5 +1,45 @@
# kilo-code
## 7.2.17
### Minor Changes
- [#9207](https://github.com/Kilo-Org/kilocode/pull/9207) [`4d85c23`](https://github.com/Kilo-Org/kilocode/commit/4d85c232681fb6844521bda5209dd021d742edd6) - Support forking Agent Manager sessions from a specific user message.
- [#9244](https://github.com/Kilo-Org/kilocode/pull/9244) [`18442f6`](https://github.com/Kilo-Org/kilocode/commit/18442f695dee16ce98e1fe06c74cea74e6e18be0) - Support forking sidebar conversations from any user message.
### Patch Changes
- [#9305](https://github.com/Kilo-Org/kilocode/pull/9305) [`b4cb8c3`](https://github.com/Kilo-Org/kilocode/commit/b4cb8c3c04b6f7918032840785d3f6a6a8d077ac) - Prewarm the autocomplete backend on activation so inline completions are ready on first keystroke without opening the Kilo sidebar, and refresh autocomplete state when workspace folders change.
- [#9318](https://github.com/Kilo-Org/kilocode/pull/9318) [`bfe4482`](https://github.com/Kilo-Org/kilocode/commit/bfe44822ed51292606daeb34325a0847d381ba40) - Prevent canceled autocomplete debounce requests from staying pending indefinitely.
- [#9316](https://github.com/Kilo-Org/kilocode/pull/9316) [`bf98bbe`](https://github.com/Kilo-Org/kilocode/commit/bf98bbe34d2b143d0f7e5f50aa3732715ded75a0) - Cap autocomplete ignore path caching so long sessions do not retain unlimited paths.
- [#9239](https://github.com/Kilo-Org/kilocode/pull/9239) [`2b17a7b`](https://github.com/Kilo-Org/kilocode/commit/2b17a7b4e80bb2bd30bd95d047c31ad17dd339b6) - Fix custom provider model and variant deletions being silently reverted on save. Removing a model or reasoning variant from a custom provider now actually removes it from your config.
- [#9241](https://github.com/Kilo-Org/kilocode/pull/9241) [`6c0439b`](https://github.com/Kilo-Org/kilocode/commit/6c0439b0003d2bd011a9aa5bf0b634c18a0e9771) - Fix custom provider variant name validation showing inline errors correctly when a variant name is left empty
- [#9208](https://github.com/Kilo-Org/kilocode/pull/9208) [`acd5798`](https://github.com/Kilo-Org/kilocode/commit/acd5798d99027e4281c8b7fb6c741ff8d63d8c2c) - Fixed Agent Manager incorrectly duplicating worktree sessions into the Local tab when forking a session or using "Continue in Worktree".
- [#7960](https://github.com/Kilo-Org/kilocode/pull/7960) [`d1aed36`](https://github.com/Kilo-Org/kilocode/commit/d1aed364fb5d8aa6d45800c3647a7e1a1287c427) - Add KiloClaw chat panel to the VS Code extension
- [#9245](https://github.com/Kilo-Org/kilocode/pull/9245) [`ec5ac2e`](https://github.com/Kilo-Org/kilocode/commit/ec5ac2e19f69052dae375c9ddc2f7edb67c62358) - Fix the "Continue here" button not submitting after a plan is finished. Picking an option on a single-question prompt now sends the reply immediately — matching the CLI behaviour — and the redundant "Type your own answer" row no longer appears on the plan follow-up question.
- [#9246](https://github.com/Kilo-Org/kilocode/pull/9246) [`c529142`](https://github.com/Kilo-Org/kilocode/commit/c529142d7273092f657f02c66f39f06e9ed55ecc) - Translate the follow-up prompt shown after finishing a plan. The "Ready to implement?" question, "Start new session" and "Continue here" buttons, and their descriptions now respect the language configured in the VS Code sidebar.
- [#9129](https://github.com/Kilo-Org/kilocode/pull/9129) [`60709fd`](https://github.com/Kilo-Org/kilocode/commit/60709fd015aa206c7466a6197642f144280ea2be) - Fix duplicate text shown when typing a custom answer in the question tool. The preview text above the input field is now hidden while editing, so only the input value is visible.
- [#9195](https://github.com/Kilo-Org/kilocode/pull/9195) [`7038ce0`](https://github.com/Kilo-Org/kilocode/commit/7038ce0612179c72d4d369cdd7e337995c3a56fd) - Fix queued follow-up messages so they stay stacked at the bottom of the chat while the previous turn is still being processed, instead of getting interleaved with tool output.
- [#9194](https://github.com/Kilo-Org/kilocode/pull/9194) [`0ace2f9`](https://github.com/Kilo-Org/kilocode/commit/0ace2f960f634c27199468c214cebd0154c998db) - Restore earlier chat history when scrolling through virtualized message lists.
- [#9236](https://github.com/Kilo-Org/kilocode/pull/9236) [`6f17bb7`](https://github.com/Kilo-Org/kilocode/commit/6f17bb753bc83ba8fbe999fefe109275370637d1) - Fix chat scroll jumping back to the bottom while the session is busy — you can now scroll up to read earlier context while a response is streaming or while a question is waiting for your answer.
- [#9199](https://github.com/Kilo-Org/kilocode/pull/9199) [`7a1388d`](https://github.com/Kilo-Org/kilocode/commit/7a1388d8d5849aac017a02a33527603c48d0b0a4) - Fix a stuck session state when the suggest tool was left open. If the suggestion was never accepted or dismissed (for example, because VS Code was closed while it was showing), the session stayed marked as busy and any follow-up messages appeared queued forever. The session is now marked idle while waiting for a response to a suggestion.
- [#9141](https://github.com/Kilo-Org/kilocode/pull/9141) [`61ec925`](https://github.com/Kilo-Org/kilocode/commit/61ec925c509d6437942c23a604aaaeefa16d3c3f) - Restore spacing between sub-agent output and the following user message in the VS Code chat.
## 7.2.14
### Minor Changes
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "kilo-code",
"displayName": "Kilo Code: AI Coding Agent, Copilot, and Autocomplete",
"description": "Open Source AI coding agent that generates code from natural language, automates tasks, and runs terminal commands. Features inline autocomplete, browser automation, automated refactoring, and custom modes for planning, coding, and debugging. Supports 500+ AI models including Claude (Anthropic), Gemini, Grok, GPT, Codex and GLM.",
"version": "7.2.14",
"version": "7.2.17",
"icon": "assets/icons/logo-outline-black.png",
"galleryBanner": {
"color": "#FFFFFF",
+3 -3
View File
@@ -64,6 +64,9 @@ export function activate(context: vscode.ExtensionContext) {
}
})
// Prewarm the CLI backend early so autocomplete is ready before first editor use.
ensureBackendForAutocomplete(connectionService)
// Track all open tab panel providers so toolbar button commands can target them.
// NOTE: The editor/title toolbar for tab panels intentionally omits Agent Manager
// and Marketplace buttons (unlike the sidebar). Too many icons causes VS Code to
@@ -355,9 +358,6 @@ export function activate(context: vscode.ExtensionContext) {
// Register autocomplete provider
registerAutocompleteProvider(context, connectionService)
// Start the CLI backend server eagerly so autocomplete works without opening a Kilo tab.
ensureBackendForAutocomplete(connectionService)
// Register commit message generation
registerCommitMessageService(context, connectionService)
@@ -299,7 +299,7 @@ export class AutocompleteInlineCompletionProvider implements vscode.InlineComple
clearTimeout(this.debounceTimer)
this.debounceTimer = null
}
this.debouncedPendingRequest = null
this.settleDebouncedPendingRequest()
this.pendingRequests.length = 0
this.fimAbortController?.abort()
this.fimAbortController = null
@@ -484,6 +484,15 @@ export class AutocompleteInlineCompletionProvider implements vscode.InlineComple
}
}
private settleDebouncedPendingRequest(): void {
const pending = this.debouncedPendingRequest
if (!pending) return
this.removePendingRequest(pending)
pending.resolve?.()
this.debouncedPendingRequest = null
}
/**
* Debounced fetch with leading edge execution and pending request reuse.
* - First call executes immediately (leading edge)
@@ -519,10 +528,8 @@ export class AutocompleteInlineCompletionProvider implements vscode.InlineComple
// otherwise linger with a never-resolving promise.
if (this.debounceTimer !== null) {
clearTimeout(this.debounceTimer)
if (this.debouncedPendingRequest) {
this.removePendingRequest(this.debouncedPendingRequest)
this.debouncedPendingRequest = null
}
this.debounceTimer = null
this.settleDebouncedPendingRequest()
}
// Create the pending request object first so we can reference it in the cleanup
@@ -533,14 +540,17 @@ export class AutocompleteInlineCompletionProvider implements vscode.InlineComple
}
const requestPromise = new Promise<void>((resolve) => {
pendingRequest.resolve = resolve
this.debounceTimer = setTimeout(async () => {
this.debounceTimer = null
this.debouncedPendingRequest = null
this.isFirstCall = true // Reset for next sequence
await this.fetchAndCacheSuggestion(prompt, prefix, suffix, languageId)
// Remove this request from pending when done
this.removePendingRequest(pendingRequest)
resolve()
try {
await this.fetchAndCacheSuggestion(prompt, prefix, suffix, languageId)
} finally {
this.removePendingRequest(pendingRequest)
resolve()
}
}, this.debounceDelayMs)
})
@@ -1369,7 +1369,7 @@ describe("AutocompleteInlineCompletionProvider", () => {
await provider.provideInlineCompletionItems(mockDocument, mockPosition, mockContext, mockToken)
// Second call should set a debounce timer
provider.provideInlineCompletionItems(mockDocument, mockPosition, mockContext, mockToken)
const promise = provider.provideInlineCompletionItems(mockDocument, mockPosition, mockContext, mockToken)
// Verify timer is set for trailing edge
const timerCountBeforeDispose = vi.getTimerCount()
@@ -1378,9 +1378,10 @@ describe("AutocompleteInlineCompletionProvider", () => {
// Dispose the provider before timer fires
provider.dispose()
// Verify timer is cleared
// Verify timer is cleared and the pending request settles
const timerCountAfterDispose = vi.getTimerCount()
expect(timerCountAfterDispose).toBeLessThan(timerCountBeforeDispose)
await expect(promise).resolves.toEqual([])
})
})
})
@@ -2071,6 +2072,23 @@ describe("AutocompleteInlineCompletionProvider", () => {
expect(callCount).toBe(2)
})
it("should settle canceled debounced requests when the timer is reset", async () => {
await provider.provideInlineCompletionItems(mockDocument, mockPosition, mockContext, mockToken)
const doc2 = new MockTextDocument(vscode.Uri.file("/test.ts"), "const x = 1\nconst z = 3")
const promise2 = provider.provideInlineCompletionItems(doc2, mockPosition, mockContext, mockToken)
await vi.advanceTimersByTimeAsync(100)
const doc3 = new MockTextDocument(vscode.Uri.file("/test.ts"), "const x = 1\nconst q = 4")
const promise3 = provider.provideInlineCompletionItems(doc3, mockPosition, mockContext, mockToken)
await expect(promise2).resolves.toEqual([])
await vi.advanceTimersByTimeAsync(500)
await promise3
})
it("should NOT reuse pending request when user backspaces (prefix shrinks)", async () => {
// Mock the model to track call count
let callCount = 0
@@ -14,6 +14,7 @@ const SENSITIVE_PATTERNS = [".env", ".env.*"]
// path.isAbsolute() on POSIX does not recognise these, so we check explicitly
// to avoid passing them to the `ignore` package which throws a RangeError.
const WINDOWS_DRIVE = /^[a-zA-Z]:[/\\]/
const REALPATH_CACHE_MAX = 1_000
function toPosix(filePath: string): string {
return filePath.replace(/\\/g, "/")
@@ -32,6 +33,7 @@ export class FileIgnoreController {
async initialize(): Promise<void> {
this.ignoreInstance = ignore()
this.loadedContents = []
this.realpathCache.clear()
if (!this.workspacePath) {
return
@@ -65,6 +67,14 @@ export class FileIgnoreController {
this.ignoreInstance.add(SENSITIVE_PATTERNS)
}
private cacheRealpath(input: string, resolved: string): void {
if (this.realpathCache.size >= REALPATH_CACHE_MAX) {
const key = this.realpathCache.keys().next().value
if (key !== undefined) this.realpathCache.delete(key)
}
this.realpathCache.set(input, resolved)
}
private toRelativePath(filePath: string): string | null {
if (!filePath) {
return null
@@ -85,7 +95,7 @@ export class FileIgnoreController {
} else {
try {
resolved = fs.realpathSync(absoluteInput)
this.realpathCache.set(absoluteInput, resolved)
this.cacheRealpath(absoluteInput, resolved)
} catch {
// Keep unresolved path when file does not exist yet.
}
@@ -142,6 +152,7 @@ export class FileIgnoreController {
dispose(): void {
this.loadedContents = []
this.realpathCache.clear()
this.ignoreInstance = ignore()
}
}
@@ -110,6 +110,7 @@ export interface PendingRequest {
prefix: string
suffix: string
promise: Promise<void>
resolve?: () => void
}
// ============================================================================
+20
View File
@@ -1,5 +1,25 @@
# @kilocode/cli
## 7.2.17
### Patch Changes
- [#9276](https://github.com/Kilo-Org/kilocode/pull/9276) [`e6310c5`](https://github.com/Kilo-Org/kilocode/commit/e6310c5292b43745c3c6e75a08bb584f7f1fd6d5) - Add Alibaba to `kiloProviderOptions` so thinking is enabled correctly when routing through the Kilo gateway with `ai_sdk_provider: "alibaba"`.
- [#9120](https://github.com/Kilo-Org/kilocode/pull/9120) [`d40fc1c`](https://github.com/Kilo-Org/kilocode/commit/d40fc1c71cde67568c37f30a9653ec1ac2a84131) - Make the `description` parameter of the bash tool optional.
- [#9239](https://github.com/Kilo-Org/kilocode/pull/9239) [`2b17a7b`](https://github.com/Kilo-Org/kilocode/commit/2b17a7b4e80bb2bd30bd95d047c31ad17dd339b6) - Fix custom provider model and variant deletions being silently reverted on save. Removing a model or reasoning variant from a custom provider now actually removes it from your config.
- [#9193](https://github.com/Kilo-Org/kilocode/pull/9193) [`f025e34`](https://github.com/Kilo-Org/kilocode/commit/f025e34b6a91d3e5bd6e5b174105a77ea6d87f6d) - Clarify suggest tool guidance so the assistant writes its final summary before offering a local review.
- [#9164](https://github.com/Kilo-Org/kilocode/pull/9164) [`448dba8`](https://github.com/Kilo-Org/kilocode/commit/448dba8ca595ff95220ab660cbc93ca40b90a19b) - Update `@ai-sdk/anthropic` to 3.0.71, adding `xhigh` effort for Opus 4.7 adaptive thinking (3.0.70) and fixing fine-grained tool streaming beta header for Opus 4.7 (3.0.71)
- [#9170](https://github.com/Kilo-Org/kilocode/pull/9170) [`297b988`](https://github.com/Kilo-Org/kilocode/commit/297b988a211933e106bf2864518e3542587d3f0b) - Update `@ai-sdk/amazon-bedrock` to 4.0.96 and `@ai-sdk/google-vertex` to 4.0.112, both of which include Opus 4.7 support with `xhigh` adaptive thinking effort
- Updated dependencies [[`8b90eec`](https://github.com/Kilo-Org/kilocode/commit/8b90eec6d0852305ae4379088b1003c1d4e74e6a), [`448dba8`](https://github.com/Kilo-Org/kilocode/commit/448dba8ca595ff95220ab660cbc93ca40b90a19b)]:
- @kilocode/kilo-gateway@7.3.0
- @kilocode/kilo-telemetry@7.2.15
## 7.2.14
### Patch Changes
+2 -1
View File
@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/package.json",
"version": "7.2.14",
"version": "7.2.17",
"name": "@kilocode/cli",
"type": "module",
"license": "MIT",
@@ -14,6 +14,7 @@
"fix-node-pty": "bun run script/fix-node-pty.ts",
"upgrade-opentui": "bun run script/upgrade-opentui.ts",
"dev": "bun run --conditions=browser ./src/index.ts",
"dev:local": "XDG_DATA_HOME=/tmp/kilo-local/data XDG_CONFIG_HOME=/tmp/kilo-local/config XDG_STATE_HOME=/tmp/kilo-local/state XDG_CACHE_HOME=/tmp/kilo-local/cache KILO_API_URL=http://localhost:3000 KILO_SESSION_INGEST_URL=http://localhost:8800 bun run --conditions=browser ./src/index.ts",
"db": "bun drizzle-kit"
},
"bin": {
+117 -35
View File
@@ -13,6 +13,7 @@ import { Session } from "@/session"
import { SessionID, MessageID, PartID } from "@/session/schema"
import { LLM } from "@/session/llm"
import { MessageV2 } from "@/session/message-v2"
import { SessionStatus } from "@/session/status"
import { Todo } from "@/session/todo"
import { makeRuntime } from "@/effect/run-service"
import { Log } from "@/util/log"
@@ -24,6 +25,7 @@ const agents = makeRuntime(Agent.Service, Agent.defaultLayer)
const providers = makeRuntime(Provider.Service, Provider.defaultLayer)
const questions = makeRuntime(Question.Service, Question.defaultLayer)
const todo = makeRuntime(Todo.Service, Todo.defaultLayer)
const pending = new Map<SessionID, AbortController>()
export const PlanFollowupRuntime = {
agent(name: string): Promise<Agent.Info | undefined> {
@@ -147,6 +149,7 @@ export async function generateHandover(input: {
const result = await stream.text
return result.trim()
} catch (error) {
if (input.abort?.aborted) return ""
log.error("handover generation failed", { error })
return ""
}
@@ -159,6 +162,14 @@ export namespace PlanFollowup {
export const ANSWER_NEW_SESSION = "Start new session"
export const ANSWER_CONTINUE = "Continue here"
export function abort(sessionID: SessionID) {
const ctl = pending.get(sessionID)
if (!ctl) return false
pending.delete(sessionID)
ctl.abort()
return true
}
function resolveVariant(value: string | undefined, model: Provider.Model | undefined) {
if (!value) return undefined
if (!model?.variants?.[value]) return undefined
@@ -320,47 +331,118 @@ export namespace PlanFollowup {
model: input.model,
})
const session = await Session.get(input.sessionID)
const [handover, todos] = await Promise.all([
generateHandover({ messages: input.messages, model: input.model, abort: input.abort }),
PlanFollowupRuntime.todo.get(input.sessionID),
])
await Instance.provide({
directory: session.directory,
fn: async () => {
const file = Session.plan(session)
const sections = [
`Plan file: ${file}\nRead this file first and treat it as the source of truth for implementation.`,
`Implement the following plan:\n\n${input.plan}`,
]
if (handover) {
sections.push(`## Handover from Planning Session\n\n${handover}`)
}
const todoList = formatTodos(todos)
if (todoList) {
sections.push(`## Todo List\n\n${todoList}`)
}
// Create the session FIRST so session.created fires immediately while the
// VS Code extension's pendingFollowup gate (30s TTL) is still fresh. The
// handover generation below can take tens of seconds and must not block
// the SSE event that drives the webview tab switch.
const next = await Session.create({})
await inject({
sessionID: next.id,
agent: "code",
model: code.model,
text: sections.join("\n\n"),
synthetic: false,
})
if (todos.length) {
await PlanFollowupRuntime.todo.update({ sessionID: next.id, todos })
}
const ctl = new AbortController()
pending.set(next.id, ctl)
await SessionStatus.set(next.id, { type: "busy" })
await Bus.publish(TuiEvent.SessionSelect, { sessionID: next.id })
void Instance.provide({
directory: next.directory,
fn: () => PlanFollowupRuntime.loop(next.id),
}).catch((error) => {
log.error("failed to start follow-up session", { sessionID: next.id, error })
})
const idle = () =>
SessionStatus.set(next.id, { type: "idle" }).catch((err) => {
log.warn("failed to clear follow-up busy status", { sessionID: next.id, err })
})
try {
const file = Session.plan(session)
const todos = await PlanFollowupRuntime.todo.get(input.sessionID)
const todoList = formatTodos(todos)
// Assemble the user message text with or without a handover section.
// The section order is fixed so the initial and final renders stay
// aligned — only the handover block grows in between.
const compose = (handover: string) => {
const sections = [
`Plan file: ${file}\nRead this file first and treat it as the source of truth for implementation.`,
`Implement the following plan:\n\n${input.plan}`,
]
if (handover) sections.push(`## Handover from Planning Session\n\n${handover}`)
if (todoList) sections.push(`## Todo List\n\n${todoList}`)
return sections.join("\n\n")
}
// Inject the plan and todos immediately so the new session tab shows
// real content right away. The handover section is appended to this
// same part in-place once the slow LLM call resolves below.
const msg: MessageV2.User = {
id: MessageID.ascending(),
sessionID: next.id,
role: "user",
time: { created: Date.now() },
agent: "code",
model: code.model,
}
await Session.updateMessage(msg)
const pid = PartID.ascending()
await Session.updatePart({
id: pid,
messageID: msg.id,
sessionID: next.id,
type: "text",
text: compose(""),
synthetic: false,
} satisfies MessageV2.TextPart)
if (todos.length) {
await PlanFollowupRuntime.todo.update({ sessionID: next.id, todos })
}
const handover = await generateHandover({
messages: input.messages,
model: input.model,
abort: input.abort ? AbortSignal.any([input.abort, ctl.signal]) : ctl.signal,
})
if (ctl.signal.aborted) {
await idle()
return
}
if (handover) {
await Session.updatePart({
id: pid,
messageID: msg.id,
sessionID: next.id,
type: "text",
text: compose(handover),
synthetic: false,
} satisfies MessageV2.TextPart)
}
if (ctl.signal.aborted) {
await idle()
return
}
const queue = Instance.provide({
directory: next.directory,
fn: async () => {
if (ctl.signal.aborted) {
await idle()
return
}
await PlanFollowupRuntime.loop(next.id)
},
})
void queue
.catch((error) => {
log.error("failed to start follow-up session", { sessionID: next.id, error })
void idle()
})
.finally(() => {
if (pending.get(next.id) === ctl) pending.delete(next.id)
})
} catch (error) {
if (pending.get(next.id) === ctl) pending.delete(next.id)
await idle()
throw error
}
},
})
}
@@ -50,6 +50,10 @@ export namespace KiloSessionPrompt {
return action === "continue" ? "continue" : "break"
}
export function abortPlanFollowup(sessionID: SessionID) {
return PlanFollowup.abort(sessionID)
}
/**
* Mutable cache for environment details, keyed by user message ID
* so it recomputes when a new user message arrives.
+1
View File
@@ -131,6 +131,7 @@ export namespace SessionPrompt {
const cancel = Effect.fn("SessionPrompt.cancel")(function* (sessionID: SessionID) {
yield* elog.info("cancel", { sessionID })
yield* KiloSessionPromptQueue.cancel(sessionID) // kilocode_change - drop queued follow-up loops on abort
KiloSessionPrompt.abortPlanFollowup(sessionID) // kilocode_change - abort pending plan-followup handover work
yield* state.cancel(sessionID)
})
@@ -13,6 +13,7 @@ import { Session } from "../../src/session"
import { LLM } from "../../src/session/llm"
import { MessageV2 } from "../../src/session/message-v2"
import { AppRuntime } from "../../src/effect/app-runtime"
import { SessionStatus } from "../../src/session/status"
import { Todo } from "../../src/session/todo"
import { Global } from "../../src/global"
import { Log } from "../../src/util/log"
@@ -933,6 +934,276 @@ describe("plan follow-up", () => {
expect(part.text).not.toContain("## Todo List")
}))
test("ask - fires session.created before generateHandover resolves on Start new session", () =>
withInstance(async () => {
// Regression guard: the VS Code extension gates `session.created` SSE events
// behind a 30-second pendingFollowup TTL. If startNew awaits the handover
// LLM call before creating the session, a slow LLM response expires the TTL
// and the webview never learns about the new session. This test asserts the
// session is created *before* the handover resolves, guaranteeing the SSE
// event fires while the TTL is still fresh.
const seeded = await seed({ text: "1. Build" })
let createdAt: number | undefined
let handoverResolvedAt: number | undefined
const unsub = Bus.subscribe(Session.Event.Created, (event) => {
// Ignore the seeded planning session; we only care about the follow-up.
if (event.properties.info.id === seeded.sessionID) return
if (createdAt === undefined) createdAt = performance.now()
})
const deferred = Promise.withResolvers<string>()
const agentSpy = spyOn(PlanFollowupRuntime, "agent").mockResolvedValue(fakeAgent as any)
const modelSpy = spyOn(PlanFollowupRuntime, "model").mockResolvedValue(fakeModel)
const llmSpy = spyOn(LLM, "stream").mockResolvedValue({
text: deferred.promise.then((t) => {
handoverResolvedAt = performance.now()
return t
}),
} as any)
const loop = spyOn(PlanFollowupRuntime, "loop").mockResolvedValue({
info: {
id: MessageID.make("msg_test"),
role: "assistant",
sessionID: SessionID.make("ses_test"),
time: { created: Date.now() },
parentID: MessageID.make("msg_parent"),
modelID: ModelID.make("test"),
providerID: ProviderID.make("test"),
mode: "code",
agent: "code",
path: { cwd: "/tmp", root: "/tmp" },
cost: 0,
tokens: {
total: 0,
input: 0,
output: 0,
reasoning: 0,
cache: { read: 0, write: 0 },
},
},
parts: [],
} as MessageV2.WithParts)
using _ = {
[Symbol.dispose]() {
agentSpy.mockRestore()
modelSpy.mockRestore()
llmSpy.mockRestore()
loop.mockRestore()
unsub()
},
}
const pending = PlanFollowup.ask({
sessionID: seeded.sessionID,
messages: seeded.messages,
abort: AbortSignal.any([]),
})
const item = await waitQuestion(seeded.sessionID)
expect(item).toBeDefined()
if (!item) return
await question.reply({
requestID: item.id,
answers: [[PlanFollowup.ANSWER_NEW_SESSION]],
})
// Poll until session.created fires. With the fix, this happens promptly
// because Session.create runs before generateHandover. Without the fix,
// startNew would still be blocked on the deferred LLM stream.
for (let i = 0; i < 100; i++) {
if (createdAt !== undefined) break
await Bun.sleep(10)
}
expect(createdAt).toBeDefined()
// Handover must still be pending; if it had resolved, the race is open.
expect(handoverResolvedAt).toBeUndefined()
deferred.resolve("## Discoveries\n\nexample")
await expect(pending).resolves.toBe("break")
expect(handoverResolvedAt).toBeDefined()
expect(createdAt!).toBeLessThan(handoverResolvedAt!)
}))
test("ask - injects plan message before generateHandover resolves on Start new session", () =>
withInstance(async () => {
// Regression guard: the plan text must appear in the new session tab
// immediately after the tab switch — without waiting for the slow handover
// LLM call. The handover is then appended to the same part in-place.
const seeded = await seed({ text: "1. Build" })
let followup: SessionID | undefined
const unsub = Bus.subscribe(Session.Event.Created, (event) => {
if (event.properties.info.id === seeded.sessionID) return
if (!followup) followup = event.properties.info.id
})
const deferred = Promise.withResolvers<string>()
const agentSpy = spyOn(PlanFollowupRuntime, "agent").mockResolvedValue(fakeAgent as any)
const modelSpy = spyOn(PlanFollowupRuntime, "model").mockResolvedValue(fakeModel)
const llmSpy = spyOn(LLM, "stream").mockResolvedValue({
text: deferred.promise,
} as any)
const loop = spyOn(PlanFollowupRuntime, "loop").mockResolvedValue({
info: {
id: MessageID.make("msg_test"),
role: "assistant",
sessionID: SessionID.make("ses_test"),
time: { created: Date.now() },
parentID: MessageID.make("msg_parent"),
modelID: ModelID.make("test"),
providerID: ProviderID.make("test"),
mode: "code",
agent: "code",
path: { cwd: "/tmp", root: "/tmp" },
cost: 0,
tokens: { total: 0, input: 0, output: 0, reasoning: 0, cache: { read: 0, write: 0 } },
},
parts: [],
} as MessageV2.WithParts)
using _ = {
[Symbol.dispose]() {
agentSpy.mockRestore()
modelSpy.mockRestore()
llmSpy.mockRestore()
loop.mockRestore()
unsub()
},
}
const pending = PlanFollowup.ask({
sessionID: seeded.sessionID,
messages: seeded.messages,
abort: AbortSignal.any([]),
})
const item = await waitQuestion(seeded.sessionID)
expect(item).toBeDefined()
if (!item) return
await question.reply({
requestID: item.id,
answers: [[PlanFollowup.ANSWER_NEW_SESSION]],
})
// Poll until the plan text lands. Handover is still pending because
// deferred has not resolved yet.
for (let i = 0; i < 100; i++) {
if (followup) {
const msgs = await Session.messages({ sessionID: followup })
const user = msgs.find((m) => m.info.role === "user")
const part = user?.parts.find((p) => p.type === "text")
if (part?.type === "text" && part.text.includes("Implement the following plan:")) break
}
await Bun.sleep(10)
}
expect(followup).toBeDefined()
if (!followup) return
const initial = await Session.messages({ sessionID: followup })
const initialUser = initial.find((m) => m.info.role === "user")
const initialPart = initialUser?.parts.find((p) => p.type === "text")
expect(initialPart?.type).toBe("text")
if (initialPart?.type !== "text") return
expect(initialPart.text).toContain("Implement the following plan:")
expect(initialPart.text).toContain("1. Build")
// Handover is still deferred — must not be present yet.
expect(initialPart.text).not.toContain("## Handover from Planning Session")
deferred.resolve("## Discoveries\n\nexample")
await expect(pending).resolves.toBe("break")
// Same part ID updated in-place — handover section now present.
const final = await Session.messages({ sessionID: followup })
const finalUser = final.find((m) => m.info.role === "user")
const finalPart = finalUser?.parts.find((p) => p.type === "text")
if (finalPart?.type !== "text") return
expect(finalPart.id).toBe(initialPart.id)
expect(finalPart.text).toContain("Implement the following plan:")
expect(finalPart.text).toContain("## Handover from Planning Session")
expect(finalPart.text).toContain("example")
}))
test("ask - marks new session busy while handover is pending and clears on abort", () =>
withInstance(async () => {
const seeded = await seed({ text: "1. Build" })
let followup: SessionID | undefined
const states: Array<{ sessionID: SessionID; type: string }> = []
const created = Bus.subscribe(Session.Event.Created, (event) => {
if (event.properties.info.id === seeded.sessionID) return
if (!followup) followup = event.properties.info.id
})
const status = Bus.subscribe(SessionStatus.Event.Status, (event) => {
states.push({ sessionID: event.properties.sessionID, type: event.properties.status.type })
})
const deferred = Promise.withResolvers<string>()
const agentSpy = spyOn(PlanFollowupRuntime, "agent").mockResolvedValue(fakeAgent as any)
const modelSpy = spyOn(PlanFollowupRuntime, "model").mockResolvedValue(fakeModel)
const llmSpy = spyOn(LLM, "stream").mockResolvedValue({
text: deferred.promise,
} as any)
const loop = spyOn(PlanFollowupRuntime, "loop").mockResolvedValue({
info: {
id: MessageID.make("msg_test"),
role: "assistant",
sessionID: SessionID.make("ses_test"),
time: { created: Date.now() },
parentID: MessageID.make("msg_parent"),
modelID: ModelID.make("test"),
providerID: ProviderID.make("test"),
mode: "code",
agent: "code",
path: { cwd: "/tmp", root: "/tmp" },
cost: 0,
tokens: { total: 0, input: 0, output: 0, reasoning: 0, cache: { read: 0, write: 0 } },
},
parts: [],
} as MessageV2.WithParts)
using _ = {
[Symbol.dispose]() {
agentSpy.mockRestore()
modelSpy.mockRestore()
llmSpy.mockRestore()
loop.mockRestore()
created()
status()
},
}
const pending = PlanFollowup.ask({
sessionID: seeded.sessionID,
messages: seeded.messages,
abort: AbortSignal.any([]),
})
const item = await waitQuestion(seeded.sessionID)
expect(item).toBeDefined()
if (!item) return
await question.reply({
requestID: item.id,
answers: [[PlanFollowup.ANSWER_NEW_SESSION]],
})
for (let i = 0; i < 100; i++) {
if (followup && states.some((x) => x.sessionID === followup && x.type === "busy")) break
await Bun.sleep(10)
}
expect(followup).toBeDefined()
if (!followup) return
expect(states.some((x) => x.sessionID === followup && x.type === "busy")).toBe(true)
const { SessionPrompt } = await import("../../src/session/prompt")
await SessionPrompt.cancel(followup)
deferred.resolve("## Discoveries\n\nexample")
await expect(pending).resolves.toBe("break")
expect(states.some((x) => x.sessionID === followup && x.type === "idle")).toBe(true)
expect(loop).not.toHaveBeenCalled()
}))
test("ask - returns break when assistant text is empty", () =>
withInstance(async () => {
const seeded = await seed({ text: " " })
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@kilocode/plugin",
"version": "7.2.14",
"version": "7.2.17",
"type": "module",
"license": "MIT",
"scripts": {
+1 -1
View File
@@ -12,6 +12,6 @@
"exports": {
".": "./src/index.ts"
},
"version": "7.2.14",
"version": "7.2.17",
"peerDependencies": {}
}
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@kilocode/sdk",
"version": "7.2.14",
"version": "7.2.17",
"type": "module",
"license": "MIT",
"scripts": {
+2 -2
View File
@@ -1553,9 +1553,9 @@ export type ProviderConfig = {
*/
disabled?: boolean
[key: string]: unknown | boolean | undefined
}
} | null
}
}
} | null
}
}
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@opencode-ai/server",
"version": "7.2.14",
"version": "7.2.17",
"type": "module",
"license": "MIT",
"exports": {
+1 -1
View File
@@ -26,7 +26,7 @@
"typescript": "catalog:",
"vite": "catalog:"
},
"version": "7.2.14",
"version": "7.2.17",
"dependencies": {},
"peerDependencies": {}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/ui",
"version": "7.2.14",
"version": "7.2.17",
"type": "module",
"license": "MIT",
"exports": {
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/util",
"version": "7.2.14",
"version": "7.2.17",
"private": true,
"type": "module",
"license": "MIT",
+22
View File
@@ -0,0 +1,22 @@
diff --git a/dist/types/insights.d.ts b/dist/types/insights.d.ts
index 1234567..abcdefg 100644
--- a/dist/types/insights.d.ts
+++ b/dist/types/insights.d.ts
@@ -27,7 +27,7 @@ export declare function buildWsFatalInsight(connection: StableWSConnection, event
user_details: import("./types").UserResponse | import("./types").OwnUserResponse | undefined;
device: import("./types").BaseDeviceFields | undefined;
client_id: string | undefined;
- ws_details: import("ws") | undefined;
+ ws_details: typeof import("ws") | undefined;
ws_consecutive_failures: number;
ws_total_failures: number;
request_id: string | undefined;
@@ -47,7 +47,7 @@ export declare function buildWsSuccessAfterFailureInsight(connection: StableWSCon
user_details: import("./types").UserResponse | import("./types").OwnUserResponse | undefined;
device: import("./types").BaseDeviceFields | undefined;
client_id: string | undefined;
- ws_details: import("ws") | undefined;
+ ws_details: typeof import("ws") | undefined;
ws_consecutive_failures: number;
ws_total_failures: number;
request_id: string | undefined;
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@kilocode/upstream-merge",
"version": "7.2.14",
"version": "7.2.17",
"private": true,
"type": "module",
"description": "Scripts for automating upstream opencode merges into Kilo",
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "opencode",
"displayName": "opencode",
"description": "opencode for VS Code",
"version": "7.2.14",
"version": "7.2.17",
"publisher": "sst-dev",
"repository": {
"type": "git",