Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
45ae7dc
Update VOUCHED list
github-actions[bot] Mar 21, 2026
dc00448
ignore: add danieljoshuanazareth to disavow list (#18476)
rekram1-node Mar 21, 2026
5dc4790
allow customizing DB location
thdxr Mar 21, 2026
6a64177
fix(zen): emit cost chunk in client-facing format, not upstream forma…
kitlangton Mar 21, 2026
40aeaa1
chore: generate
opencode-agent[bot] Mar 21, 2026
38e0dc9
Move service state into InstanceState, flatten service facades (#18483)
kitlangton Mar 21, 2026
2e0d5d2
chore: generate
opencode-agent[bot] Mar 21, 2026
9b805e1
wip: zen
fwang Mar 21, 2026
f80343b
fix annotation
thdxr Mar 21, 2026
fb6bf0b
chore: generate
opencode-agent[bot] Mar 21, 2026
9ad6588
app: allow navigating projects with keybinds (#18502)
Brendonovich Mar 21, 2026
6a16db4
app: manage mutation loading states with tanstack query (#18501)
Brendonovich Mar 21, 2026
9f7a76d
chore: generate
opencode-agent[bot] Mar 21, 2026
d5337b4
chore: update nix node_modules hashes
opencode-agent[bot] Mar 21, 2026
cc818f8
fix(provider): only set thinkingConfig for models with reasoning capa…
Protocol-zero-0 Mar 21, 2026
040f551
Upgrade opentui to 0.1.88 (#18079)
kommander Mar 21, 2026
832b8e2
chore: update nix node_modules hashes
opencode-agent[bot] Mar 21, 2026
10a3d6c
effectify SessionStatus service (#18565)
kitlangton Mar 21, 2026
0e0e7a4
effectify Command service (#18568)
kitlangton Mar 22, 2026
3236f22
effectify Plugin service (#18570)
kitlangton Mar 22, 2026
e82c5a9
chore: generate
opencode-agent[bot] Mar 22, 2026
fe53af4
effectify ToolRegistry service (#18571)
kitlangton Mar 22, 2026
13bac9c
effectify Pty service (#18572)
kitlangton Mar 22, 2026
c529529
fix(app): terminal rename from context menu (#18263)
neriousy Mar 22, 2026
32f9dc6
fix(ui): stop auto close of sidebar on resize (#18647)
iamdavidhill Mar 22, 2026
e2d03ce
feat: interactive update flow for non-patch releases (#18662)
thdxr Mar 22, 2026
eb3bfff
release: v1.3.0
Mar 22, 2026
5460bf9
chore: generate
opencode-agent[bot] Mar 22, 2026
797c987
gif splash
belohnung Feb 22, 2026
08a1cf7
add gif assets module
belohnung Feb 23, 2026
35e5580
fix(tui): load splash gifs from embedded assets
belohnung Feb 23, 2026
a62dbe3
fix(tui): embed gif assets using import attributes for compiled binary
belohnung Mar 1, 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
4 changes: 3 additions & 1 deletion .github/VOUCHED.td
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,17 @@
adamdotdevin
-agusbasari29 AI PR slop
ariane-emory
-danieljoshuanazareth
edemaine
-florianleibert
fwang
iamdavidhill
jayair
kitlangton
kommander
-opencode2026
r44vc0rp
rekram1-node
-spider-yamet clawdbot/llm psychosis, spam pinging the team
thdxr
-OpenCode2026
-danieljoshuanazareth
Binary file added assets/happy-cat.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/head-empty-cat.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
59 changes: 31 additions & 28 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions nix/hashes.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"nodeModules": {
"x86_64-linux": "sha256-P0RJfQF8APTYVGP6hLJRrOkRSl5nVDNxdcGcZECPPJE=",
"aarch64-linux": "sha256-ZtMjTcd35X3JhJIdn3DilFsp7i/IZIcNaKZFnSzW/nk=",
"aarch64-darwin": "sha256-Uw/okFDRxxKQMfEsj8MXuHyhpugxZGgIKtu89Getlz8=",
"x86_64-darwin": "sha256-ZySIgT1HbWZWnaQ0W0eURKC43BTupRmmply92JDFPWA="
"x86_64-linux": "sha256-u+uZX7mhtm5eywGybB7/MjBMG2xl4Ve9VG33AAFgNno=",
"aarch64-linux": "sha256-pc1Xhd2bkwNohGMtzRnEuS5ZN1qWhJncYhNVAXega1g=",
"aarch64-darwin": "sha256-A5qUpqgm9ZFvWVhn/WdiX4lVs4ihbAclJDvCFAmx5Wg=",
"x86_64-darwin": "sha256-ECLrMGE51AlYJ4JKDtziDKxhyK7WLt8R+8RVFdXH1WU="
}
}
38 changes: 37 additions & 1 deletion packages/app/e2e/terminal/terminal-tabs.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { Page } from "@playwright/test"
import { runTerminal, waitTerminalReady } from "../actions"
import { test, expect } from "../fixtures"
import { terminalSelector } from "../selectors"
import { dropdownMenuContentSelector, terminalSelector } from "../selectors"
import { terminalToggleKey, workspacePersistKey } from "../utils"

type State = {
Expand Down Expand Up @@ -130,3 +130,39 @@ test("closing the active terminal tab falls back to the previous tab", async ({
.toEqual({ count: 1, first: true })
})
})

test("terminal tab can be renamed from the context menu", async ({ page, withProject }) => {
await withProject(async ({ directory, gotoSession }) => {
const key = workspacePersistKey(directory, "terminal")
const rename = `E2E term ${Date.now()}`
const tab = page.locator('#terminal-panel [data-slot="tabs-trigger"]').first()

await gotoSession()
await open(page)

await expect(tab).toContainText(/Terminal 1/)
await tab.click({ button: "right" })

const menu = page.locator(dropdownMenuContentSelector).first()
await expect(menu).toBeVisible()
await menu.getByRole("menuitem", { name: /^Rename$/i }).click()
await expect(menu).toHaveCount(0)

const input = page.locator('#terminal-panel input[type="text"]').first()
await expect(input).toBeVisible()
await input.fill(rename)
await input.press("Enter")

await expect(input).toHaveCount(0)
await expect(tab).toContainText(rename)
await expect
.poll(
async () => {
const state = await store(page, key)
return state?.all[0]?.title
},
{ timeout: 5_000 },
)
.toBe(rename)
})
})
3 changes: 2 additions & 1 deletion packages/app/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@opencode-ai/app",
"version": "1.2.27",
"version": "1.3.0",
"description": "",
"type": "module",
"exports": {
Expand Down Expand Up @@ -54,6 +54,7 @@
"@solid-primitives/websocket": "1.3.1",
"@solidjs/meta": "catalog:",
"@solidjs/router": "catalog:",
"@tanstack/solid-query": "5.91.4",
"@thisbeyond/solid-dnd": "0.7.5",
"diff": "catalog:",
"effect": "catalog:",
Expand Down
18 changes: 13 additions & 5 deletions packages/app/src/app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { Splash } from "@opencode-ai/ui/logo"
import { ThemeProvider } from "@opencode-ai/ui/theme"
import { MetaProvider } from "@solidjs/meta"
import { type BaseRouterProps, Navigate, Route, Router } from "@solidjs/router"
import { QueryClient, QueryClientProvider } from "@tanstack/solid-query"
import { type Duration, Effect } from "effect"
import {
type Component,
Expand Down Expand Up @@ -81,6 +82,11 @@ function MarkedProviderWithNativeParser(props: ParentProps) {
return <MarkedProvider nativeParser={platform.parseMarkdown}>{props.children}</MarkedProvider>
}

function QueryProvider(props: ParentProps) {
const client = new QueryClient()
return <QueryClientProvider client={client}>{props.children}</QueryClientProvider>
}

function AppShellProviders(props: ParentProps) {
return (
<SettingsProvider>
Expand Down Expand Up @@ -136,11 +142,13 @@ export function AppBaseProviders(props: ParentProps) {
<LanguageProvider>
<UiI18nBridge>
<ErrorBoundary fallback={(error) => <ErrorPage error={error} />}>
<DialogProvider>
<MarkedProviderWithNativeParser>
<FileComponentProvider component={File}>{props.children}</FileComponentProvider>
</MarkedProviderWithNativeParser>
</DialogProvider>
<QueryProvider>
<DialogProvider>
<MarkedProviderWithNativeParser>
<FileComponentProvider component={File}>{props.children}</FileComponentProvider>
</MarkedProviderWithNativeParser>
</DialogProvider>
</QueryProvider>
</ErrorBoundary>
</UiI18nBridge>
</LanguageProvider>
Expand Down
3 changes: 1 addition & 2 deletions packages/app/src/components/dialog-connect-provider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,9 @@ import { showToast } from "@opencode-ai/ui/toast"
import { createMemo, Match, onCleanup, onMount, Switch } from "solid-js"
import { createStore, produce } from "solid-js/store"
import { Link } from "@/components/link"
import { useLanguage } from "@/context/language"
import { useGlobalSDK } from "@/context/global-sdk"
import { useGlobalSync } from "@/context/global-sync"
import { DialogSelectModel } from "./dialog-select-model"
import { useLanguage } from "@/context/language"
import { DialogSelectProvider } from "./dialog-select-provider"

export function DialogConnectProvider(props: { provider: string }) {
Expand Down
1 change: 0 additions & 1 deletion packages/app/src/components/dialog-custom-provider-form.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ export type FormState = {
apiKey: string
models: ModelRow[]
headers: HeaderRow[]
saving: boolean
err: {
providerID?: string
name?: string
Expand Down
2 changes: 0 additions & 2 deletions packages/app/src/components/dialog-custom-provider.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ describe("validateCustomProvider", () => {
{ row: "h0", key: " X-Test ", value: " enabled ", err: {} },
{ row: "h1", key: "", value: "", err: {} },
],
saving: false,
err: {},
},
t,
Expand Down Expand Up @@ -60,7 +59,6 @@ describe("validateCustomProvider", () => {
{ row: "h0", key: "Authorization", value: "one", err: {} },
{ row: "h1", key: "authorization", value: "two", err: {} },
],
saving: false,
err: {},
},
t,
Expand Down
Loading