Skip to content

Commit 340fd9e

Browse files
authored
Merge branch 'dev' into feat/free-model-resolution
2 parents 61e8117 + 4394b32 commit 340fd9e

258 files changed

Lines changed: 130689 additions & 68683 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/TEAM_MEMBERS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,4 @@ simonklee
1818
Slickstef11
1919
usrnk1
2020
vimtor
21-
starptech
21+
StarpTech

.opencode/tool/github-triage.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { tool } from "@opencode-ai/plugin"
44
const TEAM = {
55
tui: ["kommander", "simonklee"],
66
desktop_web: ["Hona", "Brendonovich"],
7-
core: ["jlongster", "rekram1-node", "nexxeln", "kitlangton", "starptech"],
7+
core: ["jlongster", "rekram1-node", "nexxeln", "kitlangton"],
88
inference: ["fwang", "MrMushrooooom", "starptech"],
99
windows: ["Hona"],
1010
} as const

bun.lock

Lines changed: 83 additions & 49 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

nix/hashes.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
{
22
"nodeModules": {
3-
"x86_64-linux": "sha256-JTtn+wXTXg+yklvIMDLcGFaYhTU6ZrCgKT9JTNEQ3gA=",
4-
"aarch64-linux": "sha256-gXU6zyhvAZrZirkL/PlHdkHtEof/7PVSPCaE34Jnd4U=",
5-
"aarch64-darwin": "sha256-Q0oTG3uzOlD/X2kJingLle529lKFoTpyCW2rHXOZ6iE=",
6-
"x86_64-darwin": "sha256-LINvKHxPibTlJeNzfACQx0x+Yj5oROT6Du3I5AtqqXk="
3+
"x86_64-linux": "sha256-F1luclnqCPQk9yxfmeSYGaM/nScf28yBu9K3Fv+Xd24=",
4+
"aarch64-linux": "sha256-XW0XZnsCRkU3MFJH9TjMRYZHffzVy3cQyiNCkec2gl4=",
5+
"aarch64-darwin": "sha256-bf8kvORs3Fs2UYLp3PekF+AJR7NKOcHb+fIQA79RtMk=",
6+
"x86_64-darwin": "sha256-sBdQPkzd7JXNW6Lbi9JHiAsfHwdLwTKWY+uPeXAv2Nw="
77
}
88
}

package.json

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
"@opentui/core": "0.4.3",
4444
"@opentui/keymap": "0.4.3",
4545
"@opentui/solid": "0.4.3",
46-
"@tanstack/solid-virtual": "3.13.28",
46+
"@tanstack/solid-virtual": "3.13.32",
4747
"@shikijs/stream": "4.2.0",
4848
"ulid": "3.0.1",
4949
"@kobalte/core": "0.13.11",
@@ -70,7 +70,7 @@
7070
"hono-openapi": "1.1.2",
7171
"fuzzysort": "3.1.0",
7272
"luxon": "3.6.1",
73-
"marked": "17.0.1",
73+
"marked": "17.0.6",
7474
"marked-shiki": "1.2.1",
7575
"remend": "1.3.0",
7676
"@playwright/test": "1.59.1",
@@ -152,10 +152,9 @@
152152
"gcp-metadata@8.1.2": "patches/gcp-metadata@8.1.2.patch",
153153
"pacote@21.5.0": "patches/pacote@21.5.0.patch",
154154
"@ai-sdk/google@3.0.73": "patches/@ai-sdk%2Fgoogle@3.0.73.patch",
155-
"@tanstack/solid-virtual@3.13.28": "patches/@tanstack%2Fsolid-virtual@3.13.28.patch",
156155
"@pierre/trees@1.0.0-beta.4": "patches/@pierre%2Ftrees@1.0.0-beta.4.patch",
157156
"@modelcontextprotocol/sdk@1.29.0": "patches/@modelcontextprotocol%2Fsdk@1.29.0.patch",
158-
"@tanstack/virtual-core@3.17.0": "patches/@tanstack%2Fvirtual-core@3.17.0.patch",
159-
"effect@4.0.0-beta.83": "patches/effect@4.0.0-beta.83.patch"
157+
"effect@4.0.0-beta.83": "patches/effect@4.0.0-beta.83.patch",
158+
"@tanstack/virtual-core@3.17.3": "patches/@tanstack%2Fvirtual-core@3.17.3.patch"
160159
}
161160
}

