Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
11d4867
fix: rm ai sdk middleware that was preventing <think> blocks from bei…
rekram1-node Jan 30, 2026
08fa7f7
ci
thdxr Jan 30, 2026
9493316
ci
thdxr Jan 30, 2026
698cf6d
ci
thdxr Jan 30, 2026
97a428c
ci
thdxr Jan 30, 2026
601744e
sync
thdxr Jan 30, 2026
a530c1b
ci
thdxr Jan 30, 2026
abb87ea
ci
thdxr Jan 30, 2026
ad5d495
ci
thdxr Jan 30, 2026
5e823fd
ci
thdxr Jan 30, 2026
4a4fc48
ci
thdxr Jan 30, 2026
0a0b54a
ci
thdxr Jan 30, 2026
0d53f34
ci
thdxr Jan 30, 2026
b9e9c8c
ci
thdxr Jan 30, 2026
3f57f49
ci
thdxr Jan 30, 2026
e0b60d9
ci
thdxr Jan 30, 2026
9cf3e65
ci
thdxr Jan 30, 2026
e4d3b96
ci
thdxr Jan 30, 2026
7fb22ab
ci
thdxr Jan 30, 2026
9a0132e
ci
thdxr Jan 30, 2026
e80a99e
ci
thdxr Jan 30, 2026
2e005de
ci
thdxr Jan 30, 2026
1aade4b
ci
thdxr Jan 30, 2026
7cb84f1
wip: zen (#11343)
fwang Jan 30, 2026
0b91e90
chore: generate
opencode-agent[bot] Jan 30, 2026
21edc00
ci: update pr template (#11341)
rekram1-node Jan 30, 2026
1bbe84e
ci
thdxr Jan 30, 2026
20619a6
feat: Transitions, spacing, scroll fade, prompt area update (#11168)
aaroniker Jan 30, 2026
fe66ca1
chore: generate
opencode-agent[bot] Jan 30, 2026
f48e2e5
test(app): change language test (#11295)
neriousy Jan 30, 2026
7d0777a
chore(tui): remove unused experimental keys (#11195)
IdrisGit Jan 30, 2026
5495fdd
chore: generate
opencode-agent[bot] Jan 30, 2026
e9ef94d
release: v1.1.46
Jan 30, 2026
f5a1d5c
refactor: kilo compat for v1.1.46
catrielmuller Feb 4, 2026
e4163a0
feat: merge opencode v1.1.46
catrielmuller Feb 4, 2026
f278d21
fix: fix dialog modals
catrielmuller Feb 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions .github/workflows/beta.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,20 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Setup Bun
uses: ./.github/actions/setup-bun

- name: Configure Git
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
- name: Setup Git Committer
id: setup-git-committer
uses: ./.github/actions/setup-git-committer
with:
opencode-app-id: ${{ vars.OPENCODE_APP_ID }}
opencode-app-secret: ${{ secrets.OPENCODE_APP_SECRET }}

- name: Sync beta branch
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_TOKEN: ${{ steps.setup-git-committer.outputs.token }}
run: bun script/beta.ts
2 changes: 0 additions & 2 deletions .github/workflows/generate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ on:
push:
branches:
- dev
pull_request:
workflow_dispatch:

jobs:
generate:
Expand Down
2 changes: 2 additions & 0 deletions infra/console.ts
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,8 @@ const ZEN_MODELS = [
new sst.Secret("ZEN_MODELS6"),
new sst.Secret("ZEN_MODELS7"),
new sst.Secret("ZEN_MODELS8"),
new sst.Secret("ZEN_MODELS9"),
new sst.Secret("ZEN_MODELS10"),
]
const STRIPE_SECRET_KEY = new sst.Secret("STRIPE_SECRET_KEY")
const STRIPE_PUBLISHABLE_KEY = new sst.Secret("STRIPE_PUBLISHABLE_KEY")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { test, expect } from "./fixtures"
import { serverName } from "./utils"
import { test, expect } from "../fixtures"
import { serverName } from "../utils"

test("home renders and shows core entrypoints", async ({ page }) => {
await page.goto("/")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { test, expect } from "./fixtures"
import { dirPath, promptSelector } from "./utils"
import { test, expect } from "../fixtures"
import { dirPath, promptSelector } from "../utils"

test("project route redirects to /session", async ({ page, directory, slug }) => {
await page.goto(dirPath(directory))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { test, expect } from "./fixtures"
import { modKey } from "./utils"
import { test, expect } from "../fixtures"
import { modKey } from "../utils"

test("search palette opens and closes", async ({ page, gotoSession }) => {
await gotoSession()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { test, expect } from "./fixtures"
import { serverName, serverUrl } from "./utils"
import { test, expect } from "../fixtures"
import { serverName, serverUrl } from "../utils"

const DEFAULT_SERVER_URL_KEY = "opencode.settings.dat:defaultServerUrl"

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { test, expect } from "./fixtures"
import { promptSelector } from "./utils"
import { test, expect } from "../fixtures"
import { promptSelector } from "../utils"

test("can open an existing session and type into the prompt", async ({ page, sdk, gotoSession }) => {
const title = `e2e smoke ${Date.now()}`
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { test, expect } from "./fixtures"
import { modKey, promptSelector } from "./utils"
import { test, expect } from "../fixtures"
import { modKey, promptSelector } from "../utils"

test("titlebar back/forward navigates between sessions", async ({ page, slug, sdk, gotoSession }) => {
await page.setViewportSize({ width: 1400, height: 800 })
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { test, expect } from "./fixtures"
import { modKey } from "./utils"
import { test, expect } from "../fixtures"
import { modKey } from "../utils"

test("can open a file tab from the search palette", async ({ page, gotoSession }) => {
await gotoSession()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { test, expect } from "./fixtures"
import { test, expect } from "../fixtures"

test.skip("file tree can expand folders and open a file", async ({ page, gotoSession }) => {
await gotoSession()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { test, expect } from "./fixtures"
import { modKey } from "./utils"
import { test, expect } from "../fixtures"
import { modKey } from "../utils"

test("smoke file viewer renders real file content", async ({ page, gotoSession }) => {
await gotoSession()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { test, expect } from "./fixtures"
import { promptSelector } from "./utils"
import { test, expect } from "../fixtures"
import { promptSelector } from "../utils"

test("smoke model selection updates prompt footer", async ({ page, gotoSession }) => {
await gotoSession()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { test, expect } from "./fixtures"
import { modKey, promptSelector } from "./utils"
import { test, expect } from "../fixtures"
import { modKey, promptSelector } from "../utils"

test("hiding a model removes it from the model picker", async ({ page, gotoSession }) => {
await gotoSession()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { test, expect } from "./fixtures"
import { promptSelector } from "./utils"
import { test, expect } from "../fixtures"
import { promptSelector } from "../utils"

test("context panel can be opened from the prompt", async ({ page, sdk, gotoSession }) => {
const title = `e2e smoke context ${Date.now()}`
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { test, expect } from "./fixtures"
import { promptSelector } from "./utils"
import { test, expect } from "../fixtures"
import { promptSelector } from "../utils"

test("smoke @mention inserts file pill token", async ({ page, gotoSession }) => {
await gotoSession()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { test, expect } from "./fixtures"
import { promptSelector } from "./utils"
import { test, expect } from "../fixtures"
import { promptSelector } from "../utils"

test("smoke /open opens file picker dialog", async ({ page, gotoSession }) => {
await gotoSession()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { test, expect } from "./fixtures"
import { promptSelector } from "./utils"
import { test, expect } from "../fixtures"
import { promptSelector } from "../utils"

function sessionIDFromUrl(url: string) {
const match = /\/session\/([^/?#]+)/.exec(url)
Expand Down
39 changes: 39 additions & 0 deletions packages/app/e2e/settings/settings-language.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { test, expect } from "../fixtures"
import { modKey, settingsLanguageSelectSelector } from "../utils"

test("smoke changing language updates settings labels", async ({ page, gotoSession }) => {
await page.addInitScript(() => {
localStorage.setItem("opencode.global.dat:language", JSON.stringify({ locale: "en" }))
})

await gotoSession()

const dialog = page.getByRole("dialog")

await page.keyboard.press(`${modKey}+Comma`).catch(() => undefined)

const opened = await dialog
.waitFor({ state: "visible", timeout: 3000 })
.then(() => true)
.catch(() => false)

if (!opened) {
await page.getByRole("button", { name: "Settings" }).first().click()
await expect(dialog).toBeVisible()
}

const heading = dialog.getByRole("heading", { level: 2 })
await expect(heading).toHaveText("General")

const select = dialog.locator(settingsLanguageSelectSelector)
await expect(select).toBeVisible()
await select.locator('[data-slot="select-select-trigger"]').click()

await page.locator('[data-slot="select-select-item"]').filter({ hasText: "Deutsch" }).click()

await expect(heading).toHaveText("Allgemein")

await select.locator('[data-slot="select-select-trigger"]').click()
await page.locator('[data-slot="select-select-item"]').filter({ hasText: "English" }).click()
await expect(heading).toHaveText("General")
})
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { test, expect } from "./fixtures"
import { modKey, promptSelector } from "./utils"
import { test, expect } from "../fixtures"
import { modKey, promptSelector } from "../utils"

test("smoke providers settings opens provider selector", async ({ page, gotoSession }) => {
await gotoSession()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { test, expect } from "./fixtures"
import { modKey } from "./utils"
import { test, expect } from "../fixtures"
import { modKey } from "../utils"

test("smoke settings dialog opens, switches tabs, closes", async ({ page, gotoSession }) => {
await gotoSession()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,33 +1,7 @@
import { test, expect } from "./fixtures"
import { modKey, promptSelector } from "./utils"
import { test, expect } from "../fixtures"
import { modKey, promptSelector } from "../utils"

type Locator = {
first: () => Locator
getAttribute: (name: string) => Promise<string | null>
scrollIntoViewIfNeeded: () => Promise<void>
click: () => Promise<void>
}

type Page = {
locator: (selector: string) => Locator
keyboard: {
press: (key: string) => Promise<void>
}
}

type Fixtures = {
page: Page
slug: string
sdk: {
session: {
create: (input: { title: string }) => Promise<{ data?: { id?: string } }>
delete: (input: { sessionID: string }) => Promise<unknown>
}
}
gotoSession: (sessionID?: string) => Promise<void>
}

test("sidebar session links navigate to the selected session", async ({ page, slug, sdk, gotoSession }: Fixtures) => {
test("sidebar session links navigate to the selected session", async ({ page, slug, sdk, gotoSession }) => {
const stamp = Date.now()

const one = await sdk.session.create({ title: `e2e sidebar nav 1 ${stamp}` }).then((r) => r.data)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { test, expect } from "./fixtures"
import { modKey } from "./utils"
import { test, expect } from "../fixtures"
import { modKey } from "../utils"

test("sidebar can be collapsed and expanded", async ({ page, gotoSession }) => {
await gotoSession()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { test, expect } from "./fixtures"
import { promptSelector, terminalSelector, terminalToggleKey } from "./utils"
import { test, expect } from "../fixtures"
import { promptSelector, terminalSelector, terminalToggleKey } from "../utils"

test("smoke terminal mounts and can create a second tab", async ({ page, gotoSession }) => {
await gotoSession()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { test, expect } from "./fixtures"
import { terminalSelector, terminalToggleKey } from "./utils"
import { test, expect } from "../fixtures"
import { terminalSelector, terminalToggleKey } from "../utils"

test("terminal panel can be toggled", async ({ page, gotoSession }) => {
await gotoSession()
Expand Down
2 changes: 2 additions & 0 deletions packages/app/e2e/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ export const promptSelector = '[data-component="prompt-input"]'
export const terminalSelector = '[data-component="terminal"]'
export const modelVariantCycleSelector = '[data-action="model-variant-cycle"]'

export const settingsLanguageSelectSelector = '[data-action="settings-language"]'

export function createSdk(directory?: string) {
return createOpencodeClient({ baseUrl: serverUrl, directory, throwOnError: true })
}
Expand Down
4 changes: 2 additions & 2 deletions packages/app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
},
"dependencies": {
"@kobalte/core": "catalog:",
"@kilocode/kilo-i18n": "workspace:*",
"@kilocode/sdk": "workspace:*",
"@opencode-ai/ui": "workspace:*",
"@opencode-ai/util": "workspace:*",
Expand Down Expand Up @@ -65,6 +64,7 @@
"solid-list": "catalog:",
"tailwindcss": "catalog:",
"virtua": "catalog:",
"zod": "catalog:"
"zod": "catalog:",
"@kilocode/kilo-i18n": "workspace:*"
}
}
7 changes: 4 additions & 3 deletions packages/app/src/components/dialog-select-model.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ const ModelList: Component<{

export function ModelSelectorPopover<T extends ValidComponent = "div">(props: {
provider?: string
children?: JSX.Element
children?: JSX.Element | ((open: boolean) => JSX.Element)
triggerAs?: T
triggerProps?: ComponentProps<T>
}) {
Expand Down Expand Up @@ -181,12 +181,13 @@ export function ModelSelectorPopover<T extends ValidComponent = "div">(props: {
as={props.triggerAs ?? "div"}
{...(props.triggerProps as any)}
>
{props.children}
{typeof props.children === "function" ? props.children(store.open) : props.children}
</Kobalte.Trigger>
<Kobalte.Portal>
<Kobalte.Content
class="w-72 h-80 flex flex-col rounded-md border border-border-base bg-surface-raised-stronger-non-alpha shadow-md z-50 outline-none overflow-hidden"
data-component="model-popover-content"
ref={(el) => setStore("content", el)}
class="w-72 h-80 flex flex-col p-2 rounded-md border border-border-base bg-surface-raised-stronger-non-alpha shadow-md z-50 outline-none overflow-hidden"
onEscapeKeyDown={(event) => {
setStore("dismiss", "escape")
setStore("open", false)
Expand Down
Loading