From e356f068d4c43d1f77610aefff02bb336cc62399 Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Wed, 3 Jun 2026 11:10:13 -0400 Subject: [PATCH 1/7] fix: clarify free model training disclosure --- .changeset/brain-circuit-data-disclosure.md | 4 +++- .../src/main/resources/messages/KiloBundle.properties | 2 +- .../ai/kilocode/client/session/ui/model/ModelPickerTest.kt | 6 +++--- .../kilo-vscode/tests/unit/model-selector-utils.test.ts | 4 ++-- packages/kilo-vscode/webview-ui/src/i18n/ar.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/br.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/bs.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/da.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/de.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/en.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/es.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/fr.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/it.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/ja.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/ko.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/nl.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/no.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/pl.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/ru.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/th.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/tr.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/uk.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/zh.ts | 2 +- packages/kilo-vscode/webview-ui/src/i18n/zht.ts | 2 +- .../src/kilocode/components/free-model-disclosure.ts | 4 ++-- .../opencode/test/kilocode/free-model-disclosure.test.ts | 7 ++++++- 26 files changed, 37 insertions(+), 30 deletions(-) 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/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/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/src/kilocode/components/free-model-disclosure.ts b/packages/opencode/src/kilocode/components/free-model-disclosure.ts index e3a671bf5b3..da11d956db8 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 - may train", collectsData(model: { isFree?: boolean; api?: { npm?: string } }): boolean { return model.isFree === true && model.api?.npm === "@kilocode/kilo-gateway" }, diff --git a/packages/opencode/test/kilocode/free-model-disclosure.test.ts b/packages/opencode/test/kilocode/free-model-disclosure.test.ts index 3d656cb6168..8fb2b92cc1c 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 - may train") + }) + + test("only Kilo Gateway free models get the training disclosure", () => { expect( FreeModelDisclosure.collectsData({ isFree: true, From 1cdc39856f461b4dc183fe5b273b7fc1314b9a64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Catriel=20M=C3=BCller?= Date: Wed, 3 Jun 2026 12:35:42 -0300 Subject: [PATCH 2/7] fix(cli): restore packaged console startup --- .changeset/restore-console-daemon.md | 5 +++ packages/opencode/script/postinstall.mjs | 14 +++++++- .../opencode/src/kilocode/daemon/daemon.ts | 12 ++++--- .../test/cli/install-artifact.test.ts | 35 +++++++++++++++++++ .../opencode/test/kilocode/daemon.test.ts | 33 +++++++++++++++++ 5 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 .changeset/restore-console-daemon.md 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/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/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) From b7805537917dd8bfe939138efc0791f2da7d8ae7 Mon Sep 17 00:00:00 2001 From: Imanol Maiztegui Date: Wed, 3 Jun 2026 17:58:09 +0200 Subject: [PATCH 3/7] build(types): upgrade @types/node to 24.12.4 (#10860) Update Node.js type definitions from 24.12.2 to 24.12.4 in package.json dependencies. --- bun.lock | 44 ++++++++++++++++++++++++++++++++++++++++++-- package.json | 2 +- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index a921861a7d9..6d2a5d1aeea 100644 --- a/bun.lock +++ b/bun.lock @@ -711,7 +711,7 @@ "@types/bun": "1.3.12", "@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", @@ -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=="], @@ -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/package.json b/package.json index 2c24470b0cf..cf4c47eaaa5 100644 --- a/package.json +++ b/package.json @@ -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", From 33a1f39494269872ba5966d5f6c4a9894ed52e7c Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Wed, 3 Jun 2026 12:05:18 -0400 Subject: [PATCH 4/7] fix(cli): expand free model training disclosure --- .../opencode/src/kilocode/components/free-model-disclosure.ts | 2 +- packages/opencode/test/kilocode/free-model-disclosure.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/opencode/src/kilocode/components/free-model-disclosure.ts b/packages/opencode/src/kilocode/components/free-model-disclosure.ts index da11d956db8..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: "May train", - panel: "Free - 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/test/kilocode/free-model-disclosure.test.ts b/packages/opencode/test/kilocode/free-model-disclosure.test.ts index 8fb2b92cc1c..fa715b6c542 100644 --- a/packages/opencode/test/kilocode/free-model-disclosure.test.ts +++ b/packages/opencode/test/kilocode/free-model-disclosure.test.ts @@ -4,7 +4,7 @@ import { FreeModelDisclosure } from "../../src/kilocode/components/free-model-di describe("FreeModelDisclosure", () => { test("uses compact CLI labels", () => { expect(FreeModelDisclosure.label).toBe("May train") - expect(FreeModelDisclosure.panel).toBe("Free - may train") + expect(FreeModelDisclosure.panel).toBe("Free - data may be used for training") }) test("only Kilo Gateway free models get the training disclosure", () => { From 8c5d24bf2c678f74427046fa1cb2ea980677dbfb Mon Sep 17 00:00:00 2001 From: "kilo-maintainer[bot]" Date: Wed, 3 Jun 2026 16:12:07 +0000 Subject: [PATCH 5/7] chore: update nix node_modules hashes --- nix/hashes.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nix/hashes.json b/nix/hashes.json index c120a3334f6..73c2a024745 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-6hzvHtqno/S86gUYai5ijRocbhWD2L5JnGCD65ZZPCQ=", + "aarch64-linux": "sha256-tNRoMGOkAcbAzSeD3MgSwU9xmCoQBrndDbPwn0c9Www=", + "aarch64-darwin": "sha256-0DTDN6RKDPo2LibZhLcVocdpO2PWW+3PMWK8e4Sxh3E=", + "x86_64-darwin": "sha256-s3flZ06pIrKD59XBH9NMpBl/k1Bj6tJwjZ/gjX50O4E=" } } From 6cfd2dd0b4edc2064b41ddbbc75339d414e52e38 Mon Sep 17 00:00:00 2001 From: Imanol Maiztegui Date: Wed, 3 Jun 2026 19:09:45 +0200 Subject: [PATCH 6/7] build(deps): bump bun from 1.3.13 to 1.3.14 (#10884) Update Bun runtime and type definitions across the repository: - package.json packageManager field - @types/bun in root and script/upstream - Nix flake pinned binary with updated hashes - Container Dockerfile ARG - Documentation and story fixtures referencing the version --- CONTRIBUTING.md | 4 ++-- bun.lock | 6 +++--- flake.nix | 14 +++++++------- package.json | 4 ++-- packages/containers/bun-node/Dockerfile | 2 +- .../pages/contributing/development-environment.md | 2 +- .../docs/mercury-next-edit-testing.html | 2 +- .../src/components/timeline-playground.stories.tsx | 2 +- script/upstream/package.json | 2 +- 9 files changed, 19 insertions(+), 19 deletions(-) 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 6d2a5d1aeea..4e14d16e6de 100644 --- a/bun.lock +++ b/bun.lock @@ -708,7 +708,7 @@ "@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.4", @@ -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=="], @@ -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=="], 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/package.json b/package.json index cf4c47eaaa5..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", 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-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/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": {} } From 855a1015a6b4f016983b27015d9efe477c6a96b2 Mon Sep 17 00:00:00 2001 From: "kilo-maintainer[bot]" Date: Wed, 3 Jun 2026 17:28:07 +0000 Subject: [PATCH 7/7] chore: update nix node_modules hashes --- nix/hashes.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/nix/hashes.json b/nix/hashes.json index 73c2a024745..84fa8d5394e 100644 --- a/nix/hashes.json +++ b/nix/hashes.json @@ -1,8 +1,8 @@ { "nodeModules": { - "x86_64-linux": "sha256-6hzvHtqno/S86gUYai5ijRocbhWD2L5JnGCD65ZZPCQ=", - "aarch64-linux": "sha256-tNRoMGOkAcbAzSeD3MgSwU9xmCoQBrndDbPwn0c9Www=", - "aarch64-darwin": "sha256-0DTDN6RKDPo2LibZhLcVocdpO2PWW+3PMWK8e4Sxh3E=", - "x86_64-darwin": "sha256-s3flZ06pIrKD59XBH9NMpBl/k1Bj6tJwjZ/gjX50O4E=" + "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=" } }