packages/app/e2e/performance/timeline-stability/fixture.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,9 @@ export async function setupTimeline(
136136
},
137137
}),
138138
)
139+
if (settings.newLayoutDesigns === false) {
140+
localStorage.setItem("app-version.v1", JSON.stringify({ version: "1.17.20" }))
141+
}
139142
}, input.settings ?? {})
140143
if (input.locale) {
141144
await page.addInitScript((locale) => {
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
import { base64Encode } from "@opencode-ai/core/util/encode"
2+
import { expect, test, type Page } from "@playwright/test"
3+
import { mockOpenCodeServer } from "../utils/mock-server"
4+
import { expectSessionTitle } from "../utils/waits"
5+
6+
const directory = "C:/OpenCode/FileBrowserSidebar"
7+
const projectID = "proj_file_browser_sidebar"
8+
const sessionID = "ses_file_browser_sidebar"
9+
const title = "File browser sidebar"
10+
const server = `http://${process.env.PLAYWRIGHT_SERVER_HOST ?? "127.0.0.1"}:${process.env.PLAYWRIGHT_SERVER_PORT ?? "4096"}`
11+
const files = Array.from({ length: 80 }, (_, index) => `file-${String(index).padStart(2, "0")}.ts`)
12+
// Marks the file-browser sidebar DOM node so a remount (fresh node) is detectable.
13+
const PROBE = "original"
14+
15+
test.use({ viewport: { width: 1440, height: 900 } })
16+
17+
// The file-browser sidebar must stay mounted across preview/pinned file-tab
18+
// switches. Remounting resets scroll and filter state.
19+
test("keeps the file-browser sidebar mounted when switching file tabs", async ({ page }) => {
20+
await setup(page)
21+
22+
await page.goto(`/server/${base64Encode(server)}/session/${sessionID}`)
23+
await expectSessionTitle(page, title)
24+
25+
const panel = page.locator("#review-panel")
26+
await panel.getByRole("button", { name: "Open file" }).click()
27+
await expect(panel.getByRole("tab", { name: "Open file" })).toHaveAttribute("data-selected", "")
28+
29+
const sidebar = panel.locator('[data-component="session-review-v2-sidebar-root"]')
30+
await expect(sidebar).toBeVisible()
31+
await expect(panel.getByRole("button", { name: "file-00.ts" })).toBeVisible()
32+
33+
await panel.getByRole("button", { name: "file-00.ts" }).click()
34+
await expect(panel.getByRole("tab", { name: "file-00.ts" })).toHaveAttribute("data-selected", "")
35+
await expect(panel.getByText("contents:file-00.ts", { exact: true })).toBeVisible()
36+
37+
const viewport = panel.locator('[data-slot="session-review-v2-sidebar-tree"] .scroll-view__viewport')
38+
await viewport.hover()
39+
await page.mouse.wheel(0, 100_000)
40+
await expect
41+
.poll(() => viewport.evaluate((element) => element.scrollHeight - element.clientHeight - element.scrollTop))
42+
.toBeLessThanOrEqual(1)
43+
const scrolled = await viewport.evaluate((element) => element.scrollTop)
44+
expect(scrolled).toBeGreaterThan(0)
45+
await writeProbe(page)
46+
47+
await panel.getByRole("button", { name: "file-79.ts" }).click()
48+
await expect(panel.getByRole("tab", { name: "file-79.ts" })).toHaveAttribute("data-selected", "")
49+
await expect(panel.getByText("contents:file-79.ts", { exact: true })).toBeVisible()
50+
expect(await readProbe(page)).toBe(PROBE)
51+
await expect.poll(() => viewport.evaluate((element) => element.scrollTop)).toBe(scrolled)
52+
53+
await panel.getByRole("button", { name: "file-78.ts" }).dblclick()
54+
await expect(panel.getByRole("tab", { name: "file-78.ts" })).toHaveAttribute("data-selected", "")
55+
await panel.getByRole("button", { name: "file-79.ts" }).click()
56+
await expect(panel.getByRole("tab", { name: "file-79.ts" })).toHaveAttribute("data-selected", "")
57+
await panel.getByRole("tab", { name: "file-78.ts" }).click()
58+
await expect(panel.getByRole("tab", { name: "file-78.ts" })).toHaveAttribute("data-selected", "")
59+
expect(await readProbe(page)).toBe(PROBE)
60+
await expect.poll(() => viewport.evaluate((element) => element.scrollTop)).toBe(scrolled)
61+
})
62+
63+
type Probed = HTMLElement & { __e2eProbe?: string }
64+
65+
async function writeProbe(page: Page) {
66+
await page.locator('#review-panel [data-component="session-review-v2-sidebar-root"]').evaluate((el, probe) => {
67+
;(el as Probed).__e2eProbe = probe
68+
}, PROBE)
69+
}
70+
71+
async function readProbe(page: Page) {
72+
return page
73+
.locator('#review-panel [data-component="session-review-v2-sidebar-root"]')
74+
.evaluate((el) => (el as Probed).__e2eProbe)
75+
}
76+
77+
async function setup(page: Page) {
78+
await mockOpenCodeServer(page, {
79+
directory,
80+
project: {
81+
id: projectID,
82+
worktree: directory,
83+
vcs: "git",
84+
name: "file-browser-sidebar",
85+
time: { created: 1700000000000, updated: 1700000000000 },
86+
sandboxes: [],
87+
},
88+
provider: {
89+
all: [
90+
{
91+
id: "opencode",
92+
name: "OpenCode",
93+
models: { test: { id: "test", name: "Test", limit: { context: 200_000 } } },
94+
},
95+
],
96+
connected: ["opencode"],
97+
default: { providerID: "opencode", modelID: "test" },
98+
},
99+
sessions: [
100+
{
101+
id: sessionID,
102+
slug: sessionID,
103+
projectID,
104+
directory,
105+
title,
106+
version: "dev",
107+
time: { created: 1700000000000, updated: 1700000000000 },
108+
},
109+
],
110+
vcsDiff: [],
111+
fileList: (path) => {
112+
if (path) return []
113+
return files.map((name) => ({
114+
name,
115+
path: name,
116+
absolute: `${directory}/${name}`,
117+
type: "file" as const,
118+
ignored: false,
119+
}))
120+
},
121+
fileContent: (path) => ({ type: "text", content: `contents:${path}` }),
122+
pageMessages: () => ({ items: [] }),
123+
})
124+
125+
await page.addInitScript(
126+
({ directory, server, sessionID }) => {
127+
localStorage.setItem("settings.v3", JSON.stringify({ general: { newLayoutDesigns: true } }))
128+
localStorage.setItem(
129+
"opencode.global.dat:server",
130+
JSON.stringify({
131+
projects: { local: [{ worktree: directory, expanded: true }] },
132+
lastProject: { local: directory },
133+
}),
134+
)
135+
localStorage.setItem(
136+
"opencode.global.dat:layout",
137+
JSON.stringify({ review: { diffStyle: "split", panelOpened: true } }),
138+
)
139+
localStorage.setItem(
140+
"opencode.global.dat:review-panel-v2",
141+
JSON.stringify({ sidebarOpened: true, sidebarWidth: 240, expandMode: "collapse" }),
142+
)
143+
localStorage.setItem(
144+
"opencode.window.browser.dat:tabs",
145+
JSON.stringify([{ type: "session", server, sessionId: sessionID }]),
146+
)
147+
},
148+
{ directory, server, sessionID },
149+
)
150+
}

packages/app/e2e/regression/legacy-new-session.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ test("redirects a draft to the legacy new-session route", async ({ page }) => {
2424
await page.addInitScript(
2525
({ directory, draftID, server }) => {
2626
localStorage.setItem("settings.v3", JSON.stringify({ general: { newLayoutDesigns: false } }))
27+
localStorage.setItem("app-version.v1", JSON.stringify({ version: "1.17.20" }))
2728
localStorage.setItem(
2829
"opencode.window.browser.dat:tabs",
2930
JSON.stringify([{ type: "draft", draftID, server, directory }]),

0 commit comments

Comments
 (0)