Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
0638e49
zen: gpt5.4
fwang Mar 5, 2026
e3b6d84
docs(i18n): sync locale docs from english changes
opencode-agent[bot] Mar 5, 2026
2ba1eca
fix(app): load tab on open file
adamdotdevin Mar 5, 2026
76cdc66
fix(console): follow-up for #13108 docs/en routing and locale cookie …
Seungjun0906 Mar 5, 2026
80c36c7
zen: gpt5.3 codex spark
fwang Mar 5, 2026
a697816
ci: fix
fwang Mar 5, 2026
adaee66
zen: gpt 5.4 pro
fwang Mar 5, 2026
39691e5
tui: remove keyboard shortcut tooltips from new session and new works…
iamdavidhill Mar 5, 2026
cf425d1
fix(app): stale show (#16236)
neriousy Mar 6, 2026
3ebba02
refactor: replace Bun.sleep with node timers (#15013)
thdxr Mar 6, 2026
6e89d3e
refactor: replace Bun.write/file with Filesystem utilities in snapshot
thdxr Mar 6, 2026
dad2488
refactor: replace Bun.write with Filesystem.write in config files
thdxr Mar 6, 2026
a9bf1c0
refactor: replace Bun.hash with Hash.fast using xxhash3-xxh64
thdxr Mar 6, 2026
ae5c9ed
refactor: replace Bun.stdin.text with Node.js stream reading
thdxr Mar 6, 2026
7e28098
refactor: use node:stream/consumers for stdin reading
thdxr Mar 6, 2026
6733a5a
fix: use sha1 for hash instead of unsupported xxhash3-xxh64
thdxr Mar 6, 2026
bf35a86
refactor: replace Bun.connect with net.createConnection
thdxr Mar 6, 2026
d68afca
refactor: replace Bun.stderr and Bun.color with Node.js equivalents
thdxr Mar 6, 2026
46d7d2f
feat: add "gpt-5.4" to codex allowed models list (#16274)
msadiks Mar 6, 2026
cb41124
release: v1.2.19
Mar 6, 2026
74effa8
refactor(opencode): replace Bun.which with npm which (#15012)
thdxr Mar 6, 2026
c04da45
chore: update nix node_modules hashes
opencode-agent[bot] Mar 6, 2026
aec6ca7
fix(git): stop leaking fsmonitor daemons e.g. 60GB+ of commited memor…
Hona Mar 6, 2026
326c701
fix: restore Bun stdin reads for prompt input (#16300)
thdxr Mar 6, 2026
6c7d968
release: v1.2.20
Mar 6, 2026
8b844c4
fix: ignore untracked files in merge tool's dirty-tree check
kulvirgit Mar 6, 2026
2de436b
Merge tag 'v1.2.20' into merge/upstream-v1.2.20
kulvirgit Mar 6, 2026
d37f561
chore: remove unused upstream packages after merge
kulvirgit Mar 6, 2026
b8e8424
Revert "chore: remove unused upstream packages after merge"
kulvirgit Mar 6, 2026
c6aae58
chore: regenerate bun.lock after upstream merge
kulvirgit Mar 6, 2026
3040417
fix: keep upstream packages instead of deleting them during merge
kulvirgit Mar 6, 2026
a290020
fix: add missing `bashOutput` method and `bashSnapshots` property to …
kulvirgit Mar 7, 2026
89b6c44
fix: add build, test, and typecheck steps to merge script
kulvirgit Mar 7, 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
50 changes: 32 additions & 18 deletions bun.lock

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

3 changes: 2 additions & 1 deletion github/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import type { Context as GitHubContext } from "@actions/github/lib/context"
import type { IssueCommentEvent, PullRequestReviewCommentEvent } from "@octokit/webhooks-types"
import { createOpencodeClient } from "@opencode-ai/sdk"
import { spawn } from "node:child_process"
import { setTimeout as sleep } from "node:timers/promises"

type GitHubAuthor = {
login: string
Expand Down Expand Up @@ -281,7 +282,7 @@ async function assertOpencodeConnected() {
connected = true
break
} catch (e) {}
await Bun.sleep(300)
await sleep(300)
} while (retry++ < 30)

if (!connected) {
Expand Down
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-v83hWzYVg/g4zJiBpGsQ71wTdndPk3BQVZ2mjMApUIQ=",
"aarch64-linux": "sha256-inpMwkQqwBFP2wL8w/pTOP7q3fg1aOqvE0wgzVd3/B8=",
"aarch64-darwin": "sha256-r42LGrQWqDyIy62mBSU5Nf3M22dJ3NNo7mjN/1h8d8Y=",
"x86_64-darwin": "sha256-J6XrrdK5qBK3sQBQOO/B3ZluOnsAf5f65l4q/K1nDTI="
"x86_64-linux": "sha256-pBTIT8Pgdm3272YhBjiAZsmj0SSpHTklh6lGc8YcMoE=",
"aarch64-linux": "sha256-prt039++d5UZgtldAN6+RVOR557ifIeusiy5XpzN8QU=",
"aarch64-darwin": "sha256-Y3f+cXcIGLqz6oyc5fG22t6CLD4wGkvwqO6RNXjFriQ=",
"x86_64-darwin": "sha256-BjbBBhQUgGhrlP56skABcrObvutNUZSWnrnPCg1OTKE="
}
}
6 changes: 5 additions & 1 deletion packages/app/e2e/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@ export async function createTestProject() {
await fs.writeFile(path.join(root, "README.md"), "# e2e\n")

execSync("git init", { cwd: root, stdio: "ignore" })
execSync("git config core.fsmonitor false", { cwd: root, stdio: "ignore" })
execSync("git add -A", { cwd: root, stdio: "ignore" })
execSync('git -c user.name="e2e" -c user.email="e2e@example.com" commit -m "init" --allow-empty', {
cwd: root,
Expand All @@ -207,7 +208,10 @@ export async function createTestProject() {
}

export async function cleanupTestProject(directory: string) {
await fs.rm(directory, { recursive: true, force: true }).catch(() => undefined)
try {
execSync("git fsmonitor--daemon stop", { cwd: directory, stdio: "ignore" })
} catch {}
await fs.rm(directory, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 }).catch(() => undefined)
}

export function sessionIDFromUrl(url: string) {
Expand Down
2 changes: 1 addition & 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.18",
"version": "1.2.20",
"description": "",
"type": "module",
"exports": {
Expand Down
34 changes: 11 additions & 23 deletions packages/app/src/pages/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import { ResizeHandle } from "@opencode-ai/ui/resize-handle"
import { Button } from "@opencode-ai/ui/button"
import { Icon } from "@opencode-ai/ui/icon"
import { IconButton } from "@opencode-ai/ui/icon-button"
import { Tooltip, TooltipKeybind } from "@opencode-ai/ui/tooltip"
import { Tooltip } from "@opencode-ai/ui/tooltip"
import { DropdownMenu } from "@opencode-ai/ui/dropdown-menu"
import { Dialog } from "@opencode-ai/ui/dialog"
import { getFilename } from "@opencode-ai/util/path"
Expand Down Expand Up @@ -1937,20 +1937,14 @@ export default function Layout(props: ParentProps) {
fallback={
<>
<div class="shrink-0 py-4 px-3">
<TooltipKeybind
title={language.t("command.session.new")}
keybind={command.keybind("session.new")}
placement="top"
<Button
size="large"
icon="plus-small"
class="w-full"
onClick={() => navigateWithSidebarReset(`/${base64Encode(p.worktree)}/session`)}
>
<Button
size="large"
icon="plus-small"
class="w-full"
onClick={() => navigateWithSidebarReset(`/${base64Encode(p.worktree)}/session`)}
>
{language.t("command.session.new")}
</Button>
</TooltipKeybind>
{language.t("command.session.new")}
</Button>
</div>
<div class="flex-1 min-h-0">
<LocalWorkspace
Expand All @@ -1965,15 +1959,9 @@ export default function Layout(props: ParentProps) {
>
<>
<div class="shrink-0 py-4 px-3">
<TooltipKeybind
title={language.t("workspace.new")}
keybind={command.keybind("workspace.new")}
placement="top"
>
<Button size="large" icon="plus-small" class="w-full" onClick={() => createWorkspace(p)}>
{language.t("workspace.new")}
</Button>
</TooltipKeybind>
<Button size="large" icon="plus-small" class="w-full" onClick={() => createWorkspace(p)}>
{language.t("workspace.new")}
</Button>
</div>
<div class="relative flex-1 min-h-0">
<DragDropProvider
Expand Down
1 change: 1 addition & 0 deletions packages/app/src/pages/session.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -720,6 +720,7 @@ export default function Page() {
showAllFiles,
tabForPath: file.tab,
openTab: tabs().open,
setActive: tabs().setActive,
loadFile: file.load,
})

Expand Down
3 changes: 2 additions & 1 deletion packages/app/src/pages/session/helpers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,13 @@ describe("createOpenReviewFile", () => {
return `file://${path}`
},
openTab: (tab) => calls.push(`open:${tab}`),
setActive: (tab) => calls.push(`active:${tab}`),
loadFile: (path) => calls.push(`load:${path}`),
})

openReviewFile("src/a.ts")

expect(calls).toEqual(["show", "load:src/a.ts", "tab:src/a.ts", "open:file://src/a.ts"])
expect(calls).toEqual(["show", "load:src/a.ts", "tab:src/a.ts", "open:file://src/a.ts", "active:file://src/a.ts"])
})
})

Expand Down
11 changes: 8 additions & 3 deletions packages/app/src/pages/session/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,20 @@ export const createOpenReviewFile = (input: {
showAllFiles: () => void
tabForPath: (path: string) => string
openTab: (tab: string) => void
setActive: (tab: string) => void
loadFile: (path: string) => any | Promise<void>
}) => {
return (path: string) => {
batch(() => {
input.showAllFiles()
const maybePromise = input.loadFile(path)
const openTab = () => input.openTab(input.tabForPath(path))
if (maybePromise instanceof Promise) maybePromise.then(openTab)
else openTab()
const open = () => {
const tab = input.tabForPath(path)
input.openTab(tab)
input.setActive(tab)
}
if (maybePromise instanceof Promise) maybePromise.then(open)
else open()
})
}
}
Expand Down
Loading
Loading