Skip to content

Commit 5d2f8d7

Browse files
authored
fix: restore recent test regressions and upgrade effect beta (#18158)
1 parent 81be544 commit 5d2f8d7

File tree

11 files changed

+79
-46
lines changed

11 files changed

+79
-46
lines changed

bun.lock

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

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
"packages/slack"
2626
],
2727
"catalog": {
28+
"@effect/platform-node": "4.0.0-beta.35",
2829
"@types/bun": "1.3.9",
2930
"@octokit/rest": "22.0.0",
3031
"@hono/zod-validator": "0.4.2",
@@ -44,7 +45,7 @@
4445
"dompurify": "3.3.1",
4546
"drizzle-kit": "1.0.0-beta.16-ea816b6",
4647
"drizzle-orm": "1.0.0-beta.16-ea816b6",
47-
"effect": "4.0.0-beta.31",
48+
"effect": "4.0.0-beta.35",
4849
"ai": "5.0.124",
4950
"hono": "4.10.7",
5051
"hono-openapi": "1.1.2",

packages/app/e2e/prompt/prompt-multiline.spec.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,18 @@ test("shift+enter inserts a newline without submitting", async ({ page, gotoSess
77
await expect(page).toHaveURL(/\/session\/?$/)
88

99
const prompt = page.locator(promptSelector)
10-
await prompt.click()
11-
await page.keyboard.type("line one")
12-
await page.keyboard.press("Shift+Enter")
13-
await page.keyboard.type("line two")
10+
await prompt.focus()
11+
await expect(prompt).toBeFocused()
12+
13+
await prompt.pressSequentially("line one")
14+
await expect(prompt).toBeFocused()
15+
16+
await prompt.press("Shift+Enter")
17+
await expect(page).toHaveURL(/\/session\/?$/)
18+
await expect(prompt).toBeFocused()
19+
20+
await prompt.pressSequentially("line two")
1421

1522
await expect(page).toHaveURL(/\/session\/?$/)
16-
await expect(prompt).toContainText("line one")
17-
await expect(prompt).toContainText("line two")
23+
await expect.poll(() => prompt.evaluate((el) => el.innerText)).toBe("line one\nline two")
1824
})

packages/app/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
"@solidjs/router": "catalog:",
5757
"@thisbeyond/solid-dnd": "0.7.5",
5858
"diff": "catalog:",
59-
"effect": "4.0.0-beta.31",
59+
"effect": "catalog:",
6060
"fuzzysort": "catalog:",
6161
"ghostty-web": "github:anomalyco/ghostty-web#main",
6262
"luxon": "catalog:",

packages/app/src/pages/layout.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,7 @@ export default function Layout(props: ParentProps) {
566566
const [autoselecting] = createResource(async () => {
567567
await ready.promise
568568
await layout.ready.promise
569+
if (!untrack(() => state.autoselect)) return
569570

570571
const list = layout.projects.list()
571572
const last = server.projects.last()

packages/desktop-electron/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
"@solid-primitives/storage": "catalog:",
3131
"@solidjs/meta": "catalog:",
3232
"@solidjs/router": "0.15.4",
33-
"effect": "4.0.0-beta.31",
33+
"effect": "catalog:",
3434
"electron-log": "^5",
3535
"electron-store": "^10",
3636
"electron-updater": "^6",

packages/opencode/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@
8282
"@ai-sdk/xai": "2.0.51",
8383
"@aws-sdk/credential-providers": "3.993.0",
8484
"@clack/prompts": "1.0.0-alpha.1",
85-
"@effect/platform-node": "4.0.0-beta.31",
8685
"@gitlab/gitlab-ai-provider": "3.6.0",
8786
"@gitlab/opencode-gitlab-auth": "1.3.3",
8887
"@hono/standard-validator": "0.1.5",
@@ -98,6 +97,7 @@
9897
"@openrouter/ai-sdk-provider": "1.5.4",
9998
"@opentui/core": "0.1.87",
10099
"@opentui/solid": "0.1.87",
100+
"@effect/platform-node": "catalog:",
101101
"@parcel/watcher": "2.5.1",
102102
"@pierre/diffs": "catalog:",
103103
"@solid-primitives/event-bus": "1.1.2",

packages/opencode/src/file/watcher.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,13 @@ export namespace FileWatcher {
5151
if (process.platform === "linux") return "inotify"
5252
}
5353

54+
function protecteds(dir: string) {
55+
return Protected.paths().filter((item) => {
56+
const rel = path.relative(dir, item)
57+
return rel !== "" && !rel.startsWith("..") && !path.isAbsolute(rel)
58+
})
59+
}
60+
5461
export const hasNativeBinding = () => !!watcher()
5562

5663
export class Service extends ServiceMap.Service<Service, {}>()("@opencode/FileWatcher") {}
@@ -105,7 +112,7 @@ export namespace FileWatcher {
105112
const cfgIgnores = cfg.watcher?.ignore ?? []
106113

107114
if (yield* Flag.OPENCODE_EXPERIMENTAL_FILEWATCHER) {
108-
yield* subscribe(instance.directory, [...FileIgnore.PATTERNS, ...cfgIgnores, ...Protected.paths()])
115+
yield* subscribe(instance.directory, [...FileIgnore.PATTERNS, ...cfgIgnores, ...protecteds(instance.directory)])
109116
}
110117

111118
if (instance.project.vcs === "git") {

packages/opencode/src/util/process.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ export namespace Process {
9898
reject(error)
9999
})
100100
})
101+
void exited.catch(() => undefined)
101102

102103
if (opts.abort) {
103104
opts.abort.addEventListener("abort", abort, { once: true })

packages/opencode/test/file/watcher.test.ts

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { $ } from "bun"
22
import { afterEach, describe, expect, test } from "bun:test"
33
import fs from "fs/promises"
44
import path from "path"
5-
import { Deferred, Effect, Fiber, Option } from "effect"
5+
import { Deferred, Effect, Option } from "effect"
66
import { tmpdir } from "../fixture/fixture"
77
import { watcherConfigLayer, withServices } from "../fixture/instance"
88
import { FileWatcher } from "../../src/file/watcher"
@@ -25,6 +25,7 @@ function withWatcher<E>(directory: string, body: Effect.Effect<void, E>) {
2525
directory,
2626
FileWatcher.layer,
2727
async (rt) => {
28+
await rt.runPromise(FileWatcher.Service.use(() => Effect.void))
2829
await Effect.runPromise(ready(directory))
2930
await Effect.runPromise(body)
3031
},
@@ -54,24 +55,29 @@ function listen(directory: string, check: (evt: WatcherEvent) => boolean, hit: (
5455
}
5556

5657
function wait(directory: string, check: (evt: WatcherEvent) => boolean) {
57-
return Effect.callback<WatcherEvent>((resume) => {
58-
const cleanup = listen(directory, check, (evt) => {
59-
cleanup()
60-
resume(Effect.succeed(evt))
58+
return Effect.gen(function* () {
59+
const deferred = yield* Deferred.make<WatcherEvent>()
60+
const cleanup = yield* Effect.sync(() => {
61+
let off = () => {}
62+
off = listen(directory, check, (evt) => {
63+
off()
64+
Deferred.doneUnsafe(deferred, Effect.succeed(evt))
65+
})
66+
return off
6167
})
62-
return Effect.sync(cleanup)
63-
}).pipe(Effect.timeout("5 seconds"))
68+
return { cleanup, deferred }
69+
})
6470
}
6571

6672
function nextUpdate<E>(directory: string, check: (evt: WatcherEvent) => boolean, trigger: Effect.Effect<void, E>) {
6773
return Effect.acquireUseRelease(
68-
wait(directory, check).pipe(Effect.forkChild({ startImmediately: true })),
69-
(fiber) =>
74+
wait(directory, check),
75+
({ deferred }) =>
7076
Effect.gen(function* () {
7177
yield* trigger
72-
return yield* Fiber.join(fiber)
78+
return yield* Deferred.await(deferred).pipe(Effect.timeout("5 seconds"))
7379
}),
74-
Fiber.interrupt,
80+
({ cleanup }) => Effect.sync(cleanup),
7581
)
7682
}
7783

@@ -82,23 +88,15 @@ function noUpdate<E>(
8288
trigger: Effect.Effect<void, E>,
8389
ms = 500,
8490
) {
85-
return Effect.gen(function* () {
86-
const deferred = yield* Deferred.make<WatcherEvent>()
87-
88-
yield* Effect.acquireUseRelease(
89-
Effect.sync(() =>
90-
listen(directory, check, (evt) => {
91-
Effect.runSync(Deferred.succeed(deferred, evt))
92-
}),
93-
),
94-
() =>
95-
Effect.gen(function* () {
96-
yield* trigger
97-
expect(yield* Deferred.await(deferred).pipe(Effect.timeoutOption(`${ms} millis`))).toEqual(Option.none())
98-
}),
99-
(cleanup) => Effect.sync(cleanup),
100-
)
101-
})
91+
return Effect.acquireUseRelease(
92+
wait(directory, check),
93+
({ deferred }) =>
94+
Effect.gen(function* () {
95+
yield* trigger
96+
expect(yield* Deferred.await(deferred).pipe(Effect.timeoutOption(`${ms} millis`))).toEqual(Option.none())
97+
}),
98+
({ cleanup }) => Effect.sync(cleanup),
99+
)
102100
}
103101

104102
function ready(directory: string) {

0 commit comments

Comments
 (0)