diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index edf85eb559..4c054d9767 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,6 +17,9 @@ permissions: contents: read checks: write +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true + jobs: unit: name: unit (${{ matrix.settings.name }}) @@ -38,6 +41,11 @@ jobs: with: token: ${{ secrets.GITHUB_TOKEN }} + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: "24" + - name: Setup Bun uses: ./.github/actions/setup-bun @@ -104,6 +112,11 @@ jobs: with: token: ${{ secrets.GITHUB_TOKEN }} + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: "24" + - name: Setup Bun uses: ./.github/actions/setup-bun diff --git a/.opencode/.gitignore b/.opencode/.gitignore index d3bf7f8d3b..c072cfe070 100644 --- a/.opencode/.gitignore +++ b/.opencode/.gitignore @@ -3,4 +3,5 @@ plans package.json bun.lock .gitignore -package-lock.json \ No newline at end of file +package-lock.json +references/ diff --git a/.opencode/skills/effect/SKILL.md b/.opencode/skills/effect/SKILL.md new file mode 100644 index 0000000000..4758146377 --- /dev/null +++ b/.opencode/skills/effect/SKILL.md @@ -0,0 +1,21 @@ +--- +name: effect +description: Answer questions about the Effect framework +--- + +# Effect + +This codebase uses Effect, a framework for writing typescript. + +## How to Answer Effect Questions + +1. Clone the Effect repository: `https://github.com/Effect-TS/effect-smol` to + `.opencode/references/effect-smol` in this project NOT the skill folder. +2. Use the explore agent to search the codebase for answers about Effect patterns, APIs, and concepts +3. Provide responses based on the actual Effect source code and documentation + +## Guidelines + +- Always use the explore agent with the cloned repository when answering Effect-related questions +- Reference specific files and patterns found in the Effect codebase +- Do not answer from memory - always verify against the source diff --git a/.opencode/themes/mytheme.json b/.opencode/themes/mytheme.json index e444de807c..0e6b948001 100644 --- a/.opencode/themes/mytheme.json +++ b/.opencode/themes/mytheme.json @@ -116,8 +116,8 @@ "light": "nord5" }, "diffLineNumber": { - "dark": "nord2", - "light": "nord4" + "dark": "#abafb7", + "light": "textMuted" }, "diffAddedLineNumberBg": { "dark": "#3B4252", diff --git a/nix/kilo.nix b/nix/kilo.nix index 6c6375405f..ba6c7afc96 100644 --- a/nix/kilo.nix +++ b/nix/kilo.nix @@ -7,7 +7,6 @@ sysctl, makeBinaryWrapper, models-dev, - ripgrep, installShellFiles, versionCheckHook, writableTmpDirAsHomeHook, @@ -52,25 +51,25 @@ stdenvNoCC.mkDerivation (finalAttrs: { runHook postBuild ''; - installPhase = '' - runHook preInstall + installPhase = + '' + runHook preInstall - install -Dm755 dist/@kilocode/cli-*/bin/kilo $out/bin/kilo - install -Dm644 schema.json $out/share/kilo/schema.json - - wrapProgram $out/bin/kilo \ - --prefix PATH : ${ - lib.makeBinPath ( - [ - ripgrep + install -Dm755 dist/@kilocode/cli-*/bin/kilo $out/bin/kilo + install -Dm644 schema.json $out/share/kilo/schema.json + '' + # bun runs sysctl to detect if dunning on rosetta2 + + lib.optionalString stdenvNoCC.hostPlatform.isDarwin '' + wrapProgram $out/bin/kilo \ + --prefix PATH : ${ + lib.makeBinPath [ + sysctl ] - # bun runs sysctl to detect if dunning on rosetta2 - ++ lib.optional stdenvNoCC.hostPlatform.isDarwin sysctl - ) - } - - runHook postInstall - ''; + } + '' + + '' + runHook postInstall + ''; postInstall = lib.optionalString (stdenvNoCC.buildPlatform.canExecute stdenvNoCC.hostPlatform) '' # trick yargs into also generating zsh completions diff --git a/package.json b/package.json index 1f8fa91a60..b189c7d86d 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "packages/sdk/js" ], "catalog": { - "@effect/platform-node": "4.0.0-beta.43", + "@effect/platform-node": "4.0.0-beta.46", "@types/bun": "1.3.11", "@types/cross-spawn": "6.0.6", "@octokit/rest": "22.0.0", @@ -46,8 +46,8 @@ "dompurify": "3.3.3", "drizzle-kit": "1.0.0-beta.19-d95b7a4", "drizzle-orm": "1.0.0-beta.19-d95b7a4", - "effect": "4.0.0-beta.43", - "ai": "6.0.149", + "effect": "4.0.0-beta.46", + "ai": "6.0.158", "cross-spawn": "7.0.6", "hono": "4.12.12", "hono-openapi": "1.1.2", diff --git a/packages/app/e2e/backend.ts b/packages/app/e2e/backend.ts index 71dbfe6293..111cb5dfb6 100644 --- a/packages/app/e2e/backend.ts +++ b/packages/app/e2e/backend.ts @@ -44,8 +44,12 @@ async function waitForHealth(url: string, probe = "/global/health") { throw new Error(`Timed out waiting for backend health at ${url}${probe}${last ? ` (${last})` : ""}`) } +function done(proc: ReturnType) { + return proc.exitCode !== null || proc.signalCode !== null +} + async function waitExit(proc: ReturnType, timeout = 10_000) { - if (proc.exitCode !== null) return + if (done(proc)) return await Promise.race([ new Promise((resolve) => proc.once("exit", () => resolve())), new Promise((resolve) => setTimeout(resolve, timeout)), @@ -123,11 +127,11 @@ export async function startBackend(label: string, input?: { llmUrl?: string }): return { url, async stop() { - if (proc.exitCode === null) { + if (!done(proc)) { proc.kill("SIGTERM") await waitExit(proc) } - if (proc.exitCode === null) { + if (!done(proc)) { proc.kill("SIGKILL") await waitExit(proc) } diff --git a/packages/app/package.json b/packages/app/package.json index 26f5310310..012383c7d5 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@opencode-ai/app", - "version": "1.0.14", + "version": "7.2.6", "description": "", "type": "module", "exports": { diff --git a/packages/app/src/context/global-sdk.tsx b/packages/app/src/context/global-sdk.tsx index fcf435b677..35fd59bde1 100644 --- a/packages/app/src/context/global-sdk.tsx +++ b/packages/app/src/context/global-sdk.tsx @@ -155,7 +155,12 @@ export const { use: useGlobalSDK, provider: GlobalSDKProvider } = createSimpleCo resetHeartbeat() streamErrorLogged = false const directory = event.directory ?? "global" - const payload = event.payload + if (event.payload.type === "sync") { + continue + } + + const payload = event.payload as Event + const k = key(directory, payload) if (k) { const i = coalesced.get(k) diff --git a/packages/app/src/i18n/ar.ts b/packages/app/src/i18n/ar.ts index afc5d08765..6b59d4ed94 100644 --- a/packages/app/src/i18n/ar.ts +++ b/packages/app/src/i18n/ar.ts @@ -137,7 +137,8 @@ export const dict = { "provider.connect.oauth.code.invalid": "رمز التفويض غير صالح", "provider.connect.oauth.auto.visit.prefix": "قم بزيارة ", "provider.connect.oauth.auto.visit.link": "هذا الرابط", - "provider.connect.oauth.auto.visit.suffix": " وأدخل الرمز أدناه لتوصيل حسابك واستخدام نماذج {{provider}} في Kilo.", + "provider.connect.oauth.auto.visit.suffix": + " وأدخل الرمز أدناه لتوصيل حسابك واستخدام نماذج {{provider}} في Kilo.", "provider.connect.oauth.auto.confirmationCode": "رمز التأكيد", "provider.connect.toast.connected.title": "تم توصيل {{provider}}", "provider.connect.toast.connected.description": "نماذج {{provider}} متاحة الآن للاستخدام.", diff --git a/packages/app/src/i18n/de.ts b/packages/app/src/i18n/de.ts index e5ca0038a3..694addfaee 100644 --- a/packages/app/src/i18n/de.ts +++ b/packages/app/src/i18n/de.ts @@ -577,7 +577,8 @@ export const dict = { "settings.general.row.appearance.title": "Erscheinungsbild", "settings.general.row.appearance.description": "Anpassen, wie Kilo auf Ihrem Gerät aussieht", "settings.general.row.colorScheme.title": "Farbschema", - "settings.general.row.colorScheme.description": "Wählen Sie, ob Kilo dem System-, hellen oder dunklen Thema folgt", + "settings.general.row.colorScheme.description": + "Wählen Sie, ob Kilo dem System-, hellen oder dunklen Thema folgt", "settings.general.row.theme.title": "Thema", "settings.general.row.theme.description": "Das Thema von Kilo anpassen.", "settings.general.row.font.title": "Code-Schriftart", diff --git a/packages/app/src/i18n/fr.ts b/packages/app/src/i18n/fr.ts index 6204ce037a..2bd6ea940e 100644 --- a/packages/app/src/i18n/fr.ts +++ b/packages/app/src/i18n/fr.ts @@ -398,7 +398,8 @@ export const dict = { "toast.session.unshare.failed.description": "Une erreur s'est produite lors de l'annulation du partage de la session", "toast.session.listFailed.title": "Échec du chargement des sessions pour {{project}}", "toast.update.title": "Mise à jour disponible", - "toast.update.description": "Une nouvelle version d'Kilo ({{version}}) est maintenant disponible pour installation.", + "toast.update.description": + "Une nouvelle version d'Kilo ({{version}}) est maintenant disponible pour installation.", "toast.update.action.installRestart": "Installer et redémarrer", "toast.update.action.notYet": "Pas encore", "error.page.title": "Quelque chose s'est mal passé", @@ -548,7 +549,8 @@ export const dict = { "sidebar.workspaces.enable": "Activer les espaces de travail", "sidebar.workspaces.disable": "Désactiver les espaces de travail", "sidebar.gettingStarted.title": "Commencer", - "sidebar.gettingStarted.line1": "Kilo inclut des modèles gratuits pour que vous puissiez commencer immédiatement.", + "sidebar.gettingStarted.line1": + "Kilo inclut des modèles gratuits pour que vous puissiez commencer immédiatement.", "sidebar.gettingStarted.line2": "Connectez n'importe quel fournisseur pour utiliser des modèles, y compris Claude, GPT, Gemini etc.", "sidebar.project.recentSessions": "Sessions récentes", diff --git a/packages/app/src/i18n/th.ts b/packages/app/src/i18n/th.ts index 0c22707e63..4a6bffdcbb 100644 --- a/packages/app/src/i18n/th.ts +++ b/packages/app/src/i18n/th.ts @@ -149,7 +149,8 @@ export const dict = { "provider.connect.oauth.code.invalid": "รหัสการอนุญาตไม่ถูกต้อง", "provider.connect.oauth.auto.visit.prefix": "เยี่ยมชม ", "provider.connect.oauth.auto.visit.link": "ลิงก์นี้", - "provider.connect.oauth.auto.visit.suffix": " และป้อนรหัสด้านล่างเพื่อเชื่อมต่อบัญชีและใช้โมเดล {{provider}} ใน Kilo", + "provider.connect.oauth.auto.visit.suffix": + " และป้อนรหัสด้านล่างเพื่อเชื่อมต่อบัญชีและใช้โมเดล {{provider}} ใน Kilo", "provider.connect.oauth.auto.confirmationCode": "รหัสยืนยัน", "provider.connect.toast.connected.title": "{{provider}} ที่เชื่อมต่อแล้ว", "provider.connect.toast.connected.description": "โมเดล {{provider}} พร้อมใช้งานแล้ว", diff --git a/packages/app/src/i18n/tr.ts b/packages/app/src/i18n/tr.ts index a49256cc13..f6abb762f5 100644 --- a/packages/app/src/i18n/tr.ts +++ b/packages/app/src/i18n/tr.ts @@ -143,7 +143,8 @@ export const dict = { "provider.connect.opencodeZen.visit.prefix": "", "provider.connect.opencodeZen.visit.link": "opencode.ai/zen", "provider.connect.opencodeZen.visit.suffix": " adresini ziyaret ederek API anahtarınızı alın.", - "provider.connect.oauth.code.visit.prefix": "Hesabınızı bağlamak ve Kilo'da {{provider}} modellerini kullanmak için ", + "provider.connect.oauth.code.visit.prefix": + "Hesabınızı bağlamak ve Kilo'da {{provider}} modellerini kullanmak için ", "provider.connect.oauth.code.visit.link": "bu bağlantıya", "provider.connect.oauth.code.visit.suffix": " tıklayarak yetkilendirme kodunuzu alın.", "provider.connect.oauth.code.label": "{{method}} yetkilendirme kodu", @@ -638,7 +639,8 @@ export const dict = { "settings.general.row.appearance.title": "Görünüm", "settings.general.row.appearance.description": "Kilo'un cihazınızdaki görünümünü özelleştirin", "settings.general.row.colorScheme.title": "Renk şeması", - "settings.general.row.colorScheme.description": "Kilo'un sistem, açık veya koyu temayı takip etip etmeyeceğini seçin", + "settings.general.row.colorScheme.description": + "Kilo'un sistem, açık veya koyu temayı takip etip etmeyeceğini seçin", "settings.general.row.theme.title": "Tema", "settings.general.row.theme.description": "Kilo'un temasını özelleştirin.", "settings.general.row.font.title": "Kod Yazı Tipi", diff --git a/packages/app/src/i18n/zht.ts b/packages/app/src/i18n/zht.ts index b405880a0c..dcd680c9b9 100644 --- a/packages/app/src/i18n/zht.ts +++ b/packages/app/src/i18n/zht.ts @@ -150,7 +150,8 @@ export const dict = { "provider.connect.oauth.code.invalid": "授權碼無效", "provider.connect.oauth.auto.visit.prefix": "造訪 ", "provider.connect.oauth.auto.visit.link": "此連結", - "provider.connect.oauth.auto.visit.suffix": " 並輸入以下程式碼,以連線你的帳戶並在 Kilo 中使用 {{provider}} 模型。", + "provider.connect.oauth.auto.visit.suffix": + " 並輸入以下程式碼,以連線你的帳戶並在 Kilo 中使用 {{provider}} 模型。", "provider.connect.oauth.auto.confirmationCode": "確認碼", "provider.connect.toast.connected.title": "{{provider}} 已連線", "provider.connect.toast.connected.description": "現在可以使用 {{provider}} 模型了。", diff --git a/packages/app/src/pages/layout/sidebar-items.tsx b/packages/app/src/pages/layout/sidebar-items.tsx index c9c5c05513..bc8bade3bc 100644 --- a/packages/app/src/pages/layout/sidebar-items.tsx +++ b/packages/app/src/pages/layout/sidebar-items.tsx @@ -42,7 +42,9 @@ export const ProjectIcon = (props: { project: LocalProject; class?: string; noti