feat: upstream merge resolution

This commit is contained in:
Catriel Müller
2026-02-04 12:36:18 -03:00
42 changed files with 197 additions and 134 deletions
+6 -9
View File
@@ -3,20 +3,17 @@ description: "Setup Bun with caching and install dependencies"
runs:
using: "composite"
steps:
- name: Mount Bun Cache
uses: useblacksmith/stickydisk@v1
with:
key: ${{ github.repository }}-bun-cache
path: ~/.bun
- name: Setup Bun
uses: oven-sh/setup-bun@v2
with:
bun-version-file: package.json
- name: Cache ~/.bun
id: cache-bun
uses: actions/cache@v4
with:
path: ~/.bun
key: ${{ runner.os }}-bun-${{ hashFiles('package.json') }}-${{ hashFiles('bun.lockb', 'bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-${{ hashFiles('package.json') }}-
- name: Install dependencies
run: bun install
shell: bash
+1 -1
View File
@@ -18,7 +18,7 @@ jobs:
runs-on: blacksmith-4vcpu-ubuntu-2404
permissions:
contents: write
pull-requests: read
pull-requests: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
+2 -1
View File
@@ -1 +1,2 @@
sst-env.d.ts
sst-env.d.ts
packages/web/src/content/docs/**
+2 -4
View File
@@ -14,7 +14,6 @@
"devDependencies": {
"@actions/artifact": "5.0.1",
"@tsconfig/bun": "catalog:",
"baseline-browser-mapping": "2.9.18",
"husky": "9.1.7",
"prettier": "3.6.2",
"semver": "^7.6.0",
@@ -26,7 +25,6 @@
"name": "@opencode-ai/app",
"version": "1.0.14",
"dependencies": {
"@kilocode/kilo-i18n": "workspace:*",
"@kilocode/sdk": "workspace:*",
"@kobalte/core": "catalog:",
"@opencode-ai/ui": "workspace:*",
@@ -172,7 +170,7 @@
},
"packages/console/resource": {
"name": "@opencode-ai/console-resource",
"version": "1.0.13",
"version": "1.0.14",
"dependencies": {
"@cloudflare/workers-types": "catalog:",
},
@@ -444,7 +442,7 @@
},
"packages/script": {
"name": "@opencode-ai/script",
"version": "1.0.13",
"version": "1.0.14",
"devDependencies": {
"@types/bun": "catalog:",
},
+1 -1
View File
@@ -17,5 +17,5 @@
"@octokit/rest": "catalog:",
"@kilocode/sdk": "workspace:*"
},
"version": "1.0.13"
"version": "1.0.14"
}
+3 -4
View File
@@ -1,6 +1,6 @@
{
"$schema": "https://json.schemastore.org/package.json",
"name": "@kilocode/cli",
"name": "opencode",
"description": "AI-powered development tool",
"private": true,
"type": "module",
@@ -65,7 +65,6 @@
"devDependencies": {
"@actions/artifact": "5.0.1",
"@tsconfig/bun": "catalog:",
"baseline-browser-mapping": "2.9.18",
"husky": "9.1.7",
"prettier": "3.6.2",
"semver": "^7.6.0",
@@ -81,7 +80,7 @@
},
"repository": {
"type": "git",
"url": "https://github.com/Kilo-Org/kilo"
"url": "https://github.com/anomalyco/opencode"
},
"license": "MIT",
"prettier": {
@@ -102,5 +101,5 @@
"patchedDependencies": {
"ghostty-web@0.3.0": "patches/ghostty-web@0.3.0.patch"
},
"version": "1.0.13"
"version": "1.0.14"
}
+25
View File
@@ -0,0 +1,25 @@
import { test, expect } from "./fixtures"
import { modelVariantCycleSelector } from "./utils"
test("smoke model variant cycle updates label", async ({ page, gotoSession }) => {
await gotoSession()
await page.addStyleTag({
content: `${modelVariantCycleSelector} { display: inline-block !important; }`,
})
const button = page.locator(modelVariantCycleSelector)
const exists = (await button.count()) > 0
test.skip(!exists, "current model has no variants")
if (!exists) return
await expect(button).toBeVisible()
const before = (await button.innerText()).trim()
await button.click()
await expect(button).not.toHaveText(before)
const after = (await button.innerText()).trim()
await button.click()
await expect(button).not.toHaveText(after)
})
+1
View File
@@ -12,6 +12,7 @@ export const terminalToggleKey = "Control+Backquote"
export const promptSelector = '[data-component="prompt-input"]'
export const terminalSelector = '[data-component="terminal"]'
export const modelVariantCycleSelector = '[data-action="model-variant-cycle"]'
export function createSdk(directory?: string) {
return createOpencodeClient({ baseUrl: serverUrl, directory, throwOnError: true })
-1
View File
@@ -36,7 +36,6 @@
},
"dependencies": {
"@kobalte/core": "catalog:",
"@kilocode/kilo-i18n": "workspace:*",
"@kilocode/sdk": "workspace:*",
"@opencode-ai/ui": "workspace:*",
"@opencode-ai/util": "workspace:*",
@@ -34,11 +34,8 @@ export const DialogSelectModelUnpaid: Component = () => {
})
return (
<Dialog
title={language.t("dialog.model.select.title")}
class="overflow-y-auto [&_[data-slot=dialog-body]]:overflow-visible [&_[data-slot=dialog-body]]:flex-none"
>
<div class="flex flex-col gap-3 px-2.5">
<Dialog title={language.t("dialog.model.select.title")}>
<div class="flex flex-col gap-3 px-2.5 flex-1 min-h-0 overflow-hidden">
<div class="text-14-medium text-text-base px-2.5">{language.t("dialog.model.unpaid.freeModels.title")}</div>
<List
class="[&_[data-slot=list-scroll]]:overflow-visible"
@@ -80,7 +77,7 @@ export const DialogSelectModelUnpaid: Component = () => {
)}
</List>
</div>
<div class="px-1.5 pb-1.5">
<div class="shrink-0 px-1.5 pb-1.5">
<div class="w-full rounded-sm border border-border-weak-base bg-surface-raised-base">
<div class="w-full flex flex-col items-start gap-4 px-1.5 pt-4 pb-4">
<div class="px-2 text-14-medium text-text-base">{language.t("dialog.model.unpaid.addMore.title")}</div>
@@ -1953,6 +1953,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
keybind={command.keybind("model.variant.cycle")}
>
<Button
data-action="model-variant-cycle"
variant="ghost"
class="text-text-base _hidden group-hover/prompt-input:inline-block capitalize text-12-regular"
onClick={() => local.model.variant.cycle()}
+2 -2
View File
@@ -119,11 +119,11 @@ export const dict = {
"provider.connect.apiKey.placeholder": "مفتاح API",
"provider.connect.apiKey.required": "مفتاح API مطلوب",
"provider.connect.opencodeZen.line1":
"يمنحك Kilo Zen الوصول إلى مجموعة مختارة من النماذج الموثوقة والمحسنة لوكلاء البرمجة.",
"يمنحك OpenCode Zen Zen الوصول إلى مجموعة مختارة من النماذج الموثوقة والمحسنة لوكلاء البرمجة.",
"provider.connect.opencodeZen.line2":
"باستخدام مفتاح API واحد، ستحصل على إمكانية الوصول إلى نماذج مثل Claude و GPT و Gemini و GLM والمزيد.",
"provider.connect.opencodeZen.visit.prefix": "قم بزيارة ",
"provider.connect.opencodeZen.visit.link": "https://opencode.ai/zen",
"provider.connect.opencodeZen.visit.link": "opencode.ai/zen",
"provider.connect.opencodeZen.visit.suffix": " للحصول على مفتاح API الخاص بك.",
"provider.connect.oauth.code.visit.prefix": "قم بزيارة ",
"provider.connect.oauth.code.visit.link": "هذا الرابط",
+1 -1
View File
@@ -119,7 +119,7 @@ export const dict = {
"provider.connect.apiKey.placeholder": "Chave de API",
"provider.connect.apiKey.required": "A chave de API é obrigatória",
"provider.connect.opencodeZen.line1":
"Kilo Zen oferece acesso a um conjunto selecionado de modelos confiáveis otimizados para agentes de código.",
"OpenCode Zen oferece acesso a um conjunto selecionado de modelos confiáveis otimizados para agentes de código.",
"provider.connect.opencodeZen.line2":
"Com uma única chave de API você terá acesso a modelos como Claude, GPT, Gemini, GLM e mais.",
"provider.connect.opencodeZen.visit.prefix": "Visite ",
+1 -1
View File
@@ -119,7 +119,7 @@ export const dict = {
"provider.connect.apiKey.placeholder": "API-nøgle",
"provider.connect.apiKey.required": "API-nøgle er påkrævet",
"provider.connect.opencodeZen.line1":
"Kilo Zen giver dig adgang til et udvalg af pålidelige optimerede modeller til kodningsagenter.",
"OpenCode Zen giver dig adgang til et udvalg af pålidelige optimerede modeller til kodningsagenter.",
"provider.connect.opencodeZen.line2":
"Med en enkelt API-nøgle får du adgang til modeller som Claude, GPT, Gemini, GLM og flere.",
"provider.connect.opencodeZen.visit.prefix": "Besøg ",
+1 -1
View File
@@ -123,7 +123,7 @@ export const dict = {
"provider.connect.apiKey.placeholder": "API-Schlüssel",
"provider.connect.apiKey.required": "API-Schlüssel ist erforderlich",
"provider.connect.opencodeZen.line1":
"Kilo Zen bietet Ihnen Zugriff auf eine kuratierte Auswahl zuverlässiger, optimierter Modelle für Coding-Agenten.",
"OpenCode Zen bietet Ihnen Zugriff auf eine kuratierte Auswahl zuverlässiger, optimierter Modelle für Coding-Agenten.",
"provider.connect.opencodeZen.line2":
"Mit einem einzigen API-Schlüssel erhalten Sie Zugriff auf Modelle wie Claude, GPT, Gemini, GLM und mehr.",
"provider.connect.opencodeZen.visit.prefix": "Besuchen Sie ",
+1 -1
View File
@@ -123,7 +123,7 @@ export const dict = {
"provider.connect.apiKey.placeholder": "API key",
"provider.connect.apiKey.required": "API key is required",
"provider.connect.opencodeZen.line1":
"Kilo Zen gives you access to a curated set of reliable optimized models for coding agents.",
"OpenCode Zen gives you access to a curated set of reliable optimized models for coding agents.",
"provider.connect.opencodeZen.line2":
"With a single API key you'll get access to models such as Claude, GPT, Gemini, GLM and more.",
"provider.connect.opencodeZen.visit.prefix": "Visit ",
+1 -1
View File
@@ -119,7 +119,7 @@ export const dict = {
"provider.connect.apiKey.placeholder": "Clave API",
"provider.connect.apiKey.required": "La clave API es obligatoria",
"provider.connect.opencodeZen.line1":
"Kilo Zen te da acceso a un conjunto curado de modelos fiables optimizados para agentes de programación.",
"OpenCode Zen te da acceso a un conjunto curado de modelos fiables optimizados para agentes de programación.",
"provider.connect.opencodeZen.line2":
"Con una sola clave API obtendrás acceso a modelos como Claude, GPT, Gemini, GLM y más.",
"provider.connect.opencodeZen.visit.prefix": "Visita ",
+2 -2
View File
@@ -119,11 +119,11 @@ export const dict = {
"provider.connect.apiKey.placeholder": "Clé API",
"provider.connect.apiKey.required": "La clé API est requise",
"provider.connect.opencodeZen.line1":
"Kilo Zen vous donne accès à un ensemble sélectionné de modèles fiables et optimisés pour les agents de codage.",
"OpenCode Zen Zen vous donne accès à un ensemble sélectionné de modèles fiables et optimisés pour les agents de codage.",
"provider.connect.opencodeZen.line2":
"Avec une seule clé API, vous aurez accès à des modèles tels que Claude, GPT, Gemini, GLM et plus encore.",
"provider.connect.opencodeZen.visit.prefix": "Visitez ",
"provider.connect.opencodeZen.visit.link": "https://opencode.ai/zen",
"provider.connect.opencodeZen.visit.link": "opencode.ai/zen",
"provider.connect.opencodeZen.visit.suffix": " pour récupérer votre clé API.",
"provider.connect.oauth.code.visit.prefix": "Visitez ",
"provider.connect.oauth.code.visit.link": "ce lien",
+1 -1
View File
@@ -119,7 +119,7 @@ export const dict = {
"provider.connect.apiKey.placeholder": "APIキー",
"provider.connect.apiKey.required": "APIキーが必要です",
"provider.connect.opencodeZen.line1":
"Kilo Zenは、コーディングエージェント向けに最適化された信頼性の高いモデルへのアクセスを提供します。",
"OpenCode Zenは、コーディングエージェント向けに最適化された信頼性の高いモデルへのアクセスを提供します。",
"provider.connect.opencodeZen.line2": "1つのAPIキーで、Claude、GPT、Gemini、GLMなどのモデルにアクセスできます。",
"provider.connect.opencodeZen.visit.prefix": " ",
"provider.connect.opencodeZen.visit.link": "https://opencode.ai/zen",
+1 -1
View File
@@ -123,7 +123,7 @@ export const dict = {
"provider.connect.apiKey.placeholder": "API 키",
"provider.connect.apiKey.required": "API 키가 필요합니다",
"provider.connect.opencodeZen.line1":
"Kilo Zen은 코딩 에이전트를 위해 최적화된 신뢰할 수 있는 엄선된 모델에 대한 액세스를 제공합니다.",
"OpenCode Zen은 코딩 에이전트를 위해 최적화된 신뢰할 수 있는 엄선된 모델에 대한 액세스를 제공합니다.",
"provider.connect.opencodeZen.line2": "단일 API 키로 Claude, GPT, Gemini, GLM 등 다양한 모델에 액세스할 수 있습니다.",
"provider.connect.opencodeZen.visit.prefix": "",
"provider.connect.opencodeZen.visit.link": "https://opencode.ai/zen",
+1 -1
View File
@@ -122,7 +122,7 @@ export const dict = {
"provider.connect.apiKey.placeholder": "API-nøkkel",
"provider.connect.apiKey.required": "API-nøkkel er påkrevd",
"provider.connect.opencodeZen.line1":
"Kilo Zen gir deg tilgang til et utvalg av pålitelige optimaliserte modeller for kodeagenter.",
"OpenCode Zen gir deg tilgang til et utvalg av pålitelige optimaliserte modeller for kodeagenter.",
"provider.connect.opencodeZen.line2":
"Med én enkelt API-nøkkel får du tilgang til modeller som Claude, GPT, Gemini, GLM og flere.",
"provider.connect.opencodeZen.visit.prefix": "Besøk ",
+1 -1
View File
@@ -119,7 +119,7 @@ export const dict = {
"provider.connect.apiKey.placeholder": "Klucz API",
"provider.connect.apiKey.required": "Klucz API jest wymagany",
"provider.connect.opencodeZen.line1":
"Kilo Zen daje dostęp do wybranego zestawu niezawodnych, zoptymalizowanych modeli dla agentów kodujących.",
"OpenCode Zen daje dostęp do wybranego zestawu niezawodnych, zoptymalizowanych modeli dla agentów kodujących.",
"provider.connect.opencodeZen.line2":
"Z jednym kluczem API uzyskasz dostęp do modeli takich jak Claude, GPT, Gemini, GLM i więcej.",
"provider.connect.opencodeZen.visit.prefix": "Odwiedź ",
+1 -1
View File
@@ -119,7 +119,7 @@ export const dict = {
"provider.connect.apiKey.placeholder": "API ключ",
"provider.connect.apiKey.required": "API ключ обязателен",
"provider.connect.opencodeZen.line1":
"Kilo Zen даёт вам доступ к отобранным надёжным оптимизированным моделям для агентов программирования.",
"OpenCode Zen даёт вам доступ к отобранным надёжным оптимизированным моделям для агентов программирования.",
"provider.connect.opencodeZen.line2":
"С одним API ключом вы получите доступ к таким моделям как Claude, GPT, Gemini, GLM и другим.",
"provider.connect.opencodeZen.visit.prefix": "Посетите ",
+2 -2
View File
@@ -123,11 +123,11 @@ export const dict = {
"provider.connect.apiKey.placeholder": "คีย์ API",
"provider.connect.apiKey.required": "ต้องใช้คีย์ API",
"provider.connect.opencodeZen.line1":
"Kilo Zen ให้คุณเข้าถึงชุดโมเดลที่เชื่อถือได้และปรับแต่งแล้วสำหรับเอเจนต์การเขียนโค้ด",
"OpenCode Zen Zen ให้คุณเข้าถึงชุดโมเดลที่เชื่อถือได้และปรับแต่งแล้วสำหรับเอเจนต์การเขียนโค้ด",
"provider.connect.opencodeZen.line2":
"ด้วยคีย์ API เดียวคุณจะได้รับการเข้าถึงโมเดล เช่น Claude, GPT, Gemini, GLM และอื่น ๆ",
"provider.connect.opencodeZen.visit.prefix": "เยี่ยมชม ",
"provider.connect.opencodeZen.visit.link": "https://opencode.ai/zen",
"provider.connect.opencodeZen.visit.link": "opencode.ai/zen",
"provider.connect.opencodeZen.visit.suffix": " เพื่อรวบรวมคีย์ API ของคุณ",
"provider.connect.oauth.code.visit.prefix": "เยี่ยมชม ",
"provider.connect.oauth.code.visit.link": "ลิงก์นี้",
+2 -2
View File
@@ -98,7 +98,7 @@ export const dict = {
"dialog.provider.anthropic.note": "使用 Claude Pro/Max 或 API 密钥连接",
"dialog.provider.openai.note": "使用 ChatGPT Pro/Plus 或 API 密钥连接",
"dialog.provider.copilot.note": "使用 Copilot 或 API 密钥连接",
"dialog.provider.opencode.note": "使用 Kilo Zen 或 API 密钥连接",
"dialog.provider.opencode.note": "使用 OpenCode Zen 或 API 密钥连接",
"dialog.provider.google.note": "使用 Google 账号或 API 密钥连接",
"dialog.provider.openrouter.note": "使用 OpenRouter 账号或 API 密钥连接",
"dialog.provider.vercel.note": "使用 Vercel 账号或 API 密钥连接",
@@ -126,7 +126,7 @@ export const dict = {
"provider.connect.apiKey.label": "{{provider}} API 密钥",
"provider.connect.apiKey.placeholder": "API 密钥",
"provider.connect.apiKey.required": "API 密钥为必填项",
"provider.connect.opencodeZen.line1": "Kilo Zen 为你提供一组精选的可靠优化模型,用于代码智能体。",
"provider.connect.opencodeZen.line1": "OpenCode Zen 为你提供一组精选的可靠优化模型,用于代码智能体。",
"provider.connect.opencodeZen.line2": "只需一个 API 密钥,你就能使用 Claude、GPT、Gemini、GLM 等模型。",
"provider.connect.opencodeZen.visit.prefix": "访问 ",
"provider.connect.opencodeZen.visit.link": "https://opencode.ai/zen",
+2 -2
View File
@@ -122,10 +122,10 @@ export const dict = {
"provider.connect.apiKey.label": "{{provider}} API 金鑰",
"provider.connect.apiKey.placeholder": "API 金鑰",
"provider.connect.apiKey.required": "API 金鑰為必填",
"provider.connect.opencodeZen.line1": "Kilo Zen 為你提供一組精選的可靠最佳化模型,用於程式碼代理程式。",
"provider.connect.opencodeZen.line1": "OpenCode Zen Zen 為你提供一組精選的可靠最佳化模型,用於程式碼代理程式。",
"provider.connect.opencodeZen.line2": "只需一個 API 金鑰,你就能使用 Claude、GPT、Gemini、GLM 等模型。",
"provider.connect.opencodeZen.visit.prefix": "造訪 ",
"provider.connect.opencodeZen.visit.link": "https://opencode.ai/zen",
"provider.connect.opencodeZen.visit.link": "opencode.ai/zen",
"provider.connect.opencodeZen.visit.suffix": " 取得你的 API 金鑰。",
"provider.connect.oauth.code.visit.prefix": "造訪 ",
"provider.connect.oauth.code.visit.link": "此連結",
+1 -1
View File
@@ -19,5 +19,5 @@
"@types/node": "catalog:",
"cloudflare": "5.2.0"
},
"version": "1.0.13"
"version": "1.0.14"
}
+6
View File
@@ -1,8 +1,14 @@
#!/usr/bin/env bun
import { $ } from "bun"
import { Script } from "@opencode-ai/script"
import { copyBinaryToSidecarFolder, getCurrentSidecar, windowsify } from "./utils"
const pkg = await Bun.file("./package.json").json()
pkg.version = Script.version
await Bun.write("./package.json", JSON.stringify(pkg, null, 2) + "\n")
console.log(`Updated package.json version to ${Script.version}`)
const sidecarConfig = getCurrentSidecar()
const dir = "src-tauri/target/kilo-binaries"
+4 -4
View File
@@ -4914,9 +4914,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-fs"
version = "2.4.4"
version = "2.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "47df422695255ecbe7bac7012440eddaeefd026656171eac9559f5243d3230d9"
checksum = "ed390cc669f937afeb8b28032ce837bac8ea023d975a2e207375ec05afaf1804"
dependencies = [
"anyhow",
"dunce",
@@ -4936,9 +4936,9 @@ dependencies = [
[[package]]
name = "tauri-plugin-http"
version = "2.5.4"
version = "2.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c00685aceab12643cf024f712ab0448ba8fcadf86f2391d49d2e5aa732aacc70"
checksum = "68bef611ccbfbce67c813959c11b23c1c084d201aa94222de9eba5f9edc3f897"
dependencies = [
"bytes",
"cookie_store",
+1 -1
View File
@@ -28,7 +28,7 @@ tauri-plugin-process = "2"
tauri-plugin-store = "2"
tauri-plugin-window-state = "2"
tauri-plugin-clipboard-manager = "2"
tauri-plugin-http = "2"
tauri-plugin-http = "2.5.6"
tauri-plugin-notification = "2"
tauri-plugin-single-instance = { version = "2", features = ["deep-link"] }
+6 -6
View File
@@ -1,7 +1,7 @@
id = "kilo"
name = "Kilo"
description = "The open source coding agent."
version = "1.0.14"
version = "1.1.44"
schema_version = 1
authors = ["Anomaly"]
repository = "https://github.com/Kilo-Org/kilo"
@@ -11,26 +11,26 @@ name = "Kilo"
icon = "./icons/opencode.svg"
[agent_servers.opencode.targets.darwin-aarch64]
archive = "https://github.com/Kilo-Org/kilo/releases/download/v1.0.14/opencode-darwin-arm64.zip"
archive = "https://github.com/Kilo-Org/kilo/releases/download/v1.1.44/opencode-darwin-arm64.zip"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.darwin-x86_64]
archive = "https://github.com/Kilo-Org/kilo/releases/download/v1.0.14/opencode-darwin-x64.zip"
archive = "https://github.com/Kilo-Org/kilo/releases/download/v1.1.44/opencode-darwin-x64.zip"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.linux-aarch64]
archive = "https://github.com/Kilo-Org/kilo/releases/download/v1.0.14/opencode-linux-arm64.tar.gz"
archive = "https://github.com/Kilo-Org/kilo/releases/download/v1.1.44/opencode-linux-arm64.tar.gz"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.linux-x86_64]
archive = "https://github.com/Kilo-Org/kilo/releases/download/v1.0.14/opencode-linux-x64.tar.gz"
archive = "https://github.com/Kilo-Org/kilo/releases/download/v1.1.44/opencode-linux-x64.tar.gz"
cmd = "./opencode"
args = ["acp"]
[agent_servers.opencode.targets.windows-x86_64]
archive = "https://github.com/Kilo-Org/kilo/releases/download/v1.0.14/opencode-windows-x64.zip"
archive = "https://github.com/Kilo-Org/kilo/releases/download/v1.1.44/opencode-windows-x64.zip"
cmd = "./opencode.exe"
args = ["acp"]
+1 -1
View File
@@ -8,5 +8,5 @@
"exports": {
".": "./src/index.ts"
},
"version": "1.0.13"
"version": "1.0.14"
}
+27 -7
View File
@@ -28,18 +28,33 @@ const Context = createContext<ReturnType<typeof init>>()
function init() {
const [active, setActive] = createSignal<Active | undefined>()
let closing = false
const timer = { current: undefined as ReturnType<typeof setTimeout> | undefined }
const lock = { value: false }
onCleanup(() => {
if (timer.current === undefined) return
clearTimeout(timer.current)
timer.current = undefined
})
const close = () => {
const current = active()
if (!current || closing) return
closing = true
if (!current || lock.value) return
lock.value = true
current.onClose?.()
current.setClosing(true)
setTimeout(() => {
const id = current.id
if (timer.current !== undefined) {
clearTimeout(timer.current)
timer.current = undefined
}
timer.current = setTimeout(() => {
timer.current = undefined
current.dispose()
setActive(undefined)
closing = false
if (active()?.id === id) setActive(undefined)
lock.value = false
}, 100)
}
@@ -64,7 +79,12 @@ function init() {
current.dispose()
setActive(undefined)
}
closing = false
if (timer.current !== undefined) {
clearTimeout(timer.current)
timer.current = undefined
}
lock.value = false
const id = Math.random().toString(36).slice(2)
let dispose: (() => void) | undefined
+1 -1
View File
@@ -331,7 +331,7 @@ If you dont specify a model, primary agents use the [model globally configure
}
```
The model ID in your Kilo config uses the format `provider/model-id`. For example, if you're using [Kilo Zen](/docs/zen), you would use `opencode/gpt-5.1-codex` for GPT 5.1 Codex.
The model ID in your Kilo config uses the format `provider/model-id`. For example, if you're using [OpenCode Zen](/docs/zen), you would use `opencode/gpt-5.1-codex` for GPT 5.1 Codex.
---
+1 -1
View File
@@ -345,7 +345,7 @@ opencode run --attach http://localhost:4096 "Explain async/await in JavaScript"
| `--file` | `-f` | File(s) to attach to message |
| `--format` | | Format: default (formatted) or json (raw JSON events) |
| `--title` | | Title for the session (uses truncated prompt if no value provided) |
| `--attach` | | Attach to a running kilo server (e.g., http://localhost:4096) |
| `--attach` | | Attach to a running kilo server (e.g., http://localhost:4096) |
| `--port` | | Port for the local server (defaults to random port) |
---
+45 -45
View File
@@ -15,56 +15,56 @@ You can also check out [awesome-opencode](https://github.com/awesome-opencode/aw
## Plugins
| Name | Description |
| -------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| [opencode-daytona](https://github.com/jamesmurdza/daytona/tree/main/libs/opencode-plugin) | Automatically run Kilo sessions in isolated Daytona sandboxes with git sync and live previews |
| [opencode-helicone-session](https://github.com/H2Shami/opencode-helicone-session) | Automatically inject Helicone session headers for request grouping |
| [opencode-type-inject](https://github.com/nick-vi/opencode-type-inject) | Auto-inject TypeScript/Svelte types into file reads with lookup tools |
| [opencode-openai-codex-auth](https://github.com/numman-ali/opencode-openai-codex-auth) | Use your ChatGPT Plus/Pro subscription instead of API credits |
| [opencode-gemini-auth](https://github.com/jenslys/opencode-gemini-auth) | Use your existing Gemini plan instead of API billing |
| [opencode-antigravity-auth](https://github.com/NoeFabris/opencode-antigravity-auth) | Use Antigravity's free models instead of API billing |
| [opencode-devcontainers](https://github.com/athal7/opencode-devcontainers) | Multi-branch devcontainer isolation with shallow clones and auto-assigned ports |
| [opencode-google-antigravity-auth](https://github.com/shekohex/opencode-google-antigravity-auth) | Google Antigravity OAuth Plugin, with support for Google Search, and more robust API handling |
| [opencode-dynamic-context-pruning](https://github.com/Tarquinen/opencode-dynamic-context-pruning) | Optimize token usage by pruning obsolete tool outputs |
| [opencode-websearch-cited](https://github.com/ghoulr/opencode-websearch-cited.git) | Add native websearch support for supported providers with Google grounded style |
| [opencode-pty](https://github.com/shekohex/opencode-pty.git) | Enables AI agents to run background processes in a PTY, send interactive input to them. |
| [opencode-shell-strategy](https://github.com/JRedeker/opencode-shell-strategy) | Instructions for non-interactive shell commands - prevents hangs from TTY-dependent operations |
| [opencode-wakatime](https://github.com/angristan/opencode-wakatime) | Track Kilo usage with Wakatime |
| [opencode-md-table-formatter](https://github.com/franlol/opencode-md-table-formatter/tree/main) | Clean up markdown tables produced by LLMs |
| [opencode-morph-fast-apply](https://github.com/JRedeker/opencode-morph-fast-apply) | 10x faster code editing with Morph Fast Apply API and lazy edit markers |
| [oh-my-opencode](https://github.com/code-yeongyu/oh-my-opencode) | Background agents, pre-built LSP/AST/MCP tools, curated agents, Claude Code compatible |
| [opencode-notificator](https://github.com/panta82/opencode-notificator) | Desktop notifications and sound alerts for Kilo sessions |
| [opencode-notifier](https://github.com/mohak34/opencode-notifier) | Desktop notifications and sound alerts for permission, completion, and error events |
| [opencode-zellij-namer](https://github.com/24601/opencode-zellij-namer) | AI-powered automatic Zellij session naming based on Kilo context |
| [opencode-skillful](https://github.com/zenobi-us/opencode-skillful) | Allow Kilo agents to lazy load prompts on demand with skill discovery and injection |
| [opencode-supermemory](https://github.com/supermemoryai/opencode-supermemory) | Persistent memory across sessions using Supermemory |
| [@plannotator/opencode](https://github.com/backnotprop/plannotator/tree/main/apps/opencode-plugin) | Interactive plan review with visual annotation and private/offline sharing |
| [@openspoon/subtask2](https://github.com/spoons-and-mirrors/subtask2) | Extend opencode /commands into a powerful orchestration system with granular flow control |
| [opencode-scheduler](https://github.com/different-ai/opencode-scheduler) | Schedule recurring jobs using launchd (Mac) or systemd (Linux) with cron syntax |
| [micode](https://github.com/vtemian/micode) | Structured Brainstorm → Plan → Implement workflow with session continuity |
| [octto](https://github.com/vtemian/octto) | Interactive browser UI for AI brainstorming with multi-question forms |
| [opencode-background-agents](https://github.com/kdcokenny/opencode-background-agents) | Claude Code-style background agents with async delegation and context persistence |
| [opencode-notify](https://github.com/kdcokenny/opencode-notify) | Native OS notifications for Kilo know when tasks complete |
| [opencode-workspace](https://github.com/kdcokenny/opencode-workspace) | Bundled multi-agent orchestration harness 16 components, one install |
| [opencode-worktree](https://github.com/kdcokenny/opencode-worktree) | Zero-friction git worktrees for Kilo |
| Name | Description |
| -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| [opencode-daytona](https://github.com/jamesmurdza/daytona/tree/main/libs/opencode-plugin) | Automatically run Kilo sessions in isolated Daytona sandboxes with git sync and live previews |
| [opencode-helicone-session](https://github.com/H2Shami/opencode-helicone-session) | Automatically inject Helicone session headers for request grouping |
| [opencode-type-inject](https://github.com/nick-vi/opencode-type-inject) | Auto-inject TypeScript/Svelte types into file reads with lookup tools |
| [opencode-openai-codex-auth](https://github.com/numman-ali/opencode-openai-codex-auth) | Use your ChatGPT Plus/Pro subscription instead of API credits |
| [opencode-gemini-auth](https://github.com/jenslys/opencode-gemini-auth) | Use your existing Gemini plan instead of API billing |
| [opencode-antigravity-auth](https://github.com/NoeFabris/opencode-antigravity-auth) | Use Antigravity's free models instead of API billing |
| [opencode-devcontainers](https://github.com/athal7/opencode-devcontainers) | Multi-branch devcontainer isolation with shallow clones and auto-assigned ports |
| [opencode-google-antigravity-auth](https://github.com/shekohex/opencode-google-antigravity-auth) | Google Antigravity OAuth Plugin, with support for Google Search, and more robust API handling |
| [opencode-dynamic-context-pruning](https://github.com/Tarquinen/opencode-dynamic-context-pruning) | Optimize token usage by pruning obsolete tool outputs |
| [opencode-websearch-cited](https://github.com/ghoulr/opencode-websearch-cited.git) | Add native websearch support for supported providers with Google grounded style |
| [opencode-pty](https://github.com/shekohex/opencode-pty.git) | Enables AI agents to run background processes in a PTY, send interactive input to them. |
| [opencode-shell-strategy](https://github.com/JRedeker/opencode-shell-strategy) | Instructions for non-interactive shell commands - prevents hangs from TTY-dependent operations |
| [opencode-wakatime](https://github.com/angristan/opencode-wakatime) | Track Kilo usage with Wakatime |
| [opencode-md-table-formatter](https://github.com/franlol/opencode-md-table-formatter/tree/main) | Clean up markdown tables produced by LLMs |
| [opencode-morph-fast-apply](https://github.com/JRedeker/opencode-morph-fast-apply) | 10x faster code editing with Morph Fast Apply API and lazy edit markers |
| [oh-my-opencode](https://github.com/code-yeongyu/oh-my-opencode) | Background agents, pre-built LSP/AST/MCP tools, curated agents, Claude Code compatible |
| [opencode-notificator](https://github.com/panta82/opencode-notificator) | Desktop notifications and sound alerts for Kilo sessions |
| [opencode-notifier](https://github.com/mohak34/opencode-notifier) | Desktop notifications and sound alerts for permission, completion, and error events |
| [opencode-zellij-namer](https://github.com/24601/opencode-zellij-namer) | AI-powered automatic Zellij session naming based on Kilo context |
| [opencode-skillful](https://github.com/zenobi-us/opencode-skillful) | Allow Kilo agents to lazy load prompts on demand with skill discovery and injection |
| [opencode-supermemory](https://github.com/supermemoryai/opencode-supermemory) | Persistent memory across sessions using Supermemory |
| [@plannotator/opencode](https://github.com/backnotprop/plannotator/tree/main/apps/opencode-plugin) | Interactive plan review with visual annotation and private/offline sharing |
| [@openspoon/subtask2](https://github.com/spoons-and-mirrors/subtask2) | Extend opencode /commands into a powerful orchestration system with granular flow control |
| [opencode-scheduler](https://github.com/different-ai/opencode-scheduler) | Schedule recurring jobs using launchd (Mac) or systemd (Linux) with cron syntax |
| [micode](https://github.com/vtemian/micode) | Structured Brainstorm → Plan → Implement workflow with session continuity |
| [octto](https://github.com/vtemian/octto) | Interactive browser UI for AI brainstorming with multi-question forms |
| [opencode-background-agents](https://github.com/kdcokenny/opencode-background-agents) | Claude Code-style background agents with async delegation and context persistence |
| [opencode-notify](https://github.com/kdcokenny/opencode-notify) | Native OS notifications for Kilo know when tasks complete |
| [opencode-workspace](https://github.com/kdcokenny/opencode-workspace) | Bundled multi-agent orchestration harness 16 components, one install |
| [opencode-worktree](https://github.com/kdcokenny/opencode-worktree) | Zero-friction git worktrees for Kilo |
---
## Projects
| Name | Description |
| ------------------------------------------------------------------------------------------ | --------------------------------------------------------------- |
| [kimaki](https://github.com/remorses/kimaki) | Discord bot to control Kilo sessions, built on the SDK |
| [opencode.nvim](https://github.com/NickvanDyke/opencode.nvim) | Neovim plugin for editor-aware prompts, built on the API |
| [portal](https://github.com/hosenur/portal) | Mobile-first web UI for Kilo over Tailscale/VPN |
| [opencode plugin template](https://github.com/zenobi-us/opencode-plugin-template/) | Template for building Kilo plugins |
| [opencode.nvim](https://github.com/sudo-tee/opencode.nvim) | Neovim frontend for opencode - a terminal-based AI coding agent |
| [ai-sdk-provider-opencode-sdk](https://github.com/ben-vargas/ai-sdk-provider-opencode-sdk) | Vercel AI SDK provider for using Kilo via @opencode-ai/sdk |
| [OpenChamber](https://github.com/btriapitsyn/openchamber) | Web / Desktop App and VS Code Extension for Kilo |
| [Kilo-Obsidian](https://github.com/mtymek/opencode-obsidian) | Obsidian plugin that embedds Kilo in Obsidian's UI |
| [OpenWork](https://github.com/different-ai/openwork) | An open-source alternative to Claude Cowork, powered by Kilo |
| [ocx](https://github.com/kdcokenny/ocx) | Kilo extension manager with portable, isolated profiles. |
| [CodeNomad](https://github.com/NeuralNomadsAI/CodeNomad) | Desktop, Web, Mobile and Remote Client App for Kilo |
| Name | Description |
| ------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- |
| [kimaki](https://github.com/remorses/kimaki) | Discord bot to control Kilo sessions, built on the SDK |
| [opencode.nvim](https://github.com/NickvanDyke/opencode.nvim) | Neovim plugin for editor-aware prompts, built on the API |
| [portal](https://github.com/hosenur/portal) | Mobile-first web UI for Kilo over Tailscale/VPN |
| [opencode plugin template](https://github.com/zenobi-us/opencode-plugin-template/) | Template for building Kilo plugins |
| [opencode.nvim](https://github.com/sudo-tee/opencode.nvim) | Neovim frontend for opencode - a terminal-based AI coding agent |
| [ai-sdk-provider-opencode-sdk](https://github.com/ben-vargas/ai-sdk-provider-opencode-sdk) | Vercel AI SDK provider for using Kilo via @opencode-ai/sdk |
| [OpenChamber](https://github.com/btriapitsyn/openchamber) | Web / Desktop App and VS Code Extension for Kilo |
| [Kilo-Obsidian](https://github.com/mtymek/opencode-obsidian) | Obsidian plugin that embedds Kilo in Obsidian's UI |
| [OpenWork](https://github.com/different-ai/openwork) | An open-source alternative to Claude Cowork, powered by Kilo |
| [ocx](https://github.com/kdcokenny/ocx) | Kilo extension manager with portable, isolated profiles. |
| [CodeNomad](https://github.com/NeuralNomadsAI/CodeNomad) | Desktop, Web, Mobile and Remote Client App for Kilo |
---
+2 -2
View File
@@ -105,8 +105,8 @@ Or you can set it up manually.
Kilo can be triggered by the following GitHub events:
| Event Type | Triggered By | Details |
| ----------------------------- | -------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
| Event Type | Triggered By | Details |
| ----------------------------- | -------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| `issue_comment` | Comment on an issue or PR | Mention `/opencode` or `/oc` in your comment. Kilo reads context and can create branches, open PRs, or reply. |
| `pull_request_review_comment` | Comment on specific code lines in a PR | Mention `/opencode` or `/oc` while reviewing code. Kilo receives file path, line numbers, and diff context. |
| `issues` | Issue opened or edited | Automatically trigger Kilo when issues are created or modified. Requires `prompt` input. |
+1 -1
View File
@@ -129,7 +129,7 @@ You can also grab the binary from the [Releases](https://github.com/Kilo-Org/kil
With Kilo you can use any LLM provider by configuring their API keys.
If you are new to using LLM providers, we recommend using [Kilo Zen](/docs/zen).
If you are new to using LLM providers, we recommend using [OpenCode Zen](/docs/zen).
It's a curated list of models that have been tested and verified by the Kilo
team.
+1 -1
View File
@@ -58,7 +58,7 @@ Kilo config.
}
```
Here the full ID is `provider_id/model_id`. For example, if you're using [Kilo Zen](/docs/zen), you would use `opencode/gpt-5.1-codex` for GPT 5.1 Codex.
Here the full ID is `provider_id/model_id`. For example, if you're using [OpenCode Zen](/docs/zen), you would use `opencode/gpt-5.1-codex` for GPT 5.1 Codex.
If you've configured a [custom provider](/docs/providers#custom), the `provider_id` is key from the `provider` part of your config, and the `model_id` is the key from `provider.models`.
+7 -7
View File
@@ -48,13 +48,13 @@ You can customize the base URL for any provider by setting the `baseURL` option.
---
## Kilo Zen
## OpenCode Zen
Kilo Zen is a list of models provided by the Kilo team that have been
OpenCode Zen is a list of models provided by the Kilo team that have been
tested and verified to work well with Kilo. [Learn more](/docs/zen).
:::tip
If you are new, we recommend starting with Kilo Zen.
If you are new, we recommend starting with OpenCode Zen.
:::
1. Run the `/connect` command in the TUI, select opencode, and head to [kilo.ai/auth](https://kilo.ai/auth).
@@ -1328,13 +1328,13 @@ If you already have an API key, you can select **Manually enter API Key** and pa
---
### Kilo Zen
### OpenCode
Kilo Zen is a list of tested and verified models provided by the Kilo team. [Learn more](/docs/zen).
OpenCode Zen is a list of tested and verified models provided by the Kilo team. [Learn more](/docs/zen).
1. Sign in to **<a href={console}>Kilo Zen</a>** and click **Create API Key**.
1. Sign in to **<a href={console}>OpenCode Zen</a>** and click **Create API Key**.
2. Run the `/connect` command and search for **Kilo Zen**.
2. Run the `/connect` command and search for **OpenCode Zen**.
```txt
/connect
+9 -9
View File
@@ -7,13 +7,13 @@ import config from "../../../config.mjs"
export const console = config.console
export const email = `mailto:${config.email}`
Kilo Zen is a list of tested and verified models provided by the Kilo team.
OpenCode Zen is a list of tested and verified models provided by the Kilo team.
:::note
Kilo Zen is currently in beta.
OpenCode Zen is currently in beta.
:::
Zen works like any other provider in Kilo. You login to Kilo Zen and get
OpenCode Zen works like any other provider in Kilo. You login to OpenCode Zen and get
your API key. It's **completely optional** and you don't need to use it to use
Kilo.
@@ -41,17 +41,17 @@ To fix this, we did a couple of things:
3. Finally, we benchmarked the combination of the model/provider and came up
with a list that we feel good recommending.
Kilo Zen is an AI gateway that gives you access to these models.
OpenCode Zen is an AI gateway that gives you access to these models.
---
## How it works
Kilo Zen works like any other provider in Kilo.
OpenCode Zen works like any other provider in Kilo.
1. You sign in to **<a href={console}>Kilo Zen</a>**, add your billing
1. You sign in to **<a href={console}>OpenCode Zen</a>**, add your billing
details, and copy your API key.
2. You run the `/connect` command in the TUI, select Kilo Zen, and paste your API key.
2. You run the `/connect` command in the TUI, select OpenCode Zen, and paste your API key.
3. Run `/models` in the TUI to see the list of models we recommend.
You are charged per request and you can add credits to your account.
@@ -243,9 +243,9 @@ and you want to use that instead of the one that Zen provides.
## Goals
We created Kilo Zen to:
We created OpenCode Zen to:
1. **Benchmark** the best models/providers for coding agents.
2. Have access to the **highest quality** options and not downgrade performance or route to cheaper providers.
3. Pass along any **price drops** by selling at cost; so the only markup is to cover our processing fees.
4. Have **no lock-in** by allowing you to use it with any other coding agent. And always let you use any other provider with Kilo as well.
4. Have **no lock-in** by allowing you to use it with any other coding agent. And always let you use any other provider with OpenCode as well.
+19
View File
@@ -41,6 +41,7 @@ async function main() {
for (const pr of prs) {
console.log(`\nProcessing PR #${pr.number}: ${pr.title}`)
// Fetch the PR
const fetchPR = await $`git fetch origin pull/${pr.number}/head:pr-${pr.number}`.nothrow()
if (fetchPR.exitCode !== 0) {
console.log(` Failed to fetch PR #${pr.number}, skipping`)
@@ -48,6 +49,24 @@ async function main() {
continue
}
// Try to rebase onto current beta branch
console.log(` Attempting to rebase PR #${pr.number}...`)
const rebase = await $`git rebase beta pr-${pr.number}`.nothrow()
if (rebase.exitCode !== 0) {
console.log(` Rebase failed for PR #${pr.number} (has conflicts)`)
await $`git rebase --abort`.nothrow()
await $`git checkout beta`.nothrow()
skipped.push({ number: pr.number, reason: "Rebase failed (conflicts)" })
continue
}
// Move rebased commits to pr-${pr.number} branch and checkout back to beta
await $`git checkout -B pr-${pr.number}`.nothrow()
await $`git checkout beta`.nothrow()
console.log(` Successfully rebased PR #${pr.number}`)
// Now squash merge the rebased PR
const merge = await $`git merge --squash pr-${pr.number}`.nothrow()
if (merge.exitCode !== 0) {
console.log(` Squash merge failed for PR #${pr.number}`)