diff --git a/.changeset/agent-behaviour-setting-descriptions.md b/.changeset/agent-behaviour-setting-descriptions.md deleted file mode 100644 index 39346c15e3..0000000000 --- a/.changeset/agent-behaviour-setting-descriptions.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": patch ---- - -Improve agent behaviour setting descriptions for Temperature, Top P, and Max Steps. diff --git a/.changeset/calm-skill-permissions.md b/.changeset/calm-skill-permissions.md deleted file mode 100644 index f492c0db4b..0000000000 --- a/.changeset/calm-skill-permissions.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/cli": patch ---- - -Allow persistent approval for shell access to a specific global skill directory while keeping other Kilo configuration protected. diff --git a/.changeset/clean-windows-file-handles.md b/.changeset/clean-windows-file-handles.md deleted file mode 100644 index 8b1183b118..0000000000 --- a/.changeset/clean-windows-file-handles.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/cli": patch ---- - -Release project file handles immediately after reads on Windows so editors and tools can replace existing files without restarting Kilo. diff --git a/.changeset/file-picker-default-selection.md b/.changeset/file-picker-default-selection.md deleted file mode 100644 index 6036c6d267..0000000000 --- a/.changeset/file-picker-default-selection.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": patch ---- - -Move "Browse files..." to the end of the @-mention dropdown so the closest matching file is the default selection instead of the file picker. diff --git a/.changeset/fix-cache-token-arrow.md b/.changeset/fix-cache-token-arrow.md deleted file mode 100644 index 076ab518f8..0000000000 --- a/.changeset/fix-cache-token-arrow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": patch ---- - -Correct the token usage summary's cache-read indicator and group cached input with other input tokens. diff --git a/.changeset/fix-question-option-contrast.md b/.changeset/fix-question-option-contrast.md deleted file mode 100644 index 8ff178cf2c..0000000000 --- a/.changeset/fix-question-option-contrast.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": patch ---- - -Improve question option visibility in light VS Code themes. diff --git a/.changeset/fork-session-variant.md b/.changeset/fork-session-variant.md deleted file mode 100644 index 95dffad581..0000000000 --- a/.changeset/fork-session-variant.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/cli": patch ---- - -Preserve the selected model reasoning variant when forking a session. diff --git a/.changeset/indexing-invalid-model-error.md b/.changeset/indexing-invalid-model-error.md deleted file mode 100644 index 7614ed85bf..0000000000 --- a/.changeset/indexing-invalid-model-error.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/cli": patch ---- - -Surface an invalid Kilo `indexing.model` configuration as an indexing Error status instead of silently falling back to the default model. diff --git a/.changeset/inherit-agent-manager-sandbox.md b/.changeset/inherit-agent-manager-sandbox.md deleted file mode 100644 index 7ecb13576d..0000000000 --- a/.changeset/inherit-agent-manager-sandbox.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@kilocode/cli": patch -"@kilocode/sdk": patch -"kilo-code": patch ---- - -Inherit sandbox state when a sandboxed agent starts new Agent Manager sessions. diff --git a/.changeset/isolate-model-cache-refresh.md b/.changeset/isolate-model-cache-refresh.md deleted file mode 100644 index 3785d1b803..0000000000 --- a/.changeset/isolate-model-cache-refresh.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/cli": patch ---- - -Keep Agent Manager sessions running when concurrent branch-name generation times out during model refresh. diff --git a/.changeset/jetbrains-legacy-todos.md b/.changeset/jetbrains-legacy-todos.md deleted file mode 100644 index ade6c75312..0000000000 --- a/.changeset/jetbrains-legacy-todos.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/kilo-jetbrains": patch ---- - -Migrate legacy v5 markdown to-do lists into populated JetBrains To-dos cards. diff --git a/.changeset/jetbrains-legacy-tool-turns.md b/.changeset/jetbrains-legacy-tool-turns.md deleted file mode 100644 index 8ae6ed90f2..0000000000 --- a/.changeset/jetbrains-legacy-tool-turns.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/kilo-jetbrains": patch ---- - -Render tools from imported legacy v5 sessions in assistant turns instead of prompt bubbles. diff --git a/.changeset/jetbrains-legacy-v5-migration.md b/.changeset/jetbrains-legacy-v5-migration.md deleted file mode 100644 index 74bcfa4611..0000000000 --- a/.changeset/jetbrains-legacy-v5-migration.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/kilo-jetbrains": patch ---- - -Import legacy v5 JetBrains settings and sessions through the migration wizard. diff --git a/.changeset/jetbrains-migration-later-and-language.md b/.changeset/jetbrains-migration-later-and-language.md deleted file mode 100644 index 13a21b6bf0..0000000000 --- a/.changeset/jetbrains-migration-later-and-language.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/kilo-jetbrains": patch ---- - -Add a "Later" option to the legacy migration wizard that defers the prompt to the next startup, and stop reporting the language preference as migrated since it cannot be applied in this version. diff --git a/.changeset/jetbrains-platform-http.md b/.changeset/jetbrains-platform-http.md deleted file mode 100644 index 90e1df22d9..0000000000 --- a/.changeset/jetbrains-platform-http.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/kilo-jetbrains": patch ---- - -Honor JetBrains certificate and proxy settings when downloading the CLI and fetching custom provider models. diff --git a/.changeset/jetbrains-platform-stop-icon.md b/.changeset/jetbrains-platform-stop-icon.md deleted file mode 100644 index 12d9af092a..0000000000 --- a/.changeset/jetbrains-platform-stop-icon.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/kilo-jetbrains": patch ---- - -Use the IntelliJ stop icon for the JetBrains prompt stop button. diff --git a/.changeset/jetbrains-progress-elapsed-time.md b/.changeset/jetbrains-progress-elapsed-time.md deleted file mode 100644 index 11a85d57b4..0000000000 --- a/.changeset/jetbrains-progress-elapsed-time.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/kilo-jetbrains": patch ---- - -Show elapsed time in the JetBrains progress footer while Kilo is working. diff --git a/.changeset/jetbrains-prompt-action-separator.md b/.changeset/jetbrains-prompt-action-separator.md deleted file mode 100644 index 826715ea32..0000000000 --- a/.changeset/jetbrains-prompt-action-separator.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/kilo-jetbrains": patch ---- - -Add a separator before the JetBrains prompt send button. diff --git a/.changeset/jetbrains-prompt-right-padding.md b/.changeset/jetbrains-prompt-right-padding.md deleted file mode 100644 index 1ffd4e59c4..0000000000 --- a/.changeset/jetbrains-prompt-right-padding.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/kilo-jetbrains": patch ---- - -Match the JetBrains prompt send-button right padding to the bottom padding. diff --git a/.changeset/jetbrains-rollback-redo-font.md b/.changeset/jetbrains-rollback-redo-font.md deleted file mode 100644 index bd25756167..0000000000 --- a/.changeset/jetbrains-rollback-redo-font.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/kilo-jetbrains": patch ---- - -Fix JetBrains rollback and redo scrolling and align plan custom response font with the prompt input. diff --git a/.changeset/jetbrains-send-scroll-color.md b/.changeset/jetbrains-send-scroll-color.md deleted file mode 100644 index 619d8f7a51..0000000000 --- a/.changeset/jetbrains-send-scroll-color.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/kilo-jetbrains": patch ---- - -Match the JetBrains prompt send icon color to the scroll-to-bottom button across themes. diff --git a/.changeset/neat-mammals-fry.md b/.changeset/neat-mammals-fry.md deleted file mode 100644 index 08000c3287..0000000000 --- a/.changeset/neat-mammals-fry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/kilo-indexing": patch ---- - -Retry remote embedder validation up to twice on failure diff --git a/.changeset/orchestrate-agent-manager-sessions.md b/.changeset/orchestrate-agent-manager-sessions.md deleted file mode 100644 index 90a7658e1a..0000000000 --- a/.changeset/orchestrate-agent-manager-sessions.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@kilocode/cli": patch -"@kilocode/sdk": patch -"kilo-code": patch ---- - -Inspect managed Agent Manager sessions and send a targeted prompt to an idle existing session from the native Agent Manager tool. Require a separate explicit approval before prompting another managed session. diff --git a/.changeset/preserve-compaction-errors.md b/.changeset/preserve-compaction-errors.md deleted file mode 100644 index cefd57adba..0000000000 --- a/.changeset/preserve-compaction-errors.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/cli": patch ---- - -Preserve gateway and provider errors when chunked compaction fails instead of reporting every failure as a context overflow. diff --git a/.changeset/preserve-moved-worktree-head.md b/.changeset/preserve-moved-worktree-head.md deleted file mode 100644 index e605c087b0..0000000000 --- a/.changeset/preserve-moved-worktree-head.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": patch ---- - -Preserve the current local commit when moving a session into a worktree. diff --git a/.changeset/quiet-agent-tabs.md b/.changeset/quiet-agent-tabs.md deleted file mode 100644 index 5dddbb0512..0000000000 --- a/.changeset/quiet-agent-tabs.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": patch ---- - -Keep Task tool subagents out of Agent Manager tabs. diff --git a/.changeset/quiet-session-export-again.md b/.changeset/quiet-session-export-again.md deleted file mode 100644 index 1ba5b89c7c..0000000000 --- a/.changeset/quiet-session-export-again.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/cli": patch ---- - -Temporarily disable free-model session and Git workspace data export. diff --git a/.changeset/remember-initial-prompts.md b/.changeset/remember-initial-prompts.md deleted file mode 100644 index a75f440dab..0000000000 --- a/.changeset/remember-initial-prompts.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": patch ---- - -Remember initial session prompts when navigating chat input history with the arrow keys. diff --git a/.changeset/report-cli-vscode-presence.md b/.changeset/report-cli-vscode-presence.md deleted file mode 100644 index c5229c240f..0000000000 --- a/.changeset/report-cli-vscode-presence.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@kilocode/cli": minor -"kilo-code": minor ---- - -Report active CLI and VS Code app and session presence. diff --git a/.changeset/secure-file-mentions.md b/.changeset/secure-file-mentions.md deleted file mode 100644 index 0fad988f11..0000000000 --- a/.changeset/secure-file-mentions.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"kilo-code": patch -"@kilocode/cli": patch ---- - -Enforce read and ignore permissions when file mentions add content to a prompt. diff --git a/.changeset/share-session-database-safely.md b/.changeset/share-session-database-safely.md deleted file mode 100644 index 2e61e02968..0000000000 --- a/.changeset/share-session-database-safely.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@kilocode/cli": patch ---- - -Keep shared session databases writable by released Kilo clients after newer schema migrations run. diff --git a/.changeset/sidebar-tab-close-focus.md b/.changeset/sidebar-tab-close-focus.md deleted file mode 100644 index 38e8d7c760..0000000000 --- a/.changeset/sidebar-tab-close-focus.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": patch ---- - -Keep keyboard focus on the active sidebar tab after closing an inactive session tab. diff --git a/.changeset/stop-agent-manager-sessions.md b/.changeset/stop-agent-manager-sessions.md deleted file mode 100644 index 8f0de1d57a..0000000000 --- a/.changeset/stop-agent-manager-sessions.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@kilocode/cli": patch -"kilo-code": patch ---- - -Stop active Agent Manager sessions and their subagents when a session tab or the Agent Manager tab closes. diff --git a/.changeset/timeline-bar-highlight.md b/.changeset/timeline-bar-highlight.md deleted file mode 100644 index fc52161ba9..0000000000 --- a/.changeset/timeline-bar-highlight.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": minor ---- - -Hovering or focusing a bar in the task timeline now highlights the matching tool call in the transcript, making it easier to see which bar belongs to which tool. diff --git a/.changeset/worktree-dialog-prompt-enhancer.md b/.changeset/worktree-dialog-prompt-enhancer.md deleted file mode 100644 index 990927352b..0000000000 --- a/.changeset/worktree-dialog-prompt-enhancer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"kilo-code": minor ---- - -Add the prompt enhancer to the New Worktree dialog, so prompts can be enhanced before creating worktree sessions. diff --git a/bun.lock b/bun.lock index 85b572be1f..c43b0cb7ba 100644 --- a/bun.lock +++ b/bun.lock @@ -32,7 +32,7 @@ }, "packages/core": { "name": "@opencode-ai/core", - "version": "7.4.7", + "version": "7.4.8", "bin": { "opencode": "./bin/opencode", }, @@ -127,7 +127,7 @@ }, "packages/effect-drizzle-sqlite": { "name": "@opencode-ai/effect-drizzle-sqlite", - "version": "7.4.7", + "version": "7.4.8", "dependencies": { "drizzle-orm": "catalog:", "effect": "catalog:", @@ -141,7 +141,7 @@ }, "packages/effect-sqlite-node": { "name": "@opencode-ai/effect-sqlite-node", - "version": "7.4.7", + "version": "7.4.8", "dependencies": { "effect": "catalog:", }, @@ -153,7 +153,7 @@ }, "packages/http-recorder": { "name": "@opencode-ai/http-recorder", - "version": "7.4.7", + "version": "7.4.8", "dependencies": { "@effect/platform-node": "4.0.0-beta.74", "@effect/platform-node-shared": "4.0.0-beta.74", @@ -174,7 +174,7 @@ }, "packages/kilo-console": { "name": "@kilocode/kilo-console", - "version": "7.4.7", + "version": "7.4.8", "dependencies": { "@kilocode/kilo-web-ui": "workspace:*", "@kilocode/sdk": "workspace:*", @@ -196,7 +196,7 @@ }, "packages/kilo-docs": { "name": "@kilocode/kilo-docs", - "version": "7.4.7", + "version": "7.4.8", "dependencies": { "@docsearch/css": "^4", "@docsearch/js": "^4", @@ -226,7 +226,7 @@ }, "packages/kilo-gateway": { "name": "@kilocode/kilo-gateway", - "version": "7.4.7", + "version": "7.4.8", "dependencies": { "@ai-sdk/alibaba": "1.0.17", "@ai-sdk/anthropic": "3.0.71", @@ -262,7 +262,7 @@ }, "packages/kilo-i18n": { "name": "@kilocode/kilo-i18n", - "version": "7.4.7", + "version": "7.4.8", "devDependencies": { "@tsconfig/node22": "catalog:", "@types/bun": "catalog:", @@ -272,7 +272,7 @@ }, "packages/kilo-indexing": { "name": "@kilocode/kilo-indexing", - "version": "7.4.7", + "version": "7.4.8", "dependencies": { "@aws-sdk/client-bedrock-runtime": "3.1005.0", "@aws-sdk/credential-provider-ini": "3.972.31", @@ -308,7 +308,7 @@ }, "packages/kilo-memory": { "name": "@kilocode/kilo-memory", - "version": "7.4.7", + "version": "7.4.8", "dependencies": { "effect": "catalog:", "zod": "catalog:", @@ -322,7 +322,7 @@ }, "packages/kilo-sandbox": { "name": "@kilocode/sandbox", - "version": "7.4.7", + "version": "7.4.8", "dependencies": { "@anthropic-ai/sandbox-runtime": "catalog:", "effect": "catalog:", @@ -337,7 +337,7 @@ }, "packages/kilo-telemetry": { "name": "@kilocode/kilo-telemetry", - "version": "7.4.7", + "version": "7.4.8", "dependencies": { "@kilocode/kilo-gateway": "workspace:*", "posthog-node": "4.4.0", @@ -351,7 +351,7 @@ }, "packages/kilo-ui": { "name": "@kilocode/kilo-ui", - "version": "7.4.7", + "version": "7.4.8", "dependencies": { "@kilocode/sdk": "workspace:*", "@kobalte/core": "0.13.11", @@ -388,7 +388,7 @@ }, "packages/kilo-vscode": { "name": "kilo-code", - "version": "7.4.7", + "version": "7.4.8", "dependencies": { "@anthropic-ai/sdk": "^0.39.0", "@kilocode/kilo-gateway": "workspace:*", @@ -457,7 +457,7 @@ }, "packages/kilo-web-ui": { "name": "@kilocode/kilo-web-ui", - "version": "7.4.7", + "version": "7.4.8", "dependencies": { "@kilocode/kilo-ui": "workspace:*", "@kobalte/core": "catalog:", @@ -474,7 +474,7 @@ }, "packages/llm": { "name": "@opencode-ai/llm", - "version": "7.4.7", + "version": "7.4.8", "dependencies": { "@smithy/eventstream-codec": "4.2.14", "@smithy/util-utf8": "4.2.2", @@ -492,7 +492,7 @@ }, "packages/opencode": { "name": "@kilocode/cli", - "version": "7.4.7", + "version": "7.4.8", "bin": { "kilo": "./bin/kilo", "kilocode": "./bin/kilo", @@ -659,7 +659,7 @@ }, "packages/plugin": { "name": "@kilocode/plugin", - "version": "7.4.7", + "version": "7.4.8", "dependencies": { "@kilocode/sdk": "workspace:*", "effect": "catalog:", @@ -687,7 +687,7 @@ }, "packages/plugin-atomic-chat": { "name": "@kilocode/plugin-atomic-chat", - "version": "7.4.7", + "version": "7.4.8", "dependencies": { "@kilocode/plugin": "workspace:*", }, @@ -701,7 +701,7 @@ }, "packages/script": { "name": "@opencode-ai/script", - "version": "7.4.7", + "version": "7.4.8", "dependencies": { "semver": "^7.6.3", }, @@ -712,7 +712,7 @@ }, "packages/sdk/js": { "name": "@kilocode/sdk", - "version": "7.4.7", + "version": "7.4.8", "dependencies": { "cross-spawn": "catalog:", }, @@ -727,7 +727,7 @@ }, "packages/server": { "name": "@opencode-ai/server", - "version": "7.4.7", + "version": "7.4.8", "dependencies": { "@opencode-ai/core": "workspace:*", "drizzle-orm": "catalog:", @@ -741,7 +741,7 @@ }, "packages/storybook": { "name": "@opencode-ai/storybook", - "version": "7.4.7", + "version": "7.4.8", "devDependencies": { "@opencode-ai/ui": "workspace:*", "@solidjs/meta": "catalog:", @@ -764,7 +764,7 @@ }, "packages/tui": { "name": "@opencode-ai/tui", - "version": "7.4.7", + "version": "7.4.8", "dependencies": { "@kilocode/plugin": "workspace:*", "@kilocode/sdk": "workspace:*", @@ -791,7 +791,7 @@ }, "packages/ui": { "name": "@opencode-ai/ui", - "version": "7.4.7", + "version": "7.4.8", "dependencies": { "@kilocode/sdk": "workspace:*", "@kobalte/core": "catalog:", diff --git a/package.json b/package.json index 4486899761..af32f54fa3 100644 --- a/package.json +++ b/package.json @@ -165,6 +165,6 @@ "pacote@21.5.1": "patches/pacote@21.5.1.patch", "mammoth@1.12.0": "patches/mammoth@1.12.0.patch" }, - "version": "7.4.7", + "version": "7.4.8", "peerDependencies": {} } diff --git a/packages/core/package.json b/packages/core/package.json index 2c8f4eda7c..c01eb9c5fc 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "version": "7.4.7", + "version": "7.4.8", "name": "@opencode-ai/core", "type": "module", "license": "MIT", diff --git a/packages/effect-drizzle-sqlite/package.json b/packages/effect-drizzle-sqlite/package.json index 3283fbeddf..126b07c099 100644 --- a/packages/effect-drizzle-sqlite/package.json +++ b/packages/effect-drizzle-sqlite/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "version": "7.4.7", + "version": "7.4.8", "name": "@opencode-ai/effect-drizzle-sqlite", "type": "module", "license": "MIT", diff --git a/packages/effect-sqlite-node/package.json b/packages/effect-sqlite-node/package.json index 2f31b4e696..d4b7e5bde7 100644 --- a/packages/effect-sqlite-node/package.json +++ b/packages/effect-sqlite-node/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "version": "7.4.7", + "version": "7.4.8", "name": "@opencode-ai/effect-sqlite-node", "type": "module", "license": "MIT", diff --git a/packages/extensions/zed/extension.toml b/packages/extensions/zed/extension.toml index 192b6b056d..c15e01bf0e 100644 --- a/packages/extensions/zed/extension.toml +++ b/packages/extensions/zed/extension.toml @@ -1,7 +1,7 @@ id = "kilo" name = "Kilo" description = "The open source coding agent." -version = "7.4.7" +version = "7.4.8" 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/v7.4.7/opencode-darwin-arm64.zip" +archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.8/opencode-darwin-arm64.zip" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.darwin-x86_64] -archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.7/opencode-darwin-x64.zip" +archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.8/opencode-darwin-x64.zip" cmd = "./opencode" args = ["acp"] [agent_servers.opencode.targets.linux-aarch64] -archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.7/opencode-linux-arm64.tar.gz" +archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.8/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/v7.4.7/opencode-linux-x64.tar.gz" +archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.8/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/v7.4.7/opencode-windows-x64.zip" +archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.4.8/opencode-windows-x64.zip" cmd = "./opencode.exe" args = ["acp"] diff --git a/packages/http-recorder/package.json b/packages/http-recorder/package.json index c4f1550e7a..0ee218af77 100644 --- a/packages/http-recorder/package.json +++ b/packages/http-recorder/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "version": "7.4.7", + "version": "7.4.8", "name": "@opencode-ai/http-recorder", "description": "Record and replay Effect HTTP client traffic with deterministic cassettes", "type": "module", diff --git a/packages/kilo-console/package.json b/packages/kilo-console/package.json index 3bc6756424..d3d88f83bc 100755 --- a/packages/kilo-console/package.json +++ b/packages/kilo-console/package.json @@ -1,6 +1,6 @@ { "name": "@kilocode/kilo-console", - "version": "7.4.7", + "version": "7.4.8", "private": true, "type": "module", "scripts": { diff --git a/packages/kilo-docs/package.json b/packages/kilo-docs/package.json index c383a65cfb..5df98e8eb7 100644 --- a/packages/kilo-docs/package.json +++ b/packages/kilo-docs/package.json @@ -1,6 +1,6 @@ { "name": "@kilocode/kilo-docs", - "version": "7.4.7", + "version": "7.4.8", "private": true, "scripts": { "dev": "next dev --webpack --port 3002", diff --git a/packages/kilo-gateway/package.json b/packages/kilo-gateway/package.json index 25493d5d80..5387adf968 100644 --- a/packages/kilo-gateway/package.json +++ b/packages/kilo-gateway/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@kilocode/kilo-gateway", - "version": "7.4.7", + "version": "7.4.8", "type": "module", "license": "MIT", "description": "Unified Kilo Gateway package for OpenCode - authentication, provider, and API integration", diff --git a/packages/kilo-i18n/package.json b/packages/kilo-i18n/package.json index d23194f180..12fef98e5f 100644 --- a/packages/kilo-i18n/package.json +++ b/packages/kilo-i18n/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@kilocode/kilo-i18n", - "version": "7.4.7", + "version": "7.4.8", "type": "module", "license": "MIT", "description": "Kilo-specific i18n translations and overrides", diff --git a/packages/kilo-indexing/package.json b/packages/kilo-indexing/package.json index 9d98f2ba33..5fca32b440 100644 --- a/packages/kilo-indexing/package.json +++ b/packages/kilo-indexing/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@kilocode/kilo-indexing", - "version": "7.4.7", + "version": "7.4.8", "type": "module", "license": "MIT", "description": "Standalone indexing engine and host helpers for Kilo Code", diff --git a/packages/kilo-jetbrains/CHANGELOG.md b/packages/kilo-jetbrains/CHANGELOG.md index 55fd171776..7e8b3cbb04 100644 --- a/packages/kilo-jetbrains/CHANGELOG.md +++ b/packages/kilo-jetbrains/CHANGELOG.md @@ -4,6 +4,34 @@ ### Patch Changes +- [#12215](https://github.com/Kilo-Org/kilocode/pull/12215) [`9f9509d`](https://github.com/Kilo-Org/kilocode/commit/9f9509dde55678c5f84b00741dca7f439237b467) - Scale the Kilo session UI with IntelliJ IDE zoom and presentation mode. + +- [#12188](https://github.com/Kilo-Org/kilocode/pull/12188) [`349f972`](https://github.com/Kilo-Org/kilocode/commit/349f9723f55662ee4598d933c09264aae575df98) - Migrate legacy v5 markdown to-do lists into populated JetBrains To-dos cards. + +- [#12188](https://github.com/Kilo-Org/kilocode/pull/12188) [`048a0ee`](https://github.com/Kilo-Org/kilocode/commit/048a0ee52e8a26930787e3d1fcf41b4a3b5bd57b) - Render tools from imported legacy v5 sessions in assistant turns instead of prompt bubbles. + +- [#12188](https://github.com/Kilo-Org/kilocode/pull/12188) [`17b0b22`](https://github.com/Kilo-Org/kilocode/commit/17b0b22d4432276ac314a2bbe9751d52f765dd47) - Import legacy v5 JetBrains settings and sessions through the migration wizard. + +- [#12188](https://github.com/Kilo-Org/kilocode/pull/12188) [`8a859e4`](https://github.com/Kilo-Org/kilocode/commit/8a859e49bdd0e15c9a3598945f48dbe1d48bc1b3) - Add a "Later" option to the legacy migration wizard that defers the prompt to the next startup, and stop reporting the language preference as migrated since it cannot be applied in this version. + +- [#12214](https://github.com/Kilo-Org/kilocode/pull/12214) [`737993e`](https://github.com/Kilo-Org/kilocode/commit/737993e21c03f89ead970281915eeca5db0349ab) - Honor JetBrains certificate and proxy settings when downloading the CLI and fetching custom provider models. + +- [#12180](https://github.com/Kilo-Org/kilocode/pull/12180) [`18e798e`](https://github.com/Kilo-Org/kilocode/commit/18e798e81cd3a6584c6820c9ac710ceac24d0a97) - Use the IntelliJ stop icon for the JetBrains prompt stop button. + +- [#12180](https://github.com/Kilo-Org/kilocode/pull/12180) [`de06c40`](https://github.com/Kilo-Org/kilocode/commit/de06c407f91fd8131c6c703386b1684e3cf0e363) - Show elapsed time in the JetBrains progress footer while Kilo is working. + +- [#12180](https://github.com/Kilo-Org/kilocode/pull/12180) [`b62105a`](https://github.com/Kilo-Org/kilocode/commit/b62105a6490b268526eca51ff139934f36d0d6b0) - Add a separator before the JetBrains prompt send button. + +- [#12180](https://github.com/Kilo-Org/kilocode/pull/12180) [`b62105a`](https://github.com/Kilo-Org/kilocode/commit/b62105a6490b268526eca51ff139934f36d0d6b0) - Match the JetBrains prompt send-button right padding to the bottom padding. + +- [#12180](https://github.com/Kilo-Org/kilocode/pull/12180) [`5c98a0d`](https://github.com/Kilo-Org/kilocode/commit/5c98a0d1d407efb06f92496fc66f1c823f12d577) - Fix JetBrains rollback and redo scrolling and align plan custom response font with the prompt input. + +- [#12180](https://github.com/Kilo-Org/kilocode/pull/12180) [`18e798e`](https://github.com/Kilo-Org/kilocode/commit/18e798e81cd3a6584c6820c9ac710ceac24d0a97) - Match the JetBrains prompt send icon color to the scroll-to-bottom button across themes. + +## 7.4.6 + +### Patch Changes + - [#12059](https://github.com/Kilo-Org/kilocode/pull/12059) [`42a4966`](https://github.com/Kilo-Org/kilocode/commit/42a49667a946a2f4f22df44b82aa5c3ff11f9aee) - Return keyboard focus to the JetBrains prompt after clicking inline session dialog actions. - [#12105](https://github.com/Kilo-Org/kilocode/pull/12105) [`8ceeb0f`](https://github.com/Kilo-Org/kilocode/commit/8ceeb0fb990911f5dc4647f7f9d75b26f5ce0ec4) - Stop orphaned Kilo CLI processes when JetBrains IDEs close, including binaries that ignore graceful shutdown. @@ -24,6 +52,13 @@ ## [Unreleased] +## [7.0.6] - 2026-07-14 + +### Fixed + +- Honor the IDE's certificate and proxy settings for outbound HTTPS requests. +- Scale the session UI correctly with IDE zoom, fixing double-scaled heights and extra empty space in the transcript and prompt composer. + ## [7.0.5] - 2026-07-14 ### Added diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/ConnectionPanel.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/ConnectionPanel.kt index 2aaf2acf71..b97edac917 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/ConnectionPanel.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/ConnectionPanel.kt @@ -23,7 +23,6 @@ import com.intellij.ui.components.ActionLink import com.intellij.ui.components.JBLabel import com.intellij.ui.components.JBScrollPane import com.intellij.ui.components.JBTextArea -import com.intellij.util.ui.JBDimension import com.intellij.util.ui.JBUI import com.intellij.util.ui.components.BorderLayoutPanel import java.awt.BorderLayout @@ -274,7 +273,9 @@ class ConnectionPanel( override fun getPreferredSize(): Dimension { val size = super.getPreferredSize() if (!scroll.isVisible) return size - return JBDimension(size.width, header.preferredSize.height + scrollHeight()) + // header/scroll heights are already scaled px; assign with plain Dimension so IDE + // zoom does not scale them a second time via the user scale factor. + return Dimension(size.width, header.preferredSize.height + scrollHeight()) } private fun scrollHeight(): Int { diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/SessionLayout.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/SessionLayout.kt index 62e9d4805c..2905bceb0f 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/SessionLayout.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/SessionLayout.kt @@ -1,7 +1,6 @@ package ai.kilocode.client.session.ui import ai.kilocode.client.session.ui.style.SessionUiStyle -import com.intellij.util.ui.JBDimension import com.intellij.util.ui.JBUI import com.intellij.util.ui.components.BorderLayoutPanel import java.awt.Component @@ -21,8 +20,8 @@ import java.awt.LayoutManager * 1. Uses the parent's *actual* width as the available width for all children. * 2. Calls `setSize(w, …)` on each child before reading `preferredSize.height` * so that HTML components reflow and report the correct height. - * 3. Applies layout-owned [pad] around the children. - * 4. Stacks children top-to-bottom with a configurable [gap]. + * 3. Applies layout-owned padding around the children. + * 4. Stacks children top-to-bottom with a configurable gap. * 5. Skips invisible children. * * Pair with [SessionLayoutPanel] (or any panel that implements [Scrollable] @@ -30,8 +29,8 @@ import java.awt.LayoutManager * the panel width and the layout always has a valid width to work with. */ class SessionLayout( - private val gap: Int = JBUI.scale(SessionUiStyle.SessionLayout.GAP), - private val pad: Insets = JBUI.emptyInsets(), + private val baseGap: Int = SessionUiStyle.SessionLayout.GAP, + private val basePad: Insets = JBUI.emptyInsets(), ) : LayoutManager { override fun addLayoutComponent(name: String, comp: Component) = Unit @@ -51,7 +50,10 @@ class SessionLayout( comp.setSize(child.width, comp.height.coerceAtLeast(1)) h += comp.preferredSize.height } - return JBDimension(w + ins.left + ins.right, h) + // w and h are already scaled px (child preferred heights + scaled gaps/insets) and + // match what layoutContainer stacks, so return a plain Dimension. A JBDimension would + // scale again by the user scale factor and inflate the transcript height under IDE zoom. + return Dimension(w + ins.left + ins.right, h) } override fun minimumLayoutSize(parent: Container): Dimension = preferredLayoutSize(parent) @@ -86,16 +88,16 @@ class SessionLayout( private fun insets(parent: Container): Insets { val base = parent.insets return Insets( - base.top + pad.top, - base.left + pad.left, - base.bottom + pad.bottom, - base.right + pad.right, + base.top + JBUI.scale(basePad.top), + base.left + JBUI.scale(basePad.left), + base.bottom + JBUI.scale(basePad.bottom), + base.right + JBUI.scale(basePad.right), ) } private fun gap(comp: Component): Int { if (view(comp)?.sessionGapKind == SessionView.Kind.UserPrompt) return JBUI.scale(SessionUiStyle.SessionLayout.USER_PROMPT_GAP) - return gap + return JBUI.scale(baseGap) } private fun view(comp: Component): SessionView? = comp as? SessionView @@ -111,7 +113,7 @@ class SessionLayout( * [SessionLayout] a valid width to measure against. */ open class SessionLayoutPanel( - gap: Int = JBUI.scale(SessionUiStyle.SessionLayout.GAP), + gap: Int = SessionUiStyle.SessionLayout.GAP, pad: Insets = JBUI.emptyInsets(), ) : BorderLayoutPanel(), javax.swing.Scrollable { init { diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/SessionMessageListPanel.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/SessionMessageListPanel.kt index 756189d54d..980972f3b1 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/SessionMessageListPanel.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/SessionMessageListPanel.kt @@ -18,7 +18,7 @@ import ai.kilocode.client.session.views.TurnView import ai.kilocode.client.session.views.base.PartView import com.intellij.openapi.Disposable import com.intellij.openapi.util.Disposer -import com.intellij.util.ui.JBUI +import java.awt.Insets import javax.swing.JComponent /** @@ -62,12 +62,12 @@ class SessionMessageListPanel( private val cancelRevert: (() -> Unit)? = null, private val banner: RevertBanner? = null, ) : SessionLayoutPanel( - JBUI.scale(SessionUiStyle.SessionLayout.GAP), - JBUI.insets( - SessionUiStyle.SessionLayout.InnerInsets.top, - SessionUiStyle.SessionLayout.InnerInsets.left, - SessionUiStyle.SessionLayout.InnerInsets.bottom, - SessionUiStyle.SessionLayout.InnerInsets.right + SessionUiStyle.SessionLayout.TRANSCRIPT_SCROLLBAR_PADDING, + SessionUiStyle.SessionLayout.GAP, + Insets( + SessionUiStyle.SessionLayout.INNER_TOP, + SessionUiStyle.SessionLayout.INNER_HORIZONTAL, + SessionUiStyle.SessionLayout.INNER_BOTTOM, + SessionUiStyle.SessionLayout.INNER_HORIZONTAL, ), ), Disposable, SessionEditorStyleTarget { diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/prompt/PromptPanel.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/prompt/PromptPanel.kt index 9c1eb60d8e..ec5f7e7c1a 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/prompt/PromptPanel.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/prompt/PromptPanel.kt @@ -63,7 +63,6 @@ import com.intellij.ui.AnimatedIcon import com.intellij.ui.IslandsState import com.intellij.util.concurrency.annotations.RequiresEdt import com.intellij.xml.util.XmlStringUtil -import com.intellij.util.ui.JBDimension import com.intellij.util.ui.JBUI import com.intellij.util.ui.UIUtil import com.intellij.util.ui.components.BorderLayoutPanel @@ -78,6 +77,7 @@ import java.awt.BasicStroke import java.awt.BorderLayout import java.awt.Component import java.awt.Cursor +import java.awt.Dimension import java.awt.Graphics import java.awt.Graphics2D import java.awt.RenderingHints @@ -243,7 +243,7 @@ class PromptPanel( addActionListener { enhance() } } private val separator = object : JComponent() { - override fun getPreferredSize() = JBUI.size(1, JBUI.scale(16)) + override fun getPreferredSize() = JBUI.size(1, 16) override fun getMinimumSize() = preferredSize override fun getMaximumSize() = preferredSize }.apply { @@ -313,6 +313,12 @@ class PromptPanel( syncBorder() } + override fun getPreferredSize(): Dimension = promptSize(super.getPreferredSize()) + + override fun getMinimumSize(): Dimension = promptSize(super.getMinimumSize()) + + override fun getMaximumSize(): Dimension = Dimension(super.getMaximumSize().width, preferredSize.height) + private fun syncFocus(value: Boolean) { if (focused == value) { repaint() @@ -335,6 +341,12 @@ class PromptPanel( ) } + private fun promptSize(size: Dimension): Dimension { + val chrome = (shell.preferredSize.height - editor.preferredSize.height).coerceAtLeast(0) + val ins = insets + return Dimension(size.width, editor.preferredSize.height + chrome + ins.top + ins.bottom) + } + override fun paintChildren(g: Graphics) { super.paintChildren(g) if (!editorFocused()) return @@ -916,17 +928,19 @@ class PromptPanel( val view = editor.getEditor(false) val line = view?.lineHeight ?: editor.getFontMetrics(editor.font).height val min = line * SessionUiStyle.View.Prompt.EDITOR_LINES + JBUI.scale(SessionUiStyle.View.Prompt.EDITOR_CHROME) - val content = editor.preferredSize.height + val content = if (editor.text.isBlank()) min else editor.preferredSize.height val sessionCap = rootCap(min) val height = minOf(content, sessionCap ?: content).coerceAtLeast(min) syncEditorScroll(view, content > height) + // height is already scaled px (from the editor lineHeight); assign with plain + // Dimension so IDE zoom does not scale it a second time via the user scale factor. if (before == height && lower == height) { - editor.preferredSize = JBDimension(0, height) - editor.minimumSize = JBDimension(0, height) + editor.preferredSize = Dimension(0, height) + editor.minimumSize = Dimension(0, height) return } - editor.preferredSize = JBDimension(0, height) - editor.minimumSize = JBDimension(0, height) + editor.preferredSize = Dimension(0, height) + editor.minimumSize = Dimension(0, height) revalidate() repaint() } diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/style/SessionEditorStyle.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/style/SessionEditorStyle.kt index 8096ba8272..d426ef01f0 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/style/SessionEditorStyle.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/style/SessionEditorStyle.kt @@ -1,6 +1,7 @@ package ai.kilocode.client.session.ui.style import ai.kilocode.client.ui.UiStyle +import com.intellij.ide.ui.UISettingsUtils import com.intellij.openapi.editor.colors.EditorColorsManager import com.intellij.openapi.editor.colors.EditorColorsScheme import com.intellij.openapi.editor.ex.EditorEx @@ -98,7 +99,11 @@ data class SessionEditorStyle( /** Builds a style snapshot from the current global editor color scheme. */ fun current(): SessionEditorStyle { val scheme = EditorColorsManager.getInstance().globalScheme - return create(scheme, scheme.editorFontName, scheme.editorFontSize) + val size = UISettingsUtils.getInstance() + .scaleFontSize(scheme.editorFontSize.toFloat()) + .roundToInt() + .coerceAtLeast(1) + return create(scheme, scheme.editorFontName, size) } internal fun create( diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/style/SessionUiStyle.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/style/SessionUiStyle.kt index 846832903c..d94bbe7526 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/style/SessionUiStyle.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/ui/style/SessionUiStyle.kt @@ -5,7 +5,6 @@ import com.intellij.ui.JBColor import com.intellij.util.ui.JBUI import com.intellij.util.ui.UIUtil import java.awt.Color -import java.awt.Insets /** Static style tokens owned by the chat session UI. */ object SessionUiStyle { @@ -18,12 +17,13 @@ object SessionUiStyle { const val GAP = 3 const val USER_PROMPT_GAP = 10 const val TRANSCRIPT_SCROLLBAR_PADDING = 10 - val InnerInsets = Insets( - UiStyle.Gap.md(), - UiStyle.Gap.sm() + TRANSCRIPT_SCROLLBAR_PADDING, - UiStyle.Gap.sm(), - UiStyle.Gap.sm(), - ) + + // Unscaled base transcript insets. Base 6 == UiStyle.Gap.md, base 4 == UiStyle.Gap.sm. + // Left and right reserve scrollbar allowance to match the previous symmetric padding. + const val INNER_TOP = 6 + const val INNER_BOTTOM = 4 + const val INNER_HORIZONTAL = 4 + TRANSCRIPT_SCROLLBAR_PADDING + const val USER_PROMPT_INDENT = 100 const val SCROLL_INCREMENT = 48 } @@ -69,7 +69,7 @@ object SessionUiStyle { /** Prompt input dimensions and chrome inside the session view. */ object Prompt { - const val EDITOR_LINES = 3 + const val EDITOR_LINES = 1 const val EDITOR_CHROME = 16 const val SEND_BUTTON_SIZE = 24 const val CORNER_ARC = 6 diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/CompactionView.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/CompactionView.kt index b736a08bca..244d5c9448 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/CompactionView.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/CompactionView.kt @@ -43,7 +43,7 @@ class CompactionView(@Suppress("UNUSED_PARAMETER") compaction: Compaction) : Par val line = { JPanel().apply { background = SessionUiStyle.View.Outline.color() isOpaque = true - preferredSize = JBDimension(0, JBUI.scale(1)) + preferredSize = JBDimension(0, 1) } } val row = JPanel(GridBagLayout()).apply { diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/MessageView.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/MessageView.kt index efbb39535d..b043bfbf77 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/MessageView.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/MessageView.kt @@ -57,7 +57,7 @@ class MessageView( private val hover: ((PartView, Boolean) -> Unit)? = null, private val revert: ((String) -> Unit)? = null, ) : ai.kilocode.client.session.ui.SessionLayoutPanel( - JBUI.scale(SessionUiStyle.SessionLayout.GAP), + SessionUiStyle.SessionLayout.GAP, ), Disposable, SessionEditorStyleTarget, SessionView { val role: String get() = msg.info.role diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/TextView.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/TextView.kt index fc6ee10333..72c17a3466 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/TextView.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/TextView.kt @@ -57,12 +57,14 @@ open class TextView( add(md.component, BorderLayout.CENTER) add(placeholder, BorderLayout.SOUTH) if (text.content.isNotEmpty()) md.set(text.content.toString()) + syncContent() syncToolbar() } override fun update(content: Content) { if (content !is Text) return md.set(content.content.toString()) + syncContent() syncToolbar() refresh() } @@ -70,6 +72,7 @@ open class TextView( override fun appendDelta(delta: String) { if (delta.isEmpty()) return md.append(delta) + syncContent() syncToolbar() refresh() } @@ -128,6 +131,11 @@ open class TextView( repaint() } + @RequiresEdt + private fun syncContent() { + md.component.isVisible = md.markdown().isNotBlank() + } + @RequiresEdt private fun syncToolbar() { val on = copyText()?.isNotEmpty() == true diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/TurnView.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/TurnView.kt index afdad313b2..d64f85791c 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/TurnView.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/TurnView.kt @@ -13,7 +13,6 @@ import ai.kilocode.client.session.views.base.PartView import com.intellij.openapi.Disposable import com.intellij.openapi.util.Disposer import com.intellij.util.concurrency.annotations.RequiresEdt -import com.intellij.util.ui.JBUI import javax.swing.JComponent /** @@ -36,7 +35,7 @@ class TurnView( private val repo: String? = null, private val hover: ((PartView, Boolean) -> Unit)? = null, private val revert: ((String) -> Unit)? = null, -) : SessionLayoutPanel(JBUI.scale(SessionUiStyle.SessionLayout.GAP)), Disposable, SessionEditorStyleTarget, SessionView { +) : SessionLayoutPanel(SessionUiStyle.SessionLayout.GAP), Disposable, SessionEditorStyleTarget, SessionView { private val messages = LinkedHashMap() diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/question/QuestionView.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/question/QuestionView.kt index c08851d4e2..8f103fa4dc 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/question/QuestionView.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/question/QuestionView.kt @@ -29,7 +29,6 @@ import com.intellij.ui.components.JBLabel import com.intellij.ui.components.JBRadioButton import com.intellij.ui.components.JBTextArea import com.intellij.util.concurrency.annotations.RequiresEdt -import com.intellij.util.ui.JBDimension import com.intellij.util.ui.JBUI import com.intellij.util.ui.components.BorderLayoutPanel import java.awt.BorderLayout @@ -576,8 +575,10 @@ class QuestionView( val cap = rootCap(min) val height = minOf(content, cap ?: content).coerceAtLeast(min) syncEditorScroll(editor, content > height) - ed.preferredSize = JBDimension(0, height) - ed.minimumSize = JBDimension(0, height) + // height is already scaled px (from the editor lineHeight); assign with plain + // Dimension so IDE zoom does not scale it again via the user scale factor. + ed.preferredSize = Dimension(0, height) + ed.minimumSize = Dimension(0, height) } @RequiresEdt diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/tool/TaskToolView.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/tool/TaskToolView.kt index 51f080b24a..0feb6c454a 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/tool/TaskToolView.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/tool/TaskToolView.kt @@ -16,7 +16,6 @@ import com.intellij.openapi.actionSystem.UiDataProvider import com.intellij.ui.components.JBLabel import com.intellij.ui.components.JBScrollPane import com.intellij.util.concurrency.annotations.RequiresEdt -import com.intellij.util.ui.JBDimension import com.intellij.util.ui.JBUI import java.awt.BorderLayout import java.awt.Dimension @@ -307,7 +306,8 @@ private class TaskRows : Stack(StackAxis.VERTICAL, UiStyle.Gap.sm()), Scrollable direction: Int, ) = visibleRect.height - override fun getMaximumSize() = JBDimension(Int.MAX_VALUE, super.getMaximumSize().height) + // super height is already scaled px; a JBDimension would scale it again under IDE zoom. + override fun getMaximumSize() = Dimension(Int.MAX_VALUE, super.getMaximumSize().height) } private fun rowTitleColor(tool: Tool) = if (tool.state == ToolExecState.ERROR) { diff --git a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/tool/ToolSupport.kt b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/tool/ToolSupport.kt index 9bc89f3b17..b580de6f9e 100644 --- a/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/tool/ToolSupport.kt +++ b/packages/kilo-jetbrains/frontend/src/main/kotlin/ai/kilocode/client/session/views/tool/ToolSupport.kt @@ -33,13 +33,13 @@ import com.intellij.ui.components.JBLabel import com.intellij.ui.components.JBScrollPane import com.intellij.ui.components.JBTextArea import com.intellij.util.concurrency.annotations.RequiresEdt -import com.intellij.util.ui.JBDimension import com.intellij.util.ui.JBUI import com.intellij.xml.util.XmlStringUtil import java.awt.BorderLayout import java.awt.CardLayout import java.awt.Color import java.awt.Cursor +import java.awt.Dimension import java.awt.Font import java.awt.Point import java.awt.event.MouseAdapter @@ -189,17 +189,20 @@ class ToolBody private constructor( private fun size() { val view = scroll.viewport.view as? JComponent ?: return + // height/width are already scaled px (from editor lineHeight and font metrics), + // so assign with plain Dimension. Wrapping in JBUI.size/JBDimension would scale + // again by the user scale factor and double-scale under IDE zoom. val height = height(view) val width = width(view) - view.preferredSize = JBUI.size(width, height) - view.minimumSize = JBUI.size(0, height) - view.maximumSize = JBDimension(Int.MAX_VALUE, height) + view.preferredSize = Dimension(width, height) + view.minimumSize = Dimension(0, height) + view.maximumSize = Dimension(Int.MAX_VALUE, height) val inset = scroll.viewportBorder?.getBorderInsets(scroll) ?: JBUI.emptyInsets() val pane = height + scroll.insets.top + scroll.insets.bottom + inset.top + inset.bottom + scroll.horizontalScrollBar.preferredSize.height - scroll.preferredSize = JBUI.size(0, pane) - scroll.minimumSize = JBUI.size(0, pane) - scroll.maximumSize = JBDimension(Int.MAX_VALUE, pane) + scroll.preferredSize = Dimension(0, pane) + scroll.minimumSize = Dimension(0, pane) + scroll.maximumSize = Dimension(Int.MAX_VALUE, pane) } private fun width(view: JComponent): Int { @@ -356,14 +359,14 @@ internal fun toolParts( } val slot = JPanel(CardLayout()).apply { isOpaque = false - minimumSize = JBUI.size(0, minimumSize.height) + minimumSize = Dimension(0, minimumSize.height) add(sub, SUB_CARD) add(link, LINK_CARD) } val state = clip(JBLabel()).apply { foreground = UiStyle.Colors.weak() } val center = JPanel(BorderLayout(UiStyle.Gap.md(), 0)).apply { isOpaque = false - minimumSize = JBUI.size(0, minimumSize.height) + minimumSize = Dimension(0, minimumSize.height) } val controls = Stack.horizontal() val header = JPanel(BorderLayout(JBUI.scale(SessionUiStyle.View.Layout.GAP), 0)).apply { @@ -393,7 +396,7 @@ internal fun searchParts(count: Int): ToolParts { val link = clip(JBLabel()).apply { isVisible = false } val slot = JPanel(CardLayout()).apply { isOpaque = false - minimumSize = JBUI.size(0, minimumSize.height) + minimumSize = Dimension(0, minimumSize.height) add(sub, SUB_CARD) add(link, LINK_CARD) } @@ -402,7 +405,7 @@ internal fun searchParts(count: Int): ToolParts { val target = stack.align(HAlign.TRACK, VAlign.CENTER) val center = JPanel(BorderLayout(UiStyle.Gap.md(), 0)).apply { isOpaque = false - minimumSize = JBUI.size(0, minimumSize.height) + minimumSize = Dimension(0, minimumSize.height) add(title, BorderLayout.WEST) add(target, BorderLayout.CENTER) } @@ -472,7 +475,7 @@ internal fun setLinkText(parts: ToolParts, text: String): Boolean { } private fun clip(label: JBLabel): JBLabel = label.apply { - minimumSize = JBUI.size(0, minimumSize.height) + minimumSize = Dimension(0, minimumSize.height) } private fun html(text: String): String { diff --git a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/PromptPanelTest.kt b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/PromptPanelTest.kt index 1707362a30..5e51f8f46a 100644 --- a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/PromptPanelTest.kt +++ b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/PromptPanelTest.kt @@ -71,6 +71,7 @@ import com.intellij.ui.LanguageTextField import com.intellij.ui.components.JBLabel import com.intellij.util.Producer import com.intellij.util.ui.EmptyIcon +import com.intellij.ui.scale.JBUIScale import com.intellij.util.ui.JBUI import com.intellij.util.ui.UIUtil import kotlinx.coroutines.CompletableDeferred @@ -277,7 +278,7 @@ class PromptPanelTest : BasePlatformTestCase() { assertTrue(editor.preferredSize.height > min) } - fun `test prompt editor keeps three line minimum`() { + fun `test prompt editor keeps compact empty minimum`() { val panel = PromptPanel(project = project, onSend = { _, _ -> }, onAbort = {}, onEnhance = { _, _ -> }) val editor = panel.defaultFocusedComponent as EditorTextField @@ -289,6 +290,53 @@ class PromptPanelTest : BasePlatformTestCase() { assertEquals(min, editor.preferredSize.height) } + fun `test empty prompt ignores narrow placeholder preferred height`() { + val panel = PromptPanel(project = project, onSend = { _, _ -> }, onAbort = {}, onEnhance = { _, _ -> }) + val editor = panel.defaultFocusedComponent as EditorTextField + + realize(panel, 80, 400) + UIUtil.dispatchAllInvocationEvents() + val view = editor.getEditor(false)!! + val min = view.lineHeight * SessionUiStyle.View.Prompt.EDITOR_LINES + + JBUI.scale(SessionUiStyle.View.Prompt.EDITOR_CHROME) + + assertEquals(min, editor.preferredSize.height) + } + + fun `test empty prompt minimum ignores user scale factor`() { + // The empty-prompt minimum is line height (ide scale) plus scaled chrome. Under a + // raised user scale factor it must equal that computed minimum, not a doubled value. + val original = JBUIScale.scale(1f) + try { + JBUIScale.setUserScaleFactorForTest(2f) + val panel = PromptPanel(project = project, onSend = { _, _ -> }, onAbort = {}, onEnhance = { _, _ -> }) + val editor = panel.defaultFocusedComponent as EditorTextField + + realize(panel, 400, 400) + UIUtil.dispatchAllInvocationEvents() + val view = editor.getEditor(false)!! + val min = view.lineHeight * SessionUiStyle.View.Prompt.EDITOR_LINES + + JBUI.scale(SessionUiStyle.View.Prompt.EDITOR_CHROME) + + assertEquals(min, editor.preferredSize.height) + } finally { + JBUIScale.setUserScaleFactorForTest(original) + } + } + + fun `test empty prompt panel stays compact at narrow width`() { + val panel = PromptPanel(project = project, onSend = { _, _ -> }, onAbort = {}, onEnhance = { _, _ -> }) + val editor = panel.defaultFocusedComponent as EditorTextField + + realize(panel, 80, 900) + UIUtil.dispatchAllInvocationEvents() + val chrome = (panel.shellForTest().preferredSize.height - editor.preferredSize.height).coerceAtLeast(0) + val ins = panel.insets + + assertEquals(editor.preferredSize.height + chrome + ins.top + ins.bottom, panel.preferredSize.height) + assertTrue(panel.preferredSize.height < 180) + } + fun `test prompt editor grows when single line wraps`() { val panel = PromptPanel(project = project, onSend = { _, _ -> }, onAbort = {}, onEnhance = { _, _ -> }) val editor = panel.defaultFocusedComponent as EditorTextField diff --git a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/SessionEditorStyleTest.kt b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/SessionEditorStyleTest.kt index 37ff1cfae5..6cb46c9a74 100644 --- a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/SessionEditorStyleTest.kt +++ b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/SessionEditorStyleTest.kt @@ -2,11 +2,14 @@ package ai.kilocode.client.session.ui import ai.kilocode.client.session.ui.style.SessionEditorStyle import ai.kilocode.client.ui.UiStyle +import com.intellij.ide.ui.UISettings +import com.intellij.ide.ui.UISettingsUtils import com.intellij.openapi.editor.EditorFactory import com.intellij.openapi.editor.ex.EditorEx import com.intellij.openapi.editor.colors.EditorColorsManager import com.intellij.testFramework.fixtures.BasePlatformTestCase import java.awt.Font +import kotlin.math.roundToInt @Suppress("UnstableApiUsage") class SessionEditorStyleTest : BasePlatformTestCase() { @@ -15,14 +18,38 @@ class SessionEditorStyleTest : BasePlatformTestCase() { val scheme = EditorColorsManager.getInstance().globalScheme val style = SessionEditorStyle.current() val font = style.transcriptFont + val size = UISettingsUtils.getInstance() + .scaleFontSize(scheme.editorFontSize.toFloat()) + .roundToInt() assertEquals(UiStyle.Fonts.regular().name, font.name) - assertEquals(scheme.editorFontSize, font.size) + assertEquals(size, font.size) assertEquals(scheme.defaultForeground, style.editorForeground) assertEquals(scheme.defaultBackground, style.editorBackground) assertEquals(Font.PLAIN, font.style) } + fun `test current scales editor size with ide scale`() { + val settings = UISettings.getInstance() + val original = settings.ideScale + try { + val base = EditorColorsManager.getInstance().globalScheme.editorFontSize + settings.ideScale = 1.5f + settings.fireUISettingsChanged() + + val style = SessionEditorStyle.current() + + assertTrue( + "transcript should grow with ide scale (base=$base, got=${style.transcriptFont.size})", + style.transcriptFont.size > base, + ) + assertEquals(style.editorSize, style.transcriptFont.size) + } finally { + settings.ideScale = original + settings.fireUISettingsChanged() + } + } + fun `test editor font uses editor family and size`() { val style = SessionEditorStyle.current() val font = style.editorFont diff --git a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/SessionLayoutTest.kt b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/SessionLayoutTest.kt index 9abefa2f21..0a5eaf824f 100644 --- a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/SessionLayoutTest.kt +++ b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/SessionLayoutTest.kt @@ -2,6 +2,7 @@ package ai.kilocode.client.session.ui import ai.kilocode.client.session.ui.style.SessionUiStyle import com.intellij.testFramework.fixtures.BasePlatformTestCase +import com.intellij.ui.scale.JBUIScale import com.intellij.util.ui.JBUI import com.intellij.util.ui.components.BorderLayoutPanel import java.awt.Dimension @@ -107,15 +108,15 @@ class SessionLayoutTest : BasePlatformTestCase() { fun `test layout padding offsets children and reduces available width`() { val p = panel( width = 500, - pad = JBUI.insets(6, 12, 8, 16), + pad = Insets(6, 12, 8, 16), ) val child = label(height = 20) p.add(child) p.doLayout() - assertEquals(12, child.x) - assertEquals(6, child.y) - assertEquals(500 - 12 - 16, child.width) + assertEquals(JBUI.scale(12), child.x) + assertEquals(JBUI.scale(6), child.y) + assertEquals(500 - JBUI.scale(12) - JBUI.scale(16), child.width) assertEquals(20, child.height) } @@ -123,7 +124,7 @@ class SessionLayoutTest : BasePlatformTestCase() { val p = panel( gap = 8, width = 300, - pad = JBUI.insets(5, 10, 7, 11), + pad = Insets(5, 10, 7, 11), ) val c1 = label(height = 20) val c2 = label(height = 30) @@ -131,12 +132,12 @@ class SessionLayoutTest : BasePlatformTestCase() { p.add(c2) p.doLayout() - assertEquals(10, c1.x) - assertEquals(5, c1.y) - assertEquals(10, c2.x) - assertEquals(5 + 20 + 8, c2.y) - assertEquals(300 - 10 - 11, c1.width) - assertEquals(300 - 10 - 11, c2.width) + assertEquals(JBUI.scale(10), c1.x) + assertEquals(JBUI.scale(5), c1.y) + assertEquals(JBUI.scale(10), c2.x) + assertEquals(JBUI.scale(5) + 20 + JBUI.scale(8), c2.y) + assertEquals(300 - JBUI.scale(10) - JBUI.scale(11), c1.width) + assertEquals(300 - JBUI.scale(10) - JBUI.scale(11), c2.width) } fun `test user prompt is inset from left when enough width remains`() { @@ -162,13 +163,13 @@ class SessionLayoutTest : BasePlatformTestCase() { } fun `test user prompt inset composes with layout padding`() { - val p = panel(width = 350, pad = JBUI.insets(0, 12, 0, 18)) + val p = panel(width = 350, pad = Insets(0, 12, 0, 18)) val child = view(height = 20, kind = SessionView.Kind.UserPrompt) p.add(child) p.doLayout() - assertEquals(12 + 100, child.x) - assertEquals(350 - 12 - 18 - 100, child.width) + assertEquals(JBUI.scale(12) + JBUI.scale(100), child.x) + assertEquals(350 - JBUI.scale(12) - JBUI.scale(18) - JBUI.scale(100), child.width) assertEquals(20, child.height) } @@ -201,13 +202,13 @@ class SessionLayoutTest : BasePlatformTestCase() { } fun `test only invisible children produce padding height`() { - val p = panel(gap = 8, width = 300, pad = JBUI.insets(5, 0, 7, 0)) + val p = panel(gap = 8, width = 300, pad = Insets(5, 0, 7, 0)) val c = label(height = 20).also { it.isVisible = false } p.add(c) p.doLayout() val size = p.layout.preferredLayoutSize(p) - assertEquals(5 + 7, size.height) + assertEquals(JBUI.scale(5) + JBUI.scale(7), size.height) } // ---- preferred size ------ @@ -240,14 +241,44 @@ class SessionLayoutTest : BasePlatformTestCase() { } fun `test preferredLayoutSize includes layout padding`() { - val p = panel(gap = 4, width = 300, pad = JBUI.insets(5, 10, 7, 11)) + val p = panel(gap = 4, width = 300, pad = Insets(5, 10, 7, 11)) p.add(label(height = 10)) p.add(label(height = 15)) p.doLayout() val size = p.layout.preferredLayoutSize(p) assertEquals(300, size.width) - assertEquals(5 + 10 + 4 + 15 + 7, size.height) + assertEquals(JBUI.scale(5) + 10 + JBUI.scale(4) + 15 + JBUI.scale(7), size.height) + } + + fun `test preferredLayoutSize is not double-scaled by user scale factor`() { + // IDE zoom raises the JBUI user scale factor. Child heights and gaps are already + // scaled px, so the transcript preferred height must not be scaled a second time. + val original = JBUIScale.scale(1f) + try { + JBUIScale.setUserScaleFactorForTest(2f) + val p = panel(gap = 4, width = 300) + p.add(label(height = 10)) + p.add(label(height = 15)) + p.add(label(height = 20)) + p.doLayout() + + val size = p.layout.preferredLayoutSize(p) + assertEquals(10 + JBUI.scale(4) + 15 + JBUI.scale(4) + 20, size.height) + } finally { + JBUIScale.setUserScaleFactorForTest(original) + } + } + + fun `test layout scales base gap at layout time`() { + val p = panel(gap = 8, width = 300) + val c1 = label(height = 20) + val c2 = label(height = 30) + p.add(c1) + p.add(c2) + p.doLayout() + + assertEquals(20 + JBUI.scale(8), c2.y) } // ---- helpers ------ diff --git a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/TextViewTest.kt b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/TextViewTest.kt index 7acd9a2354..14bfaea526 100644 --- a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/TextViewTest.kt +++ b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/TextViewTest.kt @@ -38,6 +38,17 @@ class TextViewTest : BasePlatformTestCase() { assertEquals("", view.markdown()) } + fun `test empty text view does not reserve transcript height`() { + val view = TextView(Text("p1")) + view.setSize(260, 1) + + assertEquals(0, view.preferredSize.height) + + view.appendDelta("hello") + + assertTrue(view.preferredSize.height > 0) + } + fun `test Text with content sets initial markdown`() { val text = Text("p1").also { it.content.append("hello **world**") } val view = TextView(text) diff --git a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/ToolViewTest.kt b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/ToolViewTest.kt index 1834157ce6..e5b3b991a3 100644 --- a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/ToolViewTest.kt +++ b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/views/ToolViewTest.kt @@ -11,6 +11,7 @@ import ai.kilocode.client.session.views.tool.ToolView import ai.kilocode.client.ui.UiStyle import com.intellij.openapi.util.Disposer import com.intellij.testFramework.fixtures.BasePlatformTestCase +import com.intellij.ui.scale.JBUIScale import java.awt.BorderLayout import java.awt.Color import java.awt.image.BufferedImage @@ -305,6 +306,31 @@ class ToolViewTest : BasePlatformTestCase() { assertTrue(view.preferredSize.height > 0) } + fun `test expanded body height ignores user scale factor`() { + // The tool body height comes from the editor line height, which tracks the IDE + // scale (editor font), not the JBUI user scale factor. Raising the user scale + // factor alone must not change the body height; a double-scaling regression would. + val original = JBUIScale.scale(1f) + val t = tool("p1", "bash", ToolExecState.COMPLETED).also { + it.input = mapOf("command" to "log") + it.output = (1..6).joinToString("\n") { line -> "line $line" } + } + try { + JBUIScale.setUserScaleFactorForTest(1f) + val view = track(ToolView(t)) + view.toggle() + val before = view.bodyEditor()!!.preferredSize.height + + JBUIScale.setUserScaleFactorForTest(2f) + view.applyStyle(SessionEditorStyle.current()) + val after = view.bodyEditor()!!.preferredSize.height + + assertEquals(before, after) + } finally { + JBUIScale.setUserScaleFactorForTest(original) + } + } + fun `test large tool output is truncated in preview`() { val out = "x".repeat(SessionUiStyle.View.Tool.PREVIEW_LIMIT + 1_000) val t = tool("p1", "bash", ToolExecState.COMPLETED).also { diff --git a/packages/kilo-jetbrains/gradle.properties b/packages/kilo-jetbrains/gradle.properties index 6f148dcf27..da837bb13a 100644 --- a/packages/kilo-jetbrains/gradle.properties +++ b/packages/kilo-jetbrains/gradle.properties @@ -1,5 +1,5 @@ kotlin.stdlib.default.dependency=false -kilo.jetbrains.version=7.0.5 +kilo.jetbrains.version=7.0.6 # When true (default) the JetBrains plugin uses the pinned CLI release from package.json. # Set to false ONLY for local dev: generate the client from local source + bundle the local binary. # false is NOT releasable -- production builds fail unless this is true. diff --git a/packages/kilo-memory/package.json b/packages/kilo-memory/package.json index 5fbe65641a..b3fb5b6d9a 100644 --- a/packages/kilo-memory/package.json +++ b/packages/kilo-memory/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@kilocode/kilo-memory", - "version": "7.4.7", + "version": "7.4.8", "type": "module", "license": "MIT", "description": "Project memory storage, indexing, recall, and command helpers for Kilo Code", diff --git a/packages/kilo-sandbox/package.json b/packages/kilo-sandbox/package.json index 805982f130..48a98b0eb4 100644 --- a/packages/kilo-sandbox/package.json +++ b/packages/kilo-sandbox/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@kilocode/sandbox", - "version": "7.4.7", + "version": "7.4.8", "type": "module", "license": "MIT", "private": true, diff --git a/packages/kilo-telemetry/package.json b/packages/kilo-telemetry/package.json index 0f9653bef5..209f233724 100644 --- a/packages/kilo-telemetry/package.json +++ b/packages/kilo-telemetry/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@kilocode/kilo-telemetry", - "version": "7.4.7", + "version": "7.4.8", "type": "module", "license": "MIT", "description": "Telemetry for Kilo CLI - PostHog analytics integration", diff --git a/packages/kilo-ui/package.json b/packages/kilo-ui/package.json index 5cbb639715..d576813bcf 100644 --- a/packages/kilo-ui/package.json +++ b/packages/kilo-ui/package.json @@ -1,6 +1,6 @@ { "name": "@kilocode/kilo-ui", - "version": "7.4.7", + "version": "7.4.8", "type": "module", "license": "MIT", "exports": { diff --git a/packages/kilo-vscode/CHANGELOG.md b/packages/kilo-vscode/CHANGELOG.md index ed7c7285d1..73bffe2119 100644 --- a/packages/kilo-vscode/CHANGELOG.md +++ b/packages/kilo-vscode/CHANGELOG.md @@ -1,5 +1,50 @@ # kilo-code +## 7.4.8 + +### Minor Changes + +- [#12159](https://github.com/Kilo-Org/kilocode/pull/12159) [`1083bb8`](https://github.com/Kilo-Org/kilocode/commit/1083bb82b65e986dfbc7092647b6ee2650951265) - Report active CLI and VS Code app and session presence. + +- [#12065](https://github.com/Kilo-Org/kilocode/pull/12065) [`2040f6c`](https://github.com/Kilo-Org/kilocode/commit/2040f6c896df41a4ac6c233b839ff938b86a1a30) - Hovering or focusing a bar in the task timeline now highlights the matching tool call in the transcript, making it easier to see which bar belongs to which tool. + +- [#11687](https://github.com/Kilo-Org/kilocode/pull/11687) [`c8047e6`](https://github.com/Kilo-Org/kilocode/commit/c8047e65f5aaf05294a76be2ac3534b0a45ec78a) - Add the prompt enhancer to the New Worktree dialog, so prompts can be enhanced before creating worktree sessions. + +### Patch Changes + +- [#11868](https://github.com/Kilo-Org/kilocode/pull/11868) [`5b97ba1`](https://github.com/Kilo-Org/kilocode/commit/5b97ba1c06b662095a55b4a3686f71f55d39a4c2) Thanks [@Tamsi](https://github.com/Tamsi)! - Improve agent behaviour setting descriptions for Temperature, Top P, and Max Steps. + +- [#12183](https://github.com/Kilo-Org/kilocode/pull/12183) [`751cac5`](https://github.com/Kilo-Org/kilocode/commit/751cac5e757d626c66e66122ffce312cc4182a29) Thanks [@AmariahAK](https://github.com/AmariahAK)! - Move "Browse files..." to the end of the @-mention dropdown so the closest matching file is the default selection instead of the file picker. + +- [#12211](https://github.com/Kilo-Org/kilocode/pull/12211) [`b478786`](https://github.com/Kilo-Org/kilocode/commit/b47878636bd4004dfd0f91b9e51b5244df1636a1) - Correct the token usage summary's cache-read indicator and group cached input with other input tokens. + +- [#11922](https://github.com/Kilo-Org/kilocode/pull/11922) [`07dab7b`](https://github.com/Kilo-Org/kilocode/commit/07dab7bf113a090df4de07a92249039454ef25e3) Thanks [@LEN5010](https://github.com/LEN5010)! - Improve question option visibility in light VS Code themes. + +- [#11783](https://github.com/Kilo-Org/kilocode/pull/11783) [`6a3e5f3`](https://github.com/Kilo-Org/kilocode/commit/6a3e5f39011e4b1a63ab5d0ae0dbf8195ea29d4c) - Inherit sandbox state when a sandboxed agent starts new Agent Manager sessions. + +- [#12174](https://github.com/Kilo-Org/kilocode/pull/12174) [`3ba4c33`](https://github.com/Kilo-Org/kilocode/commit/3ba4c33544451076bd5ecb3b698e74ede0434c82) - Inspect managed Agent Manager sessions and send a targeted prompt to an idle existing session from the native Agent Manager tool. Require a separate explicit approval before prompting another managed session. + +- [#12212](https://github.com/Kilo-Org/kilocode/pull/12212) [`38d7608`](https://github.com/Kilo-Org/kilocode/commit/38d760896573a4667bc87c67da5b304f39f14b0a) - Preserve the current local commit when moving a session into a worktree. + +- [#11536](https://github.com/Kilo-Org/kilocode/pull/11536) [`be7418f`](https://github.com/Kilo-Org/kilocode/commit/be7418f94ac2a7a3f762ea21b1425d99c0d66e83) - Keep Task tool subagents out of Agent Manager tabs. + +- [#12201](https://github.com/Kilo-Org/kilocode/pull/12201) [`51848c4`](https://github.com/Kilo-Org/kilocode/commit/51848c42cb43fccc0f413b9537d7093eaab60a92) - Remember initial session prompts when navigating chat input history with the arrow keys. + +- [#12158](https://github.com/Kilo-Org/kilocode/pull/12158) [`3b1e07c`](https://github.com/Kilo-Org/kilocode/commit/3b1e07cc0033bdb37e762ed6e0f85dab4214780d) - Enforce read and ignore permissions when file mentions add content to a prompt. + +- [#12177](https://github.com/Kilo-Org/kilocode/pull/12177) [`e372cb3`](https://github.com/Kilo-Org/kilocode/commit/e372cb3d54b36465156fbca4b01cd160ce2fa804) - Keep keyboard focus on the active sidebar tab after closing an inactive session tab. + +- [#11424](https://github.com/Kilo-Org/kilocode/pull/11424) [`3a4438e`](https://github.com/Kilo-Org/kilocode/commit/3a4438e748f80a23bd33eb4aa824d3dffb3d588a) - Stop active Agent Manager sessions and their subagents when a session tab or the Agent Manager tab closes. + +- Updated dependencies [[`6a3e5f3`](https://github.com/Kilo-Org/kilocode/commit/6a3e5f39011e4b1a63ab5d0ae0dbf8195ea29d4c), [`227c65d`](https://github.com/Kilo-Org/kilocode/commit/227c65d1004fc1f48e71335cc574a2e6986c4893), [`3ba4c33`](https://github.com/Kilo-Org/kilocode/commit/3ba4c33544451076bd5ecb3b698e74ede0434c82)]: + - @kilocode/sdk@7.4.8 + - @kilocode/kilo-indexing@7.4.8 + - @kilocode/kilo-ui@7.4.8 + - @kilocode/plugin@7.4.8 + - @opencode-ai/ui@7.4.8 + - @opencode-ai/core@7.4.8 + - @kilocode/kilo-gateway@7.4.8 + ## 7.4.7 ### Patch Changes diff --git a/packages/kilo-vscode/package.json b/packages/kilo-vscode/package.json index 354178db8e..1238a09865 100644 --- a/packages/kilo-vscode/package.json +++ b/packages/kilo-vscode/package.json @@ -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.4.7", + "version": "7.4.8", "icon": "assets/icons/logo-outline-black.png", "galleryBanner": { "color": "#FFFFFF", diff --git a/packages/kilo-vscode/tests/package.json b/packages/kilo-vscode/tests/package.json index 9624de63b9..fe4d10f070 100644 --- a/packages/kilo-vscode/tests/package.json +++ b/packages/kilo-vscode/tests/package.json @@ -1,6 +1,6 @@ { "type": "module", - "version": "7.4.7", + "version": "7.4.8", "dependencies": {}, "devDependencies": {}, "peerDependencies": {} diff --git a/packages/kilo-web-ui/package.json b/packages/kilo-web-ui/package.json index e37833bfda..aa58b185a5 100644 --- a/packages/kilo-web-ui/package.json +++ b/packages/kilo-web-ui/package.json @@ -1,6 +1,6 @@ { "name": "@kilocode/kilo-web-ui", - "version": "7.4.7", + "version": "7.4.8", "type": "module", "license": "MIT", "exports": { diff --git a/packages/llm/package.json b/packages/llm/package.json index 0204b49a49..199e5adcfc 100644 --- a/packages/llm/package.json +++ b/packages/llm/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "version": "7.4.7", + "version": "7.4.8", "name": "@opencode-ai/llm", "type": "module", "license": "MIT", diff --git a/packages/opencode/CHANGELOG.md b/packages/opencode/CHANGELOG.md index abca61c51c..3a40be54da 100644 --- a/packages/opencode/CHANGELOG.md +++ b/packages/opencode/CHANGELOG.md @@ -1,5 +1,47 @@ # @kilocode/cli +## 7.4.8 + +### Minor Changes + +- [#12159](https://github.com/Kilo-Org/kilocode/pull/12159) [`1083bb8`](https://github.com/Kilo-Org/kilocode/commit/1083bb82b65e986dfbc7092647b6ee2650951265) - Report active CLI and VS Code app and session presence. + +### Patch Changes + +- [#12160](https://github.com/Kilo-Org/kilocode/pull/12160) [`ba6e5b9`](https://github.com/Kilo-Org/kilocode/commit/ba6e5b9dfcddb6b5752e1c06951098213a2ceabe) - Allow persistent approval for shell access to a specific global skill directory while keeping other Kilo configuration protected. + +- [#12097](https://github.com/Kilo-Org/kilocode/pull/12097) [`22d6edb`](https://github.com/Kilo-Org/kilocode/commit/22d6edbe59a82f87362e8a49e739f8d4a4802f90) - Release project file handles immediately after reads on Windows so editors and tools can replace existing files without restarting Kilo. + +- [#12175](https://github.com/Kilo-Org/kilocode/pull/12175) [`bd08c13`](https://github.com/Kilo-Org/kilocode/commit/bd08c1341289c5d30facad6bcfed4b02cd33262d) - Preserve the selected model reasoning variant when forking a session. + +- [#12128](https://github.com/Kilo-Org/kilocode/pull/12128) [`ad2cc71`](https://github.com/Kilo-Org/kilocode/commit/ad2cc712d084e2540d4846f561b2cfe39ee9ee15) Thanks [@rakshith1928](https://github.com/rakshith1928)! - Surface an invalid Kilo `indexing.model` configuration as an indexing Error status instead of silently falling back to the default model. + +- [#11783](https://github.com/Kilo-Org/kilocode/pull/11783) [`6a3e5f3`](https://github.com/Kilo-Org/kilocode/commit/6a3e5f39011e4b1a63ab5d0ae0dbf8195ea29d4c) - Inherit sandbox state when a sandboxed agent starts new Agent Manager sessions. + +- [#12203](https://github.com/Kilo-Org/kilocode/pull/12203) [`750b622`](https://github.com/Kilo-Org/kilocode/commit/750b622f487b17d5b5344cace403e80fa3374935) - Keep Agent Manager sessions running when concurrent branch-name generation times out during model refresh. + +- [#12174](https://github.com/Kilo-Org/kilocode/pull/12174) [`3ba4c33`](https://github.com/Kilo-Org/kilocode/commit/3ba4c33544451076bd5ecb3b698e74ede0434c82) - Inspect managed Agent Manager sessions and send a targeted prompt to an idle existing session from the native Agent Manager tool. Require a separate explicit approval before prompting another managed session. + +- [#12156](https://github.com/Kilo-Org/kilocode/pull/12156) [`6f11e35`](https://github.com/Kilo-Org/kilocode/commit/6f11e3576488e06e99337c81abb29f5e8aa8908c) - Preserve gateway and provider errors when chunked compaction fails instead of reporting every failure as a context overflow. + +- [#12205](https://github.com/Kilo-Org/kilocode/pull/12205) [`2045190`](https://github.com/Kilo-Org/kilocode/commit/204519025ae5f00abe41afdec4c935113002874c) - Temporarily disable free-model session and Git workspace data export. + +- [#12158](https://github.com/Kilo-Org/kilocode/pull/12158) [`3b1e07c`](https://github.com/Kilo-Org/kilocode/commit/3b1e07cc0033bdb37e762ed6e0f85dab4214780d) - Enforce read and ignore permissions when file mentions add content to a prompt. + +- [#12207](https://github.com/Kilo-Org/kilocode/pull/12207) [`c49560a`](https://github.com/Kilo-Org/kilocode/commit/c49560af0f94459015d3fa4e1efa23ad9b291955) - Keep shared session databases writable by released Kilo clients after newer schema migrations run. + +- [#11424](https://github.com/Kilo-Org/kilocode/pull/11424) [`3a4438e`](https://github.com/Kilo-Org/kilocode/commit/3a4438e748f80a23bd33eb4aa824d3dffb3d588a) - Stop active Agent Manager sessions and their subagents when a session tab or the Agent Manager tab closes. + +- Updated dependencies [[`6a3e5f3`](https://github.com/Kilo-Org/kilocode/commit/6a3e5f39011e4b1a63ab5d0ae0dbf8195ea29d4c), [`227c65d`](https://github.com/Kilo-Org/kilocode/commit/227c65d1004fc1f48e71335cc574a2e6986c4893), [`3ba4c33`](https://github.com/Kilo-Org/kilocode/commit/3ba4c33544451076bd5ecb3b698e74ede0434c82)]: + - @kilocode/sdk@7.4.8 + - @kilocode/kilo-indexing@7.4.8 + - @kilocode/plugin@7.4.8 + - @opencode-ai/ui@7.4.8 + - @kilocode/kilo-gateway@7.4.8 + - @kilocode/plugin-atomic-chat@7.4.8 + - @opencode-ai/server@7.4.2 + - @kilocode/kilo-telemetry@7.4.8 + ## 7.4.7 ## 7.4.6 diff --git a/packages/opencode/package.json b/packages/opencode/package.json index d1cab7d1c3..bb6e25e5f0 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "version": "7.4.7", + "version": "7.4.8", "name": "@kilocode/cli", "type": "module", "license": "MIT", diff --git a/packages/opencode/script/dev-local.ts b/packages/opencode/script/dev-local.ts index 5b6f161891..40ac7783eb 100755 --- a/packages/opencode/script/dev-local.ts +++ b/packages/opencode/script/dev-local.ts @@ -1,9 +1,10 @@ // kilocode_change - new file // Launch the kilo CLI dev build against a locally running cloud dev server. -// bun dev:local [--cloud ] [--no-ingest] [--print] [-- ] +// bun dev:local [--cloud ] [--no-ingest] [--no-events] [--print] [-- ] // // Reads ports from /dev/logs/manifest.json (+ .dev-port), probes the web -// server, and points the CLI at it (KILO_API_URL / KILO_SESSION_INGEST_URL). +// server, and points the CLI at it (KILO_API_URL / KILO_SESSION_INGEST_URL / +// EVENT_SERVICE_URL). // Auth/config/state/cache are isolated under ~/.kilo-dev so it can't clash with // your main kilo install; real HOME is kept so git/ssh still work. @@ -46,11 +47,13 @@ async function main() { let cloud = path.join(os.homedir(), "Projects", "cloud") let project = "" let noIngest = false + let noEvents = false let dry = false for (let i = 0; i < local.length; i++) { const a = local[i] if (a === "--cloud") cloud = local[++i] ?? die("--cloud requires a value") else if (a === "--no-ingest") noIngest = true + else if (a === "--no-events") noEvents = true else if (a === "--print") dry = true else if (!a.startsWith("--")) project = a } @@ -62,6 +65,7 @@ async function main() { const svc = (name: string) => m.services?.find((s) => s.name === name)?.port const webPort = Number(read(path.join(cloud, ".dev-port"))) || svc("nextjs") const ingestPort = noIngest ? undefined : svc("cloudflare-session-ingest") + const eventsPort = noEvents ? undefined : svc("event-service") if (!webPort) die(`no web port found in ${cloud} — is the dev server started? (pnpm dev:start)`) const env: NodeJS.ProcessEnv = { ...process.env } @@ -73,11 +77,17 @@ async function main() { env.KILO_DISABLE_AUTOUPDATE = "1" if (ingestPort) env.KILO_SESSION_INGEST_URL = `http://localhost:${ingestPort}` else env.KILO_DISABLE_SESSION_INGEST = "1" + if (eventsPort) { + env.EVENT_SERVICE_URL = `ws://localhost:${eventsPort}` + delete env.KILO_DISABLE_PRESENCE + delete env.KILO_EVENT_SERVICE_URL + } else env.KILO_DISABLE_PRESENCE = "1" const webUp = await alive(webPort) console.log(`${dim}project${rst} ${project}`) console.log(`${dim}web${rst} :${webPort} ${webUp ? `${grn}up${rst}` : `${red}down${rst}`}`) console.log(`${dim}ingest${rst} ${ingestPort ? `:${ingestPort}` : "off"}`) + console.log(`${dim}events${rst} ${eventsPort ? `:${eventsPort}` : "off"}`) console.log(`${dim}home${rst} ${home}`) if (dry) { if (!webUp) console.warn(`${ylw}web down — start it (pnpm dev:start)${rst}`); return } diff --git a/packages/plugin-atomic-chat/package.json b/packages/plugin-atomic-chat/package.json index b4fb9b2506..26ec79f318 100644 --- a/packages/plugin-atomic-chat/package.json +++ b/packages/plugin-atomic-chat/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@kilocode/plugin-atomic-chat", - "version": "7.4.7", + "version": "7.4.8", "description": "Kilo Code plugin for Atomic Chat: auto-detection and dynamic model discovery (OpenAI-compatible local API)", "type": "module", "license": "MIT", diff --git a/packages/plugin/package.json b/packages/plugin/package.json index 28af695bba..15df04ccca 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@kilocode/plugin", - "version": "7.4.7", + "version": "7.4.8", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/script/package.json b/packages/script/package.json index 6b330dce54..d9be7150fe 100644 --- a/packages/script/package.json +++ b/packages/script/package.json @@ -12,6 +12,6 @@ "exports": { ".": "./src/index.ts" }, - "version": "7.4.7", + "version": "7.4.8", "peerDependencies": {} } diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json index d708003b6f..d388c543d6 100644 --- a/packages/sdk/js/package.json +++ b/packages/sdk/js/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@kilocode/sdk", - "version": "7.4.7", + "version": "7.4.8", "type": "module", "license": "MIT", "scripts": { diff --git a/packages/server/package.json b/packages/server/package.json index cff1eb4aaf..615aee91d5 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@opencode-ai/server", - "version": "7.4.7", + "version": "7.4.8", "private": true, "type": "module", "license": "MIT", diff --git a/packages/storybook/package.json b/packages/storybook/package.json index 9f75477909..cc47f4afd4 100644 --- a/packages/storybook/package.json +++ b/packages/storybook/package.json @@ -26,7 +26,7 @@ "typescript": "catalog:", "vite": "catalog:" }, - "version": "7.4.7", + "version": "7.4.8", "dependencies": {}, "peerDependencies": {} } diff --git a/packages/tui/package.json b/packages/tui/package.json index 10d592648d..a245be56a4 100644 --- a/packages/tui/package.json +++ b/packages/tui/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@opencode-ai/tui", - "version": "7.4.7", + "version": "7.4.8", "private": true, "type": "module", "license": "MIT", diff --git a/packages/ui/package.json b/packages/ui/package.json index 640bd9db2b..0148b8a614 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/ui", - "version": "7.4.7", + "version": "7.4.8", "type": "module", "license": "MIT", "exports": { diff --git a/script/upstream/package.json b/script/upstream/package.json index 166ef04f72..017b20ee9a 100644 --- a/script/upstream/package.json +++ b/script/upstream/package.json @@ -1,6 +1,6 @@ { "name": "@kilocode/upstream-merge", - "version": "7.4.7", + "version": "7.4.8", "private": true, "type": "module", "description": "Scripts for automating upstream opencode merges into Kilo",