diff --git a/.changeset/brain-circuit-data-disclosure.md b/.changeset/brain-circuit-data-disclosure.md
index 672b15b754c..d694a9ec64e 100644
--- a/.changeset/brain-circuit-data-disclosure.md
+++ b/.changeset/brain-circuit-data-disclosure.md
@@ -1,6 +1,8 @@
---
+"@kilocode/cli": patch
+"@kilocode/kilo-jetbrains": patch
"kilo-code": patch
"@kilocode/kilo-ui": patch
---
-Use a brain circuit icon for free-model data collection disclosures.
+Clarify when free-model data may be used for training and identify it with a brain circuit icon.
diff --git a/.changeset/restore-console-daemon.md b/.changeset/restore-console-daemon.md
new file mode 100644
index 00000000000..e2a921f6674
--- /dev/null
+++ b/.changeset/restore-console-daemon.md
@@ -0,0 +1,5 @@
+---
+"@kilocode/cli": patch
+---
+
+Restore `kilo console` startup in packaged CLI builds.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 41ecbcb24ea..53d08204098 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -16,7 +16,7 @@ The Kilo Community is [on Discord](https://kilo.ai/discord).
## Prerequisites
-- **Bun 1.3.13+** — required for all packages.
+- **Bun 1.3.14+** — required for all packages.
- **Java 21** — required by the JetBrains plugin. The root `bun turbo typecheck` and `bun turbo test:ci` commands include `@kilocode/kilo-jetbrains` and will fail without Java 21.
The preferred way to install Java is via [SDKMAN](https://sdkman.io/install):
@@ -41,7 +41,7 @@ The Kilo Community is [on Discord](https://kilo.ai/discord).
## Developing Kilo CLI
-- **Requirements:** Bun 1.3.13+, Java 21 (see [Prerequisites](#prerequisites) above)
+- **Requirements:** Bun 1.3.14+, Java 21 (see [Prerequisites](#prerequisites) above)
- Install dependencies and start the CLI from the repo root:
```bash
diff --git a/bun.lock b/bun.lock
index a921861a7d9..4e14d16e6de 100644
--- a/bun.lock
+++ b/bun.lock
@@ -708,10 +708,10 @@
"@tailwindcss/vite": "4.1.11",
"@tsconfig/bun": "1.0.9",
"@tsconfig/node22": "22.0.2",
- "@types/bun": "1.3.12",
+ "@types/bun": "1.3.14",
"@types/cross-spawn": "6.0.6",
"@types/luxon": "3.7.1",
- "@types/node": "24.12.2",
+ "@types/node": "24.12.4",
"@types/semver": "7.7.1",
"@typescript/native-preview": "7.0.0-dev.20260316.1",
"ai": "6.0.168",
@@ -2091,7 +2091,7 @@
"@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="],
- "@types/bun": ["@types/bun@1.3.12", "", { "dependencies": { "bun-types": "1.3.12" } }, "sha512-DBv81elK+/VSwXHDlnH3Qduw+KxkTIWi7TXkAeh24zpi5l0B2kUg9Ga3tb4nJaPcOFswflgi/yAvMVBPrxMB+A=="],
+ "@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="],
"@types/cacache": ["@types/cacache@20.0.1", "", { "dependencies": { "@types/node": "*", "minipass": "*" } }, "sha512-QlKW3AFoFr/hvPHwFHMIVUH/ZCYeetBNou3PCmxu5LaNDvrtBlPJtIA6uhmU9JRt9oxj7IYoqoLcpxtzpPiTcw=="],
@@ -2199,7 +2199,7 @@
"@types/mssql": ["@types/mssql@9.1.11", "", { "dependencies": { "@types/node": "*", "tarn": "^3.0.1", "tedious": "*" } }, "sha512-vcujgrDbDezCxNDO4KY6gjwduLYOKfrexpRUwhoysRvcXZ3+IgZ/PMYFDgh8c3cQIxZ6skAwYo+H6ibMrBWPjQ=="],
- "@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+ "@types/node": ["@types/node@24.12.4", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA=="],
"@types/node-fetch": ["@types/node-fetch@2.6.13", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.4" } }, "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw=="],
@@ -2537,7 +2537,7 @@
"bun-pty": ["bun-pty@0.4.8", "", {}, "sha512-rO70Mrbr13+jxHHHu2YBkk2pNqrJE5cJn29WE++PUr+GFA0hq/VgtQPZANJ8dJo6d7XImvBk37Innt8GM7O28w=="],
- "bun-types": ["bun-types@1.3.12", "", { "dependencies": { "@types/node": "*" } }, "sha512-HqOLj5PoFajAQciOMRiIZGNoKxDJSr6qigAttOX40vJuSp6DN/CxWp9s3C1Xwm4oH7ybueITwiaOcWXoYVoRkA=="],
+ "bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="],
"bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="],
@@ -4535,6 +4535,8 @@
"@antfu/install-pkg/package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="],
+ "@anthropic-ai/sdk/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+
"@aws-crypto/sha1-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="],
"@aws-crypto/sha256-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="],
@@ -4599,6 +4601,8 @@
"@kilocode/kilo-indexing/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="],
+ "@manypkg/find-root/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+
"@manypkg/find-root/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="],
"@manypkg/find-root/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="],
@@ -4739,6 +4743,30 @@
"@textlint/linter-formatter/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+ "@types/cacache/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+
+ "@types/cross-spawn/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+
+ "@types/mssql/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+
+ "@types/node-fetch/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+
+ "@types/npm-registry-fetch/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+
+ "@types/npmcli__arborist/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+
+ "@types/npmlog/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+
+ "@types/pacote/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+
+ "@types/qrcode/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+
+ "@types/readable-stream/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+
+ "@types/ssri/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+
+ "@types/ws/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+
"@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="],
"@vitest/expect/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
@@ -4777,6 +4805,8 @@
"ai-gateway-provider/@openrouter/ai-sdk-provider": ["@openrouter/ai-sdk-provider@2.5.1", "", { "peerDependencies": { "ai": "^6.0.0", "zod": "^3.25.0 || ^4.0.0" } }, "sha512-r1fJL1Cb3gQDa2MpWH/sfx1BsEW0uzlRriJM6eihaKqbtKDmZoBisF32VcVaQYassighX7NGCkF68EsrZA43uQ=="],
+ "apache-arrow/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+
"archiver-utils/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="],
"archiver-utils/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="],
@@ -4811,6 +4841,8 @@
"buffer/ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
+ "bun-types/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+
"c12/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="],
"c12/dotenv": ["dotenv@17.4.2", "", {}, "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw=="],
@@ -5025,6 +5057,8 @@
"pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="],
+ "protobufjs/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+
"proxy-addr/ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="],
"qrcode/yargs": ["yargs@15.4.1", "", { "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.2" } }, "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A=="],
@@ -5095,6 +5129,8 @@
"tar-fs/tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="],
+ "tedious/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+
"tedious/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
"tedious/sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="],
@@ -5179,6 +5215,8 @@
"@morphllm/morphsdk/ai/@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.95", "", { "dependencies": { "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.23", "@vercel/oidc": "3.1.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-ZmUNNbZl3V42xwQzPaNUi+s8eqR2lnrxf0bvB6YbLXpLjHYv0k2Y78t12cNOfY0bxGeuVVTLyk856uLuQIuXEQ=="],
+ "@morphllm/morphsdk/openai/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+
"@morphllm/morphsdk/openai/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
"@octokit/core/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@24.2.0", "", {}, "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg=="],
@@ -5471,6 +5509,8 @@
"jszip/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="],
+ "kilo-code/openai/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="],
+
"lazystream/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="],
"lazystream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="],
diff --git a/flake.nix b/flake.nix
index 541454f9746..56438ab332e 100644
--- a/flake.nix
+++ b/flake.nix
@@ -21,26 +21,26 @@
devShells = forEachSystem (pkgs: {
default =
let
- # Pin bun to the version declared in package.json (packageManager: "bun@1.3.13").
- # nixpkgs-unstable currently ships 1.3.11, so we fetch the official release directly.
+ # Pin bun to the version declared in package.json (packageManager: "bun@1.3.14").
+ # The locked nixpkgs revision ships 1.3.11, so we fetch the official release directly.
bun =
let
sources = {
"aarch64-linux" = {
name = "bun-linux-aarch64";
- hash = "sha256-cLrkGzkIsKEg4eWMXIrzDnSvrjuNEbDT/djnh937SyI=";
+ hash = "sha256-on/7Y6gxA3WDbg1vZorhf6jY0YuIw3yCHGUzGXOhmjs=";
};
"x86_64-linux" = {
name = "bun-linux-x64";
- hash = "sha256-ecB3H6i5LDOq5B4VoODTB+qZ0OLwAxfHHGxTI3p44lo=";
+ hash = "sha256-lR7iruhV8IWVruxiJSJqKY0/6oOj3NZGXAnLzN9+hI8=";
};
"aarch64-darwin" = {
name = "bun-darwin-aarch64";
- hash = "sha256-VGfj9l26Umuf6pjwzOBO+vwMY+Fpcz7Ce4dqOtMtoZA=";
+ hash = "sha256-2LliIYKK1vl6x6wKt+lYcjQa92MAHogD6CZ2UsJlJiA=";
};
"x86_64-darwin" = {
name = "bun-darwin-x64";
- hash = "sha256-5abItk9BmSUjLREeyxPiXwq/VeVPeSNB+YdiP9B3gAk=";
+ hash = "sha256-QYPfM3RiPlurMVxUfPoJdFM81FfYa3O2OfeoeXTNZjM=";
};
};
source =
@@ -49,7 +49,7 @@
in
pkgs.stdenv.mkDerivation rec {
pname = "bun";
- version = "1.3.13";
+ version = "1.3.14";
src = pkgs.fetchurl {
url = "https://github.com/oven-sh/bun/releases/download/bun-v${version}/${source.name}.zip";
inherit (source) hash;
diff --git a/nix/hashes.json b/nix/hashes.json
index c120a3334f6..84fa8d5394e 100644
--- a/nix/hashes.json
+++ b/nix/hashes.json
@@ -1,8 +1,8 @@
{
"nodeModules": {
- "x86_64-linux": "sha256-b1eputqQyEDXT8LRZcGtx31TLm9wjUHHPJ8IivkPihY=",
- "aarch64-linux": "sha256-0FGGe2pztqcWcMw1Ie+QlNTmJv0VM7vXTmCZ18M70hk=",
- "aarch64-darwin": "sha256-McaXAipKk7yv2Ia1Py6Zp/WH2kDwRroy1/tnavbDYb4=",
- "x86_64-darwin": "sha256-ARngNvK5UwQYZa5Uvx7o/cKWaQWY5/AlSXecX0UdtDM="
+ "x86_64-linux": "sha256-IT3BwesfWHaWLCJfoNwfoQoHOaSxoto/wMaqkO3HkRk=",
+ "aarch64-linux": "sha256-7vqkNBIJajPiD/dxnKY+dmzu72N5tWw6kE3dYPwXOeM=",
+ "aarch64-darwin": "sha256-vBNr1JQ6pg9jKQgJ668/0D1padSyZae//uhJCfIoYrM=",
+ "x86_64-darwin": "sha256-zu91QGrxI/IO7sVRhRIXS/V8u98DeyTHSU9k/TCTkmE="
}
}
diff --git a/package.json b/package.json
index 2c24470b0cf..0fb94c9007e 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
"description": "AI-powered development tool",
"private": true,
"type": "module",
- "packageManager": "bun@1.3.13",
+ "packageManager": "bun@1.3.14",
"scripts": {
"dev": "bun run --cwd packages/opencode --conditions=browser src/index.ts",
"dev:storybook": "bun --cwd packages/storybook storybook",
@@ -28,7 +28,7 @@
"@effect/opentelemetry": "4.0.0-beta.57",
"@effect/platform-node": "4.0.0-beta.57",
"@npmcli/arborist": "9.4.0",
- "@types/bun": "1.3.12",
+ "@types/bun": "1.3.14",
"@types/cross-spawn": "6.0.6",
"@octokit/rest": "22.0.0",
"@hono/zod-validator": "0.4.2",
@@ -37,7 +37,7 @@
"ulid": "3.0.1",
"@kobalte/core": "0.13.11",
"@types/luxon": "3.7.1",
- "@types/node": "24.12.2",
+ "@types/node": "24.12.4",
"@types/semver": "7.7.1",
"@tsconfig/node22": "22.0.2",
"@tsconfig/bun": "1.0.9",
diff --git a/packages/containers/bun-node/Dockerfile b/packages/containers/bun-node/Dockerfile
index 6998577bd53..8c93e45502a 100644
--- a/packages/containers/bun-node/Dockerfile
+++ b/packages/containers/bun-node/Dockerfile
@@ -6,7 +6,7 @@ FROM ${REGISTRY}/build/base:24.04
SHELL ["/bin/bash", "-lc"]
ARG NODE_VERSION=24.4.0
-ARG BUN_VERSION=1.3.13
+ARG BUN_VERSION=1.3.14
ENV BUN_INSTALL=/opt/bun
ENV PATH=/opt/bun/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
diff --git a/packages/kilo-docs/pages/contributing/development-environment.md b/packages/kilo-docs/pages/contributing/development-environment.md
index 79bbc09c8f8..d592e2a8285 100644
--- a/packages/kilo-docs/pages/contributing/development-environment.md
+++ b/packages/kilo-docs/pages/contributing/development-environment.md
@@ -16,7 +16,7 @@ This document will help you set up your development environment and understand h
Before you begin, make sure you have the following installed:
1. **Git** - For version control
-2. **Bun 1.3.13+** - Required for installing dependencies and running scripts
+2. **Bun 1.3.14+** - Required for installing dependencies and running scripts
3. **Visual Studio Code** - Our recommended IDE for development
4. **Java 21** - Required only when running JetBrains plugin checks or repo-level checks that include `@kilocode/kilo-jetbrains`
diff --git a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties
index 3e547a9b368..04e2a0a1aed 100644
--- a/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties
+++ b/packages/kilo-jetbrains/frontend/src/main/resources/messages/KiloBundle.properties
@@ -145,7 +145,7 @@ model.picker.no.matches=No matching models
model.picker.favorite.add=Add to favorites
model.picker.favorite.remove=Remove from favorites
model.picker.free=Free
-model.picker.dataCollected=Data collected
+model.picker.dataCollected=Data may be used for training
model.picker.reset=Reset model to default
reasoning.picker.tooltip=Select reasoning effort
diff --git a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/model/ModelPickerTest.kt b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/model/ModelPickerTest.kt
index 03b24724ae0..7b61a7877c3 100644
--- a/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/model/ModelPickerTest.kt
+++ b/packages/kilo-jetbrains/frontend/src/test/kotlin/ai/kilocode/client/session/ui/model/ModelPickerTest.kt
@@ -158,9 +158,9 @@ class ModelPickerTest : BasePlatformTestCase() {
picker.setItems(listOf(item("auto", "Auto Free", "kilo", "Kilo", free = true)))
- assertFalse(picker.text.contains("Data collected"))
+ assertFalse(picker.text.contains("Data may be used for training"))
assertSame(ModelPickerIcons.DATA_COLLECTED, picker.icon)
- assertEquals("Data collected", picker.toolTipText)
+ assertEquals("Data may be used for training", picker.toolTipText)
}
fun `test selected non-kilo free model does not indicate data collection`() {
@@ -282,7 +282,7 @@ class ModelPickerTest : BasePlatformTestCase() {
assertTrue(renderer.badgeVisible())
assertEquals("Free", renderer.badgeText())
assertTrue(renderer.warningVisible())
- assertEquals("Data collected", renderer.warningTooltip())
+ assertEquals("Data may be used for training", renderer.warningTooltip())
}
fun `test renderer hides data collection warning for non-kilo free model`() {
diff --git a/packages/kilo-vscode/docs/mercury-next-edit-testing.html b/packages/kilo-vscode/docs/mercury-next-edit-testing.html
index 5990db29f70..5772426f254 100644
--- a/packages/kilo-vscode/docs/mercury-next-edit-testing.html
+++ b/packages/kilo-vscode/docs/mercury-next-edit-testing.html
@@ -276,7 +276,7 @@
- VSCode ≥ 1.105.1 (matches kilocode's
engines.vscode)
-
- Bun ≥ 1.3.13 (the build script checks the version) — install via
+ Bun ≥ 1.3.14 (the build script checks the version) — install via
brew install bun or bun.sh
- GitHub CLI (
gh) — optional but makes the PR checkout one command
diff --git a/packages/kilo-vscode/tests/unit/model-selector-utils.test.ts b/packages/kilo-vscode/tests/unit/model-selector-utils.test.ts
index f427db3c354..d7fef3854d0 100644
--- a/packages/kilo-vscode/tests/unit/model-selector-utils.test.ts
+++ b/packages/kilo-vscode/tests/unit/model-selector-utils.test.ts
@@ -98,12 +98,12 @@ describe("sanitizeName", () => {
describe("freeDataLabel", () => {
it("uses the data collection label without repeating free", () => {
- expect(freeDataLabel("Free", "Data collected")).toBe("Data collected")
+ expect(freeDataLabel("Free", "Data may be used for training")).toBe("Data may be used for training")
})
})
describe("isDataCollectedModel", () => {
- it("only marks free Kilo Gateway models as data collected", () => {
+ it("only marks free Kilo Gateway models with the training disclosure", () => {
expect(isDataCollectedModel({ providerID: KILO_GATEWAY_ID, isFree: true })).toBe(true)
expect(isDataCollectedModel({ providerID: "openrouter", isFree: true })).toBe(false)
expect(isDataCollectedModel({ providerID: KILO_GATEWAY_ID, isFree: false })).toBe(false)
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts
index 81ca9c72287..a2ccd954b02 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts
@@ -174,7 +174,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "تم فصل {{provider}}",
"provider.disconnect.toast.disconnected.description": "لم تعد نماذج {{provider}} متاحة.",
"model.tag.free": "مجاني",
- "model.tag.dataCollected": "يتم جمع البيانات",
+ "model.tag.dataCollected": "قد تُستخدم البيانات للتدريب",
"model.tag.latest": "الأحدث",
"model.group.recommended": "موصى به",
"model.group.favorites": "المفضلة",
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/br.ts b/packages/kilo-vscode/webview-ui/src/i18n/br.ts
index 0b1d733a33c..7be40befb43 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/br.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/br.ts
@@ -175,7 +175,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} desconectado",
"provider.disconnect.toast.disconnected.description": "Os modelos de {{provider}} não estão mais disponíveis.",
"model.tag.free": "Grátis",
- "model.tag.dataCollected": "Dados coletados",
+ "model.tag.dataCollected": "Os dados podem ser usados para treinamento",
"model.tag.latest": "Mais recente",
"model.group.recommended": "Recomendado",
"model.group.favorites": "Favoritos",
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts
index b7f0256903f..dddc96fa711 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts
@@ -176,7 +176,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.description": "{{provider}} modeli više nisu dostupni.",
"model.tag.free": "Besplatno",
- "model.tag.dataCollected": "Podaci se prikupljaju",
+ "model.tag.dataCollected": "Podaci se mogu koristiti za obuku",
"model.tag.latest": "Najnovije",
"model.group.recommended": "Preporučeno",
"model.group.favorites": "Favoriti",
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/da.ts b/packages/kilo-vscode/webview-ui/src/i18n/da.ts
index 4610c0aaccc..eab397a8ed4 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/da.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/da.ts
@@ -175,7 +175,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} frakoblet",
"provider.disconnect.toast.disconnected.description": "Modeller fra {{provider}} er ikke længere tilgængelige.",
"model.tag.free": "Gratis",
- "model.tag.dataCollected": "Data indsamles",
+ "model.tag.dataCollected": "Data kan bruges til træning",
"model.tag.latest": "Nyeste",
"model.group.recommended": "Anbefalet",
"model.group.favorites": "Favoritter",
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/de.ts b/packages/kilo-vscode/webview-ui/src/i18n/de.ts
index ed2baf0392d..43cf6428294 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/de.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/de.ts
@@ -179,7 +179,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} getrennt",
"provider.disconnect.toast.disconnected.description": "Die {{provider}}-Modelle sind nicht mehr verfügbar.",
"model.tag.free": "Kostenlos",
- "model.tag.dataCollected": "Daten erfasst",
+ "model.tag.dataCollected": "Daten können für das Training verwendet werden",
"model.tag.latest": "Neueste",
"model.group.recommended": "Empfohlen",
"model.group.favorites": "Favoriten",
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/en.ts b/packages/kilo-vscode/webview-ui/src/i18n/en.ts
index df91b0b6e1f..78b885854b6 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/en.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/en.ts
@@ -176,7 +176,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.description": "{{provider}} models are no longer available.",
"model.tag.free": "Free",
- "model.tag.dataCollected": "Data collected",
+ "model.tag.dataCollected": "Data may be used for training",
"model.tag.latest": "Latest",
"model.group.recommended": "Recommended",
"model.group.favorites": "Favorites",
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/es.ts b/packages/kilo-vscode/webview-ui/src/i18n/es.ts
index 1f07e5d1e7f..b4eeb108827 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/es.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/es.ts
@@ -176,7 +176,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} desconectado",
"provider.disconnect.toast.disconnected.description": "Los modelos de {{provider}} ya no están disponibles.",
"model.tag.free": "Gratis",
- "model.tag.dataCollected": "Datos recopilados",
+ "model.tag.dataCollected": "Los datos pueden utilizarse para entrenamiento",
"model.tag.latest": "Último",
"model.group.recommended": "Recomendado",
"model.group.favorites": "Favoritos",
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts
index 09b25f89c3b..bfd16a5ad4e 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts
@@ -177,7 +177,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} déconnecté",
"provider.disconnect.toast.disconnected.description": "Les modèles {{provider}} ne sont plus disponibles.",
"model.tag.free": "Gratuit",
- "model.tag.dataCollected": "Données collectées",
+ "model.tag.dataCollected": "Les données peuvent être utilisées pour l’entraînement",
"model.tag.latest": "Dernier",
"model.group.recommended": "Recommandé",
"model.group.favorites": "Favoris",
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/it.ts b/packages/kilo-vscode/webview-ui/src/i18n/it.ts
index 5776e3f16d0..dfdcb59c160 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/it.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/it.ts
@@ -151,7 +151,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} disconnesso",
"provider.disconnect.toast.disconnected.description": "I modelli {{provider}} non sono più disponibili.",
"model.tag.free": "Gratis",
- "model.tag.dataCollected": "Dati raccolti",
+ "model.tag.dataCollected": "I dati possono essere utilizzati per l'addestramento",
"model.tag.latest": "Più recente",
"model.group.recommended": "Consigliati",
"model.group.favorites": "Preferiti",
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts
index 46cab151069..5ef0651ec7c 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts
@@ -174,7 +174,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}}が切断されました",
"provider.disconnect.toast.disconnected.description": "{{provider}}のモデルは利用できなくなりました。",
"model.tag.free": "無料",
- "model.tag.dataCollected": "データ収集あり",
+ "model.tag.dataCollected": "データがトレーニングに使用される場合があります",
"model.tag.latest": "最新",
"model.group.recommended": "推奨",
"model.group.favorites": "お気に入り",
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts
index dd805c59758..94ec03dc4d0 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts
@@ -178,7 +178,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} 연결 해제됨",
"provider.disconnect.toast.disconnected.description": "{{provider}} 모델을 더 이상 사용할 수 없습니다.",
"model.tag.free": "무료",
- "model.tag.dataCollected": "데이터 수집됨",
+ "model.tag.dataCollected": "데이터가 학습에 사용될 수 있습니다",
"model.tag.latest": "최신",
"model.group.recommended": "추천",
"model.group.favorites": "즐겨찾기",
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts
index 33ba31990cb..1cb13f25c62 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts
@@ -176,7 +176,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.description": "{{provider}} modellen zijn niet langer beschikbaar.",
"model.tag.free": "Gratis",
- "model.tag.dataCollected": "Gegevens verzameld",
+ "model.tag.dataCollected": "Gegevens kunnen worden gebruikt voor training",
"model.tag.latest": "Nieuwste",
"model.group.recommended": "Aanbevolen",
"model.group.favorites": "Favorieten",
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/no.ts b/packages/kilo-vscode/webview-ui/src/i18n/no.ts
index 6078672537d..9f8f006fccd 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/no.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/no.ts
@@ -178,7 +178,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} frakoblet",
"provider.disconnect.toast.disconnected.description": "Modeller fra {{provider}} er ikke lenger tilgjengelige.",
"model.tag.free": "Gratis",
- "model.tag.dataCollected": "Data samles inn",
+ "model.tag.dataCollected": "Data kan brukes til trening",
"model.tag.latest": "Nyeste",
"model.group.recommended": "Anbefalt",
"model.group.favorites": "Favoritter",
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts
index 7caf5f74b9c..d6c8b71375f 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts
@@ -175,7 +175,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "Rozłączono {{provider}}",
"provider.disconnect.toast.disconnected.description": "Modele {{provider}} nie są już dostępne.",
"model.tag.free": "Darmowy",
- "model.tag.dataCollected": "Dane zbierane",
+ "model.tag.dataCollected": "Dane mogą być wykorzystywane do trenowania",
"model.tag.latest": "Najnowszy",
"model.group.recommended": "Zalecane",
"model.group.favorites": "Ulubione",
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts
index 681e235eb80..5e32361785a 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts
@@ -175,7 +175,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} отключён",
"provider.disconnect.toast.disconnected.description": "Модели {{provider}} больше недоступны.",
"model.tag.free": "Бесплатно",
- "model.tag.dataCollected": "Данные собираются",
+ "model.tag.dataCollected": "Данные могут использоваться для обучения",
"model.tag.latest": "Последняя",
"model.group.recommended": "Рекомендуемые",
"model.group.favorites": "Избранное",
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/th.ts b/packages/kilo-vscode/webview-ui/src/i18n/th.ts
index 22ecabbc9dd..caf9d1f0489 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/th.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/th.ts
@@ -175,7 +175,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.description": "โมเดล {{provider}} ไม่พร้อมใช้งานอีกต่อไป",
"model.tag.free": "ฟรี",
- "model.tag.dataCollected": "มีการเก็บข้อมูล",
+ "model.tag.dataCollected": "ข้อมูลอาจถูกนำไปใช้ในการฝึก",
"model.tag.latest": "ล่าสุด",
"model.group.recommended": "แนะนำ",
"model.group.favorites": "รายการโปรด",
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts
index 6c5da55af38..7ac668f982c 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts
@@ -175,7 +175,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.description": "{{provider}} modelleri artık kullanılabilir değil.",
"model.tag.free": "Ücretsiz",
- "model.tag.dataCollected": "Veri toplanır",
+ "model.tag.dataCollected": "Veriler eğitim için kullanılabilir",
"model.tag.latest": "En yeni",
"model.group.recommended": "Önerilen",
"model.group.favorites": "Favoriler",
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts
index 5d2ff53eb80..6aeac2af946 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts
@@ -176,7 +176,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.description": "Моделі {{provider}} більше недоступні.",
"model.tag.free": "Безкоштовно",
- "model.tag.dataCollected": "Дані збираються",
+ "model.tag.dataCollected": "Дані можуть використовуватися для навчання",
"model.tag.latest": "Остання",
"model.group.recommended": "Рекомендовані",
"model.group.favorites": "Обране",
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts
index 05316ebf229..5c431fcc327 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts
@@ -175,7 +175,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} 已断开连接",
"provider.disconnect.toast.disconnected.description": "{{provider}} 模型已不再可用。",
"model.tag.free": "免费",
- "model.tag.dataCollected": "已收集数据",
+ "model.tag.dataCollected": "数据可能会用于训练",
"model.tag.latest": "最新",
"model.group.recommended": "推荐",
"model.group.favorites": "收藏夹",
diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts
index 00d4bfd4d45..da951bc55a4 100644
--- a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts
+++ b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts
@@ -175,7 +175,7 @@ export const dict = {
"provider.disconnect.toast.disconnected.title": "{{provider}} 已中斷連線",
"provider.disconnect.toast.disconnected.description": "{{provider}} 模型已不再可用。",
"model.tag.free": "免費",
- "model.tag.dataCollected": "已收集資料",
+ "model.tag.dataCollected": "資料可能會用於訓練",
"model.tag.latest": "最新",
"model.group.recommended": "推薦",
"model.group.favorites": "我的最愛",
diff --git a/packages/opencode/script/postinstall.mjs b/packages/opencode/script/postinstall.mjs
index 700c7afcfdd..9694b29d272 100644
--- a/packages/opencode/script/postinstall.mjs
+++ b/packages/opencode/script/postinstall.mjs
@@ -126,7 +126,7 @@ function findBinary() {
}
// kilocode_change end
-// kilocode_change start - copy tree-sitter WASM resources next to cached binary
+// kilocode_change start - copy runtime resources next to cached binary
function copyTreeSitterResources(binaryPath) {
const source = path.join(path.dirname(binaryPath), "tree-sitter")
const target = path.join(__dirname, "bin", "tree-sitter")
@@ -137,6 +137,17 @@ function copyTreeSitterResources(binaryPath) {
fs.rmSync(target, { recursive: true, force: true })
fs.cpSync(source, target, { recursive: true })
}
+
+function copyConsoleResources(binaryPath) {
+ const source = path.join(path.dirname(binaryPath), "console")
+ const target = path.join(__dirname, "bin", "console")
+ const index = path.join(source, "index.html")
+
+ if (!fs.existsSync(index)) return
+
+ fs.rmSync(target, { recursive: true, force: true })
+ fs.cpSync(source, target, { recursive: true })
+}
// kilocode_change end
function main() {
@@ -155,6 +166,7 @@ function main() {
fs.copyFileSync(binaryPath, target)
}
copyTreeSitterResources(binaryPath) // kilocode_change
+ copyConsoleResources(binaryPath) // kilocode_change
fs.chmodSync(target, 0o755)
}
diff --git a/packages/opencode/src/kilocode/components/free-model-disclosure.ts b/packages/opencode/src/kilocode/components/free-model-disclosure.ts
index e3a671bf5b3..4be603e4cfe 100644
--- a/packages/opencode/src/kilocode/components/free-model-disclosure.ts
+++ b/packages/opencode/src/kilocode/components/free-model-disclosure.ts
@@ -1,6 +1,6 @@
export const FreeModelDisclosure = {
- label: "Data collected",
- panel: "Free - data collected",
+ label: "May train",
+ panel: "Free - data may be used for training",
collectsData(model: { isFree?: boolean; api?: { npm?: string } }): boolean {
return model.isFree === true && model.api?.npm === "@kilocode/kilo-gateway"
},
diff --git a/packages/opencode/src/kilocode/daemon/daemon.ts b/packages/opencode/src/kilocode/daemon/daemon.ts
index d214c485c3a..6bd0a60a3f1 100644
--- a/packages/opencode/src/kilocode/daemon/daemon.ts
+++ b/packages/opencode/src/kilocode/daemon/daemon.ts
@@ -213,11 +213,15 @@ export namespace Daemon {
return await start(input)
}
- export function command(input?: string[]) {
+ export function command(
+ input?: string[],
+ proc = { argv: process.argv, execArgv: process.execArgv, execPath: process.execPath },
+ ) {
if (input?.length) return input
- const script = process.argv[1]
- if (script && /\.(ts|js|mjs|cjs)$/.test(script)) return [process.execPath, ...clean(process.execArgv), script]
- return [process.execPath]
+ const script = proc.argv[1]
+ const bundled = script?.startsWith("/$bunfs/") || (script ? /^[A-Za-z]:[\\/]~BUN[\\/]/.test(script) : false)
+ if (script && !bundled && /\.(ts|js|mjs|cjs)$/.test(script)) return [proc.execPath, ...clean(proc.execArgv), script]
+ return [proc.execPath]
}
export function clean(input: string[]) {
diff --git a/packages/opencode/test/cli/install-artifact.test.ts b/packages/opencode/test/cli/install-artifact.test.ts
index ed9e078d264..560f72d245d 100644
--- a/packages/opencode/test/cli/install-artifact.test.ts
+++ b/packages/opencode/test/cli/install-artifact.test.ts
@@ -7,6 +7,7 @@ import path from "path"
const root = path.join(import.meta.dir, "..", "..")
const wrapper = path.join(root, "bin", "kilo")
+const postinstall = path.join(root, "script", "postinstall.mjs")
describe("npm install artifact behavior", () => {
test("keeps the CLI wrapper contract", async () => {
@@ -17,6 +18,40 @@ describe("npm install artifact behavior", () => {
expect(text).toContain("function findBinary(startDir)")
})
+ test("copies cached binary runtime resources during postinstall", async () => {
+ if (process.platform === "win32") return
+ const node = Bun.which("node")
+ if (!node) {
+ console.warn("Skipping postinstall artifact test: node is not available in PATH")
+ return
+ }
+
+ const tmp = await fs.mkdtemp(path.join(os.tmpdir(), "kilo-postinstall-artifact-"))
+ try {
+ const pkg = path.join(tmp, "node_modules", "@kilocode", "cli")
+ const native = path.join(tmp, "node_modules", "@kilocode", `cli-${process.platform}-${process.arch}`)
+ const bin = path.join(native, "bin")
+ await fs.mkdir(path.join(pkg, "bin"), { recursive: true })
+ await fs.mkdir(path.join(bin, "tree-sitter"), { recursive: true })
+ await fs.mkdir(path.join(bin, "console", "assets"), { recursive: true })
+ await fs.copyFile(postinstall, path.join(pkg, "postinstall.mjs"))
+ await Bun.write(path.join(native, "package.json"), JSON.stringify({ name: `@kilocode/cli-${process.platform}-${process.arch}` }))
+ await Bun.write(path.join(bin, "kilo"), "binary")
+ await Bun.write(path.join(bin, "tree-sitter", "tree-sitter.wasm"), "wasm")
+ await Bun.write(path.join(bin, "console", "index.html"), "console")
+ await Bun.write(path.join(bin, "console", "assets", "app.js"), "asset")
+
+ const proc = Bun.spawn([node, path.join(pkg, "postinstall.mjs")], { cwd: pkg })
+ expect(await proc.exited).toBe(0)
+ expect(await Bun.file(path.join(pkg, "bin", ".kilo")).text()).toBe("binary")
+ expect(await Bun.file(path.join(pkg, "bin", "tree-sitter", "tree-sitter.wasm")).text()).toBe("wasm")
+ expect(await Bun.file(path.join(pkg, "bin", "console", "index.html")).text()).toBe("console")
+ expect(await Bun.file(path.join(pkg, "bin", "console", "assets", "app.js")).text()).toBe("asset")
+ } finally {
+ await fs.rm(tmp, { recursive: true, force: true })
+ }
+ })
+
test("links npm bin commands to the wrapper during local install", async () => {
const npmPath = Bun.which("npm")
if (!npmPath) {
diff --git a/packages/opencode/test/kilocode/daemon.test.ts b/packages/opencode/test/kilocode/daemon.test.ts
index d1fb61efd04..bb53beebd03 100644
--- a/packages/opencode/test/kilocode/daemon.test.ts
+++ b/packages/opencode/test/kilocode/daemon.test.ts
@@ -68,6 +68,39 @@ describe("daemon manager", () => {
expect(Daemon.clean(["--cwd=packages/opencode", "--conditions=browser"])).toStrictEqual(["--conditions=browser"])
})
+ test("does not forward bundled bun entrypoints to the daemon child", () => {
+ const proc = {
+ argv: ["/tmp/kilo", "/$bunfs/root/src/index.js", "daemon", "start"],
+ execArgv: ["--user-agent=kilo/test", "--use-system-ca", "--"],
+ execPath: "/tmp/kilo",
+ }
+ expect(Daemon.command(undefined, proc)).toStrictEqual(["/tmp/kilo"])
+ expect(
+ Daemon.command(undefined, {
+ ...proc,
+ argv: ["C:/tmp/kilo.exe", "B:/~BUN/root/src/index.js", "daemon", "start"],
+ execPath: "C:/tmp/kilo.exe",
+ }),
+ ).toStrictEqual(["C:/tmp/kilo.exe"])
+ expect(
+ Daemon.command(undefined, {
+ ...proc,
+ argv: ["C:/tmp/kilo.exe", "b:\\~BUN\\root\\src\\index.js", "daemon", "start"],
+ execPath: "C:/tmp/kilo.exe",
+ }),
+ ).toStrictEqual(["C:/tmp/kilo.exe"])
+ })
+
+ test("forwards source entrypoints to the daemon child", () => {
+ expect(
+ Daemon.command(undefined, {
+ argv: ["/tmp/bun", "/tmp/kilo/src/index.ts", "daemon", "start"],
+ execArgv: ["--conditions=browser"],
+ execPath: "/tmp/bun",
+ }),
+ ).toStrictEqual(["/tmp/bun", "--conditions=browser", "/tmp/kilo/src/index.ts"])
+ })
+
test("reuses one daemon across caller directories", async () => {
await using tmp = await tmpdir()
const env = opts(tmp.path)
diff --git a/packages/opencode/test/kilocode/free-model-disclosure.test.ts b/packages/opencode/test/kilocode/free-model-disclosure.test.ts
index 3d656cb6168..fa715b6c542 100644
--- a/packages/opencode/test/kilocode/free-model-disclosure.test.ts
+++ b/packages/opencode/test/kilocode/free-model-disclosure.test.ts
@@ -2,7 +2,12 @@ import { describe, expect, test } from "bun:test"
import { FreeModelDisclosure } from "../../src/kilocode/components/free-model-disclosure"
describe("FreeModelDisclosure", () => {
- test("only Kilo Gateway free models collect data", () => {
+ test("uses compact CLI labels", () => {
+ expect(FreeModelDisclosure.label).toBe("May train")
+ expect(FreeModelDisclosure.panel).toBe("Free - data may be used for training")
+ })
+
+ test("only Kilo Gateway free models get the training disclosure", () => {
expect(
FreeModelDisclosure.collectsData({
isFree: true,
diff --git a/packages/ui/src/components/timeline-playground.stories.tsx b/packages/ui/src/components/timeline-playground.stories.tsx
index 15fe8eacaed..aaa7353e768 100644
--- a/packages/ui/src/components/timeline-playground.stories.tsx
+++ b/packages/ui/src/components/timeline-playground.stories.tsx
@@ -318,7 +318,7 @@ const TOOL_SAMPLES = {
tool: "bash",
input: { command: "bun test --filter session", description: "Run session tests" },
output:
- "bun test v1.3.13\n\n✓ session-turn.test.tsx (3 tests) 45ms\n✓ message-part.test.tsx (7 tests) 120ms\n\nTest Suites: 2 passed, 2 total\nTests: 10 passed, 10 total\nTime: 0.89s",
+ "bun test v1.3.14\n\n✓ session-turn.test.tsx (3 tests) 45ms\n✓ message-part.test.tsx (7 tests) 120ms\n\nTest Suites: 2 passed, 2 total\nTests: 10 passed, 10 total\nTime: 0.89s", // kilocode_change
title: "Run session tests",
metadata: { command: "bun test --filter session" },
},
diff --git a/script/upstream/package.json b/script/upstream/package.json
index ada1d2a5414..aab3269d2d9 100644
--- a/script/upstream/package.json
+++ b/script/upstream/package.json
@@ -22,7 +22,7 @@
"ts-morph": "^24.0.0"
},
"devDependencies": {
- "@types/bun": "1.3.13"
+ "@types/bun": "1.3.14"
},
"peerDependencies": {}
}